summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan-Simon Moeller <jsmoeller@linuxfoundation.org>2020-12-08 11:15:02 +0100
committerJan-Simon Moeller <jsmoeller@linuxfoundation.org>2020-12-17 13:58:05 +0000
commit41591d4f8c586aa801220fac0924556f406c58bd (patch)
tree85a2803d48a094fb0ba3a76b9e3d0870a4e5edc2
parent4830bcef14e7f49cdc851c646a69c9bb9bd92e82 (diff)
SPEC-3723: restructure meta-agl-demo
All demo related components should be in here now. We keep the packagegroups on purpose for now to stay backward-compatible. v2: layer does pass yocto-check-layer, dependencies adapted v3: remove the dynamic-layer setup, use all-in-one approach v4: Fixed comments from Paul Barker. Tnx! v5: Removed wayland/weston/agl-compositor additions, except for demo specific weston-init bbappend Follow-up changes required later: - massaging packagegroups - scrub of recipes Bug-AGL: SPEC-3723 Signed-off-by: Jan-Simon Moeller <jsmoeller@linuxfoundation.org> Signed-off-by: Scott Murray <scott.murray@konsulko.com> Change-Id: I47cefd8c23d46b2cdd063470e3f7d97d5ad952d8
l---------README1
-rw-r--r--classes/agl-graphical.bbclass5
-rw-r--r--conf/include/agl-cluster-demo-preload.inc1
-rw-r--r--conf/include/agl-cluster-demo.inc5
-rw-r--r--conf/include/agl-demo-preload.inc2
-rw-r--r--conf/include/agl-demo.inc6
-rw-r--r--conf/include/agl-telematics-demo.inc5
-rw-r--r--conf/layer.conf11
-rw-r--r--docs/devguides-book.yml13
-rw-r--r--recipes-apis/agl-service-bluetooth-map/agl-service-bluetooth-map_git.bb18
-rw-r--r--recipes-apis/agl-service-bluetooth-pbap/agl-service-bluetooth-pbap_git.bb18
-rw-r--r--recipes-apis/agl-service-bluetooth/agl-service-bluetooth_git.bb18
-rw-r--r--recipes-apis/agl-service-can-low-level/agl-service-can-low-level_git.bb23
-rw-r--r--recipes-apis/agl-service-can-low-level/agl-service-can-low-level_git.bbappend4
-rw-r--r--recipes-apis/agl-service-can-low-level/files/run-ptest3
-rw-r--r--recipes-apis/agl-service-data-persistence/agl-service-data-persistence_git.bb17
-rw-r--r--recipes-apis/agl-service-geoclue/agl-service-geoclue_git.bb17
-rw-r--r--recipes-apis/agl-service-geofence/agl-service-geofence_git.bb18
-rw-r--r--recipes-apis/agl-service-gps/agl-service-gps_git.bb18
-rw-r--r--recipes-apis/agl-service-homescreen/agl-service-homescreen_git.bb14
-rw-r--r--recipes-apis/agl-service-hvac/agl-service-hvac-conf_git.bb27
-rw-r--r--recipes-apis/agl-service-hvac/agl-service-hvac_git.bb20
-rw-r--r--recipes-apis/agl-service-identity-agent/agl-service-identity-agent_git.bb17
-rw-r--r--recipes-apis/agl-service-iiodevices/agl-service-iiodevices_git.bb19
-rw-r--r--recipes-apis/agl-service-mediaplayer/agl-service-mediaplayer_git.bb18
-rw-r--r--recipes-apis/agl-service-mediascanner/agl-service-mediascanner_git.bb18
-rwxr-xr-xrecipes-apis/agl-service-navigation/agl-service-navigation_git.bb18
-rw-r--r--recipes-apis/agl-service-network/agl-service-network_git.bb25
-rw-r--r--recipes-apis/agl-service-nfc/agl-service-nfc_git.bb17
-rw-r--r--recipes-apis/agl-service-platform-info/agl-service-platform-info_git.bb17
-rw-r--r--recipes-apis/agl-service-radio/agl-service-radio_git.bb19
-rw-r--r--recipes-apis/agl-service-signal-composer/agl-service-signal-composer_git.bb18
-rw-r--r--recipes-apis/agl-service-signal-composer/files/run-ptest3
-rw-r--r--recipes-apis/agl-service-taskmanager/agl-service-taskmanager.bb18
-rw-r--r--recipes-apis/agl-service-telephony/agl-service-telephony_git.bb18
-rw-r--r--recipes-apis/agl-service-unicens-controller/agl-service-unicens-controller_git.bb19
-rw-r--r--recipes-apis/agl-service-unicens/agl-service-unicens_git.bb19
-rw-r--r--recipes-apis/agl-service-weather/agl-service-weather_git.bb18
-rw-r--r--recipes-config/agl-login-manager/agl-login-manager_0.1.bb19
-rw-r--r--recipes-config/agl-users/agl-users_0.1.bb27
-rw-r--r--recipes-config/cluster-dashboard-demo-config/cluster-dashboard-demo-config_1.0.bb11
-rw-r--r--recipes-config/cluster-dashboard-demo-config/files/AGL.conf.cluster2
-rw-r--r--recipes-config/dev-mapping/dev-mapping/dev-mapping.conf.default6
-rw-r--r--recipes-config/dev-mapping/dev-mapping_0.1.bb18
-rw-r--r--recipes-config/systemd-sync/systemd-agl-sync_1.0.bb39
-rw-r--r--recipes-connectivity/bluez-alsa/bluez-alsa/0001-utils-add-a-gstreamer-helper-application-for-interco.patch517
-rw-r--r--recipes-connectivity/bluez-alsa/bluez-alsa/bluealsa-gst-helper@.service18
-rw-r--r--recipes-connectivity/bluez-alsa/bluez-alsa_git.bb43
-rw-r--r--recipes-connectivity/bluez-alsa/bluez-alsa_git.bbappend35
-rw-r--r--recipes-connectivity/bluez-alsa/files/bluez-alsa.service11
-rw-r--r--recipes-connectivity/bluez5/bluez5/bluetooth.conf39
-rw-r--r--recipes-connectivity/bluez5/bluez5/bluetooth.service21
-rw-r--r--recipes-connectivity/bluez5/bluez5/obex.service10
-rw-r--r--recipes-connectivity/bluez5/bluez5/tmpdir.conf2
-rw-r--r--recipes-connectivity/bluez5/bluez5_%.bbappend1
-rw-r--r--recipes-connectivity/bluez5/bluez5_agldemo.inc24
-rw-r--r--recipes-connectivity/cluster-connman-conf/cluster-connman-conf/cluster.config3
-rw-r--r--recipes-connectivity/cluster-connman-conf/cluster-connman-conf_1.0.bb15
-rw-r--r--recipes-connectivity/mobile-broadband-provider-info/mobile-broadband-provider-info/0001-remove-Fido-service-provider.patch31
-rw-r--r--recipes-connectivity/mobile-broadband-provider-info/mobile-broadband-provider-info_agldemo.inc4
-rw-r--r--recipes-connectivity/mobile-broadband-provider-info/mobile-broadband-provider-info_git.bbappend1
-rw-r--r--recipes-connectivity/neard/files/0001-systemd-neard-add-multi-user.target-to-neard.service.patch25
-rw-r--r--recipes-connectivity/neard/files/0002-ndef-avoid-dbus-property_get_type-method-on-empty-re.patch33
-rw-r--r--recipes-connectivity/neard/neard_0.16.bbappend1
-rw-r--r--recipes-connectivity/neard/neard_agldemo.inc7
-rw-r--r--recipes-connectivity/neardal/neardal.inc22
-rw-r--r--recipes-connectivity/neardal/neardal/0001-neardal-ncl-fix-segfault-on-help-page-being-displaye.patch27
-rw-r--r--recipes-connectivity/neardal/neardal/0002-neardal-lib-fix-memory-corruption.patch58
-rw-r--r--recipes-connectivity/neardal/neardal/ncl.patch25
-rw-r--r--recipes-connectivity/neardal/neardal_0.14.bb10
-rw-r--r--recipes-connectivity/ofono/files/0001-provision-allow-duplicate-entries-from-mbpi_lookup_a.patch27
-rw-r--r--recipes-connectivity/ofono/files/ofono.conf30
-rw-r--r--recipes-connectivity/ofono/ofono_%.bbappend1
-rw-r--r--recipes-connectivity/ofono/ofono_agldemo.inc11
-rw-r--r--recipes-connectivity/rtl-sdr/rtl-sdr/0001-remove-I-usr-include-in-pkg-config.patch40
-rw-r--r--recipes-connectivity/rtl-sdr/rtl-sdr_0.5.3.bb32
-rw-r--r--recipes-core/dbus/dbus/dbus.service10
-rw-r--r--recipes-core/dbus/dbus/dbus.socket9
-rw-r--r--recipes-core/dbus/dbus/dbus_env.conf5
-rw-r--r--recipes-core/dbus/dbus/libdbus-c++/dbus-c++-threading.patch45
-rw-r--r--recipes-core/dbus/dbus_%.bbappend1
-rw-r--r--recipes-core/dbus/dbus_agldemo.inc28
-rw-r--r--recipes-core/dbus/libdbus-c++/dbus-c++-threading.patch45
-rw-r--r--recipes-core/dbus/libdbus-c++_0.9.0.bbappend1
-rw-r--r--recipes-core/dbus/libdbus-c++_agldemo.inc2
-rw-r--r--recipes-core/distro-build-manifest/distro-build-manifest.bb164
-rw-r--r--recipes-core/psplash/.appends.core0
-rw-r--r--recipes-core/psplash/files/psplash-colors.h34
-rw-r--r--recipes-core/psplash/files/psplash-poky-img.h5411
-rw-r--r--recipes-core/psplash/psplash_agldemo.inc9
-rw-r--r--recipes-core/psplash/psplash_git.bbappend1
-rw-r--r--recipes-core/udev/sw-gpsd-udev-conf/60-sw-gpsd.rules8
-rw-r--r--recipes-core/udev/sw-gpsd-udev-conf_1.0.bb16
-rw-r--r--recipes-core/udev/usb-can-udev-conf/60-usb-can.rules7
-rw-r--r--recipes-core/udev/usb-can-udev-conf/slcand-default2
-rw-r--r--recipes-core/udev/usb-can-udev-conf/slcand@.service13
-rw-r--r--recipes-core/udev/usb-can-udev-conf_1.0.bb25
-rw-r--r--recipes-demo/alexa-viewer/alexa-viewer_git.bb (renamed from recipes-demo-hmi/alexa-viewer/alexa-viewer_git.bb)0
-rw-r--r--recipes-demo/cluster-dashboard/cluster-dashboard_git.bb29
-rw-r--r--recipes-demo/cluster-gauges-qtcompositor/cluster-gauges-qtcompositor_git.bb29
-rw-r--r--recipes-demo/cluster-receiver/cluster-receiver_git.bb25
-rw-r--r--recipes-demo/cluster-receiver/qt-cluster-receiver_git.bb28
-rw-r--r--recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf/areas.json40
-rw-r--r--recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf/layers.json47
-rw-r--r--recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf/roles.db34
-rw-r--r--recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf_1.0.bb19
-rw-r--r--recipes-demo/dashboard/dashboard_git.bb (renamed from recipes-demo-hmi/dashboard/dashboard_git.bb)0
-rw-r--r--recipes-demo/homescreen-demo-ci/homescreen-demo-ci_git.bb (renamed from recipes-demo-hmi/homescreen-demo-ci/homescreen-demo-ci_git.bb)0
-rw-r--r--recipes-demo/homescreen/homescreen_git.bb (renamed from recipes-demo-hmi/homescreen/homescreen_git.bb)0
-rw-r--r--recipes-demo/html5-background/html5-background_git.bb (renamed from recipes-demo-hmi/html5-background/html5-background_git.bb)0
-rw-r--r--recipes-demo/html5-dashboard/html5-dashboard_git.bb (renamed from recipes-demo-hmi/html5-dashboard/html5-dashboard_git.bb)0
-rw-r--r--recipes-demo/html5-homescreen/html5-homescreen_git.bb (renamed from recipes-demo-hmi/html5-homescreen/html5-homescreen_git.bb)0
-rw-r--r--recipes-demo/html5-hvac/html5-hvac_git.bb (renamed from recipes-demo-hmi/html5-hvac/html5-hvac_git.bb)0
-rw-r--r--recipes-demo/html5-launcher/html5-launcher_git.bb (renamed from recipes-demo-hmi/html5-launcher/html5-launcher_git.bb)0
-rw-r--r--recipes-demo/html5-mediaplayer/html5-mediaplayer_git.bb (renamed from recipes-demo-hmi/html5-mediaplayer/html5-mediaplayer_git.bb)0
-rw-r--r--recipes-demo/html5-mixer/html5-mixer_git.bb (renamed from recipes-demo-hmi/html5-mixer/html5-mixer_git.bb)0
-rw-r--r--recipes-demo/html5-settings/html5-settings_git.bb (renamed from recipes-demo-hmi/html5-settings/html5-settings_git.bb)0
-rw-r--r--recipes-demo/hvac/hvac_git.bb (renamed from recipes-demo-hmi/hvac/hvac_git.bb)0
-rw-r--r--recipes-demo/inputeventmanager/inputeventmanager_git.bb (renamed from recipes-demo-hmi/inputeventmanager/inputeventmanager_git.bb)2
-rw-r--r--recipes-demo/launcher/launcher_git.bb (renamed from recipes-demo-hmi/launcher/launcher_git.bb)0
-rw-r--r--recipes-demo/mediaplayer/mediaplayer_git.bb (renamed from recipes-demo-hmi/mediaplayer/mediaplayer_git.bb)0
-rw-r--r--recipes-demo/messaging/messaging_git.bb (renamed from recipes-demo-hmi/messaging/messaging_git.bb)0
-rw-r--r--recipes-demo/mixer/mixer_git.bb (renamed from recipes-demo-hmi/mixer/mixer_git.bb)0
-rw-r--r--recipes-demo/navigation/navigation-demo_git.bb (renamed from recipes-demo-hmi/navigation/navigation-demo_git.bb)0
-rw-r--r--recipes-demo/navigation/ondemandnavi-config/naviconfig.ini (renamed from recipes-demo-hmi/navigation/ondemandnavi-config/naviconfig.ini)0
-rw-r--r--recipes-demo/navigation/ondemandnavi-config_1.0.bb (renamed from recipes-demo-hmi/navigation/ondemandnavi-config_1.0.bb)0
-rw-r--r--recipes-demo/navigation/ondemandnavi_git.bb (renamed from recipes-demo-hmi/navigation/ondemandnavi_git.bb)0
-rw-r--r--recipes-demo/navigation/poiapp-api-key_1.0.bb (renamed from recipes-demo-hmi/navigation/poiapp-api-key_1.0.bb)0
-rw-r--r--recipes-demo/navigation/poiapp/0001-add-display-permission.patch (renamed from recipes-demo-hmi/navigation/poiapp/0001-add-display-permission.patch)0
-rw-r--r--recipes-demo/navigation/poiapp_git.bb (renamed from recipes-demo-hmi/navigation/poiapp_git.bb)0
-rw-r--r--recipes-demo/navigation/tbtnavi_git.bb (renamed from recipes-demo-hmi/navigation/tbtnavi_git.bb)0
-rw-r--r--recipes-demo/onscreenapp/onscreenapp_git.bb (renamed from recipes-demo-hmi/onscreenapp/onscreenapp_git.bb)0
-rw-r--r--recipes-demo/phone/phone_git.bb (renamed from recipes-demo-hmi/phone/phone_git.bb)0
-rw-r--r--recipes-demo/qtquickcontrols2-agl-style/qtquickcontrols2-agl-style_git.bb (renamed from recipes-demo-hmi/qtquickcontrols2-agl-style/qtquickcontrols2-agl-style_git.bb)0
-rw-r--r--recipes-demo/qtquickcontrols2-agl/qtquickcontrols2-agl_git.bb (renamed from recipes-demo-hmi/qtquickcontrols2-agl/qtquickcontrols2-agl_git.bb)0
-rw-r--r--recipes-demo/radio/files/presets-ALS.conf (renamed from recipes-demo-hmi/radio/files/presets-ALS.conf)0
-rw-r--r--recipes-demo/radio/files/presets-CES.conf (renamed from recipes-demo-hmi/radio/files/presets-CES.conf)0
-rw-r--r--recipes-demo/radio/files/presets-FOSDEM.conf (renamed from recipes-demo-hmi/radio/files/presets-FOSDEM.conf)0
-rw-r--r--recipes-demo/radio/radio_git.bb (renamed from recipes-demo-hmi/radio/radio_git.bb)0
-rw-r--r--recipes-demo/settings/settings_git.bb (renamed from recipes-demo-hmi/settings/settings_git.bb)0
-rwxr-xr-xrecipes-demo/simple-can-simulator/files/simple_can_simulator.py381
-rw-r--r--recipes-demo/simple-can-simulator/simple-can-simulator.bb15
-rw-r--r--recipes-demo/taskmanager/taskmanager_git.bb (renamed from recipes-demo-hmi/taskmanager/taskmanager_git.bb)0
-rw-r--r--recipes-demo/telematics-recorder/telematics-recorder_git.bb25
-rw-r--r--recipes-demo/waltham-receiver/waltham-receiver_git.bb (renamed from recipes-demo-hmi/waltham-receiver/waltham-receiver_git.bb)0
-rw-r--r--recipes-devtools/low-level-can-generator/low-level-can-generator_git.bb17
-rw-r--r--recipes-devtools/python/python3-asyncssh_2.3.0.bb15
-rw-r--r--recipes-devtools/python/python3-pytest-dependency_0.5.1.bb12
-rw-r--r--recipes-devtools/python/python3-pytest-reverse_1.0.1.bb12
-rwxr-xr-xrecipes-devtools/run-agl-postinsts/run-agl-postinsts/run-agl-postinsts48
-rw-r--r--recipes-devtools/run-agl-postinsts/run-agl-postinsts/run-agl-postinsts.service17
-rw-r--r--recipes-devtools/run-agl-postinsts/run-agl-postinsts_1.0.bb46
-rw-r--r--recipes-devtools/run-agl-postinsts/run-agl-postinsts_1.0.bbappend1
-rw-r--r--recipes-graphics/hmi-debug/files/hmi-debug8
-rw-r--r--recipes-graphics/hmi-debug/hmi-debug_git.bb19
-rw-r--r--recipes-graphics/kms-conf/kms-conf/kms.conf8
-rw-r--r--recipes-graphics/kms-conf/kms-conf/m3ulcb/kms.conf12
-rw-r--r--recipes-graphics/kms-conf/kms-conf_1.0.bb12
-rw-r--r--recipes-graphics/libhomescreen/libhomescreen_git.bb19
-rw-r--r--recipes-graphics/qlibhomescreen/qlibhomescreen_git.bb13
-rw-r--r--recipes-graphics/ttf-fonts/ttf-dejavu_%.bbappend13
-rw-r--r--recipes-graphics/ttf-fonts/ttf-dejavu_agldemo.inc12
-rw-r--r--recipes-graphics/wayland/weston-init.bbappend1
-rw-r--r--recipes-graphics/wayland/weston-init/tmpfiles.conf.in6
-rw-r--r--recipes-graphics/wayland/weston-init/weston-dep.conf.in3
-rw-r--r--recipes-graphics/wayland/weston-init/weston.conf.in12
-rw-r--r--recipes-graphics/wayland/weston-init/zz-dri-imx.rules.in2
-rw-r--r--recipes-graphics/wayland/weston-init/zz-dri.rules.in1
-rw-r--r--recipes-graphics/wayland/weston-init/zz-input.rules.in1
-rw-r--r--recipes-graphics/wayland/weston-init/zz-tty.rules.in1
-rw-r--r--recipes-graphics/wayland/weston-init_agldemo.inc77
-rw-r--r--recipes-kernel/most/files/0002-src-most-add-auto-conf-feature.patch472
-rw-r--r--recipes-kernel/most/files/0003-core-remove-kernel-log-for-MBO-status.patch26
-rw-r--r--recipes-kernel/most/files/0004-most-video-set-device_caps.patch25
-rw-r--r--recipes-kernel/most/files/0005-most-video-set-V4L2_CAP_DEVICE_CAPS-flag.patch25
-rw-r--r--recipes-kernel/most/files/0006-dim2-fix-startup-sequence.patch186
-rw-r--r--recipes-kernel/most/files/0007-dim2-use-device-tree.patch378
-rw-r--r--recipes-kernel/most/files/0008-dim2-read-clock-speed-from-the-device-tree.patch92
-rw-r--r--recipes-kernel/most/files/0009-dim2-use-device-for-coherent-memory-allocation.patch47
-rw-r--r--recipes-kernel/most/files/0010-backport-usb-setup-timer.patch35
-rw-r--r--recipes-kernel/most/files/0011-handle-snd_pcm_lib_mmap_vmalloc-removal.patch30
-rw-r--r--recipes-kernel/most/files/0012-Fix-build-with-5.4-kernel.patch68
-rw-r--r--recipes-kernel/most/most.bb14
-rw-r--r--recipes-kernel/most/most.bbappend15
-rw-r--r--recipes-multimedia/gstreamer1.0-plugins-bad/gstreamer1.0-plugins-bad/0001-gst-wayland-Install-wayland-header-from-gstwayland-l.patch28
-rw-r--r--recipes-multimedia/gstreamer1.0-plugins-bad/gstreamer1.0-plugins-bad_1.16.%.bbappend1
-rw-r--r--recipes-multimedia/gstreamer1.0-plugins-bad/gstreamer1.0-plugins-bad_agldemo.inc2
-rw-r--r--recipes-multimedia/gstreamer1.0-plugins-good/gstreamer1.0-plugins-good_%.bbappend1
-rw-r--r--recipes-multimedia/gstreamer1.0-plugins-good/gstreamer1.0-plugins-good_agldemo.inc2
-rw-r--r--recipes-multimedia/libmp4v2/files/0001-add-a-configure-option-to-disable-build-of-man-pages.patch40
-rw-r--r--recipes-multimedia/libmp4v2/libmp4v2_git.bb18
-rw-r--r--recipes-multimedia/lightmediascanner/.appends.meta-efl0
-rw-r--r--recipes-multimedia/lightmediascanner/files/0001-Define-comparison_fn_t-for-non-glibc-systems.patch33
-rw-r--r--recipes-multimedia/lightmediascanner/files/0002-switch-from-G_BUS_TYPE_SESSION-to-G_BUS_TYPE_SYSTEM.patch49
-rw-r--r--recipes-multimedia/lightmediascanner/files/dbus-lightmediascanner.conf12
-rw-r--r--recipes-multimedia/lightmediascanner/files/id3-plugin-support-out-of-tree-build.patch11
-rw-r--r--recipes-multimedia/lightmediascanner/files/lightmediascanner.service16
-rw-r--r--recipes-multimedia/lightmediascanner/files/plugin-ogg-fix-chucksize-issue.patch53
-rw-r--r--recipes-multimedia/lightmediascanner/lightmediascanner_%.bbappend42
-rw-r--r--recipes-multimedia/lightmediascanner/lightmediascanner_0.5.1.bb63
-rw-r--r--recipes-navigation/geoclue/files/org.freedesktop.GeoClue2.Client.conf8
-rw-r--r--recipes-navigation/geoclue/geoclue_%.bbappend1
-rw-r--r--recipes-navigation/geoclue/geoclue_agldemo.inc11
-rw-r--r--recipes-navigation/gpsd/gpsd/sw-device-hook23
-rw-r--r--recipes-navigation/gpsd/gpsd_%.bbappend1
-rw-r--r--recipes-navigation/gpsd/gpsd_agldemo.inc28
-rw-r--r--recipes-platform/images/agl-cluster-demo-platform-crosssdk.bb27
-rw-r--r--recipes-platform/images/agl-cluster-demo-platform.bb14
-rw-r--r--recipes-platform/images/agl-cluster-demo-platform.inc3
-rw-r--r--recipes-platform/images/agl-cluster-demo-qtcompositor.bb15
-rw-r--r--recipes-platform/images/agl-cluster-demo-qtcompositor.inc2
-rw-r--r--recipes-platform/images/agl-demo-platform-crosssdk.bb2
-rw-r--r--recipes-platform/images/agl-image-cluster-qt5.bb9
-rw-r--r--recipes-platform/images/agl-image-cluster-qt5.inc7
-rw-r--r--recipes-platform/images/agl-image-cluster.bb9
-rw-r--r--recipes-platform/images/agl-image-cluster.inc7
-rw-r--r--recipes-platform/images/agl-image-graphical-html5.bb10
-rw-r--r--recipes-platform/images/agl-image-graphical-html5.inc9
-rwxr-xr-xrecipes-platform/images/agl-image-graphical-qt5-crosssdk.bb18
-rw-r--r--recipes-platform/images/agl-image-graphical-qt5-crosssdk.inc14
-rw-r--r--recipes-platform/images/agl-image-graphical-qt5.bb5
-rw-r--r--recipes-platform/images/agl-image-graphical-qt5.inc1
-rw-r--r--recipes-platform/images/agl-image-telematics.bb9
-rw-r--r--recipes-platform/images/agl-image-telematics.inc5
-rw-r--r--recipes-platform/images/agl-telematics-demo-platform-crosssdk.bb21
-rw-r--r--recipes-platform/images/agl-telematics-demo-platform.bb13
-rw-r--r--recipes-platform/images/agl-telematics-demo-platform.inc3
-rw-r--r--recipes-platform/packagegroups/nativesdk-packagegroup-sdk-host.bbappend6
-rw-r--r--recipes-platform/packagegroups/packagegroup-agl-app-framework.bbappend1
-rw-r--r--recipes-platform/packagegroups/packagegroup-agl-appfw-html5.bb18
-rw-r--r--recipes-platform/packagegroups/packagegroup-agl-appfw-native-qt5.bb29
-rw-r--r--recipes-platform/packagegroups/packagegroup-agl-cluster-demo-platform.bb43
-rw-r--r--recipes-platform/packagegroups/packagegroup-agl-cluster-demo-qtcompositor.bb43
-rw-r--r--recipes-platform/packagegroups/packagegroup-agl-core-devel.bbappend10
-rw-r--r--recipes-platform/packagegroups/packagegroup-agl-demo-qt-examples.bb26
-rw-r--r--recipes-platform/packagegroups/packagegroup-agl-graphical-services.bb15
-rw-r--r--recipes-platform/packagegroups/packagegroup-agl-graphical-weston.bbappend1
-rw-r--r--recipes-platform/packagegroups/packagegroup-agl-graphical-weston_agldemo.inc8
-rw-r--r--recipes-platform/packagegroups/packagegroup-agl-image-ivi.bb5
-rw-r--r--recipes-platform/packagegroups/packagegroup-agl-image-ivi.bbappend (renamed from recipes-core/packagegroups/packagegroup-agl-image-ivi.bbappend)1
-rw-r--r--recipes-platform/packagegroups/packagegroup-agl-ivi-connectivity.bbappend (renamed from recipes-core/packagegroups/packagegroup-agl-ivi-connectivity.bbappend)0
-rw-r--r--recipes-platform/packagegroups/packagegroup-agl-ivi-identity.bb (renamed from recipes-core/packagegroups/packagegroup-agl-ivi-identity.bb)0
-rw-r--r--recipes-platform/packagegroups/packagegroup-agl-ivi-navigation.bb2
-rw-r--r--recipes-platform/packagegroups/packagegroup-agl-ivi-services.bb3
-rw-r--r--recipes-platform/packagegroups/packagegroup-agl-networking.bb23
-rw-r--r--recipes-platform/packagegroups/packagegroup-agl-profile-cluster-qt5.bb21
-rw-r--r--recipes-platform/packagegroups/packagegroup-agl-profile-cluster-qtcompositor.bb36
-rw-r--r--recipes-platform/packagegroups/packagegroup-agl-profile-cluster.bb20
-rw-r--r--recipes-platform/packagegroups/packagegroup-agl-profile-graphical-html5.bb23
-rw-r--r--recipes-platform/packagegroups/packagegroup-agl-profile-graphical-qt5.bb23
-rw-r--r--recipes-platform/packagegroups/packagegroup-agl-profile-graphical.bbappend3
-rw-r--r--recipes-platform/packagegroups/packagegroup-agl-profile-telematics.bb25
-rw-r--r--recipes-platform/packagegroups/packagegroup-agl-source-han-sans-ttf-fonts.bb20
-rw-r--r--recipes-platform/packagegroups/packagegroup-agl-telematics-demo-platform.bb35
-rw-r--r--recipes-platform/packagegroups/packagegroup-agl-ttf-fonts.bb21
-rw-r--r--recipes-platform/packagegroups/packagegroup-qt5-toolchain-target.bbappend18
-rw-r--r--recipes-qt/qt-cluster/qtcompositor-conf_1.0.bb40
-rw-r--r--recipes-qt/qt/qtbase-native_git.bbappendTOCHECK3
-rw-r--r--recipes-qt/qt/qtbase/0001-Force-qdbus-to-make-introspect-for-every-findMetaObj.patch30
-rw-r--r--recipes-qt/qt/qtbase_%.bbappend1
-rw-r--r--recipes-qt/qt/qtbase_agldemo.inc16
-rw-r--r--recipes-qt/qt/qtlocation/0001-mapbox-update-API-url-to-match-new-schema.patch47
-rw-r--r--recipes-qt/qt/qtlocation_%.bbappend1
-rw-r--r--recipes-qt/qt/qtlocation_agldemo.inc14
-rw-r--r--recipes-qt/qt/qtmultimedia/0001-metadata-image-support-with-the-data-URL-scheme-for-.patch80
-rw-r--r--recipes-qt/qt/qtmultimedia_%.bbappend1
-rw-r--r--recipes-qt/qt/qtmultimedia_agldemo.inc7
-rw-r--r--recipes-qt/qt/qtsystems_%.bbappend1
-rw-r--r--recipes-qt/qt/qtsystems_agldemo.inc3
-rw-r--r--recipes-qt/qt/qtwayland-config/qtwayland12
-rw-r--r--recipes-qt/qt/qtwayland-config_1.0.0.bb21
-rw-r--r--recipes-qt/qt/qtwayland/0001-protocol-update-3rd-party-ivi-application-protocol.patch56
-rw-r--r--recipes-qt/qt/qtwayland/0002-qwaylandwindow-add-support-for-IVI-Surface-ID-proper.patch34
-rw-r--r--recipes-qt/qt/qtwayland/0010-Added-manifest-file-according-to-smack-3-domain-mode.patch33
-rw-r--r--recipes-qt/qt/qtwayland/0016-xdg-shell-Add-xdg-shell-protocol-file-version-1.4.0.patch468
-rw-r--r--recipes-qt/qt/qtwayland/0017-xdg-shell-Add-minimize-feature-to-QWindow-using-wayl.patch1029
-rw-r--r--recipes-qt/qt/qtwayland/0019-xdg-shell-upgrade-to-support-current-version-weston-.patch772
-rw-r--r--recipes-qt/qt/qtwayland/0020-Add-IVI-Shell-protocol-file-version-patch-v6.patch128
-rw-r--r--recipes-qt/qt/qtwayland/0021-Implement-initial-IVI-Shell-support.patch539
-rw-r--r--recipes-qt/qt/qtwayland/0099_qtwayland_no_evdev.patch14
-rw-r--r--recipes-qt/qt/qtwayland/UNUSED_NEEDS_CHECK_YOCTO_0018-packaging-enable-xdg-shell-at-runtime.patch31
-rw-r--r--recipes-qt/qt/qtwayland_%.bbappend1
-rw-r--r--recipes-qt/qt/qtwayland_agldemo.inc26
-rw-r--r--recipes-qt/qt/qtwebkit_%.bbappend1
-rw-r--r--recipes-qt/qt/qtwebkit_agldemo.inc1
-rw-r--r--recipes-support/curl/curl_%.bbappend1
-rw-r--r--recipes-support/curl/curl_agldemo.inc5
-rw-r--r--recipes-support/opencv/opencv_4.%.bbappend1
-rw-r--r--recipes-support/opencv/opencv_agldemo.inc1
-rw-r--r--recipes-support/udisks/files/99-udisks2.rules5
-rw-r--r--recipes-support/udisks/files/automount.service9
-rw-r--r--recipes-support/udisks/files/automount.sh93
-rw-r--r--recipes-support/udisks/udisks2_%.bbappend1
-rw-r--r--recipes-support/udisks/udisks2_agldemo.inc27
-rw-r--r--recipes-test/afb-test/afb-test_git.bb25
-rw-r--r--recipes-test/afb-test/files/run-ptest3
-rw-r--r--recipes-test/gcovr-wrapper/gcovr-wrapper/gcovr-wrapper320
-rw-r--r--recipes-test/gcovr-wrapper/gcovr-wrapper_1.0.bb17
-rw-r--r--recipes-test/gcovr/gcovr/0001-add-gcov-filter-source-errors-option.patch68
-rw-r--r--recipes-test/gcovr/gcovr_%.bbappend2
-rw-r--r--recipes-test/gcovr/gcovr_git.bb32
-rw-r--r--recipes-test/pyagl/pyagl_git.bb33
-rw-r--r--recipes-wam/chromium/chromium-browser-service.bb19
-rw-r--r--recipes-wam/chromium/chromium68/v8-qemu-wrapper.patch40
-rw-r--r--recipes-wam/chromium/chromium68_git.bb404
-rw-r--r--recipes-wam/chromium/gn-utils.inc157
-rw-r--r--recipes-wam/wam/files/WebAppMgr.env202
-rw-r--r--recipes-wam/wam/files/WebAppMgr@.service37
-rw-r--r--recipes-wam/wam/files/trunc-webapp-roles.patch56
-rw-r--r--recipes-wam/wam/wam_git.bb51
-rwxr-xr-xscripts/run-yocto-check-layer-all-layers.sh67
-rwxr-xr-xscripts/run-yocto-check-layer.sh49
-rw-r--r--templates/feature/agl-cluster-demo-preload/50_local.conf.inc2
-rw-r--r--templates/feature/agl-cluster-demo-preload/README_feature_agl-cluster-demo-preload.md9
-rw-r--r--templates/feature/agl-cluster-demo/50_local.conf.inc2
-rw-r--r--templates/feature/agl-cluster-demo/included.dep1
-rw-r--r--templates/feature/agl-demo-soundmanager/50_bblayers.conf.inc5
-rw-r--r--templates/feature/agl-demo-soundmanager/50_local.conf.inc2
-rw-r--r--templates/feature/agl-demo-soundmanager/README_feature_agl-demo-soundmanager.md18
-rw-r--r--templates/feature/agl-demo-soundmanager/included.dep1
-rw-r--r--templates/feature/agl-demo/50_bblayers.conf.inc3
-rw-r--r--templates/feature/agl-demo/included.dep2
-rw-r--r--templates/feature/agl-telematics-demo/50_local.conf.inc2
-rw-r--r--templates/feature/agl-telematics-demo/included.dep1
324 files changed, 16341 insertions, 69 deletions
diff --git a/README b/README
new file mode 120000
index 00000000..42061c01
--- /dev/null
+++ b/README
@@ -0,0 +1 @@
+README.md \ No newline at end of file
diff --git a/classes/agl-graphical.bbclass b/classes/agl-graphical.bbclass
new file mode 100644
index 00000000..8b5fbf6b
--- /dev/null
+++ b/classes/agl-graphical.bbclass
@@ -0,0 +1,5 @@
+WESTONUSER ??= "display"
+WESTONGROUP ??= "display"
+WESTONARGS ?= "--idle-time=0 --tty=7"
+WESTONLAUNCHARGS ??= "--tty /dev/tty7 --user ${WESTONUSER}"
+DISPLAY_XDG_RUNTIME_DIR ??= "/run/platform/${WESTONUSER}"
diff --git a/conf/include/agl-cluster-demo-preload.inc b/conf/include/agl-cluster-demo-preload.inc
new file mode 100644
index 00000000..70421e8c
--- /dev/null
+++ b/conf/include/agl-cluster-demo-preload.inc
@@ -0,0 +1 @@
+AGL_FEATURES_append = " agl-cluster-demo-preload"
diff --git a/conf/include/agl-cluster-demo.inc b/conf/include/agl-cluster-demo.inc
new file mode 100644
index 00000000..a8847e07
--- /dev/null
+++ b/conf/include/agl-cluster-demo.inc
@@ -0,0 +1,5 @@
+IMAGE_FEATURES =+ "debug-tweaks"
+
+#DISTRO_FEATURES_append = " "
+
+#IMAGE_INSTALL_append = " "
diff --git a/conf/include/agl-demo-preload.inc b/conf/include/agl-demo-preload.inc
index da46810b..484bc057 100644
--- a/conf/include/agl-demo-preload.inc
+++ b/conf/include/agl-demo-preload.inc
@@ -1,4 +1,4 @@
-DISTRO_FEATURES_append = " agl-demo-preload"
+AGL_FEATURES_append = " agl-demo-preload"
# Use demo device mapping for low-can that enables sllin0
PREFERRED_RPROVIDER_virtual/low-can-dev-mapping = "dev-mapping-demo"
diff --git a/conf/include/agl-demo.inc b/conf/include/agl-demo.inc
index 32d447af..390f47ea 100644
--- a/conf/include/agl-demo.inc
+++ b/conf/include/agl-demo.inc
@@ -1,11 +1,13 @@
IMAGE_FEATURES =+ "debug-tweaks"
-# disable the webruntime
-#DISTRO_FEATURES_append = " webruntime "
DISTRO_FEATURES_append = " automount "
+# convenience
IMAGE_INSTALL_append = " screen mc "
# Extend agl-voiceagent-alexa image feature with local alexa-viewer
# package.
FEATURE_PACKAGES_agl-voiceagent-alexa_append = " alexa-viewer"
+
+# enable the layer
+AGL_FEATURES_append = " agldemo"
diff --git a/conf/include/agl-telematics-demo.inc b/conf/include/agl-telematics-demo.inc
new file mode 100644
index 00000000..a8847e07
--- /dev/null
+++ b/conf/include/agl-telematics-demo.inc
@@ -0,0 +1,5 @@
+IMAGE_FEATURES =+ "debug-tweaks"
+
+#DISTRO_FEATURES_append = " "
+
+#IMAGE_INSTALL_append = " "
diff --git a/conf/layer.conf b/conf/layer.conf
index 7da7ac0d..f9ef8c6f 100644
--- a/conf/layer.conf
+++ b/conf/layer.conf
@@ -5,8 +5,11 @@ BBPATH =. "${LAYERDIR}:"
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
${LAYERDIR}/recipes-*/*/*.bbappend"
-BBFILE_COLLECTIONS += "agl-demo"
-BBFILE_PATTERN_agl-demo = "^${LAYERDIR}/"
-BBFILE_PRIORITY_agl-demo = "7"
+BBFILE_COLLECTIONS += "agldemo"
+BBFILE_PATTERN_agldemo = "^${LAYERDIR}/"
+BBFILE_PRIORITY_agldemo = "70"
+
+LAYERSERIES_COMPAT_agldemo = "dunfell"
+
+LAYERDEPENDS_agldemo = "aglcore app-framework qt5-layer openembedded-layer"
-LAYERSERIES_COMPAT_agl-demo = "dunfell"
diff --git a/docs/devguides-book.yml b/docs/devguides-book.yml
deleted file mode 100644
index 5a580980..00000000
--- a/docs/devguides-book.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-type: books
-books:
--
- id: meta-agl-demo
- title: Meta AGL Demo
- description: Meta AGL Demo documentation
- keywords:
- author: "AGL"
- version: master
- chapters:
- - url: ../meta-agl-demo.md
- destination: meta-agl-demo.md
- name: meta-agl-demo
diff --git a/recipes-apis/agl-service-bluetooth-map/agl-service-bluetooth-map_git.bb b/recipes-apis/agl-service-bluetooth-map/agl-service-bluetooth-map_git.bb
new file mode 100644
index 00000000..bc53051f
--- /dev/null
+++ b/recipes-apis/agl-service-bluetooth-map/agl-service-bluetooth-map_git.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Bluetooth MAP Service Binding"
+DESCRIPTION = "AGL Bluetooth MAP Service Binding"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-bluetooth-map"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-bluetooth-map;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "1.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+DEPENDS = "glib-2.0 json-c"
+RDEPENDS_${PN} = "bluez5-obex agl-service-bluetooth"
+
+inherit cmake aglwgt pkgconfig
diff --git a/recipes-apis/agl-service-bluetooth-pbap/agl-service-bluetooth-pbap_git.bb b/recipes-apis/agl-service-bluetooth-pbap/agl-service-bluetooth-pbap_git.bb
new file mode 100644
index 00000000..3f9ff7be
--- /dev/null
+++ b/recipes-apis/agl-service-bluetooth-pbap/agl-service-bluetooth-pbap_git.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Bluetooth PBAP Service Binding"
+DESCRIPTION = "AGL Bluetooth PBAP Service Binding"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-bluetooth-pbap"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984"
+
+SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-bluetooth-pbap;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "1.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+DEPENDS = "glib-2.0 json-c"
+RDEPENDS_${PN} = "bluez5-obex agl-service-bluetooth agl-service-data-persistence"
+
+inherit cmake aglwgt pkgconfig
diff --git a/recipes-apis/agl-service-bluetooth/agl-service-bluetooth_git.bb b/recipes-apis/agl-service-bluetooth/agl-service-bluetooth_git.bb
new file mode 100644
index 00000000..8cfa8ec8
--- /dev/null
+++ b/recipes-apis/agl-service-bluetooth/agl-service-bluetooth_git.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Bluetooth Service Binding"
+DESCRIPTION = "AGL Bluetooth Service Binding"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-bluetooth"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984"
+
+SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-bluetooth;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "1.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+DEPENDS = "glib-2.0 json-c"
+RDEPENDS_${PN} = "agl-service-data-persistence agl-service-network"
+
+inherit cmake aglwgt pkgconfig
diff --git a/recipes-apis/agl-service-can-low-level/agl-service-can-low-level_git.bb b/recipes-apis/agl-service-can-low-level/agl-service-can-low-level_git.bb
new file mode 100644
index 00000000..83f6c1e7
--- /dev/null
+++ b/recipes-apis/agl-service-can-low-level/agl-service-can-low-level_git.bb
@@ -0,0 +1,23 @@
+SUMMARY = "Low level CAN service"
+DESCRIPTION = "AGL Service application for read and decode CAN messages"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/low-level-can-service"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-can-low-level;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "${AGLVERSION}"
+S = "${WORKDIR}/git"
+
+DEPENDS = "libafb-helpers libappcontroller"
+
+inherit cmake aglwgt pkgconfig ptest
+
+# For now, just enable J1939 on the qemu platforms where we know the
+# linux-yocto kernel is new enough (>= 5.4) and has the support enabled.
+AGLWGT_CMAKE_CONFIGURE_ARGS_append_qemuall = " -DWITH_FEATURE_J1939=ON"
+
+RDEPENDS_${PN} = "virtual/low-can-dev-mapping"
diff --git a/recipes-apis/agl-service-can-low-level/agl-service-can-low-level_git.bbappend b/recipes-apis/agl-service-can-low-level/agl-service-can-low-level_git.bbappend
index 4f282104..cc198c1c 100644
--- a/recipes-apis/agl-service-can-low-level/agl-service-can-low-level_git.bbappend
+++ b/recipes-apis/agl-service-can-low-level/agl-service-can-low-level_git.bbappend
@@ -1,10 +1,10 @@
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
-SRC_URI += "file://can-dev-mapping-helper.conf"
+SRC_URI_append = " file://can-dev-mapping-helper.conf"
do_install_append() {
install -D -m 0644 ${WORKDIR}/can-dev-mapping-helper.conf \
${D}${sysconfdir}/systemd/system/afm-service-agl-service-can-low-level-.service.d/can-dev-mapping-helper.conf
}
-RDEPENDS_${PN} += "can-dev-mapping-helper"
+RDEPENDS_${PN}_append = " can-dev-mapping-helper"
diff --git a/recipes-apis/agl-service-can-low-level/files/run-ptest b/recipes-apis/agl-service-can-low-level/files/run-ptest
new file mode 100644
index 00000000..cc9c4136
--- /dev/null
+++ b/recipes-apis/agl-service-can-low-level/files/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+afm-test /usr/AGL/apps/testwgt/low-can-service-test.wgt
diff --git a/recipes-apis/agl-service-data-persistence/agl-service-data-persistence_git.bb b/recipes-apis/agl-service-data-persistence/agl-service-data-persistence_git.bb
new file mode 100644
index 00000000..569f0707
--- /dev/null
+++ b/recipes-apis/agl-service-data-persistence/agl-service-data-persistence_git.bb
@@ -0,0 +1,17 @@
+DESCRIPTION = "AGL low level user database binding"
+HOMEPAGE = "https://git.automotivelinux.org/apps/agl-service-data-persistence/"
+SECTION = "base"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984"
+
+SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-data-persistence;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+inherit cmake aglwgt pkgconfig
+
+PV = "1.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+DEPENDS += " af-binder json-c gdbm "
+
diff --git a/recipes-apis/agl-service-geoclue/agl-service-geoclue_git.bb b/recipes-apis/agl-service-geoclue/agl-service-geoclue_git.bb
new file mode 100644
index 00000000..a1292324
--- /dev/null
+++ b/recipes-apis/agl-service-geoclue/agl-service-geoclue_git.bb
@@ -0,0 +1,17 @@
+SUMMARY = "GeoClue Service Binding"
+DESCRIPTION = "AGL GeoClue Service Binding"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-geoclue"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984"
+
+SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-geoclue;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "1.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+DEPENDS = "json-c geoclue"
+
+inherit cmake aglwgt pkgconfig
diff --git a/recipes-apis/agl-service-geofence/agl-service-geofence_git.bb b/recipes-apis/agl-service-geofence/agl-service-geofence_git.bb
new file mode 100644
index 00000000..8bdcd7c9
--- /dev/null
+++ b/recipes-apis/agl-service-geofence/agl-service-geofence_git.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Geofence Service Binding"
+DESCRIPTION = "AGL Geofence Service Binding"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-geofence"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984"
+
+SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-geofence;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "1.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+DEPENDS = "json-c glib-2.0"
+RDEPENDS_${PN} = "agl-service-gps"
+
+inherit cmake aglwgt pkgconfig
diff --git a/recipes-apis/agl-service-gps/agl-service-gps_git.bb b/recipes-apis/agl-service-gps/agl-service-gps_git.bb
new file mode 100644
index 00000000..254e5e40
--- /dev/null
+++ b/recipes-apis/agl-service-gps/agl-service-gps_git.bb
@@ -0,0 +1,18 @@
+SUMMARY = "GPS/GNSS Service Binding"
+DESCRIPTION = "AGL GPS/GNSS Service Binding"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-gps"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984"
+
+SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-gps;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "1.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+DEPENDS = "json-c gpsd"
+RDEPENDS_${PN} = "libgps"
+
+inherit cmake aglwgt pkgconfig
diff --git a/recipes-apis/agl-service-homescreen/agl-service-homescreen_git.bb b/recipes-apis/agl-service-homescreen/agl-service-homescreen_git.bb
new file mode 100644
index 00000000..7d2661bc
--- /dev/null
+++ b/recipes-apis/agl-service-homescreen/agl-service-homescreen_git.bb
@@ -0,0 +1,14 @@
+SUMMARY = "Homescreen binding and client library for application"
+DESCRIPTION = "agl-service-homescreen is the binding library"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/apps/agl-service-homescreen"
+SECTION = "HMI"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984"
+
+DEPENDS = "dbus glib-2.0 af-binder json-c"
+
+inherit cmake aglwgt
+
+SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-homescreen;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+S = "${WORKDIR}/git"
diff --git a/recipes-apis/agl-service-hvac/agl-service-hvac-conf_git.bb b/recipes-apis/agl-service-hvac/agl-service-hvac-conf_git.bb
new file mode 100644
index 00000000..e4dccbf3
--- /dev/null
+++ b/recipes-apis/agl-service-hvac/agl-service-hvac-conf_git.bb
@@ -0,0 +1,27 @@
+SUMMARY = "HVAC Service Binding Configuration"
+DESCRIPTION = "AGL HVAC Service Binding Configuration"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-hvac"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984"
+
+SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-hvac;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "1.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+PACKAGE_ARCH = "${MACHINE_ARCH}"
+
+do_configure[noexec] = "1"
+do_compile[noexec] = "1"
+
+do_install () {
+ install -D -m 644 ${S}/hvac.json ${D}${sysconfdir}/hvac.json
+}
+
+do_install_append_ulcb() {
+ sed -i -e "s#vcan0#sllin0#g" ${D}${sysconfdir}/hvac.json
+}
+
diff --git a/recipes-apis/agl-service-hvac/agl-service-hvac_git.bb b/recipes-apis/agl-service-hvac/agl-service-hvac_git.bb
new file mode 100644
index 00000000..545ab6a2
--- /dev/null
+++ b/recipes-apis/agl-service-hvac/agl-service-hvac_git.bb
@@ -0,0 +1,20 @@
+SUMMARY = "HVAC Service Binding"
+DESCRIPTION = "AGL HVAC Service Binding"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-hvac"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984"
+
+SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-hvac;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "1.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+DEPENDS = "json-c"
+
+inherit cmake aglwgt pkgconfig
+
+RDEPENDS_${PN} += "agl-service-identity-agent agl-service-can-low-level"
+RRECOMMENDS_${PN} += "agl-service-hvac-conf"
diff --git a/recipes-apis/agl-service-identity-agent/agl-service-identity-agent_git.bb b/recipes-apis/agl-service-identity-agent/agl-service-identity-agent_git.bb
new file mode 100644
index 00000000..f2474be7
--- /dev/null
+++ b/recipes-apis/agl-service-identity-agent/agl-service-identity-agent_git.bb
@@ -0,0 +1,17 @@
+DESCRIPTION = "AGL identity agent binding"
+HOMEPAGE = "https://gitlab.com/iotbzh/aia-binding"
+SECTION = "base"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
+
+SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-identity-agent;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+PV = "1.0+git${SRCPV}"
+
+inherit cmake aglwgt pkgconfig
+
+S = "${WORKDIR}/git"
+
+DEPENDS = "curl af-binder json-c systemd"
+
diff --git a/recipes-apis/agl-service-iiodevices/agl-service-iiodevices_git.bb b/recipes-apis/agl-service-iiodevices/agl-service-iiodevices_git.bb
new file mode 100644
index 00000000..cc893698
--- /dev/null
+++ b/recipes-apis/agl-service-iiodevices/agl-service-iiodevices_git.bb
@@ -0,0 +1,19 @@
+SUMMARY = "IIODEVICES Service Binding"
+DESCRIPTION = "AGL IIODEVICES Service Binding"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-iiodevices"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984"
+
+SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-iiodevices;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "1.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+DEPENDS = "json-c libiio glib-2.0"
+
+RDEPENDS_${PN} = "libiio"
+
+inherit cmake aglwgt pkgconfig
diff --git a/recipes-apis/agl-service-mediaplayer/agl-service-mediaplayer_git.bb b/recipes-apis/agl-service-mediaplayer/agl-service-mediaplayer_git.bb
new file mode 100644
index 00000000..4f1757c7
--- /dev/null
+++ b/recipes-apis/agl-service-mediaplayer/agl-service-mediaplayer_git.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Mediaplayer Service Binding"
+DESCRIPTION = "AGL Mediaplayer Service Binding"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-mediaplayer"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984"
+
+SRC_URI = "gitsm://gerrit.automotivelinux.org/gerrit/apps/agl-service-mediaplayer;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "1.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+DEPENDS = "json-c gstreamer1.0 gstreamer1.0-plugins-base"
+RDEPENDS_${PN} = "agl-service-mediascanner agl-service-bluetooth gstreamer1.0-plugins-bad-waylandsink"
+
+inherit cmake aglwgt pkgconfig
diff --git a/recipes-apis/agl-service-mediascanner/agl-service-mediascanner_git.bb b/recipes-apis/agl-service-mediascanner/agl-service-mediascanner_git.bb
new file mode 100644
index 00000000..c50a0480
--- /dev/null
+++ b/recipes-apis/agl-service-mediascanner/agl-service-mediascanner_git.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Mediascanner Service Binding"
+DESCRIPTION = "AGL Mediascanner Service Binding"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-mediascanner"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984"
+
+SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-mediascanner;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "1.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+DEPENDS = "json-c sqlite3 glib-2.0"
+RDEPENDS_${PN} = "lightmediascanner"
+
+inherit cmake aglwgt pkgconfig
diff --git a/recipes-apis/agl-service-navigation/agl-service-navigation_git.bb b/recipes-apis/agl-service-navigation/agl-service-navigation_git.bb
new file mode 100755
index 00000000..71a615cf
--- /dev/null
+++ b/recipes-apis/agl-service-navigation/agl-service-navigation_git.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Navigation Service Binding"
+DESCRIPTION = "AGL Navigation Service API Binding"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984"
+
+DEPENDS = "json-c libdbus-c++"
+
+SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-navigation;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "0.1+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+inherit cmake aglwgt pkgconfig
+
+RDEPENDS_${PN} += "json-c libdbus-c++"
diff --git a/recipes-apis/agl-service-network/agl-service-network_git.bb b/recipes-apis/agl-service-network/agl-service-network_git.bb
new file mode 100644
index 00000000..c7fb72f2
--- /dev/null
+++ b/recipes-apis/agl-service-network/agl-service-network_git.bb
@@ -0,0 +1,25 @@
+SUMMARY = "Network Service Binding"
+DESCRIPTION = "AGL Network Service Binding"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-network"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984"
+
+SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-network;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "1.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+DEPENDS = "glib-2.0 json-c"
+
+inherit cmake aglwgt pkgconfig
+
+do_install_append() {
+ install -d ${D}${sbindir}
+ install -m 755 ${B}/build-release/test/agl-service-network-ctl ${D}${sbindir}
+}
+
+FILES_${PN}-tools = "${sbindir}/agl-service-network-ctl"
+PACKAGES_prepend = "${PN}-tools "
diff --git a/recipes-apis/agl-service-nfc/agl-service-nfc_git.bb b/recipes-apis/agl-service-nfc/agl-service-nfc_git.bb
new file mode 100644
index 00000000..1757dcb3
--- /dev/null
+++ b/recipes-apis/agl-service-nfc/agl-service-nfc_git.bb
@@ -0,0 +1,17 @@
+SUMMARY = "agl-service-nfc"
+DESCRIPTION = ""
+HOMEPAGE = "https://git.automotivelinux.org/apps/agl-service-nfc/"
+SECTION = "apps"
+DEPENDS = "af-binder json-c glib-2.0 neardal"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+inherit cmake pkgconfig aglwgt
+
+SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-nfc;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "1.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
diff --git a/recipes-apis/agl-service-platform-info/agl-service-platform-info_git.bb b/recipes-apis/agl-service-platform-info/agl-service-platform-info_git.bb
new file mode 100644
index 00000000..43eed3f2
--- /dev/null
+++ b/recipes-apis/agl-service-platform-info/agl-service-platform-info_git.bb
@@ -0,0 +1,17 @@
+SUMMARY = "Platform info provider binding"
+DESCRIPTION = "AGL Platform info provider binding"
+HOMEPAGE = "https://git.automotivelinux.org/apps/agl-service-platform-info/"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=86d3f3a95c324c9479bd8986968f4327"
+
+SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-platform-info;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "1.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+DEPENDS = "libafb-helpers"
+
+inherit cmake aglwgt pkgconfig
diff --git a/recipes-apis/agl-service-radio/agl-service-radio_git.bb b/recipes-apis/agl-service-radio/agl-service-radio_git.bb
new file mode 100644
index 00000000..a46ce128
--- /dev/null
+++ b/recipes-apis/agl-service-radio/agl-service-radio_git.bb
@@ -0,0 +1,19 @@
+SUMMARY = "Radio Service Binding"
+DESCRIPTION = "AGL Radio Service Binding"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-radio"
+SECTION = "apps"
+LICENSE = "Apache-2.0 & GPLv2"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984 \
+ file://LICENSE.GPL-2.0-only;md5=751419260aa954499f7abaabaa882bbe"
+
+PV = "1.0+git${SRCPV}"
+
+SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-radio;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+S = "${WORKDIR}/git"
+
+# build-time dependencies
+DEPENDS = "rtl-sdr glib-2.0 gstreamer1.0 libusb-compat"
+
+inherit cmake aglwgt pkgconfig
diff --git a/recipes-apis/agl-service-signal-composer/agl-service-signal-composer_git.bb b/recipes-apis/agl-service-signal-composer/agl-service-signal-composer_git.bb
new file mode 100644
index 00000000..bf714f45
--- /dev/null
+++ b/recipes-apis/agl-service-signal-composer/agl-service-signal-composer_git.bb
@@ -0,0 +1,18 @@
+SUMMARY = "agl-service-signal-composer"
+DESCRIPTION = "AGL High Level Signaling service to handle CAN, LIN, and others signaling sources"
+HOMEPAGE = "https://git.automotivelinux.org/apps/agl-service-signal-composer/"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+inherit cmake pkgconfig aglwgt ptest
+
+DEPENDS += "lua lua-native libappcontroller libafb-helpers"
+RDEPENDS_${PN} += "lua"
+
+SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-signal-composer;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "${AGLVERSION}"
+S = "${WORKDIR}/git"
diff --git a/recipes-apis/agl-service-signal-composer/files/run-ptest b/recipes-apis/agl-service-signal-composer/files/run-ptest
new file mode 100644
index 00000000..49187ad8
--- /dev/null
+++ b/recipes-apis/agl-service-signal-composer/files/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+afm-test /usr/AGL/apps/testwgt/signal-composer-test.wgt
diff --git a/recipes-apis/agl-service-taskmanager/agl-service-taskmanager.bb b/recipes-apis/agl-service-taskmanager/agl-service-taskmanager.bb
new file mode 100644
index 00000000..6c5a1810
--- /dev/null
+++ b/recipes-apis/agl-service-taskmanager/agl-service-taskmanager.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Task Manager Service Binding"
+DESCRIPTION = "AGL Task Manager Service Binding"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-taskmanager"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984"
+
+SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-taskmanager;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "1.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+DEPENDS = "json-c procps"
+
+inherit cmake aglwgt pkgconfig
+
diff --git a/recipes-apis/agl-service-telephony/agl-service-telephony_git.bb b/recipes-apis/agl-service-telephony/agl-service-telephony_git.bb
new file mode 100644
index 00000000..ff391364
--- /dev/null
+++ b/recipes-apis/agl-service-telephony/agl-service-telephony_git.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Telephony Service Binding"
+DESCRIPTION = "AGL Telephony Service Binding"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-telephony"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984"
+
+SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-telephony;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "1.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+DEPENDS = "json-c glib-2.0"
+RDEPENDS_${PN} = "ofono"
+
+inherit cmake aglwgt pkgconfig
diff --git a/recipes-apis/agl-service-unicens-controller/agl-service-unicens-controller_git.bb b/recipes-apis/agl-service-unicens-controller/agl-service-unicens-controller_git.bb
new file mode 100644
index 00000000..85ebc90f
--- /dev/null
+++ b/recipes-apis/agl-service-unicens-controller/agl-service-unicens-controller_git.bb
@@ -0,0 +1,19 @@
+SUMMARY = "Infotainment network device control"
+DESCRIPTION = "Abstraction layer to control INICnet devices"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-unicens-controller"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=86d3f3a95c324c9479bd8986968f4327"
+
+SRC_URI = "gitsm://gerrit.automotivelinux.org/gerrit/apps/agl-service-unicens-controller;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "0.1+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+inherit cmake aglwgt pkgconfig
+
+DEPENDS += "json-c af-binder libafb-helpers"
+RDEPENDS_${PN} += "agl-service-unicens"
+
diff --git a/recipes-apis/agl-service-unicens/agl-service-unicens_git.bb b/recipes-apis/agl-service-unicens/agl-service-unicens_git.bb
new file mode 100644
index 00000000..e7e25c74
--- /dev/null
+++ b/recipes-apis/agl-service-unicens/agl-service-unicens_git.bb
@@ -0,0 +1,19 @@
+SUMMARY = "4A - Infotainment network setup and access"
+DESCRIPTION = "Infotainment network setup and access (using Unified Centralized Network Stack)"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-unicens"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+SRC_URI = "gitsm://gerrit.automotivelinux.org/gerrit/apps/agl-service-unicens;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "0.1+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+inherit cmake aglwgt pkgconfig
+
+DEPENDS += "alsa-lib json-c systemd af-binder glib-2.0 libxml2 libafb-helpers"
+RDEPENDS_${PN} += "libxml2 "
+
diff --git a/recipes-apis/agl-service-weather/agl-service-weather_git.bb b/recipes-apis/agl-service-weather/agl-service-weather_git.bb
new file mode 100644
index 00000000..75532da4
--- /dev/null
+++ b/recipes-apis/agl-service-weather/agl-service-weather_git.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Weather Service Binding"
+DESCRIPTION = "AGL Weather Service Binding"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-weather"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984"
+
+SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-service-weather;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "1.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+DEPENDS = "glib-2.0 json-c"
+RDEPENDS_${PN} = "agl-service-geoclue"
+
+inherit cmake aglwgt pkgconfig
diff --git a/recipes-config/agl-login-manager/agl-login-manager_0.1.bb b/recipes-config/agl-login-manager/agl-login-manager_0.1.bb
new file mode 100644
index 00000000..49efce79
--- /dev/null
+++ b/recipes-config/agl-login-manager/agl-login-manager_0.1.bb
@@ -0,0 +1,19 @@
+SUMMARY = "AGL Login manager"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420"
+
+LOGIN_USER ??="1001 1002"
+
+RDEPENDS_${PN} += "af-main"
+
+do_install_append() {
+
+ install -d ${D}${systemd_system_unitdir}/multi-user.target.wants/
+
+ for AGL_USER in ${LOGIN_USER};do
+ ln -s ../afm-user-session@.service ${D}${systemd_system_unitdir}/multi-user.target.wants/afm-user-session@${AGL_USER}.service
+ done
+}
+
+FILES_${PN} += "${systemd_system_unitdir}"
diff --git a/recipes-config/agl-users/agl-users_0.1.bb b/recipes-config/agl-users/agl-users_0.1.bb
new file mode 100644
index 00000000..709a1091
--- /dev/null
+++ b/recipes-config/agl-users/agl-users_0.1.bb
@@ -0,0 +1,27 @@
+inherit allarch useradd
+
+SUMMARY = "AGL Users Seed"
+DESCRIPTION = "This is a core framework component that\
+ defines how users are managed and who are the default users."
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420"
+
+ALLOW_EMPTY_${PN} = "1"
+
+USERADD_PACKAGES = "${PN}"
+
+USERADDEXTENSION = "useradd-staticids"
+
+GROUPADD_PARAM_${PN} = "\
+ --system display ; \
+ --system weston-launch ; \
+ -g 1001 agl-driver ; \
+ -g 1002 agl-passenger \
+"
+
+USERADD_PARAM_${PN} = "\
+ -g 1001 -u 1001 -o -d /home/1001 -m -K PASS_MAX_DAYS=-1 agl-driver ; \
+ -g 1002 -u 1002 -o -d /home/1002 -m -K PASS_MAX_DAYS=-1 agl-passenger ; \
+ --gid display --groups weston-launch,video,input --home-dir /run/platform/display --shell /bin/false --comment \"Display daemon\" --key PASS_MAX_DAYS=-1 display \
+"
diff --git a/recipes-config/cluster-dashboard-demo-config/cluster-dashboard-demo-config_1.0.bb b/recipes-config/cluster-dashboard-demo-config/cluster-dashboard-demo-config_1.0.bb
new file mode 100644
index 00000000..f1fce78f
--- /dev/null
+++ b/recipes-config/cluster-dashboard-demo-config/cluster-dashboard-demo-config_1.0.bb
@@ -0,0 +1,11 @@
+SUMMARY = "AGL cluster demo dashboard configuration file"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420"
+
+SRC_URI += "file://AGL.conf.cluster"
+
+inherit allarch
+
+do_install() {
+ install -D -m 0644 ${WORKDIR}/AGL.conf.cluster ${D}${sysconfdir}/xdg/AGL.conf
+}
diff --git a/recipes-config/cluster-dashboard-demo-config/files/AGL.conf.cluster b/recipes-config/cluster-dashboard-demo-config/files/AGL.conf.cluster
new file mode 100644
index 00000000..dd8a912c
--- /dev/null
+++ b/recipes-config/cluster-dashboard-demo-config/files/AGL.conf.cluster
@@ -0,0 +1,2 @@
+[dashboard]
+animation=false
diff --git a/recipes-config/dev-mapping/dev-mapping/dev-mapping.conf.default b/recipes-config/dev-mapping/dev-mapping/dev-mapping.conf.default
new file mode 100644
index 00000000..7bd8bf2e
--- /dev/null
+++ b/recipes-config/dev-mapping/dev-mapping/dev-mapping.conf.default
@@ -0,0 +1,6 @@
+; Default CAN device mapping
+; Format has to follow ini rules key="value", notice " around value.
+
+[CANbus-mapping]
+hs="can0"
+ls="can0"
diff --git a/recipes-config/dev-mapping/dev-mapping_0.1.bb b/recipes-config/dev-mapping/dev-mapping_0.1.bb
new file mode 100644
index 00000000..1309ffa2
--- /dev/null
+++ b/recipes-config/dev-mapping/dev-mapping_0.1.bb
@@ -0,0 +1,18 @@
+SUMMARY = "AGL Device mapping configuration file"
+DESCRIPTION = "This provide default dev-mapping.conf file \
+ that defines mapping between kernel device and logical name \
+ used in low-can binding by example."
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420"
+
+SRC_URI += "file://dev-mapping.conf.default"
+
+inherit allarch
+
+do_install() {
+ install -d ${D}${sysconfdir}
+ install -m 0644 ${WORKDIR}/dev-mapping.conf.default ${D}${sysconfdir}/dev-mapping.conf
+}
+
+RPROVIDES_${PN} = "virtual/low-can-dev-mapping"
diff --git a/recipes-config/systemd-sync/systemd-agl-sync_1.0.bb b/recipes-config/systemd-sync/systemd-agl-sync_1.0.bb
new file mode 100644
index 00000000..389ab242
--- /dev/null
+++ b/recipes-config/systemd-sync/systemd-agl-sync_1.0.bb
@@ -0,0 +1,39 @@
+SUMMARY = "Systemd synchronization script"
+DESCRIPTION = "\
+Systemd synchronization script \
+reload daemon at the first boot. \
+"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+#This script should be the last to be execute at the first boot
+POST_INSTALL_LEVEL = "X0"
+POST_INSTALL_SCRIPT ?= "${POST_INSTALL_LEVEL}-${PN}.sh"
+
+do_install() {
+ install -d ${D}/${sysconfdir}/agl-postinsts
+ cat > ${D}/${sysconfdir}/agl-postinsts/${POST_INSTALL_SCRIPT} <<EOF
+#!/bin/sh -e
+echo "restart daemon ..."
+result=0
+systemctl daemon-reload
+if [ \$? -ne 0 ]; then
+ result=1
+fi
+systemctl restart sockets.target
+if [ \$? -ne 0 ]; then
+ result=1
+fi
+
+if [ \$result -eq 0 ]; then
+ echo "restart daemon OK"
+ exit \$result
+else
+ echo "restart daemon failed"
+ exit \$result
+fi
+EOF
+ chmod a+x ${D}/${sysconfdir}/agl-postinsts/${POST_INSTALL_SCRIPT}
+}
+
+FILES_${PN} = "${sysconfdir}/agl-postinsts/${POST_INSTALL_SCRIPT}"
diff --git a/recipes-connectivity/bluez-alsa/bluez-alsa/0001-utils-add-a-gstreamer-helper-application-for-interco.patch b/recipes-connectivity/bluez-alsa/bluez-alsa/0001-utils-add-a-gstreamer-helper-application-for-interco.patch
new file mode 100644
index 00000000..6c9a388c
--- /dev/null
+++ b/recipes-connectivity/bluez-alsa/bluez-alsa/0001-utils-add-a-gstreamer-helper-application-for-interco.patch
@@ -0,0 +1,517 @@
+From f2e6a0a324106b40195f88953e55a355875d2b1b Mon Sep 17 00:00:00 2001
+From: George Kiagiadakis <george.kiagiadakis@collabora.com>
+Date: Fri, 4 Oct 2019 20:51:24 +0300
+Subject: [PATCH] utils: add a gstreamer helper application for interconnection
+ with pipewire
+
+Unfortunately, the bluez-alsa PCM plugin does not work correctly
+when it is used through pipewire (or gstreamer, or anywhere really...).
+
+Thanfully, the bluez-alsa PCM plugin is only a simple client that
+reads/writes on a file descriptor that was opened by bluealsa.
+This allows us to use bluealsa without the PCM plugin, just like it
+is done in the aplay.c util.
+
+This one uses GStreamer to implement the plumbing between pipewire
+and the file descriptor. On the reading side we are also doing some
+tricks to ensure a smooth stream, which is not the case for the
+stream that is coming out of bluealsa.
+
+This helper is implemented as a patch to bluez-alsa so that it can
+use its internal private API. In the future this needs some re-thinking.
+
+Upstream-Status: Inappropriate
+---
+ configure.ac | 7 +
+ utils/Makefile.am | 20 +++
+ utils/gst-helper.c | 432 +++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 459 insertions(+)
+ create mode 100644 utils/gst-helper.c
+
+diff --git a/configure.ac b/configure.ac
+index 4825afa..9125871 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -141,6 +141,13 @@ AM_COND_IF([ENABLE_HCITOP], [
+ PKG_CHECK_MODULES([NCURSES], [ncurses])
+ ])
+
++AC_ARG_ENABLE([gsthelper],
++ [AS_HELP_STRING([--enable-gsthelper], [enable building of gsthelper tool])])
++AM_CONDITIONAL([ENABLE_GSTHELPER], [test "x$enable_gsthelper" = "xyes"])
++AM_COND_IF([ENABLE_GSTHELPER], [
++ PKG_CHECK_MODULES([GST], [gstreamer-1.0 glib-2.0])
++])
++
+ AC_ARG_ENABLE([test],
+ [AS_HELP_STRING([--enable-test], [enable unit test])])
+ AM_CONDITIONAL([ENABLE_TEST], [test "x$enable_test" = "xyes"])
+diff --git a/utils/Makefile.am b/utils/Makefile.am
+index 9057f2c..9790474 100644
+--- a/utils/Makefile.am
++++ b/utils/Makefile.am
+@@ -47,3 +47,23 @@ hcitop_LDADD = \
+ @LIBBSD_LIBS@ \
+ @NCURSES_LIBS@
+ endif
++
++if ENABLE_GSTHELPER
++bin_PROGRAMS += bluealsa-gst-helper
++bluealsa_gst_helper_SOURCES = \
++ ../src/shared/dbus-client.c \
++ ../src/shared/ffb.c \
++ ../src/shared/log.c \
++ gst-helper.c
++bluealsa_gst_helper_CFLAGS = \
++ -I$(top_srcdir)/src \
++ @ALSA_CFLAGS@ \
++ @BLUEZ_CFLAGS@ \
++ @DBUS1_CFLAGS@ \
++ @GST_CFLAGS@
++bluealsa_gst_helper_LDADD = \
++ @ALSA_LIBS@ \
++ @BLUEZ_LIBS@ \
++ @DBUS1_LIBS@ \
++ @GST_LIBS@
++endif
+diff --git a/utils/gst-helper.c b/utils/gst-helper.c
+new file mode 100644
+index 0000000..de1d47c
+--- /dev/null
++++ b/utils/gst-helper.c
+@@ -0,0 +1,432 @@
++/* Bluez-Alsa PipeWire integration GStreamer helper
++ *
++ * Copyright © 2016-2019 Arkadiusz Bokowy
++ * Copyright © 2019 Collabora Ltd.
++ * @author George Kiagiadakis <george.kiagiadakis@collabora.com>
++ *
++ * SPDX-License-Identifier: MIT
++ */
++
++#if HAVE_CONFIG_H
++# include <config.h>
++#endif
++
++#include <errno.h>
++#include <getopt.h>
++#include <poll.h>
++#include <pthread.h>
++#include <signal.h>
++#include <stdbool.h>
++#include <stdint.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <unistd.h>
++
++#include <bluetooth/bluetooth.h>
++#include <dbus/dbus.h>
++#include <gst/gst.h>
++
++#include "shared/dbus-client.h"
++#include "shared/defs.h"
++#include "shared/ffb.h"
++#include "shared/log.h"
++
++struct worker {
++ /* used BlueALSA PCM device */
++ struct ba_pcm ba_pcm;
++ /* file descriptor of PCM FIFO */
++ int ba_pcm_fd;
++ /* file descriptor of PCM control */
++ int ba_pcm_ctrl_fd;
++ /* the gstreamer pipelines (sink & source) */
++ GstElement *pipeline[2];
++ /* the queue & pwaudiosink of the sink pipeline */
++ GstElement *queue;
++ GstElement *pwelem;
++};
++
++static struct ba_dbus_ctx dbus_ctx;
++static GHashTable *workers;
++static bool main_loop_on = true;
++
++static void
++main_loop_stop(int sig)
++{
++ /* Call to this handler restores the default action, so on the
++ * second call the program will be forcefully terminated. */
++
++ struct sigaction sigact = { .sa_handler = SIG_DFL };
++ sigaction(sig, &sigact, NULL);
++
++ main_loop_on = false;
++}
++
++static GstBusSyncReply
++bus_sync_handler(GstBus *bus, GstMessage *message, gpointer user_data)
++{
++ struct worker *w = user_data;
++ GstState s;
++
++ switch (GST_MESSAGE_TYPE (message)) {
++ case GST_MESSAGE_REQUEST_STATE:
++ gst_message_parse_request_state (message, &s);
++
++ debug ("corked: %d", (s == GST_STATE_PAUSED));
++
++ /* drop queue data when corked */
++ g_object_set (w->queue,
++ "leaky", (s == GST_STATE_PAUSED) ? 2 /* downstream */ : 0 /* no */,
++ NULL);
++ gst_element_set_state (w->pwelem, s);
++
++ /* flush the queue when resuming */
++ if (s == GST_STATE_PLAYING) {
++ gst_element_send_event (w->queue, gst_event_new_flush_start ());
++ gst_element_send_event (w->queue, gst_event_new_flush_stop (FALSE));
++ }
++ break;
++ default:
++ break;
++ }
++
++ gst_message_unref (message);
++ return GST_BUS_DROP;
++}
++
++static int
++worker_start_pipeline(struct worker *w, int id, int mode, int profile)
++{
++ GError *gerr = NULL;
++ DBusError err = DBUS_ERROR_INIT;
++ const gchar * role = NULL;
++
++ if (w->pipeline[id])
++ return 0;
++
++ if (!bluealsa_dbus_pcm_open(&dbus_ctx, w->ba_pcm.pcm_path, mode,
++ &w->ba_pcm_fd, &w->ba_pcm_ctrl_fd, &err)) {
++ error("Couldn't open PCM: %s", err.message);
++ dbus_error_free(&err);
++ goto fail;
++ }
++
++ if (mode == BA_PCM_FLAG_SINK) {
++ debug("sink start");
++ w->pipeline[id] = gst_parse_launch(
++ /* add a silent live source to ensure a perfect live stream on the
++ output, even when the bt device is not sending or has gaps;
++ this also effectively changes the clock to be the system clock,
++ which is the same clock used by bluez-alsa on the sending side */
++ "audiotestsrc is-live=true wave=silence ! capsfilter name=capsf "
++ "! audiomixer name=m "
++ /* mix the input from bluez-alsa using fdsrc; rawaudioparse
++ is necessary to convert bytes to time and align the buffers */
++ "fdsrc name=fdelem do-timestamp=true ! capsfilter name=capsf2 "
++ "! rawaudioparse use-sink-caps=true ! m. "
++ /* take the mixer output, convert and push to pipewire */
++ "m.src ! capsfilter name=capsf3 ! audioconvert ! audioresample "
++ "! audio/x-raw,format=F32LE,rate=48000 ! identity sync=true "
++ "! queue name=queue leaky=no max-size-time=0 max-size-buffers=0 max-size-bytes=192000 "
++ "! pwaudiosink name=pwelem",
++ &gerr);
++
++ /* a2dp is for music, sco is for calls */
++ role = (profile == BA_PCM_FLAG_PROFILE_A2DP) ? "Multimedia" : "Communication";
++ }
++ else if (mode == BA_PCM_FLAG_SOURCE && profile == BA_PCM_FLAG_PROFILE_SCO) {
++ debug("source start");
++ w->pipeline[id] = gst_parse_launch(
++ /* read from pipewire and put the buffers on a leaky queue, which
++ will essentially allow pwaudiosrc to continue working while
++ the fdsink is blocked (when there is no phone call in progress).
++ 9600 bytes = 50ms @ F32LE/1ch/48000
++ */
++ "pwaudiosrc name=pwelem ! audio/x-raw,format=F32LE,rate=48000 "
++ "! queue name=queue leaky=downstream max-size-time=0 max-size-buffers=0 max-size-bytes=9600 "
++ "! audioconvert ! audioresample ! capsfilter name=capsf "
++ "! fdsink name=fdelem", &gerr);
++
++ role = "Communication";
++ }
++
++ if (gerr) {
++ error("Failed to start pipeline: %s", gerr->message);
++ g_error_free(gerr);
++ goto fail;
++ }
++
++ if (w->pipeline[id]) {
++ g_autofree gchar *capsstr = NULL;
++ g_autoptr (GstElement) fdelem = gst_bin_get_by_name(GST_BIN(w->pipeline[id]), "fdelem");
++ g_autoptr (GstElement) pwelem = gst_bin_get_by_name(GST_BIN(w->pipeline[id]), "pwelem");
++ g_autoptr (GstElement) queue = gst_bin_get_by_name(GST_BIN(w->pipeline[id]), "queue");
++ g_autoptr (GstElement) capsf = gst_bin_get_by_name(GST_BIN(w->pipeline[id]), "capsf");
++ g_autoptr (GstElement) capsf2 = gst_bin_get_by_name(GST_BIN(w->pipeline[id]), "capsf2");
++ g_autoptr (GstElement) capsf3 = gst_bin_get_by_name(GST_BIN(w->pipeline[id]), "capsf3");
++ g_autoptr (GstCaps) caps = gst_caps_new_simple("audio/x-raw",
++ "format", G_TYPE_STRING, "S16LE",
++ "layout", G_TYPE_STRING, "interleaved",
++ "channels", G_TYPE_INT, w->ba_pcm.channels,
++ "rate", G_TYPE_INT, w->ba_pcm.sampling,
++ NULL);
++ g_autoptr (GstStructure) stream_props = gst_structure_new("props",
++ "media.role", G_TYPE_STRING, role,
++ "bluealsa.profile", G_TYPE_STRING,
++ (profile == BA_PCM_FLAG_PROFILE_SCO) ? "sco" : "a2dp",
++ NULL);
++
++ g_object_set(capsf, "caps", caps, NULL);
++ if (capsf2)
++ g_object_set(capsf2, "caps", caps, NULL);
++ if (capsf3)
++ g_object_set(capsf3, "caps", caps, NULL);
++
++ capsstr = gst_caps_to_string (caps);
++ debug(" caps: %s", capsstr);
++
++ g_object_set(fdelem, "fd", w->ba_pcm_fd, NULL);
++ g_object_set(pwelem, "stream-properties", stream_props, NULL);
++
++ if (mode == BA_PCM_FLAG_SINK) {
++ g_autoptr (GstBus) bus = gst_pipeline_get_bus(GST_PIPELINE(w->pipeline[id]));
++ gst_bus_set_sync_handler(bus, bus_sync_handler, w, NULL);
++ w->queue = queue;
++ w->pwelem = pwelem;
++ }
++
++ gst_element_set_state(w->pipeline[id], GST_STATE_PLAYING);
++ }
++
++ return 0;
++fail:
++ g_clear_object(&w->pipeline[id]);
++ return -1;
++}
++
++static int
++worker_start(struct worker *w)
++{
++ int mode = w->ba_pcm.flags & (BA_PCM_FLAG_SOURCE | BA_PCM_FLAG_SINK);
++ int profile = w->ba_pcm.flags & (BA_PCM_FLAG_PROFILE_A2DP | BA_PCM_FLAG_PROFILE_SCO);
++ /* human-readable BT address */
++ char addr[18];
++
++ g_return_val_if_fail (profile != 0 && profile != (BA_PCM_FLAG_PROFILE_A2DP | BA_PCM_FLAG_PROFILE_SCO), -1);
++
++ ba2str(&w->ba_pcm.addr, addr);
++ debug("%p: worker start addr:%s, mode:0x%x, profile:0x%x", w, addr, mode, profile);
++
++ if (mode & BA_PCM_FLAG_SINK)
++ worker_start_pipeline(w, 0, BA_PCM_FLAG_SINK, profile);
++ if (mode & BA_PCM_FLAG_SOURCE)
++ worker_start_pipeline(w, 1, BA_PCM_FLAG_SOURCE, profile);
++}
++
++static int
++worker_stop(struct worker *w)
++{
++ debug("stop worker %p", w);
++ if (w->pipeline[0]) {
++ gst_element_set_state(w->pipeline[0], GST_STATE_NULL);
++ g_clear_object(&w->pipeline[0]);
++ }
++ if (w->pipeline[1]) {
++ gst_element_set_state(w->pipeline[1], GST_STATE_NULL);
++ g_clear_object(&w->pipeline[1]);
++ }
++ if (w->ba_pcm_fd != -1) {
++ close(w->ba_pcm_fd);
++ w->ba_pcm_fd = -1;
++ }
++ if (w->ba_pcm_ctrl_fd != -1) {
++ close(w->ba_pcm_ctrl_fd);
++ w->ba_pcm_ctrl_fd = -1;
++ }
++ return 0;
++}
++
++static int
++supervise_pcm_worker(struct worker *worker)
++{
++ if (worker == NULL)
++ return -1;
++
++ /* no mode? */
++ if (worker->ba_pcm.flags & (BA_PCM_FLAG_SOURCE | BA_PCM_FLAG_SINK) == 0)
++ goto stop;
++
++ /* no profile? */
++ if (worker->ba_pcm.flags & (BA_PCM_FLAG_PROFILE_A2DP | BA_PCM_FLAG_PROFILE_SCO) == 0)
++ goto stop;
++
++ /* check whether SCO has selected codec */
++ if (worker->ba_pcm.flags & BA_PCM_FLAG_PROFILE_SCO &&
++ worker->ba_pcm.codec == 0) {
++ debug("Skipping SCO with codec not selected");
++ goto stop;
++ }
++
++start:
++ return worker_start(worker);
++stop:
++ return worker_stop(worker);
++}
++
++static void
++worker_new(struct ba_pcm *pcm)
++{
++ struct worker *w = g_slice_new0 (struct worker);
++ memcpy(&w->ba_pcm, pcm, sizeof(struct ba_pcm));
++ w->ba_pcm_fd = -1;
++ w->ba_pcm_ctrl_fd = -1;
++ g_hash_table_insert(workers, w->ba_pcm.pcm_path, w);
++ supervise_pcm_worker(w);
++}
++
++static DBusHandlerResult
++dbus_signal_handler(DBusConnection *conn, DBusMessage *message, void *data)
++{
++ (void)conn;
++ (void)data;
++
++ const char *path = dbus_message_get_path(message);
++ const char *interface = dbus_message_get_interface(message);
++ const char *signal = dbus_message_get_member(message);
++
++ DBusMessageIter iter;
++ struct worker *worker;
++
++ if (strcmp(interface, BLUEALSA_INTERFACE_MANAGER) == 0) {
++
++ if (strcmp(signal, "PCMAdded") == 0) {
++ struct ba_pcm pcm;
++ if (!dbus_message_iter_init(message, &iter) ||
++ !bluealsa_dbus_message_iter_get_pcm(&iter, NULL, &pcm)) {
++ error("Couldn't add new PCM: %s", "Invalid signal signature");
++ goto fail;
++ }
++ worker_new(&pcm);
++ return DBUS_HANDLER_RESULT_HANDLED;
++ }
++
++ if (strcmp(signal, "PCMRemoved") == 0) {
++ if (!dbus_message_iter_init(message, &iter) ||
++ dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_OBJECT_PATH) {
++ error("Couldn't remove PCM: %s", "Invalid signal signature");
++ goto fail;
++ }
++ dbus_message_iter_get_basic(&iter, &path);
++ g_hash_table_remove(workers, path);
++ return DBUS_HANDLER_RESULT_HANDLED;
++ }
++
++ }
++
++ if (strcmp(interface, DBUS_INTERFACE_PROPERTIES) == 0) {
++ worker = g_hash_table_lookup(workers, path);
++ if (!worker)
++ goto fail;
++ if (!dbus_message_iter_init(message, &iter) ||
++ dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) {
++ error("Couldn't update PCM: %s", "Invalid signal signature");
++ goto fail;
++ }
++ dbus_message_iter_get_basic(&iter, &interface);
++ dbus_message_iter_next(&iter);
++ if (!bluealsa_dbus_message_iter_get_pcm_props(&iter, NULL, &worker->ba_pcm))
++ goto fail;
++ supervise_pcm_worker(worker);
++ return DBUS_HANDLER_RESULT_HANDLED;
++ }
++
++fail:
++ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
++}
++
++static void
++destroy_worker(void *worker)
++{
++ struct worker *w = worker;
++ worker_stop(w);
++ g_slice_free(struct worker, w);
++}
++
++int
++main(int argc, char *argv[])
++{
++ int ret = EXIT_SUCCESS;
++
++ log_open(argv[0], false, false);
++ gst_init(&argc, &argv);
++ dbus_threads_init_default();
++
++ DBusError err = DBUS_ERROR_INIT;
++ if (!bluealsa_dbus_connection_ctx_init(&dbus_ctx, BLUEALSA_SERVICE, &err)) {
++ error("Couldn't initialize D-Bus context: %s", err.message);
++ return EXIT_FAILURE;
++ }
++
++ bluealsa_dbus_connection_signal_match_add(&dbus_ctx,
++ BLUEALSA_SERVICE, NULL, BLUEALSA_INTERFACE_MANAGER, "PCMAdded", NULL);
++ bluealsa_dbus_connection_signal_match_add(&dbus_ctx,
++ BLUEALSA_SERVICE, NULL, BLUEALSA_INTERFACE_MANAGER, "PCMRemoved", NULL);
++ bluealsa_dbus_connection_signal_match_add(&dbus_ctx,
++ BLUEALSA_SERVICE, NULL, DBUS_INTERFACE_PROPERTIES, "PropertiesChanged",
++ "arg0='"BLUEALSA_INTERFACE_PCM"'");
++
++ if (!dbus_connection_add_filter(dbus_ctx.conn, dbus_signal_handler, NULL, NULL)) {
++ error("Couldn't add D-Bus filter: %s", err.message);
++ return EXIT_FAILURE;
++ }
++
++ workers = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, destroy_worker);
++
++ {
++ struct ba_pcm *pcms = NULL;
++ size_t pcms_count = 0, i;
++
++ if (!bluealsa_dbus_get_pcms(&dbus_ctx, &pcms, &pcms_count, &err))
++ warn("Couldn't get BlueALSA PCM list: %s", err.message);
++
++ for (i = 0; i < pcms_count; i++) {
++ worker_new(&pcms[i]);
++ }
++
++ free(pcms);
++ }
++
++ struct sigaction sigact = { .sa_handler = main_loop_stop };
++ sigaction(SIGTERM, &sigact, NULL);
++ sigaction(SIGINT, &sigact, NULL);
++
++ /* Ignore SIGPIPE, which may be received when writing to the bluealsa
++ socket when it is closed on the remote end */
++ signal(SIGPIPE, SIG_IGN);
++
++ debug("Starting main loop");
++ while (main_loop_on) {
++
++ struct pollfd pfds[10];
++ nfds_t pfds_len = ARRAYSIZE(pfds);
++
++ if (!bluealsa_dbus_connection_poll_fds(&dbus_ctx, pfds, &pfds_len)) {
++ error("Couldn't get D-Bus connection file descriptors");
++ ret = EXIT_FAILURE;
++ goto out;
++ }
++
++ if (poll(pfds, pfds_len, -1) == -1 &&
++ errno == EINTR)
++ continue;
++
++ if (bluealsa_dbus_connection_poll_dispatch(&dbus_ctx, pfds, pfds_len))
++ while (dbus_connection_dispatch(dbus_ctx.conn) == DBUS_DISPATCH_DATA_REMAINS)
++ continue;
++
++ }
++
++out:
++ g_hash_table_unref(workers);
++ return ret;
++}
+--
+2.24.0
+
diff --git a/recipes-connectivity/bluez-alsa/bluez-alsa/bluealsa-gst-helper@.service b/recipes-connectivity/bluez-alsa/bluez-alsa/bluealsa-gst-helper@.service
new file mode 100644
index 00000000..495ab622
--- /dev/null
+++ b/recipes-connectivity/bluez-alsa/bluez-alsa/bluealsa-gst-helper@.service
@@ -0,0 +1,18 @@
+[Unit]
+Description=Bluetooth audio helper for user %i
+Requires=pipewire@%i.socket bluez-alsa.service
+After=pipewire@%i.socket bluez-alsa.service
+
+[Service]
+Type=simple
+Restart=on-failure
+ExecStart=/usr/bin/bluealsa-gst-helper
+
+Environment=XDG_RUNTIME_DIR=/run/user/%i
+Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%i/bus
+
+User=%i
+Slice=user-%i.slice
+SupplementaryGroups=audio
+UMask=0077
+CapabilityBoundingSet=
diff --git a/recipes-connectivity/bluez-alsa/bluez-alsa_git.bb b/recipes-connectivity/bluez-alsa/bluez-alsa_git.bb
new file mode 100644
index 00000000..010329ee
--- /dev/null
+++ b/recipes-connectivity/bluez-alsa/bluez-alsa_git.bb
@@ -0,0 +1,43 @@
+SUMMARY = "Bluetooth Audio ALSA Backend"
+HOMEPAGE = "https://github.com/Arkq/bluez-alsa"
+SECTION = "libs"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3d7d6ac7e2dbd2505652dceb3acdf1fe"
+
+SRC_URI = "git://github.com/Arkq/bluez-alsa.git;protocol=https;branch=master"
+SRCREV = "2cd6e4686f7808276480b430fb37df55dfdcc02b"
+
+SRC_URI += "file://bluez-alsa.service"
+
+S = "${WORKDIR}/git"
+
+DEPENDS += "alsa-lib bluez5 systemd glib-2.0 sbc"
+
+PACKAGECONFIG[aac] = "--enable-aac, --disable-aac, "
+PACKAGECONFIG[aptx] = "--enable-aptx,--disable-aptx,"
+PACKAGECONFIG[ofono] = "--enable-ofono, --disable-ofono,"
+
+inherit autotools pkgconfig
+inherit systemd
+
+SYSTEMD_AUTO_ENABLE = "enable"
+SYSTEMD_SERVICE_${PN} = "bluez-alsa.service"
+
+PACKAGECONFIG += "ofono"
+
+# enable debug tools in devel images
+PACKAGECONFIG[hcitop] = "--enable-hcitop, --disable-hcitop, libbsd ncurses"
+PACKAGECONFIG[rfcomm] = "--enable-rfcomm, --disable-rfcomm,"
+PACKAGECONFIG_append_agl-devel = " hcitop rfcomm"
+
+do_install_append () {
+ install -d ${D}${base_libdir}/systemd/system
+ install -m 0644 ${WORKDIR}/bluez-alsa.service ${D}${base_libdir}/systemd/system
+}
+
+FILES_${PN} += "\
+ ${datadir}/alsa/alsa.conf.d/20-bluealsa.conf\
+ ${libdir}/alsa-lib/libasound_module_ctl_bluealsa.so\
+ ${libdir}/alsa-lib/libasound_module_pcm_bluealsa.so\
+"
diff --git a/recipes-connectivity/bluez-alsa/bluez-alsa_git.bbappend b/recipes-connectivity/bluez-alsa/bluez-alsa_git.bbappend
new file mode 100644
index 00000000..bcb47888
--- /dev/null
+++ b/recipes-connectivity/bluez-alsa/bluez-alsa_git.bbappend
@@ -0,0 +1,35 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/bluez-alsa:"
+
+SRC_URI += "\
+ file://0001-utils-add-a-gstreamer-helper-application-for-interco.patch \
+ file://bluealsa-gst-helper@.service \
+ "
+
+PACKAGECONFIG += "gsthelper"
+PACKAGECONFIG[gsthelper] = "--enable-gsthelper, --disable-gsthelper, gstreamer1.0"
+
+do_install_append() {
+ if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then
+ # install the service file
+ mkdir -p ${D}${systemd_system_unitdir}/
+ install -m 0644 ${WORKDIR}/bluealsa-gst-helper@.service ${D}${systemd_system_unitdir}/bluealsa-gst-helper@.service
+
+ # enable the helper to start together with afm-user-session
+ mkdir -p ${D}${systemd_system_unitdir}/afm-user-session@.target.wants
+ ln -sf ../bluealsa-gst-helper@.service ${D}${systemd_system_unitdir}/afm-user-session@.target.wants/bluealsa-gst-helper@.service
+ fi
+}
+
+PACKAGES =+ "${PN}-pipewire"
+
+FILES_${PN}-pipewire = "\
+ ${bindir}/bluealsa-gst-helper \
+ ${systemd_system_unitdir}/bluealsa-gst-helper@.service \
+ ${systemd_system_unitdir}/afm-user-session@.target.wants/bluealsa-gst-helper@.service \
+ "
+RDEPENDS_${PN}-pipewire += "\
+ bluez-alsa \
+ pipewire \
+ gstreamer1.0-plugins-base \
+ gstreamer1.0-pipewire \
+ "
diff --git a/recipes-connectivity/bluez-alsa/files/bluez-alsa.service b/recipes-connectivity/bluez-alsa/files/bluez-alsa.service
new file mode 100644
index 00000000..b59302ee
--- /dev/null
+++ b/recipes-connectivity/bluez-alsa/files/bluez-alsa.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=Bluetooth Audio ALSA Backend
+After=bluetooth.service
+Requires=bluetooth.service
+
+[Service]
+Type=simple
+ExecStart=/usr/bin/bluealsa -p a2dp-sink -p hfp-ofono
+
+[Install]
+WantedBy=multi-user.target
diff --git a/recipes-connectivity/bluez5/bluez5/bluetooth.conf b/recipes-connectivity/bluez5/bluez5/bluetooth.conf
new file mode 100644
index 00000000..1f2762de
--- /dev/null
+++ b/recipes-connectivity/bluez5/bluez5/bluetooth.conf
@@ -0,0 +1,39 @@
+<!-- This configuration file specifies the required security policies
+ for Bluetooth core daemon to work. -->
+
+<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
+ "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
+<busconfig>
+
+ <!-- ../system.conf have denied everything, so we just punch some holes -->
+
+ <policy user="root">
+ <allow own="org.bluez"/>
+ <allow send_destination="org.bluez"/>
+ <allow send_interface="org.bluez.Agent1"/>
+ <allow send_interface="org.bluez.MediaEndpoint1"/>
+ <allow send_interface="org.bluez.MediaPlayer1"/>
+ <allow send_interface="org.bluez.ThermometerWatcher1"/>
+ <allow send_interface="org.bluez.AlertAgent1"/>
+ <allow send_interface="org.bluez.Profile1"/>
+ <allow send_interface="org.bluez.HeartRateWatcher1"/>
+ <allow send_interface="org.bluez.CyclingSpeedWatcher1"/>
+ <allow send_interface="org.bluez.GattCharacteristic1"/>
+ <allow send_interface="org.bluez.GattDescriptor1"/>
+ <allow send_interface="org.freedesktop.DBus.ObjectManager"/>
+ <allow send_interface="org.freedesktop.DBus.Properties"/>
+ <allow receive_type="signal" receive_sender="org.bluez" receive_interface="org.freedesktop.DBus.Properties"/>
+ <allow receive_type="signal" receive_sender="org.bluez" receive_interface="org.freedesktop.DBus.ObjectManager"/>
+ </policy>
+
+ <policy at_console="true">
+ <allow send_destination="org.bluez"/>
+ </policy>
+
+ <!-- allow users of lp group (printing subsystem) to
+ communicate with bluetoothd -->
+ <policy group="lp">
+ <allow send_destination="org.bluez"/>
+ </policy>
+
+</busconfig>
diff --git a/recipes-connectivity/bluez5/bluez5/bluetooth.service b/recipes-connectivity/bluez5/bluez5/bluetooth.service
new file mode 100644
index 00000000..8ae83bd4
--- /dev/null
+++ b/recipes-connectivity/bluez5/bluez5/bluetooth.service
@@ -0,0 +1,21 @@
+[Unit]
+Description=Bluetooth service
+Documentation=man:bluetoothd(8)
+ConditionPathIsDirectory=/sys/class/bluetooth
+
+[Service]
+Type=dbus
+BusName=org.bluez
+ExecStartPre=-/usr/bin/hciconfig hci0 aclmtu 930:10
+ExecStart=/usr/libexec/bluetooth/bluetoothd
+NotifyAccess=main
+#WatchdogSec=10
+#Restart=on-failure
+CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
+LimitNPROC=1
+ProtectHome=true
+ProtectSystem=full
+
+[Install]
+WantedBy=bluetooth.target
+Alias=dbus-org.bluez.service
diff --git a/recipes-connectivity/bluez5/bluez5/obex.service b/recipes-connectivity/bluez5/bluez5/obex.service
new file mode 100644
index 00000000..87ffff6a
--- /dev/null
+++ b/recipes-connectivity/bluez5/bluez5/obex.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=Bluetooth OBEX service
+
+[Service]
+Type=dbus
+BusName=org.bluez.obex
+ExecStart=/usr/libexec/bluetooth/obexd --root=/var/volatile/tmp
+
+[Install]
+Alias=dbus-org.bluez.obex.service
diff --git a/recipes-connectivity/bluez5/bluez5/tmpdir.conf b/recipes-connectivity/bluez5/bluez5/tmpdir.conf
new file mode 100644
index 00000000..8545d76e
--- /dev/null
+++ b/recipes-connectivity/bluez5/bluez5/tmpdir.conf
@@ -0,0 +1,2 @@
+[Service]
+Environment="TMPDIR=/run/user/%U/usrshr"
diff --git a/recipes-connectivity/bluez5/bluez5_%.bbappend b/recipes-connectivity/bluez5/bluez5_%.bbappend
new file mode 100644
index 00000000..18e69498
--- /dev/null
+++ b/recipes-connectivity/bluez5/bluez5_%.bbappend
@@ -0,0 +1 @@
+require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'bluez5_agldemo.inc', '', d)}
diff --git a/recipes-connectivity/bluez5/bluez5_agldemo.inc b/recipes-connectivity/bluez5/bluez5_agldemo.inc
new file mode 100644
index 00000000..0e9cd62c
--- /dev/null
+++ b/recipes-connectivity/bluez5/bluez5_agldemo.inc
@@ -0,0 +1,24 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/bluez5:"
+SRC_URI_append = " \
+ file://bluetooth.conf \
+ file://tmpdir.conf \
+ file://obex.service \
+ file://bluetooth.service \
+"
+
+FILES_${PN}_append = " ${systemd_user_unitdir}/obex.service.d/tmpdir.conf"
+
+do_install_append() {
+ install -m 0644 ${WORKDIR}/bluetooth.conf ${D}${sysconfdir}/dbus-1/system.d/bluetooth.conf
+
+ if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then
+ mkdir -p ${D}${systemd_user_unitdir}/obex.service.d
+
+ install -m 0644 ${WORKDIR}/obex.service ${D}${systemd_user_unitdir}
+ install -m 0644 ${WORKDIR}/tmpdir.conf ${D}${systemd_user_unitdir}/obex.service.d/tmpdir.conf
+ mkdir -p ${D}/etc/systemd/user
+ ln -sf ${systemd_user_unitdir}/obex.service ${D}/etc/systemd/user/dbus-org.bluez.obex.service
+ mkdir -p ${D}${systemd_system_unitdir}
+ install -m 0644 ${WORKDIR}/bluetooth.service ${D}${systemd_system_unitdir}
+ fi
+}
diff --git a/recipes-connectivity/cluster-connman-conf/cluster-connman-conf/cluster.config b/recipes-connectivity/cluster-connman-conf/cluster-connman-conf/cluster.config
new file mode 100644
index 00000000..6ce2a76f
--- /dev/null
+++ b/recipes-connectivity/cluster-connman-conf/cluster-connman-conf/cluster.config
@@ -0,0 +1,3 @@
+[service_cluster_ethernet]
+Type=ethernet
+IPv4=@CLUSTER_DEMO_SERVER_IP@/255.255.255.0
diff --git a/recipes-connectivity/cluster-connman-conf/cluster-connman-conf_1.0.bb b/recipes-connectivity/cluster-connman-conf/cluster-connman-conf_1.0.bb
new file mode 100644
index 00000000..78528aa7
--- /dev/null
+++ b/recipes-connectivity/cluster-connman-conf/cluster-connman-conf_1.0.bb
@@ -0,0 +1,15 @@
+SUMMARY = "Cluster demo connman configuration"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420"
+
+SRC_URI = "file://cluster.config"
+
+CLUSTER_DEMO_SERVER_IP ?= "192.168.20.99"
+
+do_install() {
+ install -d ${D}${localstatedir}/lib/connman
+ sed "s/@CLUSTER_DEMO_SERVER_IP@/${CLUSTER_DEMO_SERVER_IP}/g" \
+ ${WORKDIR}/cluster.config > ${D}${localstatedir}/lib/connman/cluster.config
+}
+
+FILES_${PN} += "${localstatedir}/*"
diff --git a/recipes-connectivity/mobile-broadband-provider-info/mobile-broadband-provider-info/0001-remove-Fido-service-provider.patch b/recipes-connectivity/mobile-broadband-provider-info/mobile-broadband-provider-info/0001-remove-Fido-service-provider.patch
new file mode 100644
index 00000000..c1545c72
--- /dev/null
+++ b/recipes-connectivity/mobile-broadband-provider-info/mobile-broadband-provider-info/0001-remove-Fido-service-provider.patch
@@ -0,0 +1,31 @@
+diff --git a/serviceproviders.xml b/serviceproviders.xml
+index e7f36ac..f1a0ca3 100644
+--- a/serviceproviders.xml
++++ b/serviceproviders.xml
+@@ -2236,26 +2236,6 @@ conceived.
+
+ <!-- Canada -->
+ <country code="ca">
+- <provider>
+- <name>Fido</name>
+- <gsm>
+- <network-id mcc="302" mnc="370"/>
+- <apn value="internet.fido.ca">
+- <plan type="postpaid"/>
+- <usage type="internet"/>
+- <username>fido</username>
+- <password>fido</password>
+- <dns>204.92.15.211</dns>
+- <dns>207.181.101.4</dns>
+- </apn>
+- <apn value="mms.fido.ca">
+- <usage type="mms"/>
+- <name>Fido MMS</name>
+- <mmsc>http://mms.fido.ca</mmsc>
+- <mmsproxy>mm1.fido.ca:80</mmsproxy>
+- </apn>
+- </gsm>
+- </provider>
+ <provider>
+ <name>Rogers</name>
+ <gsm>
diff --git a/recipes-connectivity/mobile-broadband-provider-info/mobile-broadband-provider-info_agldemo.inc b/recipes-connectivity/mobile-broadband-provider-info/mobile-broadband-provider-info_agldemo.inc
new file mode 100644
index 00000000..f64bcfbc
--- /dev/null
+++ b/recipes-connectivity/mobile-broadband-provider-info/mobile-broadband-provider-info_agldemo.inc
@@ -0,0 +1,4 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/mobile-broadband-provider-info:"
+
+SRC_URI += "file://0001-remove-Fido-service-provider.patch"
+
diff --git a/recipes-connectivity/mobile-broadband-provider-info/mobile-broadband-provider-info_git.bbappend b/recipes-connectivity/mobile-broadband-provider-info/mobile-broadband-provider-info_git.bbappend
new file mode 100644
index 00000000..afd88803
--- /dev/null
+++ b/recipes-connectivity/mobile-broadband-provider-info/mobile-broadband-provider-info_git.bbappend
@@ -0,0 +1 @@
+require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'mobile-broadband-provider-info_agldemo.inc', '', d)}
diff --git a/recipes-connectivity/neard/files/0001-systemd-neard-add-multi-user.target-to-neard.service.patch b/recipes-connectivity/neard/files/0001-systemd-neard-add-multi-user.target-to-neard.service.patch
new file mode 100644
index 00000000..c3295169
--- /dev/null
+++ b/recipes-connectivity/neard/files/0001-systemd-neard-add-multi-user.target-to-neard.service.patch
@@ -0,0 +1,25 @@
+From d8c03a31e2734e59af43dd50cbd7f5a94d798ab1 Mon Sep 17 00:00:00 2001
+From: Matt Ranostay <matt.ranostay@konsulko.com>
+Date: Tue, 10 Jul 2018 21:18:26 -0700
+Subject: [PATCH] systemd: neard: add multi-user.target to neard.service
+
+Allowing a service to be system level requires a WantedBy= target
+
+Signed-off-by: Matt Ranostay <matt.ranostay@konsulko.com>
+---
+ src/neard.service.in | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/src/neard.service.in b/src/neard.service.in
+index dfa238c..540da7e 100644
+--- a/src/neard.service.in
++++ b/src/neard.service.in
+@@ -9,4 +9,5 @@ ExecStart=@pkglibexecdir@/neard -n
+ LimitNPROC=1
+
+ [Install]
++WantedBy=multi-user.target
+ Alias=dbus-org.neard.service
+--
+2.17.1
+
diff --git a/recipes-connectivity/neard/files/0002-ndef-avoid-dbus-property_get_type-method-on-empty-re.patch b/recipes-connectivity/neard/files/0002-ndef-avoid-dbus-property_get_type-method-on-empty-re.patch
new file mode 100644
index 00000000..49c11a50
--- /dev/null
+++ b/recipes-connectivity/neard/files/0002-ndef-avoid-dbus-property_get_type-method-on-empty-re.patch
@@ -0,0 +1,33 @@
+From d7ea2a00e00795ad24897e3481b015a27d37d60f Mon Sep 17 00:00:00 2001
+From: Raquel Medina <raquel.medina@konsulko.com>
+Date: Tue, 22 Jan 2019 09:00:05 -0500
+Subject: [PATCH] ndef: avoid dbus property_get_type method on empty record
+
+Signed-off-by: Raquel Medina <raquel.medina@konsulko.com>
+---
+ src/ndef.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/src/ndef.c b/src/ndef.c
+index 5656baf..883c6f4 100644
+--- a/src/ndef.c
++++ b/src/ndef.c
+@@ -2832,10 +2832,14 @@ GList *near_ndef_parse_msg(uint8_t *ndef_data, size_t ndef_length,
+ case RECORD_TYPE_WKT_ALTERNATIVE_CARRIER:
+ case RECORD_TYPE_WKT_COLLISION_RESOLUTION:
+ case RECORD_TYPE_WKT_ERROR:
+- case RECORD_TYPE_UNKNOWN:
+ case RECORD_TYPE_ERROR:
+ break;
+
++ case RECORD_TYPE_UNKNOWN:
++ if (record->header->tnf == RECORD_TNF_EMPTY)
++ goto fail;
++ break;
++
+ case RECORD_TYPE_WKT_HANDOVER_REQUEST:
+ case RECORD_TYPE_WKT_HANDOVER_SELECT:
+ /*
+--
+2.17.1
+
diff --git a/recipes-connectivity/neard/neard_0.16.bbappend b/recipes-connectivity/neard/neard_0.16.bbappend
new file mode 100644
index 00000000..2ab0381c
--- /dev/null
+++ b/recipes-connectivity/neard/neard_0.16.bbappend
@@ -0,0 +1 @@
+require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'neard_agldemo.inc', '', d)}
diff --git a/recipes-connectivity/neard/neard_agldemo.inc b/recipes-connectivity/neard/neard_agldemo.inc
new file mode 100644
index 00000000..f39fc9bc
--- /dev/null
+++ b/recipes-connectivity/neard/neard_agldemo.inc
@@ -0,0 +1,7 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
+
+SRC_URI_append = "\
+ file://0001-systemd-neard-add-multi-user.target-to-neard.service.patch \
+ file://0002-ndef-avoid-dbus-property_get_type-method-on-empty-re.patch \
+ "
+SYSTEMD_SERVICE_${PN}_append = " neard.service"
diff --git a/recipes-connectivity/neardal/neardal.inc b/recipes-connectivity/neardal/neardal.inc
new file mode 100644
index 00000000..3bb6b24e
--- /dev/null
+++ b/recipes-connectivity/neardal/neardal.inc
@@ -0,0 +1,22 @@
+SUMMARY = "Neard Abstraction Library (NeardAL)"
+
+DESCRIPTION = "NeardAL is a library that provides a simple C API \
+to exchange data with NFC daemon (Neard)."
+
+HOMEPAGE = "https://github.com/connectivity/neardal"
+SECTION = "libs"
+LICENSE = "LGPLv2"
+
+DEPENDS = "glib-2.0 readline glib-2.0-native"
+
+LIC_FILES_CHKSUM = "file://COPYING;md5=6a6e689d19255cf0557f3fe7d7068212 \
+ file://lib/neardal.h;endline=20;md5=a53e93aea9357387078ed217565c0a99"
+
+inherit autotools pkgconfig
+
+PACKAGES =+ "${PN}-tools ${PN}-tools-dbg"
+
+FILES_${PN}-tools = "${libexecdir}/ncl"
+FILES_${PN}-tools-dbg += "${libexecdir}/.debug"
+
+RDEPENDS_${PN}-tools = "bash"
diff --git a/recipes-connectivity/neardal/neardal/0001-neardal-ncl-fix-segfault-on-help-page-being-displaye.patch b/recipes-connectivity/neardal/neardal/0001-neardal-ncl-fix-segfault-on-help-page-being-displaye.patch
new file mode 100644
index 00000000..596fe057
--- /dev/null
+++ b/recipes-connectivity/neardal/neardal/0001-neardal-ncl-fix-segfault-on-help-page-being-displaye.patch
@@ -0,0 +1,27 @@
+From 795308b2452ee617da4096914b53ba3a1142e3db Mon Sep 17 00:00:00 2001
+From: Matt Ranostay <matt.ranostay@konsulko.com>
+Date: Fri, 6 Jul 2018 17:19:09 -0700
+Subject: [PATCH] neardal: ncl: fix segfault on help page being displayed
+
+LISTCMD_NAME is declared as a const char due to being defined in a
+macro so g_strdup it to stop proceeding operations from segfaulting.
+
+Signed-off-by: Matt Ranostay <matt.ranostay@konsulko.com>
+
+---
+ ncl/ncl.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/ncl/ncl.c b/ncl/ncl.c
+index 590d13b..f4165b7 100644
+--- a/ncl/ncl.c
++++ b/ncl/ncl.c
+@@ -329,7 +329,7 @@ int main(int argc, char *argv[])
+ g_io_channel_unref(gNclCtx.channel);
+
+ if (show_help)
+- ncl_exec(LISTCMD_NAME);
++ ncl_exec(g_strdup(LISTCMD_NAME));
+
+ rl_callback_handler_install(NCL_PROMPT, ncl_parse_line);
+
diff --git a/recipes-connectivity/neardal/neardal/0002-neardal-lib-fix-memory-corruption.patch b/recipes-connectivity/neardal/neardal/0002-neardal-lib-fix-memory-corruption.patch
new file mode 100644
index 00000000..d40d9a4f
--- /dev/null
+++ b/recipes-connectivity/neardal/neardal/0002-neardal-lib-fix-memory-corruption.patch
@@ -0,0 +1,58 @@
+From ee6267f357b3d158f0a0e88460782e8b9d44274a Mon Sep 17 00:00:00 2001
+From: Raquel Medina <raquel.medina@konsulko.com>
+Date: Fri, 4 Jan 2019 07:43:03 -0500
+Subject: [PATCH] neardal: lib: fix memory corruption
+
+ The current commit fixes an invalid memory access
+ which manifests as a random segfault when executing
+ continuous tag read operations.
+
+ The corruption happens when releasing the memory allocated to a
+ record: in the time between the memory being g_free'd and the
+ subsequent memset operation, the memory could have been reused by
+ some other process. And since memory allocation depends on
+ system-wide factors, it makes this bug hard to track.
+
+ Tested using ACR122U reader and NTAG213
+ tags on Automotive Grade Linux (flounder,
+ guppy and master branches)
+
+Signed-off-by: Raquel Medina <raquel.medina@konsulko.com>
+---
+ lib/neardal_record.c | 1 -
+ lib/neardal_tools.c | 5 ++++-
+ 2 files changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/lib/neardal_record.c b/lib/neardal_record.c
+index 669012c..cfed5e8 100644
+--- a/lib/neardal_record.c
++++ b/lib/neardal_record.c
+@@ -31,7 +31,6 @@ void neardal_record_free(neardal_record *r)
+ {
+ g_return_if_fail(r);
+ neardal_g_strfreev((void **) r, &r->uriObjSize);
+- memset(r, 0, sizeof(*r));
+ }
+
+ void neardal_free_record(neardal_record *record) \
+diff --git a/lib/neardal_tools.c b/lib/neardal_tools.c
+index f0d6157..f307df6 100644
+--- a/lib/neardal_tools.c
++++ b/lib/neardal_tools.c
+@@ -32,9 +32,12 @@
+ void neardal_g_strfreev(void **array, void *end)
+ {
+ void **p = array;
+- for (; (void *) p < end; p++)
++ for (; (void *) p < end; p++) {
+ g_free(*p);
++ *p = NULL;
++ }
+ g_free(array);
++ array = NULL;
+ }
+
+ void neardal_g_variant_add_parsed(GVariant **v, const char *format, ...)
+--
+2.17.1
+
diff --git a/recipes-connectivity/neardal/neardal/ncl.patch b/recipes-connectivity/neardal/neardal/ncl.patch
new file mode 100644
index 00000000..baef6cca
--- /dev/null
+++ b/recipes-connectivity/neardal/neardal/ncl.patch
@@ -0,0 +1,25 @@
+From eab402bae42c3ea5caa8d540b6702d39e56c84c1 Mon Sep 17 00:00:00 2001
+From: Oleg Zhurakivskyy <oleg.zhurakivskyy@intel.com>
+Date: Tue, 10 Feb 2015 12:58:39 +0200
+Subject: [PATCH] build: Install ncl
+
+Signed-off-by: Oleg Zhurakivskyy <oleg.zhurakivskyy@intel.com>
+---
+ ncl/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/ncl/Makefile.am b/ncl/Makefile.am
+index beda75b..c06742f 100644
+--- a/ncl/Makefile.am
++++ b/ncl/Makefile.am
+@@ -1,6 +1,6 @@
+ AM_CPPFLAGS = @gio_CFLAGS@ -I$(top_builddir)/lib -I$(top_srcdir)/lib
+
+-noinst_PROGRAMS=ncl
++libexec_PROGRAMS = ncl
+
+ ncl_SOURCES = \
+ $(srcdir)/ncl.c $(srcdir)/ncl.h \
+--
+2.1.0
+
diff --git a/recipes-connectivity/neardal/neardal_0.14.bb b/recipes-connectivity/neardal/neardal_0.14.bb
new file mode 100644
index 00000000..f8634c46
--- /dev/null
+++ b/recipes-connectivity/neardal/neardal_0.14.bb
@@ -0,0 +1,10 @@
+require neardal.inc
+
+SRC_URI = "git://github.com/connectivity/neardal.git;protocol=https \
+ file://ncl.patch \
+ file://0001-neardal-ncl-fix-segfault-on-help-page-being-displaye.patch \
+ file://0002-neardal-lib-fix-memory-corruption.patch \
+ "
+SRCREV = "fe0fa79c94e9a0f1c2cfa1f58b3acc9bdc7d5e13"
+
+S = "${WORKDIR}/git"
diff --git a/recipes-connectivity/ofono/files/0001-provision-allow-duplicate-entries-from-mbpi_lookup_a.patch b/recipes-connectivity/ofono/files/0001-provision-allow-duplicate-entries-from-mbpi_lookup_a.patch
new file mode 100644
index 00000000..7b44e483
--- /dev/null
+++ b/recipes-connectivity/ofono/files/0001-provision-allow-duplicate-entries-from-mbpi_lookup_a.patch
@@ -0,0 +1,27 @@
+From 7782f8f9d9634ebeddafefedab10ba254f9cc34a Mon Sep 17 00:00:00 2001
+From: Matt Ranostay <matt.ranostay@konsulko.com>
+Date: Fri, 1 Mar 2019 17:53:17 +0900
+Subject: [PATCH] provision: allow duplicate entries from mbpi_lookup_apn()
+ results
+
+Signed-off-by: Matt Ranostay <matt.ranostay@konsulko.com>
+---
+ plugins/provision.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/plugins/provision.c b/plugins/provision.c
+index 99c299eb..aa0b05e4 100644
+--- a/plugins/provision.c
++++ b/plugins/provision.c
+@@ -50,7 +50,7 @@ static int provision_get_settings(const char *mcc, const char *mnc,
+
+ DBG("Provisioning for MCC %s, MNC %s, SPN '%s'", mcc, mnc, spn);
+
+- apns = mbpi_lookup_apn(mcc, mnc, FALSE, &error);
++ apns = mbpi_lookup_apn(mcc, mnc, TRUE, &error);
+ if (apns == NULL) {
+ if (error != NULL) {
+ ofono_error("%s", error->message);
+--
+2.20.1
+
diff --git a/recipes-connectivity/ofono/files/ofono.conf b/recipes-connectivity/ofono/files/ofono.conf
new file mode 100644
index 00000000..e47214c7
--- /dev/null
+++ b/recipes-connectivity/ofono/files/ofono.conf
@@ -0,0 +1,30 @@
+<!-- This configuration file specifies the required security policies
+ for oFono core daemon to work. -->
+
+<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
+ "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
+<busconfig>
+
+ <!-- ../system.conf have denied everything, so we just punch some holes -->
+
+ <policy user="root">
+ <allow own="org.ofono"/>
+ <allow send_destination="org.ofono"/>
+ <allow send_interface="org.ofono.Manager"/>
+ <allow send_interface="org.ofono.SimToolkitAgent"/>
+ <allow send_interface="org.ofono.PushNotificationAgent"/>
+ <allow send_interface="org.ofono.SmartMessagingAgent"/>
+ <allow send_interface="org.ofono.PositioningRequestAgent"/>
+ <allow send_interface="org.ofono.HandsfreeAudioAgent"/>
+ <allow send_interface="org.ofono.Modem"/>
+ </policy>
+
+ <policy at_console="true">
+ <allow send_destination="org.ofono"/>
+ </policy>
+
+ <policy context="default">
+ <deny send_destination="org.ofono"/>
+ </policy>
+
+</busconfig>
diff --git a/recipes-connectivity/ofono/ofono_%.bbappend b/recipes-connectivity/ofono/ofono_%.bbappend
new file mode 100644
index 00000000..0386aa9c
--- /dev/null
+++ b/recipes-connectivity/ofono/ofono_%.bbappend
@@ -0,0 +1 @@
+require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'ofono_agldemo.inc', '', d)}
diff --git a/recipes-connectivity/ofono/ofono_agldemo.inc b/recipes-connectivity/ofono/ofono_agldemo.inc
new file mode 100644
index 00000000..b02d6ee2
--- /dev/null
+++ b/recipes-connectivity/ofono/ofono_agldemo.inc
@@ -0,0 +1,11 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
+SRC_URI_append = "\
+ file://ofono.conf \
+ file://0001-provision-allow-duplicate-entries-from-mbpi_lookup_a.patch \
+ "
+
+do_install_append() {
+ install -m 0644 ${WORKDIR}/ofono.conf ${D}${sysconfdir}/dbus-1/system.d/ofono.conf
+}
+
+SYSTEMD_AUTO_ENABLE = "enable"
diff --git a/recipes-connectivity/rtl-sdr/rtl-sdr/0001-remove-I-usr-include-in-pkg-config.patch b/recipes-connectivity/rtl-sdr/rtl-sdr/0001-remove-I-usr-include-in-pkg-config.patch
new file mode 100644
index 00000000..86b7392d
--- /dev/null
+++ b/recipes-connectivity/rtl-sdr/rtl-sdr/0001-remove-I-usr-include-in-pkg-config.patch
@@ -0,0 +1,40 @@
+From 3aeaf8054fcb2617ca8f6196ca32be3e69337f77 Mon Sep 17 00:00:00 2001
+From: Martin Kelly <mkelly@xevo.com>
+Date: Fri, 21 Apr 2017 10:29:19 -0700
+Subject: [PATCH] remove -I/usr/include in pkg-config
+
+This shouldn't be necessary as it's part of the default compiler include
+paths anyway. Morever, it can cause GCC 6 C++ build failures in
+downstream packages when combined with QMake (such as
+qtmultimedia-rtlfm-radio-plugin).
+
+Fix these issues by removing it.
+
+Upstream-Status: Inappropriate [disable-feature]
+
+This patch should not go upstream because it breaks the ability to build
+with --prefix. That's not a problem for Openembedded, but it is for
+upstream more generally. See this mail thread for more information:
+
+http://lists.osmocom.org/pipermail/osmocom-sdr/2017-April/001580.html
+
+Signed-off-by: Martin Kelly <mkelly@xevo.com>
+---
+ librtlsdr.pc.in | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/librtlsdr.pc.in b/librtlsdr.pc.in
+index 5e55049..84b6d0c 100644
+--- a/librtlsdr.pc.in
++++ b/librtlsdr.pc.in
+@@ -6,6 +6,6 @@ includedir=@includedir@
+ Name: RTL-SDR Library
+ Description: C Utility Library
+ Version: @VERSION@
+-Cflags: -I${includedir}/ @RTLSDR_PC_CFLAGS@
++Cflags: @RTLSDR_PC_CFLAGS@
+ Libs: -L${libdir} -lrtlsdr -lusb-1.0
+ Libs.private: @RTLSDR_PC_LIBS@
+--
+2.1.4
+
diff --git a/recipes-connectivity/rtl-sdr/rtl-sdr_0.5.3.bb b/recipes-connectivity/rtl-sdr/rtl-sdr_0.5.3.bb
new file mode 100644
index 00000000..b442d9f4
--- /dev/null
+++ b/recipes-connectivity/rtl-sdr/rtl-sdr_0.5.3.bb
@@ -0,0 +1,32 @@
+SUMMARY = "Turns a Realtek RTL2832U-based DVB dongle into a SDR receiver"
+DESCRIPTION = "DVB-T dongles based on the Realtek RTL2832U chipset can be used as Software Digital Radio adapters, since the chip allows transferring raw I/Q samples to the host, which is really used for DAB/DAB+/FM demodulation."
+HOMEPAGE = "http://sdr.osmocom.org/trac/wiki/rtl-sdr"
+
+LICENSE = "GPLv2+"
+LIC_FILES_CHKSUM = "file://COPYING;md5=751419260aa954499f7abaabaa882bbe \
+ file://src/librtlsdr.c;endline=18;md5=1b05599c3ebd4d74857a0a7c45f3d4ef"
+
+DEPENDS = "libusb1"
+
+SRC_URI = "git://git.osmocom.org/rtl-sdr \
+ file://0001-remove-I-usr-include-in-pkg-config.patch \
+ "
+SRCREV = "e3c03f738f5aef4dc51e2b741fbdb542b9cc1bb1"
+S = "${WORKDIR}/git"
+
+inherit autotools pkgconfig
+
+EXTRA_OECONF = "--enable-driver-detach"
+
+do_configure_append() {
+ # remove included temporary path from pc file due to pass-through of OE CFLAGS
+ # debug-prefix-map
+ # See: http://lists.openembedded.org/pipermail/openembedded-devel/2016-May/107456.html
+ sed -i -e "s# -fdebug-prefix-map=.*##g;s# -fmacro-prefix-map=.*##g" librtlsdr.pc
+}
+
+do_install_append() {
+ install -D -m 0644 ${S}/rtl-sdr.rules ${D}${sysconfdir}/udev/rules.d/55-rtl-sdr.rules
+ sed -i 's/MODE:="0666"/GROUP="audio", MODE="0660", SECLABEL{smack}="*"/' \
+ ${D}${sysconfdir}/udev/rules.d/55-rtl-sdr.rules
+}
diff --git a/recipes-core/dbus/dbus/dbus.service b/recipes-core/dbus/dbus/dbus.service
new file mode 100644
index 00000000..dee6ad74
--- /dev/null
+++ b/recipes-core/dbus/dbus/dbus.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=D-Bus User Message Bus
+Documentation=man:dbus-daemon(1)
+Requires=dbus.socket
+
+[Service]
+ExecStart=/usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation
+ExecReload=/usr/bin/dbus-send --print-reply --session --type=method_call --dest=org.freedesktop.DBus / org.freedesktop.DBus.ReloadConfig
+Restart=always
+RestartSec=1
diff --git a/recipes-core/dbus/dbus/dbus.socket b/recipes-core/dbus/dbus/dbus.socket
new file mode 100644
index 00000000..af76b2f1
--- /dev/null
+++ b/recipes-core/dbus/dbus/dbus.socket
@@ -0,0 +1,9 @@
+[Unit]
+Description=D-Bus User Message Bus Socket
+Before=sockets.target
+
+[Socket]
+ListenStream=%t/bus
+
+[Install]
+WantedBy=default.target
diff --git a/recipes-core/dbus/dbus/dbus_env.conf b/recipes-core/dbus/dbus/dbus_env.conf
new file mode 100644
index 00000000..f8f02669
--- /dev/null
+++ b/recipes-core/dbus/dbus/dbus_env.conf
@@ -0,0 +1,5 @@
+[Unit]
+Wants=dbus.service
+
+[Service]
+Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%I/bus
diff --git a/recipes-core/dbus/dbus/libdbus-c++/dbus-c++-threading.patch b/recipes-core/dbus/dbus/libdbus-c++/dbus-c++-threading.patch
new file mode 100644
index 00000000..c4fafef6
--- /dev/null
+++ b/recipes-core/dbus/dbus/libdbus-c++/dbus-c++-threading.patch
@@ -0,0 +1,45 @@
+--- libdbus-c++-0.9.0/include/dbus-c++/dispatcher.h.threading 2017-02-15 13:40:53.796004263 +0000
++++ libdbus-c++-0.9.0/include/dbus-c++/dispatcher.h 2017-02-15 13:40:46.907000493 +0000
+@@ -188,6 +188,7 @@
+ /* classes for multithreading support
+ */
+
++#if 0
+ class DXXAPI Mutex
+ {
+ public:
+@@ -243,9 +244,11 @@
+ typedef bool (*CondVarWaitTimeoutFn)(CondVar *cv, Mutex *mx, int timeout);
+ typedef void (*CondVarWakeOneFn)(CondVar *cv);
+ typedef void (*CondVarWakeAllFn)(CondVar *cv);
++#endif
+
+ void DXXAPI _init_threading();
+
++#if 0
+ void DXXAPI _init_threading(
+ MutexNewFn, MutexFreeFn, MutexLockFn, MutexUnlockFn,
+ CondVarNewFn, CondVarFreeFn, CondVarWaitFn, CondVarWaitTimeoutFn, CondVarWakeOneFn, CondVarWakeAllFn
+@@ -312,6 +315,7 @@
+ cv->wake_all();
+ }
+ };
++#endif
+
+ } /* namespace DBus */
+
+--- libdbus-c++-0.9.0/src/dispatcher.cpp.threading 2017-02-15 13:48:22.627249868 +0000
++++ libdbus-c++-0.9.0/src/dispatcher.cpp 2017-02-15 13:48:29.164253445 +0000
+@@ -253,6 +253,7 @@
+ #endif//DBUS_HAS_THREADS_INIT_DEFAULT
+ }
+
++#if 0
+ void DBus::_init_threading(
+ MutexNewFn m1,
+ MutexFreeFn m2,
+@@ -318,3 +319,4 @@
+ #endif//DBUS_HAS_RECURSIVE_MUTEX
+ dbus_threads_init(&functions);
+ }
++#endif
diff --git a/recipes-core/dbus/dbus_%.bbappend b/recipes-core/dbus/dbus_%.bbappend
new file mode 100644
index 00000000..8abed712
--- /dev/null
+++ b/recipes-core/dbus/dbus_%.bbappend
@@ -0,0 +1 @@
+require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'dbus_agldemo.inc', '', d)}
diff --git a/recipes-core/dbus/dbus_agldemo.inc b/recipes-core/dbus/dbus_agldemo.inc
new file mode 100644
index 00000000..379c5435
--- /dev/null
+++ b/recipes-core/dbus/dbus_agldemo.inc
@@ -0,0 +1,28 @@
+FILESEXTRAPATHS_append := ":${THISDIR}/dbus"
+
+SRC_URI += "file://dbus.service \
+ file://dbus.socket \
+ file://dbus_env.conf \
+ "
+
+inherit systemd
+
+do_install_append() {
+ if [ "${PN}" != "nativesdk-dbus" ]; then
+ if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then
+ install -m 644 -p -D ${WORKDIR}/dbus.service ${D}${systemd_user_unitdir}/dbus.service
+ install -m 644 -p -D ${WORKDIR}/dbus.socket ${D}${systemd_user_unitdir}/dbus.socket
+ install -m 644 -p -D ${WORKDIR}/dbus_env.conf ${D}${systemd_system_unitdir}/user@.service.d/dbus_env.conf
+
+ # Execute these manually on behalf of systemctl script (from systemd-systemctl-native.bb)
+ # because it does not support systemd's user mode.
+ mkdir -p ${D}/etc/systemd/user/default.target.wants/
+ ln -sf ${systemd_user_unitdir}/dbus.socket ${D}/etc/systemd/user/default.target.wants/dbus.socket
+ fi
+ fi
+}
+
+FILES_${PN} += " \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', '${systemd_user_unitdir}/dbus.*', '', d)} \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', '${systemd_system_unitdir}/user@.service.d/dbus_env.conf', '', d)} \
+ "
diff --git a/recipes-core/dbus/libdbus-c++/dbus-c++-threading.patch b/recipes-core/dbus/libdbus-c++/dbus-c++-threading.patch
new file mode 100644
index 00000000..c4fafef6
--- /dev/null
+++ b/recipes-core/dbus/libdbus-c++/dbus-c++-threading.patch
@@ -0,0 +1,45 @@
+--- libdbus-c++-0.9.0/include/dbus-c++/dispatcher.h.threading 2017-02-15 13:40:53.796004263 +0000
++++ libdbus-c++-0.9.0/include/dbus-c++/dispatcher.h 2017-02-15 13:40:46.907000493 +0000
+@@ -188,6 +188,7 @@
+ /* classes for multithreading support
+ */
+
++#if 0
+ class DXXAPI Mutex
+ {
+ public:
+@@ -243,9 +244,11 @@
+ typedef bool (*CondVarWaitTimeoutFn)(CondVar *cv, Mutex *mx, int timeout);
+ typedef void (*CondVarWakeOneFn)(CondVar *cv);
+ typedef void (*CondVarWakeAllFn)(CondVar *cv);
++#endif
+
+ void DXXAPI _init_threading();
+
++#if 0
+ void DXXAPI _init_threading(
+ MutexNewFn, MutexFreeFn, MutexLockFn, MutexUnlockFn,
+ CondVarNewFn, CondVarFreeFn, CondVarWaitFn, CondVarWaitTimeoutFn, CondVarWakeOneFn, CondVarWakeAllFn
+@@ -312,6 +315,7 @@
+ cv->wake_all();
+ }
+ };
++#endif
+
+ } /* namespace DBus */
+
+--- libdbus-c++-0.9.0/src/dispatcher.cpp.threading 2017-02-15 13:48:22.627249868 +0000
++++ libdbus-c++-0.9.0/src/dispatcher.cpp 2017-02-15 13:48:29.164253445 +0000
+@@ -253,6 +253,7 @@
+ #endif//DBUS_HAS_THREADS_INIT_DEFAULT
+ }
+
++#if 0
+ void DBus::_init_threading(
+ MutexNewFn m1,
+ MutexFreeFn m2,
+@@ -318,3 +319,4 @@
+ #endif//DBUS_HAS_RECURSIVE_MUTEX
+ dbus_threads_init(&functions);
+ }
++#endif
diff --git a/recipes-core/dbus/libdbus-c++_0.9.0.bbappend b/recipes-core/dbus/libdbus-c++_0.9.0.bbappend
new file mode 100644
index 00000000..ee21af86
--- /dev/null
+++ b/recipes-core/dbus/libdbus-c++_0.9.0.bbappend
@@ -0,0 +1 @@
+require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'libdbus-c++_agldemo.inc', '', d)}
diff --git a/recipes-core/dbus/libdbus-c++_agldemo.inc b/recipes-core/dbus/libdbus-c++_agldemo.inc
new file mode 100644
index 00000000..4c135cc1
--- /dev/null
+++ b/recipes-core/dbus/libdbus-c++_agldemo.inc
@@ -0,0 +1,2 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/libdbus-c++:"
+SRC_URI_append = " file://dbus-c++-threading.patch"
diff --git a/recipes-core/distro-build-manifest/distro-build-manifest.bb b/recipes-core/distro-build-manifest/distro-build-manifest.bb
new file mode 100644
index 00000000..823cc28a
--- /dev/null
+++ b/recipes-core/distro-build-manifest/distro-build-manifest.bb
@@ -0,0 +1,164 @@
+SUMMARY = "Distribution build manifest"
+DESCRIPTION = "The folder /etc/platform-info contains build manifest (SPEC-720)."
+LICENSE = "MIT"
+
+# information distributed by the package is machine specific
+PACKAGE_ARCH = "${MACHINE_ARCH}"
+
+# dependencies of ${DISTRO_MANIFEST_GENERATOR}
+DEPENDS = "coreutils-native bash-native git-native gawk-native sed-native jq-native"
+
+# force a rebuild everytime a build is started
+do_compile[nostamp] = "1"
+
+# borrowed to os-release.bb (output format is very close)
+python do_compilestep1 () {
+ import shutil
+ with open(d.expand('${B}/bbinfo-deploy'),'w') as f:
+ allkeys=[]
+ for field in d.getVar('BUILD_MANIFEST_FIELDS_DEPLOY').split():
+ key='DIST_BB_{0}'.format(field)
+ allkeys.append(key)
+ value=d.getVar(field)
+ if value:
+ f.write('{0}="{1}"\n'.format(key,value))
+ f.write('declare -A BITBAKE_VARS\nBITBAKE_VARS[deploy]="%s"' % ' '.join(allkeys))
+
+ with open(d.expand('${B}/bbinfo-target'),'w') as f:
+ allkeys=[]
+ for field in d.getVar('BUILD_MANIFEST_FIELDS_TARGET').split():
+ key='DIST_BB_{0}'.format(field)
+ allkeys.append(key)
+ value=d.getVar(field)
+ if value:
+ f.write('{0}="{1}"\n'.format(key,value))
+ f.write('declare -A BITBAKE_VARS\nBITBAKE_VARS[target]="%s"' % ' '.join(allkeys))
+
+ with open(d.expand('${B}/bbinfo-sdk'),'w') as f:
+ allkeys=[]
+ for field in d.getVar('BUILD_MANIFEST_FIELDS_SDK').split():
+ key='DIST_BB_{0}'.format(field)
+ allkeys.append(key)
+ value=d.getVar(field)
+ if value:
+ f.write('{0}="{1}"\n'.format(key,value))
+ f.write('declare -A BITBAKE_VARS\nBITBAKE_VARS[sdk]="%s"' % ' '.join(allkeys))
+}
+
+do_compilestep2 () {
+ rc=99
+ timestamp=${DATETIME}
+ outfile=${B}/build-info
+ if [ -x "${DISTRO_MANIFEST_GENERATOR}" -a -f "${DISTRO_SETUP_MANIFEST}" ]; then
+ rc=0
+ for format in bash json; do
+ if [ "$format" = "json" ]; then
+ ext=".json"
+ else
+ ext=""
+ fi
+ for mode in deploy target sdk; do
+ ${DISTRO_MANIFEST_GENERATOR} -m $mode -f $format -t $timestamp -s ${B}/bbinfo-${mode} ${DISTRO_SETUP_MANIFEST} >${outfile}-${mode}${ext}
+ rc=$?
+ if [ $rc -ne 0 ]; then
+ break
+ fi
+ done
+ done
+ else
+ if [ -z "${DISTRO_MANIFEST_GENERATOR}" ]; then
+ echo "The name of the generation script is not defined."
+ elif [ ! -f "${DISTRO_MANIFEST_GENERATOR}" ]; then
+ echo "Generation script ${DISTRO_MANIFEST_GENERATOR} is missing."
+ elif [ ! -x "${DISTRO_MANIFEST_GENERATOR}" ]; then
+ echo "Generation script ${DISTRO_MANIFEST_GENERATOR} isn't executable."
+ fi
+ if [ -z "${DISTRO_SETUP_MANIFEST}" ]; then
+ echo "The name of the data file is not defined."
+ elif [ ! -f "${DISTRO_SETUP_MANIFEST}" ]; then
+ echo "Data file ${DISTRO_SETUP_MANIFEST} is missing."
+ fi
+ echo "You can try to rerun aglsetup.sh to solve that issue."
+ echo "You can also try to source agl-init-build-env instead of oe-init-build-env."
+ fi
+
+ if [ "$rc" -ne 0 ]; then
+ echo "distro-build-manifest generation failed."
+ fi
+ return $rc
+}
+
+do_compilestep1[vardeps] += " ${BUILD_MANIFEST_FIELDS_DEPLOY}"
+do_compilestep1[vardeps] += " ${BUILD_MANIFEST_FIELDS_TARGET}"
+do_compilestep1[vardeps] += " ${BUILD_MANIFEST_FIELDS_SDK}"
+
+# avoid errors "ERROR: When reparsing .../distro-build-manifest/distro-build-manifest.bb.do_compile, the basehash value changed from .... to .... . The metadata is not deterministic and this needs to be fixed."
+do_compilestep2[vardepsexclude] = "DATETIME"
+
+# combine the two steps
+python do_compile() {
+ bb.build.exec_func("do_compilestep1",d)
+ bb.build.exec_func("do_compilestep2",d)
+}
+
+do_install () {
+ # install in target dir
+ install -d ${D}${sysconfdir}/platform-info
+ install -m 0644 build-info-target ${D}${sysconfdir}/platform-info/build
+ install -m 0644 build-info-target.json ${D}${sysconfdir}/platform-info/build.json
+
+ # also copy in deploy dir
+ install -d ${DEPLOY_DIR_IMAGE}
+ install -m 0644 build-info-deploy ${DEPLOY_DIR_IMAGE}/build-info
+ install -m 0644 build-info-deploy.json ${DEPLOY_DIR_IMAGE}/build-info.json
+
+ # copy into sdk deploy dir
+ install -d ${DEPLOY_DIR}/sdk
+ install -m 0644 build-info-sdk ${DEPLOY_DIR}/sdk/${SDK_NAME}.build-info
+ install -m 0644 build-info-sdk.json ${DEPLOY_DIR}/sdk/${SDK_NAME}.build-info.json
+
+ # and copy to nativesdk package
+ # TODO
+}
+
+# list of variables to add to the various manifests
+# smalles one is 'target', then 'deploy' and finally 'sdk'
+BUILD_MANIFEST_FIELDS_TARGET = "\
+ MACHINE_ARCH \
+ MACHINEOVERRIDES \
+ MACHINE_FEATURES \
+ DISTRO_CODENAME \
+ DISTRO_FEATURES \
+ DISTRO_BRANCH_VERSION_TAG \
+ AGLVERSION \
+ AGL_BRANCH \
+ AGLRELEASETYPE \
+"
+
+BUILD_MANIFEST_FIELDS_DEPLOY = "\
+ ${BUILD_MANIFEST_FIELDS_TARGET} \
+ DISTRO \
+ DISTRO_VERSION \
+ DISTROOVERRIDES \
+ TUNE_FEATURES \
+ TUNE_PKGARCH \
+ ALL_MULTILIB_PACKAGE_ARCHS \
+"
+
+BUILD_MANIFEST_FIELDS_SDK = "\
+ ${BUILD_MANIFEST_FIELDS_DEPLOY} \
+ HOST_SYS \
+ TARGET_SYS \
+ TARGET_VENDOR \
+ SDK_ARCH \
+ SDK_VENDOR \
+ SDK_VERSION \
+ SDK_OS \
+"
+
+# dont exec useless tasks
+do_fetch[noexec] = "1"
+do_unpack[noexec] = "1"
+do_patch[noexec] = "1"
+do_configure[noexec] = "1"
+
diff --git a/recipes-core/psplash/.appends.core b/recipes-core/psplash/.appends.core
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/recipes-core/psplash/.appends.core
diff --git a/recipes-core/psplash/files/psplash-colors.h b/recipes-core/psplash/files/psplash-colors.h
new file mode 100644
index 00000000..44749039
--- /dev/null
+++ b/recipes-core/psplash/files/psplash-colors.h
@@ -0,0 +1,34 @@
+/*
+ * pslash - a lightweight framebuffer splashscreen for embedded devices.
+ *
+ * Copyright (c) 2012 sleep(5) ltd
+ * Author: Tomas Frydrych <tomas@sleepfive.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#ifndef _HAVE_PSPLASH_COLORS_H
+#define _HAVE_PSPLASH_COLORS_H
+
+/* This is the overall background color */
+#define PSPLASH_BACKGROUND_COLOR 0xff,0xff,0xff
+
+/* This is the color of any text output */
+#define PSPLASH_TEXT_COLOR 0x00,0x00,0x00
+
+/* This is the color of the progress bar indicator */
+#define PSPLASH_BAR_COLOR 0x00,0x00,0x00
+
+/* This is the color of the progress bar background */
+#define PSPLASH_BAR_BACKGROUND_COLOR 0xff,0xff,0xff
+
+#endif
diff --git a/recipes-core/psplash/files/psplash-poky-img.h b/recipes-core/psplash/files/psplash-poky-img.h
new file mode 100644
index 00000000..c0e8b081
--- /dev/null
+++ b/recipes-core/psplash/files/psplash-poky-img.h
@@ -0,0 +1,5411 @@
+/* GdkPixbuf RGB C-Source image dump 1-byte-run-length-encoded */
+
+#define POKY_IMG_ROWSTRIDE (1800)
+#define POKY_IMG_WIDTH (600)
+#define POKY_IMG_HEIGHT (400)
+#define POKY_IMG_BYTES_PER_PIXEL (3) /* 3:RGB, 4:RGBA */
+#define POKY_IMG_RLE_PIXEL_DATA ((uint8*) \
+ "\377\377\377\377\377\377\377\377\203\377\377\377\1\376\376\376\221\377" \
+ "\377\377\1\376\376\376\215\377\377\377\1\376\376\376\203\377\377\377" \
+ "\1\376\376\376\233\377\377\377\1\376\376\376\203\377\377\377\1\376\376" \
+ "\376\202\377\377\377\5\376\376\376\377\377\377\376\376\376\377\377\377" \
+ "\376\376\376\206\377\377\377\1\376\376\376\203\377\377\377\1\376\376" \
+ "\376\204\377\377\377\1\376\376\376\203\377\377\377\5\376\376\376\377" \
+ "\377\377\376\376\376\377\377\377\376\376\376\377\377\377\377\377\377" \
+ "\377\377\377\377\377\377\377\377\377\377\202\376\376\376\207\377\377" \
+ "\377\1\376\376\376\205\377\377\377\1\376\376\376\211\377\377\377\3\376" \
+ "\376\376\377\377\377\376\376\376\235\377\377\377\1\376\376\376\203\377" \
+ "\377\377\1\376\376\376\213\377\377\377\3\376\376\376\377\377\377\376" \
+ "\376\376\216\377\377\377\1\376\376\376\202\377\377\377\1\376\376\376" \
+ "\377\377\377\377\377\377\377\377\377\377\377\377\365\377\377\377\1\376" \
+ "\376\376\203\377\377\377\1\376\376\376\207\377\377\377\1\376\376\376" \
+ "\203\377\377\377\1\376\376\376\202\377\377\377\1\376\376\376\205\377" \
+ "\377\377\1\376\376\376\203\377\377\377\12\376\376\376\377\377\377\346" \
+ "\346\346\315\315\315\316\316\316\265\265\265\235\235\235\234\234\234" \
+ "\233\233\233\204\204\204\203kkm\202lln\2EEG;;=\215::<\204kkm\3kkkxxx" \
+ "\235\235\235\202\234\234\234\1\265\265\265\202\316\316\316\1\332\332" \
+ "\332\207\377\377\377\202\376\376\376\2\377\377\377\376\376\376\211\377" \
+ "\377\377\3\376\376\376\377\377\377\376\376\376\203\377\377\377\5\376" \
+ "\376\376\377\377\377\376\376\376\377\377\377\376\376\376\377\377\377" \
+ "\377\377\377\377\377\377\377\377\377\366\377\377\377\1\376\376\376\205" \
+ "\377\377\377\1\376\376\376\214\377\377\377\11\376\376\376\332\332\332" \
+ "\316\316\320\247\247\251\236\236\240\204\204\206kkm__a<<>\202::<\11;" \
+ ";=99;;;=99;::<;;=::<;;=99;\203::<\1<<>\213::<\13;;=::<;;=::<;;=::<;;" \
+ "=::<;;=::<;;=\207::<\3SSUllnxxz\202\234\234\236\202\316\316\316\2\377" \
+ "\377\377\376\376\376\214\377\377\377\1\376\376\376\203\377\377\377\1" \
+ "\376\376\376\377\377\377\377\377\377\377\377\377\377\377\377\376\377" \
+ "\377\377\1\376\376\376\203\377\377\377\1\376\376\376\203\377\377\377" \
+ "\7\332\332\334\302\302\304\234\234\236\203\203\205llnEEG;;=\202::<\6" \
+ ";;=::<;;=::<;;=99;\204::<\1""99;\202;;=\1""99;\205::<\1;;=\213::<\11" \
+ ";;=::<;;=::<;;=::<;;=::<;;=\202::<\1""99;\206::<\1;;=\203::<\13;;=99" \
+ ";;;=::<;;=::<kkmxxz\234\234\236\300\300\302\316\316\316\203\377\377\377" \
+ "\1\376\376\376\202\377\377\377\1\376\376\376\203\377\377\377\1\376\376" \
+ "\376\204\377\377\377\1\376\376\376\377\377\377\377\377\377\377\377\377" \
+ "\377\377\377\374\377\377\377\7\346\346\350\301\301\303\235\235\237ww" \
+ "y``b99;;;=\202::<\1;;=\204::<\203;;=\3::<99;;;=\207::<\202;;=\204::<" \
+ "\203;;=\215::<\1;;=\207::<\11;;=::<;;=99;::<;;=::<99;::<\202;;=\5::<" \
+ ";;=::<;;=99;\202::<\2;;=::<\202;;=\6::<SSUkkm\235\235\237\264\264\266" \
+ "\332\332\334\210\377\377\377\1\376\376\376\202\377\377\377\1\376\376" \
+ "\376\377\377\377\377\377\377\377\377\377\377\377\377\362\377\377\377" \
+ "\1\376\376\376\202\377\377\377\11\346\346\350\265\265\267\221\221\223" \
+ "kkm::<;;=::<99;;;=\203::<\1;;=\202::<\3""99;::<;;=\202::<\4;;=99;::<" \
+ ";;=\204::<\1;;=\202::<\202;;=\1::<\202;;=\202::<\1;;=\203::<\1;;=\211" \
+ "::<\2;;=99;\202::<\2;;=99;\206::<\1;;=\202::<\2""99;;;=\210::<\1;;=\202" \
+ "::<\1;;=\203::<\1;;=\203::<\1;;=\202::<\4kkm\222\222\224\265\265\267" \
+ "\332\332\334\204\377\377\377\1\376\376\376\377\377\377\377\377\377\377" \
+ "\377\377\377\377\377\362\377\377\377\12\363\363\363\316\316\316\235\235" \
+ "\235jjjFFH;;=::<;;=::<;;=\202::<\1;;=\204::<\1""99;\202::<\2;;=::<\202" \
+ ";;=\204::<\7;;=::<;;=::<;;=::<;;=\203::<\1;;=\202::<\1;;=\217::<\2""9" \
+ "9;;;=\203::<\1;;=\202::<\4""99;;;=::<;;=\203::<\2;;=99;\202::<\1;;=\207" \
+ "::<\1;;=\213::<\1;;=\204::<\7kkk\221\221\221\301\301\301\363\363\363" \
+ "\376\376\376\377\377\377\376\376\376\377\377\377\377\377\377\377\377" \
+ "\377\377\377\377\321\377\377\377\1\376\376\376\202\377\377\377\1\376" \
+ "\376\376\221\377\377\377\1\376\376\376\204\377\377\377\4\363\363\365" \
+ "\301\301\303\222\222\224__a\220::<\3;;=::<;;=\204::<\203;;=\203::<\2" \
+ ";;=::<\202;;=\4::<;;=::<;;=\204::<\1;;=\202::<\4;;=::<99;;;=\211::<\1" \
+ "99;\205::<\202;;=\210::<\5;;=::<;;=::<;;=\203::<\1;;=\212::<\4;;=99;" \
+ ";;=99;\211::<\4SSU\204\204\206\266\266\270\345\345\345\221\377\377\377" \
+ "\1\376\376\376\204\377\377\377\202\376\376\376\377\377\377\377\377\377" \
+ "\377\377\377\377\377\377\266\377\377\377\1\376\376\376\203\377\377\377" \
+ "\1\376\376\376\202\377\377\377\1\376\376\376\207\377\377\377\1\376\376" \
+ "\376\210\377\377\377\10\363\363\363\301\301\301\221\221\221``b99;;;=" \
+ "::<;;=\213::<\3;;=::<;;=\203::<\1;;=\204::<\2;;=99;\202::<\1""99;\202" \
+ ";;=\204::<\1;;=\210::<\202;;=\202::<\2;;=99;\215::<\1;;=\204::<\1;;=" \
+ "\205::<\5;;=99;;;=::<;;=\202::<\202;;=\4""99;;;=::<;;=\203::<\1;;=\204" \
+ "::<\3;;=99;;;=\210::<\11;;=::<;;=99;;;=SSS\205\205\205\266\266\266\363" \
+ "\363\363\202\377\377\377\1\376\376\376\206\377\377\377\1\376\376\376" \
+ "\204\377\377\377\1\376\376\376\205\377\377\377\1\376\376\376\377\377" \
+ "\377\377\377\377\377\377\377\377\377\377\266\377\377\377\1\376\376\376" \
+ "\204\377\377\377\1\376\376\376\205\377\377\377\1\376\376\376\207\377" \
+ "\377\377\5\376\376\376\333\333\335\250\250\252kkm;;=\203::<\202;;=\212" \
+ "::<\10;;=::<;;=::<;;=::<;;=::<\202;;=\206::<\10;;=::<;;=::<;;=::<;;=" \
+ "::<\202;;=\2::<;;=\203::<\3;;=::<;;=\202::<\1;;=\202::<\1;;=\211::<\1" \
+ "99;\202;;=\203::<\1;;=\205::<\1;;=\204::<\1;;=\206::<\203;;=\202::<\1" \
+ ";;=\206::<\1;;=\213::<\1;;=\204::<\1;;=\202::<\3__a\221\221\223\316\316" \
+ "\316\204\377\377\377\1\376\376\376\202\377\377\377\1\376\376\376\207" \
+ "\377\377\377\1\376\376\376\377\377\377\377\377\377\377\377\377\377\377" \
+ "\377\267\377\377\377\202\376\376\376\210\377\377\377\1\376\376\376\207" \
+ "\377\377\377\3\301\301\301\204\204\206SSU\203::<\3;;=::<;;=\202::<\2" \
+ "99;;;=\215::<\1;;=\204::<\2;;=99;\202::<\202;;=\202::<\7""99;::<;;=:" \
+ ":<;;=99;;;=\202::<\2""99;;;=\202::<\1;;=\207::<\1;;=\211::<\2""99;;;" \
+ "=\202::<\3;;=::<;;=\202::<\2""99;;;=\206::<\4;;=::<;;=::<\202;;=\206" \
+ "::<\3;;=::<;;=\202::<\5;;=::<;;=99;;;=\220::<\2;;=::<\202;;=\5""99;G" \
+ "GIxxx\265\265\265\363\363\363\207\377\377\377\1\376\376\376\205\377\377" \
+ "\377\1\376\376\376\377\377\377\377\377\377\377\377\377\377\377\377\274" \
+ "\377\377\377\1\376\376\376\204\377\377\377\202\376\376\376\4\364\364" \
+ "\364\265\265\265xxz;;=\20299;\202::<\1""99;\204::<\3;;=::<;;=\213::<" \
+ "\1;;=\203::<\3;;=::<;;=\207::<\2;;=::<\202;;=\4""99;;;=::<;;=\202::<" \
+ "\5__allnkkm\221\221\223\235\235\237\202\234\234\236\6\317\317\317\315" \
+ "\315\315\317\317\317\315\315\315\316\316\316\346\346\346\213\377\377" \
+ "\377\3\376\376\376\377\377\377\346\346\346\204\316\316\316\5\316\316" \
+ "\320\251\251\253\234\234\236\233\233\235\235\235\237\203kkm\202::<\1" \
+ ";;=\202::<\6;;=::<;;=99;::<;;=\205::<\2;;=::<\203;;=\202::<\1;;=\212" \
+ "::<\1;;=\202::<\1;;=\202::<\1;;=\204::<\1;;=\202::<\3lln\250\250\252" \
+ "\346\346\350\206\377\377\377\1\376\376\376\204\377\377\377\1\376\376" \
+ "\376\377\377\377\377\377\377\377\377\377\377\377\377\271\377\377\377" \
+ "\1\376\376\376\202\377\377\377\1\376\376\376\202\377\377\377\4\362\362" \
+ "\362\266\266\270xxz::<\202;;=\202::<\10;;=::<99;;;=::<;;=::<;;=\203:" \
+ ":<\1;;=\213::<\3;;=::<;;=\205::<\1;;=\202::<\1<<>\202::<\7llnkkm\233" \
+ "\233\235\235\235\237\302\302\304\316\316\320\347\347\351\241\377\377" \
+ "\377\202\376\376\376\203\377\377\377\17\376\376\376\377\377\377\376\376" \
+ "\376\377\377\377\376\376\376\363\363\363\316\316\316\315\315\315\234" \
+ "\234\234\235\235\235xxxllnFFH::<;;=\205::<\5;;=99;;;=::<;;=\212::<\202" \
+ ";;=\212::<\5;;=99;;;=::<99;\202::<\5__a\250\250\252\346\346\346\377\377" \
+ "\377\376\376\376\202\377\377\377\1\376\376\376\377\377\377\377\377\377" \
+ "\377\377\377\377\377\377\271\377\377\377\202\376\376\376\2\377\377\377" \
+ "\376\376\376\203\377\377\377\3\363\363\363\266\266\266wwy\202;;=\210" \
+ "::<\1<<>\203::<\2<<>99;\215::<\1;;=\205::<\11;;=::<;;;___xxx\235\235" \
+ "\235\266\266\266\315\315\315\364\364\364\207\377\377\377\1\376\376\376" \
+ "\213\377\377\377\1\376\376\376\231\377\377\377\5\376\376\376\377\377" \
+ "\377\376\376\376\377\377\377\376\376\376\202\377\377\377\1\376\376\376" \
+ "\204\377\377\377\1\376\376\376\202\377\377\377\5\316\316\316\302\302" \
+ "\302\233\233\233yyykkk\202::<\6;;=::<;;=::<99;;;=\211::<\1;;=\202::<" \
+ "\1;;=\206::<\1""99;\202;;=\202::<\203;;=\1""99;\202::<\3__a\251\251\253" \
+ "\346\346\346\204\377\377\377\3\376\376\376\377\377\377\376\376\376\377" \
+ "\377\377\377\377\377\377\377\377\377\377\377\266\377\377\377\1\376\376" \
+ "\376\202\377\377\377\2\302\302\302xxx\203::<\3;;=::<;;=\232::<\1;;=\202" \
+ "::<\6RRTkkm\235\235\237\301\301\303\332\332\334\376\376\376\222\377\377" \
+ "\377\1\376\376\376\260\377\377\377\3\376\376\376\377\377\377\376\376" \
+ "\376\202\377\377\377\5\345\345\347\316\316\320\235\235\237xxzSSU\215" \
+ "::<\202;;=\202::<\203;;=\2::<;;=\203::<\1;;=\204::<\10;;=::<;;=::<;;" \
+ "=kkm\266\266\266\363\363\363\202\377\377\377\1\376\376\376\377\377\377" \
+ "\377\377\377\377\377\377\377\377\377\245\377\377\377\1\376\376\376\214" \
+ "\377\377\377\1\376\376\376\202\377\377\377\5\376\376\376\377\377\377" \
+ "\332\332\332\205\205\207GGI\202::<\1;;=\211::<\202;;=\205::<\2;;=::<" \
+ "\202;;=\203::<\14;;=99;::<;;=99;;;=FFFxxx\234\234\234\315\315\315\364" \
+ "\364\364\376\376\376\323\377\377\377\4\317\317\317\250\250\250xxxSSS" \
+ "\202::<\1;;=\206::<\2;;=::<\203;;=\202::<\2;;=99;\204::<\7;;=::<;;=:" \
+ ":<;;=::<;;=\204::<\3\204\204\206\301\301\301\376\376\376\220\377\377" \
+ "\377\1\376\376\376\377\377\377\377\377\377\377\377\377\377\377\377\225" \
+ "\377\377\377\1\376\376\376\203\377\377\377\1\376\376\376\206\377\377" \
+ "\377\1\376\376\376\202\377\377\377\4\363\363\363\251\251\251___;;=\202" \
+ "::<\1;;=\202::<\202;;=\204::<\1;;=\202::<\7;;=::<;;=::<;;=::<;;=\203" \
+ "::<\3""99;::<;;=\202::<\5;;=__a\221\221\223\265\265\267\346\346\346\323" \
+ "\377\377\377\1\376\376\376\211\377\377\377\5\363\363\363\301\301\303" \
+ "\235\235\237lln::<\202;;=\203::<\1;;=\204::<\1;;=\202::<\2""99;;;=\205" \
+ "::<\2;;=99;\203::<\1""99;\204::<\3TTT\233\233\233\346\346\346\207\377" \
+ "\377\377\1\376\376\376\377\377\377\377\377\377\377\377\377\377\377\377" \
+ "\250\377\377\377\3\316\316\316\204\204\204;;=\203::<\1;;=\203::<\1;;" \
+ "=\202::<\1;;=\205::<\3;;=::<;;=\202::<\4""99;;;=::<;;=\202::<\202;;=" \
+ "\4___\221\221\221\301\301\303\363\363\365\203\377\377\377\1\376\376\376" \
+ "\203\377\377\377\202\376\376\376\321\377\377\377\1\376\376\376\210\377" \
+ "\377\377\1\376\376\376\202\377\377\377\4\316\316\316\235\235\235kkk;" \
+ ";=\202::<\202;;=\203::<\5;;=::<;;=99;;;=\204::<\202;;=\7::<;;=99;::<" \
+ ";;=::<;;=\202::<\202;;=\2xxz\302\302\304\213\377\377\377\1\376\376\376" \
+ "\377\377\377\377\377\377\377\377\377\377\377\377\224\377\377\377\1\376" \
+ "\376\376\212\377\377\377\3\363\363\363\266\266\266TTV\203::<\3;;=::<" \
+ ";;=\202::<\203;;=\202::<\202;;=\205::<\1;;=\202::<\1;;=\204::<\4SSU\221" \
+ "\221\223\301\301\301\363\363\363\206\377\377\377\1\376\376\376\203\377" \
+ "\377\377\1\376\376\376\202\377\377\377\1\376\376\376\315\377\377\377" \
+ "\202\376\376\376\202\377\377\377\1\376\376\376\210\377\377\377\1\376" \
+ "\376\376\202\377\377\377\1\376\376\376\202\377\377\377\3\316\316\316" \
+ "\221\221\223__a\203::<\1;;=\203::<\3;;=::<;;=\203::<\5;;=99;;;=::<;;" \
+ "=\204::<\1""99;\205::<\3SSU\234\234\236\346\346\346\207\377\377\377\3" \
+ "\376\376\376\377\377\377\376\376\376\377\377\377\377\377\377\377\377" \
+ "\377\377\377\377\233\377\377\377\4\376\376\376\347\347\347\221\221\221" \
+ "FFH\207::<\4""99;;;=::<;;=\20299;\202;;=\202::<\1;;=\203::<\2;;=::<\202" \
+ ";;=\202::<\3xxz\250\250\252\346\346\350\215\377\377\377\203\376\376\376" \
+ "\316\377\377\377\1\376\376\376\202\377\377\377\1\376\376\376\211\377" \
+ "\377\377\1\376\376\376\211\377\377\377\4\363\363\363\265\265\267\205" \
+ "\205\207FFH\210::<\3;;=::<;;=\204::<\1;;=\207::<\2;;=::<\202;;=\2\203" \
+ "\203\205\317\317\321\206\377\377\377\1\376\376\376\377\377\377\377\377" \
+ "\377\377\377\377\377\377\377\233\377\377\377\3\316\316\316yy{99;\206" \
+ "::<\2;;=99;\202;;=\205::<\5""99;::<;;=::<;;=\202::<\6;;=::<;;=SSU\204" \
+ "\204\204\301\301\301\226\377\377\377\1\376\376\376\317\377\377\377\1" \
+ "\376\376\376\203\377\377\377\1\376\376\376\204\377\377\377\1\376\376" \
+ "\376\204\377\377\377\1\376\376\376\205\377\377\377\1\376\376\376\202" \
+ "\377\377\377\3\316\316\316\221\221\221SSU\203::<\3;;=::<99;\204::<\1" \
+ ";;=\203::<\2""99;;;=\202::<\1;;=\204::<\5""99;<<>::<kkk\264\264\264\203" \
+ "\377\377\377\1\376\376\376\377\377\377\377\377\377\377\377\377\377\377" \
+ "\377\232\377\377\377\2\266\266\270__a\202::<\5;;=::<;;=::<99;\202;;=" \
+ "\10::<;;=::<;;=::<;;=99;;;=\202::<\11;;=::<99;;;=::<;;=SSU\221\221\223" \
+ "\331\331\331\211\377\377\377\1\376\376\376\204\377\377\377\1\376\376" \
+ "\376\202\377\377\377\1\376\376\376\324\377\377\377\1\376\376\376\202" \
+ "\377\377\377\3\376\376\376\377\377\377\376\376\376\212\377\377\377\1" \
+ "\376\376\376\214\377\377\377\14\332\332\332\251\251\251``b::<;;=::<;" \
+ ";=99;::<;;=::<;;=\202::<\3;;=99;;;=\203::<\1;;=\202::<\10;;=99;;;=::" \
+ "<;;=SSU\250\250\252\363\363\363\377\377\377\377\377\377\377\377\377\377" \
+ "\377\377\231\377\377\377\2\265\265\265SSU\216::<\4;;=::<99;;;=\205::" \
+ "<\10;;=SSU\222\222\224\332\332\334\377\377\377\376\376\376\377\377\377" \
+ "\376\376\376\205\377\377\377\1\376\376\376\203\377\377\377\1\376\376" \
+ "\376\202\377\377\377\1\376\376\376\327\377\377\377\1\376\376\376\202" \
+ "\377\377\377\1\376\376\376\206\377\377\377\1\376\376\376\207\377\377" \
+ "\377\1\376\376\376\216\377\377\377\4\347\347\351\250\250\252``b::<\202" \
+ ";;=\202::<\1;;=\203::<\1;;=\203::<\1;;=\202::<\3;;=::<;;=\202::<\6""9" \
+ "9;;;=::<FFF\233\233\233\363\363\363\377\377\377\377\377\377\377\377\377" \
+ "\377\377\377\206\377\377\377\3\376\376\376\377\377\377\376\376\376\213" \
+ "\377\377\377\4\363\363\365\234\234\236FFH;;=\206::<\2""99;;;=\204::<" \
+ "\202;;=\2::<;;=\206::<\4FFH\204\204\206\333\333\333\376\376\376\264\377" \
+ "\377\377\3\376\376\376\377\377\377\376\376\376\327\377\377\377\4\346" \
+ "\346\346\221\221\221SSS:::\202::<\1;;=\204::<\3;;=::<;;=\214::<\3GGI" \
+ "\221\221\223\347\347\347\211\377\377\377\1\376\376\376\203\377\377\377" \
+ "\1\376\376\376\377\377\377\377\377\377\377\377\371\377\377\377\1\376" \
+ "\376\376\207\377\377\377\5\363\363\363\234\234\234FFH::<;;=\204::<\1" \
+ ";;=\202::<\1;;=\203::<\1;;=\204::<\1;;=\203::<\5;;=xxz\300\300\302\377" \
+ "\377\377\376\376\376\267\377\377\377\1\376\376\376\202\377\377\377\1" \
+ "\376\376\376\215\377\377\377\1\376\376\376\303\377\377\377\3\376\376" \
+ "\376\377\377\377\376\376\376\204\377\377\377\4\332\332\332\203\203\205" \
+ "GGI99;\207::<\202;;=\203::<\6;;=::<;;=::<;;=99;\202;;=\202::<\3\204\204" \
+ "\204\346\346\346\376\376\376\205\377\377\377\1\376\376\376\377\377\377" \
+ "\377\377\377\377\377\373\377\377\377\1\376\376\376\203\377\377\377\1" \
+ "\376\376\376\204\377\377\377\3\362\362\362\234\234\236GGI\203::<\15;" \
+ ";=::<;;=::<;;=::<;;=99;;;=::<;;=::<99;\202;;=\7::<;;=99;::<```\250\250" \
+ "\250\363\363\363\202\377\377\377\1\375\375\375\272\377\377\377\1\376" \
+ "\376\376\214\377\377\377\1\376\376\376\306\377\377\377\1\375\375\375" \
+ "\210\377\377\377\6\265\265\265lln::<;;=::<;;=\202::<\5;;=99;;;=::<99" \
+ ";\205::<\1;;=\206::<\4\204\204\206\345\345\345\377\377\377\376\376\376" \
+ "\207\377\377\377\1\376\376\376\377\377\377\377\377\377\377\377\372\377" \
+ "\377\377\1\376\376\376\202\377\377\377\3\364\364\364\233\233\235GGI\202" \
+ "::<\203;;=\2""99;;;=\202::<\3""99;::<;;=\202::<\13;;=99;::<;;=::<;;=" \
+ "::<FFH\204\204\204\333\333\333\376\376\376\204\377\377\377\1\376\376" \
+ "\376\204\377\377\377\1\376\376\376\304\377\377\377\1\376\376\376\317" \
+ "\377\377\377\4\346\346\346\221\221\223GGI99;\204::<\1""99;\202;;=\2:" \
+ ":<;;=\204::<\1;;=\204::<\202;;=\3::<\221\221\223\364\364\364\203\377" \
+ "\377\377\1\376\376\376\203\377\377\377\1\376\376\376\377\377\377\377" \
+ "\377\377\377\377\371\377\377\377\1\376\376\376\202\377\377\377\6\265" \
+ "\265\267SSU::<99;::<;;=\203::<\1;;=\202::<\1;;=\204::<\3;;=::<;;=\202" \
+ "::<\6;;=SSS\264\264\264\363\363\363\377\377\377\376\376\376\204\377\377" \
+ "\377\3\376\376\376\377\377\377\376\376\376\267\377\377\377\1\376\376" \
+ "\376\221\377\377\377\1\376\376\376\307\377\377\377\1\376\376\376\207" \
+ "\377\377\377\4\376\376\376\377\377\377\266\266\266kkm\202::<\1;;=\202" \
+ "::<\6;;=::<99;;;=99;;;=\205::<\3;;=::<99;\202::<\4GGI\234\234\234\363" \
+ "\363\363\376\376\376\377\377\377\377\377\377\377\377\375\377\377\377" \
+ "\4\376\376\376\377\377\377\265\265\265SSU\202::<\1;;=\204::<\1;;=\203" \
+ "::<\3;;=99;;;=\205::<\202;;=\2yyy\316\316\316\203\377\377\377\1\376\376" \
+ "\376\206\377\377\377\3\376\376\376\377\377\377\376\376\376\263\377\377" \
+ "\377\1\376\376\376\205\377\377\377\2\315\315\315;;;\211::<\3;;;:::\315" \
+ "\315\315\202\377\377\377\1\376\376\376\312\377\377\377\3\376\376\376" \
+ "\377\377\377\376\376\376\205\377\377\377\5\346\346\346\204\204\204FF" \
+ "H::<;;=\202::<\4;;=::<;;=::<\203;;=\203::<\2<<>99;\202::<\4""99;;;=F" \
+ "FF\234\234\234\377\377\377\377\377\377\377\377\375\377\377\377\11\316" \
+ "\316\320kkm::<;;=::<;;=99;::<;;=\203::<\202;;=\2::<99;\205::<\13;;=F" \
+ "FH\221\221\221\346\346\346\376\376\376\377\377\377\376\376\376\377\377" \
+ "\377\376\376\376\377\377\377\376\376\376\204\377\377\377\1\376\376\376" \
+ "\273\377\377\377\2\376\376\376\317\317\317\212::<\6;;=;;;\316\316\316" \
+ "\376\376\376\377\377\377\376\376\376\304\377\377\377\1\376\376\376\206" \
+ "\377\377\377\5\376\376\376\377\377\377\376\376\376\377\377\377\376\376" \
+ "\376\204\377\377\377\4\363\363\363\235\235\235RRT;;=\202::<\202;;=\7" \
+ "::<;;=99;::<;;=::<;;=\203::<\1;;=\202::<\6;;=::<SSU\264\264\264\377\377" \
+ "\377\376\376\376\377\377\377\377\377\377\377\377\367\377\377\377\3\346" \
+ "\346\346xxz;;=\205::<\1;;=\203::<\3;;=::<;;=\207::<\3SSU\247\247\251" \
+ "\363\363\363\217\377\377\377\1\376\376\376\272\377\377\377\1\316\316" \
+ "\316\213::<\2;;=\316\316\316\306\377\377\377\3\376\376\376\377\377\377" \
+ "\376\376\376\221\377\377\377\4\265\265\267SSU;;=99;\202::<\2""99;;;=" \
+ "\206::<\1;;=\204::<\1;;=\202::<\3jjj\317\317\317\376\376\376\377\377" \
+ "\377\377\377\377\377\377\343\377\377\377\1\376\376\376\211\377\377\377" \
+ "\1\376\376\376\206\377\377\377\2\363\363\363\233\233\233\210::<\1;;=" \
+ "\203::<\1;;=\203::<\1;;=\203::<\2SSS\265\265\265\315\377\377\377\1\316" \
+ "\316\316\214::<\1\316\316\316\334\377\377\377\3\316\316\316kkk::<\202" \
+ ";;=\206::<\1;;=\202::<\1;;=\202::<\7""99;;;=::<;;=::<\204\204\206\346" \
+ "\346\350\377\377\377\377\377\377\377\377\347\377\377\377\1\376\376\376" \
+ "\212\377\377\377\3\265\265\265SSS::<\202;;=\205::<\1;;=\202::<\202;;" \
+ "=\202::<\1;;=\203::<\2lln\265\265\267\203\377\377\377\1\376\376\376\313" \
+ "\377\377\377\1\316\316\316\214::<\1\316\316\316\336\377\377\377\6\316" \
+ "\316\316kkm::<;;=::<;;=\202::<\3;;=::<;;=\204::<\10;;=99;;;=::<99;;;" \
+ "=FFH\234\234\234\210\377\377\377\3\376\376\376\377\377\377\376\376\376" \
+ "\377\377\377\377\377\377\377\377\327\377\377\377\2\376\376\376\377\377" \
+ "\377\202\376\376\376\205\377\377\377\1\376\376\376\203\377\377\377\5" \
+ "\332\332\332kkk;;=::<;;=\205::<\4;;=::<;;=::<\202;;=\2::<;;=\203::<\2" \
+ "kkm\317\317\317\204\377\377\377\1\376\376\376\314\377\377\377\1\316\316" \
+ "\316\214::<\1\316\316\316\336\377\377\377\14\376\376\376\377\377\377" \
+ "\316\316\316\204\204\206;;=::<;;=::<;;=99;::<;;=\205::<\11;;=99;;;=9" \
+ "9;::<;;;RRR\317\317\317\376\376\376\204\377\377\377\1\376\376\376\377" \
+ "\377\377\377\377\377\377\377\332\377\377\377\202\376\376\376\211\377" \
+ "\377\377\2\363\363\363\221\221\223\203::<\1;;=\207::<\1;;=\202::<\202" \
+ ";;=\10::<99;::<lln\316\316\316\376\376\376\377\377\377\376\376\376\206" \
+ "\377\377\377\1\376\376\376\311\377\377\377\1\316\316\316\214::<\1\316" \
+ "\316\316\335\377\377\377\7\376\376\376\377\377\377\376\376\376\377\377" \
+ "\377\376\376\376\347\347\347kkm\202::<\2""88:;;=\203::<\1;;=\204::<\3" \
+ ";;=99;;;=\202::<\4;;=::<xxx\346\346\346\206\377\377\377\1\376\376\376" \
+ "\377\377\377\377\377\377\377\377\331\377\377\377\3\376\376\376\377\377" \
+ "\377\376\376\376\203\377\377\377\4\376\376\376\377\377\377\300\300\302" \
+ "SSU\207::<\1;;=\202::<\1;;=\205::<\4""99;;;=SSU\316\316\316\204\377\377" \
+ "\377\1\376\376\376\205\377\377\377\1\376\376\376\202\377\377\377\1\376" \
+ "\376\376\307\377\377\377\1\316\316\316\214::<\1\316\316\316\334\377\377" \
+ "\377\1\376\376\376\202\377\377\377\1\376\376\376\204\377\377\377\3\317" \
+ "\317\317kkm;;=\205::<\3;;=::<99;\203::<\1;;=\204::<\3;;=FFH\250\250\250" \
+ "\205\377\377\377\3\376\376\376\377\377\377\376\376\376\377\377\377\377" \
+ "\377\377\377\377\326\377\377\377\1\376\376\376\204\377\377\377\4\376" \
+ "\376\376\377\377\377\347\347\351xxz\202::<\1;;=\204::<\1;;=\203::<\1" \
+ ";;=\204::<\4""99;;;=SSU\266\266\266\205\377\377\377\1\376\376\376\202" \
+ "\377\377\377\1\376\376\376\205\377\377\377\1\375\375\375\310\377\377" \
+ "\377\1\316\316\316\214::<\1\316\316\316\344\377\377\377\7\376\376\376" \
+ "\377\377\377\316\316\316kkm;;=::<99;\202::<\203;;=\2::<;;=\204::<\1;" \
+ ";=\202::<\3;;=__a\332\332\334\377\377\377\377\377\377\377\377\335\377" \
+ "\377\377\1\376\376\376\204\377\377\377\4\250\250\252FFH::<;;=\202::<" \
+ "\3;;=::<;;=\202::<\3""99;::<;;=\202::<\1;;=\202::<\4HHJ\250\250\250\377" \
+ "\377\377\376\376\376\206\377\377\377\202\376\376\376\205\377\377\377" \
+ "\1\376\376\376\311\377\377\377\1\316\316\316\214::<\1\316\316\316\345" \
+ "\377\377\377\1\376\376\376\202\377\377\377\2\301\301\301SSU\202::<\1" \
+ ";;=\202::<\2""99;;;=\212::<\3;;=\233\233\233\363\363\363\377\377\377" \
+ "\377\377\377\377\377\331\377\377\377\1\376\376\376\204\377\377\377\2" \
+ "\346\346\346kkk\211::<\3;;=99;;;=\206::<\2\235\235\237\363\363\363\205" \
+ "\377\377\377\1\376\376\376\202\377\377\377\1\376\376\376\321\377\377" \
+ "\377\1\316\316\316\214::<\1\316\316\316\352\377\377\377\2\250\250\252" \
+ "GGI\206::<\5;;=::<;;=::<;;=\202::<\202;;=\4::<:::SSS\316\316\316\203" \
+ "\377\377\377\1\376\376\376\377\377\377\377\377\377\377\377\330\377\377" \
+ "\377\2\251\251\251FFH\203::<\1""99;\207::<\1;;=\204::<\3;;=xxx\346\346" \
+ "\346\334\377\377\377\1\316\316\316\214::<\1\316\316\316\350\377\377\377" \
+ "\13\376\376\376\377\377\377\376\376\376\363\363\363\234\234\23699;;;" \
+ "=::<;;=99;;;=\202::<\2""99;;;=\206::<\202;;=\2\221\221\223\363\363\363" \
+ "\204\377\377\377\3\376\376\376\377\377\377\376\376\376\202\377\377\377" \
+ "\1\376\376\376\377\377\377\377\377\377\377\377\316\377\377\377\2\346" \
+ "\346\346kkk\202;;=\206::<\1;;=\203::<\3;;=::<;;=\202::<\2``b\316\316" \
+ "\320\336\377\377\377\1\316\316\316\214::<\1\316\316\316\353\377\377\377" \
+ "\4\376\376\376\377\377\377\350\350\352kkm\206::<\2;;=99;\203::<\1;;=" \
+ "\203::<\6;;=::<TTV\331\331\331\377\377\377\376\376\376\207\377\377\377" \
+ "\1\376\376\376\377\377\377\377\377\377\377\377\306\377\377\377\1\376" \
+ "\376\376\203\377\377\377\5\376\376\376\377\377\377\266\266\266EEG;;=" \
+ "\203::<\1;;=\203::<\1;;=\204::<\202;;=\3::<GGI\250\250\252\205\377\377" \
+ "\377\1\376\376\376\202\377\377\377\1\376\376\376\327\377\377\377\1\316" \
+ "\316\316\214::<\1\316\316\316\351\377\377\377\1\376\376\376\203\377\377" \
+ "\377\5\376\376\376\377\377\377\316\316\316TTV;;=\203::<\3;;=::<;;=\204" \
+ "::<\202;;=\5::<;;=99;;;=\234\234\236\207\377\377\377\1\376\376\376\377" \
+ "\377\377\377\377\377\377\377\303\377\377\377\3\376\376\376\377\377\377" \
+ "\376\376\376\203\377\377\377\6\376\376\376\377\377\377\364\364\364ww" \
+ "y::<;;=\202::<\202;;=\202::<\5;;=::<99;::<;;=\202::<\4;;=::<\204\204" \
+ "\206\363\363\363\202\377\377\377\1\376\376\376\202\377\377\377\3\376" \
+ "\376\376\377\377\377\376\376\376\331\377\377\377\1\316\316\316\214::" \
+ "<\1\316\316\316\353\377\377\377\1\376\376\376\204\377\377\377\11\376" \
+ "\376\376\234\234\234GGI::<;;=::<;;=::<;;=\207::<\1;;=\202::<\2__a\332" \
+ "\332\332\377\377\377\377\377\377\377\377\320\377\377\377\4\316\316\316" \
+ "FFH::<;;=\202::<\1;;=\207::<\2;;=99;\202;;=\3__a\316\316\320\376\376" \
+ "\376\342\377\377\377\1\316\316\316\214::<\1\316\316\316\361\377\377\377" \
+ "\5\376\376\376\347\347\347lln::<;;=\210::<\1""99;\202::<\7;;=::<99;G" \
+ "GI\247\247\247\377\377\377\376\376\376\202\377\377\377\1\376\376\376" \
+ "\377\377\377\377\377\377\377\377\305\377\377\377\1\376\376\376\203\377" \
+ "\377\377\3\221\221\221:::;;=\203::<\1;;=\202::<\1;;=\203::<\1;;=\202" \
+ "::<\4;;=FFH\234\234\234\376\376\376\202\377\377\377\1\375\375\375\202" \
+ "\377\377\377\1\376\376\376\203\377\377\377\1\376\376\376\332\377\377" \
+ "\377\1\316\316\316\214::<\1\316\316\316\364\377\377\377\3\301\301\303" \
+ "FFH;;=\206::<\1;;=\205::<\5;;=99;;;=yy{\363\363\363\377\377\377\377\377" \
+ "\377\377\377\312\377\377\377\3\346\346\346^^`;;=\207::<\1;;=\203::<\1" \
+ ";;=\203::<\2jjl\346\346\350\202\377\377\377\1\376\376\376\213\377\377" \
+ "\377\1\375\375\375\327\377\377\377\1\316\316\316\214::<\1\316\316\316" \
+ "\360\377\377\377\3\376\376\376\377\377\377\376\376\376\202\377\377\377" \
+ "\2\363\363\363\220\220\220\202;;=\203::<\2;;=99;\206::<\1;;=\202::<\2" \
+ "SSU\316\316\320\202\377\377\377\1\376\376\376\377\377\377\377\377\377" \
+ "\377\377\303\377\377\377\4\376\376\376\377\377\377\302\302\302FFH\217" \
+ "::<\2GGI\250\250\252\205\377\377\377\1\376\376\376\211\377\377\377\3" \
+ "\376\376\376\377\377\377\376\376\376\326\377\377\377\1\316\316\316\214" \
+ "::<\1\316\316\316\356\377\377\377\1\376\376\376\210\377\377\377\3\316" \
+ "\316\316SSU;;=\203::<\202;;=\207::<\1;;=\202::<\1\235\235\237\377\377" \
+ "\377\377\377\377\377\377\306\377\377\377\1\221\221\221\202::<\2;;=99" \
+ ";\203::<\3;;=::<;;=\203::<\1;;=\202::<\2kkm\346\346\346\351\377\377\377" \
+ "\1\316\316\316\214::<\1\316\316\316\370\377\377\377\2\362\362\362\221" \
+ "\221\221\204::<\3;;=::<;;=\206::<\1;;=\202::<\2xxz\362\362\364\377\377" \
+ "\377\377\377\377\377\377\301\377\377\377\3\376\376\376\363\363\363__" \
+ "_\204::<\3;;=::<;;=\202::<\2;;=99;\202;;=\4::<99;GGI\250\250\252\353" \
+ "\377\377\377\1\316\316\316\214::<\1\316\316\316\366\377\377\377\1\376" \
+ "\376\376\203\377\377\377\2\317\317\317SSS\211::<\202;;=\6""99;;;=99;" \
+ "::<SSU\332\332\332\202\377\377\377\1\376\376\376\377\377\377\377\377" \
+ "\377\377\377\267\377\377\377\11\376\376\376\377\377\377\376\376\376\377" \
+ "\377\377\376\376\376\377\377\377\317\317\321FFH;;=\202::<\3;;=::<99;" \
+ "\203::<\203;;=\202::<\4;;=lll\346\346\346\376\376\376\353\377\377\377" \
+ "\1\316\316\316\214::<\1\316\316\316\367\377\377\377\1\376\376\376\202" \
+ "\377\377\377\5\376\376\376\363\363\363\221\221\223;;=99;\202;;=\3::<" \
+ "99;;;=\202::<\202;;=\6::<;;=::<;;=::<\265\265\265\202\377\377\377\1\376" \
+ "\376\376\377\377\377\377\377\377\377\377\273\377\377\377\1\250\250\252" \
+ "\202::<\2""99;;;=\203::<\1;;=\202::<\1;;=\204::<\3;;=\250\250\250\376" \
+ "\376\376\205\377\377\377\1\376\376\376\347\377\377\377\1\316\316\316" \
+ "\214::<\1\316\316\316\373\377\377\377\5\376\376\376\377\377\377\300\300" \
+ "\300FFH;;=\202::<\1;;=\202::<\3;;=::<;;=\202::<\2;;=::<\202;;=\4\205" \
+ "\205\207\376\376\376\377\377\377\376\376\376\377\377\377\377\377\377" \
+ "\377\377\267\377\377\377\3\376\376\376\364\364\364\205\205\207\202::" \
+ "<\202;;=\15""99;;;=::<;;=::<;;=::<99;;;=99;;;=__a\331\331\331\357\377" \
+ "\377\377\1\316\316\316\214::<\1\316\316\316\366\377\377\377\1\376\376" \
+ "\376\203\377\377\377\1\376\376\376\203\377\377\377\2\363\363\363kkm\215" \
+ "::<\4;;=99;__a\363\363\363\202\377\377\377\1\376\376\376\377\377\377" \
+ "\377\377\377\377\377\265\377\377\377\4\347\347\351__a::<;;=\203::<\1" \
+ ";;=\202::<\1;;=\203::<\1;;=\202::<\2\221\221\223\363\363\363\360\377" \
+ "\377\377\1\316\316\316\214::<\1\316\316\316\364\377\377\377\1\376\376" \
+ "\376\203\377\377\377\1\376\376\376\207\377\377\377\2\251\251\253;;=\203" \
+ "::<\1;;=\203::<\1;;=\203::<\203;;=\3FFH\332\332\332\376\376\376\377\377" \
+ "\377\377\377\377\377\377\265\377\377\377\4\331\331\331FFH::<;;=\203:" \
+ ":<\1;;=\202::<\1;;=\205::<\2FFH\302\302\302\205\377\377\377\7\376\376" \
+ "\376\377\377\377\376\376\376\377\377\377\376\376\376\377\377\377\376" \
+ "\376\376\346\377\377\377\1\316\316\316\214::<\1\316\316\316\377\377\377" \
+ "\377\202\377\377\377\2\332\332\332SSU\203::<\1;;=\203::<\12""99;;;=:" \
+ ":<99;::<;;=99;;;=\266\266\266\376\376\376\377\377\377\377\377\377\377" \
+ "\377\263\377\377\377\1\265\265\265\202::<\1;;=\205::<\202;;=\202::<\1" \
+ ";;=\202::<\2__a\346\346\350\203\377\377\377\1\376\376\376\357\377\377" \
+ "\377\1\316\316\316\214::<\1\316\316\316\377\377\377\377\203\377\377\377" \
+ "\2\363\363\363\204\204\204\202::<\1;;=\203::<\1;;=\205::<\1;;=\202::" \
+ "<\1\221\221\221\377\377\377\377\377\377\377\377\262\377\377\377\4\235" \
+ "\235\237;;=::<;;=\203::<\1;;=\206::<\3;;=::<\222\222\222\202\377\377" \
+ "\377\1\376\376\376\362\377\377\377\1\316\316\316\214::<\1\316\316\316" \
+ "\377\377\377\377\205\377\377\377\3\265\265\265:::;;=\206::<\5;;=::<;" \
+ ";=::<;;=\202::<\2\204\204\206\363\363\363\212\377\377\377\1\376\376\376" \
+ "\377\377\377\377\377\377\377\377\236\377\377\377\1\376\376\376\202\377" \
+ "\377\377\4\376\376\376\377\377\377\376\376\377\204\204\206\206::<\12" \
+ ";;=::<;;=::<;;=::<;;=::<FFH\301\301\301\366\377\377\377\1\316\316\316" \
+ "\214::<\1\316\316\316\377\377\377\377\206\377\377\377\4\333\333\333S" \
+ "SU::<;;=\205::<\4;;=::<;;=::<\202;;=\3::<__a\364\364\364\202\377\377" \
+ "\377\1\376\376\376\205\377\377\377\1\376\376\376\202\377\377\377\1\376" \
+ "\376\376\377\377\377\377\377\377\377\377\236\377\377\377\4\376\376\376" \
+ "\377\377\377\363\363\365__a\203::<\10""99;;;=::<;;=99;;;=99;;;=\203:" \
+ ":<\2__a\332\332\332\203\377\377\377\1\376\376\376\363\377\377\377\1\316" \
+ "\316\316\214::<\1\316\316\316\377\377\377\377\207\377\377\377\7\363\363" \
+ "\363kkm;;=::<;;=::<;;=\204::<\202;;=\10""99;;;=::<SSU\332\332\332\376" \
+ "\376\376\377\377\377\376\376\376\205\377\377\377\1\376\376\376\377\377" \
+ "\377\377\377\377\377\377\236\377\377\377\1\376\376\376\202\377\377\377" \
+ "\2\346\346\350__a\202::<\4;;=::<;;=99;\204::<\1;;=\203::<\3xxz\362\362" \
+ "\362\377\377\377\202\376\376\376\365\377\377\377\1\316\316\316\214::" \
+ "<\1\316\316\316\377\377\377\377\210\377\377\377\5\376\376\376\234\234" \
+ "\234;;=::<;;=\202::<\14;;=::<;;=99;;;=::<;;=::<;;=FFH\332\332\332\376" \
+ "\376\376\203\377\377\377\1\376\376\376\203\377\377\377\3\376\376\376" \
+ "\377\377\377\376\376\376\377\377\377\377\377\377\377\377\235\377\377" \
+ "\377\4\332\332\332FFH::<;;=\205::<\1;;=\205::<\2;;=\234\234\234\372\377" \
+ "\377\377\1\316\316\316\214::<\1\316\316\316\377\377\377\377\212\377\377" \
+ "\377\2\300\300\300FFH\203::<\1""99;\202::<\2;;=99;\203::<\4;;=::<FFH" \
+ "\266\266\266\205\377\377\377\1\376\376\376\202\377\377\377\1\376\376" \
+ "\376\377\377\377\377\377\377\377\377\235\377\377\377\3\332\332\332FF" \
+ "H;;=\205::<\1;;=\202::<\1""99;\203::<\6FFH\301\301\301\377\377\377\376" \
+ "\376\376\377\377\377\376\376\376\207\377\377\377\1\376\376\376\357\377" \
+ "\377\377\1\316\316\316\214::<\1\316\316\316\377\377\377\377\211\377\377" \
+ "\377\4\376\376\376\377\377\377\331\331\331SSU\204::<\6""99;::<;;=::<" \
+ ";;=::<\202;;=\202::<\1\266\266\270\203\377\377\377\1\376\376\376\377" \
+ "\377\377\377\377\377\377\377\240\377\377\377\2\265\265\265EEG\202::<" \
+ "\6;;=::<;;=::<;;=99;\203::<\4;;=::<SSU\332\332\332\203\377\377\377\1" \
+ "\376\376\376\207\377\377\377\1\376\376\376\360\377\377\377\1\316\316" \
+ "\316\214::<\1\316\316\316\377\377\377\377\212\377\377\377\15\376\376" \
+ "\376\377\377\377\363\363\363__a::<;;=99;;;=::<99;;;=::<;;=\202::<\4;" \
+ ";=99;;;=\250\250\252\204\377\377\377\1\376\376\376\377\377\377\377\377" \
+ "\377\377\377\235\377\377\377\5\265\265\265::<;;=::<;;=\202::<\202;;=" \
+ "\2::<;;=\204::<\2__a\364\364\364\206\377\377\377\1\376\376\376\366\377" \
+ "\377\377\1\316\316\316\214::<\1\316\316\316\377\377\377\377\211\377\377" \
+ "\377\1\376\376\376\204\377\377\377\2\204\204\20699;\204::<\1;;=\204:" \
+ ":<\5""99;;;=99;::<\204\204\204\377\377\377\377\377\377\377\377\232\377" \
+ "\377\377\1\376\376\376\205\377\377\377\2\265\265\267;;=\211::<\1;;=\203" \
+ "::<\1\205\205\205\377\377\377\377\1\316\316\316\214::<\1\316\316\316" \
+ "\377\377\377\377\215\377\377\377\12\376\376\376\377\377\377\250\250\250" \
+ "::<;;=::<99;;;=::<;;=\202::<\3;;=::<99;\202::<\1\205\205\207\212\377" \
+ "\377\377\1\376\376\376\377\377\377\377\377\377\377\377\223\377\377\377" \
+ "\1\265\265\267\203::<\202;;=\1""99;\204::<\5;;=::<;;=::<\235\235\237" \
+ "\377\377\377\377\2\377\377\377\316\316\316\214::<\1\316\316\316\377\377" \
+ "\377\377\216\377\377\377\3\376\376\376\377\377\377\265\265\267\202::" \
+ "<\3;;=::<;;=\205::<\1;;=\203::<\1\204\204\204\210\377\377\377\1\376\376" \
+ "\376\202\377\377\377\1\376\376\376\377\377\377\377\377\377\377\377\220" \
+ "\377\377\377\6\234\234\236::<;;=::<;;=99;\204::<\1;;=\204::<\1\265\265" \
+ "\265\377\377\377\377\202\377\377\377\1\316\316\316\214::<\1\316\316\316" \
+ "\377\377\377\377\215\377\377\377\1\376\376\376\203\377\377\377\2\334" \
+ "\334\334FFH\207::<\202;;=\203::<\3;;=\204\204\206\376\376\376\207\377" \
+ "\377\377\1\376\376\376\377\377\377\377\377\377\377\377\216\377\377\377" \
+ "\11\376\376\376\377\377\377\376\376\376\204\204\206::<99;;;=::<;;=\204" \
+ "::<\6;;=99;;;=::<FFH\301\301\301\377\377\377\377\203\377\377\377\1\316" \
+ "\316\316\214::<\1\316\316\316\377\377\377\377\215\377\377\377\1\376\376" \
+ "\376\202\377\377\377\202\376\376\376\3\332\332\332FFH::<\202;;=\203:" \
+ ":<\3;;=99;;;=\204::<\2\205\205\207\376\376\376\203\377\377\377\1\376" \
+ "\376\376\203\377\377\377\3\376\376\376\377\377\377\376\376\376\377\377" \
+ "\377\377\377\377\377\377\212\377\377\377\7\376\376\376\377\377\377\376" \
+ "\376\376\204\204\20499;::<;;=\202::<\1""99;\205::<\4;;=::<GGI\332\332" \
+ "\334\377\377\377\377\204\377\377\377\1\316\316\316\214::<\1\316\316\316" \
+ "\377\377\377\377\217\377\377\377\6\376\376\376\377\377\377\376\376\376" \
+ "\377\377\377\362\362\362__a\203::<\202;;=\11""99;;;=::<99;;;=::<;;=:" \
+ ":<\204\204\204\205\377\377\377\1\376\376\376\202\377\377\377\1\376\376" \
+ "\376\377\377\377\377\377\377\377\377\215\377\377\377\1\204\204\204\202" \
+ "::<\1;;=\207::<\1<<>\202::<\2FFH\331\331\333\377\377\377\377\205\377" \
+ "\377\377\1\316\316\316\214::<\1\316\316\316\377\377\377\377\216\377\377" \
+ "\377\1\376\376\376\203\377\377\377\4\376\376\376\377\377\377\363\363" \
+ "\363__a\204::<\2;;=99;\206::<\2;;=\204\204\204\203\377\377\377\1\376" \
+ "\376\376\377\377\377\377\377\377\377\377\220\377\377\377\1\204\204\204" \
+ "\205::<\1;;=\203::<\1;;=\203::<\4__a\363\363\363\377\377\377\376\376" \
+ "\376\377\377\377\377\204\377\377\377\1\316\316\316\214::<\1\316\316\316" \
+ "\377\377\377\377\224\377\377\377\4\376\376\376\363\363\363xxx::<\202" \
+ ";;=\202::<\1;;=\203::<\1;;=\203::<\1\205\205\207\204\377\377\377\1\376" \
+ "\376\376\377\377\377\377\377\377\377\377\215\377\377\377\1\250\250\250" \
+ "\205::<\1;;=\203::<\12;;=99;;;=::<__a\363\363\365\377\377\377\376\376" \
+ "\376\377\377\377\376\376\376\377\377\377\377\203\377\377\377\1\316\316" \
+ "\316\214::<\1\316\316\316\377\377\377\377\227\377\377\377\5\204\204\204" \
+ "::<;;=::<;;=\204::<\1""99;\204::<\1\204\204\204\377\377\377\377\377\377" \
+ "\377\377\213\377\377\377\1\376\376\376\202\377\377\377\4\376\376\376" \
+ "\377\377\377\265\265\267;;=\212::<\4;;=::<__a\363\363\363\217\377\377" \
+ "\377\1\376\376\376\367\377\377\377\1\316\316\316\214::<\1\316\316\316" \
+ "\376\377\377\377\202\377\377\375\3\377\376\377\377\377\377\376\377\375" \
+ "\224\377\377\377\3\204\204\206::<;;=\211::<\7""99;::<\203\203\205\377" \
+ "\377\377\376\376\376\377\377\377\376\376\376\205\377\377\377\1\376\376" \
+ "\376\202\377\377\377\202\376\376\376\377\377\377\377\377\377\377\377" \
+ "\2\264\264\266;;=\202::<\202;;=\1""99;\207::<\2__a\363\363\365\217\377" \
+ "\377\377\3\376\376\376\377\377\377\376\376\376\366\377\377\377\1\316" \
+ "\316\316\214::<\1\316\316\316\375\377\377\377\5\377\377\375\377\376\377" \
+ "\377\375\377\377\377\375\377\377\377\202\377\376\377\221\377\377\377" \
+ "\1\376\376\376\202\377\377\377\1\204\204\206\203::<\1;;=\202::<\2;;=" \
+ "::<\202;;=\202::<\3;;=\204\204\204\376\376\376\211\377\377\377\3\376" \
+ "\376\376\377\377\377\376\376\376\377\377\377\377\375\377\377\377\7\376" \
+ "\376\376\264\264\266;;=99;::<;;=99;\204::<\1;;=\203::<\2aac\363\363\363" \
+ "\221\377\377\377\1\376\376\376\367\377\377\377\1\316\316\316\214::<\1" \
+ "\316\316\316\375\377\377\377\202\376\376\376\203\377\377\377\202\376" \
+ "\377\377\222\377\377\377\10\376\376\376\377\377\377\376\376\376\204\204" \
+ "\206::<;;=::<;;=\203::<\202;;=\202::<\6""99;;;=\205\205\207\376\376\376" \
+ "\377\377\377\376\376\376\203\377\377\377\202\376\376\376\202\377\377" \
+ "\377\1\376\376\376\377\377\377\377\375\377\377\377\3\376\376\376\302" \
+ "\302\304;;=\203::<\1;;=\204::<\6;;=99;;;=::<aac\362\362\362\223\377\377" \
+ "\377\1\376\376\376\366\377\377\377\1\316\316\316\214::<\1\316\316\316" \
+ "\374\377\377\377\6\375\377\376\377\377\375\377\376\377\376\377\377\376" \
+ "\376\376\377\377\375\202\377\376\377\225\377\377\377\2\376\376\376\204" \
+ "\204\206\206::<\1""99;\203::<\1;;=\202::<\1\251\251\253\204\377\377\377" \
+ "\1\376\376\376\377\377\377\377\377\377\377\377\203\377\377\377\4\332" \
+ "\332\332FFH::<;;=\202::<\1""99;\205::<\4;;=::<__a\363\363\365\202\377" \
+ "\377\377\1\376\376\376\377\377\377\377\211\377\377\377\1\316\316\316" \
+ "\214::<\1\316\316\316\374\377\377\377\5\376\377\377\376\376\376\377\376" \
+ "\377\377\377\375\376\377\375\202\376\377\377\1\377\377\375\221\377\377" \
+ "\377\3\376\376\376\377\377\377\376\376\376\203\377\377\377\2\204\204" \
+ "\206;;=\205::<\1;;=\203::<\7;;=::<;;=\265\265\265\376\376\376\377\377" \
+ "\377\376\376\376\202\377\377\377\5\376\376\376\377\377\377\376\376\376" \
+ "\377\377\377\376\376\376\377\377\377\377\373\377\377\377\6\331\331\331" \
+ "GGI::<;;=::<;;=\205::<\1<<>\202::<\2__a\363\363\365\202\377\377\377\1" \
+ "\376\376\376\213\377\377\377\1\376\376\376\375\377\377\377\1\316\316" \
+ "\316\214::<\1\316\316\316\374\377\377\377\7\377\376\377\376\377\377\376" \
+ "\376\374\377\376\377\377\377\375\376\377\377\377\377\375\226\377\377" \
+ "\377\1\376\376\376\202\377\377\377\1\203\203\203\214::<\2;;=\265\265" \
+ "\265\206\377\377\377\1\376\376\376\377\377\377\377\374\377\377\377\4" \
+ "\364\364\364GGI99;;;=\206::<\1;;=\203::<\2__a\363\363\363\205\377\377" \
+ "\377\1\376\376\376\212\377\377\377\1\363\363\363\203\377\377\377\1\376" \
+ "\376\376\370\377\377\377\1\316\316\316\214::<\1\316\316\316\374\377\377" \
+ "\377\10\377\377\375\377\376\377\377\377\377\377\377\375\377\376\377\370" \
+ "\373\362\370\373\364\377\376\377\220\377\377\377\1\376\376\376\202\377" \
+ "\377\377\1\376\376\376\202\377\377\377\1\376\376\376\202\377\377\377" \
+ "\1\204\204\204\203::<\1;;=\210::<\2FFH\332\332\334\204\377\377\377\1" \
+ "\376\376\376\377\377\377\377\374\377\377\377\3\363\363\363___;;=\202" \
+ "::<\1;;=\204::<\6;;=99;;;=::<__a\363\363\365\220\377\377\377\3\265\265" \
+ "\265FFF\333\333\333\373\377\377\377\1\316\316\316\214::<\1\316\316\316" \
+ "\376\377\377\377\6\374\377\377\377\377\375\371\374\365\242\320c\240\322" \
+ "c\371\372\362\221\377\377\377\1\376\376\376\210\377\377\377\2\203\203" \
+ "\203;;=\202::<\1;;=\203::<\1;;=\203::<\3;;=FFH\333\333\333\202\377\377" \
+ "\377\1\376\376\376\377\377\377\377\371\377\377\377\1\376\376\376\203" \
+ "\377\377\377\2kkm::<\202;;=\1""99;\205::<\202;;=\3::<__a\363\363\363" \
+ "\220\377\377\377\5\265\265\267::<;;=FFH\332\332\332\206\377\377\377\3" \
+ "\376\376\376\377\377\377\376\376\376\361\377\377\377\1\316\316\316\213" \
+ "::<\2;;=\316\316\316\365\377\377\377\22\376\376\377\377\377\375\377\377" \
+ "\377\377\377\375\377\377\377\377\376\377\377\377\375\377\377\377\376" \
+ "\376\377\377\377\377\371\374\365\242\320c\215\307\77\215\305@\242\322" \
+ "e\372\373\365\376\377\375\377\376\377\230\377\377\377\3\205\205\207:" \
+ ":<;;=\206::<\1;;=\202::<\4;;=SSU\363\363\365\376\376\376\377\377\377" \
+ "\377\374\377\377\377\13\376\376\376\204\204\204::<;;=99;::<;;=::<;;=" \
+ "::<;;=\203::<\3__a\364\364\366\376\376\376\217\377\377\377\1\265\265" \
+ "\267\203::<\3;;=FFF\332\332\332\206\377\377\377\1\376\376\376\361\377" \
+ "\377\377\2\376\376\376\317\317\317\212::<\6;;=;;;\316\316\316\376\376" \
+ "\376\377\377\377\376\376\376\361\377\377\377\6\376\376\377\377\376\377" \
+ "\375\376\377\376\377\377\377\377\375\375\377\376\202\377\377\377\17\376" \
+ "\376\376\377\377\377\371\372\364\240\322a\215\305@\212\307>\215\307\77" \
+ "\215\305>\242\320c\370\372\365\377\377\377\377\376\377\376\377\375\377" \
+ "\377\375\377\376\377\225\377\377\377\5kkm::<;;=99;;;=\210::<\4__a\364" \
+ "\364\364\376\376\376\377\377\377\202\376\376\376\377\377\377\377\363" \
+ "\377\377\377\3\376\376\376\377\377\377\376\376\376\202\377\377\377\4" \
+ "\250\250\252::<;;=99;\202;;=\205::<\202;;=\3FFH\345\345\345\376\376\376" \
+ "\217\377\377\377\4\264\264\266;;=::<;;=\203::<\2GGI\332\332\332\203\377" \
+ "\377\377\1\376\376\376\356\377\377\377\1\376\376\376\205\377\377\377" \
+ "\2\315\315\315;;;\211::<\3;;;:::\315\315\315\202\377\377\377\1\376\376" \
+ "\376\361\377\377\377\23\377\377\375\375\376\377\376\377\377\376\377\375" \
+ "\377\374\377\377\377\375\375\377\376\377\377\377\377\377\375\371\372" \
+ "\364\242\321g\215\306A\212\307>\215\306A\212\306@\214\305@\212\306B\241" \
+ "\322_\367\372\361\204\377\377\377\1\377\377\375\220\377\377\377\1\376" \
+ "\376\376\203\377\377\377\3\363\363\363__a99;\202::<\6;;=::<99;;;=99;" \
+ ";;=\203::<\1\205\205\207\204\377\377\377\1\376\376\376\377\377\377\377" \
+ "\362\377\377\377\1\376\376\376\202\377\377\377\22\376\376\376\265\265" \
+ "\267::<99;;;=::<;;=99;;;=::<;;=::<;;=::<FFH\331\331\331\377\377\377\376" \
+ "\376\376\216\377\377\377\1\265\265\267\203::<\1;;=\202::<\4;;=::<GGI" \
+ "\332\332\332\210\377\377\377\1\376\376\376\353\377\377\377\1\376\376" \
+ "\376\221\377\377\377\1\376\376\376\363\377\377\377\17\376\377\377\376" \
+ "\377\375\377\375\376\375\377\376\377\377\375\377\377\377\377\376\377" \
+ "\367\374\365\240\320b\215\307=\213\305=\215\306A\215\305>\214\305@\214" \
+ "\306>\202\214\305@\4\241\321a\371\374\365\376\376\377\377\377\375\202" \
+ "\376\377\377\221\377\377\377\1\376\376\376\203\377\377\377\3\362\362" \
+ "\362``b99;\205::<\1;;=\203::<\6;;=99;\235\235\237\376\376\376\377\377" \
+ "\377\376\376\376\377\377\377\377\366\377\377\377\2\332\332\332FFH\202" \
+ ";;=\4""99;;;=::<;;=\205::<\2FFH\332\332\334\202\377\377\377\3\376\376" \
+ "\376\377\377\377\376\376\376\213\377\377\377\4\266\266\26699;::<;;=\202" \
+ "::<\1;;=\202::<\4;;=::<FFF\332\332\332\203\377\377\377\1\376\376\376" \
+ "\202\377\377\377\1\376\376\376\375\377\377\377\1\376\376\376\363\377" \
+ "\377\377\202\377\377\375\3\377\374\377\375\377\376\376\377\377\202\377" \
+ "\377\377\21\370\373\364\241\321c\216\306\77\212\306@\214\306>\215\305" \
+ "@\212\306@\213\310=\214\306<\216\306\77\214\304=\214\306>\241\321c\372" \
+ "\375\362\376\376\376\377\376\377\376\376\374\220\377\377\377\2\376\376" \
+ "\376\377\377\377\203\376\376\376\4\377\377\377\364\364\364FFH;;=\202" \
+ "::<\1;;=\202::<\1;;=\203::<\3;;=::<\265\265\265\377\377\377\377\367\377" \
+ "\377\377\4\362\362\362SSU::<;;=\205::<\1""99;\202;;=\3::<;;=\265\265" \
+ "\267\216\377\377\377\3\376\376\376\377\377\377\265\265\265\202::<\5;" \
+ ";=99;;;=::<;;=\204::<\4;;=FFH\332\332\332\376\376\376\205\377\377\377" \
+ "\1\376\376\376\355\377\377\377\1\376\376\376\214\377\377\377\1\376\376" \
+ "\376\366\377\377\377\1\375\377\376\202\377\377\375\24\377\377\377\376" \
+ "\376\376\373\373\363\243\322b\213\307A\214\306>\215\305@\214\305@\212" \
+ "\307>\214\306>\215\305>\213\307A\214\305@\216\310@\214\306>\215\305>" \
+ "\242\320c\366\373\364\375\377\376\377\376\377\221\377\377\377\1\376\376" \
+ "\376\204\377\377\377\3\376\376\376\333\333\333EEG\202;;=\2::<;;=\207" \
+ "::<\3GGI\332\332\332\376\376\376\377\377\377\377\365\377\377\377\1__" \
+ "a\205::<\10;;=::<;;=::<;;=::<;;=\265\265\265\202\377\377\377\3\376\376" \
+ "\376\377\377\377\376\376\376\213\377\377\377\1\266\266\266\203::<\5""9" \
+ "9;<<>::<;;=::<\202;;=\203::<\4;;=FFH\333\333\333\376\376\376\202\377" \
+ "\377\377\1\376\376\376\355\377\377\377\1\376\376\376\202\377\377\377" \
+ "\1\376\376\376\215\377\377\377\1\376\376\376\363\377\377\377\3\377\376" \
+ "\377\377\377\377\375\377\376\202\377\377\377\2\373\373\363\241\321d\202" \
+ "\214\306>\17\216\306=\215\305@\215\307\77\214\306>\217\304>\214\306>" \
+ "\214\305B\215\307\77\211\305A\215\306A\216\306\77\214\305@\242\322e\370" \
+ "\373\364\377\377\375\230\377\377\377\1\333\333\335\203::<\202;;=\206" \
+ "::<\3;;=FFH\363\363\363\377\377\377\377\364\377\377\377\1\204\204\206" \
+ "\203::<\1;;=\207::<\2;;=\204\204\206\220\377\377\377\1\346\346\346\204" \
+ "::<\1;;=\203::<\1;;=\202::<\202;;=\203::<\2FFH\332\332\332\357\377\377" \
+ "\377\3\376\376\376\377\377\377\376\376\376\377\377\377\377\204\377\377" \
+ "\377\1\377\377\375\202\377\377\377\17\377\376\377\370\373\364\243\322" \
+ "b\214\306>\213\310\77\212\307>\214\306>\215\306C\212\307>\214\306<\213" \
+ "\310\77\214\305@\214\306<\214\306>\216\306\77\203\214\306>\3\214\306" \
+ "<\265\334\211\376\376\376\222\377\377\377\1\376\376\376\205\377\377\377" \
+ "\4\376\376\377\265\265\267::<;;=\212::<\1___\377\377\377\377\363\377" \
+ "\377\377\1\265\265\267\204::<\1;;=\206::<\2;;=\203\203\203\222\377\377" \
+ "\377\2\265\265\265;;=\203::<\1;;=\205::<\1;;=\204::<\3;;=FFH\332\332" \
+ "\332\206\377\377\377\3\376\376\376\377\377\377\376\376\376\377\377\377" \
+ "\377\345\377\377\377\10\376\376\377\377\377\375\377\377\377\377\377\375" \
+ "\377\377\377\377\376\377\377\377\375\376\377\377\202\377\377\377\6\370" \
+ "\373\362\243\322b\211\307B\213\310=\214\305@\214\306<\202\215\305@\4" \
+ "\214\306<\214\305@\214\306<\215\307\77\202\214\306>\6\212\307>\214\306" \
+ ">\215\307\77\214\305@\244\317c\367\375\361\233\377\377\377\3\234\234" \
+ "\236::<99;\211::<\2;;=\204\204\206\377\377\377\377\360\377\377\377\13" \
+ "\376\376\376\332\332\33299;::<99;;;=::<99;;;=::<;;=\202::<\3;;=^^`\364" \
+ "\364\364\223\377\377\377\12\265\265\267;;=::<;;=99;;;=::<;;=::<;;=\202" \
+ "::<\1;;=\203::<\3;;=FFF\332\332\332\206\377\377\377\1\376\376\376\377" \
+ "\377\377\377\345\377\377\377\6\376\376\377\377\376\377\375\376\377\376" \
+ "\377\377\377\377\375\375\377\376\203\377\377\377\27\377\377\375\372\373" \
+ "\366\241\321a\217\304@\212\307<\214\306>\215\305>\215\305@\213\310=\212" \
+ "\306@\214\306>\214\305B\215\307\77\215\305>\215\306A\212\307>\214\306" \
+ ">\215\307\77\214\306>\242\322b\370\373\362\376\376\377\377\375\376\233" \
+ "\377\377\377\1\204\204\206\203::<\13;;=::<;;=::<;;=::<;;=::<;;=\266\266" \
+ "\266\376\376\376\203\377\377\377\1\376\376\376\377\377\377\377\352\377" \
+ "\377\377\2\363\363\363TTV\202::<\3;;=99;;;=\204::<\4;;=99;FFH\363\363" \
+ "\363\224\377\377\377\7\376\376\376\265\265\265;;=::<;;=::<;;=\203::<" \
+ "\1;;=\203::<\1;;=\203::<\2GGI\332\332\332\203\377\377\377\1\376\376\376" \
+ "\377\377\377\377\347\377\377\377\7\377\377\375\375\376\377\376\377\377" \
+ "\376\377\375\377\374\377\377\377\375\375\377\376\202\377\377\377\5\372" \
+ "\373\366\240\320b\215\307\77\212\306@\215\305>\202\214\305@\20\215\305" \
+ "@\212\306@\214\305D\216\306\77\214\306>\215\307\77\214\306>\212\306@" \
+ "\214\306>\215\307\77\215\305@\242\320c\370\373\362\377\377\373\377\376" \
+ "\377\377\377\375\232\377\377\377\3\376\376\376\377\377\377^^`\202;;=" \
+ "\205::<\1""99;\202;;=\5::<;;=\332\332\332\377\377\377\376\376\376\377" \
+ "\377\377\377\347\377\377\377\1\376\376\376\204\377\377\377\1lln\204:" \
+ ":<\202;;=\203::<\6;;=99;GGI\332\332\332\377\377\377\376\376\376\225\377" \
+ "\377\377\2\264\264\264;;=\202::<\2""99;;;=\202::<\3""99;;;=::<\202;;" \
+ "=\202::<\4;;=::<GGI\332\332\332\210\377\377\377\1\376\376\376\377\377" \
+ "\377\377\342\377\377\377\37\376\377\377\376\377\375\377\375\376\375\377" \
+ "\376\377\377\375\377\377\377\377\376\377\370\373\362\241\321a\215\307" \
+ "\77\215\307=\214\305@\214\306>\212\307<\214\306>\214\306<\214\306>\216" \
+ "\306\77\215\305<\212\307>\213\307A\215\305>\212\307>\215\307\77\214\306" \
+ ">\242\321a\373\374\364\377\377\377\376\377\377\376\376\376\376\377\377" \
+ "\234\377\377\377\2\364\364\364RRT\202::<\4""99;;;=::<;;=\205::<\3SSU" \
+ "\362\362\362\377\377\377\202\376\376\376\377\377\377\377\351\377\377" \
+ "\377\1\234\234\236\204::<\1;;=\203::<\1;;=\203::<\1\265\265\267\231\377" \
+ "\377\377\2\265\265\267;;=\203::<\2""99;;;=\202::<\1;;=\202::<\1;;=\202" \
+ "::<\4;;=::<FFF\332\332\332\203\377\377\377\1\376\376\376\202\377\377" \
+ "\377\1\376\376\376\377\377\377\377\342\377\377\377\202\377\377\375\3" \
+ "\377\374\377\375\377\376\376\377\377\202\377\377\377\25\370\373\364\243" \
+ "\322b\217\304@\212\306@\214\305@\215\305>\212\307>\212\306@\214\305B" \
+ "\214\305@\214\305B\214\306>\212\307>\212\310\77\214\306>\217\304@\214" \
+ "\306>\214\305@\242\322b\370\373\362\377\377\377\202\377\376\377\1\377" \
+ "\377\375\235\377\377\377\3\376\376\376\332\332\334GGI\202;;=\6::<;;=" \
+ "99;;;=::<;;=\203::<\1yyy\202\376\376\376\202\377\377\377\1\376\376\376" \
+ "\377\377\377\377\345\377\377\377\4\376\376\376\317\317\317::<;;=\202" \
+ "::<\3;;=99;;;=\204::<\6;;=\221\221\223\377\377\377\376\376\376\377\377" \
+ "\377\376\376\376\226\377\377\377\3\376\376\376\265\265\267;;=\202::<" \
+ "\2;;=99;\205::<\1;;=\204::<\4;;=FFH\332\332\332\376\376\376\205\377\377" \
+ "\377\1\376\376\376\377\377\377\377\342\377\377\377\1\375\377\376\202" \
+ "\377\377\375\34\377\377\377\376\376\376\373\373\363\243\322b\211\307" \
+ "B\212\307<\215\305>\214\306>\212\307>\214\305@\217\304>\212\307<\214" \
+ "\306<\214\306>\215\307\77\213\307A\214\306>\215\305@\215\307\77\212\307" \
+ ">\244\317c\370\373\362\377\377\373\376\377\377\377\376\377\375\376\377" \
+ "\377\377\375\377\376\377\236\377\377\377\4\265\265\267::<;;=99;\202;" \
+ ";=\205::<\202;;=\1\250\250\250\202\377\377\377\1\376\376\376\377\377" \
+ "\377\377\343\377\377\377\1\376\376\376\202\377\377\377\3\363\363\363" \
+ "FFH;;=\202::<\5;;=::<;;=::<99;\202;;=\2::<kkm\205\377\377\377\1\376\376" \
+ "\376\227\377\377\377\1\265\265\265\204::<\6;;=::<;;=::<;;=::<\202;;=" \
+ "\203::<\4;;=FFH\333\333\333\376\376\376\202\377\377\377\1\376\376\376" \
+ "\377\377\377\377\343\377\377\377\3\377\376\377\377\377\377\375\377\376" \
+ "\202\377\377\377\11\373\373\363\241\321d\214\306>\213\310=\214\306>\214" \
+ "\305@\213\310=\212\306@\217\304>\202\215\307=\14\214\306>\215\305>\214" \
+ "\306>\215\305>\217\304@\215\307\77\215\307=\242\320c\367\375\361\376" \
+ "\376\377\377\376\377\376\376\376\202\377\377\375\2\374\377\377\377\376" \
+ "\377\234\377\377\377\1\376\376\376\202\377\377\377\10\221\221\221::<" \
+ ";;=99;::<;;=::<;;=\205::<\2\333\333\333\376\376\376\377\377\377\377\347" \
+ "\377\377\377\1kkk\202::<\1;;=\205::<\1;;=\202::<\2RRT\363\363\365\236" \
+ "\377\377\377\1\265\265\267\203::<\2""99;;;=\203::<\1;;=\202::<\202;;" \
+ "=\203::<\2FFH\332\332\332\377\377\377\377\346\377\377\377\1\377\377\375" \
+ "\202\377\377\377\32\377\376\377\370\373\364\243\322b\214\306>\213\310" \
+ "\77\214\305@\215\305>\215\305@\214\306>\214\305B\212\307<\215\307=\214" \
+ "\305B\214\306>\215\306A\212\306@\212\307>\214\306>\212\307<\244\317c" \
+ "\370\373\364\377\377\377\377\375\376\377\377\375\376\377\377\377\377" \
+ "\377\202\377\376\377\241\377\377\377\2kkm::<\202;;=\1""99;\204::<\203" \
+ ";;=\2SSU\364\364\364\377\377\377\377\336\377\377\377\3\376\376\376\377" \
+ "\377\377\376\376\376\204\377\377\377\2\376\376\376\250\250\252\202::" \
+ "<\1;;=\210::<\2FFH\333\333\333\202\377\377\377\1\376\376\376\235\377" \
+ "\377\377\2\265\265\265;;=\203::<\1;;=\205::<\1;;=\204::<\3;;=FFH\332" \
+ "\332\332\206\377\377\377\3\376\376\376\377\377\377\376\376\376\243\377" \
+ "\377\377\4\376\377\377\377\377\375\377\376\377\376\376\377\202\377\377" \
+ "\377\2\376\377\375\376\377\377\230\377\377\377\10\376\377\377\377\376" \
+ "\377\376\377\377\376\377\375\376\376\376\376\377\377\377\377\377\377" \
+ "\376\377\231\377\377\377\7\377\376\377\376\376\374\376\377\377\377\377" \
+ "\375\374\377\377\376\377\377\377\376\377\231\377\377\377\17\375\377\374" \
+ "\377\377\375\377\377\377\377\376\377\376\377\377\377\376\377\377\377" \
+ "\377\376\377\377\376\376\374\377\377\377\377\377\373\377\377\377\376" \
+ "\377\377\377\377\377\377\377\375\220\377\377\377\4\377\377\373\377\377" \
+ "\377\377\377\375\377\377\377\202\376\377\377\2\377\377\375\377\377\373" \
+ "\251\377\377\377\10\376\376\377\377\377\375\377\377\377\377\377\375\377" \
+ "\377\377\377\376\377\377\377\375\376\377\377\202\377\377\377\6\370\373" \
+ "\362\243\322b\211\307B\213\310=\214\305@\214\306<\202\215\305@\4\214" \
+ "\306<\214\305@\214\306<\215\307\77\202\214\306>\6\212\307>\214\306>\215" \
+ "\307\77\214\305@\244\317c\367\375\361\251\377\377\377\6\363\363\363T" \
+ "TT::<;;=::<;;=\206::<\2;;=www\204\377\377\377\1\376\376\376\377\377\377" \
+ "\377\340\377\377\377\2\332\332\332;;=\203::<\3;;=99;;;=\203::<\3;;=:" \
+ ":<\265\265\267\204\377\377\377\1\376\376\376\235\377\377\377\12\265\265" \
+ "\267;;=::<;;=99;;;=::<;;=::<;;=\202::<\1;;=\203::<\3;;=FFF\332\332\332" \
+ "\206\377\377\377\1\376\376\376\244\377\377\377\202\377\377\375\1\377" \
+ "\377\377\202\376\377\375\3\376\376\377\377\377\377\377\376\377\230\377" \
+ "\377\377\3\376\377\375\377\377\377\377\377\373\202\377\376\377\2\377" \
+ "\377\377\376\376\376\231\377\377\377\10\376\377\373\376\375\377\377\377" \
+ "\375\377\376\377\377\375\377\377\377\373\377\376\377\377\377\375\230" \
+ "\377\377\377\12\377\376\377\377\377\377\377\375\376\376\377\377\376\377" \
+ "\372\376\377\377\377\377\377\376\377\375\377\376\377\377\377\375\203" \
+ "\377\377\377\202\376\377\375\1\375\376\377\227\377\377\377\1\377\374" \
+ "\377\250\377\377\377\6\376\376\377\377\376\377\375\376\377\376\377\377" \
+ "\377\377\375\375\377\376\203\377\377\377\27\377\377\375\372\373\366\241" \
+ "\321a\217\304@\212\307<\214\306>\215\305>\215\305@\213\310=\212\306@" \
+ "\214\306>\214\305B\215\307\77\215\305>\215\306A\212\307>\214\306>\215" \
+ "\307\77\214\306>\242\322b\370\373\362\376\376\377\377\375\376\251\377" \
+ "\377\377\2\331\331\331;;=\206::<\1;;=\203::<\2;;=\265\265\265\204\377" \
+ "\377\377\1\376\376\376\202\377\377\377\1\376\376\376\377\377\377\377" \
+ "\322\377\377\377\1\376\376\376\203\377\377\377\3\376\376\376\377\377" \
+ "\377\376\376\376\202\377\377\377\2\363\363\363SSU\203::<\2;;=::<\202" \
+ ";;=\2""99;;;=\202::<\1\204\204\204\206\377\377\377\1\376\376\376\234" \
+ "\377\377\377\7\376\376\376\265\265\265;;=::<;;=::<;;=\203::<\1;;=\203" \
+ "::<\1;;=\203::<\2GGI\332\332\332\203\377\377\377\1\376\376\376\247\377" \
+ "\377\377\1\377\377\375\202\377\376\377\1\377\375\377\202\377\377\377" \
+ "\1\377\376\377\232\377\377\377\6\377\377\375\377\377\377\375\377\376" \
+ "\376\377\375\377\377\375\377\375\377\230\377\377\377\202\377\377\375" \
+ "\2\377\377\377\376\376\376\202\377\377\377\2\376\377\377\374\377\377" \
+ "\230\377\377\377\1\377\377\375\202\377\376\377\1\375\376\377\203\377" \
+ "\377\377\1\377\377\375\202\377\377\377\6\376\376\377\377\377\375\377" \
+ "\377\377\377\375\377\377\376\377\377\377\375\220\377\377\377\1\376\377" \
+ "\377\202\377\377\377\3\376\377\375\376\376\376\377\376\377\252\377\377" \
+ "\377\7\377\377\375\375\376\377\376\377\377\376\377\375\377\374\377\377" \
+ "\377\375\375\377\376\202\377\377\377\5\372\373\366\240\320b\215\307\77" \
+ "\212\306@\215\305>\202\214\305@\20\215\305@\212\306@\214\305D\216\306" \
+ "\77\214\306>\215\307\77\214\306>\212\306@\214\306>\215\307\77\215\305" \
+ "@\242\320c\370\373\362\377\377\373\377\376\377\377\377\375\252\377\377" \
+ "\377\2\250\250\25099;\204::<\12;;=99;::<;;=99;::<FFH\346\346\346\377" \
+ "\377\377\376\376\376\202\377\377\377\1\376\376\376\377\377\377\377\330" \
+ "\377\377\377\1\376\376\376\204\377\377\377\3\221\221\221::<;;=\202::" \
+ "<\5;;=::<;;=::<;;=\202::<\4___\363\363\363\377\377\377\376\376\376\202" \
+ "\377\377\377\5\376\376\376\377\377\377\376\376\376\377\377\377\376\376" \
+ "\376\234\377\377\377\2\264\264\264;;=\202::<\2""99;;;=\202::<\3""99;" \
+ ";;=::<\202;;=\202::<\4;;=::<GGI\332\332\332\210\377\377\377\1\376\376" \
+ "\376\241\377\377\377\7\376\377\377\376\376\377\377\377\377\377\377\375" \
+ "\376\377\375\375\377\376\376\377\377\230\377\377\377\3\376\376\377\376" \
+ "\377\377\376\376\377\203\377\377\377\1\376\376\374\231\377\377\377\1" \
+ "\377\376\377\202\377\377\377\202\376\377\377\1\376\376\376\232\377\377" \
+ "\377\11\376\377\377\376\376\376\377\377\377\376\377\377\377\377\377\377" \
+ "\377\375\376\377\377\376\376\377\376\377\377\202\377\377\377\5\377\377" \
+ "\375\377\377\377\377\376\377\377\377\377\376\377\377\220\377\377\377" \
+ "\10\376\376\377\377\376\377\377\377\377\376\376\376\377\376\377\377\377" \
+ "\375\377\376\377\377\377\375\251\377\377\377\37\376\377\377\376\377\375" \
+ "\377\375\376\375\377\376\377\377\375\377\377\377\377\376\377\370\373" \
+ "\362\241\321a\215\307\77\215\307=\214\305@\214\306>\212\307<\214\306" \
+ ">\214\306<\214\306>\216\306\77\215\305<\212\307>\213\307A\215\305>\212" \
+ "\307>\215\307\77\214\306>\242\321a\373\374\364\377\377\377\376\377\377" \
+ "\376\376\376\376\377\377\253\377\377\377\1yyy\205::<\3;;=::<99;\202;" \
+ ";=\3::<__a\376\376\376\377\377\377\377\335\377\377\377\1\376\376\376" \
+ "\202\377\377\377\5\301\301\301::<;;=99;;;=\207::<\2GGI\332\332\332\203" \
+ "\377\377\377\1\376\376\376\243\377\377\377\2\265\265\267;;=\203::<\2" \
+ "99;;;=\202::<\1;;=\202::<\1;;=\202::<\4;;=::<FFF\332\332\332\203\377" \
+ "\377\377\1\376\376\376\202\377\377\377\1\376\376\376\242\377\377\377" \
+ "\1\377\377\375\204\377\377\377\1\376\377\377\231\377\377\377\202\377" \
+ "\376\377\202\377\377\377\4\377\377\375\377\377\377\376\377\377\375\377" \
+ "\376\230\377\377\377\203\377\377\375\202\377\377\377\2\376\376\376\376" \
+ "\377\377\231\377\377\377\1\376\376\376\202\376\377\377\13\377\376\374" \
+ "\377\376\377\376\376\374\376\377\377\377\377\377\376\377\377\377\377" \
+ "\377\377\377\375\376\376\376\377\377\377\377\376\377\222\377\377\377" \
+ "\202\377\377\375\5\377\377\377\376\377\377\377\377\377\377\377\375\376" \
+ "\377\377\251\377\377\377\202\377\377\375\3\377\374\377\375\377\376\376" \
+ "\377\377\202\377\377\377\25\370\373\364\243\322b\217\304@\212\306@\214" \
+ "\305@\215\305>\212\307>\212\306@\214\305B\214\305@\214\305B\214\306>" \
+ "\212\307>\212\310\77\214\306>\217\304@\214\306>\214\305@\242\322b\370" \
+ "\373\362\377\377\377\202\377\376\377\1\377\377\375\254\377\377\377\4" \
+ "\363\363\363SSU;;=99;\202;;=\1""99;\204::<\3;;=::<\235\235\237\377\377" \
+ "\377\377\334\377\377\377\1\376\376\376\202\377\377\377\2\363\363\363" \
+ "GGI\202::<\7;;=::<99;::<;;=::<;;=\202::<\2\266\266\266\376\376\376\204" \
+ "\377\377\377\202\376\376\376\202\377\377\377\1\376\376\376\236\377\377" \
+ "\377\3\376\376\376\265\265\267;;=\202::<\2;;=99;\205::<\1;;=\204::<\4" \
+ ";;=FFH\332\332\332\376\376\376\205\377\377\377\1\376\376\376\240\377" \
+ "\377\377\10\376\377\375\377\375\377\377\377\375\376\377\375\377\377\377" \
+ "\377\376\377\377\377\377\376\376\374\230\377\377\377\10\374\377\377\377" \
+ "\376\374\377\377\377\376\376\374\377\376\377\376\377\377\377\377\377" \
+ "\377\376\377\230\377\377\377\3\377\377\375\377\377\377\376\377\375\203" \
+ "\377\377\377\1\377\376\377\231\377\377\377\6\377\375\377\376\376\374" \
+ "\377\377\377\377\376\377\376\377\375\377\376\377\202\377\377\377\2\377" \
+ "\376\377\377\377\377\202\376\377\377\2\376\376\377\376\377\377\222\377" \
+ "\377\377\2\377\377\375\377\375\377\202\376\377\377\4\376\376\376\376" \
+ "\377\377\375\377\374\377\375\377\251\377\377\377\1\375\377\376\202\377" \
+ "\377\375\34\377\377\377\376\376\376\373\373\363\243\322b\211\307B\212" \
+ "\307<\215\305>\214\306>\212\307>\214\305@\217\304>\212\307<\214\306<" \
+ "\214\306>\215\307\77\213\307A\214\306>\215\305@\215\307\77\212\307>\244" \
+ "\317c\370\373\362\377\377\373\376\377\377\377\376\377\375\376\377\377" \
+ "\377\375\377\376\377\252\377\377\377\5\376\376\376\377\377\377\333\333" \
+ "\33399;;;=\202::<\5;;=99;;;=99;;;=\203::<\1\332\332\334\377\377\377\377" \
+ "\330\377\377\377\1\376\376\376\205\377\377\377\1xxx\202::<\1;;=\202:" \
+ ":<\1;;=\204::<\4:::xxx\376\376\376\377\377\377\202\376\376\376\205\377" \
+ "\377\377\3\376\376\376\377\377\377\376\376\376\237\377\377\377\1\265" \
+ "\265\265\204::<\6;;=::<;;=::<;;=::<\202;;=\203::<\4;;=FFH\333\333\333" \
+ "\376\376\376\202\377\377\377\1\376\376\376\242\377\377\377\7\376\376" \
+ "\376\377\376\377\326\352\267\247\324o\247\324m\252\324r\247\324o\231" \
+ "\252\324p\10\323\353\271\377\376\377\377\377\377\376\377\377\350\365" \
+ "\333\253\323p\250\324r\251\324k\230\252\324p\10\250\325n\252\324p\277" \
+ "\337\223\376\377\377\377\377\377\375\377\376\376\377\377\276\336\222" \
+ "\230\252\324p\7\250\325p\250\324r\247\324o\253\324n\251\323m\346\364" \
+ "\332\377\376\377\202\377\377\377\7\323\352\266\253\323p\251\323m\253" \
+ "\323r\251\323o\247\324m\252\324r\220\252\324p\10\252\324n\253\324n\247" \
+ "\324k\252\324p\254\325o\247\324m\252\324p\324\353\267\250\377\377\377" \
+ "\3\377\376\377\377\377\377\375\377\376\202\377\377\377\11\373\373\363" \
+ "\241\321d\214\306>\213\310=\214\306>\214\305@\213\310=\212\306@\217\304" \
+ ">\202\215\307=\14\214\306>\215\305>\214\306>\215\305>\217\304@\215\307" \
+ "\77\215\307=\242\320c\367\375\361\376\376\377\377\376\377\376\376\376" \
+ "\202\377\377\375\2\374\377\377\377\376\377\254\377\377\377\2\376\376" \
+ "\376\251\251\251\202::<\5;;=::<;;=99;;;=\204::<\1``b\377\377\377\377" \
+ "\334\377\377\377\3\376\376\376\301\301\301:::\205::<\1""99;\202::<\4" \
+ ";;=::<SSS\362\362\362\207\377\377\377\1\376\376\376\202\377\377\377\202" \
+ "\376\376\376\240\377\377\377\1\265\265\267\203::<\2""99;;;=\203::<\1" \
+ ";;=\202::<\202;;=\203::<\2FFH\332\332\332\245\377\377\377\10\376\377" \
+ "\377\377\377\377\305\342\237\215\306A\215\307\77\215\305@\213\310=\214" \
+ "\305@\230\214\306>\10\304\341\237\377\374\377\377\376\377\377\377\377" \
+ "\341\362\322\215\305>\212\307>\215\305>\230\214\306>\4\215\305<\214\305" \
+ "@\252\324r\376\377\377\202\377\377\377\2\377\377\375\250\324r\230\214" \
+ "\306>\20\215\307\77\214\306>\214\306<\214\305B\212\307>\337\363\320\377" \
+ "\376\377\376\377\377\376\376\374\305\342\240\214\305@\213\310=\215\305" \
+ "@\214\306>\212\307<\214\305@\220\214\306>\10\214\305@\215\306C\212\307" \
+ "<\214\306>\215\305>\212\306@\215\305>\304\343\237\250\377\377\377\1\377" \
+ "\377\375\202\377\377\377\32\377\376\377\370\373\364\243\322b\214\306" \
+ ">\213\310\77\214\305@\215\305>\215\305@\214\306>\214\305B\212\307<\215" \
+ "\307=\214\305B\214\306>\215\306A\212\306@\212\307>\214\306>\212\307<" \
+ "\244\317c\370\373\364\377\377\377\377\375\376\377\377\375\376\377\377" \
+ "\377\377\377\202\377\376\377\257\377\377\377\1kkm\202::<\2;;=::<\202" \
+ ";;=\3::<;;=::<\202;;=\1\233\233\233\377\377\377\377\330\377\377\377\1" \
+ "\376\376\376\202\377\377\377\3\364\364\366FFH;;=\205::<\3;;=::<;;=\202" \
+ "::<\1\316\316\316\256\377\377\377\2\265\265\265;;=\203::<\1;;=\205::" \
+ "<\1;;=\204::<\3;;=FFH\332\332\332\206\377\377\377\3\376\376\376\377\377" \
+ "\377\376\376\376\235\377\377\377\1\304\343\240\235\214\306>\1\305\342" \
+ "\237\203\377\377\377\1\342\362\316\235\214\306>\1\250\325p\204\377\377" \
+ "\377\1\252\324p\234\214\306>\2\215\307\77\342\362\316\203\377\377\377" \
+ "\3\305\342\237\214\305@\215\305>\202\214\306>\1\214\305@\222\214\306" \
+ ">\1\214\305@\205\214\306>\1\305\342\237\241\377\377\377\10\376\376\377" \
+ "\377\377\375\377\377\377\377\377\375\377\377\377\377\376\377\377\377" \
+ "\375\376\377\377\202\377\377\377\6\370\373\362\243\322b\211\307B\213" \
+ "\310=\214\305@\214\306<\202\215\305@\4\214\306<\214\305@\214\306<\215" \
+ "\307\77\202\214\306>\6\212\307>\214\306>\215\307\77\214\305@\244\317" \
+ "c\367\375\361\267\377\377\377\2\363\363\363FFF\204::<\1;;=\203::<\4:" \
+ "9>::<;;=\332\332\332\377\377\377\377\332\377\377\377\1yy{\202::<\2""9" \
+ "9;;;=\202::<\6;;=99;::<;;=::<\234\234\236\260\377\377\377\12\265\265" \
+ "\267;;=::<;;=99;;;=::<;;=::<;;=\202::<\1;;=\203::<\3;;=FFF\332\332\332" \
+ "\206\377\377\377\1\376\376\376\236\377\377\377\1\304\343\240\235\214" \
+ "\306>\1\305\342\237\203\377\377\377\1\342\362\316\235\214\306>\1\250" \
+ "\325p\204\377\377\377\1\252\324p\234\214\306>\2\215\307\77\342\362\316" \
+ "\203\377\377\377\3\305\342\237\214\305@\215\305>\202\214\306>\1\214\305" \
+ "@\222\214\306>\1\214\305@\205\214\306>\1\305\342\237\240\377\377\377" \
+ "\6\376\376\377\377\376\377\375\376\377\376\377\377\377\377\375\375\377" \
+ "\376\203\377\377\377\27\377\377\375\372\373\366\241\321a\217\304@\212" \
+ "\307<\214\306>\215\305>\215\305@\213\310=\212\306@\214\306>\214\305B" \
+ "\215\307\77\215\305>\215\306A\212\307>\214\306>\215\307\77\214\306>\242" \
+ "\322b\370\373\362\376\376\377\377\375\376\267\377\377\377\1\301\301\301" \
+ "\205::<\3;;=::<;;=\202::<\2""99;```\377\377\377\377\331\377\377\377\1" \
+ "\301\301\301\202::<\1;;=\203::<\1;;=\202::<\3<<>::<__a\261\377\377\377" \
+ "\7\376\376\376\265\265\265;;=::<;;=::<;;=\203::<\1;;=\203::<\1;;=\203" \
+ "::<\2GGI\332\332\332\203\377\377\377\1\376\376\376\240\377\377\377\1" \
+ "\304\343\240\235\214\306>\1\305\342\237\203\377\377\377\1\342\362\316" \
+ "\235\214\306>\1\250\325p\204\377\377\377\1\252\324p\234\214\306>\2\215" \
+ "\307\77\342\362\316\203\377\377\377\3\305\342\237\214\305@\215\305>\202" \
+ "\214\306>\1\214\305@\222\214\306>\1\214\305@\205\214\306>\1\305\342\237" \
+ "\240\377\377\377\7\377\377\375\375\376\377\376\377\377\376\377\375\377" \
+ "\374\377\377\377\375\375\377\376\202\377\377\377\5\372\373\366\240\320" \
+ "b\215\307\77\212\306@\215\305>\202\214\305@\20\215\305@\212\306@\214" \
+ "\305D\216\306\77\214\306>\215\307\77\214\306>\212\306@\214\306>\215\307" \
+ "\77\215\305@\242\320c\370\373\362\377\377\373\377\376\377\377\377\375" \
+ "\270\377\377\377\3\204\204\204::<;;=\206::<\4;;=::<;;=\234\234\236\377" \
+ "\377\377\377\325\377\377\377\4\376\376\376\377\377\377\363\363\363SS" \
+ "U\211::<\4""99;::<\332\332\334\376\376\376\202\377\377\377\1\376\376" \
+ "\376\257\377\377\377\2\264\264\264;;=\202::<\2""99;;;=\202::<\3""99;" \
+ ";;=::<\202;;=\202::<\4;;=::<GGI\332\332\332\210\377\377\377\1\376\376" \
+ "\376\232\377\377\377\1\304\343\240\235\214\306>\1\305\342\237\203\377" \
+ "\377\377\1\342\362\316\235\214\306>\1\250\325p\204\377\377\377\1\252" \
+ "\324p\234\214\306>\2\215\307\77\342\362\316\203\377\377\377\3\305\342" \
+ "\237\214\305@\215\305>\202\214\306>\1\214\305@\222\214\306>\1\214\305" \
+ "@\205\214\306>\1\305\342\237\241\377\377\377\37\376\377\377\376\377\375" \
+ "\377\375\376\375\377\376\377\377\375\377\377\377\377\376\377\370\373" \
+ "\362\241\321a\215\307\77\215\307=\214\305@\214\306>\212\307<\214\306" \
+ ">\214\306<\214\306>\216\306\77\215\305<\212\307>\213\307A\215\305>\212" \
+ "\307>\215\307\77\214\306>\242\321a\373\374\364\377\377\377\376\377\377" \
+ "\376\376\376\376\377\377\270\377\377\377\3\363\363\363TTT;;=\202::<\1" \
+ ";;=\203::<\5""99;;;=::<;;=\332\332\332\377\377\377\377\323\377\377\377" \
+ "\1\376\376\376\202\377\377\377\4\221\221\221;;=99;;;=\202::<\1;;=\202" \
+ "::<\1;;=\202::<\1\233\233\233\202\377\377\377\1\376\376\376\262\377\377" \
+ "\377\2\265\265\267;;=\203::<\2""99;;;=\202::<\1;;=\202::<\1;;=\202::" \
+ "<\4;;=::<FFF\332\332\332\203\377\377\377\1\376\376\376\202\377\377\377" \
+ "\1\376\376\376\233\377\377\377\1\304\343\240\235\214\306>\1\305\342\237" \
+ "\203\377\377\377\1\342\362\316\235\214\306>\1\250\325p\204\377\377\377" \
+ "\1\252\324p\234\214\306>\2\215\307\77\342\362\316\203\377\377\377\3\305" \
+ "\342\237\214\305@\215\305>\202\214\306>\1\214\305@\222\214\306>\1\214" \
+ "\305@\205\214\306>\1\305\342\237\240\377\377\377\202\377\377\375\3\377" \
+ "\374\377\375\377\376\376\377\377\202\377\377\377\25\370\373\364\243\322" \
+ "b\217\304@\212\306@\214\305@\215\305>\212\307>\212\306@\214\305B\214" \
+ "\305@\214\305B\214\306>\212\307>\212\310\77\214\306>\217\304@\214\306" \
+ ">\214\305@\242\322b\370\373\362\377\377\377\202\377\376\377\1\377\377" \
+ "\375\272\377\377\377\7\316\316\316::<;;=::<99;::<;;=\205::<\1kkm\377" \
+ "\377\377\377\325\377\377\377\1\315\315\315\206::<\6""99;::<99;;;=::<" \
+ "```\206\377\377\377\1\376\376\376\257\377\377\377\3\376\376\376\265\265" \
+ "\267;;=\202::<\2;;=99;\205::<\1;;=\204::<\4;;=FFH\332\332\332\376\376" \
+ "\376\205\377\377\377\1\376\376\376\232\377\377\377\1\304\343\240\235" \
+ "\214\306>\1\305\342\237\203\377\377\377\1\342\362\316\235\214\306>\1" \
+ "\250\325p\204\377\377\377\1\252\324p\234\214\306>\2\215\307\77\342\362" \
+ "\316\203\377\377\377\3\305\342\237\214\305@\215\305>\202\214\306>\1\214" \
+ "\305@\222\214\306>\1\214\305@\205\214\306>\1\305\342\237\241\377\377" \
+ "\377\1\375\377\376\202\377\377\375\34\377\377\377\376\376\376\373\373" \
+ "\363\243\322b\211\307B\212\307<\215\305>\214\306>\212\307>\214\305@\217" \
+ "\304>\212\307<\214\306<\214\306>\215\307\77\213\307A\214\306>\215\305" \
+ "@\215\307\77\212\307>\244\317c\370\373\362\377\377\373\376\377\377\377" \
+ "\376\377\375\376\377\377\377\375\377\376\377\272\377\377\377\2\222\222" \
+ "\22299;\205::<\1;;=\203::<\2;;=\250\250\250\377\377\377\377\324\377\377" \
+ "\377\4```;;=99;;;=\204::<\5;;=::<;;=::<\331\331\331\207\377\377\377\1" \
+ "\376\376\376\260\377\377\377\1\265\265\265\204::<\6;;=::<;;=::<;;=::" \
+ "<\202;;=\203::<\4;;=FFH\333\333\333\376\376\376\202\377\377\377\1\376" \
+ "\376\376\234\377\377\377\1\304\343\240\235\214\306>\1\305\342\237\203" \
+ "\377\377\377\1\342\362\316\235\214\306>\1\250\325p\204\377\377\377\1" \
+ "\252\324p\234\214\306>\2\215\307\77\342\362\316\203\377\377\377\3\305" \
+ "\342\237\214\305@\215\305>\202\214\306>\1\214\305@\222\214\306>\1\214" \
+ "\305@\205\214\306>\1\305\342\237\240\377\377\377\3\377\376\377\377\377" \
+ "\377\375\377\376\202\377\377\377\11\373\373\363\241\321d\214\306>\213" \
+ "\310=\214\306>\214\305@\213\310=\212\306@\217\304>\202\215\307=\14\214" \
+ "\306>\215\305>\214\306>\215\305>\217\304@\215\307\77\215\307=\242\320" \
+ "c\367\375\361\376\376\377\377\376\377\376\376\376\202\377\377\375\2\374" \
+ "\377\377\377\376\377\262\377\377\377\2\376\376\376\377\377\377\202\376" \
+ "\376\376\204\377\377\377\5\363\363\363SSU99;::<;;=\207::<\2GGG\363\363" \
+ "\363\377\377\377\377\322\377\377\377\4\234\234\234:::::<;;=\202::<\1" \
+ ";;=\203::<\202;;=\1\234\234\236\207\377\377\377\1\376\376\376\262\377" \
+ "\377\377\1\265\265\267\203::<\2""99;;;=\203::<\1;;=\202::<\202;;=\203" \
+ "::<\2FFH\332\332\332\237\377\377\377\1\304\343\240\235\214\306>\1\305" \
+ "\342\237\203\377\377\377\1\342\362\316\235\214\306>\1\250\325p\204\377" \
+ "\377\377\1\252\324p\234\214\306>\2\215\307\77\342\362\316\203\377\377" \
+ "\377\3\305\342\237\214\305@\215\305>\202\214\306>\1\214\305@\222\214" \
+ "\306>\1\214\305@\205\214\306>\1\305\342\237\240\377\377\377\1\377\377" \
+ "\375\202\377\377\377\32\377\376\377\370\373\364\243\322b\214\306>\213" \
+ "\310\77\214\305@\215\305>\215\305@\214\306>\214\305B\212\307<\215\307" \
+ "=\214\305B\214\306>\215\306A\212\306@\212\307>\214\306>\212\307<\244" \
+ "\317c\370\373\364\377\377\377\377\375\376\377\377\375\376\377\377\377" \
+ "\377\377\202\377\376\377\273\377\377\377\2\376\376\376\316\316\316\206" \
+ "::<\202;;=\4::<;;=::<xxx\377\377\377\377\321\377\377\377\2\346\346\350" \
+ "FFH\203::<\1;;=\206::<\1__a\202\377\377\377\1\377\377\375\271\377\377" \
+ "\377\2\265\265\265;;=\203::<\1;;=\205::<\1;;=\203::<\4;;=::<GGI\331\331" \
+ "\331\236\377\377\377\1\304\343\240\235\214\306>\1\305\342\237\203\377" \
+ "\377\377\1\342\362\316\235\214\306>\1\250\325p\204\377\377\377\1\252" \
+ "\324p\234\214\306>\2\215\307\77\342\362\316\203\377\377\377\3\305\342" \
+ "\237\214\305@\215\305>\202\214\306>\1\214\305@\222\214\306>\1\214\305" \
+ "@\205\214\306>\1\305\342\237\231\377\377\377\10\376\376\377\377\377\375" \
+ "\377\377\377\377\377\375\377\377\377\377\376\377\377\377\375\376\377" \
+ "\377\202\377\377\377\6\370\373\362\243\322b\211\307B\213\310=\214\305" \
+ "@\214\306<\202\215\305@\4\214\306<\214\305@\214\306<\215\307\77\202\214" \
+ "\306>\6\212\307>\214\306>\215\307\77\214\305@\244\317c\367\375\361\305" \
+ "\377\377\377\2xxz;;=\203::<\3;;=::<;;=\203::<\2;;=\315\315\315\377\377" \
+ "\377\377\313\377\377\377\203\376\376\376\202\377\377\377\3xxz;;=::<\202" \
+ ";;=\1""99;\202;;=\202::<\4;;=::<\333\333\335\376\376\376\274\377\377" \
+ "\377\12\265\265\267;;=::<;;=99;;;=::<;;=::<;;=\202::<\1;;=\202::<\4;" \
+ ";=99;GGI\332\332\332\235\377\377\377\1\304\343\240\235\214\306>\1\305" \
+ "\342\237\203\377\377\377\1\342\362\316\235\214\306>\1\250\325p\204\377" \
+ "\377\377\1\252\324p\234\214\306>\2\215\307\77\342\362\316\203\377\377" \
+ "\377\3\305\342\237\214\305@\215\305>\202\214\306>\1\214\305@\222\214" \
+ "\306>\1\214\305@\205\214\306>\1\305\342\237\230\377\377\377\6\376\376" \
+ "\377\377\376\377\375\376\377\376\377\377\377\377\375\375\377\376\203" \
+ "\377\377\377\27\377\377\375\372\373\366\241\321a\217\304@\212\307<\214" \
+ "\306>\215\305>\215\305@\213\310=\212\306@\214\306>\214\305B\215\307\77" \
+ "\215\305>\215\306A\212\307>\214\306>\215\307\77\214\306>\242\322b\370" \
+ "\373\362\376\376\377\377\375\376\304\377\377\377\2\364\364\364FFH\203" \
+ "::<\2""99;;;=\203::<\4<<>99;TTT\376\376\376\377\377\377\377\310\377\377" \
+ "\377\1\376\376\376\205\377\377\377\3\316\316\316::<99;\206::<\1;;=\202" \
+ "::<\1\221\221\221\203\377\377\377\1\376\376\376\272\377\377\377\7\376" \
+ "\376\376\265\265\265;;=::<;;=::<;;=\203::<\1;;=\203::<\6;;=::<;;=::<" \
+ "FFH\332\332\332\234\377\377\377\1\304\343\240\235\214\306>\1\305\342" \
+ "\237\203\377\377\377\1\342\362\316\235\214\306>\1\250\325p\204\377\377" \
+ "\377\1\252\324p\234\214\306>\2\215\307\77\342\362\316\203\377\377\377" \
+ "\3\305\342\237\214\305@\215\305>\202\214\306>\1\214\305@\222\214\306" \
+ ">\1\214\305@\205\214\306>\1\305\342\237\230\377\377\377\7\377\377\375" \
+ "\375\376\377\376\377\377\376\377\375\377\374\377\377\377\375\375\377" \
+ "\376\202\377\377\377\5\372\373\366\240\320b\215\307\77\212\306@\215\305" \
+ ">\202\214\305@\20\215\305@\212\306@\214\305D\216\306\77\214\306>\215" \
+ "\307\77\214\306>\212\306@\214\306>\215\307\77\215\305@\242\320c\370\373" \
+ "\362\377\377\373\377\376\377\377\377\375\304\377\377\377\3\376\376\376" \
+ "\265\265\267;;=\204::<\1""99;\203::<\3;;=::<\234\234\234\203\377\377" \
+ "\377\1\376\376\376\377\377\377\377\306\377\377\377\7\376\376\376\377" \
+ "\377\377\376\376\376\377\377\377__a::<;;=\203::<\7;;=::<;;=::<;;=SSU" \
+ "\363\363\363\300\377\377\377\2\264\264\264;;=\202::<\2""99;;;=\202::" \
+ "<\3""99;;;=::<\202;;=\204::<\2FFH\332\332\332\233\377\377\377\1\304\343" \
+ "\240\235\214\306>\1\305\342\237\203\377\377\377\1\342\362\316\235\214" \
+ "\306>\1\250\325p\204\377\377\377\1\252\324p\234\214\306>\2\215\307\77" \
+ "\342\362\316\203\377\377\377\3\305\342\237\214\305@\215\305>\202\214" \
+ "\306>\1\214\305@\222\214\306>\1\214\305@\205\214\306>\1\305\342\237\231" \
+ "\377\377\377\37\376\377\377\376\377\375\377\375\376\375\377\376\377\377" \
+ "\375\377\377\377\377\376\377\370\373\362\241\321a\215\307\77\215\307" \
+ "=\214\305@\214\306>\212\307<\214\306>\214\306<\214\306>\216\306\77\215" \
+ "\305<\212\307>\213\307A\215\305>\212\307>\215\307\77\214\306>\242\321" \
+ "a\373\374\364\377\377\377\376\377\377\376\376\376\376\377\377\301\377" \
+ "\377\377\1\376\376\376\204\377\377\377\2kkm99;\203::<\202;;=\1""99;\203" \
+ "::<\2FFH\363\363\363\377\377\377\377\310\377\377\377\1\376\376\376\203" \
+ "\377\377\377\3\250\250\252::<;;=\203::<\1;;=\202::<\5;;=::<;;=\301\301" \
+ "\301\376\376\376\301\377\377\377\2\265\265\267;;=\203::<\2""99;;;=\202" \
+ "::<\1;;=\202::<\2;;=::<\202;;=\3::<GGI\332\332\332\232\377\377\377\1" \
+ "\304\343\240\235\214\306>\1\305\342\237\203\377\377\377\1\342\362\316" \
+ "\235\214\306>\1\250\325p\204\377\377\377\1\252\324p\234\214\306>\2\215" \
+ "\307\77\342\362\316\203\377\377\377\3\305\342\237\214\305@\215\305>\202" \
+ "\214\306>\1\214\305@\222\214\306>\1\214\305@\205\214\306>\1\305\342\237" \
+ "\230\377\377\377\202\377\377\375\3\377\374\377\375\377\376\376\377\377" \
+ "\202\377\377\377\25\370\373\364\243\322b\217\304@\212\306@\214\305@\215" \
+ "\305>\212\307>\212\306@\214\305B\214\305@\214\305B\214\306>\212\307>" \
+ "\212\310\77\214\306>\217\304@\214\306>\214\305@\242\322b\370\373\362" \
+ "\377\377\377\202\377\376\377\1\377\377\375\301\377\377\377\1\376\376" \
+ "\376\204\377\377\377\2\376\376\376\346\346\350\203::<\4;;=99;::<;;=\204" \
+ "::<\3\203\203\203\377\377\377\376\376\376\377\377\377\377\311\377\377" \
+ "\377\2\364\364\364FFH\202::<\5;;=::<;;=::<;;=\202::<\2;;=kkm\202\377" \
+ "\377\377\1\376\376\376\300\377\377\377\3\376\376\376\265\265\267;;=\202" \
+ "::<\2;;=99;\204::<\3;;=99;;;=\202::<\3;;=::<\265\265\265\232\377\377" \
+ "\377\1\304\343\240\235\214\306>\1\305\342\237\203\377\377\377\1\342\362" \
+ "\316\235\214\306>\1\250\325p\204\377\377\377\1\252\324p\234\214\306>" \
+ "\2\215\307\77\342\362\316\203\377\377\377\3\305\342\237\214\305@\215" \
+ "\305>\202\214\306>\1\214\305@\222\214\306>\1\214\305@\205\214\306>\1" \
+ "\305\342\237\231\377\377\377\1\375\377\376\202\377\377\375\34\377\377" \
+ "\377\376\376\376\373\373\363\243\322b\211\307B\212\307<\215\305>\214" \
+ "\306>\212\307>\214\305@\217\304>\212\307<\214\306<\214\306>\215\307\77" \
+ "\213\307A\214\306>\215\305@\215\307\77\212\307>\244\317c\370\373\362" \
+ "\377\377\373\376\377\377\377\376\377\375\376\377\377\377\375\377\376" \
+ "\377\301\377\377\377\202\376\376\376\2\377\377\377\376\376\376\202\377" \
+ "\377\377\1\234\234\236\203::<\1;;=\206::<\2;;=\331\331\331\377\377\377" \
+ "\377\306\377\377\377\1\376\376\376\203\377\377\377\4\233\233\233;;=:" \
+ ":<;;=\202::<\3;;=99;;;=\203::<\1\346\346\350\305\377\377\377\1\265\265" \
+ "\265\204::<\3;;=::<;;=\203::<\5;;=99;;;=::<\265\265\267\233\377\377\377" \
+ "\1\304\343\240\235\214\306>\1\305\342\237\203\377\377\377\1\342\362\316" \
+ "\235\214\306>\1\250\325p\204\377\377\377\1\252\324p\234\214\306>\2\215" \
+ "\307\77\342\362\316\203\377\377\377\3\305\342\237\214\305@\215\305>\202" \
+ "\214\306>\1\214\305@\222\214\306>\1\214\305@\205\214\306>\1\305\342\237" \
+ "\230\377\377\377\3\377\376\377\377\377\377\375\377\376\202\377\377\377" \
+ "\11\373\373\363\241\321d\214\306>\213\310=\214\306>\214\305@\213\310" \
+ "=\212\306@\217\304>\202\215\307=\14\214\306>\215\305>\214\306>\215\305" \
+ ">\217\304@\215\307\77\215\307=\242\320c\367\375\361\376\376\377\377\376" \
+ "\377\376\376\376\202\377\377\375\2\374\377\377\377\376\377\301\377\377" \
+ "\377\1\376\376\376\202\377\377\377\1\376\376\376\202\377\377\377\6\364" \
+ "\364\364SSU::<;;=::<;;=\205::<\4""99;kkk\377\377\377\376\376\376\377" \
+ "\377\377\377\307\377\377\377\2\346\346\346;;;\204::<\3;;=99;;;=\203:" \
+ ":<\1\234\234\236\205\377\377\377\1\376\376\376\301\377\377\377\1\265" \
+ "\265\267\203::<\2""99;;;=\202::<\1;;;\204::<\1\265\265\267\234\377\377" \
+ "\377\1\304\343\240\235\214\306>\1\305\342\237\203\377\377\377\1\342\362" \
+ "\316\235\214\306>\1\250\325p\204\377\377\377\1\252\324p\234\214\306>" \
+ "\2\215\307\77\342\362\316\203\377\377\377\3\305\342\237\214\305@\215" \
+ "\305>\202\214\306>\1\214\305@\222\214\306>\1\214\305@\205\214\306>\1" \
+ "\305\342\237\230\377\377\377\1\377\377\375\202\377\377\377\32\377\376" \
+ "\377\370\373\364\243\322b\214\306>\213\310\77\214\305@\215\305>\215\305" \
+ "@\214\306>\214\305B\212\307<\215\307=\214\305B\214\306>\215\306A\212" \
+ "\306@\212\307>\214\306>\212\307<\244\317c\370\373\364\377\377\377\377" \
+ "\375\376\377\377\375\376\377\377\377\377\377\202\377\376\377\306\377" \
+ "\377\377\1\376\376\376\202\377\377\377\2\301\301\303::<\202;;=\11::<" \
+ ";;=::<;;=::<99;;;=::<\301\301\301\377\377\377\377\306\377\377\377\12" \
+ "\376\376\376\377\377\377\204\204\204;;=::<:9>;;=::<99;;;=\203::<\5SS" \
+ "U\363\363\363\376\376\376\377\377\377\376\376\376\305\377\377\377\5\265" \
+ "\265\26599;;;=::<;;=\206::<\1\266\266\270\235\377\377\377\1\304\343\240" \
+ "\235\214\306>\1\305\342\237\203\377\377\377\1\342\362\316\235\214\306" \
+ ">\1\250\325p\204\377\377\377\1\252\324p\234\214\306>\2\215\307\77\342" \
+ "\362\316\203\377\377\377\3\305\342\237\214\305@\215\305>\202\214\306" \
+ ">\1\214\305@\222\214\306>\1\214\305@\205\214\306>\1\305\342\237\221\377" \
+ "\377\377\10\376\376\377\377\377\375\377\377\377\377\377\375\377\377\377" \
+ "\377\376\377\377\377\375\376\377\377\202\377\377\377\6\370\373\362\243" \
+ "\322b\211\307B\213\310=\214\305@\214\306<\202\215\305@\4\214\306<\214" \
+ "\305@\214\306<\215\307\77\202\214\306>\6\212\307>\214\306>\215\307\77" \
+ "\214\305@\244\317c\367\375\361\322\377\377\377\1kkk\203::<\4;;=99;::" \
+ "<;;=\203::<\1SSU\210\377\377\377\1\376\376\376\377\377\377\377\276\377" \
+ "\377\377\1\316\316\316\202::<\1;;=\202::<\202;;=\202::<\4;;=::<\265\265" \
+ "\267\376\376\376\307\377\377\377\3\376\376\376\377\377\377\265\265\267" \
+ "\207::<\3""99;\266\266\270\376\376\377\202\377\377\377\1\376\376\376" \
+ "\232\377\377\377\1\304\343\240\235\214\306>\1\305\342\237\203\377\377" \
+ "\377\1\342\362\316\235\214\306>\1\250\325p\204\377\377\377\1\252\324" \
+ "p\234\214\306>\2\215\307\77\342\362\316\203\377\377\377\3\305\342\237" \
+ "\214\305@\215\305>\202\214\306>\1\214\305@\222\214\306>\1\214\305@\205" \
+ "\214\306>\1\305\342\237\220\377\377\377\6\376\376\377\377\376\377\375" \
+ "\376\377\376\377\377\377\377\375\375\377\376\203\377\377\377\27\377\377" \
+ "\375\372\373\366\241\321a\217\304@\212\307<\214\306>\215\305>\215\305" \
+ "@\213\310=\212\306@\214\306>\214\305B\215\307\77\215\305>\215\306A\212" \
+ "\307>\214\306>\215\307\77\214\306>\242\322b\370\373\362\376\376\377\377" \
+ "\375\376\321\377\377\377\1\346\346\346\204::<\1;;=\202::<\5;;=99;;;=" \
+ "::<\266\266\266\205\377\377\377\202\376\376\376\2\377\377\377\376\376" \
+ "\376\377\377\377\377\273\377\377\377\5\376\376\376\377\377\377kkm::<" \
+ ";;=\202::<\1;;=\203::<\3;;=::<kkm\203\377\377\377\1\376\376\376\306\377" \
+ "\377\377\4\376\376\376\377\377\377\265\265\265::<\202;;=\202::<\2""9" \
+ "9;\266\266\270\237\377\377\377\1\304\343\240\235\214\306>\1\305\342\237" \
+ "\203\377\377\377\1\342\362\316\235\214\306>\1\250\325p\204\377\377\377" \
+ "\1\252\324p\234\214\306>\2\215\307\77\342\362\316\203\377\377\377\3\305" \
+ "\342\237\214\305@\215\305>\202\214\306>\1\214\305@\222\214\306>\1\214" \
+ "\305@\205\214\306>\1\305\342\237\220\377\377\377\7\377\377\375\375\376" \
+ "\377\376\377\377\376\377\375\377\374\377\377\377\375\375\377\376\202" \
+ "\377\377\377\5\372\373\366\240\320b\215\307\77\212\306@\215\305>\202" \
+ "\214\305@\20\215\305@\212\306@\214\305D\216\306\77\214\306>\215\307\77" \
+ "\214\306>\212\306@\214\306>\215\307\77\215\305@\242\320c\370\373\362" \
+ "\377\377\373\377\376\377\377\377\375\322\377\377\377\1\221\221\223\202" \
+ "::<\12;;=99;::<;;=::<;;=99;;;=EEG\364\364\364\203\377\377\377\1\376\376" \
+ "\376\202\377\377\377\1\376\376\376\377\377\377\377\275\377\377\377\2" \
+ "\316\316\320;;=\205::<\2""99;;;=\203::<\3\316\316\316\377\377\377\376" \
+ "\376\376\313\377\377\377\3\265\265\265;;=99;\202::<\1\266\266\270\203" \
+ "\377\377\377\3\376\376\376\377\377\377\376\376\376\232\377\377\377\1" \
+ "\304\343\240\235\214\306>\1\305\342\237\203\377\377\377\1\342\362\316" \
+ "\235\214\306>\1\250\325p\204\377\377\377\1\252\324p\234\214\306>\2\215" \
+ "\307\77\342\362\316\203\377\377\377\3\305\342\237\214\305@\215\305>\202" \
+ "\214\306>\1\214\305@\222\214\306>\1\214\305@\205\214\306>\1\305\342\237" \
+ "\221\377\377\377\37\376\377\377\376\377\375\377\375\376\375\377\376\377" \
+ "\377\375\377\377\377\377\376\377\370\373\362\241\321a\215\307\77\215" \
+ "\307=\214\305@\214\306>\212\307<\214\306>\214\306<\214\306>\216\306\77" \
+ "\215\305<\212\307>\213\307A\215\305>\212\307>\215\307\77\214\306>\242" \
+ "\321a\373\374\364\377\377\377\376\377\377\376\376\376\376\377\377\322" \
+ "\377\377\377\2\363\363\363FFH\203::<\202;;=\203::<\3;;=::<\235\235\235" \
+ "\204\377\377\377\1\376\376\376\377\377\377\377\277\377\377\377\1__a\202" \
+ "::<\1;;=\203::<\5;;=::<;;=::<\204\204\206\312\377\377\377\1\376\376\376" \
+ "\202\377\377\377\7\376\376\376\377\377\377\265\265\267;;=99;\266\266" \
+ "\270\376\376\377\203\377\377\377\202\376\376\376\233\377\377\377\1\304" \
+ "\343\240\235\214\306>\1\305\342\237\203\377\377\377\1\342\362\316\235" \
+ "\214\306>\1\250\325p\204\377\377\377\1\252\324p\234\214\306>\2\215\307" \
+ "\77\342\362\316\203\377\377\377\3\305\342\237\214\305@\215\305>\202\214" \
+ "\306>\1\214\305@\222\214\306>\1\214\305@\205\214\306>\1\305\342\237\220" \
+ "\377\377\377\202\377\377\375\3\377\374\377\375\377\376\376\377\377\202" \
+ "\377\377\377\25\370\373\364\243\322b\217\304@\212\306@\214\305@\215\305" \
+ ">\212\307>\212\306@\214\305B\214\305@\214\305B\214\306>\212\307>\212" \
+ "\310\77\214\306>\217\304@\214\306>\214\305@\242\322b\370\373\362\377" \
+ "\377\377\202\377\376\377\1\377\377\375\324\377\377\377\4\234\234\234" \
+ ";;=::<<<>\204::<\1;;=\202::<\2FFH\363\363\363\204\377\377\377\1\376\376" \
+ "\376\202\377\377\377\1\376\376\376\377\377\377\377\272\377\377\377\1" \
+ "\265\265\265\202::<\5;;=99;::<;;=::<\202;;=\3""99;;;=\346\346\346\320" \
+ "\377\377\377\2\264\264\266\265\265\267\203\377\377\377\202\376\376\376" \
+ "\235\377\377\377\1\304\343\240\235\214\306>\1\305\342\237\203\377\377" \
+ "\377\1\342\362\316\235\214\306>\1\250\325p\204\377\377\377\1\252\324" \
+ "p\234\214\306>\2\215\307\77\342\362\316\203\377\377\377\3\305\342\237" \
+ "\214\305@\215\305>\202\214\306>\1\214\305@\222\214\306>\1\214\305@\205" \
+ "\214\306>\1\305\342\237\221\377\377\377\1\375\377\376\202\377\377\375" \
+ "\34\377\377\377\376\376\376\373\373\363\243\322b\211\307B\212\307<\215" \
+ "\305>\214\306>\212\307>\214\305@\217\304>\212\307<\214\306<\214\306>" \
+ "\215\307\77\213\307A\214\306>\215\305@\215\307\77\212\307>\244\317c\370" \
+ "\373\362\377\377\373\376\377\377\377\376\377\375\376\377\377\377\375" \
+ "\377\376\377\320\377\377\377\1\376\376\376\203\377\377\377\2SSU;;=\203" \
+ "::<\1;;=\203::<\3""99;::<\234\234\236\203\377\377\377\1\376\376\376\377" \
+ "\377\377\377\276\377\377\377\5RRT99;;;=99;;;=\203::<\4""99;;;=::<\234" \
+ "\234\236\314\377\377\377\1\376\376\376\212\377\377\377\1\376\376\376" \
+ "\235\377\377\377\1\304\343\240\235\214\306>\1\305\342\237\203\377\377" \
+ "\377\1\342\362\316\235\214\306>\1\250\325p\204\377\377\377\1\252\324" \
+ "p\234\214\306>\2\215\307\77\342\362\316\203\377\377\377\3\305\342\237" \
+ "\214\305@\215\305>\202\214\306>\1\214\305@\222\214\306>\1\214\305@\205" \
+ "\214\306>\1\305\342\237\220\377\377\377\3\377\376\377\377\377\377\375" \
+ "\377\376\202\377\377\377\11\373\373\363\241\321d\214\306>\213\310=\214" \
+ "\306>\214\305@\213\310=\212\306@\217\304>\202\215\307=\14\214\306>\215" \
+ "\305>\214\306>\215\305>\217\304@\215\307\77\215\307=\242\320c\367\375" \
+ "\361\376\376\377\377\376\377\376\376\376\202\377\377\375\2\374\377\377" \
+ "\377\376\377\324\377\377\377\3\265\265\265;;=99;\202;;=\1""99;\202;;" \
+ "=\5::<;;=::<GGI\363\363\363\206\377\377\377\1\376\376\376\377\377\377" \
+ "\377\271\377\377\377\2\266\266\270;;=\202::<\1;;=\202::<\6;;=::<;;=:" \
+ ":<FFH\363\363\363\324\377\377\377\3\376\376\376\377\377\377\376\376\376" \
+ "\236\377\377\377\1\304\343\240\235\214\306>\1\305\342\237\203\377\377" \
+ "\377\1\342\362\316\235\214\306>\1\250\325p\204\377\377\377\1\252\324" \
+ "p\234\214\306>\2\215\307\77\342\362\316\203\377\377\377\3\305\342\237" \
+ "\214\305@\215\305>\202\214\306>\1\214\305@\222\214\306>\1\214\305@\205" \
+ "\214\306>\1\305\342\237\220\377\377\377\1\377\377\375\202\377\377\377" \
+ "\32\377\376\377\370\373\364\243\322b\214\306>\213\310\77\214\305@\215" \
+ "\305>\215\305@\214\306>\214\305B\212\307<\215\307=\214\305B\214\306>" \
+ "\215\306A\212\306@\212\307>\214\306>\212\307<\244\317c\370\373\364\377" \
+ "\377\377\377\375\376\377\377\375\376\377\377\377\377\377\202\377\376" \
+ "\377\326\377\377\377\1__a\203::<\1;;=\203::<\1;;=\202::<\1\234\234\234" \
+ "\377\377\377\377\274\377\377\377\1\376\376\376\203\377\377\377\3SSU;" \
+ ";=99;\210::<\1\234\234\234\365\377\377\377\7\376\377\375\304\341\236" \
+ "\215\306A\214\305B\215\307=\212\307>\212\306@\230\214\305@\1\304\341" \
+ "\236\203\377\377\377\4\341\362\320\214\306>\213\310\77\215\305@\231\214" \
+ "\305@\2\215\307\77\252\322q\202\377\376\377\202\377\377\377\1\250\325" \
+ "n\230\214\305@\3\215\305>\215\306A\215\307\77\202\214\306<\10\342\360" \
+ "\317\376\377\377\377\377\375\376\377\377\305\342\240\215\305@\212\306" \
+ "@\215\305>\202\214\305@\1\215\307=\220\214\305@\10\214\306>\212\306@" \
+ "\216\306A\212\307>\215\305>\215\305@\214\305@\304\343\237\211\377\377" \
+ "\377\10\376\376\377\377\377\375\377\377\377\377\377\375\377\377\377\377" \
+ "\376\377\377\377\375\376\377\377\202\377\377\377\6\370\373\362\243\322" \
+ "b\211\307B\213\310=\214\305@\214\306<\202\215\305@\4\214\306<\214\305" \
+ "@\214\306<\215\307\77\202\214\306>\6\212\307>\214\306>\215\307\77\214" \
+ "\305@\244\317c\367\375\361\335\377\377\377\2\376\376\376\316\316\316" \
+ "\211::<\3;;=GGI\363\363\365\203\377\377\377\1\376\376\376\377\377\377" \
+ "\377\266\377\377\377\10\376\376\376\377\377\377\376\376\376\377\377\377" \
+ "\265\265\265;;=::<;;=\207::<\2GGI\363\363\363\364\377\377\377\7\377\376" \
+ "\377\377\377\375\304\341\236\215\305>\215\307\77\214\306>\214\305@\231" \
+ "\214\306>\7\304\343\237\377\377\377\375\376\377\377\377\375\341\360\321" \
+ "\215\306A\214\305@\233\214\306>\6\252\324n\376\376\376\377\377\377\376" \
+ "\377\377\377\376\377\252\324p\230\214\306>\7\215\306A\212\307>\214\306" \
+ ">\212\307>\214\306>\343\361\320\376\377\377\202\377\377\377\7\305\342" \
+ "\237\215\305>\213\310\77\214\306>\214\305@\212\306@\215\307\77\222\214" \
+ "\306>\6\215\305>\212\307>\214\306>\215\307=\215\305@\305\342\237\210" \
+ "\377\377\377\6\376\376\377\377\376\377\375\376\377\376\377\377\377\377" \
+ "\375\375\377\376\203\377\377\377\27\377\377\375\372\373\366\241\321a" \
+ "\217\304@\212\307<\214\306>\215\305>\215\305@\213\310=\212\306@\214\306" \
+ ">\214\305B\215\307\77\215\305>\215\306A\212\307>\214\306>\215\307\77" \
+ "\214\306>\242\322b\370\373\362\376\376\377\377\375\376\336\377\377\377" \
+ "\1kkm\202::<\1;;=\205::<\202;;=\3\233\233\235\377\377\377\376\376\376" \
+ "\377\377\377\377\274\377\377\377\3SSU99;;;=\20299;\1;;=\203::<\3;;=:" \
+ ":<\234\234\236\366\377\377\377\7\376\377\375\305\342\240\213\304\77\213" \
+ "\310\77\214\305@\215\306A\216\306=\230\214\306>\10\305\342\240\377\377" \
+ "\375\376\377\377\377\376\377\341\360\317\214\306<\214\305@\212\306@\231" \
+ "\214\306>\7\215\305@\252\324p\377\377\377\377\377\375\376\377\377\377" \
+ "\376\374\252\324p\230\214\306>\7\212\307>\215\307\77\216\306A\212\307" \
+ ">\213\304\77\343\361\320\377\377\375\202\377\377\377\3\307\342\237\214" \
+ "\304\77\213\310\77\203\214\306>\1\215\307\77\220\214\306>\4\214\305@" \
+ "\214\306<\215\304B\213\310\77\202\212\307>\2\215\305@\305\342\240\210" \
+ "\377\377\377\7\377\377\375\375\376\377\376\377\377\376\377\375\377\374" \
+ "\377\377\377\375\375\377\376\202\377\377\377\5\372\373\366\240\320b\215" \
+ "\307\77\212\306@\215\305>\202\214\305@\20\215\305@\212\306@\214\305D" \
+ "\216\306\77\214\306>\215\307\77\214\306>\212\306@\214\306>\215\307\77" \
+ "\215\305@\242\320c\370\373\362\377\377\373\377\376\377\377\377\375\331" \
+ "\377\377\377\1\376\376\376\203\377\377\377\4\376\376\376\317\317\321" \
+ "::<;;=\203::<\3;;=::<;;=\202::<\4FFH\363\363\363\377\377\377\376\376" \
+ "\376\377\377\377\377\264\377\377\377\1\376\376\376\205\377\377\377\1" \
+ "\265\265\267\202;;=\3::<99;;;=\202::<\202;;=\2::<SSU\366\377\377\377" \
+ "\7\377\376\377\375\377\374\304\341\237\216\306\77\212\307<\213\310\77" \
+ "\212\307>\231\214\306>\2\305\342\240\377\377\377\202\377\376\377\3\341" \
+ "\362\316\216\306\77\214\306<\231\214\306>\3\215\305@\212\307>\252\324" \
+ "p\203\377\377\377\2\377\376\377\247\324o\230\214\306>\20\215\306A\214" \
+ "\305B\215\307\77\211\305\77\214\304;\342\362\315\377\377\377\377\376" \
+ "\377\376\376\376\305\342\237\215\306A\210\307;\215\306A\216\306A\214" \
+ "\306>\212\306@\220\214\306>\202\214\305@\6\216\305C\213\305=\214\305" \
+ "B\215\307\77\216\306\77\303\344\237\211\377\377\377\37\376\377\377\376" \
+ "\377\375\377\375\376\375\377\376\377\377\375\377\377\377\377\376\377" \
+ "\370\373\362\241\321a\215\307\77\215\307=\214\305@\214\306>\212\307<" \
+ "\214\306>\214\306<\214\306>\216\306\77\215\305<\212\307>\213\307A\215" \
+ "\305>\212\307>\215\307\77\214\306>\242\321a\373\374\364\377\377\377\376" \
+ "\377\377\376\376\376\376\377\377\331\377\377\377\3\376\376\376\377\377" \
+ "\377\376\376\376\203\377\377\377\1kkm\202::<\6;;=::<;;=::<;;=::<\202" \
+ ";;=\1\233\233\235\377\377\377\377\267\377\377\377\1\376\376\376\204\377" \
+ "\377\377\2kkm;;=\202::<\2;;=::<\202;;=\203::<\5\265\265\267\377\377\377" \
+ "\376\376\376\377\377\377\376\376\376\362\377\377\377\2\376\377\377\377" \
+ "\376\377\202\377\377\377\202\377\376\377\2\377\377\377\377\377\375\231" \
+ "\377\377\377\4\377\376\377\376\377\377\375\377\376\377\377\377\202\376" \
+ "\377\377\231\377\377\377\10\374\377\375\377\376\377\377\377\375\376\376" \
+ "\376\377\377\377\376\377\377\376\376\374\377\376\377\230\377\377\377" \
+ "\1\377\376\377\203\377\377\375\4\376\377\377\377\375\377\377\377\377" \
+ "\376\377\377\202\377\377\377\3\376\376\376\377\376\377\377\377\375\202" \
+ "\376\377\377\1\377\377\375\220\377\377\377\10\377\377\375\377\377\377" \
+ "\376\376\376\377\377\377\377\377\375\377\377\377\376\377\377\377\375" \
+ "\377\210\377\377\377\202\377\377\375\3\377\374\377\375\377\376\376\377" \
+ "\377\202\377\377\377\25\370\373\364\243\322b\217\304@\212\306@\214\305" \
+ "@\215\305>\212\307>\212\306@\214\305B\214\305@\214\305B\214\306>\212" \
+ "\307>\212\310\77\214\306>\217\304@\214\306>\214\305@\242\322b\370\373" \
+ "\362\377\377\377\202\377\376\377\1\377\377\375\340\377\377\377\1\316" \
+ "\316\316\203::<\3;;=99;;;=\204::<\2FFH\363\363\363\202\377\377\377\1" \
+ "\376\376\376\377\377\377\377\264\377\377\377\1\376\376\376\202\377\377" \
+ "\377\1\316\316\320\206::<\1;;=\203::<\2SSU\376\376\376\366\377\377\377" \
+ "\1\377\377\375\202\377\376\377\202\377\377\377\3\377\377\375\377\377" \
+ "\377\376\377\377\230\377\377\377\202\376\377\377\6\377\377\375\377\377" \
+ "\377\376\377\375\377\377\377\376\377\375\377\377\375\231\377\377\377" \
+ "\2\376\377\377\377\377\375\202\377\377\377\1\376\376\376\232\377\377" \
+ "\377\5\377\376\377\377\377\377\376\377\375\377\377\377\377\377\375\204" \
+ "\377\377\377\202\376\377\377\1\376\376\376\202\377\377\377\202\376\377" \
+ "\377\220\377\377\377\1\377\377\375\202\377\377\377\4\376\376\374\377" \
+ "\376\377\377\377\377\376\377\375\212\377\377\377\1\375\377\376\202\377" \
+ "\377\375\34\377\377\377\376\376\376\373\373\363\243\322b\211\307B\212" \
+ "\307<\215\305>\214\306>\212\307>\214\305@\217\304>\212\307<\214\306<" \
+ "\214\306>\215\307\77\213\307A\214\306>\215\305@\215\307\77\212\307>\244" \
+ "\317c\370\373\362\377\377\373\376\377\377\377\376\377\375\376\377\377" \
+ "\377\375\377\376\377\334\377\377\377\1\376\376\376\202\377\377\377\10" \
+ "\376\376\376kkm::<;;=99;;;=::<;;=\202::<\202;;=\1\234\234\236\203\377" \
+ "\377\377\1\376\376\376\377\377\377\377\262\377\377\377\5\376\376\376" \
+ "\377\377\377\376\376\376\377\377\377lln\210::<\3""99;;;=\265\265\265" \
+ "\202\377\377\377\1\376\376\376\202\377\377\377\1\376\376\376\370\377" \
+ "\377\377\1\376\377\377\230\377\377\377\7\377\376\377\377\377\375\377" \
+ "\376\377\376\376\377\377\377\375\377\377\377\377\377\375\233\377\377" \
+ "\377\1\377\376\377\203\377\377\377\1\376\377\375\231\377\377\377\5\377" \
+ "\377\375\377\377\377\377\377\375\377\377\377\377\377\375\202\377\377" \
+ "\377\1\377\377\375\203\377\377\377\2\376\376\376\377\376\377\226\377" \
+ "\377\377\5\377\377\375\377\377\377\376\377\377\377\377\375\376\377\377" \
+ "\210\377\377\377\3\377\376\377\377\377\377\375\377\376\202\377\377\377" \
+ "\11\373\373\363\241\321d\214\306>\213\310=\214\306>\214\305@\213\310" \
+ "=\212\306@\217\304>\202\215\307=\14\214\306>\215\305>\214\306>\215\305" \
+ ">\217\304@\215\307\77\215\307=\242\320c\367\375\361\376\376\377\377\376" \
+ "\377\376\376\376\202\377\377\375\2\374\377\377\377\376\377\333\377\377" \
+ "\377\1\376\376\376\202\377\377\377\3\376\376\376\377\377\377\316\316" \
+ "\320\203::<\1;;=\202::<\1;;=\203::<\2FFH\377\377\377\202\376\376\376" \
+ "\377\377\377\377\262\377\377\377\5\376\376\376\377\377\377\376\376\376" \
+ "\377\377\377\332\332\332\206::<\1;;=\202::<\5;;=FFH\363\363\363\377\377" \
+ "\377\376\376\376\203\377\377\377\1\376\376\376\365\377\377\377\1\377" \
+ "\377\375\202\377\377\377\1\377\377\375\230\377\377\377\2\376\377\377" \
+ "\377\377\375\204\377\377\377\2\377\376\377\376\377\375\230\377\377\377" \
+ "\4\377\377\375\377\377\377\377\377\373\376\377\377\203\377\377\377\1" \
+ "\377\376\377\230\377\377\377\13\376\377\377\377\377\375\377\377\377\376" \
+ "\377\377\377\375\376\377\377\377\377\377\375\376\377\377\377\376\377" \
+ "\377\377\377\376\376\376\202\377\377\377\1\377\377\375\226\377\377\377" \
+ "\202\376\377\377\2\377\377\375\377\376\377\210\377\377\377\1\377\377" \
+ "\375\202\377\377\377\32\377\376\377\370\373\364\243\322b\214\306>\213" \
+ "\310\77\214\305@\215\305>\215\305@\214\306>\214\305B\212\307<\215\307" \
+ "=\214\305B\214\306>\215\306A\212\306@\212\307>\214\306>\212\307<\244" \
+ "\317c\370\373\364\377\377\377\377\375\376\377\377\375\376\377\377\377" \
+ "\377\377\202\377\376\377\333\377\377\377\1\376\376\376\204\377\377\377" \
+ "\11\376\376\376\377\377\377kkm::<;;=99;;;=::<;;=\202::<\3;;=::<\264\264" \
+ "\264\377\377\377\377\265\377\377\377\1\376\376\376\202\377\377\377\1" \
+ "\204\204\204\203::<\1;;=\206::<\1\235\235\237\377\377\377\377\377\377" \
+ "\377\377\203\377\377\377\10\376\376\377\377\377\375\377\377\377\377\377" \
+ "\375\377\377\377\377\376\377\377\377\375\376\377\377\202\377\377\377" \
+ "\6\370\373\362\243\322b\211\307B\213\310=\214\305@\214\306<\202\215\305" \
+ "@\4\214\306<\214\305@\214\306<\215\307\77\202\214\306>\6\212\307>\214" \
+ "\306>\215\307\77\214\305@\244\317c\367\375\361\352\377\377\377\1\316" \
+ "\316\316\203::<\1;;=\203::<\202;;=\2::<RRT\377\377\377\377\267\377\377" \
+ "\377\3\346\346\346::<;;=\203::<\202;;=\5""99;::<;;=FFH\363\363\365\377" \
+ "\377\377\377\377\377\377\377\202\377\377\377\6\376\376\377\377\376\377" \
+ "\375\376\377\376\377\377\377\377\375\375\377\376\203\377\377\377\27\377" \
+ "\377\375\372\373\366\241\321a\217\304@\212\307<\214\306>\215\305>\215" \
+ "\305@\213\310=\212\306@\214\306>\214\305B\215\307\77\215\305>\215\306" \
+ "A\212\307>\214\306>\215\307\77\214\306>\242\322b\370\373\362\376\376" \
+ "\377\377\375\376\352\377\377\377\2kkm;;=\207::<\3;;=::<\301\301\301\377" \
+ "\377\377\377\266\377\377\377\2\221\221\221;;=\202::<\202;;=\202::<\1" \
+ ";;=\202::<\1\235\235\237\377\377\377\377\377\377\377\377\203\377\377" \
+ "\377\7\377\377\375\375\376\377\376\377\377\376\377\375\377\374\377\377" \
+ "\377\375\375\377\376\202\377\377\377\5\372\373\366\240\320b\215\307\77" \
+ "\212\306@\215\305>\202\214\305@\20\215\305@\212\306@\214\305D\216\306" \
+ "\77\214\306>\215\307\77\214\306>\212\306@\214\306>\215\307\77\215\305" \
+ "@\242\320c\370\373\362\377\377\373\377\376\377\377\377\375\350\377\377" \
+ "\377\4\376\376\376\377\377\377\265\265\26799;\203::<\3;;=::<;;=\203:" \
+ ":<\2kkk\376\376\376\377\377\377\377\264\377\377\377\2\362\362\362FFH" \
+ "\202::<\1;;=\203::<\5;;=::<;;=::<\363\363\363\377\377\377\377\377\377" \
+ "\377\377\204\377\377\377\37\376\377\377\376\377\375\377\375\376\375\377" \
+ "\376\377\377\375\377\377\377\377\376\377\370\373\362\241\321a\215\307" \
+ "\77\215\307=\214\305@\214\306>\212\307<\214\306>\214\306<\214\306>\216" \
+ "\306\77\215\305<\212\307>\213\307A\215\305>\212\307>\215\307\77\214\306" \
+ ">\242\321a\373\374\364\377\377\377\376\377\377\376\376\376\376\377\377" \
+ "\352\377\377\377\2\376\376\376TTV\204::<\7;;=99;::<;;=99;::<\332\332" \
+ "\332\377\377\377\377\263\377\377\377\3\376\376\376\266\266\266;;=\203" \
+ "::<\202;;=\204::<\1\205\205\207\377\377\377\377\377\377\377\377\204\377" \
+ "\377\377\202\377\377\375\3\377\374\377\375\377\376\376\377\377\202\377" \
+ "\377\377\25\370\373\364\243\322b\217\304@\212\306@\214\305@\215\305>" \
+ "\212\307>\212\306@\214\305B\214\305@\214\305B\214\306>\212\307>\212\310" \
+ "\77\214\306>\217\304@\214\306>\214\305@\242\322b\370\373\362\377\377" \
+ "\377\202\377\376\377\1\377\377\375\354\377\377\377\2\265\265\267::<\202" \
+ ";;=\205::<\4;;=::<\204\204\204\376\376\376\377\377\377\377\263\377\377" \
+ "\377\1SSU\202::<\1;;=\206::<\2;;=\346\346\346\377\377\377\377\377\377" \
+ "\377\377\205\377\377\377\1\375\377\376\202\377\377\375\34\377\377\377" \
+ "\376\376\376\373\373\363\243\322b\211\307B\212\307<\215\305>\214\306" \
+ ">\212\307>\214\305@\217\304>\212\307<\214\306<\214\306>\215\307\77\213" \
+ "\307A\214\306>\215\305@\215\307\77\212\307>\244\317c\370\373\362\377" \
+ "\377\373\376\377\377\377\376\377\375\376\377\377\377\375\377\376\377" \
+ "\354\377\377\377\4FFH;;=99;;;=\203::<\5;;=99;;;=99;\364\364\364\377\377" \
+ "\377\377\262\377\377\377\1\316\316\316\202;;=\1""99;\203::<\1;;=\203" \
+ "::<\1xxz\377\377\377\377\377\377\377\377\205\377\377\377\3\377\376\377" \
+ "\377\377\377\375\377\376\202\377\377\377\11\373\373\363\241\321d\214" \
+ "\306>\213\310=\214\306>\214\305@\213\310=\212\306@\217\304>\202\215\307" \
+ "=\14\214\306>\215\305>\214\306>\215\305>\217\304@\215\307\77\215\307" \
+ "=\242\320c\367\375\361\376\376\377\377\376\377\376\376\376\202\377\377" \
+ "\375\2\374\377\377\377\376\377\354\377\377\377\1\235\235\237\204::<\1" \
+ "<<>\202::<\4;;=::<;;=\247\247\251\377\377\377\377\262\377\377\377\4\204" \
+ "\204\204;;=::<;;=\206::<\2;;=\316\316\316\377\377\377\377\377\377\377" \
+ "\377\205\377\377\377\1\377\377\375\202\377\377\377\32\377\376\377\370" \
+ "\373\364\243\322b\214\306>\213\310\77\214\305@\215\305>\215\305@\214" \
+ "\306>\214\305B\212\307<\215\307=\214\305B\214\306>\215\306A\212\306@" \
+ "\212\307>\214\306>\212\307<\244\317c\370\373\364\377\377\377\377\375" \
+ "\376\377\377\375\376\377\377\377\377\377\202\377\376\377\355\377\377" \
+ "\377\1\363\363\363\212::<\1TTV\377\377\377\377\261\377\377\377\5\347" \
+ "\347\351::<;;=::<;;=\204::<\3;;=::<TTT\377\377\377\377\376\377\377\377" \
+ "\10\376\376\377\377\377\375\377\377\377\377\377\375\377\377\377\377\376" \
+ "\377\377\377\375\376\377\377\202\377\377\377\6\370\373\362\243\322b\211" \
+ "\307B\213\310=\214\305@\214\306<\202\215\305@\4\214\306<\214\305@\214" \
+ "\306<\215\307\77\202\214\306>\6\212\307>\214\306>\215\307\77\214\305" \
+ "@\244\317c\367\375\361\361\377\377\377\1\376\376\376\204\377\377\377" \
+ "\1\204\204\204\202;;=\203::<\1;;=\202::<\202;;=\1\302\302\302\203\377" \
+ "\377\377\1\376\376\376\377\377\377\377\244\377\377\377\1\376\376\376" \
+ "\203\377\377\377\1\376\376\376\203\377\377\377\1\234\234\236\202::<\1" \
+ ";;=\204::<\6;;=::<;;=\264\264\264\377\377\377\376\376\376\377\377\377" \
+ "\377\373\377\377\377\6\376\376\377\377\376\377\375\376\377\376\377\377" \
+ "\377\377\375\375\377\376\203\377\377\377\27\377\377\375\372\373\366\241" \
+ "\321a\217\304@\212\307<\214\306>\215\305>\215\305@\213\310=\212\306@" \
+ "\214\306>\214\305B\215\307\77\215\305>\215\306A\212\307>\214\306>\215" \
+ "\307\77\214\306>\242\322b\370\373\362\376\376\377\377\375\376\365\377" \
+ "\377\377\1\332\332\332\202::<\1;;=\202::<\6""99;::<;;=99;;;=xxx\205\377" \
+ "\377\377\1\376\376\376\377\377\377\377\243\377\377\377\1\376\376\376" \
+ "\206\377\377\377\4SSU;;=::<;;=\202::<\1;;=\203::<\3GGI\362\362\362\376" \
+ "\376\376\377\377\377\377\374\377\377\377\7\377\377\375\375\376\377\376" \
+ "\377\377\376\377\375\377\374\377\377\377\375\375\377\376\202\377\377" \
+ "\377\5\372\373\366\240\320b\215\307\77\212\306@\215\305>\202\214\305" \
+ "@\20\215\305@\212\306@\214\305D\216\306\77\214\306>\215\307\77\214\306" \
+ ">\212\306@\214\306>\215\307\77\215\305@\242\320c\370\373\362\377\377" \
+ "\373\377\376\377\377\377\375\364\377\377\377\3\376\376\376\377\377\377" \
+ "__a\203::<\202;;=\6::<99;;;=::<;;=\345\345\345\203\377\377\377\1\376" \
+ "\376\376\377\377\377\377\245\377\377\377\3\376\376\376\377\377\377\376" \
+ "\376\376\202\377\377\377\2\316\316\316::<\202;;=\205::<\202;;=\1\203" \
+ "\203\205\204\377\377\377\1\376\376\376\377\377\377\377\372\377\377\377" \
+ "\37\376\377\377\376\377\375\377\375\376\375\377\376\377\377\375\377\377" \
+ "\377\377\376\377\370\373\362\241\321a\215\307\77\215\307=\214\305@\214" \
+ "\306>\212\307<\214\306>\214\306<\214\306>\216\306\77\215\305<\212\307" \
+ ">\213\307A\215\305>\212\307>\215\307\77\214\306>\242\321a\373\374\364" \
+ "\377\377\377\376\377\377\376\376\376\376\377\377\362\377\377\377\202" \
+ "\376\376\376\3\377\377\377\376\376\376\265\265\267\202::<\1;;=\207::" \
+ "<\3\251\251\253\377\377\377\376\376\376\203\377\377\377\1\376\376\376" \
+ "\377\377\377\377\247\377\377\377\2\376\376\376\204\204\206\207::<\1;" \
+ ";=\202::<\3\346\346\346\377\377\377\376\376\376\377\377\377\377\374\377" \
+ "\377\377\202\377\377\375\3\377\374\377\375\377\376\376\377\377\202\377" \
+ "\377\377\25\370\373\364\243\322b\217\304@\212\306@\214\305@\215\305>" \
+ "\212\307>\212\306@\214\305B\214\305@\214\305B\214\306>\212\307>\212\310" \
+ "\77\214\306>\217\304@\214\306>\214\305@\242\322b\370\373\362\377\377" \
+ "\377\202\377\376\377\1\377\377\375\364\377\377\377\17\376\376\376\377" \
+ "\377\377\376\376\376\377\377\377FFH;;=99;::<;;=::<;;=99;;;=::<SSU\377" \
+ "\377\377\377\251\377\377\377\1\376\376\376\203\377\377\377\3\363\363" \
+ "\365::<;;=\202::<\11;;=::<;;=::<;;=::<kkm\377\377\377\376\376\376\377" \
+ "\377\377\377\376\377\377\377\1\375\377\376\202\377\377\375\34\377\377" \
+ "\377\376\376\376\373\373\363\243\322b\211\307B\212\307<\215\305>\214" \
+ "\306>\212\307>\214\305@\217\304>\212\307<\214\306<\214\306>\215\307\77" \
+ "\213\307A\214\306>\215\305@\215\307\77\212\307>\244\317c\370\373\362" \
+ "\377\377\373\376\377\377\377\376\377\375\376\377\377\377\375\377\376" \
+ "\377\361\377\377\377\202\376\376\376\2\377\377\377\376\376\376\202\377" \
+ "\377\377\1\221\221\221\205::<\202;;=\5::<;;=99;\316\316\320\376\376\376" \
+ "\377\377\377\377\250\377\377\377\1\376\376\376\202\377\377\377\4\266" \
+ "\266\270::<99;;;=\203::<\1;;=\203::<\1\265\265\265\377\377\377\377\377" \
+ "\377\377\377\3\377\376\377\377\377\377\375\377\376\202\377\377\377\11" \
+ "\373\373\363\241\321d\214\306>\213\310=\214\306>\214\305@\213\310=\212" \
+ "\306@\217\304>\202\215\307=\14\214\306>\215\305>\214\306>\215\305>\217" \
+ "\304@\215\307\77\215\307=\242\320c\367\375\361\376\376\377\377\376\377" \
+ "\376\376\376\202\377\377\375\2\374\377\377\377\376\377\360\377\377\377" \
+ "\1\376\376\376\202\377\377\377\202\376\376\376\202\377\377\377\6\346" \
+ "\346\346;;=99;::<99;;;=\204::<\2;;=\204\204\206\202\377\377\377\1\376" \
+ "\376\376\377\377\377\377\251\377\377\377\1__a\203::<\3;;=::<;;=\203:" \
+ ":<\4FFF\363\363\363\377\377\377\376\376\376\377\377\377\377\375\377\377" \
+ "\377\1\377\377\375\202\377\377\377\32\377\376\377\370\373\364\243\322" \
+ "b\214\306>\213\310\77\214\305@\215\305>\215\305@\214\306>\214\305B\212" \
+ "\307<\215\307=\214\305B\214\306>\215\306A\212\306@\212\307>\214\306>" \
+ "\212\307<\244\317c\370\373\364\377\377\377\377\375\376\377\377\375\376" \
+ "\377\377\377\377\377\202\377\376\377\371\377\377\377\4^^`;;=::<;;=\202" \
+ "::<\5;;=::<;;=::<FFH\377\377\377\377\253\377\377\377\3\346\346\346::" \
+ "<;;=\210::<\1\204\204\204\202\377\377\377\202\376\376\376\377\377\377" \
+ "\377\365\377\377\377\10\376\376\377\377\377\375\377\377\377\377\377\375" \
+ "\377\377\377\377\376\377\377\377\375\376\377\377\202\377\377\377\6\370" \
+ "\373\362\243\322b\211\307B\213\310=\214\305@\214\306<\202\215\305@\4" \
+ "\214\306<\214\305@\214\306<\215\307\77\202\214\306>\6\212\307>\214\306" \
+ ">\215\307\77\214\305@\244\317c\367\375\361\377\377\377\377\202\377\377" \
+ "\377\3\265\265\267::<;;=\204::<\1;;=\202::<\2;;=\265\265\265\202\377" \
+ "\377\377\1\376\376\376\377\377\377\377\246\377\377\377\2\376\376\376" \
+ "\234\234\234\202;;=\203::<\1;;=\202::<\3""99;::<\332\332\332\377\377" \
+ "\377\377\370\377\377\377\6\376\376\377\377\376\377\375\376\377\376\377" \
+ "\377\377\377\375\375\377\376\203\377\377\377\27\377\377\375\372\373\366" \
+ "\241\321a\217\304@\212\307<\214\306>\215\305>\215\305@\213\310=\212\306" \
+ "@\214\306>\214\305B\215\307\77\215\305>\215\306A\212\307>\214\306>\215" \
+ "\307\77\214\306>\242\322b\370\373\362\376\376\377\377\375\376\377\377" \
+ "\377\377\5\377\377\377\363\363\365;;=::<;;=\202::<\3;;=::<;;=\202::<" \
+ "\3xxz\377\377\377\376\376\376\377\377\377\377\246\377\377\377\3\376\376" \
+ "\376\377\377\377SSS\202::<\1;;=\202::<\1;;=\202::<\6;;=SSU\377\377\377" \
+ "\376\376\376\377\377\377\376\376\376\202\377\377\377\1\376\376\376\377" \
+ "\377\377\377\362\377\377\377\7\377\377\375\375\376\377\376\377\377\376" \
+ "\377\375\377\374\377\377\377\375\375\377\376\202\377\377\377\5\372\373" \
+ "\366\240\320b\215\307\77\212\306@\215\305>\202\214\305@\20\215\305@\212" \
+ "\306@\214\305D\216\306\77\214\306>\215\307\77\214\306>\212\306@\214\306" \
+ ">\215\307\77\215\305@\242\320c\370\373\362\377\377\373\377\376\377\377" \
+ "\377\375\377\377\377\377\11\377\377\377\376\376\376\204\204\206;;=::" \
+ "<99;;;=::<;;=\204::<\3\362\362\362\377\377\377\376\376\376\377\377\377" \
+ "\377\246\377\377\377\1\333\333\333\203::<\202;;=\202::<\5<<>99;::<\250" \
+ "\250\252\376\376\376\203\377\377\377\1\376\376\376\377\377\377\377\365" \
+ "\377\377\377\37\376\377\377\376\377\375\377\375\376\375\377\376\377\377" \
+ "\375\377\377\377\377\376\377\370\373\362\241\321a\215\307\77\215\307" \
+ "=\214\305@\214\306>\212\307<\214\306>\214\306<\214\306>\216\306\77\215" \
+ "\305<\212\307>\213\307A\215\305>\212\307>\215\307\77\214\306>\242\321" \
+ "a\373\374\364\377\377\377\376\377\377\376\376\376\376\377\377\377\377" \
+ "\377\377\202\377\377\377\1\301\301\301\202::<\1;;=\203::<\1;;=\203::" \
+ "<\1\266\266\270\377\377\377\377\250\377\377\377\2\220\220\220;;=\204" \
+ "::<\6;;=::<99;;;=::<\346\346\346\205\377\377\377\1\376\376\376\377\377" \
+ "\377\377\363\377\377\377\202\377\377\375\3\377\374\377\375\377\376\376" \
+ "\377\377\202\377\377\377\25\370\373\364\243\322b\217\304@\212\306@\214" \
+ "\305@\215\305>\212\307>\212\306@\214\305B\214\305@\214\305B\214\306>" \
+ "\212\307>\212\310\77\214\306>\217\304@\214\306>\214\305@\242\322b\370" \
+ "\373\362\377\377\377\202\377\376\377\1\377\377\375\377\377\377\377\204" \
+ "\377\377\377\2TTV99;\202::<\1;;=\202::<\6;;=::<;;=__a\377\377\377\376" \
+ "\376\376\377\377\377\377\244\377\377\377\3\376\376\376\377\377\377TT" \
+ "V\207::<\3;;=99;```\377\377\377\377\373\377\377\377\1\375\377\376\202" \
+ "\377\377\375\34\377\377\377\376\376\376\373\373\363\243\322b\211\307" \
+ "B\212\307<\215\305>\214\306>\212\307>\214\305@\217\304>\212\307<\214" \
+ "\306<\214\306>\215\307\77\213\307A\214\306>\215\305@\215\307\77\212\307" \
+ ">\244\317c\370\373\362\377\377\373\376\377\377\377\376\377\375\376\377" \
+ "\377\377\375\377\376\377\377\377\377\377\203\377\377\377\3\221\221\221" \
+ "::<;;=\202::<\202;;=\203::<\2;;=\345\345\347\377\377\377\377\246\377" \
+ "\377\377\4\332\332\332;;=::<;;=\203::<\1;;=\203::<\1\265\265\265\203" \
+ "\377\377\377\3\376\376\376\377\377\377\376\376\376\377\377\377\377\364" \
+ "\377\377\377\3\377\376\377\377\377\377\375\377\376\202\377\377\377\11" \
+ "\373\373\363\241\321d\214\306>\213\310=\214\306>\214\305@\213\310=\212" \
+ "\306@\217\304>\202\215\307=\14\214\306>\215\305>\214\306>\215\305>\217" \
+ "\304@\215\307\77\215\307=\242\320c\367\375\361\376\376\377\377\376\377" \
+ "\376\376\376\202\377\377\375\2\374\377\377\377\376\377\377\377\377\377" \
+ "\202\377\377\377\5\376\376\376\332\332\332;;=::<;;=\202::<\6;;=::<;;" \
+ "=99;::<\250\250\252\377\377\377\377\244\377\377\377\6\376\376\376\377" \
+ "\377\377\221\221\223::<;;=99;\202::<\3;;=::<;;=\202::<\1\363\363\363" \
+ "\377\377\377\377\372\377\377\377\1\377\377\375\202\377\377\377\32\377" \
+ "\376\377\370\373\364\243\322b\214\306>\213\310\77\214\305@\215\305>\215" \
+ "\305@\214\306>\214\305B\212\307<\215\307=\214\305B\214\306>\215\306A" \
+ "\212\306@\212\307>\214\306>\212\307<\244\317c\370\373\364\377\377\377" \
+ "\377\375\376\377\377\375\376\377\377\377\377\377\202\377\376\377\377" \
+ "\377\377\377\204\377\377\377\2\376\376\376SSU\204::<\204;;=\2::<__a\377" \
+ "\377\377\377\243\377\377\377\6\376\376\376\377\377\377\376\376\376TT" \
+ "V99;;;=\204::<\4;;=99;<<>xxz\377\377\377\377\364\377\377\377\10\376\376" \
+ "\377\377\377\375\377\377\377\377\377\375\377\377\377\377\376\377\377" \
+ "\377\375\376\377\377\202\377\377\377\6\370\373\362\243\322b\211\307B" \
+ "\213\310=\214\305@\214\306<\202\215\305@\4\214\306<\214\305@\214\306" \
+ "<\215\307\77\202\214\306>\6\212\307>\214\306>\215\307\77\214\305@\244" \
+ "\317c\367\375\361\377\377\377\377\213\377\377\377\5\376\376\376\377\377" \
+ "\377\221\221\223::<;;=\204::<\5;;=::<;;=::<\363\363\363\204\377\377\377" \
+ "\1\376\376\376\202\377\377\377\202\376\376\376\377\377\377\377\233\377" \
+ "\377\377\5\332\332\332::<;;=99;<<>\202::<\1;;=\203::<\1\265\265\267\377" \
+ "\377\377\377\363\377\377\377\6\376\376\377\377\376\377\375\376\377\376" \
+ "\377\377\377\377\375\375\377\376\203\377\377\377\27\377\377\375\372\373" \
+ "\366\241\321a\217\304@\212\307<\214\306>\215\305>\215\305@\213\310=\212" \
+ "\306@\214\306>\214\305B\215\307\77\215\305>\215\306A\212\307>\214\306" \
+ ">\215\307\77\214\306>\242\322b\370\373\362\376\376\377\377\375\376\377" \
+ "\377\377\377\213\377\377\377\2\375\375\375\333\333\333\202::<\1;;=\202" \
+ "::<\1;;=\202::<\3""99;::<\265\265\265\206\377\377\377\3\376\376\376\377" \
+ "\377\377\376\376\376\377\377\377\377\233\377\377\377\2\235\235\23599" \
+ ";\202;;=\1""99;\202;;=\202::<\3;;=::<\363\363\365\377\377\377\377\363" \
+ "\377\377\377\7\377\377\375\375\376\377\376\377\377\376\377\375\377\374" \
+ "\377\377\377\375\375\377\376\202\377\377\377\5\372\373\366\240\320b\215" \
+ "\307\77\212\306@\215\305>\202\214\305@\20\215\305@\212\306@\214\305D" \
+ "\216\306\77\214\306>\215\307\77\214\306>\212\306@\214\306>\215\307\77" \
+ "\215\305@\242\320c\370\373\362\377\377\373\377\376\377\377\377\375\377" \
+ "\377\377\377\214\377\377\377\2\376\376\376SSU\207::<\3;;=::<xxx\203\377" \
+ "\377\377\202\376\376\376\202\377\377\377\1\376\376\376\377\377\377\377" \
+ "\234\377\377\377\1^^`\211::<\3xxz\377\377\377\376\376\376\377\377\377" \
+ "\377\363\377\377\377\37\376\377\377\376\377\375\377\375\376\375\377\376" \
+ "\377\377\375\377\377\377\377\376\377\370\373\362\241\321a\215\307\77" \
+ "\215\307=\214\305@\214\306>\212\307<\214\306>\214\306<\214\306>\216\306" \
+ "\77\215\305<\212\307>\213\307A\215\305>\212\307>\215\307\77\214\306>" \
+ "\242\321a\373\374\364\377\377\377\376\377\377\376\376\376\376\377\377" \
+ "\377\377\377\377\212\377\377\377\4\376\376\376\377\377\377\376\376\376" \
+ "\222\222\222\205::<\1;;=\20299;\202::<\3\363\363\363\377\377\377\376" \
+ "\376\376\377\377\377\377\240\377\377\377\1\346\346\346\202::<\1;;=\204" \
+ "::<\1;;=\202::<\1\250\250\252\202\377\377\377\1\376\376\376\377\377\377" \
+ "\377\361\377\377\377\202\377\377\375\3\377\374\377\375\377\376\376\377" \
+ "\377\202\377\377\377\25\370\373\364\243\322b\217\304@\212\306@\214\305" \
+ "@\215\305>\212\307>\212\306@\214\305B\214\305@\214\305B\214\306>\212" \
+ "\307>\212\310\77\214\306>\217\304@\214\306>\214\305@\242\322b\370\373" \
+ "\362\377\377\377\202\377\376\377\1\377\377\375\377\377\377\377\212\377" \
+ "\377\377\1\376\376\376\203\377\377\377\2\332\332\332<<>\203::<\3;;=:" \
+ ":<<<>\203::<\2\301\301\303\376\376\376\202\377\377\377\5\376\376\376" \
+ "\377\377\377\376\376\376\377\377\377\376\376\376\377\377\377\377\231" \
+ "\377\377\377\4\376\376\376\251\251\253::<;;=\204::<\5;;=::<99;::<\346" \
+ "\346\346\377\377\377\377\365\377\377\377\1\375\377\376\202\377\377\375" \
+ "\34\377\377\377\376\376\376\373\373\363\243\322b\211\307B\212\307<\215" \
+ "\305>\214\306>\212\307>\214\305@\217\304>\212\307<\214\306<\214\306>" \
+ "\215\307\77\213\307A\214\306>\215\305@\215\307\77\212\307>\244\317c\370" \
+ "\373\362\377\377\373\376\377\377\377\376\377\375\376\377\377\377\375" \
+ "\377\376\377\377\377\377\377\212\377\377\377\1\376\376\376\203\377\377" \
+ "\377\1SSS\207::<\3;;=::<\205\205\207\205\377\377\377\1\376\376\376\377" \
+ "\377\377\377\234\377\377\377\3wwy::<;;=\206::<\2;;=__a\377\377\377\377" \
+ "\365\377\377\377\3\377\376\377\377\377\377\375\377\376\202\377\377\377" \
+ "\11\373\373\363\241\321d\214\306>\213\310=\214\306>\214\305@\213\310" \
+ "=\212\306@\217\304>\202\215\307=\14\214\306>\215\305>\214\306>\215\305" \
+ ">\217\304@\215\307\77\215\307=\242\320c\367\375\361\376\376\377\377\376" \
+ "\377\376\376\376\202\377\377\375\2\374\377\377\377\376\377\377\377\377" \
+ "\377\211\377\377\377\1\376\376\376\203\377\377\377\3\376\376\376\204" \
+ "\204\204::<\202;;=\1::<\202;;=\203::<\1SSU\204\377\377\377\1\376\376" \
+ "\376\377\377\377\377\235\377\377\377\1;;=\203::<\1;;=\202::<\1;;=\202" \
+ "::<\1\234\234\234\202\377\377\377\1\376\376\376\377\377\377\377\362\377" \
+ "\377\377\1\377\377\375\202\377\377\377\32\377\376\377\370\373\364\243" \
+ "\322b\214\306>\213\310\77\214\305@\215\305>\215\305@\214\306>\214\305" \
+ "B\212\307<\215\307=\214\305B\214\306>\215\306A\212\306@\212\307>\214" \
+ "\306>\212\307<\244\317c\370\373\364\377\377\377\377\375\376\377\377\375" \
+ "\376\377\377\377\377\377\202\377\376\377\377\377\377\377\212\377\377" \
+ "\377\1\376\376\376\204\377\377\377\6\301\301\301;;=::<;;=::<;;=\205:" \
+ ":<\1\333\333\333\202\377\377\377\1\376\376\376\377\377\377\377\231\377" \
+ "\377\377\1\376\376\376\203\377\377\377\1\301\301\303\204::<\1;;=\202" \
+ "::<\1:9>\202::<\1\332\332\332\377\377\377\377\356\377\377\377\10\376" \
+ "\376\377\377\377\375\377\377\377\377\377\375\377\377\377\377\376\377" \
+ "\377\377\375\376\377\377\202\377\377\377\6\370\373\362\243\322b\211\307" \
+ "B\213\310=\214\305@\214\306<\202\215\305@\4\214\306<\214\305@\214\306" \
+ "<\215\307\77\202\214\306>\6\212\307>\214\306>\215\307\77\214\305@\244" \
+ "\317c\367\375\361\377\377\377\377\230\377\377\377\2""99;;;=\210::<\1" \
+ "\250\250\250\377\377\377\377\240\377\377\377\3\221\221\223::<;;=\207" \
+ "::<\2SSU\376\376\376\377\377\377\377\355\377\377\377\6\376\376\377\377" \
+ "\376\377\375\376\377\376\377\377\377\377\375\375\377\376\203\377\377" \
+ "\377\27\377\377\375\372\373\366\241\321a\217\304@\212\307<\214\306>\215" \
+ "\305>\215\305@\213\310=\212\306@\214\306>\214\305B\215\307\77\215\305" \
+ ">\215\306A\212\307>\214\306>\215\307\77\214\306>\242\322b\370\373\362" \
+ "\376\376\377\377\375\376\377\377\377\377\227\377\377\377\1yy{\211::<" \
+ "\6lll\376\376\376\377\377\377\376\376\376\377\377\377\376\376\376\377" \
+ "\377\377\377\224\377\377\377\202\376\376\376\7\377\377\377\376\376\376" \
+ "\377\377\377\376\376\376\377\377\377__a;;=\202::<\4<<>;;=::<;;=\202:" \
+ ":<\1\204\204\206\203\377\377\377\1\376\376\376\377\377\377\377\352\377" \
+ "\377\377\7\377\377\375\375\376\377\376\377\377\376\377\375\377\374\377" \
+ "\377\377\375\375\377\376\202\377\377\377\5\372\373\366\240\320b\215\307" \
+ "\77\212\306@\215\305>\202\214\305@\20\215\305@\212\306@\214\305D\216" \
+ "\306\77\214\306>\215\307\77\214\306>\212\306@\214\306>\215\307\77\215" \
+ "\305@\242\320c\370\373\362\377\377\373\377\376\377\377\377\375\377\377" \
+ "\377\377\221\377\377\377\3\376\376\376\377\377\377\376\376\376\203\377" \
+ "\377\377\1\265\265\267\212::<\1\363\363\363\377\377\377\377\227\377\377" \
+ "\377\1\376\376\376\202\377\377\377\1\376\376\376\203\377\377\377\1\345" \
+ "\345\345\202::<\202;;=\1""99;\203::<\4;;=::<\301\301\301\376\376\376" \
+ "\203\377\377\377\1\376\376\376\377\377\377\377\352\377\377\377\37\376" \
+ "\377\377\376\377\375\377\375\376\375\377\376\377\377\375\377\377\377" \
+ "\377\376\377\370\373\362\241\321a\215\307\77\215\307=\214\305@\214\306" \
+ ">\212\307<\214\306>\214\306<\214\306>\216\306\77\215\305<\212\307>\213" \
+ "\307A\215\305>\212\307>\215\307\77\214\306>\242\321a\373\374\364\377" \
+ "\377\377\376\377\377\376\376\376\376\377\377\377\377\377\377\222\377" \
+ "\377\377\3\376\376\376\377\377\377\376\376\376\202\377\377\377\1\347" \
+ "\347\347\212::<\1\302\302\304\205\377\377\377\1\376\376\376\377\377\377" \
+ "\377\222\377\377\377\1\376\376\376\202\377\377\377\1\376\376\376\202" \
+ "\377\377\377\5\265\265\265::<;;=99;;;=\203::<\1;;=\202::<\1\363\363\363" \
+ "\377\377\377\377\356\377\377\377\202\377\377\375\3\377\374\377\375\377" \
+ "\376\376\377\377\202\377\377\377\25\370\373\364\243\322b\217\304@\212" \
+ "\306@\214\305@\215\305>\212\307>\212\306@\214\305B\214\305@\214\305B" \
+ "\214\306>\212\307>\212\310\77\214\306>\217\304@\214\306>\214\305@\242" \
+ "\322b\370\373\362\377\377\377\202\377\376\377\1\377\377\375\377\377\377" \
+ "\377\230\377\377\377\2\376\376\376TTT\211::<\3\221\221\223\377\377\377" \
+ "\376\376\376\202\377\377\377\1\376\376\376\377\377\377\377\231\377\377" \
+ "\377\2\204\204\204::<\202;;=\202::<\1;;=\203::<\2``b\376\376\376\377" \
+ "\377\377\377\357\377\377\377\1\375\377\376\202\377\377\375\34\377\377" \
+ "\377\376\376\376\373\373\363\243\322b\211\307B\212\307<\215\305>\214" \
+ "\306>\212\307>\214\305@\217\304>\212\307<\214\306<\214\306>\215\307\77" \
+ "\213\307A\214\306>\215\305@\215\307\77\212\307>\244\317c\370\373\362" \
+ "\377\377\373\376\377\377\377\376\377\375\376\377\377\377\375\377\376" \
+ "\377\377\377\377\377\225\377\377\377\1\376\376\376\202\377\377\377\1" \
+ "\221\221\221\210::<\2;;=__a\202\377\377\377\1\376\376\376\377\377\377" \
+ "\377\227\377\377\377\1\376\376\376\203\377\377\377\1SSU\202::<\1;;=\204" \
+ "::<\202;;=\1\234\234\234\204\377\377\377\1\376\376\376\377\377\377\377" \
+ "\352\377\377\377\3\377\376\377\377\377\377\375\377\376\202\377\377\377" \
+ "\11\373\373\363\241\321d\214\306>\213\310=\214\306>\214\305@\213\310" \
+ "=\212\306@\217\304>\202\215\307=\14\214\306>\215\305>\214\306>\215\305" \
+ ">\217\304@\215\307\77\215\307=\242\320c\367\375\361\376\376\377\377\376" \
+ "\377\376\376\376\202\377\377\375\2\374\377\377\377\376\377\377\377\377" \
+ "\377\222\377\377\377\1\376\376\376\205\377\377\377\1\301\301\301\210" \
+ "::<\4""99;;;=\364\364\366\376\376\376\377\377\377\377\233\377\377\377" \
+ "\1\346\346\346\207::<\4;;=99;::<\316\316\316\203\377\377\377\1\376\376" \
+ "\376\377\377\377\377\353\377\377\377\1\377\377\375\202\377\377\377\32" \
+ "\377\376\377\370\373\364\243\322b\214\306>\213\310\77\214\305@\215\305" \
+ ">\215\305@\214\306>\214\305B\212\307<\215\307=\214\305B\214\306>\215" \
+ "\306A\212\306@\212\307>\214\306>\212\307<\244\317c\370\373\364\377\377" \
+ "\377\377\375\376\377\377\375\376\377\377\377\377\377\202\377\376\377" \
+ "\377\377\377\377\224\377\377\377\1\376\376\376\204\377\377\377\1\363" \
+ "\363\363\210::<\3;;=::<\302\302\304\377\377\377\377\231\377\377\377\1" \
+ "\376\376\376\202\377\377\377\1\266\266\270\203::<\203;;=\203::<\1:::" \
+ "\377\377\377\377\351\377\377\377\10\376\376\377\377\377\375\377\377\377" \
+ "\377\377\375\377\377\377\377\376\377\377\377\375\376\377\377\202\377" \
+ "\377\377\6\370\373\362\243\322b\211\307B\213\310=\214\305@\214\306<\202" \
+ "\215\305@\4\214\306<\214\305@\214\306<\215\307\77\202\214\306>\6\212" \
+ "\307>\214\306>\215\307\77\214\305@\244\317c\367\375\361\377\377\377\377" \
+ "\242\377\377\377\3__a::<;;=\207::<\1\221\221\221\377\377\377\377\234" \
+ "\377\377\377\1\204\204\206\204::<\202;;=\203::<\1lll\203\377\377\377" \
+ "\1\375\375\375\377\377\377\377\344\377\377\377\6\376\376\377\377\376" \
+ "\377\375\376\377\376\377\377\377\377\375\375\377\376\203\377\377\377" \
+ "\27\377\377\375\372\373\366\241\321a\217\304@\212\307<\214\306>\215\305" \
+ ">\215\305@\213\310=\212\306@\214\306>\214\305B\215\307\77\215\305>\215" \
+ "\306A\212\307>\214\306>\215\307\77\214\306>\242\322b\370\373\362\376" \
+ "\376\377\377\375\376\377\377\377\377\241\377\377\377\2\221\221\223;;" \
+ "=\202::<\202;;=\203::<\2;;=^^^\204\377\377\377\1\376\376\376\377\377" \
+ "\377\377\224\377\377\377\1\376\376\376\202\377\377\377\1``b\202::<\1" \
+ ";;=\206::<\1\234\234\234\205\377\377\377\1\376\376\376\377\377\377\377" \
+ "\342\377\377\377\7\377\377\375\375\376\377\376\377\377\376\377\375\377" \
+ "\374\377\377\377\375\375\377\376\202\377\377\377\5\372\373\366\240\320" \
+ "b\215\307\77\212\306@\215\305>\202\214\305@\20\215\305@\212\306@\214" \
+ "\305D\216\306\77\214\306>\215\307\77\214\306>\212\306@\214\306>\215\307" \
+ "\77\215\305@\242\320c\370\373\362\377\377\373\377\376\377\377\377\375" \
+ "\377\377\377\377\241\377\377\377\6\301\301\303::<;;=::<99;;;=\203::<" \
+ "\6;;=:::\377\377\377\376\376\376\377\377\377\376\376\376\377\377\377" \
+ "\377\224\377\377\377\1\376\376\376\202\377\377\377\2\363\363\363;;=\211" \
+ "::<\1\316\316\316\203\377\377\377\1\376\376\376\202\377\377\377\1\376" \
+ "\376\376\377\377\377\377\342\377\377\377\37\376\377\377\376\377\375\377" \
+ "\375\376\375\377\376\377\377\375\377\377\377\377\376\377\370\373\362" \
+ "\241\321a\215\307\77\215\307=\214\305@\214\306>\212\307<\214\306>\214" \
+ "\306<\214\306>\216\306\77\215\305<\212\307>\213\307A\215\305>\212\307" \
+ ">\215\307\77\214\306>\242\321a\373\374\364\377\377\377\376\377\377\376" \
+ "\376\376\376\377\377\377\377\377\377\241\377\377\377\1\363\363\365\202" \
+ "::<\1;;=\202::<\2""99;;;=\202::<\2;;=\316\316\316\377\377\377\377\231" \
+ "\377\377\377\10\376\376\376\316\316\316::<;;=::<;;=99;;;=\204::<\202" \
+ "\377\377\377\3\376\376\376\377\377\377\376\376\376\377\377\377\377\344" \
+ "\377\377\377\202\377\377\375\3\377\374\377\375\377\376\376\377\377\202" \
+ "\377\377\377\25\370\373\364\243\322b\217\304@\212\306@\214\305@\215\305" \
+ ">\212\307>\212\306@\214\305B\214\305@\214\305B\214\306>\212\307>\212" \
+ "\310\77\214\306>\217\304@\214\306>\214\305@\242\322b\370\373\362\377" \
+ "\377\377\202\377\376\377\1\377\377\375\377\377\377\377\243\377\377\377" \
+ "\1``b\203::<\203;;=\6::<<<>::<\234\234\234\377\377\377\376\376\376\377" \
+ "\377\377\377\230\377\377\377\1\234\234\236\204::<\12;;=99;::<;;=::<k" \
+ "km\377\377\377\376\376\376\377\377\377\376\376\376\377\377\377\377\346" \
+ "\377\377\377\1\375\377\376\202\377\377\375\34\377\377\377\376\376\376" \
+ "\373\373\363\243\322b\211\307B\212\307<\215\305>\214\306>\212\307>\214" \
+ "\305@\217\304>\212\307<\214\306<\214\306>\215\307\77\213\307A\214\306" \
+ ">\215\305@\215\307\77\212\307>\244\317c\370\373\362\377\377\373\376\377" \
+ "\377\377\376\377\375\376\377\377\377\375\377\376\377\377\377\377\377" \
+ "\242\377\377\377\2\222\222\222::<\202;;=\7""99;::<;;=::<99;;;=lln\202" \
+ "\377\377\377\1\376\376\376\377\377\377\377\225\377\377\377\3\376\376" \
+ "\376\377\377\377jjl\204;;=\2""99;;;=\202::<\2;;=\221\221\223\202\377" \
+ "\377\377\1\376\376\376\202\377\377\377\1\376\376\376\377\377\377\377" \
+ "\343\377\377\377\3\377\376\377\377\377\377\375\377\376\202\377\377\377" \
+ "\11\373\373\363\241\321d\214\306>\213\310=\214\306>\214\305@\213\310" \
+ "=\212\306@\217\304>\202\215\307=\14\214\306>\215\305>\214\306>\215\305" \
+ ">\217\304@\215\307\77\215\307=\242\320c\367\375\361\376\376\377\377\376" \
+ "\377\376\376\376\202\377\377\375\2\374\377\377\377\376\377\377\377\377" \
+ "\377\242\377\377\377\2\264\264\264;;=\206::<\6;;=::<FFH\376\376\376\377" \
+ "\377\377\376\376\376\377\377\377\377\227\377\377\377\1GGI\204::<\6;;" \
+ "=::<;;=::<;;=\302\302\304\206\377\377\377\1\376\376\376\377\377\377\377" \
+ "\342\377\377\377\1\377\377\375\202\377\377\377\32\377\376\377\370\373" \
+ "\364\243\322b\214\306>\213\310\77\214\305@\215\305>\215\305@\214\306" \
+ ">\214\305B\212\307<\215\307=\214\305B\214\306>\215\306A\212\306@\212" \
+ "\307>\214\306>\212\307<\244\317c\370\373\364\377\377\377\377\375\376" \
+ "\377\377\375\376\377\377\377\377\377\202\377\376\377\377\377\377\377" \
+ "\243\377\377\377\2\346\346\346;;=\211::<\1\346\346\350\377\377\377\377" \
+ "\230\377\377\377\3\346\346\350::<;;=\202::<\1;;=\205::<\1\346\346\346" \
+ "\302\377\377\377\5\376\376\376\377\377\377\376\376\376\377\377\377\376" \
+ "\376\376\377\377\377\377\233\377\377\377\10\376\376\377\377\377\375\377" \
+ "\377\377\377\377\375\377\377\377\377\376\377\377\377\375\376\377\377" \
+ "\202\377\377\377\6\370\373\362\243\322b\211\307B\213\310=\214\305@\214" \
+ "\306<\202\215\305@\4\214\306<\214\305@\214\306<\215\307\77\202\214\306" \
+ ">\6\212\307>\214\306>\215\307\77\214\305@\244\317c\367\375\361\345\377" \
+ "\377\377\1\376\376\376\305\377\377\377\3FFF::<;;=\202::<\3;;=::<;;=\202" \
+ "::<\1\301\301\303\377\377\377\377\230\377\377\377\4\301\301\30399;::" \
+ "<;;=\204::<\3;;=::<GGI\215\377\377\377\1\376\376\376\266\377\377\377" \
+ "\1\376\376\376\203\377\377\377\1\376\376\376\377\377\377\377\231\377" \
+ "\377\377\6\376\376\377\377\376\377\375\376\377\376\377\377\377\377\375" \
+ "\375\377\376\203\377\377\377\27\377\377\375\372\373\366\241\321a\217" \
+ "\304@\212\307<\214\306>\215\305>\215\305@\213\310=\212\306@\214\306>" \
+ "\214\305B\215\307\77\215\305>\215\306A\212\307>\214\306>\215\307\77\214" \
+ "\306>\242\322b\370\373\362\376\376\377\377\375\376\341\377\377\377\5" \
+ "\376\376\376\377\377\377\376\376\376\377\377\377\376\376\376\265\377" \
+ "\377\377\3\376\376\376\377\377\377\376\376\376\212\377\377\377\3\376" \
+ "\376\376\377\377\377lll\206::<\202;;=\2::<\234\234\236\377\377\377\377" \
+ "\224\377\377\377\1\376\376\376\203\377\377\377\2\233\233\235;;=\203:" \
+ ":<\2""99;;;=\202::<\2;;=xxz\213\377\377\377\1\376\376\376\265\377\377" \
+ "\377\1\376\376\376\377\377\377\377\240\377\377\377\7\377\377\375\375" \
+ "\376\377\376\377\377\376\377\375\377\374\377\377\377\375\375\377\376" \
+ "\202\377\377\377\5\372\373\366\240\320b\215\307\77\212\306@\215\305>" \
+ "\202\214\305@\20\215\305@\212\306@\214\305D\216\306\77\214\306>\215\307" \
+ "\77\214\306>\212\306@\214\306>\215\307\77\215\305@\242\320c\370\373\362" \
+ "\377\377\373\377\376\377\377\377\375\377\377\377\377\233\377\377\377" \
+ "\3\376\376\376\377\377\377\376\376\376\213\377\377\377\6\376\376\376" \
+ "\377\377\377\233\233\233;;=::<;;=\206::<\1lln\377\377\377\377\226\377" \
+ "\377\377\3\376\376\376\377\377\377kkm\210::<\2;;=\234\234\236\214\377" \
+ "\377\377\1\315\315\315\202\234\234\234\262\234\234\236\2\234\234\234" \
+ "\265\265\265\377\377\377\377\240\377\377\377\37\376\377\377\376\377\375" \
+ "\377\375\376\375\377\376\377\377\375\377\377\377\377\376\377\370\373" \
+ "\362\241\321a\215\307\77\215\307=\214\305@\214\306>\212\307<\214\306" \
+ ">\214\306<\214\306>\216\306\77\215\305<\212\307>\213\307A\215\305>\212" \
+ "\307>\215\307\77\214\306>\242\321a\373\374\364\377\377\377\376\377\377" \
+ "\376\376\376\376\377\377\344\377\377\377\4\376\376\376\347\347\347\234" \
+ "\234\234\235\235\235\260\234\234\236\204\234\234\234\216\377\377\377" \
+ "\1\301\301\301\202::<\1;;=\203::<\202;;=\2::<EEG\377\377\377\377\230" \
+ "\377\377\377\1FFH\204::<\202;;=\4::<;;=99;\302\302\304\212\377\377\377" \
+ "\5\376\376\376\377\377\377\234\234\234::<;;=\263::<\1jjj\205\377\377" \
+ "\377\1\376\376\376\377\377\377\377\231\377\377\377\202\377\377\375\3" \
+ "\377\374\377\375\377\376\376\377\377\202\377\377\377\25\370\373\364\243" \
+ "\322b\217\304@\212\306@\214\305@\215\305>\212\307>\212\306@\214\305B" \
+ "\214\305@\214\305B\214\306>\212\307>\212\310\77\214\306>\217\304@\214" \
+ "\306>\214\305@\242\322b\370\373\362\377\377\377\202\377\376\377\1\377" \
+ "\377\375\346\377\377\377\2\316\316\316:::\263::<\4;;=:::\377\377\377" \
+ "\376\376\376\214\377\377\377\3\346\346\346::<;;=\205::<\4;;=::<;;=\346" \
+ "\346\346\377\377\377\377\226\377\377\377\2\362\362\362;;=\204::<\3""9" \
+ "9;::<;;=\202::<\1\346\346\350\214\377\377\377\2\234\234\234;;=\264::" \
+ "<\1kkm\377\377\377\377\240\377\377\377\1\375\377\376\202\377\377\375" \
+ "\34\377\377\377\376\376\376\373\373\363\243\322b\211\307B\212\307<\215" \
+ "\305>\214\306>\212\307>\214\305@\217\304>\212\307<\214\306<\214\306>" \
+ "\215\307\77\213\307A\214\306>\215\305@\215\307\77\212\307>\244\317c\370" \
+ "\373\362\377\377\373\376\377\377\377\376\377\375\376\377\377\377\375" \
+ "\377\376\377\345\377\377\377\2\316\316\31699;\265::<\216\377\377\377" \
+ "\2\376\376\376FFH\203::<\1;;=\203::<\3;;=99;\316\316\316\377\377\377" \
+ "\377\226\377\377\377\1\317\317\317\206::<\202;;=\4""99;FFH\377\377\377" \
+ "\376\376\376\213\377\377\377\1\234\234\236\202::<\1;;=\261::<\2;;=kk" \
+ "m\205\377\377\377\1\376\376\376\377\377\377\377\231\377\377\377\3\377" \
+ "\376\377\377\377\377\375\377\376\202\377\377\377\11\373\373\363\241\321" \
+ "d\214\306>\213\310=\214\306>\214\305@\213\310=\212\306@\217\304>\202" \
+ "\215\307=\14\214\306>\215\305>\214\306>\215\305>\217\304@\215\307\77" \
+ "\215\307=\242\320c\367\375\361\376\376\377\377\376\377\376\376\376\202" \
+ "\377\377\375\2\374\377\377\377\376\377\345\377\377\377\1\316\316\316" \
+ "\264::<\202;;=\215\377\377\377\4\376\376\376\377\377\377lln99;\210::" \
+ "<\2\234\234\234\376\376\376\377\377\377\377\225\377\377\377\5\234\234" \
+ "\234::<;;=99;::<\202;;=\5::<;;=::<kkm\376\376\377\214\377\377\377\1\234" \
+ "\234\236\203::<\1:9>\261::<\1kkm\377\377\377\377\237\377\377\377\1\377" \
+ "\377\375\202\377\377\377\32\377\376\377\370\373\364\243\322b\214\306" \
+ ">\213\310\77\214\305@\215\305>\215\305@\214\306>\214\305B\212\307<\215" \
+ "\307=\214\305B\214\306>\215\306A\212\306@\212\307>\214\306>\212\307<" \
+ "\244\317c\370\373\364\377\377\377\377\375\376\377\377\375\376\377\377" \
+ "\377\377\377\202\377\376\377\346\377\377\377\1\316\316\316\266::<\217" \
+ "\377\377\377\2\234\234\236;;=\206::<\3""99;;;=www\377\377\377\377\226" \
+ "\377\377\377\3\204\204\206::<;;=\207::<\3\222\222\222\377\377\377\376" \
+ "\376\376\213\377\377\377\1\234\234\236\265::<\1kkm\377\377\377\377\210" \
+ "\377\377\377\7\376\376\376\377\377\377\377\377\375\376\377\375\376\377" \
+ "\377\377\377\377\377\376\377\203\377\377\377\1\376\376\376\203\377\377" \
+ "\377\1\376\377\377\203\377\377\377\16\377\377\375\377\377\377\377\376" \
+ "\377\377\377\377\377\377\373\376\377\377\377\377\377\377\377\373\371" \
+ "\372\364\242\322d\214\306<\215\307\77\214\305@\214\306<\202\215\305@" \
+ "\4\214\306<\214\305@\214\306<\215\307\77\202\214\306>\6\212\307>\214" \
+ "\306>\215\307\77\214\305@\244\317c\367\375\361\356\377\377\377\1\316" \
+ "\316\316\266::<\214\377\377\377\1\376\376\376\202\377\377\377\1\266\266" \
+ "\266\202::<\1;;=\203::<\1;;=\202::<\3__a\377\377\377\376\376\376\377" \
+ "\377\377\377\224\377\377\377\2kkm;;=\202::<\202;;=\202::<\3;;=::<\265" \
+ "\265\265\215\377\377\377\1\234\234\236\265::<\1kkm\377\377\377\377\214" \
+ "\377\377\377\2\376\377\377\376\377\375\202\377\377\375\203\377\377\377" \
+ "\204\377\377\375\205\377\377\377\1\376\376\377\202\377\377\377\6\377" \
+ "\377\375\377\377\377\371\372\362\242\320c\214\305@\215\305@\202\214\306" \
+ ">\20\215\305@\213\310=\212\306@\214\306>\214\305B\215\307\77\215\305" \
+ ">\215\306A\212\307>\214\306>\215\307\77\214\306>\242\322b\370\373\362" \
+ "\376\376\377\377\375\376\355\377\377\377\1\316\316\316\266::<\215\377" \
+ "\377\377\4\376\376\376\377\377\377\315\315\315;;=\203::<\1;;=\203::<" \
+ "\2;;=99;\377\377\377\377\226\377\377\377\203::<\1;;=\202::<\1;;=\203" \
+ "::<\2\317\317\317\376\376\376\214\377\377\377\1\234\234\236\265::<\1" \
+ "kkm\377\377\377\377\211\377\377\377\3\376\376\376\377\376\377\377\377" \
+ "\377\203\377\376\377\204\377\377\377\1\376\376\376\202\377\377\377\1" \
+ "\377\376\377\203\377\377\377\1\376\376\376\203\377\377\377\31\376\376" \
+ "\377\377\376\377\371\372\365\241\322e\212\307<\216\306\77\212\311<\216" \
+ "\303\77\212\307>\215\305@\212\306@\214\305D\216\306\77\214\306>\215\307" \
+ "\77\214\306>\212\306@\214\306>\215\307\77\215\305@\242\320c\370\373\362" \
+ "\377\377\373\377\376\377\377\377\375\355\377\377\377\1\316\316\316\266" \
+ "::<\220\377\377\377\202::<\4;;=::<;;=::<\202;;=\3""99;;;=\346\346\346" \
+ "\377\377\377\377\224\377\377\377\2\362\362\362;;=\202::<\7""99;::<;;" \
+ "=88:;;=::<;;=\216\377\377\377\1\234\234\236\265::<\1kkm\377\377\377\377" \
+ "\212\377\377\377\202\376\377\377\202\377\377\377\1\377\376\377\206\377" \
+ "\377\377\1\376\376\376\202\377\377\377\1\376\376\376\203\377\377\377" \
+ "\1\376\376\376\202\377\377\377\6\370\373\364\242\322b\214\306>\214\305" \
+ "@\215\305>\214\305@\202\215\306A\20\214\306<\214\306>\216\306\77\215" \
+ "\305<\212\307>\213\307A\215\305>\212\307>\215\307\77\214\306>\242\321" \
+ "a\373\374\364\377\377\377\376\377\377\376\376\376\376\377\377\355\377" \
+ "\377\377\1\316\316\316\266::<\216\377\377\377\6\376\376\376\377\377\377" \
+ "SSU;;=99;;;=\206::<\1\316\316\316\377\377\377\377\224\377\377\377\2\316" \
+ "\316\31699;\205::<\1;;=\202::<\1FFH\216\377\377\377\1\234\234\236\265" \
+ "::<\1kkm\377\377\377\377\207\377\377\377\202\377\376\377\2\377\377\377" \
+ "\377\377\375\203\377\377\377\1\376\377\375\202\377\377\375\203\377\377" \
+ "\377\202\377\377\375\2\377\377\377\377\377\375\205\377\377\377\26\377" \
+ "\377\375\371\372\362\243\322b\211\305A\215\305>\215\307\77\214\305@\214" \
+ "\306>\215\305@\212\307>\214\305@\214\305B\214\306>\212\307>\212\310\77" \
+ "\214\306>\217\304@\214\306>\214\305@\242\322b\370\373\362\377\377\377" \
+ "\202\377\376\377\1\377\377\375\356\377\377\377\1\316\316\316\266::<\220" \
+ "\377\377\377\3kkm::<;;=\202::<\6;;=::<;;=::<;;=\233\233\233\377\377\377" \
+ "\377\223\377\377\377\2\376\376\376\265\265\265\205::<\1;;=\202::<\2""9" \
+ "9;lln\216\377\377\377\1\234\234\236\265::<\1kkm\377\377\377\377\207\377" \
+ "\377\377\3\376\377\375\375\377\376\377\377\377\202\377\376\377\3\377" \
+ "\376\374\377\377\377\376\377\377\202\377\377\377\1\377\377\375\204\377" \
+ "\377\377\2\375\377\376\377\377\375\202\377\377\377\1\377\377\375\202" \
+ "\377\377\377\32\376\376\374\365\367\354\223\312K\215\305>\214\306<\211" \
+ "\305\77\214\306>\212\307>\215\307\77\214\306>\214\306<\214\306>\215\307" \
+ "\77\213\307A\214\306>\215\305@\215\307\77\212\307>\244\317c\370\373\362" \
+ "\377\377\373\376\377\377\377\376\377\375\376\377\377\377\375\377\376" \
+ "\377\355\377\377\377\1\316\316\316\266::<\217\377\377\377\5\376\376\376" \
+ "\234\234\236;;=::<;;=\202::<\2""99;::<\202;;=\1\221\221\221\377\377\377" \
+ "\377\224\377\377\377\1\235\235\235\211::<\2\221\221\223\376\376\376\215" \
+ "\377\377\377\1\234\234\236\265::<\1kkm\377\377\377\377\207\377\377\377" \
+ "\1\377\376\377\202\377\377\375\202\377\377\377\202\377\377\375\1\377" \
+ "\377\377\202\376\377\377\1\377\377\377\202\377\377\375\5\376\376\377" \
+ "\377\377\377\377\377\373\377\377\377\376\376\376\203\377\377\377\27\376" \
+ "\376\376\377\377\375\376\377\372\347\365\333\225\311K\217\304>\214\305" \
+ "B\215\307\77\212\306B\214\306>\215\306A\214\306>\215\305>\214\306>\215" \
+ "\305>\217\304@\215\307\77\215\307=\242\320c\367\375\361\376\376\377\377" \
+ "\376\377\376\376\376\202\377\377\375\2\374\377\377\377\376\377\355\377" \
+ "\377\377\1\316\316\316\266::<\214\377\377\377\1\376\376\376\203\377\377" \
+ "\377\3\250\250\252::<;;=\203::<\202;;=\202::<\1kkk\377\377\377\377\224" \
+ "\377\377\377\4www;;=::<;;=\202::<\202;;=\202::<\1\234\234\236\216\377" \
+ "\377\377\1\234\234\236\265::<\1kkm\377\377\377\377\207\377\377\377\15" \
+ "\367\374\365\343\361\316\316\346\254\305\342\240\304\343\240\303\342" \
+ "\236\305\342\237\312\346\251\345\356\317\365\373\357\376\377\377\376" \
+ "\376\377\377\377\375\214\377\377\377\24\350\365\333\223\312K\216\306" \
+ "\77\212\307>\215\304B\214\306>\215\307=\214\306>\215\306A\212\306@\212" \
+ "\307>\214\306>\212\307<\244\317c\370\373\364\377\377\377\377\375\376" \
+ "\377\377\375\376\377\377\377\377\377\202\377\376\377\356\377\377\377" \
+ "\1\316\316\316\266::<\217\377\377\377\2\376\376\376\316\316\320\207:" \
+ ":<\3;;=::<SSS\377\377\377\377\223\377\377\377\2\376\376\376kkm\202::" \
+ "<\1;;=\206::<\1\316\316\316\377\377\377\377\276\377\377\377\4\377\377" \
+ "\375\376\377\377\377\377\377\377\376\377\202\377\377\377\10\377\377\375" \
+ "\377\376\377\376\377\375\376\376\376\377\377\377\350\365\333\277\337" \
+ "\224\232\315V\210\214\306>\10\212\306@\212\307>\232\315W\277\337\224" \
+ "\352\364\333\377\377\377\377\376\377\377\377\375\202\376\377\377\202" \
+ "\377\377\377\2\377\376\377\377\377\375\202\377\377\377\17\377\377\375" \
+ "\377\376\377\347\365\333\226\312L\215\306A\213\310=\212\306@\217\304" \
+ ">\216\307<\214\305@\215\305<\214\305@\215\307=\244\317c\366\373\364\377" \
+ "\377\377\377\276\377\377\377\6\346\346\346;;=99;;;=::<;;=\205::<\377" \
+ "\377\377\377\224\377\377\377\1::<\202;;=\2::<;;=\203::<\4;;=::<\316\316" \
+ "\316\376\376\376\377\377\377\377\274\377\377\377\14\377\375\377\377\377" \
+ "\377\376\376\374\377\377\375\377\376\377\377\377\375\376\377\377\377" \
+ "\377\377\376\377\377\377\376\377\324\353\265\231\316Z\202\214\306<\1" \
+ "\215\305>\210\214\306>\202\215\305>\16\214\306>\213\307A\211\306;\233" \
+ "\314V\324\353\265\377\377\377\377\376\377\377\377\375\375\377\376\376" \
+ "\377\377\377\377\377\377\376\377\376\377\377\377\377\373\202\377\377" \
+ "\377\6\376\376\377\350\365\333\222\312K\215\306A\217\304>\212\306@\202" \
+ "\214\305@\6\213\310\77\212\307>\242\322d\370\373\364\377\377\377\377" \
+ "\377\375\377\377\377\377\276\377\377\377\203::<\3;;=::<99;\202;;=\202" \
+ "::<\1\346\346\350\377\377\377\377\222\377\377\377\2\376\376\376;;=\202" \
+ "::<\202;;=\205::<\377\377\377\377\275\377\377\377\4\377\377\375\377\377" \
+ "\377\377\377\373\377\376\374\202\376\377\377\12\377\377\375\377\377\377" \
+ "\376\377\375\342\360\317\232\315V\214\306<\220\306=\215\306A\215\306" \
+ "C\215\306A\210\214\306>\202\215\307\77\7\215\306A\214\306>\214\305@\213" \
+ "\307A\214\305@\230\315W\341\361\315\203\377\377\377\2\376\376\374\374" \
+ "\377\375\202\377\377\377\2\377\377\375\377\376\377\202\377\377\377\13" \
+ "\352\364\331\221\311J\215\306A\213\310=\216\306\77\214\305@\214\306<" \
+ "\242\322e\370\373\364\376\376\377\377\377\375\377\377\377\377\277\377" \
+ "\377\377\1``b\202::<\2;;=99;\202;;=\4::<;;=::<\316\316\320\377\377\377" \
+ "\377\222\377\377\377\4\316\316\316;;=::<99;\202::<\2;;=::<\202;;=\3:" \
+ ":<\376\376\376\377\377\377\202\376\376\376\377\377\377\377\271\377\377" \
+ "\377\17\376\377\377\376\376\374\377\376\374\376\377\377\377\377\377\377" \
+ "\377\375\376\377\377\370\373\364\277\336\222\215\305<\214\305@\215\307" \
+ "\77\212\307>\215\307\77\213\307A\211\214\306>\16\216\306A\214\305B\213" \
+ "\307A\214\306>\215\305<\213\305=\215\306A\214\306<\215\305>\300\337\223" \
+ "\370\373\362\376\376\377\377\377\375\376\377\377\204\377\377\377\16\377" \
+ "\376\377\376\376\377\376\377\377\352\364\331\222\312K\215\306A\214\306" \
+ "<\214\305@\243\321d\371\373\360\376\376\377\376\377\377\377\377\377\376" \
+ "\377\377\377\377\377\377\273\377\377\377\4\376\376\376\377\377\377\376" \
+ "\376\376lln\203::<\1;;=\20299;\1;;=\202::<\1\266\266\270\377\377\377" \
+ "\377\222\377\377\377\5\316\316\316::<;;=::<;;=\205::<\3kkm\377\377\377" \
+ "\376\376\376\377\377\377\377\274\377\377\377\14\377\377\375\376\377\377" \
+ "\377\377\377\377\377\375\376\376\376\367\374\365\244\317c\214\305@\215" \
+ "\307=\211\306=\213\307A\215\306A\202\212\306@\1\213\310<\210\214\306" \
+ ">\202\212\307>\3\212\307<\214\306>\216\306\77\202\214\306>\12\215\305" \
+ "<\215\307\77\212\306@\242\322b\371\374\365\377\377\375\376\376\374\376" \
+ "\377\377\377\376\377\376\377\377\202\377\377\377\13\376\377\375\376\376" \
+ "\377\377\377\377\350\365\333\225\311K\214\305B\242\320c\371\374\361\377" \
+ "\377\377\376\377\377\377\376\377\377\377\377\377\300\377\377\377\7\221" \
+ "\221\223::<99;::<;;=::<;;=\203::<\1\234\234\236\377\377\377\377\222\377" \
+ "\377\377\2\250\250\25099;\206::<\3;;=::<jjl\377\377\377\377\275\377\377" \
+ "\377\202\377\376\377\16\376\377\377\377\377\375\376\376\376\352\364\333" \
+ "\223\312K\220\306=\215\306A\214\305B\213\310=\215\306C\215\305>\216\306" \
+ "\77\215\305>\215\305@\210\214\306>\37\215\305@\215\307\77\212\306@\215" \
+ "\307\77\214\304\77\215\306A\212\307;\212\306@\214\306>\216\307B\214\306" \
+ ">\222\312K\354\364\334\377\376\377\377\377\377\377\377\373\376\377\377" \
+ "\377\375\376\376\377\375\377\377\377\377\376\377\377\377\377\376\376" \
+ "\377\347\365\333\260\327z\371\374\363\375\377\376\376\377\377\377\376" \
+ "\377\377\377\377\377\377\375\377\377\377\377\276\377\377\377\3\376\376" \
+ "\376\234\234\23699;\203;;=\205::<\1\221\221\223\377\377\377\377\222\377" \
+ "\377\377\2\234\234\234;;=\204::<\202;;=\3::<;;=\235\235\237\377\377\377" \
+ "\377\276\377\377\377\202\377\377\375\15\376\377\377\367\374\365\223\312" \
+ "K\214\306>\213\310\77\215\305@\214\306<\215\307=\214\305@\213\307A\211" \
+ "\305\77\215\307\77\215\305>\210\214\306>\20\215\306A\213\305=\215\307" \
+ "=\214\305@\215\306A\214\306>\213\304A\220\305\77\216\306\77\212\306@" \
+ "\215\305@\213\307A\221\311L\367\375\363\376\377\377\377\377\377\202\377" \
+ "\377\373\1\377\375\376\202\377\377\377\4\377\376\377\376\377\377\377" \
+ "\376\377\376\377\377\203\377\377\377\3\377\376\377\376\376\377\374\377" \
+ "\375\377\377\377\377\277\377\377\377\2\265\265\267<<>\20299;\7::<;;=" \
+ "::<99;;;=::<lln\377\377\377\377\222\377\377\377\3\221\221\221::<;;=\205" \
+ "::<\3;;=::<\234\234\236\377\377\377\377\276\377\377\377\17\376\377\377" \
+ "\377\377\377\366\373\364\244\317c\220\306=\213\310\77\212\306@\211\307" \
+ "@\216\306\77\215\305@\215\307\77\213\310\77\215\307\77\215\305>\214\305" \
+ "@\210\214\306>\22\216\306A\215\307\77\213\305=\216\306\77\214\306>\212" \
+ "\307>\213\310\77\214\305@\215\306C\214\306<\215\307=\215\305>\213\310" \
+ "=\242\320d\372\372\362\376\377\375\377\375\377\377\377\375\202\376\377" \
+ "\377\5\377\377\377\377\377\375\377\377\377\377\377\375\377\377\377\202" \
+ "\377\376\377\5\376\377\375\376\377\377\377\377\377\377\375\376\377\377" \
+ "\375\377\377\377\377\274\377\377\377\5\376\376\376\377\377\377\316\316" \
+ "\320::<;;=\202::<\1;;=\202::<\3""99;::<kkm\377\377\377\377\222\377\377" \
+ "\377\2kkm::<\203;;=\205::<\1\264\264\264\377\377\377\377\275\377\377" \
+ "\377\10\377\376\377\376\377\377\377\377\377\300\336\224\212\307>\214" \
+ "\306<\214\306>\211\307>\231\214\306>\1\216\306\77\203\214\306>\2\214" \
+ "\305@\266\334\207\202\377\377\377\7\377\376\377\377\377\377\377\376\377" \
+ "\377\377\375\377\377\377\377\377\375\376\377\377\377\377\377\377\303" \
+ "\377\377\377\1\376\376\376\202\377\377\377\1\316\316\316\206::<\6;;=" \
+ "::<;;=FFH\377\377\377\376\376\376\205\377\377\377\1\376\376\376\377\377" \
+ "\377\377\212\377\377\377\1lln\202::<\3;;=99;;;=\204::<\3\317\317\317" \
+ "\377\377\377\376\376\376\377\377\377\377\273\377\377\377\10\377\375\377" \
+ "\374\377\375\343\361\320\214\306>\215\306A\214\304=\212\307>\215\305" \
+ ">\230\214\306>\20\214\306<\213\304\77\212\307>\212\306B\214\306<\212" \
+ "\307>\220\304>\337\363\316\377\376\377\377\377\377\376\377\377\377\377" \
+ "\377\376\376\377\377\377\377\376\376\376\376\377\377\377\377\377\377" \
+ "\302\377\377\377\1\376\376\376\202\377\377\377\2\376\376\376\377\377" \
+ "\377\204::<\1;;=\202::<\3;;=99;;;=\203\377\377\377\1\376\376\376\202" \
+ "\377\377\377\1\376\376\376\377\377\377\377\213\377\377\377\2SSU;;=\202" \
+ "::<\2;;=99;\204::<\1\315\315\315\203\377\377\377\1\376\376\376\377\377" \
+ "\377\377\271\377\377\377\10\376\376\376\377\377\377\233\316W\214\305" \
+ "@\212\306@\216\306=\214\305@\215\305@\230\214\306>\17\214\306<\215\306" \
+ "C\211\306=\213\307A\214\304\77\212\306@\214\305B\234\313W\376\377\375" \
+ "\377\377\377\376\377\375\377\377\375\376\377\377\376\376\377\376\377" \
+ "\375\377\377\377\377\302\377\377\377\1\376\376\376\202\377\377\377\4" \
+ "\376\376\376\377\377\377\376\376\376;;=\206::<\202;;=\3::<\377\377\377" \
+ "\376\376\376\203\377\377\377\3\376\376\376\377\377\377\376\376\376\377" \
+ "\377\377\377\212\377\377\377\3::<99;;;=\202::<\10;;=::<;;=99;;;=\363" \
+ "\363\363\377\377\377\376\376\376\377\377\377\377\274\377\377\377\7\323" \
+ "\354\265\214\305@\215\307\77\215\306A\216\305C\213\304\77\212\307<\230" \
+ "\214\306>\20\215\307\77\215\304B\214\305@\214\306>\215\305>\215\307=" \
+ "\212\307<\215\307\77\323\351\270\377\376\377\377\377\377\376\376\376" \
+ "\376\377\375\376\376\376\376\377\377\377\376\374\377\377\377\377\302" \
+ "\377\377\377\202\376\376\376\202\377\377\377\2\376\376\376FFH\210::<" \
+ "\2;;=\316\316\316\202\377\377\377\1\376\376\376\377\377\377\377\215\377" \
+ "\377\377\1\376\376\376\202;;=\4""99;;;=::<;;=\202::<\2;;=::<\377\377" \
+ "\377\377\277\377\377\377\7\231\316X\220\304>\214\305@\215\307\77\214" \
+ "\306<\214\311>\214\305@\231\214\306>\11\215\304B\214\306>\215\306A\214" \
+ "\306<\215\306A\214\305B\215\307\77\234\315X\375\377\374\204\377\377\377" \
+ "\2\376\377\377\377\376\377\377\377\377\377\304\377\377\377\202\376\376" \
+ "\376\4\377\377\377jjl::<99;\202;;=\205::<\7\316\316\316\377\377\377\376" \
+ "\376\376\377\377\377\376\376\376\377\377\377\376\376\376\377\377\377" \
+ "\377\212\377\377\377\6\363\363\363::<99;;;=::<;;=\202::<\1;;=\202::<" \
+ "\377\377\377\377\276\377\377\377\2\342\361\320\214\306<\202\215\305>" \
+ "\4\212\307>\215\307=\211\306=\215\305>\230\214\306>\2\213\310=\214\306" \
+ "<\202\214\305@\7\215\306A\214\306>\215\307=\214\304\77\211\310<\343\362" \
+ "\321\377\377\375\202\377\376\377\2\377\377\375\376\376\376\377\377\377" \
+ "\377\310\377\377\377\4kkm::<;;=::<\202;;=\202::<\3;;=::<\316\316\316" \
+ "\202\377\377\377\1\376\376\376\377\377\377\377\215\377\377\377\3\316" \
+ "\316\316::<;;=\202::<\1;;=\204::<\1__a\202\377\377\377\3\376\376\376" \
+ "\377\377\377\376\376\376\377\377\377\377\271\377\377\377\4\270\333\207" \
+ "\214\306>\214\305@\214\306>\203\214\305@\1\215\305>\230\214\306>\17\215" \
+ "\306A\213\310=\212\307<\214\306>\214\306<\215\306A\214\306>\214\305@" \
+ "\213\306E\267\332\206\377\377\375\376\377\377\377\377\375\377\377\377" \
+ "\377\377\375\377\377\377\377\303\377\377\377\1\376\376\376\204\377\377" \
+ "\377\6lln;;=::<99;::<;;=\204::<\1\250\250\250\204\377\377\377\1\376\376" \
+ "\376\377\377\377\377\213\377\377\377\1\316\316\316\203::<\1;;=\205::" \
+ "<\1lln\203\377\377\377\1\376\376\376\377\377\377\377\272\377\377\377" \
+ "\10\232\315V\215\305@\212\306@\215\305>\214\306<\215\304D\215\305<\212" \
+ "\306@\230\214\306>\3\217\304@\214\306<\215\306A\202\215\305@\7\214\306" \
+ ">\214\305@\212\307>\215\305<\233\316W\376\376\377\376\377\375\203\377" \
+ "\377\377\1\376\377\377\377\377\377\377\305\377\377\377\3\376\376\376" \
+ "\377\377\377\234\234\236\203::<\2;;=99;\204::<\1\234\234\234\202\377" \
+ "\377\377\1\376\376\376\377\377\377\377\215\377\377\377\5\316\316\320" \
+ "::<;;=::<;;=\202::<\1;;=\202::<\1kkm\377\377\377\377\266\377\377\377" \
+ "\10\375\377\374\376\377\377\376\376\376\377\377\375\377\377\377\376\377" \
+ "\377\377\377\375\360\371\350\250\214\306>\4\214\305@\212\307>\360\371" \
+ "\346\376\377\375\202\377\377\377\1\377\377\375\377\377\377\377\304\377" \
+ "\377\377\1\376\376\376\203\377\377\377\1\234\234\234\211::<\1\234\234" \
+ "\234\205\377\377\377\1\376\376\376\377\377\377\377\212\377\377\377\4" \
+ "\316\316\320llnkkmlln\203kkm\1jjl\202kkm\1\221\221\223\377\377\377\377" \
+ "\270\377\377\377\1\377\376\377\202\377\377\377\3\375\376\377\377\377" \
+ "\375\341\361\315\251\214\306>\2\215\307\77\342\360\314\377\377\377\377" \
+ "\310\377\377\377\202\376\376\376\202\377\377\377\2\266\266\266kkk\210" \
+ "kkm\1\265\265\265\206\377\377\377\1\376\376\376\377\377\377\377\211\377" \
+ "\377\377\1\376\376\376\203\377\377\377\3\376\376\376\377\377\377\376" \
+ "\376\376\202\377\377\377\1\376\376\376\202\377\377\377\1\376\376\376" \
+ "\377\377\377\377\264\377\377\377\1\377\376\377\205\377\377\377\2\375" \
+ "\377\374\310\340\246\252\214\306>\1\310\340\246\377\377\377\377\307\377" \
+ "\377\377\1\376\376\376\202\377\377\377\3\375\375\375\377\377\377\376" \
+ "\376\376\211\377\377\377\7\376\376\376\377\377\377\376\376\376\377\377" \
+ "\377\376\376\376\377\377\377\376\376\376\377\377\377\377\213\377\377" \
+ "\377\1\376\376\376\204\377\377\377\1\376\376\376\206\377\377\377\1\376" \
+ "\376\376\377\377\377\377\263\377\377\377\1\377\376\377\204\377\377\377" \
+ "\3\376\376\377\376\377\375\304\342\234\251\214\306>\7\215\305@\305\343" \
+ "\235\376\376\377\377\377\377\376\376\377\377\376\377\377\377\375\377" \
+ "\377\377\377\306\377\377\377\1\376\376\376\217\377\377\377\3\376\376" \
+ "\376\377\377\377\376\376\376\377\377\377\377\214\377\377\377\5\376\376" \
+ "\376\377\377\377\376\376\376\377\377\377\376\376\376\203\377\377\377" \
+ "\1\376\376\376\377\377\377\377\267\377\377\377\1\377\377\375\202\377" \
+ "\377\377\3\377\376\377\376\377\375\305\342\237\251\214\306>\3\215\305" \
+ "@\303\344\235\376\376\376\202\377\377\377\1\377\376\377\377\377\377\377" \
+ "\305\377\377\377\1\376\376\376\203\377\377\377\1\376\376\376\214\377" \
+ "\377\377\1\376\376\376\377\377\377\377\216\377\377\377\1\376\376\376" \
+ "\203\377\377\377\1\376\376\376\206\377\377\377\1\376\376\376\377\377" \
+ "\377\377\266\377\377\377\5\376\377\377\376\376\377\377\376\377\377\377" \
+ "\377\305\342\242\251\214\306>\4\215\306A\302\341\236\377\377\375\376" \
+ "\376\376\377\377\377\377\305\377\377\377\1\376\376\376\203\377\377\377" \
+ "\1\376\376\376\214\377\377\377\1\376\376\376\377\377\377\377\231\377" \
+ "\377\377\3\376\376\376\377\377\377\376\376\376\377\377\377\377\264\377" \
+ "\377\377\2\376\376\376\377\376\377\202\376\377\377\202\377\377\377\1" \
+ "\305\342\240\251\214\306>\7\214\305@\306\343\240\377\376\374\377\377" \
+ "\377\376\377\377\377\377\377\376\376\376\377\377\377\377\325\377\377" \
+ "\377\1\376\376\376\377\377\377\377\222\377\377\377\1\376\376\376\205" \
+ "\377\377\377\1\376\376\376\377\377\377\377\265\377\377\377\4\377\377" \
+ "\375\377\376\377\375\377\376\376\377\375\202\377\377\377\1\305\343\235" \
+ "\251\214\306>\4\213\310\77\306\341\234\377\376\377\377\377\377\202\376" \
+ "\377\375\377\377\377\377\311\377\377\377\1\377\377\375\215\377\377\377" \
+ "\1\376\376\376\377\377\377\377\377\377\377\377\314\377\377\377\3\377" \
+ "\377\375\377\377\377\376\377\375\203\377\377\377\11\376\377\377\345\360" \
+ "\320\214\305@\214\306>\214\305@\214\304\77\214\306<\215\305>\212\307" \
+ ">\231\214\306>\1\214\305@\202\215\307\77\205\214\306>\5\212\307>\214" \
+ "\306>\342\360\315\377\377\377\376\376\376\202\377\377\377\1\377\377\375" \
+ "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\244" \
+ "\377\377\377\3\377\376\377\377\377\377\376\377\375\203\377\377\377\11" \
+ "\376\377\377\362\371\347\214\306>\214\305B\215\310<\215\306A\214\305" \
+ "@\215\307\77\214\305@\231\214\306>\4\215\307\77\213\305=\214\306>\215" \
+ "\307\77\202\214\306>\5\215\307\77\214\306>\216\306\77\215\306A\360\367" \
+ "\345\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \
+ "\251\377\377\377\2\377\376\377\377\377\375\203\377\377\377\13\377\377" \
+ "\375\377\377\377\375\377\374\233\316W\214\305@\213\304\77\212\306@\215" \
+ "\307\77\214\305@\215\306A\214\305@\230\214\306>\3\215\307\77\214\306" \
+ ">\215\306A\203\214\305@\7\215\306A\214\305@\215\304B\232\315T\377\377" \
+ "\375\376\377\377\377\377\375\377\377\377\377\377\377\377\377\377\377" \
+ "\377\377\377\377\377\377\250\377\377\377\1\377\377\375\205\377\377\377" \
+ "\11\377\376\377\267\333\204\213\307A\213\307C\215\307\77\213\304\77\215" \
+ "\307\77\215\305<\212\306@\231\214\306>\1\215\307\77\203\214\305@\202" \
+ "\214\306>\7\215\307\77\212\306@\267\333\204\377\376\377\376\377\377\377" \
+ "\377\375\376\376\376\377\377\377\377\377\377\377\377\377\377\377\377" \
+ "\377\377\377\377\247\377\377\377\17\377\377\375\377\377\377\377\377\375" \
+ "\376\376\376\377\377\377\377\377\375\376\376\377\334\354\305\211\306" \
+ "=\213\307A\213\305;\215\306A\214\306<\215\305>\213\307A\232\214\306>" \
+ "\202\214\305@\11\214\306>\214\306<\214\306>\215\307\77\212\311=\333\355" \
+ "\305\377\376\377\377\377\377\376\376\376\377\377\377\377\377\377\377" \
+ "\377\377\377\377\377\377\377\377\377\252\377\377\377\3\377\377\375\377" \
+ "\377\377\377\376\377\203\377\377\375\7\233\314V\215\307\77\215\305>\214" \
+ "\306>\215\307\77\214\305@\212\307>\232\214\306>\14\214\305@\214\306>" \
+ "\214\306<\215\307=\215\307\77\214\305@\232\315V\374\377\373\376\376\377" \
+ "\377\377\375\377\377\377\376\376\376\377\377\377\377\377\377\377\377" \
+ "\377\377\377\377\377\377\377\377\255\377\377\377\10\377\377\375\377\376" \
+ "\377\324\353\267\214\304\77\215\305>\214\305@\212\307<\214\305@\232\214" \
+ "\306>\2\215\307\77\215\306A\202\214\306>\4\215\307\77\213\304\77\215" \
+ "\306E\316\346\254\202\377\377\377\3\377\377\375\376\376\377\376\377\377" \
+ "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\247" \
+ "\377\377\377\1\376\376\376\206\377\377\377\10\377\377\373\375\376\377" \
+ "\232\315W\214\306>\215\307=\211\307>\215\306A\215\305>\232\214\306>\1" \
+ "\214\305@\202\215\307\77\13\214\305@\215\306E\227\317P\377\377\377\377" \
+ "\377\375\376\377\377\377\377\377\377\377\375\375\377\376\377\377\377" \
+ "\377\377\375\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \
+ "\377\377\254\377\377\377\20\376\377\377\377\375\377\331\356\303\215\305" \
+ "@\213\310\77\215\305>\216\306\77\213\307A\215\306A\214\306<\214\306>" \
+ "\216\306\77\213\304\77\212\307<\214\306>\215\305@\210\214\306>\1\214" \
+ "\305@\202\215\307\77\205\214\306>\10\214\305@\212\307>\215\305>\214\305" \
+ "@\215\305>\214\305@\215\305>\331\356\305\377\377\377\377\377\377\377" \
+ "\377\377\377\377\377\377\377\377\377\264\377\377\377\20\376\376\374\377" \
+ "\377\375\376\376\374\261\330{\214\306>\216\306A\214\306>\213\307A\215" \
+ "\305>\215\306A\215\307\77\213\304A\215\307\77\214\305@\214\306<\216\306" \
+ "A\210\214\306>\4\215\307\77\213\305=\214\306>\215\307\77\202\214\306" \
+ ">\12\215\307\77\214\306>\212\307>\220\305\77\212\307>\214\306>\213\310" \
+ "=\214\306<\262\327z\376\377\377\377\377\377\377\377\377\377\377\377\377" \
+ "\377\377\377\377\377\377\265\377\377\377\17\374\377\377\377\377\377\370" \
+ "\373\362\241\321d\211\310<\215\305>\215\305@\216\306=\214\305@\214\306" \
+ ">\215\307\77\214\306>\212\307<\212\306@\212\307<\210\214\306>\3\215\307" \
+ "\77\214\306>\215\306A\203\214\305@\12\215\306A\214\305@\215\305>\212" \
+ "\307>\213\307A\216\305C\215\307=\242\322e\371\372\364\375\377\376\377" \
+ "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\264\377" \
+ "\377\377\1\375\377\374\203\377\377\377\4\352\364\333\223\311O\212\306" \
+ "@\215\305@\202\213\310\77\202\214\306>\4\216\307F\213\305=\215\307\77" \
+ "\215\305@\211\214\306>\1\215\307\77\203\214\305@\202\214\306>\1\215\307" \
+ "\77\202\214\305@\6\216\305C\215\307\77\225\311K\351\363\332\377\377\377" \
+ "\376\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \
+ "\377\377\265\377\377\377\17\377\375\376\377\376\377\377\377\377\377\377" \
+ "\375\352\365\327\223\313L\212\307<\215\305>\214\305@\215\307=\214\305" \
+ "@\214\306<\213\310\77\213\304\77\220\305A\212\214\306>\202\214\305@\12" \
+ "\214\306>\214\306<\214\306>\215\307\77\214\306>\213\310=\215\307=\225" \
+ "\311K\347\365\334\377\377\375\377\377\377\377\377\377\377\377\377\377" \
+ "\377\377\377\377\377\377\267\377\377\377\1\377\377\375\202\377\377\377" \
+ "\13\377\376\377\376\377\377\353\363\334\245\320d\214\305B\214\305@\215" \
+ "\306A\213\305=\214\306>\213\307A\213\310=\213\214\306>\5\214\305@\214" \
+ "\306>\214\306<\215\307=\215\307\77\202\214\305@\5\214\306<\242\322e\351" \
+ "\363\332\377\377\375\376\376\376\377\377\377\377\377\377\377\377\377" \
+ "\377\377\377\377\377\377\377\267\377\377\377\1\376\376\374\202\377\377" \
+ "\375\6\376\377\377\377\376\377\377\377\375\371\372\364\255\330|\217\304" \
+ ">\202\212\306@\2\215\306A\214\303A\202\214\305@\211\214\306>\2\215\307" \
+ "\77\215\306A\202\214\306>\6\215\307\77\213\304\77\215\306E\215\305>\262" \
+ "\327z\371\372\364\203\377\377\377\2\376\377\377\377\377\375\377\377\377" \
+ "\377\377\377\377\377\377\377\377\377\377\377\377\377\264\377\377\377" \
+ "\1\376\376\376\202\377\377\377\2\377\377\375\377\376\377\203\377\377" \
+ "\377\6\377\377\375\331\356\303\233\314W\215\310<\214\305@\215\307\77" \
+ "\214\214\306>\1\214\305@\202\215\307\77\7\214\305@\215\306E\227\317P" \
+ "\331\356\305\376\377\377\375\377\376\376\377\377\202\377\377\377\2\377" \
+ "\377\375\376\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \
+ "\377\377\377\377\274\377\377\377\10\377\377\375\377\376\377\365\375\362" \
+ "\307\342\237\234\315Z\212\306@\212\307>\214\305@\202\215\307\77\16\214" \
+ "\306>\215\307\77\214\306>\215\306A\214\306>\213\310\77\214\306>\215\305" \
+ "<\216\306A\213\310\77\212\307>\232\315T\307\341\242\370\373\362\377\377" \
+ "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\304\377\377" \
+ "\377\1\377\377\375\202\377\377\377\10\377\376\377\376\376\374\335\354" \
+ "\303\270\333\207\222\311J\214\305@\215\306A\213\305=\202\214\306>\13" \
+ "\215\307\77\216\306\77\215\305>\212\306@\212\307>\226\312K\270\333\211" \
+ "\334\354\307\376\377\377\376\376\376\377\377\375\377\377\377\377\377" \
+ "\377\377\377\377\377\377\377\377\377\377\377\306\377\377\377\2\376\377" \
+ "\375\376\377\377\204\377\377\377\16\350\366\334\332\354\302\311\341\245" \
+ "\306\341\234\305\342\237\304\341\237\305\342\240\305\342\237\334\355" \
+ "\303\352\364\333\377\377\375\377\375\376\377\376\377\377\377\375\377" \
+ "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\307\377" \
+ "\377\377\15\376\376\376\377\376\377\377\377\375\377\377\373\376\377\377" \
+ "\376\377\375\376\377\377\377\377\375\377\377\377\376\376\376\376\377" \
+ "\377\376\377\375\377\377\377\202\377\376\377\204\377\377\377\1\376\376" \
+ "\376\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \
+ "\307\377\377\377\3\376\377\377\377\377\377\376\376\376\202\377\377\377" \
+ "\1\376\376\376\210\377\377\377\3\375\377\376\376\377\377\377\377\377" \
+ "\203\377\376\377\4\376\377\375\376\377\377\377\377\377\377\376\377\377" \
+ "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\304\377" \
+ "\377\377\10\377\377\375\377\376\377\377\377\373\377\377\377\375\377\376" \
+ "\376\377\377\376\376\376\377\376\377\202\376\377\377\1\377\377\377\202" \
+ "\376\376\376\202\377\377\377\202\376\377\377\5\376\377\375\377\377\377" \
+ "\376\376\374\377\377\377\377\377\375\377\377\377\377\377\377\377\377" \
+ "\377\377\377\377\377\377\377\377\307\377\377\377\1\376\376\377\202\377" \
+ "\377\377\2\377\377\375\376\376\377\202\377\377\377\2\376\377\375\377" \
+ "\377\375\204\377\377\377\202\377\377\375\1\376\377\375\202\376\377\377" \
+ "\202\377\377\375\202\377\377\377\1\377\376\377\377\377\377\377\377\377" \
+ "\377\377\377\377\377\377\377\377\377\377\310\377\377\377\5\377\377\375" \
+ "\377\376\377\377\377\375\376\376\377\377\376\377\207\377\377\377\202" \
+ "\377\376\377\1\376\376\376\377\377\377\377\377\377\377\377\377\377\377" \
+ "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \
+ "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \
+ "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \
+ "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \
+ "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \
+ "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \
+ "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \
+ "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \
+ "\377\377\377\377\377\377\377\377\377\377\377\377\377\261\377\377\377" \
+ "\1\376\376\376\210\377\377\377\3\376\376\376\377\377\377\376\376\376" \
+ "\331\377\377\377\1\376\376\376\204\377\377\377\1\376\376\376\257\377" \
+ "\377\377\1\376\376\376\212\377\377\377\1\376\376\376\211\377\377\377" \
+ "\1\376\376\376\221\377\377\377\1\376\376\376\203\377\377\377\1\376\376" \
+ "\376\205\377\377\377\1\376\376\376\312\377\377\377\1\376\376\376\214" \
+ "\377\377\377\1\376\376\376\202\377\377\377\6\377\376\375\377\377\377" \
+ "\376\377\377\377\377\377\377\376\377\376\377\377\270\377\377\377\7\376" \
+ "\377\377\377\376\377\376\377\377\377\377\375\377\377\377\377\375\377" \
+ "\377\376\377\273\377\377\377\1\376\376\376\202\377\377\377\1\376\376" \
+ "\376\302\377\377\377\1\376\376\376\305\377\377\377\1\376\376\376\241" \
+ "\377\377\377\1\376\376\376\214\377\377\377\1\376\376\376\235\377\377" \
+ "\377\1\376\376\376\202\377\377\377\1\376\376\376\202\377\377\377\1\376" \
+ "\376\376\202\377\377\377\1\376\376\376\252\377\377\377\1\376\376\376" \
+ "\212\377\377\377\3\376\376\376\377\377\377\376\376\376\202\377\377\377" \
+ "\1\376\376\376\251\377\377\377\202\376\376\376\215\377\377\377\1\376" \
+ "\376\376\202\377\377\377\1\376\376\376\205\377\377\377\1\376\376\376" \
+ "\224\377\377\377\1\376\376\376\203\377\377\377\1\376\376\376\202\377" \
+ "\377\377\1\376\376\376\232\377\377\377\1\376\376\376\202\377\377\377" \
+ "\1\376\376\376\202\377\377\377\1\376\376\376\206\377\377\377\1\376\376" \
+ "\376\243\377\377\377\1\376\376\376\204\377\377\377\1\376\376\376\202" \
+ "\377\377\377\3\376\376\376\377\377\377\376\376\376\202\377\377\377\2" \
+ "\376\376\376\377\377\377\202\377\377\375\3\377\377\377\376\377\377\377" \
+ "\377\375\202\377\376\377\1\377\377\377\270\377\376\377\14\377\377\377" \
+ "\377\376\377\377\376\374\377\377\375\375\376\377\376\377\377\377\377" \
+ "\375\376\376\376\377\377\377\376\376\376\377\377\377\376\376\376\203" \
+ "\377\377\377\1\376\376\376\266\377\377\377\1\376\376\376\203\377\377" \
+ "\377\1\376\376\376\202\377\377\377\1\376\376\376\214\377\377\377\202" \
+ "\376\376\376\207\377\377\377\1\376\376\376\272\377\377\377\1\376\376" \
+ "\376\252\377\377\377\202\376\376\376\247\377\377\377\5\376\376\376\377" \
+ "\377\377\376\376\376\377\377\377\376\376\376\202\377\377\377\1\376\376" \
+ "\376\203\377\377\377\1\376\376\376\311\377\377\377\1\376\376\376\221" \
+ "\377\377\377\1\376\376\376\203\377\377\377\1\376\376\376\302\377\377" \
+ "\377\1\376\376\376\207\377\377\377\1\346\346\346\204\316\316\316\10\317" \
+ "\317\317\315\315\315\316\316\316\363\363\365\377\377\377\376\376\376" \
+ "\377\377\377\376\376\376\204\377\377\377\1\376\376\376\202\377\377\377" \
+ "\1\376\376\376\234\377\377\377\1\376\376\376\262\377\377\377\1\376\376" \
+ "\376\213\377\377\377\1\377\377\375\202\376\377\377\1\376\376\377\202" \
+ "\377\377\377\2\377\376\377\377\377\375\270\276\317\331\1\377\376\377" \
+ "\205\377\377\377\3\376\377\375\377\377\375\376\376\376\257\377\377\377" \
+ "\1\376\376\376\210\377\377\377\202\376\376\376\210\377\377\377\1\376" \
+ "\376\376\220\377\377\377\1\376\376\376\207\377\377\377\1\376\376\376" \
+ "\243\377\377\377\1\376\376\376\203\377\377\377\3\376\376\376\377\377" \
+ "\377\376\376\376\207\377\377\377\1\376\376\376\331\377\377\377\12\376" \
+ "\376\376\377\377\377\235\235\235kkmllnkkmllnjjlkkm\346\346\346\202\377" \
+ "\377\377\1\376\376\376\237\377\377\377\2\346\346\346\317\317\317\204" \
+ "\316\316\316\2\317\317\317\346\346\346\234\377\377\377\1\376\376\376" \
+ "\203\377\377\377\1\376\376\376\202\377\377\377\1\332\332\332\203\316" \
+ "\316\316\1\317\317\317\202\316\316\316\213\377\377\377\5\346\346\346" \
+ "\317\317\317\315\315\315\316\316\316\315\315\315\252\316\316\316\1\363" \
+ "\363\363\205\377\377\377\1\376\376\376\212\377\377\377\1\376\376\376" \
+ "\211\377\377\377\4\346\346\346\250\250\250\204\204\206``b\202::<\1;;" \
+ "=\202::<\3;;=99;;;=\203::<\4lln\220\220\222\266\266\266\363\363\363\202" \
+ "\376\376\376\240\377\377\377\1\346\346\346\202\316\316\316\10\317\317" \
+ "\317\315\315\315\317\317\317\316\316\316\332\332\332\376\376\376\377" \
+ "\377\377\376\376\376\203\377\377\377\1\376\376\376\241\377\377\377\6" \
+ "\376\376\376\377\377\377\346\346\346\316\316\320\317\317\321\316\316" \
+ "\320\203\316\316\316\2\347\347\347\376\376\376\205\377\377\377\1\376" \
+ "\376\376\202\377\377\375\5\376\377\377\377\377\375\377\377\377\317\334" \
+ "\344\37V\177\270\0>i\12\37U{\317\334\344\377\376\374\377\377\375\376" \
+ "\377\377\377\376\374\376\377\377\376\376\376\377\377\377\363\363\363" \
+ "\202\316\316\316\1\315\315\315\202\317\317\317\251\316\316\316\1\332" \
+ "\332\332\202\377\377\377\1\376\376\376\203\377\377\377\202\376\376\376" \
+ "\204\377\377\377\3\346\346\346\316\316\316\316\316\320\204\316\316\316" \
+ "\2\346\346\346\376\376\376\212\377\377\377\1\347\347\347\206\316\316" \
+ "\316\2\317\317\317\363\363\363\250\377\377\377\2\376\376\376\331\331" \
+ "\331\206\316\316\316\1\332\332\332\202\377\377\377\1\376\376\376\204" \
+ "\377\377\377\1\376\376\376\203\377\377\377\3\332\332\332\316\316\316" \
+ "\316\316\320\250\316\316\316\1\363\363\363\205\377\377\377\1\376\376" \
+ "\376\242\377\377\377\4\346\346\346::<;;=99;\204::<\1\204\204\206\237" \
+ "\377\377\377\1\376\376\376\202\377\377\377\3\235\235\235::<;;=\202::" \
+ "<\3;;=::<\235\235\235\202\377\377\377\1\376\376\376\232\377\377\377\1" \
+ "\376\376\376\205\377\377\377\4kkm;;;99;;;=\202::<\1;;;\213\377\377\377" \
+ "\4\234\234\234:::::<;;=\202::<\1;;;\250::<\1\316\316\316\202\377\377" \
+ "\377\1\376\376\376\203\377\377\377\1\376\376\376\212\377\377\377\203" \
+ "\376\376\376\203\377\377\377\3\346\346\346\250\250\250```\204::<\202" \
+ ";;=\202::<\3;;=::<;;=\203::<\1;;=\202::<\5;;=::<```\265\265\265\362\362" \
+ "\362\203\377\377\377\1\376\376\376\233\377\377\377\1\234\234\236\204" \
+ "::<\5""99;;;=::<\333\333\335\376\376\376\203\377\377\377\1\376\376\376" \
+ "\241\377\377\377\4\376\376\376\377\377\377\363\363\363FFH\202::<\1;;" \
+ "=\203::<\1\234\234\234\210\377\377\377\6\376\377\377\377\377\375\375" \
+ "\376\377\356\363\366\40Vz\0\77h\270\0=i\20\0>i\22Ip\356\363\367\376\377" \
+ "\377\377\377\375\377\377\377\376\376\377\377\376\377\377\377\377\315" \
+ "\315\315:::::<;;=::<99;;;;\250::<\1kkm\205\377\377\377\1\376\376\376" \
+ "\203\377\377\377\4\376\376\376\377\377\377\376\376\376\234\234\234\203" \
+ "::<\6;;=::<:::\234\234\234\377\377\377\376\376\376\211\377\377\377\3" \
+ "\332\332\332:::;;=\202::<\202;;=\2::<\204\204\206\250\377\377\377\2\364" \
+ "\364\364FFF\204::<\202:::\1\234\234\234\206\377\377\377\1\376\376\376" \
+ "\204\377\377\377\2kkk;;=\251::<\1\316\316\316\202\377\377\377\1\376\376" \
+ "\376\203\377\377\377\1\376\376\376\240\377\377\377\6\376\376\376\234" \
+ "\234\236::<;;=::<;;=\203::<\2FFH\362\362\362\235\377\377\377\1\376\376" \
+ "\376\203\377\377\377\3\234\234\236::<;;=\202::<\3;;=::<\234\234\236\203" \
+ "\377\377\377\1\376\376\376\233\377\377\377\1\376\376\376\203\377\377" \
+ "\377\7kkm::<;;=::<;;=::<;;=\213\377\377\377\4\235\235\235::<;;=99;\202" \
+ ";;=\251::<\1\315\315\315\203\377\377\377\202\376\376\376\213\377\377" \
+ "\377\1\376\376\376\202\377\377\377\6\376\376\376\377\377\377\315\315" \
+ "\315\205\205\205::<;;=\213::<\4;;=::<;;=::<\203;;=\204::<\4FFF\204\204" \
+ "\204\346\346\346\376\376\376\234\377\377\377\3\234\234\236::<;;=\202" \
+ "::<\4;;=99;::<``b\244\377\377\377\1\376\376\376\203\377\377\377\1xxz" \
+ "\202::<\10;;=99;;;=::<;;=\233\233\235\377\377\377\376\376\376\202\377" \
+ "\377\377\1\376\376\376\203\377\377\377\4\375\377\376\377\376\373\377" \
+ "\377\375\235\267\310\202\0>i\271\0=i\4\0\77j\237\266\306\377\376\377" \
+ "\377\375\374\202\376\377\377\4\377\377\377\376\376\376\316\316\31699" \
+ ";\202;;=\2::<;;=\251::<\1kkm\203\377\377\377\1\376\376\376\210\377\377" \
+ "\377\4\235\235\235::<99;;;=\203::<\1\235\235\235\214\377\377\377\2ll" \
+ "n99;\202;;=\1::<\203;;=\2\362\362\364\376\376\376\245\377\377\377\2\376" \
+ "\376\376\250\250\250\204::<\4;;=::<:::\346\346\346\203\377\377\377\1" \
+ "\376\376\376\205\377\377\377\3\376\376\376\377\377\377jjl\252::<\1\315" \
+ "\315\315\203\377\377\377\202\376\376\376\242\377\377\377\3\362\362\364" \
+ "GGI::<\202;;=\2""99;;;=\202::<\2""99;\235\235\235\237\377\377\377\3\376" \
+ "\376\376\377\377\377\235\235\237\202::<\202;;=\202::<\3\235\235\237\377" \
+ "\377\377\376\376\376\233\377\377\377\1\376\376\376\203\377\377\377\4" \
+ "\376\376\376\377\377\377kkm;;=\202::<\5""99;;;=99;\377\377\377\376\376" \
+ "\376\211\377\377\377\1\233\233\233\202::<\3;;=::<99;\251::<\1\317\317" \
+ "\317\205\377\377\377\1\376\376\376\214\377\377\377\3\376\376\376\347" \
+ "\347\347xxz\203::<\1;;=\202::<\1;;=\204::<\1;;=\203::<\1;;=\205::<\1" \
+ ";;=\203::<\1;;=\203::<\2\234\234\236\362\362\362\233\377\377\377\2\233" \
+ "\233\235;;=\204::<\1;;=\202::<\1\234\234\236\245\377\377\377\4\376\376" \
+ "\376\302\302\304::<;;=\206::<\1\235\235\237\202\377\377\377\1\376\376" \
+ "\376\203\377\377\377\7\375\376\377\377\377\377\377\377\375\376\377\377" \
+ "\377\377\377\177\235\265\0\77k\271\0\77j\7\0\77k\0\77j~\236\265\377\376" \
+ "\377\376\377\377\375\377\374\377\377\375\202\377\377\377\5\315\315\315" \
+ ";;=::<99;;;=\252::<\3kkm\377\377\377\376\376\376\203\377\377\377\1\376" \
+ "\376\376\203\377\377\377\1\376\376\376\202\377\377\377\3\233\233\233" \
+ "::<;;=\202::<\3;;=::<\234\234\234\202\377\377\377\1\376\376\376\211\377" \
+ "\377\377\4\264\264\264;;=::<;;=\204::<\3\247\247\251\377\377\377\376" \
+ "\376\376\245\377\377\377\1SSS\203::<\1;;=\202::<\1\204\204\204\213\377" \
+ "\377\377\4\376\376\376lln::<:9>\250::<\1\317\317\317\205\377\377\377" \
+ "\1\376\376\376\241\377\377\377\1\265\265\267\204::<\1;;=\204::<\1FFF" \
+ "\241\377\377\377\2\234\234\236;;=\204::<\2;;=\234\234\236\234\377\377" \
+ "\377\3\376\376\376\377\377\377\376\376\376\204\377\377\377\1kkm\203:" \
+ ":<\4;;=::<;;=\376\376\376\212\377\377\377\1\234\234\234\204::<\1;;=\251" \
+ "::<\1\316\316\316\203\377\377\377\202\376\376\376\215\377\377\377\4\234" \
+ "\234\234;;=::<;;=\202::<\1""99;\204::<\1;;=\203::<\1;;=\211::<\1""99" \
+ ";\207::<\2FFF\301\301\301\232\377\377\377\2\234\234\23699;\210::<\1\333" \
+ "\333\333\241\377\377\377\6\376\376\376\377\377\377\376\376\376\363\363" \
+ "\363FFH;;=\205::<\3;;=::<\234\234\236\206\377\377\377\7\377\376\377\377" \
+ "\377\377\377\377\375\375\376\377\377\376\377\201\235\263\0>g\272\0>i" \
+ "\13\0>e\177\236\263\377\375\374\377\377\377\377\377\375\376\376\376\377" \
+ "\376\377\377\377\377\316\316\316::<;;=\202::<\2""99;;;=\250::<\1kkm\204" \
+ "\377\377\377\5\376\376\376\377\377\377\376\376\376\377\377\377\376\376" \
+ "\376\202\377\377\377\2\376\376\376\234\234\234\206::<\1\234\234\234\215" \
+ "\377\377\377\2RRT;;=\205::<\1SSU\246\377\377\377\2\316\316\316999\206" \
+ "::<\1\316\316\316\202\377\377\377\3\376\376\376\377\377\377\376\376\376" \
+ "\207\377\377\377\3jjl::<:9>\250::<\1\316\316\316\203\377\377\377\202" \
+ "\376\376\376\242\377\377\377\2SSU99;\202;;=\204::<\4;;=99;::<\264\264" \
+ "\266\240\377\377\377\1\234\234\234\206::<\1\234\234\234\243\377\377\377" \
+ "\1kkm\206::<\213\377\377\377\2\234\234\236;;=\216::<\4""99;;;=::<;;=" \
+ "\206::<\3;;=::<;;=\222::<\1\316\316\316\205\377\377\377\1\376\376\376" \
+ "\207\377\377\377\1\376\376\376\202\377\377\377\2\346\346\350__a\202:" \
+ ":<\3;;=::<;;=\204::<\1;;=\202::<\3;;=::<;;=\203::<\1;;=\202::<\2""99" \
+ ";;;=\202::<\1;;=\204::<\7;;=::<;;=::<;;=\204\204\206\363\363\363\203" \
+ "\377\377\377\3\376\376\376\377\377\377\376\376\376\222\377\377\377\4" \
+ "\234\234\236::<;;=99;\204::<\3;;=::<__a\244\377\377\377\1xxx\205::<\1" \
+ ";;=\203::<\1\234\234\236\213\377\377\377\3\177\236\263\0=i\0>i\211\0" \
+ "=i\2\0>j\0=i\202\1>j\2\0\77k\0>j\232\0>i\2\0>j\0\77k\202\1>j\2\0=i\0" \
+ ">j\211\0=i\3\0>i\0=i\177\236\263\206\377\377\377\6\316\316\316:::::<" \
+ ";;=::<;;=\217::<\1;;=\203::<\1;;=\202::<\1;;=\222::<\1kkk\205\377\377" \
+ "\377\1\376\376\376\206\377\377\377\1\234\234\236\206::<\1\234\234\236" \
+ "\215\377\377\377\3\234\234\234;;=::<\202;;=\203::<\3\316\316\320\377" \
+ "\377\377\376\376\376\240\377\377\377\1\376\376\376\202\377\377\377\3" \
+ "xxz::<;;=\202::<\3;;=::<__a\215\377\377\377\1kkm\204::<\1;;=\202::<\1" \
+ ";;=\242::<\1\316\316\316\205\377\377\377\1\376\376\376\240\377\377\377" \
+ "\1\265\265\265\202::<\5;;=::<;;=::<;;=\204::<\2TTV\376\376\376\237\377" \
+ "\377\377\1\234\234\234\206::<\1\234\234\234\243\377\377\377\1kkm\206" \
+ "::<\213\377\377\377\3\234\234\23499;;;=\214::<\1""99;\207::<\1;;=\227" \
+ "::<\1\316\316\316\204\377\377\377\3\376\376\376\377\377\377\376\376\376" \
+ "\203\377\377\377\1\376\376\376\204\377\377\377\2\333\333\335FFH\214:" \
+ ":<\16``b\221\221\223\251\251\251\315\315\315\316\316\316\363\363\363" \
+ "\377\377\377\332\332\332\316\316\316\301\301\301\235\235\237jjlFFH;;" \
+ "=\207::<\1;;=\202::<\3;;=__a\363\363\363\227\377\377\377\4\234\234\236" \
+ "99;::<;;=\205::<\3;;=::<\233\233\233\240\377\377\377\12\376\376\376\377" \
+ "\377\377\301\301\301;;=::<;;=::<;;=::<99;\203::<\1\234\234\236\213\377" \
+ "\377\377\3\177\236\263\0=i\0>i\211\0=i\7\1>j\0=i\1>j\0=i\0>g\3>h\2=g" \
+ "\230\0=i\7\2=g\3>h\0>g\0=i\1>j\0=i\1>j\211\0=i\3\0>i\0=i\177\236\263" \
+ "\206\377\377\377\2\317\317\317:::\221::<\202;;=\202::<\3;;=::<99;\203" \
+ "::<\2;;=99;\220::<\1kkk\214\377\377\377\1\234\234\236\206::<\1\234\234" \
+ "\236\213\377\377\377\3\376\376\376\377\377\377\363\363\363\204::<\4;" \
+ ";=::<;;=xxz\202\377\377\377\1\376\376\376\236\377\377\377\1\376\376\376" \
+ "\202\377\377\377\3\346\346\346::<;;=\202::<\4;;=99;;;=\266\266\270\215" \
+ "\377\377\377\1kkm\203::<\1;;=\202::<\1;;=\243::<\1\316\316\316\204\377" \
+ "\377\377\3\376\376\376\377\377\377\376\376\376\232\377\377\377\1\376" \
+ "\376\376\204\377\377\377\1kkm\202;;=\202::<\202;;=\2::<;;=\204::<\3\317" \
+ "\317\317\377\377\377\376\376\376\235\377\377\377\1\234\234\234\206::" \
+ "<\1\234\234\234\243\377\377\377\1kkm\206::<\212\377\377\377\1\376\376" \
+ "\376\224\377\377\377\1lln\203::<\1;;=\202::<\1\234\234\236\234\377\377" \
+ "\377\1\376\376\376\204\377\377\377\4\376\376\376\265\265\267::<;;=\202" \
+ "::<\1;;=\202::<\1;;=\203::<\5__a\266\266\270\363\363\363\377\377\377" \
+ "\376\376\376\204\377\377\377\1\376\376\376\203\377\377\377\1\376\376" \
+ "\376\202\377\377\377\4\301\301\303\204\204\206;;=::<\203;;=\202::<\2" \
+ ";;=::<\202;;=\3GGI\332\332\334\376\376\376\203\377\377\377\1\376\376" \
+ "\376\221\377\377\377\2\235\235\237::<\202;;=\202::<\1;;=\202::<\4""9" \
+ "9;::<;;=\331\331\331\240\377\377\377\2\363\363\363GGI\203::<\2;;=::<" \
+ "\203;;=\202::<\1\234\234\236\213\377\377\377\3\177\236\263\0=i\0>i\210" \
+ "\0=i\10\0\77k\0=i\1>j\0>i\0\77j\0=i\0>i\0>j\230\0>i\10\0>j\0>i\0=i\0" \
+ "\77j\0>i\1>j\0=i\0\77k\210\0=i\3\0>i\0=i\177\236\263\206\377\377\377" \
+ "\1\376\376\376\217\377\377\377\1\376\376\376\203\377\377\377\1\315\315" \
+ "\317\204::<\3;;=::<kkm\240\377\377\377\1\234\234\236\206::<\1\234\234" \
+ "\236\214\377\377\377\3\376\376\376\377\377\377\204\204\206\202::<\1;" \
+ ";=\202::<\202;;=\1\345\345\345\242\377\377\377\2\376\376\376\234\234" \
+ "\234\206::<\2GGI\363\363\363\215\377\377\377\1kkm\203::<\4""99;::<;;" \
+ "=\316\316\320\311\377\377\377\2\317\317\32199;\203::<\5;;=::<FFH;;=:" \
+ ":<\202;;=\202::<\1kkm\237\377\377\377\1\234\234\234\206::<\1\234\234" \
+ "\234\243\377\377\377\1kkm\206::<\213\377\377\377\3\376\376\376\377\377" \
+ "\377\376\376\376\216\377\377\377\1\376\376\376\202\377\377\377\5lln:" \
+ ":<;;=::<;;=\202::<\2\234\234\234\376\376\376\227\377\377\377\1\376\376" \
+ "\376\210\377\377\377\1\264\264\266\202;;=\4::<;;=::<99;\204::<\3jjl\317" \
+ "\317\321\376\376\376\202\377\377\377\1\375\375\375\203\377\377\377\3" \
+ "\376\376\376\377\377\377\376\376\376\204\377\377\377\1\376\376\376\203" \
+ "\377\377\377\3\363\363\365\234\234\236FFH\202::<\1;;=\202::<\1;;=\203" \
+ "::<\2FFH\332\332\334\225\377\377\377\1\233\233\235\202;;=\211::<\1__" \
+ "a\240\377\377\377\2xxz;;=\202::<\3;;=::<;;=\205::<\1\234\234\236\213" \
+ "\377\377\377\3\177\236\263\0=i\0>i\211\0=i\202\0>i\5\0<h\1>j\0=i\1>j" \
+ "\0>i\230\0=i\5\0>i\1>j\0=i\1>j\0<h\202\0>i\211\0=i\3\0>i\0=i\177\236" \
+ "\263\212\377\377\377\3\376\376\376\377\377\377\376\376\376\212\377\377" \
+ "\377\1\376\376\376\202\377\377\377\10\316\316\320::<;;=::<;;=99;::<j" \
+ "jl\225\377\377\377\1\376\376\376\202\377\377\377\1\376\376\376\207\377" \
+ "\377\377\1\234\234\236\206::<\1\234\234\236\216\377\377\377\3\332\332" \
+ "\332;;=99;\202::<\4;;=::<99;\234\234\236\237\377\377\377\1\376\376\376" \
+ "\203\377\377\377\1SSU\202::<\1;;=\203::<\1\221\221\221\216\377\377\377" \
+ "\1kkm\206::<\1\316\316\316\250\377\377\377\1\376\376\376\235\377\377" \
+ "\377\1\376\376\376\202\377\377\377\5xxz::<;;=::<;;=\202::<\3\316\316" \
+ "\320RRT;;=\203::<\4;;=::<\332\332\332\376\376\376\235\377\377\377\1\234" \
+ "\234\234\206::<\1\234\234\234\243\377\377\377\1kkm\206::<\214\377\377" \
+ "\377\3\376\376\376\377\377\377\376\376\376\213\377\377\377\1\376\376" \
+ "\376\204\377\377\377\4kkm;;=::<;;=\203::<\1\235\235\235\202\377\377\377" \
+ "\1\376\376\376\221\377\377\377\1\376\376\376\213\377\377\377\4\301\301" \
+ "\301;;=::<;;=\203::<\202;;=\3::<RRT\316\316\316\203\377\377\377\1\376" \
+ "\376\376\202\377\377\377\1\376\376\376\204\377\377\377\3\376\376\376" \
+ "\377\377\377\376\376\376\203\377\377\377\1\376\376\376\204\377\377\377" \
+ "\4\346\346\346xxz;;=99;\207::<\4GGI\362\362\362\377\377\377\376\376\376" \
+ "\222\377\377\377\1\234\234\236\206::<\203;;=\202::<\2;;=\233\233\235" \
+ "\236\377\377\377\10\301\301\301::<;;=:9>::<99;::<99;\202;;=\203::<\1" \
+ "\234\234\236\213\377\377\377\3\177\236\263\0=i\0>i\210\0=i\7\2=g\0>i" \
+ "\0>j\0\77j\0=i\0\77j\0=h\232\1>j\7\0=h\0\77j\0=i\0\77j\0>j\0>i\2=g\210" \
+ "\0=i\3\0>i\0=i\177\236\263\213\377\377\377\1\376\376\376\216\377\377" \
+ "\377\1\317\317\321\202::<\6;;=::<;;=::<lln\376\376\376\225\377\377\377" \
+ "\1\376\376\376\203\377\377\377\1\376\376\376\205\377\377\377\1\234\234" \
+ "\236\206::<\1\234\234\236\213\377\377\377\1\376\376\376\203\377\377\377" \
+ "\2kkm;;=\204::<\2;;=GGI\236\377\377\377\1\376\376\376\203\377\377\377" \
+ "\1\265\265\267\202::<\6;;=::<;;=::<;;=\345\345\345\216\377\377\377\1" \
+ "kkm\202::<\5;;=99;;;=99;\317\317\317\244\377\377\377\1\376\376\376\241" \
+ "\377\377\377\3\376\376\376\377\377\377\347\347\351\206::<\3``b\377\377" \
+ "\377\234\234\236\202::<\1;;=\202::<\4;;=\204\204\206\377\377\377\376" \
+ "\376\376\234\377\377\377\1\234\234\234\206::<\1\234\234\234\243\377\377" \
+ "\377\1kkm\206::<\215\377\377\377\1\375\375\375\202\377\377\377\1\376" \
+ "\376\376\213\377\377\377\5\376\376\376\377\377\377\376\376\376lln;;=" \
+ "\203::<\3;;=::<\234\234\234\234\377\377\377\1\376\376\376\202\377\377" \
+ "\377\4\331\331\331FFH::<;;=\202::<\11;;=::<99;;;=\203\203\203\363\363" \
+ "\363\376\376\376\377\377\377\376\376\376\222\377\377\377\7\376\376\376" \
+ "\377\377\377\376\376\376\377\377\377\300\300\300GGI::<\202;;=\205::<" \
+ "\4``b\362\362\362\377\377\377\376\376\376\221\377\377\377\1\234\234\236" \
+ "\204::<\202;;=\203::<\5;;=99;::<;;=\332\332\332\234\377\377\377\4\363" \
+ "\363\363GGI;;=::<\202;;=\203::<\1;;=\202::<\3;;=::<\234\234\236\213\377" \
+ "\377\377\3\177\236\263\0=i\0>i\210\0=i\10\0\77j\0>j\0\77k\0=i\3>h\2=" \
+ "g\1>j\0\77k\230\0=i\10\0\77k\1>j\2=g\3>h\0=i\0\77k\0>j\0\77j\210\0=i" \
+ "\3\0>i\0=i\177\236\263\232\377\377\377\12\316\316\316;;=::<;;=::<;;=" \
+ "::<kkm\377\377\377\376\376\376\222\377\377\377\1\376\376\376\202\377" \
+ "\377\377\1\376\376\376\210\377\377\377\1\234\234\236\206::<\1\234\234" \
+ "\236\214\377\377\377\1\376\376\376\202\377\377\377\2\266\266\26699;\202" \
+ "::<\202;;=\202::<\3\266\266\270\377\377\377\376\376\376\234\377\377\377" \
+ "\203\376\376\376\1lln\202;;=\204::<\3xxx\377\377\377\376\376\376\215" \
+ "\377\377\377\1kkm\205::<\2;;=\316\316\316\305\377\377\377\1\376\376\376" \
+ "\202\377\377\377\1\203\203\205\206::<\4\265\265\267\377\377\377\363\363" \
+ "\363GGG\203::<\1;;=\202::<\1\346\346\346\235\377\377\377\1\234\234\234" \
+ "\206::<\1\234\234\234\243\377\377\377\1kkm\206::<\216\377\377\377\1\376" \
+ "\376\376\220\377\377\377\1jjl\206::<\1\234\234\234\202\377\377\377\1" \
+ "\376\376\376\232\377\377\377\3\376\376\376\364\364\364SSU\202::<\7;;" \
+ "=::<;;=99;::<;;=\265\265\265\205\377\377\377\203\376\376\376\214\377" \
+ "\377\377\5\376\376\376\377\377\377\376\376\376\377\377\377\376\376\376" \
+ "\203\377\377\377\7\332\332\332__a::<;;=::<;;=::<\202;;=\3::<\205\205" \
+ "\207\376\376\377\222\377\377\377\3\234\234\236::<;;=\202::<\2;;=99;\202" \
+ ";;=\1""99;\202::<\3;;=::<__a\234\377\377\377\1xxz\202;;=\205::<\1;;=" \
+ "\202::<\1;;=\202::<\1\234\234\236\213\377\377\377\3\177\236\263\0=i\0" \
+ ">i\210\0=i\10\0>i\0=i\0>i\0\77k\0>j\2=g\1\77h\0>l\230\0>i\10\0>l\1\77" \
+ "h\2=g\0>j\0\77k\0>i\0=i\0>i\210\0=i\3\0>i\0=i\177\236\263\205\377\377" \
+ "\377\1\376\376\376\202\377\377\377\1\376\376\376\221\377\377\377\3\316" \
+ "\316\316::<;;=\204::<\1kkm\225\377\377\377\202\376\376\376\211\377\377" \
+ "\377\1\234\234\236\206::<\1\234\234\236\217\377\377\377\3\376\376\376" \
+ "TTV99;\202::<\4""99;;;=::<kkm\240\377\377\377\1\346\346\346\202::<\1" \
+ "99;\204::<\1\316\316\316\217\377\377\377\1kkm\204::<\3;;=99;\316\316" \
+ "\316\305\377\377\377\7\376\376\376\377\377\377\363\363\363::<;;=::<;" \
+ ";=\202::<\1SSU\203\377\377\377\2\204\204\204;;=\203::<\4;;=99;\222\222" \
+ "\222\376\376\376\234\377\377\377\1\234\234\234\206::<\1\234\234\234\243" \
+ "\377\377\377\1kkm\206::<\214\377\377\377\3\376\376\376\377\377\377\376" \
+ "\376\376\220\377\377\377\1kkm\206::<\1\234\234\236\236\377\377\377\1" \
+ "\204\204\206\203::<\1;;=\202::<\3;;=::<\265\265\267\221\377\377\377\1" \
+ "\376\376\376\202\377\377\377\1\376\376\376\203\377\377\377\1\376\376" \
+ "\376\204\377\377\377\11\376\376\376\363\363\365__a::<;;=::<;;=::<;;=" \
+ "\202::<\1\301\301\303\222\377\377\377\2\234\234\236;;=\202::<\10;;=:" \
+ ":<;;=FFH::<;;=::<;;=\203::<\1\235\235\237\232\377\377\377\2\301\301\303" \
+ ";;=\205::<\2;;=RRT\204::<\3;;=::<\234\234\236\213\377\377\377\3\177\236" \
+ "\263\0=i\0>i\210\0=i\7\0>j\2=g\0>g\0>j\40V|o\224\256\177\236\262\232" \
+ "\177\236\263\7\177\236\262o\224\256\40V|\0>j\0>g\2=g\0>j\210\0=i\3\0" \
+ ">i\0=i\177\236\263\232\377\377\377\3\316\316\316::<;;=\203::<\2;;=kk" \
+ "m\232\377\377\377\1\376\376\376\205\377\377\377\1\234\234\236\206::<" \
+ "\1\234\234\236\220\377\377\377\2\233\233\235;;=\202::<\1<<>\203::<\1" \
+ "\346\346\346\237\377\377\377\1\204\204\204\206::<\2SSU\376\376\376\217" \
+ "\377\377\377\1kkm\203::<\4;;=::<;;=\316\316\320\304\377\377\377\1\376" \
+ "\376\376\202\377\377\377\2\234\234\236;;=\202::<\4;;=::<;;=\234\234\234" \
+ "\203\377\377\377\1\346\346\346\205::<\3;;=FFH\363\363\365\203\377\377" \
+ "\377\1\376\376\376\230\377\377\377\1\234\234\234\206::<\1\234\234\234" \
+ "\243\377\377\377\1kkm\206::<\237\377\377\377\1kkm\206::<\1\234\234\236" \
+ "\235\377\377\377\2\316\316\316;;=\202::<\6;;=::<;;=::<:::\265\265\265" \
+ "\237\377\377\377\7\376\376\376\363\363\363___::<;;=::<;;=\203::<\2GG" \
+ "I\363\363\363\204\377\377\377\1\376\376\376\214\377\377\377\1\234\234" \
+ "\234\203::<\202;;=\5::<\266\266\266GGI99;;;=\202::<\1;;=\202::<\1\332" \
+ "\332\332\206\377\377\377\1\376\376\376\211\377\377\377\1\376\376\376" \
+ "\207\377\377\377\2\363\363\363FFH\206::<\3FFH\301\301\30399;\202::<\202" \
+ ";;=\2::<\234\234\236\206\377\377\377\7\377\377\375\377\377\377\377\377" \
+ "\375\376\377\377\376\376\376\200\237\263\0\77i\211\0>i\7\0>g\1>j\0>g" \
+ "_\210\236\377\377\377\376\377\377\377\376\377\231\377\377\377\10\377" \
+ "\377\375\376\377\375\377\377\377\377\377\375`\210\242\3>h\0\77j\1\77" \
+ "h\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316\316\206::<" \
+ "\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236\220\377\377" \
+ "\377\1\363\363\363\204::<\202;;=\2""99;\205\205\207\207\377\377\377\1" \
+ "\376\376\376\224\377\377\377\4\376\376\376\377\377\377\363\363\363FF" \
+ "H\202::<\5;;=99;;;=::<\265\265\265\220\377\377\377\1kkm\206::<\1\316" \
+ "\316\316\305\377\377\377\5\376\376\376\364\364\364FFH::<;;=\202::<\4" \
+ ";;=FFH\363\363\363\377\377\377\202\376\376\376\6\377\377\377xxz::<;;" \
+ "=::<;;=\202::<\1\234\234\236\206\377\377\377\202\376\376\376\224\377" \
+ "\377\377\1\234\234\234\206::<\1\234\234\234\243\377\377\377\1kkm\206" \
+ "::<\237\377\377\377\1kkm\206::<\1\234\234\236\225\377\377\377\1\376\376" \
+ "\376\207\377\377\377\2SSS;;=\202::<\1;;=\203::<\1\234\234\234\202\377" \
+ "\377\377\3\376\376\376\377\377\377\376\376\376\232\377\377\377\1\376" \
+ "\376\376\202\377\377\377\4\332\332\332FFH::<;;=\202::<\1;;=\202::<\1" \
+ "\222\222\224\205\377\377\377\1\376\376\376\213\377\377\377\3\234\234" \
+ "\234::<;;=\202::<\5""99;;;=\315\315\315\250\250\252;;=\206::<\2``b\376" \
+ "\376\376\202\377\377\377\1\376\376\376\216\377\377\377\1\376\376\376" \
+ "\205\377\377\377\2xxx;;=\202::<\1;;=\203::<\2\300\300\300\317\317\321" \
+ "\203::<\1;;=\202::<\1\234\234\236\207\377\377\377\1\377\376\377\202\377" \
+ "\377\377\4\377\376\377\201\235\263\0=j\3>j\210\0=i\5\1>j\0=j\37V\177" \
+ "\377\376\377\376\376\376\202\377\377\377\1\376\377\377\230\377\377\377" \
+ "\10\376\377\377\377\377\375\374\377\377\377\376\374\376\377\377#W\177" \
+ "\0>g\0\77i\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316\316" \
+ "\206::<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236\220\377" \
+ "\377\377\2\376\376\376\204\204\206\205::<\3;;=FFH\362\362\362\204\377" \
+ "\377\377\202\376\376\376\2\377\377\377\376\376\376\224\377\377\377\3" \
+ "\376\376\376\265\265\265;;=\203::<\4;;=99;FFH\363\363\363\220\377\377" \
+ "\377\1kkm\206::<\1\316\316\316\306\377\377\377\4\265\265\26599;;;=::" \
+ "<\202;;=\2""99;\222\222\224\204\377\377\377\12\376\376\376\316\316\320" \
+ ";;=::<;;=99;;;=99;SSU\376\376\376\202\377\377\377\3\376\376\376\377\377" \
+ "\377\376\376\376\226\377\377\377\1\234\234\234\206::<\1\234\234\234\243" \
+ "\377\377\377\1kkm\206::<\237\377\377\377\1kkm\206::<\1\234\234\236\234" \
+ "\377\377\377\11\234\234\234::<;;=99;;;=99;::<;;=kkm\241\377\377\377\1" \
+ "\376\376\376\202\377\377\377\1\301\301\303\203::<\6;;=99;::<;;=::<\346" \
+ "\346\350\203\377\377\377\1\376\376\376\214\377\377\377\1\234\234\234" \
+ "\203::<\202;;=\10""99;\316\316\316\377\377\377kkm::<;;=::<;;=\203::<" \
+ "\1\235\235\237\203\377\377\377\1\376\376\376\214\377\377\377\1\376\376" \
+ "\376\205\377\377\377\3\302\302\304::<;;=\202::<\7""99;;;=99;xxz\377\377" \
+ "\377\315\315\315;;=\203::<\3:9>::<\234\234\236\206\377\377\377\3\376" \
+ "\377\377\377\377\375\377\377\377\202\377\377\375\3|\237\265\0\77k\0>" \
+ "g\210\0=i\10\0@h\3<i~\236\263\376\377\377\377\377\377\377\376\377\377" \
+ "\376\374\377\376\377\230\377\377\377\10\377\375\377\377\377\375\377\376" \
+ "\374\377\377\377\376\376\374\220\251\275\2=i\0>j\210\0=i\3\0>i\0=i\177" \
+ "\236\263\232\377\377\377\1\316\316\316\206::<\1kkm\240\377\377\377\1" \
+ "\234\234\236\206::<\1\234\234\236\215\377\377\377\1\376\376\376\203\377" \
+ "\377\377\2\332\332\334;;=\206::<\2\266\266\266\376\376\376\202\377\377" \
+ "\377\1\376\376\376\202\377\377\377\1\376\376\376\222\377\377\377\1\376" \
+ "\376\376\203\377\377\377\1SSS\203::<\4""99;::<;;=\221\221\223\221\377" \
+ "\377\377\1kkm\206::<\1\316\316\316\306\377\377\377\4RRT;;=::<;;=\202" \
+ "::<\2;;=\345\345\345\202\377\377\377\1\376\376\376\203\377\377\377\2" \
+ "__a;;=\202::<\1;;=\202::<\1\264\264\264\206\377\377\377\1\376\376\376" \
+ "\224\377\377\377\1\234\234\234\206::<\1\234\234\234\243\377\377\377\1" \
+ "kkm\206::<\237\377\377\377\1kkm\206::<\1\234\234\236\226\377\377\377" \
+ "\1\376\376\376\204\377\377\377\2\363\363\363FFH\203::<\1;;=\202::<\2" \
+ "FFH\346\346\346\204\377\377\377\1\376\376\376\233\377\377\377\1\376\376" \
+ "\376\203\377\377\377\3\376\376\376xxz99;\202::<\1""99;\202::<\4;;=\204" \
+ "\204\206\377\377\377\376\376\376\202\377\377\377\1\376\376\376\213\377" \
+ "\377\377\1\234\234\234\202::<\10;;=99;;;=::<\317\317\317\376\376\376" \
+ "\363\363\363GGI\203::<\1;;=\203::<\3\331\331\331\377\377\377\376\376" \
+ "\376\202\377\377\377\1\376\376\376\217\377\377\377\5\363\363\363GGI;" \
+ ";=::<;;=\202::<\7""99;FFH\363\363\363\377\377\377\316\316\316::<;;=\202" \
+ "::<\3:9>::<\234\234\236\207\377\377\377\7\376\377\377\376\376\376\377" \
+ "\377\377\377\377\375\377\377\377\377\375\374\376\377\377\210\377\377" \
+ "\377\10\376\376\374\376\377\377\354\364\366\377\377\375\376\377\377\377" \
+ "\376\374\377\377\375\376\377\377\230\377\377\377\10\377\377\375\376\377" \
+ "\377\377\376\375\375\376\377\376\377\377\301\317\330\0>g\0>j\210\0=i" \
+ "\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316\316\206::<\1kkm\240" \
+ "\377\377\377\1\234\234\236\206::<\1\234\234\236\220\377\377\377\5\376" \
+ "\376\376\377\377\377kkm::<;;=\202::<\3""99;::<^^`\204\377\377\377\1\376" \
+ "\376\376\227\377\377\377\1\316\316\316\202::<\203;;=\202::<\1\347\347" \
+ "\347\221\377\377\377\1kkm\206::<\1\316\316\316\303\377\377\377\12\376" \
+ "\376\376\377\377\377\301\301\301;;=::<;;=::<99;::<\204\204\206\204\377" \
+ "\377\377\4\376\376\376\377\377\377\376\376\376\266\266\266\202::<\5;" \
+ ";=::<;;=::<``b\203\377\377\377\1\376\376\376\227\377\377\377\1\234\234" \
+ "\234\206::<\1\234\234\234\243\377\377\377\1kkm\206::<\237\377\377\377" \
+ "\1kkm\206::<\1\234\234\236\233\377\377\377\1\265\265\267\204::<\4""9" \
+ "9;;;=::<\234\234\234\203\377\377\377\3\376\376\376\377\377\377\376\376" \
+ "\376\231\377\377\377\5\376\376\376\377\377\377\376\376\376\377\377\377" \
+ "\376\376\376\202\377\377\377\5\363\363\363GGI99;::<;;=\202::<\3;;=::" \
+ "<\346\346\346\204\377\377\377\1\376\376\376\212\377\377\377\3\234\234" \
+ "\234::<99;\202;;=\202::<\1\315\315\315\202\377\377\377\3\301\301\303" \
+ ";;=99;\202;;=\5::<;;=::<``b\376\376\376\202\377\377\377\1\376\376\376" \
+ "\215\377\377\377\6\376\376\376\377\377\377\376\376\376xxz::<;;=\203:" \
+ ":<\202;;=\1\300\300\302\202\377\377\377\3\316\316\316;;=99;\202::<\3" \
+ ";:\77::<\234\234\236\206\377\377\377\2\377\377\375\376\377\375\202\376" \
+ "\377\377\4\377\377\375\377\377\377\377\376\377\377\377\375\211\377\377" \
+ "\377\1\376\376\374\202\377\377\377\3\377\376\377\377\377\377\375\376" \
+ "\377\231\377\377\377\202\376\377\377\5\377\376\377\376\377\377\377\377" \
+ "\375\277\320\332\0\77j\211\0=i\3\0>i\0=i\177\236\263\232\377\377\377" \
+ "\1\316\316\316\206::<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234" \
+ "\234\236\213\377\377\377\3\376\376\376\377\377\377\376\376\376\204\377" \
+ "\377\377\1\265\265\265\202::<\1;;=\204::<\1\315\315\317\204\377\377\377" \
+ "\1\376\376\376\202\377\377\377\1\376\376\376\220\377\377\377\1\376\376" \
+ "\376\202\377\377\377\3\204\204\204::<;;=\204::<\2yy{\376\376\376\221" \
+ "\377\377\377\1kkm\206::<\1\316\316\316\305\377\377\377\4kkm;;=::<;;=" \
+ "\203::<\1\316\316\316\210\377\377\377\1TTV\206::<\2\317\317\321\376\376" \
+ "\376\231\377\377\377\1\234\234\234\206::<\1\234\234\234\243\377\377\377" \
+ "\1kkm\206::<\237\377\377\377\1kkm\206::<\1\234\234\236\233\377\377\377" \
+ "\1TTV\202::<\7;;=::<;;=::<RRT\377\377\377\376\376\376\203\377\377\377" \
+ "\1\376\376\376\233\377\377\377\1\376\376\376\206\377\377\377\2\233\233" \
+ "\235;;=\203::<\4;;=::<;;=\234\234\234\217\377\377\377\4\234\234\234:" \
+ ":<;;=99;\203::<\1\316\316\316\203\377\377\377\4xxz;;=::<99;\202::<\3" \
+ ";;=::<\234\234\236\216\377\377\377\1\376\376\376\202\377\377\377\16\376" \
+ "\376\376\302\302\304::<;;=::<;;=::<;;=::<\221\221\223\377\377\377\376" \
+ "\376\376\377\377\377\316\316\316\202::<\202;;=\202::<\1\234\234\236\206" \
+ "\377\377\377\2\377\376\377\377\377\377\202\377\376\377\4\376\376\376" \
+ "\353\366\374\327\355\370\323\356\371\210\326\356\372\7\325\354\372\327" \
+ "\355\372\365\372\376\376\376\376\377\377\377\376\377\377\377\377\373" \
+ "\231\377\377\377\2\377\376\377\376\377\375\202\377\377\377\4\374\377" \
+ "\377\300\316\327\0=i\1\77h\210\0=i\3\0>i\0=i\177\236\263\232\377\377" \
+ "\377\1\316\316\316\206::<\1kkm\240\377\377\377\1\234\234\236\206::<\1" \
+ "\234\234\236\221\377\377\377\4\376\376\376\377\377\377SSU;;=\202::<\4" \
+ ";;=99;;;=\204\204\206\203\377\377\377\1\376\376\376\226\377\377\377\11" \
+ "\363\363\36399;;;=::<;;=::<;;=::<\316\316\316\202\377\377\377\1\376\376" \
+ "\376\217\377\377\377\1kkm\206::<\1\316\316\316\304\377\377\377\1\316" \
+ "\316\316\206::<\1kkk\211\377\377\377\2\235\235\23599;\202;;=\6::<;;=" \
+ "::<kkm\377\377\377\376\376\376\203\377\377\377\1\376\376\376\224\377" \
+ "\377\377\1\234\234\234\206::<\1\234\234\234\243\377\377\377\1kkm\206" \
+ "::<\237\377\377\377\1kkm\206::<\1\234\234\236\232\377\377\377\1\332\332" \
+ "\332\204::<\1;;=\202::<\4\266\266\270\376\376\376\377\377\377\376\376" \
+ "\376\240\377\377\377\1\376\376\376\204\377\377\377\2\363\363\363FFH\202" \
+ "::<\5;;=::<;;=::<SSS\217\377\377\377\2\235\235\23599;\205::<\11\316\316" \
+ "\316\377\377\377\376\376\376\377\377\377\363\363\363FFH::<;;=99;\203" \
+ ";;=\2::<\331\331\333\220\377\377\377\2\363\363\363FFH\202::<\6;;=::<" \
+ ";;=::<TTV\364\364\364\203\377\377\377\3\316\316\316<<>99;\202::<\3;;" \
+ "=::<\234\234\236\211\377\377\377\4\377\375\376\376\377\377\254\334\363" \
+ "Z\266\347\211[\267\350\6\\\266\350X\267\347\326\354\367\377\376\377\376" \
+ "\377\377\377\377\375\232\377\377\377\3\377\377\373\375\377\376\376\377" \
+ "\377\202\377\377\375\3\276\320\336\0>g\0>i\210\0=i\3\0>i\0=i\177\236" \
+ "\263\232\377\377\377\1\316\316\316\206::<\1kkm\240\377\377\377\1\234" \
+ "\234\236\206::<\1\234\234\236\223\377\377\377\1\235\235\237\204::<\4" \
+ "<<>::<;;=\363\363\363\206\377\377\377\1\376\376\376\222\377\377\377\2" \
+ "\234\234\234;;=\205::<\1SSU\204\377\377\377\1\376\376\376\216\377\377" \
+ "\377\1kkm\206::<\1\316\316\316\304\377\377\377\1\204\204\204\203::<\1" \
+ "99;\202::<\1\265\265\265\211\377\377\377\2\363\363\363FFH\205::<\2;;" \
+ "=\346\346\346\231\377\377\377\1\234\234\234\206::<\1\234\234\234\243" \
+ "\377\377\377\1kkm\206::<\237\377\377\377\1kkm\206::<\1\234\234\236\232" \
+ "\377\377\377\1\222\222\222\202::<\1;;=\202::<\3;;=FFH\362\362\364\251" \
+ "\377\377\377\1\235\235\235\203::<\7;;=::<;;=;;;\331\331\331\377\377\377" \
+ "\376\376\376\214\377\377\377\2\234\234\234;;=\205::<\1\316\316\316\202" \
+ "\377\377\377\3\376\376\376\377\377\377\301\301\301\205::<\4;;=::<__a" \
+ "\376\376\376\216\377\377\377\4\376\376\376yyy::<;;=\205::<\1\316\316" \
+ "\320\204\377\377\377\2\316\316\31699;\203::<\3""99;::<\234\234\236\207" \
+ "\377\377\377\2\376\377\377\376\376\374\202\377\376\377\3\254\332\362" \
+ "Y\267\352[\267\350\210Y\270\350\7[\267\350Y\267\352\326\356\370\376\376" \
+ "\377\377\376\377\377\375\377\376\377\377\231\377\377\377\10\377\377\375" \
+ "\376\377\377\377\377\377\377\376\377\377\377\375\276\317\331\1>j\0>j" \
+ "\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316\316\206::<\1" \
+ "kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236\220\377\377\377" \
+ "\1\376\376\376\202\377\377\377\4\363\363\365;;=::<;;=\204::<\1\234\234" \
+ "\234\231\377\377\377\1SSS\202::<\1;;=\203::<\1\265\265\267\223\377\377" \
+ "\377\1kkm\206::<\1\316\316\316\300\377\377\377\1\376\376\376\202\377" \
+ "\377\377\1\346\346\350\203::<\4;;=::<;;=SSU\213\377\377\377\1\204\204" \
+ "\204\203::<\1;;=\202::<\1\204\204\206\202\377\377\377\1\376\376\376\226" \
+ "\377\377\377\1\234\234\234\206::<\1\234\234\234\243\377\377\377\1kkm" \
+ "\206::<\237\377\377\377\1kkm\206::<\1\234\234\236\227\377\377\377\1\376" \
+ "\376\376\202\377\377\377\3TTV::<;;=\203::<\2;;=\205\205\205\252\377\377" \
+ "\377\1\347\347\347\202::<\202;;=\203::<\1\235\235\237\204\377\377\377" \
+ "\1\376\376\376\211\377\377\377\1\234\234\234\206::<\1\316\316\316\205" \
+ "\377\377\377\1\205\205\205\202::<\6;;=::<;;=::<;;=\234\234\236\213\377" \
+ "\377\377\1\376\376\376\202\377\377\377\1\302\302\302\202;;=\203::<\3" \
+ ";;=::<\221\221\221\202\377\377\377\1\376\376\376\202\377\377\377\1\316" \
+ "\316\316\206::<\1\234\234\236\213\377\377\377\2\255\333\363Y\270\350" \
+ "\211[\267\350\3Y\270\350[\267\350\326\354\371\242\377\377\377\3\276\317" \
+ "\331\0=i\0>i\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316" \
+ "\316\206::<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236\224" \
+ "\377\377\377\4\204\204\204;;=::<;;=\203::<\1TTT\204\377\377\377\1\376" \
+ "\376\376\223\377\377\377\1\300\300\300\203::<\5;;=::<;;=FFF\363\363\363" \
+ "\223\377\377\377\1kkm\203::<\4;;=::<;;=\316\316\320\277\377\377\377\14" \
+ "\376\376\376\377\377\377\376\376\376\377\377\377\204\204\206::<;;=::" \
+ "<99;<<>99;\265\265\267\213\377\377\377\3\346\346\346::<;;=\202::<\1;" \
+ ";=\202::<\2\347\347\347\376\376\376\227\377\377\377\1\234\234\234\206" \
+ "::<\1\234\234\234\243\377\377\377\1kkm\206::<\237\377\377\377\1kkm\206" \
+ "::<\1\234\234\236\226\377\377\377\4\376\376\376\377\377\377\376\376\376" \
+ "\346\346\350\202;;=\203::<\3""99;<<>\301\301\301\253\377\377\377\1aa" \
+ "c\202::<\1;;=\202::<\2;;=jjl\205\377\377\377\1\376\376\376\210\377\377" \
+ "\377\1\234\234\234\206::<\1\316\316\316\202\377\377\377\1\376\376\376" \
+ "\202\377\377\377\3\362\362\362SSU;;=\205::<\2;;=\332\332\332\210\377" \
+ "\377\377\1\376\376\376\203\377\377\377\2\363\363\363FFH\202::<\202;;" \
+ "=\5::<;;=SSS\363\363\363\376\376\376\204\377\377\377\1\316\316\316\206" \
+ "::<\1\234\234\236\213\377\377\377\2\255\333\363Y\270\350\211[\267\350" \
+ "\3Y\270\350[\267\350\326\354\371\242\377\377\377\3\276\317\331\0=i\0" \
+ ">i\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316\316\206::" \
+ "<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236\224\377\377" \
+ "\377\1\332\332\332\207::<\1\301\301\301\227\377\377\377\1lll\204::<\3" \
+ ";;=::<\221\221\221\202\377\377\377\3\376\376\376\377\377\377\376\376" \
+ "\376\217\377\377\377\1kkm\204::<\3;;=99;\316\316\316\241\377\377\377" \
+ "\1\376\376\376\234\377\377\377\10\376\376\376\377\377\377\376\376\376" \
+ "\377\377\377\363\363\363FFH;;=::<\202;;=\3::<FFH\364\364\364\214\377" \
+ "\377\377\1xxz\204::<\3;;=::<\233\233\233\230\377\377\377\1\234\234\234" \
+ "\206::<\1\234\234\234\243\377\377\377\1kkm\206::<\237\377\377\377\1k" \
+ "km\206::<\1\234\234\236\224\377\377\377\1\376\376\376\204\377\377\377" \
+ "\4\266\266\270;;=::<;;=\203::<\1""99;\254\377\377\377\3\234\234\234:" \
+ ":<;;=\205::<\204\377\377\377\1\376\376\376\211\377\377\377\1\234\234" \
+ "\234\206::<\1\316\316\316\203\377\377\377\1\376\376\376\202\377\377\377" \
+ "\1\316\316\320\204::<\4;;=99;::<__a\205\377\377\377\1\376\376\376\206" \
+ "\377\377\377\4yy{;;=::<;;=\202::<\3;;=::<\316\316\316\206\377\377\377" \
+ "\1\316\316\316\206::<\1\234\234\236\213\377\377\377\2\255\333\363Y\270" \
+ "\350\211[\267\350\3Y\270\350[\267\350\326\354\371\242\377\377\377\3\276" \
+ "\317\331\0=i\0>i\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316" \
+ "\316\316\206::<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236" \
+ "\225\377\377\377\1__a\204;;=\5""99;::<yy{\377\377\377\376\376\376\216" \
+ "\377\377\377\1\376\376\376\205\377\377\377\1\346\346\346\202::<\203;" \
+ ";=\202::<\1\346\346\346\224\377\377\377\1kkm\205::<\2;;=\316\316\316" \
+ "\235\377\377\377\1\376\376\376\244\377\377\377\1\234\234\234\202;;=\204" \
+ "::<\2\235\235\235\376\376\376\212\377\377\377\4\376\376\376\377\377\377" \
+ "\317\317\317::<\202;;=\202::<\3;;=GGI\362\362\362\202\377\377\377\1\376" \
+ "\376\376\224\377\377\377\1\234\234\234\206::<\1\234\234\234\243\377\377" \
+ "\377\1kkm\206::<\237\377\377\377\1kkm\206::<\1\234\234\236\231\377\377" \
+ "\377\1\220\220\222\205::<\3;;=kkm\376\376\376\253\377\377\377\3\316\316" \
+ "\316<<>99;\202::<\4;;=::<;;=\331\331\331\215\377\377\377\1\234\234\234" \
+ "\206::<\1\316\316\316\207\377\377\377\1\222\222\224\202::<\3;;=99;<<" \
+ ">\202::<\4\234\234\236\376\376\376\377\377\377\376\376\376\203\377\377" \
+ "\377\1\376\376\376\203\377\377\377\6\302\302\304;;=99;;;=::<;;=\202:" \
+ ":<\1\234\234\234\202\377\377\377\1\376\376\376\204\377\377\377\1\316" \
+ "\316\316\206::<\1\234\234\236\213\377\377\377\2\255\333\363Y\270\350" \
+ "\211[\267\350\3Y\270\350[\267\350\326\354\371\242\377\377\377\3\276\317" \
+ "\331\0=i\0>i\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316" \
+ "\316\206::<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236\225" \
+ "\377\377\377\2\265\265\265;;=\202::<\2""99;;;=\202::<\2\347\347\347\376" \
+ "\376\376\215\377\377\377\3\376\376\376\377\377\377\376\376\376\204\377" \
+ "\377\377\3\221\221\223;;=99;\204::<\3xxz\377\377\377\376\376\376\202" \
+ "\377\377\377\202\376\376\376\217\377\377\377\1kkm\202::<\5;;=99;;;=9" \
+ "9;\317\317\317\233\377\377\377\1\376\376\376\237\377\377\377\1\376\376" \
+ "\376\204\377\377\377\3\376\376\376\377\377\377GGI\202::<\5;;=::<;;=:" \
+ ":<\346\346\346\213\377\377\377\1\376\376\376\202\377\377\377\2``b99;" \
+ "\202;;=\203::<\3\247\247\247\377\377\377\376\376\376\225\377\377\377" \
+ "\1\234\234\234\206::<\1\234\234\234\243\377\377\377\1kkm\206::<\237\377" \
+ "\377\377\1kkm\206::<\1\234\234\236\231\377\377\377\10kkm::<;;=::<;;=" \
+ "99;::<\235\235\237\255\377\377\377\202::<\1;;=\204::<\1\301\301\301\215" \
+ "\377\377\377\1\234\234\234\206::<\1\316\316\316\206\377\377\377\5\376" \
+ "\376\376\364\364\364TTV::<99;\202;;=\203::<\4\332\332\334\376\376\376" \
+ "\377\377\377\376\376\376\203\377\377\377\6\376\376\376\377\377\377\363" \
+ "\363\363FFH::<;;=\204::<\1__a\210\377\377\377\1\316\316\316\206::<\1" \
+ "\234\234\236\213\377\377\377\2\255\333\363Y\270\350\211[\267\350\3Y\270" \
+ "\350[\267\350\326\354\371\242\377\377\377\3\276\317\331\0=i\0>i\210\0" \
+ "=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316\316\206::<\1kkm\240" \
+ "\377\377\377\1\234\234\236\206::<\1\234\234\236\224\377\377\377\5\376" \
+ "\376\376\377\377\377GGI::<;;=\203::<\4;;=\220\220\222\377\377\377\376" \
+ "\376\376\214\377\377\377\1\376\376\376\203\377\377\377\10\376\376\376" \
+ "\377\377\377\363\363\363FFH::<;;=99;;;=\202::<\1\316\316\320\202\377" \
+ "\377\377\1\376\376\376\204\377\377\377\1\376\376\376\215\377\377\377" \
+ "\1kkm\206::<\1\316\316\316\277\377\377\377\3\376\376\376\377\377\377" \
+ "\265\265\267\204::<\3;;=::<\205\205\205\213\377\377\377\1\376\376\376" \
+ "\202\377\377\377\2\376\376\376\265\265\265\202::<\5""99;<<>::<;;=SSU" \
+ "\202\377\377\377\1\376\376\376\224\377\377\377\1\234\234\234\206::<\1" \
+ "\234\234\234\243\377\377\377\1kkm\206::<\237\377\377\377\1kkm\206::<" \
+ "\1\234\234\236\230\377\377\377\2\376\376\376SSU\204::<\3;;=::<\266\266" \
+ "\266\253\377\377\377\3\376\376\376\377\377\377^^`\206::<\1\234\234\234" \
+ "\202\377\377\377\1\376\376\376\212\377\377\377\1\234\234\234\206::<\1" \
+ "\316\316\316\205\377\377\377\6\376\376\376\377\377\377\376\376\376\315" \
+ "\315\317::<;;=\202::<\4;;=99;::<``b\210\377\377\377\4xxz99;<<>::<\202" \
+ ";;=\202::<\1\332\332\332\203\377\377\377\1\376\376\376\204\377\377\377" \
+ "\1\316\316\316\206::<\1\234\234\236\213\377\377\377\2\255\333\363Y\270" \
+ "\350\211[\267\350\3Y\270\350[\267\350\326\354\371\242\377\377\377\3\276" \
+ "\317\331\0=i\0>i\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316" \
+ "\316\316\206::<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236" \
+ "\226\377\377\377\1\234\234\234\206::<\2FFH\376\376\376\214\377\377\377" \
+ "\1\376\376\376\202\377\377\377\1\376\376\376\203\377\377\377\3\265\265" \
+ "\265;;=99;\202;;=\202::<\1SSU\202\377\377\377\1\376\376\376\223\377\377" \
+ "\377\1kkm\203::<\4""99;::<;;=\316\316\320\275\377\377\377\202\376\376" \
+ "\376\4\377\377\377\376\376\376SSU;;=\202::<\4;;=::<;;=\332\332\332\215" \
+ "\377\377\377\5\376\376\376\377\377\377\376\376\376SSU;;=\204::<\2;;=" \
+ "\264\264\264\226\377\377\377\1\234\234\234\206::<\1\234\234\234\243\377" \
+ "\377\377\1kkm\206::<\237\377\377\377\1kkm\206::<\1\234\234\236\231\377" \
+ "\377\377\207::<\1\316\316\316\254\377\377\377\2\376\376\376lln\202::" \
+ "<\1;;=\202::<\4;;=\233\233\233\377\377\377\376\376\376\202\377\377\377" \
+ "\1\376\376\376\210\377\377\377\1\234\234\234\206::<\1\316\316\316\203" \
+ "\377\377\377\202\376\376\376\204\377\377\377\1\234\234\234\207::<\1\234" \
+ "\234\236\205\377\377\377\4\376\376\376\300\300\302::<;;=\205::<\2\234" \
+ "\234\234\376\376\376\202\377\377\377\1\376\376\376\205\377\377\377\1" \
+ "\316\316\316\206::<\1\234\234\236\213\377\377\377\2\255\333\363Y\270" \
+ "\350\211[\267\350\3Y\270\350[\267\350\326\354\371\242\377\377\377\3\276" \
+ "\317\331\0=i\0>i\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316" \
+ "\316\316\206::<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236" \
+ "\226\377\377\377\1\347\347\347\204::<\5;;=99;;;=\265\265\265\376\376" \
+ "\376\222\377\377\377\2___99;\202::<\4;;=::<;;=\265\265\265\207\377\377" \
+ "\377\1\376\376\376\216\377\377\377\1kkm\203::<\1;;=\202::<\1;;=\233:" \
+ ":<\5""99;;;=::<:::\234\234\234\240\377\377\377\2\316\316\316;;=\204:" \
+ ":<\2;;=kkm\221\377\377\377\1\234\234\236\203::<\1;;=\202::<\3kkk\377" \
+ "\377\377\376\376\376\224\377\377\377\1\234\234\234\206::<\1\234\234\234" \
+ "\243\377\377\377\1kkm\206::<\237\377\377\377\1kkm\206::<\1\234\234\236" \
+ "\231\377\377\377\207::<\1\316\316\316\255\377\377\377\2\221\221\221;" \
+ ";=\205::<\1\204\204\204\203\377\377\377\1\376\376\376\211\377\377\377" \
+ "\1\234\234\234\206::<\1\316\316\316\210\377\377\377\3\376\376\376\377" \
+ "\377\377``b\202::<\7;;=::<;;=::<;;=\332\332\332\376\376\376\202\377\377" \
+ "\377\3\376\376\376\363\363\363GGI\203::<\4;;=::<;;=__a\206\377\377\377" \
+ "\1\376\376\376\203\377\377\377\1\316\316\316\206::<\1\234\234\236\213" \
+ "\377\377\377\2\255\333\363Y\270\350\211[\267\350\3Y\270\350[\267\350" \
+ "\326\354\371\242\377\377\377\3\276\317\331\0=i\0>i\210\0=i\3\0>i\0=i" \
+ "\177\236\263\232\377\377\377\1\316\316\316\206::<\1kkm\240\377\377\377" \
+ "\1\234\234\236\206::<\1\234\234\236\227\377\377\377\1\204\204\206\204" \
+ "::<\3;;=::<kkk\217\377\377\377\5\376\376\376\377\377\377\376\376\376" \
+ "\333\333\333:::\202::<\1;;=\202::<\2FFH\363\363\363\226\377\377\377\1" \
+ "kkm\204::<\1;;=\202::<\1;;=\234::<\4;;=::<\234\234\234\376\376\376\237" \
+ "\377\377\377\1kkm\206::<\1\316\316\316\221\377\377\377\2\363\363\363" \
+ "GGG\204::<\3;;=::<\315\315\315\225\377\377\377\1\234\234\234\206::<\1" \
+ "\234\234\234\237\377\377\377\1\376\376\376\203\377\377\377\1kkm\206:" \
+ ":<\237\377\377\377\1kkm\206::<\1\234\234\236\230\377\377\377\2\376\376" \
+ "\376;;=\203::<\1;;=\202::<\1\363\363\363\252\377\377\377\6\376\376\376" \
+ "\377\377\377\376\376\376\234\234\23699;;;=\204::<\1kkm\215\377\377\377" \
+ "\1\234\234\234\206::<\1\316\316\316\210\377\377\377\7\377\377\375\377" \
+ "\377\377\332\332\332::<;;=::<;;=\203::<\2``b\376\376\376\202\377\377" \
+ "\377\2\376\376\376xxz\206::<\2:::\332\332\332\212\377\377\377\1\316\316" \
+ "\316\206::<\1\234\234\236\213\377\377\377\2\255\333\363Y\270\350\211" \
+ "[\267\350\3Y\270\350[\267\350\326\354\371\242\377\377\377\3\276\317\331" \
+ "\0=i\0>i\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316\316" \
+ "\206::<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236\227\377" \
+ "\377\377\1\315\315\315\205::<\3;;=::<\332\332\334\221\377\377\377\1\204" \
+ "\204\206\205::<\2;;=\205\205\205\227\377\377\377\1kkm\203::<\3;;=::<" \
+ ";;=\234::<\1:9>\203::<\1\234\234\236\237\377\377\377\1\331\331\331\202" \
+ ";;=\204::<\1SSU\217\377\377\377\5\376\376\376\377\377\377\376\376\376" \
+ "\377\377\377\204\204\204\204::<\3;;=99;yyy\203\377\377\377\1\376\376" \
+ "\376\221\377\377\377\1\234\234\234\206::<\1\234\234\234\235\377\377\377" \
+ "\1\376\376\376\205\377\377\377\1kkm\206::<\237\377\377\377\1kkm\206:" \
+ ":<\1\234\234\236\231\377\377\377\203::<\1;;=\203::<\202\377\377\377\1" \
+ "\376\376\376\253\377\377\377\2\233\233\235;;=\205::<\3kkm\377\377\377" \
+ "\376\376\376\202\377\377\377\1\376\376\376\210\377\377\377\1\234\234" \
+ "\234\206::<\1\316\316\316\213\377\377\377\1\234\234\236\202;;=\1""99" \
+ ";\203::<\5;;=\235\235\235\377\377\377\376\376\376\302\302\302\207::<" \
+ "\1\251\251\251\213\377\377\377\1\316\316\316\206::<\1\234\234\236\213" \
+ "\377\377\377\2\255\333\363Y\270\350\211[\267\350\3Y\270\350[\267\350" \
+ "\326\354\371\242\377\377\377\3\276\317\331\0=i\0>i\210\0=i\3\0>i\0=i" \
+ "\177\236\263\232\377\377\377\1\316\316\316\206::<\1kkm\240\377\377\377" \
+ "\1\234\234\236\206::<\1\234\234\236\223\377\377\377\1\376\376\376\204" \
+ "\377\377\377\1^^`\202::<\202;;=\3::<<<>\204\204\206\213\377\377\377\1" \
+ "\376\376\376\204\377\377\377\1\363\363\363\205::<\3;;=::<\346\346\346" \
+ "\227\377\377\377\1kkm\204::<\3;;=::<;;=\234::<\1;;=\202::<\1\234\234" \
+ "\236\237\377\377\377\4\204\204\20499;::<;;=\203::<\3\266\266\270\377" \
+ "\377\377\376\376\376\221\377\377\377\5\346\346\346;;=::<;;=::<\202;;" \
+ "=\4::<\346\346\350\377\377\377\376\376\376\202\377\377\377\1\376\376" \
+ "\376\217\377\377\377\1\234\234\234\206::<\1\234\234\234\237\377\377\377" \
+ "\202\376\376\376\202\377\377\377\1kkm\206::<\237\377\377\377\1kkm\206" \
+ "::<\1\234\234\236\224\377\377\377\6\376\376\376\377\377\377\376\376\376" \
+ "\377\377\377\376\376\376;;=\206::<\1\331\331\331\255\377\377\377\1\234" \
+ "\234\236\202::<\1;;=\203::<\2kkm\376\376\376\202\377\377\377\1\376\376" \
+ "\376\211\377\377\377\1\234\234\234\206::<\1\316\316\316\212\377\377\377" \
+ "\3\376\376\376\377\377\377___\204::<\7;;=99;::<\332\332\332\363\363\365" \
+ "FFH;;=\204::<\3;;=kkm\376\376\376\213\377\377\377\1\316\316\316\206:" \
+ ":<\1\234\234\236\213\377\377\377\2\255\333\363Y\270\350\211[\267\350" \
+ "\3Y\270\350[\267\350\326\354\371\242\377\377\377\3\276\317\331\0=i\0" \
+ ">i\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316\316\206::" \
+ "<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236\224\377\377" \
+ "\377\1\376\376\376\203\377\377\377\4\265\265\267::<;;=::<\202;;=\3::" \
+ "<FFH\363\363\363\213\377\377\377\1\376\376\376\203\377\377\377\2\251" \
+ "\251\251;;=\205::<\1lln\202\377\377\377\1\376\376\376\225\377\377\377" \
+ "\1kkm\202::<\2;;=99;\204::<\1;;=\234::<\2;;=\234\234\234\235\377\377" \
+ "\377\5\376\376\376\345\345\345;;=::<;;=\202::<\2;;=FFH\215\377\377\377" \
+ "\3\376\376\376\377\377\377\376\376\376\205\377\377\377\10xxz;;=::<;;" \
+ "=99;;;=::<\204\204\206\202\377\377\377\1\376\376\376\221\377\377\377" \
+ "\1\234\234\234\206::<\1\234\234\234\234\377\377\377\1\376\376\376\204" \
+ "\377\377\377\3\376\376\376\377\377\377kkm\206::<\237\377\377\377\1kk" \
+ "m\206::<\1\234\234\236\231\377\377\377\202::<\1;;=\204::<\1\316\316\316" \
+ "\253\377\377\377\3\376\376\376\377\377\377\220\220\222\202;;=\2::<;;" \
+ "=\202::<\1\222\222\224\215\377\377\377\1\234\234\234\206::<\1\316\316" \
+ "\316\213\377\377\377\3\376\376\376\332\332\332GGI\204::<\10;;=::<__a" \
+ "xxz::<;;=::<;;=\202::<\2FFH\346\346\346\214\377\377\377\1\316\316\316" \
+ "\206::<\1\234\234\236\213\377\377\377\2\255\333\363Y\270\350\211[\267" \
+ "\350\3Y\270\350[\267\350\326\354\371\242\377\377\377\3\276\317\331\0" \
+ "=i\0>i\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316\316\206" \
+ "::<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236\231\377\377" \
+ "\377\10FFH::<;;=99;;;=::<;;=\265\265\265\216\377\377\377\4\376\376\376" \
+ "TTV99;;;=\202::<\202;;=\1\301\301\301\230\377\377\377\1kkm\202::<\1;" \
+ ";=\204::<\3;;=::<;;=\232::<\5;;=::<\234\234\234\377\377\377\376\376\376" \
+ "\232\377\377\377\3\376\376\376\377\377\377\221\221\221\202::<\1""99;" \
+ "\203::<\5\234\234\236\377\377\377\376\376\376\377\377\377\376\376\376" \
+ "\216\377\377\377\1\376\376\376\202\377\377\377\2\316\316\320::<\202;" \
+ ";=\204::<\2\363\363\363\376\376\376\202\377\377\377\1\376\376\376\217" \
+ "\377\377\377\1\234\234\234\206::<\1\234\234\234\243\377\377\377\1kkm" \
+ "\206::<\237\377\377\377\1kkm\206::<\1\234\234\236\224\377\377\377\1\376" \
+ "\376\376\204\377\377\377\1""99;\202::<\1;;=\203::<\1\316\316\316\252" \
+ "\377\377\377\10\376\376\376\377\377\377\376\376\376kkm;;=::<;;=99;\202" \
+ "::<\1\234\234\236\215\377\377\377\1\234\234\234\206::<\1\316\316\316" \
+ "\215\377\377\377\5\247\247\247;;=99;::<;;=\210::<\5""99;::<\250\250\252" \
+ "\377\377\377\376\376\376\213\377\377\377\1\316\316\316\206::<\1\234\234" \
+ "\236\213\377\377\377\2\255\333\363Y\270\350\211[\267\350\3Y\270\350[" \
+ "\267\350\326\354\371\242\377\377\377\3\276\317\331\0=i\0>i\210\0=i\3" \
+ "\0>i\0=i\177\236\263\232\377\377\377\1\316\316\316\206::<\1kkm\240\377" \
+ "\377\377\1\234\234\236\206::<\1\234\234\236\223\377\377\377\3\376\376" \
+ "\376\377\377\377\376\376\376\203\377\377\377\1\234\234\236\202::<\1;" \
+ ";=\202::<\2""99;SSU\214\377\377\377\5\376\376\376\377\377\377\301\301" \
+ "\301;;=<<>\202::<\3;;=::<SSU\202\377\377\377\1\376\376\376\226\377\377" \
+ "\377\1kkm\203::<\1;;=\202::<\1\204\204\206\202\234\234\234\1\235\235" \
+ "\235\232\234\234\236\202\234\234\234\1\315\315\315\233\377\377\377\6" \
+ "\376\376\376\377\377\377\362\362\362HHJ99;;;=\204::<\2\364\364\364\376" \
+ "\376\376\220\377\377\377\1\376\376\376\204\377\377\377\1kkm\206::<\1" \
+ "\234\234\234\223\377\377\377\1\234\234\234\206::<\1\234\234\234\242\377" \
+ "\377\377\2\376\376\376lln\206::<\237\377\377\377\1kkm\206::<\1\234\234" \
+ "\236\231\377\377\377\2TTV99;\202::<\5;;=::<;;=\250\250\250\376\376\376" \
+ "\254\377\377\377\1``b\203::<\202;;=\3::<\235\235\237\376\376\376\202" \
+ "\377\377\377\1\376\376\376\211\377\377\377\1\234\234\234\206::<\1\316" \
+ "\316\316\216\377\377\377\2kkm;;=\203::<\5;;=::<;;=99;;;=\202::<\2;;=" \
+ "jjl\216\377\377\377\1\316\316\316\206::<\1\234\234\236\213\377\377\377" \
+ "\2\255\333\363Y\270\350\211[\267\350\3Y\270\350[\267\350\326\354\371" \
+ "\242\377\377\377\3\276\317\331\0=i\0>i\210\0=i\3\0>i\0=i\177\236\263" \
+ "\232\377\377\377\1\316\316\316\206::<\1kkm\240\377\377\377\1\234\234" \
+ "\236\206::<\1\234\234\236\224\377\377\377\1\376\376\376\204\377\377\377" \
+ "\2\346\346\34699;\202::<\2;;=::<\202;;=\1\315\315\315\212\377\377\377" \
+ "\1\376\376\376\202\377\377\377\1yy{\203::<\4;;=99;;;=\250\250\250\202" \
+ "\377\377\377\1\376\376\376\226\377\377\377\1kkm\206::<\1\317\317\317" \
+ "\240\377\377\377\1\376\376\376\234\377\377\377\1\234\234\234\202::<\2" \
+ "99;;;=\202::<\1\204\204\206\203\377\377\377\1\376\376\376\220\377\377" \
+ "\377\1\376\376\376\202\377\377\377\2\264\264\264::<\202;;=\203::<\3G" \
+ "GI\364\364\364\376\376\376\202\377\377\377\1\376\376\376\216\377\377" \
+ "\377\1\234\234\234\206::<\1\234\234\234\241\377\377\377\3\376\376\376" \
+ "\377\377\377kkm\206::<\237\377\377\377\1kkm\206::<\1\234\234\236\225" \
+ "\377\377\377\202\376\376\376\202\377\377\377\12kkm::<;;=99;::<;;=::<" \
+ "\204\204\204\377\377\377\376\376\376\251\377\377\377\4\376\376\376\377" \
+ "\377\377::<99;\202;;=\203::<\1\316\316\320\215\377\377\377\1\234\234" \
+ "\234\206::<\1\316\316\316\216\377\377\377\5\346\346\350GGI;;=::<;;=\202" \
+ "::<\2""99;;;=\202::<\3;;=GGI\346\346\350\216\377\377\377\1\316\316\316" \
+ "\206::<\1\234\234\236\213\377\377\377\2\255\333\363Y\270\350\211[\267" \
+ "\350\3Y\270\350[\267\350\326\354\371\242\377\377\377\3\276\317\331\0" \
+ "=i\0>i\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316\316\206" \
+ "::<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236\231\377\377" \
+ "\377\2\376\376\376\205\205\205\202::<\5""99;;;=::<;;=\205\205\207\213" \
+ "\377\377\377\12\376\376\376\346\346\346::<;;=99;::<99;;;=FFH\363\363" \
+ "\363\231\377\377\377\1kkm\202::<\2;;=::<\202;;=\3\316\316\316\377\377" \
+ "\377\376\376\376\234\377\377\377\1\376\376\376\236\377\377\377\1SSS\204" \
+ "::<\3;;=99;\347\347\351\204\377\377\377\1\376\376\376\215\377\377\377" \
+ "\1\376\376\376\205\377\377\377\1SSU\203::<\4;;=99;::<\265\265\265\202" \
+ "\377\377\377\1\376\376\376\217\377\377\377\1\234\234\234\206::<\1\234" \
+ "\234\234\242\377\377\377\2\376\376\376SSU\206::<\237\377\377\377\1kk" \
+ "m\206::<\1\234\234\236\231\377\377\377\4\221\221\223;;=::<;;=\202::<" \
+ "\3;;=___\376\376\376\253\377\377\377\1\332\332\332\204::<\1;;=\202::" \
+ "<\1\346\346\350\203\377\377\377\1\376\376\376\211\377\377\377\1\234\234" \
+ "\234\206::<\1\316\316\316\217\377\377\377\1\250\250\252\204::<\202;;" \
+ "=\2::<;;=\202::<\1\265\265\267\217\377\377\377\1\316\316\316\206::<\1" \
+ "\234\234\236\213\377\377\377\2\255\333\363Y\270\350\211[\267\350\3Y\270" \
+ "\350[\267\350\326\354\371\242\377\377\377\3\276\317\331\0=i\0>i\210\0" \
+ "=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316\316\206::<\1kkm\240" \
+ "\377\377\377\1\234\234\236\206::<\1\234\234\236\232\377\377\377\1\316" \
+ "\316\316\203::<\2""99;<<>\202::<\1\346\346\350\213\377\377\377\4\221" \
+ "\221\223;;=::<;;=\203::<\1\204\204\206\232\377\377\377\1kkm\203::<\1" \
+ ";;=\202::<\1\316\316\316\274\377\377\377\2\265\265\267;;=\205::<\1xx" \
+ "x\231\377\377\377\1\250\250\250\206::<\1TTV\222\377\377\377\1\234\234" \
+ "\234\204::<\3;;=::<\235\235\235\203\377\377\377\1\376\376\376\237\377" \
+ "\377\377\202;;=\203::<\3;;=::<\376\376\376\236\377\377\377\1kkm\206:" \
+ ":<\1\234\234\236\225\377\377\377\1\376\376\376\203\377\377\377\1\265" \
+ "\265\267\204::<\1;;=\202::<\1\363\363\363\253\377\377\377\1\250\250\250" \
+ "\204::<\3;;=::<GGI\216\377\377\377\1\234\234\234\206::<\1\316\316\316" \
+ "\220\377\377\377\4kkm;;=::<;;=\204::<\3;;=xxx\376\376\376\217\377\377" \
+ "\377\1\316\316\316\206::<\1\234\234\236\213\377\377\377\2\255\333\363" \
+ "Y\270\350\212[\267\350\2X\266\351\326\356\370\202\377\377\377\3\377\377" \
+ "\375\377\377\377\376\377\375\234\377\377\377\4\377\377\375\276\317\327" \
+ "\0\77j\1>j\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316\316" \
+ "\206::<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236\233\377" \
+ "\377\377\1``b\205::<\2;;=\235\235\237\210\377\377\377\1\376\376\376\202" \
+ "\377\377\377\2FFH;;=\205::<\1\346\346\346\202\377\377\377\1\376\376\376" \
+ "\227\377\377\377\1kkm\206::<\1\316\316\316\266\377\377\377\1\376\376" \
+ "\376\205\377\377\377\5__a::<;;=::<;;=\202::<\1SSU\202kkm\1lln\203kkm" \
+ "\1lln\222kkm\4__a;;=99;;;=\204::<\3\301\301\301\377\377\377\376\376\376" \
+ "\215\377\377\377\202\376\376\376\1\235\235\235\204::<\3""99;;;=\221\221" \
+ "\221\243\377\377\377\203::<\1;;=\202::<\1""99;\237\377\377\377\1kkm\206" \
+ "::<\1\234\234\236\231\377\377\377\1\332\332\332\202::<\3;;=::<99;\202" \
+ ";;=\1\264\264\264\210\377\377\377\1\376\376\376\232\377\377\377\1\376" \
+ "\376\376\206\377\377\377\2\376\376\376xxx\202::<\1;;=\203::<\1xxz\216" \
+ "\377\377\377\1\234\234\234\206::<\1\316\316\316\220\377\377\377\3\363" \
+ "\363\365FFH;;=\202::<\1;;=\202::<\2FFH\363\363\363\220\377\377\377\1" \
+ "\316\316\316\206::<\1\234\234\236\213\377\377\377\2\255\333\363Y\270" \
+ "\350\211[\267\350\10X\267\347Y\267\352\326\354\371\377\377\377\376\376" \
+ "\376\377\376\377\377\377\377\377\376\377\234\377\377\377\2\376\376\374" \
+ "\277\320\330\212\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316" \
+ "\316\206::<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236\233" \
+ "\377\377\377\1\265\265\267\203::<\4""99;;;=::<SSU\207\377\377\377\6\376" \
+ "\376\376\377\377\377\376\376\376\265\265\265;;=99;\202;;=\4""99;;;=k" \
+ "km\377\377\377\202\376\376\376\230\377\377\377\1kkm\206::<\1\316\316" \
+ "\316\267\377\377\377\1\376\376\376\203\377\377\377\7\316\316\320<<>9" \
+ "9;::<;;=::<99;\203::<\2;;=99;\202::<\1;;=\224::<\1;;=\202::<\1;;=\203" \
+ "::<\1kkm\203\377\377\377\1\376\376\376\215\377\377\377\1\300\300\300" \
+ "\202::<\11;;=::<99;;;=jjl\377\377\377\376\376\376\377\377\377\376\376" \
+ "\376\236\377\377\377\1\346\346\350\206::<\1__a\237\377\377\377\1kkm\206" \
+ "::<\1\234\234\236\231\377\377\377\2\376\376\376SSU\206::<\2yy{\376\376" \
+ "\376\206\377\377\377\1\376\376\376\234\377\377\377\1\376\376\376\205" \
+ "\377\377\377\4\363\363\363::<<<>99;\202::<\3;;=::<\265\265\267\203\377" \
+ "\377\377\3\376\376\376\377\377\377\376\376\376\210\377\377\377\1\234" \
+ "\234\234\206::<\1\316\316\316\221\377\377\377\4\301\301\30199;::<;;=" \
+ "\202::<\6;;=\301\301\301\377\377\377\376\376\376\377\377\377\376\376" \
+ "\376\215\377\377\377\1\316\316\316\206::<\1\234\234\236\213\377\377\377" \
+ "\2\255\333\363Y\270\350\211[\267\350\6Y\270\350Y\267\352\325\353\370" \
+ "\377\377\377\376\377\375\377\375\377\234\377\377\377\5\376\376\376\377" \
+ "\377\377\377\377\375\276\317\327\2\77k\211\0=i\3\0>i\0=i\177\236\263" \
+ "\232\377\377\377\1\316\316\316\206::<\1kkm\240\377\377\377\1\234\234" \
+ "\236\206::<\1\234\234\236\234\377\377\377\1GGI\203::<\1;;=\202::<\2\301" \
+ "\301\301\376\376\376\204\377\377\377\1\376\376\376\203\377\377\377\3" \
+ "lln::<;;=\202::<\202;;=\4\301\301\303\376\376\376\377\377\377\376\376" \
+ "\376\230\377\377\377\1kkm\206::<\1\316\316\316\265\377\377\377\1\376" \
+ "\376\376\205\377\377\377\3kkm::<;;=\202::<\2""99;<<>\202::<\3;;=::<;" \
+ ";=\202::<\1;;=\222::<\4""99;;;=::<;;=\203::<\1;;=\202::<\3\316\316\316" \
+ "\377\377\377\376\376\376\215\377\377\377\3\376\376\376\316\316\316;;" \
+ "=\203::<\3;;=::<FFH\234\377\377\377\202\376\376\376\202\377\377\377\3" \
+ "\376\376\376\377\377\377\316\316\320\203::<\4;;=::<;;=kkm\237\377\377" \
+ "\377\1kkm\206::<\1\234\234\236\226\377\377\377\7\376\376\376\377\377" \
+ "\377\376\376\376\377\377\377\204\204\204::<;;=\204::<\2;;=\346\346\346" \
+ "\241\377\377\377\1\376\376\376\202\377\377\377\3\376\376\376\377\377" \
+ "\377\376\376\376\202\377\377\377\1\250\250\250\202::<\1<<>\204::<\3\346" \
+ "\346\346\377\377\377\376\376\376\202\377\377\377\1\376\376\376\211\377" \
+ "\377\377\1\234\234\234\206::<\1\316\316\316\220\377\377\377\14\376\376" \
+ "\376\377\377\377yy{::<99;;;=::<xxz\377\377\377\376\376\376\377\377\377" \
+ "\376\376\376\203\377\377\377\1\376\376\376\212\377\377\377\1\316\316" \
+ "\316\206::<\1\234\234\236\213\377\377\377\2\255\333\363Y\270\350\211" \
+ "[\267\350\10X\267\347Z\266\351\326\356\370\376\377\377\377\377\375\377" \
+ "\377\377\377\376\377\376\377\377\234\377\377\377\4\376\376\374\277\320" \
+ "\330\0=i\1>j\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316" \
+ "\316\206::<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236\234" \
+ "\377\377\377\1\234\234\234\206::<\3jjj\377\377\377\376\376\376\204\377" \
+ "\377\377\4\376\376\376\377\377\377\332\332\33299;\203::<\3;;=::<SSU\202" \
+ "\377\377\377\1\376\376\376\231\377\377\377\1kkm\206::<\1\316\316\316" \
+ "\267\377\377\377\5\376\376\376\377\377\377\376\376\376\346\346\350;;" \
+ "=\203::<\1;;=\202::<\202;;=\202::<\3""99;::<;;=\222::<\202;;=\3""99;" \
+ "::<;;=\202::<\1;;=\203::<\2\204\204\206\376\376\376\217\377\377\377\1" \
+ "\363\363\363\203::<\6;;=::<;;=::<\347\347\347\376\376\376\234\377\377" \
+ "\377\202\376\376\376\5\377\377\377\376\376\376\234\234\236::<;;=\202" \
+ "::<\3;;=::<\234\234\236\237\377\377\377\1kkm\206::<\1\234\234\236\231" \
+ "\377\377\377\5\376\376\376\316\316\316;;=99;;;=\204::<\1\222\222\224" \
+ "\204\377\377\377\1\376\376\376\235\377\377\377\1\376\376\376\202\377" \
+ "\377\377\1\376\376\376\203\377\377\377\5SSU;;=::<99;;;=\202::<\3kkk\377" \
+ "\377\377\376\376\376\203\377\377\377\1\376\376\376\211\377\377\377\1" \
+ "\234\234\234\206::<\1\316\316\316\222\377\377\377\6\363\363\363GGI::" \
+ "<;;=FFH\363\363\363\205\377\377\377\1\376\376\376\214\377\377\377\1\316" \
+ "\316\316\206::<\1\234\234\236\213\377\377\377\2\255\333\363Y\270\350" \
+ "\212[\267\350\3Y\267\352\330\354\363\376\377\377\203\377\377\377\1\377" \
+ "\377\375\235\377\377\377\3\276\317\331\0=i\1>j\210\0=i\3\0>i\0=i\177" \
+ "\236\263\232\377\377\377\1\316\316\316\206::<\1kkm\240\377\377\377\1" \
+ "\234\234\236\206::<\1\234\234\236\233\377\377\377\2\376\376\376\347\347" \
+ "\347\202::<\2;;=::<\203;;=\1\346\346\346\207\377\377\377\5\204\204\204" \
+ "<<>99;::<;;=\202::<\2\251\251\251\376\376\376\205\377\377\377\1\376\376" \
+ "\376\225\377\377\377\1kkm\206::<\1\316\316\316\264\377\377\377\1\376" \
+ "\376\376\205\377\377\377\3\204\204\206::<;;=\203::<\1;;=\205::<\1;;=" \
+ "\225::<\3;;=::<;;=\202::<\1;;=\202::<\1;;=\202::<\1\347\347\347\220\377" \
+ "\377\377\2SSU;;=\203::<\3;;=::<\265\265\265\237\377\377\377\7\376\376" \
+ "\376\377\377\377lln99;::<;;=99;\202::<\1\265\265\267\237\377\377\377" \
+ "\1kkm\206::<\1\234\234\236\225\377\377\377\1\376\376\376\204\377\377" \
+ "\377\3\376\376\376SSU;;=\204::<\3;;=FFH\346\346\346\202\377\377\377\1" \
+ "\376\376\376\237\377\377\377\1\376\376\376\204\377\377\377\2\265\265" \
+ "\267;;=\202::<\1;;=\203::<\1\265\265\265\217\377\377\377\1\234\234\234" \
+ "\206::<\1\316\316\316\223\377\377\377\4\301\301\301::<:::\302\302\302" \
+ "\223\377\377\377\1\316\316\316\206::<\1\234\234\236\213\377\377\377\2" \
+ "\255\333\363Y\270\350\212[\267\350\2Y\270\350\332\354\370\202\377\377" \
+ "\377\3\376\376\376\376\377\377\377\376\373\235\377\377\377\1\276\317" \
+ "\331\202\0>i\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316" \
+ "\316\206::<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236\235" \
+ "\377\377\377\1\204\204\204\206::<\1\221\221\223\206\377\377\377\2\363" \
+ "\363\363GGI\202::<\5""99;;;=::<GGI\363\363\363\204\377\377\377\202\376" \
+ "\376\376\226\377\377\377\1kkm\206::<\1\316\316\316\266\377\377\377\1" \
+ "\376\376\376\202\377\377\377\3\346\346\350::<;;=\204::<\5""99;;;=:::" \
+ "99;;;=\203::<\3;;=99;;;=\220::<\5;;=::<;;=::<;;=\202::<\6;;=::<99;;;" \
+ "=::<\204\204\206\220\377\377\377\5yy{99;::<99;;;=\202::<\1xxz\236\377" \
+ "\377\377\10\376\376\376\377\377\377\363\363\36399;::<;;=99;;;=\202::" \
+ "<\2\346\346\350\376\376\376\236\377\377\377\1kkm\206::<\1\234\234\236" \
+ "\231\377\377\377\3\376\376\376\377\377\377\233\233\235\202::<\7;;=::" \
+ "<;;=99;;;=\204\204\204\376\376\376\245\377\377\377\2\363\363\363SSU\205" \
+ "::<\2;;=FFH\205\377\377\377\3\376\376\376\377\377\377\376\376\376\210" \
+ "\377\377\377\1\234\234\234\206::<\1\316\316\316\224\377\377\377\3\205" \
+ "\205\205\221\221\221\376\376\376\204\377\377\377\202\376\376\376\215" \
+ "\377\377\377\1\316\316\316\206::<\1\234\234\236\213\377\377\377\2\255" \
+ "\333\363Y\270\350\212[\267\350\7Y\270\350\321\356\376\377\376\377\377" \
+ "\377\377\377\377\375\376\377\375\377\376\377\232\377\377\377\1\377\377" \
+ "\375\202\377\377\377\3\275\317\333\0\77k\0>i\210\0=i\3\0>i\0=i\177\236" \
+ "\263\232\377\377\377\1\316\316\316\206::<\1kkm\240\377\377\377\1\234" \
+ "\234\236\206::<\1\234\234\236\235\377\377\377\1\316\316\316\206::<\1" \
+ "FFH\203\377\377\377\1\376\376\376\202\377\377\377\1\250\250\250\203:" \
+ ":<\1;;=\202::<\1\204\204\206\203\377\377\377\1\376\376\376\231\377\377" \
+ "\377\1kkm\206::<\1\316\316\316\271\377\377\377\1\234\234\236\204::<\4" \
+ ";;=::<kkm\234\234\236\202\234\234\234\1\233\233\233\202\234\234\234\3" \
+ "\235\235\235\234\234\234\235\235\235\224\234\234\234\202\234\234\236" \
+ "\1\204\204\206\206::<\2FFH\363\363\363\217\377\377\377\2\250\250\252" \
+ ";;=\206::<\1\364\364\364\237\377\377\377\2\265\265\265;;=\205::<\1TT" \
+ "V\240\377\377\377\1kkm\206::<\1\234\234\236\224\377\377\377\3\376\376" \
+ "\376\377\377\377\376\376\376\204\377\377\377\3\364\364\366FFH;;=\203" \
+ "::<\4;;=::<:::\316\316\316\245\377\377\377\1\221\221\221\202::<\2;;=" \
+ "::<\202;;=\2::<\234\234\236\220\377\377\377\1\234\234\234\206::<\1\316" \
+ "\316\316\224\377\377\377\1\376\376\376\225\377\377\377\1\316\316\316" \
+ "\206::<\1\234\234\236\213\377\377\377\2\255\333\363Y\270\350\212[\267" \
+ "\350\4[\267\346\265\340\361\377\376\377\376\376\377\202\377\377\375\1" \
+ "\374\377\377\230\377\377\377\3\376\376\376\377\377\377\377\377\375\202" \
+ "\377\377\377\3\243\265\301\0>j\0>i\210\0=i\3\0>i\0=i\177\236\263\232" \
+ "\377\377\377\1\316\316\316\206::<\1kkm\240\377\377\377\1\234\234\236" \
+ "\206::<\1\234\234\236\236\377\377\377\2__a;;=\204::<\5;;=\265\265\265" \
+ "\376\376\376\377\377\377\376\376\376\202\377\377\377\1SSU\204::<\3;;" \
+ "=::<\346\346\350\235\377\377\377\1kkm\206::<\1\316\316\316\270\377\377" \
+ "\377\2\363\363\365GGI\205::<\3;;=\333\333\333\376\376\376\237\377\377" \
+ "\377\10FFH::<;;=::<;;=99;;;=\233\233\235\217\377\377\377\5\346\346\346" \
+ "::<;;=::<;;=\203::<\1\234\234\234\210\377\377\377\1\376\376\376\217\377" \
+ "\377\377\1\376\376\376\206\377\377\377\1TTT\205::<\3;;=\221\221\221\376" \
+ "\376\376\237\377\377\377\1kkm\206::<\1\234\234\236\234\377\377\377\12" \
+ "\233\233\233::<;;=::<;;=::<;;=::<SSU\363\363\363\212\377\377\377\3\376" \
+ "\376\376\377\377\377\376\376\376\221\377\377\377\1\376\376\376\204\377" \
+ "\377\377\1\315\315\317\203::<\1;;=\203::<\2FFH\363\363\365\220\377\377" \
+ "\377\1\234\234\234\206::<\1\316\316\316\252\377\377\377\1\316\316\316" \
+ "\206::<\1\234\234\236\213\377\377\377\2\255\333\363Y\270\350\211[\267" \
+ "\350\6Y\270\350[\267\346\227\324\363\377\375\376\377\377\377\376\377" \
+ "\375\213\377\377\377\6\376\376\376\377\377\377\373\377\376\377\377\377" \
+ "\377\376\377\376\377\377\211\377\377\377\10\377\376\377\374\377\377\377" \
+ "\377\375\377\377\377\377\376\377_\207\240\0>l\0\77j\210\0=i\3\0>i\0=" \
+ "i\177\236\263\232\377\377\377\1\316\316\316\206::<\1kkm\240\377\377\377" \
+ "\1\234\234\236\206::<\1\234\234\236\236\377\377\377\1\265\265\265\204" \
+ "::<\3;;=::<__a\204\377\377\377\1\317\317\321\206::<\1kkk\236\377\377" \
+ "\377\1kkm\206::<\1\316\316\316\267\377\377\377\3\376\376\376\250\250" \
+ "\25299;\202;;=\203::<\1kkm\233\377\377\377\1\376\376\376\205\377\377" \
+ "\377\10\234\234\236;;=::<;;=::<;;=99;GGI\204\377\377\377\3\376\376\376" \
+ "\377\377\377\376\376\376\210\377\377\377\5\376\376\376__a::<;;=99;\203" \
+ ";;=\2FFH\363\363\363\204\377\377\377\3\376\376\376\377\377\377\376\376" \
+ "\376\224\377\377\377\5\376\376\376\377\377\377\301\301\301:::;;=\202" \
+ "::<\202;;=\4::<\332\332\332\377\377\377\376\376\376\236\377\377\377\1" \
+ "kkm\206::<\1\234\234\236\233\377\377\377\3\376\376\376\364\364\364FF" \
+ "H\205::<\4;;=99;xxx\376\376\376\203\377\377\377\1\376\376\376\203\377" \
+ "\377\377\1\376\376\376\202\377\377\377\1\376\376\376\224\377\377\377" \
+ "\4\376\376\376\377\377\377\362\362\362GGI\202::<\6;;=::<;;=::<99;\250" \
+ "\250\252\221\377\377\377\1\234\234\234\206::<\1\316\316\316\252\377\377" \
+ "\377\1\316\316\316\206::<\1\234\234\236\213\377\377\377\2\255\333\363" \
+ "Y\270\350\211[\267\350\7Y\267\352X\267\347[\266\353\301\344\367\377\377" \
+ "\377\376\376\376\376\377\377\211\377\377\377\6\377\376\377\377\377\377" \
+ "\377\375\376\377\377\377\377\377\375\377\376\377\202\377\377\377\210" \
+ "\377\376\377\10\377\377\375\376\377\377\377\377\377\376\377\375\237\266" \
+ "\306\0=i\2=g\0>e\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316" \
+ "\316\316\206::<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234\236" \
+ "\237\377\377\377\1EEG\202::<\202;;=\11""99;;;=\332\332\332\377\377\377" \
+ "\376\376\376\377\377\377xxz::<;;=\204::<\1\302\302\302\236\377\377\377" \
+ "\1kkm\206::<\1\316\316\316\266\377\377\377\4\376\376\376\377\377\377" \
+ "SSU;;=\202::<\1;;=\202::<\1\316\316\320\235\377\377\377\15\376\376\376" \
+ "\377\377\377\376\376\376\377\377\377\363\363\365::<;;=99;;;=::<;;=::" \
+ "<\265\265\265\215\377\377\377\3\376\376\376\377\377\377\266\266\270\202" \
+ "::<\1;;=\203::<\2;;=\204\204\206\205\377\377\377\3\376\376\376\377\377" \
+ "\377\376\376\376\213\377\377\377\1\376\376\376\205\377\377\377\1\376" \
+ "\376\376\202\377\377\377\2\363\363\363SSU\203::<\4;;=99;;;=SSU\241\377" \
+ "\377\377\1kkm\206::<\1\234\234\236\235\377\377\377\3\265\265\265;;=9" \
+ "9;\202::<\1;;=\203::<\1\204\204\206\206\377\377\377\1\376\376\376\216" \
+ "\377\377\377\3\376\376\376\377\377\377\376\376\376\206\377\377\377\6" \
+ "\376\376\376\377\377\377\362\362\364``b::<;;=\202::<\1;;=\202::<\2aa" \
+ "c\376\376\376\221\377\377\377\1\234\234\234\206::<\1\316\316\316\252" \
+ "\377\377\377\1\316\316\316\206::<\1\234\234\236\213\377\377\377\2\255" \
+ "\333\363Y\270\350\211[\267\350\10X\267\347[\267\346[\265\347[\267\346" \
+ "\230\320\361\327\360\367\325\356\365\331\355\370\210\326\354\371\10\325" \
+ "\355\367\323\355\372\366\373\377\377\376\374\376\377\375\276\320\332" \
+ "\277\320\330\301\317\330\210\276\317\331\10\276\317\327\276\320\334\301" \
+ "\316\327_\207\241\0>i\0=l\0\77k\0>i\210\0=i\3\0>i\0=i\177\236\263\232" \
+ "\377\377\377\1\316\316\316\206::<\1kkm\240\377\377\377\1\234\234\236" \
+ "\206::<\1\234\234\236\237\377\377\377\3\222\222\224::<;;=\202::<\3;;" \
+ "=99;\205\205\207\202\377\377\377\2\346\346\346;;=\202::<\1;;=\202::<" \
+ "\1SSU\237\377\377\377\1kkm\206::<\1\316\316\316\267\377\377\377\5\265" \
+ "\265\26799;;;=::<;;=\202::<\1TTV\243\377\377\377\1\204\204\206\205::" \
+ "<\2;;=SSU\206\377\377\377\1\376\376\376\210\377\377\377\3\376\376\376" \
+ "GGI;;=\202::<\5;;=::<;;=::<\301\301\303\203\377\377\377\1\376\376\376" \
+ "\214\377\377\377\1\376\376\376\202\377\377\377\1\376\376\376\202\377" \
+ "\377\377\1\376\376\376\204\377\377\377\3\204\204\206;;=::<\202;;=\203" \
+ "::<\1\265\265\265\241\377\377\377\1kkm\206::<\1\234\234\236\236\377\377" \
+ "\377\12kkk::<99;;;=::<99;;;=::<;;=\204\204\206\210\377\377\377\202\376" \
+ "\376\376\213\377\377\377\1\376\376\376\202\377\377\377\1\376\376\376" \
+ "\202\377\377\377\1\376\376\376\202\377\377\377\2\364\364\366__a\206:" \
+ ":<\3;;=::<\332\332\332\222\377\377\377\1\234\234\234\206::<\1\316\316" \
+ "\316\252\377\377\377\1\316\316\316\206::<\1\234\234\236\213\377\377\377" \
+ "\2\255\333\363Y\270\350\211[\267\350\3\\\266\350X\270\352\\\266\352\202" \
+ "[\267\350\3X\267\347Y\270\350Z\266\347\210Y\270\350\10[\267\350[\265" \
+ "\351\327\355\372\376\377\377\377\377\375\0>j\0>i\1\77h\210\0>i\10\0\77" \
+ "k\0>g\2=g\0=i\0\77j\0<h\0\77h\1>j\210\0=i\3\0>i\0=i\177\236\263\232\377" \
+ "\377\377\1\316\316\316\206::<\1kkm\240\377\377\377\1\234\234\236\206" \
+ "::<\1\234\234\236\236\377\377\377\2\376\376\376\346\346\346\202::<\10" \
+ ";;=::<99;;;=::<\363\363\363\377\377\377\234\234\236\202::<\6;;=::<;;" \
+ "=::<\250\250\250\376\376\376\236\377\377\377\1kkm\206::<\1\316\316\316" \
+ "\267\377\377\377\10kkm;;=::<;;=99;::<;;=\264\264\266\236\377\377\377" \
+ "\1\376\376\376\204\377\377\377\2\346\346\346;;=\202::<\202;;=\202::<" \
+ "\2\316\316\320\376\376\376\203\377\377\377\1\376\376\376\205\377\377" \
+ "\377\3\376\376\376\377\377\377\376\376\376\202\377\377\377\3\234\234" \
+ "\234::<;;=\202::<\6;;=::<;;=GGI\332\332\332\376\376\376\224\377\377\377" \
+ "\1\376\376\376\203\377\377\377\2\266\266\266;;=\202::<\6;;=::<;;=::<" \
+ "SSU\376\376\376\241\377\377\377\1kkm\206::<\1\234\234\236\236\377\377" \
+ "\377\2\363\363\363GGI\203::<\1;;=\203::<\3""99;\204\204\204\363\363\363" \
+ "\225\377\377\377\1\376\376\376\204\377\377\377\4\376\376\376\346\346" \
+ "\346``b::<\202;;=\3::<99;<<>\202::<\1\250\250\250\223\377\377\377\1\234" \
+ "\234\234\206::<\1\316\316\316\252\377\377\377\1\316\316\316\206::<\1" \
+ "\234\234\236\213\377\377\377\2\255\333\363Y\270\350\211[\267\350\10Y" \
+ "\270\350X\270\353Y\267\352X\266\351X\271\346[\267\350\\\266\353[\267" \
+ "\350\210Y\270\350\7X\267\345]\267\351\323\355\372\377\376\377\376\377" \
+ "\377\4=h\0>g\211\0=i\10\2=i\0@j\0>i\1>j\0>i\1\77h\0>g\0>j\210\0=i\3\0" \
+ ">i\0=i\177\236\263\232\377\377\377\1\316\316\316\206::<\1kkm\240\377" \
+ "\377\377\1\234\234\236\206::<\1\234\234\236\237\377\377\377\6\376\376" \
+ "\376yy{::<;;=::<;;=\202::<\4\251\251\251\376\376\376SSU;;=\203::<\3;" \
+ ";=FFH\363\363\363\237\377\377\377\1kkm\206::<\1\316\316\316\264\377\377" \
+ "\377\5\376\376\376\377\377\377\315\315\317::<;;=\204::<\2FFH\376\376" \
+ "\376\237\377\377\377\1\376\376\376\203\377\377\377\3\376\376\376kkm;" \
+ ";=\204::<\6""99;lln\377\377\377\376\376\376\377\377\377\376\376\376\202" \
+ "\377\377\377\3\376\376\376\377\377\377\376\376\376\205\377\377\377\10" \
+ "\376\376\376\377\377\377SSU::<99;;;=99;;;=\202::<\2FFF\332\332\332\203" \
+ "\377\377\377\1\376\376\376\212\377\377\377\1\376\376\376\210\377\377" \
+ "\377\1\265\265\265\206::<\3""99;::<\265\265\265\203\377\377\377\1\376" \
+ "\376\376\236\377\377\377\1kkm\206::<\1\234\234\236\233\377\377\377\1" \
+ "\376\376\376\203\377\377\377\1\331\331\331\204::<\3""99;;;=99;\202;;" \
+ "=\2^^^\332\332\332\202\377\377\377\1\376\376\376\216\377\377\377\1\376" \
+ "\376\376\206\377\377\377\5\376\376\376\316\316\316FFH::<;;=\204::<\7" \
+ "99;::<\204\204\204\377\377\377\376\376\376\377\377\377\376\376\376\220" \
+ "\377\377\377\1\234\234\234\206::<\1\316\316\316\252\377\377\377\1\316" \
+ "\316\316\206::<\1\234\234\236\213\377\377\377\2\255\333\363Y\270\350" \
+ "\213[\267\350\6Y\270\350[\266\353[\267\350]\267\351X\266\351X\270\350" \
+ "\210[\267\350\10X\266\351Z\266\351\326\354\367\377\376\377\376\377\372" \
+ "\0>j\0>i\1>j\210\0=i\10\1\77h\0=h\0>i\1\77h\0>j\0=i\0>i\1>j\210\0=i\3" \
+ "\0>i\0=i\177\236\263\232\377\377\377\1\316\316\316\206::<\1kkm\240\377" \
+ "\377\377\1\234\234\236\206::<\1\234\234\236\237\377\377\377\2\376\376" \
+ "\376\316\316\316\203::<\1;;=\202::<\4SSU\265\265\267;;=99;\202::<\5;" \
+ ";=99;\204\204\204\377\377\377\376\376\376\236\377\377\377\1kkm\206::" \
+ "<\1\316\316\316\263\377\377\377\1\376\376\376\202\377\377\377\1xxz\202" \
+ "::<\1;;=\202::<\3""99;\234\234\236\376\376\376\236\377\377\377\1\375" \
+ "\375\375\202\377\377\377\1\376\376\376\202\377\377\377\5\317\317\317" \
+ "99;::<;;=::<\202;;=\2::<\332\332\332\210\377\377\377\3\376\376\376\377" \
+ "\377\377\376\376\376\204\377\377\377\2\316\316\316;;=\206::<\3;;=::<" \
+ "\250\250\252\217\377\377\377\1\376\376\376\204\377\377\377\2\363\363" \
+ "\363\222\222\224\202::<\2;;=::<\202;;=\3""99;;;=kkm\205\377\377\377\1" \
+ "\376\376\376\235\377\377\377\1kkm\206::<\1\234\234\236\235\377\377\377" \
+ "\1\376\376\376\202\377\377\377\2\266\266\26699;\202::<\3;;=::<;;=\202" \
+ "::<\3;;=FFH\234\234\234\202\377\377\377\1\376\376\376\223\377\377\377" \
+ "\2\364\364\364\204\204\206\202::<\1;;=\202::<\1;;=\202::<\3""99;``b\376" \
+ "\376\376\224\377\377\377\1\234\234\234\206::<\1\316\316\316\252\377\377" \
+ "\377\1\316\316\316\206::<\1\234\234\236\213\377\377\377\2\255\333\363" \
+ "Y\270\350\211[\267\350\10Y\271\353Z\266\347\\\267\344[\267\346X\267\347" \
+ "[\267\350X\270\353Z\266\347\210Y\270\350\10Y\267\352\\\267\346\325\355" \
+ "\371\377\377\377\376\377\377\0>g\0\77k\0>i\210\0\77j\10\0>i\3>h\0=i\0" \
+ "\77i\0=j\0>g\0=j\0=f\210\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1" \
+ "\316\316\316\206::<\1kkm\240\377\377\377\1\234\234\236\206::<\1\234\234" \
+ "\236\234\377\377\377\3\376\376\376\377\377\377\376\376\376\202\377\377" \
+ "\377\2SSU;;=\202::<\202;;=\3::<SSU::<\202;;=\203::<\1\332\332\332\240" \
+ "\377\377\377\1kkm\206::<\1\316\316\316\265\377\377\377\1\346\346\346" \
+ "\203::<\1;;=\202::<\2;;=\363\363\365\235\377\377\377\1\376\376\376\210" \
+ "\377\377\377\1SSU\202;;=\204::<\1\204\204\204\202\377\377\377\202\376" \
+ "\376\376\214\377\377\377\1\221\221\221\205::<\202;;=\4::<;;=kkm\316\316" \
+ "\316\221\377\377\377\2\301\301\301SSS\210::<\2FFH\363\363\365\243\377" \
+ "\377\377\1kkm\206::<\1\234\234\236\241\377\377\377\1\266\266\270\203" \
+ "::<\1;;=\205::<\3:::RRR\265\265\265\222\377\377\377\3\363\363\363\234" \
+ "\234\234FFF\202::<\1;;=\206::<\2``b\363\363\363\225\377\377\377\1\234" \
+ "\234\234\206::<\1\316\316\316\252\377\377\377\1\316\316\316\206::<\1" \
+ "\234\234\236\213\377\377\377\2\255\333\363Y\270\350\211[\267\350\10Z" \
+ "\266\347[\267\346Z\265\352X\266\351\\\270\351[\267\346X\267\347[\265" \
+ "\347\210[\267\350\10Y\267\352[\266\345\325\355\367\376\375\377\377\377" \
+ "\375\3>j\0=i\1>j\210\0>i\10\0\77j\1\77h\0>j\0>g\3>j\0\77i\0=j\0>i\210" \
+ "\0=i\3\0>i\0=i\177\236\263\232\377\377\377\1\316\316\316\206::<\1kkm" \
+ "\240\377\377\377\1\234\234\236\206::<\1\234\234\236\241\377\377\377\6" \
+ "\266\266\270::<;;=::<99;::<\202;;=\205::<\2kkm\376\376\376\240\377\377" \
+ "\377\1kkm\206::<\1\316\316\316\265\377\377\377\4\205\205\205;;=::<;;" \
+ "=\203::<\3\204\204\206\377\377\377\376\376\376\245\377\377\377\1\265" \
+ "\265\267\207::<\2\346\346\346\376\376\376\216\377\377\377\4\376\376\376" \
+ "lll::<;;=\202::<\13;;=::<;;=::<;;=::<kkm\264\264\266\363\363\365\377" \
+ "\377\377\376\376\376\202\377\377\377\1\376\376\376\206\377\377\377\3" \
+ "\346\346\350\250\250\252TTV\204::<\3;;=::<;;=\202::<\2;;=\333\333\333" \
+ "\202\377\377\377\1\376\376\376\237\377\377\377\3\376\376\376\377\377" \
+ "\377kkm\203::<\1;;=\202::<\1\235\235\237\242\377\377\377\1\265\265\265" \
+ "\203::<\1;;=\207::<\4GGI\220\220\222\332\332\334\376\376\376\206\377" \
+ "\377\377\1\376\376\376\204\377\377\377\5\376\376\376\302\302\302\204" \
+ "\204\206::<;;=\202::<\11""99;;;=::<;;=::<;;=::<```\363\363\363\226\377" \
+ "\377\377\1\234\234\234\202::<\1;;=\202::<\2;;=\316\316\316\252\377\377" \
+ "\377\4\316\316\316::<;;=99;\203::<\3\234\234\234\377\377\377\376\376" \
+ "\376\204\377\377\377\7\373\377\376\377\376\377\377\377\377\376\377\377" \
+ "\377\376\377\253\333\362[\265\351\203[\267\352\6Y\267\352[\267\350X\267" \
+ "\345Y\270\346Y\270\350Y\267\352\220[\267\350\5X\267\347Y\270\350\325" \
+ "\355\371\377\376\377\377\377\377\202\0>g\1\1>k\220\0=i\15\0>g\1>j\0>" \
+ "i\0\77j\1>j\0=i\0\77j\0>j\0=i\1<h}\237\270\376\377\377\377\376\374\226" \
+ "\377\377\377\3\376\376\376\377\377\377\316\316\316\204::<\3""99;;;=l" \
+ "ln\240\377\377\377\5\234\234\234::<;;=::<;;=\202::<\1\235\235\237\241" \
+ "\377\377\377\10\363\363\363FFF::<;;=::<;;=::<;;=\203::<\3;;=::<\265\265" \
+ "\265\237\377\377\377\3\376\376\376\377\377\377kkm\202::<\1;;=\202::<" \
+ "\4;;=\316\316\316\377\377\377\376\376\376\250\377\377\377\1\376\376\376" \
+ "\202\377\377\377\1\376\376\376\202\377\377\377\1\376\376\376\203\377" \
+ "\377\377\6\364\364\364::<99;;;=::<;;=\202::<\1\347\347\351\203\377\377" \
+ "\377\1\376\376\376\244\377\377\377\4FFH;;=::<99;\203::<\1\220\220\222" \
+ "\220\377\377\377\2\363\363\363``b\202::<\1;;=\203::<\1;;=\205::<\5__" \
+ "_\222\222\222\234\234\234\316\316\316\317\317\317\202\316\316\316\7\301" \
+ "\301\301\234\234\236\204\204\206__a;;=99;;;=\203::<\2;;=99;\203;;=\2" \
+ "::<\265\265\265\204\377\377\377\1\376\376\376\235\377\377\377\5\376\376" \
+ "\376\377\377\377\376\376\376kkm::<\202;;=\6::<;;=::<\234\234\236\377" \
+ "\377\377\376\376\376\236\377\377\377\1\376\376\376\202\377\377\377\5" \
+ "\301\301\303GGI;;=::<;;=\206::<\7;;=::<99;GGIwwy\235\235\235\300\300" \
+ "\300\202\316\316\316\10\315\315\315\317\317\317\315\315\315\265\265\265" \
+ "\234\234\234jjj<<>99;\203::<\1;;=\202::<\2""99;;;=\203::<\1\204\204\206" \
+ "\206\377\377\377\1\376\376\376\221\377\377\377\10\234\234\234;;=::<9" \
+ "9;;;=::<99;\316\316\316\252\377\377\377\4\317\317\317;;=88:;;=\202::" \
+ "<\3;;=\234\234\234\376\376\376\205\377\377\377\1\377\375\377\202\377" \
+ "\377\375\6\377\376\377\377\377\375\253\333\362Y\270\350X\267\347Z\266" \
+ "\347\202Y\270\350\1[\267\350\202Z\266\347\2[\267\350Z\266\347\220[\267" \
+ "\350\5[\267\352Z\266\351\327\355\372\377\375\376\377\376\377\202\1>j" \
+ "\1\1>k\220\0>i\202\0=i\14\0\77k\0>i\0=i\1>j\0=i\0=j\0\77k\0=i\177\236" \
+ "\263\377\377\377\376\377\377\375\376\377\224\377\377\377\1\376\376\376" \
+ "\202\377\377\377\1\316\316\316\203::<\202;;=\3""99;kkm\376\376\376\234" \
+ "\377\377\377\1\376\376\376\202\377\377\377\1\233\233\233\202::<\7;;=" \
+ "::<;;=::<\234\234\236\377\377\377\376\376\376\233\377\377\377\3\376\376" \
+ "\376\377\377\377\376\376\376\202\377\377\377\4\221\221\221;;=99;;;=\202" \
+ "::<\202;;=\203::<\1SSU\203\377\377\377\1\376\376\376\233\377\377\377" \
+ "\10\376\376\376\377\377\377\376\376\376kkm::<;;=::<;;=\202::<\1;;=\202" \
+ "::<\1;;=\240::<\1kkk\207\377\377\377\1\376\376\376\203\377\377\377\3" \
+ "\375\375\375\377\377\377\376\376\376\202\377\377\377\2\233\233\235::" \
+ "<\202;;=\203::<\1xxz\251\377\377\377\1\235\235\237\202::<\1;;=\203::" \
+ "<\3GGI\363\363\363\376\376\376\217\377\377\377\2\363\363\363yyy\204:" \
+ ":<\1;;=\203::<\1;;=\206::<\1""99;\203::<\1;;=\203::<\6;;=99;;;=::<;;" \
+ "=99;\202;;=\3""99;GGI\301\301\301\206\377\377\377\1\376\376\376\232\377" \
+ "\377\377\1\376\376\376\204\377\377\377\1lln\202::<\1;;=\202::<\2;;=\234" \
+ "\234\236\241\377\377\377\1\376\376\376\202\377\377\377\2\332\332\334" \
+ "__a\211::<\1;;=\205::<\1;;=\202::<\1;;=\202::<\4;;=::<99;;;=\202::<\1" \
+ ";;=\202::<\1;;=\203::<\2FFH\265\265\267\206\377\377\377\3\376\376\376" \
+ "\377\377\377\376\376\376\220\377\377\377\3\234\234\236::<;;=\203::<\2" \
+ ";;=\316\316\316\252\377\377\377\2\315\315\31599;\203::<\5;;=::<\234\234" \
+ "\234\377\377\377\376\376\376\205\377\377\377\7\377\377\375\375\377\376" \
+ "\377\377\377\375\376\377\255\333\365Z\266\345[\267\350\202Y\270\350\1" \
+ "X\267\347\202Y\267\352\3Z\266\351Z\266\347Y\270\350\221[\267\350\2[\267" \
+ "\352\323\355\372\202\376\377\377\1\0=j\222\0=i\204\0>i\14\1\77h\0>g\0" \
+ "=f\1>j\0\77i\0>i\177\237\266\377\377\375\377\376\375\377\377\377\376" \
+ "\377\377\377\376\377\225\377\377\377\2\316\316\316::<\202;;=\202::<\4" \
+ ";;=kkm\377\377\377\376\376\376\235\377\377\377\2\376\376\376\235\235" \
+ "\235\202::<\1;;=\202::<\2;;=\234\234\236\242\377\377\377\3\346\346\346" \
+ "::<;;=\210::<\2\235\235\237\376\376\376\234\377\377\377\1\376\376\376" \
+ "\204\377\377\377\1lln\202::<\3;;=::<;;=\203::<\2;;=99;\240::<\1kkk\210" \
+ "\377\377\377\11\376\376\376\377\377\377\376\376\376\377\377\377\376\376" \
+ "\376\377\377\377\376\376\376\364\364\366GGI\205::<\6;;=\316\316\316\377" \
+ "\377\377\376\376\376\377\377\377\376\376\376\245\377\377\377\11\345\345" \
+ "\345;;=::<;;=::<;;=::<;;=\234\234\236\222\377\377\377\7\234\234\234;" \
+ ";=::<;;=99;;;=99;\203::<\1;;=\202::<\203;;=\2::<;;=\202::<\1;;=\202:" \
+ ":<\1;;=\202::<\12;;=::<;;=99;::<``b\332\332\332\376\376\376\377\377\377" \
+ "\376\376\376\202\377\377\377\5\376\376\376\377\377\377\376\376\376\377" \
+ "\377\377\376\376\376\232\377\377\377\5\376\376\376\377\377\377\376\376" \
+ "\376kkm;;=\202::<\1;;=\202::<\1\234\234\236\236\377\377\377\1\376\376" \
+ "\376\207\377\377\377\2\234\234\236;;=\202::<\1;;=\204::<\1;;=\211::<" \
+ "\1;;=\202::<\1;;=\202::<\1;;=\202::<\1;;=\203::<\3;;=kkm\346\346\346" \
+ "\203\377\377\377\1\376\376\376\204\377\377\377\1\376\376\376\221\377" \
+ "\377\377\2\234\234\236;;=\202::<\1;;=\202::<\1\316\316\316\252\377\377" \
+ "\377\4\316\316\316;;=99;;;=\203::<\1\234\234\234\210\377\377\377\7\376" \
+ "\377\377\377\375\376\377\377\375\256\332\363Y\270\350Y\267\352[\267\352" \
+ "\202[\267\350\5X\270\350X\270\352Y\267\352Y\270\350X\267\347\220[\267" \
+ "\350\5X\267\347[\267\350\325\355\367\377\377\373\377\377\375\202\0\77" \
+ "j\1\0>g\220\0>i\1\0\77j\203\0>i\202\0=i\6\1>j\0>i\0\77h\0>g\177\236\263" \
+ "\377\377\375\203\377\377\377\1\377\376\377\222\377\377\377\1\376\376" \
+ "\376\202\377\377\377\1\316\316\316\203::<\1;;=\202::<\2kkm\376\376\376" \
+ "\233\377\377\377\1\376\376\376\203\377\377\377\5\234\234\234::<;;=::" \
+ "<;;=\202::<\1\234\234\236\235\377\377\377\202\376\376\376\202\377\377" \
+ "\377\5\376\376\376\377\377\377xxz99;;;=\204::<\4;;=::<;;=\362\362\362" \
+ "\237\377\377\377\5\376\376\376\377\377\377\376\376\376kkm;;=\207::<\2" \
+ "99;;;=\240::<\1lll\205\377\377\377\1\376\376\376\203\377\377\377\1\376" \
+ "\376\376\202\377\377\377\1\376\376\376\202\377\377\377\4\265\265\267" \
+ ";;=::<;;=\202::<\2;;=__a\205\377\377\377\1\376\376\376\245\377\377\377" \
+ "\3\204\204\206::<;;=\204::<\2SSU\376\376\376\215\377\377\377\1\376\376" \
+ "\376\204\377\377\377\2\316\316\316__a\206::<\1;;=\214::<\5;;=::<;;=:" \
+ ":<;;=\203::<\2\234\234\234\363\363\363\204\377\377\377\1\376\376\376" \
+ "\243\377\377\377\1lln\206::<\2\233\233\235\376\376\376\233\377\377\377" \
+ "\1\376\376\376\202\377\377\377\1\376\376\376\207\377\377\377\3\345\345" \
+ "\345lln;;=\204::<\5;;=99;::<99;;;=\205::<\1;;=\203::<\3""99;;;=99;\206" \
+ "::<\2TTV\265\265\265\234\377\377\377\10\234\234\234;;=::<;;=::<;;=::" \
+ "<\316\316\316\252\377\377\377\1\315\315\315\206::<\4\235\235\235\376" \
+ "\376\376\377\377\377\376\376\376\205\377\377\377\12\377\377\373\377\377" \
+ "\377\377\377\375\267\340\366[\270\344Z\266\351[\267\352Z\266\351[\265" \
+ "\347[\267\350\202Y\270\350\2\\\270\351Z\266\347\220[\267\350\10X\267" \
+ "\347X\266\351\325\355\371\377\376\377\377\377\377\0\77k\0=h\3>j\220\0" \
+ "\77j\16\1>j\0=i\1>j\0=i\0\77j\0>i\0=h\0\77j\0\77h\1<f\177\236\263\377" \
+ "\377\375\376\376\377\376\377\377\225\377\377\377\202\376\376\376\2\317" \
+ "\317\317::<\202;;=\1::<\202;;=\1kkm\235\377\377\377\1\376\376\376\202" \
+ "\377\377\377\2\234\234\234;;=\205::<\2\233\233\235\376\376\376\232\377" \
+ "\377\377\1\376\376\376\204\377\377\377\1\376\376\376\202\377\377\377" \
+ "\1\316\316\316\203::<\1;;=\204::<\3\204\204\206\377\377\377\376\376\376" \
+ "\241\377\377\377\1lln\203::<\202;;=\203::<\1;;=\241::<\1kkk\206\377\377" \
+ "\377\3\376\376\376\377\377\377\376\376\376\206\377\377\377\1TTV\203:" \
+ ":<\4""99;;;=99;\265\265\267\253\377\377\377\3\331\331\331;;=99;\204:" \
+ ":<\2;;=\264\264\264\217\377\377\377\1\376\376\376\204\377\377\377\2\264" \
+ "\264\266SSU\202::<\2""99;;;=\203::<\3;;=::<;;=\206::<\5;;=99;;;=::<;" \
+ ";=\20299;\6\204\204\206\346\346\346\377\377\377\376\376\376\377\377\377" \
+ "\376\376\376\203\377\377\377\202\376\376\376\202\377\377\377\1\376\376" \
+ "\376\231\377\377\377\3\376\376\376\377\377\377\376\376\376\202\377\377" \
+ "\377\12lll::<;;=::<99;::<;;=\234\234\236\377\377\377\376\376\376\233" \
+ "\377\377\377\1\375\375\375\213\377\377\377\4\316\316\316xxx;;=99;\204" \
+ "::<\1;;=\202::<\1;;=\204::<\4;;=::<;;=99;\203::<\1;;=\202::<\2SSS\265" \
+ "\265\265\210\377\377\377\3\376\376\376\377\377\377\376\376\376\223\377" \
+ "\377\377\1\234\234\234\206::<\1\316\316\316\250\377\377\377\3\376\376" \
+ "\376\377\377\377\315\315\315\202::<\7;;=::<;;=::<\234\234\234\377\377" \
+ "\377\376\376\376\202\377\377\377\21\376\376\376\377\377\377\376\377\373" \
+ "\377\377\377\376\377\377\376\377\375\377\376\377\353\366\374X\266\351" \
+ "X\270\350W\267\347X\270\350X\267\347Z\266\347\\\270\347X\267\345Y\270" \
+ "\350\221[\267\350\7Z\266\347[\267\350\327\355\372\377\375\377\377\377" \
+ "\377\0>g\0\77h\221\0=i\1\0>g\202\1\77h\1\0=i\202\0>i\11\0\77j\0>g\0>" \
+ "j\0\77m\336\347\354\376\377\377\377\376\377\376\377\377\377\377\375\222" \
+ "\377\377\377\1\376\376\376\203\377\377\377\1\316\316\316\202::<\1;;=" \
+ "\203::<\2kkm\376\376\376\233\377\377\377\1\376\376\376\202\377\377\377" \
+ "\3\376\376\376\234\234\234;;=\202::<\6""99;::<;;=\234\234\236\377\377" \
+ "\377\376\376\376\237\377\377\377\1\376\376\376\202\377\377\377\1SSS\202" \
+ ";;=\1""99;\204;;=\3\331\331\331\377\377\377\376\376\376\234\377\377\377" \
+ "\3\376\376\376\377\377\377\376\376\376\202\377\377\377\3lll::<;;=\202" \
+ "::<\202;;=\203::<\1;;=\240::<\1kkk\204\377\377\377\1\376\376\376\211" \
+ "\377\377\377\3\302\302\302;;;999\202::<\3;;=::<TTT\210\377\377\377\1" \
+ "\376\376\376\244\377\377\377\2kkk;;=\202::<\203:::\1TTT\226\377\377\377" \
+ "\3\301\301\301xxz;;=\202::<\1;;=\202::<\1;;=\202::<\5;;=::<;;=::<;;=" \
+ "\202::<\5;;=99;SSU\235\235\237\347\347\351\204\377\377\377\1\376\376" \
+ "\376\207\377\377\377\3\376\376\376\377\377\377\376\376\376\235\377\377" \
+ "\377\10kkk:::::<999;;;:::;;;\233\233\233\236\377\377\377\1\376\376\376" \
+ "\211\377\377\377\1\376\376\376\202\377\377\377\3\346\346\350\251\251" \
+ "\253``b\202::<\3;;=::<;;=\202::<\1;;=\205::<\1;;=\203::<\5;;=FFH\204" \
+ "\204\204\316\316\316\376\376\376\204\377\377\377\1\376\376\376\232\377" \
+ "\377\377\1\234\234\234\202::<\5""99;;;=99;;;;\315\315\315\252\377\377" \
+ "\377\3\316\316\316:::;;;\202:::\3;;;::<\234\234\234\206\377\377\377\1" \
+ "\377\377\375\203\377\376\377\11\377\377\377\377\377\375\303\344\367W" \
+ "\270\345^\266\344X\267\347Y\271\353Z\266\351\\\266\350\202Y\270\350\221" \
+ "[\267\352\3[\267\350[\265\347\325\355\371\202\376\377\377\3\2=e\0>g\0" \
+ "\77m\220\0=i\6\0\77j\0>i\0=h\0\77j\0=i\0\77j\202\0>g\2\1\77h\240\266" \
+ "\304\204\377\377\377\2\376\376\376\377\377\375\223\377\377\377\14\376" \
+ "\376\376\377\377\377\315\315\315;;=::<:::;;;:::;;;kkk\377\377\377\376" \
+ "\376\376\233\377\377\377\1\376\376\376\202\377\377\377\10\235\235\235" \
+ "99;::<999;;;:::;;;\233\233\233\234\377\377\377\1\376\376\376\207\377" \
+ "\377\377\1\265\265\265\202::<\1;;=\203::<\1kkk\203\377\377\377\1\376" \
+ "\376\376\240\377\377\377\2kkk:::\202::<\3;;=99;;;=\244::<\1kkk\205\377" \
+ "\377\377\1\376\376\376\210\377\377\377\1\346\346\346\206\316\316\316" \
+ "\3\332\332\332\377\377\377\377\377\375\253\377\377\377\2\346\346\346" \
+ "\316\316\316\202\316\316\320\203\316\316\316\1\315\315\315\225\377\377" \
+ "\377\202\376\376\376\202\377\377\377\4\316\316\320\234\234\236kkmSSU" \
+ "\205::<\1;;=\203::<\5kkm\204\204\206\264\264\266\346\346\350\376\376" \
+ "\376\214\377\377\377\1\376\376\376\202\377\377\377\202\376\376\376\231" \
+ "\377\377\377\1\376\376\376\203\377\377\377\2\331\331\331\317\317\317" \
+ "\205\316\316\316\1\347\347\347\243\377\377\377\1\376\376\376\211\377" \
+ "\377\377\5\376\376\377\347\347\351\265\265\267\204\204\206lln\212::<" \
+ "\4``bxxz\234\234\236\332\332\332\207\377\377\377\1\376\376\376\210\377" \
+ "\377\377\1\376\376\376\222\377\377\377\1\346\346\346\203\316\316\320" \
+ "\4\316\316\316\316\316\320\315\315\315\364\364\364\251\377\377\377\2" \
+ "\376\376\376\364\364\364\205\316\316\316\2\316\316\320\346\346\346\210" \
+ "\377\377\377\16\377\376\377\377\377\375\376\377\377\377\377\377\377\375" \
+ "\377\326\354\371\241\326\366\206\310\352\200\312\357\202\312\362\204" \
+ "\310\357\204\312\356\203\311\355\205\311\360\220\204\312\356\10\203\311" \
+ "\355\201\311\361\342\360\371\376\377\377\377\377\375>n\222Bm\215@n\220" \
+ "\220@n\217\3@l\217An\217Bo\220\202An\217\5@m\214Dm\213l\223\260\277\320" \
+ "\332\376\377\377\202\377\377\377\1\377\377\375\202\377\377\377\1\376" \
+ "\377\377\225\377\377\377\3\363\363\363\317\317\321\316\316\320\204\316" \
+ "\316\316\1\332\332\332\240\377\377\377\1\346\346\346\202\316\316\320" \
+ "\204\316\316\316\1\347\347\347\243\377\377\377\3\376\376\376\363\363" \
+ "\363lln\202kkm\1lln\202kkm\1\301\301\301\240\377\377\377\1\376\376\376" \
+ "\203\377\377\377\2\331\331\331\317\317\317\202\316\316\316\202\317\317" \
+ "\317\245\316\316\316\2\332\332\332\376\376\376\351\377\377\377\5\332" \
+ "\332\332\315\315\315\316\316\316\315\315\315\363\363\363\361\377\377" \
+ "\377\202\316\316\316\1\317\317\317\202\316\316\316\2\315\315\315\363" \
+ "\363\363\377\377\377\377\377\377\377\377\377\377\377\377\334\377\377" \
+ "\377\1\376\376\376\375\377\377\377\1\376\376\376\377\377\377\377\377" \
+ "\377\377\377\377\377\377\377\340\377\377\377\1\376\376\376\370\377\377" \
+ "\377\1\376\376\376\377\377\377\377\377\377\377\377\377\377\377\377\342" \
+ "\377\377\377\1\376\376\376\377\377\377\377\377\377\377\377\377\377\377" \
+ "\377\377\377\377\377\334\377\377\377\1\376\376\376\362\377\377\377\1" \
+ "\376\376\376\377\377\377\377\377\377\377\377\377\377\377\377\346\377" \
+ "\377\377\1\376\376\376\363\377\377\377\1\376\376\376\377\377\377\377" \
+ "\377\377\377\377\377\377\377\377\342\377\377\377\1\376\376\376\373\377" \
+ "\377\377\1\376\376\376\377\377\377\377\377\377\377\377\377\377\377\377" \
+ "\340\377\377\377\3\376\376\376\377\377\377\376\376\376\377\377\377\377" \
+ "\377\377\377\377\377\377\377\377\377\377\377\377\243\377\377\377\3\376" \
+ "\376\376\377\377\377\376\376\376\203\377\377\377\1\376\376\376\233\377" \
+ "\377\377\1\376\376\376\205\377\377\377\1\376\376\376\214\377\377\377" \
+ "\1\376\376\376\205\377\377\377\1\376\376\376\260\377\377\377\3\376\376" \
+ "\376\377\377\377\376\376\376\300\377\377\377\1\376\376\376\306\377\377" \
+ "\377\1\376\376\376\233\377\377\377\4\376\377\377\376\376\376\377\376" \
+ "\377\377\377\377\203\376\377\375\203\377\377\377\3\377\377\375\376\377" \
+ "\375\376\377\377\265\377\377\377\4\377\377\375\377\376\377\376\377\377" \
+ "\377\377\375\202\377\376\377\210\377\377\377\7\377\377\375\376\377\377" \
+ "\377\377\377\375\377\376\376\377\377\377\376\377\376\377\377\211\377" \
+ "\377\377\4\376\377\375\377\377\377\376\376\376\377\377\375\202\377\377" \
+ "\377\2\377\377\375\376\376\376\220\377\377\377\1\376\377\375\202\377" \
+ "\377\375\5\377\376\377\377\377\373\377\377\377\375\377\376\377\377\375" \
+ "\210\377\377\377\1\377\376\377\202\377\377\375\202\377\377\377\3\376" \
+ "\377\377\377\377\375\377\376\377\213\377\377\377\3\376\377\377\376\377" \
+ "\375\377\377\375\203\377\377\377\203\376\377\375\4\377\377\377\377\376" \
+ "\377\376\376\376\376\377\377\233\377\377\377\3\376\377\377\376\377\375" \
+ "\377\377\375\203\377\377\377\203\376\377\375\4\377\377\377\377\376\377" \
+ "\376\376\376\376\377\377\210\377\377\377\1\377\376\377\203\377\377\377" \
+ "\4\376\377\377\377\377\375\377\376\377\376\377\373\211\377\377\377\4" \
+ "\376\377\377\376\376\374\377\376\377\377\375\376\226\377\377\377\5\376" \
+ "\377\377\375\377\374\377\377\375\376\375\377\377\377\375\210\377\377" \
+ "\377\1\377\377\375\202\376\377\377\1\377\377\373\242\377\377\377\1\376" \
+ "\376\376\212\377\377\377\1\376\376\376\207\377\377\377\1\376\376\376" \
+ "\237\377\377\377\1\376\376\376\203\377\377\377\1\376\376\376\214\377" \
+ "\377\377\1\376\376\376\204\377\377\377\202\376\376\376\257\377\377\377" \
+ "\1\376\376\376\202\377\377\377\1\376\376\376\202\377\377\377\1\376\376" \
+ "\376\246\377\377\377\1\376\376\376\224\377\377\377\1\376\376\376\250" \
+ "\377\377\377\1\376\376\376\202\377\377\377\1\376\376\376\236\377\377" \
+ "\377\3\376\376\376\377\377\377\376\376\376\230\377\377\377\4\377\377" \
+ "\373\376\377\377\376\376\376\377\376\377\203\377\377\377\1\377\377\375" \
+ "\202\377\377\377\1\377\376\377\202\377\377\375\3\377\377\377\377\377" \
+ "\375\376\376\374\260\377\377\377\2\377\377\375\376\376\376\203\377\376" \
+ "\377\214\377\377\377\7\376\377\377\377\376\377\377\377\375\377\377\377" \
+ "\377\376\377\375\377\376\377\377\375\210\377\377\377\7\377\376\374\377" \
+ "\377\375\377\376\377\377\377\375\376\376\376\377\377\377\376\376\376" \
+ "\221\377\377\377\1\377\376\377\203\377\377\377\202\377\377\375\212\377" \
+ "\377\377\2\377\377\375\377\377\377\202\377\377\375\214\377\377\377\3" \
+ "\376\376\374\377\377\375\377\377\377\202\377\377\375\1\377\376\377\202" \
+ "\377\377\377\1\377\377\375\203\377\377\377\4\377\376\377\376\376\376" \
+ "\376\377\377\377\377\373\230\377\377\377\3\376\376\374\377\377\375\377" \
+ "\377\377\202\377\377\375\1\377\376\377\202\377\377\377\1\377\377\375" \
+ "\203\377\377\377\4\377\376\377\376\376\376\376\377\377\377\377\373\213" \
+ "\377\377\377\1\377\376\374\214\377\377\377\2\377\377\375\377\376\377" \
+ "\202\377\377\375\3\376\377\377\377\377\377\377\377\373\221\377\377\377" \
+ "\3\376\377\375\376\377\377\377\376\377\204\377\377\377\1\377\377\375" \
+ "\212\377\377\377\5\377\376\377\377\377\375\377\377\377\376\377\375\376" \
+ "\377\373\243\377\377\377\1\376\376\376\205\377\377\377\1\376\376\376" \
+ "\204\377\377\377\1\376\376\376\242\377\377\377\1\376\376\376\205\377" \
+ "\377\377\1\376\376\376\213\377\377\377\1\376\376\376\206\377\377\377" \
+ "\1\376\376\376\263\377\377\377\3\376\376\376\377\377\377\376\376\376" \
+ "\270\377\377\377\1\376\376\376\312\377\377\377\1\376\376\376\234\377" \
+ "\377\377\1\377\377\375\202\376\377\377\7\377\376\377\377\377\377\376" \
+ "\377\377\377\376\377\377\377\375\377\377\377\376\377\377\202\377\376" \
+ "\377\2\376\377\375\376\377\377\262\377\377\377\10\377\377\375\376\377" \
+ "\377\377\376\377\377\377\373\377\377\377\377\376\377\376\377\375\377" \
+ "\377\375\211\377\377\377\3\376\377\377\377\376\377\377\377\375\202\377" \
+ "\377\377\2\376\377\377\376\376\376\210\377\377\377\202\377\376\377\4" \
+ "\374\377\377\376\377\377\377\376\377\377\377\375\222\377\377\377\4\377" \
+ "\376\375\376\377\377\377\377\377\376\377\377\202\377\376\377\202\377" \
+ "\377\375\210\377\377\377\4\377\377\375\377\377\377\377\377\375\377\377" \
+ "\377\202\377\376\377\2\377\377\377\376\377\377\212\377\377\377\2\376" \
+ "\377\377\376\377\375\202\377\376\377\7\376\377\377\377\377\377\377\377" \
+ "\375\377\376\377\376\377\377\377\377\377\377\376\377\202\376\377\377" \
+ "\1\377\377\375\232\377\377\377\2\376\377\377\376\377\375\202\377\376" \
+ "\377\7\376\377\377\377\377\377\377\377\375\377\376\377\376\377\377\377" \
+ "\377\377\377\376\377\202\376\377\377\1\377\377\375\210\377\377\377\1" \
+ "\377\377\375\202\377\377\377\4\377\377\375\377\376\377\377\377\377\376" \
+ "\377\377\211\377\377\377\7\375\376\377\377\377\375\377\376\377\376\376" \
+ "\377\376\377\375\375\377\376\377\377\375\222\377\377\377\6\376\377\377" \
+ "\377\376\377\377\377\377\377\377\375\377\376\377\376\377\377\213\377" \
+ "\377\377\202\377\376\377\3\377\377\375\376\377\377\376\377\375\236\377" \
+ "\377\377\1\376\376\376\203\377\377\377\1\376\376\376\202\377\377\377" \
+ "\1\376\376\376\203\377\377\377\2\376\376\376\377\377\377\202\376\376" \
+ "\376\202\377\377\377\1\376\376\376\202\377\377\377\1\376\376\376\204" \
+ "\377\377\377\1\376\376\376\235\377\377\377\1\376\376\376\217\377\377" \
+ "\377\1\376\376\376\206\377\377\377\1\376\376\376\260\377\377\377\3\376" \
+ "\376\376\377\377\377\376\376\376\241\377\377\377\202\376\376\376\204" \
+ "\377\377\377\1\376\376\376\222\377\377\377\1\376\376\376\205\377\377" \
+ "\377\1\376\376\376\246\377\377\377\1\376\376\376\233\377\377\377\3\376" \
+ "\376\376\377\377\377\376\376\376\234\377\377\377\15\376\376\376\377\377" \
+ "\377\377\376\377\377\377\375\375\377\376\377\377\377\376\377\375\377" \
+ "\377\377\375\376\377\377\377\377\377\377\375\376\377\377\377\377\377" \
+ "\202\377\376\377\260\377\377\377\7\377\376\377\376\377\377\377\377\377" \
+ "\376\377\377\377\377\377\377\377\375\376\377\377\212\377\377\377\1\376" \
+ "\376\374\203\377\377\377\3\376\376\377\377\377\375\376\377\377\210\377" \
+ "\377\377\10\376\377\377\377\376\377\374\377\373\376\377\373\377\376\377" \
+ "\376\376\376\377\377\377\376\377\375\220\377\377\377\2\377\376\377\377" \
+ "\377\377\202\377\377\375\202\377\377\377\2\376\376\374\376\377\377\210" \
+ "\377\377\377\1\376\377\377\202\377\377\377\5\376\377\377\377\377\377" \
+ "\376\376\376\377\377\377\376\377\375\210\377\377\377\202\377\376\377" \
+ "\15\377\377\377\376\377\377\377\377\375\377\377\377\375\376\377\377\377" \
+ "\377\376\377\375\377\377\377\375\377\376\377\377\375\377\376\377\377" \
+ "\377\377\376\376\376\231\377\377\377\202\377\376\377\15\377\377\377\376" \
+ "\377\377\377\377\375\377\377\377\375\376\377\377\377\377\376\377\375" \
+ "\377\377\377\375\377\376\377\377\375\377\376\377\377\377\377\376\376" \
+ "\376\211\377\377\377\4\377\376\377\377\377\377\376\377\375\376\377\377" \
+ "\202\377\377\377\2\376\377\377\376\377\375\210\377\377\377\1\376\377" \
+ "\375\202\376\376\376\202\377\377\377\2\377\377\375\375\376\377\221\377" \
+ "\377\377\10\377\377\375\377\377\377\376\376\374\376\377\373\376\376\376" \
+ "\377\376\377\376\377\377\377\377\375\210\377\377\377\6\376\376\376\377" \
+ "\377\377\377\377\375\377\377\377\374\375\377\377\377\375\242\377\377" \
+ "\377\1\376\376\376\214\377\377\377\1\376\376\376\204\377\377\377\3\376" \
+ "\376\376\377\377\377\376\376\376\235\377\377\377\1\376\376\376\203\377" \
+ "\377\377\202\376\376\376\212\377\377\377\1\376\376\376\202\377\377\377" \
+ "\202\376\376\376\264\377\377\377\5\376\376\376\377\377\377\376\376\376" \
+ "\377\377\377\376\376\376\242\377\377\377\3\376\376\376\377\377\377\376" \
+ "\376\376\202\377\377\377\1\376\376\376\223\377\377\377\1\376\376\376" \
+ "\244\377\377\377\1\376\376\376\203\377\377\377\1\376\376\376\233\377" \
+ "\377\377\1\376\376\376\202\377\377\377\1\376\376\376\234\377\377\377" \
+ "\1\375\377\372\202\377\377\377\3\376\376\376\377\377\375\377\377\377" \
+ "\202\376\377\377\204\377\377\377\4\376\377\377\377\377\377\377\376\377" \
+ "\375\377\372\260\377\377\377\202\377\377\375\2\377\377\377\376\375\377" \
+ "\202\377\377\377\1\375\377\376\212\377\377\377\6\377\377\375\377\377" \
+ "\377\376\377\375\377\377\375\377\376\377\377\376\375\212\377\377\377" \
+ "\1\377\376\377\202\377\377\377\4\377\375\376\377\377\377\377\377\373" \
+ "\376\375\377\221\377\377\377\203\376\376\376\4\377\377\375\376\376\374" \
+ "\377\376\377\376\376\374\210\377\377\377\5\377\376\377\377\377\375\377" \
+ "\376\377\376\376\376\376\377\375\202\377\377\377\1\376\376\376\210\377" \
+ "\377\377\4\375\377\372\377\376\377\377\377\377\376\377\377\204\377\377" \
+ "\377\202\376\377\377\3\377\377\377\377\377\375\376\376\376\202\377\377" \
+ "\377\1\375\377\372\230\377\377\377\4\375\377\372\377\376\377\377\377" \
+ "\377\376\377\377\204\377\377\377\202\376\377\377\3\377\377\377\377\377" \
+ "\375\376\376\376\202\377\377\377\1\375\377\372\210\377\377\377\3\376" \
+ "\377\377\377\377\377\376\376\376\202\376\377\377\202\377\377\377\1\376" \
+ "\377\375\210\377\377\377\7\376\376\377\377\377\375\376\377\375\376\376" \
+ "\376\377\376\377\377\377\377\376\377\377\221\377\377\377\5\376\376\376" \
+ "\376\377\377\377\377\377\375\375\375\377\376\377\202\377\377\377\1\377" \
+ "\377\375\211\377\377\377\7\377\376\377\376\376\374\376\377\377\377\377" \
+ "\377\377\376\377\377\377\375\377\377\373\233\377\377\377\1\376\376\376" \
+ "\205\377\377\377\1\376\376\376\203\377\377\377\1\376\376\376\203\377" \
+ "\377\377\1\376\376\376\204\377\377\377\3\376\376\376\377\377\377\376" \
+ "\376\376\204\377\377\377\1\376\376\376\237\377\377\377\1\376\376\376" \
+ "\212\377\377\377\1\376\376\376\213\377\377\377\1\376\376\376\255\377" \
+ "\377\377\1\376\376\376\247\377\377\377\1\376\376\376\202\377\377\377" \
+ "\1\376\376\376\224\377\377\377\1\376\376\376\247\377\377\377\1\376\376" \
+ "\376\236\377\377\377\1\376\376\376\203\377\377\377\1\376\376\376\232" \
+ "\377\377\377\10\377\376\377\377\377\375\377\377\377\376\377\377\376\376" \
+ "\376\377\376\377\377\377\375\377\376\377\202\377\377\375\1\377\376\377" \
+ "\202\377\377\377\3\377\376\377\377\375\376\377\376\377\260\377\377\377" \
+ "\2\377\376\377\377\377\377\202\377\376\377\4\377\377\375\376\376\374" \
+ "\377\375\377\377\376\377\210\377\377\377\3\376\376\374\377\376\377\376" \
+ "\376\376\204\377\377\377\1\376\377\375\210\377\377\377\4\375\377\374" \
+ "\377\377\377\377\375\376\377\376\377\203\377\377\377\1\377\377\375\220" \
+ "\377\377\377\3\376\377\377\377\377\375\376\377\377\202\377\377\377\3" \
+ "\377\376\377\373\377\377\376\377\377\211\377\377\377\202\376\377\375" \
+ "\1\377\377\375\203\377\377\377\1\377\376\377\210\377\377\377\3\377\376" \
+ "\377\377\375\376\377\376\377\202\377\377\377\1\377\376\377\202\377\377" \
+ "\375\10\377\376\377\377\377\375\377\376\377\376\376\376\376\377\377\377" \
+ "\377\377\377\377\375\377\376\377\230\377\377\377\3\377\376\377\377\375" \
+ "\376\377\376\377\202\377\377\377\1\377\376\377\202\377\377\375\10\377" \
+ "\376\377\377\377\375\377\376\377\376\376\376\376\377\377\377\377\377" \
+ "\377\377\375\377\376\377\210\377\377\377\2\377\377\375\375\376\371\202" \
+ "\377\376\377\3\377\377\377\377\377\375\377\376\377\212\377\377\377\1" \
+ "\377\375\376\202\377\377\377\4\377\377\375\376\376\376\376\377\377\377" \
+ "\376\377\220\377\377\377\2\376\377\377\376\376\377\202\377\377\377\2" \
+ "\376\377\375\375\377\374\212\377\377\377\10\373\377\376\377\377\377\377" \
+ "\377\375\376\376\374\377\377\375\377\376\377\377\377\377\376\377\377" \
+ "\235\377\377\377\1\376\376\376\202\377\377\377\7\316\316\320\250\250" \
+ "\252\221\221\223llnjjlGGI99;\204::<\7TTVkkmyy{\234\234\236\265\265\267" \
+ "\332\332\332\376\376\376\237\377\377\377\3\376\376\376\377\377\377\376" \
+ "\376\376\222\377\377\377\1\376\376\376\205\377\377\377\3\376\376\376" \
+ "\377\377\377\376\376\376\255\377\377\377\1\376\376\376\246\377\377\377" \
+ "\1\376\376\376\227\377\377\377\1\376\376\376\252\377\377\377\1\376\376" \
+ "\376\233\377\377\377\1\376\376\376\236\377\377\377\17\305\344\240\303" \
+ "\342\237\304\343\240\304\343\237\307\342\237\303\342\236\305\342\240" \
+ "\303\342\236\305\342\237\304\343\240\304\343\237\304\341\237\304\343" \
+ "\237\323\352\266\376\377\375\250\377\377\377\210\305\342\240\10\305\342" \
+ "\237\303\342\234\304\343\237\306\341\236\304\343\240\322\352\270\376" \
+ "\377\377\375\377\376\211\377\377\377\5\377\376\377\376\376\376\377\376" \
+ "\377\360\371\350\305\342\237\202\304\341\236\210\305\342\240\5\304\341" \
+ "\236\327\356\302\376\377\377\377\377\373\376\377\375\202\377\377\375" \
+ "\1\377\376\377\220\377\377\377\202\377\377\375\2\376\377\377\377\377" \
+ "\377\202\377\377\375\2\304\343\237\306\341\236\210\305\342\240\5\307" \
+ "\342\237\303\342\236\304\341\236\341\357\314\377\377\375\213\377\377" \
+ "\377\17\376\377\375\323\352\266\304\343\237\304\341\237\304\343\237\304" \
+ "\343\240\305\342\237\303\342\236\305\342\240\303\342\236\307\342\237" \
+ "\304\343\237\304\343\240\303\342\237\305\344\240\231\377\377\377\17\376" \
+ "\377\375\323\352\266\304\343\237\304\341\237\304\343\237\304\343\240" \
+ "\305\342\237\303\342\236\305\342\240\303\342\236\307\342\237\304\343" \
+ "\237\304\343\240\303\342\237\305\344\240\211\377\377\377\10\360\367\347" \
+ "\306\343\241\303\342\237\307\342\237\303\342\237\304\343\235\307\341" \
+ "\240\304\343\240\210\305\342\240\7\315\347\252\376\377\375\377\375\376" \
+ "\376\377\375\377\377\377\377\377\373\376\377\377\221\377\377\377\10\377" \
+ "\377\375\376\377\375\323\352\266\307\341\240\307\342\237\305\342\240" \
+ "\307\340\236\306\341\236\210\305\342\240\4\304\343\237\311\335\236\377" \
+ "\377\377\377\376\377\203\377\377\377\1\376\377\377\230\377\377\377\1" \
+ "\376\376\376\203\377\377\377\3\346\346\346\251\251\251jjl\202;;=\210" \
+ "::<\1;;=\202::<\2;;=99;\203::<\5FFHxxx\265\265\265\363\363\363\376\376" \
+ "\376\234\377\377\377\2\376\376\376\346\346\346\214\234\234\234\1\235" \
+ "\235\235\203\234\234\234\3\235\235\235\234\234\234\250\250\250\203\316" \
+ "\316\316\1\346\346\346\263\377\377\377\202\250\250\250\245\377\377\377" \
+ "\1\316\316\316\222\234\234\234\1\302\302\302\203\316\316\316\1\363\363" \
+ "\363\247\377\377\377\3\316\316\316\234\234\234\235\235\235\240\234\234" \
+ "\234\1\316\316\316\231\377\377\377\6\215\305>\216\306A\215\305@\213\310" \
+ "=\215\305>\212\307>\202\214\305@\6\214\306>\212\306@\214\306<\215\304" \
+ "B\214\306>\252\323m\251\377\377\377\210\214\306>\10\215\305@\215\307" \
+ "\77\212\307>\217\304@\214\305@\251\323m\377\377\377\377\377\375\213\377" \
+ "\377\377\5\377\375\377\341\363\315\215\305>\212\307>\215\305@\210\214" \
+ "\306>\6\215\306A\220\305\77\350\365\333\377\377\377\376\377\377\377\376" \
+ "\377\202\376\377\377\225\377\377\377\3\377\376\377\214\306>\215\306A" \
+ "\210\214\306>\6\215\305>\212\310\77\215\305@\307\341\240\376\377\377" \
+ "\377\376\377\213\377\377\377\6\252\323m\214\306>\215\304B\214\306<\212" \
+ "\306@\214\306>\202\214\305@\6\212\307>\215\305>\213\310=\215\305@\216" \
+ "\306A\215\305>\232\377\377\377\6\252\323m\214\306>\215\304B\214\306<" \
+ "\212\306@\214\306>\202\214\305@\6\212\307>\215\305>\213\310=\215\305" \
+ "@\216\306A\215\305>\211\377\377\377\4\376\377\377\242\321a\213\307A\215" \
+ "\305>\202\214\306>\2\215\305@\215\307\77\210\214\306>\7\215\305<\332" \
+ "\354\304\377\377\377\376\377\375\376\376\376\377\376\377\376\376\376" \
+ "\221\377\377\377\10\377\376\377\342\362\316\215\305>\213\310\77\212\305" \
+ "D\212\307<\216\306\77\211\307>\211\214\306>\4\304\343\240\373\377\376" \
+ "\377\377\377\375\377\376\202\377\377\377\1\377\377\375\225\377\377\377" \
+ "\1\376\376\376\204\377\377\377\6\265\265\267__a99;;;=::<;;=\202::<\1" \
+ ";;=\202::<\1;;=\202::<\1;;=\203::<\1;;=\203::<\3;;=::<99;\202::<\2xx" \
+ "z\301\301\301\202\377\377\377\1\376\376\376\202\377\377\377\1\376\376" \
+ "\376\206\377\377\377\1\376\376\376\217\377\377\377\1\316\316\316\205" \
+ "::<\202;;=\221::<\4TTVwwy\250\250\252\346\346\350\255\377\377\377\1\316" \
+ "\316\320\202::<\1\316\316\316\244\377\377\377\1\234\234\236\204::<\1" \
+ ";;=\205::<\3;;=::<;;=\206::<\1;;=\204::<\6SSUkkm\204\204\206\250\250" \
+ "\250\316\316\316\376\376\376\206\377\377\377\1\376\376\376\231\377\377" \
+ "\377\1\234\234\234\206::<\3;;=::<;;=\222::<\1;;=\204::<\3;;=::<\234\234" \
+ "\236\231\377\377\377\3\214\305@\214\306>\214\305@\207\214\306>\4\214" \
+ "\305@\215\305>\214\306>\252\324p\251\377\377\377\215\214\306>\1\250\325" \
+ "p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305@\210\214\306>" \
+ "\15\212\306@\215\307\77\233\316W\365\374\364\377\376\375\376\377\377" \
+ "\377\376\377\377\377\375\377\377\377\377\377\375\376\376\376\377\377" \
+ "\377\376\376\374\202\377\377\377\1\376\376\376\216\377\377\377\213\214" \
+ "\306>\3\215\305>\214\306>\305\342\240\215\377\377\377\4\252\324p\214" \
+ "\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305@\232" \
+ "\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3\214" \
+ "\305@\214\306>\214\305@\212\377\377\377\7\350\364\334\215\305>\212\307" \
+ "<\214\305@\215\304B\215\305@\213\310\77\210\214\306>\10\214\305@\225" \
+ "\311J\370\373\362\377\376\377\376\377\377\377\377\375\377\377\377\376" \
+ "\377\377\210\377\377\377\40\376\377\377\376\377\375\377\376\377\377\377" \
+ "\377\375\376\377\377\377\375\377\376\377\376\377\377\370\373\364\233" \
+ "\314W\215\307\77\214\304=\212\306@\215\307\77\213\305=\215\307\77\214" \
+ "\306>\217\304@\215\306A\212\307>\214\306<\215\306A\214\306>\211\307@" \
+ "\242\321a\377\377\377\377\376\377\376\377\377\377\376\377\377\377\377" \
+ "\376\377\377\377\376\377\223\377\377\377\7\376\376\376\377\377\377\376" \
+ "\376\376\377\377\377\363\363\365\234\234\236FFH\202::<\10;;=99;;;=::" \
+ "<;;=::<99;;;=\203::<\1;;=\203::<\2;;=99;\204::<\11""99;;;=::<;;=::<;" \
+ ";=TTV\265\265\265\363\363\363\203\377\377\377\1\376\376\376\207\377\377" \
+ "\377\1\376\376\376\215\377\377\377\1\316\316\316\205::<\3;;=::<;;=\202" \
+ "::<\1;;=\214::<\3;;=99;;;=\202::<\4lln\316\316\316\376\376\376\377\377" \
+ "\377\202\376\376\376\246\377\377\377\2\376\376\376xxz\202::<\2xxx\376" \
+ "\376\376\243\377\377\377\1\234\234\236\204::<\202;;=\205::<\1;;=\204" \
+ "::<\1;;=\202::<\1""99;\206::<\1;;=\202::<\6;;=kkk\250\250\250\346\346" \
+ "\346\377\377\377\376\376\376\205\377\377\377\1\376\376\376\225\377\377" \
+ "\377\1\234\234\234\204::<\1;;=\202::<\4;;=::<99;;;=\225::<\3;;=::<\234" \
+ "\234\236\231\377\377\377\3\214\305@\214\306>\214\305@\207\214\306>\4" \
+ "\214\305@\215\305>\214\306>\252\324p\251\377\377\377\215\214\306>\1\250" \
+ "\325p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305@\210\214\306" \
+ ">\4\215\306A\213\304\77\215\305@\262\327x\202\377\377\377\1\376\377\375" \
+ "\203\377\377\375\204\377\377\377\1\376\376\376\217\377\377\377\213\214" \
+ "\306>\3\215\305>\214\306>\305\342\240\215\377\377\377\4\252\324p\214" \
+ "\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305@\232" \
+ "\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3\214" \
+ "\305@\214\306>\214\305@\212\377\377\377\7\376\376\376\305\342\237\212" \
+ "\307>\214\306>\212\307<\214\306>\212\307>\210\214\306>\3\214\306<\215" \
+ "\306A\300\337\221\202\377\377\377\3\377\376\377\376\376\376\377\377\375" \
+ "\210\377\377\377\1\377\375\377\202\377\377\377\2\376\376\377\376\377" \
+ "\375\202\377\376\377\30\377\377\377\277\340\221\215\306A\213\305=\215" \
+ "\305>\212\306B\214\306>\216\306\77\214\306<\212\307>\215\307=\213\305" \
+ ";\215\307\77\216\305C\214\306>\214\305@\216\306\77\347\365\333\377\376" \
+ "\377\377\377\375\376\377\377\377\376\374\377\377\377\377\377\375\222" \
+ "\377\377\377\1\376\376\376\204\377\377\377\12\265\265\267FFH;;=::<;;" \
+ "=99;::<;;=::<;;=\202::<\4<<>99;::<;;=\202::<\1;;=\203::<\1<<>\204::<" \
+ "\5<<>99;;;=99;;;=\202::<\4:::SSS\266\266\266\376\376\376\203\377\377" \
+ "\377\1\376\376\376\204\377\377\377\1\376\376\376\216\377\377\377\1\316" \
+ "\316\316\204::<\3;;=::<;;=\204::<\1;;=\214::<\1;;=\202::<\1;;=\202::" \
+ "<\2yyy\363\363\363\202\377\377\377\1\376\376\376\245\377\377\377\3\346" \
+ "\346\346::<;;=\202::<\1\347\347\347\202\377\377\377\1\376\376\376\240" \
+ "\377\377\377\1\234\234\236\203::<\4;;=99;::<;;=\202::<\7;;=::<;;=99;" \
+ ";;=::<;;=\203::<\202;;=\210::<\1""99;\202::<\4;;=xxz\317\317\317\376" \
+ "\376\376\202\377\377\377\1\376\376\376\227\377\377\377\1\234\234\234" \
+ "\204::<\1""99;\203;;=\224::<\1;;=\204::<\2<<>\234\234\236\231\377\377" \
+ "\377\3\214\305@\214\306>\214\305@\207\214\306>\4\214\305@\215\305>\214" \
+ "\306>\252\324p\251\377\377\377\215\214\306>\1\250\325p\216\377\377\377" \
+ "\1\342\361\320\202\214\306>\1\214\305@\210\214\306>\10\215\305>\214\306" \
+ ">\213\307A\214\306>\315\345\253\377\377\375\377\376\377\376\377\377\226" \
+ "\377\377\377\213\214\306>\3\215\305>\214\306>\305\342\240\215\377\377" \
+ "\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3\214\305@\214" \
+ "\306>\214\305@\232\377\377\377\4\252\324p\214\306>\215\305>\214\305@" \
+ "\207\214\306>\3\214\305@\214\306>\214\305@\211\377\377\377\7\377\377" \
+ "\375\377\376\377\376\376\376\241\321a\212\307>\211\305\77\215\306A\211" \
+ "\214\306>\4\213\310\77\214\305@\213\305=\342\361\320\202\377\376\377" \
+ "\2\377\377\375\377\376\377\210\377\377\377\1\377\376\377\202\377\377" \
+ "\377\30\377\377\375\376\377\377\377\377\375\376\377\377\351\366\334\214" \
+ "\305B\211\306;\215\307\77\214\306>\212\306@\215\305>\215\305@\212\307" \
+ ">\214\305@\212\306B\214\306>\213\305=\213\310\77\215\305>\215\307\77" \
+ "\314\345\253\377\375\377\377\376\374\376\377\377\203\377\377\377\1\377" \
+ "\376\374\225\377\377\377\2\345\345\345kkm\205::<\202;;=\203::<\1;;=\203" \
+ "::<\1;;=\202::<\202;;=\202::<\1;;=\210::<\2;;=99;\205::<\2```\331\331" \
+ "\331\211\377\377\377\1\376\376\376\214\377\377\377\1\316\316\316\206" \
+ "::<\5""99;::<;;=::<99;\212::<\1;;=\202::<\1;;=\204::<\4;;=::<FFF\316" \
+ "\316\316\247\377\377\377\3\205\205\207;;=99;\202::<\1\204\204\206\203" \
+ "\377\377\377\1\376\376\376\237\377\377\377\1\234\234\236\205::<\1;;=" \
+ "\204::<\1""99;\202;;=\202::<\3;;=::<;;=\203::<\1;;=\202::<\1;;=\204:" \
+ ":<\1;;=\205::<\2jjl\316\316\316\203\377\377\377\1\376\376\376\225\377" \
+ "\377\377\1\234\234\234\204::<\1;;=\202::<\3;;=::<;;=\222::<\7;;=::<;" \
+ ";=::<;;=::<\234\234\236\231\377\377\377\3\214\305@\214\306>\214\305@" \
+ "\207\214\306>\4\214\305@\215\305>\214\306>\252\324p\251\377\377\377\215" \
+ "\214\306>\1\250\325p\216\377\377\377\1\342\361\320\202\214\306>\1\214" \
+ "\305@\210\214\306>\10\215\305@\212\307>\214\305@\215\306A\214\305@\352" \
+ "\364\334\376\376\377\377\377\373\202\377\377\377\3\376\376\376\377\377" \
+ "\377\377\377\375\202\377\377\377\1\376\376\374\216\377\377\377\213\214" \
+ "\306>\3\215\305>\214\306>\305\342\240\215\377\377\377\4\252\324p\214" \
+ "\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305@\232" \
+ "\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3\214" \
+ "\305@\214\306>\214\305@\211\377\377\377\1\376\377\377\202\377\377\375" \
+ "\5\347\364\332\215\307\77\215\306C\214\307;\216\306\77\210\214\306>\10" \
+ "\214\305@\214\305D\215\307\77\233\314V\371\374\363\376\377\377\377\377" \
+ "\377\377\377\375\210\377\377\377\20\375\377\374\377\376\377\376\376\377" \
+ "\376\377\377\377\376\377\376\377\375\376\377\377\244\317d\212\307>\215" \
+ "\306A\215\305@\214\305@\211\306=\215\307=\215\306A\214\305@\204\214\306" \
+ ">\14\211\305A\212\307>\251\324k\377\376\377\377\375\376\376\377\377\377" \
+ "\377\377\377\377\375\377\377\377\377\377\375\377\377\377\377\377\375" \
+ "\217\377\377\377\1\376\376\376\203\377\377\377\2\265\265\267FFH\205:" \
+ ":<\1;;=\203::<\202;;=\7:::TTT\203\203\203\235\235\235\316\316\316\332" \
+ "\332\332\377\377\377\202\376\376\376\202\377\377\377\5\316\316\316\317" \
+ "\317\317\234\234\234yyyFFF\202::<\1;;=\202::<\3""99;;;=99;\204::<\2;" \
+ ";=\233\233\233\206\377\377\377\1\376\376\376\216\377\377\377\1\316\316" \
+ "\316\204::<\1;;=\205::<\1;;=\212::<\3""99;::<;;=\202::<\2;;=99;\204:" \
+ ":<\2;;=\265\265\265\245\377\377\377\4\346\346\346::<99;;;=\202::<\4""9" \
+ "9;\347\347\347\377\377\377\376\376\376\240\377\377\377\1\234\234\236" \
+ "\205::<\1;;=\203::<\202;;=\1""99;\203;;=\2::<;;=\203::<\1;;=\202::<\2" \
+ ";;=::<\202;;=\7::<;;=99;::<;;=99;;;=\202::<\3;;=xxx\362\362\362\227\377" \
+ "\377\377\1\234\234\234\205::<\202;;=\4::<;;=::<;;=\223::<\2;;=99;\202" \
+ ";;=\1\234\234\236\231\377\377\377\3\214\305@\214\306>\214\305@\207\214" \
+ "\306>\4\214\305@\215\305>\214\306>\252\324p\251\377\377\377\215\214\306" \
+ ">\1\250\325p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305@\210" \
+ "\214\306>\12\212\307>\215\306A\214\305@\215\307\77\213\306:\226\312N" \
+ "\372\374\361\375\376\377\377\377\375\377\377\373\224\377\377\377\213" \
+ "\214\306>\3\215\305>\214\306>\305\342\240\215\377\377\377\4\252\324p" \
+ "\214\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305" \
+ "@\232\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>" \
+ "\3\214\305@\214\306>\214\305@\211\377\377\377\10\376\377\377\376\376" \
+ "\377\376\377\377\377\375\376\307\342\237\214\306<\215\306A\214\305@\210" \
+ "\214\306>\5\215\307\77\213\305=\216\306A\213\310\77\277\337\223\202\377" \
+ "\377\375\1\377\376\377\210\377\377\377\14\376\377\375\376\376\376\377" \
+ "\376\377\377\377\375\377\376\377\377\377\377\303\342\236\215\307\77\216" \
+ "\306A\215\305>\214\306<\215\306A\203\214\306>\20\215\307\77\212\307>" \
+ "\215\305@\216\306\77\214\305@\216\307<\223\312K\356\372\346\377\377\377" \
+ "\376\377\377\375\377\376\377\377\377\377\376\377\377\377\375\377\377" \
+ "\377\377\377\375\216\377\377\377\1\376\376\376\203\377\377\377\2\375" \
+ "\375\375\205\205\207\202::<\202;;=\3::<;;=::<\202;;=\6::<:::SSS\250\250" \
+ "\250\346\346\346\376\376\376\216\377\377\377\3\332\332\332\220\220\220" \
+ "SSS\202::<\4;;=99;::<;;=\202::<\1""99;\202;;=\2__a\332\332\334\223\377" \
+ "\377\377\1\316\316\316\204::<\6;;=RRT\235\235\237\235\235\235\233\233" \
+ "\233\234\234\234\212\234\234\236\5xxzkkm__a99;;;=\204::<\202;;=\1""9" \
+ "9;\202::<\1\316\316\316\244\377\377\377\4\204\204\206;;=::<;;=\202::" \
+ "<\2;;=\220\220\222\203\377\377\377\1\376\376\376\236\377\377\377\1\234" \
+ "\234\236\203::<\3;;=::<kkm\203\234\234\236\3\233\233\235\234\234\236" \
+ "\235\235\237\204\234\234\236\2xxzlln\202kkm\1FFH\202;;=\2""99;;;=\202" \
+ "::<\3""99;::<;;=\202::<\1;;=\205::<\3GGI\301\301\301\376\376\376\225" \
+ "\377\377\377\1\234\234\234\205::<\5lln\234\234\236\233\233\233\235\235" \
+ "\235\234\234\234\224\234\234\236\5\234\234\234\235\235\235\233\233\233" \
+ "\234\234\234\316\316\316\231\377\377\377\3\214\305@\214\306>\214\305" \
+ "@\207\214\306>\4\214\305@\215\305>\214\306>\252\324p\251\377\377\377" \
+ "\215\214\306>\1\250\325p\216\377\377\377\1\342\361\320\202\214\306>\1" \
+ "\214\305@\210\214\306>\7\212\306@\214\306<\217\307@\214\304\77\214\311" \
+ ">\214\306>\251\323m\202\376\377\377\4\376\376\374\377\377\375\377\377" \
+ "\377\376\376\376\202\377\377\377\1\376\376\376\216\377\377\377\213\214" \
+ "\306>\3\215\305>\214\306>\305\342\240\215\377\377\377\4\252\324p\214" \
+ "\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305@\232" \
+ "\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3\214" \
+ "\305@\214\306>\214\305@\212\377\377\377\7\377\377\375\377\376\377\376" \
+ "\377\377\377\376\377\251\323o\211\307>\214\305@\210\214\306>\7\212\307" \
+ ">\215\305>\214\305@\214\306>\215\307\77\347\365\334\377\376\377\211\377" \
+ "\377\377\2\377\376\377\375\377\374\203\377\376\377\15\352\364\333\212" \
+ "\306@\215\306A\214\306>\215\307\77\213\310\77\214\306>\216\306A\215\306" \
+ "A\214\306<\212\307>\213\310=\212\307>\202\214\305@\4\214\306>\314\345" \
+ "\253\377\376\377\376\377\377\202\377\377\375\6\377\376\377\375\376\377" \
+ "\377\377\377\377\376\377\376\377\375\377\376\377\217\377\377\377\3\376" \
+ "\376\376\362\362\362lln\20299;\1;;=\204::<\202;;=\6::<\204\204\204\317" \
+ "\317\317\376\376\376\377\377\377\376\376\376\206\377\377\377\1\376\376" \
+ "\376\213\377\377\377\2\301\301\301kkm\211::<\6;;=FFH\301\301\301\376" \
+ "\376\376\377\377\377\376\376\376\217\377\377\377\1\316\316\316\204::" \
+ "<\3;;=kkm\376\376\376\221\377\377\377\3\316\316\316\204\204\204FFF\202" \
+ "::<\1;;=\202::<\202;;=\2FFH\363\363\363\242\377\377\377\5\364\364\364" \
+ "::<;;=99;;;=\203::<\3GGI\363\363\363\376\376\376\240\377\377\377\1\234" \
+ "\234\236\205::<\1\234\234\236\210\377\377\377\1\376\376\376\204\377\377" \
+ "\377\1\376\376\376\202\377\377\377\6\362\362\362\316\316\316\265\265" \
+ "\265\234\234\234kkmFFH\202::<\2;;=99;\205::<\1;;=\202::<\1\221\221\221" \
+ "\225\377\377\377\1\234\234\234\205::<\1\234\234\236\202\377\377\377\1" \
+ "\376\376\376\225\377\377\377\1\375\375\375\235\377\377\377\3\214\305" \
+ "@\214\306>\214\305@\207\214\306>\4\214\305@\215\305>\214\306>\252\324" \
+ "p\251\377\377\377\215\214\306>\1\250\325p\216\377\377\377\1\342\361\320" \
+ "\202\214\306>\1\214\305@\210\214\306>\4\215\307\77\214\306>\214\304\77" \
+ "\214\306>\202\214\305@\6\215\307\77\307\341\240\376\377\375\376\377\377" \
+ "\376\376\374\377\377\373\202\377\377\377\202\377\377\375\216\377\377" \
+ "\377\213\214\306>\3\215\305>\214\306>\305\342\240\215\377\377\377\4\252" \
+ "\324p\214\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214" \
+ "\305@\232\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306" \
+ ">\3\214\305@\214\306>\214\305@\212\377\377\377\7\377\376\377\376\376" \
+ "\377\377\377\377\376\376\377\361\372\347\222\312K\215\305>\210\214\306" \
+ ">\10\214\305@\215\306A\214\305@\214\306<\213\304A\243\322b\376\376\374" \
+ "\376\377\375\211\377\377\377\24\377\377\373\377\377\377\376\377\377\377" \
+ "\377\375\242\320c\215\307=\214\306>\213\310\77\213\304A\212\306@\215" \
+ "\307\77\215\305@\214\306>\215\307\77\212\306@\215\305>\215\307\77\213" \
+ "\310\77\213\306:\253\325q\202\377\377\377\11\377\377\375\377\376\377" \
+ "\377\377\377\377\377\375\376\377\375\377\377\375\377\375\377\376\377" \
+ "\377\377\377\375\214\377\377\377\7\376\376\376\377\377\377\376\376\376" \
+ "\363\363\363__a::<;;=\203::<\202;;=\202::<\4xxz\347\347\351\377\377\377" \
+ "\376\376\376\210\377\377\377\1\376\376\376\204\377\377\377\2\376\376" \
+ "\376\377\377\377\203\376\376\376\205\377\377\377\2\316\316\320kkm\202" \
+ "::<\3;;=::<;;=\202::<\202;;=\2:::\250\250\250\202\377\377\377\1\376\376" \
+ "\376\216\377\377\377\1\316\316\316\205::<\1kkm\203\377\377\377\1\376" \
+ "\376\376\215\377\377\377\1\376\376\376\202\377\377\377\3\363\363\363" \
+ "xxx::<\202;;=\203::<\2;;=xxz\242\377\377\377\1\234\234\234\202::<\1;" \
+ ";=\202::<\1;;=\202::<\1\234\234\234\241\377\377\377\1\234\234\236\202" \
+ "::<\10;;=::<;;=\234\234\236\377\377\377\376\376\376\377\377\377\376\376" \
+ "\376\216\377\377\377\1\376\376\376\203\377\377\377\3\332\332\332\221" \
+ "\221\223FFH\205::<\2;;=::<\202;;=\2::<\204\204\204\224\377\377\377\1" \
+ "\234\234\234\205::<\3\234\234\236\377\377\377\376\376\376\264\377\377" \
+ "\377\3\214\305@\214\306>\214\305@\207\214\306>\4\214\305@\215\305>\214" \
+ "\306>\252\324p\251\377\377\377\215\214\306>\1\250\325p\216\377\377\377" \
+ "\1\342\361\320\202\214\306>\1\214\305@\210\214\306>\5\216\306\77\212" \
+ "\307>\215\307=\212\306@\214\306>\202\215\305>\5\215\305@\345\356\317" \
+ "\376\377\375\376\377\377\377\377\375\202\377\377\377\1\377\377\375\217" \
+ "\377\377\377\213\214\306>\3\215\305>\214\306>\305\342\240\215\377\377" \
+ "\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3\214\305@\214" \
+ "\306>\214\305@\232\377\377\377\4\252\324p\214\306>\215\305>\214\305@" \
+ "\207\214\306>\3\214\305@\214\306>\214\305@\211\377\377\377\4\376\377" \
+ "\377\377\377\377\377\377\375\376\377\377\202\377\377\377\2\315\347\252" \
+ "\212\306@\210\214\306>\10\216\306A\212\306@\212\307>\215\305<\213\310" \
+ "\77\215\305>\307\341\240\376\377\377\212\377\377\377\10\375\377\374\377" \
+ "\377\377\305\342\237\215\305@\212\306@\216\306\77\215\307=\215\305>\202" \
+ "\214\306>\24\213\307A\213\310=\215\304B\214\306>\212\306@\215\304B\212" \
+ "\307>\225\311K\370\373\362\377\377\377\376\377\375\377\377\375\377\377" \
+ "\377\374\377\375\376\376\376\377\377\377\377\377\375\377\376\377\376" \
+ "\377\377\377\377\375\211\377\377\377\1\376\376\376\205\377\377\377\1" \
+ "___\204::<\1;;=\203::<\2SSS\316\316\316\235\377\377\377\2\317\317\317" \
+ "``b\207::<\3;;=::<\204\204\206\220\377\377\377\1\316\316\316\205::<\1" \
+ "kkm\226\377\377\377\3\204\204\206::<;;=\205::<\1\316\316\316\232\377" \
+ "\377\377\1\376\376\376\205\377\377\377\2\364\364\364FFF\202;;=\202::" \
+ "<\6;;=99;;;=::<FFH\363\363\363\240\377\377\377\1\234\234\236\205::<\1" \
+ "\234\234\234\226\377\377\377\1\376\376\376\202\377\377\377\3\265\265" \
+ "\265RRR:::\202::<\1;;=\202::<\4;;=::<;;=\204\204\204\203\377\377\377" \
+ "\1\376\376\376\217\377\377\377\1\234\234\234\205::<\1\234\234\236\266" \
+ "\377\377\377\3\214\305@\214\306>\214\305@\207\214\306>\4\214\305@\215" \
+ "\305>\214\306>\252\324p\251\377\377\377\215\214\306>\1\250\325p\216\377" \
+ "\377\377\1\342\361\320\202\214\306>\1\214\305@\220\214\306>\2\222\313" \
+ "J\366\373\364\202\377\376\377\4\377\377\373\376\376\374\376\377\377\377" \
+ "\376\377\216\377\377\377\213\214\306>\3\215\305>\214\306>\305\342\240" \
+ "\215\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3" \
+ "\214\305@\214\306>\214\305@\232\377\377\377\4\252\324p\214\306>\215\305" \
+ ">\214\305@\207\214\306>\3\214\305@\214\306>\214\305@\211\377\377\377" \
+ "-\377\377\375\376\377\377\377\377\377\376\376\374\376\377\377\377\376" \
+ "\377\376\377\377\252\324p\212\306@\215\305>\212\307<\215\305@\215\305" \
+ "<\214\305B\215\305@\214\306<\212\307>\215\305>\214\306>\211\306=\215" \
+ "\305>\212\307>\214\306<\350\364\334\374\377\377\377\376\377\376\376\376" \
+ "\374\377\375\377\377\377\376\377\375\377\377\375\377\376\377\377\377" \
+ "\375\377\377\377\377\376\377\357\367\350\223\312K\213\310\77\215\305" \
+ ">\214\306>\215\305>\213\310\77\212\306@\214\306>\215\305@\202\214\306" \
+ ">\10\214\305@\216\306=\212\307>\215\305>\333\355\303\376\376\374\377" \
+ "\377\377\377\377\375\223\377\377\377\1\376\376\376\203\377\377\377\1" \
+ "\203\203\203\206::<\4;;=::<\204\204\206\363\363\363\230\377\377\377\1" \
+ "\376\376\376\207\377\377\377\1\235\235\237\202::<\1;;=\203::<\5;;=99" \
+ ";;;=\204\204\204\376\376\376\216\377\377\377\1\316\316\316\205::<\1k" \
+ "km\227\377\377\377\12\204\204\206::<;;=::<99;;;=::<\204\204\204\377\377" \
+ "\377\376\376\376\232\377\377\377\1\376\376\376\203\377\377\377\2\234" \
+ "\234\234;;=\203::<\1;;=\204::<\3<<>\250\250\250\376\376\376\237\377\377" \
+ "\377\1\234\234\236\205::<\1\234\234\234\231\377\377\377\10\376\376\376" \
+ "\377\377\377\265\265\265FFH::<;;=::<;;=\203::<\2;;=\204\204\204\222\377" \
+ "\377\377\1\234\234\234\205::<\1\234\234\236\266\377\377\377\3\214\305" \
+ "@\214\306>\214\305@\207\214\306>\4\214\305@\215\305>\214\306>\252\324" \
+ "p\251\377\377\377\215\214\306>\1\250\325p\216\377\377\377\1\342\361\320" \
+ "\202\214\306>\1\214\305@\220\214\306>\4\216\306\77\250\322n\376\377\375" \
+ "\376\377\373\222\377\377\377\213\214\306>\3\215\305>\214\306>\305\342" \
+ "\240\215\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306" \
+ ">\3\214\305@\214\306>\214\305@\232\377\377\377\4\252\324p\214\306>\215" \
+ "\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305@\211\377\377" \
+ "\377\13\376\376\377\376\377\377\377\376\377\376\376\374\374\377\377\377" \
+ "\377\375\377\376\377\356\372\346\225\311K\214\306>\213\310=\203\214\306" \
+ ">\2\213\310\77\214\306>\202\214\305@\7\214\306<\213\307A\214\304\77\214" \
+ "\305B\212\307>\244\317d\377\376\377\202\377\377\377\1\377\375\377\202" \
+ "\377\377\377\25\376\377\377\377\376\377\377\377\377\374\377\375\376\376" \
+ "\374\253\324n\214\306<\215\307\77\215\305>\211\307@\216\305C\214\305" \
+ "@\215\307\77\214\305@\214\306<\212\307<\211\306=\214\306>\214\305@\213" \
+ "\307A\263\327}\202\376\377\377\3\377\377\377\377\375\376\377\377\375" \
+ "\221\377\377\377\1\376\376\376\203\377\377\377\1\250\250\250\204::<\1" \
+ ";;=\202::<\2;;=\264\264\264\202\377\377\377\1\376\376\376\232\377\377" \
+ "\377\1\376\376\376\205\377\377\377\2\332\332\332SSS\202::<\1;;=\204:" \
+ ":<\4xxx\364\364\364\377\377\377\376\376\376\214\377\377\377\1\316\316" \
+ "\316\205::<\1kkm\227\377\377\377\2\363\363\363SSU\202::<\4;;=99;::<;" \
+ ";;\202\377\377\377\1\376\376\376\226\377\377\377\1\376\376\376\204\377" \
+ "\377\377\11\376\376\376\363\363\363FFH99;;;=::<;;=99;;;=\203::<\4""9" \
+ "9;SSU\377\377\377\376\376\376\236\377\377\377\1\234\234\236\205::<\1" \
+ "\234\234\234\225\377\377\377\1\376\376\376\204\377\377\377\10\376\376" \
+ "\376\377\377\377\363\363\363yyy::<;;=99;;;=\204::<\1\266\266\266\221" \
+ "\377\377\377\1\234\234\234\205::<\1\234\234\236\266\377\377\377\3\214" \
+ "\305@\214\306>\214\305@\207\214\306>\4\214\305@\215\305>\214\306>\252" \
+ "\324p\251\377\377\377\215\214\306>\1\250\325p\216\377\377\377\1\342\361" \
+ "\320\202\214\306>\1\214\305@\220\214\306>\4\214\306<\213\307A\275\335" \
+ "\222\376\377\377\203\377\377\377\1\377\377\375\216\377\377\377\213\214" \
+ "\306>\3\215\305>\214\306>\305\342\240\215\377\377\377\4\252\324p\214" \
+ "\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305@\232" \
+ "\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3\214" \
+ "\305@\214\306>\214\305@\211\377\377\377\4\377\376\377\376\376\377\377" \
+ "\377\377\377\377\375\202\376\377\377\5\377\375\376\377\376\377\315\346" \
+ "\255\212\307>\214\305@\202\215\306A\22\214\305@\212\307<\214\305B\214" \
+ "\306>\213\307A\214\306>\213\305=\214\306>\215\305>\213\307A\211\310<" \
+ "\313\347\254\377\377\375\377\375\377\376\377\377\376\377\373\376\377" \
+ "\377\377\376\377\202\376\377\377\10\377\377\377\315\346\254\212\307>" \
+ "\212\306@\215\306A\216\306A\212\307>\214\306<\202\215\306A\10\215\306" \
+ "C\214\305B\215\307\77\214\306<\214\305@\213\310<\222\310L\372\373\363" \
+ "\225\377\377\377\1\376\376\376\202\377\377\377\6\376\376\376\333\333" \
+ "\333::<;;=::<;;=\202::<\3;;=FFH\315\315\315\205\377\377\377\1\376\376" \
+ "\376\225\377\377\377\202\376\376\376\202\377\377\377\1\376\376\376\202" \
+ "\377\377\377\1\376\376\376\202\377\377\377\2\363\363\363xxx\204::<\2" \
+ ";;=\203\203\203\220\377\377\377\1\316\316\316\205::<\1kkm\230\377\377" \
+ "\377\3\266\266\27099;;;=\204::<\1\316\316\316\230\377\377\377\1\376\376" \
+ "\376\202\377\377\377\1\376\376\376\202\377\377\377\3\265\265\267::<;" \
+ ";=\204::<\202;;=\202::<\202;;=\1\265\265\265\237\377\377\377\1\234\234" \
+ "\236\205::<\1\234\234\234\236\377\377\377\5\234\234\234::<;;=::<;;=\202" \
+ "::<\3;;=FFH\332\332\332\220\377\377\377\1\234\234\234\205::<\1\234\234" \
+ "\236\266\377\377\377\3\214\305@\214\306>\214\305@\207\214\306>\4\214" \
+ "\305@\215\305>\214\306>\252\324p\251\377\377\377\215\214\306>\1\250\325" \
+ "p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305@\220\214\306>" \
+ "\4\215\307\77\214\304\77\213\310\77\333\355\303\202\377\377\377\1\376" \
+ "\377\375\217\377\377\377\213\214\306>\3\215\305>\214\306>\305\342\240" \
+ "\215\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3" \
+ "\214\305@\214\306>\214\305@\232\377\377\377\4\252\324p\214\306>\215\305" \
+ ">\214\305@\207\214\306>\3\214\305@\214\306>\214\305@\213\377\377\377" \
+ "\5\377\377\373\377\376\377\377\377\377\375\377\374\376\377\377\202\376" \
+ "\376\376\22\260\331{\212\307>\214\306>\215\305>\215\305@\215\307\77\215" \
+ "\307=\214\305@\214\306>\215\306A\214\306>\213\307C\214\306>\214\304;" \
+ "\213\307A\222\312K\357\370\345\377\377\375\202\377\377\377\15\377\375" \
+ "\376\377\377\375\376\376\376\377\377\375\361\367\351\222\311J\213\310" \
+ "\77\214\305B\215\310<\213\305=\216\306\77\212\307<\214\305B\202\214\306" \
+ ">\6\216\306\77\215\305@\215\306A\214\305@\215\305<\333\356\301\202\377" \
+ "\376\377\3\377\377\375\377\377\377\377\376\377\225\377\377\377\1``b\202" \
+ "::<\6;;=::<;;=::<FFH\331\331\333\233\377\377\377\1\376\376\376\202\377" \
+ "\377\377\1\376\376\376\206\377\377\377\1\376\376\376\202\377\377\377" \
+ "\1\205\205\207\203::<\1\204\204\206\221\377\377\377\1\316\316\316\205" \
+ "::<\1kkm\231\377\377\377\1GGI\203;;=\202::<\3\235\235\237\377\377\377" \
+ "\376\376\376\233\377\377\377\2\376\376\376SSU\203::<\5;;=99;llnkkm::" \
+ "<\202;;=\202::<\1SSU\237\377\377\377\1\234\234\236\205::<\1\234\234\234" \
+ "\224\377\377\377\1\376\376\376\205\377\377\377\1\376\376\376\203\377" \
+ "\377\377\4\376\376\376\266\266\270::<;;=\203::<\5""99;::<__a\377\377" \
+ "\377\376\376\376\216\377\377\377\1\234\234\234\205::<\1\234\234\236\266" \
+ "\377\377\377\3\214\305@\214\306>\214\305@\207\214\306>\4\214\305@\215" \
+ "\305>\214\306>\252\324p\251\377\377\377\215\214\306>\1\250\325p\216\377" \
+ "\377\377\1\342\361\320\202\214\306>\1\214\305@\220\214\306>\10\216\306" \
+ "\77\215\306A\214\305@\224\310J\360\371\350\377\377\377\377\376\377\376" \
+ "\377\377\216\377\377\377\213\214\306>\3\215\305>\214\306>\305\342\240" \
+ "\215\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3" \
+ "\214\305@\214\306>\214\305@\232\377\377\377\4\252\324p\214\306>\215\305" \
+ ">\214\305@\207\214\306>\3\214\305@\214\306>\214\305@\212\377\377\377" \
+ "\1\377\377\375\202\377\377\377\2\377\376\377\377\377\377\202\376\377" \
+ "\377\25\377\377\375\370\373\362\223\312K\212\307>\215\305>\216\306A\212" \
+ "\307<\214\305B\215\307\77\214\305@\214\306>\214\305@\212\306@\215\307" \
+ "=\216\306A\215\305>\214\306<\252\324n\376\377\377\376\376\376\377\376" \
+ "\377\202\377\377\375\4\377\376\377\376\376\377\252\324n\215\306A\202" \
+ "\214\306>\21\214\305@\215\307\77\215\305>\212\307>\214\306<\213\304A" \
+ "\215\307=\214\304=\215\307\77\212\307>\214\306>\277\337\226\377\376\377" \
+ "\376\377\375\377\377\375\377\377\377\376\376\376\225\377\377\377\3\234" \
+ "\234\236::<;;=\204::<\4;;=\265\265\267\377\377\377\376\376\376\204\377" \
+ "\377\377\202\376\376\376\202\377\377\377\1\376\376\376\225\377\377\377" \
+ "\1\376\376\376\203\377\377\377\1\376\376\376\202\377\377\377\1\376\376" \
+ "\376\202\377\377\377\3\250\250\250::<\204\204\206\205\377\377\377\1\376" \
+ "\376\376\214\377\377\377\1\316\316\316\205::<\1kkm\226\377\377\377\1" \
+ "\376\376\376\202\377\377\377\2kkm99;\202::<\4;;=::<\204\204\206\376\376" \
+ "\376\202\377\377\377\1\376\376\376\224\377\377\377\1\376\376\376\203" \
+ "\377\377\377\2\376\376\376\265\265\265\202::<\1;;=\202::<\3;;=\316\316" \
+ "\320\316\316\316\204::<\3;;=::<\266\266\266\236\377\377\377\1\234\234" \
+ "\236\205::<\1\234\234\234\226\377\377\377\202\376\376\376\2\377\377\377" \
+ "\376\376\376\205\377\377\377\4\376\376\376\251\251\253;;=99;\202::<\4" \
+ "<<>99;::<\250\250\252\217\377\377\377\1\234\234\234\205::<\1\234\234" \
+ "\236\266\377\377\377\3\214\305@\214\306>\214\305@\207\214\306>\4\214" \
+ "\305@\215\305>\214\306>\252\324p\251\377\377\377\215\214\306>\1\250\325" \
+ "p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305@\220\214\306>" \
+ "\202\214\305@\6\212\306@\215\307\77\243\321d\377\377\375\377\375\377" \
+ "\376\377\377\216\377\377\377\213\214\306>\3\215\305>\214\306>\305\342" \
+ "\240\215\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306" \
+ ">\3\214\305@\214\306>\214\305@\232\377\377\377\4\252\324p\214\306>\215" \
+ "\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305@\211\377\377" \
+ "\377\2\376\377\377\377\377\375\202\377\377\377\1\376\376\376\202\377" \
+ "\377\377\6\376\377\372\376\377\377\377\376\377\331\357\301\213\304\77" \
+ "\215\307=\202\214\305@\25\214\305B\214\306<\215\305@\212\307<\214\306" \
+ ">\216\306=\212\307>\212\306B\214\305@\215\306E\212\306@\313\347\255\376" \
+ "\377\375\376\376\377\376\377\377\377\376\377\377\377\377\333\355\305" \
+ "\212\307>\216\306\77\215\307\77\202\214\306>\1\215\307\77\202\214\306" \
+ ">\13\215\305<\212\306@\212\307<\215\307\77\211\306=\213\307A\233\314" \
+ "V\370\373\362\377\377\375\377\377\377\376\377\377\202\377\377\375\2\374" \
+ "\377\377\377\375\376\222\377\377\377\3\363\363\363GGI::<\202;;=\202:" \
+ ":<\2;;=\234\234\234\214\377\377\377\1\376\376\376\221\377\377\377\1\376" \
+ "\376\376\202\377\377\377\3\376\376\376\377\377\377\376\376\376\206\377" \
+ "\377\377\3\376\376\376\377\377\377\316\316\316\203\377\377\377\1\376" \
+ "\376\376\203\377\377\377\1\376\376\376\213\377\377\377\1\316\316\316" \
+ "\205::<\1kkm\227\377\377\377\5\376\376\376\377\377\377\235\235\237::" \
+ "<;;=\203::<\2lln\376\376\376\203\377\377\377\1\376\376\376\224\377\377" \
+ "\377\13\376\376\376\377\377\377\376\376\376\377\377\377RRR::<99;::<;" \
+ ";=::<kkm\202\377\377\377\1__a\203;;=\202::<\1kkk\236\377\377\377\1\234" \
+ "\234\236\205::<\1\234\234\234\241\377\377\377\2\204\204\204;;=\202::" \
+ "<\5""99;::<;;=FFH\363\363\363\216\377\377\377\1\234\234\234\205::<\1" \
+ "\234\234\236\266\377\377\377\3\214\305@\214\306>\214\305@\207\214\306" \
+ ">\4\214\305@\215\305>\214\306>\252\324p\251\377\377\377\215\214\306>" \
+ "\1\250\325p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305@\221" \
+ "\214\306>\5\213\307A\216\306\77\212\307<\214\306>\277\337\223\220\377" \
+ "\377\377\213\214\306>\3\215\305>\214\306>\305\342\240\215\377\377\377" \
+ "\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306" \
+ ">\214\305@\232\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207" \
+ "\214\306>\3\214\305@\214\306>\214\305@\211\377\377\377\4\376\377\377" \
+ "\377\377\375\377\375\377\377\377\377\202\377\377\375\202\377\376\377" \
+ "\202\376\377\377\22\377\376\377\262\331~\213\304\77\213\310\77\216\306" \
+ "A\212\307<\215\306A\214\304=\213\310\77\214\305@\215\304B\214\305B\214" \
+ "\306<\212\307>\212\307<\216\306A\221\312I\370\373\362\203\377\377\377" \
+ "\13\370\373\364\226\310K\214\306>\212\307>\215\304B\214\306>\215\306" \
+ "A\213\304\77\215\306A\214\306>\215\305@\202\212\306@\13\215\307\77\213" \
+ "\310=\220\303@\336\362\315\377\376\377\377\377\377\374\377\377\377\376" \
+ "\377\377\377\377\376\376\374\376\377\375\223\377\377\377\1\204\204\206" \
+ "\203::<\4""99;;;=::<kkm\211\377\377\377\1\376\376\376\202\377\377\377" \
+ "\1\376\376\376\221\377\377\377\1\376\376\376\202\377\377\377\1\376\376" \
+ "\376\237\377\377\377\1\316\316\316\205::<\1kkm\231\377\377\377\4\234" \
+ "\234\236;;=::<;;=\202::<\3jjl\377\377\377\376\376\376\232\377\377\377" \
+ "\10\265\265\265:::::<;;=::<99;::<\316\316\316\202\377\377\377\1\265\265" \
+ "\267\204::<\3;;=::<\316\316\316\235\377\377\377\1\234\234\236\205::<" \
+ "\1\234\234\234\241\377\377\377\2\363\363\363__a\203::<\4;;=::<;;=\234" \
+ "\234\236\216\377\377\377\1\234\234\234\205::<\1\234\234\236\266\377\377" \
+ "\377\3\214\305@\214\306>\214\305@\207\214\306>\4\214\305@\215\305>\214" \
+ "\306>\252\324p\251\377\377\377\215\214\306>\1\250\325p\216\377\377\377" \
+ "\1\342\361\320\202\214\306>\1\214\305@\220\214\306>\10\215\304B\214\306" \
+ "<\214\305@\215\305@\212\306@\215\305>\323\354\265\377\376\377\216\377" \
+ "\377\377\213\214\306>\3\215\305>\214\306>\305\342\240\215\377\377\377" \
+ "\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306" \
+ ">\214\305@\232\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207" \
+ "\214\306>\3\214\305@\214\306>\214\305@\212\377\377\377\3\375\377\376" \
+ "\377\377\377\377\377\375\202\377\377\377\26\377\377\375\375\377\374\376" \
+ "\377\377\377\376\377\377\377\375\365\375\362\225\311K\212\306@\214\306" \
+ ">\214\305@\212\306@\216\306=\211\306;\215\306A\214\306>\215\307\77\217" \
+ "\304@\214\306>\212\307>\215\305@\214\305@\262\327z\203\377\377\377\13" \
+ "\260\331{\213\310\77\214\305B\214\305@\215\305@\215\307\77\212\307<\216" \
+ "\306A\213\305;\214\305@\215\305>\202\214\306>\11\215\305@\214\306<\276" \
+ "\340\224\377\376\375\377\377\375\376\377\377\377\376\375\376\377\375" \
+ "\377\376\377\202\377\377\377\1\376\377\375\221\377\377\377\1\346\346" \
+ "\346\206::<\2:::\346\346\346\202\377\377\377\1\376\376\376\276\377\377" \
+ "\377\1\316\316\316\205::<\1kkm\216\377\377\377\1\376\376\376\202\377" \
+ "\377\377\1\376\376\376\207\377\377\377\3\234\234\236::<;;=\203::<\1k" \
+ "km\226\377\377\377\1\376\376\376\204\377\377\377\2\376\376\376lln\205" \
+ "::<\1``b\204\377\377\377\1SSS\205::<\1kkm\235\377\377\377\1\234\234\236" \
+ "\205::<\1\234\234\234\242\377\377\377\2\316\316\316:::\202::<\5;;=::" \
+ "<;;=FFH\363\363\363\206\377\377\377\1\376\376\376\206\377\377\377\1\234" \
+ "\234\234\205::<\1\234\234\236\266\377\377\377\3\214\305@\214\306>\214" \
+ "\305@\207\214\306>\4\214\305@\215\305>\214\306>\252\324p\251\377\377" \
+ "\377\215\214\306>\1\250\325p\216\377\377\377\1\342\361\320\202\214\306" \
+ ">\1\214\305@\210\214\306>\27\215\306A\212\307>\215\305>\215\305@\215" \
+ "\307=\217\304B\214\306<\214\305@\215\307\77\215\305@\215\307\77\214\305" \
+ "@\216\306\77\211\310<\226\312L\347\364\332\377\377\377\377\376\377\377" \
+ "\377\375\374\377\377\377\376\377\376\376\376\376\377\377\207\377\377" \
+ "\377\213\214\306>\3\215\305>\214\306>\305\342\240\215\377\377\377\4\252" \
+ "\324p\214\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214" \
+ "\305@\232\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306" \
+ ">\3\214\305@\214\306>\214\305@\221\377\377\377\1\377\377\375\203\377" \
+ "\377\377\5\333\355\303\214\306>\212\307<\216\306A\214\305@\202\214\306" \
+ ">\15\215\305@\214\306>\212\306@\213\310\77\215\305>\216\306A\211\306" \
+ "=\212\306@\212\307<\334\354\305\377\377\375\335\354\303\212\307>\210" \
+ "\214\306>\10\216\306A\212\307;\215\306A\216\306A\214\305@\241\321a\371" \
+ "\374\361\375\376\377\223\377\377\377\1\376\376\376\204\377\377\377\2" \
+ "\376\376\376\234\234\234\203::<\1""99;\202::<\1\234\234\234\302\377\377" \
+ "\377\1\316\316\316\205::<\1kkm\217\377\377\377\1\376\376\376\202\377" \
+ "\377\377\3\376\376\376\377\377\377\376\376\376\202\377\377\377\3\376" \
+ "\376\376\377\377\377xxz\202::<\5""99;::<;;=xxz\376\376\377\232\377\377" \
+ "\377\3\317\317\31799;;;=\202::<\5;;=::<\265\265\265\377\377\377\376\376" \
+ "\376\202\377\377\377\2\265\265\265;;=\202::<\203;;=\1\332\332\332\203" \
+ "\377\377\377\1\376\376\376\230\377\377\377\1\234\234\236\205::<\1\234" \
+ "\234\234\242\377\377\377\4\376\376\376\204\204\204::<;;=\202::<\3;;=" \
+ "::<\266\266\266\207\377\377\377\1\376\376\376\205\377\377\377\1\234\234" \
+ "\234\205::<\1\234\234\236\266\377\377\377\3\214\305@\214\306>\214\305" \
+ "@\207\214\306>\4\214\305@\215\305>\214\306>\252\324p\251\377\377\377" \
+ "\215\214\306>\1\250\325p\216\377\377\377\1\342\361\320\202\214\306>\1" \
+ "\214\305@\211\214\306>\27\216\306A\214\306>\212\306@\214\306<\213\310" \
+ "\77\215\305@\215\307\77\213\305=\216\306\77\212\307;\212\306@\215\305" \
+ ">\215\306A\212\307>\245\320d\367\375\361\376\377\377\377\376\377\377" \
+ "\377\377\376\376\377\377\376\377\375\377\376\377\377\375\206\377\377" \
+ "\377\213\214\306>\3\215\305>\214\306>\305\342\240\215\377\377\377\4\252" \
+ "\324p\214\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214" \
+ "\305@\232\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306" \
+ ">\3\214\305@\214\306>\214\305@\221\377\377\377\6\376\376\376\377\376" \
+ "\377\377\377\377\375\377\376\376\377\377\270\333\207\203\214\306>\17" \
+ "\211\306=\212\307<\214\306<\214\305@\215\307\77\214\305@\216\305C\214" \
+ "\306>\212\310A\215\305@\216\306\77\223\312K\360\371\346\222\311I\214" \
+ "\305@\210\214\306>\10\214\305@\212\307>\214\305@\216\306A\215\307=\350" \
+ "\364\334\375\377\376\377\376\377\225\377\377\377\7\376\376\376\377\377" \
+ "\377\376\376\376\377\377\377SSS::<;;=\203::<\5FFH\364\364\364\376\376" \
+ "\376\377\377\377\376\376\376\277\377\377\377\1\316\316\316\205::<\1k" \
+ "km\222\377\377\377\1\376\376\376\204\377\377\377\3\376\376\376\377\377" \
+ "\377SSU\205::<\1\234\234\236\202\377\377\377\1\376\376\376\202\377\377" \
+ "\377\1\376\376\376\220\377\377\377\1\376\376\376\204\377\377\377\2kk" \
+ "m;;=\202::<\5;;=::<SSU\377\377\377\376\376\376\204\377\377\377\7SSU:" \
+ ":<;;=::<;;=::<\205\205\205\234\377\377\377\1\234\234\236\205::<\1\234" \
+ "\234\234\240\377\377\377\1\376\376\376\202\377\377\377\1\346\346\346" \
+ "\202::<\1;;=\202::<\2;;=__a\205\377\377\377\1\376\376\376\202\377\377" \
+ "\377\1\376\376\376\204\377\377\377\1\234\234\234\205::<\1\234\234\236" \
+ "\266\377\377\377\3\214\305@\214\306>\214\305@\207\214\306>\4\214\305" \
+ "@\215\305>\214\306>\252\324p\251\377\377\377\215\214\306>\1\250\325p" \
+ "\216\377\377\377\1\342\361\320\202\214\306>\1\214\305@\211\214\306>\27" \
+ "\214\304=\215\305>\213\307A\212\306@\214\305B\215\305<\213\310=\215\307" \
+ "\77\215\304B\214\306<\213\307A\215\305>\216\306A\212\306@\212\307>\270" \
+ "\332\204\377\376\377\377\377\377\377\376\377\376\376\374\377\377\373" \
+ "\377\376\377\377\377\375\206\377\377\377\213\214\306>\3\215\305>\214" \
+ "\306>\305\342\240\215\377\377\377\4\252\324p\214\306>\215\305>\214\305" \
+ "@\207\214\306>\3\214\305@\214\306>\214\305@\232\377\377\377\4\252\324" \
+ "p\214\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305" \
+ "@\223\377\377\377\1\377\377\375\202\377\377\377\2\371\372\364\232\315" \
+ "W\202\214\305@\4\214\306<\215\307\77\214\305B\215\306C\202\215\306A\1" \
+ "\214\306<\202\212\307>\6\215\305@\212\307>\215\305>\212\306B\216\306" \
+ "A\212\307>\210\214\306>\10\214\305B\215\307\77\214\306<\214\306>\304" \
+ "\341\237\377\377\377\377\376\377\377\377\375\220\377\377\377\1\376\376" \
+ "\376\203\377\377\377\1\376\376\376\203\377\377\377\10\301\301\301::<" \
+ ";;=99;;;=::<99;\234\234\236\207\377\377\377\1\376\376\376\273\377\377" \
+ "\377\1\316\316\316\205::<\1kkm\216\377\377\377\1\376\376\376\202\377" \
+ "\377\377\1\376\376\376\204\377\377\377\3\376\376\376\377\377\377\315" \
+ "\315\315\202;;=\203::<\6;;=\265\265\267\377\377\377\376\376\376\377\377" \
+ "\377\376\376\376\225\377\377\377\2\376\376\376\317\317\317\203::<\4;" \
+ ";=::<;;=\264\264\264\206\377\377\377\10\234\234\234;;=::<;;=99;;;=::" \
+ "<\346\346\346\233\377\377\377\1\234\234\236\205::<\1\234\234\234\237" \
+ "\377\377\377\1\376\376\376\204\377\377\377\1\204\204\206\202::<\6;;=" \
+ "99;;;=::<\346\346\346\376\376\376\204\377\377\377\3\376\376\376\377\377" \
+ "\377\376\376\376\204\377\377\377\1\234\234\234\205::<\1\234\234\236\266" \
+ "\377\377\377\3\214\305@\214\306>\214\305@\207\214\306>\4\214\305@\215" \
+ "\305>\214\306>\252\324p\251\377\377\377\215\214\306>\1\250\325p\216\377" \
+ "\377\377\1\342\361\320\202\214\306>\1\214\305@\210\214\306>\22\215\307" \
+ "\77\212\307>\216\306A\212\304<\215\307\77\215\305@\216\306\77\213\307" \
+ "A\214\306>\214\305@\215\307\77\213\310=\212\307>\214\306>\214\306<\214" \
+ "\306>\216\306\77\324\353\267\202\376\376\376\3\377\377\377\376\376\377" \
+ "\376\377\375\207\377\377\377\213\214\306>\3\215\305>\214\306>\305\342" \
+ "\240\215\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306" \
+ ">\3\214\305@\214\306>\214\305@\232\377\377\377\4\252\324p\214\306>\215" \
+ "\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305@\221\377\377" \
+ "\377\3\376\377\377\377\377\377\376\377\375\202\377\377\377\7\377\376" \
+ "\377\341\363\315\215\305@\214\305@\215\306A\215\305@\216\306\77\202\214" \
+ "\306>\12\214\305B\212\307<\213\304A\213\310=\216\306A\211\306;\213\310" \
+ "=\214\305@\212\307>\215\305>\210\214\306>\10\215\307\77\214\304=\212" \
+ "\307>\243\322b\377\377\377\376\377\377\377\376\377\377\377\375\226\377" \
+ "\377\377\4\376\376\376\377\377\377\204\204\206;;=\203::<\3""99;;;=\364" \
+ "\364\364\205\377\377\377\1\376\376\376\275\377\377\377\1\316\316\316" \
+ "\205::<\1kkm\217\377\377\377\202\376\376\376\202\377\377\377\1\376\376" \
+ "\376\203\377\377\377\4\376\376\376xxz;;=99;\202;;=\4::<;;=\346\346\346" \
+ "\376\376\376\204\377\377\377\1\376\376\376\224\377\377\377\1xxz\203:" \
+ ":<\3;;=::<SSU\203\377\377\377\1\376\376\376\203\377\377\377\2\363\363" \
+ "\363FFH\202::<\4;;=99;::<\204\204\206\233\377\377\377\1\234\234\236\205" \
+ "::<\1\234\234\234\244\377\377\377\1\316\316\316\202;;=\5::<;;=99;;;=" \
+ "\250\250\252\203\377\377\377\1\376\376\376\210\377\377\377\1\234\234" \
+ "\234\205::<\1\234\234\236\266\377\377\377\3\214\305@\214\306>\214\305" \
+ "@\207\214\306>\4\214\305@\215\305>\214\306>\252\324p\251\377\377\377" \
+ "\215\214\306>\1\250\325p\216\377\377\377\1\342\361\320\202\214\306>\1" \
+ "\214\305@\210\214\306>\7\213\305=\214\306<\210\306\77\216\306\77\215" \
+ "\307=\214\306>\215\307\77\202\214\306>\14\215\307\77\214\305B\214\306" \
+ "<\212\307<\214\305@\216\306\77\215\305>\214\305@\224\313L\352\364\331" \
+ "\374\377\377\377\376\377\211\377\377\377\213\214\306>\3\215\305>\214" \
+ "\306>\305\342\240\215\377\377\377\4\252\324p\214\306>\215\305>\214\305" \
+ "@\207\214\306>\3\214\305@\214\306>\214\305@\232\377\377\377\4\252\324" \
+ "p\214\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305" \
+ "@\222\377\377\377\1\376\377\377\202\377\377\377\24\376\376\374\376\377" \
+ "\375\377\375\377\277\337\224\214\306>\212\307>\215\307\77\214\304=\215" \
+ "\307=\213\304A\214\306<\212\307>\215\307\77\214\305@\213\304\77\215\307" \
+ "\77\215\305@\214\304=\215\305<\215\306A\210\214\306>\1\212\307>\202\215" \
+ "\306A\4\350\365\333\377\375\376\377\376\377\375\376\377\226\377\377\377" \
+ "\1\376\376\376\202\377\377\377\3TTV::<99;\202;;=\4::<\203\203\203\377" \
+ "\377\377\376\376\376\302\377\377\377\1\316\316\316\205::<\1kkm\222\377" \
+ "\377\377\1\376\376\376\204\377\377\377\3\300\300\302;;=::<\202;;=\202" \
+ "::<\2```\376\376\376\227\377\377\377\7\376\376\376\377\377\377\346\346" \
+ "\346;;=99;::<;;=\202::<\3\251\251\251\377\377\377\376\376\376\206\377" \
+ "\377\377\1\234\234\234\202::<\1;;=\202::<\2;;=\346\346\346\232\377\377" \
+ "\377\1\234\234\236\205::<\1\234\234\234\235\377\377\377\1\376\376\376" \
+ "\207\377\377\377\11SSU::<;;=99;<<>::<xxz\377\377\377\376\376\376\212" \
+ "\377\377\377\1\234\234\234\205::<\1\234\234\236\266\377\377\377\3\214" \
+ "\305@\214\306>\214\305@\207\214\306>\4\214\305@\215\305>\214\306>\252" \
+ "\324p\251\377\377\377\215\214\306>\1\250\325p\216\377\377\377\1\342\361" \
+ "\320\202\214\306>\1\214\305@\210\214\306>\25\213\307A\216\306A\232\315" \
+ "W\215\306C\212\306@\214\305@\212\307;\216\306A\215\305>\215\307\77\214" \
+ "\305@\215\307\77\214\306>\214\305@\212\306B\213\307C\214\306>\215\305" \
+ "@\232\315V\372\374\367\376\376\376\202\377\377\375\1\376\376\376\206" \
+ "\377\377\377\213\214\306>\3\215\305>\214\306>\305\342\240\215\377\377" \
+ "\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3\214\305@\214" \
+ "\306>\214\305@\232\377\377\377\4\252\324p\214\306>\215\305>\214\305@" \
+ "\207\214\306>\3\214\305@\214\306>\214\305@\221\377\377\377\5\377\376" \
+ "\377\376\377\377\377\375\376\377\376\377\376\377\377\202\377\377\377" \
+ "\10\370\373\362\233\314V\213\307A\211\306=\215\307\77\212\307<\212\306" \
+ "@\215\305<\202\214\306>\7\215\307=\215\306A\214\305@\212\307>\216\306" \
+ "A\212\306@\215\307=\210\214\306>\10\212\307>\212\307<\313\347\254\376" \
+ "\377\377\377\377\377\377\376\377\376\377\377\377\377\375\223\377\377" \
+ "\377\1\376\376\376\203\377\377\377\1\332\332\332\202::<\1;;=\203::<\1" \
+ "\302\302\302\203\377\377\377\5\376\376\376\377\377\377\376\376\376\377" \
+ "\377\377\376\376\376\274\377\377\377\1\316\316\316\205::<\1kkm\217\377" \
+ "\377\377\1\376\376\376\206\377\377\377\3\332\332\334FFH;;=\205::<\1\265" \
+ "\265\265\202\377\377\377\1\376\376\376\224\377\377\377\1\376\376\376" \
+ "\202\377\377\377\1\205\205\207\202::<\1;;=\202::<\2GGI\363\363\363\202" \
+ "\377\377\377\1\376\376\376\205\377\377\377\1\363\363\363\202::<\1;;=" \
+ "\202::<\2""99;\234\234\234\203\377\377\377\1\376\376\376\226\377\377" \
+ "\377\1\234\234\236\205::<\1\234\234\234\234\377\377\377\1\376\376\376" \
+ "\210\377\377\377\3\222\222\222::<99;\202;;=\5""99;GGI\376\376\376\377" \
+ "\377\377\376\376\376\211\377\377\377\1\234\234\234\205::<\1\234\234\236" \
+ "\266\377\377\377\3\214\305@\214\306>\214\305@\207\214\306>\4\214\305" \
+ "@\215\305>\214\306>\252\324p\251\377\377\377\215\214\306>\1\250\325p" \
+ "\216\377\377\377\1\342\361\320\202\214\306>\1\214\305@\210\214\306>\10" \
+ "\213\307A\214\306>\331\356\303\232\315W\215\305>\215\306A\214\305B\214" \
+ "\306>\202\214\305@\7\213\310=\214\306>\215\304B\215\306A\211\306;\213" \
+ "\310\77\214\305@\202\215\307\77\2\257\326{\376\377\373\202\377\377\377" \
+ "\1\377\377\375\206\377\377\377\213\214\306>\3\215\305>\214\306>\305\342" \
+ "\240\215\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306" \
+ ">\3\214\305@\214\306>\214\305@\232\377\377\377\4\252\324p\214\306>\215" \
+ "\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305@\221\377\377" \
+ "\377\6\377\377\373\377\377\375\377\377\377\376\376\377\377\376\377\373" \
+ "\377\374\202\377\376\377\4\336\362\315\220\303@\213\310=\215\307\77\202" \
+ "\212\306@\1\215\305@\202\214\306>\7\213\305=\214\306>\213\305=\214\305" \
+ "@\213\310\77\212\306@\213\307A\210\214\306>\10\215\307\77\252\324p\377" \
+ "\377\375\376\377\377\377\377\375\377\377\377\377\376\377\377\377\375" \
+ "\220\377\377\377\1\376\376\376\203\377\377\377\1\376\376\376\202\377" \
+ "\377\377\1\265\265\265\204::<\5;;=::<\363\363\363\377\377\377\376\376" \
+ "\376\302\377\377\377\1\316\316\316\205::<\1kkm\225\377\377\377\2\317" \
+ "\317\317FFH\206::<\1SSU\204\377\377\377\1\376\376\376\225\377\377\377" \
+ "\2\346\346\346;;=\203::<\3;;=::<\234\234\236\202\377\377\377\1\376\376" \
+ "\376\207\377\377\377\2\204\204\206;;=\204::<\2FFF\362\362\362\231\377" \
+ "\377\377\1\234\234\236\205::<\1\234\234\234\245\377\377\377\1\301\301" \
+ "\301\202::<\6;;=::<;;=::<\347\347\347\376\376\376\212\377\377\377\1\234" \
+ "\234\234\205::<\1\234\234\236\266\377\377\377\3\214\305@\214\306>\214" \
+ "\305@\207\214\306>\4\214\305@\215\305>\214\306>\252\324p\251\377\377" \
+ "\377\215\214\306>\1\250\325p\216\377\377\377\1\342\361\320\202\214\306" \
+ ">\1\214\305@\210\214\306>\27\214\305@\215\305<\342\362\315\353\365\334" \
+ "\223\312K\215\305<\212\306@\215\305<\212\307>\215\306A\214\306>\212\307" \
+ ">\215\307\77\215\304B\215\307\77\215\305@\214\306>\215\305>\214\305@" \
+ "\215\305<\315\345\253\377\377\375\376\377\377\207\377\377\377\213\214" \
+ "\306>\3\215\305>\214\306>\305\342\240\215\377\377\377\4\252\324p\214" \
+ "\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305@\232" \
+ "\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3\214" \
+ "\305@\214\306>\214\305@\221\377\377\377\14\376\377\377\376\376\377\377" \
+ "\377\377\377\377\373\376\377\375\377\376\377\376\377\377\377\377\377" \
+ "\377\376\375\276\340\224\214\306<\215\305@\202\214\306>\12\215\305>\214" \
+ "\305@\215\305@\214\305@\213\310\77\214\306>\216\306\77\211\305\77\215" \
+ "\307=\214\305@\210\214\306>\4\223\312K\360\367\347\377\377\377\377\377" \
+ "\375\232\377\377\377\2\376\376\376\234\234\236\204::<\2;;=___\234\377" \
+ "\377\377\1\376\376\376\203\377\377\377\1\376\376\376\244\377\377\377" \
+ "\1\316\316\316\205::<\1kkm\202\377\377\377\1\376\376\376\216\377\377" \
+ "\377\4\376\376\376\377\377\377\347\347\347\204\204\204\203::<\6;;=::" \
+ "<;;=::<;;=\301\301\303\226\377\377\377\1\376\376\376\203\377\377\377" \
+ "\1\203\203\205\202;;=\5::<;;=::<GGG\363\363\363\206\377\377\377\1\376" \
+ "\376\376\203\377\377\377\3\347\347\34799;;;=\202::<\202;;=\1\234\234" \
+ "\236\231\377\377\377\1\234\234\236\205::<\1\234\234\234\245\377\377\377" \
+ "\1\363\363\363\202::<\1""99;\203::<\1\316\316\316\213\377\377\377\1\234" \
+ "\234\234\204::<\2;;=kkm\203\234\234\236\2\235\235\237\234\234\234\220" \
+ "\234\234\236\204\234\234\234\4\235\235\235\234\234\234\234\234\236\346" \
+ "\346\350\231\377\377\377\3\214\305@\214\306>\214\305@\207\214\306>\4" \
+ "\214\305@\215\305>\214\306>\252\324p\251\377\377\377\215\214\306>\1\250" \
+ "\325p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305@\210\214\306" \
+ ">\40\213\307A\215\305>\341\360\317\377\375\376\324\353\267\215\304B\214" \
+ "\306>\215\307=\214\305@\212\307>\212\307<\215\305<\215\306A\214\306>" \
+ "\214\306<\212\306@\214\305@\215\307\77\216\306=\212\306B\214\306>\352" \
+ "\364\333\377\376\377\377\377\377\377\376\377\377\377\377\377\377\375" \
+ "\376\377\373\375\376\377\377\376\377\214\306>\215\307\77\211\214\306" \
+ ">\3\215\305>\214\306>\305\342\240\215\377\377\377\4\252\324p\214\306" \
+ ">\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305@\232\377" \
+ "\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3\214\305" \
+ "@\214\306>\214\305@\232\377\377\377\7\374\377\375\242\321a\216\306A\212" \
+ "\307>\214\306>\215\307\77\212\307<\210\214\306>\16\215\307\77\214\307" \
+ ";\213\304\77\216\306A\214\305B\215\307\77\215\305>\212\307>\320\345\254" \
+ "\374\377\377\377\376\377\377\377\375\377\376\377\375\377\372\223\377" \
+ "\377\377\1\376\376\376\203\377\377\377\3\376\376\376\377\377\377kkm\203" \
+ "::<\3<<>::<\221\221\221\305\377\377\377\1\316\316\316\204::<\2;;=jjl" \
+ "\217\377\377\377\16\316\316\316\300\300\300\234\234\234__a::<;;=::<;" \
+ ";=::<99;;;=::<;;=\204\204\206\232\377\377\377\1\362\362\362\202;;=\202" \
+ "::<\3""99;::<\235\235\235\212\377\377\377\12\376\376\376\377\377\377" \
+ "\205\205\20799;;;=::<;;=::<GGI\376\376\376\230\377\377\377\1\234\234" \
+ "\236\205::<\1\234\234\234\246\377\377\377\10EEG::<;;=::<99;;;=\234\234" \
+ "\234\377\377\377\202\376\376\376\202\377\377\377\1\376\376\376\205\377" \
+ "\377\377\1\234\234\234\205::<\2;;=99;\202;;=\2""99;;;=\221::<\1""99;" \
+ "\203::<\3;;=::<\316\316\316\231\377\377\377\3\214\305@\214\306>\214\305" \
+ "@\207\214\306>\4\214\305@\215\305>\214\306>\252\324p\251\377\377\377" \
+ "\215\214\306>\1\250\325p\216\377\377\377\1\342\361\320\202\214\306>\1" \
+ "\214\305@\210\214\306>\202\214\306<\32\342\361\322\377\377\377\377\377" \
+ "\375\266\334\205\212\306B\215\307\77\212\306@\220\306=\214\306>\215\307" \
+ "\77\214\305B\213\305=\216\306\77\215\307\77\215\305<\212\306B\215\306" \
+ "A\215\305@\216\306=\232\315V\371\373\360\377\377\375\377\377\377\375" \
+ "\376\377\377\375\377\376\376\377\202\377\377\377\2\214\305@\212\307>" \
+ "\211\214\306>\3\215\305>\214\306>\305\342\240\215\377\377\377\4\252\324" \
+ "p\214\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305" \
+ "@\232\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>" \
+ "\3\214\305@\214\306>\214\305@\233\377\377\377\5\347\365\334\211\306=" \
+ "\215\305>\216\306=\214\305@\211\214\306>\2\215\304B\212\307>\202\214" \
+ "\306>\14\215\306A\214\306<\215\305@\252\324p\374\377\377\377\377\377" \
+ "\377\375\376\377\376\377\376\376\377\377\377\375\377\377\377\377\375" \
+ "\377\222\377\377\377\1\376\376\376\203\377\377\377\4\376\376\376lln:" \
+ ":<;;=\203::<\2\235\235\235\376\376\376\304\377\377\377\1\316\316\316" \
+ "\205::<\202;;=\2::<;;=\202::<\1;;=\211::<\202;;=\204::<\1""99;\202::" \
+ "<\5;;=::<;;=__a\376\376\376\224\377\377\377\1\376\376\376\205\377\377" \
+ "\377\1\235\235\235\206::<\3\346\346\346\377\377\377\376\376\376\207\377" \
+ "\377\377\5\376\376\376\377\377\377\376\376\376\346\346\350;;=\203::<" \
+ "\3;;=::<\265\265\265\230\377\377\377\1\234\234\236\205::<\1\234\234\234" \
+ "\246\377\377\377\1lln\202::<\4""99;;;=99;\234\234\234\213\377\377\377" \
+ "\1\234\234\234\203::<\7;;=::<;;=::<;;=::<;;=\222::<\7;;=99;;;=::<;;=" \
+ "::<\316\316\316\231\377\377\377\3\214\305@\214\306>\214\305@\207\214" \
+ "\306>\4\214\305@\215\305>\214\306>\252\324p\251\377\377\377\215\214\306" \
+ ">\1\250\325p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305@\210" \
+ "\214\306>\13\216\306A\213\310\77\343\361\320\377\377\375\375\377\376" \
+ "\371\374\361\242\320c\213\310\77\216\306\77\214\306>\215\306A\202\214" \
+ "\305@\2\216\306A\213\305=\204\214\306>\11\213\307A\216\306A\212\307>" \
+ "\260\331y\377\376\377\376\377\375\377\377\373\376\377\377\377\377\377" \
+ "\202\377\376\377\2\212\311=\215\306A\211\214\306>\3\215\305>\214\306" \
+ ">\305\342\240\215\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207" \
+ "\214\306>\3\214\305@\214\306>\214\305@\232\377\377\377\4\252\324p\214" \
+ "\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305@\231" \
+ "\377\377\377\6\377\376\377\377\377\373\377\376\377\305\342\240\212\310" \
+ "\77\214\304=\202\215\305@\210\214\306>\4\215\305>\213\305=\212\306@\215" \
+ "\306A\202\214\306>\10\222\312M\370\373\362\377\376\377\377\375\376\377" \
+ "\376\377\377\377\377\376\377\375\377\377\377\202\377\376\377\221\377" \
+ "\377\377\1\376\376\376\205\377\377\377\2::<;;=\202::<\202;;=\3\300\300" \
+ "\300\377\377\377\376\376\376\235\377\377\377\1\376\376\376\245\377\377" \
+ "\377\1\316\316\316\207::<\5;;=::<;;=::<;;=\210::<\202;;=\2""99;;;=\202" \
+ "::<\3;;=::<;;=\202::<\3;;=xxz\363\363\363\225\377\377\377\3\376\376\376" \
+ "\377\377\377\376\376\376\202\377\377\377\3\363\363\363FFH::<\202;;=\202" \
+ "::<\1\204\204\206\205\377\377\377\1\376\376\376\205\377\377\377\1\376" \
+ "\376\376\202\377\377\377\1kkm\202::<\1;;=\202::<\1SSU\230\377\377\377" \
+ "\1\234\234\236\205::<\1\234\234\234\244\377\377\377\3\376\376\376\377" \
+ "\377\377xxz\202::<\1;;=\202::<\3xxx\377\377\377\376\376\376\211\377\377" \
+ "\377\1\234\234\234\203::<\1;;=\202::<\1;;=\224::<\5;;=99;;;=::<;;=\202" \
+ "::<\1\316\316\316\231\377\377\377\3\214\305@\214\306>\214\305@\207\214" \
+ "\306>\4\214\305@\215\305>\214\306>\252\324p\251\377\377\377\215\214\306" \
+ ">\1\250\325p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305@\210" \
+ "\214\306>\3\214\305@\214\306<\343\361\316\202\377\377\377\26\377\376" \
+ "\374\353\365\335\223\312K\211\305\77\215\307=\215\306C\211\306;\214\306" \
+ ">\215\305@\215\307\77\214\305@\213\307A\214\306>\212\307<\216\306\77" \
+ "\212\306B\215\305>\212\306@\304\341\236\377\376\377\375\377\376\377\377" \
+ "\375\203\377\377\377\2\212\306@\214\306<\211\214\306>\3\215\305>\214" \
+ "\306>\305\342\240\215\377\377\377\4\252\324p\214\306>\215\305>\214\305" \
+ "@\207\214\306>\3\214\305@\214\306>\214\305@\232\377\377\377\4\252\324" \
+ "p\214\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305" \
+ "@\231\377\377\377\2\377\377\373\376\377\377\202\377\377\377\4\241\321" \
+ "c\215\306A\215\305>\213\310\77\210\214\306>\20\215\305@\215\307=\213" \
+ "\310\77\214\304;\216\306\77\213\310\77\333\355\303\377\375\376\377\377" \
+ "\375\377\376\377\377\377\377\375\377\374\376\377\377\377\377\377\377" \
+ "\377\375\376\376\376\222\377\377\377\1\376\376\376\204\377\377\377\206" \
+ "::<\2\316\316\316\376\376\376\234\377\377\377\1\376\376\376\247\377\377" \
+ "\377\1\316\316\316\204::<\1;;=\205::<\1;;=\212::<\4""99;;;=::<;;=\203" \
+ "::<\1;;=\202::<\1\233\233\233\234\377\377\377\3\235\235\23799;;;=\203" \
+ "::<\2;;=\346\346\346\203\377\377\377\1\376\376\376\204\377\377\377\3" \
+ "\376\376\376\377\377\377\376\376\376\203\377\377\377\4\316\316\320;;" \
+ "=::<;;=\202::<\2;;=\264\264\264\227\377\377\377\1\234\234\236\205::<" \
+ "\1\234\234\234\246\377\377\377\2\234\234\236;;=\203::<\2;;=kkk\213\377" \
+ "\377\377\1\234\234\234\204::<\3;;=::<;;=\225::<\2;;=99;\202::<\3;;=:" \
+ "::\316\316\316\231\377\377\377\3\214\305@\214\306>\214\305@\207\214\306" \
+ ">\4\214\305@\215\305>\214\306>\252\324p\251\377\377\377\215\214\306>" \
+ "\1\250\325p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305@\210" \
+ "\214\306>\14\215\307\77\215\305@\340\361\315\376\376\376\377\376\377" \
+ "\377\377\375\377\377\377\323\353\267\212\307>\215\305@\214\305@\214\311" \
+ "@\202\214\306>\22\212\307>\215\305@\214\306>\212\306@\214\305@\215\305" \
+ ">\215\307=\214\306>\214\304=\215\307\77\341\362\316\377\376\377\377\377" \
+ "\377\376\376\376\377\377\375\375\376\377\217\307@\212\306@\211\214\306" \
+ ">\3\215\305>\214\306>\305\342\240\215\377\377\377\4\252\324p\214\306" \
+ ">\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305@\232\377" \
+ "\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3\214\305" \
+ "@\214\306>\214\305@\232\377\377\377\7\377\376\377\376\377\377\377\377" \
+ "\377\352\364\331\212\307<\215\307=\212\307>\211\214\306>\13\212\306@" \
+ "\214\306<\216\306A\214\305@\252\322q\376\376\377\376\377\373\377\376" \
+ "\377\376\376\377\377\377\375\376\377\377\203\377\377\377\1\376\377\375" \
+ "\227\377\377\377\202::<\202;;=\3::<;;=\316\316\316\233\377\377\377\1" \
+ "\375\375\375\251\377\377\377\1\316\316\316\211::<\1;;=\213::<\3;;=::" \
+ "<;;=\204::<\3""99;\205\205\207\346\346\346\233\377\377\377\4\376\376" \
+ "\376\364\364\364FFH;;=\202::<\202;;=\1\204\204\204\215\377\377\377\1" \
+ "\376\376\376\202\377\377\377\7kkm::<99;::<;;=99;TTV\227\377\377\377\1" \
+ "\234\234\236\205::<\1\234\234\234\246\377\377\377\1\234\234\236\202:" \
+ ":<\202;;=\2::<kkk\202\377\377\377\3\376\376\376\377\377\377\376\376\376" \
+ "\206\377\377\377\1\234\234\234\203::<\1;;=\202::<\2;;=::<\202;;=\223" \
+ "::<\2""99;;;=\202::<\2;;;\316\316\316\231\377\377\377\3\214\305@\214" \
+ "\306>\214\305@\207\214\306>\4\214\305@\215\305>\214\306>\252\324p\251" \
+ "\377\377\377\215\214\306>\1\250\325p\216\377\377\377\1\342\361\320\202" \
+ "\214\306>\1\214\305@\210\214\306>\202\214\305@\15\341\362\316\377\377" \
+ "\375\376\377\375\377\377\377\373\377\374\377\376\377\271\332\211\212" \
+ "\307>\212\307<\214\305B\214\305@\216\306\77\212\307>\202\215\307\77\11" \
+ "\214\305B\215\306A\212\311=\214\303A\214\306>\215\306A\212\307>\225\311" \
+ "K\371\372\362\202\377\377\375\202\377\377\377\2\214\305@\215\306A\211" \
+ "\214\306>\3\215\305>\214\306>\305\342\240\215\377\377\377\4\252\324p" \
+ "\214\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305" \
+ "@\232\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>" \
+ "\3\214\305@\214\306>\214\305@\231\377\377\377\10\376\377\377\377\376" \
+ "\377\377\377\375\377\375\376\331\356\303\214\306>\214\305B\215\307\77" \
+ "\210\214\306>\12\215\305>\212\306B\215\304B\214\306>\215\307=\224\310" \
+ "J\364\370\351\376\376\374\375\377\372\377\377\375\203\377\377\377\3\377" \
+ "\376\377\377\377\377\376\377\375\221\377\377\377\3\376\376\376\377\377" \
+ "\377\376\376\376\203\377\377\377\7::<;;=99;::<;;=::<\315\315\315\232" \
+ "\377\377\377\1\376\376\376\203\377\377\377\1\376\376\376\246\377\377" \
+ "\377\1\316\316\316\204::<\1;;=\202::<\1;;=\203::<\1;;=\210::<\1;;=\202" \
+ "::<\1;;=\202::<\4``b\233\233\235\347\347\351\376\376\376\235\377\377" \
+ "\377\2\265\265\265;;=\202::<\1;;=\202::<\1\332\332\332\216\377\377\377" \
+ "\3\376\376\376\377\377\377\302\302\302\206::<\1\315\315\315\226\377\377" \
+ "\377\1\234\234\236\205::<\1\234\234\234\245\377\377\377\2\376\376\376" \
+ "\235\235\237\205::<\1jjj\203\377\377\377\3\376\376\376\377\377\377\376" \
+ "\376\376\205\377\377\377\1\234\234\234\204::<\2;;=kkm\202\234\234\236" \
+ "\1\233\233\235\223\234\234\234\202\235\235\235\1\233\233\233\203\234" \
+ "\234\234\1\346\346\346\231\377\377\377\3\214\305@\214\306>\214\305@\207" \
+ "\214\306>\4\214\305@\215\305>\214\306>\252\324p\251\377\377\377\215\214" \
+ "\306>\1\250\325p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305" \
+ "@\210\214\306>\17\212\307>\216\306A\342\360\315\376\377\377\376\376\374" \
+ "\375\377\376\377\376\377\377\376\374\377\377\375\242\320d\215\307=\214" \
+ "\306>\214\305@\215\305@\212\306@\202\214\305@\17\215\305@\212\307>\215" \
+ "\307\77\214\306<\215\306A\213\304\77\215\306A\215\307\77\252\324n\377" \
+ "\377\377\375\377\376\377\376\377\377\377\375\212\307<\215\305@\211\214" \
+ "\306>\3\215\305>\214\306>\305\342\240\215\377\377\377\4\252\324p\214" \
+ "\306>\215\305>\214\305@\207\214\306>\3\214\305@\214\306>\214\305@\232" \
+ "\377\377\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3\214" \
+ "\305@\214\306>\214\305@\232\377\377\377\6\376\377\375\377\375\377\367" \
+ "\375\363\223\312H\216\306\77\215\305>\212\214\306>\2\215\305@\214\306" \
+ ">\202\212\307>\3\214\305@\247\324o\377\376\377\202\377\377\377\2\377" \
+ "\376\377\377\377\375\233\377\377\377\2::<;;=\204::<\2\316\316\316\376" \
+ "\376\376\236\377\377\377\3\316\316\316;;;:::\230::<\213\377\377\377\1" \
+ "\316\316\316\224::<\6kkmlln\205\205\207\234\234\236\301\301\303\363\363" \
+ "\363\202\377\377\377\1\376\376\376\202\377\377\377\3\376\376\376\377" \
+ "\377\377\376\376\376\231\377\377\377\1SSS\204::<\2;;=lln\213\377\377" \
+ "\377\1\376\376\376\205\377\377\377\2\376\376\376TTV\205::<\1lll\226\377" \
+ "\377\377\1\234\234\236\205::<\1\234\234\234\246\377\377\377\2\233\233" \
+ "\235;;=\204::<\2kkk\376\376\376\203\377\377\377\1\376\376\376\206\377" \
+ "\377\377\1\234\234\234\205::<\1\234\234\236\266\377\377\377\3\214\305" \
+ "@\214\306>\214\305@\207\214\306>\4\214\305@\215\305>\214\306>\252\324" \
+ "p\251\377\377\377\215\214\306>\1\250\325p\216\377\377\377\1\342\361\320" \
+ "\202\214\306>\1\214\305@\210\214\306>\3\212\307>\215\305>\342\362\315" \
+ "\202\377\377\377\22\377\376\377\376\377\377\377\377\375\376\377\377\363" \
+ "\367\346\225\311K\211\307@\216\306\77\212\307>\215\305@\214\306<\212" \
+ "\307>\214\305@\214\306>\212\306@\215\306C\214\304\77\215\307\77\202\214" \
+ "\306>\7\212\306@\307\341\240\377\376\377\376\377\372\377\377\377\212" \
+ "\307>\215\305>\211\214\306>\3\215\305>\214\306>\305\342\240\215\377\377" \
+ "\377\4\252\324p\214\306>\215\305>\214\305@\207\214\306>\3\214\305@\214" \
+ "\306>\214\305@\232\377\377\377\4\252\324p\214\306>\215\305>\214\305@" \
+ "\207\214\306>\3\214\305@\214\306>\214\305@\231\377\377\377\4\377\376" \
+ "\377\376\377\375\376\377\377\257\330z\202\214\305@\1\215\307\77\211\214" \
+ "\306>\14\212\307>\215\307\77\214\305@\215\305@\212\307>\215\307=\214" \
+ "\305B\313\347\252\377\377\377\377\375\377\377\376\377\376\376\376\202" \
+ "\376\377\375\231\377\377\377\4GGI;;=::<;;=\202::<\1\233\233\235\237\377" \
+ "\377\377\3\316\316\316::<;;=\230::<\213\377\377\377\1\316\316\316\205" \
+ "::<\1kkm\202\377\377\377\2\376\376\376\250\250\250\206::<\2FFH\346\346" \
+ "\346\210\377\377\377\1\376\376\376\237\377\377\377\1\264\264\266\203" \
+ ";;=\4::<;;=;;;\316\316\316\222\377\377\377\1\265\265\265\204::<\3;;=" \
+ "::<\316\316\316\203\377\377\377\1\376\376\376\221\377\377\377\1\234\234" \
+ "\236\205::<\1\234\234\234\245\377\377\377\2\376\376\376\235\235\237\205" \
+ "::<\1lll\213\377\377\377\1\234\234\234\205::<\1\234\234\236\266\377\377" \
+ "\377\3\214\305@\214\306>\214\305@\207\214\306>\4\214\305@\215\305>\214" \
+ "\306>\252\324p\251\377\377\377\215\214\306>\1\250\325p\216\377\377\377" \
+ "\1\342\361\320\202\214\306>\1\214\305@\211\214\306>\2\214\305@\343\361" \
+ "\316\205\377\377\377\10\376\377\375\377\377\377\333\355\303\215\305@" \
+ "\214\306>\214\306<\214\305@\215\305>\202\214\305@\207\214\306>\6\212" \
+ "\306@\214\307;\330\355\304\377\376\377\377\377\377\215\305>\212\214\306" \
+ ">\3\215\305>\214\306>\305\342\240\215\377\377\377\17\251\323q\214\306" \
+ ">\215\307\77\214\305B\215\307\77\213\305=\215\307\77\214\305@\212\307" \
+ ">\215\305@\213\310\77\214\305@\215\305<\214\306>\376\377\377\230\377" \
+ "\377\377\6\376\377\377\253\323p\215\305@\213\307A\214\306<\212\306B\202" \
+ "\214\306>\4\214\305@\214\306>\212\307>\214\305@\202\214\306>\2\214\305" \
+ "@\376\377\375\220\377\377\377\1\377\377\375\202\377\377\377\16\376\377" \
+ "\375\377\376\377\377\375\376\374\377\377\377\377\375\376\377\375\377" \
+ "\377\377\336\355\304\214\306>\215\306A\214\306>\215\306A\212\306@\216" \
+ "\306A\202\214\305@\4\215\307\77\214\306>\215\307\77\214\306>\202\214" \
+ "\305@\16\214\306>\215\307\77\214\306>\215\307\77\214\305@\214\305B\222" \
+ "\313H\361\370\346\376\377\377\377\377\377\377\376\377\377\377\377\374" \
+ "\377\377\377\376\377\230\377\377\377\1kkm\202::<\1""99;\202::<\1\235" \
+ "\235\237\233\377\377\377\1\376\376\376\203\377\377\377\1\316\316\316" \
+ "\224::<\1;;=\205::<\213\377\377\377\1\316\316\316\205::<\1kkm\204\377" \
+ "\377\377\3wwy::<;;=\202::<\4""99;;;=``b\363\363\363\206\377\377\377\1" \
+ "\376\376\376\235\377\377\377\4\376\376\376\377\377\377\376\376\376TT" \
+ "V\205::<\1lln\223\377\377\377\10\376\376\376SSU;;=::<;;=99;::<lll\205" \
+ "\377\377\377\1\376\376\376\217\377\377\377\1\234\234\236\205::<\1\234" \
+ "\234\234\246\377\377\377\1\204\204\206\202::<\1;;=\202::<\3xxx\377\377" \
+ "\377\376\376\376\211\377\377\377\1\234\234\234\205::<\1\234\234\236\266" \
+ "\377\377\377\3\214\305@\214\306>\214\305@\207\214\306>\4\214\305@\215" \
+ "\305>\214\306>\252\324p\251\377\377\377\215\214\306>\1\250\325p\216\377" \
+ "\377\377\1\342\361\320\202\214\306>\1\214\305@\211\214\306>\2\214\305" \
+ "@\343\361\316\205\377\377\377\7\377\375\377\377\377\375\376\377\377\276" \
+ "\337\220\213\310\77\213\304A\216\306=\207\214\306>\3\215\307\77\214\306" \
+ ">\212\307>\202\215\305>\5\223\312J\361\371\344\377\375\377\212\307<\214" \
+ "\305@\211\214\306>\3\215\305>\214\306>\305\342\240\214\377\377\377\14" \
+ "\376\376\374\252\324n\214\306>\213\305=\215\307\77\214\305@\215\306A" \
+ "\214\306>\215\307\77\213\310\77\215\305@\212\307>\202\214\306>\1\214" \
+ "\305@\232\377\377\377\3\247\324m\215\305>\214\305@\202\214\306>\1\215" \
+ "\307=\202\214\305@\6\214\306<\215\307=\214\305B\215\307\77\214\306>\214" \
+ "\305@\224\377\377\377\15\377\377\375\376\376\376\377\377\377\377\376" \
+ "\377\376\377\375\377\377\375\372\373\366\222\312M\216\306A\215\305<\214" \
+ "\306>\212\307>\215\305<\202\214\306>\2\215\307\77\213\305=\204\214\306" \
+ ">\1\214\305@\203\214\306>\14\215\307\77\214\305@\213\304\77\214\305B" \
+ "\253\324n\376\376\377\376\377\377\377\376\377\377\377\377\376\377\375" \
+ "\377\377\375\376\377\375\227\377\377\377\3lln::<;;=\203::<\2kkm\376\376" \
+ "\376\236\377\377\377\2\316\316\316;;=\226::<\3;;=::<kkm\213\377\377\377" \
+ "\1\316\316\316\204::<\2;;=kkm\204\377\377\377\3\363\363\363__a;;=\203" \
+ "::<\4;;=99;\205\205\207\376\376\376\202\377\377\377\1\376\376\376\203" \
+ "\377\377\377\1\376\376\376\236\377\377\377\1\301\301\301\204::<\4;;=" \
+ "::<wwy\235\235\237\223\234\234\236\1kkm\204::<\5;;=99;\345\345\345\377" \
+ "\377\377\376\376\376\222\377\377\377\1\234\234\236\205::<\1\234\234\234" \
+ "\246\377\377\377\1kkm\204::<\2;;=\234\234\234\213\377\377\377\1\234\234" \
+ "\234\205::<\1\234\234\236\266\377\377\377\3\214\305@\214\306>\214\305" \
+ "@\207\214\306>\4\214\305@\215\305>\214\306>\252\324p\251\377\377\377" \
+ "\215\214\306>\1\250\325p\216\377\377\377\1\342\361\320\202\214\306>\1" \
+ "\214\305@\211\214\306>\2\214\305@\343\361\316\205\377\377\377\2\377\377" \
+ "\375\377\375\377\202\377\377\377\1\242\322b\202\214\305@\2\214\305B\215" \
+ "\307\77\205\214\306>\12\215\307\77\214\306>\215\306A\214\306>\212\306" \
+ "@\215\307=\241\321c\377\377\377\215\304B\212\307>\211\214\306>\3\215" \
+ "\305>\214\306>\305\342\240\214\377\377\377\5\376\377\375\251\323o\215" \
+ "\307\77\214\306>\215\307\77\202\214\305@\2\214\306>\215\307\77\202\214" \
+ "\306>\5\213\310\77\215\305>\214\305@\214\306>\377\376\377\230\377\377" \
+ "\377\12\377\376\377\247\326p\213\304\77\215\307\77\214\305B\214\306<" \
+ "\214\306>\215\307\77\214\305@\214\306>\202\215\307\77\3\214\306>\215" \
+ "\306A\216\306\77\223\377\377\377\5\376\377\372\377\377\375\376\376\376" \
+ "\377\377\377\377\377\375\202\377\376\377\4\250\325p\212\307<\214\305" \
+ "@\215\307\77\202\214\305@\3\214\307;\215\307=\214\306>\202\214\305@\202" \
+ "\214\306>\1\215\307\77\207\214\306>\202\214\305@\5\212\307>\307\341\240" \
+ "\376\376\374\377\377\377\377\376\377\202\377\377\377\1\376\376\374\227" \
+ "\377\377\377\7\234\234\236;;=99;<<>99;::<;;=\237\377\377\377\1\316\316" \
+ "\316\223::<\7;;=99;;;=99;::<;;=kkm\213\377\377\377\1\316\316\316\205" \
+ "::<\2mmo\376\376\377\204\377\377\377\12\332\332\332FFH;;=::<;;=99;<<" \
+ ">::<\266\266\270\376\376\376\203\377\377\377\1\376\376\376\202\377\377" \
+ "\377\1\376\376\376\230\377\377\377\3\376\376\376\377\377\377\376\376" \
+ "\376\202\377\377\377\1kkm\205::<\202;;=\224::<\10;;=::<;;=::<;;=88:;" \
+ ";=\205\205\205\224\377\377\377\1\234\234\236\205::<\1\234\234\234\246" \
+ "\377\377\377\3SSU;;=::<\203;;=\1\234\234\234\206\377\377\377\1\376\376" \
+ "\376\204\377\377\377\1\234\234\234\205::<\1\234\234\236\266\377\377\377" \
+ "\3\214\305@\214\306>\214\305@\207\214\306>\4\214\305@\215\305>\214\306" \
+ ">\252\324p\251\377\377\377\215\214\306>\1\250\325p\216\377\377\377\1" \
+ "\342\361\320\202\214\306>\1\214\305@\211\214\306>\2\214\305@\343\361" \
+ "\316\205\377\377\377\10\376\376\374\376\377\375\377\375\377\377\377\377" \
+ "\367\372\357\224\313L\214\305B\215\305<\203\214\306>\202\215\307\77\204" \
+ "\214\306>\6\215\306A\213\307A\214\306>\212\306@\277\337\223\215\305>" \
+ "\212\214\306>\3\215\305>\214\306>\305\342\240\214\377\377\377\2\376\377" \
+ "\377\251\322r\202\215\307\77\1\214\305B\202\214\306>\202\215\307\77\7" \
+ "\214\306>\215\307\77\214\306>\214\304\77\212\306@\215\307\77\377\376" \
+ "\377\230\377\377\377\7\377\377\375\215\305@\214\306>\214\305@\214\306" \
+ ">\216\306\77\214\306<\203\214\305@\6\215\306C\215\307=\214\305@\215\306" \
+ "A\233\314V\377\377\375\220\377\377\377\5\376\376\376\377\377\377\377" \
+ "\376\377\377\375\377\377\377\375\202\376\377\377\21\377\376\377\314\346" \
+ "\251\212\306B\215\307=\212\307>\216\306\77\215\306C\212\307>\215\306" \
+ "C\214\305@\215\307\77\213\304\77\215\306A\214\306>\214\305@\215\307\77" \
+ "\215\306A\203\214\306>\1\215\307\77\202\214\306>\202\215\307\77\10\214" \
+ "\306>\214\305@\350\364\334\377\377\375\377\376\377\377\377\377\376\376" \
+ "\376\377\376\377\222\377\377\377\1\376\376\376\204\377\377\377\1\301" \
+ "\301\301\202::<\2""99;;;=\202::<\1\316\316\316\233\377\377\377\1\376" \
+ "\376\376\202\377\377\377\2\316\316\316;;;\222::<\7""99;;;=::<;;=::<9" \
+ "9;\204\204\206\213\377\377\377\1\316\316\316\205::<\1jjl\202\377\377" \
+ "\377\202\376\376\376\202\377\377\377\1\265\265\267\202::<\202;;=\202" \
+ "::<\2FFH\332\332\332\205\377\377\377\1\376\376\376\234\377\377\377\2" \
+ "\376\376\376\317\317\317\202::<\1;;=\204::<\3;;=::<;;=\222::<\2""99;" \
+ ";;=\202::<\1;;=\203::<\3\346\346\346\377\377\377\376\376\376\221\377" \
+ "\377\377\1\234\234\236\205::<\1\234\234\234\246\377\377\377\1;;=\203" \
+ "::<\4;;=::<\316\316\316\376\376\376\203\377\377\377\1\376\376\376\206" \
+ "\377\377\377\1\234\234\234\205::<\1\234\234\236\266\377\377\377\3\214" \
+ "\305@\214\306>\214\305@\207\214\306>\4\214\305@\215\305>\214\306>\252" \
+ "\324p\251\377\377\377\215\214\306>\1\250\325p\216\377\377\377\1\342\361" \
+ "\320\202\214\306>\1\214\305@\211\214\306>\2\214\305@\343\361\316\205" \
+ "\377\377\377\203\376\377\377\202\377\376\377\2\341\361\315\214\305@\203" \
+ "\215\307\77\202\214\306>\1\215\307\77\203\214\306>\10\214\305@\215\307" \
+ "\77\214\306>\212\307>\216\306A\213\305;\214\305@\215\305<\211\214\306" \
+ ">\3\215\305>\214\306>\305\342\240\214\377\377\377\2\376\377\377\252\324" \
+ "p\202\214\306>\3\214\305B\214\306<\215\307\77\203\214\306>\6\214\306" \
+ "<\214\307;\217\307@\212\307>\214\305@\376\377\377\231\377\377\377\10" \
+ "\215\307=\214\305B\213\304A\216\310@\214\304\77\215\307=\214\305@\215" \
+ "\307\77\203\214\306>\3\215\307\77\214\306>\247\324o\222\377\377\377\3" \
+ "\377\377\375\377\377\377\377\375\376\203\377\377\377\20\360\371\346\223" \
+ "\312K\216\306\77\213\304A\215\306A\213\305=\215\305@\212\307>\215\305" \
+ "<\214\305B\214\305@\214\306>\214\306<\214\306>\215\307\77\213\305=\204" \
+ "\214\306>\202\215\307\77\203\214\306>\10\215\306A\212\307<\243\321d\377" \
+ "\377\373\375\377\376\377\376\377\377\377\377\376\376\374\223\377\377" \
+ "\377\5\375\375\375\377\377\377\376\376\376\377\377\377\346\346\346\202" \
+ "::<\1;;=\203::<\1\221\221\221\235\377\377\377\3\376\376\376\377\377\377" \
+ "\376\376\376\222\377\377\377\1__a\204::<\2;;=\234\234\234\213\377\377" \
+ "\377\1\316\316\316\205::<\3jjl\377\377\377\376\376\376\205\377\377\377" \
+ "\2\204\204\206;;=\204::<\3;;=RRT\363\363\363\237\377\377\377\1\376\376" \
+ "\376\202\377\377\377\2jjl;;=\206::<\4;;=::<99;;;=\223::<\1;;=\205::<" \
+ "\1\204\204\206\203\377\377\377\1\376\376\376\217\377\377\377\1\234\234" \
+ "\236\205::<\1\234\234\234\245\377\377\377\3\315\315\315;;=99;\202::<" \
+ "\5""99;;;=\346\346\346\377\377\377\376\376\376\211\377\377\377\1\234" \
+ "\234\234\205::<\1\234\234\236\266\377\377\377\3\214\305@\214\306>\214" \
+ "\305@\207\214\306>\4\214\305@\215\305>\214\306>\252\324p\251\377\377" \
+ "\377\215\214\306>\1\250\325p\216\377\377\377\1\342\361\320\202\214\306" \
+ ">\1\214\305@\211\214\306>\2\214\305@\343\361\316\207\377\377\377\202" \
+ "\377\377\375\4\376\377\377\377\377\375\303\342\237\212\306@\202\214\305" \
+ "@\206\214\306>\7\216\306\77\213\305;\214\305@\216\306A\214\306>\215\307" \
+ "\77\213\307A\212\214\306>\3\215\305>\214\306>\305\342\240\215\377\377" \
+ "\377\17\252\323k\215\306A\214\306>\215\307\77\214\306>\215\307\77\214" \
+ "\305@\214\306>\213\304A\215\306C\214\305@\213\304A\213\310=\214\306<" \
+ "\342\357\321\230\377\377\377\6\360\371\346\214\305B\212\307<\215\307" \
+ "=\213\305=\215\307\77\202\214\305@\7\215\306A\214\306>\214\306<\214\305" \
+ "@\214\306>\214\305@\252\324p\222\377\377\377\11\377\376\377\376\377\377" \
+ "\377\377\377\377\377\375\376\376\374\377\377\377\253\323p\215\307\77" \
+ "\211\306;\202\215\306A\6\214\306>\214\306<\215\305>\216\305C\215\307" \
+ "\77\213\304\77\202\215\307\77\2\215\307=\213\305;\202\215\307\77\2\214" \
+ "\306>\215\307\77\205\214\306>\5\215\307\77\212\306@\214\306>\215\307" \
+ "\77\304\341\236\202\377\377\377\2\376\376\377\374\377\377\230\377\377" \
+ "\377\7SSU;;=99;::<;;=::<FFH\232\377\377\377\1\376\376\376\205\377\377" \
+ "\377\1\376\376\376\220\377\377\377\2\376\376\376;;=\202::<\1;;=\202:" \
+ ":<\1\316\316\316\213\377\377\377\1\316\316\316\205::<\1kkm\210\377\377" \
+ "\377\2__a;;=\204::<\2;;=xxz\202\377\377\377\1\376\376\376\233\377\377" \
+ "\377\1\376\376\376\202\377\377\377\2\315\315\315;;=\206::<\2;;=99;\203" \
+ ";;=\223::<\1;;=\205::<\6FFH\363\363\363\377\377\377\376\376\376\377\377" \
+ "\377\376\376\376\216\377\377\377\1\234\234\236\205::<\1\234\234\234\244" \
+ "\377\377\377\4\376\376\376\223\223\22399;;;=\202::<\4;;=EEG\377\377\377" \
+ "\376\376\376\202\377\377\377\1\376\376\376\202\377\377\377\1\376\376" \
+ "\376\204\377\377\377\1\234\234\234\205::<\1\234\234\236\266\377\377\377" \
+ "\3\214\305@\214\306>\214\305@\207\214\306>\4\214\305@\215\305>\214\306" \
+ ">\252\324p\251\377\377\377\215\214\306>\1\250\325p\216\377\377\377\1" \
+ "\342\361\320\202\214\306>\1\214\305@\211\214\306>\2\214\305@\343\361" \
+ "\316\206\377\377\377\13\377\376\377\377\377\377\376\377\375\377\377\377" \
+ "\377\376\377\376\377\377\253\324l\214\305B\213\304\77\214\305@\215\307" \
+ "\77\203\214\306>\11\214\305@\214\306<\216\306=\214\306>\212\306@\215" \
+ "\306C\214\304;\212\307>\214\305@\211\214\306>\3\215\305>\214\306>\305" \
+ "\342\240\215\377\377\377\1\261\330\177\202\214\306>\2\214\306<\215\306" \
+ "A\203\214\306>\7\215\307\77\214\306>\214\306<\215\307=\214\306>\215\306" \
+ "C\323\353\267\230\377\377\377\4\340\361\315\215\305@\215\306A\214\305" \
+ "@\202\214\306>\2\213\305=\215\306A\202\214\305@\5\214\306>\215\307\77" \
+ "\214\306>\214\305@\260\330x\221\377\377\377\3\376\376\376\377\377\373" \
+ "\375\377\376\202\377\377\377\25\376\377\377\314\345\253\214\305@\213" \
+ "\304\77\216\306\77\212\307>\215\305@\214\306>\214\305@\215\305>\214\305" \
+ "@\214\306>\214\306<\214\305@\215\306A\214\305@\215\306C\214\306>\214" \
+ "\305@\214\306>\215\307\77\207\214\306>\7\212\306@\220\306=\215\306C\350" \
+ "\364\336\376\377\373\377\377\375\376\377\377\230\377\377\377\1\221\221" \
+ "\223\203::<\1;;=\202::<\1\265\265\265\230\377\377\377\1\376\376\376\227" \
+ "\377\377\377\1\316\316\316\202::<\1;;=\203::<\1\363\363\363\213\377\377" \
+ "\377\1\316\316\316\205::<\1kkm\204\377\377\377\1\376\376\376\203\377" \
+ "\377\377\2\346\346\346FFH\206::<\2\234\234\236\376\376\376\237\377\377" \
+ "\377\1\205\205\205\206::<\3;;=::<;;=\223::<\1;;=\203::<\202;;=\204::" \
+ "<\2\234\234\234\376\376\376\221\377\377\377\1\234\234\236\205::<\1\234" \
+ "\234\234\245\377\377\377\1RRR\204::<\2""99;yy{\203\377\377\377\1\376" \
+ "\376\376\202\377\377\377\202\376\376\376\204\377\377\377\1\234\234\234" \
+ "\205::<\1\234\234\236\266\377\377\377\3\214\305@\214\306>\214\305@\207" \
+ "\214\306>\4\214\305@\215\305>\214\306>\252\324p\251\377\377\377\215\214" \
+ "\306>\1\250\325p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305" \
+ "@\211\214\306>\2\214\305@\343\361\316\205\377\377\377\30\377\377\375" \
+ "\377\377\377\375\377\376\377\377\377\377\376\377\377\377\377\376\377" \
+ "\377\371\372\365\222\313H\214\305B\214\305@\215\307\77\214\306>\215\307" \
+ "\77\214\306>\214\305@\212\306B\214\305@\212\307>\216\306\77\212\307>" \
+ "\215\307\77\214\306<\214\305@\211\214\306>\3\215\305>\214\306>\305\342" \
+ "\240\214\377\377\377\20\377\376\377\301\345\237\215\305>\215\306A\213" \
+ "\304\77\215\306C\214\306>\214\306<\216\306\77\214\306>\214\305B\215\307" \
+ "\77\214\306>\215\307\77\214\305@\271\332\211\230\377\377\377\10\307\341" \
+ "\240\215\305>\214\305@\214\306>\215\305<\212\307>\214\305B\214\306<\202" \
+ "\214\306>\5\215\305<\214\305B\215\307\77\214\306>\303\344\235\222\377" \
+ "\377\377\6\376\376\377\377\377\375\376\377\377\377\376\377\352\364\333" \
+ "\215\305@\202\215\307\77\16\214\306>\215\307\77\214\306>\215\307\77\214" \
+ "\306<\216\306A\213\310\77\214\305D\215\3108\214\305@\215\305>\223\312" \
+ "K\236\323a\215\307\77\207\214\306>\202\214\305@\10\214\306>\215\307\77" \
+ "\212\307>\212\307<\241\321c\377\376\377\377\375\376\377\375\377\230\377" \
+ "\377\377\3\332\332\332:::;;=\204::<\1SSU\203\377\377\377\1\376\376\376" \
+ "\247\377\377\377\1\376\376\376\204\377\377\377\1\221\221\221\202::<\1" \
+ ";:\77\202::<\1RRT\214\377\377\377\1\316\316\316\205::<\1kkm\211\377\377" \
+ "\377\2\316\316\316;;=\202::<\5;;=::<;;=::<\316\316\316\210\377\377\377" \
+ "\1\376\376\376\215\377\377\377\1\376\376\376\207\377\377\377\2\346\346" \
+ "\350::<\202;;=\202::<\2:::xxx\230\234\234\234\3\235\235\235\234\234\234" \
+ "kkm\203::<\4;;=::<FFH\364\364\364\203\377\377\377\1\376\376\376\215\377" \
+ "\377\377\1\234\234\236\205::<\1\234\234\234\241\377\377\377\1\376\376" \
+ "\376\202\377\377\377\1\332\332\334\206::<\1\250\250\252\214\377\377\377" \
+ "\1\234\234\234\205::<\1\234\234\236\266\377\377\377\3\214\305@\214\306" \
+ ">\214\305@\204\214\306>\2\213\307A\213\310\77\204\214\306>\1\252\324" \
+ "p\232\377\377\377\1\377\377\375\216\377\377\377\215\214\306>\1\250\325" \
+ "p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305@\211\214\306>" \
+ "\2\214\305@\343\361\316\215\377\377\377\10\352\363\336\214\306>\212\306" \
+ "B\215\307\77\212\307<\215\305>\214\305@\215\307\77\221\214\306>\3\215" \
+ "\305>\214\306>\305\342\240\214\377\377\377\30\377\376\377\313\347\254" \
+ "\215\307\77\214\304=\215\307\77\212\306@\215\307\77\215\306A\214\305" \
+ "@\214\306>\215\307\77\214\306>\215\307\77\214\305@\214\305B\222\313H" \
+ "\377\376\377\377\375\376\377\376\377\377\377\377\377\376\377\377\377" \
+ "\373\376\377\377\377\376\377\211\377\377\377\26\377\377\375\377\376\377" \
+ "\377\377\377\376\377\377\377\377\375\376\377\375\377\377\377\241\323" \
+ "b\215\304D\214\307;\215\307\77\214\305B\215\307\77\214\306<\215\306A" \
+ "\212\307>\215\305@\214\306>\213\310=\215\305@\215\306A\323\352\264\221" \
+ "\377\377\377\11\376\377\377\376\376\374\376\377\377\377\376\374\377\376" \
+ "\377\242\320c\215\307\77\215\306A\214\306>\202\214\305@\203\214\306>" \
+ "\25\214\305@\215\306A\214\305@\215\307\77\214\306>\215\307=\315\345\253" \
+ "\361\370\346\215\307\77\214\306>\212\306@\216\306A\214\306>\215\305>" \
+ "\215\305@\214\305@\212\307>\215\305@\212\306@\215\305<\215\305@\202\214" \
+ "\306>\12\277\337\223\377\377\377\376\377\375\377\376\377\377\377\375" \
+ "\376\377\377\377\377\377\376\376\376\377\377\377\377\377\375\222\377" \
+ "\377\377\1___\202::<\202;;=\202::<\1\266\266\266\250\377\377\377\1\376" \
+ "\376\376\202\377\377\377\1\376\376\376\203\377\377\377\1SSU\203::<\3" \
+ ";;=::<\221\221\223\214\377\377\377\1\316\316\316\205::<\1kkm\210\377" \
+ "\377\377\3\376\376\376\377\377\377\233\233\233\203::<\5;;=::<;;=FFH\364" \
+ "\364\364\210\377\377\377\1\376\376\376\213\377\377\377\2\376\376\376" \
+ "\377\377\377\202\376\376\376\205\377\377\377\1\204\204\206\202::<\1;" \
+ ";=\202::<\3FFF\363\363\363\376\376\376\231\377\377\377\3\346\346\346" \
+ "::<;;=\204::<\3\234\234\234\377\377\377\376\376\376\217\377\377\377\1" \
+ "\234\234\236\205::<\1\234\234\234\234\377\377\377\1\376\376\376\207\377" \
+ "\377\377\3\205\205\207::<;;=\204::<\1\346\346\350\214\377\377\377\1\234" \
+ "\234\234\205::<\1\234\234\236\266\377\377\377\3\214\305@\214\306>\214" \
+ "\305@\205\214\306>\7\214\306<\214\306>\215\307\77\214\305@\214\306>\252" \
+ "\324p\376\377\375\230\377\377\377\203\377\376\377\203\377\377\377\1\376" \
+ "\376\377\211\377\377\377\215\214\306>\1\250\325p\216\377\377\377\1\342" \
+ "\361\320\202\214\306>\1\214\305@\211\214\306>\2\214\305@\343\361\316" \
+ "\215\377\377\377\2\376\377\375\313\347\254\203\214\306>\3\214\305@\216" \
+ "\306\77\211\306=\221\214\306>\3\215\305>\214\306>\305\342\240\214\377" \
+ "\377\377\11\375\376\377\343\361\316\215\305>\215\307\77\213\304A\215" \
+ "\307\77\215\305>\214\306<\214\305@\203\214\306>\14\215\307\77\214\305" \
+ "@\213\304\77\214\305B\322\353\264\377\377\377\377\377\375\377\377\377" \
+ "\377\376\377\376\377\377\377\377\377\376\377\377\210\377\377\377\13\377" \
+ "\377\375\377\377\377\376\377\375\377\376\377\376\376\374\377\377\375" \
+ "\377\377\377\350\364\334\215\304D\215\305>\215\307\77\202\214\305@\202" \
+ "\214\306>\10\214\305@\215\306A\214\306<\215\306C\214\304=\215\307=\212" \
+ "\307<\351\366\332\222\377\377\377\14\377\377\375\377\377\377\377\377" \
+ "\375\304\343\237\214\306>\212\307>\217\307@\214\305@\215\307\77\214\306" \
+ ">\214\305@\215\306A\202\214\306>\5\214\306<\215\305>\211\307>\216\306" \
+ "=\251\323o\202\376\377\377\31\304\341\241\212\306@\215\306A\212\307>" \
+ "\215\307\77\214\306<\216\305C\212\307<\216\306A\214\306<\215\307\77\215" \
+ "\305>\212\307>\216\306A\214\305@\216\306A\341\361\315\377\376\377\377" \
+ "\377\375\376\377\377\377\376\377\376\376\376\377\377\377\377\376\377" \
+ "\376\377\375\222\377\377\377\1\265\265\265\202;;=\204::<\2SSU\364\364" \
+ "\364\203\377\377\377\1\376\376\376\245\377\377\377\1\376\376\376\203" \
+ "\377\377\377\1\316\316\316\203::<\1;;=\202::<\1\302\302\302\214\377\377" \
+ "\377\1\316\316\316\205::<\1kkm\213\377\377\377\1lln\204::<\3;;=::<__" \
+ "a\202\377\377\377\1\376\376\376\206\377\377\377\1\376\376\376\213\377" \
+ "\377\377\1\376\376\376\202\377\377\377\1\376\376\376\203\377\377\377" \
+ "\3\346\346\346::<;;=\204::<\1\234\234\234\234\377\377\377\1\204\204\206" \
+ "\202;;=\202::<\2;;=SSU\221\377\377\377\1\234\234\236\205::<\1\234\234" \
+ "\234\235\377\377\377\1\376\376\376\202\377\377\377\1\376\376\376\202" \
+ "\377\377\377\2\346\346\346::<\202;;=\4""99;;;=::<kkm\215\377\377\377" \
+ "\1\234\234\234\205::<\1\234\234\236\266\377\377\377\3\214\305@\214\306" \
+ ">\214\305@\204\214\306>\10\214\305@\215\306A\215\305@\213\305=\214\306" \
+ ">\215\307\77\252\324p\376\377\377\230\377\377\377\1\376\376\376\205\377" \
+ "\377\377\2\376\377\377\376\377\375\210\377\377\377\215\214\306>\1\250" \
+ "\325p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305@\211\214\306" \
+ ">\2\214\305@\343\361\316\215\377\377\377\10\377\377\375\377\375\376\262" \
+ "\331|\214\305@\215\306A\214\306>\214\305B\215\307\77\221\214\306>\3\215" \
+ "\305>\214\306>\305\342\240\214\377\377\377\10\376\377\375\377\377\377" \
+ "\214\304\77\212\307>\216\306A\214\306>\215\305@\215\307\77\206\214\306" \
+ ">\202\214\305@\3\233\316X\376\376\377\376\377\373\202\377\377\377\3\377" \
+ "\375\376\377\377\375\377\376\377\210\377\377\377\12\377\376\377\376\377" \
+ "\375\377\375\376\376\376\374\377\377\377\377\377\375\377\377\377\257" \
+ "\330x\214\307;\215\307\77\202\214\305@\2\215\307\77\213\305=\202\214" \
+ "\306>\1\215\305>\202\214\306>\5\216\306\77\215\306A\215\305@\376\377" \
+ "\375\377\376\377\220\377\377\377\11\377\377\375\377\377\377\376\377\377" \
+ "\350\364\334\212\307>\213\310\77\216\306\77\212\307>\214\305@\202\214" \
+ "\306>%\215\306A\214\306>\213\305=\214\306>\215\307\77\215\305@\211\307" \
+ ">\223\311M\363\367\350\376\377\375\377\377\377\377\377\375\242\320d\212" \
+ "\307<\215\306A\214\305@\212\306@\215\306A\214\306>\212\307>\215\307\77" \
+ "\217\304@\211\310<\215\305>\213\310\77\212\307>\214\306>\234\315W\367" \
+ "\372\363\376\377\377\377\376\377\377\377\375\377\377\377\376\376\376" \
+ "\377\377\375\377\377\377\376\377\375\222\377\377\377\1RRR\202::<\203" \
+ ";;=\2::<\234\234\236\204\377\377\377\1\376\376\376\246\377\377\377\3" \
+ "\376\376\376\377\377\377kkk\202::<\4;;=99;;;=FFH\215\377\377\377\1\316" \
+ "\316\316\205::<\1kkm\211\377\377\377\5\376\376\376\377\377\377\363\363" \
+ "\363SSU;;=\202::<\202;;=\2""99;\222\222\222\207\377\377\377\3\376\376" \
+ "\376\377\377\377\376\376\376\214\377\377\377\1\376\376\376\204\377\377" \
+ "\377\3\204\204\204;;=99;\202;;=\3::<FFH\363\363\363\230\377\377\377\1" \
+ "\376\376\376\202\377\377\377\2\376\376\376\317\317\317\203::<\4;;=::" \
+ "<;;=\266\266\266\220\377\377\377\1\234\234\236\205::<\1\234\234\234\243" \
+ "\377\377\377\2\204\204\204;;=\204::<\2""99;\264\264\264\215\377\377\377" \
+ "\1\234\234\234\205::<\1\234\234\236\266\377\377\377\3\214\305@\214\306" \
+ ">\214\305@\204\214\306>\2\214\305@\214\306>\203\215\306A\2\215\307\77" \
+ "\251\323q\231\377\377\377\203\377\377\375\202\377\377\377\1\377\375\376" \
+ "\202\377\376\377\210\377\377\377\215\214\306>\1\250\325p\216\377\377" \
+ "\377\1\342\361\320\202\214\306>\1\214\305@\211\214\306>\2\214\305@\343" \
+ "\361\316\215\377\377\377\7\376\376\376\377\377\375\366\373\364\233\316" \
+ "X\215\305@\215\307=\215\305>\222\214\306>\3\215\305>\214\306>\305\342" \
+ "\240\216\377\377\377\6\243\322b\214\306>\215\305@\215\307\77\215\305" \
+ "@\215\306A\203\214\306>\1\215\307\77\202\214\306>\202\215\307\77\2\214" \
+ "\306>\315\346\254\202\377\377\377\4\377\376\375\376\377\375\376\376\377" \
+ "\377\376\377\212\377\377\377\7\377\377\375\377\376\377\377\377\373\377" \
+ "\377\375\327\356\304\214\306>\215\307\77\202\214\305@\203\214\306>\12" \
+ "\215\307\77\214\306>\214\305@\216\306\77\214\306<\214\304\77\212\307" \
+ ">\260\331{\376\377\375\377\376\377\220\377\377\377\13\376\377\377\377" \
+ "\377\375\370\373\362\233\315Z\216\306A\214\305@\212\307>\215\306A\214" \
+ "\306>\214\305@\215\306A\202\214\306>\6\215\307\77\214\305@\214\305B\214" \
+ "\306>\215\307=\313\347\254\202\377\377\377\23\377\376\377\377\377\375" \
+ "\350\364\334\212\307>\220\306=\214\305@\216\306=\214\306>\214\305@\214" \
+ "\306>\212\306@\215\305>\212\306@\215\307\77\212\307>\215\307\77\214\305" \
+ "@\212\306@\277\340\221\202\377\377\377\1\377\377\375\203\377\377\377" \
+ "\2\377\376\377\377\377\375\220\377\377\377\4\376\376\376\377\377\377" \
+ "\265\265\265::<\202;;=\5""99;::<;;=99;\317\317\317\250\377\377\377\1" \
+ "\376\376\376\202\377\377\377\2\316\316\31699;\202::<\202;;=\2::<\221" \
+ "\221\223\215\377\377\377\1\316\316\316\205::<\1kkm\207\377\377\377\1" \
+ "\376\376\376\204\377\377\377\1\332\332\334\203::<\5;;=::<;;=99;\302\302" \
+ "\302\202\377\377\377\1\376\376\376\216\377\377\377\1\376\376\376\202" \
+ "\377\377\377\1\376\376\376\204\377\377\377\4\362\362\362FFH::<;;=\202" \
+ "::<\2;;=\221\221\223\204\377\377\377\202\376\376\376\224\377\377\377" \
+ "\1\376\376\376\203\377\377\377\1kkm\202;;=\203::<\1SSU\220\377\377\377" \
+ "\1\234\234\236\205::<\1\234\234\234\240\377\377\377\3\376\376\376\377" \
+ "\377\377\315\315\315\203::<\1;;=\202::<\1SSU\216\377\377\377\1\234\234" \
+ "\234\205::<\1\234\234\236\266\377\377\377\3\214\305@\214\306>\214\305" \
+ "@\204\214\306>\3\215\306A\214\306<\215\307=\202\214\305@\3\214\306>\253" \
+ "\324n\377\377\375\230\377\377\377\2\375\376\377\376\376\376\203\377\377" \
+ "\377\1\377\377\375\212\377\377\377\215\214\306>\1\250\325p\216\377\377" \
+ "\377\1\342\361\320\202\214\306>\1\214\305@\211\214\306>\2\214\305@\343" \
+ "\361\316\220\377\377\377\5\350\365\333\214\306>\214\305@\214\306>\215" \
+ "\306A\221\214\306>\3\215\305>\214\306>\305\342\240\215\377\377\377\7" \
+ "\377\377\375\277\337\224\212\306@\215\305@\212\307>\215\306A\215\307" \
+ "\77\203\214\306>\202\215\307\77\203\214\306>\3\214\306<\214\306>\351" \
+ "\363\330\202\377\377\377\3\376\376\376\374\377\377\376\377\377\211\377" \
+ "\377\377\1\376\377\377\202\377\377\377\7\375\376\377\351\365\337\223" \
+ "\311M\215\307=\214\305B\214\305@\215\307\77\202\214\306>\12\215\306A" \
+ "\214\305@\214\306>\212\307>\215\306A\214\306>\215\307=\213\310\77\316" \
+ "\345\255\376\377\377\221\377\377\377\7\376\377\377\377\377\375\300\337" \
+ "\223\216\306A\213\305=\215\307=\215\305>\202\214\306>\1\215\307\77\203" \
+ "\214\306>\202\214\305@\5\215\307\77\213\307A\251\322r\377\377\377\377" \
+ "\377\375\202\377\377\377\14\377\376\377\377\377\377\305\342\237\212\307" \
+ "<\220\305\77\214\306>\212\306@\215\306A\214\306<\214\305@\214\306<\216" \
+ "\305C\202\214\306>\7\215\305<\214\306>\215\305>\214\305@\342\362\316" \
+ "\377\377\377\377\377\375\202\377\377\377\3\376\377\377\377\376\377\376" \
+ "\376\376\221\377\377\377\3\376\376\376\377\377\377___\205::<\4;;=FFH" \
+ "\363\363\363\377\377\377\202\376\376\376\246\377\377\377\3\363\363\363" \
+ "SSU;;=\204::<\4;;=\345\345\345\377\377\377\376\376\376\213\377\377\377" \
+ "\1\316\316\316\205::<\1kkm\211\377\377\377\1\376\376\376\203\377\377" \
+ "\377\4\264\264\266;;=99;::<\202;;=\3::<GGI\332\332\332\206\377\377\377" \
+ "\1\376\376\376\215\377\377\377\1\376\376\376\203\377\377\377\3\234\234" \
+ "\236::<;;=\204::<\2\346\346\346\376\376\376\202\377\377\377\1\376\376" \
+ "\376\202\377\377\377\202\376\376\376\220\377\377\377\1\376\376\376\204" \
+ "\377\377\377\2\376\376\376\317\317\317\204::<\3;;=::<\265\265\265\217" \
+ "\377\377\377\1\234\234\236\205::<\1\234\234\234\235\377\377\377\1\376" \
+ "\376\376\203\377\377\377\2\363\363\363TTV\203::<\5;;=99;::<\235\235\235" \
+ "\376\376\376\215\377\377\377\1\234\234\234\205::<\1\234\234\236\266\377" \
+ "\377\377\3\214\305@\214\306>\214\305@\204\214\306>\2\212\306@\213\310" \
+ "\77\202\214\305@\3\215\307\77\214\306<\251\323o\231\377\377\377\4\377" \
+ "\376\377\377\377\375\377\377\377\376\376\377\214\377\377\377\215\214" \
+ "\306>\1\250\325p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305" \
+ "@\211\214\306>\2\214\305@\343\361\316\215\377\377\377\1\377\377\375\203" \
+ "\377\377\377\4\323\353\267\212\307<\214\306<\212\306B\221\214\306>\3" \
+ "\215\305>\214\306>\305\342\240\214\377\377\377\7\376\377\377\377\376" \
+ "\377\350\365\331\215\307\77\215\305>\214\306>\212\307>\202\214\306>\1" \
+ "\215\307\77\205\214\306>\11\215\307\77\213\304A\212\307>\222\312M\343" \
+ "\361\316\376\376\377\377\376\377\377\377\377\377\375\377\210\377\377" \
+ "\377\1\377\376\377\202\377\377\375\12\377\376\377\350\364\334\220\313" \
+ "K\216\306=\215\305<\215\307\77\214\306>\213\305=\214\306>\215\306A\202" \
+ "\214\306>\1\214\305@\202\212\307>\6\214\305@\215\306C\215\305>\360\370" \
+ "\351\377\377\373\376\377\377\221\377\377\377\7\345\360\322\215\305@\214" \
+ "\305@\215\307=\214\304=\213\310=\215\305>\202\214\306>\2\213\305=\215" \
+ "\307\77\202\214\305@\7\215\307\77\214\307;\214\305@\363\367\346\376\377" \
+ "\377\377\377\373\377\376\377\202\377\377\377\30\376\377\375\377\376\377" \
+ "\241\321a\216\306\77\212\306@\213\310=\215\305@\213\307A\217\304>\215" \
+ "\305@\214\306<\216\306A\215\306A\212\307>\214\306<\214\306>\212\307<" \
+ "\233\314W\366\373\365\377\377\375\377\377\377\377\376\377\373\377\377" \
+ "\377\376\377\224\377\377\377\1\317\317\317\205::<\4;;=::<``b\362\362" \
+ "\362\247\377\377\377\2\376\376\376\221\221\221\206::<\3\204\204\206\377" \
+ "\377\377\376\376\376\214\377\377\377\1\316\316\316\205::<\1kkm\212\377" \
+ "\377\377\6\376\376\376\377\377\377\376\376\376\377\377\377\203\203\203" \
+ ";;=\205::<\3``b\363\363\363\376\376\376\216\377\377\377\1\376\376\376" \
+ "\206\377\377\377\3\363\363\363FFH;;=\203::<\2;;=\203\203\203\203\377" \
+ "\377\377\3\376\376\376\377\377\377\376\376\376\225\377\377\377\1\376" \
+ "\376\376\204\377\377\377\3kkk::<<<>\202::<\2;;=kkm\217\377\377\377\1" \
+ "\234\234\236\205::<\1\234\234\234\236\377\377\377\4\376\376\376\377\377" \
+ "\377\376\376\376kkk\202::<\5;;=::<99;;;=TTV\202\377\377\377\1\376\376" \
+ "\376\214\377\377\377\1\234\234\234\205::<\1\234\234\236\266\377\377\377" \
+ "\3\214\305@\214\306>\214\305@\204\214\306>\10\214\306<\214\306>\214\305" \
+ "@\214\306>\215\307\77\214\306>\252\324r\376\377\377\230\377\377\377\1" \
+ "\377\377\375\202\377\377\377\2\377\377\375\376\376\374\203\377\376\377" \
+ "\210\377\377\377\215\214\306>\1\250\325p\216\377\377\377\1\342\361\320" \
+ "\202\214\306>\1\214\305@\211\214\306>\2\214\305@\343\361\316\215\377" \
+ "\377\377\10\375\377\374\377\376\377\375\377\376\376\376\377\377\377\377" \
+ "\270\333\207\214\305@\215\307\77\221\214\306>\3\215\305>\214\306>\305" \
+ "\342\240\214\377\377\377\12\375\376\377\377\376\377\376\377\377\234\313" \
+ "Y\215\306A\214\305@\212\307>\214\305@\214\306>\215\307\77\206\214\306" \
+ ">\7\215\307\77\214\306>\215\305@\213\310\77\304\343\240\371\372\364\376" \
+ "\377\377\212\377\377\377\10\376\377\377\377\376\377\315\345\251\223\311" \
+ "M\214\306>\216\306\77\214\305B\214\306<\202\214\306>\15\215\306A\214" \
+ "\305@\214\306>\215\307\77\214\305@\214\306<\214\305@\215\307\77\213\304" \
+ "A\263\330{\377\377\377\376\376\376\377\377\375\220\377\377\377\7\370" \
+ "\373\364\232\315V\216\306=\212\311=\214\306>\216\306A\213\307A\202\214" \
+ "\305@\202\214\306>\202\214\305@\10\215\307\77\215\305>\215\304D\304\341" \
+ "\237\376\377\377\377\376\377\376\376\377\377\377\375\202\377\376\377" \
+ "\24\376\377\377\377\377\373\350\365\333\215\305>\214\306<\214\306>\212" \
+ "\306@\215\307\77\213\305=\215\305@\215\307\77\214\306>\215\305>\215\306" \
+ "A\211\305A\215\305@\214\305B\213\310=\262\327z\374\377\377\202\377\377" \
+ "\377\2\377\377\375\373\377\376\225\377\377\377\1\221\221\223\203::<\6" \
+ ";;=99;;;=::<``b\362\362\362\246\377\377\377\2\265\265\265:::\202::<\1" \
+ ";;=\203::<\1\346\346\350\216\377\377\377\1\316\316\316\205::<\1kkm\216" \
+ "\377\377\377\6\363\363\363__a::<;;=::<;;=\202::<\1\204\204\204\204\377" \
+ "\377\377\1\376\376\376\221\377\377\377\1\234\234\234\204::<\3;;=::<\347" \
+ "\347\347\202\377\377\377\1\376\376\376\205\377\377\377\1\376\376\376" \
+ "\225\377\377\377\3\376\376\376\377\377\377\265\265\265\202::<\202;;=" \
+ "\3::<;;=\316\316\316\216\377\377\377\1\234\234\236\205::<\1\234\234\234" \
+ "\240\377\377\377\2\204\204\204:::\206::<\1\301\301\303\217\377\377\377" \
+ "\1\234\234\234\205::<\1\234\234\236\266\377\377\377\3\214\305@\214\306" \
+ ">\214\305@\205\214\306>\7\214\305@\216\306A\215\307=\213\304\77\213\307" \
+ "A\242\321a\345\356\317\230\342\362\316\7\341\361\315\342\361\322\342" \
+ "\361\320\343\361\315\345\360\322\365\373\357\376\377\377\211\377\377" \
+ "\377\215\214\306>\1\250\325p\216\377\377\377\1\342\361\320\202\214\306" \
+ ">\1\214\305@\211\214\306>\2\214\305@\343\361\316\216\377\377\377\7\376" \
+ "\377\375\377\377\375\377\377\377\377\376\377\371\374\365\242\322d\215" \
+ "\306A\221\214\306>\3\215\305>\214\306>\305\342\240\214\377\377\377\10" \
+ "\377\377\375\377\377\377\377\377\373\312\346\253\215\307=\212\307>\214" \
+ "\305B\216\306=\206\214\306>\202\214\305@\10\214\306>\212\307>\216\306" \
+ "\77\214\306>\212\307>\233\316W\306\340\237\361\370\346\210\377\377\377" \
+ "\12\361\370\350\314\345\253\233\314W\214\306>\213\310\77\215\305<\214" \
+ "\305@\212\307<\215\306A\214\305@\203\214\306>\202\214\305@\202\214\306" \
+ ">\4\216\306A\212\306@\213\310\77\333\356\301\202\377\377\377\1\377\377" \
+ "\375\220\377\377\377\26\270\332\204\215\306A\212\306B\214\306>\213\307" \
+ "A\215\305@\214\306<\214\306>\215\306A\214\306<\215\307\77\214\305B\215" \
+ "\307\77\214\307;\215\304D\241\323b\377\377\375\376\377\377\377\377\377" \
+ "\377\377\373\377\377\377\376\377\377\202\377\377\375\16\377\377\377\376" \
+ "\377\377\277\337\224\214\305@\215\306A\214\306>\215\305>\212\310\77\214" \
+ "\305@\215\307\77\212\307>\214\305B\216\306=\215\306A\202\214\306<\6\214" \
+ "\306>\213\307C\331\356\305\377\376\377\377\377\373\376\376\376\227\377" \
+ "\377\377\3__a::<;:\77\205::<\2__a\363\363\363\203\377\377\377\1\376\376" \
+ "\376\213\377\377\377\1\376\376\376\203\377\377\377\3\376\376\376\377" \
+ "\377\377\376\376\376\213\377\377\377\1\376\376\376\202\377\377\377\1" \
+ "\265\265\267\205::<\3;;=:::\234\234\234\217\377\377\377\1\316\316\316" \
+ "\205::<\1kkm\217\377\377\377\4\332\332\332GGI::<;;=\204::<\1\250\250" \
+ "\252\225\377\377\377\1FFH\205::<\1\204\204\204\242\377\377\377\1TTV\205" \
+ "::<\4lln\376\376\376\377\377\377\376\376\376\203\377\377\377\1\376\376" \
+ "\376\207\377\377\377\1\234\234\236\205::<\1\235\235\237\221\377\377\377" \
+ "\1\376\376\376\202\377\377\377\1\376\376\376\202\377\377\377\202\376" \
+ "\376\376\205\377\377\377\3\363\363\365\204\204\206;;=\204::<\3;;=:::" \
+ "xxx\220\377\377\377\1\234\234\234\203::<\3;;=::<\234\234\234\204\377" \
+ "\377\377\1\376\376\376\261\377\377\377\3\214\305@\214\306>\214\305@\250" \
+ "\214\306>\2\215\307\77\342\362\316\212\377\377\377\215\214\306>\1\250" \
+ "\325p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305@\211\214\306" \
+ ">\2\214\305@\343\361\316\216\377\377\377\11\375\376\377\377\376\377\377" \
+ "\377\375\376\377\377\377\376\377\351\365\335\223\311M\212\307<\214\306" \
+ ">\202\216\306A\4\212\307<\215\306A\215\305>\215\307\77\211\214\306>\3" \
+ "\215\305>\214\306>\305\342\240\214\377\377\377\20\377\376\377\377\377" \
+ "\375\377\376\377\365\374\364\223\312J\217\304>\215\307\77\212\307;\215" \
+ "\306A\214\305B\214\305@\215\307\77\214\306<\213\310\77\214\305@\215\305" \
+ ">\210\214\306>\10\234\315Z\257\327~\304\343\235\306\340\237\307\341\240" \
+ "\304\343\237\257\327\177\241\321a\210\214\306>\20\217\304>\215\306A\212" \
+ "\306@\212\307>\213\305;\216\306A\213\305=\215\306C\211\310<\216\306A" \
+ "\214\306>\234\314V\377\377\377\375\377\374\376\377\377\377\376\377\211" \
+ "\377\377\377\7\377\376\377\376\377\375\376\377\377\376\377\375\377\376" \
+ "\377\377\377\377\333\355\303\210\214\306>\10\215\306A\214\305@\216\306" \
+ "=\214\306>\215\307\77\214\305@\215\307\77\352\364\334\211\377\377\377" \
+ "\6\377\376\377\367\375\363\232\315V\215\307\77\214\306>\214\305@\212" \
+ "\214\306>\6\212\307>\223\311M\366\373\364\377\376\377\377\377\377\376" \
+ "\377\373\221\377\377\377\1\376\376\376\204\377\377\377\2\346\346\346" \
+ "FFH\203::<\1""99;\203::<\2__a\332\332\332\211\377\377\377\1\376\376\376" \
+ "\203\377\377\377\1\376\376\376\205\377\377\377\1\376\376\376\206\377" \
+ "\377\377\1\376\376\376\207\377\377\377\1\265\265\267\202::<\1;;=\204" \
+ "::<\2```\376\376\376\217\377\377\377\1\316\316\316\205::<\1kkm\216\377" \
+ "\377\377\4\376\376\376\377\377\377\301\301\301;;=\205::<\2;;=\331\331" \
+ "\331\202\377\377\377\3\376\376\376\377\377\377\376\376\376\216\377\377" \
+ "\377\1\265\265\267\205::<\3;;=\332\332\332\376\376\376\241\377\377\377" \
+ "\1\266\266\270\205::<\2""99;\316\316\320\215\377\377\377\1\234\234\236" \
+ "\203::<\5;;=::<\234\234\234\377\377\377\376\376\376\220\377\377\377\1" \
+ "\376\376\376\206\377\377\377\1\376\376\376\203\377\377\377\2\346\346" \
+ "\346``b\202::<\2""99;;;=\203::<\4FFF\363\363\363\377\377\377\376\376" \
+ "\376\216\377\377\377\1\234\234\234\204::<\3;;=\234\234\234\376\376\376" \
+ "\265\377\377\377\3\214\305@\214\306>\214\305@\250\214\306>\2\215\307" \
+ "\77\342\362\316\212\377\377\377\215\214\306>\1\250\325p\216\377\377\377" \
+ "\1\342\361\320\202\214\306>\1\214\305@\211\214\306>\2\214\305@\343\361" \
+ "\316\215\377\377\377\16\377\376\377\376\377\377\377\376\377\377\377\377" \
+ "\376\377\377\377\376\377\375\377\374\323\353\267\215\305<\215\306C\215" \
+ "\305<\213\306:\213\310\77\212\306@\202\214\305@\211\214\306>\3\215\305" \
+ ">\214\306>\305\342\240\215\377\377\377\4\376\377\377\377\377\375\377" \
+ "\376\377\305\342\242\202\214\305@\5\216\306A\214\306>\215\307=\215\307" \
+ "\77\213\304A\202\214\305@\2\214\306>\212\306@\210\214\306>\7\214\306" \
+ "<\215\307=\215\307\77\213\305=\214\306>\215\307\77\213\305=\211\214\306" \
+ ">\11\215\306A\215\305>\212\307;\213\304\77\215\306A\211\306=\215\306" \
+ "A\212\307<\216\306A\202\215\307\77\4\343\361\320\376\377\375\377\377" \
+ "\375\376\376\377\212\377\377\377\1\377\376\377\202\377\377\377\4\377" \
+ "\376\377\376\377\377\367\375\363\225\311J\210\214\306>\10\215\307=\213" \
+ "\310\77\214\305@\216\306\77\214\305@\212\307>\307\341\240\376\377\375" \
+ "\210\377\377\377\5\377\376\377\374\377\375\377\376\377\343\361\320\212" \
+ "\306@\202\214\306>\1\213\310\77\210\214\306>\10\215\306A\215\305>\214" \
+ "\305@\260\327z\377\376\374\374\377\377\377\377\377\377\376\377\226\377" \
+ "\377\377\1\332\332\332\210::<\2GGI\250\250\250\223\377\377\377\3\376" \
+ "\376\376\377\377\377\376\376\376\202\377\377\377\1\376\376\376\202\377" \
+ "\377\377\1\376\376\376\204\377\377\377\2\250\250\252;;=\204::<\202;;" \
+ "=\2EEG\331\331\331\220\377\377\377\1\316\316\316\205::<\1kkm\221\377" \
+ "\377\377\5\222\222\224::<;;=::<;;=\202::<\5SSU\364\364\364\376\376\376" \
+ "\377\377\377\376\376\376\216\377\377\377\2\376\376\376TTV\203::<\4;;" \
+ "=99;lln\376\376\376\243\377\377\377\1TTV\204::<\5;;=\204\204\206\376" \
+ "\376\376\377\377\377\376\376\376\212\377\377\377\1\234\234\236\202::" \
+ "<\1;;=\202::<\1\234\234\234\215\377\377\377\1\376\376\376\202\377\377" \
+ "\377\1\376\376\376\212\377\377\377\6\376\376\376\250\250\252FFH99;::" \
+ "<;;=\205::<\1\316\316\316\221\377\377\377\1\234\234\234\203::<\3;;=:" \
+ ":<\234\234\236\266\377\377\377\3\214\305@\214\306>\214\305@\250\214\306" \
+ ">\2\215\307\77\342\362\316\212\377\377\377\215\214\306>\1\250\325p\216" \
+ "\377\377\377\1\342\361\320\202\214\306>\1\214\305@\211\214\306>\2\214" \
+ "\305@\343\361\316\215\377\377\377\3\377\376\377\376\377\375\376\377\377" \
+ "\202\377\377\377\13\377\377\375\377\376\377\376\376\374\271\332\211\215" \
+ "\306A\211\306;\216\306A\212\307>\213\307A\215\306A\212\307>\211\214\306" \
+ ">\3\215\305>\214\306>\305\342\240\214\377\377\377\20\376\377\375\377" \
+ "\377\377\377\377\375\377\377\377\371\370\364\233\316U\214\306>\214\305" \
+ "@\215\306A\214\306>\214\305@\215\307=\214\306>\215\305@\215\304B\213" \
+ "\310=\210\214\306>\3\215\305@\214\306>\213\305=\202\213\310\77\3\214" \
+ "\306>\215\307\77\215\305@\210\214\306>\20\212\306@\212\307;\216\306\77" \
+ "\215\307\77\212\306@\214\306<\215\305>\215\307\77\220\305\77\211\307" \
+ ">\263\330{\377\376\377\377\377\375\376\377\377\377\377\377\376\376\376" \
+ "\211\377\377\377\7\377\377\373\377\377\377\377\375\376\377\377\377\377" \
+ "\377\375\257\330|\213\310\77\211\214\306>\6\215\306C\211\306=\214\305" \
+ "@\214\306>\242\322e\377\377\375\212\377\377\377\7\376\377\377\377\377" \
+ "\375\377\375\376\277\337\224\216\307B\212\307>\214\305@\210\214\306>" \
+ "\2\214\305@\216\306\77\202\212\307>\4\332\360\302\376\376\374\376\376" \
+ "\376\377\376\377\227\377\377\377\1\266\266\266\202::<\1;;=\202::<\2;" \
+ ";=::<\202;;=\2kkm\346\346\350\202\377\377\377\1\376\376\376\207\377\377" \
+ "\377\1\376\376\376\203\377\377\377\5\376\376\376\377\377\377\376\376" \
+ "\376\377\377\377\376\376\376\202\377\377\377\3\376\376\376\377\377\377" \
+ "\376\376\376\204\377\377\377\2\364\364\364yy{\203::<\2;;=99;\203::<\3" \
+ "\265\265\267\377\377\377\376\376\376\217\377\377\377\1\316\316\316\205" \
+ "::<\1kkm\222\377\377\377\1kkm\203::<\1;;=\202::<\5kkm\377\377\377\376" \
+ "\376\376\377\377\377\376\376\376\212\377\377\377\5\376\376\376\377\377" \
+ "\377\376\376\376\265\265\267;;=\204::<\2;;=\315\315\315\244\377\377\377" \
+ "\11\234\234\234::<99;;;=::<;;=::<\347\347\347\376\376\376\213\377\377" \
+ "\377\1\234\234\236\204::<\2;;=\233\233\233\217\377\377\377\1\376\376" \
+ "\376\206\377\377\377\6\376\376\376\377\377\377\376\376\376\377\377\377" \
+ "\265\265\265TTT\202::<\202;;=\203::<\3;;=::<\266\266\270\202\377\377" \
+ "\377\1\376\376\376\217\377\377\377\1\234\234\234\204::<\4;;=\235\235" \
+ "\237\377\377\377\376\376\376\224\377\377\377\1\376\376\376\203\377\377" \
+ "\377\1\376\376\376\233\377\377\377\3\214\305@\214\306>\214\305@\250\214" \
+ "\306>\2\215\307\77\342\362\316\212\377\377\377\215\214\306>\1\250\325" \
+ "p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305@\211\214\306>" \
+ "\2\214\305@\343\361\316\215\377\377\377\202\377\377\375\16\377\377\377" \
+ "\377\377\375\377\377\377\376\377\375\376\376\374\377\376\377\375\377" \
+ "\376\241\322_\215\306A\212\306B\215\305>\215\307\77\214\306<\214\305" \
+ "B\211\214\306>\3\215\305>\214\306>\305\342\240\214\377\377\377\1\377" \
+ "\376\377\202\377\377\375\15\376\377\377\377\375\376\340\361\317\214\306" \
+ ">\212\307>\214\306>\215\307\77\214\306>\212\307<\215\307\77\215\305>" \
+ "\216\306=\213\305=\210\214\306>\1\212\307>\202\214\305@\202\214\306>" \
+ "\3\214\305@\215\306A\212\307>\210\214\306>\20\212\307>\213\304\77\214" \
+ "\306>\211\310<\214\306>\216\306A\212\306@\215\305@\214\306>\223\313N" \
+ "\367\372\363\376\377\377\377\377\377\377\376\377\376\377\373\377\376" \
+ "\377\212\377\377\377\202\376\377\377\3\377\375\376\324\353\265\215\306" \
+ "A\211\214\306>\7\215\305>\213\305=\215\307\77\215\306A\212\307>\351\363" \
+ "\333\377\377\375\211\377\377\377\10\377\376\377\375\377\376\376\377\377" \
+ "\377\376\377\370\373\362\233\314W\215\307\77\215\305<\210\214\306>\1" \
+ "\215\307\77\202\214\306>\4\214\306<\225\310O\360\366\350\377\376\377" \
+ "\221\377\377\377\3\376\376\376\377\377\377\376\376\376\205\377\377\377" \
+ "\1\266\266\266\202::<\4;;=99;::<;;=\202::<\4;;=::<\204\204\206\346\346" \
+ "\350\207\377\377\377\1\376\376\376\206\377\377\377\202\376\376\376\202" \
+ "\377\377\377\1\376\376\376\203\377\377\377\1\376\376\376\202\377\377" \
+ "\377\3\251\251\251FFF99;\202::<\1""99;\202::<\5;;=::<\234\234\236\377" \
+ "\377\377\376\376\376\220\377\377\377\1\316\316\316\205::<\1kkm\222\377" \
+ "\377\377\11\363\363\363GGI99;::<99;;;=::<;;=\234\234\234\214\377\377" \
+ "\377\1\376\376\376\203\377\377\377\1SSU\202::<\1;;=\202::<\1kkm\245\377" \
+ "\377\377\5\362\362\362GGI;;=::<;;=\202::<\1\204\204\206\206\377\377\377" \
+ "\1\376\376\376\205\377\377\377\1\234\234\236\203::<\3""99;::<\234\234" \
+ "\234\223\377\377\377\1\376\376\376\203\377\377\377\3\331\331\331\222" \
+ "\222\222SSU\203::<\2;;=::<\202;;=\4::<;;=::<\265\265\267\202\377\377" \
+ "\377\1\376\376\376\203\377\377\377\1\376\376\376\214\377\377\377\1\234" \
+ "\234\234\205::<\1\234\234\236\203\377\377\377\1\376\376\376\223\377\377" \
+ "\377\1\376\376\376\236\377\377\377\3\214\305@\214\306>\214\305@\250\214" \
+ "\306>\2\215\307\77\342\362\316\212\377\377\377\215\214\306>\1\250\325" \
+ "p\216\377\377\377\1\342\361\320\202\214\306>\1\214\305@\211\214\306>" \
+ "\2\214\305@\343\361\316\216\377\377\377\17\377\376\377\377\377\377\376" \
+ "\376\376\377\376\377\377\377\375\376\377\377\375\377\376\377\377\377" \
+ "\363\367\350\222\312K\214\305@\213\310\77\214\304\77\215\307\77\216\306" \
+ "A\211\214\306>\3\215\305>\214\306>\305\342\240\214\377\377\377\14\377" \
+ "\376\377\376\377\375\376\377\377\377\376\377\376\377\377\376\377\375" \
+ "\307\342\237\214\305@\214\306<\215\304D\214\306>\214\305D\202\212\307" \
+ "<\2\212\307>\213\307A\210\214\306>\3\215\307\77\214\306>\215\307\77\202" \
+ "\214\305@\213\214\306>\12\213\305;\215\306A\212\306@\214\306>\213\307" \
+ "C\212\307>\215\305>\212\307>\215\305>\333\356\301\202\377\377\377\3\377" \
+ "\377\375\377\377\377\377\376\377\211\377\377\377\10\376\377\375\377\377" \
+ "\375\376\377\375\374\377\375\362\371\347\225\311M\215\307\77\215\305" \
+ "<\210\214\306>\2\214\305@\216\306=\202\212\306@\2\305\342\237\377\375" \
+ "\376\212\377\377\377\1\376\376\374\203\377\377\377\4\376\376\376\337" \
+ "\363\316\215\306C\215\305<\211\214\306>\1\215\307\77\202\214\305@\4\214" \
+ "\306<\253\324n\375\377\374\377\377\375\224\377\377\377\1\376\376\376" \
+ "\204\377\377\377\2\301\301\301FFH\202::<\2;;=99;\202;;=\2::<;;=\202:" \
+ ":<\2\204\204\206\316\316\320\207\377\377\377\1\376\376\376\203\377\377" \
+ "\377\1\376\376\376\206\377\377\377\6\376\376\376\377\377\377\364\364" \
+ "\364\265\265\267SSU::<\202;;=\202::<\5;;=::<;;=::<\204\204\204\223\377" \
+ "\377\377\1\316\316\316\205::<\1kkm\223\377\377\377\11\315\315\315;;=" \
+ "::<;;=::<;;=::<99;\302\302\302\216\377\377\377\5\301\301\303::<;;=::" \
+ "<;;=\202::<\2\316\316\316\377\377\377\202\376\376\376\241\377\377\377" \
+ "\14\376\376\376\377\377\377\234\234\234;;=::<;;=::<;;=::<\347\347\351" \
+ "\377\377\377\376\376\376\211\377\377\377\1\234\234\236\203::<\3;;=::" \
+ "<\234\234\236\216\377\377\377\202\376\376\376\1\377\377\377\202\316\316" \
+ "\316\6\250\250\250\234\234\234jjjFFF;;=99;\202;;=\2::<;;=\202::<\5<<" \
+ ">99;;;=::<\265\265\267\204\377\377\377\1\376\376\376\217\377\377\377" \
+ "\1\234\234\234\204::<\2;;=\234\234\236\202\377\377\377\1\376\376\376" \
+ "\223\377\377\377\1\376\376\376\202\377\377\377\1\376\376\376\234\377" \
+ "\377\377\3\214\305@\214\306>\214\305@\250\214\306>\2\215\307\77\342\362" \
+ "\316\212\377\377\377\215\214\306>\1\250\325p\216\377\377\377\1\342\361" \
+ "\320\202\214\306>\1\214\305@\211\214\306>\2\214\305@\343\361\316\215" \
+ "\377\377\377\202\377\376\377\16\377\377\375\376\377\377\377\377\377\377" \
+ "\377\375\377\376\377\376\376\376\377\376\377\377\377\377\333\354\302" \
+ "\212\307>\213\310\77\214\306<\213\310=\215\305@\211\214\306>\3\215\305" \
+ ">\214\306>\305\342\240\214\377\377\377\1\377\376\377\202\376\377\377" \
+ "\202\377\377\375\13\376\377\377\377\375\376\271\333\205\215\305>\214" \
+ "\306>\212\307>\214\306>\215\306A\214\306>\212\306@\214\305@\210\214\306" \
+ ">\3\214\305@\215\307\77\214\306>\202\212\307>\3\214\306>\215\307\77\215" \
+ "\306A\210\214\306>\4\216\306A\211\306=\214\306<\216\306A\202\212\307" \
+ ">\202\215\306A\10\322\352\270\377\377\375\376\376\374\377\377\377\376" \
+ "\377\377\377\376\377\377\377\375\376\377\377\210\377\377\377\10\377\377" \
+ "\375\377\377\377\377\376\377\374\376\373\250\325n\216\306\77\212\307" \
+ ">\214\305B\210\214\306>\202\212\307>\6\214\305@\242\322d\376\376\374" \
+ "\377\377\375\375\377\376\377\376\377\210\377\377\377\10\376\377\377\377" \
+ "\377\375\377\375\376\377\377\375\375\376\377\376\377\375\270\333\207" \
+ "\211\310<\210\214\306>\10\214\304=\216\307B\214\306>\212\307>\216\306" \
+ "A\215\307\77\313\350\250\376\376\377\221\377\377\377\1\376\376\376\203" \
+ "\377\377\377\1\376\376\376\204\377\377\377\7\332\332\332RRT;;=::<;;=" \
+ "::<;;=\202::<\1;;=\203::<\3RRT\221\221\223\317\317\321\214\377\377\377" \
+ "\11\376\376\376\377\377\377\364\364\364\301\301\301\204\204\206EEG;;" \
+ "=99;;;=\204::<\1""99;\202::<\1\251\251\251\207\377\377\377\1\376\376" \
+ "\376\214\377\377\377\1\316\316\316\205::<\1kkm\224\377\377\377\1\247" \
+ "\247\247\203::<\5;;=::<;;=FFH\345\345\345\214\377\377\377\2\376\376\376" \
+ "kkm\205::<\1SSU\202\377\377\377\1\376\376\376\244\377\377\377\2\363\363" \
+ "\363FFH\204::<\2;;=\221\221\223\213\377\377\377\1\234\234\236\204::<" \
+ "\4;;=SSUkkmlln\213kkm\5;;=::<;;=::<;;=\204::<\2;;=99;\202;;=\2::<;;=" \
+ "\202::<\7;;=99;::<FFH\301\301\301\377\377\377\376\376\376\223\377\377" \
+ "\377\1\234\234\234\205::<\1SSU\202kkm\1lln\223kkm\1lln\205kkm\1\332\332" \
+ "\334\231\377\377\377\3\214\305@\214\306>\214\305@\250\214\306>\2\215" \
+ "\307\77\342\362\316\212\377\377\377\215\214\306>\1\250\325p\216\377\377" \
+ "\377\1\342\361\320\202\214\306>\1\214\305@\211\214\306>\2\214\305@\343" \
+ "\361\316\215\377\377\377\1\377\376\377\202\377\377\375\202\377\377\377" \
+ "\202\377\376\377\11\377\377\375\377\377\377\376\377\377\377\376\377\276" \
+ "\336\223\214\306<\213\310\77\214\304=\215\306A\211\214\306>\3\215\305" \
+ ">\214\306>\305\342\240\214\377\377\377\20\377\377\375\376\377\375\376" \
+ "\376\376\377\376\377\375\377\376\377\375\377\376\377\377\376\377\375" \
+ "\270\333\207\217\305<\212\307>\214\305@\216\306\77\213\305=\214\305@" \
+ "\216\306=\211\214\306>\2\215\306A\215\305@\202\216\306\77\3\215\305@" \
+ "\214\305@\215\307\77\210\214\306>\13\213\305=\215\306A\215\305>\212\306" \
+ "@\215\305>\215\306A\220\305A\323\352\266\376\377\375\377\376\377\377" \
+ "\377\375\202\377\377\377\3\376\377\377\377\375\377\376\377\375\213\377" \
+ "\377\377\5\316\347\256\212\307>\213\305;\216\306A\212\307<\210\214\306" \
+ ">\10\212\307>\216\306\77\215\305>\350\364\336\377\376\377\376\376\374" \
+ "\377\377\377\377\376\377\210\377\377\377\1\377\376\377\202\377\377\377" \
+ "\5\377\376\377\376\377\375\377\376\377\370\373\360\225\311K\210\214\306" \
+ ">\10\216\306=\214\305@\215\310<\212\307>\214\306>\214\305@\223\312J\356" \
+ "\371\350\231\377\377\377\4\376\376\376\377\377\377\363\363\363xxz\202" \
+ "::<\1""99;\202::<\1;;=\203::<\202;;=\203::<\4__a\205\205\205\234\234" \
+ "\234\250\250\250\205\316\316\316\4\250\250\250\234\234\234xxx___\202" \
+ "::<\3""99;;;=99;\203::<\1;;=\203::<\2FFH\265\265\265\205\377\377\377" \
+ "\1\376\376\376\217\377\377\377\1\316\316\316\205::<\1kkm\225\377\377" \
+ "\377\3xxx::<;;=\204::<\1```\213\377\377\377\4\376\376\376\317\317\317" \
+ "::<;;=\204::<\1\266\266\270\203\377\377\377\1\376\376\376\241\377\377" \
+ "\377\1\377\377\375\202\377\377\377\1\204\204\206\202::<\1;;=\202::<\2" \
+ "GGI\363\363\363\212\377\377\377\1\234\234\236\203::<\1;;=\202::<\1;;" \
+ "=\221::<\1;;=\207::<\1;;=\202::<\1;;=\202::<\2``b\346\346\350\210\377" \
+ "\377\377\1\376\376\376\215\377\377\377\1\234\234\234\207::<\3;;=::<;" \
+ ";=\221::<\1;;=\203::<\1;;=\202::<\1\316\316\320\231\377\377\377\3\214" \
+ "\305@\214\306>\214\305@\250\214\306>\2\215\307\77\342\362\316\212\377" \
+ "\377\377\215\214\306>\1\250\325p\216\377\377\377\1\342\361\320\202\214" \
+ "\306>\1\214\305@\211\214\306>\2\214\305@\343\361\316\215\377\377\377" \
+ "\7\377\377\375\376\377\375\377\377\377\377\376\377\376\376\374\376\377" \
+ "\377\377\377\377\202\376\377\377\202\377\377\375\4\377\377\377\242\320" \
+ "d\211\306=\215\305@\212\214\306>\3\215\305>\214\306>\305\342\240\214" \
+ "\377\377\377\6\377\376\377\377\377\377\377\377\375\377\375\377\376\377" \
+ "\372\375\376\377\202\377\377\377\10\376\377\377\304\343\240\215\305@" \
+ "\214\306>\216\306A\215\307\77\212\307>\215\307\77\212\214\306>\3\215" \
+ "\307\77\214\306>\214\305@\202\215\307\77\211\214\306>\12\215\306C\212" \
+ "\307<\215\307\77\215\305@\213\310\77\215\306A\323\352\266\377\376\377" \
+ "\377\377\377\376\377\377\204\377\377\377\2\377\377\375\377\376\377\210" \
+ "\377\377\377\10\376\377\377\377\376\377\361\370\346\225\311K\212\307" \
+ ">\215\306A\214\305@\215\305>\210\214\306>\3\214\305@\214\306>\307\341" \
+ "\240\203\376\377\377\2\377\377\375\376\377\377\210\377\377\377\5\376" \
+ "\377\377\377\376\372\376\377\375\376\376\376\377\377\377\202\377\376" \
+ "\377\1\334\355\301\210\214\306>\10\215\306A\213\310\77\215\305@\214\306" \
+ ">\214\306<\215\306A\214\306>\254\322o\232\377\377\377\6\376\376\376\377" \
+ "\377\377\376\376\376\302\302\302FFH;;=\206::<\1;;=\202::<\202;;=\203" \
+ "::<\1;;=\204::<\3;;=::<;;=\202::<\1;;=\202::<\1;;=\203::<\2;;=::<\202" \
+ ";;=\2__a\332\332\332\226\377\377\377\3\316\316\316::<;;=\203::<\1kkm" \
+ "\222\377\377\377\7\376\376\376\377\377\377\376\376\376\363\363\363__" \
+ "a::<;;=\204::<\1\203\203\203\202\377\377\377\2\376\376\376\377\377\377" \
+ "\202\376\376\376\205\377\377\377\1kkm\202::<\1;;=\202::<\5TTV\377\377" \
+ "\377\376\376\376\377\377\377\376\376\376\245\377\377\377\2\347\347\347" \
+ "99;\202::<\1;;=\202::<\1\235\235\237\206\377\377\377\1\376\376\376\202" \
+ "\377\377\377\2\376\376\376\234\234\234\224::<\1;;=\202::<\3""99;::<;" \
+ ";=\204::<\1;;=\204::<\3;;=GGI\250\250\252\230\377\377\377\2\234\234\236" \
+ ";;=\232::<\10;;=99;;;=::<;;=::<:::\316\316\316\230\377\377\377\10\377" \
+ "\376\377\212\306@\214\305@\213\310=\214\306<\215\306A\214\307;\215\306" \
+ "A\240\214\306>\10\214\305@\212\307<\214\306<\214\305@\212\306@\342\360" \
+ "\315\376\377\377\377\376\377\210\377\377\377\212\214\306>\4\216\306\77" \
+ "\212\306B\214\306>\250\325n\202\377\376\377\210\377\377\377\1\377\376" \
+ "\377\202\377\377\377\5\376\377\375\342\362\316\214\305B\215\305@\214" \
+ "\306<\210\214\306>\202\212\307>\5\343\361\320\377\377\377\377\377\375" \
+ "\376\377\377\377\376\377\223\377\377\377\6\377\376\377\377\377\375\371" \
+ "\372\364\223\312J\212\306@\215\305@\210\214\306>\10\214\305@\215\305" \
+ ">\212\307>\304\343\240\377\377\375\377\377\377\377\377\375\377\376\377" \
+ "\220\377\377\377\11\376\377\377\377\377\377\333\355\303\226\310K\213" \
+ "\310\77\214\306>\215\305@\215\306A\214\305@\203\214\306>\7\215\305>\215" \
+ "\305@\214\305@\212\307>\215\305>\215\307\77\215\306A\202\214\306<\5\215" \
+ "\306A\213\305=\215\305@\215\307\77\213\305;\202\215\305@\13\215\307\77" \
+ "\213\310\77\214\305@\215\307\77\212\307>\215\305>\214\306>\212\306@\235" \
+ "\315U\347\365\334\377\376\377\220\377\377\377\15\376\376\376\377\377" \
+ "\375\377\377\377\244\317c\213\307A\214\306<\213\307A\215\305>\215\305" \
+ "<\215\307\77\214\306<\215\307\77\214\305@\202\215\307\77\12\214\305@" \
+ "\215\306A\215\305@\234\315W\367\375\363\377\376\377\376\377\377\377\377" \
+ "\375\376\377\377\377\376\377\220\377\377\377\10\260\331{\215\307=\212" \
+ "\307>\213\307A\214\306>\215\305@\215\307\77\215\305>\210\214\306>\3\314" \
+ "\345\253\377\377\377\376\377\375\202\377\376\377\2\377\377\377\376\377" \
+ "\377\222\377\377\377\3\376\376\376\377\377\377\376\376\376\202\377\377" \
+ "\377\3\364\364\364\220\220\220;;=\211::<\2;;=::<\202;;=\2::<;;=\202:" \
+ ":<\4;;=::<;;=99;\203::<\2;;=99;\206::<\2GGI\247\247\251\203\377\377\377" \
+ "\1\376\376\376\222\377\377\377\6\376\376\376\377\377\377\316\316\316" \
+ ";;=99;;;=\202::<\2lln\376\376\376\202\377\377\377\1\376\376\376\221\377" \
+ "\377\377\4\376\376\376\333\333\333FFH;;=\202::<\1;;=\202::<\1\265\265" \
+ "\265\202\377\377\377\1\376\376\376\202\377\377\377\5\376\376\376\377" \
+ "\377\377\376\376\376\377\377\377\316\316\320\202::<\2;;=99;\202;;=\1" \
+ "\264\264\266\202\377\377\377\1\376\376\376\244\377\377\377\1\376\376" \
+ "\376\202\377\377\377\1\205\205\207\204::<\3;;=FFH\363\363\363\206\377" \
+ "\377\377\1\376\376\376\202\377\377\377\3\233\233\233::<;;=\220::<\3""9" \
+ "9;;;=99;\202::<\1;;=\203::<\1;;=\204::<\7;;=::<SSU\250\250\252\362\362" \
+ "\364\377\377\377\376\376\376\225\377\377\377\3\376\376\376\377\377\377" \
+ "\235\235\237\202::<\1;;=\231::<\2;;=99;\204::<\1\316\316\316\230\377" \
+ "\377\377\10\377\377\373\212\311=\212\306@\216\306A\215\305>\215\307\77" \
+ "\214\306>\215\306A\240\214\306>\7\214\306<\214\306>\216\306\77\214\306" \
+ ">\214\305@\343\361\320\377\377\375\211\377\377\377\210\214\306>\10\213" \
+ "\307A\212\306@\215\305@\212\307<\215\307\77\247\324o\375\377\376\376" \
+ "\377\377\211\377\377\377\7\376\377\375\377\377\377\377\377\375\342\360" \
+ "\315\214\305@\213\305=\215\307\77\210\214\306>\10\215\305>\215\307\77" \
+ "\343\361\316\376\376\376\377\376\377\376\377\377\377\377\375\376\377" \
+ "\372\220\377\377\377\10\376\377\377\377\376\377\377\377\375\377\376\374" \
+ "\376\377\375\343\362\321\212\307>\214\307;\210\214\306>\4\215\307=\215" \
+ "\304B\213\307A\305\342\240\203\377\377\377\1\376\377\377\222\377\377" \
+ "\377\21\377\376\377\367\374\365\267\332\206\215\306A\212\306@\214\306" \
+ "<\214\306>\215\306A\215\307\77\214\306>\214\305@\212\306B\212\306@\212" \
+ "\307<\215\307\77\214\306>\214\305@\202\215\305@\5\214\305@\214\306>\214" \
+ "\305@\212\307>\215\306A\202\214\305@\11\214\307;\214\306>\215\306A\214" \
+ "\305@\215\305>\212\306@\222\311I\306\343\240\366\373\364\224\377\377" \
+ "\377\6\303\342\237\217\304@\214\306<\214\306>\215\306C\212\306B\204\214" \
+ "\305@\1\215\306A\202\214\305@\11\215\306A\214\306<\214\306>\341\361\314" \
+ "\377\377\377\376\377\375\377\377\377\377\375\377\377\377\375\221\377" \
+ "\377\377\10\370\373\364\224\307N\215\305@\215\305>\212\307<\215\306A" \
+ "\212\307<\215\306A\210\214\306>\10\215\307=\346\364\332\376\377\375\376" \
+ "\377\373\377\377\377\376\376\377\377\376\377\377\377\375\230\377\377" \
+ "\377\5\346\346\350\204\204\206GGI::<;;=\202::<\5;;=::<;;=::<;;=\202:" \
+ ":<\3;;=::<;;=\202::<\5;;=99;;;=::<;;=\207::<\3FFH\234\234\234\363\363" \
+ "\363\203\377\377\377\1\376\376\376\222\377\377\377\1\376\376\376\202" \
+ "\377\377\377\4\316\316\316::<;;=99;\202;;=\1kkm\202\377\377\377\1\376" \
+ "\376\376\220\377\377\377\1\376\376\376\202\377\377\377\5\376\376\376" \
+ "\266\266\26699;;;=::<\202;;=\3::<GGG\332\332\332\207\377\377\377\2\376" \
+ "\376\376\204\204\206\202;;=\4::<;;=::<SSU\252\377\377\377\2\376\376\376" \
+ "\346\346\350\202::<\5;;=::<99;;;;\266\266\266\203\377\377\377\1\376\376" \
+ "\376\205\377\377\377\3\235\235\235::<99;\220::<\1;;=\205::<\203;;=\1" \
+ "99;\203::<\3SSS\221\221\221\316\316\316\205\377\377\377\1\376\376\376" \
+ "\222\377\377\377\1\376\376\376\203\377\377\377\3\234\234\236::<;;=\232" \
+ "::<\7""99;::<;:\77::<;;=99;\317\317\321\230\377\377\377\7\377\375\377" \
+ "\214\306<\213\307A\215\305>\215\307\77\212\307>\216\306\77\241\214\306" \
+ ">\1\215\306C\202\215\305@\5\212\306@\215\307=\343\361\320\377\377\377" \
+ "\377\376\377\210\377\377\377\210\214\306>\10\215\305<\215\307\77\216" \
+ "\306\77\214\306>\216\305C\252\324r\377\377\377\377\377\373\211\377\377" \
+ "\377\7\375\377\376\377\377\377\377\375\376\343\361\316\215\307=\212\307" \
+ ">\215\305>\210\214\306>\10\214\305@\215\305<\342\362\316\377\377\375" \
+ "\377\376\377\375\377\374\376\376\377\376\377\377\222\377\377\377\1\375" \
+ "\377\372\202\377\377\377\3\377\376\377\304\341\237\215\307\77\210\214" \
+ "\306>\10\212\307;\215\307\77\213\305=\305\342\240\377\377\377\377\376" \
+ "\374\377\377\375\376\377\377\221\377\377\377\22\377\376\377\377\377\375" \
+ "\376\377\377\377\375\376\361\367\351\270\334\204\214\306>\215\307\77" \
+ "\214\305@\212\306@\213\307A\212\306@\213\310\77\214\306>\215\304B\214" \
+ "\306>\212\307<\214\306>\202\216\306A\6\214\306>\213\310\77\214\305@\215" \
+ "\305<\215\305>\215\307=\202\213\310\77\10\215\306A\214\306>\215\306A" \
+ "\222\311I\300\336\226\361\370\346\376\376\376\377\377\377\202\377\376" \
+ "\377\1\376\377\373\217\377\377\377\10\377\377\375\347\365\333\214\307" \
+ ";\211\305A\213\304\77\215\307\77\215\305<\213\310\77\202\214\306>\1\215" \
+ "\307\77\203\214\306>\4\215\307\77\214\306>\215\306A\275\337\223\202\377" \
+ "\377\377\5\377\376\377\377\377\377\376\377\375\377\376\377\376\377\377" \
+ "\220\377\377\377\10\375\377\376\331\357\301\215\307\77\215\305>\216\305" \
+ "C\211\306=\220\305A\211\307@\210\214\306>\10\214\305@\246\321e\377\377" \
+ "\377\377\376\377\376\377\377\377\377\375\376\377\377\377\376\377\227" \
+ "\377\377\377\1\376\376\376\202\377\377\377\3\363\363\363\266\266\270" \
+ "__a\207::<\202;;=\203::<\2;;=99;\202;;=\2""99;::<\202;;=\1::<\203;;=" \
+ "\3^^^\250\250\250\363\363\363\203\377\377\377\1\376\376\376\202\377\377" \
+ "\377\1\376\376\376\224\377\377\377\4\316\316\316999::<;;=\202::<\1ll" \
+ "l\205\377\377\377\1\376\376\376\217\377\377\377\6\376\376\376\377\377" \
+ "\377\376\376\376\204\204\204::<;;=\203::<\3:::TTT\363\363\363\206\377" \
+ "\377\377\10\347\347\347;;;99;::<;;=::<:::\234\234\236\253\377\377\377" \
+ "\3\376\376\376lln;;=\202::<\3;;=999SSS\202\377\377\377\1\376\376\376" \
+ "\203\377\377\377\4\376\376\376\377\377\377\376\376\376\234\234\234\223" \
+ "::<\1""99;\202::<\1;;=\203::<\5kkmxxz\235\235\237\301\301\301\346\346" \
+ "\346\207\377\377\377\1\376\376\376\202\377\377\377\1\376\376\376\221" \
+ "\377\377\377\1\376\376\376\202\377\377\377\3\235\235\235::<;;=\232::" \
+ "<\2;;=99;\202::<\3;;=::<\316\316\316\230\377\377\377\10\373\377\376\216" \
+ "\306A\214\306<\213\304A\212\306@\214\305@\214\304\77\215\307\77\240\214" \
+ "\306>\6\214\306<\215\306A\215\305@\216\310@\217\304@\341\361\314\212" \
+ "\377\377\377\210\214\306>\7\215\307\77\213\310\77\213\305=\215\307\77" \
+ "\214\304\77\253\323r\374\377\373\211\377\377\377\1\377\376\377\203\377" \
+ "\377\377\3\342\362\315\215\305@\215\307=\211\214\306>\10\214\306<\215" \
+ "\304B\341\363\313\374\377\375\376\376\377\377\377\377\377\375\376\377" \
+ "\377\375\221\377\377\377\7\376\377\375\376\376\377\377\377\377\375\377" \
+ "\374\377\377\377\377\377\375\253\323p\210\214\306>\5\215\307\77\215\305" \
+ ">\217\304@\305\342\237\376\377\375\202\377\377\377\1\377\377\375\220" \
+ "\377\377\377\1\376\377\377\202\377\376\377\202\376\377\375\202\377\377" \
+ "\377\5\360\370\351\311\347\247\245\320e\215\305>\212\307>\202\214\306" \
+ ">\5\215\306A\212\307>\215\305@\214\306>\214\306<\202\214\306>\2\214\306" \
+ "<\214\306>\202\216\306A\14\214\306>\215\306A\215\305<\214\306>\213\305" \
+ "=\255\331x\323\353\267\366\374\362\377\377\377\377\377\375\377\377\377" \
+ "\376\377\377\217\377\377\377\2\376\376\376\377\377\377\202\377\377\375" \
+ "\11\244\317d\214\306>\213\307A\214\306>\214\305@\214\306>\215\306A\214" \
+ "\306<\215\307\77\202\214\306>\202\214\305@\13\215\305<\215\305@\230\316" \
+ "V\370\373\360\376\377\375\377\377\377\377\376\377\376\376\376\377\377" \
+ "\375\377\376\377\376\377\377\220\377\377\377\10\376\376\376\377\376\377" \
+ "\262\327x\214\306>\216\306A\215\307=\215\305<\215\306A\211\214\306>\6" \
+ "\215\306C\307\341\240\376\377\373\376\377\377\376\377\375\376\376\374" \
+ "\236\377\377\377\4\346\346\350\266\266\270\204\204\206SSU\202::<\1;;" \
+ "=\202::<\1;;=\202::<\202;;=\3""99;::<;;=\203::<\4GGIxxz\247\247\247\347" \
+ "\347\347\212\377\377\377\1\376\376\376\223\377\377\377\1\364\364\364" \
+ "\205\316\316\316\1\332\332\332\203\377\377\377\202\376\376\376\221\377" \
+ "\377\377\1\376\376\376\202\377\377\377\202\316\316\316\203\316\316\320" \
+ "\3\316\316\316\317\317\317\346\346\346\206\377\377\377\5\346\346\346" \
+ "\316\316\316\317\317\317\316\316\316\315\315\315\202\316\316\316\1\363" \
+ "\363\363\250\377\377\377\1\376\376\376\203\377\377\377\3\346\346\346" \
+ "\315\315\315\317\317\317\202\316\316\320\3\317\317\317\315\315\315\363" \
+ "\363\363\202\377\377\377\202\376\376\376\204\377\377\377\3\346\346\346" \
+ "\316\316\316\316\316\320\224\316\316\316\1\315\315\315\203\377\377\377" \
+ "\1\376\376\376\215\377\377\377\1\376\376\376\225\377\377\377\2\346\346" \
+ "\346\317\317\317\232\316\316\316\1\317\317\317\203\316\316\316\4\317" \
+ "\317\317\315\315\315\316\316\316\363\363\363\231\377\377\377\3\340\361" \
+ "\317\342\360\317\342\362\316\202\343\361\316\2\342\360\315\343\361\316" \
+ "\240\342\361\320\10\342\362\316\342\361\320\343\363\317\341\360\317\342" \
+ "\361\320\370\373\364\376\377\375\376\377\377\210\377\377\377\210\342" \
+ "\361\320\7\341\360\317\342\362\316\343\361\316\342\360\314\342\361\320" \
+ "\350\364\336\377\376\374\211\377\377\377\10\377\376\377\377\377\375\377" \
+ "\377\377\377\377\375\370\373\362\341\360\321\340\357\316\342\362\316" \
+ "\210\342\361\320\3\342\362\316\342\361\320\371\373\360\203\377\377\377" \
+ "\202\377\376\377\220\377\377\377\4\377\377\375\376\376\376\377\376\377" \
+ "\376\377\375\203\377\377\377\1\365\375\362\210\342\361\320\4\341\360" \
+ "\321\342\361\322\343\363\317\360\367\345\224\377\377\377\7\376\377\377" \
+ "\376\377\375\377\377\375\377\376\377\377\377\375\377\375\376\377\376" \
+ "\377\202\377\377\377\30\376\376\377\364\370\351\333\354\277\277\337\224" \
+ "\247\324k\224\313K\214\305@\214\306>\212\306@\214\306>\214\305B\215\306" \
+ "C\215\307\77\212\306@\214\306>\215\307\77\241\321c\257\330|\304\342\242" \
+ "\341\361\315\377\377\377\377\376\377\376\377\373\377\377\377\202\377" \
+ "\377\375\1\377\376\377\203\377\377\377\1\376\377\377\212\377\377\377" \
+ "\1\376\376\376\203\377\377\377\13\376\376\374\372\372\370\342\361\320" \
+ "\343\361\316\342\362\316\341\360\317\342\361\320\341\360\317\342\362" \
+ "\316\342\361\322\342\361\320\202\341\361\315\6\342\361\320\341\360\317" \
+ "\343\361\315\343\361\320\356\371\350\377\376\377\203\377\377\377\1\376" \
+ "\377\375\202\377\377\377\1\376\377\375\222\377\377\377\6\366\373\364" \
+ "\342\361\320\342\362\316\342\360\317\341\362\316\343\361\320\210\342" \
+ "\361\320\10\341\362\316\341\361\315\352\364\334\377\377\377\377\376\377" \
+ "\377\377\377\376\377\377\376\377\375\222\377\377\377\202\376\376\376" \
+ "\202\377\377\377\1\376\376\376\202\377\377\377\1\376\376\376\202\377" \
+ "\377\377\3\376\376\376\377\377\377\375\375\375\202\377\377\377\5\363" \
+ "\363\363\316\316\316\264\264\264\235\235\235\233\233\233\202kkk\202k" \
+ "km\3llnkkmyy{\202\234\234\236\6\316\316\320\346\346\346\377\377\377\376" \
+ "\376\376\377\377\377\376\376\376\204\377\377\377\1\376\376\376\204\377" \
+ "\377\377\1\376\376\376\240\377\377\377\1\376\376\376\231\377\377\377" \
+ "\1\375\375\375\203\377\377\377\1\376\376\376\214\377\377\377\1\376\376" \
+ "\376\202\377\377\377\1\376\376\376\242\377\377\377\1\376\376\376\206" \
+ "\377\377\377\3\376\376\376\377\377\377\376\376\376\204\377\377\377\1" \
+ "\376\376\376\202\377\377\377\202\376\376\376\225\377\377\377\3\376\376" \
+ "\376\377\377\377\376\376\376\202\377\377\377\3\376\376\376\377\377\377" \
+ "\376\376\376\214\377\377\377\3\376\376\376\377\377\377\376\376\376\265" \
+ "\377\377\377\1\375\375\375\234\377\377\377\7\376\377\377\377\376\377" \
+ "\376\377\377\376\376\374\377\376\377\377\377\377\377\377\375\240\377" \
+ "\377\377\1\377\377\375\202\377\377\377\5\377\376\377\376\376\376\377" \
+ "\376\377\376\376\377\377\377\375\221\377\377\377\7\375\376\377\377\377" \
+ "\377\377\376\377\377\377\375\376\377\377\377\377\373\377\376\377\210" \
+ "\377\377\377\5\377\376\377\377\377\377\376\376\374\376\377\377\377\377" \
+ "\377\202\377\377\375\1\376\377\377\210\377\377\377\6\376\377\377\375" \
+ "\376\377\377\376\377\377\377\377\376\377\377\377\377\377\202\377\377" \
+ "\375\224\377\377\377\202\377\376\377\2\374\377\377\377\376\377\210\377" \
+ "\377\377\3\376\377\377\376\376\376\376\377\377\202\377\377\377\3\375" \
+ "\377\376\377\377\377\377\376\377\220\377\377\377\202\377\376\377\2\376" \
+ "\377\377\375\376\377\202\377\377\377\4\377\377\375\377\376\377\377\377" \
+ "\377\377\377\375\202\376\377\377\7\377\377\377\377\376\377\377\377\377" \
+ "\376\377\375\370\373\364\344\357\315\342\361\320\202\342\362\315\14\340" \
+ "\357\316\345\360\316\376\377\373\376\376\376\377\377\377\377\375\376" \
+ "\377\377\375\377\377\377\375\377\376\377\377\377\377\376\377\377\377" \
+ "\375\202\376\377\375\5\376\377\377\377\377\377\377\377\375\376\376\376" \
+ "\377\376\377\214\377\377\377\1\376\376\376\202\377\377\377\5\377\377" \
+ "\375\376\375\377\377\377\377\376\376\377\377\377\375\204\377\377\377" \
+ "\1\377\377\375\205\377\377\377\202\377\376\377\2\377\377\377\377\377" \
+ "\375\202\377\377\377\202\376\377\377\222\377\377\377\5\377\377\375\377" \
+ "\377\377\377\377\375\377\377\377\377\377\375\202\377\377\377\1\377\376" \
+ "\372\212\377\377\377\1\377\375\377\202\377\377\377\3\377\376\377\377" \
+ "\377\377\377\377\375\225\377\377\377\1\376\376\376\211\377\377\377\1" \
+ "\376\376\376\204\377\377\377\1\376\376\376\205\377\377\377\1\376\376" \
+ "\376\206\377\377\377\3\376\376\376\377\377\377\376\376\376\206\377\377" \
+ "\377\1\376\376\376\233\377\377\377\1\376\376\376\203\377\377\377\5\376" \
+ "\376\376\377\377\377\376\376\376\377\377\377\376\376\376\223\377\377" \
+ "\377\3\376\376\376\377\377\377\376\376\376\205\377\377\377\3\376\376" \
+ "\376\377\377\377\376\376\376\203\377\377\377\3\376\376\376\377\377\377" \
+ "\376\376\376\203\377\377\377\1\376\376\376\205\377\377\377\1\376\376" \
+ "\376\246\377\377\377\3\376\376\376\377\377\377\376\376\376\220\377\377" \
+ "\377\1\376\376\376\246\377\377\377\1\376\376\376\225\377\377\377\1\376" \
+ "\376\376\202\377\377\377\1\376\376\376\240\377\377\377\1\376\376\376" \
+ "\230\377\377\377\6\377\377\375\377\377\377\377\376\377\376\377\375\374" \
+ "\377\377\376\375\377\242\377\377\377\202\377\376\377\6\376\376\376\375" \
+ "\376\377\377\377\377\377\377\375\377\377\377\376\377\375\220\377\377" \
+ "\377\7\377\377\375\377\377\377\377\377\375\377\375\376\376\377\375\376" \
+ "\377\377\376\376\376\212\377\377\377\4\377\376\377\377\377\375\377\377" \
+ "\377\377\377\375\203\377\376\377\210\377\377\377\5\377\377\375\377\377" \
+ "\377\377\375\376\377\376\377\377\377\375\202\377\377\377\1\376\377\377" \
+ "\221\377\377\377\1\375\376\377\203\377\377\375\2\376\377\375\377\375" \
+ "\376\211\377\377\377\204\377\376\377\4\377\377\377\376\377\375\377\377" \
+ "\375\377\376\377\221\377\377\377\5\376\377\377\376\376\376\377\377\373" \
+ "\376\376\377\376\377\377\202\377\377\377\2\377\376\377\377\377\375\202" \
+ "\377\377\377\7\377\377\375\377\376\377\376\376\377\377\377\377\376\377" \
+ "\377\376\377\375\376\377\377\202\377\377\377\203\376\377\377\2\377\377" \
+ "\377\376\376\374\202\377\376\377\13\376\376\376\377\377\375\377\377\377" \
+ "\377\375\376\376\377\377\377\377\377\376\376\377\377\376\377\376\376" \
+ "\374\376\377\377\377\377\375\221\377\377\377\203\377\377\375\4\377\377" \
+ "\377\377\377\375\377\376\377\376\376\376\210\377\377\377\1\377\377\373" \
+ "\203\377\377\377\1\377\377\375\202\376\377\377\222\377\377\377\1\377" \
+ "\377\375\202\377\376\377\3\377\377\377\377\376\377\377\376\374\202\376" \
+ "\377\377\210\377\377\377\4\377\377\375\377\377\377\376\377\375\377\375" \
+ "\377\202\376\377\377\1\377\376\375\227\377\377\377\1\376\376\376\207" \
+ "\377\377\377\1\376\376\376\217\377\377\377\1\376\376\376\205\377\377" \
+ "\377\1\376\376\376\204\377\377\377\1\376\376\376\233\377\377\377\1\376" \
+ "\376\376\211\377\377\377\1\376\376\376\222\377\377\377\1\376\376\376" \
+ "\206\377\377\377\1\376\376\376\207\377\377\377\1\376\376\376\262\377" \
+ "\377\377\1\376\376\376\212\377\377\377\1\376\376\376\202\377\377\377" \
+ "\1\376\376\376\202\377\377\377\1\376\376\376\225\377\377\377\1\376\376" \
+ "\376\306\377\377\377\1\376\376\376\235\377\377\377\7\377\376\377\376" \
+ "\377\377\377\377\377\377\377\375\376\375\377\377\377\375\377\376\377" \
+ "\241\377\377\377\1\376\377\377\203\377\377\377\3\377\377\375\377\375" \
+ "\376\377\376\377\221\377\377\377\202\376\377\377\5\377\377\377\377\377" \
+ "\375\377\377\377\377\376\377\377\377\375\211\377\377\377\203\377\377" \
+ "\375\202\377\377\377\202\376\377\377\1\377\377\375\212\377\377\377\202" \
+ "\376\377\375\3\376\377\377\377\377\375\377\376\377\223\377\377\377\6" \
+ "\377\377\375\377\376\377\374\377\377\377\377\377\377\376\377\376\377" \
+ "\375\210\377\377\377\3\377\377\375\376\377\377\377\377\375\202\377\377" \
+ "\377\1\377\377\375\223\377\377\377\4\376\376\376\377\377\375\376\376" \
+ "\376\377\376\377\202\377\377\375\1\376\376\376\206\377\377\377\1\377" \
+ "\377\375\215\377\377\377\1\377\377\375\202\377\377\377\5\376\377\377" \
+ "\377\377\377\376\376\374\377\377\377\377\376\377\202\377\377\377\1\376" \
+ "\376\376\221\377\377\377\7\376\377\375\377\375\377\377\377\377\376\377" \
+ "\377\377\377\377\377\377\373\377\376\377\202\377\377\377\1\377\377\375" \
+ "\202\377\377\377\1\377\377\375\204\377\377\377\6\376\376\377\377\377" \
+ "\375\376\377\377\377\377\375\377\376\377\375\377\374\222\377\377\377" \
+ "\3\376\377\375\377\377\377\376\377\375\203\376\377\377\1\377\376\377" \
+ "\211\377\377\377\7\377\377\373\377\376\377\377\377\375\377\377\377\377" \
+ "\376\377\376\376\376\376\377\377")
+
+
diff --git a/recipes-core/psplash/psplash_agldemo.inc b/recipes-core/psplash/psplash_agldemo.inc
new file mode 100644
index 00000000..dad26129
--- /dev/null
+++ b/recipes-core/psplash/psplash_agldemo.inc
@@ -0,0 +1,9 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
+
+SRC_URI_append = " file://psplash-colors.h"
+
+SPLASH_IMAGES = "file://psplash-poky-img.h;outsuffix=default"
+
+do_configure_append () {
+ cp -f ${WORKDIR}/psplash-colors.h ${S}
+}
diff --git a/recipes-core/psplash/psplash_git.bbappend b/recipes-core/psplash/psplash_git.bbappend
new file mode 100644
index 00000000..931b27c7
--- /dev/null
+++ b/recipes-core/psplash/psplash_git.bbappend
@@ -0,0 +1 @@
+require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'psplash_agldemo.inc', '', d)}
diff --git a/recipes-core/udev/sw-gpsd-udev-conf/60-sw-gpsd.rules b/recipes-core/udev/sw-gpsd-udev-conf/60-sw-gpsd.rules
new file mode 100644
index 00000000..a5547003
--- /dev/null
+++ b/recipes-core/udev/sw-gpsd-udev-conf/60-sw-gpsd.rules
@@ -0,0 +1,8 @@
+# udev rules for gpsd for Sierra Wireless modems
+SUBSYSTEM!="tty", GOTO="sw_gpsd_rules_end"
+
+ENV{ID_VENDOR_ID}=="1199", ATTRS{bInterfaceNumber}=="02", SYMLINK+="gps%n", TAG+="systemd", ENV{SYSTEMD_WANTS}="gpsdctl@%k.service"
+
+ACTION=="remove", TAG+="systemd", ENV{SYSTEMD_WANTS}="gpsdctl@%k.service"
+
+LABEL="sw_gpsd_rules_end"
diff --git a/recipes-core/udev/sw-gpsd-udev-conf_1.0.bb b/recipes-core/udev/sw-gpsd-udev-conf_1.0.bb
new file mode 100644
index 00000000..9b6fd57d
--- /dev/null
+++ b/recipes-core/udev/sw-gpsd-udev-conf_1.0.bb
@@ -0,0 +1,16 @@
+SUMMARY = "Sierra-Wireless MC7xxx modem gpsd udev configuration"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420"
+
+SRC_URI = "file://60-sw-gpsd.rules"
+
+do_compile[noexec] = "1"
+
+do_install() {
+ if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then
+ install -d ${D}${sysconfdir}/udev/rules.d
+ install -m 0644 ${WORKDIR}/60-sw-gpsd.rules ${D}${sysconfdir}/udev/rules.d/
+ fi
+}
+
+RDEPENDS_${PN} += "systemd"
diff --git a/recipes-core/udev/usb-can-udev-conf/60-usb-can.rules b/recipes-core/udev/usb-can-udev-conf/60-usb-can.rules
new file mode 100644
index 00000000..3aa800a8
--- /dev/null
+++ b/recipes-core/udev/usb-can-udev-conf/60-usb-can.rules
@@ -0,0 +1,7 @@
+# udev rules for USB CAN adapters
+SUBSYSTEM!="tty", GOTO="usb_can_rules_end"
+
+# VScom USB-CAN Plus
+ATTRS{idProduct}=="6015", ATTRS{idVendor}=="0403", SYMLINK+="usbcan%n", TAG+="systemd", ENV{SYSTEMD_WANTS}="slcand@%k.service"
+
+LABEL="usb_can_rules_end"
diff --git a/recipes-core/udev/usb-can-udev-conf/slcand-default b/recipes-core/udev/usb-can-udev-conf/slcand-default
new file mode 100644
index 00000000..a86552fd
--- /dev/null
+++ b/recipes-core/udev/usb-can-udev-conf/slcand-default
@@ -0,0 +1,2 @@
+# Defaults for VScom USB-CAN Plus @ 500 Kb/s CAN rate
+SLCAND_OPTS="-o -s6 -t hw -S 3000000"
diff --git a/recipes-core/udev/usb-can-udev-conf/slcand@.service b/recipes-core/udev/usb-can-udev-conf/slcand@.service
new file mode 100644
index 00000000..3c30e51b
--- /dev/null
+++ b/recipes-core/udev/usb-can-udev-conf/slcand@.service
@@ -0,0 +1,13 @@
+[Unit]
+Description=Serial CAN daemon (can-utils)
+BindsTo=dev-%i.device
+After=dev-%i.device
+
+[Service]
+Type=forking
+StopWhenUnneeded=yes
+Environment=SLCAND_OPTS="-o -c -s6" SLCAND_DEV=can0
+EnvironmentFile=-/etc/default/slcand
+EnvironmentFile=-/etc/sysconfig/slcand
+ExecStart=/usr/bin/slcand $SLCAND_OPTS %I $SLCAND_DEV
+ExecStartPost=/bin/sh -c '/bin/sleep 3; /sbin/ip link set $SLCAND_DEV up'
diff --git a/recipes-core/udev/usb-can-udev-conf_1.0.bb b/recipes-core/udev/usb-can-udev-conf_1.0.bb
new file mode 100644
index 00000000..fb5deec3
--- /dev/null
+++ b/recipes-core/udev/usb-can-udev-conf_1.0.bb
@@ -0,0 +1,25 @@
+SUMMARY = "USB CAN adapter udev configuration"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420"
+
+SRC_URI = "file://60-usb-can.rules \
+ file://slcand@.service \
+ file://slcand-default \
+"
+
+do_compile[noexec] = "1"
+
+do_install() {
+ if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then
+ install -d ${D}${sysconfdir}/udev/rules.d
+ install -m 0644 ${WORKDIR}/60-usb-can.rules ${D}${sysconfdir}/udev/rules.d/
+ install -d ${D}${systemd_system_unitdir}
+ install -m 0644 ${WORKDIR}/slcand@.service ${D}${systemd_system_unitdir}/
+ install -d ${D}${sysconfdir}/default
+ install -m 0644 ${WORKDIR}/slcand-default ${D}${sysconfdir}/default/slcand
+ fi
+}
+
+FILES_${PN} += "${systemd_system_unitdir}"
+
+RDEPENDS_${PN} += "systemd"
diff --git a/recipes-demo-hmi/alexa-viewer/alexa-viewer_git.bb b/recipes-demo/alexa-viewer/alexa-viewer_git.bb
index f73a97ac..f73a97ac 100644
--- a/recipes-demo-hmi/alexa-viewer/alexa-viewer_git.bb
+++ b/recipes-demo/alexa-viewer/alexa-viewer_git.bb
diff --git a/recipes-demo/cluster-dashboard/cluster-dashboard_git.bb b/recipes-demo/cluster-dashboard/cluster-dashboard_git.bb
new file mode 100644
index 00000000..da15ac83
--- /dev/null
+++ b/recipes-demo/cluster-dashboard/cluster-dashboard_git.bb
@@ -0,0 +1,29 @@
+SUMMARY = "Instrument Cluster Dashboard AGL Demonstration"
+DESCRIPTION = "AGL HMI Application for demonstrating instrument cluster dashboard"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-cluster-demo-dashboard"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0 & BSD"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984 \
+ file://app/cluster-gauges.qml;beginline=9;endline=48;md5=54187d50b29429abee6095fe8b7c1a78"
+
+SRC_URI = "gitsm://gerrit.automotivelinux.org/gerrit/apps/agl-cluster-demo-dashboard;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "1.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+# build-time dependencies
+DEPENDS += "qtquickcontrols2 qtwebsockets libqtappfw glib-2.0 \
+ wayland-native wayland qtwayland qtwayland-native"
+
+inherit pkgconfig cmake_qt5 aglwgt
+
+RDEPENDS_${PN} += " \
+ qtquickcontrols \
+ qtquickcontrols-qmlplugins \
+ qtquickcontrols2 \
+ qtquickcontrols2-qmlplugins \
+ libqtappfw \
+ agl-service-signal-composer \
+"
diff --git a/recipes-demo/cluster-gauges-qtcompositor/cluster-gauges-qtcompositor_git.bb b/recipes-demo/cluster-gauges-qtcompositor/cluster-gauges-qtcompositor_git.bb
new file mode 100644
index 00000000..44feecb1
--- /dev/null
+++ b/recipes-demo/cluster-gauges-qtcompositor/cluster-gauges-qtcompositor_git.bb
@@ -0,0 +1,29 @@
+SUMMARY = "Minimal cluster demo gauges that can be used standalone"
+DESCRIPTION = "AGL HMI Application for demonstrating instrument cluster gauges as a wayland compositor"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-cluster-demo-gauges"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0 & BSD"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984 \
+ file://app/cluster-gauges.qml;beginline=10;endline=49;md5=54187d50b29429abee6095fe8b7c1a78"
+
+SRC_URI = "gitsm://gerrit.automotivelinux.org/gerrit/apps/agl-cluster-demo-gauges;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "1.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+# build-time dependencies
+DEPENDS += "qtquickcontrols2 qtwebsockets"
+
+inherit pkgconfig cmake_qt5 aglwgt
+
+RDEPENDS_${PN} += " \
+ qtquickcontrols \
+ qtquickcontrols-qmlplugins \
+ qtquickcontrols2 \
+ qtquickcontrols2-qmlplugins \
+ qtwebsockets \
+ qtwebsockets-qmlplugins \
+ kms-conf \
+"
diff --git a/recipes-demo/cluster-receiver/cluster-receiver_git.bb b/recipes-demo/cluster-receiver/cluster-receiver_git.bb
new file mode 100644
index 00000000..534351f2
--- /dev/null
+++ b/recipes-demo/cluster-receiver/cluster-receiver_git.bb
@@ -0,0 +1,25 @@
+SUMMARY = "Instrument Cluster Receiver AGL Demonstration"
+DESCRIPTION = "AGL HMI Application for demonstrating instrument cluster remote display"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-cluster-demo-receiver"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0 & MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=374fee6a7817f1e1a5a7bfb7b7989553"
+
+SRC_URI = "gitsm://gerrit.automotivelinux.org/gerrit/apps/agl-cluster-demo-receiver;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "1.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+# build-time dependencies
+DEPENDS += "wayland wayland-native \
+ gstreamer1.0 gstreamer1.0-plugins-base gstreamer1.0-plugins-bad"
+
+inherit cmake pkgconfig aglwgt
+
+RDEPENDS_${PN} += " \
+ gstreamer1.0-plugins-base \
+ gstreamer1.0-plugins-good \
+ gstreamer1.0-plugins-bad \
+"
diff --git a/recipes-demo/cluster-receiver/qt-cluster-receiver_git.bb b/recipes-demo/cluster-receiver/qt-cluster-receiver_git.bb
new file mode 100644
index 00000000..10728d56
--- /dev/null
+++ b/recipes-demo/cluster-receiver/qt-cluster-receiver_git.bb
@@ -0,0 +1,28 @@
+SUMMARY = "Instrument Cluster Receiver AGL Demonstration"
+DESCRIPTION = "AGL HMI Application for demonstrating instrument cluster remote display"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/admin/repos/apps/agl-qt-cluster-demo-receiver"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0 & MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984 \
+ file://app/surface.hpp;beginline=5;endline=21;md5=5351c531a191f0e3463aafcd0a6a00a3"
+
+SRC_URI = "gitsm://gerrit.automotivelinux.org/gerrit/apps/agl-qt-cluster-demo-receiver;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "1.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+# build-time dependencies
+DEPENDS += "wayland wayland-native \
+ qtwayland qtwayland-native \
+ qtquickcontrols2 qtwebsockets qtbase qtdeclarative \
+ gstreamer1.0 gstreamer1.0-plugins-base gstreamer1.0-plugins-bad"
+
+inherit cmake_qt5 pkgconfig aglwgt
+
+RDEPENDS_${PN} += " \
+ gstreamer1.0-plugins-base \
+ gstreamer1.0-plugins-good \
+ gstreamer1.0-plugins-bad \
+"
diff --git a/recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf/areas.json b/recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf/areas.json
new file mode 100644
index 00000000..90180dca
--- /dev/null
+++ b/recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf/areas.json
@@ -0,0 +1,40 @@
+{
+ "areas": [
+ {
+ "name": "fullscreen",
+ "rect": {
+ "x": 0,
+ "y": 0,
+ "w": 1920,
+ "h": 1080
+ }
+ },
+ {
+ "name": "normal.full",
+ "rect": {
+ "x": 640,
+ "y": 180,
+ "w": 640,
+ "h": 720
+ }
+ },
+ {
+ "name": "restriction.normal",
+ "rect": {
+ "x": 640,
+ "y": 180,
+ "w": 640,
+ "h": 720
+ }
+ },
+ {
+ "name": "on_screen",
+ "rect": {
+ "x": 640,
+ "y": 180,
+ "w": 640,
+ "h": 720
+ }
+ }
+ ]
+}
diff --git a/recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf/layers.json b/recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf/layers.json
new file mode 100644
index 00000000..5c6a5b35
--- /dev/null
+++ b/recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf/layers.json
@@ -0,0 +1,47 @@
+{
+ "description": "Layer mapping",
+ "mappings": [
+ {
+ "name": "BackGroundLayer",
+ "role" : "receiver",
+ "id_range_begin": 0,
+ "id_range_end": 0,
+ "comment": "Work Around: This is a special fallback layer that not stopping wayland event loop."
+ },
+ {
+ "name": "FarHomeScreen",
+ "role": "homescreen",
+ "id_range_begin": 100,
+ "id_range_end": 199,
+ "comment": "FarHomeScreen is the part of HomeScreen. The z order of this layer is lower than NearHomeScreen"
+ },
+ {
+ "name": "Apps",
+ "role": "receiver|fallback",
+ "id_range_begin": 1000,
+ "id_range_end": 2999,
+ "comment": "Application layer"
+ },
+ {
+ "name": "Popup",
+ "role": "popup*",
+ "id_range_begin": 4000,
+ "id_range_end": 4999,
+ "comment": "This layer is for popup application layer"
+ },
+ {
+ "name": "Restriction",
+ "role": "restriction",
+ "id_range_begin": 5000,
+ "id_range_end": 5999,
+ "comment": "This layer is for restriction notification on driving. This is used by restriction role"
+ },
+ {
+ "name": "OnScreen",
+ "role": "^on_screen.*",
+ "id_range_begin": 6000,
+ "id_range_end": 6999,
+ "comment": "System notification layer. For example, on_screen_low_battery_alert to notify user"
+ }
+ ]
+}
diff --git a/recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf/roles.db b/recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf/roles.db
new file mode 100644
index 00000000..13702144
--- /dev/null
+++ b/recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf/roles.db
@@ -0,0 +1,34 @@
+{
+ "roles":[
+ {
+ "category": "homescreen",
+ "role": "homescreen",
+ "area": "fullscreen",
+ "layer": "homescreen",
+ },
+ {
+ "category": "debug",
+ "role": "receiver | fallback",
+ "area": "normal.full",
+ "layer": "apps",
+ },
+ {
+ "category": "restriction",
+ "role": "restriction",
+ "area": "restriction.normal",
+ "layer": "restriction",
+ },
+ {
+ "category": "pop_up",
+ "role": "on_screen | on_screen_phone",
+ "area": "on_screen",
+ "layer": "on_screen",
+ },
+ {
+ "category": "system_alert",
+ "role": "system_alert",
+ "area": "on_screen",
+ "layer": "on_screen",
+ }
+ ]
+}
diff --git a/recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf_1.0.bb b/recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf_1.0.bb
new file mode 100644
index 00000000..4be666bc
--- /dev/null
+++ b/recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf_1.0.bb
@@ -0,0 +1,19 @@
+SUMMARY = "Cluster demo windowmanager configuration"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420"
+
+SRC_URI = "file://layers.json \
+ file://areas.json \
+ file://roles.db \
+"
+
+do_compile[noexec] = "1"
+
+do_install() {
+ install -d ${D}${sysconfdir}/xdg/windowmanager
+ install -m 0644 ${WORKDIR}/layers.json ${D}${sysconfdir}/xdg/windowmanager/layers.json
+ install -m 0644 ${WORKDIR}/areas.json ${D}${sysconfdir}/xdg/windowmanager/areas.json
+ install -m 0644 ${WORKDIR}/roles.db ${D}${sysconfdir}/xdg/windowmanager/roles.db
+}
+
+#FILES_${PN} += "${sysconfdir}/*"
diff --git a/recipes-demo-hmi/dashboard/dashboard_git.bb b/recipes-demo/dashboard/dashboard_git.bb
index 70a8793d..70a8793d 100644
--- a/recipes-demo-hmi/dashboard/dashboard_git.bb
+++ b/recipes-demo/dashboard/dashboard_git.bb
diff --git a/recipes-demo-hmi/homescreen-demo-ci/homescreen-demo-ci_git.bb b/recipes-demo/homescreen-demo-ci/homescreen-demo-ci_git.bb
index c3814f11..c3814f11 100644
--- a/recipes-demo-hmi/homescreen-demo-ci/homescreen-demo-ci_git.bb
+++ b/recipes-demo/homescreen-demo-ci/homescreen-demo-ci_git.bb
diff --git a/recipes-demo-hmi/homescreen/homescreen_git.bb b/recipes-demo/homescreen/homescreen_git.bb
index bfdf06e7..bfdf06e7 100644
--- a/recipes-demo-hmi/homescreen/homescreen_git.bb
+++ b/recipes-demo/homescreen/homescreen_git.bb
diff --git a/recipes-demo-hmi/html5-background/html5-background_git.bb b/recipes-demo/html5-background/html5-background_git.bb
index c0ac220f..c0ac220f 100644
--- a/recipes-demo-hmi/html5-background/html5-background_git.bb
+++ b/recipes-demo/html5-background/html5-background_git.bb
diff --git a/recipes-demo-hmi/html5-dashboard/html5-dashboard_git.bb b/recipes-demo/html5-dashboard/html5-dashboard_git.bb
index ac874755..ac874755 100644
--- a/recipes-demo-hmi/html5-dashboard/html5-dashboard_git.bb
+++ b/recipes-demo/html5-dashboard/html5-dashboard_git.bb
diff --git a/recipes-demo-hmi/html5-homescreen/html5-homescreen_git.bb b/recipes-demo/html5-homescreen/html5-homescreen_git.bb
index 37ca7073..37ca7073 100644
--- a/recipes-demo-hmi/html5-homescreen/html5-homescreen_git.bb
+++ b/recipes-demo/html5-homescreen/html5-homescreen_git.bb
diff --git a/recipes-demo-hmi/html5-hvac/html5-hvac_git.bb b/recipes-demo/html5-hvac/html5-hvac_git.bb
index 7fc89aed..7fc89aed 100644
--- a/recipes-demo-hmi/html5-hvac/html5-hvac_git.bb
+++ b/recipes-demo/html5-hvac/html5-hvac_git.bb
diff --git a/recipes-demo-hmi/html5-launcher/html5-launcher_git.bb b/recipes-demo/html5-launcher/html5-launcher_git.bb
index 47760f67..47760f67 100644
--- a/recipes-demo-hmi/html5-launcher/html5-launcher_git.bb
+++ b/recipes-demo/html5-launcher/html5-launcher_git.bb
diff --git a/recipes-demo-hmi/html5-mediaplayer/html5-mediaplayer_git.bb b/recipes-demo/html5-mediaplayer/html5-mediaplayer_git.bb
index a87b9bcf..a87b9bcf 100644
--- a/recipes-demo-hmi/html5-mediaplayer/html5-mediaplayer_git.bb
+++ b/recipes-demo/html5-mediaplayer/html5-mediaplayer_git.bb
diff --git a/recipes-demo-hmi/html5-mixer/html5-mixer_git.bb b/recipes-demo/html5-mixer/html5-mixer_git.bb
index 97b1195c..97b1195c 100644
--- a/recipes-demo-hmi/html5-mixer/html5-mixer_git.bb
+++ b/recipes-demo/html5-mixer/html5-mixer_git.bb
diff --git a/recipes-demo-hmi/html5-settings/html5-settings_git.bb b/recipes-demo/html5-settings/html5-settings_git.bb
index a167b142..a167b142 100644
--- a/recipes-demo-hmi/html5-settings/html5-settings_git.bb
+++ b/recipes-demo/html5-settings/html5-settings_git.bb
diff --git a/recipes-demo-hmi/hvac/hvac_git.bb b/recipes-demo/hvac/hvac_git.bb
index 5e36e2d4..5e36e2d4 100644
--- a/recipes-demo-hmi/hvac/hvac_git.bb
+++ b/recipes-demo/hvac/hvac_git.bb
diff --git a/recipes-demo-hmi/inputeventmanager/inputeventmanager_git.bb b/recipes-demo/inputeventmanager/inputeventmanager_git.bb
index 73da4878..16ee007f 100644
--- a/recipes-demo-hmi/inputeventmanager/inputeventmanager_git.bb
+++ b/recipes-demo/inputeventmanager/inputeventmanager_git.bb
@@ -20,7 +20,7 @@ PATH_prepend = "${STAGING_DIR_NATIVE}${OE_QMAKE_PATH_QT_BINS}:"
do_install() {
install -d ${D}/usr/AGL/${PN}
install -m 0755 ${B}/inputeventmanager/InputEventManager ${D}/usr/AGL/${PN}/
-
+
install -d ${D}${systemd_user_unitdir}
install -m 0644 ${S}/inputeventmanager/conf/InputEventManager.service ${D}${systemd_user_unitdir}
}
diff --git a/recipes-demo-hmi/launcher/launcher_git.bb b/recipes-demo/launcher/launcher_git.bb
index 5b1de013..5b1de013 100644
--- a/recipes-demo-hmi/launcher/launcher_git.bb
+++ b/recipes-demo/launcher/launcher_git.bb
diff --git a/recipes-demo-hmi/mediaplayer/mediaplayer_git.bb b/recipes-demo/mediaplayer/mediaplayer_git.bb
index 974b2027..974b2027 100644
--- a/recipes-demo-hmi/mediaplayer/mediaplayer_git.bb
+++ b/recipes-demo/mediaplayer/mediaplayer_git.bb
diff --git a/recipes-demo-hmi/messaging/messaging_git.bb b/recipes-demo/messaging/messaging_git.bb
index d2e3ff80..d2e3ff80 100644
--- a/recipes-demo-hmi/messaging/messaging_git.bb
+++ b/recipes-demo/messaging/messaging_git.bb
diff --git a/recipes-demo-hmi/mixer/mixer_git.bb b/recipes-demo/mixer/mixer_git.bb
index 1e4a2717..1e4a2717 100644
--- a/recipes-demo-hmi/mixer/mixer_git.bb
+++ b/recipes-demo/mixer/mixer_git.bb
diff --git a/recipes-demo-hmi/navigation/navigation-demo_git.bb b/recipes-demo/navigation/navigation-demo_git.bb
index 7f3fcdf1..7f3fcdf1 100644
--- a/recipes-demo-hmi/navigation/navigation-demo_git.bb
+++ b/recipes-demo/navigation/navigation-demo_git.bb
diff --git a/recipes-demo-hmi/navigation/ondemandnavi-config/naviconfig.ini b/recipes-demo/navigation/ondemandnavi-config/naviconfig.ini
index 356c6ae6..356c6ae6 100644
--- a/recipes-demo-hmi/navigation/ondemandnavi-config/naviconfig.ini
+++ b/recipes-demo/navigation/ondemandnavi-config/naviconfig.ini
diff --git a/recipes-demo-hmi/navigation/ondemandnavi-config_1.0.bb b/recipes-demo/navigation/ondemandnavi-config_1.0.bb
index 212971f2..212971f2 100644
--- a/recipes-demo-hmi/navigation/ondemandnavi-config_1.0.bb
+++ b/recipes-demo/navigation/ondemandnavi-config_1.0.bb
diff --git a/recipes-demo-hmi/navigation/ondemandnavi_git.bb b/recipes-demo/navigation/ondemandnavi_git.bb
index c06dcae2..c06dcae2 100644
--- a/recipes-demo-hmi/navigation/ondemandnavi_git.bb
+++ b/recipes-demo/navigation/ondemandnavi_git.bb
diff --git a/recipes-demo-hmi/navigation/poiapp-api-key_1.0.bb b/recipes-demo/navigation/poiapp-api-key_1.0.bb
index d353d7dd..d353d7dd 100644
--- a/recipes-demo-hmi/navigation/poiapp-api-key_1.0.bb
+++ b/recipes-demo/navigation/poiapp-api-key_1.0.bb
diff --git a/recipes-demo-hmi/navigation/poiapp/0001-add-display-permission.patch b/recipes-demo/navigation/poiapp/0001-add-display-permission.patch
index 25a8fc31..25a8fc31 100644
--- a/recipes-demo-hmi/navigation/poiapp/0001-add-display-permission.patch
+++ b/recipes-demo/navigation/poiapp/0001-add-display-permission.patch
diff --git a/recipes-demo-hmi/navigation/poiapp_git.bb b/recipes-demo/navigation/poiapp_git.bb
index 2942bf07..2942bf07 100644
--- a/recipes-demo-hmi/navigation/poiapp_git.bb
+++ b/recipes-demo/navigation/poiapp_git.bb
diff --git a/recipes-demo-hmi/navigation/tbtnavi_git.bb b/recipes-demo/navigation/tbtnavi_git.bb
index d2e8e633..d2e8e633 100644
--- a/recipes-demo-hmi/navigation/tbtnavi_git.bb
+++ b/recipes-demo/navigation/tbtnavi_git.bb
diff --git a/recipes-demo-hmi/onscreenapp/onscreenapp_git.bb b/recipes-demo/onscreenapp/onscreenapp_git.bb
index b0f63d16..b0f63d16 100644
--- a/recipes-demo-hmi/onscreenapp/onscreenapp_git.bb
+++ b/recipes-demo/onscreenapp/onscreenapp_git.bb
diff --git a/recipes-demo-hmi/phone/phone_git.bb b/recipes-demo/phone/phone_git.bb
index a8781852..a8781852 100644
--- a/recipes-demo-hmi/phone/phone_git.bb
+++ b/recipes-demo/phone/phone_git.bb
diff --git a/recipes-demo-hmi/qtquickcontrols2-agl-style/qtquickcontrols2-agl-style_git.bb b/recipes-demo/qtquickcontrols2-agl-style/qtquickcontrols2-agl-style_git.bb
index e9e8b2b3..e9e8b2b3 100644
--- a/recipes-demo-hmi/qtquickcontrols2-agl-style/qtquickcontrols2-agl-style_git.bb
+++ b/recipes-demo/qtquickcontrols2-agl-style/qtquickcontrols2-agl-style_git.bb
diff --git a/recipes-demo-hmi/qtquickcontrols2-agl/qtquickcontrols2-agl_git.bb b/recipes-demo/qtquickcontrols2-agl/qtquickcontrols2-agl_git.bb
index 0a432db0..0a432db0 100644
--- a/recipes-demo-hmi/qtquickcontrols2-agl/qtquickcontrols2-agl_git.bb
+++ b/recipes-demo/qtquickcontrols2-agl/qtquickcontrols2-agl_git.bb
diff --git a/recipes-demo-hmi/radio/files/presets-ALS.conf b/recipes-demo/radio/files/presets-ALS.conf
index ff559227..ff559227 100644
--- a/recipes-demo-hmi/radio/files/presets-ALS.conf
+++ b/recipes-demo/radio/files/presets-ALS.conf
diff --git a/recipes-demo-hmi/radio/files/presets-CES.conf b/recipes-demo/radio/files/presets-CES.conf
index 83caeffe..83caeffe 100644
--- a/recipes-demo-hmi/radio/files/presets-CES.conf
+++ b/recipes-demo/radio/files/presets-CES.conf
diff --git a/recipes-demo-hmi/radio/files/presets-FOSDEM.conf b/recipes-demo/radio/files/presets-FOSDEM.conf
index b88364f7..b88364f7 100644
--- a/recipes-demo-hmi/radio/files/presets-FOSDEM.conf
+++ b/recipes-demo/radio/files/presets-FOSDEM.conf
diff --git a/recipes-demo-hmi/radio/radio_git.bb b/recipes-demo/radio/radio_git.bb
index 7b0934fa..7b0934fa 100644
--- a/recipes-demo-hmi/radio/radio_git.bb
+++ b/recipes-demo/radio/radio_git.bb
diff --git a/recipes-demo-hmi/settings/settings_git.bb b/recipes-demo/settings/settings_git.bb
index 776c764c..776c764c 100644
--- a/recipes-demo-hmi/settings/settings_git.bb
+++ b/recipes-demo/settings/settings_git.bb
diff --git a/recipes-demo/simple-can-simulator/files/simple_can_simulator.py b/recipes-demo/simple-can-simulator/files/simple_can_simulator.py
new file mode 100755
index 00000000..83f88706
--- /dev/null
+++ b/recipes-demo/simple-can-simulator/files/simple_can_simulator.py
@@ -0,0 +1,381 @@
+#!/usr/bin/env python3
+# Copyright (c) 2016 Alex Bencz
+# Copyright (c) 2019 Konsulko Group, smurray@konsulko.com
+# Copyright (c) 2020 The Linux Foundation, jsmoeller@linuxfoundation.org
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy of
+# this software and associated documentation files (the "Software"), to deal in
+# the Software without restriction, including without limitation the rights to
+# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+# of the Software, and to permit persons to whom the Software is furnished to do
+# so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+#
+# CANSocket from:
+#
+# https://github.com/abencz/python_socketcan/blob/master/python_socketcan_example.py
+#
+
+import sys
+import socket
+import argparse
+import struct
+import errno
+import threading
+import time
+
+class CANSocket(object):
+ FORMAT = "<IB3x8s"
+ FD_FORMAT = "<IB3x64s"
+
+ def __init__(self, interface=None):
+ self.sock = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
+ if interface is not None:
+ self.bind(interface)
+
+ def bind(self, interface):
+ self.sock.bind((interface,))
+ self.sock.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FD_FRAMES, 1)
+
+ def send(self, can_id, data, flags=0):
+ can_id = can_id | flags
+ can_pkt = struct.pack(self.FORMAT, can_id, len(data), data)
+ self.sock.send(can_pkt)
+
+ def sendfd(self, can_id, data, flags=0):
+ can_id = can_id | flags
+ datafd = data.ljust(64, b'\x00');
+ can_pkt = struct.pack(self.FD_FORMAT, can_id, len(datafd), datafd)
+ self.sock.send(can_pkt)
+
+ def recv(self, flags=0):
+ can_pkt = self.sock.recv(72)
+
+ if len(can_pkt) == 16:
+ can_id, length, data = struct.unpack(self.FORMAT, can_pkt)
+ else:
+ can_id, length, data = struct.unpack(self.FD_FORMAT, can_pkt)
+
+ can_id &= socket.CAN_EFF_MASK
+ return (can_id, data[:length])
+
+class VehicleSimulator(object):
+ DEFAULT_IDLE_RPM = 600
+
+ def __init__(self):
+ self.CRUISEMODE = False
+ self.CRUISEACTIVE = False
+ self.CRUISESPEED = 0
+ self.CRUISERPM = 0
+ self.freq = 10
+ self.vehicle_speed = 0
+ self.engine_speed = self.DEFAULT_IDLE_RPM
+ self.thread = threading.Thread(target=self.run, daemon=True)
+ self.lock = threading.Lock()
+
+ def reset(self):
+ with self.lock:
+ self.vehicle_speed = 0
+ self.engine_speed = self.DEFAULT_IDLE_RPM
+
+ def start(self):
+ self.thread.start()
+
+ def get_engine_speed(self):
+ with self.lock:
+ return int(self.engine_speed)
+
+ def get_vehicle_speed(self):
+ with self.lock:
+ return int(self.vehicle_speed)
+
+ def accelerate(self, target_speed, target_rpm, duration, bycruise = False):
+ if target_speed <= self.vehicle_speed:
+ return
+ v = (target_speed - self.vehicle_speed) / (duration * self.freq)
+ r = (target_rpm - self.engine_speed) / (duration * self.freq)
+ while self.vehicle_speed < target_speed and (not self.CRUISEACTIVE or bycruise):
+ with self.lock:
+ self.vehicle_speed += v;
+ self.engine_speed += r;
+ time.sleep(1 / self.freq)
+
+ def brake(self, target_speed, target_rpm, duration, bycruise = False):
+ if target_speed >= self.vehicle_speed:
+ return
+ v = (self.vehicle_speed - target_speed) / (duration * self.freq)
+ r = (self.engine_speed - target_rpm) / (duration * self.freq)
+ while self.vehicle_speed > target_speed and (not self.CRUISEACTIVE or bycruise):
+ with self.lock:
+ self.vehicle_speed -= v;
+ self.engine_speed -= r;
+ time.sleep(1 / self.freq)
+
+ def increase(self, bycruise = True):
+ if self.CRUISEACTIVE:
+ target_speed = self.vehicle_speed + 5
+ target_rpm = self.engine_speed * 1.1
+ self.accelerate(target_speed, target_rpm, 2, bycruise)
+
+ def decrease(self, bycruise = True):
+ if self.CRUISEACTIVE:
+ target_speed = self.vehicle_speed - 5
+ target_rpm = self.engine_speed * 0.9
+ self.brake(target_speed, target_rpm, 2, bycruise)
+
+ def resume(self, bycruise = True):
+ target_speed = self.CRUISESPEED
+ target_rpm = self.CRUISERPM
+ current_speed = self.get_vehicle_speed()
+ if target_speed > current_speed:
+ self.accelerate(target_speed, target_rpm, 2, bycruise)
+ else:
+ self.brake(target_speed, target_rpm, 2, bycruise)
+
+ def run(self):
+ while True:
+ if not self.CRUISEACTIVE:
+ self.accelerate(80, 3000, 5)
+ self.accelerate(104, 4000, 3)
+ self.brake(80, 3000, 3)
+ self.accelerate(104, 4000, 6)
+ self.brake(40, 2000, 4)
+ self.accelerate(90, 3000, 5)
+ self.brake(1, 650, 5)
+ if not self.CRUISEACTIVE:
+ self.reset()
+ time.sleep(5)
+
+class DiagnosticMessageHandler(object):
+ def __init__(self, can_sock, simulator, verbose=False):
+ self.can_sock = can_sock
+ self.simulator = simulator
+ self.verbose = verbose
+ self.thread = threading.Thread(target=self.run, daemon=True)
+
+ def start(self):
+ self.thread.start()
+
+ def run(self):
+ while True:
+ can_id, data = self.can_sock.recv()
+ #print('%03X#%s' % (can_id, ''.join(format(x, '02X') for x in data)))
+ if can_id == 0x7df:
+ # OBD-II request
+ if data[1] == 0x01 and data[2] == 0x0C:
+ # Engine speed
+ speed = self.simulator.get_engine_speed()
+ #print('engine speed = %d' % speed)
+ if speed > 16383.75:
+ speed = 16383.75
+ reply = [ 0x04, 0x41, 0x0C ]
+ reply.append(4 * speed // 256)
+ reply.append(4 * speed % 256)
+ # pad remaining bytes to make 8
+ reply.append(0)
+ reply.append(0)
+ reply.append(0)
+ self.can_sock.send(0x7e8, bytes(reply), 0)
+ elif data[1] == 0x01 and data[2] == 0x0D:
+ # Vehicle speed
+ speed = int(self.simulator.get_vehicle_speed()) % 256
+ #print('vehicle speed = %d' % speed)
+ reply = [ 0x03, 0x41, 0x0D ]
+ reply.append(speed)
+ # pad remaining bytes to make 8
+ reply.append(0)
+ reply.append(0)
+ reply.append(0)
+ reply.append(0)
+ self.can_sock.send(0x7e8, bytes(reply), 0)
+
+class SteeringWheelMessageHandler(object):
+ def __init__(self, can_sock, simulator, verbose=False):
+ self.can_sock = can_sock
+ self.simulator = simulator
+ self.verbose = verbose
+ self.thread = threading.Thread(target=self.run, daemon=True)
+ self.buttonpressed = False
+ self.buttonenabled = False
+ self.buttoncancel = False
+ self.buttondec = False
+ self.buttoninc = False
+ self.cruisemode = False
+ self.cruiseactive = False
+
+ def start(self):
+ self.thread.start()
+
+ def run(self):
+ while True:
+ can_id, data = self.can_sock.recv()
+ #print('%03X#%s' % (can_id, ''.join(format(x, '02X') for x in data)))
+ if can_id == 0x21:
+ #print('%03X#%s' % (can_id, ''.join(format(x, '02X') for x in data)))
+ if data:
+ #if data[6]:
+ #print('data6: %02X' % (data[6]))
+ if data[6] == 0x80 and not self.buttonpressed:
+ # we do skip any further lin messages
+ # two buttons at the same time won't work
+ # (aka unlikely w/o twisting fingers)
+ self.buttonpressed = True
+ self.buttonenabled = True
+ if data[6] == 0x08 and not self.buttonpressed:
+ self.buttonpressed = True
+ self.buttoncancel = True
+ if data[6] == 0x10 and not self.buttonpressed:
+ self.buttonpressed = True
+ self.buttondec = True
+ if data[6] == 0x40 and not self.buttonpressed:
+ self.buttonpressed = True
+ self.buttoninc = True
+ if data[6] == 0x00 and self.buttonpressed:
+ #now handle it as the button was released
+ if self.buttonenabled:
+ self.buttonenabled = False
+ self.cruisemode = not self.cruisemode
+ #print("set cruisemode to %s" % self.cruisemode)
+ self.simulator.CRUISEMODE = self.cruisemode
+ # disable/reset all if going off
+ if not self.cruisemode:
+ self.cruiseactive = False
+ self.simulator.CRUISEACTIVE = self.cruiseactive
+ self.simulator.CRUISESPEED = 0
+ self.simulator.CRUISERPM = 0
+ #print("set cruiseactive to %s" % self.cruiseactive)
+ if self.buttoncancel:
+ self.buttoncancel = False
+ self.simulator.CRUISESPEED = self.simulator.get_vehicle_speed()
+ self.simulator.CRUISERPM = self.simulator.get_engine_speed()
+ #print("set cruisespeed to %d" % self.simulator.CRUISESPEED )
+ #print("set cruiserpm to %d" % self.simulator.CRUISERPM )
+ self.cruiseactive = False
+ #print("set cruiseactive to %s" % self.cruiseactive )
+ self.simulator.CRUISEACTIVE = self.cruiseactive
+ if self.buttondec:
+ self.buttondec = False
+ if self.cruiseactive:
+ #print("decrease")
+ self.simulator.decrease()
+ else:
+ # set speed
+ #print("set speed")
+ self.simulator.CRUISESPEED = self.simulator.get_vehicle_speed()
+ self.simulator.CRUISERPM = self.simulator.get_engine_speed()
+ #print("set cruisespeed to %d" % self.simulator.CRUISESPEED )
+ #print("set cruiserpm to %d" % self.simulator.CRUISERPM )
+ self.cruiseactive = not self.cruiseactive
+ #print("set cruiseactive to %s" % self.cruiseactive )
+ self.simulator.CRUISEACTIVE = self.cruiseactive
+ if self.buttoninc:
+ self.buttoninc = False
+ if self.cruiseactive:
+ #print("increase")
+ self.simulator.increase()
+ else:
+ if self.simulator.CRUISESPEED > 0:
+ # resume
+ self.cruiseactive = not self.cruiseactive
+ self.simulator.CRUISEACTIVE = self.cruiseactive
+ #print("set cruiseactive to %s" % self.cruiseactive )
+ #print("resume")
+ self.simulator.resume()
+ self.buttonpressed = False
+
+
+class StatusMessageSender(object):
+ def __init__(self, can_sock, simulator, verbose=False):
+ self.can_sock = can_sock
+ self.simulator = simulator
+ self.verbose = verbose
+ self.thread = threading.Thread(target=self.run, daemon=True)
+
+ def start(self):
+ self.thread.start()
+
+ def run(self):
+ while True:
+ # Engine speed
+ speed = self.simulator.get_engine_speed()
+ if self.verbose:
+ print('engine speed = %d' % speed)
+ if speed > 16383.75:
+ speed = 16383.75
+ # Message is 1 byte unknown, 1 byte fuel level, 2 bytes engine speed (4x), fuel low @ bit 55
+ msg = [ 0, 0 ]
+ speed *= 4
+ msg.append(speed // 256)
+ msg.append(speed % 256)
+ # pad remaining bytes to make 8
+ msg.append(0)
+ msg.append(0)
+ msg.append(0)
+ msg.append(0)
+ self.can_sock.send(0x3d9, bytes(msg), 0)
+
+ # Vehicle speed
+ speed = int(self.simulator.get_vehicle_speed()) % 256
+ if self.verbose:
+ print('vehicle speed = %d' % speed)
+ # Message is 15 bits speed (64x), left aligned
+ msg = [ ]
+ # Note: extra 2x to yield required left-alignment
+ speed *= 128
+ msg.append(speed // 256)
+ msg.append(speed % 256)
+ # pad remaining bytes to make 8
+ msg.append(0)
+ msg.append(0)
+ msg.append(0)
+ msg.append(0)
+ msg.append(0)
+ msg.append(0)
+ self.can_sock.send(0x3e9, bytes(msg), 0)
+
+ # Sleep 100 ms
+ time.sleep(0.1)
+
+def main():
+ parser = argparse.ArgumentParser(description='Simple CAN vehicle simulator.')
+ parser.add_argument('interface', type=str, help='interface name (e.g. vcan0)')
+ parser.add_argument('-v', '--verbose', help='increase output verbosity', action='store_true')
+ args = parser.parse_args()
+
+ try:
+ can_sock = CANSocket(args.interface)
+ diag_can_sock = CANSocket(args.interface)
+ steeringwheel_can_sock = CANSocket(args.interface)
+ except OSError as e:
+ sys.stderr.write('Could not listen on interface {0}\n'.format(args.interface))
+ sys.exit(e.errno)
+
+ print('Using {0}'.format(args.interface))
+ sim = VehicleSimulator()
+ status_sender = StatusMessageSender(can_sock, sim, args.verbose)
+ diag_handler = DiagnosticMessageHandler(diag_can_sock, sim, args.verbose)
+ steeringwheel_handler = SteeringWheelMessageHandler(steeringwheel_can_sock, sim, args.verbose)
+ sim.start()
+ status_sender.start()
+ diag_handler.start()
+ steeringwheel_handler.start()
+ try:
+ while True:
+ time.sleep(60)
+ except (KeyboardInterrupt, SystemExit):
+ #sim.stop()
+ sys.exit(0)
+
+if __name__ == '__main__':
+ main()
diff --git a/recipes-demo/simple-can-simulator/simple-can-simulator.bb b/recipes-demo/simple-can-simulator/simple-can-simulator.bb
new file mode 100644
index 00000000..bca44876
--- /dev/null
+++ b/recipes-demo/simple-can-simulator/simple-can-simulator.bb
@@ -0,0 +1,15 @@
+DESCRIPTION = "Simulator that generates CAN messages of a driving car"
+LICENSE = "GPLv2"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/GPL-2.0;md5=801f80980d171dd6425610833a22dbe6"
+
+SRC_URI = "file://simple_can_simulator.py"
+
+do_configure[noexec] = "1"
+do_compile[noexec] = "1"
+
+do_install() {
+ install -d ${D}${sbindir}
+ install -m 0755 ${WORKDIR}/simple_can_simulator.py ${D}${sbindir}
+}
+
+RDEPENDS_${PN} = "python3"
diff --git a/recipes-demo-hmi/taskmanager/taskmanager_git.bb b/recipes-demo/taskmanager/taskmanager_git.bb
index 68965eb5..68965eb5 100644
--- a/recipes-demo-hmi/taskmanager/taskmanager_git.bb
+++ b/recipes-demo/taskmanager/taskmanager_git.bb
diff --git a/recipes-demo/telematics-recorder/telematics-recorder_git.bb b/recipes-demo/telematics-recorder/telematics-recorder_git.bb
new file mode 100644
index 00000000..1636cb00
--- /dev/null
+++ b/recipes-demo/telematics-recorder/telematics-recorder_git.bb
@@ -0,0 +1,25 @@
+SUMMARY = "Telematics Recorder AGL Demonstration"
+DESCRIPTION = "AGL Application for demonstrating telematics recorder functionality"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-telematics-demo-recorder"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=86d3f3a95c324c9479bd8986968f4327"
+
+SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/agl-telematics-demo-recorder;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AUTOREV}"
+
+PV = "1.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+# build-time dependencies
+DEPENDS = "glib-2.0 mosquitto"
+
+inherit cmake aglwgt
+
+RDEPENDS_${PN} += " \
+ agl-service-can-low-level \
+ agl-service-gps \
+ agl-service-network \
+ libmosquitto1 \
+"
diff --git a/recipes-demo-hmi/waltham-receiver/waltham-receiver_git.bb b/recipes-demo/waltham-receiver/waltham-receiver_git.bb
index d793b066..d793b066 100644
--- a/recipes-demo-hmi/waltham-receiver/waltham-receiver_git.bb
+++ b/recipes-demo/waltham-receiver/waltham-receiver_git.bb
diff --git a/recipes-devtools/low-level-can-generator/low-level-can-generator_git.bb b/recipes-devtools/low-level-can-generator/low-level-can-generator_git.bb
new file mode 100644
index 00000000..4c0bda07
--- /dev/null
+++ b/recipes-devtools/low-level-can-generator/low-level-can-generator_git.bb
@@ -0,0 +1,17 @@
+SUMMARY = "Low level CAN generator"
+DESCRIPTION = "Generator used to customize low level CAN service with customs signals"
+SECTION = "devel"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+inherit cmake pkgconfig
+BBCLASSEXTEND = "nativesdk"
+DEPENDS = " cmake-apps-module"
+
+SRC_URI = "gitsm://gerrit.automotivelinux.org/gerrit/src/low-level-can-generator;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "0a3e354c3d81866e1a755367ab5592b3ced868bb"
+
+PV = "${AGLVERSION}"
+S = "${WORKDIR}/git"
+
diff --git a/recipes-devtools/python/python3-asyncssh_2.3.0.bb b/recipes-devtools/python/python3-asyncssh_2.3.0.bb
new file mode 100644
index 00000000..ab7e8afa
--- /dev/null
+++ b/recipes-devtools/python/python3-asyncssh_2.3.0.bb
@@ -0,0 +1,15 @@
+DESCRIPTION = "\
+AsyncSSH is a Python package which provides an asynchronous client and \
+server implementation of the SSHv2 protocol on top of the Python \
+asyncio framework."
+HOMEPAGE = "https://github.com/ronf/asyncssh"
+LICENSE = "EPL-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=d9fc0efef5228704e7f5b37f27192723"
+
+SRC_URI[sha256sum] = "44bda34c7123f00c3df95d24e2dc8d43c4d17b456fbb8c434ef4f4a7ebb5265e"
+
+inherit pypi setuptools3
+
+RDEPENDS_${PN} += "${PYTHON_PN}-asyncio ${PYTHON_PN}-cryptography"
+
+BBCLASSEXTEND = "native"
diff --git a/recipes-devtools/python/python3-pytest-dependency_0.5.1.bb b/recipes-devtools/python/python3-pytest-dependency_0.5.1.bb
new file mode 100644
index 00000000..5ff2d4ec
--- /dev/null
+++ b/recipes-devtools/python/python3-pytest-dependency_0.5.1.bb
@@ -0,0 +1,12 @@
+DESCRIPTION = "pytest-dependency manages dependencies of tests."
+HOMEPAGE = "https://github.com/RKrahl/pytest-dependency"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://README.rst;md5=35b9938ae48d25e6b8306232e98463dd"
+
+SRC_URI[sha256sum] = "c2a892906192663f85030a6ab91304e508e546cddfe557d692d61ec57a1d946b"
+
+inherit pypi setuptools3
+
+DEPENDS += "${PYTHON_PN}-pytest-native"
+
+BBCLASSEXTEND = "native"
diff --git a/recipes-devtools/python/python3-pytest-reverse_1.0.1.bb b/recipes-devtools/python/python3-pytest-reverse_1.0.1.bb
new file mode 100644
index 00000000..5ed9b1d9
--- /dev/null
+++ b/recipes-devtools/python/python3-pytest-reverse_1.0.1.bb
@@ -0,0 +1,12 @@
+DESCRIPTION = "pytest-reverse is a pytest plugin to reverse test order"
+HOMEPAGE = "https://github.com/adamchainz/pytest-reverse"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=caf1f407ae86ecd57ab721dff94079b7"
+
+SRC_URI[sha256sum] = "40cbc47df8a262fed778e500f4d0b17d2d08ef8b9fbf899c0bab9488be192aac"
+
+inherit pypi setuptools3
+
+DEPENDS += "${PYTHON_PN}-pytest-native"
+
+BBCLASSEXTEND = "native"
diff --git a/recipes-devtools/run-agl-postinsts/run-agl-postinsts/run-agl-postinsts b/recipes-devtools/run-agl-postinsts/run-agl-postinsts/run-agl-postinsts
new file mode 100755
index 00000000..1d1a5a05
--- /dev/null
+++ b/recipes-devtools/run-agl-postinsts/run-agl-postinsts/run-agl-postinsts
@@ -0,0 +1,48 @@
+#!/bin/sh
+#
+# Copyright 2017 IoT.bzh.
+
+# Author: Ronan Le Martret <ronan.lemartret@iot.bzh>
+#
+
+# The following script will run all the scriptlets found in #SYSCONFDIR#/agl-postinsts.
+
+agl_pi_dir="#SYSCONFDIR#/agl-postinsts"
+
+POSTINST_LOGGING=1
+LOGFILE=/var/log/agl-postinstall.log
+
+[ -e $LOGFILE ] && mv ${LOGFILE} ${LOGFILE}.old.$(date +%F--%H%M.%S)
+
+append_log=">>$LOGFILE 2>&1"
+
+exec_postinst_scriptlets() {
+ for i in `ls $agl_pi_dir`; do
+ i=$agl_pi_dir/$i
+ echo "Running postinst $i..."
+ [ "$POSTINST_LOGGING" = "1" ] && eval echo "Running postinst $i..." $append_log
+ if [ -x $i ]; then
+ eval sh -c $i $append_log
+ if [ $? -eq 0 ]; then
+ rm $i
+ else
+ echo "ERROR: postinst $i failed."
+ [ "$POSTINST_LOGGING" = "1" ] && eval echo "ERROR: postinst $i failed." $append_log
+ remove_agl_pi_dir=0
+ fi
+ else
+ echo "ERROR: postinst $i do not exists or do not have execute permission."
+ [ "$POSTINST_LOGGING" = "1" ] && eval echo "ERROR: postinst $i do not exists or do not have execute permission." $append_log
+ remove_agl_pi_dir=0
+ fi
+ done
+}
+
+remove_agl_pi_dir=1
+exec_postinst_scriptlets
+systemctl daemon-reload
+
+# since all postinstalls executed successfully, remove the postinstalls directory
+if [ $remove_agl_pi_dir = 1 ]; then
+ rm -rf $agl_pi_dir
+fi
diff --git a/recipes-devtools/run-agl-postinsts/run-agl-postinsts/run-agl-postinsts.service b/recipes-devtools/run-agl-postinsts/run-agl-postinsts/run-agl-postinsts.service
new file mode 100644
index 00000000..8f8667db
--- /dev/null
+++ b/recipes-devtools/run-agl-postinsts/run-agl-postinsts/run-agl-postinsts.service
@@ -0,0 +1,17 @@
+[Unit]
+Description=Run pending agl postinsts
+DefaultDependencies=no
+After=#SYSTEMD_SERVICE_AFTER#
+Before=#SYSTEMD_SERVICE_BEFORE#
+ConditionPathExists=#SYSCONFDIR#/agl-postinsts
+
+[Service]
+Type=oneshot
+StandardOutput=journal+console
+ExecStart=#SBINDIR#/run-agl-postinsts
+ExecStartPost=#BASE_BINDIR#/systemctl disable run-agl-postinsts.service
+RemainAfterExit=No
+TimeoutSec=0
+
+[Install]
+WantedBy=multi-user.target
diff --git a/recipes-devtools/run-agl-postinsts/run-agl-postinsts_1.0.bb b/recipes-devtools/run-agl-postinsts/run-agl-postinsts_1.0.bb
new file mode 100644
index 00000000..31503aa2
--- /dev/null
+++ b/recipes-devtools/run-agl-postinsts/run-agl-postinsts_1.0.bb
@@ -0,0 +1,46 @@
+SUMMARY = "Runs AGL postinstall scripts on first boot of the target device"
+SECTION = "devel"
+
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
+
+SRC_URI = "file://run-agl-postinsts \
+ file://run-agl-postinsts.service"
+
+S = "${WORKDIR}"
+
+inherit allarch systemd
+
+SYSTEMD_SERVICE_${PN} = "run-agl-postinsts.service"
+
+SYSTEMD_SERVICE_AFTER ?= "dbus.service cynagora.service"
+
+SYSTEMD_SERVICE_BEFORE ?= "systemd-user-sessions.service"
+
+do_configure() {
+ :
+}
+
+do_compile () {
+ :
+}
+
+do_install() {
+ install -d ${D}${sbindir}
+ install -m 0755 ${WORKDIR}/run-agl-postinsts ${D}${sbindir}/
+
+ install -d ${D}${systemd_unitdir}/system/
+ install -m 0644 ${WORKDIR}/run-agl-postinsts.service ${D}${systemd_unitdir}/system/
+
+ sed -i -e 's:#SYSCONFDIR#:${sysconfdir}:g' \
+ -e 's:#SBINDIR#:${sbindir}:g' \
+ -e 's:#BASE_BINDIR#:${base_bindir}:g' \
+ -e 's:#LOCALSTATEDIR#:${localstatedir}:g' \
+ ${D}${sbindir}/run-agl-postinsts \
+ ${D}${systemd_unitdir}/system/run-agl-postinsts.service
+
+ sed -i -e 's:#SYSTEMD_SERVICE_AFTER#:${SYSTEMD_SERVICE_AFTER}:g' \
+ -e 's:#SYSTEMD_SERVICE_BEFORE#:${SYSTEMD_SERVICE_BEFORE}:g' \
+ ${D}${systemd_unitdir}/system/run-agl-postinsts.service
+}
+
diff --git a/recipes-devtools/run-agl-postinsts/run-agl-postinsts_1.0.bbappend b/recipes-devtools/run-agl-postinsts/run-agl-postinsts_1.0.bbappend
new file mode 100644
index 00000000..590ab708
--- /dev/null
+++ b/recipes-devtools/run-agl-postinsts/run-agl-postinsts_1.0.bbappend
@@ -0,0 +1 @@
+SYSTEMD_SERVICE_AFTER_append = " afm-system-daemon.service"
diff --git a/recipes-graphics/hmi-debug/files/hmi-debug b/recipes-graphics/hmi-debug/files/hmi-debug
new file mode 100644
index 00000000..fee9573b
--- /dev/null
+++ b/recipes-graphics/hmi-debug/files/hmi-debug
@@ -0,0 +1,8 @@
+#You can select log level of HMI framework
+#1 ERROR
+#2 WARNING
+#3 NOTICE
+#4 INFO
+#5 DEBUG
+#If you want to output debug log about hmi-framework, please uncomment the following.
+#USE_HMI_DEBUG=5
diff --git a/recipes-graphics/hmi-debug/hmi-debug_git.bb b/recipes-graphics/hmi-debug/hmi-debug_git.bb
new file mode 100644
index 00000000..27fb60d6
--- /dev/null
+++ b/recipes-graphics/hmi-debug/hmi-debug_git.bb
@@ -0,0 +1,19 @@
+DESCRIPTION = "Configurations for HMI framework"
+
+SECTION = "HMI"
+LICENSE = "Apache-2.0"
+
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+SRC_URI = " \
+ file://hmi-debug \
+"
+
+FILES_${PN} = " \
+ ${sysconfdir}/afm/unit.env.d \
+"
+
+do_install() {
+ install -d ${D}${sysconfdir}/afm/unit.env.d
+ install -m 644 ${WORKDIR}/hmi-debug ${D}${sysconfdir}/afm/unit.env.d
+}
diff --git a/recipes-graphics/kms-conf/kms-conf/kms.conf b/recipes-graphics/kms-conf/kms-conf/kms.conf
new file mode 100644
index 00000000..7fa9686e
--- /dev/null
+++ b/recipes-graphics/kms-conf/kms-conf/kms.conf
@@ -0,0 +1,8 @@
+{
+ "device": "/dev/dri/card0",
+ "outputs": [
+ {
+ "name":"HDMI-A-1"
+ }
+ ]
+}
diff --git a/recipes-graphics/kms-conf/kms-conf/m3ulcb/kms.conf b/recipes-graphics/kms-conf/kms-conf/m3ulcb/kms.conf
new file mode 100644
index 00000000..16ea328f
--- /dev/null
+++ b/recipes-graphics/kms-conf/kms-conf/m3ulcb/kms.conf
@@ -0,0 +1,12 @@
+{
+ "device": "/dev/dri/card0",
+ "outputs": [
+ {
+ "name":"HDMI-A-1"
+ },
+ {
+ "name":"LVDS1",
+ "mode":"off"
+ }
+ ]
+}
diff --git a/recipes-graphics/kms-conf/kms-conf_1.0.bb b/recipes-graphics/kms-conf/kms-conf_1.0.bb
new file mode 100644
index 00000000..b063f65f
--- /dev/null
+++ b/recipes-graphics/kms-conf/kms-conf_1.0.bb
@@ -0,0 +1,12 @@
+SUMMARY = "kms configuration file for the qt eglfs platform"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
+
+SRC_URI = " \
+ file://kms.conf \
+"
+
+do_install_append() {
+ install -d ${D}/etc
+ install -m 644 ${WORKDIR}/kms.conf ${D}/etc
+}
diff --git a/recipes-graphics/libhomescreen/libhomescreen_git.bb b/recipes-graphics/libhomescreen/libhomescreen_git.bb
new file mode 100644
index 00000000..da511c8a
--- /dev/null
+++ b/recipes-graphics/libhomescreen/libhomescreen_git.bb
@@ -0,0 +1,19 @@
+SUMMARY = "AGL Home Screen Library"
+DESCRIPTION = "libhomescreen"
+HOMEPAGE = "http://docs.automotivelinux.org"
+LICENSE = "Apache-2.0"
+SECTION = "libs"
+
+BBCLASSEXTEND = " nativesdk"
+
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984"
+
+DEPENDS = "af-binder json-c"
+
+inherit cmake
+
+SRC_URI = "git://gerrit.automotivelinux.org/gerrit/src/libhomescreen.git;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "0d65d54ba63508c0ef545d02e94d5702f9c8ecb3"
+S = "${WORKDIR}/git"
+
+RDEPENDS_${PN} = "agl-service-homescreen"
diff --git a/recipes-graphics/qlibhomescreen/qlibhomescreen_git.bb b/recipes-graphics/qlibhomescreen/qlibhomescreen_git.bb
new file mode 100644
index 00000000..09a262eb
--- /dev/null
+++ b/recipes-graphics/qlibhomescreen/qlibhomescreen_git.bb
@@ -0,0 +1,13 @@
+SUMMARY = "A wrapper library of libhomescreen for Qt Application in AGL"
+SECTION = "libs"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=2ee41112a44fe7014dce33e26468ba93"
+
+DEPENDS = "qtbase libhomescreen"
+RDEPENDS_${PN} = "libhomescreen"
+
+inherit qmake5
+
+SRC_URI = "git://gerrit.automotivelinux.org/gerrit/src/libqthomescreen.git;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "b218476402bceda7eb42d41064552a7261ff3205"
+S = "${WORKDIR}/git"
diff --git a/recipes-graphics/ttf-fonts/ttf-dejavu_%.bbappend b/recipes-graphics/ttf-fonts/ttf-dejavu_%.bbappend
index 15986586..86a5d90c 100644
--- a/recipes-graphics/ttf-fonts/ttf-dejavu_%.bbappend
+++ b/recipes-graphics/ttf-fonts/ttf-dejavu_%.bbappend
@@ -1,12 +1 @@
-FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
-DEPENDS += "fontforge-native"
-
-# From the orginal work located at https://aur.archlinux.org/packages/ttf-dejavu-emojiless/
-
-SRC_URI_append = " file://cleaner.py"
-
-do_install_prepend() {
- for TTF in ${S}/*.ttf; do
- fontforge -script ${WORKDIR}/cleaner.py ${TTF}
- done
-}
+require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'ttf-dejavu_agldemo.inc', '', d)}
diff --git a/recipes-graphics/ttf-fonts/ttf-dejavu_agldemo.inc b/recipes-graphics/ttf-fonts/ttf-dejavu_agldemo.inc
new file mode 100644
index 00000000..bb47bdc7
--- /dev/null
+++ b/recipes-graphics/ttf-fonts/ttf-dejavu_agldemo.inc
@@ -0,0 +1,12 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
+DEPENDS_append = " fontforge-native"
+
+# From the orginal work located at https://aur.archlinux.org/packages/ttf-dejavu-emojiless/
+
+SRC_URI_append = " file://cleaner.py"
+
+do_install_prepend() {
+ for TTF in ${S}/*.ttf; do
+ fontforge -script ${WORKDIR}/cleaner.py ${TTF}
+ done
+}
diff --git a/recipes-graphics/wayland/weston-init.bbappend b/recipes-graphics/wayland/weston-init.bbappend
new file mode 100644
index 00000000..8af3184a
--- /dev/null
+++ b/recipes-graphics/wayland/weston-init.bbappend
@@ -0,0 +1 @@
+require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'weston-init_agldemo.inc', '', d)}
diff --git a/recipes-graphics/wayland/weston-init/tmpfiles.conf.in b/recipes-graphics/wayland/weston-init/tmpfiles.conf.in
new file mode 100644
index 00000000..c4b302fa
--- /dev/null
+++ b/recipes-graphics/wayland/weston-init/tmpfiles.conf.in
@@ -0,0 +1,6 @@
+# This file is distributed to create weston XDG_RUNTIME_DIR (/run/deamon/@WESTONUSER@)
+#
+# See tmpfiles.d(5) for details
+
+d /run/platform/ 0775 root root -
+d /run/platform/@WESTONUSER@ 0770 @WESTONUSER@ @WESTONGROUP@ -
diff --git a/recipes-graphics/wayland/weston-init/weston-dep.conf.in b/recipes-graphics/wayland/weston-init/weston-dep.conf.in
new file mode 100644
index 00000000..2b810209
--- /dev/null
+++ b/recipes-graphics/wayland/weston-init/weston-dep.conf.in
@@ -0,0 +1,3 @@
+[Unit]
+Requires=@WESTON_DRM_DEVICE@
+After=@WESTON_DRM_DEVICE@
diff --git a/recipes-graphics/wayland/weston-init/weston.conf.in b/recipes-graphics/wayland/weston-init/weston.conf.in
new file mode 100644
index 00000000..9c3df052
--- /dev/null
+++ b/recipes-graphics/wayland/weston-init/weston.conf.in
@@ -0,0 +1,12 @@
+[Service]
+Type=notify
+Environment="XDG_RUNTIME_DIR=@XDG_RUNTIME_DIR@"
+# Note that clearing PAMName (thus not having PAMName=login) disables
+# logind support for the session, which allows setting XDG_RUNTIME_DIR
+# to something other than /run/user/% (as is done above).
+# Without systemd-logind support, weston needs to be patched to allow
+# its direct launcher to work for non-root users in this scenario.
+PAMName=
+ExecStart=
+ExecStart=@WESTONSTART@
+SmackProcessLabel=System::Weston
diff --git a/recipes-graphics/wayland/weston-init/zz-dri-imx.rules.in b/recipes-graphics/wayland/weston-init/zz-dri-imx.rules.in
new file mode 100644
index 00000000..585db6be
--- /dev/null
+++ b/recipes-graphics/wayland/weston-init/zz-dri-imx.rules.in
@@ -0,0 +1,2 @@
+SUBSYSTEM=="gpu_class", MODE="0660", GROUP="@WESTONGROUP@", SECLABEL{smack}="*"
+
diff --git a/recipes-graphics/wayland/weston-init/zz-dri.rules.in b/recipes-graphics/wayland/weston-init/zz-dri.rules.in
new file mode 100644
index 00000000..51c68c30
--- /dev/null
+++ b/recipes-graphics/wayland/weston-init/zz-dri.rules.in
@@ -0,0 +1 @@
+SUBSYSTEM=="drm", MODE="0660", GROUP="@WESTONGROUP@", SECLABEL{smack}="*", TAG+="systemd", ENV{SYSTEMD_WANTS}="weston@@WESTONUSER@.service"
diff --git a/recipes-graphics/wayland/weston-init/zz-input.rules.in b/recipes-graphics/wayland/weston-init/zz-input.rules.in
new file mode 100644
index 00000000..fb3e677f
--- /dev/null
+++ b/recipes-graphics/wayland/weston-init/zz-input.rules.in
@@ -0,0 +1 @@
+SUBSYSTEM=="input", MODE="0660", GROUP="input", SECLABEL{smack}="*", TAG+="systemd", ENV{SYSTEMD_WANTS}="weston@@WESTONUSER@.service"
diff --git a/recipes-graphics/wayland/weston-init/zz-tty.rules.in b/recipes-graphics/wayland/weston-init/zz-tty.rules.in
new file mode 100644
index 00000000..e5ce4b55
--- /dev/null
+++ b/recipes-graphics/wayland/weston-init/zz-tty.rules.in
@@ -0,0 +1 @@
+SUBSYSTEM=="tty", KERNEL=="tty7", OWNER="@WESTONUSER@", SECLABEL{smack}="*", TAG+="systemd", ENV{SYSTEMD_WANTS}="weston@@WESTONUSER@.service"
diff --git a/recipes-graphics/wayland/weston-init_agldemo.inc b/recipes-graphics/wayland/weston-init_agldemo.inc
new file mode 100644
index 00000000..a5f0b09b
--- /dev/null
+++ b/recipes-graphics/wayland/weston-init_agldemo.inc
@@ -0,0 +1,77 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/weston-init:"
+
+inherit agl-graphical
+
+AGL_DEFAULT_WESTONSTART ??= "/usr/bin/agl-compositor --config ${sysconfdir}/xdg/weston/weston.ini"
+
+WESTONSTART ??= "${AGL_DEFAULT_WESTONSTART} ${WESTONARGS}"
+WESTONSTART_append = " ${@bb.utils.contains("IMAGE_FEATURES", "debug-tweaks", " --log=${DISPLAY_XDG_RUNTIME_DIR}/compositor.log", "",d)}"
+
+# Systemd name of DRM device to have weston/agl-compositor startup depend
+# upon, if required. Currently only x86-64 seems to need a dependency to
+# avoid failures due to racing with i915 driver init on e.g. UpSquared.
+# It seems safer for now to only apply it there rather than doing a blanket
+# default everywhere that might then need to be over-ridden for vendor BSPs.
+WESTON_DRM_DEVICE ?= ""
+
+WIFILES = " \
+ file://weston.conf.in \
+ file://weston-dep.conf.in \
+ file://tmpfiles.conf.in \
+ file://zz-dri.rules.in \
+ file://zz-input.rules.in \
+ file://zz-tty.rules.in \
+"
+
+WIFILES_append_imx = " \
+ file://zz-dri-imx.rules.in \
+"
+
+SRC_URI_append = " ${WIFILES}"
+
+do_install_append() {
+ # Remove upstream weston udev rules just to be safe
+ rm -f ${D}${sysconfdir}/udev/rules.d/71-weston-drm.rules
+
+ # Process ".in" files
+ files=$(echo ${WIFILES} | sed s,file://,,g)
+ for f in ${files}; do
+ g=${f%.in}
+ if [ "${f}" != "${g}" ]; then
+ sed -e "s,@WESTONUSER@,${WESTONUSER},g" \
+ -e "s,@WESTONGROUP@,${WESTONGROUP},g" \
+ -e "s,@XDG_RUNTIME_DIR@,${DISPLAY_XDG_RUNTIME_DIR},g" \
+ -e "s,@WESTONSTART@,${WESTONSTART},g" \
+ -e "s,@WESTON_DRM_DEVICE@,${WESTON_DRM_DEVICE},g" \
+ ${WORKDIR}/${f} > ${WORKDIR}/${g}
+ fi
+ done
+
+ # Install weston drop-in
+ install -d ${D}${systemd_system_unitdir}/weston@.service.d
+ install -m644 ${WORKDIR}/weston.conf ${D}/${systemd_system_unitdir}/weston@.service.d/weston-init.conf
+
+ # Install weston DRM device dependency drop-in if required
+ if [ -n "${WESTON_DRM_DEVICE}" ]; then
+ install -m 0644 ${WORKDIR}/weston-dep.conf ${D}/${systemd_system_unitdir}/weston@.service.d/
+ fi
+
+ # Install tmpfiles drop-in
+ install -d ${D}${libdir}/tmpfiles.d
+ install -m644 ${WORKDIR}/tmpfiles.conf ${D}${libdir}/tmpfiles.d/weston-init.conf
+
+ # Install udev rules
+ install -d ${D}${sysconfdir}/udev/rules.d
+ for f in ${files}; do
+ g=${f%.in}
+ h=${g%.rules}
+ if [ "${g}" != "${h}" ]; then
+ install -m644 ${WORKDIR}/${g} ${D}${sysconfdir}/udev/rules.d
+ fi
+ done
+}
+
+FILES_${PN} += " \
+ ${libdir}/tmpfiles.d/ \
+ ${systemd_system_unitdir}/weston@.service.d/ \
+"
diff --git a/recipes-kernel/most/files/0002-src-most-add-auto-conf-feature.patch b/recipes-kernel/most/files/0002-src-most-add-auto-conf-feature.patch
new file mode 100644
index 00000000..dd811c81
--- /dev/null
+++ b/recipes-kernel/most/files/0002-src-most-add-auto-conf-feature.patch
@@ -0,0 +1,472 @@
+From 9cb7cb85f59509ac445116e9458c502cf6cb74e6 Mon Sep 17 00:00:00 2001
+From: Christian Gromm <christian.gromm@microchip.com>
+Date: Thu, 9 Nov 2017 13:20:23 +0100
+Subject: [PATCH 2/2] src: most: add auto conf feature
+
+This patch adds the auto configuration feature to the driver
+sources. It is needed to have the driver configured automatically
+upon start up w/o the need for userspace to set up sysfs.
+
+Signed-off-by: Christian Gromm <christian.gromm@microchip.com>
+---
+ driver/Makefile | 3 +
+ driver/default_conf.c | 162 ++++++++++++++++++++++++++++++++++++++++++++++
+ driver/include/mostcore.h | 64 ++++++++++++++++++
+ driver/mostcore/core.c | 120 ++++++++++++++++++++++++++++------
+ 4 files changed, 331 insertions(+), 18 deletions(-)
+ create mode 100644 driver/default_conf.c
+
+diff --git a/Makefile b/Makefile
+index e77a4b6..6d74ebe 100644
+--- a/Makefile
++++ b/Makefile
+@@ -6,6 +6,9 @@ obj-m := mostcore.o
+ mostcore-y := mostcore/core.o
+ CFLAGS_core.o := -I$(src)/include/
+
++obj-m += default_conf.o
++CFLAGL_default_conf.o := -I$(src)/include
++
+ obj-m += aim_cdev.o
+ aim_cdev-y := aim-cdev/cdev.o
+ CFLAGS_cdev.o := -I$(src)/include/
+diff --git a/default_conf.c b/default_conf.c
+new file mode 100644
+index 0000000..adb1786
+--- /dev/null
++++ b/default_conf.c
+@@ -0,0 +1,162 @@
++/*
++ * default_conf.c - Default configuration for the MOST channels.
++ *
++ * Copyright (C) 2017, Microchip Technology Germany II GmbH & Co. KG
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * This file is licensed under GPLv2.
++ */
++
++#include "include/mostcore.h"
++#include <linux/module.h>
++
++static struct most_config_probe config_probes[] = {
++
++ /* OS81118 Control */
++ {
++ .ch_name = "ep8f",
++ .cfg = {
++ .direction = MOST_CH_RX,
++ .data_type = MOST_CH_CONTROL,
++ .num_buffers = 16,
++ .buffer_size = 64,
++ },
++ .aim_name = "cdev",
++ .aim_param = "inic-usb-crx",
++ },
++ {
++ .ch_name = "ep0f",
++ .cfg = {
++ .direction = MOST_CH_TX,
++ .data_type = MOST_CH_CONTROL,
++ .num_buffers = 16,
++ .buffer_size = 64,
++ },
++ .aim_name = "cdev",
++ .aim_param = "inic-usb-ctx",
++ },
++ /* OS81118 Async */
++ {
++ .ch_name = "ep8e",
++ .cfg = {
++ .direction = MOST_CH_RX,
++ .data_type = MOST_CH_ASYNC,
++ .num_buffers = 20,
++ .buffer_size = 1522,
++ },
++ .aim_name = "networking",
++ .aim_param = "inic-usb-arx",
++ },
++ {
++ .ch_name = "ep0e",
++ .cfg = {
++ .direction = MOST_CH_TX,
++ .data_type = MOST_CH_ASYNC,
++ .num_buffers = 20,
++ .buffer_size = 1522,
++ },
++ .aim_name = "networking",
++ .aim_param = "inic-usb-atx",
++ },
++ /* OS81210 Control */
++ {
++ .ch_name = "ep87",
++ .cfg = {
++ .direction = MOST_CH_RX,
++ .data_type = MOST_CH_CONTROL,
++ .num_buffers = 16,
++ .buffer_size = 64,
++ },
++ .aim_name = "cdev",
++ .aim_param = "inic-usb-crx",
++ },
++ {
++ .ch_name = "ep07",
++ .cfg = {
++ .direction = MOST_CH_TX,
++ .data_type = MOST_CH_CONTROL,
++ .num_buffers = 16,
++ .buffer_size = 64,
++ },
++ .aim_name = "cdev",
++ .aim_param = "inic-usb-ctx",
++ },
++ /* OS81210 Async */
++ {
++ .ch_name = "ep86",
++ .cfg = {
++ .direction = MOST_CH_RX,
++ .data_type = MOST_CH_ASYNC,
++ .num_buffers = 20,
++ .buffer_size = 1522,
++ },
++ .aim_name = "networking",
++ .aim_param = "inic-usb-arx",
++ },
++ {
++ .ch_name = "ep06",
++ .cfg = {
++ .direction = MOST_CH_TX,
++ .data_type = MOST_CH_ASYNC,
++ .num_buffers = 20,
++ .buffer_size = 1522,
++ },
++ .aim_name = "networking",
++ .aim_param = "inic-usb-atx",
++ },
++ /* Streaming channels (common for all INICs) */
++ {
++ .ch_name = "ep01",
++ .cfg = {
++ .direction = MOST_CH_TX,
++ .data_type = MOST_CH_SYNC,
++ .num_buffers = 8,
++ .buffer_size = 2 * 12 * 42,
++ .subbuffer_size = 12,
++ .packets_per_xact = 42,
++ },
++ .aim_name = "sound",
++ .aim_param = "ep01-6ch.6x16",
++ },
++ {
++ .ch_name = "ep02",
++ .cfg = {
++ .direction = MOST_CH_TX,
++ .data_type = MOST_CH_ISOC,
++ .num_buffers = 8,
++ .buffer_size = 40 * 188,
++ .subbuffer_size = 188,
++ .packets_per_xact = 2,
++ },
++ .aim_name = "cdev",
++ .aim_param = "inic-usb-itx1",
++ },
++
++ /* sentinel */
++ {}
++};
++
++static struct most_config_set config_set = {
++ .probes = config_probes
++};
++
++static int __init mod_init(void)
++{
++ most_register_config_set(&config_set);
++ return 0;
++}
++
++static void __exit mod_exit(void)
++{
++ most_deregister_config_set(&config_set);
++}
++
++module_init(mod_init);
++module_exit(mod_exit);
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Andrey Shvetsov <andrey.shvetsov@k2l.de>");
++MODULE_DESCRIPTION("Default configuration for the MOST channels");
+diff --git a/include/mostcore.h b/include/mostcore.h
+index dc87121..3c00efb 100644
+--- a/include/mostcore.h
++++ b/include/mostcore.h
+@@ -145,6 +145,39 @@ struct most_channel_config {
+ u16 dbr_size;
+ };
+
++/**
++ * struct most_config_probe - matching rule, channel configuration and
++ * the optional AIM name used for the automatic configuration and linking
++ * of the channel
++ * @dev_name: optional matching device id
++ * ("usb_device 1-1:1.0," "dim2-12345678", etc.)
++ * @ch_name: matching channel name ("ep8f", "ca2", etc.)
++ * @cfg: configuration that will be applied for the found channel
++ * @aim_name: optional name of the AIM that will be linked to the channel
++ * ("cdev", "networking", "v4l", "sound")
++ * @aim_param: AIM dependent parameter (it is the character device name
++ * for the cdev AIM, PCM format for the audio AIM, etc.)
++ */
++struct most_config_probe {
++ const char *dev_name;
++ const char *ch_name;
++ struct most_channel_config cfg;
++ const char *aim_name;
++ const char *aim_param;
++};
++
++/**
++ * struct most_config_set - the configuration set containing
++ * several automatic configurations for the different channels
++ * @probes: list of the matching rules and the configurations,
++ * that must be ended with the empty structure
++ * @list: list head used by the MostCore
++ */
++struct most_config_set {
++ const struct most_config_probe *probes;
++ struct list_head list;
++};
++
+ /*
+ * struct mbo - MOST Buffer Object.
+ * @context: context for core completion handler
+@@ -285,6 +318,37 @@ struct most_aim {
+ };
+
+ /**
++ * most_register_config_set - registers the configuration set
++ *
++ * @cfg_set: configuration set to be registered for the future probes
++ *
++ * The function registers the given configuration set.
++ *
++ * It is possible to register or deregister several configuration sets
++ * independently. Different configuration sets may contain the
++ * overlapped matching rules but later registered configuration set has
++ * the higher priority over the prior registered set.
++ *
++ * The only the first matched configuration is applied for each
++ * channel.
++ *
++ * The configuration for the channel is applied at the time of
++ * registration of the parent most_interface.
++ */
++void most_register_config_set(struct most_config_set *cfg_set);
++
++/**
++ * most_deregister_config_set - deregisters the prior registered
++ * configuration set
++ *
++ * @cfg_set: configuration set to be deregistered
++ *
++ * The calling of this function does not change the current
++ * configuration of the channels.
++ */
++void most_deregister_config_set(struct most_config_set *cfg_set);
++
++/**
+ * most_register_interface - Registers instance of the interface.
+ * @iface: Pointer to the interface instance description.
+ *
+diff --git a/mostcore/core.c b/mostcore/core.c
+index 9e0a352..6035cf0 100644
+--- a/mostcore/core.c
++++ b/mostcore/core.c
+@@ -36,6 +36,8 @@ static struct class *most_class;
+ static struct device *core_dev;
+ static struct ida mdev_id;
+ static int dummy_num_buffers;
++static struct list_head config_probes;
++struct mutex config_probes_mt; /* config_probes */
+
+ struct most_c_aim_obj {
+ struct most_aim *ptr;
+@@ -918,6 +920,30 @@ most_c_obj *get_channel_by_name(char *mdev, char *mdev_ch)
+ return c;
+ }
+
++static int link_channel_to_aim(struct most_c_obj *c, struct most_aim *aim,
++ char *aim_param)
++{
++ int ret;
++ struct most_aim **aim_ptr;
++
++ if (!c->aim0.ptr)
++ aim_ptr = &c->aim0.ptr;
++ else if (!c->aim1.ptr)
++ aim_ptr = &c->aim1.ptr;
++ else
++ return -ENOSPC;
++
++ *aim_ptr = aim;
++ ret = aim->probe_channel(c->iface, c->channel_id,
++ &c->cfg, &c->kobj, aim_param);
++ if (ret) {
++ *aim_ptr = NULL;
++ return ret;
++ }
++
++ return 0;
++}
++
+ /**
+ * add_link_store - store() function for add_link attribute
+ * @aim_obj: pointer to AIM object
+@@ -946,45 +972,33 @@ static ssize_t add_link_store(struct most_aim_obj *aim_obj,
+ size_t len)
+ {
+ struct most_c_obj *c;
+- struct most_aim **aim_ptr;
+ char buffer[STRING_SIZE];
+ char *mdev;
+ char *mdev_ch;
+- char *mdev_devnod;
++ char *aim_param;
+ char devnod_buf[STRING_SIZE];
+ int ret;
+ size_t max_len = min_t(size_t, len + 1, STRING_SIZE);
+
+ strlcpy(buffer, buf, max_len);
+
+- ret = split_string(buffer, &mdev, &mdev_ch, &mdev_devnod);
++ ret = split_string(buffer, &mdev, &mdev_ch, &aim_param);
+ if (ret)
+ return ret;
+
+- if (!mdev_devnod || *mdev_devnod == 0) {
++ if (!aim_param || *aim_param == 0) {
+ snprintf(devnod_buf, sizeof(devnod_buf), "%s-%s", mdev,
+ mdev_ch);
+- mdev_devnod = devnod_buf;
++ aim_param = devnod_buf;
+ }
+
+ c = get_channel_by_name(mdev, mdev_ch);
+ if (IS_ERR(c))
+ return -ENODEV;
+
+- if (!c->aim0.ptr)
+- aim_ptr = &c->aim0.ptr;
+- else if (!c->aim1.ptr)
+- aim_ptr = &c->aim1.ptr;
+- else
+- return -ENOSPC;
+-
+- *aim_ptr = aim_obj->driver;
+- ret = aim_obj->driver->probe_channel(c->iface, c->channel_id,
+- &c->cfg, &c->kobj, mdev_devnod);
+- if (ret) {
+- *aim_ptr = NULL;
++ ret = link_channel_to_aim(c, aim_obj->driver, aim_param);
++ if (ret)
+ return ret;
+- }
+
+ return len;
+ }
+@@ -1679,6 +1693,73 @@ int most_deregister_aim(struct most_aim *aim)
+ }
+ EXPORT_SYMBOL_GPL(most_deregister_aim);
+
++void most_register_config_set(struct most_config_set *cfg_set)
++{
++ mutex_lock(&config_probes_mt);
++ list_add(&cfg_set->list, &config_probes);
++ mutex_unlock(&config_probes_mt);
++}
++EXPORT_SYMBOL(most_register_config_set);
++
++void most_deregister_config_set(struct most_config_set *cfg_set)
++{
++ mutex_lock(&config_probes_mt);
++ list_del(&cfg_set->list);
++ mutex_unlock(&config_probes_mt);
++}
++EXPORT_SYMBOL(most_deregister_config_set);
++
++static int probe_aim(struct most_c_obj *c,
++ const char *aim_name, const char *aim_param)
++{
++ struct most_aim_obj *aim_obj;
++ char buf[STRING_SIZE];
++
++ list_for_each_entry(aim_obj, &aim_list, list) {
++ if (!strcmp(aim_obj->driver->name, aim_name)) {
++ strlcpy(buf, aim_param ? aim_param : "", sizeof(buf));
++ return link_channel_to_aim(c, aim_obj->driver, buf);
++ }
++ }
++ return 0;
++}
++
++static bool probe_config_set(struct most_c_obj *c,
++ const char *dev_name, const char *ch_name,
++ const struct most_config_probe *p)
++{
++ int err;
++
++ for (; p->ch_name; p++) {
++ if ((p->dev_name && strcmp(dev_name, p->dev_name)) ||
++ strcmp(ch_name, p->ch_name))
++ continue;
++
++ c->cfg = p->cfg;
++ if (p->aim_name) {
++ err = probe_aim(c, p->aim_name, p->aim_param);
++ if (err)
++ pr_err("failed to autolink %s to %s: %d\n",
++ ch_name, p->aim_name, err);
++ }
++ return true;
++ }
++ return false;
++}
++
++static void find_configuration(struct most_c_obj *c, const char *dev_name,
++ const char *ch_name)
++{
++ struct most_config_set *plist;
++
++ mutex_lock(&config_probes_mt);
++ list_for_each_entry(plist, &config_probes, list) {
++ if (probe_config_set(c, dev_name, ch_name, plist->probes))
++ break;
++ }
++ mutex_unlock(&config_probes_mt);
++}
++
+ /**
+ * most_register_interface - registers an interface with core
+ * @iface: pointer to the instance of the interface description.
+@@ -1777,6 +1858,7 @@ struct kobject *most_register_interface(struct most_interface *iface)
+ mutex_init(&c->start_mutex);
+ mutex_init(&c->nq_mutex);
+ list_add_tail(&c->list, &inst->channel_list);
++ find_configuration(c, iface->description, channel_name);
+ }
+ pr_info("registered new MOST device mdev%d (%s)\n",
+ inst->dev_id, iface->description);
+@@ -1880,6 +1962,8 @@ static int __init most_init(void)
+ pr_info("init()\n");
+ INIT_LIST_HEAD(&instance_list);
+ INIT_LIST_HEAD(&aim_list);
++ INIT_LIST_HEAD(&config_probes);
++ mutex_init(&config_probes_mt);
+ ida_init(&mdev_id);
+
+ err = bus_register(&most_bus);
+--
+2.7.4
+
diff --git a/recipes-kernel/most/files/0003-core-remove-kernel-log-for-MBO-status.patch b/recipes-kernel/most/files/0003-core-remove-kernel-log-for-MBO-status.patch
new file mode 100644
index 00000000..4703844a
--- /dev/null
+++ b/recipes-kernel/most/files/0003-core-remove-kernel-log-for-MBO-status.patch
@@ -0,0 +1,26 @@
+From b269994be937cbb31c0d73ecc899ca8a545a6a4a Mon Sep 17 00:00:00 2001
+From: Christian Gromm <christian.gromm@microchip.com>
+Date: Mon, 4 Sep 2017 11:09:17 +0200
+Subject: [PATCH 3/5] core: remove kernel log for MBO status
+
+Signed-off-by: Christian Gromm <christian.gromm@microchip.com>
+---
+ driver/mostcore/core.c | 2 --
+ 1 file changed, 2 deletions(-)
+
+diff --git a/mostcore/core.c b/mostcore/core.c
+index 931efb9..595becc 100644
+--- a/mostcore/core.c
++++ b/mostcore/core.c
+@@ -1348,8 +1348,6 @@ static void most_write_completion(struct mbo *mbo)
+ BUG_ON((!mbo) || (!mbo->context));
+
+ c = mbo->context;
+- if (mbo->status == MBO_E_INVAL)
+- pr_info("WARN: Tx MBO status: invalid\n");
+ if (unlikely(c->is_poisoned || (mbo->status == MBO_E_CLOSE)))
+ trash_mbo(mbo);
+ else
+--
+2.7.4
+
diff --git a/recipes-kernel/most/files/0004-most-video-set-device_caps.patch b/recipes-kernel/most/files/0004-most-video-set-device_caps.patch
new file mode 100644
index 00000000..010d4b0d
--- /dev/null
+++ b/recipes-kernel/most/files/0004-most-video-set-device_caps.patch
@@ -0,0 +1,25 @@
+From a5fd2ae8d4a3b2a8f7a33a4ea469ea7ee0d946ef Mon Sep 17 00:00:00 2001
+From: Christian Gromm <christian.gromm@microchip.com>
+Date: Mon, 4 Sep 2017 15:36:38 +0200
+Subject: [PATCH 4/5] most: video: set device_caps
+
+Signed-off-by: Christian Gromm <christian.gromm@microchip.com>
+---
+ driver/aim-v4l2/video.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/aim-v4l2/video.c b/aim-v4l2/video.c
+index e074841..6405a03 100644
+--- a/aim-v4l2/video.c
++++ b/aim-v4l2/video.c
+@@ -263,6 +263,7 @@ static int vidioc_querycap(struct file *file, void *priv,
+ snprintf(cap->bus_info, sizeof(cap->bus_info),
+ "%s", mdev->iface->description);
+
++ cap->device_caps =
+ cap->capabilities =
+ V4L2_CAP_READWRITE |
+ V4L2_CAP_TUNER |
+--
+2.7.4
+
diff --git a/recipes-kernel/most/files/0005-most-video-set-V4L2_CAP_DEVICE_CAPS-flag.patch b/recipes-kernel/most/files/0005-most-video-set-V4L2_CAP_DEVICE_CAPS-flag.patch
new file mode 100644
index 00000000..ebaee9e1
--- /dev/null
+++ b/recipes-kernel/most/files/0005-most-video-set-V4L2_CAP_DEVICE_CAPS-flag.patch
@@ -0,0 +1,25 @@
+From 7518453386ad3e82008186a6c9ca86ed8c136801 Mon Sep 17 00:00:00 2001
+From: Christian Gromm <christian.gromm@microchip.com>
+Date: Mon, 4 Sep 2017 16:08:38 +0200
+Subject: [PATCH 5/5] most: video: set V4L2_CAP_DEVICE_CAPS flag
+
+Signed-off-by: Christian Gromm <christian.gromm@microchip.com>
+---
+ driver/aim-v4l2/video.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/aim-v4l2/video.c b/aim-v4l2/video.c
+index 6405a03..db75d4d 100644
+--- a/aim-v4l2/video.c
++++ b/aim-v4l2/video.c
+@@ -265,6 +265,7 @@ static int vidioc_querycap(struct file *file, void *priv,
+
+ cap->device_caps =
+ cap->capabilities =
++ V4L2_CAP_DEVICE_CAPS |
+ V4L2_CAP_READWRITE |
+ V4L2_CAP_TUNER |
+ V4L2_CAP_VIDEO_CAPTURE;
+--
+2.7.4
+
diff --git a/recipes-kernel/most/files/0006-dim2-fix-startup-sequence.patch b/recipes-kernel/most/files/0006-dim2-fix-startup-sequence.patch
new file mode 100644
index 00000000..59c6ae67
--- /dev/null
+++ b/recipes-kernel/most/files/0006-dim2-fix-startup-sequence.patch
@@ -0,0 +1,186 @@
+From 63bcd9b421ae7927948bffec9566db47f40ea290 Mon Sep 17 00:00:00 2001
+From: Andrey Shvetsov <andrey.shvetsov@k2l.de>
+Date: Tue, 30 Jan 2018 17:34:09 +0100
+Subject: [PATCH] staging: most: dim2: fix startup sequence
+
+Platform specific initializations (pdata->init) must be done before DIM2
+IP module startup (dim_startup).
+
+Signed-off-by: Andrey Shvetsov <andrey.shvetsov@k2l.de>
+---
+ hdm-dim2/dim2_hdm.c | 90 +++++++++++++++++++++++++++++++++++++++---------------------------------------------------
+ 1 file changed, 39 insertions(+), 51 deletions(-)
+
+diff --git a/hdm-dim2/dim2_hdm.c b/hdm-dim2/dim2_hdm.c
+index 893b8e4..e4629a5 100644
+--- a/hdm-dim2/dim2_hdm.c
++++ b/hdm-dim2/dim2_hdm.c
+@@ -155,38 +155,6 @@ void dimcb_on_error(u8 error_id, const char *error_message)
+ }
+
+ /**
+- * startup_dim - initialize the dim2 interface
+- * @pdev: platform device
+- */
+-static int startup_dim(struct platform_device *pdev)
+-{
+- struct dim2_hdm *dev = platform_get_drvdata(pdev);
+- struct dim2_platform_data *pdata = pdev->dev.platform_data;
+- u8 hal_ret;
+- int ret;
+-
+- if (!pdata) {
+- pr_err("missing platform data\n");
+- return -EINVAL;
+- }
+-
+- ret = pdata->init ? pdata->init(pdata, dev->io_base) : 0;
+- if (ret)
+- return ret;
+-
+- pr_info("sync: num of frames per sub-buffer: %u\n", fcnt);
+- hal_ret = dim_startup(dev->io_base, pdata->clk_speed, fcnt);
+- if (hal_ret != DIM_NO_ERROR) {
+- pr_err("dim_startup failed: %d\n", hal_ret);
+- if (pdata && pdata->destroy)
+- pdata->destroy(pdata);
+- return -ENODEV;
+- }
+-
+- return 0;
+-}
+-
+-/**
+ * try_start_dim_transfer - try to transfer a buffer on a channel
+ * @hdm_ch: channel specific data
+ *
+@@ -727,10 +695,12 @@ static void dma_free(struct mbo *mbo, u32 size)
+ */
+ static int dim2_probe(struct platform_device *pdev)
+ {
++ struct dim2_platform_data *pdata = pdev->dev.platform_data;
+ struct dim2_hdm *dev;
+ struct resource *res;
+ int ret, i;
+ struct kobject *kobj;
++ u8 hal_ret;
+ int irq;
+
+ dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);
+@@ -745,38 +715,59 @@ static int dim2_probe(struct platform_device *pdev)
+ if (IS_ERR(dev->io_base))
+ return PTR_ERR(dev->io_base);
+
++ if (!pdata) {
++ dev_err(&pdev->dev, "missing platform data\n");
++ return -EINVAL;
++ }
++
++ ret = pdata->init ? pdata->init(pdata, dev->io_base) : 0;
++ if (ret)
++ return ret;
++
++ dev_info(&pdev->dev, "sync: num of frames per sub-buffer: %u\n", fcnt);
++ hal_ret = dim_startup(dev->io_base, pdata->clk_speed, fcnt);
++ if (hal_ret != DIM_NO_ERROR) {
++ dev_err(&pdev->dev, "dim_startup failed: %d\n", hal_ret);
++ ret = -ENODEV;
++ goto err_bsp_destroy;
++ }
++
+ irq = platform_get_irq(pdev, 0);
+ if (irq < 0) {
+ dev_err(&pdev->dev, "failed to get ahb0_int irq: %d\n", irq);
+- return irq;
++ ret = irq;
++ goto err_shutdown_dim;
+ }
+
+ ret = devm_request_irq(&pdev->dev, irq, dim2_ahb_isr, 0,
+ "dim2_ahb0_int", dev);
+ if (ret) {
+ dev_err(&pdev->dev, "failed to request ahb0_int irq %d\n", irq);
+- return ret;
++ goto err_shutdown_dim;
+ }
+
+ irq = platform_get_irq(pdev, 1);
+ if (irq < 0) {
+ dev_err(&pdev->dev, "failed to get mlb_int irq: %d\n", irq);
+- return irq;
++ ret = irq;
++ goto err_shutdown_dim;
+ }
+
+ ret = devm_request_irq(&pdev->dev, irq, dim2_mlb_isr, 0,
+ "dim2_mlb_int", dev);
+ if (ret) {
+ dev_err(&pdev->dev, "failed to request mlb_int irq %d\n", irq);
+- return ret;
++ goto err_shutdown_dim;
+ }
+
+ init_waitqueue_head(&dev->netinfo_waitq);
+ dev->deliver_netinfo = 0;
+- dev->netinfo_task = kthread_run(&deliver_netinfo_thread, (void *)dev,
++ dev->netinfo_task = kthread_run(&deliver_netinfo_thread, dev,
+ "dim2_netinfo");
+- if (IS_ERR(dev->netinfo_task))
+- return PTR_ERR(dev->netinfo_task);
++ if (IS_ERR(dev->netinfo_task)) {
++ ret = PTR_ERR(dev->netinfo_task);
++ goto err_shutdown_dim;
++ }
+
+ for (i = 0; i < DMA_CHANNELS; i++) {
+ struct most_channel_capability *cap = dev->capabilities + i;
+@@ -833,20 +824,17 @@ static int dim2_probe(struct platform_device *pdev)
+ if (ret)
+ goto err_unreg_iface;
+
+- ret = startup_dim(pdev);
+- if (ret) {
+- dev_err(&pdev->dev, "failed to initialize DIM2\n");
+- goto err_destroy_bus;
+- }
+-
+ return 0;
+
+-err_destroy_bus:
+- dim2_sysfs_destroy(&dev->bus);
+ err_unreg_iface:
+ most_deregister_interface(&dev->most_iface);
+ err_stop_thread:
+ kthread_stop(dev->netinfo_task);
++err_shutdown_dim:
++ dim_shutdown();
++err_bsp_destroy:
++ if (pdata && pdata->destroy)
++ pdata->destroy(pdata);
+
+ return ret;
+ }
+@@ -863,6 +851,10 @@ static int dim2_remove(struct platform_device *pdev)
+ struct dim2_platform_data *pdata = pdev->dev.platform_data;
+ unsigned long flags;
+
++ dim2_sysfs_destroy(&dev->bus);
++ most_deregister_interface(&dev->most_iface);
++ kthread_stop(dev->netinfo_task);
++
+ spin_lock_irqsave(&dim_lock, flags);
+ dim_shutdown();
+ spin_unlock_irqrestore(&dim_lock, flags);
+@@ -870,10 +862,6 @@ static int dim2_remove(struct platform_device *pdev)
+ if (pdata && pdata->destroy)
+ pdata->destroy(pdata);
+
+- dim2_sysfs_destroy(&dev->bus);
+- most_deregister_interface(&dev->most_iface);
+- kthread_stop(dev->netinfo_task);
+-
+ /*
+ * break link to local platform_device_id struct
+ * to prevent crash by unload platform device module
+--
+libgit2 0.26.0
diff --git a/recipes-kernel/most/files/0007-dim2-use-device-tree.patch b/recipes-kernel/most/files/0007-dim2-use-device-tree.patch
new file mode 100644
index 00000000..679fab79
--- /dev/null
+++ b/recipes-kernel/most/files/0007-dim2-use-device-tree.patch
@@ -0,0 +1,378 @@
+From 8e16207392cd715ea88f6780981a3d55ab005588 Mon Sep 17 00:00:00 2001
+From: Andrey Shvetsov <andrey.shvetsov@k2l.de>
+Date: Mon, 12 Feb 2018 12:23:37 +0100
+Subject: [PATCH] staging: most: dim2: use device tree
+
+Current dim2 driver expects the existence of a platform driver that
+implements the platform specific initialization and delivery of the irq
+numbers.
+
+This patch integrates the device tree activity and platform specific
+code into the driver.
+
+Signed-off-by: Andrey Shvetsov <andrey.shvetsov@k2l.de>
+---
+ hdm-dim2/dim2_hdm.c | 222 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------------
+ hdm-dim2/dim2_hdm.h | 28 ----------------------------
+ hdm-dim2/platform/dim2_arwen_mlb3.c | 165 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ hdm-dim2/platform/dim2_arwen_mlb6.c | 169 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ hdm-dim2/platform/dim2_h2_dt.c | 227 -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ hdm-dim2/platform/dim2_mx6q.c | 192 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ hdm-dim2/platform/dim2_mx6q_dt.c | 224 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ 7 files changed, 193 insertions(+), 1034 deletions(-)
+ delete mode 100644 hdm-dim2/dim2_hdm.h
+ delete mode 100644 hdm-dim2/platform/dim2_arwen_mlb3.c
+ delete mode 100644 hdm-dim2/platform/dim2_arwen_mlb6.c
+ delete mode 100644 hdm-dim2/platform/dim2_h2_dt.c
+ delete mode 100644 hdm-dim2/platform/dim2_mx6q.c
+ delete mode 100644 hdm-dim2/platform/dim2_mx6q_dt.c
+
+diff --git a/hdm-dim2/dim2_hdm.c b/hdm-dim2/dim2_hdm.c
+index e4629a5..2dba917 100644
+--- a/hdm-dim2/dim2_hdm.c
++++ b/hdm-dim2/dim2_hdm.c
+@@ -14,6 +14,7 @@
+ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+ #include <linux/module.h>
++#include <linux/of_platform.h>
+ #include <linux/printk.h>
+ #include <linux/kernel.h>
+ #include <linux/init.h>
+@@ -21,13 +22,13 @@
+ #include <linux/interrupt.h>
+ #include <linux/slab.h>
+ #include <linux/io.h>
++#include <linux/clk.h>
+ #include <linux/dma-mapping.h>
+ #include <linux/sched.h>
+ #include <linux/kthread.h>
+
+ #include <mostcore.h>
+ #include "dim2_hal.h"
+-#include "dim2_hdm.h"
+ #include "dim2_errors.h"
+ #include "dim2_sysfs.h"
+
+@@ -93,6 +94,9 @@ struct dim2_hdm {
+ struct most_interface most_iface;
+ char name[16 + sizeof "dim2-"];
+ void __iomem *io_base;
++ u8 clk_speed;
++ struct clk *clk;
++ struct clk *clk_pll;
+ struct task_struct *netinfo_task;
+ wait_queue_head_t netinfo_waitq;
+ int deliver_netinfo;
+@@ -102,6 +106,12 @@ struct dim2_hdm {
+ struct medialb_bus bus;
+ void (*on_netinfo)(struct most_interface *,
+ unsigned char, unsigned char *);
++ void (*disable_platform)(struct platform_device *);
++};
++
++struct dim2_platform_data {
++ int (*enable)(struct platform_device *);
++ void (*disable)(struct platform_device *);
+ };
+
+ #define iface_to_hdm(iface) container_of(iface, struct dim2_hdm, most_iface)
+@@ -686,6 +696,8 @@ static void dma_free(struct mbo *mbo, u32 size)
+ dma_free_coherent(NULL, size, mbo->virt_address, mbo->bus_address);
+ }
+
++static const struct of_device_id dim2_of_match[];
++
+ /*
+ * dim2_probe - dim2 probe handler
+ * @pdev: platform device structure
+@@ -695,7 +707,7 @@ static void dma_free(struct mbo *mbo, u32 size)
+ */
+ static int dim2_probe(struct platform_device *pdev)
+ {
+- struct dim2_platform_data *pdata = pdev->dev.platform_data;
++ const struct dim2_platform_data *pdata;
+ struct dim2_hdm *dev;
+ struct resource *res;
+ int ret, i;
+@@ -703,6 +715,8 @@ static int dim2_probe(struct platform_device *pdev)
+ u8 hal_ret;
+ int irq;
+
++ enum { MLB_INT_IDX, AHB0_INT_IDX };
++
+ dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);
+ if (!dev)
+ return -ENOMEM;
+@@ -710,29 +724,30 @@ static int dim2_probe(struct platform_device *pdev)
+ dev->atx_idx = -1;
+
+ platform_set_drvdata(pdev, dev);
++
++ dev->clk_speed = CLK_4096FS;
++
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ dev->io_base = devm_ioremap_resource(&pdev->dev, res);
+ if (IS_ERR(dev->io_base))
+ return PTR_ERR(dev->io_base);
+
+- if (!pdata) {
+- dev_err(&pdev->dev, "missing platform data\n");
+- return -EINVAL;
+- }
+-
+- ret = pdata->init ? pdata->init(pdata, dev->io_base) : 0;
++ pdata = of_match_node(dim2_of_match, pdev->dev.of_node)->data;
++ ret = pdata && pdata->enable ? pdata->enable(pdev) : 0;
+ if (ret)
+ return ret;
+
++ dev->disable_platform = pdata ? pdata->disable : 0;
++
+ dev_info(&pdev->dev, "sync: num of frames per sub-buffer: %u\n", fcnt);
+- hal_ret = dim_startup(dev->io_base, pdata->clk_speed, fcnt);
++ hal_ret = dim_startup(dev->io_base, dev->clk_speed, fcnt);
+ if (hal_ret != DIM_NO_ERROR) {
+ dev_err(&pdev->dev, "dim_startup failed: %d\n", hal_ret);
+ ret = -ENODEV;
+- goto err_bsp_destroy;
++ goto err_disable_platform;
+ }
+
+- irq = platform_get_irq(pdev, 0);
++ irq = platform_get_irq(pdev, AHB0_INT_IDX);
+ if (irq < 0) {
+ dev_err(&pdev->dev, "failed to get ahb0_int irq: %d\n", irq);
+ ret = irq;
+@@ -746,7 +761,7 @@ static int dim2_probe(struct platform_device *pdev)
+ goto err_shutdown_dim;
+ }
+
+- irq = platform_get_irq(pdev, 1);
++ irq = platform_get_irq(pdev, MLB_INT_IDX);
+ if (irq < 0) {
+ dev_err(&pdev->dev, "failed to get mlb_int irq: %d\n", irq);
+ ret = irq;
+@@ -832,9 +847,9 @@ static int dim2_probe(struct platform_device *pdev)
+ kthread_stop(dev->netinfo_task);
+ err_shutdown_dim:
+ dim_shutdown();
+-err_bsp_destroy:
+- if (pdata && pdata->destroy)
+- pdata->destroy(pdata);
++err_disable_platform:
++ if (dev->disable_platform)
++ dev->disable_platform(pdev);
+
+ return ret;
+ }
+@@ -848,7 +863,6 @@ static int dim2_probe(struct platform_device *pdev)
+ static int dim2_remove(struct platform_device *pdev)
+ {
+ struct dim2_hdm *dev = platform_get_drvdata(pdev);
+- struct dim2_platform_data *pdata = pdev->dev.platform_data;
+ unsigned long flags;
+
+ dim2_sysfs_destroy(&dev->bus);
+@@ -859,37 +873,187 @@ static int dim2_remove(struct platform_device *pdev)
+ dim_shutdown();
+ spin_unlock_irqrestore(&dim_lock, flags);
+
+- if (pdata && pdata->destroy)
+- pdata->destroy(pdata);
++ if (dev->disable_platform)
++ dev->disable_platform(pdev);
++
++ return 0;
++}
++
++/* platform specific functions [[ */
++
++static int fsl_mx6_enable(struct platform_device *pdev)
++{
++ struct dim2_hdm *dev = platform_get_drvdata(pdev);
++ int ret;
++
++ dev->clk = devm_clk_get(&pdev->dev, "mlb");
++ if (IS_ERR_OR_NULL(dev->clk)) {
++ dev_err(&pdev->dev, "unable to get mlb clock\n");
++ return -EFAULT;
++ }
++
++ ret = clk_prepare_enable(dev->clk);
++ if (ret) {
++ dev_err(&pdev->dev, "%s\n", "clk_prepare_enable failed");
++ return ret;
++ }
++
++ if (dev->clk_speed >= CLK_2048FS) {
++ /* enable pll */
++ dev->clk_pll = devm_clk_get(&pdev->dev, "pll8_mlb");
++ if (IS_ERR_OR_NULL(dev->clk_pll)) {
++ dev_err(&pdev->dev, "unable to get mlb pll clock\n");
++ clk_disable_unprepare(dev->clk);
++ return -EFAULT;
++ }
++
++ writel(0x888, dev->io_base + 0x38);
++ clk_prepare_enable(dev->clk_pll);
++ }
++
++ return 0;
++}
++
++static void fsl_mx6_disable(struct platform_device *pdev)
++{
++ struct dim2_hdm *dev = platform_get_drvdata(pdev);
++
++ if (dev->clk_speed >= CLK_2048FS)
++ clk_disable_unprepare(dev->clk_pll);
++
++ clk_disable_unprepare(dev->clk);
++}
++
++static int rcar_h2_enable(struct platform_device *pdev)
++{
++ struct dim2_hdm *dev = platform_get_drvdata(pdev);
++ int ret;
++
++ dev->clk = devm_clk_get(&pdev->dev, NULL);
++ if (IS_ERR(dev->clk)) {
++ dev_err(&pdev->dev, "cannot get clock\n");
++ return PTR_ERR(dev->clk);
++ }
++
++ ret = clk_prepare_enable(dev->clk);
++ if (ret) {
++ dev_err(&pdev->dev, "%s\n", "clk_prepare_enable failed");
++ return ret;
++ }
++
++ if (dev->clk_speed >= CLK_2048FS) {
++ /* enable MLP pll and LVDS drivers */
++ writel(0x03, dev->io_base + 0x600);
++ /* set bias */
++ writel(0x888, dev->io_base + 0x38);
++ } else {
++ /* PLL */
++ writel(0x04, dev->io_base + 0x600);
++ }
++
+
+- /*
+- * break link to local platform_device_id struct
+- * to prevent crash by unload platform device module
+- */
+- pdev->id_entry = NULL;
++ /* BBCR = 0b11 */
++ writel(0x03, dev->io_base + 0x500);
++ writel(0x0002FF02, dev->io_base + 0x508);
+
+ return 0;
+ }
+
+-static const struct platform_device_id dim2_id[] = {
+- { "medialb_dim2" },
+- { }, /* Terminating entry */
++static void rcar_h2_disable(struct platform_device *pdev)
++{
++ struct dim2_hdm *dev = platform_get_drvdata(pdev);
++
++ clk_disable_unprepare(dev->clk);
++
++ /* disable PLLs and LVDS drivers */
++ writel(0x0, dev->io_base + 0x600);
++}
++
++static int rcar_m3_enable(struct platform_device *pdev)
++{
++ struct dim2_hdm *dev = platform_get_drvdata(pdev);
++ u32 enable_512fs = dev->clk_speed == CLK_512FS;
++ int ret;
++
++ dev->clk = devm_clk_get(&pdev->dev, NULL);
++ if (IS_ERR(dev->clk)) {
++ dev_err(&pdev->dev, "cannot get clock\n");
++ return PTR_ERR(dev->clk);
++ }
++
++ ret = clk_prepare_enable(dev->clk);
++ if (ret) {
++ dev_err(&pdev->dev, "%s\n", "clk_prepare_enable failed");
++ return ret;
++ }
++
++ /* PLL */
++ writel(0x04, dev->io_base + 0x600);
++
++ writel(enable_512fs, dev->io_base + 0x604);
++
++ /* BBCR = 0b11 */
++ writel(0x03, dev->io_base + 0x500);
++ writel(0x0002FF02, dev->io_base + 0x508);
++
++ return 0;
++}
++
++static void rcar_m3_disable(struct platform_device *pdev)
++{
++ struct dim2_hdm *dev = platform_get_drvdata(pdev);
++
++ clk_disable_unprepare(dev->clk);
++
++ /* disable PLLs and LVDS drivers */
++ writel(0x0, dev->io_base + 0x600);
++}
++
++/* ]] platform specific functions */
++
++enum dim2_platforms { FSL_MX6, RCAR_H2, RCAR_M3 };
++
++static struct dim2_platform_data plat_data[] = {
++ [FSL_MX6] = { .enable = fsl_mx6_enable, .disable = fsl_mx6_disable },
++ [RCAR_H2] = { .enable = rcar_h2_enable, .disable = rcar_h2_disable },
++ [RCAR_M3] = { .enable = rcar_m3_enable, .disable = rcar_m3_disable },
++};
++
++static const struct of_device_id dim2_of_match[] = {
++ {
++ .compatible = "fsl,imx6q-mlb150",
++ .data = plat_data + FSL_MX6
++ },
++ {
++ .compatible = "renesas,mlp",
++ .data = plat_data + RCAR_H2
++ },
++ {
++ .compatible = "rcar,medialb-dim2",
++ .data = plat_data + RCAR_M3
++ },
++ {
++ .compatible = "xlnx,axi4-os62420_3pin-1.00.a",
++ },
++ {
++ .compatible = "xlnx,axi4-os62420_6pin-1.00.a",
++ },
++ {},
+ };
+
+-MODULE_DEVICE_TABLE(platform, dim2_id);
++MODULE_DEVICE_TABLE(of, dim2_of_match);
+
+ static struct platform_driver dim2_driver = {
+ .probe = dim2_probe,
+ .remove = dim2_remove,
+- .id_table = dim2_id,
+ .driver = {
+ .name = "hdm_dim2",
++ .of_match_table = dim2_of_match,
+ },
+ };
+
+ module_platform_driver(dim2_driver);
+
+-MODULE_AUTHOR("Jain Roy Ambi <JainRoy.Ambi@microchip.com>");
+ MODULE_AUTHOR("Andrey Shvetsov <andrey.shvetsov@k2l.de>");
+ MODULE_DESCRIPTION("MediaLB DIM2 Hardware Dependent Module");
+ MODULE_LICENSE("GPL");
+libgit2 0.26.0
diff --git a/recipes-kernel/most/files/0008-dim2-read-clock-speed-from-the-device-tree.patch b/recipes-kernel/most/files/0008-dim2-read-clock-speed-from-the-device-tree.patch
new file mode 100644
index 00000000..1b01fb15
--- /dev/null
+++ b/recipes-kernel/most/files/0008-dim2-read-clock-speed-from-the-device-tree.patch
@@ -0,0 +1,92 @@
+From 839ad403a2d8081a6c15f6fc2836b01919338f3c Mon Sep 17 00:00:00 2001
+From: Andrey Shvetsov <andrey.shvetsov@k2l.de>
+Date: Mon, 12 Feb 2018 12:24:37 +0100
+Subject: [PATCH] staging: most: dim2: read clock speed from the device tree
+
+This implements reading of the clock speed parameter from the device
+tree.
+
+Signed-off-by: Andrey Shvetsov <andrey.shvetsov@k2l.de>
+---
+ Documentation/devicetree/bindings/inic/microchip,inic-dim2.txt | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ hdm-dim2/dim2_hdm.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++-
+ 2 files changed, 113 insertions(+), 1 deletion(-)
+ create mode 100644 Documentation/devicetree/bindings/inic/microchip,inic-dim2.txt
+
+diff --git a/hdm-dim2/dim2_hdm.c b/hdm-dim2/dim2_hdm.c
+index 2dba917..05e1896 100644
+--- a/hdm-dim2/dim2_hdm.c
++++ b/hdm-dim2/dim2_hdm.c
+@@ -698,6 +698,42 @@ static void dma_free(struct mbo *mbo, u32 size)
+
+ static const struct of_device_id dim2_of_match[];
+
++static struct {
++ const char *clock_speed;
++ u8 clk_speed;
++} clk_mt[] = {
++ { "256fs", CLK_256FS },
++ { "512fs", CLK_512FS },
++ { "1024fs", CLK_1024FS },
++ { "2048fs", CLK_2048FS },
++ { "3072fs", CLK_3072FS },
++ { "4096fs", CLK_4096FS },
++ { "6144fs", CLK_6144FS },
++ { "8192fs", CLK_8192FS },
++};
++
++/**
++ * get_dim2_clk_speed - converts string to DIM2 clock speed value
++ *
++ * @clock_speed: string in the format "{NUMBER}fs"
++ * @val: pointer to get one of the CLK_{NUMBER}FS values
++ *
++ * By success stores one of the CLK_{NUMBER}FS in the *val and returns 0,
++ * otherwise returns -EINVAL.
++ */
++static int get_dim2_clk_speed(const char *clock_speed, u8 *val)
++{
++ int i;
++
++ for (i = 0; i < ARRAY_SIZE(clk_mt); i++) {
++ if (!strcmp(clock_speed, clk_mt[i].clock_speed)) {
++ *val = clk_mt[i].clk_speed;
++ return 0;
++ }
++ }
++ return -EINVAL;
++}
++
+ /*
+ * dim2_probe - dim2 probe handler
+ * @pdev: platform device structure
+@@ -708,6 +744,7 @@ static const struct of_device_id dim2_of_match[];
+ static int dim2_probe(struct platform_device *pdev)
+ {
+ const struct dim2_platform_data *pdata;
++ const char *clock_speed;
+ struct dim2_hdm *dev;
+ struct resource *res;
+ int ret, i;
+@@ -725,7 +762,18 @@ static int dim2_probe(struct platform_device *pdev)
+
+ platform_set_drvdata(pdev, dev);
+
+- dev->clk_speed = CLK_4096FS;
++ ret = of_property_read_string(pdev->dev.of_node,
++ "microchip,clock-speed", &clock_speed);
++ if (ret) {
++ dev_err(&pdev->dev, "missing dt property clock-speed\n");
++ return ret;
++ }
++
++ ret = get_dim2_clk_speed(clock_speed, &dev->clk_speed);
++ if (ret) {
++ dev_err(&pdev->dev, "bad dt property clock-speed\n");
++ return ret;
++ }
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ dev->io_base = devm_ioremap_resource(&pdev->dev, res);
+--
+libgit2 0.26.0
diff --git a/recipes-kernel/most/files/0009-dim2-use-device-for-coherent-memory-allocation.patch b/recipes-kernel/most/files/0009-dim2-use-device-for-coherent-memory-allocation.patch
new file mode 100644
index 00000000..08cd6f99
--- /dev/null
+++ b/recipes-kernel/most/files/0009-dim2-use-device-for-coherent-memory-allocation.patch
@@ -0,0 +1,47 @@
+From 756f2f1f90524c2620ed7951e436d13bdb929a6b Mon Sep 17 00:00:00 2001
+From: Andrey Shvetsov <andrey.shvetsov@k2l.de>
+Date: Mon, 12 Feb 2018 12:25:37 +0100
+Subject: [PATCH] staging: most: dim2: use device for coherent memory allocation
+
+On several modern architectures the allocation of coherent memory needs
+a device that has the dma_ops properly set. This patch enables use of
+the DIM2 platform device for the allocation process.
+
+Signed-off-by: Andrey Shvetsov <andrey.shvetsov@k2l.de>
+---
+ hdm-dim2/dim2_hdm.c | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+diff --git a/hdm-dim2/dim2_hdm.c b/hdm-dim2/dim2_hdm.c
+index 05e1896..1847091 100644
+--- a/hdm-dim2/dim2_hdm.c
++++ b/hdm-dim2/dim2_hdm.c
+@@ -688,12 +688,16 @@ static int poison_channel(struct most_interface *most_iface, int ch_idx)
+
+ static void *dma_alloc(struct mbo *mbo, u32 size)
+ {
+- return dma_alloc_coherent(NULL, size, &mbo->bus_address, GFP_KERNEL);
++ struct device *dev = mbo->ifp->dev;
++
++ return dma_alloc_coherent(dev, size, &mbo->bus_address, GFP_KERNEL);
+ }
+
+ static void dma_free(struct mbo *mbo, u32 size)
+ {
+- dma_free_coherent(NULL, size, mbo->virt_address, mbo->bus_address);
++ struct device *dev = mbo->ifp->dev;
++
++ dma_free_coherent(dev, size, mbo->virt_address, mbo->bus_address);
+ }
+
+ static const struct of_device_id dim2_of_match[];
+@@ -875,6 +879,7 @@ static int dim2_probe(struct platform_device *pdev)
+ dev->most_iface.poison_channel = poison_channel;
+ dev->most_iface.request_netinfo = request_netinfo;
+ dev->most_iface.extra_attrs = DBR_ATTRS;
++ dev->most_iface.dev = &pdev->dev;
+
+ kobj = most_register_interface(&dev->most_iface);
+ if (IS_ERR(kobj)) {
+--
+libgit2 0.26.0
diff --git a/recipes-kernel/most/files/0010-backport-usb-setup-timer.patch b/recipes-kernel/most/files/0010-backport-usb-setup-timer.patch
new file mode 100644
index 00000000..ff21b213
--- /dev/null
+++ b/recipes-kernel/most/files/0010-backport-usb-setup-timer.patch
@@ -0,0 +1,35 @@
+From 8eaec876f732c7e4b238ada5f9304c6da2380eb1 Mon Sep 17 00:00:00 2001
+From: Andrey Shvetsov <andrey.shvetsov@k2l.de>
+Date: Fri, 8 Feb 2019 22:44:32 +0000
+Subject: [PATCH] backport: usb: setup_timer
+
+---
+ driver/hdm-usb/hdm_usb.c | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+diff --git a/hdm-usb/hdm_usb.c b/hdm-usb/hdm_usb.c
+index 5b0af88..9896835 100644
+--- a/hdm-usb/hdm_usb.c
++++ b/hdm-usb/hdm_usb.c
+@@ -760,9 +760,9 @@ static void hdm_request_netinfo(struct most_interface *iface, int channel,
+ * The handler runs in interrupt context. That's why we need to defer the
+ * tasks to a work queue.
+ */
+-static void link_stat_timer_handler(unsigned long data)
++static void link_stat_timer_handler(struct timer_list *t)
+ {
+- struct most_dev *mdev = (struct most_dev *)data;
++ struct most_dev *mdev = from_timer(mdev, t, link_stat_timer);
+
+ schedule_work(&mdev->poll_work_obj);
+ mdev->link_stat_timer.expires = jiffies + (2 * HZ);
+@@ -1154,8 +1154,7 @@ hdm_probe(struct usb_interface *interface, const struct usb_device_id *id)
+ num_endpoints = usb_iface_desc->desc.bNumEndpoints;
+ mutex_init(&mdev->io_mutex);
+ INIT_WORK(&mdev->poll_work_obj, wq_netinfo);
+- setup_timer(&mdev->link_stat_timer, link_stat_timer_handler,
+- (unsigned long)mdev);
++ timer_setup(&mdev->link_stat_timer, link_stat_timer_handler, 0);
+
+ mdev->usb_device = usb_dev;
+ mdev->link_stat_timer.expires = jiffies + (2 * HZ);
diff --git a/recipes-kernel/most/files/0011-handle-snd_pcm_lib_mmap_vmalloc-removal.patch b/recipes-kernel/most/files/0011-handle-snd_pcm_lib_mmap_vmalloc-removal.patch
new file mode 100644
index 00000000..d4383c4f
--- /dev/null
+++ b/recipes-kernel/most/files/0011-handle-snd_pcm_lib_mmap_vmalloc-removal.patch
@@ -0,0 +1,30 @@
+Handle snd_pcm_lib_mmap_vmalloc removal in 4.19
+
+Add .mmap field back to pcm_ops for kernels older than 4.19.
+
+Upstream-Status: Inappropriate
+
+Signed-off-by: Scott Murray <scott.murray@konsulko.com>
+
+diff --git a/aim-sound/sound.c b/aim-sound/sound.c
+index 4b3329b..c0a26be 100644
+--- a/aim-sound/sound.c
++++ b/aim-sound/sound.c
+@@ -17,6 +17,7 @@
+ #include <linux/printk.h>
+ #include <linux/kernel.h>
+ #include <linux/init.h>
++#include <linux/version.h>
+ #include <sound/core.h>
+ #include <sound/pcm.h>
+ #include <sound/pcm_params.h>
+@@ -463,6 +464,9 @@ static const struct snd_pcm_ops pcm_ops = {
+ .trigger = pcm_trigger,
+ .pointer = pcm_pointer,
+ .page = snd_pcm_lib_get_vmalloc_page,
++#if LINUX_VERSION_CODE < KERNEL_VERSION(4,19,0)
++ .mmap = snd_pcm_lib_mmap_vmalloc,
++#endif
+ };
+
+ static int split_arg_list(char *buf, char **card_name, u16 *ch_num,
diff --git a/recipes-kernel/most/files/0012-Fix-build-with-5.4-kernel.patch b/recipes-kernel/most/files/0012-Fix-build-with-5.4-kernel.patch
new file mode 100644
index 00000000..02eca27d
--- /dev/null
+++ b/recipes-kernel/most/files/0012-Fix-build-with-5.4-kernel.patch
@@ -0,0 +1,68 @@
+From 877d7475413bb787deb07aa83bafac03efa399fa Mon Sep 17 00:00:00 2001
+From: Paul Barker <paul.barker@sancloud.co.uk>
+Date: Mon, 24 Feb 2020 14:58:52 +0000
+Subject: [PATCH] Fix build with 5.4 kernel
+
+Signed-off-by: Paul Barker <paul.barker@sancloud.co.uk>
+---
+ driver/Makefile | 11 ++++++++++-
+ 1 file changed, 10 insertions(+), 1 deletion(-)
+
+diff --git a/Makefile b/Makefile
+index 281241d..609e692 100644
+--- a/Makefile
++++ b/Makefile
+@@ -5,6 +5,7 @@ SRC := $(shell pwd)
+ obj-m := mostcore.o
+ mostcore-y := mostcore/core.o
+ CFLAGS_core.o := -I$(src)/include/
++CFLAGS_mostcore/core.o := -I$(src)/include/
+
+ obj-m += default_conf.o
+ CFLAGL_default_conf.o := -I$(src)/include
+@@ -12,33 +13,41 @@ CFLAGL_default_conf.o := -I$(src)/include
+ obj-m += aim_cdev.o
+ aim_cdev-y := aim-cdev/cdev.o
+ CFLAGS_cdev.o := -I$(src)/include/
++CFLAGS_aim-cdev/cdev.o := -I$(src)/include/
+
+ obj-m += aim_network.o
+ aim_network-y := aim-network/networking.o
+ CFLAGS_networking.o := -I$(src)/include/
++CFLAGS_aim-network/networking.o := -I$(src)/include/
+
+ obj-m += aim_sound.o
+ aim_sound-y := aim-sound/sound.o
+ CFLAGS_sound.o := -I$(src)/include/
++CFLAGS_aim-sound/sound.o := -I$(src)/include/
+
+ obj-m += aim_v4l2.o
+ aim_v4l2-y := aim-v4l2/video.o
+ CFLAGS_video.o := -Idrivers/media/video -I$(src)/include/
++CFLAGS_aim-v4l2/video.o := -Idrivers/media/video -I$(src)/include/
+
+ obj-m += hdm_i2c.o
+ hdm_i2c-y := hdm-i2c/hdm_i2c.o
+ CFLAGS_hdm_i2c.o := -I$(src)/include/
++CFLAGS_hdm-i2c/hdm_i2c.o := -I$(src)/include/
+
+ ifdef CONFIG_OF
+ obj-m += hdm_dim2.o
+ hdm_dim2-y := hdm-dim2/dim2_hdm.o hdm-dim2/dim2_hal.o hdm-dim2/dim2_sysfs.o
+ CFLAGS_dim2_hdm.o := -I$(src)/include/
++CFLAGS_hdm-dim2/dim2_hdm.o := -I$(src)/include/
++CFLAGS_hdm-dim2/dim2_hal.o := -I$(src)/include/
++CFLAGS_hdm-dim2/dim2_sysfs.o := -I$(src)/include/
+ endif
+
+ obj-m += hdm_usb.o
+ hdm_usb-y := hdm-usb/hdm_usb.o
+ CFLAGS_hdm_usb.o := -I$(src)/include/
+-
++CFLAGS_hdm-usb/hdm_usb.o := -I$(src)/include/
+
+ all:
+ $(MAKE) -C $(KERNEL_SRC) M=$(SRC) modules
+--
+2.20.1
+
diff --git a/recipes-kernel/most/most.bb b/recipes-kernel/most/most.bb
new file mode 100644
index 00000000..48959a6e
--- /dev/null
+++ b/recipes-kernel/most/most.bb
@@ -0,0 +1,14 @@
+DESCRIPTION = "Build MOST driver"
+LICENSE = "GPLv2"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/GPL-2.0;md5=801f80980d171dd6425610833a22dbe6"
+
+inherit module
+
+PV = "0.1"
+
+SRC_URI = "git://gerrit.automotivelinux.org/gerrit/src/most;protocol=https;branch=${AGL_BRANCH}"
+
+S = "${WORKDIR}/git/driver"
+SRCREV = "e4dbbaf9e7652efaed0df3e0aab4464f5f228573"
+
+KERNEL_MODULE_AUTOLOAD += "aim_cdev aim_sound aim_network aim_v4l2 hdm_i2c hdm_dim2 hdm_usb mostcore"
diff --git a/recipes-kernel/most/most.bbappend b/recipes-kernel/most/most.bbappend
new file mode 100644
index 00000000..ad422eb5
--- /dev/null
+++ b/recipes-kernel/most/most.bbappend
@@ -0,0 +1,15 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
+
+SRC_URI_append = " \
+ file://0002-src-most-add-auto-conf-feature.patch \
+ file://0003-core-remove-kernel-log-for-MBO-status.patch \
+ file://0004-most-video-set-device_caps.patch \
+ file://0005-most-video-set-V4L2_CAP_DEVICE_CAPS-flag.patch \
+ file://0006-dim2-fix-startup-sequence.patch \
+ file://0007-dim2-use-device-tree.patch \
+ file://0008-dim2-read-clock-speed-from-the-device-tree.patch \
+ file://0009-dim2-use-device-for-coherent-memory-allocation.patch \
+ file://0010-backport-usb-setup-timer.patch \
+ file://0011-handle-snd_pcm_lib_mmap_vmalloc-removal.patch \
+ file://0012-Fix-build-with-5.4-kernel.patch \
+"
diff --git a/recipes-multimedia/gstreamer1.0-plugins-bad/gstreamer1.0-plugins-bad/0001-gst-wayland-Install-wayland-header-from-gstwayland-l.patch b/recipes-multimedia/gstreamer1.0-plugins-bad/gstreamer1.0-plugins-bad/0001-gst-wayland-Install-wayland-header-from-gstwayland-l.patch
new file mode 100644
index 00000000..443e7db8
--- /dev/null
+++ b/recipes-multimedia/gstreamer1.0-plugins-bad/gstreamer1.0-plugins-bad/0001-gst-wayland-Install-wayland-header-from-gstwayland-l.patch
@@ -0,0 +1,28 @@
+From 03e502084633838badfcc2b91a1aca1651c18544 Mon Sep 17 00:00:00 2001
+From: Marius Vlad <marius.vlad@collabora.com>
+Date: Wed, 24 Jun 2020 19:44:35 +0300
+Subject: [PATCH] gst/wayland/: Install wayland header from gstwayland library
+
+Necessary for cluster-receiver to pass out the wl_surface.
+
+Bug-AGL: SPEC-3382
+
+Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
+---
+ gst-libs/gst/wayland/meson.build | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/gst-libs/gst/wayland/meson.build b/gst-libs/gst/wayland/meson.build
+index b1ede41f1..8957381d2 100644
+--- a/gst-libs/gst/wayland/meson.build
++++ b/gst-libs/gst/wayland/meson.build
+@@ -21,4 +21,6 @@ if use_wayland
+ gstwayland_dep = declare_dependency(link_with : gstwayland,
+ include_directories : [libsinc],
+ dependencies : [gst_dep, gstvideo_dep])
++
++ install_headers('wayland.h', subdir: 'gst/wayland')
+ endif
+--
+2.26.2
+
diff --git a/recipes-multimedia/gstreamer1.0-plugins-bad/gstreamer1.0-plugins-bad_1.16.%.bbappend b/recipes-multimedia/gstreamer1.0-plugins-bad/gstreamer1.0-plugins-bad_1.16.%.bbappend
new file mode 100644
index 00000000..7f389dab
--- /dev/null
+++ b/recipes-multimedia/gstreamer1.0-plugins-bad/gstreamer1.0-plugins-bad_1.16.%.bbappend
@@ -0,0 +1 @@
+require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'gstreamer1.0-plugins-bad_agldemo.inc', '', d)}
diff --git a/recipes-multimedia/gstreamer1.0-plugins-bad/gstreamer1.0-plugins-bad_agldemo.inc b/recipes-multimedia/gstreamer1.0-plugins-bad/gstreamer1.0-plugins-bad_agldemo.inc
new file mode 100644
index 00000000..fcfda531
--- /dev/null
+++ b/recipes-multimedia/gstreamer1.0-plugins-bad/gstreamer1.0-plugins-bad_agldemo.inc
@@ -0,0 +1,2 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/gstreamer1.0-plugins-bad:"
+SRC_URI_append = " file://0001-gst-wayland-Install-wayland-header-from-gstwayland-l.patch"
diff --git a/recipes-multimedia/gstreamer1.0-plugins-good/gstreamer1.0-plugins-good_%.bbappend b/recipes-multimedia/gstreamer1.0-plugins-good/gstreamer1.0-plugins-good_%.bbappend
new file mode 100644
index 00000000..2d314acd
--- /dev/null
+++ b/recipes-multimedia/gstreamer1.0-plugins-good/gstreamer1.0-plugins-good_%.bbappend
@@ -0,0 +1 @@
+require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'gstreamer1.0-plugins-good_agldemo.inc', '', d)}
diff --git a/recipes-multimedia/gstreamer1.0-plugins-good/gstreamer1.0-plugins-good_agldemo.inc b/recipes-multimedia/gstreamer1.0-plugins-good/gstreamer1.0-plugins-good_agldemo.inc
new file mode 100644
index 00000000..86a181fb
--- /dev/null
+++ b/recipes-multimedia/gstreamer1.0-plugins-good/gstreamer1.0-plugins-good_agldemo.inc
@@ -0,0 +1,2 @@
+# libv4l2 is useful for making more efficient use of cameras via v4l2src.
+PACKAGECONFIG_append = " libv4l2"
diff --git a/recipes-multimedia/libmp4v2/files/0001-add-a-configure-option-to-disable-build-of-man-pages.patch b/recipes-multimedia/libmp4v2/files/0001-add-a-configure-option-to-disable-build-of-man-pages.patch
new file mode 100644
index 00000000..51896e8d
--- /dev/null
+++ b/recipes-multimedia/libmp4v2/files/0001-add-a-configure-option-to-disable-build-of-man-pages.patch
@@ -0,0 +1,40 @@
+From 530a31e3eb24b2f1ed7b30859ed62a2d1b24bd91 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Andreas=20M=C3=BCller?= <schnitzeltony@googlemail.com>
+Date: Tue, 7 Feb 2017 11:51:58 +0100
+Subject: [PATCH] add a configure option to disable build of man-pages
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Upstream-Status: Pending
+
+Signed-off-by: Andreas Müller <schnitzeltony@googlemail.com>
+---
+ configure.ac | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/configure.ac b/configure.ac
+index 8316c67..099fc0c 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -67,6 +67,8 @@ AC_ARG_ENABLE([largefile],
+ [AS_HELP_STRING([--disable-largefile],[disable LFS (large file support)])])
+ AC_ARG_ENABLE([util],
+ [AS_HELP_STRING([--disable-util],[disable build of command-line utilities])])
++AC_ARG_ENABLE([man],
++ [AS_HELP_STRING([--disable-man],[disable build of man-pages])])
+ AC_ARG_ENABLE([bi],
+ [AS_HELP_STRING([--enable-bi=ARCH],[enable -mARCH for bi-arch compilation])])
+ AC_ARG_ENABLE([ub],
+@@ -395,7 +397,7 @@ AM_CONDITIONAL([ADD_PLATFORM_POSIX],[test "$X_PLATFORM" = "posix"])
+ AM_CONDITIONAL([ADD_PLATFORM_WIN32],[test "$X_PLATFORM" = "win32"])
+
+ AM_CONDITIONAL([ADD_UTIL],[test "$enable_util" != "no"])
+-AM_CONDITIONAL([ADD_MANS],[test "$X_PLATFORM" != "win32"])
++AM_CONDITIONAL([ADD_MANS],[test "$enable_man" != "no"])
+
+ ###############################################################################
+ # declare common substitutions
+--
+2.9.3
+
diff --git a/recipes-multimedia/libmp4v2/libmp4v2_git.bb b/recipes-multimedia/libmp4v2/libmp4v2_git.bb
new file mode 100644
index 00000000..dd1b3474
--- /dev/null
+++ b/recipes-multimedia/libmp4v2/libmp4v2_git.bb
@@ -0,0 +1,18 @@
+SUMMARY = "The MP4v2 library provides an API to create and modify mp4 files"
+HOMEPAGE = "https://github.com/sergiomb2/libmp4v2/wiki"
+LICENSE = "MPLv1.1"
+LIC_FILES_CHKSUM = "file://COPYING;md5=eb3014b036b6d2151d944aef6a84c36f"
+
+inherit autotools-brokensep pkgconfig
+
+SRC_URI = " \
+ git://github.com/sergiomb2/${BPN}.git \
+ file://0001-add-a-configure-option-to-disable-build-of-man-pages.patch \
+"
+SRCREV = "855e9674232808ff3be7191b697dfb56917db21f"
+S = "${WORKDIR}/git"
+PV = "2.1.0+git${SRCPV}"
+
+
+SECURITY_CFLAGS = "${SECURITY_NO_PIE_CFLAGS}"
+EXTRA_OECONF = "--disable-man"
diff --git a/recipes-multimedia/lightmediascanner/.appends.meta-efl b/recipes-multimedia/lightmediascanner/.appends.meta-efl
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/recipes-multimedia/lightmediascanner/.appends.meta-efl
diff --git a/recipes-multimedia/lightmediascanner/files/0001-Define-comparison_fn_t-for-non-glibc-systems.patch b/recipes-multimedia/lightmediascanner/files/0001-Define-comparison_fn_t-for-non-glibc-systems.patch
new file mode 100644
index 00000000..15d4b3f0
--- /dev/null
+++ b/recipes-multimedia/lightmediascanner/files/0001-Define-comparison_fn_t-for-non-glibc-systems.patch
@@ -0,0 +1,33 @@
+From 5bc5b8c5dad3edec6736fd7e7ce61250c4ce3725 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Wed, 12 Jul 2017 17:13:19 -0700
+Subject: [PATCH] Define comparison_fn_t for non-glibc systems
+
+lightmediascanner.c:324:12: error: 'comparison_fn_t' undeclared (first use in this function)
+ (comparison_fn_t)_plugin_sort);
+ ^~~~~~~~~~~~~~~
+
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ src/lib/lightmediascanner.c | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/src/lib/lightmediascanner.c b/src/lib/lightmediascanner.c
+index 344b247..b866883 100644
+--- a/src/lib/lightmediascanner.c
++++ b/src/lib/lightmediascanner.c
+@@ -37,6 +37,11 @@
+ #define DEFAULT_SLAVE_TIMEOUT 1000
+ #define DEFAULT_COMMIT_INTERVAL 100
+
++#if !defined(__GLIBC__)
++typedef int (*__compar_fn_t) (const void*, const void*);
++typedef __compar_fn_t comparison_fn_t;
++#endif
++
+ #ifdef HAVE_MAGIC_H
+ static magic_t _magic_handle;
+
+--
+2.13.2
+
diff --git a/recipes-multimedia/lightmediascanner/files/0002-switch-from-G_BUS_TYPE_SESSION-to-G_BUS_TYPE_SYSTEM.patch b/recipes-multimedia/lightmediascanner/files/0002-switch-from-G_BUS_TYPE_SESSION-to-G_BUS_TYPE_SYSTEM.patch
new file mode 100644
index 00000000..5abb980b
--- /dev/null
+++ b/recipes-multimedia/lightmediascanner/files/0002-switch-from-G_BUS_TYPE_SESSION-to-G_BUS_TYPE_SYSTEM.patch
@@ -0,0 +1,49 @@
+From 5a618b444e424483c3a9d34dd9b196796cac8e3f Mon Sep 17 00:00:00 2001
+From: Matt Ranostay <matt.ranostay@konsulko.com>
+Date: Mon, 22 Jul 2019 13:29:52 -0700
+Subject: [PATCH] switch from G_BUS_TYPE_SESSION to G_BUS_TYPE_SYSTEM
+
+Signed-off-by: Matt Ranostay <matt.ranostay@konsulko.com>
+---
+ src/bin/lightmediascannerctl.c | 4 ++--
+ src/bin/lightmediascannerd.c | 2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/src/bin/lightmediascannerctl.c b/src/bin/lightmediascannerctl.c
+index 5764bc0..1d4d844 100644
+--- a/src/bin/lightmediascannerctl.c
++++ b/src/bin/lightmediascannerctl.c
+@@ -11,7 +11,7 @@ start_service_by_name(void)
+ GVariant *var;
+ GDBusConnection *conn;
+
+- conn = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, &error);
++ conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
+ if (error) {
+ fprintf(stderr, "Could not get session bus connection: %s\n",
+ error->message);
+@@ -526,7 +526,7 @@ main(int argc, char *argv[])
+
+ app.timer = NULL;
+ app.loop = g_main_loop_new(NULL, FALSE);
+- app.proxy = g_dbus_proxy_new_for_bus_sync(G_BUS_TYPE_SESSION,
++ app.proxy = g_dbus_proxy_new_for_bus_sync(G_BUS_TYPE_SYSTEM,
+ G_DBUS_PROXY_FLAGS_NONE,
+ NULL,
+ "org.lightmediascanner",
+diff --git a/src/bin/lightmediascannerd.c b/src/bin/lightmediascannerd.c
+index 319db42..6db81cc 100644
+--- a/src/bin/lightmediascannerd.c
++++ b/src/bin/lightmediascannerd.c
+@@ -1721,7 +1721,7 @@ main(int argc, char *argv[])
+ introspection_data = g_dbus_node_info_new_for_xml(introspection_xml, NULL);
+ g_assert(introspection_xml != NULL);
+
+- id = g_bus_own_name(G_BUS_TYPE_SESSION, "org.lightmediascanner",
++ id = g_bus_own_name(G_BUS_TYPE_SYSTEM, "org.lightmediascanner",
+ G_BUS_NAME_OWNER_FLAGS_NONE,
+ NULL, on_name_acquired, NULL, NULL, NULL);
+
+--
+2.20.1
+
diff --git a/recipes-multimedia/lightmediascanner/files/dbus-lightmediascanner.conf b/recipes-multimedia/lightmediascanner/files/dbus-lightmediascanner.conf
new file mode 100644
index 00000000..8a9e35b0
--- /dev/null
+++ b/recipes-multimedia/lightmediascanner/files/dbus-lightmediascanner.conf
@@ -0,0 +1,12 @@
+<?xml version="1.0"?> <!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
+<busconfig>
+ <policy user="root">
+ <allow own="org.lightmediascanner"/>
+ <allow send_destination="org.lightmediascanner"/>
+ <allow receive_type="signal" receive_sender="org.lightmediascanner" receive_interface="org.freedesktop.DBus.Properties"/>
+ </policy>
+
+ <policy at_console="true">
+ <allow send_destination="org.lightmediascanner"/>
+ </policy>
+</busconfig>
diff --git a/recipes-multimedia/lightmediascanner/files/id3-plugin-support-out-of-tree-build.patch b/recipes-multimedia/lightmediascanner/files/id3-plugin-support-out-of-tree-build.patch
new file mode 100644
index 00000000..9528bec7
--- /dev/null
+++ b/recipes-multimedia/lightmediascanner/files/id3-plugin-support-out-of-tree-build.patch
@@ -0,0 +1,11 @@
+--- a/src/plugins/Makefile.am 2015-10-25 16:12:29.331415823 +0000
++++ b/src/plugins/Makefile.am 2015-10-25 16:14:37.593415808 +0000
+@@ -93,7 +93,7 @@
+ id3_id3_la_SOURCES = id3/id3.c id3/id3v1_genres.c
+ id3_id3_la_LIBADD = $(PLUGINS_LIBADD)
+
+-id3/id3v1_genres.c: $(srcdir)/id3/id3v1_genres.def $(srcdir)/id3/id3v1_genres_gen.awk
++$(srcdir)/id3/id3v1_genres.c: $(srcdir)/id3/id3v1_genres.def $(srcdir)/id3/id3v1_genres_gen.awk
+ $(AWK) -f $(srcdir)/id3/id3v1_genres_gen.awk $(srcdir)/id3/id3v1_genres.def > $@
+
+ EXTRA_DIST += id3/id3v1_genres.def id3/id3v1_genres_gen.awk
diff --git a/recipes-multimedia/lightmediascanner/files/lightmediascanner.service b/recipes-multimedia/lightmediascanner/files/lightmediascanner.service
new file mode 100644
index 00000000..63b48ebf
--- /dev/null
+++ b/recipes-multimedia/lightmediascanner/files/lightmediascanner.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=Lightmediascanner (LMS)
+After=run-agl-postinsts.service systemd-remount-fs.service systemd-tmpfiles-setup.service tmp.mount
+ConditionPathIsReadWrite=/var/volatile/tmp
+
+[Service]
+Type=dbus
+Restart=on-failure
+RestartSec=0
+BusName=org.lightmediascanner
+SmackProcessLabel=User::App::agl-service-mediascanner
+ExecStart=/usr/bin/lightmediascannerd --startup-scan --db-path=/var/volatile/tmp/lightmediascannerd.db --directory=/media
+
+[Install]
+WantedBy=multi-user.target
+Alias=dbus-org.lightmediascanner.service
diff --git a/recipes-multimedia/lightmediascanner/files/plugin-ogg-fix-chucksize-issue.patch b/recipes-multimedia/lightmediascanner/files/plugin-ogg-fix-chucksize-issue.patch
new file mode 100644
index 00000000..6a0b8ff9
--- /dev/null
+++ b/recipes-multimedia/lightmediascanner/files/plugin-ogg-fix-chucksize-issue.patch
@@ -0,0 +1,53 @@
+From 3e66b97221440b17a184feb48692dce7e0561cac Mon Sep 17 00:00:00 2001
+From: Matt Ranostay <matt.ranostay@konsulko.com>
+Date: Wed, 8 Mar 2017 16:30:01 -0800
+Subject: [PATCH] plugin: ogg: fix chucksize issue
+
+There are some OGG files that have metadata chucks that go over the
+hardcoded 10 * 4096 size due to album art. This patchset just parses
+each chuck and continues till it runs out of valid chunks.
+
+Signed-off-by: Matt Ranostay <matt.ranostay@konsulko.com>
+---
+ src/plugins/ogg/ogg.c | 11 ++---------
+ 1 file changed, 2 insertions(+), 9 deletions(-)
+
+diff --git a/src/plugins/ogg/ogg.c b/src/plugins/ogg/ogg.c
+index 1c0818e..c94dc38 100644
+--- a/src/plugins/ogg/ogg.c
++++ b/src/plugins/ogg/ogg.c
+@@ -47,8 +47,6 @@
+ int CHUNKSIZE = 4096;
+ #endif
+
+-#define MAX_CHUNKS_PER_PAGE 10
+-
+ struct stream {
+ struct lms_stream base;
+ int serial;
+@@ -122,10 +120,8 @@ _set_lms_info(struct lms_string_size *info, const char *tag)
+
+ static bool _ogg_read_page(FILE *fp, ogg_sync_state *osync, ogg_page *page)
+ {
+- int i;
+-
+- for (i = 0; i < MAX_CHUNKS_PER_PAGE && ogg_sync_pageout(osync, page) != 1;
+- i++) {
++ while(ogg_sync_pageout(osync, page) != 1)
++ {
+ lms_ogg_buffer_t buffer = lms_get_ogg_sync_buffer(osync, CHUNKSIZE);
+ int bytes = fread(buffer, 1, CHUNKSIZE, fp);
+
+@@ -136,9 +132,6 @@ static bool _ogg_read_page(FILE *fp, ogg_sync_state *osync, ogg_page *page)
+ ogg_sync_wrote(osync, bytes);
+ }
+
+- if (i > MAX_CHUNKS_PER_PAGE)
+- return false;
+-
+ return true;
+ }
+
+--
+2.7.4
+
diff --git a/recipes-multimedia/lightmediascanner/lightmediascanner_%.bbappend b/recipes-multimedia/lightmediascanner/lightmediascanner_%.bbappend
new file mode 100644
index 00000000..b47b2796
--- /dev/null
+++ b/recipes-multimedia/lightmediascanner/lightmediascanner_%.bbappend
@@ -0,0 +1,42 @@
+# Disable everything but the roygalty-free formats
+PACKAGECONFIG = "ogg flac wave m3u pls jpeg png"
+
+FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
+
+SRC_URI += "file://lightmediascanner.service \
+ file://plugin-ogg-fix-chucksize-issue.patch \
+ file://0002-switch-from-G_BUS_TYPE_SESSION-to-G_BUS_TYPE_SYSTEM.patch \
+ file://dbus-lightmediascanner.conf \
+ "
+
+CFLAGS_append = " -D_FILE_OFFSET_BITS=64"
+
+inherit systemd
+
+SYSTEMD_PACKAGES = "${PN}"
+SYSTEMD_SERVICE_${PN} = "lightmediascanner.service"
+SYSTEMD_AUTO_ENABLE_${PN} = "enable"
+
+do_install_append() {
+ # Install LMS systemd service
+ if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then
+ install -d ${D}${systemd_system_unitdir}
+ install -m 644 -p -D ${WORKDIR}/lightmediascanner.service ${D}${systemd_system_unitdir}/lightmediascanner.service
+ fi
+
+ install -d ${D}/etc/dbus-1/system.d
+ install -m 0644 ${WORKDIR}/dbus-lightmediascanner.conf ${D}/etc/dbus-1/system.d/org.lightmediascanner.conf
+}
+
+FILES_${PN} += " \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', '${systemd_system_unitdir}/lightmediascanner.service', '', d)} \
+ "
+
+EXTRA_OECONF = "--enable-static --with-dbus-services=${datadir}/dbus-1/system-services"
+PACKAGECONFIG[mp4] = "--enable-mp4,--disable-mp4,libmp4v2"
+
+# add support MP3 because of the format of music files for AGL CES/ALS2017 Demo
+PACKAGECONFIG_append = " id3 mp4"
+
+# add required character sets for id3 tag scanning
+RDEPENDS_${PN}_append = " glibc-gconv-utf-16 glibc-gconv-iso8859-1"
diff --git a/recipes-multimedia/lightmediascanner/lightmediascanner_0.5.1.bb b/recipes-multimedia/lightmediascanner/lightmediascanner_0.5.1.bb
new file mode 100644
index 00000000..f2158760
--- /dev/null
+++ b/recipes-multimedia/lightmediascanner/lightmediascanner_0.5.1.bb
@@ -0,0 +1,63 @@
+SUMMARY = "Lightweight media scanner"
+DESCRIPTION = "Lightweight media scanner meant to be used in not-so-powerful devices, like embedded systems or old machines."
+SECTION = "libs/multimedia"
+
+LICENSE = "LGPLv2.1+"
+LIC_FILES_CHKSUM = "file://COPYING;md5=a6f89e2100d9b6cdffcea4f398e37343 \
+ file://src/lib/lightmediascanner.c;endline=21;md5=6d8889bccb4c6c27e8b786342a3eb267"
+
+DEPENDS = "file gawk glib-2.0 sqlite3"
+
+PV = "0.5.1+git${SRCPV}"
+SRCREV = "adfddb3486276a5ed2f5008c9e43a811e1271cc9"
+SRC_URI = "git://github.com/profusion/lightmediascanner.git \
+ file://id3-plugin-support-out-of-tree-build.patch \
+ file://0001-Define-comparison_fn_t-for-non-glibc-systems.patch \
+ "
+
+S = "${WORKDIR}/git"
+
+inherit autotools pkgconfig
+
+EXTRA_OECONF = "--enable-static --disable-mp4"
+
+PACKAGECONFIG ??= "ogg flac wave id3 m3u pls asf rm jpeg png"
+PACKAGECONFIG[generic] = "--enable-generic,--disable-generic,libav"
+PACKAGECONFIG[ogg] = "--enable-ogg,--disable-ogg,libogg libvorbis libtheora"
+PACKAGECONFIG[flac] = "--enable-flac,--disable-flac,flac"
+PACKAGECONFIG[wave] = "--enable-wave,--disable-wave"
+PACKAGECONFIG[id3] = "--enable-id3,--disable-id3"
+PACKAGECONFIG[m3u] = "--enable-m3u,--disable-m3u"
+PACKAGECONFIG[pls] = "--enable-pls,--disable-pls"
+PACKAGECONFIG[asf] = "--enable-asf,--disable-asf"
+PACKAGECONFIG[rm] = "--enable-rm,--disable-rm"
+PACKAGECONFIG[jpeg] = "--enable-jpeg,--disable-jpeg"
+PACKAGECONFIG[png] = "--enable-png,--disable-png"
+
+do_install_append() {
+ # Install "test" binary for corresponding package
+ install -d ${D}/${bindir}
+ install -m 755 ${B}/src/bin/.libs/test ${D}/${bindir}/test-lms
+ # Remove .la files for loadable modules
+ rm -f ${D}/${libdir}/${PN}/plugins/*.la
+}
+
+FILES_${PN} += "${datadir}/dbus-1"
+FILES_${PN}-dbg += "${libdir}/${PN}/plugins/.debug"
+
+PACKAGES_prepend = "${PN}-test "
+FILES_${PN}-test_prepend = "${bindir}/test-lms "
+
+PACKAGES += "${PN}-meta"
+ALLOW_EMPTY_${PN}-meta = "1"
+
+PACKAGES_DYNAMIC = "${PN}-plugin-*"
+
+python populate_packages_prepend () {
+ lms_libdir = d.expand('${libdir}/${PN}')
+ pkgs = []
+
+ pkgs += do_split_packages(d, oe.path.join(lms_libdir, "plugins"), '^(.*)\.so$', d.expand('${PN}-plugin-%s'), 'LightMediaScanner plugin for %s', prepend=True, extra_depends=d.expand('${PN}'))
+ metapkg = d.getVar('PN') + '-meta'
+ d.setVar('RDEPENDS_' + metapkg, ' '.join(pkgs))
+}
diff --git a/recipes-navigation/geoclue/files/org.freedesktop.GeoClue2.Client.conf b/recipes-navigation/geoclue/files/org.freedesktop.GeoClue2.Client.conf
new file mode 100644
index 00000000..a7486d05
--- /dev/null
+++ b/recipes-navigation/geoclue/files/org.freedesktop.GeoClue2.Client.conf
@@ -0,0 +1,8 @@
+<!DOCTYPE busconfig PUBLIC
+ "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
+ "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
+<busconfig>
+ <policy user="root">
+ <allow receive_type="signal" receive_interface="org.freedesktop.GeoClue2.Client" />
+ </policy>
+</busconfig>
diff --git a/recipes-navigation/geoclue/geoclue_%.bbappend b/recipes-navigation/geoclue/geoclue_%.bbappend
new file mode 100644
index 00000000..eb1eef6b
--- /dev/null
+++ b/recipes-navigation/geoclue/geoclue_%.bbappend
@@ -0,0 +1 @@
+require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'geoclue_agldemo.inc', '', d)}
diff --git a/recipes-navigation/geoclue/geoclue_agldemo.inc b/recipes-navigation/geoclue/geoclue_agldemo.inc
new file mode 100644
index 00000000..24936e5c
--- /dev/null
+++ b/recipes-navigation/geoclue/geoclue_agldemo.inc
@@ -0,0 +1,11 @@
+inherit gobject-introspection
+
+FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
+SRC_URI_append = " file://org.freedesktop.GeoClue2.Client.conf"
+
+PACKAGECONFIG = "nmea lib"
+
+do_install_append() {
+ install -d ${D}/etc/dbus-1/system.d
+ install -m 0644 ${WORKDIR}/org.freedesktop.GeoClue2.Client.conf ${D}/etc/dbus-1/system.d/org.freedesktop.GeoClue2.Client.conf
+}
diff --git a/recipes-navigation/gpsd/gpsd/sw-device-hook b/recipes-navigation/gpsd/gpsd/sw-device-hook
new file mode 100644
index 00000000..e1e6f7a4
--- /dev/null
+++ b/recipes-navigation/gpsd/gpsd/sw-device-hook
@@ -0,0 +1,23 @@
+#!/bin/sh
+
+# Figure out the parent usb device
+USBDEV=`ls -l "$1" |sed -ne 's!^c[^ ]* [0-9]* [^ ]* [^ ]* \([0-9]*\), \([0-9]*\) .*!/sys/dev/char/\1:\2/device/../..!p'`
+
+# Silently ignore any non-USB ports
+if [ ! -r "$USBDEV/idVendor" ] || [ ! -r "$USBDEV/idProduct" ]; then
+ exit 0
+fi
+
+VID=`cat "$USBDEV/idVendor"`
+PID=`cat "$USBDEV/idProduct"`
+case "$2" in
+ ACTIVATE) CMD=START ;;
+ *) CMD=STOP ;;
+esac
+
+case "$VID:$PID" in
+ "1199:9071"|"1199:9079") echo \$GPS_$CMD >"$1" ;;
+ *) ;;
+esac
+
+exit 0
diff --git a/recipes-navigation/gpsd/gpsd_%.bbappend b/recipes-navigation/gpsd/gpsd_%.bbappend
new file mode 100644
index 00000000..ac56bfb8
--- /dev/null
+++ b/recipes-navigation/gpsd/gpsd_%.bbappend
@@ -0,0 +1 @@
+require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'gpsd_agldemo.inc', '', d)}
diff --git a/recipes-navigation/gpsd/gpsd_agldemo.inc b/recipes-navigation/gpsd/gpsd_agldemo.inc
new file mode 100644
index 00000000..5899505b
--- /dev/null
+++ b/recipes-navigation/gpsd/gpsd_agldemo.inc
@@ -0,0 +1,28 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/gpsd:"
+
+SRC_URI += "file://sw-device-hook"
+
+do_install_append() {
+ # Install device-hook script for starting NMEA output on Sierra Wireless modems
+ install -d ${D}${sysconfdir}/gpsd
+ install -m 0755 ${WORKDIR}/sw-device-hook ${D}${sysconfdir}/gpsd/device-hook
+}
+
+
+
+SYSTEMD_SERVICE_${PN}_append = " gpsdctl@.service"
+
+RPROVIDES_${PN}-conf_append = " virtual/gpsd-conf"
+
+do_install_append() {
+ # use the systemd compatible gpsd.rules
+ install -d ${D}/${sysconfdir}/udev/rules.d
+ install -m 0644 ${S}/gpsd.rules ${D}/${sysconfdir}/udev/rules.d/60-gpsd.rules
+
+ #support for systemd
+ install -d ${D}${systemd_unitdir}/system/
+ install -m 0644 ${S}/systemd/gpsdctl@.service ${D}${systemd_unitdir}/system
+
+ #autoprobe usb gps devices
+ echo 'USBAUTO="true"' >> ${D}${sysconfdir}/default/gpsd.default
+}
diff --git a/recipes-platform/images/agl-cluster-demo-platform-crosssdk.bb b/recipes-platform/images/agl-cluster-demo-platform-crosssdk.bb
new file mode 100644
index 00000000..6f8bf629
--- /dev/null
+++ b/recipes-platform/images/agl-cluster-demo-platform-crosssdk.bb
@@ -0,0 +1,27 @@
+SUMMARY = "Cross SDK of AGL Distribution for Cluster profile Demo"
+
+DESCRIPTION = "SDK image for AGL Distribution for Cluster profile Demo. \
+It includes the full meta-toolchain, plus developement headers and libraries \
+to form a standalone cross SDK."
+
+require agl-cluster-demo-platform.bb
+
+LICENSE = "MIT"
+
+IMAGE_FEATURES_append = " dev-pkgs"
+IMAGE_INSTALL_append = " kernel-dev kernel-devsrc"
+
+inherit populate_sdk populate_sdk_qt5
+
+# Task do_populate_sdk and do_rootfs can't be exec simultaneously.
+# Both exec "createrepo" on the same directory, and so one of them
+# can failed (randomly).
+addtask do_populate_sdk after do_rootfs
+
+# Add wayland-scanner to SDK (SPEC-945)
+# Use TOOLCHAIN_HOST_TASK instead of adding to the packagegroup
+# wayland-scanner is in nativesdk-wayland-dev !
+# option: add also nativesdk-qtwayland-tools
+TOOLCHAIN_HOST_TASK_append = " nativesdk-wayland nativesdk-wayland-dev"
+
+TOOLCHAIN_HOST_TASK_append = " nativesdk-perl-modules "
diff --git a/recipes-platform/images/agl-cluster-demo-platform.bb b/recipes-platform/images/agl-cluster-demo-platform.bb
new file mode 100644
index 00000000..52d737b7
--- /dev/null
+++ b/recipes-platform/images/agl-cluster-demo-platform.bb
@@ -0,0 +1,14 @@
+DESCRIPTION = "AGL Cluster Demo Platform image currently contains a simple cluster interface."
+
+require agl-cluster-demo-platform.inc
+
+LICENSE = "MIT"
+
+IMAGE_FEATURES_append = " \
+ "
+
+# add packages for cluster demo platform (include demo apps) here
+IMAGE_INSTALL_append = " \
+ packagegroup-agl-cluster-demo-platform \
+ "
+
diff --git a/recipes-platform/images/agl-cluster-demo-platform.inc b/recipes-platform/images/agl-cluster-demo-platform.inc
new file mode 100644
index 00000000..8745ca94
--- /dev/null
+++ b/recipes-platform/images/agl-cluster-demo-platform.inc
@@ -0,0 +1,3 @@
+# Base image
+require recipes-platform/images/agl-image-cluster-qt5.inc
+
diff --git a/recipes-platform/images/agl-cluster-demo-qtcompositor.bb b/recipes-platform/images/agl-cluster-demo-qtcompositor.bb
new file mode 100644
index 00000000..d6f32566
--- /dev/null
+++ b/recipes-platform/images/agl-cluster-demo-qtcompositor.bb
@@ -0,0 +1,15 @@
+DESCRIPTION = "AGL Cluster Demo Qtwayland Compositor image currently contains a \
+simple cluster interface and some AGL service."
+
+require agl-cluster-demo-qtcompositor.inc
+
+LICENSE = "MIT"
+
+IMAGE_FEATURES_append = " \
+ "
+
+# add packages for cluster demo qtcompositor
+IMAGE_INSTALL_append = " \
+ packagegroup-agl-cluster-demo-qtcompositor \
+ "
+
diff --git a/recipes-platform/images/agl-cluster-demo-qtcompositor.inc b/recipes-platform/images/agl-cluster-demo-qtcompositor.inc
new file mode 100644
index 00000000..11c1ebce
--- /dev/null
+++ b/recipes-platform/images/agl-cluster-demo-qtcompositor.inc
@@ -0,0 +1,2 @@
+# Base image
+require recipes-platform/images/agl-image-cluster-qt5.inc
diff --git a/recipes-platform/images/agl-demo-platform-crosssdk.bb b/recipes-platform/images/agl-demo-platform-crosssdk.bb
index ff3e9dfd..d4b6c9dd 100644
--- a/recipes-platform/images/agl-demo-platform-crosssdk.bb
+++ b/recipes-platform/images/agl-demo-platform-crosssdk.bb
@@ -8,7 +8,7 @@ require agl-demo-platform.bb
LICENSE = "MIT"
-require recipes-platform/images/agl-image-graphical-qt5-crosssdk.inc
+require agl-image-graphical-qt5-crosssdk.inc
inherit populate_sdk populate_sdk_qt5
diff --git a/recipes-platform/images/agl-image-cluster-qt5.bb b/recipes-platform/images/agl-image-cluster-qt5.bb
new file mode 100644
index 00000000..244e2ba4
--- /dev/null
+++ b/recipes-platform/images/agl-image-cluster-qt5.bb
@@ -0,0 +1,9 @@
+SUMMARY = "A basic Wayland based cluster image with Qt5 support"
+
+require agl-image-cluster-qt5.inc
+
+LICENSE = "MIT"
+
+IMAGE_INSTALL_append = "\
+ profile-cluster-qt5 \
+ "
diff --git a/recipes-platform/images/agl-image-cluster-qt5.inc b/recipes-platform/images/agl-image-cluster-qt5.inc
new file mode 100644
index 00000000..93826aa4
--- /dev/null
+++ b/recipes-platform/images/agl-image-cluster-qt5.inc
@@ -0,0 +1,7 @@
+require recipes-platform/images/agl-image-boot.inc
+
+IMAGE_FEATURES += "splash package-management ssh-server-dropbear"
+
+inherit features_check
+
+REQUIRED_DISTRO_FEATURES = "wayland"
diff --git a/recipes-platform/images/agl-image-cluster.bb b/recipes-platform/images/agl-image-cluster.bb
new file mode 100644
index 00000000..552d7a74
--- /dev/null
+++ b/recipes-platform/images/agl-image-cluster.bb
@@ -0,0 +1,9 @@
+SUMMARY = "A basic Wayland based cluster image"
+
+require agl-image-cluster.inc
+
+LICENSE = "MIT"
+
+IMAGE_INSTALL_append = "\
+ profile-cluster \
+ "
diff --git a/recipes-platform/images/agl-image-cluster.inc b/recipes-platform/images/agl-image-cluster.inc
new file mode 100644
index 00000000..93826aa4
--- /dev/null
+++ b/recipes-platform/images/agl-image-cluster.inc
@@ -0,0 +1,7 @@
+require recipes-platform/images/agl-image-boot.inc
+
+IMAGE_FEATURES += "splash package-management ssh-server-dropbear"
+
+inherit features_check
+
+REQUIRED_DISTRO_FEATURES = "wayland"
diff --git a/recipes-platform/images/agl-image-graphical-html5.bb b/recipes-platform/images/agl-image-graphical-html5.bb
new file mode 100644
index 00000000..0ec6829e
--- /dev/null
+++ b/recipes-platform/images/agl-image-graphical-html5.bb
@@ -0,0 +1,10 @@
+SUMMARY = "An image containing all packages required to run web applications"
+
+require agl-image-graphical-html5.inc
+
+LICENSE = "MIT"
+
+IMAGE_INSTALL_append = "\
+ packagegroup-agl-profile-graphical-html5 \
+ "
+
diff --git a/recipes-platform/images/agl-image-graphical-html5.inc b/recipes-platform/images/agl-image-graphical-html5.inc
new file mode 100644
index 00000000..e943b990
--- /dev/null
+++ b/recipes-platform/images/agl-image-graphical-html5.inc
@@ -0,0 +1,9 @@
+require recipes-platform/images/agl-image-minimal.inc
+
+IMAGE_FEATURES += "splash"
+
+IMAGE_FEATURES += "${@bb.utils.contains('DISTRO_FEATURES', 'agl-devel', 'ssh-server-dropbear' , '', d)}"
+
+inherit features_check
+
+REQUIRED_DISTRO_FEATURES = "wayland"
diff --git a/recipes-platform/images/agl-image-graphical-qt5-crosssdk.bb b/recipes-platform/images/agl-image-graphical-qt5-crosssdk.bb
new file mode 100755
index 00000000..5147ea44
--- /dev/null
+++ b/recipes-platform/images/agl-image-graphical-qt5-crosssdk.bb
@@ -0,0 +1,18 @@
+SUMMARY = "Cross SDK of Full AGL Distribution for IVI profile"
+
+DESCRIPTION = "SDK image for full AGL Distribution for IVI profile. \
+It includes the full meta-toolchain, plus developement headers and libraries \
+to form a standalone cross SDK."
+
+require agl-image-graphical-qt5.bb
+
+LICENSE = "MIT"
+
+require agl-image-graphical-qt5-crosssdk.inc
+
+inherit populate_sdk populate_sdk_qt5
+
+# Task do_populate_sdk and do_rootfs can't be exec simultaneously.
+# Both exec "createrepo" on the same directory, and so one of them
+# can failed (randomly).
+addtask do_populate_sdk after do_rootfs
diff --git a/recipes-platform/images/agl-image-graphical-qt5-crosssdk.inc b/recipes-platform/images/agl-image-graphical-qt5-crosssdk.inc
new file mode 100644
index 00000000..f43bb07d
--- /dev/null
+++ b/recipes-platform/images/agl-image-graphical-qt5-crosssdk.inc
@@ -0,0 +1,14 @@
+require recipes-platform/images/agl-image-minimal-crosssdk.inc
+
+TOOLCHAIN_TARGET_TASK += "libafb-helpers-qt-staticdev"
+
+# Add wayland-scanner to SDK (SPEC-945)
+# Use TOOLCHAIN_HOST_TASK instead of adding to the packagegroup
+# wayland-scanner is in nativesdk-wayland-dev !
+# option: add also nativesdk-qtwayland-tools
+TOOLCHAIN_HOST_TASK_append = " nativesdk-wayland nativesdk-wayland-dev"
+
+TOOLCHAIN_HOST_TASK_append = " nativesdk-perl-modules "
+
+# Add qtwaylandscanner to the SDK
+TOOLCHAIN_HOST_TASK_append = " nativesdk-qtwayland-tools "
diff --git a/recipes-platform/images/agl-image-graphical-qt5.bb b/recipes-platform/images/agl-image-graphical-qt5.bb
new file mode 100644
index 00000000..bcfd724f
--- /dev/null
+++ b/recipes-platform/images/agl-image-graphical-qt5.bb
@@ -0,0 +1,5 @@
+SUMMARY = "A very basic Wayland image with a terminal"
+
+require agl-image-graphical-qt5.inc
+
+LICENSE = "MIT"
diff --git a/recipes-platform/images/agl-image-graphical-qt5.inc b/recipes-platform/images/agl-image-graphical-qt5.inc
new file mode 100644
index 00000000..114d06a0
--- /dev/null
+++ b/recipes-platform/images/agl-image-graphical-qt5.inc
@@ -0,0 +1 @@
+require recipes-platform/images/agl-image-weston.inc
diff --git a/recipes-platform/images/agl-image-telematics.bb b/recipes-platform/images/agl-image-telematics.bb
new file mode 100644
index 00000000..ad6ef988
--- /dev/null
+++ b/recipes-platform/images/agl-image-telematics.bb
@@ -0,0 +1,9 @@
+SUMMARY = "A basic telematics image"
+
+require agl-image-telematics.inc
+
+LICENSE = "MIT"
+
+IMAGE_INSTALL_append = "\
+ profile-telematics \
+ "
diff --git a/recipes-platform/images/agl-image-telematics.inc b/recipes-platform/images/agl-image-telematics.inc
new file mode 100644
index 00000000..3e951550
--- /dev/null
+++ b/recipes-platform/images/agl-image-telematics.inc
@@ -0,0 +1,5 @@
+require recipes-platform/images/agl-image-boot.inc
+
+inherit features_check
+
+REQUIRED_DISTRO_FEATURES = "3g"
diff --git a/recipes-platform/images/agl-telematics-demo-platform-crosssdk.bb b/recipes-platform/images/agl-telematics-demo-platform-crosssdk.bb
new file mode 100644
index 00000000..75b4f5ce
--- /dev/null
+++ b/recipes-platform/images/agl-telematics-demo-platform-crosssdk.bb
@@ -0,0 +1,21 @@
+SUMMARY = "Cross SDK of AGL Distribution for telematics profile Demo"
+
+DESCRIPTION = "SDK image for AGL Distribution for Telematics profile Demo. \
+It includes the full meta-toolchain, plus developement headers and libraries \
+to form a standalone cross SDK."
+
+require agl-telematics-demo-platform.bb
+
+LICENSE = "MIT"
+
+IMAGE_FEATURES_append = " dev-pkgs"
+IMAGE_INSTALL_append = " kernel-dev kernel-devsrc"
+
+inherit populate_sdk
+
+# Task do_populate_sdk and do_rootfs can't be exec simultaneously.
+# Both exec "createrepo" on the same directory, and so one of them
+# can failed (randomly).
+addtask do_populate_sdk after do_rootfs
+
+TOOLCHAIN_HOST_TASK_append = " nativesdk-perl-modules "
diff --git a/recipes-platform/images/agl-telematics-demo-platform.bb b/recipes-platform/images/agl-telematics-demo-platform.bb
new file mode 100644
index 00000000..403f4b70
--- /dev/null
+++ b/recipes-platform/images/agl-telematics-demo-platform.bb
@@ -0,0 +1,13 @@
+DESCRIPTION = "AGL Telematics Demo Platform image."
+
+require agl-telematics-demo-platform.inc
+
+LICENSE = "MIT"
+
+IMAGE_FEATURES_append = " \
+ "
+
+IMAGE_INSTALL_append = " \
+ packagegroup-agl-telematics-demo-platform \
+ "
+
diff --git a/recipes-platform/images/agl-telematics-demo-platform.inc b/recipes-platform/images/agl-telematics-demo-platform.inc
new file mode 100644
index 00000000..bd3a89ee
--- /dev/null
+++ b/recipes-platform/images/agl-telematics-demo-platform.inc
@@ -0,0 +1,3 @@
+# Base image
+require recipes-platform/images/agl-image-telematics.inc
+
diff --git a/recipes-platform/packagegroups/nativesdk-packagegroup-sdk-host.bbappend b/recipes-platform/packagegroups/nativesdk-packagegroup-sdk-host.bbappend
new file mode 100644
index 00000000..f75f9ab1
--- /dev/null
+++ b/recipes-platform/packagegroups/nativesdk-packagegroup-sdk-host.bbappend
@@ -0,0 +1,6 @@
+RDEPENDS_${PN} =+ "nativesdk-af-main-tools nativesdk-af-binder-devtools"
+RDEPENDS_${PN} += "nativesdk-low-level-can-generator \
+ nativesdk-cmake-apps-module \
+ nativesdk-cmake-apps-module-doc \
+"
+
diff --git a/recipes-platform/packagegroups/packagegroup-agl-app-framework.bbappend b/recipes-platform/packagegroups/packagegroup-agl-app-framework.bbappend
new file mode 100644
index 00000000..d0fa1a2e
--- /dev/null
+++ b/recipes-platform/packagegroups/packagegroup-agl-app-framework.bbappend
@@ -0,0 +1 @@
+RDEPENDS_${PN}_append = " systemd-agl-sync run-agl-postinsts"
diff --git a/recipes-platform/packagegroups/packagegroup-agl-appfw-html5.bb b/recipes-platform/packagegroups/packagegroup-agl-appfw-html5.bb
new file mode 100644
index 00000000..cc9ed3d6
--- /dev/null
+++ b/recipes-platform/packagegroups/packagegroup-agl-appfw-html5.bb
@@ -0,0 +1,18 @@
+SUMMARY = "AGL web runtime packages"
+DESCRIPTION = "Specific packages for the AGL web runtime (minus profile-graphical)"
+
+LICENSE = "MIT"
+
+inherit packagegroup
+
+PACKAGES = "\
+ packagegroup-agl-appfw-html5 \
+ "
+
+ALLOW_EMPTY_${PN} = "1"
+
+# add packages for WAM
+RDEPENDS_${PN} += " \
+ chromium-browser-service \
+ wam \
+ "
diff --git a/recipes-platform/packagegroups/packagegroup-agl-appfw-native-qt5.bb b/recipes-platform/packagegroups/packagegroup-agl-appfw-native-qt5.bb
new file mode 100644
index 00000000..2161e1a8
--- /dev/null
+++ b/recipes-platform/packagegroups/packagegroup-agl-appfw-native-qt5.bb
@@ -0,0 +1,29 @@
+SUMMARY = "Qt5 for native GUI framework of AGL IVI profile"
+DESCRIPTION = "A set of Qt5 packages which required by Native App Fw Subsystem"
+
+LICENSE = "MIT"
+
+inherit packagegroup
+
+PACKAGES = "\
+ packagegroup-agl-appfw-native-qt5 \
+ "
+
+#ALLOW_EMPTY_${PN} = "1"
+
+RDEPENDS_${PN} += "\
+ qtbase \
+ qtbase-dev \
+ qtbase-plugins \
+ qtbase-staticdev \
+ qtbase-tools \
+ qtdeclarative \
+ qtdeclarative-qmlplugins \
+ qtdeclarative-tools \
+ qtcharts \
+ qtwayland \
+ qtwayland-plugins \
+ qtwayland-tools \
+ qtgraphicaleffects-qmlplugins \
+ qtvirtualkeyboard \
+ "
diff --git a/recipes-platform/packagegroups/packagegroup-agl-cluster-demo-platform.bb b/recipes-platform/packagegroups/packagegroup-agl-cluster-demo-platform.bb
new file mode 100644
index 00000000..2ca89e4e
--- /dev/null
+++ b/recipes-platform/packagegroups/packagegroup-agl-cluster-demo-platform.bb
@@ -0,0 +1,43 @@
+SUMMARY = "The software for demo platform of AGL cluster profile"
+DESCRIPTION = "A set of packages belong to AGL Cluster Demo Platform"
+
+LICENSE = "MIT"
+
+inherit packagegroup
+
+PACKAGES = "\
+ packagegroup-agl-cluster-demo-platform \
+ "
+
+ALLOW_EMPTY_${PN} = "1"
+
+RDEPENDS_${PN} += "\
+ packagegroup-agl-profile-cluster-qt5 \
+ packagegroup-agl-ttf-fonts \
+ packagegroup-agl-source-han-sans-ttf-fonts \
+ packagegroup-agl-networking \
+ "
+
+
+AGL_APPS = " \
+ cluster-dashboard \
+ cluster-receiver \
+ qt-cluster-receiver \
+ "
+
+AGL_APIS = " \
+ agl-service-can-low-level \
+ agl-service-gps \
+ agl-service-signal-composer \
+ "
+
+DEMO_PRELOAD = "${@bb.utils.contains("DISTRO_FEATURES", "agl-cluster-demo-preload", "cluster-dashboard-demo-config", "",d)}"
+
+RDEPENDS_${PN}_append = " \
+ hmi-debug \
+ can-utils \
+ linux-firmware-ralink \
+ ${AGL_APPS} \
+ ${AGL_APIS} \
+ ${DEMO_PRELOAD} \
+"
diff --git a/recipes-platform/packagegroups/packagegroup-agl-cluster-demo-qtcompositor.bb b/recipes-platform/packagegroups/packagegroup-agl-cluster-demo-qtcompositor.bb
new file mode 100644
index 00000000..70c7356a
--- /dev/null
+++ b/recipes-platform/packagegroups/packagegroup-agl-cluster-demo-qtcompositor.bb
@@ -0,0 +1,43 @@
+SUMMARY = "The software for AGL Cluster Demo Qtwayland Compositor"
+DESCRIPTION = "A set of packages belong to AGL Cluster Demo Qtwayland Compositor"
+
+LICENSE = "MIT"
+
+inherit packagegroup
+
+PACKAGES = "\
+ packagegroup-agl-cluster-demo-qtcompositor \
+ "
+
+ALLOW_EMPTY_${PN} = "1"
+
+RDEPENDS_${PN} += "\
+ packagegroup-agl-profile-cluster-qtcompositor \
+ packagegroup-agl-ttf-fonts \
+ packagegroup-agl-networking \
+ "
+
+AGL_SERVICE = " \
+ agl-service-bluetooth \
+ agl-service-can-low-level \
+ agl-service-data-persistence \
+ agl-service-gps \
+ agl-service-network \
+ agl-service-unicens \
+ agl-service-hvac \
+ agl-service-nfc \
+ agl-service-identity-agent \
+ "
+
+AGL_APPS = " \
+ cluster-gauges-qtcompositor \
+ "
+
+RDEPENDS_${PN}_append = " \
+ libva-utils \
+ linux-firmware-ralink \
+ can-utils \
+ most \
+ ${AGL_SERVICE} \
+ ${AGL_APPS} \
+"
diff --git a/recipes-platform/packagegroups/packagegroup-agl-core-devel.bbappend b/recipes-platform/packagegroups/packagegroup-agl-core-devel.bbappend
new file mode 100644
index 00000000..dfbddd93
--- /dev/null
+++ b/recipes-platform/packagegroups/packagegroup-agl-core-devel.bbappend
@@ -0,0 +1,10 @@
+RDEPENDS_${PN}_append = "\
+ pyagl \
+ gcov \
+ gcov-symlinks \
+ gcovr \
+ gcovr-wrapper \
+ jq \
+ htop \
+ tree \
+"
diff --git a/recipes-platform/packagegroups/packagegroup-agl-demo-qt-examples.bb b/recipes-platform/packagegroups/packagegroup-agl-demo-qt-examples.bb
new file mode 100644
index 00000000..adebabe7
--- /dev/null
+++ b/recipes-platform/packagegroups/packagegroup-agl-demo-qt-examples.bb
@@ -0,0 +1,26 @@
+SUMMARY = "The examples to test Qt5 on AGL Demo Platform"
+DESCRIPTION = "A set of packages which contains Qt5 examples"
+
+LICENSE = "MIT"
+
+inherit packagegroup
+
+PACKAGES = "\
+ packagegroup-agl-demo-qt-examples \
+ "
+
+ALLOW_EMPTY_${PN} = "1"
+
+RDEPENDS_${PN} += "\
+ qt3d-examples \
+ qtbase-examples \
+ qtconnectivity-examples \
+ qtdeclarative-examples \
+ qtlocation-examples \
+ qtmultimedia-examples \
+ qtsensors-examples \
+ qtsystems-examples \
+ qttools-examples \
+ qtwayland-examples \
+ qtxmlpatterns-examples \
+ "
diff --git a/recipes-platform/packagegroups/packagegroup-agl-graphical-services.bb b/recipes-platform/packagegroups/packagegroup-agl-graphical-services.bb
new file mode 100644
index 00000000..e587ab21
--- /dev/null
+++ b/recipes-platform/packagegroups/packagegroup-agl-graphical-services.bb
@@ -0,0 +1,15 @@
+DESCRIPTION = "The minimal set of packages for Connectivity Subsystem"
+LICENSE = "MIT"
+
+inherit packagegroup
+
+PACKAGES = "\
+ packagegroup-agl-graphical-services \
+ "
+
+ALLOW_EMPTY_${PN} = "1"
+
+RDEPENDS_${PN} = "\
+ ${@bb.utils.contains('DISTRO_FEATURES', 'pipewire', 'agl-service-mediaplayer', '', d)} \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'pipewire', 'agl-service-radio', '', d)} \
+ "
diff --git a/recipes-platform/packagegroups/packagegroup-agl-graphical-weston.bbappend b/recipes-platform/packagegroups/packagegroup-agl-graphical-weston.bbappend
new file mode 100644
index 00000000..aa401a71
--- /dev/null
+++ b/recipes-platform/packagegroups/packagegroup-agl-graphical-weston.bbappend
@@ -0,0 +1 @@
+require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'packagegroup-agl-graphical-weston_agldemo.inc', '', d)}
diff --git a/recipes-platform/packagegroups/packagegroup-agl-graphical-weston_agldemo.inc b/recipes-platform/packagegroups/packagegroup-agl-graphical-weston_agldemo.inc
new file mode 100644
index 00000000..d7d7be2a
--- /dev/null
+++ b/recipes-platform/packagegroups/packagegroup-agl-graphical-weston_agldemo.inc
@@ -0,0 +1,8 @@
+RDEPENDS_${PN} += " \
+ weston-ini-conf \
+ agl-compositor \
+ "
+# appfw
+RDEPENDS_${PN} += " \
+ agl-login-manager \
+ "
diff --git a/recipes-platform/packagegroups/packagegroup-agl-image-ivi.bb b/recipes-platform/packagegroups/packagegroup-agl-image-ivi.bb
index acaa405a..d04c72fa 100644
--- a/recipes-platform/packagegroups/packagegroup-agl-image-ivi.bb
+++ b/recipes-platform/packagegroups/packagegroup-agl-image-ivi.bb
@@ -19,9 +19,4 @@ RDEPENDS_${PN} += "\
packagegroup-agl-ivi-graphics \
packagegroup-agl-ivi-multimedia \
packagegroup-agl-ivi-navigation \
- packagegroup-agl-ivi-services \
- "
-
-RDEPENDS_${PN} += "\
- agl-login-manager \
"
diff --git a/recipes-core/packagegroups/packagegroup-agl-image-ivi.bbappend b/recipes-platform/packagegroups/packagegroup-agl-image-ivi.bbappend
index e1b68abc..8856d974 100644
--- a/recipes-core/packagegroups/packagegroup-agl-image-ivi.bbappend
+++ b/recipes-platform/packagegroups/packagegroup-agl-image-ivi.bbappend
@@ -1,3 +1,4 @@
RDEPENDS_${PN} += " \
packagegroup-agl-ivi-identity \
+ packagegroup-agl-ivi-services \
"
diff --git a/recipes-core/packagegroups/packagegroup-agl-ivi-connectivity.bbappend b/recipes-platform/packagegroups/packagegroup-agl-ivi-connectivity.bbappend
index 6e19d78c..6e19d78c 100644
--- a/recipes-core/packagegroups/packagegroup-agl-ivi-connectivity.bbappend
+++ b/recipes-platform/packagegroups/packagegroup-agl-ivi-connectivity.bbappend
diff --git a/recipes-core/packagegroups/packagegroup-agl-ivi-identity.bb b/recipes-platform/packagegroups/packagegroup-agl-ivi-identity.bb
index fa157c8f..fa157c8f 100644
--- a/recipes-core/packagegroups/packagegroup-agl-ivi-identity.bb
+++ b/recipes-platform/packagegroups/packagegroup-agl-ivi-identity.bb
diff --git a/recipes-platform/packagegroups/packagegroup-agl-ivi-navigation.bb b/recipes-platform/packagegroups/packagegroup-agl-ivi-navigation.bb
index 90daf923..6fa6c920 100644
--- a/recipes-platform/packagegroups/packagegroup-agl-ivi-navigation.bb
+++ b/recipes-platform/packagegroups/packagegroup-agl-ivi-navigation.bb
@@ -12,6 +12,6 @@ PACKAGES = "\
RDEPENDS_${PN} += "\
gpsd \
- virtual/gpsd-conf \
geoclue \
+ ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'virtual/gpsd-conf', '', d)} \
"
diff --git a/recipes-platform/packagegroups/packagegroup-agl-ivi-services.bb b/recipes-platform/packagegroups/packagegroup-agl-ivi-services.bb
index 489916b5..2b09fa41 100644
--- a/recipes-platform/packagegroups/packagegroup-agl-ivi-services.bb
+++ b/recipes-platform/packagegroups/packagegroup-agl-ivi-services.bb
@@ -27,4 +27,7 @@ RDEPENDS_${PN} += "\
agl-service-unicens-controller \
agl-service-weather \
${@bb.utils.contains('AGL_CLOUDPROXY_WANTED','1', 'agl-service-cloudproxy libcloudproxy', '', d)} \
+ agl-service-data-persistence \
+ agl-service-network \
+ agl-service-platform-info \
"
diff --git a/recipes-platform/packagegroups/packagegroup-agl-networking.bb b/recipes-platform/packagegroups/packagegroup-agl-networking.bb
new file mode 100644
index 00000000..3e89303b
--- /dev/null
+++ b/recipes-platform/packagegroups/packagegroup-agl-networking.bb
@@ -0,0 +1,23 @@
+SUMMARY = "The networking for AGL"
+DESCRIPTION = "A set of packages for AGL cluster's networking"
+
+LICENSE = "MIT"
+
+inherit packagegroup
+
+PACKAGES = "\
+ packagegroup-agl-networking \
+ "
+
+ALLOW_EMPTY_${PN} = "1"
+
+
+# fonts
+RDEPENDS_${PN}_append = " \
+ connman \
+ connman-client \
+ connman-tools \
+ cluster-connman-conf \
+ iproute2 \
+ dhcp-client \
+"
diff --git a/recipes-platform/packagegroups/packagegroup-agl-profile-cluster-qt5.bb b/recipes-platform/packagegroups/packagegroup-agl-profile-cluster-qt5.bb
new file mode 100644
index 00000000..5436a561
--- /dev/null
+++ b/recipes-platform/packagegroups/packagegroup-agl-profile-cluster-qt5.bb
@@ -0,0 +1,21 @@
+SUMMARY = "The middleware for AGL Qt5 based cluster profile"
+DESCRIPTION = "The set of packages required for AGL Qt5 based Cluster Distribution"
+LICENSE = "MIT"
+
+inherit packagegroup
+
+PACKAGES = "\
+ packagegroup-agl-profile-cluster-qt5 \
+ profile-cluster-qt5 \
+ "
+
+ALLOW_EMPTY_${PN} = "1"
+
+RDEPENDS_${PN} += "\
+ packagegroup-agl-image-boot \
+ packagegroup-agl-core-security \
+ packagegroup-agl-graphical-weston \
+ packagegroup-agl-appfw-native-qt5 \
+"
+
+RDEPENDS_profile-cluster-qt5 = "${PN}"
diff --git a/recipes-platform/packagegroups/packagegroup-agl-profile-cluster-qtcompositor.bb b/recipes-platform/packagegroups/packagegroup-agl-profile-cluster-qtcompositor.bb
new file mode 100644
index 00000000..9d54b33a
--- /dev/null
+++ b/recipes-platform/packagegroups/packagegroup-agl-profile-cluster-qtcompositor.bb
@@ -0,0 +1,36 @@
+SUMMARY = "The middleware for AGL Qt5 based cluster qtcompositor"
+DESCRIPTION = "The set of packages required for AGL Qt5 based Cluster Demo Qtcompositor Distribution"
+LICENSE = "MIT"
+
+inherit packagegroup
+
+PACKAGES = "\
+ packagegroup-agl-profile-cluster-qtcompositor \
+ profile-cluster-qt5 \
+ "
+
+ALLOW_EMPTY_${PN} = "1"
+
+RDEPENDS_${PN} += "\
+ packagegroup-agl-image-boot \
+ packagegroup-agl-core-security \
+ packagegroup-agl-core-connectivity \
+"
+
+QT_LITE = " \
+ qtbase \
+ qtdeclarative \
+ qtwayland \
+ qtgraphicaleffects-qmlplugins \
+ qtsvg-plugins \
+ qtwebsockets \
+ qtwebsockets-qmlplugins \
+ qtcompositor-conf \
+"
+
+RDEPENDS_${PN}_append = " \
+ ${QT_LITE} \
+ agl-login-manager \
+"
+
+RDEPENDS_profile-cluster-qt5 = "${PN}"
diff --git a/recipes-platform/packagegroups/packagegroup-agl-profile-cluster.bb b/recipes-platform/packagegroups/packagegroup-agl-profile-cluster.bb
new file mode 100644
index 00000000..c0c61246
--- /dev/null
+++ b/recipes-platform/packagegroups/packagegroup-agl-profile-cluster.bb
@@ -0,0 +1,20 @@
+SUMMARY = "The middleware for AGL cluster profile"
+DESCRIPTION = "The set of packages required for AGL Cluster Distribution"
+LICENSE = "MIT"
+
+inherit packagegroup
+
+PACKAGES = "\
+ packagegroup-agl-profile-cluster \
+ profile-cluster \
+ "
+
+ALLOW_EMPTY_${PN} = "1"
+
+RDEPENDS_${PN} += "\
+ packagegroup-agl-image-boot \
+ packagegroup-agl-core-security \
+ packagegroup-agl-graphical-weston \
+"
+
+RDEPENDS_profile-cluster = "${PN}"
diff --git a/recipes-platform/packagegroups/packagegroup-agl-profile-graphical-html5.bb b/recipes-platform/packagegroups/packagegroup-agl-profile-graphical-html5.bb
new file mode 100644
index 00000000..20275014
--- /dev/null
+++ b/recipes-platform/packagegroups/packagegroup-agl-profile-graphical-html5.bb
@@ -0,0 +1,23 @@
+SUMMARY = "AGL web runtime profile"
+DESCRIPTION = "The full set of packages required for AGL web runtime"
+LICENSE = "MIT"
+
+inherit packagegroup
+
+PACKAGES = "\
+ packagegroup-agl-profile-graphical-html5 \
+ profile-graphical-html5 \
+ "
+
+ALLOW_EMPTY_${PN} = "1"
+
+RDEPENDS_${PN} += "\
+ packagegroup-agl-profile-graphical \
+ packagegroup-agl-appfw-html5 \
+"
+
+RDEPENDS_${PN} += "\
+ agl-login-manager \
+ "
+
+RDEPENDS_profile-graphical-html5 = "${PN}"
diff --git a/recipes-platform/packagegroups/packagegroup-agl-profile-graphical-qt5.bb b/recipes-platform/packagegroups/packagegroup-agl-profile-graphical-qt5.bb
new file mode 100644
index 00000000..74b35f70
--- /dev/null
+++ b/recipes-platform/packagegroups/packagegroup-agl-profile-graphical-qt5.bb
@@ -0,0 +1,23 @@
+SUMMARY = "The middlewares for AGL IVI profile"
+DESCRIPTION = "The set of packages required for AGL Distribution"
+LICENSE = "MIT"
+
+inherit packagegroup
+
+PACKAGES = "\
+ packagegroup-agl-profile-graphical-qt5 \
+ profile-graphical-qt5 \
+ "
+
+ALLOW_EMPTY_${PN} = "1"
+
+RDEPENDS_${PN} += "\
+ packagegroup-agl-profile-graphical \
+ packagegroup-agl-appfw-native-qt5 \
+"
+
+RDEPENDS_${PN} += "\
+ agl-login-manager \
+ "
+
+RDEPENDS_profile-graphical-qt5 = "${PN}"
diff --git a/recipes-platform/packagegroups/packagegroup-agl-profile-graphical.bbappend b/recipes-platform/packagegroups/packagegroup-agl-profile-graphical.bbappend
new file mode 100644
index 00000000..1c980d93
--- /dev/null
+++ b/recipes-platform/packagegroups/packagegroup-agl-profile-graphical.bbappend
@@ -0,0 +1,3 @@
+RDEPENDS_${PN} += "\
+ packagegroup-agl-graphical-services \
+"
diff --git a/recipes-platform/packagegroups/packagegroup-agl-profile-telematics.bb b/recipes-platform/packagegroups/packagegroup-agl-profile-telematics.bb
new file mode 100644
index 00000000..66fc0f76
--- /dev/null
+++ b/recipes-platform/packagegroups/packagegroup-agl-profile-telematics.bb
@@ -0,0 +1,25 @@
+SUMMARY = "The middleware for AGL telematics profile"
+DESCRIPTION = "The set of packages required for AGL Telematics Distribution"
+LICENSE = "MIT"
+
+inherit packagegroup
+
+PACKAGES = "\
+ packagegroup-agl-profile-telematics \
+ profile-telematics \
+ "
+
+ALLOW_EMPTY_${PN} = "1"
+
+RDEPENDS_${PN} += "\
+ packagegroup-agl-image-boot \
+ packagegroup-agl-core-security \
+ ${@bb.utils.contains('VIRTUAL-RUNTIME_net_manager','connman','connman connman-client','',d)} \
+ ${@bb.utils.contains("DISTRO_FEATURES", "3g", "libqmi", "", d)} \
+ agl-login-manager \
+ agl-service-can-low-level \
+ agl-service-network \
+ can-utils \
+"
+
+RDEPENDS_profile-telematics = "${PN}"
diff --git a/recipes-platform/packagegroups/packagegroup-agl-source-han-sans-ttf-fonts.bb b/recipes-platform/packagegroups/packagegroup-agl-source-han-sans-ttf-fonts.bb
new file mode 100644
index 00000000..fb332899
--- /dev/null
+++ b/recipes-platform/packagegroups/packagegroup-agl-source-han-sans-ttf-fonts.bb
@@ -0,0 +1,20 @@
+SUMMARY = "The Source Han Sans ttf fonts for AGL"
+DESCRIPTION = "A set of packages for source Han Sans ttf fonts"
+
+LICENSE = "MIT"
+
+inherit packagegroup
+
+PACKAGES = "\
+ packagegroup-agl-source-han-sans-ttf-fonts \
+ "
+
+ALLOW_EMPTY_${PN} = "1"
+
+
+# fonts
+RDEPENDS_${PN}_append = " \
+ source-han-sans-cn-fonts \
+ source-han-sans-jp-fonts \
+ source-han-sans-tw-fonts \
+"
diff --git a/recipes-platform/packagegroups/packagegroup-agl-telematics-demo-platform.bb b/recipes-platform/packagegroups/packagegroup-agl-telematics-demo-platform.bb
new file mode 100644
index 00000000..0dbbd629
--- /dev/null
+++ b/recipes-platform/packagegroups/packagegroup-agl-telematics-demo-platform.bb
@@ -0,0 +1,35 @@
+SUMMARY = "The software for AGL telematics profile demo platform"
+DESCRIPTION = "A set of packages belonging to the AGL telematics demo platform"
+
+LICENSE = "MIT"
+
+inherit packagegroup
+
+PACKAGES = "\
+ packagegroup-agl-telematics-demo-platform \
+ "
+
+ALLOW_EMPTY_${PN} = "1"
+
+RDEPENDS_${PN} += "\
+ packagegroup-agl-profile-telematics \
+ "
+
+AGL_APPS = " \
+ telematics-recorder \
+ "
+
+AGL_APIS = " \
+ agl-service-gps \
+ "
+
+RDEPENDS_${PN}_append = " \
+ gpsd \
+ sw-gpsd-udev-conf \
+ usb-can-udev-conf \
+ simple-can-simulator \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'agl-devel', 'ofono-tests gps-utils' , '', d)} \
+ ${AGL_APPS} \
+ ${AGL_APIS} \
+"
+# packagegroup-agl-core-navigation? (brings in geoclue...)
diff --git a/recipes-platform/packagegroups/packagegroup-agl-ttf-fonts.bb b/recipes-platform/packagegroups/packagegroup-agl-ttf-fonts.bb
new file mode 100644
index 00000000..9a3b578c
--- /dev/null
+++ b/recipes-platform/packagegroups/packagegroup-agl-ttf-fonts.bb
@@ -0,0 +1,21 @@
+SUMMARY = "The ttf fonts for AGL"
+DESCRIPTION = "A set of packages for fonts"
+
+LICENSE = "MIT"
+
+inherit packagegroup
+
+PACKAGES = "\
+ packagegroup-agl-ttf-fonts \
+ "
+
+ALLOW_EMPTY_${PN} = "1"
+
+
+# fonts
+RDEPENDS_${PN}_append = " \
+ ttf-bitstream-vera \
+ ttf-dejavu-sans \
+ ttf-dejavu-sans-mono \
+ ttf-dejavu-serif \
+"
diff --git a/recipes-platform/packagegroups/packagegroup-qt5-toolchain-target.bbappend b/recipes-platform/packagegroups/packagegroup-qt5-toolchain-target.bbappend
new file mode 100644
index 00000000..08afa6c7
--- /dev/null
+++ b/recipes-platform/packagegroups/packagegroup-qt5-toolchain-target.bbappend
@@ -0,0 +1,18 @@
+# add missing dependencies for SDK
+
+RDEPENDS_${PN} += " \
+ qttools-plugins \
+ qtquickcontrols-dev \
+ qtquickcontrols-qmlplugins \
+ qtquickcontrols2-dev \
+ qtquickcontrols2-mkspecs \
+ qtquickcontrols2-qmlplugins \
+"
+
+# remove dependency on qtwebkit (still added to SDK by packagegroup-qt5-toolchain-target)
+# see SPEC-1159
+RDEPENDS_${PN}_remove = " \
+ qtwebkit-dev \
+ qtwebkit-mkspecs \
+ qtwebkit-qmlplugins \
+"
diff --git a/recipes-qt/qt-cluster/qtcompositor-conf_1.0.bb b/recipes-qt/qt-cluster/qtcompositor-conf_1.0.bb
new file mode 100644
index 00000000..49111b6e
--- /dev/null
+++ b/recipes-qt/qt-cluster/qtcompositor-conf_1.0.bb
@@ -0,0 +1,40 @@
+SUMMARY = "Configuration files for running wayland with a non-weston compositor"
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420"
+
+inherit allarch agl-graphical
+
+do_configure[noexec] = "1"
+do_compile[noexec] = "1"
+
+do_install() {
+ # Add a rule to ensure the 'display' user has permissions to
+ # open the graphics device
+ install -d ${D}${sysconfdir}/udev/rules.d
+ cat >${D}${sysconfdir}/udev/rules.d/zz-dri.rules <<'EOF'
+SUBSYSTEM=="drm", MODE="0660", GROUP="${WESTONGROUP}", SECLABEL{smack}="*"
+EOF
+
+ # user 'display' must also be able to access /dev/input/*
+ cat >${D}${sysconfdir}/udev/rules.d/zz-input.rules <<'EOF'
+SUBSYSTEM=="input", MODE="0660", GROUP="input", SECLABEL{smack}="^"
+EOF
+
+ # user 'display' must also be able to access /dev/media*, etc.
+ cat >${D}${sysconfdir}/udev/rules.d/zz-remote-display.rules <<'EOF'
+SUBSYSTEM=="media", MODE="0660", GROUP="display", SECLABEL{smack}="*"
+SUBSYSTEM=="video4linux", MODE="0660", GROUP="display", SECLABEL{smack}="*"
+KERNEL=="uvcs", SUBSYSTEM=="misc", MODE="0660", GROUP="display", SECLABEL{smack}="*"
+KERNEL=="rgnmm", SUBSYSTEM=="misc", MODE="0660", GROUP="display", SECLABEL{smack}="*"
+EOF
+}
+
+do_install_append_imx() {
+ install -d ${D}${sysconfdir}/udev/rules.d
+ cat >>${D}${sysconfdir}/udev/rules.d/zz-dri.rules <<'EOF'
+SUBSYSTEM=="gpu_class", MODE="0660", GROUP="${WESTONGROUP}", SECLABEL{smack}="*"
+EOF
+
+}
+
+RCONFLICTS_${PN} = "weston-init"
diff --git a/recipes-qt/qt/qtbase-native_git.bbappendTOCHECK b/recipes-qt/qt/qtbase-native_git.bbappendTOCHECK
new file mode 100644
index 00000000..b7cfe8dc
--- /dev/null
+++ b/recipes-qt/qt/qtbase-native_git.bbappendTOCHECK
@@ -0,0 +1,3 @@
+# Backport this fix from meta-qt5:
+# https://github.com/meta-qt5/meta-qt5/commit/bf7cdd963008f2d61bc4c324fff2bfafe511fb5f
+SRC_URI_remove = "file://0012-qdbuscpp2xml.pro-do-not-build-with-bootstrapped-depe.patch"
diff --git a/recipes-qt/qt/qtbase/0001-Force-qdbus-to-make-introspect-for-every-findMetaObj.patch b/recipes-qt/qt/qtbase/0001-Force-qdbus-to-make-introspect-for-every-findMetaObj.patch
new file mode 100644
index 00000000..10a1ddd8
--- /dev/null
+++ b/recipes-qt/qt/qtbase/0001-Force-qdbus-to-make-introspect-for-every-findMetaObj.patch
@@ -0,0 +1,30 @@
+From a4943bb5c7fdf5eb297223d2c3bb02d2271bea48 Mon Sep 17 00:00:00 2001
+From: Risto Avila <risto.avila@theqtcompany.com>
+Date: Thu, 17 Dec 2015 04:22:53 +0200
+Subject: [PATCH] Force qdbus to make introspect for every findMetaObject
+
+---
+ src/dbus/qdbusintegrator.cpp | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp
+index cce8b9c..ae2a9dc 100644
+--- a/src/dbus/qdbusintegrator.cpp
++++ b/src/dbus/qdbusintegrator.cpp
+@@ -2512,8 +2512,11 @@ QDBusConnectionPrivate::findMetaObject(const QString &service, const QString &pa
+ if (!interface.isEmpty()) {
+ QDBusReadLocker locker(FindMetaObject1Action, this);
+ QDBusMetaObject *mo = cachedMetaObjects.value(interface, 0);
+- if (mo)
+- return mo;
++ if (mo) {
++ // service is not unique. Remove cached object to force introspect
++ cachedMetaObjects.remove(interface);
++ delete mo;
++ }
+ }
+
+ // introspect the target object
+--
+1.9.1
+
diff --git a/recipes-qt/qt/qtbase_%.bbappend b/recipes-qt/qt/qtbase_%.bbappend
new file mode 100644
index 00000000..ff8fe687
--- /dev/null
+++ b/recipes-qt/qt/qtbase_%.bbappend
@@ -0,0 +1 @@
+require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'qtbase_agldemo.inc', '', d)}
diff --git a/recipes-qt/qt/qtbase_agldemo.inc b/recipes-qt/qt/qtbase_agldemo.inc
new file mode 100644
index 00000000..357e1e8b
--- /dev/null
+++ b/recipes-qt/qt/qtbase_agldemo.inc
@@ -0,0 +1,16 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/qtbase:"
+
+PACKAGECONFIG_WAYLAND = "${@bb.utils.contains('DISTRO_FEATURES', 'wayland', 'wayland', '', d)}"
+
+PACKAGECONFIG_GL = "${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'gles2', '', d)}"
+# FIXME CLUSTER
+#PACKAGECONFIG_GL_append = "${@bb.utils.contains('DISTRO_FEATURES', 'opengl', ' eglfs kms gbm', '', d)}"
+#
+PACKAGECONFIG_append = " ${PACKAGECONFIG_WAYLAND} icu accessibility"
+PACKAGECONFIG_append = " fontconfig"
+PACKAGECONFIG_append = " sql-sqlite"
+
+EXTRA_OECONF_append = ""
+
+# '-qpa wayland-egl' set wayland-egl as default of platform plagins
+PACKAGECONFIG[wayland]="-qpa wayland-egl -no-qpa-platform-guard"
diff --git a/recipes-qt/qt/qtlocation/0001-mapbox-update-API-url-to-match-new-schema.patch b/recipes-qt/qt/qtlocation/0001-mapbox-update-API-url-to-match-new-schema.patch
new file mode 100644
index 00000000..ba8a991e
--- /dev/null
+++ b/recipes-qt/qt/qtlocation/0001-mapbox-update-API-url-to-match-new-schema.patch
@@ -0,0 +1,47 @@
+From 58197439eade86e7efc6fe98116c0092ea429d29 Mon Sep 17 00:00:00 2001
+From: Matt Ranostay <matt.ranostay@konsulko.com>
+Date: Tue, 10 Mar 2020 13:59:58 -0700
+Subject: [PATCH] mapbox: update API url to match new schema
+
+---
+ src/plugins/geoservices/mapbox/qgeotilefetchermapbox.cpp | 7 ++++---
+ src/plugins/geoservices/mapbox/qmapboxcommon.h | 2 +-
+ 2 files changed, 5 insertions(+), 4 deletions(-)
+
+diff --git a/src/plugins/geoservices/mapbox/qgeotilefetchermapbox.cpp b/src/plugins/geoservices/mapbox/qgeotilefetchermapbox.cpp
+index 0b128556..bd2be6b6 100644
+--- a/src/plugins/geoservices/mapbox/qgeotilefetchermapbox.cpp
++++ b/src/plugins/geoservices/mapbox/qgeotilefetchermapbox.cpp
+@@ -88,12 +88,13 @@ QGeoTiledMapReply *QGeoTileFetcherMapbox::getTileImage(const QGeoTileSpec &spec)
+ request.setRawHeader("User-Agent", m_userAgent);
+
+ request.setUrl(QUrl(mapboxTilesApiPath +
+- ((spec.mapId() >= m_mapIds.size()) ? QStringLiteral("mapbox.streets") : m_mapIds[spec.mapId() - 1]) + QLatin1Char('/') +
++ m_mapIds[m_mapIds.size() - 1] +
++ QStringLiteral("/tiles/256/") +
+ QString::number(spec.zoom()) + QLatin1Char('/') +
+ QString::number(spec.x()) + QLatin1Char('/') +
+ QString::number(spec.y()) +
+- ((m_scaleFactor > 1) ? (QLatin1Char('@') + QString::number(m_scaleFactor) + QLatin1String("x.")) : QLatin1String(".")) +
+- m_format + QLatin1Char('?') +
++ ((m_scaleFactor > 1) ? (QLatin1Char('@') + QString::number(m_scaleFactor) + QLatin1String("x")) : QLatin1String("")) +
++ QLatin1Char('?') +
+ QStringLiteral("access_token=") + m_accessToken));
+
+ QNetworkReply *reply = m_networkManager->get(request);
+diff --git a/src/plugins/geoservices/mapbox/qmapboxcommon.h b/src/plugins/geoservices/mapbox/qmapboxcommon.h
+index e60c4e83..4b2ea98d 100644
+--- a/src/plugins/geoservices/mapbox/qmapboxcommon.h
++++ b/src/plugins/geoservices/mapbox/qmapboxcommon.h
+@@ -46,7 +46,7 @@
+
+ QT_BEGIN_NAMESPACE
+
+-static const QString mapboxTilesApiPath = QStringLiteral("http://api.tiles.mapbox.com/v4/");
++static const QString mapboxTilesApiPath = QStringLiteral("https://api.mapbox.com/");
+
+ // https://www.mapbox.com/api-documentation/#geocoding
+ static const QString mapboxGeocodingApiPath = QStringLiteral("https://api.mapbox.com/geocoding/v5/mapbox.places/");
+--
+2.25.0
+
diff --git a/recipes-qt/qt/qtlocation_%.bbappend b/recipes-qt/qt/qtlocation_%.bbappend
new file mode 100644
index 00000000..b12c4281
--- /dev/null
+++ b/recipes-qt/qt/qtlocation_%.bbappend
@@ -0,0 +1 @@
+require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'qtlocation_agldemo.inc', '', d)}
diff --git a/recipes-qt/qt/qtlocation_agldemo.inc b/recipes-qt/qt/qtlocation_agldemo.inc
new file mode 100644
index 00000000..7d112d03
--- /dev/null
+++ b/recipes-qt/qt/qtlocation_agldemo.inc
@@ -0,0 +1,14 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/qtlocation:"
+
+SRC_URI += "\
+ file://0001-mapbox-update-API-url-to-match-new-schema.patch \
+ "
+
+# Need to explicitly enable the various plugins
+PACKAGECONFIG += " \
+ geoservices_osm \
+ geoservices_here \
+ geoservices_itemsoverlay \
+ geoservices_mapbox \
+ geoservices_mapboxgl \
+"
diff --git a/recipes-qt/qt/qtmultimedia/0001-metadata-image-support-with-the-data-URL-scheme-for-.patch b/recipes-qt/qt/qtmultimedia/0001-metadata-image-support-with-the-data-URL-scheme-for-.patch
new file mode 100644
index 00000000..007e4676
--- /dev/null
+++ b/recipes-qt/qt/qtmultimedia/0001-metadata-image-support-with-the-data-URL-scheme-for-.patch
@@ -0,0 +1,80 @@
+From ed61f1d932c5c6d38458fcd2e1d5d154383f017e Mon Sep 17 00:00:00 2001
+From: Tasuku Suzuki <tasuku.suzuki@qt.io>
+Date: Mon, 12 Dec 2016 16:32:47 +0900
+Subject: [PATCH] metadata image support with the "data" URL scheme for QtQuick
+
+add posterImage, coverArtImage and thumbnailImage to metadata
+
+Change-Id: I10b9bae10c219ffa41506d6e6b345020790217a6
+---
+ .../multimedia/qdeclarativemediametadata_p.h | 33 ++++++++++++++++++++++
+ 1 file changed, 33 insertions(+)
+
+diff --git a/src/imports/multimedia/qdeclarativemediametadata_p.h b/src/imports/multimedia/qdeclarativemediametadata_p.h
+index ede7f87..6a6a815 100644
+--- a/src/imports/multimedia/qdeclarativemediametadata_p.h
++++ b/src/imports/multimedia/qdeclarativemediametadata_p.h
+@@ -51,6 +51,9 @@
+ // We mean it.
+ //
+
++#include <QtCore/QBuffer>
++#include <QtGui/QImage>
++#include <QtGui/QImageWriter>
+ #include <QtQml/qqml.h>
+ #include <QtMultimedia/qmediametadata.h>
+ #include <QtMultimedia/qmediaservice.h>
+@@ -153,6 +156,9 @@ class QDeclarativeMediaMetaData : public QObject
+ Q_PROPERTY(QVariant gpsProcessingMethod READ gpsProcessingMethod WRITE setGPSProcessingMethod NOTIFY metaDataChanged)
+ Q_PROPERTY(QVariant gpsAreaInformation READ gpsAreaInformation WRITE setGPSAreaInformation NOTIFY metaDataChanged)
+
++ Q_PROPERTY(QVariant posterImage READ posterImage NOTIFY metaDataChanged)
++ Q_PROPERTY(QVariant coverArtImage READ coverArtImage NOTIFY metaDataChanged)
++ Q_PROPERTY(QVariant thumbnailImage READ thumbnailImage NOTIFY metaDataChanged)
+ public:
+ QDeclarativeMediaMetaData(QMediaObject *player, QObject *parent = 0)
+ : QObject(parent)
+@@ -425,6 +431,16 @@ QT_WARNING_POP
+ void setGPSAreaInformation(const QVariant &information) {
+ setMetaData(QMediaMetaData::GPSAreaInformation, information); }
+
++ QVariant posterImage() const {
++ return convertImageToUrl(m_mediaObject->metaData(QMediaMetaData::PosterImage));
++ }
++ QVariant coverArtImage() const {
++ return convertImageToUrl(m_mediaObject->metaData(QMediaMetaData::CoverArtImage));
++ }
++ QVariant thumbnailImage() const {
++ return convertImageToUrl(m_mediaObject->metaData(QMediaMetaData::ThumbnailImage));
++ }
++
+ Q_SIGNALS:
+ void metaDataChanged();
+
+@@ -440,6 +456,23 @@ private:
+ m_writerControl->setMetaData(key, value);
+ }
+
++ QUrl convertImageToUrl(const QVariant &variant) const
++ {
++ if (variant.type() != QVariant::Image)
++ return QUrl();
++
++ QImage image = variant.value<QImage>();
++ QByteArray data;
++ QBuffer buffer(&data);
++ buffer.open(QBuffer::WriteOnly);
++ QImageWriter png(&buffer, "png");
++ if (!png.write(image)) {
++ return QUrl();
++ }
++ buffer.close();
++ return QUrl(QStringLiteral("data:image/png;base64,") + data.toBase64());
++ }
++
+ QMediaObject *m_mediaObject;
+ QMetaDataWriterControl *m_writerControl;
+ bool m_requestedWriterControl;
+--
+2.7.4
+
diff --git a/recipes-qt/qt/qtmultimedia_%.bbappend b/recipes-qt/qt/qtmultimedia_%.bbappend
new file mode 100644
index 00000000..dacca3bd
--- /dev/null
+++ b/recipes-qt/qt/qtmultimedia_%.bbappend
@@ -0,0 +1 @@
+require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'qtmultimedia_agldemo.inc', '', d)}
diff --git a/recipes-qt/qt/qtmultimedia_agldemo.inc b/recipes-qt/qt/qtmultimedia_agldemo.inc
new file mode 100644
index 00000000..a8ef5afa
--- /dev/null
+++ b/recipes-qt/qt/qtmultimedia_agldemo.inc
@@ -0,0 +1,7 @@
+FILESEXTRAPATHS_append := ":${THISDIR}/qtmultimedia"
+
+PACKAGECONFIG_append = " gstreamer"
+
+SRC_URI_append = " \
+ file://0001-metadata-image-support-with-the-data-URL-scheme-for-.patch \
+ "
diff --git a/recipes-qt/qt/qtsystems_%.bbappend b/recipes-qt/qt/qtsystems_%.bbappend
new file mode 100644
index 00000000..4fe0f28c
--- /dev/null
+++ b/recipes-qt/qt/qtsystems_%.bbappend
@@ -0,0 +1 @@
+require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'qtsystems_agldemo.inc', '', d)}
diff --git a/recipes-qt/qt/qtsystems_agldemo.inc b/recipes-qt/qt/qtsystems_agldemo.inc
new file mode 100644
index 00000000..550c58d0
--- /dev/null
+++ b/recipes-qt/qt/qtsystems_agldemo.inc
@@ -0,0 +1,3 @@
+DEPENDS_remove = "bluez4"
+# currently Qt5 does not support bluez5 "Nothing PROVIDES 'gconfbluez5'"
+#DEPENDS_append = "bluez5"
diff --git a/recipes-qt/qt/qtwayland-config/qtwayland b/recipes-qt/qt/qtwayland-config/qtwayland
new file mode 100644
index 00000000..a371c6c4
--- /dev/null
+++ b/recipes-qt/qt/qtwayland-config/qtwayland
@@ -0,0 +1,12 @@
+QT_WAYLAND_SHELL_INTEGRATION=@QT_WAYLAND_DEFAULT_SHELL@
+# The following might be necessary when multiple/split surfaces are created.
+# Without this, QtWayland will sometimes maintain the same/old size even if the
+# split surface is destroyed.
+# We keep it disabled by default as it causes an additional repaint of the
+# surface until the compositor sends a configure event to scale the window to
+# the actual area. Typical windows will, by default, have an initial size set
+# by qtwayland when starting-up (without an explicit size specified by the
+# application).
+# Note that QtWayland will only test the presence of the environment variable
+# so it will be enabled even if set to 0
+# QT_WAYLAND_RESIZE_AFTER_SWAP=1
diff --git a/recipes-qt/qt/qtwayland-config_1.0.0.bb b/recipes-qt/qt/qtwayland-config_1.0.0.bb
new file mode 100644
index 00000000..ae7c956d
--- /dev/null
+++ b/recipes-qt/qt/qtwayland-config_1.0.0.bb
@@ -0,0 +1,21 @@
+SUMMARY = "QtWayland config file."
+DESCRIPTION = "Config file for qtwayland."
+SECTION = "apps"
+LICENSE = "MIT"
+
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
+
+SRC_URI = "file://qtwayland"
+
+inherit allarch
+
+QTWAYLAND_DEFAULT_SHELL ?= "xdg-shell"
+
+do_compile[noexec] = "1"
+
+do_install () {
+ install -D -m 644 ${WORKDIR}/qtwayland ${D}${sysconfdir}/afm/unit.env.d/qtwayland
+ sed -i -e 's/@QT_WAYLAND_DEFAULT_SHELL@/${QTWAYLAND_DEFAULT_SHELL}/' ${D}${sysconfdir}/afm/unit.env.d/qtwayland
+}
+
+RPROVIDES_${PN} += "virtual/qtwayland-config"
diff --git a/recipes-qt/qt/qtwayland/0001-protocol-update-3rd-party-ivi-application-protocol.patch b/recipes-qt/qt/qtwayland/0001-protocol-update-3rd-party-ivi-application-protocol.patch
new file mode 100644
index 00000000..c91e1170
--- /dev/null
+++ b/recipes-qt/qt/qtwayland/0001-protocol-update-3rd-party-ivi-application-protocol.patch
@@ -0,0 +1,56 @@
+From 8caaf802a8b42e9bb1d74fc335a571882c75d73e Mon Sep 17 00:00:00 2001
+From: Holger Behrens <holger.behrens@windriver.com>
+Date: Tue, 3 Feb 2015 09:52:52 +0100
+Subject: [meta-ivi-demo][PATCH 1/2] protocol: update 3rd party ivi-application
+ protocol
+
+Signed-off-by: Holger Behrens <holger.behrens@windriver.com>
+---
+ src/3rdparty/protocol/ivi-application.xml | 31 +++----------------------------
+ 1 file changed, 3 insertions(+), 28 deletions(-)
+
+diff --git a/src/3rdparty/protocol/ivi-application.xml b/src/3rdparty/protocol/ivi-application.xml
+index 833fd38..b06ae6c 100644
+--- a/src/3rdparty/protocol/ivi-application.xml
++++ b/src/3rdparty/protocol/ivi-application.xml
+@@ -42,34 +42,9 @@
+ <arg name="visibility" type="int"/>
+ </event>
+
+- <enum name="warning_code">
+- <description summary="possible warning codes returned by ivi compositor">
+- These define all possible warning codes returned by ivi compositor on server-side warnings.
+- invalid_wl_surface:
+- - wl_surface already has a another role.
+- - wl_surface is destroyed before the ivi_surface is destroyed.
+- ivi_id_in_use: ivi_id is already assigned by another application.
+- </description>
+- <entry name="invalid_wl_surface" value="1" summary="wl_surface is invalid"/>
+- <entry name="ivi_id_in_use" value="2" summary="ivi_id is in use and can not be shared"/>
+- </enum>
+-
+- <event name="warning">
+- <description summary="server-side warning detected">
+- The ivi compositor encountered warning while processing a request by this
+- application. The warning is defined by argument warning_code and optional
+- warning_text. If the warning is detected, client shall destroy the ivi_surface
+- object.
+-
+- When a warning event is sent, the compositor turns the ivi_surface object inert.
+- The ivi_surface will not deliver further events, all requests on it are ignored
+- except 'destroy', and the association to the ivi_id is removed. The client
+- should destroy the ivi_surface object. If an inert ivi_surface object is used as
+- an argument to any other object's request, that request will [produce a fatal
+- error / produce a warning / be ignored].
+- </description>
+- <arg name="warning_code" type="int"/>
+- <arg name="warning_text" type="string" allow-null="true"/>
++ <event name="configure">
++ <arg name="width" type="int"/>
++ <arg name="height" type="int"/>
+ </event>
+
+ </interface>
+--
+2.2.1
+
diff --git a/recipes-qt/qt/qtwayland/0002-qwaylandwindow-add-support-for-IVI-Surface-ID-proper.patch b/recipes-qt/qt/qtwayland/0002-qwaylandwindow-add-support-for-IVI-Surface-ID-proper.patch
new file mode 100644
index 00000000..591ef71c
--- /dev/null
+++ b/recipes-qt/qt/qtwayland/0002-qwaylandwindow-add-support-for-IVI-Surface-ID-proper.patch
@@ -0,0 +1,34 @@
+From 31c60aedf415fd06b5c1aa16fdcef1504b67b96d Mon Sep 17 00:00:00 2001
+From: Holger Behrens <holger.behrens@windriver.com>
+Date: Tue, 3 Feb 2015 09:53:43 +0100
+Subject: [meta-ivi-demo][PATCH 2/2] qwaylandwindow: add support for
+ IVI-Surface-ID property
+
+Signed-off-by: Holger Behrens <holger.behrens@windriver.com>
+---
+ src/client/qwaylandwindow.cpp | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp
+index 45a58f2..781081a 100644
+--- a/src/client/qwaylandwindow.cpp
++++ b/src/client/qwaylandwindow.cpp
+@@ -100,7 +100,14 @@ QWaylandWindow::QWaylandWindow(QWindow *window)
+
+ if (!(window->flags() & Qt::BypassWindowManagerHint)) {
+ if (mDisplay->shellIvi()) {
+- mShellSurface = new QWaylandIviSurface(mDisplay->shellIvi()->surface_create(IVI_SURFACE_ID + getpid(), object()), this);
++ unsigned int id = 0;
++ QVariant value = window->property("IVI-Surface-ID");
++ if (value.isValid()) {
++ id = value.toUInt();
++ } else {
++ id = IVI_SURFACE_ID + getpid();
++ }
++ mShellSurface = new QWaylandIviSurface(mDisplay->shellIvi()->surface_create(id, object()), this);
+ } else if (mDisplay->shellXdg()) {
+ if (window->type() & Qt::Window) {
+ mShellSurface = new QWaylandXdgSurface(mDisplay->shellXdg()->get_xdg_surface(object()), this);
+--
+2.2.1
+
diff --git a/recipes-qt/qt/qtwayland/0010-Added-manifest-file-according-to-smack-3-domain-mode.patch b/recipes-qt/qt/qtwayland/0010-Added-manifest-file-according-to-smack-3-domain-mode.patch
new file mode 100644
index 00000000..39296c76
--- /dev/null
+++ b/recipes-qt/qt/qtwayland/0010-Added-manifest-file-according-to-smack-3-domain-mode.patch
@@ -0,0 +1,33 @@
+Add qt5wayland.manifest. Removed specfile change from patch.
+
+Adapted from:
+
+From 424c23191d81b072255bd7f178ad0ee2c2ea091a Mon Sep 17 00:00:00 2001
+From: Tomasz Olszak <olszak.tomasz@gmail.com>
+Date: Fri, 25 Apr 2014 14:32:22 +0200
+Subject: [PATCH 10/21] Added manifest file according to smack 3-domain model.
+
+Bug-Tizen:TIVI-2416
+
+Change-Id: I414e245a5c8847bec32ef6a97569d0f06221e1db
+Signed-off-by: Tomasz Olszak <olszak.tomasz@gmail.com>
+---
+ packaging/qt5-qtwayland.manifest | 5 +++++
+ packaging/qt5-qtwayland.spec | 4 ++++
+ 2 files changed, 9 insertions(+)
+ create mode 100644 packaging/qt5-qtwayland.manifest
+
+diff --git a/packaging/qt5-qtwayland.manifest b/packaging/qt5-qtwayland.manifest
+new file mode 100644
+index 0000000..75b0fa5
+--- /dev/null
++++ b/packaging/qt5-qtwayland.manifest
+@@ -0,0 +1,5 @@
++<manifest>
++ <request>
++ <domain name="_"/>
++ </request>
++</manifest>
+--
+1.9.1
+
diff --git a/recipes-qt/qt/qtwayland/0016-xdg-shell-Add-xdg-shell-protocol-file-version-1.4.0.patch b/recipes-qt/qt/qtwayland/0016-xdg-shell-Add-xdg-shell-protocol-file-version-1.4.0.patch
new file mode 100644
index 00000000..6bea6262
--- /dev/null
+++ b/recipes-qt/qt/qtwayland/0016-xdg-shell-Add-xdg-shell-protocol-file-version-1.4.0.patch
@@ -0,0 +1,468 @@
+From 5cd43dc7519f54f9786fb6c686a2ce1e682d4366 Mon Sep 17 00:00:00 2001
+From: Philippe Coval <philippe.coval@open.eurogiciel.org>
+Date: Fri, 25 Apr 2014 10:31:42 +0200
+Subject: [PATCH 16/21] xdg-shell: Add xdg-shell protocol file version 1.4.0
+
+Source: http://cgit.freedesktop.org/wayland/weston/plain/protocol/xdg-shell.xml?id=1.4.0
+
+This file will need to be refreshed on protocol update
+until xdg-shell land in wayland's public headers
+
+Task-number: QTBUG-38633/part/1of2
+Change-Id: I397d863dcfc2223ac6eb234c37dbcd7449ecffff
+Reviewed-by: Giulio Camuffo <giulio.camuffo@jollamobile.com>
+Origin: https://www.qt.gitorious.org/qt/qtwayland/commit/c2a22eea6716e073875474adf624d8463eba836c
+Bug-Tizen: TIVI-3113/part
+Signed-off-by: Philippe Coval <philippe.coval@open.eurogiciel.org>
+---
+ src/3rdparty/protocol/xdg-shell.xml | 438 ++++++++++++++++++++++++++++++++++++
+ 1 file changed, 438 insertions(+)
+ create mode 100644 src/3rdparty/protocol/xdg-shell.xml
+
+diff --git a/src/3rdparty/protocol/xdg-shell.xml b/src/3rdparty/protocol/xdg-shell.xml
+new file mode 100644
+index 0000000..4e5cff8
+--- /dev/null
++++ b/src/3rdparty/protocol/xdg-shell.xml
+@@ -0,0 +1,438 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<protocol name="xdg_shell">
++
++ <copyright>
++ Copyright © 2008-2013 Kristian Høgsberg
++ Copyright © 2013 Rafael Antognolli
++ Copyright © 2013 Jasper St. Pierre
++ Copyright © 2010-2013 Intel Corporation
++
++ Permission to use, copy, modify, distribute, and sell this
++ software and its documentation for any purpose is hereby granted
++ without fee, provided that the above copyright notice appear in
++ all copies and that both that copyright notice and this permission
++ notice appear in supporting documentation, and that the name of
++ the copyright holders not be used in advertising or publicity
++ pertaining to distribution of the software without specific,
++ written prior permission. The copyright holders make no
++ representations about the suitability of this software for any
++ purpose. It is provided "as is" without express or implied
++ warranty.
++
++ THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
++ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
++ FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
++ SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
++ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
++ AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
++ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
++ THIS SOFTWARE.
++ </copyright>
++
++ <interface name="xdg_shell" version="1">
++ <description summary="create desktop-style surfaces">
++ This interface is implemented by servers that provide
++ desktop-style user interfaces.
++
++ It allows clients to associate a xdg_surface with
++ a basic surface.
++ </description>
++
++ <enum name="version">
++ <description summary="latest protocol version">
++ Use this enum to check the protocol version, and it will be updated
++ automatically.
++ </description>
++ <entry name="current" value="1" summary="Always the latest version"/>
++ </enum>
++
++
++ <request name="use_unstable_version">
++ <description summary="enable use of this unstable version">
++ Use this request in order to enable use of this interface.
++
++ Understand and agree that one is using an unstable interface,
++ that will likely change in the future, breaking the API.
++ </description>
++ <arg name="version" type="int"/>
++ </request>
++
++ <request name="get_xdg_surface">
++ <description summary="create a shell surface from a surface">
++ Create a shell surface for an existing surface.
++
++ Only one shell or popup surface can be associated with a given
++ surface.
++ </description>
++ <arg name="id" type="new_id" interface="xdg_surface"/>
++ <arg name="surface" type="object" interface="wl_surface"/>
++ </request>
++
++ <request name="get_xdg_popup">
++ <description summary="create a shell surface from a surface">
++ Create a popup surface for an existing surface.
++
++ Only one shell or popup surface can be associated with a given
++ surface.
++ </description>
++ <arg name="id" type="new_id" interface="xdg_popup"/>
++ <arg name="surface" type="object" interface="wl_surface"/>
++ <arg name="parent" type="object" interface="wl_surface"/>
++ <arg name="seat" type="object" interface="wl_seat" summary="the wl_seat whose pointer is used"/>
++ <arg name="serial" type="uint" summary="serial of the implicit grab on the pointer"/>
++ <arg name="x" type="int"/>
++ <arg name="y" type="int"/>
++ <arg name="flags" type="uint"/>
++ </request>
++ </interface>
++
++ <interface name="xdg_surface" version="1">
++
++ <description summary="desktop-style metadata interface">
++ An interface that may be implemented by a wl_surface, for
++ implementations that provide a desktop-style user interface.
++
++ It provides requests to treat surfaces like windows, allowing to set
++ properties like maximized, fullscreen, minimized, and to move and resize
++ them, and associate metadata like title and app id.
++
++ On the server side the object is automatically destroyed when
++ the related wl_surface is destroyed. On client side,
++ xdg_surface.destroy() must be called before destroying
++ the wl_surface object.
++ </description>
++
++ <request name="destroy" type="destructor">
++ <description summary="remove xdg_surface interface">
++ The xdg_surface interface is removed from the wl_surface object
++ that was turned into a xdg_surface with
++ xdg_shell.get_xdg_surface request. The xdg_surface properties,
++ like maximized and fullscreen, are lost. The wl_surface loses
++ its role as a xdg_surface. The wl_surface is unmapped.
++ </description>
++ </request>
++
++ <request name="set_transient_for">
++ <description summary="surface is a child of another surface">
++ Setting a surface as transient of another means that it is child
++ of another surface.
++
++ Child surfaces are stacked above their parents, and will be
++ unmapped if the parent is unmapped too. They should not appear
++ on task bars and alt+tab.
++ </description>
++ <arg name="parent" type="object" interface="wl_surface" allow-null="true"/>
++ </request>
++
++ <request name="set_title">
++ <description summary="set surface title">
++ Set a short title for the surface.
++
++ This string may be used to identify the surface in a task bar,
++ window list, or other user interface elements provided by the
++ compositor.
++
++ The string must be encoded in UTF-8.
++ </description>
++ <arg name="title" type="string"/>
++ </request>
++
++ <request name="set_app_id">
++ <description summary="set surface class">
++ Set an id for the surface.
++
++ The app id identifies the general class of applications to which
++ the surface belongs.
++
++ It should be the ID that appears in the new desktop entry
++ specification, the interface name.
++ </description>
++ <arg name="app_id" type="string"/>
++ </request>
++
++ <request name="pong">
++ <description summary="respond to a ping event">
++ A client must respond to a ping event with a pong request or
++ the client may be deemed unresponsive.
++ </description>
++ <arg name="serial" type="uint" summary="serial of the ping event"/>
++ </request>
++
++ <event name="ping">
++ <description summary="ping client">
++ Ping a client to check if it is receiving events and sending
++ requests. A client is expected to reply with a pong request.
++ </description>
++ <arg name="serial" type="uint"/>
++ </event>
++
++ <request name="move">
++ <description summary="start an interactive move">
++ Start a pointer-driven move of the surface.
++
++ This request must be used in response to a button press event.
++ The server may ignore move requests depending on the state of
++ the surface (e.g. fullscreen or maximized).
++ </description>
++ <arg name="seat" type="object" interface="wl_seat" summary="the wl_seat whose pointer is used"/>
++ <arg name="serial" type="uint" summary="serial of the implicit grab on the pointer"/>
++ </request>
++
++ <enum name="resize_edge">
++ <description summary="edge values for resizing">
++ These values are used to indicate which edge of a surface
++ is being dragged in a resize operation. The server may
++ use this information to adapt its behavior, e.g. choose
++ an appropriate cursor image.
++ </description>
++ <entry name="none" value="0"/>
++ <entry name="top" value="1"/>
++ <entry name="bottom" value="2"/>
++ <entry name="left" value="4"/>
++ <entry name="top_left" value="5"/>
++ <entry name="bottom_left" value="6"/>
++ <entry name="right" value="8"/>
++ <entry name="top_right" value="9"/>
++ <entry name="bottom_right" value="10"/>
++ </enum>
++
++ <request name="resize">
++ <description summary="start an interactive resize">
++ Start a pointer-driven resizing of the surface.
++
++ This request must be used in response to a button press event.
++ The server may ignore resize requests depending on the state of
++ the surface (e.g. fullscreen or maximized).
++ </description>
++ <arg name="seat" type="object" interface="wl_seat" summary="the wl_seat whose pointer is used"/>
++ <arg name="serial" type="uint" summary="serial of the implicit grab on the pointer"/>
++ <arg name="edges" type="uint" summary="which edge or corner is being dragged"/>
++ </request>
++
++ <event name="configure">
++ <description summary="suggest resize">
++ The configure event asks the client to resize its surface.
++
++ The size is a hint, in the sense that the client is free to
++ ignore it if it doesn't resize, pick a smaller size (to
++ satisfy aspect ratio or resize in steps of NxM pixels).
++
++ The edges parameter provides a hint about how the surface
++ was resized. The client may use this information to decide
++ how to adjust its content to the new size (e.g. a scrolling
++ area might adjust its content position to leave the viewable
++ content unmoved). Valid edge values are from resize_edge enum.
++
++ The client is free to dismiss all but the last configure
++ event it received.
++
++ The width and height arguments specify the size of the window
++ in surface local coordinates.
++ </description>
++
++ <arg name="edges" type="uint"/>
++ <arg name="width" type="int"/>
++ <arg name="height" type="int"/>
++ </event>
++
++ <request name="set_output">
++ <description summary="set the default output used by this surface">
++ Set the default output used by this surface when it is first mapped.
++
++ If this value is NULL (default), it's up to the compositor to choose
++ which display will be used to map this surface.
++
++ When fullscreen or maximized state are set on this surface, and it
++ wasn't mapped yet, the output set with this method will be used.
++ Otherwise, the output where the surface is currently mapped will be
++ used.
++ </description>
++ <arg name="output" type="object" interface="wl_output" allow-null="true"/>
++ </request>
++
++ <event name="request_set_fullscreen">
++ <description summary="server requests that the client set fullscreen">
++ Event sent from the compositor to the client requesting that the client
++ goes to a fullscreen state. It's the client job to call set_fullscreen
++ and really trigger the fullscreen state.
++ </description>
++ </event>
++
++ <event name="request_unset_fullscreen">
++ <description summary="server requests that the client unset fullscreen">
++ Event sent from the compositor to the client requesting that the client
++ leaves the fullscreen state. It's the client job to call
++ unset_fullscreen and really leave the fullscreen state.
++ </description>
++ </event>
++
++ <request name="set_fullscreen">
++ <description summary="set the surface state as fullscreen">
++ Set the surface as fullscreen.
++
++ After this request, the compositor should send a configure event
++ informing the output size.
++
++ This request informs the compositor that the next attached buffer
++ committed will be in a fullscreen state. The buffer size should be the
++ same size as the size informed in the configure event, if the client
++ doesn't want to leave any empty area.
++
++ In other words: the next attached buffer after set_maximized is the new
++ maximized buffer. And the surface will be positioned at the maximized
++ position on commit.
++
++ A simple way to synchronize and wait for the correct configure event is
++ to use a wl_display.sync request right after the set_fullscreen
++ request. When the sync callback returns, the last configure event
++ received just before it will be the correct one, and should contain the
++ right size for the surface to maximize.
++
++ Setting one state won't unset another state. Use
++ xdg_surface.unset_fullscreen for unsetting it.
++ </description>
++ </request>
++
++ <request name="unset_fullscreen">
++ <description summary="unset the surface state as fullscreen">
++ Unset the surface fullscreen state.
++
++ Same negotiation as set_fullscreen must be used.
++ </description>
++ </request>
++
++ <event name="request_set_maximized">
++ <description summary="server requests that the client set maximized">
++ Event sent from the compositor to the client requesting that the client
++ goes to a maximized state. It's the client job to call set_maximized
++ and really trigger the maximized state.
++ </description>
++ </event>
++
++ <event name="request_unset_maximized">
++ <description summary="server requests that the client unset maximized">
++ Event sent from the compositor to the client requesting that the client
++ leaves the maximized state. It's the client job to call unset_maximized
++ and really leave the maximized state.
++ </description>
++ </event>
++
++ <request name="set_maximized">
++ <description summary="set the surface state as maximized">
++ Set the surface as maximized.
++
++ After this request, the compositor will send a configure event
++ informing the output size minus panel and other MW decorations.
++
++ This request informs the compositor that the next attached buffer
++ committed will be in a maximized state. The buffer size should be the
++ same size as the size informed in the configure event, if the client
++ doesn't want to leave any empty area.
++
++ In other words: the next attached buffer after set_maximized is the new
++ maximized buffer. And the surface will be positioned at the maximized
++ position on commit.
++
++ A simple way to synchronize and wait for the correct configure event is
++ to use a wl_display.sync request right after the set_maximized request.
++ When the sync callback returns, the last configure event received just
++ before it will be the correct one, and should contain the right size
++ for the surface to maximize.
++
++ Setting one state won't unset another state. Use
++ xdg_surface.unset_maximized for unsetting it.
++ </description>
++ </request>
++
++ <request name="unset_maximized">
++ <description summary="unset the surface state as maximized">
++ Unset the surface maximized state.
++
++ Same negotiation as set_maximized must be used.
++ </description>
++ </request>
++
++ <request name="set_minimized">
++ <description summary="set the surface state as minimized">
++ Set the surface minimized state.
++
++ Setting one state won't unset another state.
++ </description>
++ </request>
++
++ <event name="focused_set">
++ <description summary="surface was focused">
++ The focused_set event is sent when this surface has been
++ activated. Window decorations should be updated accordingly.
++ </description>
++ </event>
++
++ <event name="focused_unset">
++ <description summary="surface was unfocused">
++ The focused_unset event is sent when this surface has been
++ deactivated, because another surface has been activated. Window
++ decorations should be updated accordingly.
++ </description>
++ </event>
++ </interface>
++
++ <interface name="xdg_popup" version="1">
++ <description summary="desktop-style metadata interface">
++ An interface that may be implemented by a wl_surface, for
++ implementations that provide a desktop-style popups/menus. A popup
++ surface is a transient surface with an added pointer grab.
++
++ An existing implicit grab will be changed to owner-events mode,
++ and the popup grab will continue after the implicit grab ends
++ (i.e. releasing the mouse button does not cause the popup to be
++ unmapped).
++
++ The popup grab continues until the window is destroyed or a mouse
++ button is pressed in any other clients window. A click in any of
++ the clients surfaces is reported as normal, however, clicks in
++ other clients surfaces will be discarded and trigger the callback.
++
++ The x and y arguments specify the locations of the upper left
++ corner of the surface relative to the upper left corner of the
++ parent surface, in surface local coordinates.
++
++ xdg_popup surfaces are always transient for another surface.
++ </description>
++
++ <request name="destroy" type="destructor">
++ <description summary="remove xdg_surface interface">
++ The xdg_surface interface is removed from the wl_surface object
++ that was turned into a xdg_surface with
++ xdg_shell.get_xdg_surface request. The xdg_surface properties,
++ like maximized and fullscreen, are lost. The wl_surface loses
++ its role as a xdg_surface. The wl_surface is unmapped.
++ </description>
++ </request>
++
++ <request name="pong">
++ <description summary="respond to a ping event">
++ A client must respond to a ping event with a pong request or
++ the client may be deemed unresponsive.
++ </description>
++ <arg name="serial" type="uint" summary="serial of the ping event"/>
++ </request>
++
++ <event name="ping">
++ <description summary="ping client">
++ Ping a client to check if it is receiving events and sending
++ requests. A client is expected to reply with a pong request.
++ </description>
++ <arg name="serial" type="uint"/>
++ </event>
++
++ <event name="popup_done">
++ <description summary="popup interaction is done">
++ The popup_done event is sent out when a popup grab is broken,
++ that is, when the users clicks a surface that doesn't belong
++ to the client owning the popup surface.
++ </description>
++ <arg name="serial" type="uint" summary="serial of the implicit grab on the pointer"/>
++ </event>
++
++ </interface>
++</protocol>
+--
+1.9.1
+
diff --git a/recipes-qt/qt/qtwayland/0017-xdg-shell-Add-minimize-feature-to-QWindow-using-wayl.patch b/recipes-qt/qt/qtwayland/0017-xdg-shell-Add-minimize-feature-to-QWindow-using-wayl.patch
new file mode 100644
index 00000000..fe1bb50e
--- /dev/null
+++ b/recipes-qt/qt/qtwayland/0017-xdg-shell-Add-minimize-feature-to-QWindow-using-wayl.patch
@@ -0,0 +1,1029 @@
+From 0edba039247ce888dbb7ff0a93c7b9ec01bac46e Mon Sep 17 00:00:00 2001
+From: Philippe Coval <philippe.coval@open.eurogiciel.org>
+Date: Wed, 26 Mar 2014 10:16:01 +0100
+Subject: [PATCH 17/21] xdg-shell: Add minimize feature to QWindow using
+ wayland's xdg-shell
+
+The feature is disabled by default,
+and can be enabled at runtime
+by exporting QT_WAYLAND_USE_XDG_SHELL env variable.
+
+This patch relies on presence of protocol file
+which has been imported from weston-1.4.0 sources,
+until the xdg-shell is merge into wayland itself.
+
+Because xdg-shell is experimental,
+code fallback to WaylandShell if no XdgShell
+but keep in mind those shells are exclusive.
+
+Since xdg-shell and wayland-shell share most of the API,
+some factorization is done by an (empty) abstraction class
+to keep the code more readable.
+
+Despite xdg-shell introduces new popups concept,
+they're not used on this change for maitainance purpose.
+
+Notes:
+
+* This change depends on presence of xdg-shell protocol file.
+
+* You can check a demo video
+ (qt-tizen-cinematic-experience-20140430-rzr)
+ of the test case at :
+ https://www.youtube.com/watch?v=pY_XXvKc_0E#
+
+* Use Super+Tab to show window again if hidden
+
+Task-number: QTBUG-38633/part/2of2
+Change-Id: I2d7ed85bea1847d82439fdfc893a3dbb2581ffff
+Reviewed-by: Giulio Camuffo <giulio.camuffo@jollamobile.com>
+Origin: https://www.qt.gitorious.org/qt/qtwayland/commit/768484daaa64bea965bef981a16f59be8db0c190
+Bug-Tizen: TIVI-3113/part
+Signed-off-by: Philippe Coval <philippe.coval@open.eurogiciel.org>
+---
+ src/client/client.pro | 5 +
+ src/client/qwaylanddisplay.cpp | 5 +
+ src/client/qwaylanddisplay_p.h | 4 +
+ src/client/qwaylandshellsurface.cpp | 134 ------------------------
+ src/client/qwaylandshellsurface_p.h | 40 +++-----
+ src/client/qwaylandwindow.cpp | 40 ++++++--
+ src/client/qwaylandwlshellsurface.cpp | 186 ++++++++++++++++++++++++++++++++++
+ src/client/qwaylandwlshellsurface_p.h | 101 ++++++++++++++++++
+ src/client/qwaylandxdgsurface.cpp | 173 +++++++++++++++++++++++++++++++
+ src/client/qwaylandxdgsurface_p.h | 105 +++++++++++++++++++
+ 10 files changed, 625 insertions(+), 168 deletions(-)
+ create mode 100644 src/client/qwaylandwlshellsurface.cpp
+ create mode 100644 src/client/qwaylandwlshellsurface_p.h
+ create mode 100644 src/client/qwaylandxdgsurface.cpp
+ create mode 100644 src/client/qwaylandxdgsurface_p.h
+
+diff --git a/src/client/client.pro b/src/client/client.pro
+index 10cbd31..9ecf82f 100644
+--- a/src/client/client.pro
++++ b/src/client/client.pro
+@@ -41,6 +41,7 @@ WAYLANDCLIENTSOURCES += \
+ ../extensions/qtkey-extension.xml \
+ ../extensions/windowmanager.xml \
+ ../3rdparty/protocol/text.xml \
++ ../3rdparty/protocol/xdg-shell.xml \
+
+ SOURCES += qwaylandintegration.cpp \
+ qwaylandnativeinterface.cpp \
+@@ -57,6 +58,8 @@ SOURCES += qwaylandintegration.cpp \
+ qwaylanddatadevicemanager.cpp \
+ qwaylanddatasource.cpp \
+ qwaylandshellsurface.cpp \
++ qwaylandwlshellsurface.cpp \
++ qwaylandxdgsurface.cpp \
+ qwaylandextendedoutput.cpp \
+ qwaylandextendedsurface.cpp \
+ qwaylandsubsurface.cpp \
+@@ -85,6 +88,8 @@ HEADERS += qwaylandintegration_p.h \
+ qwaylanddatadevicemanager_p.h \
+ qwaylanddatasource_p.h \
+ qwaylandshellsurface_p.h \
++ qwaylandwlshellsurface_p.h \
++ qwaylandxdgsurface_p.h \
+ qwaylandextendedoutput_p.h \
+ qwaylandextendedsurface_p.h \
+ qwaylandsubsurface_p.h \
+diff --git a/src/client/qwaylanddisplay.cpp b/src/client/qwaylanddisplay.cpp
+index 0b715c0..7f953ad 100644
+--- a/src/client/qwaylanddisplay.cpp
++++ b/src/client/qwaylanddisplay.cpp
+@@ -61,6 +61,7 @@
+ #include "qwaylandqtkey_p.h"
+
+ #include <QtWaylandClient/private/qwayland-text.h>
++#include <QtWaylandClient/private/qwayland-xdg-shell.h>
+
+ #include <QtCore/QAbstractEventDispatcher>
+ #include <QtGui/private/qguiapplication_p.h>
+@@ -206,6 +207,10 @@ void QWaylandDisplay::registry_global(uint32_t id, const QString &interface, uin
+ mCompositor.init(registry, id);
+ } else if (interface == QStringLiteral("wl_shm")) {
+ mShm = static_cast<struct wl_shm *>(wl_registry_bind(registry, id, &wl_shm_interface,1));
++ } else if (interface == QStringLiteral("xdg_shell")
++ && qEnvironmentVariableIsSet("QT_WAYLAND_USE_XDG_SHELL")) {
++ mShellXdg.reset(new QtWayland::xdg_shell(registry, id));
++ mShellXdg->use_unstable_version(QtWayland::xdg_shell::version_current);
+ } else if (interface == QStringLiteral("wl_shell")){
+ mShell.reset(new QtWayland::wl_shell(registry, id));
+ } else if (interface == QStringLiteral("wl_seat")) {
+diff --git a/src/client/qwaylanddisplay_p.h b/src/client/qwaylanddisplay_p.h
+index 40cb2b2..cf5dfc2 100644
+--- a/src/client/qwaylanddisplay_p.h
++++ b/src/client/qwaylanddisplay_p.h
+@@ -51,6 +51,7 @@
+
+ #include <QtWaylandClient/private/qwayland-wayland.h>
+ #include <QtWaylandClient/private/qwaylandclientexport_p.h>
++#include <QtWaylandClient/private/qwayland-xdg-shell.h>
+
+ struct wl_cursor_image;
+
+@@ -78,6 +79,7 @@ namespace QtWayland {
+ class qt_sub_surface_extension;
+ class qt_surface_extension;
+ class wl_text_input_manager;
++ class xdg_shell;
+ }
+
+ typedef void (*RegistryListener)(void *data,
+@@ -113,6 +115,7 @@ public:
+ QtWayland::wl_compositor *compositor() { return &mCompositor; }
+
+ QtWayland::wl_shell *shell() { return mShell.data(); }
++ QtWayland::xdg_shell *shellXdg() { return mShellXdg.data(); }
+
+ QList<QWaylandInputDevice *> inputDevices() const { return mInputDevices; }
+ QWaylandInputDevice *defaultInputDevice() const;
+@@ -168,6 +171,7 @@ private:
+ QThread *mEventThread;
+ QWaylandEventThread *mEventThreadObject;
+ QScopedPointer<QtWayland::wl_shell> mShell;
++ QScopedPointer<QtWayland::xdg_shell> mShellXdg;
+ QList<QPlatformScreen *> mScreens;
+ QList<QWaylandInputDevice *> mInputDevices;
+ QList<Listener> mRegistryListeners;
+diff --git a/src/client/qwaylandshellsurface.cpp b/src/client/qwaylandshellsurface.cpp
+index b7a819f..80e509b 100644
+--- a/src/client/qwaylandshellsurface.cpp
++++ b/src/client/qwaylandshellsurface.cpp
+@@ -40,137 +40,3 @@
+ ****************************************************************************/
+
+ #include "qwaylandshellsurface_p.h"
+-
+-#include "qwaylanddisplay_p.h"
+-#include "qwaylandwindow_p.h"
+-#include "qwaylandinputdevice_p.h"
+-#include "qwaylanddecoration_p.h"
+-#include "qwaylandscreen_p.h"
+-
+-#include <QtCore/QDebug>
+-
+-QT_BEGIN_NAMESPACE
+-
+-QWaylandShellSurface::QWaylandShellSurface(struct ::wl_shell_surface *shell_surface, QWaylandWindow *window)
+- : QtWayland::wl_shell_surface(shell_surface)
+- , m_window(window)
+- , m_maximized(false)
+- , m_fullscreen(false)
+-{
+-}
+-
+-QWaylandShellSurface::~QWaylandShellSurface()
+-{
+- wl_shell_surface_destroy(object());
+-}
+-
+-void QWaylandShellSurface::resize(QWaylandInputDevice *inputDevice, enum wl_shell_surface_resize edges)
+-{
+- resize(inputDevice->wl_seat(),
+- inputDevice->serial(),
+- edges);
+-}
+-
+-void QWaylandShellSurface::move(QWaylandInputDevice *inputDevice)
+-{
+- move(inputDevice->wl_seat(),
+- inputDevice->serial());
+-}
+-
+-void QWaylandShellSurface::setMaximized()
+-{
+- m_maximized = true;
+- m_size = m_window->window()->geometry().size();
+- set_maximized(0);
+-}
+-
+-void QWaylandShellSurface::setFullscreen()
+-{
+- m_fullscreen = true;
+- m_size = m_window->window()->geometry().size();
+- set_fullscreen(WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT, 0, 0);
+-}
+-
+-void QWaylandShellSurface::setNormal()
+-{
+- if (m_fullscreen || m_maximized) {
+- m_fullscreen = m_maximized = false;
+- setTopLevel();
+- QMargins m = m_window->frameMargins();
+- m_window->configure(0, m_size.width() + m.left() + m.right(), m_size.height() + m.top() + m.bottom());
+- }
+-}
+-
+-void QWaylandShellSurface::setMinimized()
+-{
+- // TODO: There's no wl_shell_surface API for this
+-}
+-
+-void QWaylandShellSurface::setTopLevel()
+-{
+- set_toplevel();
+-}
+-
+-void QWaylandShellSurface::updateTransientParent(QWindow *parent)
+-{
+- QWaylandWindow *parent_wayland_window = static_cast<QWaylandWindow *>(parent->handle());
+- if (!parent_wayland_window)
+- return;
+-
+- // set_transient expects a position relative to the parent
+- QPoint transientPos = m_window->geometry().topLeft(); // this is absolute
+- QWindow *parentWin = m_window->window()->transientParent();
+- transientPos -= parentWin->geometry().topLeft();
+- if (parent_wayland_window->decoration()) {
+- transientPos.setX(transientPos.x() + parent_wayland_window->decoration()->margins().left());
+- transientPos.setY(transientPos.y() + parent_wayland_window->decoration()->margins().top());
+- }
+-
+- uint32_t flags = 0;
+- Qt::WindowFlags wf = m_window->window()->flags();
+- if (wf.testFlag(Qt::ToolTip)
+- || wf.testFlag(Qt::WindowTransparentForInput))
+- flags |= WL_SHELL_SURFACE_TRANSIENT_INACTIVE;
+-
+- set_transient(parent_wayland_window->object(),
+- transientPos.x(),
+- transientPos.y(),
+- flags);
+-}
+-
+-void QWaylandShellSurface::setPopup(QWaylandWindow *parent, QWaylandInputDevice *device, int serial)
+-{
+- QWaylandWindow *parent_wayland_window = parent;
+- if (!parent_wayland_window)
+- return;
+-
+- // set_popup expects a position relative to the parent
+- QPoint transientPos = m_window->geometry().topLeft(); // this is absolute
+- transientPos -= parent_wayland_window->geometry().topLeft();
+- if (parent_wayland_window->decoration()) {
+- transientPos.setX(transientPos.x() + parent_wayland_window->decoration()->margins().left());
+- transientPos.setY(transientPos.y() + parent_wayland_window->decoration()->margins().top());
+- }
+-
+- set_popup(device->wl_seat(), serial, parent_wayland_window->object(),
+- transientPos.x(), transientPos.y(), 0);
+-}
+-
+-void QWaylandShellSurface::shell_surface_ping(uint32_t serial)
+-{
+- pong(serial);
+-}
+-
+-void QWaylandShellSurface::shell_surface_configure(uint32_t edges,
+- int32_t width,
+- int32_t height)
+-{
+- m_window->configure(edges, width, height);
+-}
+-
+-void QWaylandShellSurface::shell_surface_popup_done()
+-{
+- QCoreApplication::postEvent(m_window->window(), new QCloseEvent());
+-}
+-
+-QT_END_NAMESPACE
+diff --git a/src/client/qwaylandshellsurface_p.h b/src/client/qwaylandshellsurface_p.h
+index 2477c3f..2f59f60 100644
+--- a/src/client/qwaylandshellsurface_p.h
++++ b/src/client/qwaylandshellsurface_p.h
+@@ -55,39 +55,25 @@ class QWaylandWindow;
+ class QWaylandInputDevice;
+ class QWindow;
+
+-class Q_WAYLAND_CLIENT_EXPORT QWaylandShellSurface : public QtWayland::wl_shell_surface
++class Q_WAYLAND_CLIENT_EXPORT QWaylandShellSurface
+ {
+ public:
+- QWaylandShellSurface(struct ::wl_shell_surface *shell_surface, QWaylandWindow *window);
+- ~QWaylandShellSurface();
++ virtual ~QWaylandShellSurface() {}
++ virtual void resize(QWaylandInputDevice * /*inputDevice*/, enum wl_shell_surface_resize /*edges*/)
++ {}
+
+- using QtWayland::wl_shell_surface::resize;
+- void resize(QWaylandInputDevice *inputDevice, enum wl_shell_surface_resize edges);
+-
+- using QtWayland::wl_shell_surface::move;
+- void move(QWaylandInputDevice *inputDevice);
++ virtual void move(QWaylandInputDevice * /*inputDevice*/) {}
++ virtual void setTitle(const QString & /*title*/) {}
++ virtual void setAppId(const QString & /*appId*/) {}
+
+ private:
+- void setMaximized();
+- void setFullscreen();
+- void setNormal();
+- void setMinimized();
+-
+- void setTopLevel();
+- void updateTransientParent(QWindow *parent);
+- void setPopup(QWaylandWindow *parent, QWaylandInputDevice *device, int serial);
+-
+- QWaylandWindow *m_window;
+- bool m_maximized;
+- bool m_fullscreen;
+- QSize m_size;
+-
+- void shell_surface_ping(uint32_t serial) Q_DECL_OVERRIDE;
+- void shell_surface_configure(uint32_t edges,
+- int32_t width,
+- int32_t height) Q_DECL_OVERRIDE;
+- void shell_surface_popup_done() Q_DECL_OVERRIDE;
++ virtual void setMaximized() {}
++ virtual void setFullscreen() {}
++ virtual void setNormal() {}
++ virtual void setMinimized() {}
+
++ virtual void setTopLevel() {}
++ virtual void updateTransientParent(QWindow * /*parent*/) {}
+ friend class QWaylandWindow;
+ };
+
+diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp
+index 920c977..3fb3a49 100644
+--- a/src/client/qwaylandwindow.cpp
++++ b/src/client/qwaylandwindow.cpp
+@@ -46,6 +46,8 @@
+ #include "qwaylandinputdevice_p.h"
+ #include "qwaylandscreen_p.h"
+ #include "qwaylandshellsurface_p.h"
++#include "qwaylandwlshellsurface_p.h"
++#include "qwaylandxdgsurface_p.h"
+ #include "qwaylandextendedsurface_p.h"
+ #include "qwaylandsubsurface_p.h"
+ #include "qwaylanddecoration_p.h"
+@@ -92,8 +94,16 @@ QWaylandWindow::QWaylandWindow(QWindow *window)
+ static WId id = 1;
+ mWindowId = id++;
+
+- if (mDisplay->shell() && window->type() & Qt::Window && !(window->flags() & Qt::BypassWindowManagerHint))
+- mShellSurface = new QWaylandShellSurface(mDisplay->shell()->get_shell_surface(object()), this);
++ if (!(window->flags() & Qt::BypassWindowManagerHint)) {
++ if (mDisplay->shellXdg()) {
++ if (window->type() & Qt::Window) {
++ mShellSurface = new QWaylandXdgSurface(mDisplay->shellXdg()->get_xdg_surface(object()), this);
++ }
++ } else if (mDisplay->shell() && window->type() & Qt::Window) {
++ mShellSurface = new QWaylandWlShellSurface(mDisplay->shell()->get_shell_surface(object()), this);
++ }
++ }
++
+ if (mDisplay->windowExtension())
+ mExtendedWindow = new QWaylandExtendedSurface(this, mDisplay->windowExtension()->get_extended_surface(object()));
+ if (mDisplay->subSurfaceExtension())
+@@ -101,12 +111,12 @@ QWaylandWindow::QWaylandWindow(QWindow *window)
+
+ if (mShellSurface) {
+ // Set initial surface title
+- mShellSurface->set_title(window->title());
++ mShellSurface->setTitle(window->title());
+
+ // Set surface class to the .desktop file name (obtained from executable name)
+ QFileInfo exeFileInfo(qApp->applicationFilePath());
+ QString className = exeFileInfo.baseName() + QLatin1String(".desktop");
+- mShellSurface->set_class(className);
++ mShellSurface->setAppId(className);
+ }
+
+ if (QPlatformWindow::parent() && mSubSurfaceWindow) {
+@@ -170,7 +180,7 @@ void QWaylandWindow::setParent(const QPlatformWindow *parent)
+ void QWaylandWindow::setWindowTitle(const QString &title)
+ {
+ if (mShellSurface) {
+- mShellSurface->set_title(title);
++ mShellSurface->setTitle(title);
+ }
+
+ if (mWindowDecoration && window()->isVisible())
+@@ -212,8 +222,10 @@ void QWaylandWindow::setVisible(bool visible)
+ mMouseDevice = parent->mMouseDevice;
+ mMouseSerial = parent->mMouseSerial;
+
+- if (mMouseDevice)
+- mShellSurface->setPopup(transientParent(), mMouseDevice, mMouseSerial);
++ QWaylandWlShellSurface *wlshellSurface = dynamic_cast<QWaylandWlShellSurface*>(mShellSurface);
++ if (mMouseDevice && wlshellSurface) {
++ wlshellSurface->setPopup(transientParent(), mMouseDevice, mMouseSerial);
++ }
+ }
+
+ if (!mSentInitialResize) {
+@@ -428,6 +440,20 @@ void QWaylandWindow::setWindowFlags(Qt::WindowFlags flags)
+
+ bool QWaylandWindow::createDecoration()
+ {
++ // so far only xdg-shell support this "unminimize" trick, may be moved elsewhere
++ if (mState == Qt::WindowMinimized) {
++ QWaylandXdgSurface *xdgSurface = dynamic_cast<QWaylandXdgSurface *>(mShellSurface);
++ if ( xdgSurface ) {
++ if (xdgSurface->isFullscreen()) {
++ setWindowStateInternal(Qt::WindowFullScreen);
++ } else if (xdgSurface->isMaximized()) {
++ setWindowStateInternal(Qt::WindowMaximized);
++ } else {
++ setWindowStateInternal(Qt::WindowNoState);
++ }
++ }
++ }
++
+ static bool disableWaylandDecorations = !qgetenv("QT_WAYLAND_DISABLE_WINDOWDECORATION").isEmpty();
+ if (disableWaylandDecorations)
+ return false;
+diff --git a/src/client/qwaylandwlshellsurface.cpp b/src/client/qwaylandwlshellsurface.cpp
+new file mode 100644
+index 0000000..4b73ec2
+--- /dev/null
++++ b/src/client/qwaylandwlshellsurface.cpp
+@@ -0,0 +1,186 @@
++/****************************************************************************
++**
++** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
++** Contact: http://www.qt-project.org/legal
++**
++** This file is part of the config.tests of the Qt Toolkit.
++**
++** $QT_BEGIN_LICENSE:LGPL$
++** Commercial License Usage
++** Licensees holding valid commercial Qt licenses may use this file in
++** accordance with the commercial license agreement provided with the
++** Software or, alternatively, in accordance with the terms contained in
++** a written agreement between you and Digia. For licensing terms and
++** conditions see http://qt.digia.com/licensing. For further information
++** use the contact form at http://qt.digia.com/contact-us.
++**
++** GNU Lesser General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU Lesser
++** General Public License version 2.1 as published by the Free Software
++** Foundation and appearing in the file LICENSE.LGPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU Lesser General Public License version 2.1 requirements
++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
++**
++** In addition, as a special exception, Digia gives you certain additional
++** rights. These rights are described in the Digia Qt LGPL Exception
++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
++**
++** GNU General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU
++** General Public License version 3.0 as published by the Free Software
++** Foundation and appearing in the file LICENSE.GPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU General Public License version 3.0 requirements will be
++** met: http://www.gnu.org/copyleft/gpl.html.
++**
++**
++** $QT_END_LICENSE$
++**
++****************************************************************************/
++
++#include "qwaylandwlshellsurface_p.h"
++
++#include "qwaylanddisplay_p.h"
++#include "qwaylandwindow_p.h"
++#include "qwaylandinputdevice_p.h"
++#include "qwaylanddecoration_p.h"
++#include "qwaylandscreen_p.h"
++
++#include <QtCore/QDebug>
++
++QT_BEGIN_NAMESPACE
++
++QWaylandWlShellSurface::QWaylandWlShellSurface(struct ::wl_shell_surface *shell_surface, QWaylandWindow *window)
++ : QtWayland::wl_shell_surface(shell_surface)
++ , m_window(window)
++ , m_maximized(false)
++ , m_fullscreen(false)
++{
++}
++
++QWaylandWlShellSurface::~QWaylandWlShellSurface()
++{
++ wl_shell_surface_destroy(object());
++}
++
++void QWaylandWlShellSurface::resize(QWaylandInputDevice *inputDevice, enum wl_shell_surface_resize edges)
++{
++ resize(inputDevice->wl_seat(),
++ inputDevice->serial(),
++ edges);
++}
++
++void QWaylandWlShellSurface::move(QWaylandInputDevice *inputDevice)
++{
++ move(inputDevice->wl_seat(),
++ inputDevice->serial());
++}
++
++void QWaylandWlShellSurface::setTitle(const QString & title)
++{
++ return QtWayland::wl_shell_surface::set_title(title);
++}
++
++void QWaylandWlShellSurface::setAppId(const QString & appId)
++{
++ return QtWayland::wl_shell_surface::set_class(appId);
++}
++
++void QWaylandWlShellSurface::setMaximized()
++{
++ m_maximized = true;
++ m_size = m_window->window()->geometry().size();
++ set_maximized(0);
++}
++
++void QWaylandWlShellSurface::setFullscreen()
++{
++ m_fullscreen = true;
++ m_size = m_window->window()->geometry().size();
++ set_fullscreen(WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT, 0, 0);
++}
++
++void QWaylandWlShellSurface::setNormal()
++{
++ if (m_fullscreen || m_maximized) {
++ m_fullscreen = m_maximized = false;
++ setTopLevel();
++ QMargins m = m_window->frameMargins();
++ m_window->configure(0, m_size.width() + m.left() + m.right(), m_size.height() + m.top() + m.bottom());
++ }
++}
++
++void QWaylandWlShellSurface::setMinimized()
++{
++ // TODO: There's no wl_shell_surface API for this
++}
++
++void QWaylandWlShellSurface::setTopLevel()
++{
++ set_toplevel();
++}
++
++void QWaylandWlShellSurface::updateTransientParent(QWindow *parent)
++{
++ QWaylandWindow *parent_wayland_window = static_cast<QWaylandWindow *>(parent->handle());
++ if (!parent_wayland_window)
++ return;
++
++ // set_transient expects a position relative to the parent
++ QPoint transientPos = m_window->geometry().topLeft(); // this is absolute
++ QWindow *parentWin = m_window->window()->transientParent();
++ transientPos -= parentWin->geometry().topLeft();
++ if (parent_wayland_window->decoration()) {
++ transientPos.setX(transientPos.x() + parent_wayland_window->decoration()->margins().left());
++ transientPos.setY(transientPos.y() + parent_wayland_window->decoration()->margins().top());
++ }
++
++ uint32_t flags = 0;
++ Qt::WindowFlags wf = m_window->window()->flags();
++ if (wf.testFlag(Qt::ToolTip)
++ || wf.testFlag(Qt::WindowTransparentForInput))
++ flags |= WL_SHELL_SURFACE_TRANSIENT_INACTIVE;
++
++ set_transient(parent_wayland_window->object(),
++ transientPos.x(),
++ transientPos.y(),
++ flags);
++}
++
++void QWaylandWlShellSurface::setPopup(QWaylandWindow *parent, QWaylandInputDevice *device, int serial)
++{
++ QWaylandWindow *parent_wayland_window = parent;
++ if (!parent_wayland_window)
++ return;
++
++ // set_popup expects a position relative to the parent
++ QPoint transientPos = m_window->geometry().topLeft(); // this is absolute
++ transientPos -= parent_wayland_window->geometry().topLeft();
++ if (parent_wayland_window->decoration()) {
++ transientPos.setX(transientPos.x() + parent_wayland_window->decoration()->margins().left());
++ transientPos.setY(transientPos.y() + parent_wayland_window->decoration()->margins().top());
++ }
++
++ set_popup(device->wl_seat(), serial, parent_wayland_window->object(),
++ transientPos.x(), transientPos.y(), 0);
++}
++
++void QWaylandWlShellSurface::shell_surface_ping(uint32_t serial)
++{
++ pong(serial);
++}
++
++void QWaylandWlShellSurface::shell_surface_configure(uint32_t edges,
++ int32_t width,
++ int32_t height)
++{
++ m_window->configure(edges, width, height);
++}
++
++void QWaylandWlShellSurface::shell_surface_popup_done()
++{
++ QCoreApplication::postEvent(m_window->window(), new QCloseEvent());
++}
++
++QT_END_NAMESPACE
+diff --git a/src/client/qwaylandwlshellsurface_p.h b/src/client/qwaylandwlshellsurface_p.h
+new file mode 100644
+index 0000000..d02bb7b
+--- /dev/null
++++ b/src/client/qwaylandwlshellsurface_p.h
+@@ -0,0 +1,101 @@
++/****************************************************************************
++**
++** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
++** Contact: http://www.qt-project.org/legal
++**
++** This file is part of the config.tests of the Qt Toolkit.
++**
++** $QT_BEGIN_LICENSE:LGPL$
++** Commercial License Usage
++** Licensees holding valid commercial Qt licenses may use this file in
++** accordance with the commercial license agreement provided with the
++** Software or, alternatively, in accordance with the terms contained in
++** a written agreement between you and Digia. For licensing terms and
++** conditions see http://qt.digia.com/licensing. For further information
++** use the contact form at http://qt.digia.com/contact-us.
++**
++** GNU Lesser General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU Lesser
++** General Public License version 2.1 as published by the Free Software
++** Foundation and appearing in the file LICENSE.LGPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU Lesser General Public License version 2.1 requirements
++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
++**
++** In addition, as a special exception, Digia gives you certain additional
++** rights. These rights are described in the Digia Qt LGPL Exception
++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
++**
++** GNU General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU
++** General Public License version 3.0 as published by the Free Software
++** Foundation and appearing in the file LICENSE.GPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU General Public License version 3.0 requirements will be
++** met: http://www.gnu.org/copyleft/gpl.html.
++**
++**
++** $QT_END_LICENSE$
++**
++****************************************************************************/
++
++#ifndef QWAYLANDWLSHELLSURFACE_H
++#define QWAYLANDWLSHELLSURFACE_H
++
++#include <QtCore/QSize>
++
++#include <wayland-client.h>
++
++#include <QtWaylandClient/private/qwayland-wayland.h>
++#include <QtWaylandClient/private/qwaylandclientexport_p.h>
++#include "qwaylandshellsurface_p.h"
++
++QT_BEGIN_NAMESPACE
++
++class QWaylandWindow;
++class QWaylandInputDevice;
++class QWindow;
++
++class Q_WAYLAND_CLIENT_EXPORT QWaylandWlShellSurface : public QtWayland::wl_shell_surface
++ , public QWaylandShellSurface
++{
++public:
++ QWaylandWlShellSurface(struct ::wl_shell_surface *shell_surface, QWaylandWindow *window);
++ virtual ~QWaylandWlShellSurface();
++
++ using QtWayland::wl_shell_surface::resize;
++ void resize(QWaylandInputDevice *inputDevice, enum wl_shell_surface_resize edges) Q_DECL_OVERRIDE;
++
++ using QtWayland::wl_shell_surface::move;
++ void move(QWaylandInputDevice *inputDevice) Q_DECL_OVERRIDE;
++
++ void setTitle(const QString & title) Q_DECL_OVERRIDE;
++ void setAppId(const QString &appId) Q_DECL_OVERRIDE;
++
++private:
++ void setMaximized() Q_DECL_OVERRIDE;
++ void setFullscreen() Q_DECL_OVERRIDE;
++ void setNormal() Q_DECL_OVERRIDE;
++ void setMinimized() Q_DECL_OVERRIDE;
++
++ void setTopLevel() Q_DECL_OVERRIDE;
++ void updateTransientParent(QWindow *parent) Q_DECL_OVERRIDE;
++ void setPopup(QWaylandWindow *parent, QWaylandInputDevice *device, int serial);
++
++ QWaylandWindow *m_window;
++ bool m_maximized;
++ bool m_fullscreen;
++ QSize m_size;
++
++ void shell_surface_ping(uint32_t serial) Q_DECL_OVERRIDE;
++ void shell_surface_configure(uint32_t edges,
++ int32_t width,
++ int32_t height) Q_DECL_OVERRIDE;
++ void shell_surface_popup_done() Q_DECL_OVERRIDE;
++
++ friend class QWaylandWindow;
++};
++
++QT_END_NAMESPACE
++
++#endif // QWAYLANDSHELLSURFACE_H
+diff --git a/src/client/qwaylandxdgsurface.cpp b/src/client/qwaylandxdgsurface.cpp
+new file mode 100644
+index 0000000..1b8affa
+--- /dev/null
++++ b/src/client/qwaylandxdgsurface.cpp
+@@ -0,0 +1,173 @@
++/****************************************************************************
++**
++** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
++** Contact: http://www.qt-project.org/legal
++**
++** This file is part of the config.tests of the Qt Toolkit.
++**
++** $QT_BEGIN_LICENSE:LGPL$
++** Commercial License Usage
++** Licensees holding valid commercial Qt licenses may use this file in
++** accordance with the commercial license agreement provided with the
++** Software or, alternatively, in accordance with the terms contained in
++** a written agreement between you and Digia. For licensing terms and
++** conditions see http://qt.digia.com/licensing. For further information
++** use the contact form at http://qt.digia.com/contact-us.
++**
++** GNU Lesser General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU Lesser
++** General Public License version 2.1 as published by the Free Software
++** Foundation and appearing in the file LICENSE.LGPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU Lesser General Public License version 2.1 requirements
++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
++**
++** In addition, as a special exception, Digia gives you certain additional
++** rights. These rights are described in the Digia Qt LGPL Exception
++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
++**
++** GNU General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU
++** General Public License version 3.0 as published by the Free Software
++** Foundation and appearing in the file LICENSE.GPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU General Public License version 3.0 requirements will be
++** met: http://www.gnu.org/copyleft/gpl.html.
++**
++**
++** $QT_END_LICENSE$
++**
++****************************************************************************/
++
++#include "qwaylandxdgsurface_p.h"
++
++#include "qwaylanddisplay_p.h"
++#include "qwaylandwindow_p.h"
++#include "qwaylandinputdevice_p.h"
++#include "qwaylanddecoration_p.h"
++#include "qwaylandscreen_p.h"
++
++#include <QtCore/QDebug>
++
++QT_BEGIN_NAMESPACE
++
++QWaylandXdgSurface::QWaylandXdgSurface(struct ::xdg_surface *xdg_surface, QWaylandWindow *window)
++ : QtWayland::xdg_surface(xdg_surface)
++ , m_window(window)
++ , m_maximized(false)
++ , m_minimized(false)
++ , m_fullscreen(false)
++{
++}
++
++QWaylandXdgSurface::~QWaylandXdgSurface()
++{
++ xdg_surface_destroy(object());
++}
++
++void QWaylandXdgSurface::resize(QWaylandInputDevice *inputDevice, enum wl_shell_surface_resize edges)
++{
++ // May need some conversion if types get incompatibles, ATM they're identical
++ enum resize_edge const * const arg = reinterpret_cast<enum resize_edge const * const>(&edges);
++ resize(inputDevice, *arg);
++}
++
++void QWaylandXdgSurface::resize(QWaylandInputDevice *inputDevice, enum resize_edge edges)
++{
++ resize(inputDevice->wl_seat(),
++ inputDevice->serial(),
++ edges);
++}
++
++void QWaylandXdgSurface::move(QWaylandInputDevice *inputDevice)
++{
++ move(inputDevice->wl_seat(),
++ inputDevice->serial());
++}
++
++void QWaylandXdgSurface::setMaximized()
++{
++ m_maximized = true;
++ m_size = m_window->window()->geometry().size();
++ set_maximized();
++}
++
++void QWaylandXdgSurface::setFullscreen()
++{
++ m_fullscreen = true;
++ m_size = m_window->window()->geometry().size();
++ set_fullscreen();
++}
++
++void QWaylandXdgSurface::setNormal()
++{
++ if (m_fullscreen || m_maximized || m_minimized) {
++ if (m_maximized) { unset_maximized(); }
++ if (m_fullscreen) { unset_fullscreen(); }
++
++ m_fullscreen = m_maximized = m_minimized = false;
++ setTopLevel();
++ QMargins m = m_window->frameMargins();
++ m_window->configure(0, m_size.width() + m.left() + m.right(), m_size.height() + m.top() + m.bottom());
++ }
++}
++
++void QWaylandXdgSurface::setMinimized()
++{
++ m_minimized = true;
++ m_size = m_window->window()->geometry().size();
++ set_minimized();
++}
++
++void QWaylandXdgSurface::setTopLevel()
++{
++ // There's no xdg_shell_surface API for this, ignoring
++}
++
++void QWaylandXdgSurface::updateTransientParent(QWindow *parent)
++{
++ QWaylandWindow *parent_wayland_window = static_cast<QWaylandWindow *>(parent->handle());
++ if (!parent_wayland_window)
++ return;
++
++ // set_transient expects a position relative to the parent
++ QPoint transientPos = m_window->geometry().topLeft(); // this is absolute
++ QWindow *parentWin = m_window->window()->transientParent();
++ transientPos -= parentWin->geometry().topLeft();
++ if (parent_wayland_window->decoration()) {
++ transientPos.setX(transientPos.x() + parent_wayland_window->decoration()->margins().left());
++ transientPos.setY(transientPos.y() + parent_wayland_window->decoration()->margins().top());
++ }
++
++ uint32_t flags = 0;
++ Qt::WindowFlags wf = m_window->window()->flags();
++ if (wf.testFlag(Qt::ToolTip)
++ || wf.testFlag(Qt::WindowTransparentForInput))
++ flags |= XDG_SURFACE_SET_TRANSIENT_FOR;
++
++ set_transient_for(parent_wayland_window->object());
++}
++
++void QWaylandXdgSurface::setTitle(const QString & title)
++{
++ return QtWayland::xdg_surface::set_title(title);
++}
++
++void QWaylandXdgSurface::setAppId(const QString & appId)
++{
++ return QtWayland::xdg_surface::set_app_id(appId);
++}
++
++void QWaylandXdgSurface::xdg_surface_ping(uint32_t serial)
++{
++ pong(serial);
++}
++
++void QWaylandXdgSurface::xdg_surface_configure(uint32_t edges, int32_t width,
++ int32_t height)
++{
++ m_window->configure(edges, width, height);
++}
++
++
++QT_END_NAMESPACE
+diff --git a/src/client/qwaylandxdgsurface_p.h b/src/client/qwaylandxdgsurface_p.h
+new file mode 100644
+index 0000000..744d3f3
+--- /dev/null
++++ b/src/client/qwaylandxdgsurface_p.h
+@@ -0,0 +1,105 @@
++/****************************************************************************
++**
++** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
++** Contact: http://www.qt-project.org/legal
++**
++** This file is part of the config.tests of the Qt Toolkit.
++**
++** $QT_BEGIN_LICENSE:LGPL$
++** Commercial License Usage
++** Licensees holding valid commercial Qt licenses may use this file in
++** accordance with the commercial license agreement provided with the
++** Software or, alternatively, in accordance with the terms contained in
++** a written agreement between you and Digia. For licensing terms and
++** conditions see http://qt.digia.com/licensing. For further information
++** use the contact form at http://qt.digia.com/contact-us.
++**
++** GNU Lesser General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU Lesser
++** General Public License version 2.1 as published by the Free Software
++** Foundation and appearing in the file LICENSE.LGPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU Lesser General Public License version 2.1 requirements
++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
++**
++** In addition, as a special exception, Digia gives you certain additional
++** rights. These rights are described in the Digia Qt LGPL Exception
++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
++**
++** GNU General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU
++** General Public License version 3.0 as published by the Free Software
++** Foundation and appearing in the file LICENSE.GPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU General Public License version 3.0 requirements will be
++** met: http://www.gnu.org/copyleft/gpl.html.
++**
++**
++** $QT_END_LICENSE$
++**
++****************************************************************************/
++
++#ifndef QWAYLANDXDGSURFACE_H
++#define QWAYLANDXDGSURFACE_H
++
++#include <QtCore/QSize>
++
++#include <wayland-client.h>
++
++#include <QtWaylandClient/private/qwayland-xdg-shell.h>
++#include <QtWaylandClient/private/qwaylandclientexport_p.h>
++#include "qwaylandshellsurface_p.h"
++
++QT_BEGIN_NAMESPACE
++
++class QWaylandWindow;
++class QWaylandInputDevice;
++class QWindow;
++
++class Q_WAYLAND_CLIENT_EXPORT QWaylandXdgSurface : public QtWayland::xdg_surface
++ , public QWaylandShellSurface
++{
++public:
++ QWaylandXdgSurface(struct ::xdg_surface *shell_surface, QWaylandWindow *window);
++ virtual ~QWaylandXdgSurface();
++
++ using QtWayland::xdg_surface::resize;
++ void resize(QWaylandInputDevice *inputDevice, enum resize_edge edges);
++
++ void resize(QWaylandInputDevice *inputDevice, enum wl_shell_surface_resize edges) Q_DECL_OVERRIDE;
++
++ using QtWayland::xdg_surface::move;
++ void move(QWaylandInputDevice *inputDevice) Q_DECL_OVERRIDE;
++
++ void setTitle(const QString &title) Q_DECL_OVERRIDE;
++ void setAppId(const QString &appId) Q_DECL_OVERRIDE;
++
++ bool isFullscreen() const { return m_fullscreen; }
++ bool isMaximized() const { return m_maximized; }
++
++private:
++ void setMaximized() Q_DECL_OVERRIDE;
++ void setFullscreen() Q_DECL_OVERRIDE;
++ void setNormal() Q_DECL_OVERRIDE;
++ void setMinimized() Q_DECL_OVERRIDE;
++
++ void setTopLevel() Q_DECL_OVERRIDE;
++ void updateTransientParent(QWindow *parent) Q_DECL_OVERRIDE;
++
++private:
++ QWaylandWindow *m_window;
++ bool m_maximized;
++ bool m_minimized;
++ bool m_fullscreen;
++ QSize m_size;
++
++ void xdg_surface_ping(uint32_t serial) Q_DECL_OVERRIDE;
++ void xdg_surface_configure(uint32_t edges,
++ int32_t width,
++ int32_t height) Q_DECL_OVERRIDE;
++ friend class QWaylandWindow;
++};
++
++QT_END_NAMESPACE
++
++#endif // QWAYLANDXDGSURFACE_H
+--
+1.9.1
+
diff --git a/recipes-qt/qt/qtwayland/0019-xdg-shell-upgrade-to-support-current-version-weston-.patch b/recipes-qt/qt/qtwayland/0019-xdg-shell-upgrade-to-support-current-version-weston-.patch
new file mode 100644
index 00000000..8f0425a7
--- /dev/null
+++ b/recipes-qt/qt/qtwayland/0019-xdg-shell-upgrade-to-support-current-version-weston-.patch
@@ -0,0 +1,772 @@
+From c4219cca0febd7119e0bec776fdc2877b3448e0b Mon Sep 17 00:00:00 2001
+From: Philippe Coval <philippe.coval@open.eurogiciel.org>
+Date: Tue, 10 Jun 2014 16:22:17 +0200
+Subject: [PATCH 19/21] xdg-shell: upgrade to support current version
+ (weston-1.5.0)
+
+The protocol file is a raw copy of
+
+Source: http://cgit.freedesktop.org/wayland/weston/plain/protocol/xdg-shell.xml?id=1.5.0
+
+Task-number: QTBUG-38633/related
+Reviewed-by: Giulio Camuffo <giulio.camuffo@jollamobile.com>
+Reviewed-by: Philippe Coval <rzr@gna.org>
+Origin: https://www.qt.gitorious.org/qt/qtwayland/commit/4bac130b97fbaa565aa9883eb302557ef0185d50
+Change-Id: I41ca2f89c09a8b6348ce2fbf6d59f44b4c81ffff
+---
+ src/3rdparty/protocol/xdg-shell.xml | 288 ++++++++++++++++++------------------
+ src/client/client.pro | 2 +
+ src/client/qwaylanddisplay.cpp | 10 +-
+ src/client/qwaylanddisplay_p.h | 5 +-
+ src/client/qwaylandxdgshell.cpp | 77 ++++++++++
+ src/client/qwaylandxdgshell_p.h | 73 +++++++++
+ src/client/qwaylandxdgsurface.cpp | 60 ++++++--
+ src/client/qwaylandxdgsurface_p.h | 11 +-
+ 8 files changed, 364 insertions(+), 162 deletions(-)
+ create mode 100644 src/client/qwaylandxdgshell.cpp
+ create mode 100644 src/client/qwaylandxdgshell_p.h
+
+diff --git a/src/3rdparty/protocol/xdg-shell.xml b/src/3rdparty/protocol/xdg-shell.xml
+index 4e5cff8..79a2831 100644
+--- a/src/3rdparty/protocol/xdg-shell.xml
++++ b/src/3rdparty/protocol/xdg-shell.xml
+@@ -40,19 +40,22 @@
+
+ <enum name="version">
+ <description summary="latest protocol version">
+- Use this enum to check the protocol version, and it will be updated
+- automatically.
++ The 'current' member of this enum gives the version of the
++ protocol. Implementations can compare this to the version
++ they implement using static_assert to ensure the protocol and
++ implementation versions match.
+ </description>
+- <entry name="current" value="1" summary="Always the latest version"/>
++ <entry name="current" value="3" summary="Always the latest version"/>
+ </enum>
+
+
+ <request name="use_unstable_version">
+ <description summary="enable use of this unstable version">
+- Use this request in order to enable use of this interface.
+-
+- Understand and agree that one is using an unstable interface,
+- that will likely change in the future, breaking the API.
++ Negotiate the unstable version of the interface. This
++ mechanism is in place to ensure client and server agree on the
++ unstable versions of the protocol that they speak or exit
++ cleanly if they don't agree. This request will go away once
++ the xdg-shell protocol is stable.
+ </description>
+ <arg name="version" type="int"/>
+ </request>
+@@ -84,6 +87,28 @@
+ <arg name="y" type="int"/>
+ <arg name="flags" type="uint"/>
+ </request>
++
++ <event name="ping">
++ <description summary="check if the client is alive">
++ The ping event asks the client if it's still alive. Pass the
++ serial specified in the event back to the compositor by sending
++ a "pong" request back with the specified serial.
++
++ Compositors can use this to determine if the client is still
++ alive. It's unspecified what will happen if the client doesn't
++ respond to the ping request, or in what timeframe. Clients should
++ try to respond in a reasonable amount of time.
++ </description>
++ <arg name="serial" type="uint" summary="pass this to the callback"/>
++ </event>
++
++ <request name="pong">
++ <description summary="respond to a ping event">
++ A client must respond to a ping event with a pong request or
++ the client may be deemed unresponsive.
++ </description>
++ <arg name="serial" type="uint" summary="serial of the ping event"/>
++ </request>
+ </interface>
+
+ <interface name="xdg_surface" version="1">
+@@ -124,6 +149,32 @@
+ <arg name="parent" type="object" interface="wl_surface" allow-null="true"/>
+ </request>
+
++ <request name="set_margin">
++ <description summary="set the visible frame boundaries">
++ This tells the compositor what the visible size of the window
++ should be, so it can use it to determine what borders to use for
++ constrainment and alignment.
++
++ CSD often has invisible areas for decoration purposes, like drop
++ shadows. These "shadow" drawings need to be subtracted out of the
++ normal boundaries of the window when computing where to place
++ windows (e.g. to set this window so it's centered on top of another,
++ or to put it to the left or right of the screen.)
++
++ This value should change as little as possible at runtime, to
++ prevent flicker.
++
++ This value is also ignored when the window is maximized or
++ fullscreen, and assumed to be 0.
++
++ If never called, this value is assumed to be 0.
++ </description>
++ <arg name="left_margin" type="int"/>
++ <arg name="right_margin" type="int"/>
++ <arg name="top_margin" type="int"/>
++ <arg name="bottom_margin" type="int"/>
++ </request>
++
+ <request name="set_title">
+ <description summary="set surface title">
+ Set a short title for the surface.
+@@ -150,22 +201,6 @@
+ <arg name="app_id" type="string"/>
+ </request>
+
+- <request name="pong">
+- <description summary="respond to a ping event">
+- A client must respond to a ping event with a pong request or
+- the client may be deemed unresponsive.
+- </description>
+- <arg name="serial" type="uint" summary="serial of the ping event"/>
+- </request>
+-
+- <event name="ping">
+- <description summary="ping client">
+- Ping a client to check if it is receiving events and sending
+- requests. A client is expected to reply with a pong request.
+- </description>
+- <arg name="serial" type="uint"/>
+- </event>
+-
+ <request name="move">
+ <description summary="start an interactive move">
+ Start a pointer-driven move of the surface.
+@@ -217,12 +252,6 @@
+ ignore it if it doesn't resize, pick a smaller size (to
+ satisfy aspect ratio or resize in steps of NxM pixels).
+
+- The edges parameter provides a hint about how the surface
+- was resized. The client may use this information to decide
+- how to adjust its content to the new size (e.g. a scrolling
+- area might adjust its content position to leave the viewable
+- content unmoved). Valid edge values are from resize_edge enum.
+-
+ The client is free to dismiss all but the last configure
+ event it received.
+
+@@ -230,7 +259,6 @@
+ in surface local coordinates.
+ </description>
+
+- <arg name="edges" type="uint"/>
+ <arg name="width" type="int"/>
+ <arg name="height" type="int"/>
+ </event>
+@@ -250,128 +278,122 @@
+ <arg name="output" type="object" interface="wl_output" allow-null="true"/>
+ </request>
+
+- <event name="request_set_fullscreen">
+- <description summary="server requests that the client set fullscreen">
+- Event sent from the compositor to the client requesting that the client
+- goes to a fullscreen state. It's the client job to call set_fullscreen
+- and really trigger the fullscreen state.
+- </description>
+- </event>
+-
+- <event name="request_unset_fullscreen">
+- <description summary="server requests that the client unset fullscreen">
+- Event sent from the compositor to the client requesting that the client
+- leaves the fullscreen state. It's the client job to call
+- unset_fullscreen and really leave the fullscreen state.
+- </description>
+- </event>
++ <enum name="state">
++ <description summary="types of state on the surface">
++ The different state values used on the surface. This is designed for
++ state values like maximized, fullscreen. It is paired with the
++ request_change_state event to ensure that both the client and the
++ compositor setting the state can be synchronized.
+
+- <request name="set_fullscreen">
+- <description summary="set the surface state as fullscreen">
+- Set the surface as fullscreen.
++ States set in this way are double-buffered. They will get applied on
++ the next commit.
+
+- After this request, the compositor should send a configure event
+- informing the output size.
++ Desktop environments may extend this enum by taking up a range of
++ values and documenting the range they chose in this description.
++ They are not required to document the values for the range that they
++ chose. Ideally, any good extensions from a desktop environment should
++ make its way into standardization into this enum.
+
+- This request informs the compositor that the next attached buffer
+- committed will be in a fullscreen state. The buffer size should be the
+- same size as the size informed in the configure event, if the client
+- doesn't want to leave any empty area.
++ The current reserved ranges are:
+
+- In other words: the next attached buffer after set_maximized is the new
+- maximized buffer. And the surface will be positioned at the maximized
+- position on commit.
+-
+- A simple way to synchronize and wait for the correct configure event is
+- to use a wl_display.sync request right after the set_fullscreen
+- request. When the sync callback returns, the last configure event
+- received just before it will be the correct one, and should contain the
+- right size for the surface to maximize.
+-
+- Setting one state won't unset another state. Use
+- xdg_surface.unset_fullscreen for unsetting it.
++ 0x0000 - 0x0FFF: xdg-shell core values, documented below.
++ 0x1000 - 0x1FFF: GNOME
+ </description>
+- </request>
++ <entry name="maximized" value="1" summary="the surface is maximized">
++ A non-zero value indicates the surface is maximized. Otherwise,
++ the surface is unmaximized.
++ </entry>
++ <entry name="fullscreen" value="2" summary="the surface is fullscreen">
++ A non-zero value indicates the surface is fullscreen. Otherwise,
++ the surface is not fullscreen.
++ </entry>
++ </enum>
+
+- <request name="unset_fullscreen">
+- <description summary="unset the surface state as fullscreen">
+- Unset the surface fullscreen state.
++ <request name="request_change_state">
++ <description summary="client requests to change a surface's state">
++ This asks the compositor to change the state. If the compositor wants
++ to change the state, it will send a change_state event with the same
++ state_type, value, and serial, and the event flow continues as if it
++ it was initiated by the compositor.
+
+- Same negotiation as set_fullscreen must be used.
++ If the compositor does not want to change the state, it will send a
++ change_state to the client with the old value of the state.
+ </description>
++ <arg name="state_type" type="uint" summary="the state to set"/>
++ <arg name="value" type="uint" summary="the value to change the state to"/>
++ <arg name="serial" type="uint" summary="an event serial">
++ This serial is so the client can know which change_state event corresponds
++ to which request_change_state request it sent out.
++ </arg>
+ </request>
+
+- <event name="request_set_maximized">
+- <description summary="server requests that the client set maximized">
+- Event sent from the compositor to the client requesting that the client
+- goes to a maximized state. It's the client job to call set_maximized
+- and really trigger the maximized state.
++ <event name="change_state">
++ <description summary="compositor wants to change a surface's state">
++ This event tells the client to change a surface's state. The client
++ should respond with an ack_change_state request to the compositor to
++ guarantee that the compositor knows that the client has seen it.
+ </description>
+- </event>
+
+- <event name="request_unset_maximized">
+- <description summary="server requests that the client unset maximized">
+- Event sent from the compositor to the client requesting that the client
+- leaves the maximized state. It's the client job to call unset_maximized
+- and really leave the maximized state.
+- </description>
++ <arg name="state_type" type="uint" summary="the state to set"/>
++ <arg name="value" type="uint" summary="the value to change the state to"/>
++ <arg name="serial" type="uint" summary="a serial for the compositor's own tracking"/>
+ </event>
+
+- <request name="set_maximized">
+- <description summary="set the surface state as maximized">
+- Set the surface as maximized.
+-
+- After this request, the compositor will send a configure event
+- informing the output size minus panel and other MW decorations.
+-
+- This request informs the compositor that the next attached buffer
+- committed will be in a maximized state. The buffer size should be the
+- same size as the size informed in the configure event, if the client
+- doesn't want to leave any empty area.
++ <request name="ack_change_state">
++ <description summary="ack a change_state event">
++ When a change_state event is received, a client should then ack it
++ using the ack_change_state request to ensure that the compositor
++ knows the client has seen the event.
+
+- In other words: the next attached buffer after set_maximized is the new
+- maximized buffer. And the surface will be positioned at the maximized
+- position on commit.
++ By this point, the state is confirmed, and the next attach should
++ contain the buffer drawn for the new state value.
+
+- A simple way to synchronize and wait for the correct configure event is
+- to use a wl_display.sync request right after the set_maximized request.
+- When the sync callback returns, the last configure event received just
+- before it will be the correct one, and should contain the right size
+- for the surface to maximize.
+-
+- Setting one state won't unset another state. Use
+- xdg_surface.unset_maximized for unsetting it.
++ The values here need to be the same as the values in the cooresponding
++ change_state event.
+ </description>
++ <arg name="state_type" type="uint" summary="the state to set"/>
++ <arg name="value" type="uint" summary="the value to change the state to"/>
++ <arg name="serial" type="uint" summary="a serial to pass to change_state"/>
+ </request>
+
+- <request name="unset_maximized">
+- <description summary="unset the surface state as maximized">
+- Unset the surface maximized state.
+-
+- Same negotiation as set_maximized must be used.
++ <request name="set_minimized">
++ <description summary="minimize the surface">
++ Minimize the surface.
+ </description>
+ </request>
+
+- <request name="set_minimized">
+- <description summary="set the surface state as minimized">
+- Set the surface minimized state.
+-
+- Setting one state won't unset another state.
++ <event name="activated">
++ <description summary="surface was activated">
++ The activated_set event is sent when this surface has been
++ activated, which means that the surface has user attention.
++ Window decorations should be updated accordingly. You should
++ not use this event for anything but the style of decorations
++ you display, use wl_keyboard.enter and wl_keyboard.leave for
++ determining keyboard focus.
+ </description>
+- </request>
++ </event>
+
+- <event name="focused_set">
+- <description summary="surface was focused">
+- The focused_set event is sent when this surface has been
+- activated. Window decorations should be updated accordingly.
++ <event name="deactivated">
++ <description summary="surface was deactivated">
++ The deactivate event is sent when this surface has been
++ deactivated, which means that the surface lost user attention.
++ Window decorations should be updated accordingly. You should
++ not use this event for anything but the style of decorations
++ you display, use wl_keyboard.enter and wl_keyboard.leave for
++ determining keyboard focus.
+ </description>
+ </event>
+
+- <event name="focused_unset">
+- <description summary="surface was unfocused">
+- The focused_unset event is sent when this surface has been
+- deactivated, because another surface has been activated. Window
+- decorations should be updated accordingly.
++ <event name="close">
++ <description summary="surface wants to be closed">
++ The close event is sent by the compositor when the user
++ wants the surface to be closed. This should be equivalent to
++ the user clicking the close button in client-side decorations,
++ if your application has any...
++
++ This is only a request that the user intends to close your
++ window. The client may choose to ignore this request, or show
++ a dialog to ask the user to save their data...
+ </description>
+ </event>
+ </interface>
+@@ -409,22 +431,6 @@
+ </description>
+ </request>
+
+- <request name="pong">
+- <description summary="respond to a ping event">
+- A client must respond to a ping event with a pong request or
+- the client may be deemed unresponsive.
+- </description>
+- <arg name="serial" type="uint" summary="serial of the ping event"/>
+- </request>
+-
+- <event name="ping">
+- <description summary="ping client">
+- Ping a client to check if it is receiving events and sending
+- requests. A client is expected to reply with a pong request.
+- </description>
+- <arg name="serial" type="uint"/>
+- </event>
+-
+ <event name="popup_done">
+ <description summary="popup interaction is done">
+ The popup_done event is sent out when a popup grab is broken,
+diff --git a/src/client/client.pro b/src/client/client.pro
+index 9ecf82f..73e3b7f 100644
+--- a/src/client/client.pro
++++ b/src/client/client.pro
+@@ -59,6 +59,7 @@ SOURCES += qwaylandintegration.cpp \
+ qwaylanddatasource.cpp \
+ qwaylandshellsurface.cpp \
+ qwaylandwlshellsurface.cpp \
++ qwaylandxdgshell.cpp \
+ qwaylandxdgsurface.cpp \
+ qwaylandextendedoutput.cpp \
+ qwaylandextendedsurface.cpp \
+@@ -89,6 +90,7 @@ HEADERS += qwaylandintegration_p.h \
+ qwaylanddatasource_p.h \
+ qwaylandshellsurface_p.h \
+ qwaylandwlshellsurface_p.h \
++ qwaylandxdgshell_p.h \
+ qwaylandxdgsurface_p.h \
+ qwaylandextendedoutput_p.h \
+ qwaylandextendedsurface_p.h \
+diff --git a/src/client/qwaylanddisplay.cpp b/src/client/qwaylanddisplay.cpp
+index 7f953ad..2e25672 100644
+--- a/src/client/qwaylanddisplay.cpp
++++ b/src/client/qwaylanddisplay.cpp
+@@ -50,7 +50,7 @@
+ #include "qwaylandclipboard_p.h"
+ #include "qwaylanddatadevicemanager_p.h"
+ #include "qwaylandhardwareintegration_p.h"
+-
++#include "qwaylandxdgshell_p.h"
+
+ #include "qwaylandwindowmanagerintegration_p.h"
+
+@@ -209,8 +209,7 @@ void QWaylandDisplay::registry_global(uint32_t id, const QString &interface, uin
+ mShm = static_cast<struct wl_shm *>(wl_registry_bind(registry, id, &wl_shm_interface,1));
+ } else if (interface == QStringLiteral("xdg_shell")
+ && qEnvironmentVariableIsSet("QT_WAYLAND_USE_XDG_SHELL")) {
+- mShellXdg.reset(new QtWayland::xdg_shell(registry, id));
+- mShellXdg->use_unstable_version(QtWayland::xdg_shell::version_current);
++ mShellXdg.reset(new QWaylandXdgShell(registry,id));
+ } else if (interface == QStringLiteral("wl_shell")){
+ mShell.reset(new QtWayland::wl_shell(registry, id));
+ } else if (interface == QStringLiteral("wl_seat")) {
+@@ -275,4 +274,9 @@ void QWaylandDisplay::forceRoundTrip()
+ wl_display_roundtrip(mDisplay);
+ }
+
++QtWayland::xdg_shell *QWaylandDisplay::shellXdg()
++{
++ return mShellXdg.data();
++}
++
+ QT_END_NAMESPACE
+diff --git a/src/client/qwaylanddisplay_p.h b/src/client/qwaylanddisplay_p.h
+index cf5dfc2..f1b35a7 100644
+--- a/src/client/qwaylanddisplay_p.h
++++ b/src/client/qwaylanddisplay_p.h
+@@ -72,6 +72,7 @@ class QWaylandWindow;
+ class QWaylandEventThread;
+ class QWaylandIntegration;
+ class QWaylandHardwareIntegration;
++class QWaylandXdgShell;
+
+ namespace QtWayland {
+ class qt_output_extension;
+@@ -115,7 +116,7 @@ public:
+ QtWayland::wl_compositor *compositor() { return &mCompositor; }
+
+ QtWayland::wl_shell *shell() { return mShell.data(); }
+- QtWayland::xdg_shell *shellXdg() { return mShellXdg.data(); }
++ QtWayland::xdg_shell *shellXdg();
+
+ QList<QWaylandInputDevice *> inputDevices() const { return mInputDevices; }
+ QWaylandInputDevice *defaultInputDevice() const;
+@@ -171,7 +172,7 @@ private:
+ QThread *mEventThread;
+ QWaylandEventThread *mEventThreadObject;
+ QScopedPointer<QtWayland::wl_shell> mShell;
+- QScopedPointer<QtWayland::xdg_shell> mShellXdg;
++ QScopedPointer<QWaylandXdgShell> mShellXdg;
+ QList<QPlatformScreen *> mScreens;
+ QList<QWaylandInputDevice *> mInputDevices;
+ QList<Listener> mRegistryListeners;
+diff --git a/src/client/qwaylandxdgshell.cpp b/src/client/qwaylandxdgshell.cpp
+new file mode 100644
+index 0000000..eb9f91c
+--- /dev/null
++++ b/src/client/qwaylandxdgshell.cpp
+@@ -0,0 +1,77 @@
++/****************************************************************************
++**
++** Copyright (C) 2014 Eurogiciel, author: <philippe.coval@eurogiciel.fr>
++** Contact: http://www.qt-project.org/legal
++**
++** This file is part of the config.tests of the Qt Toolkit.
++**
++** $QT_BEGIN_LICENSE:LGPL$
++** Commercial License Usage
++** Licensees holding valid commercial Qt licenses may use this file in
++** accordance with the commercial license agreement provided with the
++** Software or, alternatively, in accordance with the terms contained in
++** a written agreement between you and Digia. For licensing terms and
++** conditions see http://qt.digia.com/licensing. For further information
++** use the contact form at http://qt.digia.com/contact-us.
++**
++** GNU Lesser General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU Lesser
++** General Public License version 2.1 as published by the Free Software
++** Foundation and appearing in the file LICENSE.LGPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU Lesser General Public License version 2.1 requirements
++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
++**
++** In addition, as a special exception, Digia gives you certain additional
++** rights. These rights are described in the Digia Qt LGPL Exception
++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
++**
++** GNU General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU
++** General Public License version 3.0 as published by the Free Software
++** Foundation and appearing in the file LICENSE.GPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU General Public License version 3.0 requirements will be
++** met: http://www.gnu.org/copyleft/gpl.html.
++**
++**
++** $QT_END_LICENSE$
++**
++****************************************************************************/
++
++#include "qwaylandxdgshell_p.h"
++
++#include "qwaylanddisplay_p.h"
++#include "qwaylandwindow_p.h"
++#include "qwaylandinputdevice_p.h"
++#include "qwaylanddecoration_p.h"
++#include "qwaylandscreen_p.h"
++
++#include <QtCore/QDebug>
++
++QT_BEGIN_NAMESPACE
++
++QWaylandXdgShell::QWaylandXdgShell(struct ::xdg_shell *shell)
++ : QtWayland::xdg_shell(shell)
++{
++}
++
++QWaylandXdgShell::QWaylandXdgShell(struct ::wl_registry *registry, uint32_t id)
++ : QtWayland::xdg_shell(registry, id)
++{
++ use_unstable_version(QtWayland::xdg_shell::version_current);
++}
++
++QWaylandXdgShell::~QWaylandXdgShell()
++{
++ xdg_shell_destroy(object());
++}
++
++
++void QWaylandXdgShell::xdg_shell_ping(uint32_t serial)
++{
++ pong(serial);
++}
++
++
++QT_END_NAMESPACE
+diff --git a/src/client/qwaylandxdgshell_p.h b/src/client/qwaylandxdgshell_p.h
+new file mode 100644
+index 0000000..6a396bd
+--- /dev/null
++++ b/src/client/qwaylandxdgshell_p.h
+@@ -0,0 +1,73 @@
++/****************************************************************************
++**
++** Copyright (C) 2014 Eurogiciel, author: <philippe.coval@eurogiciel.fr>
++** Contact: http://www.qt-project.org/legal
++**
++** This file is part of the config.tests of the Qt Toolkit.
++**
++** $QT_BEGIN_LICENSE:LGPL$
++** Commercial License Usage
++** Licensees holding valid commercial Qt licenses may use this file in
++** accordance with the commercial license agreement provided with the
++** Software or, alternatively, in accordance with the terms contained in
++** a written agreement between you and Digia. For licensing terms and
++** conditions see http://qt.digia.com/licensing. For further information
++** use the contact form at http://qt.digia.com/contact-us.
++**
++** GNU Lesser General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU Lesser
++** General Public License version 2.1 as published by the Free Software
++** Foundation and appearing in the file LICENSE.LGPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU Lesser General Public License version 2.1 requirements
++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
++**
++** In addition, as a special exception, Digia gives you certain additional
++** rights. These rights are described in the Digia Qt LGPL Exception
++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
++**
++** GNU General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU
++** General Public License version 3.0 as published by the Free Software
++** Foundation and appearing in the file LICENSE.GPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU General Public License version 3.0 requirements will be
++** met: http://www.gnu.org/copyleft/gpl.html.
++**
++**
++** $QT_END_LICENSE$
++**
++****************************************************************************/
++
++#ifndef QWAYLANDXDGSHELL_H
++#define QWAYLANDXDGSHELL_H
++
++#include <QtCore/QSize>
++
++#include <wayland-client.h>
++
++#include <QtWaylandClient/private/qwayland-xdg-shell.h>
++#include <QtWaylandClient/private/qwaylandclientexport_p.h>
++#include "qwaylandshellsurface_p.h"
++
++QT_BEGIN_NAMESPACE
++
++class QWaylandWindow;
++class QWaylandInputDevice;
++class QWindow;
++
++class Q_WAYLAND_CLIENT_EXPORT QWaylandXdgShell : public QtWayland::xdg_shell
++{
++public:
++ QWaylandXdgShell(struct ::xdg_shell *shell);
++ QWaylandXdgShell(struct ::wl_registry *registry, uint32_t id);
++
++ virtual ~QWaylandXdgShell();
++
++private:
++ void xdg_shell_ping(uint32_t serial) Q_DECL_OVERRIDE;
++};
++
++QT_END_NAMESPACE
++
++#endif // QWAYLANDXDGSHELL_H
+diff --git a/src/client/qwaylandxdgsurface.cpp b/src/client/qwaylandxdgsurface.cpp
+index 1b8affa..5fb74d2 100644
+--- a/src/client/qwaylandxdgsurface.cpp
++++ b/src/client/qwaylandxdgsurface.cpp
+@@ -87,23 +87,25 @@ void QWaylandXdgSurface::move(QWaylandInputDevice *inputDevice)
+
+ void QWaylandXdgSurface::setMaximized()
+ {
+- m_maximized = true;
+- m_size = m_window->window()->geometry().size();
+- set_maximized();
++ if (!m_maximized)
++ request_change_state(XDG_SURFACE_STATE_MAXIMIZED, true, 0);
+ }
+
+ void QWaylandXdgSurface::setFullscreen()
+ {
+- m_fullscreen = true;
+- m_size = m_window->window()->geometry().size();
+- set_fullscreen();
++ if (!m_fullscreen)
++ request_change_state(XDG_SURFACE_STATE_FULLSCREEN, true, 0);
+ }
+
+ void QWaylandXdgSurface::setNormal()
+ {
+ if (m_fullscreen || m_maximized || m_minimized) {
+- if (m_maximized) { unset_maximized(); }
+- if (m_fullscreen) { unset_fullscreen(); }
++ if (m_maximized) {
++ request_change_state(XDG_SURFACE_STATE_MAXIMIZED, false, 0);
++ }
++ if (m_fullscreen) {
++ request_change_state(XDG_SURFACE_STATE_FULLSCREEN, false, 0);
++ }
+
+ m_fullscreen = m_maximized = m_minimized = false;
+ setTopLevel();
+@@ -158,16 +160,48 @@ void QWaylandXdgSurface::setAppId(const QString & appId)
+ return QtWayland::xdg_surface::set_app_id(appId);
+ }
+
+-void QWaylandXdgSurface::xdg_surface_ping(uint32_t serial)
++void QWaylandXdgSurface::xdg_surface_configure(int32_t width, int32_t height)
+ {
+- pong(serial);
++ m_window->configure(0 , width, height);
+ }
+
+-void QWaylandXdgSurface::xdg_surface_configure(uint32_t edges, int32_t width,
+- int32_t height)
++void QWaylandXdgSurface::xdg_surface_change_state(uint32_t state,
++ uint32_t value,
++ uint32_t serial)
+ {
+- m_window->configure(edges, width, height);
++
++ if (state == XDG_SURFACE_STATE_MAXIMIZED
++ || state == XDG_SURFACE_STATE_FULLSCREEN) {
++ if (value) {
++ m_size = m_window->window()->geometry().size();
++ } else {
++ QMargins m = m_window->frameMargins();
++ m_window->configure(0, m_size.width() + m.left() + m.right(), m_size.height() + m.top() + m.bottom());
++ }
++ }
++
++ switch (state) {
++ case XDG_SURFACE_STATE_MAXIMIZED:
++ m_maximized = value;
++ break;
++ case XDG_SURFACE_STATE_FULLSCREEN:
++ m_fullscreen = value;
++ break;
++ }
++
++ xdg_surface_ack_change_state(object(), state, value, serial);
+ }
+
++void QWaylandXdgSurface::xdg_surface_activated()
++{
++}
++
++void QWaylandXdgSurface::xdg_surface_deactivated()
++{
++}
++
++void QWaylandXdgSurface::xdg_surface_close()
++{
++}
+
+ QT_END_NAMESPACE
+diff --git a/src/client/qwaylandxdgsurface_p.h b/src/client/qwaylandxdgsurface_p.h
+index 744d3f3..d2a154e 100644
+--- a/src/client/qwaylandxdgsurface_p.h
++++ b/src/client/qwaylandxdgsurface_p.h
+@@ -93,10 +93,15 @@ private:
+ bool m_fullscreen;
+ QSize m_size;
+
+- void xdg_surface_ping(uint32_t serial) Q_DECL_OVERRIDE;
+- void xdg_surface_configure(uint32_t edges,
+- int32_t width,
++ void xdg_surface_configure(int32_t width,
+ int32_t height) Q_DECL_OVERRIDE;
++ void xdg_surface_change_state(uint32_t state,
++ uint32_t value,
++ uint32_t serial) Q_DECL_OVERRIDE;
++ void xdg_surface_activated() Q_DECL_OVERRIDE;
++ void xdg_surface_deactivated() Q_DECL_OVERRIDE;
++ void xdg_surface_close() Q_DECL_OVERRIDE;
++
+ friend class QWaylandWindow;
+ };
+
+--
+1.9.1
+
diff --git a/recipes-qt/qt/qtwayland/0020-Add-IVI-Shell-protocol-file-version-patch-v6.patch b/recipes-qt/qt/qtwayland/0020-Add-IVI-Shell-protocol-file-version-patch-v6.patch
new file mode 100644
index 00000000..413459fb
--- /dev/null
+++ b/recipes-qt/qt/qtwayland/0020-Add-IVI-Shell-protocol-file-version-patch-v6.patch
@@ -0,0 +1,128 @@
+From b4f032b13338ad6c21024177b031c75063ef7493 Mon Sep 17 00:00:00 2001
+From: Manuel Bachmann <manuel.bachmann@open.eurogiciel.org>
+Date: Sun, 7 Sep 2014 08:19:30 +0200
+Subject: [PATCH 20/21] Add IVI-Shell protocol file version patch v6
+
+Source : http://lists.freedesktop.org/archives/wayland-devel/2014-June/015617.html
+
+This file comes from the last proposed definition of the IVI-Shell protocol,
+and will need to be refreshed on protocol update.
+
+Task-number: QTBUG-XXXXX/part/1of2
+
+Signed-off-by: Manuel Bachmann <manuel.bachmann@open.eurogiciel.org>
+---
+ src/3rdparty/protocol/ivi-application.xml | 101 ++++++++++++++++++++++++++++++
+ 1 file changed, 101 insertions(+)
+ create mode 100644 src/3rdparty/protocol/ivi-application.xml
+
+diff --git a/src/3rdparty/protocol/ivi-application.xml b/src/3rdparty/protocol/ivi-application.xml
+new file mode 100644
+index 0000000..833fd38
+--- /dev/null
++++ b/src/3rdparty/protocol/ivi-application.xml
+@@ -0,0 +1,101 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<protocol name="ivi_application">
++
++ <copyright>
++ Copyright (C) 2013 DENSO CORPORATION
++ Copyright (c) 2013 BMW Car IT GmbH
++
++ Permission is hereby granted, free of charge, to any person obtaining a copy
++ of this software and associated documentation files (the "Software"), to deal
++ in the Software without restriction, including without limitation the rights
++ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
++ copies of the Software, and to permit persons to whom the Software is
++ furnished to do so, subject to the following conditions:
++
++ The above copyright notice and this permission notice shall be included in
++ all copies or substantial portions of the Software.
++
++ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
++ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
++ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
++ THE SOFTWARE.
++ </copyright>
++
++ <interface name="ivi_surface" version="1">
++ <description summary="application interface to surface in ivi compositor"/>
++
++ <request name="destroy" type="destructor">
++ <description summary="destroy ivi_surface">
++ This removes link from ivi_id to wl_surface and destroys ivi_surface.
++ </description>
++ </request>
++
++ <event name="visibility">
++ <description summary="visibility of surface in ivi compositor has changed">
++ The new visibility state is provided in argument visibility.
++ If visibility is 0, the surface has become invisible.
++ If visibility is not 0, the surface has become visible.
++ </description>
++ <arg name="visibility" type="int"/>
++ </event>
++
++ <enum name="warning_code">
++ <description summary="possible warning codes returned by ivi compositor">
++ These define all possible warning codes returned by ivi compositor on server-side warnings.
++ invalid_wl_surface:
++ - wl_surface already has a another role.
++ - wl_surface is destroyed before the ivi_surface is destroyed.
++ ivi_id_in_use: ivi_id is already assigned by another application.
++ </description>
++ <entry name="invalid_wl_surface" value="1" summary="wl_surface is invalid"/>
++ <entry name="ivi_id_in_use" value="2" summary="ivi_id is in use and can not be shared"/>
++ </enum>
++
++ <event name="warning">
++ <description summary="server-side warning detected">
++ The ivi compositor encountered warning while processing a request by this
++ application. The warning is defined by argument warning_code and optional
++ warning_text. If the warning is detected, client shall destroy the ivi_surface
++ object.
++
++ When a warning event is sent, the compositor turns the ivi_surface object inert.
++ The ivi_surface will not deliver further events, all requests on it are ignored
++ except 'destroy', and the association to the ivi_id is removed. The client
++ should destroy the ivi_surface object. If an inert ivi_surface object is used as
++ an argument to any other object's request, that request will [produce a fatal
++ error / produce a warning / be ignored].
++ </description>
++ <arg name="warning_code" type="int"/>
++ <arg name="warning_text" type="string" allow-null="true"/>
++ </event>
++
++ </interface>
++
++ <interface name="ivi_application" version="1">
++ <description summary="create ivi-style surfaces">
++ This interface is implemented by servers that provide desktop-style user interfaces.
++ It allows clients to associate a ivi_surface with a basic surface.
++ </description>
++
++ <request name="surface_create">
++ <description summary="create ivi_surface with numeric ID in ivi compositor">
++ surface_create will create a interface:ivi_surface with numeric ID; ivi_id in
++ ivi compositor. These ivi_ids are defined as unique in the system to identify
++ it inside of ivi compositor. The ivi compositor implements business logic how to
++ set properties of the surface with ivi_id according to status of the system.
++ E.g. a unique ID for Car Navigation application is used for implementing special
++ logic of the application about where it shall be located.
++ if a wl_surface which already has another role is set, the server regards this as
++ error and disconnects the client.
++ </description>
++ <arg name="ivi_id" type="uint"/>
++ <arg name="surface" type="object" interface="wl_surface"/>
++ <arg name="id" type="new_id" interface="ivi_surface"/>
++ </request>
++
++ </interface>
++
++</protocol>
+--
+1.9.1
+
diff --git a/recipes-qt/qt/qtwayland/0021-Implement-initial-IVI-Shell-support.patch b/recipes-qt/qt/qtwayland/0021-Implement-initial-IVI-Shell-support.patch
new file mode 100644
index 00000000..8723def2
--- /dev/null
+++ b/recipes-qt/qt/qtwayland/0021-Implement-initial-IVI-Shell-support.patch
@@ -0,0 +1,539 @@
+From 1ddfa43692cabae0f552351cfbc09377e479471e Mon Sep 17 00:00:00 2001
+From: Manuel Bachmann <manuel.bachmann@open.eurogiciel.org>
+Date: Mon, 8 Sep 2014 11:38:01 +0200
+Subject: [PATCH 21/21] Implement initial IVI-Shell support
+
+IVI-Shell provides a shell interface for Weston, which maps the GENIVI API (http://www.genivi.org) for In-Vehicle Infotainment.
+
+This patch enables detecting the IVI-Shell interface at runtime, and creating compatible surfaces if found.
+
+Task-number: QTBUG-XXXXX/part/2of2
+
+Change-Id: I1f6c11bf56b727a54fb48faab9c076b61d635440
+Signed-off-by: Manuel Bachmann <manuel.bachmann@open.eurogiciel.org>
+---
+ src/client/client.pro | 5 ++
+ src/client/qwaylanddisplay.cpp | 9 ++++
+ src/client/qwaylanddisplay_p.h | 5 ++
+ src/client/qwaylandivishell.cpp | 69 +++++++++++++++++++++++++
+ src/client/qwaylandivishell_p.h | 70 +++++++++++++++++++++++++
+ src/client/qwaylandivisurface.cpp | 105 ++++++++++++++++++++++++++++++++++++++
+ src/client/qwaylandivisurface_p.h | 90 ++++++++++++++++++++++++++++++++
+ src/client/qwaylandwindow.cpp | 8 ++-
+ 8 files changed, 360 insertions(+), 1 deletion(-)
+ create mode 100644 src/client/qwaylandivishell.cpp
+ create mode 100644 src/client/qwaylandivishell_p.h
+ create mode 100644 src/client/qwaylandivisurface.cpp
+ create mode 100644 src/client/qwaylandivisurface_p.h
+
+diff --git a/src/client/client.pro b/src/client/client.pro
+index 73e3b7f..adb526d 100644
+--- a/src/client/client.pro
++++ b/src/client/client.pro
+@@ -42,6 +42,7 @@ WAYLANDCLIENTSOURCES += \
+ ../extensions/windowmanager.xml \
+ ../3rdparty/protocol/text.xml \
+ ../3rdparty/protocol/xdg-shell.xml \
++ ../3rdparty/protocol/ivi-application.xml \
+
+ SOURCES += qwaylandintegration.cpp \
+ qwaylandnativeinterface.cpp \
+@@ -61,6 +62,8 @@ SOURCES += qwaylandintegration.cpp \
+ qwaylandwlshellsurface.cpp \
+ qwaylandxdgshell.cpp \
+ qwaylandxdgsurface.cpp \
++ qwaylandivishell.cpp \
++ qwaylandivisurface.cpp \
+ qwaylandextendedoutput.cpp \
+ qwaylandextendedsurface.cpp \
+ qwaylandsubsurface.cpp \
+@@ -92,6 +95,8 @@ HEADERS += qwaylandintegration_p.h \
+ qwaylandwlshellsurface_p.h \
+ qwaylandxdgshell_p.h \
+ qwaylandxdgsurface_p.h \
++ qwaylandivishell_p.h \
++ qwaylandivisurface_p.h \
+ qwaylandextendedoutput_p.h \
+ qwaylandextendedsurface_p.h \
+ qwaylandsubsurface_p.h \
+diff --git a/src/client/qwaylanddisplay.cpp b/src/client/qwaylanddisplay.cpp
+index 2e25672..2a93db7 100644
+--- a/src/client/qwaylanddisplay.cpp
++++ b/src/client/qwaylanddisplay.cpp
+@@ -51,6 +51,7 @@
+ #include "qwaylanddatadevicemanager_p.h"
+ #include "qwaylandhardwareintegration_p.h"
+ #include "qwaylandxdgshell_p.h"
++#include "qwaylandivishell_p.h"
+
+ #include "qwaylandwindowmanagerintegration_p.h"
+
+@@ -62,6 +63,7 @@
+
+ #include <QtWaylandClient/private/qwayland-text.h>
+ #include <QtWaylandClient/private/qwayland-xdg-shell.h>
++#include <QtWaylandClient/private/qwayland-ivi-application.h>
+
+ #include <QtCore/QAbstractEventDispatcher>
+ #include <QtGui/private/qguiapplication_p.h>
+@@ -207,6 +209,8 @@ void QWaylandDisplay::registry_global(uint32_t id, const QString &interface, uin
+ mCompositor.init(registry, id);
+ } else if (interface == QStringLiteral("wl_shm")) {
+ mShm = static_cast<struct wl_shm *>(wl_registry_bind(registry, id, &wl_shm_interface,1));
++ } else if (interface == QStringLiteral("ivi_application")) {
++ mShellIvi.reset(new QWaylandIviShell(registry,id));
+ } else if (interface == QStringLiteral("xdg_shell")
+ && qEnvironmentVariableIsSet("QT_WAYLAND_USE_XDG_SHELL")) {
+ mShellXdg.reset(new QWaylandXdgShell(registry,id));
+@@ -279,4 +283,9 @@ QtWayland::xdg_shell *QWaylandDisplay::shellXdg()
+ return mShellXdg.data();
+ }
+
++QtWayland::ivi_application *QWaylandDisplay::shellIvi()
++{
++ return mShellIvi.data();
++}
++
+ QT_END_NAMESPACE
+diff --git a/src/client/qwaylanddisplay_p.h b/src/client/qwaylanddisplay_p.h
+index f1b35a7..b9c686c 100644
+--- a/src/client/qwaylanddisplay_p.h
++++ b/src/client/qwaylanddisplay_p.h
+@@ -52,6 +52,7 @@
+ #include <QtWaylandClient/private/qwayland-wayland.h>
+ #include <QtWaylandClient/private/qwaylandclientexport_p.h>
+ #include <QtWaylandClient/private/qwayland-xdg-shell.h>
++#include <QtWaylandClient/private/qwayland-ivi-application.h>
+
+ struct wl_cursor_image;
+
+@@ -72,6 +73,7 @@ class QWaylandWindow;
+ class QWaylandEventThread;
+ class QWaylandIntegration;
+ class QWaylandHardwareIntegration;
++class QWaylandIviShell;
+ class QWaylandXdgShell;
+
+ namespace QtWayland {
+@@ -81,6 +83,7 @@ namespace QtWayland {
+ class qt_surface_extension;
+ class wl_text_input_manager;
+ class xdg_shell;
++ class ivi_application;
+ }
+
+ typedef void (*RegistryListener)(void *data,
+@@ -117,6 +120,7 @@ public:
+
+ QtWayland::wl_shell *shell() { return mShell.data(); }
+ QtWayland::xdg_shell *shellXdg();
++ QtWayland::ivi_application *shellIvi();
+
+ QList<QWaylandInputDevice *> inputDevices() const { return mInputDevices; }
+ QWaylandInputDevice *defaultInputDevice() const;
+@@ -173,6 +177,7 @@ private:
+ QWaylandEventThread *mEventThreadObject;
+ QScopedPointer<QtWayland::wl_shell> mShell;
+ QScopedPointer<QWaylandXdgShell> mShellXdg;
++ QScopedPointer<QWaylandIviShell> mShellIvi;
+ QList<QPlatformScreen *> mScreens;
+ QList<QWaylandInputDevice *> mInputDevices;
+ QList<Listener> mRegistryListeners;
+diff --git a/src/client/qwaylandivishell.cpp b/src/client/qwaylandivishell.cpp
+new file mode 100644
+index 0000000..9d63d0d
+--- /dev/null
++++ b/src/client/qwaylandivishell.cpp
+@@ -0,0 +1,69 @@
++/****************************************************************************
++**
++** Copyright (C) 2014 Eurogiciel, author: <manuel.bachmann@open.eurogiciel.org>
++** Contact: http://www.qt-project.org/legal
++**
++** This file is part of the config.tests of the Qt Toolkit.
++**
++** $QT_BEGIN_LICENSE:LGPL$
++** Commercial License Usage
++** Licensees holding valid commercial Qt licenses may use this file in
++** accordance with the commercial license agreement provided with the
++** Software or, alternatively, in accordance with the terms contained in
++** a written agreement between you and Digia. For licensing terms and
++** conditions see http://qt.digia.com/licensing. For further information
++** use the contact form at http://qt.digia.com/contact-us.
++**
++** GNU Lesser General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU Lesser
++** General Public License version 2.1 as published by the Free Software
++** Foundation and appearing in the file LICENSE.LGPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU Lesser General Public License version 2.1 requirements
++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
++**
++** In addition, as a special exception, Digia gives you certain additional
++** rights. These rights are described in the Digia Qt LGPL Exception
++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
++**
++** GNU General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU
++** General Public License version 3.0 as published by the Free Software
++** Foundation and appearing in the file LICENSE.GPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU General Public License version 3.0 requirements will be
++** met: http://www.gnu.org/copyleft/gpl.html.
++**
++**
++** $QT_END_LICENSE$
++**
++****************************************************************************/
++
++#include "qwaylandivishell_p.h"
++
++#include "qwaylanddisplay_p.h"
++#include "qwaylandwindow_p.h"
++#include "qwaylandinputdevice_p.h"
++#include "qwaylanddecoration_p.h"
++#include "qwaylandscreen_p.h"
++
++#include <QtCore/QDebug>
++
++QT_BEGIN_NAMESPACE
++
++QWaylandIviShell::QWaylandIviShell(struct ::ivi_application *shell)
++ : QtWayland::ivi_application(shell)
++{
++}
++
++QWaylandIviShell::QWaylandIviShell(struct ::wl_registry *registry, uint32_t id)
++ : QtWayland::ivi_application(registry, id)
++{
++}
++
++QWaylandIviShell::~QWaylandIviShell()
++{
++ ivi_application_destroy(object());
++}
++
++QT_END_NAMESPACE
+diff --git a/src/client/qwaylandivishell_p.h b/src/client/qwaylandivishell_p.h
+new file mode 100644
+index 0000000..f9f6983
+--- /dev/null
++++ b/src/client/qwaylandivishell_p.h
+@@ -0,0 +1,70 @@
++/****************************************************************************
++**
++** Copyright (C) 2014 Eurogiciel, author: <manuel.bachmann@open.eurogiciel.org>
++** Contact: http://www.qt-project.org/legal
++**
++** This file is part of the config.tests of the Qt Toolkit.
++**
++** $QT_BEGIN_LICENSE:LGPL$
++** Commercial License Usage
++** Licensees holding valid commercial Qt licenses may use this file in
++** accordance with the commercial license agreement provided with the
++** Software or, alternatively, in accordance with the terms contained in
++** a written agreement between you and Digia. For licensing terms and
++** conditions see http://qt.digia.com/licensing. For further information
++** use the contact form at http://qt.digia.com/contact-us.
++**
++** GNU Lesser General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU Lesser
++** General Public License version 2.1 as published by the Free Software
++** Foundation and appearing in the file LICENSE.LGPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU Lesser General Public License version 2.1 requirements
++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
++**
++** In addition, as a special exception, Digia gives you certain additional
++** rights. These rights are described in the Digia Qt LGPL Exception
++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
++**
++** GNU General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU
++** General Public License version 3.0 as published by the Free Software
++** Foundation and appearing in the file LICENSE.GPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU General Public License version 3.0 requirements will be
++** met: http://www.gnu.org/copyleft/gpl.html.
++**
++**
++** $QT_END_LICENSE$
++**
++****************************************************************************/
++
++#ifndef QWAYLANDIVISHELL_H
++#define QWAYLANDIVISHELL_H
++
++#include <QtCore/QSize>
++
++#include <wayland-client.h>
++
++#include <QtWaylandClient/private/qwayland-ivi-application.h>
++#include <QtWaylandClient/private/qwaylandclientexport_p.h>
++#include "qwaylandshellsurface_p.h"
++
++QT_BEGIN_NAMESPACE
++
++class QWaylandWindow;
++class QWaylandInputDevice;
++class QWindow;
++
++class Q_WAYLAND_CLIENT_EXPORT QWaylandIviShell : public QtWayland::ivi_application
++{
++public:
++ QWaylandIviShell(struct ::ivi_application *shell);
++ QWaylandIviShell(struct ::wl_registry *registry, uint32_t id);
++
++ virtual ~QWaylandIviShell();
++};
++
++QT_END_NAMESPACE
++
++#endif // QWAYLANDIVISHELL_H
+diff --git a/src/client/qwaylandivisurface.cpp b/src/client/qwaylandivisurface.cpp
+new file mode 100644
+index 0000000..a12309e
+--- /dev/null
++++ b/src/client/qwaylandivisurface.cpp
+@@ -0,0 +1,105 @@
++/****************************************************************************
++**
++** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
++** Contact: http://www.qt-project.org/legal
++**
++** This file is part of the config.tests of the Qt Toolkit.
++**
++** $QT_BEGIN_LICENSE:LGPL$
++** Commercial License Usage
++** Licensees holding valid commercial Qt licenses may use this file in
++** accordance with the commercial license agreement provided with the
++** Software or, alternatively, in accordance with the terms contained in
++** a written agreement between you and Digia. For licensing terms and
++** conditions see http://qt.digia.com/licensing. For further information
++** use the contact form at http://qt.digia.com/contact-us.
++**
++** GNU Lesser General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU Lesser
++** General Public License version 2.1 as published by the Free Software
++** Foundation and appearing in the file LICENSE.LGPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU Lesser General Public License version 2.1 requirements
++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
++**
++** In addition, as a special exception, Digia gives you certain additional
++** rights. These rights are described in the Digia Qt LGPL Exception
++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
++**
++** GNU General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU
++** General Public License version 3.0 as published by the Free Software
++** Foundation and appearing in the file LICENSE.GPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU General Public License version 3.0 requirements will be
++** met: http://www.gnu.org/copyleft/gpl.html.
++**
++**
++** $QT_END_LICENSE$
++**
++****************************************************************************/
++
++#include "qwaylandivisurface_p.h"
++
++#include "qwaylanddisplay_p.h"
++#include "qwaylandwindow_p.h"
++#include "qwaylandinputdevice_p.h"
++#include "qwaylanddecoration_p.h"
++#include "qwaylandscreen_p.h"
++
++#include <QtCore/QDebug>
++
++QT_BEGIN_NAMESPACE
++
++QWaylandIviSurface::QWaylandIviSurface(struct ::ivi_surface *ivi_surface, QWaylandWindow *window)
++ : QtWayland::ivi_surface(ivi_surface)
++ , m_window(window)
++{
++}
++
++QWaylandIviSurface::~QWaylandIviSurface()
++{
++ ivi_surface_destroy(object());
++}
++
++void QWaylandIviSurface::resize(QWaylandInputDevice *inputDevice, enum wl_shell_surface_resize edges)
++{
++}
++
++void QWaylandIviSurface::move(QWaylandInputDevice *inputDevice)
++{
++}
++
++void QWaylandIviSurface::setMaximized()
++{
++}
++
++void QWaylandIviSurface::setFullscreen()
++{
++}
++
++void QWaylandIviSurface::setNormal()
++{
++}
++
++void QWaylandIviSurface::setMinimized()
++{
++}
++
++void QWaylandIviSurface::setTopLevel()
++{
++}
++
++void QWaylandIviSurface::updateTransientParent(QWindow *parent)
++{
++}
++
++void QWaylandIviSurface::setTitle(const QString & title)
++{
++}
++
++void QWaylandIviSurface::setAppId(const QString & appId)
++{
++}
++
++QT_END_NAMESPACE
+diff --git a/src/client/qwaylandivisurface_p.h b/src/client/qwaylandivisurface_p.h
+new file mode 100644
+index 0000000..c6a7ce6
+--- /dev/null
++++ b/src/client/qwaylandivisurface_p.h
+@@ -0,0 +1,90 @@
++/****************************************************************************
++**
++** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
++** Contact: http://www.qt-project.org/legal
++**
++** This file is part of the config.tests of the Qt Toolkit.
++**
++** $QT_BEGIN_LICENSE:LGPL$
++** Commercial License Usage
++** Licensees holding valid commercial Qt licenses may use this file in
++** accordance with the commercial license agreement provided with the
++** Software or, alternatively, in accordance with the terms contained in
++** a written agreement between you and Digia. For licensing terms and
++** conditions see http://qt.digia.com/licensing. For further information
++** use the contact form at http://qt.digia.com/contact-us.
++**
++** GNU Lesser General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU Lesser
++** General Public License version 2.1 as published by the Free Software
++** Foundation and appearing in the file LICENSE.LGPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU Lesser General Public License version 2.1 requirements
++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
++**
++** In addition, as a special exception, Digia gives you certain additional
++** rights. These rights are described in the Digia Qt LGPL Exception
++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
++**
++** GNU General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU
++** General Public License version 3.0 as published by the Free Software
++** Foundation and appearing in the file LICENSE.GPL included in the
++** packaging of this file. Please review the following information to
++** ensure the GNU General Public License version 3.0 requirements will be
++** met: http://www.gnu.org/copyleft/gpl.html.
++**
++**
++** $QT_END_LICENSE$
++**
++****************************************************************************/
++
++#ifndef QWAYLANDIVISURFACE_H
++#define QWAYLANDIVISURFACE_H
++
++#include <QtCore/QSize>
++
++#include <wayland-client.h>
++
++#include <QtWaylandClient/private/qwayland-ivi-application.h>
++#include <QtWaylandClient/private/qwaylandclientexport_p.h>
++#include "qwaylandshellsurface_p.h"
++
++QT_BEGIN_NAMESPACE
++
++class QWaylandWindow;
++class QWaylandInputDevice;
++class QWindow;
++class QWaylandExtendedSurface;
++
++class Q_WAYLAND_CLIENT_EXPORT QWaylandIviSurface : public QtWayland::ivi_surface
++ , public QWaylandShellSurface
++{
++public:
++ QWaylandIviSurface(struct ::ivi_surface *shell_surface, QWaylandWindow *window);
++ virtual ~QWaylandIviSurface();
++
++ void resize(QWaylandInputDevice *inputDevice, enum wl_shell_surface_resize edges) Q_DECL_OVERRIDE;
++ void move(QWaylandInputDevice *inputDevice) Q_DECL_OVERRIDE;
++
++ void setTitle(const QString &title) Q_DECL_OVERRIDE;
++ void setAppId(const QString &appId) Q_DECL_OVERRIDE;
++
++private:
++ void setMaximized() Q_DECL_OVERRIDE;
++ void setFullscreen() Q_DECL_OVERRIDE;
++ void setNormal() Q_DECL_OVERRIDE;
++ void setMinimized() Q_DECL_OVERRIDE;
++
++ void setTopLevel() Q_DECL_OVERRIDE;
++ void updateTransientParent(QWindow *parent) Q_DECL_OVERRIDE;
++
++private:
++ QWaylandWindow *m_window;
++
++ friend class QWaylandWindow;
++};
++
++QT_END_NAMESPACE
++
++#endif // QWAYLANDIVISURFACE_H
+diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp
+index 3fb3a49..45a58f2 100644
+--- a/src/client/qwaylandwindow.cpp
++++ b/src/client/qwaylandwindow.cpp
+@@ -39,6 +39,8 @@
+ **
+ ****************************************************************************/
+
++#include <unistd.h>
++
+ #include "qwaylandwindow_p.h"
+
+ #include "qwaylandbuffer_p.h"
+@@ -48,10 +50,12 @@
+ #include "qwaylandshellsurface_p.h"
+ #include "qwaylandwlshellsurface_p.h"
+ #include "qwaylandxdgsurface_p.h"
++#include "qwaylandivisurface_p.h"
+ #include "qwaylandextendedsurface_p.h"
+ #include "qwaylandsubsurface_p.h"
+ #include "qwaylanddecoration_p.h"
+ #include "qwaylandwindowmanagerintegration_p.h"
++#define IVI_SURFACE_ID 8000
+
+ #include <QtCore/QFileInfo>
+ #include <QtGui/QWindow>
+@@ -95,7 +99,9 @@ QWaylandWindow::QWaylandWindow(QWindow *window)
+ mWindowId = id++;
+
+ if (!(window->flags() & Qt::BypassWindowManagerHint)) {
+- if (mDisplay->shellXdg()) {
++ if (mDisplay->shellIvi()) {
++ mShellSurface = new QWaylandIviSurface(mDisplay->shellIvi()->surface_create(IVI_SURFACE_ID + getpid(), object()), this);
++ } else if (mDisplay->shellXdg()) {
+ if (window->type() & Qt::Window) {
+ mShellSurface = new QWaylandXdgSurface(mDisplay->shellXdg()->get_xdg_surface(object()), this);
+ }
+--
+1.9.1
+
diff --git a/recipes-qt/qt/qtwayland/0099_qtwayland_no_evdev.patch b/recipes-qt/qt/qtwayland/0099_qtwayland_no_evdev.patch
new file mode 100644
index 00000000..984ae813
--- /dev/null
+++ b/recipes-qt/qt/qtwayland/0099_qtwayland_no_evdev.patch
@@ -0,0 +1,14 @@
+diff --git a/tests/auto/compositor/compositor/compositor.pro b/tests/auto/compositor/compositor/compositor.pro
+index 2919fa4..d9acac3 100644
+--- a/tests/auto/compositor/compositor/compositor.pro
++++ b/tests/auto/compositor/compositor/compositor.pro
+@@ -7,9 +7,6 @@ QT += core-private gui-private waylandcompositor waylandcompositor-private
+
+ QMAKE_USE += wayland-client wayland-server
+
+-qtConfig(xkbcommon-evdev): \
+- QMAKE_USE += xkbcommon_evdev
+-
+ WAYLANDCLIENTSOURCES += \
+ ../../../../src/3rdparty/protocol/xdg-shell.xml \
+ ../../../../src/3rdparty/protocol/ivi-application.xml \
diff --git a/recipes-qt/qt/qtwayland/UNUSED_NEEDS_CHECK_YOCTO_0018-packaging-enable-xdg-shell-at-runtime.patch b/recipes-qt/qt/qtwayland/UNUSED_NEEDS_CHECK_YOCTO_0018-packaging-enable-xdg-shell-at-runtime.patch
new file mode 100644
index 00000000..bca61b5d
--- /dev/null
+++ b/recipes-qt/qt/qtwayland/UNUSED_NEEDS_CHECK_YOCTO_0018-packaging-enable-xdg-shell-at-runtime.patch
@@ -0,0 +1,31 @@
+From 9617c349a212d5407087daf4f4a2386bce94ecc1 Mon Sep 17 00:00:00 2001
+From: Philippe Coval <philippe.coval@open.eurogiciel.org>
+Date: Thu, 12 Jun 2014 11:55:29 +0200
+Subject: [PATCH 18/21] packaging: enable xdg-shell at runtime
+
+Change-Id: Iffbae496f1e09c8fa44a28d4eb515678e3bbb297
+Bug-Tizen: TIVI-3113/part
+Signed-off-by: Philippe Coval <philippe.coval@open.eurogiciel.org>
+---
+ packaging/qt5-qtwayland.spec | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/packaging/qt5-qtwayland.spec b/packaging/qt5-qtwayland.spec
+index cba18e2..ff32185 100644
+--- a/packaging/qt5-qtwayland.spec
++++ b/packaging/qt5-qtwayland.spec
+@@ -97,6 +97,11 @@ rm -rf %{buildroot}
+
+ %post
+ /sbin/ldconfig
++
++f="/etc/profile.d/qt.sh"
++grep QT_WAYLAND_USE_XDG_SHELL $f \
++ || echo "QT_WAYLAND_USE_XDG_SHELL='defined'; export QT_WAYLAND_USE_XDG_SHELL" >> $f
++
+ %postun
+ /sbin/ldconfig
+
+--
+1.9.1
+
diff --git a/recipes-qt/qt/qtwayland_%.bbappend b/recipes-qt/qt/qtwayland_%.bbappend
new file mode 100644
index 00000000..f9ab5fc8
--- /dev/null
+++ b/recipes-qt/qt/qtwayland_%.bbappend
@@ -0,0 +1 @@
+require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'qtwayland_agldemo.inc', '', d)}
diff --git a/recipes-qt/qt/qtwayland_agldemo.inc b/recipes-qt/qt/qtwayland_agldemo.inc
new file mode 100644
index 00000000..46bf2e74
--- /dev/null
+++ b/recipes-qt/qt/qtwayland_agldemo.inc
@@ -0,0 +1,26 @@
+FILESEXTRAPATHS_append := ":${THISDIR}/qtwayland"
+
+# QT_MODULE_BRANCH = "5.4"
+
+# TODO:
+# These patches for IVI-SHELL are tempolary disabled because of issues. And new
+# patches are proposed.
+#
+# file://0020-Add-IVI-Shell-protocol-file-version-patch-v6.patch \
+# file://0021-Implement-initial-IVI-Shell-support.patch \
+# file://0001-protocol-update-3rd-party-ivi-application-protocol.patch \
+# file://0002-qwaylandwindow-add-support-for-IVI-Surface-ID-proper.patch \
+#
+# The xdg-shell merged into upstream, so we don't need these patch anymore.
+# But xdg-shell doesn't work well in current AGL Distro because of
+# mismatch of protocol versions between server(weston) and client(Qt Apps).
+#
+# file://0016-xdg-shell-Add-xdg-shell-protocol-file-version-1.4.0.patch \
+# file://0017-xdg-shell-Add-minimize-feature-to-QWindow-using-wayl.patch \
+# file://0019-xdg-shell-upgrade-to-support-current-version-weston-.patch \
+#
+
+SRC_URI_append = "\
+ file://0010-Added-manifest-file-according-to-smack-3-domain-mode.patch \
+ "
+
diff --git a/recipes-qt/qt/qtwebkit_%.bbappend b/recipes-qt/qt/qtwebkit_%.bbappend
new file mode 100644
index 00000000..d0b1302c
--- /dev/null
+++ b/recipes-qt/qt/qtwebkit_%.bbappend
@@ -0,0 +1 @@
+require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'qtwebkit_agldemo.inc', '', d)}
diff --git a/recipes-qt/qt/qtwebkit_agldemo.inc b/recipes-qt/qt/qtwebkit_agldemo.inc
new file mode 100644
index 00000000..0420578e
--- /dev/null
+++ b/recipes-qt/qt/qtwebkit_agldemo.inc
@@ -0,0 +1 @@
+PACKAGECONFIG = "gstreamer qtlocation qtmultimedia qtsensors"
diff --git a/recipes-support/curl/curl_%.bbappend b/recipes-support/curl/curl_%.bbappend
new file mode 100644
index 00000000..b126b6d2
--- /dev/null
+++ b/recipes-support/curl/curl_%.bbappend
@@ -0,0 +1 @@
+require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'curl_agldemo.inc', '', d)}
diff --git a/recipes-support/curl/curl_agldemo.inc b/recipes-support/curl/curl_agldemo.inc
new file mode 100644
index 00000000..fc24cea1
--- /dev/null
+++ b/recipes-support/curl/curl_agldemo.inc
@@ -0,0 +1,5 @@
+# Cannot just append to PACKAGECONFIG, as nghttp2's dependencies do not build
+# for native/nativesdk, and appending class-target does not work because of
+# the weak definition of PACKAGECONFIG in the recipe, so need to copy the
+# definition to add nghttp2...
+PACKAGECONFIG = "${@bb.utils.filter('DISTRO_FEATURES', 'ipv6', d)} gnutls libidn proxy threaded-resolver verbose zlib nghttp2"
diff --git a/recipes-support/opencv/opencv_4.%.bbappend b/recipes-support/opencv/opencv_4.%.bbappend
new file mode 100644
index 00000000..a1016a6d
--- /dev/null
+++ b/recipes-support/opencv/opencv_4.%.bbappend
@@ -0,0 +1 @@
+require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'opencv_agldemo.inc', '', d)}
diff --git a/recipes-support/opencv/opencv_agldemo.inc b/recipes-support/opencv/opencv_agldemo.inc
new file mode 100644
index 00000000..86d759b6
--- /dev/null
+++ b/recipes-support/opencv/opencv_agldemo.inc
@@ -0,0 +1 @@
+PACKAGECONFIG_poky = "jpeg png v4l libv4l gstreamer"
diff --git a/recipes-support/udisks/files/99-udisks2.rules b/recipes-support/udisks/files/99-udisks2.rules
new file mode 100644
index 00000000..996e4343
--- /dev/null
+++ b/recipes-support/udisks/files/99-udisks2.rules
@@ -0,0 +1,5 @@
+# UDISKS_FILESYSTEM_SHARED
+# ==1: mount filesystem to a shared directory (/media/VolumeName)
+# ==0: mount filesystem to a private directory (/run/media/$USER/VolumeName)
+# See udisks(8)
+ENV{ID_FS_USAGE}=="filesystem|other|crypto", ENV{UDISKS_FILESYSTEM_SHARED}="1"
diff --git a/recipes-support/udisks/files/automount.service b/recipes-support/udisks/files/automount.service
new file mode 100644
index 00000000..b1651519
--- /dev/null
+++ b/recipes-support/udisks/files/automount.service
@@ -0,0 +1,9 @@
+[Unit]
+Description=Automount Disk Manager
+After=udisks2.service
+
+[Service]
+ExecStart=/usr/libexec/automount.sh
+
+[Install]
+WantedBy=multi-user.target
diff --git a/recipes-support/udisks/files/automount.sh b/recipes-support/udisks/files/automount.sh
new file mode 100644
index 00000000..23679191
--- /dev/null
+++ b/recipes-support/udisks/files/automount.sh
@@ -0,0 +1,93 @@
+#!/bin/sh
+
+MOUNT_OPTIONS_DEFAULT="ro,noexec"
+MOUNT_OPTIONS_VFAT="umask=0022"
+MOUNT_OPTIONS_EXT=""
+MOUNT_OPTIONS_NTFS=""
+MOUNT_OPTIONS_ISO9660=""
+
+VERBOSE=false
+
+# Source a configuration file that can override mount options if exists
+[ -f /etc/automount.conf ] && . /etc/automount.conf
+
+mount_device() {
+ MOUNT_OPTIONS=""
+ FSTYPE="$( udevadm info "${1}" "${2}" | awk -v FS== '/ID_FS_TYPE/ {print $2}' )"
+ DEVNAME="$( udevadm info "${1}" "${2}" | awk -v FS== '/DEVNAME/ {print $2}' )"
+ case $FSTYPE in
+ vfat)
+ MOUNT_OPTIONS="${MOUNT_OPTIONS_VFAT}"
+ ;;
+ ext[2-4])
+ MOUNT_OPTIONS="${MOUNT_OPTIONS_EXT}"
+ ;;
+ ntfs)
+ MOUNT_OPTIONS="${MOUNT_OPTIONS_NTFS}"
+ ;;
+ iso9660)
+ MOUNT_OPTIONS="${MOUNT_OPTIONS_ISO9660}"
+ ;;
+ "")
+ if $VERBOSE; then
+ echo "[INFO][${DEVNAME}] Not a partition with a filesystem!"
+ fi
+ return
+ ;;
+ *)
+ echo "[WARNING][${DEVNAME}] The filesystem '${FSTYPE}' is not supported!"
+ return
+ ;;
+ esac
+
+ if [ -n "${MOUNT_OPTIONS_DEFAULT}" ]; then
+ if [ -z "${MOUNT_OPTIONS}" ]; then
+ MOUNT_OPTIONS="${MOUNT_OPTIONS_DEFAULT}"
+ else
+ MOUNT_OPTIONS="${MOUNT_OPTIONS_DEFAULT},${MOUNT_OPTIONS}"
+ fi
+ fi
+ if $VERBOSE; then
+ echo "[INFO][${DEVNAME}] Mounting a ${FSTYPE}'s filesystem with options: ${MOUNT_OPTIONS}"
+ fi
+
+ if command -v udisksctl > /dev/null 2>&1; then
+ if [ -n "${MOUNT_OPTIONS}" ]; then
+ MOUNT_OPTIONS="-o ${MOUNT_OPTIONS}"
+ fi
+ udisksctl mount -t "${FSTYPE}" -b "${DEVNAME}" ${MOUNT_OPTIONS}
+ elif command -v udisks >/dev/null 2>&1; then
+ if [ -n "${MOUNT_OPTIONS}" ]; then
+ MOUNT_OPTIONS="--mount-options ${MOUNT_OPTIONS}"
+ fi
+ udisks --mount-fstype "${FSTYPE}" --mount "${DEVNAME}" ${MOUNT_OPTIONS}
+ else
+ echo "[ERROR] Unable to find binary for mounting ${DEVNAME}" >&2
+ return
+ fi
+ if [ "$?" -ne "0" ]; then
+ echo "[ERROR] Failed to mount the device ${DEVNAME} of type ${FSTYPE} with options ${MOUNT_OPTIONS}" >&2
+ fi
+}
+
+# At startup, remove empty directories that may exists
+rmdir /media/* > /dev/null 2>&1
+
+# Mount already plugged devices
+for DEVICE in $( lsblk -dn | cut -d' ' -f1 ); do
+ REMOVABLE=$( cat "/sys/block/${DEVICE}/removable" )
+ if [ "${REMOVABLE}" -eq "1" ]; then
+ for PART in "/dev/${DEVICE}"*; do
+ mount_device -n "${PART}"
+ done
+ fi
+done
+
+# Wait for plug events and mount devices
+stdbuf -oL -- udevadm monitor --udev -s block |
+while read -r -- _ _ EVENT DEVPATH _
+do
+ if [ "${EVENT}" = "add" ]; then
+ mount_device -p "/sys/${DEVPATH}"
+ fi
+done
diff --git a/recipes-support/udisks/udisks2_%.bbappend b/recipes-support/udisks/udisks2_%.bbappend
new file mode 100644
index 00000000..a36862b9
--- /dev/null
+++ b/recipes-support/udisks/udisks2_%.bbappend
@@ -0,0 +1 @@
+require ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'udisks2_agldemo.inc', '', d)}
diff --git a/recipes-support/udisks/udisks2_agldemo.inc b/recipes-support/udisks/udisks2_agldemo.inc
new file mode 100644
index 00000000..44c9a5ba
--- /dev/null
+++ b/recipes-support/udisks/udisks2_agldemo.inc
@@ -0,0 +1,27 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
+
+SRC_URI_append = " file://automount.service \
+ file://automount.sh \
+ file://99-udisks2.rules \
+"
+
+SYSTEMD_AUTO_ENABLE = "enable"
+SYSTEMD_SERVICE_${PN}_append = " automount.service"
+
+do_install_append () {
+ sed -i 's/^WantedBy=.*/WantedBy=multi-user.target/' ${D}${systemd_unitdir}/system/udisks2.service
+
+ install -d ${D}${base_libdir}/systemd/system
+ install -m 0644 ${WORKDIR}/automount.service ${D}${systemd_unitdir}/system
+
+ install -d ${D}${libexecdir}
+ install -m 0755 ${WORKDIR}/automount.sh ${D}${libexecdir}/automount.sh
+
+ install -d ${D}${sysconfdir}/udev/rules.d
+ install -m 0644 ${WORKDIR}/99-udisks2.rules ${D}${sysconfdir}/udev/rules.d
+}
+
+FILES_${PN}_append = " \
+ ${base_libdir}/systemd/system/automount.service \
+ ${libexecdir}/automount.sh \
+"
diff --git a/recipes-test/afb-test/afb-test_git.bb b/recipes-test/afb-test/afb-test_git.bb
new file mode 100644
index 00000000..5246abb0
--- /dev/null
+++ b/recipes-test/afb-test/afb-test_git.bb
@@ -0,0 +1,25 @@
+SUMMARY = "Binding embedding test framework to test others binding"
+DESCRIPTION = "This make testing binding running with Application Framework binder \
+easier by simply test verb return as well as event reception."
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/app-afb-test"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
+SECTION = "apps"
+
+SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/app-afb-test;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+DEPENDS += "lua libafb-helpers libappcontroller"
+RDEPENDS_${PN} += "lua bash jq"
+RDEPENDS_${PN}-ptest += "af-binder"
+
+PV = "${AGLVERSION}"
+S = "${WORKDIR}/git"
+
+inherit cmake aglwgt pkgconfig ptest
+
+do_install_append() {
+ install -d ${D}${bindir}
+ install -m 775 ${S}/afm-test.target.sh ${D}${bindir}/afm-test
+}
+
diff --git a/recipes-test/afb-test/files/run-ptest b/recipes-test/afb-test/files/run-ptest
new file mode 100644
index 00000000..883939a8
--- /dev/null
+++ b/recipes-test/afb-test/files/run-ptest
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+afm-test /usr/AGL/apps/testwgt/aftest-test.wgt
diff --git a/recipes-test/gcovr-wrapper/gcovr-wrapper/gcovr-wrapper b/recipes-test/gcovr-wrapper/gcovr-wrapper/gcovr-wrapper
new file mode 100644
index 00000000..12580237
--- /dev/null
+++ b/recipes-test/gcovr-wrapper/gcovr-wrapper/gcovr-wrapper
@@ -0,0 +1,320 @@
+#!/bin/bash
+#
+# Copyright (C) 2020 Konsulko Group
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#
+# gcovr wrapper for generating coverage reports against AGL bindings
+# on target. With a given binding name or coverage widget file, the
+# coverage version will be installed, and the pyagl tests for the
+# binding run before generating a report with gcovr. The afm-test
+# test widget or a user-supplied command may be run instead of the
+# pyagl tests, see usage below, or run with "--help".
+#
+
+usage() {
+ cat <<-EOF
+ Usage:
+ $(basename $0) [options] <binding name | widget file>
+
+ Options:
+ -h, --help
+ Print this help and exit
+
+ -k, --keep
+ Do not remove temporary files/directories
+
+ -o, --gcovr-options
+ Additional gcovr options, multiple options should be quoted
+
+ -w, --workdir
+ gcov/gcovr temporary working directory, defaults to /tmp/gcov
+ The directory will be removed after running without --keep if it
+ is empty, use caution if specifying existing system directories!
+
+ --pyagl
+ Run pyagl tests for binding, enabled by default
+
+ --afm-test
+ Run afm-test test widget tests for binding.
+ If specified, disables pyagl tests; note that the last argument in
+ the command-line will take precedence.
+
+ -c, --command
+ Test command to use in place of pyagl or afm-test, should be quote
+ If specified, disables pyagl and afm-test tests.
+
+ EOF
+}
+
+# Helper to validate widget install dir
+check_wgt_install() {
+ if [ ! \( -d $1 -o -f $1/config.xml \) ]; then
+ echo "ERROR: No widget install at $1"
+ exit 1
+ elif [ ! -d $1/src ]; then
+ echo "ERROR: No source in $1/src"
+ exit 1
+ fi
+}
+
+# Helper to run gcovr inside mount namespace environment
+gcovr_runner() {
+ wgt_install_dir=/var/local/lib/afm/applications/$1
+ check_wgt_install ${wgt_install_dir}
+
+ if [ ! -d $workdir/$1 ]; then
+ echo "ERROR: No coverage data in $workdir/$1"
+ exit 1
+ fi
+
+ # Get original source path
+ gcno=$(cd $workdir/$1 && find -name '*.gcno' | head -n 1 | cut -d/ -f2-)
+ if [ -z "$gcno" ]; then
+ echo "ERROR: no gcno file found in $workdir/$1"
+ exit 1
+ fi
+ srcfile=$(strings $workdir/$1/${gcno} | grep "$(basename ${gcno%.gcno})$" | uniq)
+ srcdir=$(echo $srcfile | sed "s|/${gcno%%/*}/.*$||")
+
+ # Set up mounts for chroot to run gcovr in
+ # NOTE: We do not unmount these later, as we assume we are in a
+ # private mount namespace and they will go away on exit from
+ # it.
+ echo "Setting up mounts"
+ tmpdir=$(mktemp -d)
+ echo $tmpdir > $workdir/.runner_tmpdir
+ mkdir -p $tmpdir/{lower,upper,work,merged}
+ # NOTE: Could potentially use rbind here, but explicitly mounting
+ # just what we need seems safer
+ mount --bind / $tmpdir/lower
+ mount -t overlay -o lowerdir=$tmpdir/lower,upperdir=$tmpdir/upper,workdir=$tmpdir/work overlay $tmpdir/merged
+ mount --bind /proc $tmpdir/merged/proc
+ mount --bind /sys $tmpdir/merged/sys
+ mount --bind /dev $tmpdir/merged/dev
+ mount --bind /tmp $tmpdir/merged/tmp
+ # Bind in the data files
+ # NOTE: $workdir is bound instead of specifically just $workdir/$1,
+ # so that e.g. html output to another directory in /tmp will
+ # work as expected. A determined user may be able to shoot
+ # themselves in the foot, but for now the trade off seems
+ # acceptable.
+ mkdir -p $tmpdir/merged/$workdir
+ mount --bind $workdir $tmpdir/merged/$workdir
+ # Bind the source files to their expected location
+ mkdir -p $tmpdir/merged/$srcdir
+ mount --bind ${wgt_install_dir}/src $tmpdir/merged/$srcdir
+
+ echo "Entering chroot"
+ echo
+ exec chroot $tmpdir/merged \
+ /usr/bin/gcovr -r $srcdir --object-directory $workdir/$1 --gcov-filter-source-errors -s ${GCOV_RUNNER_GCOVR_OPTIONS}
+}
+
+# Helper to clean up after runner
+gcovr_runner_cleanup() {
+ rm -rf $workdir/$1
+ if [ -f $workdir/.runner_tmpdir ]; then
+ tmpdir=$(cat $workdir/.runner_tmpdir)
+ rm -rf $tmpdir
+ rm -f $workdir/.runner_tmpdir
+ fi
+ if [ "$workdir" != "/tmp" ]; then
+ rmdir $workdir 2>/dev/null || true
+ fi
+}
+
+# Parse arguments
+OPTS=$(getopt -o +hko:pw:c: --longoptions gcovr-runner,afm-test,command:,help,keep,gcovr-options:,pyagl,workdir: -n "$(basename $0)" -- "$@")
+if [ $? -ne 0 ]; then
+ exit 1
+fi
+eval set -- "$OPTS"
+
+runner=false
+keep=false
+wgt=""
+cmd=""
+options=""
+afmtest=false
+pyagl=true
+workdir="/tmp/gcov"
+
+while true; do
+ case "$1" in
+ --gcovr-runner) runner=true; shift;;
+ --afm-test) afmtest=true; pyagl=false; shift;;
+ -c|--command) cmd="$2"; shift; shift;;
+ -h|--help) usage; exit 0;;
+ -k|--keep) keep=true; shift;;
+ -o|--gcovr-options) options="$2"; shift; shift;;
+ -p|--pyagl) pyagl=true; afmtest=false; shift;;
+ -w|--workdir) workdir="$2"; shift; shift;;
+ --) shift; break;;
+ *) break;;
+ esac
+done
+
+# Encode the assumption that a specified command means it runs instead
+# of any other tests.
+if [ -s "$cmd" ]; then
+ pyagl=false
+ afmtest=false
+fi
+
+if [ $# -ne 1 ]; then
+ # Always expect widget name as single non-option argument
+ usage
+ exit 1
+fi
+
+# Rationalize workdir just in case
+workdir=$(realpath "$workdir")
+
+if [ "$runner" = "true" ]; then
+ if [ "${GCOV_RUNNER_READY}" != "true" ]; then
+ echo "ERROR: gcovr environment not ready!"
+ exit 1
+ fi
+ gcovr_runner $1
+ # If we get here, it'd be an error, so return 1
+ exit 1
+fi
+
+binding=$1
+if [ "${1%.wgt}" != "$1" ]; then
+ # User has specified path to a widget file
+ wgt=$(realpath $1)
+ binding=$(basename "${1%-coverage.wgt}")
+else
+ wgt=/usr/AGL/apps/coverage/${binding}-coverage.wgt
+fi
+if [ ! -f $wgt ]; then
+ echo "ERROR: No widget $wgt"
+ exit 1
+elif [ "$afmtest" = "true" -a ! -f /usr/AGL/apps/test/${binding}-test.wgt ]; then
+ echo "ERROR: No test widget for $binding"
+ exit 1
+fi
+
+# Determine starting systemd unit name
+service=$(systemctl --all |grep afm-service-$binding |sed 's/^[ *] \([^ ]*\).*/\1/')
+if [ -z "$service" ]; then
+ echo "ERROR: Could not determine systemd service unit for $binding"
+ exit 1
+fi
+
+# Install coverage widget
+echo "Removing $binding widget"
+systemctl stop $service
+afm-util remove $binding
+echo
+echo "Installing $binding coverage widget"
+afm-util install $wgt
+echo
+
+wgt_install_dir=/var/local/lib/afm/applications/$binding
+check_wgt_install ${wgt_install_dir}
+gcov_src=${wgt_install_dir}/coverage
+if [ ! -d ${gcov_src} ]; then
+ echo "ERROR: No coverage information in ${gcov_src}"
+ exit 1
+elif [ ! -f ${gcov_src}/gcov.env ]; then
+ echo "ERROR: No gcov environment file at ${gcov_src}/gcov.env"
+ exit 1
+fi
+
+#
+# NOTE: In theory, the coverage data collection could be done inside
+# the mount namespace / chroot, but the potential for issues
+# when doing that seems higher than just running gcovr there,
+# so a conservative approach is taken.
+#
+
+# Set up things for the binary to write out gcda data files
+#
+# Having the matching build directory hierarchy in place and
+# writeable by the target binary before any restart and testing is
+# key to things working.
+#
+# As well, the environment file with the GCOV_PREFIX and
+# GCOV_PREFIX_STRIP values needs to be present before running so the
+# gcda files will get written into the relocated build hierarchy.
+#
+echo "Installing coverage information for $binding"
+mkdir -p $workdir
+rm -rf $workdir/$binding
+cp -dr ${gcov_src} $workdir/$binding
+chsmack -r -a System::Log $workdir
+chmod -R go+w $workdir
+
+# Install the gcov environment file
+mkdir -p /etc/afm/widget.env.d/$binding
+if [ "${workdir}" = "/tmp/gcov" ]; then
+ cp ${gcov_src}/gcov.env /etc/afm/widget.env.d/$binding/gcov
+else
+ # Update GCOV_PREFIX to point into workdir
+ sed "s|^GCOV_PREFIX=.*|GCOV_PREFIX=${workdir}/$binding|" ${gcov_src}/gcov.env > /etc/afm/widget.env.d/$binding/gcov
+fi
+chsmack -r -a _ /etc/afm/widget.env.d/$binding
+
+# Determine new systemd unit name (version may now be different)
+service=$(systemctl --all |grep afm-service-$binding |sed 's/^[ *] \([^ ]*\).*/\1/')
+if [ -z "$service" ]; then
+ echo "ERROR: Could not determine systemd service unit for $binding"
+ exit 1
+fi
+
+# Restart the binding
+systemctl start $service
+echo
+
+# Run tests or given command
+if [ -n "$cmd" ]; then
+ echo "Running command: $cmd"
+ export AGL_AVAILABLE_INTERFACES=${AGL_AVAILABLE_INTERFACES:-ethernet}
+ eval $cmd
+elif [ "$pyagl" = "true" ]; then
+ echo "Running $binding pyagl tests"
+ export AGL_AVAILABLE_INTERFACES=${AGL_AVAILABLE_INTERFACES:-ethernet}
+ pytest -k "${binding#agl-service-} and not hwrequired" /usr/lib/python3.?/site-packages/pyagl
+else
+ echo "Running $binding test widget"
+ # NOTE: su to agl-driver is required here to avoid fallout from
+ # the "afm-util run" in afm-test seemingly triggering the
+ # start of other per-user bindings for the root user.
+ su -l -c "/usr/bin/afm-test /usr/AGL/apps/test/${binding}-test.wgt" agl-driver
+fi
+
+# Restart again to trigger data file writing
+systemctl restart $service
+echo
+
+# Run ourselves in gcovr runner mode inside a private mount namespace
+export GCOV_RUNNER_READY=true
+# NOTE: Passing gcovr options in the environment to avoid quoting hassles
+export GCOV_RUNNER_GCOVR_OPTIONS="$options"
+runner_options="--workdir ${workdir}"
+unshare -m $0 --gcovr-runner ${runner_options} $binding
+rc=$?
+
+if [ "$keep" != "true" ]; then
+ # Clean up after ourselves
+ gcovr_runner_cleanup $1
+ rm -f /etc/afm/widget.env.d/$1/gcov
+ rmdir /etc/afm/widget.env.d/$1 2>/dev/null || true
+fi
+
+exit $rc
+
diff --git a/recipes-test/gcovr-wrapper/gcovr-wrapper_1.0.bb b/recipes-test/gcovr-wrapper/gcovr-wrapper_1.0.bb
new file mode 100644
index 00000000..2ff39b21
--- /dev/null
+++ b/recipes-test/gcovr-wrapper/gcovr-wrapper_1.0.bb
@@ -0,0 +1,17 @@
+SUMMARY = "AGL gcovr wrapper"
+DESCRIPTION = "This wrapper script enables running gcovr against a \
+AGL binding to generate a coverage report of running pyagl tests, \
+the afm-test test widget, or a user-supplied command."
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+SRC_URI += "file://gcovr-wrapper"
+
+inherit allarch
+
+do_install() {
+ install -D -m 0755 ${WORKDIR}/gcovr-wrapper ${D}${bindir}/gcovr-wrapper
+}
+
+RDEPENDS_${PN} = "bash gcovr"
diff --git a/recipes-test/gcovr/gcovr/0001-add-gcov-filter-source-errors-option.patch b/recipes-test/gcovr/gcovr/0001-add-gcov-filter-source-errors-option.patch
new file mode 100644
index 00000000..be1dcf82
--- /dev/null
+++ b/recipes-test/gcovr/gcovr/0001-add-gcov-filter-source-errors-option.patch
@@ -0,0 +1,68 @@
+Add option to filter gcov source errors
+
+Add "--gcov-filter-source-errors" to apply filters to the source
+files in the errors from gcov. If all source files in the errors
+are filtered, then the error is ignored so that the file will be
+processed. This enables the usecase of running on a target where
+only the source tree for a binary is available, but not all of the
+external source headers are.
+
+Upstream-Status: pending
+
+Signed-off-by: Scott Murray <scott.murray@konsulko.com>
+
+diff --git a/gcovr/configuration.py b/gcovr/configuration.py
+index 1356097..083532c 100644
+--- a/gcovr/configuration.py
++++ b/gcovr/configuration.py
+@@ -915,6 +915,14 @@ GCOVR_CONFIG_OPTIONS = [
+ "Default: {default!s}.",
+ action="store_true",
+ ),
++ GcovrConfigOption(
++ "gcov_filter_source_errors", ['--gcov-filter-source-errors'],
++ group="gcov_options",
++ help="Apply filters to missing source file errors in GCOV files "
++ "instead of exiting with an error. "
++ "Default: {default!s}.",
++ action="store_true",
++ ),
+ GcovrConfigOption(
+ "objdir", ['--object-directory'],
+ group="gcov_options",
+diff --git a/gcovr/gcov.py b/gcovr/gcov.py
+index de79215..171d68d 100644
+--- a/gcovr/gcov.py
++++ b/gcovr/gcov.py
+@@ -667,11 +667,27 @@ def run_gcov_and_process_files(
+ chdir=chdir,
+ tempdir=tempdir)
+
++ skip = False
+ if source_re.search(err):
+- # gcov tossed errors: try the next potential_wd
+- error(err)
+- done = False
+- else:
++ ignore = False
++ if options.gcov_filter_source_errors:
++ # Check if errors are all from source that is filtered
++ ignore = True
++ for line in err.splitlines():
++ src_fname = line.split()[-1]
++ filtered, excluded = apply_filter_include_exclude(
++ src_fname, options.filter, options.exclude)
++ if not (filtered or excluded):
++ ignore = False
++ break
++
++ if not ignore:
++ # gcov tossed errors: try the next potential_wd
++ error(err)
++ skip = True
++
++ done = False
++ if not skip:
+ # Process *.gcov files
+ for fname in active_gcov_files:
+ process_gcov_data(fname, covdata, abs_filename, options)
diff --git a/recipes-test/gcovr/gcovr_%.bbappend b/recipes-test/gcovr/gcovr_%.bbappend
new file mode 100644
index 00000000..699aea21
--- /dev/null
+++ b/recipes-test/gcovr/gcovr_%.bbappend
@@ -0,0 +1,2 @@
+# Add not yet upstreamed patch that enables on target gcov usage
+SRC_URI += "file://0001-add-gcov-filter-source-errors-option.patch"
diff --git a/recipes-test/gcovr/gcovr_git.bb b/recipes-test/gcovr/gcovr_git.bb
new file mode 100644
index 00000000..6da04cc5
--- /dev/null
+++ b/recipes-test/gcovr/gcovr_git.bb
@@ -0,0 +1,32 @@
+SUMMARY = "Generate GCC code coverage reports"
+DESCRIPTION = "Gcovr provides a utility for managing the use of the GNU gcov \
+utility and generating summarized code coverage results."
+HOMEPAGE = "https://gcovr.com"
+LICENSE = "BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=221e634a1ceafe02ef74462cbff2fb16"
+
+PV = "4.2+git${SRCPV}"
+SRC_URI = "git://github.com/gcovr/gcovr.git;protocol=https"
+SRCREV = "1bc72e3bb59b9296e962b350691732ddafbd3195"
+
+S = "${WORKDIR}/git"
+
+inherit setuptools3
+
+RDEPENDS_${PN} += " \
+ python3-compression \
+ python3-core \
+ python3-crypt \
+ python3-datetime \
+ python3-difflib \
+ python3-io \
+ python3-jinja2 \
+ python3-json \
+ python3-lxml \
+ python3-multiprocessing \
+ python3-pygments \
+ python3-pytest \
+ python3-shell \
+ python3-threading \
+ python3-typing \
+"
diff --git a/recipes-test/pyagl/pyagl_git.bb b/recipes-test/pyagl/pyagl_git.bb
new file mode 100644
index 00000000..821a1de7
--- /dev/null
+++ b/recipes-test/pyagl/pyagl_git.bb
@@ -0,0 +1,33 @@
+SUMMARY = "Python bindings and tests for Automotive Grade Linux services"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/#/admin/projects/src/pyagl"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=ae6497158920d9524cf208c09cc4c984"
+
+SRC_URI = "git://gerrit.automotivelinux.org/gerrit/src/pyagl;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "dcc2f91e5ab3b70202e78ec7164a8e9d7501d70c"
+PV = "${AGL_BRANCH}+git${SRCPV}"
+
+S = "${WORKDIR}/git"
+
+inherit setuptools3
+
+do_install_append() {
+ install -D -m 0755 ${S}/pyagl/scripts/pyagl ${D}${bindir}/pyagl
+}
+
+RDEPENDS_${PN} += " \
+ python3-asyncio \
+ python3-asyncssh \
+ python3-core \
+ python3-json \
+ python3-logging \
+ python3-math \
+ python3-parse \
+ python3-pprint \
+ python3-pytest \
+ python3-pytest-asyncio \
+ python3-pytest-dependency \
+ python3-pytest-reverse \
+ python3-typing \
+ python3-websockets \
+"
diff --git a/recipes-wam/chromium/chromium-browser-service.bb b/recipes-wam/chromium/chromium-browser-service.bb
new file mode 100644
index 00000000..90242d79
--- /dev/null
+++ b/recipes-wam/chromium/chromium-browser-service.bb
@@ -0,0 +1,19 @@
+SUMMARY = "Chromium browser widget"
+DESCRIPTION = "Wgt packaging for running chromium installed browser"
+HOMEPAGE = "https://webosose.org"
+SECTION = "apps"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+SRC_URI = "git://gerrit.automotivelinux.org/gerrit/apps/chromium;protocol=https;branch=${AGL_BRANCH}"
+SRCREV = "${AGL_APP_REVISION}"
+
+PV = "1.0+git${SRCPV}"
+S = "${WORKDIR}/git"
+
+#build-time dependencies
+DEPENDS += "af-binder af-main-native chromium68"
+
+inherit cmake aglwgt
+
+RDEPENDS_${PN} += "chromium68-browser"
diff --git a/recipes-wam/chromium/chromium68/v8-qemu-wrapper.patch b/recipes-wam/chromium/chromium68/v8-qemu-wrapper.patch
new file mode 100644
index 00000000..485766b0
--- /dev/null
+++ b/recipes-wam/chromium/chromium68/v8-qemu-wrapper.patch
@@ -0,0 +1,40 @@
+Upstream-Status: Inappropriate [embedder specific]
+
+The patch below makes the V8 binaries run during the build be invoked through
+QEMU, as they are built for the target.
+
+Signed-off-by: Raphael Kubo da Costa <raphael.kubo.da.costa@intel.com>
+Signed-off-by: Maksim Sisov <msisov@igalia.com>
+
+Index: git/src/tools/v8_context_snapshot/BUILD.gn
+===================================================================
+--- git.orig/src/tools/v8_context_snapshot/BUILD.gn
++++ git/src/tools/v8_context_snapshot/BUILD.gn
+@@ -62,6 +62,7 @@ if (use_v8_context_snapshot) {
+ output_path = rebase_path(output_file, root_build_dir)
+
+ args = [
++ "./v8-qemu-wrapper.sh",
+ "./" + rebase_path(
+ get_label_info(
+ ":v8_context_snapshot_generator($v8_snapshot_toolchain)",
+Index: git/src/v8/BUILD.gn
+===================================================================
+--- git.orig/src/v8/BUILD.gn
++++ git/src/v8/BUILD.gn
+@@ -900,6 +900,7 @@ action("run_torque") {
+ }
+
+ args = [
++ "./v8-qemu-wrapper.sh",
+ "./" + rebase_path(get_label_info(":torque($v8_torque_toolchain)",
+ "root_out_dir") + "/torque",
+ root_build_dir),
+@@ -977,6 +978,7 @@ template("run_mksnapshot") {
+ data = []
+
+ args = [
++ "./v8-qemu-wrapper.sh",
+ "./" + rebase_path(get_label_info(":mksnapshot($v8_snapshot_toolchain)",
+ "root_out_dir") + "/mksnapshot",
+ root_build_dir),
diff --git a/recipes-wam/chromium/chromium68_git.bb b/recipes-wam/chromium/chromium68_git.bb
new file mode 100644
index 00000000..4f545c14
--- /dev/null
+++ b/recipes-wam/chromium/chromium68_git.bb
@@ -0,0 +1,404 @@
+# Copyright (c) 2018 LG Electronics, Inc.
+
+SUMMARY = "Chromium webruntime for webOS"
+AUTHOR = "Lokesh Kumar Goel <lokeshkumar.goel@lge.com>"
+SECTION = "webos/apps"
+LICENSE = "Apache-2.0 & BSD-3-Clause & LGPL-2.0 & LGPL-2.1"
+LIC_FILES_CHKSUM = "\
+ file://src/LICENSE;md5=0fca02217a5d49a14dfe2d11837bb34d \
+ file://src/third_party/blink/renderer/core/LICENSE-LGPL-2;md5=36357ffde2b64ae177b2494445b79d21 \
+ file://src/third_party/blink/renderer/core/LICENSE-LGPL-2.1;md5=a778a33ef338abbaf8b8a7c36b6eec80 \
+"
+
+require gn-utils.inc
+
+inherit gettext qemu pythonnative
+
+DEPENDS = "virtual/gettext wayland wayland-native pixman freetype glib-2.0 fontconfig openssl pango cairo icu libxkbcommon libexif dbus pciutils udev libcap alsa-lib virtual/egl elfutils-native libdrm atk gperf-native gconf nss nss-native nspr nspr-native bison-native qemu-native"
+
+PROVIDES = "${BROWSER_APPLICATION}"
+
+SRC_URI = "\
+ git://github.com/igalia/${BPN};branch=WIP@39.agl.compositor;protocol=https;rev=${SRCREV_chromium68};name=chromium68 \
+ git://github.com/webosose/v8;destsuffix=git/src/v8;rev=${SRCREV_v8};name=v8 \
+ file://v8-qemu-wrapper.patch \
+"
+SRCREV_chromium68 = "61e96d1ee5dfc2461697457d287bf922d8a03d9a"
+SRCREV_v8 = "1e3af71f1ff3735e8a5b639c48dfca63a7b8a647"
+
+# we don't include SRCPV in PV, so we have to manually include SRCREVs in do_fetch vardeps
+do_fetch[vardeps] += "SRCREV_v8"
+SRCREV_FORMAT = "main_v8"
+
+S = "${WORKDIR}/git"
+
+SRC_DIR = "${S}/src"
+OUT_DIR = "${WORKDIR}/build"
+BUILD_TYPE = "Release"
+
+B = "${OUT_DIR}/${BUILD_TYPE}"
+
+WEBRUNTIME_BUILD_TARGET = "webos:weboswebruntime"
+BROWSER_APP_BUILD_TARGET = "chrome"
+BROWSER_APPLICATION = "chromium68-browser"
+BROWSER_APPLICATION_DIR = "/opt/chromium68"
+
+TARGET = "${WEBRUNTIME_BUILD_TARGET} ${BROWSER_APP_BUILD_TARGET}"
+
+# Skip do_install_append of webos_system_bus. It is not compatible with this component.
+WEBOS_SYSTEM_BUS_FILES_LOCATION = "${S}/files/sysbus"
+
+PACKAGECONFIG ?= "jumbo use-upstream-wayland"
+
+# Options to enable debug-webcore build.
+# Add the following line to local.conf (or local.dev.inc) to enable them:
+# PACKAGECONFIG_append_pn-chromium68 = " debug-webcore"
+# Other debug options are controlled by sections later in this file
+PACKAGECONFIG[debug-webcore] = "remove_webcore_debug_symbols=false,remove_webcore_debug_symbols=true"
+
+# Set a default value for jumbo file merge of 8. This should be good for build
+# servers and workstations with a big number of cores. In case build is
+# happening in a machine with less cores but still enough RAM a good value could
+# be 50.
+JUMBO_FILE_MERGE_LIMIT="8"
+PACKAGECONFIG[jumbo] = "use_jumbo_build=true jumbo_file_merge_limit=${JUMBO_FILE_MERGE_LIMIT}, use_jumbo_build=false"
+
+PACKAGECONFIG[lttng] = "use_lttng=true,use_lttng=false,lttng-ust,lttng-tools lttng-modules babeltrace"
+
+# Chromium can use v4l2 device for hardware accelerated video decoding on such boards as Renesas R-car M3, for example.
+# In case of R-car m3, additional patches are required for gstreamer and v4l2apps.
+# See https://github.com/igel-oss/meta-browser-hwdecode/tree/igalia-chromium71.
+PACKAGECONFIG[use-linux-v4l2] = "use_v4l2_codec=true use_v4lplugin=true use_linux_v4l2_only=true"
+
+PACKAGECONFIG[use-upstream-wayland] = " \
+ ozone_platform_wayland_external=false ozone_platform_wayland=true \
+ use_system_minigbm=true, \
+ ozone_platform_wayland_external=true ozone_platform_wayland=false \
+"
+
+GN_ARGS = "\
+ enable_memorymanager_webapi=false\
+ ffmpeg_branding=\"Chrome\"\
+ host_os=\"linux\"\
+ ozone_auto_platforms=false\
+ proprietary_codecs=true\
+ target_os=\"linux\"\
+ treat_warnings_as_errors=false\
+ is_agl=true\
+ use_cbe=true\
+ is_chrome_cbe=true\
+ use_cups=false\
+ use_custom_libcxx=false\
+ use_kerberos=false\
+ use_neva_media=false\
+ use_ozone=true\
+ use_xkbcommon=true\
+ use_pmlog=false\
+ use_system_debugger_abort=true\
+ use_webos_gpu_info_collector=false\
+ ${PACKAGECONFIG_CONFARGS}\
+"
+
+# From Chromium's BUILDCONFIG.gn:
+# Set to enable the official build level of optimization. This has nothing
+# to do with branding, but enables an additional level of optimization above
+# release (!is_debug). This might be better expressed as a tri-state
+# (debug, release, official) but for historical reasons there are two
+# separate flags.
+# See also: https://groups.google.com/a/chromium.org/d/msg/chromium-dev/hkcb6AOX5gE/PPT1ukWoBwAJ
+GN_ARGS += "is_debug=false is_official_build=true"
+
+# is_cfi default value is true for x86-64 builds with is_official_build=true.
+# As of M63, we explicitly need to set it to false, otherwise we fail the
+# following assertion in //build/config/sanitizers/sanitizers.gni:
+# assert(!is_cfi || is_clang,
+# "is_cfi requires setting is_clang = true in 'gn args'")
+GN_ARGS += "is_cfi=false"
+
+# By default, passing is_official_build=true to GN causes its symbol_level
+# variable to be set to "2". This means the compiler will be passed "-g2" and
+# we will end up with a very large chrome binary (around 5Gb as of M58)
+# regardless of whether DEBUG_BUILD has been set or not. In addition, binutils,
+# file and other utilities are unable to read a 32-bit binary this size, which
+# causes it not to be stripped.
+# The solution is two-fold:
+# 1. Make sure -g is not passed on 32-bit architectures via DEBUG_FLAGS. -g is
+# the same as -g2. -g1 generates an 800MB binary, which is a lot more
+# manageable.
+# 2. Explicitly pass symbol_level=0 to GN. This causes -g0 to be passed
+# instead, so that if DEBUG_BUILD is not set GN will not create a huge debug
+# binary anyway. Since our compiler flags are passed after GN's, -g0 does
+# not cause any issues if DEBUG_BUILD is set, as -g1 will be passed later.
+DEBUG_FLAGS_remove_arm = "-g"
+DEBUG_FLAGS_append_arm = "-g1"
+DEBUG_FLAGS_remove_x86 = "-g"
+DEBUG_FLAGS_append_x86 = "-g1"
+GN_ARGS += "symbol_level=0"
+
+# We do not want to use Chromium's own Debian-based sysroots, it is easier to
+# just let Chromium's build system assume we are not using a sysroot at all and
+# let Yocto handle everything.
+GN_ARGS += "use_sysroot=false"
+
+# Toolchains we will use for the build. We need to point to the toolchain file
+# we've created, set the right target architecture and make sure we are not
+# using Chromium's toolchain (bundled clang, bundled binutils etc).
+GN_ARGS += "\
+ custom_toolchain=\"//build/toolchain/yocto:yocto_target\" \
+ gold_path=\"\" \
+ host_toolchain=\"//build/toolchain/yocto:yocto_native\" \
+ is_clang=${@is_default_cc_clang(d)} \
+ clang_base_path=\"${@clang_install_path(d)}\" \
+ clang_use_chrome_plugins=false \
+ linux_use_bundled_binutils=false \
+ target_cpu=\"${@gn_target_arch_name(d)}\" \
+ v8_snapshot_toolchain=\"//build/toolchain/yocto:yocto_target\" \
+"
+
+# ARM builds need special additional flags (see ${S}/build/config/arm.gni).
+# If we do not pass |arm_arch| and friends to GN, it will deduce a value that
+# will then conflict with TUNE_CCARGS and CC.
+# Note that as of M61 in some corner cases parts of the build system disable
+# the "compiler_arm_fpu" GN config, whereas -mfpu is always passed via ${CC}.
+# We might want to rework that if there are issues in the future.
+def get_compiler_flag(params, param_name, d):
+ """Given a sequence of compiler arguments in |params|, returns the value of
+ an option |param_name| or an empty string if the option is not present."""
+ for param in params:
+ if param.startswith(param_name):
+ return param.split('=')[1]
+ return ''
+
+ARM_FLOAT_ABI = "${@bb.utils.contains('TUNE_FEATURES', 'callconvention-hard', 'hard', 'softfp', d)}"
+ARM_FPU = "${@get_compiler_flag(d.getVar('TUNE_CCARGS').split(), '-mfpu', d)}"
+ARM_TUNE = "${@get_compiler_flag(d.getVar('TUNE_CCARGS').split(), '-mcpu', d)}"
+ARM_VERSION_aarch64 = "8"
+ARM_VERSION_armv7a = "7"
+ARM_VERSION_armv7ve = "7"
+ARM_VERSION_armv6 = "6"
+
+# GN computes and defaults to it automatically where needed
+# forcing it from cmdline breaks build on places where it ends up
+# overriding what GN wants
+TUNE_CCARGS_remove = "-mthumb"
+
+GN_ARGS_append_arm = " \
+ arm_float_abi=\"${ARM_FLOAT_ABI}\" \
+ arm_fpu=\"${ARM_FPU}\" \
+ arm_tune=\"${ARM_TUNE}\" \
+ arm_version=${ARM_VERSION} \
+"
+# tcmalloc's atomicops-internals-arm-v6plus.h uses the "dmb" instruction that
+# is not available on (some?) ARMv6 models, which causes the build to fail.
+GN_ARGS_append_armv6 += 'use_allocator="none"'
+# The WebRTC code fails to build on ARMv6 when NEON is enabled.
+# https://bugs.chromium.org/p/webrtc/issues/detail?id=6574
+GN_ARGS_append_armv6 += 'arm_use_neon=false'
+
+# Disable glibc shims on musl
+# tcmalloc does not play well with musl as of M62 (and possibly earlier).
+# https://github.com/gperftools/gperftools/issues/693
+GN_ARGS_append_libc-musl = ' use_allocator_shim=false'
+
+# V8's JIT infrastructure requires binaries such as mksnapshot and
+# mkpeephole to be run in the host during the build. However, these
+# binaries must have the same bit-width as the target (e.g. a x86_64
+# host targeting ARMv6 needs to produce a 32-bit binary). Instead of
+# depending on a third Yocto toolchain, we just build those binaries
+# for the target and run them on the host with QEMU.
+python do_create_v8_qemu_wrapper () {
+ """Creates a small wrapper that invokes QEMU to run some target V8 binaries
+ on the host."""
+ qemu_libdirs = [d.expand('${STAGING_DIR_HOST}${libdir}'),
+ d.expand('${STAGING_DIR_HOST}${base_libdir}')]
+ qemu_cmd = qemu_wrapper_cmdline(d, d.getVar('STAGING_DIR_HOST', True),
+ qemu_libdirs)
+ wrapper_path = d.expand('${B}/v8-qemu-wrapper.sh')
+ with open(wrapper_path, 'w') as wrapper_file:
+ wrapper_file.write("""#!/bin/sh
+
+# This file has been generated automatically.
+# It invokes QEMU to run binaries built for the target in the host during the
+# build process.
+
+%s "$@"
+""" % qemu_cmd)
+ os.chmod(wrapper_path, 0o755)
+}
+do_create_v8_qemu_wrapper[dirs] = "${B}"
+addtask create_v8_qemu_wrapper after do_patch before do_configure
+
+python do_write_toolchain_file () {
+ """Writes a BUILD.gn file for Yocto detailing its toolchains."""
+ toolchain_dir = d.expand("${S}/src/build/toolchain/yocto")
+ bb.utils.mkdirhier(toolchain_dir)
+ toolchain_file = os.path.join(toolchain_dir, "BUILD.gn")
+ write_toolchain_file(d, toolchain_file)
+}
+addtask write_toolchain_file after do_patch before do_configure
+
+# More options to speed up the build
+GN_ARGS += "\
+ enable_nacl=false\
+ disable_ftp_support=true\
+ enable_print_preview=false\
+ enable_remoting=false\
+ use_glib=true\
+ use_gnome_keyring=false\
+ use_pulseaudio=false\
+"
+
+# Respect ld-is-gold in DISTRO_FEATURES when enabling gold
+# Similar patch applied in meta-browser
+# http://patchwork.openembedded.org/patch/77755/
+EXTRA_OEGN_GOLD = "${@bb.utils.contains('DISTRO_FEATURES', 'ld-is-gold', 'use_gold=true', 'use_gold=false', d)}"
+GN_ARGS += "${EXTRA_OEGN_GOLD}"
+
+# Doesn't build for armv[45]*
+COMPATIBLE_MACHINE = "(-)"
+COMPATIBLE_MACHINE_aarch64 = "(.*)"
+COMPATIBLE_MACHINE_armv6 = "(.*)"
+COMPATIBLE_MACHINE_armv7a = "(.*)"
+COMPATIBLE_MACHINE_armv7ve = "(.*)"
+COMPATIBLE_MACHINE_x86 = "(.*)"
+COMPATIBLE_MACHINE_x86-64 = "(.*)"
+
+#CHROMIUM_PLUGINS_PATH = "${libdir}"
+CBE_DATA_PATH = "${libdir}/cbe"
+CBE_DATA_LOCALES_PATH = "${CBE_DATA_PATH}/locales"
+
+# The text relocations are intentional -- see comments in [GF-52468]
+# TODO: check if we need INSANE_SKIP on ldflags
+INSANE_SKIP_${PN} = "textrel ldflags"
+
+
+do_compile[progress] = "outof:^\[(\d+)/(\d+)\]\s+"
+do_compile() {
+ if [ ! -f ${OUT_DIR}/${BUILD_TYPE}/build.ninja ]; then
+ do_configure
+ fi
+
+ export PATH="${S}/depot_tools:$PATH"
+ ${S}/depot_tools/ninja -v -C ${OUT_DIR}/${BUILD_TYPE} ${TARGET}
+}
+
+do_configure() {
+ configure_env
+}
+
+configure_env() {
+ export GYP_CHROMIUM_NO_ACTION=1
+ export PATH="${S}/depot_tools:$PATH"
+
+ GN_ARGS="${GN_ARGS}"
+ echo GN_ARGS is ${GN_ARGS}
+ echo BUILD_TARGETS are ${TARGET}
+ cd ${SRC_DIR}
+ gn gen ${OUT_DIR}/${BUILD_TYPE} --args="${GN_ARGS}"
+}
+
+WINDOW_SIZE ?= "1920,1080"
+
+configure_browser_settings() {
+ USER_AGENT="Mozilla/5.0 (Linux; NetCast; U) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/${CHROMIUM_VERSION} Safari/537.31"
+ echo "${USER_AGENT}" > ${D_DIR}/user_agent_conf
+ #We can replace below WINDOW_SIZE values from build configuration if available
+ #echo "${WINDOW_SIZE}" > ${D_DIR}/window_size_conf
+}
+
+install_chromium_browser() {
+ D_DIR=${D}${BROWSER_APPLICATION_DIR}
+ install -d ${D_DIR}
+
+ # Install browser files
+ if [ -e "${SRC_DIR}/webos/install" ]; then
+ cd ${OUT_DIR}/${BUILD_TYPE}
+ xargs --arg-file=${SRC_DIR}/webos/install/default_browser/binary.list cp -R --no-dereference --preserve=mode,links -v --target-directory=${D_DIR}
+ cd ${SRC_DIR}
+ xargs --arg-file=${SRC_DIR}/webos/install/default_browser/runtime.list cp -R --no-dereference --preserve=mode,links -v --target-directory=${D_DIR}
+ fi
+
+ # AGL does not have PMLOG
+ sed -i.bak s/PmLogCtl.*// ${D_DIR}/run_webbrowser
+
+ # To execute chromium in JAILER, Security Part needs permissions change
+ # run_webbrowser: Script file for launching chromium
+ chmod -v 755 ${D_DIR}/chrome
+ chmod -v 755 ${D_DIR}/kill_webbrowser
+ chmod -v 755 ${D_DIR}/run_webbrowser
+
+ configure_browser_settings
+}
+
+install_webruntime() {
+ install -d ${D}${libdir}
+ install -d ${D}${includedir}/${BPN}
+ install -d ${D}${CBE_DATA_PATH}
+ install -d ${D}${CBE_DATA_LOCALES_PATH}
+
+ # Install webos webview files
+ if [ -e "${SRC_DIR}/webos/install" ]; then
+ cd ${SRC_DIR}
+ xargs --arg-file=${SRC_DIR}/webos/install/weboswebruntime/staging_inc.list cp --parents --target-directory=${D}${includedir}/${BPN}
+
+ cd ${OUT_DIR}/${BUILD_TYPE}
+
+ cp libcbe.so ${D}${libdir}/
+ if [ "${WEBOS_LTTNG_ENABLED}" = "1" ]; then
+ # use bindir if building non-cbe
+ cp libchromium_lttng_provider.so ${D}${libdir}/
+ fi
+ xargs --arg-file=${SRC_DIR}/webos/install/weboswebruntime/binary.list cp --parents --target-directory=${D}${CBE_DATA_PATH}
+ cat ${SRC_DIR}/webos/install/weboswebruntime/data_locales.list | xargs -I{} install -m 755 -p {} ${D}${CBE_DATA_LOCALES_PATH}
+ fi
+
+ # move this to separate mksnapshot-cross recipe once we figure out how to build just cross mksnapshot from chromium repository
+ install -d ${D}${bindir_cross}
+ gzip -c ${OUT_DIR}/${BUILD_TYPE}/${MKSNAPSHOT_PATH}mksnapshot > ${D}${bindir_cross}/${HOST_SYS}-mksnapshot.gz
+}
+
+do_install() {
+ install_webruntime
+ install_chromium_browser
+}
+
+WEBOS_SYSTEM_BUS_DIRS_LEGACY_BROWSER_APPLICATION = " \
+ ${webos_sysbus_prvservicesdir}/${BROWSER_APPLICATION}.service \
+ ${webos_sysbus_pubservicesdir}/${BROWSER_APPLICATION}.service \
+ ${webos_sysbus_prvrolesdir}/${BROWSER_APPLICATION}.json \
+ ${webos_sysbus_pubrolesdir}/${BROWSER_APPLICATION}.json \
+"
+
+SYSROOT_DIRS_append = " ${bindir_cross}"
+
+PACKAGES_prepend = " \
+ ${PN}-cross-mksnapshot \
+ ${BROWSER_APPLICATION} \
+"
+
+FILES_${BROWSER_APPLICATION} += " \
+ ${BROWSER_APPLICATION_DIR} \
+ ${WEBOS_SYSTEM_BUS_DIRS_LEGACY_BROWSER_APPLICATION} \
+"
+
+RDEPENDS_${BROWSER_APPLICATION} += "${PN}"
+
+VIRTUAL-RUNTIME_gpu-libs ?= ""
+RDEPENDS_${PN} += "${VIRTUAL-RUNTIME_gpu-libs}"
+
+# The text relocations are intentional -- see comments in [GF-52468]
+# TODO: check if we need INSANE_SKIP on ldflags
+INSANE_SKIP_${BROWSER_APPLICATION} += "libdir ldflags textrel"
+
+FILES_${PN} = " \
+ ${libdir}/*.so \
+ ${CBE_DATA_PATH}/* \
+ ${libdir}/${BPN}/*.so \
+ ${WEBOS_SYSTEM_BUS_DIRS} \
+"
+
+FILES_${PN}-dev = " \
+ ${includedir} \
+"
+
+FILES_${PN}-cross-mksnapshot = "${bindir_cross}/${HOST_SYS}-mksnapshot.gz"
diff --git a/recipes-wam/chromium/gn-utils.inc b/recipes-wam/chromium/gn-utils.inc
new file mode 100644
index 00000000..0fd55a63
--- /dev/null
+++ b/recipes-wam/chromium/gn-utils.inc
@@ -0,0 +1,157 @@
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+# GN host architecture helpers.
+#
+# BUILD_ARCH's value corresponds to what uname returns as the machine name.
+# The mapping in gn_host_arch_name() tries to match several possible values
+# returned by the Linux kernel in uname(2) into the corresponding values GN
+# understands.
+def gn_host_arch_name(d):
+ """Returns a GN architecture name corresponding to the build host's machine
+ architecture."""
+ import re
+ arch_translations = {
+ r'aarch64.*': 'arm64',
+ r'arm.*': 'arm',
+ r'i[3456]86$': 'x86',
+ r'x86_64$': 'x64',
+ }
+ build_arch = d.getVar("BUILD_ARCH")
+ for arch_regexp, gn_arch_name in arch_translations.items():
+ if re.match(arch_regexp, build_arch):
+ return gn_arch_name
+ bb.fatal('Unsuported BUILD_ARCH value: "%s"' % build_arch)
+
+# GN target architecture helpers.
+#
+# Determining the target architecture is more difficult, as there are many
+# different values we can use on the Yocto side (e.g. TUNE_ARCH, TARGET_ARCH,
+# MACHINEOVERRIDES etc). What we do is define the mapping with regular,
+# non-Python variables with overrides that are generic enough (i.e. "x86"
+# instead of "i586") and then use gn_target_arch_name() to return the right
+# value with some validation.
+GN_TARGET_ARCH_NAME_aarch64 = "arm64"
+GN_TARGET_ARCH_NAME_arm = "arm"
+GN_TARGET_ARCH_NAME_x86 = "x86"
+GN_TARGET_ARCH_NAME_x86-64 = "x64"
+
+BUILD_CC_toolchain-clang = "clang"
+BUILD_CXX_toolchain-clang = "clang++"
+BUILD_LD_toolchain-clang = "clang"
+
+# knob for clang, when using meta-clang to provide clang and case where
+# clang happens to be default compiler for OE we should let it use clang
+def is_default_cc_clang(d):
+ """Return true if clang is default cross compiler."""
+ toolchain = d.getVar("TOOLCHAIN")
+ overrides = d.getVar("OVERRIDES")
+ if toolchain == "clang" and "toolchain-clang" in overrides.split(":"):
+ return "true"
+ return "false"
+
+def clang_install_path(d):
+ """Return clang compiler install path."""
+ return d.getVar("STAGING_BINDIR_NATIVE")
+
+def gn_target_arch_name(d):
+ """Returns a GN architecture name corresponding to the target machine's
+ architecture."""
+ name = d.getVar("GN_TARGET_ARCH_NAME")
+ if name is None:
+ bb.fatal('Unsupported target architecture. A valid override for the '
+ 'GN_TARGET_ARCH_NAME variable could not be found.')
+ return name
+
+def write_toolchain_file(d, file_path):
+ """Creates a complete GN toolchain file in |file_path|."""
+ import string
+ gcc_toolchain_tmpl = string.Template(
+ 'gcc_toolchain("${toolchain_name}") {\n'
+ ' cc = "${cc}"\n'
+ ' cxx = "${cxx}"\n'
+ ' ar = "${ar}"\n'
+ ' ld = cxx # GN expects a compiler, not a linker.\n'
+ ' nm = "${nm}"\n'
+ ' readelf = "${readelf}"\n'
+ ' extra_cflags = "${extra_cflags}"\n'
+ ' extra_cppflags = "${extra_cppflags}"\n'
+ ' extra_cxxflags = "${extra_cxxflags}"\n'
+ ' extra_ldflags = "${extra_ldflags}"\n'
+ ' toolchain_args = {\n'
+ ' current_cpu = "${current_cpu}"\n'
+ ' current_os = "linux"\n'
+ ' is_clang = false\n'
+ ' }\n'
+ '}\n'
+ )
+ clang_toolchain_tmpl = string.Template(
+ 'clang_toolchain("clang_${toolchain_name}") {\n'
+ ' extra_cflags = "${extra_cflags}"\n'
+ ' extra_cppflags = "${extra_cppflags}"\n'
+ ' extra_cxxflags = "${extra_cxxflags}"\n'
+ ' extra_ldflags = "${extra_ldflags}"\n'
+ ' toolchain_args = {\n'
+ ' current_cpu = "${current_cpu}"\n'
+ ' current_os = "linux"\n'
+ ' is_clang = true\n'
+ ' use_gold = true\n'
+ ' }\n'
+ '}\n'
+ )
+
+ native_toolchain = {
+ 'toolchain_name': 'yocto_native',
+ 'current_cpu': gn_host_arch_name(d),
+ 'cc': d.expand('${BUILD_CC}'),
+ 'cxx': d.expand('${BUILD_CXX}'),
+ 'ar': d.expand('${BUILD_AR}'),
+ 'nm': d.expand('${BUILD_NM}'),
+ 'readelf': d.expand('${BUILD_PREFIX}readelf'),
+ 'extra_cflags': d.expand('${BUILD_CFLAGS}'),
+ 'extra_cppflags': d.expand('${BUILD_CPPFLAGS}'),
+ 'extra_cxxflags': d.expand('${BUILD_CXXFLAGS}'),
+ 'extra_ldflags': d.expand('${BUILD_LDFLAGS}'),
+ }
+ target_toolchain = {
+ 'toolchain_name': 'yocto_target',
+ 'current_cpu': gn_target_arch_name(d),
+ 'cc': d.expand('${CC}'),
+ 'cxx': d.expand('${CXX}'),
+ 'ar': d.expand('${AR}'),
+ 'nm': d.expand('${NM}'),
+ 'readelf': d.expand('${TARGET_PREFIX}readelf'),
+ 'extra_cflags': d.expand('${TARGET_CFLAGS}'),
+ 'extra_cppflags': d.expand('${TARGET_CPPFLAGS}'),
+ 'extra_cxxflags': d.expand('${TARGET_CXXFLAGS}'),
+ 'extra_ldflags': d.expand('${TARGET_LDFLAGS}'),
+ 'strip': '',
+ }
+
+ with open(file_path, 'w') as toolchain_file:
+ toolchain_file.write(
+ '# This file has been generated automatically.\n'
+ '\n'
+ 'import("//build/config/sysroot.gni")\n'
+ 'import("//build/toolchain/gcc_toolchain.gni")\n'
+ '\n'
+ )
+ toolchain_file.write(gcc_toolchain_tmpl.substitute(native_toolchain))
+ toolchain_file.write(gcc_toolchain_tmpl.substitute(target_toolchain))
+ toolchain_file.write(clang_toolchain_tmpl.substitute(native_toolchain))
+ toolchain_file.write(clang_toolchain_tmpl.substitute(target_toolchain))
diff --git a/recipes-wam/wam/files/WebAppMgr.env b/recipes-wam/wam/files/WebAppMgr.env
new file mode 100644
index 00000000..c8ddc517
--- /dev/null
+++ b/recipes-wam/wam/files/WebAppMgr.env
@@ -0,0 +1,202 @@
+##### AGL: not set in WebAppMgr@.service
+#XDG_SESSION_ID="c2"
+
+##### AGL: set by WebAppMgr@.service (depends on user)
+#XDG_RUNTIME_DIR="/run/user/%i"
+
+# Set wam executable file path
+HOOK_SEGV=NO
+WAM_EXE_PATH="/usr/bin/WebAppMgr"
+
+# Set wam name for user-agent
+WAM_NAME="WebAppManager"
+
+# Only allow UTF8 encoding for luna-service messages.
+LS_ENABLE_UTF8=1
+
+# Set effective userid and groupid
+#WAM_UID="wam"
+#WAM_GID="compositor"
+
+# Set location of error page (will follow localization rules based on this path)
+#WAM_ERROR_PAGE="file:///usr/share/localization/wam/loaderror.html"
+
+# suspending javascript execution delay for page visibility
+WAM_SUSPEND_DELAY_IN_MS=250
+
+#if [ -e "etc/wam/make_shm.sh" ] ; then
+# /etc/wam/make_shm.sh
+#fi
+
+# Set user data directory for WebAppMgr
+##### AGL: set by WebAppMgr@.service (depends on user)
+#WAM_DATA_PATH="/home/%i/wamdata"
+
+# ensure that wam data directories exist
+#mkdir -p ${WAM_DATA_PATH}
+
+# set directories permission
+#chown ${WAM_UID}:${WAM_GID} ${WAM_DATA_PATH}
+
+# setup 50 Mb maximum for ApplicationCache
+WAM_APPCACHE_MAXSIZE=52428800
+
+# setup 10 Mb maximum for ApplicationCache per domain
+WAM_APPCACHE_DOMAINLIMIT=10485760
+
+# setup 50 Mb maximum for DiskCache
+WAM_DISKCACHE_MAXSIZE=52428800
+
+# setup 256 Kb maximum for resource buffer allocation
+WAM_RESOURCE_BUFFER_MAX_ALLOC_SIZE=262144
+
+# setup 1 Mb for resource buffer
+WAM_RESOURCE_BUFFER_SIZE=1048576
+
+# setup 200 seconds for watchdog timeout of render process
+WATCHDOG_RENDER_TIMEOUT=200
+
+# setup nubmer of raster threads to 1
+BLINK_NUM_RASTER_THREADS=2
+
+# use default tile width if not sed by recipe
+#if [ "$BLINK_NUM_RASTER_THREADS" = "WEBOS${BLINK_NUM_RASTER_THREADS#WEBOS}" ]; then
+BLINK_NUM_RASTER_THREADS=1
+#fi
+
+# setup 6 Mb maximum for the program GPU cache
+GPU_PROGRAM_CACHE_SIZE=6144
+
+# disable using enyo system app specfic optimization
+# currently used optimizations : inline caching off
+#USE_SYSTEM_APP_OPTIMIZATION="0"
+
+# Set location of NaCl modules
+#CHROMIUM_PATH="/usr/palm/applications/com.lge.app.chromium"
+#NACL_PLUGIN=${CHROMIUM_PATH}"/libppGoogleNaClPluginChrome.so"
+#NACL_IRT_LIBRARY=${CHROMIUM_PATH}"/nacl_irt_arm.nexe"
+#NACL_HELPER=${CHROMIUM_PATH}"/nacl_helper"
+#NACL_HELPER_BOOTSTRAP=${CHROMIUM_PATH}"/nacl_helper_bootstrap"
+
+# Set location of NPAPI plugins for all Apps including default Apps
+# This is for the flash plugin of Signage, webOS TV doesn't use it.
+#PRIVILEGED_PLUGIN_PATH=""
+
+# Set location of NPAPI plugins for NetCast Apps
+# NetCast Apps should access only the plugins in this path
+#NETCAST_PLUGIN_PATH="/usr/lib/BrowserPlugins"
+
+# Set location of NPAPI plugins for HbbTV app.
+#HBBTV_PLUGIN_PATH="/usr/lib/HbbtvPlugins"
+
+# Set InetTV player stored path
+#INETTV_HTML_PLAYER_PATH="/usr/share/inettv/inettv_player/index.html"
+
+# Set location of extra libraries
+#CDM_LIB_PATH="/usr/lib"
+
+# Set location of all NPAPI plugins
+NPAPI_PLUGIN_PATH=${HBBTV_PLUGIN_PATH}":"${NETCAST_PLUGIN_PATH}":"${PRIVILEGED_PLUGIN_PATH}
+
+#if [ -e "etc/wam/make_shm.sh" ] ; then
+# /etc/wam/make_shm.sh
+#fi
+
+# setup 8 Mb minimum codecache capacity
+JSC_minGlobalCodeCacheCapacity=8388608
+
+# Enable more explicit logging of timing with regards to rendering
+# export WAM2_ENABLE_DEBUG_RENDER_TIMING=1
+
+# enable Web Inspector and Tellurium if in developer mode
+TELLURIUM_NUB_PATH=/usr/palm/tellurium/telluriumnub.js
+ENABLE_INSPECTOR=1
+
+# Enable cursor by default
+ENABLE_CURSOR_BY_DEFAULT=1
+
+# Enable launch optimization
+ENABLE_LAUNCH_OPTIMIZATION=1
+
+# Set the duration(seconds) passed from last network activity (e.g. FMP Detector)
+# If set to a positive value, adjust a custom timeout for a network stable timer in FMPDetector
+NETWORK_STABLE_TIMEOUT=3
+
+# please keep it in alphabetical order
+#WAM_EXTRA_FLAGS=""
+#WAM_JS_FLAGS=""
+#WAM_COMMON_SWITCHES=" \
+# --application-cache-domain-limit=$WAM_APPCACHE_DOMAINLIMIT \
+# --application-cache-size=$WAM_APPCACHE_MAXSIZE \
+# --browser-subprocess-path=$WAM_EXE_PATH \
+# --disable-direct-npapi-requests \
+# --disable-extensions \
+# --disable-low-res-tiling \
+# --disable-new-video-renderer \
+# --disk-cache-size=$WAM_DISKCACHE_MAXSIZE \
+# --enable-aggressive-release-policy \
+# --enable-accelerated-plugin-rendering \
+# --accelerated-plugin-rendering-blacklist=device;drmAgent;sound;service \
+# --enable-gpu-rasterization \
+# --disable-gpu-rasterization-for-first-frame \
+# --enable-key-event-throttling \
+# --enable-threaded-compositing \
+# --enable-watchdog \
+# --hide-selection-handles \
+# --ignore-gpu-blacklist \
+# --ignore-netif=p2p \
+# --in-process-gpu \
+# --max-unused-resource-memory-usage-percentage=0 \
+# --network-stable-timeout=$NETWORK_STABLE_TIMEOUT \
+# --noerrdialogs \
+# --num-raster-threads=$BLINK_NUM_RASTER_THREADS \
+# --ozone-platform=wayland \
+# --remote-debugging-port=9998 \
+# --resource-buffer-max-allocation-size=$WAM_RESOURCE_BUFFER_MAX_ALLOC_SIZE \
+# --resource-buffer-size=$WAM_RESOURCE_BUFFER_SIZE \
+# --touch-events=disabled \
+# --ui-disable-opaque-shader-program \
+# --user-agent-suffix=SmartTV \
+# --user-data-dir=$WAM_DATA_PATH \
+# --enable-devtools-experiments \
+# --webos-wam \ "
+
+#WAM_LITE_SWITCHES=" --in-process-zygote "
+
+#export WAM_WEBOS_LITE=NO
+#if [ "${WAM_WEBOS_LITE}" = "YES" ] ; then
+# export WAM_SWITCHES=${WAM_COMMON_SWITCHES}${WAM_LITE_SWITCHES}
+# export SKIA_FONT_CACHE_SIZE=1
+# export SKIA_IMAGE_CACHE_SIZE=40
+# export SKIA_BACKGROUND_FONT_CACHE_SIZE=0
+#else
+# export WAM_SWITCHES=${WAM_COMMON_SWITCHES}
+# export SKIA_FONT_CACHE_SIZE=8
+# export SKIA_IMAGE_CACHE_SIZE=80
+# export SKIA_BACKGROUND_FONT_CACHE_SIZE=512
+#fi
+
+#export WAM_EXTRA_SKIA_CACHE_SWITCHES=" \
+# --skia-font-cache-size-mb=$SKIA_FONT_CACHE_SIZE \
+# --skia-image-cache-size-mb=$SKIA_IMAGE_CACHE_SIZE \
+# --skia-background-font-cache-size-kb=$SKIA_BACKGROUND_FONT_CACHE_SIZE \
+# "
+
+#export WAM_EXTRA_GPU_TUNING_SWITCHES=" \
+# --gpu-program-cache-size-kb=$GPU_PROGRAM_CACHE_SIZE \
+# "
+#export WAM_WATCHDOG_RENDER_TIMEOUT_SWITCHES=" \
+# --watchdog-render-timeout=$WATCHDOG_RENDER_TIMEOUT \
+# "
+
+#WEBOS_LOAD_ACCESSIBILITY_PLUGIN=1
+
+#WAM_V8_CODE_CACHE_SWITCHES=" --enable-local-resource-code-cache --disallow-code-cache-from-file-uris-with-query-string "
+
+# Load any special configuration from plugins
+#if [ -e "/etc/wam/plugins/conf.sh" ] ; then
+# . /etc/wam/plugins/conf.sh || true
+#fi
+
+#exec $WAM_EXE_PATH $WAM_SWITCHES $WAM_EXTRA_SKIA_CACHE_SWITCHES $WAM_EXTRA_GPU_TUNING_SWITCHES $WAM_WATCHDOG_RENDER_TIMEOUT_SWITCHES $WAM_EXTRA_FLAGS $WAM_V8_CODE_CACHE_SWITCHES --js-flags="$WAM_JS_FLAGS"
+
diff --git a/recipes-wam/wam/files/WebAppMgr@.service b/recipes-wam/wam/files/WebAppMgr@.service
new file mode 100644
index 00000000..a855bf9f
--- /dev/null
+++ b/recipes-wam/wam/files/WebAppMgr@.service
@@ -0,0 +1,37 @@
+# @@@LICENSE
+#
+# Copyright (c) 2017-2018 LG Electronics, Inc.
+#
+# Confidential computer software. Valid license from LG required for
+# possession, use or copying. Consistent with FAR 12.211 and 12.212,
+# Commercial Computer Software, Computer Software Documentation, and
+# Technical Data for Commercial Items are licensed to the U.S. Government
+# under vendor's standard commercial license.
+#
+# LICENSE@@@
+
+[Unit]
+Description="WebAppMgr is responsible for running web apps and manage their lifecycle"
+After=afm-service-homescreen-service--0.1--main@%i.service weston@display.service
+Wants=afm-service-homescreen-service--0.1--main@%i.service
+BindsTo=weston@display.service
+
+[Service]
+Type=simple
+User=%i
+Slice=user-%i.slice
+SmackProcessLabel=System
+SupplementaryGroups=audio display
+UMask=0077
+CapabilityBoundingSet=
+OOMScoreAdjust=-1000
+EnvironmentFile=-/etc/default/WebAppMgr.env
+Environment=XDG_RUNTIME_DIR=/run/user/%i
+Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%i/bus
+Environment=WAM_DATA_PATH="/home/%i/wamdata"
+ExecStart=/usr/bin/WebAppMgr --no-sandbox --in-process-gpu --remote-debugging-port=9998 --user-data-dir="/home/%i/wamdata" --webos-wam
+Restart=on-failure
+RestartSec=50
+
+[Install]
+WantedBy=default.target
diff --git a/recipes-wam/wam/files/trunc-webapp-roles.patch b/recipes-wam/wam/files/trunc-webapp-roles.patch
new file mode 100644
index 00000000..829abe07
--- /dev/null
+++ b/recipes-wam/wam/files/trunc-webapp-roles.patch
@@ -0,0 +1,56 @@
+From f31e93261f34abaa3dcdc4959963f5b5a8983002 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Jan-Simon=20M=C3=B6ller?= <jsmoeller@linuxfoundation.org>
+Date: Thu, 25 Jun 2020 19:47:24 +0200
+Subject: [PATCH] Set webapp roles that are max 12 characters long.
+
+From: =?UTF-8?q?Jacobo=20Aragunde=20P=C3=A9rez?= <jaragunde@igalia.com>
+
+This is a workaround for SPEC-3127. To prevent repeated roles as much
+as possible, I'm using the appid as a basis instead of "Webapp-" +
+host + port, which has many chances to be redundant in the first 12
+chars.
+
+Bug-AGL: SPEC-3127
+
+---
+ src/agl/WebRuntimeAGL.cpp | 10 +++-------
+ 1 file changed, 3 insertions(+), 7 deletions(-)
+
+diff --git a/src/agl/WebRuntimeAGL.cpp b/src/agl/WebRuntimeAGL.cpp
+index aed928b..efd2ee4 100644
+--- a/src/agl/WebRuntimeAGL.cpp
++++ b/src/agl/WebRuntimeAGL.cpp
+@@ -274,7 +274,6 @@ int WebAppLauncherRuntime::run(int argc, const char** argv) {
+
+ m_id = getAppId(args);
+ m_url = getAppUrl(args);
+- m_role = "WebApp";
+
+ setup_signals();
+
+@@ -326,15 +325,9 @@ bool WebAppLauncherRuntime::init() {
+ if (n != std::string::npos) {
+ std::string sport = authority.substr(n+1);
+ m_host = authority.substr(0, n);
+- m_role.push_back('-');
+- m_role.append(m_host);
+- m_role.push_back('-');
+- m_role.append(sport);
+ m_port = stringTo<int>(sport);
+ } else {
+ m_host = authority;
+- m_role.push_back('-');
+- m_role.append(m_host);
+ }
+ }
+
+@@ -375,6 +368,9 @@ bool WebAppLauncherRuntime::init() {
+ m_role = "homescreen";
+ else if (m_id.rfind("webapps-homescreen", 0) == 0)
+ m_role = "homescreen";
++ else {
++ m_role = m_id.substr(0,12);
++ }
+
+ LOG_DEBUG("id=[%s], name=[%s], role=[%s], url=[%s], host=[%s], port=%d, token=[%s], width=[%s], height[%s], surface_type[%d], panel_type[%d]",
+ m_id.c_str(), m_name.c_str(), m_role.c_str(), m_url.c_str(),
diff --git a/recipes-wam/wam/wam_git.bb b/recipes-wam/wam/wam_git.bb
new file mode 100644
index 00000000..d50a14fa
--- /dev/null
+++ b/recipes-wam/wam/wam_git.bb
@@ -0,0 +1,51 @@
+SUMMARY = "WAM"
+AUTHOR = "Jani Hautakangas <jani.hautakangas@lge.com>"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+inherit cmake
+
+DEPENDS = "glib-2.0 jsoncpp boost chromium68 wayland-ivi-extension libhomescreen"
+
+EXTRA_OECMAKE = "\
+ -DCMAKE_BUILD_TYPE=Release \
+ -DCMAKE_INSTALL_PREFIX=${prefix} \
+ -DPLATFORM_NAME=${@'${DISTRO}'.upper().replace('-', '_')} \
+ -DCHROMIUM_SRC_DIR=${STAGING_INCDIR}/chromium68"
+
+PR="r0"
+
+PROVIDES += "virtual/webruntime"
+RPROVIDES_${PN} += "virtual/webruntime"
+
+SRC_URI = "\
+ git://github.com/igalia/${BPN}.git;branch=WIP@6.agl.compositor;protocol=https \
+ file://WebAppMgr@.service \
+ file://WebAppMgr.env \
+ file://trunc-webapp-roles.patch \
+"
+S = "${WORKDIR}/git"
+SRCREV = "bd650046b688eb1593ae68c16ba3912837507d08"
+
+do_install_append() {
+ install -d ${D}${sysconfdir}/wam
+ install -v -m 644 ${S}/files/launch/security_policy.conf ${D}${sysconfdir}/wam/security_policy.conf
+ install -d ${D}${systemd_system_unitdir}
+ install -v -m 644 ${WORKDIR}/WebAppMgr@.service ${D}${systemd_system_unitdir}/WebAppMgr@.service
+ install -d ${D}${sysconfdir}/default/
+ install -v -m 644 ${WORKDIR}/WebAppMgr.env ${D}${sysconfdir}/default/WebAppMgr.env
+ ln -snf WebAppMgr ${D}${bindir}/web-runtime
+ install -d ${D}${systemd_system_unitdir}/afm-user-session@.target.wants
+ ln -sf ../WebAppMgr@.service ${D}${systemd_system_unitdir}/afm-user-session@.target.wants/
+}
+
+FILES_${PN} += "${sysconfdir}/init ${sysconfdir}/wam ${libdir}/webappmanager/plugins/*.so ${systemd_system_unitdir}"
+
+CXXFLAGS_append_agl-devel = " -DAGL_DEVEL"
+
+do_install_append_agl-devel() {
+ # Enable remote inspector and dev mode
+ install -d ${D}${localstatedir}/agl-devel/preferences
+ touch ${D}${localstatedir}/agl-devel/preferences/debug_system_apps
+ touch ${D}${localstatedir}/agl-devel/preferences/devmode_enabled
+}
diff --git a/scripts/run-yocto-check-layer-all-layers.sh b/scripts/run-yocto-check-layer-all-layers.sh
new file mode 100755
index 00000000..44f6e6b1
--- /dev/null
+++ b/scripts/run-yocto-check-layer-all-layers.sh
@@ -0,0 +1,67 @@
+#!/bin/bash
+set -x
+
+SCRIPTPATH="$( cd $(dirname $0) >/dev/null 2>&1 ; pwd -P )"
+echo $SCRIPTPATH
+AGLROOT="$SCRIPTPATH/../.."
+POKYDIR="$AGLROOT/external/poky"
+TMPROOT=`mktemp -d`
+
+rm -rf ${TMPROOT}/testbuild-ycl || true
+mkdir -p ${TMPROOT}/testbuild-ycl
+cd ${TMPROOT}/testbuild-ycl
+
+source $POKYDIR/oe-init-build-env .
+
+cat << EOF >> conf/local.conf
+# just define defaults
+AGL_FEATURES ?= ""
+AGL_EXTRA_IMAGE_FSTYPES ?= ""
+
+# important settings imported from poky-agl.conf
+# we do not import
+DISTRO_FEATURES_append = " systemd smack"
+DISTRO_FEATURES_BACKFILL_CONSIDERED_append = " sysvinit"
+VIRTUAL-RUNTIME_init_manager = "systemd"
+#AGL_FEATURES += "aglcore agldemo"
+#DISTRO_FEATURES_append = " appfw"
+
+# workaround:
+# ERROR: Nothing PROVIDES 'smack' (but /home/dl9pf/AGL/master-newlayout/external/meta-openembedded/meta-oe/recipes-extended/ostree/ostree_2020.3.bb DEPENDS on or otherwise requires it)
+BBMASK += "meta-openembedded/meta-oe/recipes-extended/ostree/ostree_2020.3.bb"
+#ERROR: Nothing RPROVIDES 'qtwebengine-qmlplugins' (but /home/dl9pf/AGL/master-newlayout/external/meta-qt5/recipes-qt/qt5/qt5-creator_git.bb RDEPENDS on or otherwise requires it)
+BBMASK += "meta-qt5/recipes-qt/qt5/qt5-creator_git.bb"
+#ERROR: Nothing RPROVIDES 'python' (but /home/dl9pf/AGL/master-newlayout/external/meta-security/recipes-mac/smack/smack-test_1.0.bb RDEPENDS on or otherwise requires it)
+BBMASK += "meta-security/recipes-mac/smack/smack-test_1.0.bb"
+
+# missing in upstream recipes ... aka FIXME upstream
+BBCLASSEXTEND_pn-libzip = "native nativesdk"
+BBCLASSEXTEND_pn-xmlsec1 = "native nativesdk"
+AGL_APP_REVISION = "${AUTOREV}"
+
+EOF
+
+
+yocto-check-layer -d \
+ --dependency \
+ $AGLROOT/external/meta-openembedded/meta-oe \
+ $AGLROOT/external/meta-openembedded/meta-oe \
+ $AGLROOT/external/meta-openembedded/meta-python \
+ $AGLROOT/external/meta-openembedded/meta-networking \
+ $AGLROOT/external/meta-security \
+ $AGLROOT/external/meta-openembedded/meta-perl \
+ $AGLROOT/meta-agl/meta-agl-core \
+ $AGLROOT/external/meta-qt5 \
+ $AGLROOT/meta-agl/meta-app-framework \
+ --additional-layers \
+ $AGLROOT/external/meta-qt5 \
+ $AGLROOT/meta-agl/meta-app-framework \
+ $AGLROOT/external/meta-python2 \
+ -- \
+ $AGLROOT/meta-agl-demo
+
+cat ${TMPROOT}/testbuild-ycl/conf/bblayers.conf
+
+[ $? = 0 ] && rm -rf ${TMPROOT}/testbuild-ycl
+
+exit 0
diff --git a/scripts/run-yocto-check-layer.sh b/scripts/run-yocto-check-layer.sh
new file mode 100755
index 00000000..507f825d
--- /dev/null
+++ b/scripts/run-yocto-check-layer.sh
@@ -0,0 +1,49 @@
+#!/bin/bash
+set -x
+
+SCRIPTPATH="$( cd $(dirname $0) >/dev/null 2>&1 ; pwd -P )"
+echo $SCRIPTPATH
+AGLROOT="$SCRIPTPATH/../.."
+POKYDIR="$AGLROOT/external/poky"
+TMPROOT=`mktemp -d`
+
+rm -rf ${TMPROOT}/testbuild-ycl || true
+mkdir -p ${TMPROOT}/testbuild-ycl
+cd ${TMPROOT}/testbuild-ycl
+
+source $POKYDIR/oe-init-build-env .
+
+cat << EOF >> conf/local.conf
+# just define defaults
+AGL_FEATURES ?= ""
+AGL_EXTRA_IMAGE_FSTYPES ?= ""
+
+# important settings imported from poky-agl.conf
+# we do not import
+DISTRO_FEATURES_append = " systemd smack"
+DISTRO_FEATURES_BACKFILL_CONSIDERED_append = " sysvinit"
+VIRTUAL-RUNTIME_init_manager = "systemd"
+
+# workaround:
+# ERROR: Nothing PROVIDES 'smack' (but /home/dl9pf/AGL/master-newlayout/external/meta-openembedded/meta-oe/recipes-extended/ostree/ostree_2020.3.bb DEPENDS on or otherwise requires it)
+BBMASK += "meta-openembedded/meta-oe/recipes-extended/ostree/ostree_2020.3.bb"
+
+EOF
+
+
+yocto-check-layer \
+ --dependency \
+ $AGLROOT/external/meta-openembedded/meta-oe \
+ $AGLROOT/meta-agl/meta-agl-core \
+ -- \
+ $AGLROOT/meta-agl-demo
+
+
+[ $? = 0 ] && rm -rf ${TMPROOT}/testbuild-ycl
+
+exit 0
+
+ --dependency \
+ $AGLROOT/external/meta-openembedded/meta-oe \
+ $AGLROOT/external/meta-openembedded/meta-python \
+ $AGLROOT/external/meta-openembedded/meta-networking \
diff --git a/templates/feature/agl-cluster-demo-preload/50_local.conf.inc b/templates/feature/agl-cluster-demo-preload/50_local.conf.inc
new file mode 100644
index 00000000..f15acf66
--- /dev/null
+++ b/templates/feature/agl-cluster-demo-preload/50_local.conf.inc
@@ -0,0 +1,2 @@
+#see meta-agl-cluster-demo/conf/include/agl-cluster-demo-preload.inc
+require conf/include/agl-cluster-demo-preload.inc
diff --git a/templates/feature/agl-cluster-demo-preload/README_feature_agl-cluster-demo-preload.md b/templates/feature/agl-cluster-demo-preload/README_feature_agl-cluster-demo-preload.md
new file mode 100644
index 00000000..bfb21086
--- /dev/null
+++ b/templates/feature/agl-cluster-demo-preload/README_feature_agl-cluster-demo-preload.md
@@ -0,0 +1,9 @@
+---
+description: Feature agl-cluster-demo-preload
+authors: Scott Murray <scott.murray@konsulko.com>
+---
+
+### Feature agl-cluster-demo-preload
+
+*Description is missing - please complete file meta-agl-cluster-demo/templates/feature/agl-cluster-demo-preload/README_feature_agl-cluster-demo-preload.md*
+
diff --git a/templates/feature/agl-cluster-demo/50_local.conf.inc b/templates/feature/agl-cluster-demo/50_local.conf.inc
new file mode 100644
index 00000000..90b0380d
--- /dev/null
+++ b/templates/feature/agl-cluster-demo/50_local.conf.inc
@@ -0,0 +1,2 @@
+#see meta-agl-cluster-demo/conf/include/agl-cluster-demo.inc
+require conf/include/agl-cluster-demo.inc
diff --git a/templates/feature/agl-cluster-demo/included.dep b/templates/feature/agl-cluster-demo/included.dep
new file mode 100644
index 00000000..82639da0
--- /dev/null
+++ b/templates/feature/agl-cluster-demo/included.dep
@@ -0,0 +1 @@
+agl-demo
diff --git a/templates/feature/agl-demo-soundmanager/50_bblayers.conf.inc b/templates/feature/agl-demo-soundmanager/50_bblayers.conf.inc
deleted file mode 100644
index 7e85c574..00000000
--- a/templates/feature/agl-demo-soundmanager/50_bblayers.conf.inc
+++ /dev/null
@@ -1,5 +0,0 @@
-# This layer contains the WIP feature/demo code only
-#---------------------------------------------------
-BBLAYERS =+ " \
- ${METADIR}/meta-agl-demo \
-"
diff --git a/templates/feature/agl-demo-soundmanager/50_local.conf.inc b/templates/feature/agl-demo-soundmanager/50_local.conf.inc
deleted file mode 100644
index 76626243..00000000
--- a/templates/feature/agl-demo-soundmanager/50_local.conf.inc
+++ /dev/null
@@ -1,2 +0,0 @@
-#see meta-agl-demo/conf/include/agl-demo.inc
-require conf/include/agl-demo.inc
diff --git a/templates/feature/agl-demo-soundmanager/README_feature_agl-demo-soundmanager.md b/templates/feature/agl-demo-soundmanager/README_feature_agl-demo-soundmanager.md
deleted file mode 100644
index 28feb6eb..00000000
--- a/templates/feature/agl-demo-soundmanager/README_feature_agl-demo-soundmanager.md
+++ /dev/null
@@ -1,18 +0,0 @@
----
-description: Feature agl-demo-soundmanager
-authors: Stephane Desneux <stephane.desneux@iot.bzh>
----
-
-### Feature agl-demo-soundmanager
-
-*Description is missing - please complete file meta-agl-demo/templates/feature/agl-demo-soundmanager/README_feature_agl-demo-soundmanager.md*
-
-#### Dependent features pulled by agl-demo-soundmanager
-
-The following features are pulled:
-
-* agl-appfw-smack
-* agl-hmi-framework
-* agl-profile-graphical-qt5
-* agl-audio-soundmanager-framework
-
diff --git a/templates/feature/agl-demo-soundmanager/included.dep b/templates/feature/agl-demo-soundmanager/included.dep
deleted file mode 100644
index b0b94285..00000000
--- a/templates/feature/agl-demo-soundmanager/included.dep
+++ /dev/null
@@ -1 +0,0 @@
-agl-appfw-smack agl-hmi-framework agl-profile-graphical-qt5 agl-audio-soundmanager-framework
diff --git a/templates/feature/agl-demo/50_bblayers.conf.inc b/templates/feature/agl-demo/50_bblayers.conf.inc
index afa14f23..55917ccb 100644
--- a/templates/feature/agl-demo/50_bblayers.conf.inc
+++ b/templates/feature/agl-demo/50_bblayers.conf.inc
@@ -8,4 +8,7 @@ BBLAYERS =+ " \
#---------------------------------------------------
BBLAYERS =+ " \
${METADIR}/external/meta-iot-cloud \
+ ${METADIR}/external/meta-qt5 \
+ ${METADIR}/external/meta-openembedded/meta-filesystems \
+ ${METADIR}/external/meta-python2 \
"
diff --git a/templates/feature/agl-demo/included.dep b/templates/feature/agl-demo/included.dep
index cbf86e8d..14507678 100644
--- a/templates/feature/agl-demo/included.dep
+++ b/templates/feature/agl-demo/included.dep
@@ -1 +1 @@
-agl-appfw-smack agl-hmi-framework agl-profile-graphical-qt5 agl-pipewire agl-speech-framework
+agl-appfw-smack agl-hmi-framework agl-pipewire
diff --git a/templates/feature/agl-telematics-demo/50_local.conf.inc b/templates/feature/agl-telematics-demo/50_local.conf.inc
new file mode 100644
index 00000000..64c8714b
--- /dev/null
+++ b/templates/feature/agl-telematics-demo/50_local.conf.inc
@@ -0,0 +1,2 @@
+#see meta-agl-telematics-demo/conf/include/agl-telematics-demo.inc
+require conf/include/agl-telematics-demo.inc
diff --git a/templates/feature/agl-telematics-demo/included.dep b/templates/feature/agl-telematics-demo/included.dep
new file mode 100644
index 00000000..92798cdc
--- /dev/null
+++ b/templates/feature/agl-telematics-demo/included.dep
@@ -0,0 +1 @@
+agl-demo \ No newline at end of file