SPEC-3723: restructure meta-agl-demo 67/25767/8
authorJan-Simon Moeller <jsmoeller@linuxfoundation.org>
Tue, 8 Dec 2020 10:15:02 +0000 (11:15 +0100)
committerJan-Simon Moeller <jsmoeller@linuxfoundation.org>
Thu, 17 Dec 2020 13:58:05 +0000 (13:58 +0000)
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

324 files changed:
README [new symlink]
classes/agl-graphical.bbclass [new file with mode: 0644]
conf/include/agl-cluster-demo-preload.inc [new file with mode: 0644]
conf/include/agl-cluster-demo.inc [new file with mode: 0644]
conf/include/agl-demo-preload.inc
conf/include/agl-demo.inc
conf/include/agl-telematics-demo.inc [new file with mode: 0644]
conf/layer.conf
docs/devguides-book.yml [deleted file]
recipes-apis/agl-service-bluetooth-map/agl-service-bluetooth-map_git.bb [new file with mode: 0644]
recipes-apis/agl-service-bluetooth-pbap/agl-service-bluetooth-pbap_git.bb [new file with mode: 0644]
recipes-apis/agl-service-bluetooth/agl-service-bluetooth_git.bb [new file with mode: 0644]
recipes-apis/agl-service-can-low-level/agl-service-can-low-level_git.bb [new file with mode: 0644]
recipes-apis/agl-service-can-low-level/agl-service-can-low-level_git.bbappend
recipes-apis/agl-service-can-low-level/files/run-ptest [new file with mode: 0644]
recipes-apis/agl-service-data-persistence/agl-service-data-persistence_git.bb [new file with mode: 0644]
recipes-apis/agl-service-geoclue/agl-service-geoclue_git.bb [new file with mode: 0644]
recipes-apis/agl-service-geofence/agl-service-geofence_git.bb [new file with mode: 0644]
recipes-apis/agl-service-gps/agl-service-gps_git.bb [new file with mode: 0644]
recipes-apis/agl-service-homescreen/agl-service-homescreen_git.bb [new file with mode: 0644]
recipes-apis/agl-service-hvac/agl-service-hvac-conf_git.bb [new file with mode: 0644]
recipes-apis/agl-service-hvac/agl-service-hvac_git.bb [new file with mode: 0644]
recipes-apis/agl-service-identity-agent/agl-service-identity-agent_git.bb [new file with mode: 0644]
recipes-apis/agl-service-iiodevices/agl-service-iiodevices_git.bb [new file with mode: 0644]
recipes-apis/agl-service-mediaplayer/agl-service-mediaplayer_git.bb [new file with mode: 0644]
recipes-apis/agl-service-mediascanner/agl-service-mediascanner_git.bb [new file with mode: 0644]
recipes-apis/agl-service-navigation/agl-service-navigation_git.bb [new file with mode: 0755]
recipes-apis/agl-service-network/agl-service-network_git.bb [new file with mode: 0644]
recipes-apis/agl-service-nfc/agl-service-nfc_git.bb [new file with mode: 0644]
recipes-apis/agl-service-platform-info/agl-service-platform-info_git.bb [new file with mode: 0644]
recipes-apis/agl-service-radio/agl-service-radio_git.bb [new file with mode: 0644]
recipes-apis/agl-service-signal-composer/agl-service-signal-composer_git.bb [new file with mode: 0644]
recipes-apis/agl-service-signal-composer/files/run-ptest [new file with mode: 0644]
recipes-apis/agl-service-taskmanager/agl-service-taskmanager.bb [new file with mode: 0644]
recipes-apis/agl-service-telephony/agl-service-telephony_git.bb [new file with mode: 0644]
recipes-apis/agl-service-unicens-controller/agl-service-unicens-controller_git.bb [new file with mode: 0644]
recipes-apis/agl-service-unicens/agl-service-unicens_git.bb [new file with mode: 0644]
recipes-apis/agl-service-weather/agl-service-weather_git.bb [new file with mode: 0644]
recipes-config/agl-login-manager/agl-login-manager_0.1.bb [new file with mode: 0644]
recipes-config/agl-users/agl-users_0.1.bb [new file with mode: 0644]
recipes-config/cluster-dashboard-demo-config/cluster-dashboard-demo-config_1.0.bb [new file with mode: 0644]
recipes-config/cluster-dashboard-demo-config/files/AGL.conf.cluster [new file with mode: 0644]
recipes-config/dev-mapping/dev-mapping/dev-mapping.conf.default [new file with mode: 0644]
recipes-config/dev-mapping/dev-mapping_0.1.bb [new file with mode: 0644]
recipes-config/systemd-sync/systemd-agl-sync_1.0.bb [new file with mode: 0644]
recipes-connectivity/bluez-alsa/bluez-alsa/0001-utils-add-a-gstreamer-helper-application-for-interco.patch [new file with mode: 0644]
recipes-connectivity/bluez-alsa/bluez-alsa/bluealsa-gst-helper@.service [new file with mode: 0644]
recipes-connectivity/bluez-alsa/bluez-alsa_git.bb [new file with mode: 0644]
recipes-connectivity/bluez-alsa/bluez-alsa_git.bbappend [new file with mode: 0644]
recipes-connectivity/bluez-alsa/files/bluez-alsa.service [new file with mode: 0644]
recipes-connectivity/bluez5/bluez5/bluetooth.conf [new file with mode: 0644]
recipes-connectivity/bluez5/bluez5/bluetooth.service [new file with mode: 0644]
recipes-connectivity/bluez5/bluez5/obex.service [new file with mode: 0644]
recipes-connectivity/bluez5/bluez5/tmpdir.conf [new file with mode: 0644]
recipes-connectivity/bluez5/bluez5_%.bbappend [new file with mode: 0644]
recipes-connectivity/bluez5/bluez5_agldemo.inc [new file with mode: 0644]
recipes-connectivity/cluster-connman-conf/cluster-connman-conf/cluster.config [new file with mode: 0644]
recipes-connectivity/cluster-connman-conf/cluster-connman-conf_1.0.bb [new file with mode: 0644]
recipes-connectivity/mobile-broadband-provider-info/mobile-broadband-provider-info/0001-remove-Fido-service-provider.patch [new file with mode: 0644]
recipes-connectivity/mobile-broadband-provider-info/mobile-broadband-provider-info_agldemo.inc [new file with mode: 0644]
recipes-connectivity/mobile-broadband-provider-info/mobile-broadband-provider-info_git.bbappend [new file with mode: 0644]
recipes-connectivity/neard/files/0001-systemd-neard-add-multi-user.target-to-neard.service.patch [new file with mode: 0644]
recipes-connectivity/neard/files/0002-ndef-avoid-dbus-property_get_type-method-on-empty-re.patch [new file with mode: 0644]
recipes-connectivity/neard/neard_0.16.bbappend [new file with mode: 0644]
recipes-connectivity/neard/neard_agldemo.inc [new file with mode: 0644]
recipes-connectivity/neardal/neardal.inc [new file with mode: 0644]
recipes-connectivity/neardal/neardal/0001-neardal-ncl-fix-segfault-on-help-page-being-displaye.patch [new file with mode: 0644]
recipes-connectivity/neardal/neardal/0002-neardal-lib-fix-memory-corruption.patch [new file with mode: 0644]
recipes-connectivity/neardal/neardal/ncl.patch [new file with mode: 0644]
recipes-connectivity/neardal/neardal_0.14.bb [new file with mode: 0644]
recipes-connectivity/ofono/files/0001-provision-allow-duplicate-entries-from-mbpi_lookup_a.patch [new file with mode: 0644]
recipes-connectivity/ofono/files/ofono.conf [new file with mode: 0644]
recipes-connectivity/ofono/ofono_%.bbappend [new file with mode: 0644]
recipes-connectivity/ofono/ofono_agldemo.inc [new file with mode: 0644]
recipes-connectivity/rtl-sdr/rtl-sdr/0001-remove-I-usr-include-in-pkg-config.patch [new file with mode: 0644]
recipes-connectivity/rtl-sdr/rtl-sdr_0.5.3.bb [new file with mode: 0644]
recipes-core/dbus/dbus/dbus.service [new file with mode: 0644]
recipes-core/dbus/dbus/dbus.socket [new file with mode: 0644]
recipes-core/dbus/dbus/dbus_env.conf [new file with mode: 0644]
recipes-core/dbus/dbus/libdbus-c++/dbus-c++-threading.patch [new file with mode: 0644]
recipes-core/dbus/dbus_%.bbappend [new file with mode: 0644]
recipes-core/dbus/dbus_agldemo.inc [new file with mode: 0644]
recipes-core/dbus/libdbus-c++/dbus-c++-threading.patch [new file with mode: 0644]
recipes-core/dbus/libdbus-c++_0.9.0.bbappend [new file with mode: 0644]
recipes-core/dbus/libdbus-c++_agldemo.inc [new file with mode: 0644]
recipes-core/distro-build-manifest/distro-build-manifest.bb [new file with mode: 0644]
recipes-core/psplash/.appends.core [new file with mode: 0644]
recipes-core/psplash/files/psplash-colors.h [new file with mode: 0644]
recipes-core/psplash/files/psplash-poky-img.h [new file with mode: 0644]
recipes-core/psplash/psplash_agldemo.inc [new file with mode: 0644]
recipes-core/psplash/psplash_git.bbappend [new file with mode: 0644]
recipes-core/udev/sw-gpsd-udev-conf/60-sw-gpsd.rules [new file with mode: 0644]
recipes-core/udev/sw-gpsd-udev-conf_1.0.bb [new file with mode: 0644]
recipes-core/udev/usb-can-udev-conf/60-usb-can.rules [new file with mode: 0644]
recipes-core/udev/usb-can-udev-conf/slcand-default [new file with mode: 0644]
recipes-core/udev/usb-can-udev-conf/slcand@.service [new file with mode: 0644]
recipes-core/udev/usb-can-udev-conf_1.0.bb [new file with mode: 0644]
recipes-demo/alexa-viewer/alexa-viewer_git.bb [moved from recipes-demo-hmi/alexa-viewer/alexa-viewer_git.bb with 100% similarity]
recipes-demo/cluster-dashboard/cluster-dashboard_git.bb [new file with mode: 0644]
recipes-demo/cluster-gauges-qtcompositor/cluster-gauges-qtcompositor_git.bb [new file with mode: 0644]
recipes-demo/cluster-receiver/cluster-receiver_git.bb [new file with mode: 0644]
recipes-demo/cluster-receiver/qt-cluster-receiver_git.bb [new file with mode: 0644]
recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf/areas.json [new file with mode: 0644]
recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf/layers.json [new file with mode: 0644]
recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf/roles.db [new file with mode: 0644]
recipes-demo/cluster-windowmanager-conf/cluster-windowmanager-conf_1.0.bb [new file with mode: 0644]
recipes-demo/dashboard/dashboard_git.bb [moved from recipes-demo-hmi/dashboard/dashboard_git.bb with 100% similarity]
recipes-demo/homescreen-demo-ci/homescreen-demo-ci_git.bb [moved from recipes-demo-hmi/homescreen-demo-ci/homescreen-demo-ci_git.bb with 100% similarity]
recipes-demo/homescreen/homescreen_git.bb [moved from recipes-demo-hmi/homescreen/homescreen_git.bb with 100% similarity]
recipes-demo/html5-background/html5-background_git.bb [moved from recipes-demo-hmi/html5-background/html5-background_git.bb with 100% similarity]
recipes-demo/html5-dashboard/html5-dashboard_git.bb [moved from recipes-demo-hmi/html5-dashboard/html5-dashboard_git.bb with 100% similarity]
recipes-demo/html5-homescreen/html5-homescreen_git.bb [moved from recipes-demo-hmi/html5-homescreen/html5-homescreen_git.bb with 100% similarity]
recipes-demo/html5-hvac/html5-hvac_git.bb [moved from recipes-demo-hmi/html5-hvac/html5-hvac_git.bb with 100% similarity]
recipes-demo/html5-launcher/html5-launcher_git.bb [moved from recipes-demo-hmi/html5-launcher/html5-launcher_git.bb with 100% similarity]
recipes-demo/html5-mediaplayer/html5-mediaplayer_git.bb [moved from recipes-demo-hmi/html5-mediaplayer/html5-mediaplayer_git.bb with 100% similarity]
recipes-demo/html5-mixer/html5-mixer_git.bb [moved from recipes-demo-hmi/html5-mixer/html5-mixer_git.bb with 100% similarity]
recipes-demo/html5-settings/html5-settings_git.bb [moved from recipes-demo-hmi/html5-settings/html5-settings_git.bb with 100% similarity]
recipes-demo/hvac/hvac_git.bb [moved from recipes-demo-hmi/hvac/hvac_git.bb with 100% similarity]
recipes-demo/inputeventmanager/inputeventmanager_git.bb [moved from recipes-demo-hmi/inputeventmanager/inputeventmanager_git.bb with 99% similarity]
recipes-demo/launcher/launcher_git.bb [moved from recipes-demo-hmi/launcher/launcher_git.bb with 100% similarity]
recipes-demo/mediaplayer/mediaplayer_git.bb [moved from recipes-demo-hmi/mediaplayer/mediaplayer_git.bb with 100% similarity]
recipes-demo/messaging/messaging_git.bb [moved from recipes-demo-hmi/messaging/messaging_git.bb with 100% similarity]
recipes-demo/mixer/mixer_git.bb [moved from recipes-demo-hmi/mixer/mixer_git.bb with 100% similarity]
recipes-demo/navigation/navigation-demo_git.bb [moved from recipes-demo-hmi/navigation/navigation-demo_git.bb with 100% similarity]
recipes-demo/navigation/ondemandnavi-config/naviconfig.ini [moved from recipes-demo-hmi/navigation/ondemandnavi-config/naviconfig.ini with 100% similarity]
recipes-demo/navigation/ondemandnavi-config_1.0.bb [moved from recipes-demo-hmi/navigation/ondemandnavi-config_1.0.bb with 100% similarity]
recipes-demo/navigation/ondemandnavi_git.bb [moved from recipes-demo-hmi/navigation/ondemandnavi_git.bb with 100% similarity]
recipes-demo/navigation/poiapp-api-key_1.0.bb [moved from recipes-demo-hmi/navigation/poiapp-api-key_1.0.bb with 100% similarity]
recipes-demo/navigation/poiapp/0001-add-display-permission.patch [moved from recipes-demo-hmi/navigation/poiapp/0001-add-display-permission.patch with 100% similarity]
recipes-demo/navigation/poiapp_git.bb [moved from recipes-demo-hmi/navigation/poiapp_git.bb with 100% similarity]
recipes-demo/navigation/tbtnavi_git.bb [moved from recipes-demo-hmi/navigation/tbtnavi_git.bb with 100% similarity]
recipes-demo/onscreenapp/onscreenapp_git.bb [moved from recipes-demo-hmi/onscreenapp/onscreenapp_git.bb with 100% similarity]
recipes-demo/phone/phone_git.bb [moved from recipes-demo-hmi/phone/phone_git.bb with 100% similarity]
recipes-demo/qtquickcontrols2-agl-style/qtquickcontrols2-agl-style_git.bb [moved from recipes-demo-hmi/qtquickcontrols2-agl-style/qtquickcontrols2-agl-style_git.bb with 100% similarity]
recipes-demo/qtquickcontrols2-agl/qtquickcontrols2-agl_git.bb [moved from recipes-demo-hmi/qtquickcontrols2-agl/qtquickcontrols2-agl_git.bb with 100% similarity]
recipes-demo/radio/files/presets-ALS.conf [moved from recipes-demo-hmi/radio/files/presets-ALS.conf with 100% similarity]
recipes-demo/radio/files/presets-CES.conf [moved from recipes-demo-hmi/radio/files/presets-CES.conf with 100% similarity]
recipes-demo/radio/files/presets-FOSDEM.conf [moved from recipes-demo-hmi/radio/files/presets-FOSDEM.conf with 100% similarity]
recipes-demo/radio/radio_git.bb [moved from recipes-demo-hmi/radio/radio_git.bb with 100% similarity]
recipes-demo/settings/settings_git.bb [moved from recipes-demo-hmi/settings/settings_git.bb with 100% similarity]
recipes-demo/simple-can-simulator/files/simple_can_simulator.py [new file with mode: 0755]
recipes-demo/simple-can-simulator/simple-can-simulator.bb [new file with mode: 0644]
recipes-demo/taskmanager/taskmanager_git.bb [moved from recipes-demo-hmi/taskmanager/taskmanager_git.bb with 100% similarity]
recipes-demo/telematics-recorder/telematics-recorder_git.bb [new file with mode: 0644]
recipes-demo/waltham-receiver/waltham-receiver_git.bb [moved from recipes-demo-hmi/waltham-receiver/waltham-receiver_git.bb with 100% similarity]
recipes-devtools/low-level-can-generator/low-level-can-generator_git.bb [new file with mode: 0644]
recipes-devtools/python/python3-asyncssh_2.3.0.bb [new file with mode: 0644]
recipes-devtools/python/python3-pytest-dependency_0.5.1.bb [new file with mode: 0644]
recipes-devtools/python/python3-pytest-reverse_1.0.1.bb [new file with mode: 0644]
recipes-devtools/run-agl-postinsts/run-agl-postinsts/run-agl-postinsts [new file with mode: 0755]
recipes-devtools/run-agl-postinsts/run-agl-postinsts/run-agl-postinsts.service [new file with mode: 0644]
recipes-devtools/run-agl-postinsts/run-agl-postinsts_1.0.bb [new file with mode: 0644]
recipes-devtools/run-agl-postinsts/run-agl-postinsts_1.0.bbappend [new file with mode: 0644]
recipes-graphics/hmi-debug/files/hmi-debug [new file with mode: 0644]
recipes-graphics/hmi-debug/hmi-debug_git.bb [new file with mode: 0644]
recipes-graphics/kms-conf/kms-conf/kms.conf [new file with mode: 0644]
recipes-graphics/kms-conf/kms-conf/m3ulcb/kms.conf [new file with mode: 0644]
recipes-graphics/kms-conf/kms-conf_1.0.bb [new file with mode: 0644]
recipes-graphics/libhomescreen/libhomescreen_git.bb [new file with mode: 0644]
recipes-graphics/qlibhomescreen/qlibhomescreen_git.bb [new file with mode: 0644]
recipes-graphics/ttf-fonts/ttf-dejavu_%.bbappend
recipes-graphics/ttf-fonts/ttf-dejavu_agldemo.inc [new file with mode: 0644]
recipes-graphics/wayland/weston-init.bbappend [new file with mode: 0644]
recipes-graphics/wayland/weston-init/tmpfiles.conf.in [new file with mode: 0644]
recipes-graphics/wayland/weston-init/weston-dep.conf.in [new file with mode: 0644]
recipes-graphics/wayland/weston-init/weston.conf.in [new file with mode: 0644]
recipes-graphics/wayland/weston-init/zz-dri-imx.rules.in [new file with mode: 0644]
recipes-graphics/wayland/weston-init/zz-dri.rules.in [new file with mode: 0644]
recipes-graphics/wayland/weston-init/zz-input.rules.in [new file with mode: 0644]
recipes-graphics/wayland/weston-init/zz-tty.rules.in [new file with mode: 0644]
recipes-graphics/wayland/weston-init_agldemo.inc [new file with mode: 0644]
recipes-kernel/most/files/0002-src-most-add-auto-conf-feature.patch [new file with mode: 0644]
recipes-kernel/most/files/0003-core-remove-kernel-log-for-MBO-status.patch [new file with mode: 0644]
recipes-kernel/most/files/0004-most-video-set-device_caps.patch [new file with mode: 0644]
recipes-kernel/most/files/0005-most-video-set-V4L2_CAP_DEVICE_CAPS-flag.patch [new file with mode: 0644]
recipes-kernel/most/files/0006-dim2-fix-startup-sequence.patch [new file with mode: 0644]
recipes-kernel/most/files/0007-dim2-use-device-tree.patch [new file with mode: 0644]
recipes-kernel/most/files/0008-dim2-read-clock-speed-from-the-device-tree.patch [new file with mode: 0644]
recipes-kernel/most/files/0009-dim2-use-device-for-coherent-memory-allocation.patch [new file with mode: 0644]
recipes-kernel/most/files/0010-backport-usb-setup-timer.patch [new file with mode: 0644]
recipes-kernel/most/files/0011-handle-snd_pcm_lib_mmap_vmalloc-removal.patch [new file with mode: 0644]
recipes-kernel/most/files/0012-Fix-build-with-5.4-kernel.patch [new file with mode: 0644]
recipes-kernel/most/most.bb [new file with mode: 0644]
recipes-kernel/most/most.bbappend [new file with mode: 0644]
recipes-multimedia/gstreamer1.0-plugins-bad/gstreamer1.0-plugins-bad/0001-gst-wayland-Install-wayland-header-from-gstwayland-l.patch [new file with mode: 0644]
recipes-multimedia/gstreamer1.0-plugins-bad/gstreamer1.0-plugins-bad_1.16.%.bbappend [new file with mode: 0644]
recipes-multimedia/gstreamer1.0-plugins-bad/gstreamer1.0-plugins-bad_agldemo.inc [new file with mode: 0644]
recipes-multimedia/gstreamer1.0-plugins-good/gstreamer1.0-plugins-good_%.bbappend [new file with mode: 0644]
recipes-multimedia/gstreamer1.0-plugins-good/gstreamer1.0-plugins-good_agldemo.inc [new file with mode: 0644]
recipes-multimedia/libmp4v2/files/0001-add-a-configure-option-to-disable-build-of-man-pages.patch [new file with mode: 0644]
recipes-multimedia/libmp4v2/libmp4v2_git.bb [new file with mode: 0644]
recipes-multimedia/lightmediascanner/.appends.meta-efl [new file with mode: 0644]
recipes-multimedia/lightmediascanner/files/0001-Define-comparison_fn_t-for-non-glibc-systems.patch [new file with mode: 0644]
recipes-multimedia/lightmediascanner/files/0002-switch-from-G_BUS_TYPE_SESSION-to-G_BUS_TYPE_SYSTEM.patch [new file with mode: 0644]
recipes-multimedia/lightmediascanner/files/dbus-lightmediascanner.conf [new file with mode: 0644]
recipes-multimedia/lightmediascanner/files/id3-plugin-support-out-of-tree-build.patch [new file with mode: 0644]
recipes-multimedia/lightmediascanner/files/lightmediascanner.service [new file with mode: 0644]
recipes-multimedia/lightmediascanner/files/plugin-ogg-fix-chucksize-issue.patch [new file with mode: 0644]
recipes-multimedia/lightmediascanner/lightmediascanner_%.bbappend [new file with mode: 0644]
recipes-multimedia/lightmediascanner/lightmediascanner_0.5.1.bb [new file with mode: 0644]
recipes-navigation/geoclue/files/org.freedesktop.GeoClue2.Client.conf [new file with mode: 0644]
recipes-navigation/geoclue/geoclue_%.bbappend [new file with mode: 0644]
recipes-navigation/geoclue/geoclue_agldemo.inc [new file with mode: 0644]
recipes-navigation/gpsd/gpsd/sw-device-hook [new file with mode: 0644]
recipes-navigation/gpsd/gpsd_%.bbappend [new file with mode: 0644]
recipes-navigation/gpsd/gpsd_agldemo.inc [new file with mode: 0644]
recipes-platform/images/agl-cluster-demo-platform-crosssdk.bb [new file with mode: 0644]
recipes-platform/images/agl-cluster-demo-platform.bb [new file with mode: 0644]
recipes-platform/images/agl-cluster-demo-platform.inc [new file with mode: 0644]
recipes-platform/images/agl-cluster-demo-qtcompositor.bb [new file with mode: 0644]
recipes-platform/images/agl-cluster-demo-qtcompositor.inc [new file with mode: 0644]
recipes-platform/images/agl-demo-platform-crosssdk.bb
recipes-platform/images/agl-image-cluster-qt5.bb [new file with mode: 0644]
recipes-platform/images/agl-image-cluster-qt5.inc [new file with mode: 0644]
recipes-platform/images/agl-image-cluster.bb [new file with mode: 0644]
recipes-platform/images/agl-image-cluster.inc [new file with mode: 0644]
recipes-platform/images/agl-image-graphical-html5.bb [new file with mode: 0644]
recipes-platform/images/agl-image-graphical-html5.inc [new file with mode: 0644]
recipes-platform/images/agl-image-graphical-qt5-crosssdk.bb [new file with mode: 0755]
recipes-platform/images/agl-image-graphical-qt5-crosssdk.inc [new file with mode: 0644]
recipes-platform/images/agl-image-graphical-qt5.bb [new file with mode: 0644]
recipes-platform/images/agl-image-graphical-qt5.inc [new file with mode: 0644]
recipes-platform/images/agl-image-telematics.bb [new file with mode: 0644]
recipes-platform/images/agl-image-telematics.inc [new file with mode: 0644]
recipes-platform/images/agl-telematics-demo-platform-crosssdk.bb [new file with mode: 0644]
recipes-platform/images/agl-telematics-demo-platform.bb [new file with mode: 0644]
recipes-platform/images/agl-telematics-demo-platform.inc [new file with mode: 0644]
recipes-platform/packagegroups/nativesdk-packagegroup-sdk-host.bbappend [new file with mode: 0644]
recipes-platform/packagegroups/packagegroup-agl-app-framework.bbappend [new file with mode: 0644]
recipes-platform/packagegroups/packagegroup-agl-appfw-html5.bb [new file with mode: 0644]
recipes-platform/packagegroups/packagegroup-agl-appfw-native-qt5.bb [new file with mode: 0644]
recipes-platform/packagegroups/packagegroup-agl-cluster-demo-platform.bb [new file with mode: 0644]
recipes-platform/packagegroups/packagegroup-agl-cluster-demo-qtcompositor.bb [new file with mode: 0644]
recipes-platform/packagegroups/packagegroup-agl-core-devel.bbappend [new file with mode: 0644]
recipes-platform/packagegroups/packagegroup-agl-demo-qt-examples.bb [new file with mode: 0644]
recipes-platform/packagegroups/packagegroup-agl-graphical-services.bb [new file with mode: 0644]
recipes-platform/packagegroups/packagegroup-agl-graphical-weston.bbappend [new file with mode: 0644]
recipes-platform/packagegroups/packagegroup-agl-graphical-weston_agldemo.inc [new file with mode: 0644]
recipes-platform/packagegroups/packagegroup-agl-image-ivi.bb
recipes-platform/packagegroups/packagegroup-agl-image-ivi.bbappend [moved from recipes-core/packagegroups/packagegroup-agl-image-ivi.bbappend with 63% similarity]
recipes-platform/packagegroups/packagegroup-agl-ivi-connectivity.bbappend [moved from recipes-core/packagegroups/packagegroup-agl-ivi-connectivity.bbappend with 100% similarity]
recipes-platform/packagegroups/packagegroup-agl-ivi-identity.bb [moved from recipes-core/packagegroups/packagegroup-agl-ivi-identity.bb with 100% similarity]
recipes-platform/packagegroups/packagegroup-agl-ivi-navigation.bb
recipes-platform/packagegroups/packagegroup-agl-ivi-services.bb
recipes-platform/packagegroups/packagegroup-agl-networking.bb [new file with mode: 0644]
recipes-platform/packagegroups/packagegroup-agl-profile-cluster-qt5.bb [new file with mode: 0644]
recipes-platform/packagegroups/packagegroup-agl-profile-cluster-qtcompositor.bb [new file with mode: 0644]
recipes-platform/packagegroups/packagegroup-agl-profile-cluster.bb [new file with mode: 0644]
recipes-platform/packagegroups/packagegroup-agl-profile-graphical-html5.bb [new file with mode: 0644]
recipes-platform/packagegroups/packagegroup-agl-profile-graphical-qt5.bb [new file with mode: 0644]
recipes-platform/packagegroups/packagegroup-agl-profile-graphical.bbappend [new file with mode: 0644]
recipes-platform/packagegroups/packagegroup-agl-profile-telematics.bb [new file with mode: 0644]
recipes-platform/packagegroups/packagegroup-agl-source-han-sans-ttf-fonts.bb [new file with mode: 0644]
recipes-platform/packagegroups/packagegroup-agl-telematics-demo-platform.bb [new file with mode: 0644]
recipes-platform/packagegroups/packagegroup-agl-ttf-fonts.bb [new file with mode: 0644]
recipes-platform/packagegroups/packagegroup-qt5-toolchain-target.bbappend [new file with mode: 0644]
recipes-qt/qt-cluster/qtcompositor-conf_1.0.bb [new file with mode: 0644]
recipes-qt/qt/qtbase-native_git.bbappendTOCHECK [new file with mode: 0644]
recipes-qt/qt/qtbase/0001-Force-qdbus-to-make-introspect-for-every-findMetaObj.patch [new file with mode: 0644]
recipes-qt/qt/qtbase_%.bbappend [new file with mode: 0644]
recipes-qt/qt/qtbase_agldemo.inc [new file with mode: 0644]
recipes-qt/qt/qtlocation/0001-mapbox-update-API-url-to-match-new-schema.patch [new file with mode: 0644]
recipes-qt/qt/qtlocation_%.bbappend [new file with mode: 0644]
recipes-qt/qt/qtlocation_agldemo.inc [new file with mode: 0644]
recipes-qt/qt/qtmultimedia/0001-metadata-image-support-with-the-data-URL-scheme-for-.patch [new file with mode: 0644]
recipes-qt/qt/qtmultimedia_%.bbappend [new file with mode: 0644]
recipes-qt/qt/qtmultimedia_agldemo.inc [new file with mode: 0644]
recipes-qt/qt/qtsystems_%.bbappend [new file with mode: 0644]
recipes-qt/qt/qtsystems_agldemo.inc [new file with mode: 0644]
recipes-qt/qt/qtwayland-config/qtwayland [new file with mode: 0644]
recipes-qt/qt/qtwayland-config_1.0.0.bb [new file with mode: 0644]
recipes-qt/qt/qtwayland/0001-protocol-update-3rd-party-ivi-application-protocol.patch [new file with mode: 0644]
recipes-qt/qt/qtwayland/0002-qwaylandwindow-add-support-for-IVI-Surface-ID-proper.patch [new file with mode: 0644]
recipes-qt/qt/qtwayland/0010-Added-manifest-file-according-to-smack-3-domain-mode.patch [new file with mode: 0644]
recipes-qt/qt/qtwayland/0016-xdg-shell-Add-xdg-shell-protocol-file-version-1.4.0.patch [new file with mode: 0644]
recipes-qt/qt/qtwayland/0017-xdg-shell-Add-minimize-feature-to-QWindow-using-wayl.patch [new file with mode: 0644]
recipes-qt/qt/qtwayland/0019-xdg-shell-upgrade-to-support-current-version-weston-.patch [new file with mode: 0644]
recipes-qt/qt/qtwayland/0020-Add-IVI-Shell-protocol-file-version-patch-v6.patch [new file with mode: 0644]
recipes-qt/qt/qtwayland/0021-Implement-initial-IVI-Shell-support.patch [new file with mode: 0644]
recipes-qt/qt/qtwayland/0099_qtwayland_no_evdev.patch [new file with mode: 0644]
recipes-qt/qt/qtwayland/UNUSED_NEEDS_CHECK_YOCTO_0018-packaging-enable-xdg-shell-at-runtime.patch [new file with mode: 0644]
recipes-qt/qt/qtwayland_%.bbappend [new file with mode: 0644]
recipes-qt/qt/qtwayland_agldemo.inc [new file with mode: 0644]
recipes-qt/qt/qtwebkit_%.bbappend [new file with mode: 0644]
recipes-qt/qt/qtwebkit_agldemo.inc [new file with mode: 0644]
recipes-support/curl/curl_%.bbappend [new file with mode: 0644]
recipes-support/curl/curl_agldemo.inc [new file with mode: 0644]
recipes-support/opencv/opencv_4.%.bbappend [new file with mode: 0644]
recipes-support/opencv/opencv_agldemo.inc [new file with mode: 0644]
recipes-support/udisks/files/99-udisks2.rules [new file with mode: 0644]
recipes-support/udisks/files/automount.service [new file with mode: 0644]
recipes-support/udisks/files/automount.sh [new file with mode: 0644]
recipes-support/udisks/udisks2_%.bbappend [new file with mode: 0644]
recipes-support/udisks/udisks2_agldemo.inc [new file with mode: 0644]
recipes-test/afb-test/afb-test_git.bb [new file with mode: 0644]
recipes-test/afb-test/files/run-ptest [new file with mode: 0644]
recipes-test/gcovr-wrapper/gcovr-wrapper/gcovr-wrapper [new file with mode: 0644]
recipes-test/gcovr-wrapper/gcovr-wrapper_1.0.bb [new file with mode: 0644]
recipes-test/gcovr/gcovr/0001-add-gcov-filter-source-errors-option.patch [new file with mode: 0644]
recipes-test/gcovr/gcovr_%.bbappend [new file with mode: 0644]
recipes-test/gcovr/gcovr_git.bb [new file with mode: 0644]
recipes-test/pyagl/pyagl_git.bb [new file with mode: 0644]
recipes-wam/chromium/chromium-browser-service.bb [new file with mode: 0644]
recipes-wam/chromium/chromium68/v8-qemu-wrapper.patch [new file with mode: 0644]
recipes-wam/chromium/chromium68_git.bb [new file with mode: 0644]
recipes-wam/chromium/gn-utils.inc [new file with mode: 0644]
recipes-wam/wam/files/WebAppMgr.env [new file with mode: 0644]
recipes-wam/wam/files/WebAppMgr@.service [new file with mode: 0644]
recipes-wam/wam/files/trunc-webapp-roles.patch [new file with mode: 0644]
recipes-wam/wam/wam_git.bb [new file with mode: 0644]
scripts/run-yocto-check-layer-all-layers.sh [new file with mode: 0755]
scripts/run-yocto-check-layer.sh [new file with mode: 0755]
templates/feature/agl-cluster-demo-preload/50_local.conf.inc [new file with mode: 0644]
templates/feature/agl-cluster-demo-preload/README_feature_agl-cluster-demo-preload.md [new file with mode: 0644]
templates/feature/agl-cluster-demo/50_local.conf.inc [new file with mode: 0644]
templates/feature/agl-cluster-demo/included.dep [new file with mode: 0644]
templates/feature/agl-demo-soundmanager/50_bblayers.conf.inc [deleted file]
templates/feature/agl-demo-soundmanager/50_local.conf.inc [deleted file]
templates/feature/agl-demo-soundmanager/README_feature_agl-demo-soundmanager.md [deleted file]
templates/feature/agl-demo-soundmanager/included.dep [deleted file]
templates/feature/agl-demo/50_bblayers.conf.inc
templates/feature/agl-demo/included.dep
templates/feature/agl-telematics-demo/50_local.conf.inc [new file with mode: 0644]
templates/feature/agl-telematics-demo/included.dep [new file with mode: 0644]

diff --git a/README b/README
new file mode 120000 (symlink)
index 0000000..42061c0
--- /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 (file)
index 0000000..8b5fbf6
--- /dev/null
@@ -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 (file)
index 0000000..70421e8
--- /dev/null
@@ -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 (file)
index 0000000..a8847e0
--- /dev/null
@@ -0,0 +1,5 @@
+IMAGE_FEATURES =+ "debug-tweaks"
+
+#DISTRO_FEATURES_append = " "
+
+#IMAGE_INSTALL_append = " "
index da46810..484bc05 100644 (file)
@@ -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"
index 32d447a..390f47e 100644 (file)
@@ -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 (file)
index 0000000..a8847e0
--- /dev/null
@@ -0,0 +1,5 @@
+IMAGE_FEATURES =+ "debug-tweaks"
+
+#DISTRO_FEATURES_append = " "
+
+#IMAGE_INSTALL_append = " "
index 7da7ac0..f9ef8c6 100644 (file)
@@ -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 (file)
index 5a58098..0000000
+++ /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 (file)
index 0000000..bc53051
--- /dev/null
@@ -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 (file)
index 0000000..3f9ff7b
--- /dev/null
@@ -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 (file)
index 0000000..8cfa8ec
--- /dev/null
@@ -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 (file)
index 0000000..83f6c1e
--- /dev/null
@@ -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"
index 4f28210..cc198c1 100644 (file)
@@ -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 (file)
index 0000000..cc9c413
--- /dev/null
@@ -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 (file)
index 0000000..569f070
--- /dev/null
@@ -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 (file)
index 0000000..a129232
--- /dev/null
@@ -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 (file)
index 0000000..8bdcd7c
--- /dev/null
@@ -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 (file)
index 0000000..254e5e4
--- /dev/null
@@ -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 (file)
index 0000000..7d2661b
--- /dev/null
@@ -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 (file)
index 0000000..e4dccbf
--- /dev/null
@@ -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 (file)
index 0000000..545ab6a
--- /dev/null
@@ -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 (file)
index 0000000..f2474be
--- /dev/null
@@ -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 (file)
index 0000000..cc89369
--- /dev/null
@@ -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 (file)
index 0000000..4f1757c
--- /dev/null
@@ -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 (file)
index 0000000..c50a048
--- /dev/null
@@ -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 (executable)
index 0000000..71a615c
--- /dev/null
@@ -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 (file)
index 0000000..c7fb72f
--- /dev/null
@@ -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 (file)
index 0000000..1757dcb
--- /dev/null
@@ -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 (file)
index 0000000..43eed3f
--- /dev/null
@@ -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 (file)
index 0000000..a46ce12
--- /dev/null
@@ -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 (file)
index 0000000..bf714f4
--- /dev/null
@@ -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 (file)
index 0000000..49187ad
--- /dev/null
@@ -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 (file)
index 0000000..6c5a181
--- /dev/null
@@ -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 (file)
index 0000000..ff39136
--- /dev/null
@@ -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 (file)
index 0000000..85ebc90
--- /dev/null
@@ -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 (file)
index 0000000..e7e25c7
--- /dev/null
@@ -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 (file)
index 0000000..75532da
--- /dev/null
@@ -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 (file)
index 0000000..49efce7
--- /dev/null
@@ -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 (file)
index 0000000..709a109
--- /dev/null
@@ -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 (file)
index 0000000..f1fce78
--- /dev/null
@@ -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 (file)
index 0000000..dd8a912
--- /dev/null
@@ -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 (file)
index 0000000..7bd8bf2
--- /dev/null
@@ -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 (file)
index 0000000..1309ffa
--- /dev/null
@@ -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 (file)
index 0000000..389ab24
--- /dev/null
@@ -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 (file)
index 0000000..6c9a388
--- /dev/null
@@ -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 (file)
index 0000000..495ab62
--- /dev/null
@@ -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 (file)
index 0000000..010329e
--- /dev/null
@@ -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 (file)
index 0000000..bcb4788
--- /dev/null
@@ -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 (file)
index 0000000..b59302e
--- /dev/null
@@ -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 (file)
index 0000000..1f2762d
--- /dev/null
@@ -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 (file)
index 0000000..8ae83bd
--- /dev/null
@@ -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 (file)
index 0000000..87ffff6
--- /dev/null
@@ -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 (file)
index 0000000..8545d76
--- /dev/null
@@ -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 (file)
index 0000000..18e6949
--- /dev/null
@@ -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 (file)
index 0000000..0e9cd62
--- /dev/null
@@ -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 (file)
index 0000000..6ce2a76
--- /dev/null
@@ -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 (file)
index 0000000..78528aa
--- /dev/null
@@ -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 (file)
index 0000000..c1545c7
--- /dev/null
@@ -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 (file)
index 0000000..f64bcfb
--- /dev/null
@@ -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 (file)
index 0000000..afd8880
--- /dev/null
@@ -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 (file)
index 0000000..c329516
--- /dev/null
@@ -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 (file)
index 0000000..49c11a5
--- /dev/null
@@ -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 (file)
index 0000000..2ab0381
--- /dev/null
@@ -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 (file)
index 0000000..f39fc9b
--- /dev/null
@@ -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 (file)
index 0000000..3bb6b24
--- /dev/null
@@ -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 (file)
index 0000000..596fe05
--- /dev/null
@@ -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 (file)
index 0000000..d40d9a4
--- /dev/null
@@ -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 (file)
index 0000000..baef6cc
--- /dev/null
@@ -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 (file)
index 0000000..f8634c4
--- /dev/null
@@ -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 (file)
index 0000000..7b44e48
--- /dev/null
@@ -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 (file)
index 0000000..e47214c
--- /dev/null
@@ -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 (file)
index 0000000..0386aa9
--- /dev/null
@@ -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 (file)
index 0000000..b02d6ee
--- /dev/null
@@ -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 (file)
index 0000000..86b7392
--- /dev/null
@@ -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 (file)
index 0000000..b442d9f
--- /dev/null
@@ -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 (file)
index 0000000..dee6ad7
--- /dev/null
@@ -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 (file)
index 0000000..af76b2f
--- /dev/null
@@ -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 (file)
index 0000000..f8f0266
--- /dev/null
@@ -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 (file)
index 0000000..c4fafef
--- /dev/null
@@ -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 (file)
index 0000000..8abed71
--- /dev/null
@@ -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 (file)
index 0000000..379c543
--- /dev/null
@@ -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 (file)
index 0000000..c4fafef
--- /dev/null
@@ -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 (file)
index 0000000..ee21af8
--- /dev/null
@@ -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 (file)
index 0000000..4c135cc
--- /dev/null
@@ -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 (file)
index 0000000..823cc28
--- /dev/null
@@ -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 (file)
index 0000000..e69de29
diff --git a/recipes-core/psplash/files/psplash-colors.h b/recipes-core/psplash/files/psplash-colors.h
new file mode 100644 (file)
index 0000000..4474903
--- /dev/null
@@ -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 (file)
index 0000000..c0e8b08
--- /dev/null
@@ -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 (file)
index 0000000..dad2612
--- /dev/null
@@ -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 (file)
index 0000000..931b27c
--- /dev/null
@@ -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 (file)
index 0000000..a554700
--- /dev/null
@@ -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 (file)
index 0000000..9b6fd57
--- /dev/null
@@ -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 (file)
index 0000000..3aa800a
--- /dev/null
@@ -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 (file)
index 0000000..a86552f
--- /dev/null
@@ -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 (file)
index 0000000..3c30e51
--- /dev/null
@@ -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 (file)
index 0000000..fb5deec
--- /dev/null
@@ -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/cluster-dashboard/cluster-dashboard_git.bb b/recipes-demo/cluster-dashboard/cluster-dashboard_git.bb
new file mode 100644 (file)
index 0000000..da15ac8
--- /dev/null
@@ -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 (file)
index 0000000..44feecb
--- /dev/null
@@ -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 (file)
index 0000000..534351f
--- /dev/null
@@ -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 (file)
index 0000000..10728d5
--- /dev/null
@@ -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 (file)
index 0000000..90180dc
--- /dev/null
@@ -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 (file)
index 0000000..5c6a5b3
--- /dev/null
@@ -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 (file)
index 0000000..1370214
--- /dev/null
@@ -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 (file)
index 0000000..4be666b
--- /dev/null
@@ -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}/*"
@@ -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/simple-can-simulator/files/simple_can_simulator.py b/recipes-demo/simple-can-simulator/files/simple_can_simulator.py
new file mode 100755 (executable)
index 0000000..83f8870
--- /dev/null
@@ -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 (file)
index 0000000..bca4487
--- /dev/null
@@ -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/telematics-recorder/telematics-recorder_git.bb b/recipes-demo/telematics-recorder/telematics-recorder_git.bb
new file mode 100644 (file)
index 0000000..1636cb0
--- /dev/null
@@ -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-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 (file)
index 0000000..4c0bda0
--- /dev/null
@@ -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 (file)
index 0000000..ab7e8af
--- /dev/null
@@ -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 (file)
index 0000000..5ff2d4e
--- /dev/null
@@ -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 (file)
index 0000000..5ed9b1d
--- /dev/null
@@ -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 (executable)
index 0000000..1d1a5a0
--- /dev/null
@@ -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 (file)
index 0000000..8f8667d
--- /dev/null
@@ -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 (file)
index 0000000..31503aa
--- /dev/null
@@ -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 (file)
index 0000000..590ab70
--- /dev/null
@@ -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 (file)
index 0000000..fee9573
--- /dev/null
@@ -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 (file)
index 0000000..27fb60d
--- /dev/null
@@ -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 (file)
index 0000000..7fa9686
--- /dev/null
@@ -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 (file)
index 0000000..16ea328
--- /dev/null
@@ -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 (file)
index 0000000..b063f65
--- /dev/null
@@ -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 (file)
index 0000000..da511c8
--- /dev/null
@@ -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 (file)
index 0000000..09a262e
--- /dev/null
@@ -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"
index 1598658..86a5d90 100644 (file)
@@ -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 (file)
index 0000000..bb47bdc
--- /dev/null
@@ -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 (file)
index 0000000..8af3184
--- /dev/null
@@ -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 (file)
index 0000000..c4b302f
--- /dev/null
@@ -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 (file)
index 0000000..2b81020
--- /dev/null
@@ -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 (file)
index 0000000..9c3df05
--- /dev/null
@@ -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 (file)
index 0000000..585db6b
--- /dev/null
@@ -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 (file)
index 0000000..51c68c3
--- /dev/null
@@ -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 (file)
index 0000000..fb3e677
--- /dev/null
@@ -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 (file)
index 0000000..e5ce4b5
--- /dev/null
@@ -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 (file)
index 0000000..a5f0b09
--- /dev/null
@@ -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 (file)
index 0000000..dd811c8
--- /dev/null
@@ -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 (file)
index 0000000..4703844
--- /dev/null
@@ -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 (file)
index 0000000..010d4b0
--- /dev/null
@@ -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 (file)
index 0000000..ebaee9e
--- /dev/null
@@ -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 (file)
index 0000000..59c6ae6
--- /dev/null
@@ -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 (file)
index 0000000..679fab7
--- /dev/null
@@ -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 (file)
index 0000000..1b01fb1
--- /dev/null
@@ -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 (file)
index 0000000..08cd6f9
--- /dev/null
@@ -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 (file)
index 0000000..ff21b21
--- /dev/null
@@ -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 (file)
index 0000000..d4383c4
--- /dev/null
@@ -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 (file)
index 0000000..02eca27
--- /dev/null
@@ -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 (file)
index 0000000..48959a6
--- /dev/null
@@ -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 (file)
index 0000000..ad422eb
--- /dev/null
@@ -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 (file)
index 0000000..443e7db
--- /dev/null
@@ -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 (file)
index 0000000..7f389da
--- /dev/null
@@ -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 (file)
index 0000000..fcfda53
--- /dev/null
@@ -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 (file)
index 0000000..2d314ac
--- /dev/null
@@ -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 (file)
index 0000000..86a181f
--- /dev/null
@@ -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 (file)
index 0000000..51896e8
--- /dev/null
@@ -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 (file)
index 0000000..dd1b347
--- /dev/null
@@ -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 (file)
index 0000000..e69de29
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 (file)
index 0000000..15d4b3f
--- /dev/null
@@ -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 (file)
index 0000000..5abb980
--- /dev/null
@@ -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 (file)
index 0000000..8a9e35b
--- /dev/null
@@ -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 (file)
index 0000000..9528bec
--- /dev/null
@@ -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 (file)
index 0000000..63b48eb
--- /dev/null
@@ -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 (file)
index 0000000..6a0b8ff
--- /dev/null
@@ -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 (file)
index 0000000..b47b279
--- /dev/null
@@ -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 (file)
index 0000000..f215876
--- /dev/null
@@ -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 (file)
index 0000000..a7486d0
--- /dev/null
@@ -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 (file)
index 0000000..eb1eef6
--- /dev/null
@@ -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 (file)
index 0000000..24936e5
--- /dev/null
@@ -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 (file)
index 0000000..e1e6f7a
--- /dev/null
@@ -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 (file)
index 0000000..ac56bfb
--- /dev/null
@@ -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 (file)
index 0000000..5899505
--- /dev/null
@@ -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 (file)
index 0000000..6f8bf62
--- /dev/null
@@ -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 (file)
index 0000000..52d737b
--- /dev/null
@@ -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 (file)
index 0000000..8745ca9
--- /dev/null
@@ -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 (file)
index 0000000..d6f3256
--- /dev/null
@@ -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 (file)
index 0000000..11c1ebc
--- /dev/null
@@ -0,0 +1,2 @@
+# Base image
+require recipes-platform/images/agl-image-cluster-qt5.inc
index ff3e9df..d4b6c9d 100644 (file)
@@ -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 (file)
index 0000000..244e2ba
--- /dev/null
@@ -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 (file)
index 0000000..93826aa
--- /dev/null
@@ -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 (file)
index 0000000..552d7a7
--- /dev/null
@@ -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 (file)
index 0000000..93826aa
--- /dev/null
@@ -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 (file)
index 0000000..0ec6829
--- /dev/null
@@ -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 (file)
index 0000000..e943b99
--- /dev/null
@@ -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 (executable)
index 0000000..5147ea4
--- /dev/null
@@ -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 (file)
index 0000000..f43bb07
--- /dev/null
@@ -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 (file)
index 0000000..bcfd724
--- /dev/null
@@ -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 (file)
index 0000000..114d06a
--- /dev/null
@@ -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 (file)
index 0000000..ad6ef98
--- /dev/null
@@ -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 (file)
index 0000000..3e95155
--- /dev/null
@@ -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 (file)
index 0000000..75b4f5c
--- /dev/null
@@ -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 (file)
index 0000000..403f4b7
--- /dev/null
@@ -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 (file)
index 0000000..bd3a89e
--- /dev/null
@@ -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 (file)
index 0000000..f75f9ab
--- /dev/null
@@ -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 (file)
index 0000000..d0fa1a2
--- /dev/null
@@ -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 (file)
index 0000000..cc9ed3d
--- /dev/null
@@ -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 (file)
index 0000000..2161e1a
--- /dev/null
@@ -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 (file)
index 0000000..2ca89e4
--- /dev/null
@@ -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 (file)
index 0000000..70c7356
--- /dev/null
@@ -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 (file)
index 0000000..dfbddd9
--- /dev/null
@@ -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 (file)
index 0000000..adebabe
--- /dev/null
@@ -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 (file)
index 0000000..e587ab2
--- /dev/null
@@ -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 (file)
index 0000000..aa401a7
--- /dev/null
@@ -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 (file)
index 0000000..d7d7be2
--- /dev/null
@@ -0,0 +1,8 @@
+RDEPENDS_${PN} += " \
+                  weston-ini-conf \
+                  agl-compositor \
+                  "
+# appfw 
+RDEPENDS_${PN} += " \
+                  agl-login-manager \
+                  "
index acaa405..d04c72f 100644 (file)
@@ -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 \
     "
index 90daf92..6fa6c92 100644 (file)
@@ -12,6 +12,6 @@ PACKAGES = "\
 
 RDEPENDS_${PN} += "\
     gpsd \
-    virtual/gpsd-conf \
     geoclue \
+    ${@bb.utils.contains('AGL_FEATURES', 'agldemo', 'virtual/gpsd-conf', '', d)} \
     "
index 489916b..2b09fa4 100644 (file)
@@ -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 (file)
index 0000000..3e89303
--- /dev/null
@@ -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 (file)
index 0000000..5436a56
--- /dev/null
@@ -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 (file)
index 0000000..9d54b33
--- /dev/null
@@ -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 (file)
index 0000000..c0c6124
--- /dev/null
@@ -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 (file)
index 0000000..2027501
--- /dev/null
@@ -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 (file)
index 0000000..74b35f7
--- /dev/null
@@ -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 (file)
index 0000000..1c980d9
--- /dev/null
@@ -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 (file)
index 0000000..66fc0f7
--- /dev/null
@@ -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 (file)
index 0000000..fb33289
--- /dev/null
@@ -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 (file)
index 0000000..0dbbd62
--- /dev/null
@@ -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 (file)
index 0000000..9a3b578
--- /dev/null
@@ -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 (file)
index 0000000..08afa6c
--- /dev/null
@@ -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 (file)
index 0000000..49111b6
--- /dev/null
@@ -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 (file)
index 0000000..b7cfe8d
--- /dev/null
@@ -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 (file)
index 0000000..10a1ddd
--- /dev/null
@@ -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 (file)
index 0000000..ff8fe68
--- /dev/null
@@ -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 (file)
index 0000000..357e1e8
--- /dev/null
@@ -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 (file)
index 0000000..ba8a991
--- /dev/null
@@ -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 (file)
index 0000000..b12c428
--- /dev/null
@@ -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 (file)
index 0000000..7d112d0
--- /dev/null
@@ -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 (file)
index 0000000..007e467
--- /dev/null
@@ -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 (file)
index 0000000..dacca3b
--- /dev/null
@@ -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 (file)
index 0000000..a8ef5af
--- /dev/null
@@ -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 (file)
index 0000000..4fe0f28
--- /dev/null
@@ -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 (file)
index 0000000..550c58d
--- /dev/null
@@ -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 (file)
index 0000000..a371c6c
--- /dev/null
@@ -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 (file)
index 0000000..ae7c956
--- /dev/null
@@ -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 (file)
index 0000000..c91e117
--- /dev/null
@@ -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 (file)
index 0000000..591ef71
--- /dev/null
@@ -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 (file)
index 0000000..39296c7
--- /dev/null
@@ -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 (file)
index 0000000..6bea626
--- /dev/null
@@ -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 (file)
index 0000000..fe1bb50
--- /dev/null
@@ -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 (file)
index 0000000..8f0425a
--- /dev/null
@@ -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 (file)
index 0000000..413459f
--- /dev/null
@@ -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 (file)
index 0000000..8723def
--- /dev/null
@@ -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 (file)
index 0000000..984ae81
--- /dev/null
@@ -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 (file)
index 0000000..bca61b5
--- /dev/null
@@ -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 (file)
index 0000000..f9ab5fc
--- /dev/null
@@ -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 (file)
index 0000000..46bf2e7
--- /dev/null
@@ -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 (file)
index 0000000..d0b1302
--- /dev/null
@@ -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 (file)
index 0000000..0420578
--- /dev/null
@@ -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 (file)
index 0000000..b126b6d
--- /dev/null
@@ -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 (file)
index 0000000..fc24cea
--- /dev/null
@@ -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 (file)
index 0000000..a1016a6
--- /dev/null
@@ -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 (file)
index 0000000..86d759b
--- /dev/null
@@ -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 (file)
index 0000000..996e434
--- /dev/null
@@ -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 (file)
index 0000000..b165151
--- /dev/null
@@ -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 (file)
index 0000000..2367919
--- /dev/null
@@ -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 (file)
index 0000000..a36862b
--- /dev/null
@@ -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 (file)
index 0000000..44c9a5b
--- /dev/null
@@ -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 (file)
index 0000000..5246abb
--- /dev/null
@@ -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 (file)
index 0000000..883939a
--- /dev/null
@@ -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 (file)
index 0000000..1258023
--- /dev/null
@@ -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 (file)
index 0000000..2ff39b2
--- /dev/null
@@ -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 (file)
index 0000000..be1dcf8
--- /dev/null
@@ -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 (file)
index 0000000..699aea2
--- /dev/null
@@ -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 (file)
index 0000000..6da04cc
--- /dev/null
@@ -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 (file)
index 0000000..821a1de
--- /dev/null
@@ -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 (file)
index 0000000..90242d7
--- /dev/null
@@ -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 (file)
index 0000000..485766b
--- /dev/null
@@ -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 (file)
index 0000000..4f545c1
--- /dev/null
@@ -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 (file)
index 0000000..0fd55a6
--- /dev/null
@@ -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 (file)
index 0000000..c8ddc51
--- /dev/null
@@ -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 (file)
index 0000000..a855bf9
--- /dev/null
@@ -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 (file)
index 0000000..829abe0
--- /dev/null
@@ -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 (file)
index 0000000..d50a14f
--- /dev/null
@@ -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 (executable)
index 0000000..44f6e6b
--- /dev/null
@@ -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 (executable)
index 0000000..507f825
--- /dev/null
@@ -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 (file)
index 0000000..f15acf6
--- /dev/null
@@ -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 (file)
index 0000000..bfb2108
--- /dev/null
@@ -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 (file)
index 0000000..90b0380
--- /dev/null
@@ -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 (file)
index 0000000..82639da
--- /dev/null
@@ -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 (file)
index 7e85c57..0000000
+++ /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 (file)
index 7662624..0000000
+++ /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 (file)
index 28feb6e..0000000
+++ /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 (file)
index b0b9428..0000000
+++ /dev/null
@@ -1 +0,0 @@
-agl-appfw-smack agl-hmi-framework agl-profile-graphical-qt5 agl-audio-soundmanager-framework
index afa14f2..55917cc 100644 (file)
@@ -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 \
 "
index cbf86e8..1450767 100644 (file)
@@ -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 (file)
index 0000000..64c8714
--- /dev/null
@@ -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 (file)
index 0000000..92798cd
--- /dev/null
@@ -0,0 +1 @@
+agl-demo
\ No newline at end of file