diff --git a/gulpfile.js b/gulpfile.js index 9b210773..91e8ec9b 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -60,13 +60,14 @@ gulp.task('clean-release', clean_release); gulp.task('clean-cache', clean_cache); -var distBuild = gulp.series(clean_dist, dist_src, dist_locale, dist_libraries, dist_resources); -gulp.task('dist', distBuild); +var distBuild = gulp.series(dist_src, dist_locale, dist_libraries, dist_resources); +var distRebuild = gulp.series(clean_dist, distBuild); +gulp.task('dist', distRebuild); -var appsBuild = gulp.series(gulp.parallel(clean_apps, distBuild), apps, gulp.parallel(listPostBuildTasks(APPS_DIR))); +var appsBuild = gulp.series(gulp.parallel(clean_apps, distRebuild), apps, gulp.parallel(listPostBuildTasks(APPS_DIR))); gulp.task('apps', appsBuild); -var debugBuild = gulp.series(gulp.parallel(clean_debug, distBuild), debug, gulp.parallel(listPostBuildTasks(DEBUG_DIR)), start_debug) +var debugBuild = gulp.series(distBuild, debug, gulp.parallel(listPostBuildTasks(DEBUG_DIR)), start_debug) gulp.task('debug', debugBuild); var releaseBuild = gulp.series(gulp.parallel(clean_release, appsBuild), gulp.parallel(listReleaseTasks())); diff --git a/libraries/analytics.js b/libraries/analytics.js new file mode 100644 index 00000000..0dae3ea9 --- /dev/null +++ b/libraries/analytics.js @@ -0,0 +1,58 @@ +(function(){var $c=function(a){this.w=a||[]};$c.prototype.set=function(a){this.w[a]=!0};$c.prototype.encode=function(){for(var a=[],b=0;b\x3c/script>')):(c=M.createElement("script"), +c.type="text/javascript",c.async=!0,c.src=a,b&&(c.id=b),a=M.getElementsByTagName("script")[0],a.parentNode.insertBefore(c,a)))},be=function(a,b){return E(M.location[b?"href":"search"],a)},E=function(a,b){return(a=a.match("(?:&|#|\\?)"+K(b).replace(/([.*+?^=!:${}()|\[\]\/\\])/g,"\\$1")+"=([^&#]*)"))&&2==a.length?a[1]:""},xa=function(){var a=""+M.location.hostname;return 0==a.indexOf("www.")?a.substring(4):a},de=function(a,b){var c=a.indexOf(b);if(5==c||6==c)if(a=a.charAt(c+b.length),"/"==a||"?"==a|| +""==a||":"==a)return!0;return!1},ya=function(a,b){var c=M.referrer;if(/^(https?|android-app):\/\//i.test(c)){if(a)return c;a="//"+M.location.hostname;if(!de(c,a))return b&&(b=a.replace(/\./g,"-")+".cdn.ampproject.org",de(c,b))?void 0:c}},za=function(a,b){if(1==b.length&&null!=b[0]&&"object"===typeof b[0])return b[0];for(var c={},d=Math.min(a.length+1,b.length),e=0;e=b.length)wc(a,b,c);else if(8192>=b.length)x(a,b,c)||wd(a,b,c)||wc(a,b,c);else throw ge("len",b.length),new Da(b.length);},pe=function(a,b,c,d){d=d||ua;wd(a+"?"+b,"",d,c)},wc=function(a,b,c){var d=ta(a+"?"+b);d.onload=d.onerror=function(){d.onload=null;d.onerror=null;c()}},wd=function(a,b,c,d){var e=O.XMLHttpRequest; +if(!e)return!1;var g=new e;if(!("withCredentials"in g))return!1;a=a.replace(/^http:/,"https:");g.open("POST",a,!0);g.withCredentials=!0;g.setRequestHeader("Content-Type","text/plain");g.onreadystatechange=function(){if(4==g.readyState){if(d)try{var a=g.responseText;if(1>a.length)ge("xhr","ver","0"),c();else if("1"!=a.charAt(0))ge("xhr","ver",String(a.length)),c();else if(3=100*R(a,Ka))throw"abort";}function Ma(a){if(G(P(a,Na)))throw"abort";}function Oa(){var a=M.location.protocol;if("http:"!=a&&"https:"!=a)throw"abort";} +function Pa(a){try{O.navigator.sendBeacon?J(42):O.XMLHttpRequest&&"withCredentials"in new O.XMLHttpRequest&&J(40)}catch(c){}a.set(ld,Td(a),!0);a.set(Ac,R(a,Ac)+1);var b=[];Qa.map(function(c,d){d.F&&(c=a.get(c),void 0!=c&&c!=d.defaultValue&&("boolean"==typeof c&&(c*=1),b.push(d.F+"="+K(""+c))))});b.push("z="+Bd());a.set(Ra,b.join("&"),!0)} +function Sa(a){var b=P(a,gd)||oe()+"/collect",c=a.get(qe),d=P(a,fa);!d&&a.get(Vd)&&(d="beacon");if(c)pe(b,P(a,Ra),c,a.get(Ia));else if(d){c=d;d=P(a,Ra);var e=a.get(Ia);e=e||ua;"image"==c?wc(b,d,e):"xhr"==c&&wd(b,d,e)||"beacon"==c&&x(b,d,e)||ba(b,d,e)}else ba(b,P(a,Ra),a.get(Ia));b=a.get(Na);b=h(b);c=b.hitcount;b.hitcount=c?c+1:1;b=a.get(Na);delete h(b).pending_experiments;a.set(Ia,ua,!0)} +function Hc(a){(O.gaData=O.gaData||{}).expId&&a.set(Nc,(O.gaData=O.gaData||{}).expId);(O.gaData=O.gaData||{}).expVar&&a.set(Oc,(O.gaData=O.gaData||{}).expVar);var b=a.get(Na);if(b=h(b).pending_experiments){var c=[];for(d in b)b.hasOwnProperty(d)&&b[d]&&c.push(encodeURIComponent(d)+"."+encodeURIComponent(b[d]));var d=c.join("!")}else d=void 0;d&&a.set(m,d,!0)}function cd(){if(O.navigator&&"preview"==O.navigator.loadPurpose)throw"abort";} +function yd(a){var b=O.gaDevIds;ka(b)&&0!=b.length&&a.set("&did",b.join(","),!0)}function vb(a){if(!a.get(Na))throw"abort";};var hd=function(){return Math.round(2147483647*Math.random())},Bd=function(){try{var a=new Uint32Array(1);O.crypto.getRandomValues(a);return a[0]&2147483647}catch(b){return hd()}};function Ta(a){var b=R(a,Ua);500<=b&&J(15);var c=P(a,Va);if("transaction"!=c&&"item"!=c){c=R(a,Wa);var d=(new Date).getTime(),e=R(a,Xa);0==e&&a.set(Xa,d);e=Math.round(2*(d-e)/1E3);0=c)throw"abort";a.set(Wa,--c)}a.set(Ua,++b)};var Ya=function(){this.data=new ee},Qa=new ee,Za=[];Ya.prototype.get=function(a){var b=$a(a),c=this.data.get(a);b&&void 0==c&&(c=ea(b.defaultValue)?b.defaultValue():b.defaultValue);return b&&b.Z?b.Z(this,a,c):c};var P=function(a,b){a=a.get(b);return void 0==a?"":""+a},R=function(a,b){a=a.get(b);return void 0==a||""===a?0:1*a};Ya.prototype.set=function(a,b,c){if(a)if("object"==typeof a)for(var d in a)a.hasOwnProperty(d)&&ab(this,d,a[d],c);else ab(this,a,b,c)}; +var ab=function(a,b,c,d){if(void 0!=c)switch(b){case Na:wb.test(c)}var e=$a(b);e&&e.o?e.o(a,b,c,d):a.data.set(b,c,d)},bb=function(a,b,c,d,e){this.name=a;this.F=b;this.Z=d;this.o=e;this.defaultValue=c},$a=function(a){var b=Qa.get(a);if(!b)for(var c=0;c=b?!1:!0},gc=function(a){var b={};if(Ec(b)||Fc(b)){var c=b[Eb];void 0==c||Infinity==c||isNaN(c)||(0c)a[b]=void 0},Fd=function(a){return function(b){if("pageview"==b.get(Va)&& +!a.I){a.I=!0;var c=aa(b),d=0a.length)J(12);else{for(var d=[],e=0;e=a&&d.push({hash:ca[0],R:e[g],O:ca})}if(0!=d.length)return 1==d.length?d[0]:Zc(b,d)||Zc(c,d)||Zc(null,d)||d[0]}function Zc(a,b){if(null==a)var c=a=1;else c=La(a),a=La(D(a,".")?a.substring(1):"."+a);for(var d=0;d=ca[0]||0>=ca[1]?"":ca.join("x");a.set(rb,c);a.set(tb,fc());a.set(ob,M.characterSet||M.charset);a.set(sb,b&&"function"===typeof b.javaEnabled&&b.javaEnabled()|| +!1);a.set(nb,(b&&(b.language||b.browserLanguage)||"").toLowerCase());a.data.set(ce,be("gclid",!0));a.data.set(ie,be("gclsrc",!0));a.data.set(fe,Math.round((new Date).getTime()/1E3));if(d&&a.get(cc)&&(b=M.location.hash)){b=b.split(/[?&#]+/);d=[];for(c=0;carguments.length)){if("string"===typeof arguments[0]){var b=arguments[0];var c=[].slice.call(arguments,1)}else b=arguments[0]&&arguments[0][Va],c=arguments;b&&(c=za(qc[b]||[],c),c[Va]=b,this.b.set(c,void 0,!0),this.filters.D(this.b),this.b.data.m={})}}; +pc.prototype.ma=function(a,b){var c=this;u(a,c,b)||(v(a,function(){u(a,c,b)}),y(String(c.get(V)),a,void 0,b,!0))};var rc=function(a){if("prerender"==M.visibilityState)return!1;a();return!0},z=function(a){if(!rc(a)){J(16);var b=!1,c=function(){if(!b&&rc(a)){b=!0;var d=c,e=M;e.removeEventListener?e.removeEventListener("visibilitychange",d,!1):e.detachEvent&&e.detachEvent("onvisibilitychange",d)}};L(M,"visibilitychange",c)}};var td=/^(?:(\w+)\.)?(?:(\w+):)?(\w+)$/,sc=function(a){if(ea(a[0]))this.u=a[0];else{var b=td.exec(a[0]);null!=b&&4==b.length&&(this.c=b[1]||"t0",this.K=b[2]||"",this.C=b[3],this.a=[].slice.call(a,1),this.K||(this.A="create"==this.C,this.i="require"==this.C,this.g="provide"==this.C,this.ba="remove"==this.C),this.i&&(3<=this.a.length?(this.X=this.a[1],this.W=this.a[2]):this.a[1]&&(qa(this.a[1])?this.X=this.a[1]:this.W=this.a[1])));b=a[1];a=a[2];if(!this.C)throw"abort";if(this.i&&(!qa(b)||""==b))throw"abort"; +if(this.g&&(!qa(b)||""==b||!ea(a)))throw"abort";if(ud(this.c)||ud(this.K))throw"abort";if(this.g&&"t0"!=this.c)throw"abort";}};function ud(a){return 0<=a.indexOf(".")||0<=a.indexOf(":")};var Yd,Zd,$d,A;Yd=new ee;$d=new ee;A=new ee;Zd={ec:45,ecommerce:46,linkid:47}; +var u=function(a,b,c){b==N||b.get(V);var d=Yd.get(a);if(!ea(d))return!1;b.plugins_=b.plugins_||new ee;if(b.plugins_.get(a))return!0;b.plugins_.set(a,new d(b,c||{}));return!0},y=function(a,b,c,d,e){if(!ea(Yd.get(b))&&!$d.get(b)){Zd.hasOwnProperty(b)&&J(Zd[b]);if(p.test(b)){J(52);a=N.j(a);if(!a)return!0;c=d||{};d={id:b,B:c.dataLayer||"dataLayer",ia:!!a.get("anonymizeIp"),sync:e,G:!1};a.get(">m")==b&&(d.G=!0);var g=String(a.get("name"));"t0"!=g&&(d.target=g);G(String(a.get("trackingId")))||(d.clientId= +String(a.get(Q)),d.ka=Number(a.get(n)),c=c.palindrome?r:q,c=(c=M.cookie.replace(/^|(; +)/g,";").match(c))?c.sort().join("").substring(1):void 0,d.la=c,d.qa=E(a.b.get(kb)||"","gclid"));a=d.B;c=(new Date).getTime();O[a]=O[a]||[];c={"gtm.start":c};e||(c.event="gtm.js");O[a].push(c);c=t(d)}!c&&Zd.hasOwnProperty(b)?(J(39),c=b+".js"):J(43);c&&(c&&0<=c.indexOf("/")||(c=(Ba||"https:"==M.location.protocol?"https:":"http:")+"//www.google-analytics.com/plugins/ua/"+c),d=ae(c),a=d.protocol,c=M.location.protocol, +("https:"==a||a==c||("http:"!=a?0:"http:"==c))&&B(d)&&(wa(d.url,void 0,e),$d.set(b,!0)))}},v=function(a,b){var c=A.get(a)||[];c.push(b);A.set(a,c)},C=function(a,b){Yd.set(a,b);b=A.get(a)||[];for(var c=0;ca.split("/")[0].indexOf(":")&& +(a=ca+e[2].substring(0,e[2].lastIndexOf("/"))+"/"+a);c.href=a;d=b(c);return{protocol:(c.protocol||"").toLowerCase(),host:d[0],port:d[1],path:d[2],query:c.search||"",url:a||""}};var Z={ga:function(){Z.f=[]}};Z.ga();Z.D=function(a){var b=Z.J.apply(Z,arguments);b=Z.f.concat(b);for(Z.f=[];0c;c++){var d=b[c].src;if(d&&0==d.indexOf("https://www.google-analytics.com/analytics")){b= +!0;break a}}b=!1}b&&(Ba=!0)}(O.gaplugins=O.gaplugins||{}).Linker=Dc;b=Dc.prototype;C("linker",Dc);X("decorate",b,b.ca,20);X("autoLink",b,b.S,25);C("displayfeatures",fd);C("adfeatures",fd);a=a&&a.q;ka(a)?Z.D.apply(N,a):J(50)}};N.da=function(){for(var a=N.getAll(),b=0;b>21:b}return b};})(window); diff --git a/locales/en/messages.json b/locales/en/messages.json index 98c558fe..820eb019 100644 --- a/locales/en/messages.json +++ b/locales/en/messages.json @@ -9,12 +9,21 @@ "error": { "message": "Error: {{errorMessage}}" }, + "errorTitle": { + "message": "Error" + }, "warningTitle": { "message": "Warning" }, "noticeTitle": { "message": "Notice" }, + "operationNotSupported": { + "message": "This operation is not supported by your hardware." + }, + "storageDeviceNotReady": { + "message": "The storage device is not ready. In the case of a microSD card, make sure it is properly recognised by your flight controller." + }, "options_title": { "message": "Application Options" }, @@ -51,6 +60,12 @@ "permanentExpertMode": { "message": "Permanently enable Expert Mode" }, + "rememberLastTab": { + "message": "Reopen last tab on connect" + }, + "analyticsOptOut": { + "message": "Opt out of the anonymised collection of statistics data" + }, "userLanguageSelect": { "message": "Language (need to restart the application for the changes to take effect)" }, @@ -377,6 +392,15 @@ "message" : "Running - OS: {{operatingSystem}}, Chrome: {{chromeVersion}}, Configurator: {{configuratorVersion}}", "description": "Message that appears in the GUI log panel indicating operating system, Chrome version and Configurator version" }, + "buildServerLoaded": { + "message" : "Loaded builds information for $1 from build server." + }, + "buildServerLoadFailed": { + "message" : "Build server query for $1 releases failed, using cached information. Reason: $2" + }, + "buildServerUsingCached": { + "message" : "Using cached builds information for $1." + }, "releaseCheckLoaded": { "message" : "Loaded release information for $1 from GitHub." }, @@ -513,6 +537,9 @@ "defaultChangelogHead": { "message": "Configurator - Changelog" }, + "defaultPrivacyPolicyAction": { + "message": "Privacy Policy" + }, "defaultButtonFirmwareFlasher": { "message": "Firmware Flasher" }, @@ -520,7 +547,7 @@ "message": "Open Source / Donation Notice" }, "defaultDonateText": { - "message": "This utility is fully open source and is available free of charge to all Betaflight users.
If you found the Betaflight or Betaflight configurator useful, please consider supporting its development by donating." + "message": "Betaflight is a flight controller software that is open source and is available free of charge without warranty to all users.
If you found the Betaflight or Betaflight configurator useful, please consider supporting its development by donating." }, "defaultDonate": { "message": "Donate" @@ -598,8 +625,14 @@ "initialSetupButtonRestore": { "message": "Restore" }, + "initialSetupButtonRebootBootloader": { + "message": "Activate Boot Loader / DFU" + }, "initialSetupBackupRestoreText": { - "message": "Backup your configuration in case of an accident, CLI settings are not included - See 'dump' cli command" + "message": "Backup your configuration in case of an accident, CLI settings are not included - use the command 'diff all' in CLI for this." + }, + "initialSetupRebootBootloaderText": { + "message": "Reboot into boot loader / DFU mode." }, "initialSetupBackupSuccess": { "message": "Backup saved successfully" @@ -1227,6 +1260,17 @@ "message": "Profile independent PID Controller Settings" }, + "pidTuningAntiGravityMode": { + "message": "Anti Gravity Mode" + }, + "pidTuningAntiGravityModeOptionSmooth": { + "message": "Smooth", + "description": "One of the modes of anti gravity" + }, + "pidTuningAntiGravityModeOptionStep": { + "message": "Step", + "description": "One of the modes of anti gravity" + }, "pidTuningAntiGravityGain": { "message": "Anti Gravity Gain" }, @@ -1348,6 +1392,12 @@ "receiverRcInterpolationInterval": { "message": "RC Interpolation Interval [ms]" }, + "pidTuningFeedforwardTransition": { + "message": "Feedforward transition" + }, + "pidTuningFeedforwardTransitionHelp": { + "message": "With this parameter, the Feedforward term can be reduced near the center of the sticks, which results in smoother end of flips and rolls.
The value represents a point of stick deflection: 0 - stick centered, 1 - full deflection. When the stick is above that point, Feedforward is kept constant at its configured value. When the stick is positioned below that point, Feedforward is reduced proportionally, reaching 0 at the stick center position.
Value of 1 gives maximum smoothing effect, while value of 0 keeps the Feedforward fixed at its configured value over the whole stick range." + }, "pidTuningDtermSetpointTransition": { "message": "D Setpoint transition" }, @@ -1372,6 +1422,9 @@ "pidTuningDerivative": { "message": "Derivative" }, + "pidTuningFeedforward": { + "message": "Feedforward" + }, "pidTuningRcRate": { "message": "RC Rate" }, @@ -1564,6 +1617,9 @@ "auxiliaryHelp": { "message": "Use ranges to define the switches on your transmitter and corresponding mode assignments. A receiver channel that gives a reading between a range min/max will activate the mode. Remember to save your settings using the Save button." }, + "auxiliaryToggleUnused": { + "message": "Show/hide unused modes" + }, "auxiliaryMin": { "message": "Min" }, @@ -1699,15 +1755,30 @@ "adjustmentsFunction22": { "message": "D Setpoint" }, + "adjustmentsFunction22_2": { + "message": "Pitch & Roll F Adjustment" + }, "adjustmentsFunction23": { "message": "D Setpoint Transition" }, + "adjustmentsFunction23_2": { + "message": "Feedforward Transition" + }, "adjustmentsFunction24": { "message": "Horizon Strength Adjustment" }, "adjustmentsFunction25": { "message": "PID-Audio Selection" }, + "adjustmentsFunction26": { + "message": "Pitch F Adjustment" + }, + "adjustmentsFunction27": { + "message": "Roll F Adjustment" + }, + "adjustmentsFunction28": { + "message": "Yaw F Adjustment" + }, "adjustmentsSave": { "message": "Save" }, @@ -2273,7 +2344,7 @@ "message": "Baud Rate" }, "firmwareFlasherShowDevelopmentReleases":{ - "message": "Show unstable releases" + "message": "Show unstable and additional releases" }, "firmwareFlasherShowDevelopmentReleasesDescription":{ "message": "Show Release-Candidates and Development Releases." @@ -2813,6 +2884,67 @@ "pidTuningVbatPidCompensationHelp": { "message": "Increases the PID values to compensate when Vbat gets lower. This will give more constant flight characteristics throughout the flight. The amount of compensation that is applied is calculated from the $t(powerBatteryMaximum.message) set in the $t(tabPower.message) page, so make sure that is set to something appropriate." }, + "pidTuningItermRotation": { + "message": "I Term Rotation" + }, + "pidTuningItermRotationHelp": { + "message": "Rotates the current I Term vector properly to other axes as the quad rotates when yawing continuously during rolls and when performing funnels and other tricks. Very appreciated by LOS acro pilots." + }, + "pidTuningSmartFeedforward": { + "message": "Smart Feedforward" + }, + "pidTuningSmartFeedforwardHelp": { + "message": "Reduces the effect of the F Term in the PID. When both the P Term and the F Term are active at the same moment, it only uses the larger of the two, avoiding overshoots without the needing to raise D, but also reduces the responsiveness effect produced by the F term when added to P." + }, + "pidTuningItermRelax": { + "message": "I Term Relax" + }, + "pidTuningItermRelaxHelp": { + "message": "Limits the accumulation of I Term when fast movements happen. This helps specially to reduce the bounceback at the end of rolls and other fast movements. You can choose the axes in which this is active, and if the fast movement is detectd using the Gyro or the Setpoint (stick)." + }, + "pidTuningItermRelaxAxes": { + "message": "Axes:" + }, + "pidTuningItermRelaxAxesOptionRP": { + "message": "RP" + }, + "pidTuningItermRelaxAxesOptionRPY": { + "message": "RPY" + }, + "pidTuningItermRelaxAxesOptionRPInc": { + "message": "RP (increment only)" + }, + "pidTuningItermRelaxAxesOptionRPYInc": { + "message": "RPY (increment only)" + }, + "pidTuningItermRelaxType": { + "message": "Type:" + }, + "pidTuningItermRelaxTypeOptionGyro": { + "message": "Gyro" + }, + "pidTuningItermRelaxTypeOptionSetpoint": { + "message": "Setpoint" + }, + "pidTuningAbsoluteControlGain": { + "message": "Absolute Control" + }, + "pidTuningAbsoluteControlGainHelp": { + "message": "This feature solves some underlying problems of I Term Rotation and should hopefully replace it at some point. The feature accumulates the absolute gyro error in quad coordinates and mixes a proportional correction into the setpoint. It needs to have the iterm_relax enable for RPY." + }, + "pidTuningThrottleBoost": { + "message": "Throttle Boost" + }, + "pidTuningThrottleBoostHelp": { + "message": "This feature allows throttle to be temporarily boosted to the up to down-side to increase acceleration torque to the motors, providing a much faster throttle response." + }, + "pidTuningAcroTrainerAngleLimit": { + "message": "Acro Trainer Angle Limit" + }, + "pidTuningAcroTrainerAngleLimitHelp": { + "message": "Adds a new angle limiting mode for pilots who are learning to fly in acro mode. The range valid is 10-80 and must be activated with a switch in the $t(tabAuxiliary.message) tab." + }, + "configHelp2": { "message": "Arbitrary board rotation in degrees, to allow mounting it sideways / upside down / rotated etc. When running external sensors, use the sensor alignments (Gyro, Acc, Mag) to define sensor position independent from board orientation. " }, @@ -3182,6 +3314,12 @@ "osdSetupFontPresets": { "message": "Font presets:" }, + "osdSetupFontPresetsSelector": { + "message": "Select Font Presets:" + }, + "osdSetupFontPresetsSelectorOr": { + "message": "or" + }, "osdSetupOpenFont": { "message": "Open Font File" }, @@ -3630,6 +3768,9 @@ "pidTuningPidTuningTip": { "message": "Proportional: You will notice a very strong resistant force to any attempts to move the MultiRotor
Integral: Increase the ability to hold overall initial position and reduce drift, but also increase the delay in returning to initial position.
Derivative: Improves the speed at which deviations are recovered, but increases noise
Rates and Expo: Determine your stick feel based on these parameters. Use the graph and live 3D model to find your favourite rate setting" }, + "pidTuningPidTuningTipFeedforward": { + "message": "Proportional: You will notice a very strong resistant force to any attempts to move the MultiRotor
Integral: Increase the ability to hold overall initial position and reduce drift, but also increase the delay in returning to initial position.
Derivative: Improves the speed at which deviations are recovered, but increases noise
Feedforward: Usually the PID controller reacts to the error. The Feedforward anticipates the error based on the stick input, giving responsiveness to the quad.
Rates and Expo: Determine your stick feel based on these parameters. Use the graph and live 3D model to find your favourite rate setting" + }, "pidTuningRatesTip": { "message": "Play with the rates and see how those affect the stick curve" }, @@ -3663,6 +3804,18 @@ "onboardLoggingOnboardSDCard": { "message": "Onboard SD card" }, + "onboardLoggingMsc": { + "message": "Mass Storage Mode" + }, + "onboardLoggingMscNote": { + "message": "Reboot into mass storage device (MSC) mode. Once activated, the onboard flash or SD card on your flight controller will be recognised as a storage device by your computer, and allow you to download your log files. Eject and power cycle your flight controller to leave mass storage device mode." + }, + "onboardLoggingRebootMscText": { + "message": "Activate Mass Storage Device Mode" + }, + "onboardLoggingMscNotReady": { + "message": "Mass storage mode can not be activated because the storage device is not ready." + }, "dialogConfirmResetTitle": { "message": "Confirm" }, diff --git a/manifest.json b/manifest.json index ab6e4226..764620b1 100755 --- a/manifest.json +++ b/manifest.json @@ -23,6 +23,8 @@ "https://*.githubusercontent.com/", "http://*.baseflight.net/", "https://*.amazonaws.com/", + "https://*.betaflight.tech/", + "https://www.google-analytics.com/", "serial", "usb", "storage", @@ -50,7 +52,6 @@ } ] }, - "icons": { "128": "images/bf_icon_128.png" } diff --git a/package-lock.json b/package-lock.json index 73e36700..b2e864ad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "betaflight-configurator", - "version": "10.3.0", + "version": "10.4.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -5900,6 +5900,11 @@ } } }, + "object-hash": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.0.tgz", + "integrity": "sha512-05KzQ70lSeGSrZJQXE5wNDiTkBJDlUT/myi6RX9dVIvz7a7Qh4oH93BQdiPMn27nldYvVQCKMUaM83AfizZlsQ==" + }, "object-keys": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", @@ -7237,6 +7242,11 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, + "short-unique-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/short-unique-id/-/short-unique-id-1.1.1.tgz", + "integrity": "sha512-gyWJ4pknxpCx0WlUIdCIwHiQ/4sCy0i0YpDOniXP/TboMMRs6rkg6PPKR2nmNfZ9VYeAIm0x9qz/QmJysd9jNg==" + }, "shortid": { "version": "2.2.8", "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.8.tgz", @@ -8183,6 +8193,11 @@ "crypto-random-string": "^1.0.0" } }, + "universal-ga": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/universal-ga/-/universal-ga-1.2.0.tgz", + "integrity": "sha512-VSkK/aeymj0XQxNJL+Y/kenQKk2EsfWqi3Cf0EKmmGSuPjpA/R6ofJ6xWfstVqRJPj5RiAnyLpHlcshHRVVHJQ==" + }, "universalify": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", diff --git a/package.json b/package.json index 418328de..fc371c18 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,10 @@ "i18next": "^10.3.0", "i18next-xhr-backend": "^1.5.1", "lru_map": "^0.3.3", - "marked": "^0.3.12" + "marked": "^0.3.12", + "object-hash": "^1.3.0", + "short-unique-id": "^1.1.1", + "universal-ga": "^1.2.0" }, "devDependencies": { "chai": "^4.1.2", diff --git a/resources/osd/vision.mcm b/resources/osd/vision.mcm new file mode 100644 index 00000000..9f95ac51 --- /dev/null +++ b/resources/osd/vision.mcm @@ -0,0 +1,16385 @@ +MAX7456 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000101 +01010101 +01010100 +10100001 +01010101 +01010100 +10100001 +01010101 +01000000 +10100001 +01010101 +00101000 +10100001 +01010101 +00101000 +10100001 +01010000 +00101000 +10100001 +01001010 +00101000 +10100001 +01001010 +00101000 +10100001 +01001010 +00101000 +10100001 +01010000 +00000000 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000101 +01010101 +01010101 +00100001 +01010101 +01010100 +10100001 +01010101 +01010010 +10100001 +01010101 +01001010 +10100001 +01010101 +00101010 +10100001 +01010101 +00101010 +10100001 +01010101 +01001010 +10100001 +01010101 +01010010 +10100001 +01010101 +01010100 +10100001 +01010101 +01010101 +00100001 +01010101 +01010101 +01000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010001 +01010101 +01010101 +01001000 +01010101 +01010101 +01001010 +00010101 +01010101 +01001010 +10000101 +01010101 +01001010 +10100001 +01010101 +01001010 +10101000 +01010101 +01001010 +10101000 +01010101 +01001010 +10100001 +01010101 +01001010 +10000101 +01010101 +01001010 +00010101 +01010101 +01001000 +01010101 +01010101 +01010001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000000 +01010101 +01010101 +00101010 +01010101 +01010100 +10000001 +01010101 +01010110 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000001 +01010101 +01010101 +01101001 +01010101 +01010101 +01000001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +10010101 +01010101 +01000010 +00010101 +01010101 +10101000 +01010101 +01010101 +00000001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000001 +01010101 +01010101 +00101000 +01010101 +01010100 +10101010 +00010101 +01010010 +10101010 +10000101 +01010100 +00000000 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00010101 +00010101 +01010100 +10000100 +10000101 +01010100 +10000100 +10000101 +01010100 +10000000 +10000101 +01010100 +10000010 +00010101 +01010100 +10000010 +00010101 +01010100 +10001000 +01010101 +01010100 +10001000 +01010101 +01010101 +00100001 +01010101 +01010101 +01000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00010001 +01000101 +00010001 +10001001 +00100000 +10001000 +10101000 +10001000 +10001000 +10001000 +10001000 +10001000 +10001000 +10101000 +10101000 +10001000 +10001000 +10001000 +10001000 +10001000 +10001000 +10001000 +10001000 +10001000 +00010001 +00010001 +00010001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010000 +00000101 +01010101 +01001010 +10100001 +01010101 +01010000 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +00000101 +01010100 +10101010 +10100001 +01010101 +00000000 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010000 +00000101 +01010101 +01001010 +10100001 +01010101 +01010000 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01011010 +10100101 +01010101 +01010100 +01010101 +01010101 +01010010 +00010101 +01010101 +01010010 +10000101 +01010101 +01010010 +10100001 +01010101 +01010010 +10101000 +01010101 +01010010 +10101010 +00010101 +01010010 +10101000 +01010101 +01010010 +10100001 +01010101 +01010010 +10000101 +01010101 +01010010 +00010101 +01010101 +01010100 +01010101 +01010101 +01011010 +10100101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01011010 +10100101 +01010101 +01010101 +00010101 +01010101 +01010100 +10000101 +01010101 +01010010 +10000101 +01010101 +01001010 +10000101 +01010101 +00101010 +10000101 +01010100 +10101010 +10000101 +01010101 +00101010 +10000101 +01010101 +01001010 +10000101 +01010101 +01010010 +10000101 +01010101 +01010100 +10000101 +01010101 +01010101 +00010101 +01010101 +01011010 +10100101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000001 +01010101 +01010101 +00101000 +01010101 +01010101 +01000001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000001 +01010101 +01010101 +00101000 +01010101 +01010101 +01000001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000001 +01010101 +01010101 +00101000 +01010101 +01010101 +01000001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00010001 +01010101 +01010100 +10001000 +01010101 +01010100 +10101000 +01010101 +01010100 +10001000 +01010101 +01010100 +10001000 +01010101 +01010100 +10001000 +01010101 +01010100 +10001000 +01010101 +01010100 +10001000 +01010101 +01010101 +00010001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010000 +00010000 +00000101 +01001010 +10000010 +10100001 +01001000 +10000010 +00000101 +01001010 +10000010 +00000101 +01010000 +00010010 +10100001 +01010101 +01010010 +00000101 +01010101 +01010010 +00010101 +01010101 +01010010 +00010101 +01010101 +01010100 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010000 +00010000 +00000101 +01001010 +10000010 +10100001 +01001000 +10000010 +00000101 +01001010 +10000010 +00010101 +01010000 +00010010 +00010101 +01010101 +01010010 +00010101 +01010101 +01010010 +00010101 +01010101 +01010010 +10100001 +01010101 +01010100 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010000 +00010100 +00000101 +01001010 +10000010 +10100001 +01001000 +00010100 +10000101 +01001000 +00010100 +10000101 +01001010 +10000100 +10000101 +01001000 +00010100 +10000101 +01001000 +01010100 +10000101 +01001000 +01010100 +10000101 +01010001 +01010101 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +10101010 +00010101 +01010101 +00000000 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000001 +01010101 +01010101 +00101000 +01010101 +01010101 +00101000 +01010101 +01010101 +01000001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +01010101 +01010100 +10101010 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +01010101 +01010100 +10101010 +00010101 +01010100 +10101010 +00010101 +01010101 +00000000 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000001 +01010101 +01010101 +00101000 +01010101 +01010101 +00101000 +01010101 +01010101 +01000001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +01010101 +01010100 +10101010 +00010101 +01010100 +10101010 +00010101 +01010101 +00000000 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000001 +01010101 +01010101 +00101000 +01010101 +01010101 +00101000 +01010101 +01010101 +01000001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00101000 +01010101 +01010101 +01000001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +01010101 +01010100 +10101010 +00010101 +01010100 +10101010 +00010101 +01010101 +00000000 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000001 +01010101 +01010101 +00101000 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000001 +01010101 +01010101 +00101000 +01010101 +01010101 +00101000 +01010101 +01010101 +01000001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +01010101 +01010100 +10101010 +00010101 +01010100 +10101010 +00010101 +01010101 +00000000 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000001 +01010101 +01010101 +00101000 +01010101 +01010101 +00101000 +01010101 +01010101 +01000001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +01010101 +01010100 +10101010 +00010101 +01010100 +10101010 +00010101 +01010101 +00000000 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +10101000 +01010101 +01010101 +10000001 +01010101 +01010101 +10000100 +00000101 +00010001 +00010010 +10100000 +10001000 +01010010 +00000100 +10101000 +01010010 +00000100 +10101000 +01010010 +00100000 +10001000 +00010010 +10100000 +10001000 +10000100 +00000101 +00010001 +10000001 +01010101 +01010101 +10101000 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00101010 +01010101 +01010101 +01000010 +01000001 +01010001 +01010010 +00101000 +01001000 +01010100 +00100010 +00001000 +01010101 +00101000 +01001000 +01010101 +00100010 +00001000 +00010101 +00101000 +01001010 +10000100 +01000001 +01010000 +00010010 +01010101 +01010101 +01000010 +01010101 +01010101 +00101010 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000000 +00010101 +00000001 +00101010 +10000100 +10101000 +01001010 +00010101 +00100001 +01001010 +10000101 +00100001 +01001000 +10100001 +00100001 +01001000 +00101000 +00100001 +01001000 +01001010 +00100001 +01001000 +01010010 +10100001 +01001000 +01010100 +10100001 +01001000 +01010101 +00100001 +01001000 +01010101 +00100001 +00101010 +00010100 +10101000 +01000000 +01010101 +00000001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000000 +00010101 +01010010 +10101010 +10000101 +01001010 +00000010 +10100001 +01001000 +01010100 +00100001 +01001000 +01010101 +01000101 +01001010 +00000000 +00010101 +01010010 +10101010 +10000101 +01010100 +00000000 +10100001 +01000101 +01010101 +00100001 +00100000 +01010101 +00100001 +00101010 +00000000 +10100001 +01001010 +10101010 +10000101 +01010000 +00000000 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000000 +00010101 +01010010 +10101010 +10000101 +01001010 +00000000 +10100001 +01001000 +01010101 +00000101 +01001000 +01010001 +01010101 +01001000 +00001000 +01010101 +01001010 +10101000 +01010101 +01001000 +00001000 +01010101 +01001000 +01010001 +01000101 +01001000 +01010101 +00100001 +01001010 +00000000 +10100001 +01010010 +10101010 +10000101 +01010100 +00000000 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000000 +01010101 +00000001 +00101010 +00010100 +10101000 +01001000 +01010101 +00100001 +01001000 +01010101 +00100001 +01001000 +01010101 +00100001 +01001000 +01000001 +00100001 +01001000 +00101000 +00100001 +01001010 +00101000 +10100001 +01010010 +00101000 +10000101 +01010010 +10101010 +10000101 +01010100 +10000010 +00010101 +01010100 +10000010 +00010101 +01010101 +00010100 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000101 +01010101 +01010101 +00100001 +01010101 +01010101 +00100001 +01010101 +01010101 +00100001 +01010101 +01010101 +00100001 +01010101 +01010101 +00100001 +01010101 +01010101 +00100001 +01010101 +01010101 +01000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000101 +01010101 +01010101 +00100001 +01010101 +01010101 +00100001 +01010101 +01010101 +01000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010001 +01010101 +01010101 +01001000 +01010000 +00000000 +00001010 +01001010 +10101010 +10001010 +01001001 +10011001 +10001010 +01001010 +10101010 +10101010 +01001001 +10011001 +10001010 +01001010 +10101010 +10001010 +01010000 +00000000 +00010010 +01010101 +01010101 +01010100 +01010101 +01010101 +00000000 +01010101 +01010101 +10101010 +01010101 +01010101 +01010101 +01010101 +01010100 +00000000 +01010101 +01010110 +10101010 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000101 +01010101 +01010101 +10100000 +00000000 +00000101 +10100010 +10101010 +10100001 +10100010 +01100110 +01100001 +10101010 +10101010 +10100001 +10100010 +01100110 +01100001 +10100010 +10101010 +10100001 +10000100 +00000000 +00000101 +00010101 +01010101 +01010101 +00000000 +01010101 +01010101 +10101010 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +00010101 +01010101 +10101010 +10010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00010000 +00010000 +00010101 +10001010 +10001010 +10000101 +10001000 +10001000 +10000101 +10001000 +10001000 +10000101 +10001000 +10001000 +10000101 +10001010 +10001010 +10000101 +00010000 +00010000 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000001 +00000001 +00000001 +10101000 +10101000 +10101000 +10000000 +10001000 +10001000 +10101000 +10001000 +10001000 +00001000 +10001000 +10001000 +10101000 +10101000 +10101000 +00000001 +00000001 +00000001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +01010101 +00000001 +10101000 +00010000 +10101000 +00001000 +10001000 +10000001 +10101000 +10100000 +10101000 +10000000 +10100001 +00001000 +10101000 +10001000 +10101000 +00000001 +00010001 +00000001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00010001 +01000101 +00010001 +10001000 +00100000 +10001000 +10101000 +10001000 +10001000 +10001000 +10101000 +00100001 +10001000 +10001000 +10001000 +10001000 +10001000 +10001000 +00010001 +00010001 +00010001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010000 +01010101 +01000001 +01001010 +00010101 +00100001 +01001010 +00010100 +10000101 +01010000 +01010010 +00010101 +01010101 +01001000 +01010101 +01010101 +00100001 +01010101 +01010100 +10000101 +00000101 +01010010 +00010100 +10100001 +01001000 +01010100 +10100001 +01000001 +01010101 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01011010 +10101010 +10101010 +01010000 +00000000 +00000000 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +10101010 +10101010 +10100101 +00000000 +00000000 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00010101 +01010101 +01010010 +10000101 +01010101 +01001010 +00010101 +01010101 +00101000 +01010101 +01010100 +10100001 +01010101 +01010100 +10100001 +01010101 +01010100 +10100001 +01010101 +01010100 +10100001 +01010101 +01010100 +10100001 +01010101 +01010101 +00101000 +01010101 +01010101 +01001010 +00010101 +01010101 +01010010 +10000101 +01010101 +01010100 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00010101 +01010101 +01010010 +10000101 +01010101 +01010100 +10100001 +01010101 +01010101 +00101000 +01010101 +01010101 +01001010 +00010101 +01010101 +01001010 +00010101 +01010101 +01001010 +00010101 +01010101 +01001010 +00010101 +01010101 +01001010 +00010101 +01010101 +00101000 +01010101 +01010100 +10100001 +01010101 +01010010 +10000101 +01010101 +01010100 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010000 +01010101 +00000101 +01001010 +00010100 +10100001 +01010010 +10000010 +10000101 +01010000 +10101010 +00000101 +01001010 +10101010 +10100001 +01010000 +10101010 +00000101 +01010010 +10000010 +10000101 +01001010 +00010100 +10100001 +01010000 +01010101 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000001 +01010101 +01010101 +00101000 +01010101 +01010100 +00101000 +00010101 +01010010 +10101010 +10000101 +01010010 +10101010 +10000101 +01010100 +00101000 +00010101 +01010101 +00101000 +01010101 +01010101 +01000001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000001 +01010101 +01010101 +00101000 +01010101 +01010101 +00101000 +01010101 +01010100 +10100001 +01010101 +01010101 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000000 +00010101 +01010010 +10101010 +10000101 +01010010 +10101010 +10000101 +01010100 +00000000 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000001 +01010101 +01010101 +00101000 +01010101 +01010101 +00101000 +01010101 +01010101 +01000001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00010101 +01010101 +01010100 +10000101 +01010101 +01010100 +10000101 +01010101 +01010010 +10000101 +01010101 +01010010 +00010101 +01010101 +01001010 +00010101 +01010101 +01001000 +01010101 +01010101 +00101000 +01010101 +01010101 +00100001 +01010101 +01010100 +10100001 +01010101 +01010100 +10000101 +01010101 +01010100 +10000101 +01010101 +01010101 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +00010101 +01010100 +10101010 +10000101 +01010010 +10101010 +10100001 +01010010 +10000000 +10100001 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010010 +10000000 +10100001 +01010010 +10101010 +10100001 +01010100 +10101010 +10000101 +01010101 +00000000 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010000 +01010101 +01010101 +01001010 +00010101 +01010101 +00101010 +00010101 +01010100 +10101010 +00010101 +01010101 +00001010 +00010101 +01010101 +01001010 +00010101 +01010101 +01001010 +00010101 +01010101 +01001010 +00010101 +01010101 +00001010 +00000101 +01010100 +10101010 +10100001 +01010100 +10101010 +10100001 +01010101 +00000000 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +00010101 +01010100 +10101010 +10000101 +01010010 +10101010 +10100001 +01010010 +10000000 +10100001 +01010100 +00010100 +10100001 +01010101 +01010010 +10000101 +01010101 +01001010 +10000101 +01010101 +00101010 +00010101 +01010100 +10101000 +00000101 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010100 +00000000 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000000 +00010101 +01010010 +10101010 +10000101 +01010010 +10101010 +10100001 +01010100 +00000000 +10100001 +01010101 +01010000 +10100001 +01010101 +01001010 +10100001 +01010101 +01001010 +10100001 +01010101 +01010000 +10100001 +01010100 +00000000 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10000101 +01010100 +00000000 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00010101 +00000101 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010010 +10000000 +10100001 +01010010 +10101010 +10100001 +01010100 +10101010 +10100001 +01010101 +00000000 +10100001 +01010101 +01010100 +10100001 +01010101 +01010100 +10100001 +01010101 +01010100 +10100001 +01010101 +01010101 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000000 +00000101 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10000000 +00000101 +01010010 +10000000 +00010101 +01010010 +10101010 +10000101 +01010100 +10101010 +10100001 +01010101 +00000000 +10100001 +01010100 +00000000 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10000101 +01010100 +00000000 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +00000101 +01010100 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10000000 +00000101 +01010010 +10000000 +00010101 +01010010 +10101010 +10000101 +01010010 +10101010 +10100001 +01010010 +10000000 +10100001 +01010010 +10000000 +10100001 +01010010 +10101010 +10100001 +01010100 +10101010 +10000101 +01010101 +00000000 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000000 +00000101 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010100 +00000000 +10100001 +01010101 +01010100 +10100001 +01010101 +01010010 +10100001 +01010101 +01010010 +10000101 +01010101 +01001010 +10000101 +01010101 +01001010 +00010101 +01010101 +00101010 +00010101 +01010101 +00101000 +01010101 +01010101 +01000001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +00010101 +01010100 +10101010 +10000101 +01010010 +10101010 +10100001 +01010010 +10000000 +10100001 +01010010 +10000000 +10100001 +01010100 +10101010 +10000101 +01010010 +10101010 +10100001 +01010010 +10000000 +10100001 +01010010 +10000000 +10100001 +01010010 +10101010 +10100001 +01010100 +10101010 +10000101 +01010101 +00000000 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +00010101 +01010100 +10101010 +10000101 +01010010 +10101010 +10100001 +01010010 +10000000 +10100001 +01010010 +10000000 +10100001 +01010010 +10101010 +10100001 +01010100 +10101010 +10100001 +01010101 +00000000 +10100001 +01010100 +00000000 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10000101 +01010100 +00000000 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000001 +01010101 +01010101 +00101000 +01010101 +01010101 +00101000 +01010101 +01010101 +01000001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000001 +01010101 +01010101 +00101000 +01010101 +01010101 +00101000 +01010101 +01010101 +01000001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000001 +01010101 +01010101 +00101000 +01010101 +01010101 +00101000 +01010101 +01010101 +01000001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000001 +01010101 +01010101 +00101000 +01010101 +01010101 +00101000 +01010101 +01010100 +10100001 +01010101 +01010101 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00010101 +01010101 +01010010 +10000101 +01010101 +01001010 +00010101 +01010101 +00101000 +01010101 +01010100 +10100001 +01010101 +01010010 +10000101 +01010101 +01010100 +10100001 +01010101 +01010101 +00101000 +01010101 +01010101 +01001010 +00010101 +01010101 +01010010 +10000101 +01010101 +01010100 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000000 +00010101 +01010010 +10101010 +10000101 +01010010 +10101010 +10000101 +01010100 +00000000 +00010101 +01010101 +01010101 +01010101 +01010100 +00000000 +00010101 +01010010 +10101010 +10000101 +01010010 +10101010 +10000101 +01010100 +00000000 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00010101 +01010101 +01010010 +10000101 +01010101 +01010100 +10100001 +01010101 +01010101 +00101000 +01010101 +01010101 +01001010 +00010101 +01010101 +01010010 +10000101 +01010101 +01001010 +00010101 +01010101 +00101000 +01010101 +01010100 +10100001 +01010101 +01010010 +10000101 +01010101 +01010100 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +01010101 +01010100 +10101010 +00010101 +01010010 +00000000 +10000101 +01001000 +00000000 +00100001 +00100000 +10100010 +00001000 +00100010 +00001010 +00001000 +00100010 +00000010 +00001000 +00100010 +00001010 +00001000 +00100000 +10100010 +00100000 +00100000 +00000000 +10000001 +00001000 +00000100 +00000101 +01000010 +00000000 +00100001 +01010000 +10101010 +10000001 +01010100 +00000000 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000000 +01010101 +01010101 +00101010 +00010101 +01010100 +10101010 +10000101 +01010010 +10100010 +10100001 +01010010 +10000100 +10100001 +01010010 +10000000 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10000000 +10100001 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010100 +00010101 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000000 +01010101 +01010010 +10101010 +00010101 +01010010 +10101010 +10000101 +01010010 +10000010 +10100001 +01010010 +10000100 +10100001 +01010010 +10000010 +10000101 +01010010 +10000010 +10100001 +01010010 +10000100 +10100001 +01010010 +10000000 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10000101 +01010100 +00000000 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +00010101 +01010100 +10101010 +10000101 +01010010 +10101010 +10100001 +01010010 +10000000 +10100001 +01010010 +10000101 +00000101 +01010010 +10000101 +01010101 +01010010 +10000101 +01010101 +01010010 +10000101 +00000101 +01010010 +10000000 +10100001 +01010010 +10101010 +10100001 +01010100 +10101010 +10000101 +01010101 +00000000 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000000 +01010101 +01010010 +10101010 +00010101 +01010010 +10101010 +10000101 +01010010 +10000010 +10100001 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010010 +10000010 +10100001 +01010010 +10101010 +10000101 +01010010 +10101010 +00010101 +01010100 +00000000 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +00000101 +01010100 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10000000 +00000101 +01010010 +10000000 +01010101 +01010010 +10101010 +00010101 +01010010 +10101010 +00010101 +01010010 +10000000 +01010101 +01010010 +10000000 +00000101 +01010010 +10101010 +10100001 +01010100 +10101010 +10100001 +01010101 +00000000 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000000 +00000101 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10000000 +00000101 +01010010 +10000101 +01010101 +01010010 +10000000 +01010101 +01010010 +10101010 +00010101 +01010010 +10101010 +00010101 +01010010 +10000000 +01010101 +01010010 +10000101 +01010101 +01010010 +10000101 +01010101 +01010100 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +00000101 +01010100 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10000000 +00000101 +01010010 +10000100 +00000101 +01010010 +10000010 +10100001 +01010010 +10000010 +10100001 +01010010 +10000100 +10100001 +01010010 +10000000 +10100001 +01010010 +10101010 +10100001 +01010100 +10101010 +10000101 +01010101 +00000000 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00010101 +00000101 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010010 +10000000 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10000000 +10100001 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010100 +00010101 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000000 +00010101 +01010010 +10101010 +10000101 +01010010 +10101010 +10000101 +01010100 +00101000 +00010101 +01010101 +00101000 +01010101 +01010101 +00101000 +01010101 +01010101 +00101000 +01010101 +01010101 +00101000 +01010101 +01010100 +00101000 +00010101 +01010010 +10101010 +10000101 +01010010 +10101010 +10000101 +01010100 +00000000 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000101 +01010101 +01010100 +10100001 +01010101 +01010100 +10100001 +01010101 +01010100 +10100001 +01010101 +01010100 +10100001 +01010100 +00010100 +10100001 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010010 +10000000 +10100001 +01010010 +10101010 +10100001 +01010100 +10101010 +10000101 +01010101 +00000000 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00010101 +01010101 +01010010 +10000101 +01010101 +01010010 +10000101 +00000101 +01010010 +10000100 +10100001 +01010010 +10000010 +10100001 +01010010 +10001010 +10000101 +01010010 +10101010 +00010101 +01010010 +10101000 +01010101 +01010010 +10101010 +00010101 +01010010 +10001010 +10000101 +01010010 +10000010 +10100001 +01010010 +10000100 +10100001 +01010100 +00010101 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00010101 +01010101 +01010010 +10000101 +01010101 +01010010 +10000101 +01010101 +01010010 +10000101 +01010101 +01010010 +10000101 +01010101 +01010010 +10000101 +01010101 +01010010 +10000101 +01010101 +01010010 +10000101 +01010101 +01010010 +10000000 +00000001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010100 +00000000 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00010101 +00000101 +01010010 +10000100 +10100001 +01010010 +10100010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10001000 +10100001 +01010010 +10000000 +10100001 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010100 +00010101 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00010101 +00000101 +01010010 +10000100 +10100001 +01010010 +10100000 +10100001 +01010010 +10101000 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10001010 +10100001 +01010010 +10000010 +10100001 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010100 +00010101 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +00010101 +01010100 +10101010 +10000101 +01010010 +10101010 +10100001 +01010010 +10000000 +10100001 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010010 +10000000 +10100001 +01010010 +10101010 +10100001 +01010100 +10101010 +10000101 +01010101 +00000000 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000000 +00010101 +01010010 +10101010 +10000101 +01010010 +10101010 +10100001 +01010010 +10000000 +10100001 +01010010 +10000000 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10000101 +01010010 +10000000 +00010101 +01010010 +10000101 +01010101 +01010010 +10000101 +01010101 +01010010 +10000101 +01010101 +01010100 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +00010101 +01010100 +10101010 +10000101 +01010010 +10101010 +10100001 +01010010 +10000000 +10100001 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010010 +10000010 +10100001 +01010010 +10001010 +10000101 +01010010 +10101010 +10000101 +01010100 +10101010 +10100001 +01010101 +00000000 +10100001 +01010101 +01010101 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000000 +00010101 +01010010 +10101010 +10000101 +01010010 +10101010 +10100001 +01010010 +10000000 +10100001 +01010010 +10000100 +10100001 +01010010 +10000010 +10000101 +01010010 +10001010 +10000101 +01010010 +10000010 +10100001 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010100 +00010101 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +00010101 +01010100 +10101010 +10000101 +01010010 +10101010 +10000101 +01010010 +10000000 +00000101 +01010010 +10000000 +00010101 +01010100 +10101010 +10000101 +01010101 +00000010 +10100001 +01010101 +01010100 +10100001 +01010100 +00000000 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10000101 +01010100 +00000000 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010000 +00000000 +00000101 +01001010 +10101010 +10100001 +01001010 +10101010 +10100001 +01010000 +00101000 +00000101 +01010101 +00101000 +01010101 +01010101 +00101000 +01010101 +01010101 +00101000 +01010101 +01010101 +00101000 +01010101 +01010101 +00101000 +01010101 +01010101 +00101000 +01010101 +01010101 +00101000 +01010101 +01010101 +01000001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00010101 +00000101 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010010 +10000000 +10100001 +01010010 +10101010 +10100001 +01010100 +10101010 +10000101 +01010101 +00000000 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00010101 +00000101 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010100 +10100010 +10000101 +01010100 +10100010 +10000101 +01010101 +00101010 +00010101 +01010101 +00101010 +00010101 +01010101 +01001000 +01010101 +01010101 +01001000 +01010101 +01010101 +01010001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00010101 +00000101 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010010 +10000000 +10100001 +01010010 +10001000 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10100010 +10100001 +01010010 +10000100 +10100001 +01010010 +00010101 +00100001 +01010100 +01010101 +01000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00010101 +00000101 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010010 +10100010 +10100001 +01010100 +10101010 +10000101 +01010101 +00101010 +00010101 +01010100 +10101010 +10000101 +01010010 +10100010 +10100001 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010010 +10000100 +10100001 +01010100 +00010101 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010000 +01010101 +00000101 +01001010 +00010100 +10100001 +01001010 +00010100 +10100001 +01001010 +10000010 +10100001 +01010010 +10000010 +10000101 +01010010 +10101010 +10000101 +01010100 +10101010 +00010101 +01010101 +00101000 +01010101 +01010101 +00101000 +01010101 +01010101 +00101000 +01010101 +01010101 +00101000 +01010101 +01010101 +01000001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000000 +00000101 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010100 +00000000 +10100001 +01010101 +01010010 +10100001 +01010101 +01001010 +10000101 +01010101 +00101010 +00010101 +01010100 +10101000 +01010101 +01010010 +10100000 +00000101 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010100 +00000000 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +01010101 +01010100 +10101010 +00010101 +01010100 +10000000 +01010101 +01010100 +10000101 +01010101 +01010100 +10000101 +01010101 +01010100 +10000101 +01010101 +01010100 +10000101 +01010101 +01010100 +10000101 +01010101 +01010100 +10000101 +01010101 +01010100 +10000101 +01010101 +01010100 +10000000 +01010101 +01010100 +10101010 +00010101 +01010101 +00000000 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +01010101 +01010101 +01010010 +00010101 +01010101 +01010010 +00010101 +01010101 +01010010 +10000101 +01010101 +01010100 +10000101 +01010101 +01010100 +10100001 +01010101 +01010101 +00100001 +01010101 +01010101 +00101000 +01010101 +01010101 +01001000 +01010101 +01010101 +01001010 +00010101 +01010101 +01010010 +00010101 +01010101 +01010010 +00010101 +01010101 +01010100 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +01010101 +01010100 +10101010 +00010101 +01010101 +00000010 +00010101 +01010101 +01010010 +00010101 +01010101 +01010010 +00010101 +01010101 +01010010 +00010101 +01010101 +01010010 +00010101 +01010101 +01010010 +00010101 +01010101 +01010010 +00010101 +01010101 +01010010 +00010101 +01010101 +00000010 +00010101 +01010100 +10101010 +00010101 +01010101 +00000000 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000001 +01010101 +01010101 +00101000 +01010101 +01010100 +10101010 +00010101 +01010010 +10000010 +10000101 +01010010 +00010100 +10000101 +01010100 +01010101 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010000 +00000000 +00000101 +01001010 +10101010 +10100001 +01001010 +10101010 +10100001 +01010000 +00000000 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000101 +01010101 +01000101 +00100001 +01010101 +00100001 +00101000 +01010100 +10100001 +01001010 +00010010 +10000101 +01001010 +10001010 +10000101 +01010010 +10101010 +00010101 +01010010 +10101010 +00010101 +01010100 +10101000 +01010101 +01010100 +10101000 +01010101 +01010101 +00100001 +01010101 +01010101 +00100001 +01010101 +01010101 +01000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00010101 +01010101 +01010100 +10000101 +01000101 +01010100 +10000101 +00100000 +00010010 +10000101 +01001010 +10000010 +10000101 +01010010 +10101010 +10000101 +01010100 +10101010 +10000101 +01010101 +00101010 +10000101 +01010101 +01001010 +10000101 +01010101 +01010010 +10000101 +01010101 +01010100 +10000101 +01010101 +01010101 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010001 +01010101 +01010101 +01001000 +01010101 +01010101 +01001010 +00010101 +01010101 +01001010 +00010101 +01010101 +01001010 +00010101 +01000000 +00001010 +10000101 +00101010 +10101010 +10000101 +01001010 +10101010 +10000101 +01010000 +00101010 +10100001 +01010101 +01000000 +10100001 +01010101 +01010101 +00001000 +01010101 +01010101 +01010001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +01010101 +01010101 +01010010 +00010101 +01010101 +01010100 +10000101 +01010101 +01010100 +10100001 +01010101 +01010100 +10101000 +01010101 +01010101 +00101010 +00010101 +01010100 +00101010 +10000101 +01000010 +10101010 +10100001 +00101010 +10101010 +10101000 +01000000 +00000000 +00000001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000001 +01010101 +01010101 +00101000 +00010101 +01010101 +01001010 +10000001 +01010101 +01000010 +10101000 +00010101 +01010000 +10101010 +10000001 +01010100 +00101010 +10101000 +01010000 +10101010 +10000001 +01000010 +10101000 +00010101 +01001010 +10000001 +01010101 +00101000 +00010101 +01010101 +01000001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000000 +00000000 +00000001 +00101010 +10101010 +10101000 +01000010 +10101010 +10100001 +01010100 +00101010 +10000101 +01010101 +00101010 +00010101 +01010100 +10101000 +01010101 +01010100 +10100001 +01010101 +01010100 +10000101 +01010101 +01010010 +00010101 +01010101 +01010100 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010001 +01010101 +01010101 +00001000 +01010101 +01000000 +10100001 +01010000 +00101010 +10100001 +01001010 +10101010 +10000101 +00101010 +10101010 +10000101 +01000000 +00001010 +10000101 +01010101 +01001010 +00010101 +01010101 +01001010 +00010101 +01010101 +01001010 +00010101 +01010101 +01001000 +01010101 +01010101 +01010001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00010101 +01010101 +01010100 +10000101 +01010101 +01010010 +10000101 +01010101 +01001010 +10000101 +01010101 +00101010 +10000101 +01010100 +10101010 +10000101 +01010010 +10101010 +10000101 +01001010 +10000010 +10000101 +00100000 +00010010 +10000101 +01000101 +01010100 +10000101 +01010101 +01010100 +10000101 +01010101 +01010101 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000101 +01010101 +01010101 +00100001 +01010101 +01010101 +00100001 +01010101 +01010100 +10101000 +01010101 +01010100 +10101000 +01010101 +01010010 +10101010 +00010101 +01010010 +10101010 +00010101 +01001010 +10001010 +10000101 +01001010 +00010010 +10000101 +00101000 +01010100 +10100001 +00100001 +01010101 +00100001 +01000101 +01010101 +01000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +01010101 +01010101 +01010010 +00010101 +01010101 +01010010 +10000101 +01010101 +01010010 +10100001 +01010101 +01010010 +10101000 +01010101 +01010010 +10101010 +00010101 +01010010 +10101010 +10000101 +01010010 +10000010 +10100001 +01010010 +10000100 +00001000 +01010010 +00010101 +01010001 +01010010 +00010101 +01010101 +01010100 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000101 +01010101 +01010101 +00100000 +01010101 +01010101 +01001010 +00000001 +01010101 +01001010 +10101000 +00000101 +01010010 +10101010 +10100001 +01010010 +10101010 +10101000 +01010010 +10100000 +00000001 +01010100 +10100001 +01010101 +01010100 +10100001 +01010101 +01010100 +10100001 +01010101 +01010101 +00100001 +01010101 +01010101 +01000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000000 +00000000 +00000001 +00101010 +10101010 +10101000 +01001010 +10101010 +10000001 +01010010 +10101000 +00010101 +01010100 +10101000 +01010101 +01010101 +00101010 +00010101 +01010101 +01001010 +00010101 +01010101 +01010010 +00010101 +01010101 +01010100 +10000101 +01010101 +01010101 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000001 +01010101 +01010100 +00101000 +01010101 +01000010 +10100001 +01010100 +00101010 +10000101 +01000010 +10101010 +00010101 +00101010 +10101000 +01010101 +01000010 +10101010 +00010101 +01010100 +00101010 +10000101 +01010101 +01000010 +10100001 +01010101 +01010100 +00101000 +01010101 +01010101 +01000001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00010101 +01010101 +01010100 +10000101 +01010101 +01010010 +00010101 +01010101 +01001010 +00010101 +01010101 +00101010 +00010101 +01010100 +10101000 +01010101 +01010010 +10101000 +00010101 +01001010 +10101010 +10000001 +00101010 +10101010 +10101000 +01000000 +00000000 +00000001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000101 +01010101 +01010101 +00100001 +01010101 +01010100 +10100001 +01010101 +01010100 +10100001 +01010101 +01010100 +10100001 +01010101 +01010010 +10100000 +00000001 +01010010 +10101010 +10101000 +01010010 +10101010 +10100001 +01001010 +10101000 +00000101 +01001010 +00000001 +01010101 +00100000 +01010101 +01010101 +01000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +01010101 +01010101 +01010010 +00010101 +01010101 +01010010 +00010101 +01010001 +01010010 +10000100 +00001000 +01010010 +10000010 +10100001 +01010010 +10101010 +10000101 +01010010 +10101010 +00010101 +01010010 +10101000 +01010101 +01010010 +10100001 +01010101 +01010010 +10000101 +01010101 +01010010 +00010101 +01010101 +01010100 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010000 +00010000 +01010101 +01001010 +10001010 +00010101 +01001000 +10001000 +10000101 +01001000 +10001000 +10000101 +01001000 +10001000 +10000101 +01001010 +10001000 +10000101 +01010000 +00010000 +00010101 +01001000 +10001010 +00010101 +01001000 +10001000 +10000101 +01001010 +10001010 +00010101 +01001000 +10001000 +10000101 +01001000 +10001000 +10000101 +01010001 +00010001 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010000 +00010001 +01010101 +01001010 +10001000 +01010101 +01001000 +01001000 +01010101 +01001010 +00001000 +01010101 +01001000 +01001000 +00010101 +01001000 +01001010 +10000101 +01010000 +00010000 +00010101 +01001000 +10001010 +00010101 +01001000 +10001000 +10000101 +01001010 +10001010 +00010101 +01001000 +10001000 +10000101 +01001000 +10001000 +10000101 +01010001 +00010001 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000101 +01010101 +01010101 +00100001 +01010101 +01010100 +10101000 +01010101 +01010010 +10101010 +00010101 +01010100 +00000000 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000001 +01010101 +01010010 +10101000 +01010101 +01010100 +10101000 +01010101 +01010101 +00101000 +01010101 +01010101 +01001000 +01010101 +01010101 +01010001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00010101 +01010101 +01010100 +10000101 +01010101 +01010100 +10100001 +01010101 +01010100 +10101000 +01010101 +01010100 +10100001 +01010101 +01010100 +10000101 +01010101 +01010101 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010001 +01010101 +01010101 +01001000 +01010101 +01010101 +00101000 +01010101 +01010100 +10101000 +01010101 +01010010 +10101000 +01010101 +01010100 +00000001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000000 +01010101 +01010010 +10101010 +00010101 +01010100 +10101000 +01010101 +01010101 +00100001 +01010101 +01010101 +01000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00010101 +01010101 +01010100 +10000101 +01010101 +01010100 +10100001 +01010101 +01010100 +10101000 +01010101 +01010100 +10101010 +00010101 +01010101 +00000000 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010001 +01010101 +01010101 +01001000 +01010101 +01010101 +00101000 +01010101 +01010100 +10101000 +01010101 +01010101 +00101000 +01010101 +01010101 +01001000 +01010101 +01010101 +01010001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +01010101 +01010100 +10101010 +00010101 +01010100 +10101000 +01010101 +01010100 +10100001 +01010101 +01010100 +10000101 +01010101 +01010101 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00010101 +01010101 +01010010 +10000101 +01010101 +01001010 +00010101 +01010101 +00101000 +01010101 +01010100 +10100001 +01010101 +01010100 +10100001 +01010101 +01010100 +10100001 +01010101 +01010100 +10100001 +01010101 +01010100 +10100001 +01010101 +01010101 +00101000 +01010101 +01010101 +01001010 +00010101 +01010101 +01010010 +10000101 +01010101 +01010100 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000001 +01010101 +01010101 +00101000 +01010101 +01010101 +00101000 +01010101 +01010101 +00101000 +01010101 +01010101 +00101000 +01010101 +01010101 +00101000 +01010101 +01010101 +00101000 +01010101 +01010101 +00101000 +01010101 +01010101 +00101000 +01010101 +01010101 +00101000 +01010101 +01010101 +00101000 +01010101 +01010101 +00101000 +01010101 +01010101 +01000001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00010101 +01010101 +01010010 +10000101 +01010101 +01010100 +10100001 +01010101 +01010101 +00101000 +01010101 +01010101 +01001010 +00010101 +01010101 +01001010 +00010101 +01010101 +01001010 +00010101 +01010101 +01001010 +00010101 +01010101 +01001010 +00010101 +01010101 +00101000 +01010101 +01010100 +10100001 +01010101 +01010010 +10000101 +01010101 +01010100 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +10000101 +01010101 +01010010 +00100001 +01010101 +01001000 +01001000 +01010101 +00100001 +01010010 +00010100 +10000101 +01010100 +01010101 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +01010101 +00010101 +01010010 +00010100 +10000101 +01001000 +01010101 +00100001 +00100001 +01010101 +01001000 +10000101 +01010101 +01010010 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00010101 +01010101 +01010100 +10000101 +01010101 +01010100 +10000101 +01010101 +01010101 +00010101 +01010101 +01010100 +10000101 +01010101 +01010100 +10000101 +01010101 +01010101 +00010101 +01010101 +01010100 +10000101 +01010101 +01010100 +10000101 +01010101 +01010101 +00010101 +01010101 +01010100 +10000101 +01010101 +01010100 +10000101 +01010101 +01010101 +00010101 +01010101 +01010100 +10000101 +01010101 +01010100 +10000101 +01010101 +01010101 +00010101 +01010101 +01010100 +10000101 +01010101 +01010100 +10000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000000 +00010101 +01010010 +10101010 +10000101 +01010100 +00000000 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000000 +00010101 +01010010 +10101010 +10000101 +01010100 +00000000 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000000 +00010101 +01010010 +10101010 +10000101 +01010100 +00000000 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000000 +00010101 +01010010 +10101010 +10000101 +01010100 +00000000 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000000 +00010101 +01010010 +10101010 +10000101 +01010100 +00000000 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000000 +00010101 +01010010 +10101010 +10000101 +01010100 +00000000 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000000 +00010101 +01010010 +10101010 +10000101 +01010100 +00000000 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000000 +00010101 +01010010 +10101010 +10000101 +01010100 +00000000 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000000 +00010101 +01010010 +10101010 +10000101 +01010100 +00000000 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00101010 +01010101 +01010101 +01000010 +01010101 +01010101 +01010010 +01010100 +10000101 +01010100 +01010000 +10000001 +01010101 +01011010 +10101001 +01010101 +01010000 +10000001 +01010101 +01010100 +10000101 +01010100 +01010101 +01010101 +01010010 +01010101 +01010101 +01000010 +01010101 +01010101 +00101010 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010000 +01010101 +01010101 +01001010 +01010101 +01010101 +01001000 +01010101 +01010101 +01001000 +01010101 +01010101 +01001000 +01010101 +01010101 +01001000 +01010101 +01010101 +01001000 +01010101 +01010101 +01001000 +01010101 +01010101 +01001000 +01010101 +01010101 +01001000 +01010101 +01010101 +01001010 +01010101 +01010101 +01010000 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +00000000 +00000000 +10101010 +10101010 +10101010 +00000000 +00000000 +00000000 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +00000000 +00000000 +00000000 +10101010 +10101010 +10101010 +00000000 +00000000 +00000000 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +00000000 +00000000 +10101010 +10101010 +10101010 +00000000 +00000000 +00000000 +10101010 +10100001 +01010101 +10101010 +10100001 +01010101 +10101010 +10100001 +01010101 +10101010 +10100001 +01010101 +10101010 +10100001 +01010101 +10101010 +10100001 +01010101 +00000000 +00000000 +00000000 +10101010 +10101010 +10101010 +00000000 +00000000 +00000000 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +00000000 +00000000 +10101010 +10101010 +10101010 +00000000 +00000000 +00000000 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +00000000 +00000000 +10101010 +10101010 +10101010 +00000000 +00000000 +00000000 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +00000000 +00000000 +10101010 +10101010 +10101010 +00000000 +00000000 +00000000 +00010101 +01010101 +01010101 +00010101 +01010101 +01010101 +00010101 +01010101 +01010101 +00010101 +01010101 +01010101 +00010101 +01010101 +01010101 +00010101 +01010101 +01010101 +00000000 +00000000 +00000000 +10101010 +10101010 +10101010 +00000000 +00000000 +00000000 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000101 +01010101 +01010101 +10100001 +01010101 +01010101 +00100001 +01010101 +01010101 +00100001 +01010101 +01010101 +00100001 +01010101 +01010101 +00100001 +01010101 +01010101 +00100001 +01010101 +01010101 +00100001 +01010101 +01010101 +00100001 +01010101 +01010101 +00100001 +01010101 +01010101 +10100001 +01010101 +01010101 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000000 +00000101 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010100 +00000000 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000000 +00000101 +01010010 +10101010 +10100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010100 +00000000 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000000 +00000101 +01010010 +10101010 +10100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010100 +00000000 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000000 +00000101 +01010010 +10101010 +10100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010100 +00000000 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000000 +00000101 +01010010 +10101010 +10100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010100 +00000000 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000000 +00000101 +01010010 +10101010 +10100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010010 +10101010 +10100001 +01010100 +00000000 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000000 +00000101 +01010010 +10101010 +10100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +00000000 +00100001 +01010010 +10101010 +10100001 +01010100 +00000000 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000000 +00000101 +01010010 +10000000 +10100001 +01010010 +10101010 +10100001 +01010010 +00101010 +10100001 +01010010 +00000000 +00100001 +01010010 +00101010 +10100001 +01010010 +10101010 +10100001 +01010010 +00000000 +00100001 +01010010 +00100010 +10100001 +01010010 +00000000 +00100001 +01010010 +10101010 +10100001 +01010010 +10001000 +10100001 +01010010 +00100010 +00100001 +01010010 +00100010 +00100001 +01010010 +00000000 +00100001 +01010010 +10101010 +10100001 +01010100 +00000000 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +10101000 +01010101 +01010101 +10000001 +01010101 +01010101 +10000100 +00000101 +00010001 +00010010 +10100000 +10001000 +01010010 +00000000 +10001000 +01010010 +10100000 +10101000 +01010010 +00100001 +00100001 +00010010 +10100001 +00100001 +10000100 +01000101 +01000101 +10000001 +01010101 +01010101 +10101000 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010000 +00010000 +00010101 +01001010 +10001010 +10000101 +01001000 +00010010 +00010101 +01001010 +00010010 +00010101 +01001000 +01010010 +00010101 +01001000 +01010010 +00010101 +01010000 +00000000 +00010101 +01001010 +10101010 +10000101 +01010000 +00000000 +00010101 +01010100 +00101000 +01010101 +01010100 +10000001 +01010101 +01010100 +10101000 +01010101 +01010101 +00001000 +01010101 +01010100 +10101000 +01010101 +01010101 +00000001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000001 +01010101 +01010101 +00101000 +01010101 +01010100 +10000010 +00010101 +01010100 +10000010 +00010101 +01010100 +10101010 +00010101 +01010100 +10000010 +00010101 +01010100 +10000010 +00010101 +01010100 +10000010 +00010101 +01010101 +00010100 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010000 +00010000 +01010101 +01001010 +10001010 +00010101 +01001000 +10001000 +10000101 +01001000 +10001000 +10000101 +01001000 +10001000 +10000101 +01001010 +10001000 +10000101 +01010000 +00010000 +00010101 +01001000 +10001010 +00010101 +01001010 +10001000 +10000101 +01001000 +10001000 +10000101 +01001000 +10001000 +10000101 +01001000 +10001000 +10000101 +01010001 +00010001 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010000 +00010000 +01010101 +01001010 +10001000 +01010101 +01001000 +00001000 +01010101 +01001010 +10001000 +01010101 +01001000 +00001000 +00010101 +01001000 +01001010 +10000101 +01010000 +00010000 +00010101 +01001000 +10001010 +00010101 +01001010 +10001000 +10000101 +01001000 +10001000 +10000101 +01001000 +10001000 +10000101 +01001000 +10001000 +10000101 +01010001 +00010001 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +10101000 +01010101 +01010101 +10000000 +00000101 +01000000 +10000010 +10100001 +00101010 +00010010 +00001000 +01000010 +01010010 +00001000 +01010010 +01010010 +10100000 +01010010 +01010010 +00001000 +01010010 +00010010 +00001000 +01010010 +10000010 +00001000 +01010010 +10000000 +01010001 +01010100 +10101000 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00101010 +00000101 +00010100 +01000010 +10100000 +10000010 +00010010 +00000100 +10000010 +00010000 +00010100 +10000010 +00001000 +00010100 +10101010 +00010001 +00010100 +10000010 +00001000 +00010100 +10000010 +00010000 +00010100 +10000010 +00010010 +01010101 +00010100 +01000010 +01010101 +01010101 +00101010 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00010001 +01010101 +01010100 +10001000 +01010101 +01010100 +10101000 +01010101 +01010100 +10001000 +01010101 +01010100 +10001000 +01010101 +01010100 +10001000 +01010101 +01010000 +00000000 +00010101 +01001010 +10101010 +10000101 +01010000 +00000000 +00010101 +01010100 +00101000 +01010101 +01010100 +10000001 +01010101 +01010100 +10101000 +01010101 +01010101 +00001000 +01010101 +01010100 +10101000 +01010101 +01010101 +00000001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000001 +01010101 +01010101 +01010000 +00010101 +01010101 +01010000 +00000101 +01010101 +01010000 +00000000 +01010101 +01010100 +01010000 +00000101 +01010100 +00010101 +00000000 +01010101 +00010101 +01010000 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000101 +00000101 +01010100 +01000000 +00000101 +01010101 +01010000 +00000101 +01010101 +01010000 +00000001 +01010101 +01010100 +01010101 +01010101 +01010100 +00010101 +01010101 +01010101 +00010101 +01010101 +01010101 +00000101 +01010101 +01010101 +01000001 +01010101 +01010101 +01010001 +01010101 +01010101 +01010000 +01010101 +01010101 +01010100 +01010101 +01010101 +01010100 +00010101 +01010101 +01010101 +00000101 +01010101 +01010101 +01000101 +01010101 +01010101 +01010000 +01010101 +01010101 +01010100 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000001 +01010101 +01010101 +01000000 +00010101 +01010101 +01010100 +00000001 +01010101 +01010101 +01000000 +00010101 +01010101 +01010000 +00000101 +01010101 +01010101 +00000000 +01010101 +01010101 +01010000 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000101 +01010101 +01010101 +01010100 +00010101 +01010101 +01010101 +01000001 +01010101 +01010101 +01010100 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00010101 +01010101 +01010101 +00000001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000101 +01010101 +01010101 +00000000 +01010101 +01010101 +01010000 +00010101 +01010101 +01010100 +00000001 +01010101 +01010101 +01000000 +00010101 +01010101 +01010100 +00000001 +00010101 +01010101 +01000000 +00000000 +01010101 +01010100 +01010000 +00000101 +01010100 +01010101 +00000000 +01010100 +01010101 +01010000 +00001010 +01010101 +01010010 +00101010 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000101 +01010101 +01010101 +01010100 +01010101 +01010101 +01010101 +00000101 +01010101 +01010101 +01010000 +01010101 +01010101 +01010000 +01010101 +01010101 +00000000 +01010101 +01010100 +00000000 +00010101 +01010100 +00000000 +00000101 +01010100 +00000000 +10101010 +01010100 +00000000 +00101010 +00000000 +00000000 +10101010 +10000000 +00000000 +10100000 +00000000 +00000000 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000101 +01010101 +01010101 +00000001 +01010101 +01010101 +00000000 +00010101 +01010101 +00000000 +00000101 +01010101 +00000000 +00000001 +01010101 +00000001 +01000000 +01010101 +00000101 +01010100 +00010101 +00000101 +01010101 +00000101 +00000001 +01010101 +01000001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +10100101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +10010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +10010101 +01100101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01011001 +01010101 +01011010 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010110 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010001 +01010100 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00010101 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010000 +01010100 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +00000001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010001 +01010001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00010100 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00010101 +01000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010000 +00000000 +01010101 +01010101 +01000000 +00000000 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000000 +00000000 +10101010 +00000000 +00000110 +10101010 +01010101 +01010101 +10101010 +01010101 +01010101 +10101010 +01010101 +01010101 +10101010 +01010101 +01010101 +10101010 +01010101 +01010101 +10101010 +01010101 +01010101 +01101010 +01010101 +01010101 +01101010 +01010101 +01010101 +01000000 +01010101 +01010100 +00000000 +01010101 +01010000 +00000000 +01010101 +01000000 +00000000 +01010101 +01000000 +00000000 +01010101 +00100000 +00000000 +01010101 +10101010 +00100000 +01010101 +10101010 +10101010 +01010101 +10101010 +10101010 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +10100000 +00000000 +00000000 +10000000 +00000000 +00000000 +10000000 +00000000 +00000101 +10000000 +00000000 +00000101 +10000000 +00000000 +00010101 +10000000 +00000000 +00010101 +10100000 +00000001 +01010101 +10000000 +00000101 +01010101 +00000000 +01010101 +01010101 +00000000 +00010101 +01010101 +00000000 +00000101 +01010101 +00000000 +00000000 +01010101 +00000000 +00000000 +00000101 +00000000 +00000000 +00000001 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +10000000 +00000000 +00000000 +00000000 +00000000 +00000000 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +01010101 +01010001 +00000000 +00000101 +01010000 +00000000 +00000000 +00010000 +01010000 +00000000 +00000000 +01010101 +01010101 +01010000 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00010101 +01010101 +01010101 +00000001 +01010101 +01010101 +00000000 +00000101 +00000000 +00000000 +00000000 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00010101 +01010101 +01010101 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00010101 +01010101 +01010000 +01010101 +01010101 +00000001 +01010101 +01010101 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010110 +01010101 +01010101 +01010110 +01010101 +01010101 +01010110 +01010101 +01010101 +01011010 +01010101 +01010101 +01011010 +01010101 +01010101 +01011010 +01010101 +01010101 +01101010 +01010101 +01010101 +01101010 +01010101 +01010101 +01101010 +01010101 +01010101 +10101010 +01010101 +01010101 +10101010 +01010101 +01010101 +10101010 +01010101 +01010110 +10101010 +01010101 +01010110 +10101010 +01010101 +01010110 +10101010 +01010101 +01011010 +10101010 +01010101 +01011010 +10101010 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10010101 +01011010 +10101010 +10010101 +01010110 +10101010 +01010101 +01010110 +10101010 +01010101 +01011010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10100101 +01010101 +01101010 +10100101 +01010101 +01101010 +10010101 +01010101 +01101010 +10010101 +01010101 +10101010 +10010101 +01011010 +10101010 +10101010 +10101010 +10101010 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +10101010 +10010101 +01010110 +10101010 +10010101 +01010110 +10101010 +10100101 +01010110 +10101010 +10010101 +01011010 +10101010 +10010101 +01011010 +10101010 +10010101 +01011010 +10101010 +01010101 +01101010 +10101001 +01010101 +01101010 +10100101 +01010101 +01101010 +10100101 +01010101 +10101010 +10100101 +01010101 +10101010 +10101001 +01010101 +10101010 +10101001 +01010110 +10101010 +10101001 +01010110 +10101010 +10101001 +01011010 +10101010 +10101001 +01011010 +10101010 +10100101 +01011010 +10101010 +10100101 +01101010 +10101010 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +01010101 +01010101 +10101001 +01010101 +01010101 +10101001 +01010101 +01010101 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10010101 +01010101 +01010101 +10010101 +01010101 +01010101 +10010101 +01010101 +01010101 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +10101010 +10010101 +10101010 +10101010 +10010101 +10101010 +10101010 +10010110 +10101010 +10101010 +01010110 +10101010 +10101010 +01010110 +10101010 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +10100101 +01010101 +01010101 +10010101 +01010101 +01010110 +10010101 +01010101 +01010110 +01010101 +01010101 +01010110 +01010101 +01010101 +01011010 +01010101 +01010101 +01011010 +01010101 +01010101 +01101010 +01010101 +01010101 +01101010 +01010101 +01010101 +01101010 +01010101 +01010101 +10101010 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +01101010 +10101001 +01010101 +10101010 +10101001 +01010101 +10101010 +10100101 +01010101 +10101010 +10100101 +01010101 +10101010 +10100101 +01010101 +10101010 +10010101 +01010101 +10101010 +10010101 +01010101 +10101010 +10010101 +01010101 +10101010 +01010101 +01010101 +10101010 +01010101 +01010110 +10101001 +01010101 +01010110 +10101001 +01010101 +01011010 +10101001 +01010101 +01101010 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +10101001 +01010101 +01101010 +10101001 +01010101 +01101010 +10100101 +01010101 +10101010 +10100101 +01010110 +10101010 +10100101 +01011010 +10101010 +01010101 +01011010 +10101010 +01010101 +01101010 +10101010 +01010101 +10101010 +10101010 +01010101 +10101010 +10010110 +01010110 +10101010 +10010110 +01011010 +10101010 +01010110 +01011010 +10101001 +01010110 +01101010 +10101001 +01010110 +10101010 +10100101 +01010110 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +10101010 +10010101 +01010101 +10101010 +10010101 +01010101 +10101010 +10010101 +01010101 +10101010 +10010101 +01010101 +10101010 +10010101 +01010101 +10101010 +10010101 +01010101 +10101010 +10010101 +01010101 +10101010 +10010101 +01010101 +10101010 +10010101 +01010101 +10101010 +10010101 +01010100 +10101010 +10010101 +01010100 +10101010 +10010101 +01010100 +10101010 +10010101 +01010000 +10101010 +10010101 +01010000 +10101010 +10010101 +01010000 +10101010 +10010101 +01000000 +10101010 +10010101 +01000000 +10101010 +10010101 +01000000 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000000 +00000000 +01010000 +00000000 +00000000 +01010000 +00000000 +00000000 +01010000 +00000000 +00000000 +01000000 +00000000 +00000000 +01000000 +00000001 +01010101 +01000000 +00000001 +01010101 +00000000 +00000001 +01010101 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +00010101 +01010101 +00000000 +01010101 +01010101 +00000000 +01010101 +01010101 +00000001 +01010101 +01010101 +00000001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +00000001 +01010100 +00000000 +00000001 +01010000 +00000000 +00000001 +01010000 +00000000 +00000101 +01000000 +00000000 +00000101 +01000000 +01010101 +01010101 +01000000 +01010101 +01010101 +00000000 +01010101 +01010101 +00000000 +00000001 +01010101 +00000000 +00000001 +01010100 +00000000 +00000101 +01010100 +00000000 +00000101 +01010100 +00000000 +00000101 +01010000 +00000000 +01010101 +01010000 +00000000 +01010101 +01010000 +00000000 +01010101 +01000000 +00000000 +01010101 +01000000 +00000000 +01010101 +01000000 +00000000 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +00010101 +01010101 +00000000 +00010101 +01010101 +00000000 +01010101 +01010101 +00000000 +01010101 +01010101 +00000000 +01010101 +01010101 +00000001 +01010101 +01010101 +00000001 +01010101 +01010101 +00000101 +01010101 +01010101 +00000101 +01010101 +01010101 +00000101 +01010101 +01010101 +00010101 +01010101 +01010101 +00010101 +01010101 +01010101 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +00000000 +00010101 +00000000 +00000000 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010000 +00000000 +01010101 +01000000 +00000000 +01010101 +01000000 +00000001 +01010101 +01000000 +00000001 +01010101 +00000000 +00000001 +01010101 +00000000 +00000101 +01010100 +00000000 +00000101 +01010100 +00000000 +00000101 +01010100 +00000000 +00010101 +01010000 +00000000 +00010101 +01010000 +00000000 +01010101 +01010000 +00000000 +01010101 +01000000 +00000000 +01010100 +01000000 +00000001 +01010100 +01000000 +00000001 +01010100 +00000000 +00000001 +01010100 +00000000 +00000101 +01010100 +00000000 +00000101 +01010100 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000000 +01010101 +01010100 +00000000 +01010101 +01000000 +00000000 +01010101 +00000000 +00000000 +01010100 +00000000 +00000001 +01010100 +00000000 +00000101 +01010000 +00000000 +00010101 +01000000 +00000000 +01010101 +01000000 +00000000 +01010101 +01000000 +00000001 +01010101 +00000000 +00000001 +01010101 +00000000 +00000101 +01010101 +00000000 +00000101 +01010101 +00000000 +00000101 +01010101 +00000000 +00000101 +01010101 +00000000 +00000001 +01010101 +00000000 +00000000 +01010101 +00000000 +00000000 +00000000 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +00000000 +00010101 +00000000 +00000000 +00010101 +00000000 +00000000 +00000101 +00000000 +00000000 +00000101 +01010100 +00000000 +00000101 +01010101 +00000000 +00000101 +01010101 +00000000 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000000 +00000000 +00000101 +00000000 +00000000 +00010101 +00000000 +00000000 +00010101 +00000000 +00000000 +00010101 +01010000 +00000000 +01010101 +01000000 +00000000 +01010101 +00000000 +00000001 +01010100 +00000000 +00000001 +01010100 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01000000 +00000000 +01010101 +01000000 +00000001 +01010101 +00000000 +00000001 +01010101 +00000000 +00000101 +01010101 +00000000 +00000101 +01010100 +00000000 +00000101 +01010100 +00000000 +00010101 +01010100 +00000000 +00000000 +01010000 +00000000 +00000000 +01010000 +00000000 +00000000 +01010000 +00000000 +00000000 +01000000 +00000000 +00000000 +01000000 +00000000 +00000000 +01000000 +00000001 +01010101 +00000000 +00000001 +01010101 +00000000 +00000101 +01010101 +00000000 +00000101 +01010101 +00000000 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010100 +00000000 +01010101 +01010000 +00000000 +01010101 +01010000 +00000000 +01010101 +01010000 +00000000 +01010101 +01000000 +00000000 +01010101 +01000000 +00000001 +01010101 +01000000 +00000001 +00000000 +00000000 +00000101 +00000000 +00000000 +00000101 +00000000 +00000000 +00000101 +00000000 +00000000 +00010101 +00000000 +00000000 +00010101 +00000000 +00000000 +00010101 +01010000 +00000000 +01010101 +01010000 +00000000 +01010101 +01000000 +00000000 +01010101 +01000000 +00000001 +01010101 +01000000 +00000001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00010101 +00000000 +00000000 +00010100 +00000000 +00000000 +01010100 +00000000 +00000000 +01010100 +00000000 +00000000 +01010000 +00000000 +00000000 +01010101 +01010101 +00000000 +01010101 +01010101 +00000000 +01010101 +01010101 +00000000 +01010101 +01010100 +00000000 +01010101 +01010100 +00000000 +01010101 +01010000 +00000000 +01010101 +01010000 +00000000 +01010101 +01010000 +00000000 +01010101 +01000000 +00000000 +01010101 +01000000 +00000001 +01010101 +01000000 +00000001 +01010101 +00000000 +00000001 +01010101 +00000000 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +00000000 +00000001 +00000000 +00000000 +00000101 +00000000 +00000000 +00000101 +00000000 +00000000 +00000101 +00000000 +00000000 +00010101 +00000001 +01010101 +01010101 +00000101 +01010101 +01010101 +00000101 +01010101 +01010101 +00000101 +01010101 +01010101 +00010101 +01010101 +01010101 +00010101 +01010101 +01010101 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +10101010 +10101010 +01010101 +00100010 +10100000 +01010101 +01101000 +00000000 +01010101 +01000000 +00000010 +01010101 +01010000 +00101000 +01010101 +01010100 +00101010 +01010101 +01010101 +00101010 +01010101 +01010101 +01010110 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +00100000 +00000000 +00001000 +10100000 +00000000 +00100010 +10000000 +00000000 +10101010 +10100000 +00000000 +10101010 +00000000 +00000010 +10101010 +10000000 +00101010 +10101000 +10000000 +10001010 +10101000 +00000000 +00001001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +00000000 +01010100 +00000000 +00000000 +01010000 +00000000 +00000000 +00000101 +00000000 +00000000 +00010101 +00000000 +00000001 +01010101 +00000000 +00010101 +01010101 +10000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01011010 +10101010 +01010101 +01101010 +10101010 +01010101 +01101010 +10101010 +01010101 +01101010 +10101010 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10101010 +10100101 +10101010 +10101010 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +10010101 +01101010 +10101010 +01010101 +01101010 +10101010 +01010101 +10101010 +10101010 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +10101010 +10101010 +10101001 +10101010 +10101010 +10101001 +10101010 +10101010 +10101001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +10101010 +01010101 +01010101 +10101010 +01010101 +01010110 +10101010 +01010101 +01010110 +10010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +10100101 +01010101 +01101010 +10100101 +01010101 +10101010 +10100101 +01010110 +10101010 +10010101 +01010110 +01010110 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +10101001 +01010101 +01011010 +10100101 +01010101 +01011010 +10100101 +01010101 +01011010 +10010101 +01010101 +01011010 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +10101010 +10010101 +00000000 +10101010 +10010101 +00000000 +10101010 +10010101 +00000000 +01010110 +10010101 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000001 +01010101 +01010101 +00000101 +01010101 +01010101 +00000101 +01010101 +01010101 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +00000000 +01010101 +00000000 +00000000 +01010100 +00000000 +00000000 +01010100 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +00000000 +01010100 +00000000 +00000000 +01010100 +00000000 +00000000 +01010000 +01010101 +01010001 +01010000 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +00000101 +01010101 +00000000 +00010101 +01010101 +00000000 +00010101 +01010101 +01010100 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +00000000 +00000000 +00000000 +00000000 +00000000 +01010000 +00000000 +00000000 +01010100 +00000000 +00000101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +00000001 +01010100 +00000000 +00000101 +01010000 +01010000 +00000101 +01010000 +01010001 +00010101 +01010001 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +00010101 +01010101 +00000000 +00010101 +01010101 +00000000 +01010101 +01010100 +01010100 +01010101 +01010100 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +00000001 +01010101 +00000000 +00000101 +01010101 +00000000 +00000101 +01010101 +00010101 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +00000000 +00000101 +01010100 +00000000 +00000101 +01010100 +00000000 +00010101 +01010100 +01010100 +00010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 +01010101 \ No newline at end of file diff --git a/src/css/tabs/landing.css b/src/css/tabs/landing.css index 2fcef348..d7b1714e 100755 --- a/src/css/tabs/landing.css +++ b/src/css/tabs/landing.css @@ -255,3 +255,62 @@ #changelog .log p { margin-bottom: 20px; } + +/* privacy policy block */ +#privacy_policy { + width: 500px; + height: 100%; + position: fixed; + right: -495px; + top: 0px; +} + +#privacy_policy .wrapper { + height: 100%; + padding: 0 20px; + border-left: 5px solid #ffbb00; + overflow-y: auto; + display: none; +} + +#privacy_policy .button { + transform: rotate(270deg); + top: 170px; + right: 450px; + position: absolute; + background: #ffbb00; + border-radius: 5px 5px 0 0; + border-bottom: none; + height: 30px; +} + +#privacy_policy .button a { + display: block; + padding: 5px 10px; + width: 100px; + text-align: center; + color: #000; +} + +#content.policy_open #privacy_policy { + right: 0px; + background: white; +} + +#content.policy_open #privacy_policy .wrapper { + display: block; +} + +/* privacy policy content */ +#privacy_policy .policy ul { + margin: 5px 0 20px 10px; +} + +#privacy_policy .policy li { + font-weight: normal; + margin-bottom: 5px; +} + +#privacy_policy .policy p { + margin-bottom: 20px; +} diff --git a/src/css/tabs/onboard_logging.css b/src/css/tabs/onboard_logging.css index 87d48452..11e5b431 100644 --- a/src/css/tabs/onboard_logging.css +++ b/src/css/tabs/onboard_logging.css @@ -206,6 +206,22 @@ display: none; } +.require-msc-supported { + display: none; +} + +.tab-onboard_logging.msc-supported .require-msc-supported { + display: block; +} + +.require-msc-not-ready { + display: none; +} + +.tab-onboard_logging.msc-not-ready .require-msc-not-ready { + display: block; +} + @media only screen and (max-width: 1055px) , only screen and (max-device-width: 1055px) { .tab-onboard_logging table thead tr:first-child { font-size: 12px; @@ -300,4 +316,4 @@ pointer-events: none; text-shadow: none; opacity: 0.5; -} \ No newline at end of file +} diff --git a/src/css/tabs/osd.css b/src/css/tabs/osd.css index d45af866..6084a4f6 100644 --- a/src/css/tabs/osd.css +++ b/src/css/tabs/osd.css @@ -402,13 +402,17 @@ button { cursor: pointer; } -.fontbuttons { +.fontpresets_wrapper { display: inline-block; position: absolute; right: 1.2em; top: .8em; } +.fontpresets { + border: 1px solid #cccccc; +} + .tab-osd .switchable-field { padding: 3px; border: 1px solid transparent; diff --git a/src/css/tabs/pid_tuning.css b/src/css/tabs/pid_tuning.css index 34392add..e6352152 100644 --- a/src/css/tabs/pid_tuning.css +++ b/src/css/tabs/pid_tuning.css @@ -222,6 +222,7 @@ margin: 0px; border-collapse: collapse; width: 100%; + table-layout: fixed; } .tab-pid_tuning .gui_box { @@ -244,12 +245,10 @@ padding: 5px; text-align: left; border-right: 1px solid #ccc; - width: 12.5%; } .tab-pid_tuning .pid_titlebar th:first-child { text-align: left; - width: 12.5%; } .tab-pid_tuning .pid_titlebar th:last-child { @@ -281,6 +280,10 @@ width: 33%; } +.tab-pid_tuning table.compensation tr { + height: 25px; +} + .tab-pid_tuning table.compensation td { width: 60%; padding-left: 5px; @@ -289,12 +292,24 @@ .tab-pid_tuning table.compensation td:first-child { width: 10%; + text-align: right; } .tab-pid_tuning table.compensation td:last-child { width: 30%; } +.tab-pid_tuning table.compensation .suboption { + margin-left: 40px; +} + +.tab-pid_tuning table.compensation .suboption select{ + text-align-last: left; + font-size: 1.1em; + color: darkslategrey; + padding-left: 5px; +} + .tab-pid_tuning .pidTuningFeatures td { padding: 5px; } @@ -320,7 +335,6 @@ .tab-pid_tuning table td { padding: 1px; padding-left: 5px; - width: 12.5%; border-right: 1px solid #ccc; } diff --git a/src/js/Analytics.js b/src/js/Analytics.js new file mode 100644 index 00000000..474c4164 --- /dev/null +++ b/src/js/Analytics.js @@ -0,0 +1,156 @@ +'use strict'; + +var Analytics = function (trackingId, userId, appName, appVersion, buildType, optOut, debugMode) { + this._trackingId = trackingId; + + this.setOptOut(optOut); + + this._googleAnalytics = googleAnalytics; + + this._googleAnalytics.initialize(this._trackingId, { + storage: 'none', + clientId: userId, + debug: !!debugMode + }); + + // Make it work for the Chrome App: + this._googleAnalytics.set('forceSSL', true); + this._googleAnalytics.set('transport', 'xhr'); + + // Make it work for NW.js: + this._googleAnalytics.set('checkProtocolTask', null); + + this._googleAnalytics.set('appName', appName); + this._googleAnalytics.set('appVersion', debugMode ? appVersion + '-debug' : appVersion); + + this.EVENT_CATEGORIES = { + APPLICATION: 'Application', + FLIGHT_CONTROLLER: 'FlightController', + FIRMWARE: 'Firmware', + }; + + this.DATA = { + BOARD_TYPE: 'boardType', + API_VERSION: 'apiVersion', + FIRMWARE_TYPE: 'firmwareType', + FIRMWARE_VERSION: 'firmwareVersion', + FIRMWARE_NAME: 'firmwareName', + FIRMWARE_CHECKSUM: 'firmwareChecksum', + FIRMWARE_SOURCE: 'firmwareSource', + FIRMWARE_CHANNEL: 'firmwareChannel', + FIRMWARE_ERASE_ALL: 'firmwareEraseAll', + FIRMWARE_SIZE: 'firmwareSize', + MCU_ID: 'mcuId', + LOGGING_STATUS: 'loggingStatus', + LOG_SIZE: 'logSize', + }; + + this.DIMENSIONS = { + CONFIGURATOR_BUILD_TYPE: 1, + BOARD_TYPE: 2, + FIRMWARE_TYPE: 3, + FIRMWARE_VERSION: 4, + API_VERSION: 5, + FIRMWARE_NAME: 6, + FIRMWARE_SOURCE: 7, + FIRMWARE_ERASE_ALL: 8, + CONFIGURATOR_EXPERT_MODE: 9, + FIRMWARE_CHANNEL: 10, + LOGGING_STATUS: 11, + MCU_ID: 12, + }; + + this.METRICS = { + FIRMWARE_SIZE: 1, + LOG_SIZE: 2, + }; + + this.setDimension(this.DIMENSIONS.CONFIGURATOR_BUILD_TYPE, buildType); + + this.resetFlightControllerData(); + this.resetFirmwareData(); +}; + +Analytics.prototype.setDimension = function (dimension, value) { + var dimensionName = 'dimension' + dimension; + this._googleAnalytics.custom(dimensionName, value); +} + +Analytics.prototype.setMetric = function (metric, value) { + var metricName = 'metric' + metric; + this._googleAnalytics.custom(metricName, value); +} + +Analytics.prototype.sendEvent = function (category, action, options) { + this._googleAnalytics.event(category, action, options); +} + +Analytics.prototype.sendChangeEvents = function (category, changeList) { + for (var actionName in changeList) { + if (changeList.hasOwnProperty(actionName)) { + var actionValue = changeList[actionName]; + if (actionValue !== undefined) { + this.sendEvent(category, actionName, { eventLabel: actionValue }); + } + } + } +} + +Analytics.prototype.sendAppView = function (viewName) { + this._googleAnalytics.screenview(viewName); +} + +Analytics.prototype.sendTiming = function (category, timing, value) { + this._googleAnalytics.timing(category, timing, value); +} + +Analytics.prototype.sendException = function (message) { + this._googleAnalytics.exception(message); +} + +Analytics.prototype.setOptOut = function (optOut) { + window['ga-disable-' + this._trackingId] = !!optOut; +} + +Analytics.prototype._rebuildFlightControllerEvent = function () { + this.setDimension(this.DIMENSIONS.BOARD_TYPE, this._flightControllerData[this.DATA.BOARD_TYPE]); + this.setDimension(this.DIMENSIONS.FIRMWARE_TYPE, this._flightControllerData[this.DATA.FIRMWARE_TYPE]); + this.setDimension(this.DIMENSIONS.FIRMWARE_VERSION, this._flightControllerData[this.DATA.FIRMWARE_VERSION]); + this.setDimension(this.DIMENSIONS.API_VERSION, this._flightControllerData[this.DATA.API_VERSION]); + this.setDimension(this.DIMENSIONS.LOGGING_STATUS, this._flightControllerData[this.DATA.LOGGING_STATUS]); + this.setDimension(this.DIMENSIONS.MCU_ID, this._flightControllerData[this.DATA.MCU_ID]); + this.setMetric(this.METRICS.LOG_SIZE, this._flightControllerData[this.DATA.LOG_SIZE]); +} + +Analytics.prototype.setFlightControllerData = function (property, value) { + this._flightControllerData[property] = value; + + this._rebuildFlightControllerEvent(); +} + +Analytics.prototype.resetFlightControllerData = function () { + this._flightControllerData = {}; + + this._rebuildFlightControllerEvent(); +} + +Analytics.prototype._rebuildFirmwareEvent = function () { + this.setDimension(this.DIMENSIONS.FIRMWARE_NAME, this._firmwareData[this.DATA.FIRMWARE_NAME]); + this.setDimension(this.DIMENSIONS.FIRMWARE_SOURCE, this._firmwareData[this.DATA.FIRMWARE_SOURCE]); + this.setDimension(this.DIMENSIONS.FIRMWARE_ERASE_ALL, this._firmwareData[this.DATA.FIRMWARE_ERASE_ALL]); + this.setDimension(this.DIMENSIONS.FIRMWARE_CHANNEL, this._firmwareData[this.DATA.FIRMWARE_CHANNEL]); + this.setMetric(this.METRICS.FIRMWARE_SIZE, this._firmwareData[this.DATA.FIRMWARE_SIZE]); + this._googleAnalytics.set('eventLabel', this._firmwareData[this.DATA.FIRMWARE_CHECKSUM]); +} + +Analytics.prototype.setFirmwareData = function (property, value) { + this._firmwareData[property] = value; + + this._rebuildFirmwareEvent(); +} + +Analytics.prototype.resetFirmwareData = function () { + this._firmwareData = {}; + + this._rebuildFirmwareEvent(); +} diff --git a/src/js/Features.js b/src/js/Features.js index 0248018b..16e1b7c7 100644 --- a/src/js/Features.js +++ b/src/js/Features.js @@ -99,11 +99,16 @@ var Features = function (config) { self._features = features; self._featureMask = 0; + + self._analyticsChanges = {}; }; Features.prototype.getMask = function () { var self = this; + analytics.sendChangeEvents(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, self._analyticsChanges); + self._analyticsChanges = {}; + return self._featureMask; }; @@ -127,6 +132,8 @@ Features.prototype.isEnabled = function (featureName) { Features.prototype.generateElements = function (featuresElements) { var self = this; + self._featureChanges = {}; + var listElements = []; for (var i = 0; i < self._features.length; i++) { @@ -191,29 +198,48 @@ Features.prototype.generateElements = function (featuresElements) { } }; +Features.prototype.findFeatureByBit = function (bit) { + var self = this; + + for (var i = 0; i < self._features.length; i++) { + if (self._features[i].bit == bit) { + return self._features[i]; + } + } +} + Features.prototype.updateData = function (featureElement) { var self = this; if (featureElement.attr('type') === 'checkbox') { var bit = featureElement.data('bit'); + var featureValue; if (featureElement.is(':checked')) { self._featureMask = bit_set(self._featureMask, bit); + featureValue = 'On'; } else { self._featureMask = bit_clear(self._featureMask, bit); + featureValue = 'Off'; } + self._analyticsChanges['Feature' + self.findFeatureByBit(bit).name] = featureValue; } else if (featureElement.prop('localName') === 'select') { var controlElements = featureElement.children(); var selectedBit = featureElement.val(); if (selectedBit !== -1) { + var selectedFeature; for (var i = 0; i < controlElements.length; i++) { var bit = controlElements[i].value; if (selectedBit === bit) { self._featureMask = bit_set(self._featureMask, bit); + selectedFeature = self.findFeatureByBit(bit); } else { self._featureMask = bit_clear(self._featureMask, bit); } } + if (selectedFeature) { + self._analyticsChanges['FeatureGroup-' + selectedFeature.group] = selectedFeature.name; + } } } }; diff --git a/src/js/LogoManager.js b/src/js/LogoManager.js index d80ecb64..a7d9aa01 100644 --- a/src/js/LogoManager.js +++ b/src/js/LogoManager.js @@ -26,7 +26,7 @@ var LogoManager = LogoManager || { }, // config for logo image selection dialog acceptFileTypes: [ - { extensions: ['png', 'bmp'] }, + { description: 'images', extensions: ['png', 'bmp'] }, ], }; diff --git a/src/js/backup_restore.js b/src/js/backup_restore.js index bffcf65e..28489510 100644 --- a/src/js/backup_restore.js +++ b/src/js/backup_restore.js @@ -141,6 +141,11 @@ function configuration_backup(callback) { configuration.SERIAL_CONFIG = jQuery.extend(true, {}, SERIAL_CONFIG); configuration.LED_STRIP = jQuery.extend(true, [], LED_STRIP); configuration.LED_COLORS = jQuery.extend(true, [], LED_COLORS); + configuration.BOARD_ALIGNMENT_CONFIG = jQuery.extend(true, {}, BOARD_ALIGNMENT_CONFIG); + configuration.CRAFT_NAME = CONFIG.name; + configuration.MIXER_CONFIG = jQuery.extend(true, {}, MIXER_CONFIG); + configuration.SENSOR_CONFIG = jQuery.extend(true, {}, SENSOR_CONFIG); + configuration.PID_ADVANCED_CONFIG = jQuery.extend(true, {}, PID_ADVANCED_CONFIG); if (semver.gte(CONFIG.apiVersion, "1.19.0")) { configuration.LED_MODE_COLORS = jQuery.extend(true, [], LED_MODE_COLORS); @@ -165,13 +170,31 @@ function configuration_backup(callback) { configuration.GPS_CONFIG = jQuery.extend(true, {}, GPS_CONFIG); configuration.COMPASS_CONFIG = jQuery.extend(true, {}, COMPASS_CONFIG); } + if (semver.gte(CONFIG.apiVersion, "1.36.0")) { + configuration.BEEPER_CONFIG = jQuery.extend(true, {}, BEEPER_CONFIG); + } save(); } } - - // start fetching - fetch_unique_data_item(); + + if (GUI.configuration_loaded === true) { + return fetch_unique_data_item(); + } + + MSP.promise(MSPCodes.MSP_ADVANCED_CONFIG).then(function() { + return MSP.promise(MSPCodes.MSP_SENSOR_CONFIG); + }).then(function() { + return MSP.promise(MSPCodes.MSP_NAME); + }).then(function() { + return MSP.promise(MSPCodes.MSP_BOARD_ALIGNMENT_CONFIG); + }).then(function() { + return MSP.promise(MSPCodes.MSP_MIXER_CONFIG); + }).then(function() { + return MSP.promise(MSPCodes.MSP_BEEPER_CONFIG); + }).then(function() { + return fetch_unique_data_item(); + }); } function save() { @@ -183,7 +206,7 @@ function configuration_backup(callback) { var filename = generateFilename(prefix, suffix); var accepts = [{ - extensions: [suffix] + description: suffix.toUpperCase() + ' files', extensions: [suffix] }]; // create or load the file @@ -231,6 +254,7 @@ function configuration_backup(callback) { return; } + analytics.sendEvent(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'Backup'); console.log('Write SUCCESSFUL'); if (callback) callback(); }; @@ -254,7 +278,7 @@ function configuration_restore(callback) { var chosenFileEntry = null; var accepts = [{ - extensions: ['json'] + description: 'JSON files', extensions: ['json'] }]; // load up the file @@ -303,26 +327,23 @@ function configuration_restore(callback) { // validate - if (typeof configuration.generatedBy !== 'undefined' && compareVersions(configuration.generatedBy, CONFIGURATOR.backupFileMinVersionAccepted)) { - + if (typeof configuration.generatedBy !== 'undefined' && compareVersions(configuration.generatedBy, CONFIGURATOR.backupFileMinVersionAccepted)) { if (!compareVersions(configuration.generatedBy, "1.14.0") && !migrate(configuration)) { GUI.log(i18n.getMessage('backupFileUnmigratable')); return; } - if (configuration.FEATURE_CONFIG.features._featureMask) { var features = new Features(CONFIG); features.setMask(configuration.FEATURE_CONFIG.features._featureMask); configuration.FEATURE_CONFIG.features = features; } + analytics.sendEvent(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'Restore'); + configuration_upload(configuration, callback); - } else { GUI.log(i18n.getMessage('backupFileIncompatible')); } - - } }; @@ -763,6 +784,13 @@ function configuration_restore(callback) { ]; function update_unique_data_list() { + uniqueData.push(MSPCodes.MSP_SET_NAME); + uniqueData.push(MSPCodes.MSP_SET_SENSOR_CONFIG); + uniqueData.push(MSPCodes.MSP_SET_MIXER_CONFIG); + uniqueData.push(MSPCodes.MSP_SET_BEEPER_CONFIG); + uniqueData.push(MSPCodes.MSP_SET_BOARD_ALIGNMENT_CONFIG); + uniqueData.push(MSPCodes.MSP_SET_ADVANCED_CONFIG); + if (semver.gte(CONFIG.apiVersion, "1.8.0")) { uniqueData.push(MSPCodes.MSP_SET_LOOP_TIME); uniqueData.push(MSPCodes.MSP_SET_ARMING_CONFIG); @@ -803,6 +831,17 @@ function configuration_restore(callback) { GPS_CONFIG = configuration.GPS_CONFIG; COMPASS_CONFIG = configuration.COMPASS_CONFIG; RSSI_CONFIG = configuration.RSSI_CONFIG; + BOARD_ALIGNMENT_CONFIG = configuration.BOARD_ALIGNMENT_CONFIG; + CONFIG.name = configuration.CRAFT_NAME; + MIXER_CONFIG = configuration.MIXER_CONFIG; + SENSOR_CONFIG = configuration.SENSOR_CONFIG; + PID_ADVANCED_CONFIG = configuration.PID_ADVANCED_CONFIG; + + BEEPER_CONFIG.beepers = new Beepers(CONFIG); + BEEPER_CONFIG.beepers.setMask(configuration.BEEPER_CONFIG.beepers._beeperMask); + BEEPER_CONFIG.dshotBeaconTone = configuration.BEEPER_CONFIG.dshotBeaconTone; + BEEPER_CONFIG.dshotBeaconConditions = new Beepers(CONFIG, [ "RX_LOST", "RX_SET" ]); + BEEPER_CONFIG.dshotBeaconConditions.setMask(configuration.BEEPER_CONFIG.dshotBeaconConditions._beeperMask); } function send_unique_data_item() { diff --git a/src/js/fc.js b/src/js/fc.js index c74db6cb..4d62dd62 100644 --- a/src/js/fc.js +++ b/src/js/fc.js @@ -369,6 +369,18 @@ var FC = { levelSensitivity: 0, itermThrottleThreshold: 0, itermAcceleratorGain: 0, + itermRotation: 0, + smartFeedforward: 0, + itermRelax: 0, + itermRelaxType: 0, + absoluteControlGain: 0, + throttleBoost: 0, + acroTrainerAngleLimit: 0, + feedforwardRoll: 0, + feedforwardPitch: 0, + feedforwardYaw: 0, + feedforwardTransition: 0, + antiGravityMode: 0, }; SENSOR_CONFIG = { diff --git a/src/js/gui.js b/src/js/gui.js index b3261d54..c285a9dd 100644 --- a/src/js/gui.js +++ b/src/js/gui.js @@ -321,5 +321,17 @@ GUI_control.prototype.content_ready = function (callback) { if (callback) callback(); } +GUI_control.prototype.selectDefaultTabWhenConnected = function() { + chrome.storage.local.get(['rememberLastTab', 'lastTab'], function (result) { + if (!(result.rememberLastTab + && !!result.lastTab + && result.lastTab.substring(4) != "cli")) { + $('#tabs ul.mode-connected .tab_setup a').click(); + return; + } + $("#tabs ul.mode-connected ." + result.lastTab + " a").click(); + }); +}; + // initialize object into GUI variable var GUI = new GUI_control(); diff --git a/src/js/jenkins_loader.js b/src/js/jenkins_loader.js index 8cdf040f..209fb642 100644 --- a/src/js/jenkins_loader.js +++ b/src/js/jenkins_loader.js @@ -1,66 +1,124 @@ 'use strict;' -var JenkinsLoader = function (url, jobName) { - var self = this; - - self._url = url; - self._jobName = jobName; - self._jobUrl = self._url + '/job/' + self._jobName; - self._buildsRequest = '/api/json?tree=builds[number,result,timestamp,artifacts[relativePath],changeSet[items[commitId,msg]]]'; - self._builds = {}; +var JenkinsLoader = function (url) { + this._url = url; + this._jobs = []; + this._cacheExpirationPeriod = 3600 * 1000; - self._buildsDataTag = `${self._jobUrl}BuildsData`; - self._cacheLastUpdateTag = `${self._jobUrl}BuildsLastUpdate` + this._jobsRequest = '/api/json?tree=jobs[name]'; + this._buildsRequest = '/api/json?tree=builds[number,result,timestamp,artifacts[relativePath],changeSet[items[commitId,msg]]]'; } -JenkinsLoader.prototype.loadBuilds = function (callback) { +JenkinsLoader.prototype.loadJobs = function (viewName, callback) { var self = this; - chrome.storage.local.get([self._cacheLastUpdateTag, self._buildsDataTag], function (result) { - var buildsDataTimestamp = $.now(); - var cachedBuildsData = result[self._buildsDataTag]; - var cachedBuildsLastUpdate = result[self._cacheLastUpdateTag]; + var viewUrl = `${self._url}/view/${viewName}`; + var jobsDataTag = '${viewUrl}JobsData'; + var cacheLastUpdateTag = '${viewUrl}JobsLastUpdate'; - if (!cachedBuildsData || !cachedBuildsLastUpdate || buildsDataTimestamp - cachedBuildsLastUpdate > 3600 * 1000) { - var request = self._jobUrl + self._buildsRequest; + var wrappedCallback = jobs => { + self._jobs = jobs; + callback(jobs); + }; - $.get(request, function (buildsInfo) { - // filter successful builds - self._builds = buildsInfo.builds.filter(build => build.result == 'SUCCESS') - .map(build => ({ - number: build.number, - artifacts: build.artifacts.map(artifact => artifact.relativePath), - changes: build.changeSet.items.map(item => '* ' + item.msg).join('
\n'), - date: new Date(build.timestamp) - })); + chrome.storage.local.get([cacheLastUpdateTag, jobsDataTag], function (result) { + var jobsDataTimestamp = $.now(); + var cachedJobsData = result[jobsDataTag]; + var cachedJobsLastUpdate = result[cacheLastUpdateTag]; - self._parseBuilds(callback); - }).fail(function (data) { - GUI.log(i18n.getMessage('releaseCheckFailed', [self._jobName, 'failed to load builds'])); - - self._builds = cachedBuildsData; - self._parseBuilds(callback); - }); - } else { - if (cachedBuildsData) { - GUI.log(i18n.getMessage('releaseCheckCached', [self._jobName])); + var cachedCallback = () => { + if (cachedJobsData) { + GUI.log(i18n.getMessage('buildServerUsingCached', ['jobs'])); } - self._builds = cachedBuildsData; - self._parseBuilds(callback); + wrappedCallback(cachedJobsData ? cachedJobsData : []); + }; + + if (!cachedJobsData || !cachedJobsLastUpdate || jobsDataTimestamp - cachedJobsLastUpdate > self._cacheExpirationPeriod) { + var url = `${viewUrl}${self._jobsRequest}`; + + $.get(url, jobsInfo => { + GUI.log(i18n.getMessage('buildServerLoaded', ['jobs'])); + + // remove Betaflight prefix, rename Betaflight job to Development + var jobs = jobsInfo.jobs.map(job => { + return { title: job.name.replace('Betaflight ', '').replace('Betaflight', 'Development'), name: job.name }; + }) + + // cache loaded info + object = {} + object[jobsDataTag] = jobs; + object[cacheLastUpdateTag] = $.now(); + chrome.storage.local.set(object); + + wrappedCallback(jobs); + }).error(xhr => { + GUI.log(i18n.getMessage('buildServerLoadFailed', ['jobs', `HTTP ${xhr.status}`])); + }).fail(cachedCallback); + } else { + cachedCallback(); } }); } -JenkinsLoader.prototype._parseBuilds = function (callback) { +JenkinsLoader.prototype.loadBuilds = function (jobName, callback) { var self = this; + var jobUrl = `${self._url}/job/${jobName}`; + var buildsDataTag = `${jobUrl}BuildsData`; + var cacheLastUpdateTag = `${jobUrl}BuildsLastUpdate` + + chrome.storage.local.get([cacheLastUpdateTag, buildsDataTag], function (result) { + var buildsDataTimestamp = $.now(); + var cachedBuildsData = result[buildsDataTag]; + var cachedBuildsLastUpdate = result[cacheLastUpdateTag]; + + var cachedCallback = () => { + if (cachedBuildsData) { + GUI.log(i18n.getMessage('buildServerUsingCached', [jobName])); + } + + self._parseBuilds(jobUrl, jobName, cachedBuildsData ? cachedBuildsData : [], callback); + }; + + if (!cachedBuildsData || !cachedBuildsLastUpdate || buildsDataTimestamp - cachedBuildsLastUpdate > self._cacheExpirationPeriod) { + var url = `${jobUrl}${self._buildsRequest}`; + + $.get(url, function (buildsInfo) { + GUI.log(i18n.getMessage('buildServerLoaded', [jobName])); + + // filter successful builds + var builds = buildsInfo.builds.filter(build => build.result == 'SUCCESS') + .map(build => ({ + number: build.number, + artifacts: build.artifacts.map(artifact => artifact.relativePath), + changes: build.changeSet.items.map(item => '* ' + item.msg).join('
\n'), + timestamp: build.timestamp + })); + + // cache loaded info + object = {} + object[buildsDataTag] = builds; + object[cacheLastUpdateTag] = $.now(); + chrome.storage.local.set(object); + + self._parseBuilds(jobUrl, jobName, builds, callback); + }).error(xhr => { + GUI.log(i18n.getMessage('buildServerLoadFailed', [jobName, `HTTP ${xhr.status}`])); + }).fail(cachedCallback); + } else { + cachedCallback(); + } + }); +} + +JenkinsLoader.prototype._parseBuilds = function (jobUrl, jobName, builds, callback) { // convert from `build -> targets` to `target -> builds` mapping var targetBuilds = {}; var targetFromFilenameExpression = /betaflight_([\d.]+)?_?(\w+)(\-.*)?\.(.*)/; - self._builds.forEach(build => { + builds.forEach(build => { build.artifacts.forEach(relativePath => { var match = targetFromFilenameExpression.exec(relativePath); @@ -70,15 +128,16 @@ JenkinsLoader.prototype._parseBuilds = function (callback) { var version = match[1]; var target = match[2]; + var date = new Date(build.timestamp); - var formattedDate = ("0" + build.date.getDate()).slice(-2) + "-" + ("0" + (build.date.getMonth()+1)).slice(-2) + "-" + - build.date.getFullYear() + " " + ("0" + build.date.getHours()).slice(-2) + ":" + ("0" + build.date.getMinutes()).slice(-2); + var formattedDate = ("0" + date.getDate()).slice(-2) + "-" + ("0" + (date.getMonth()+1)).slice(-2) + "-" + + date.getFullYear() + " " + ("0" + date.getHours()).slice(-2) + ":" + ("0" + date.getMinutes()).slice(-2); var descriptor = { - 'releaseUrl': self._jobUrl + '/' + build.number, - 'name' : self._jobName + ' #' + build.number, + 'releaseUrl': jobUrl + '/' + build.number, + 'name' : jobName + ' #' + build.number, 'version' : version + ' #' + build.number, - 'url' : self._jobUrl + '/' + build.number + '/artifact/' + relativePath, + 'url' : jobUrl + '/' + build.number + '/artifact/' + relativePath, 'file' : relativePath.split('/').slice(-1)[0], 'target' : target, 'date' : formattedDate, diff --git a/src/js/main.js b/src/js/main.js index 326921c2..9895232c 100644 --- a/src/js/main.js +++ b/src/js/main.js @@ -1,9 +1,10 @@ 'use strict'; +var googleAnalytics = analytics; +var analytics = undefined; + openNewWindowsInExternalBrowser(); -//Asynchronous configuration to be done. -//When finish the startProcess() function must be called $(document).ready(function () { i18n.init(function() { startProcess(); @@ -11,9 +12,67 @@ $(document).ready(function () { }); }); +function checkSetupAnalytics(callback) { + if (!analytics) { + setTimeout(function () { + chrome.storage.local.get(['userId', 'analyticsOptOut'], function (result) { + if (!analytics) { + setupAnalytics(result); + } + + callback(analytics); + }); + }); + } else if (callback) { + callback(analytics); + } +}; + +function setupAnalytics(result) { + var userId; + if (result.userId) { + userId = result.userId; + } else { + var uid = new ShortUniqueId(); + userId = uid.randomUUID(13); + + chrome.storage.local.set({ 'userId': userId }); + } + + var optOut = !!result.analyticsOptOut; + + var debugMode = process.versions['nw-flavor'] === 'sdk'; + + analytics = new Analytics('UA-123002063-1', userId, 'Betaflight Configurator', getManifestVersion(), GUI.operating_system, optOut, debugMode); + + function logException(exception) { + analytics.sendException(exception.stack); + } + + process.on('uncaughtException', logException); + + analytics.sendEvent(analytics.EVENT_CATEGORIES.APPLICATION, 'AppStart', { sessionControl: 'start' }); + + function sendCloseEvent() { + analytics.sendEvent(analytics.EVENT_CATEGORIES.APPLICATION, 'AppClose', { sessionControl: 'end' }) + } + + try { + var gui = require('nw.gui'); + var win = gui.Window.get(); + win.on('close', function () { + sendCloseEvent(); + + this.close(true); + }); + } catch (ex) { + // Looks like we're in Chrome - but the event does not actually get fired + chrome.runtime.onSuspend.addListener(sendCloseEvent); + } +} + //Process to execute to real start the app function startProcess() { - // translate to user-selected language i18n.localizePage(); @@ -86,6 +145,13 @@ function startProcess() { return; } + $("#tabs ul.mode-connected li").click(function() { + // store the first class of the current tab (omit things like ".active") + chrome.storage.local.set({ + lastTab: $(this).attr("class").split(' ')[0] + }); + }); + GUI.tab_switch_in_progress = true; GUI.tab_switch_cleanup(function () { @@ -106,6 +172,10 @@ function startProcess() { GUI.tab_switch_in_progress = false; } + checkSetupAnalytics(function (analytics) { + analytics.sendAppView(tab); + }); + switch (tab) { case 'landing': TABS.landing.initialize(content_ready); @@ -210,13 +280,16 @@ function startProcess() { chrome.storage.local.set({'permanentExpertMode': checked}); $('input[name="expertModeCheckbox"]').prop('checked', checked).change(); - if (FEATURE_CONFIG) { - updateTabList(FEATURE_CONFIG.features); - } - }).change(); }); + chrome.storage.local.get('rememberLastTab', function (result) { + $('div.rememberLastTab input') + .prop('checked', !!result.rememberLastTab) + .change(function() { chrome.storage.local.set({rememberLastTab: $(this).is(':checked')}) }) + .change(); + }); + if (GUI.operating_system !== 'ChromeOS') { chrome.storage.local.get('checkForConfiguratorUnstableVersions', function (result) { if (result.checkForConfiguratorUnstableVersions) { @@ -235,6 +308,30 @@ function startProcess() { $('div.checkForConfiguratorUnstableVersions').hide(); } + chrome.storage.local.get('analyticsOptOut', function (result) { + if (result.analyticsOptOut) { + $('div.analyticsOptOut input').prop('checked', true); + } + + $('div.analyticsOptOut input').change(function () { + var checked = $(this).is(':checked'); + + chrome.storage.local.set({'analyticsOptOut': checked}); + + checkSetupAnalytics(function (analytics) { + if (checked) { + analytics.sendEvent(analytics.EVENT_CATEGORIES.APPLICATION, 'OptOut'); + } + + analytics.setOptOut(checked); + + if (!checked) { + analytics.sendEvent(analytics.EVENT_CATEGORIES.APPLICATION, 'OptIn'); + } + }); + }).change(); + }); + chrome.storage.local.get('userLanguageSelect', function (result) { var userLanguage_e = $('div.userLanguage select'); @@ -385,6 +482,11 @@ function startProcess() { } $('input[name="expertModeCheckbox"]').change(function () { + var checked = $(this).is(':checked'); + checkSetupAnalytics(function (analytics) { + analytics.setDimension(analytics.DIMENSIONS.CONFIGURATOR_EXPERT_MODE, checked ? 'On' : 'Off'); + }); + if (FEATURE_CONFIG) { updateTabList(FEATURE_CONFIG.features); } @@ -642,4 +744,16 @@ function openNewWindowsInExternalBrowser() { } catch (ex) { console.log("require does not exist, maybe inside chrome"); } -} \ No newline at end of file +} + +function showErrorDialog(message) { + var dialog = $('.dialogError')[0]; + + $('.dialogError-content').html(message); + + $('.dialogError-closebtn').click(function() { + dialog.close(); + }); + + dialog.showModal(); +} diff --git a/src/js/msp/MSPHelper.js b/src/js/msp/MSPHelper.js index 31f24533..6f96b368 100644 --- a/src/js/msp/MSPHelper.js +++ b/src/js/msp/MSPHelper.js @@ -27,6 +27,12 @@ function MspHelper () { 'RUNCAM_DEVICE_CONTROL': 14, // support communitate with RunCam Device 'LIDAR_TF': 15 }; + + self.REBOOT_TYPES = { + FIRMWARE: 0, + BOOTLOADER: 1, + MSC: 2 + }; } MspHelper.prototype.reorderPwmProtocols = function (protocol) { @@ -617,6 +623,17 @@ MspHelper.prototype.process_data = function(dataHandler) { break; case MSPCodes.MSP_SET_REBOOT: + if (semver.gte(CONFIG.apiVersion, "1.40.0")) { + var rebootType = data.read8(); + if (rebootType === self.REBOOT_TYPES.MSC) { + if (data.read8() === 0) { + console.log('Storage device not ready.'); + + showErrorDialog(i18n.getMessage('storageDeviceNotReady')); + break; + } + } + } console.log('Reboot request accepted'); break; @@ -871,7 +888,11 @@ MspHelper.prototype.process_data = function(dataHandler) { ADVANCED_TUNING.deltaMethod = data.readU8(); ADVANCED_TUNING.vbatPidCompensation = data.readU8(); if (semver.gte(CONFIG.apiVersion, "1.20.0")) { - ADVANCED_TUNING.dtermSetpointTransition = data.readU8(); + if (semver.gte(CONFIG.apiVersion, "1.40.0")) { + ADVANCED_TUNING.feedforwardTransition = data.readU8(); + } else { + ADVANCED_TUNING.dtermSetpointTransition = data.readU8(); + } ADVANCED_TUNING.dtermSetpointWeight = data.readU8(); ADVANCED_TUNING.toleranceBand = data.readU8(); ADVANCED_TUNING.toleranceBandReduction = data.readU8(); @@ -881,13 +902,29 @@ MspHelper.prototype.process_data = function(dataHandler) { if (semver.gte(CONFIG.apiVersion, "1.24.0")) { ADVANCED_TUNING.levelAngleLimit = data.readU8(); ADVANCED_TUNING.levelSensitivity = data.readU8(); - } - if (semver.gte(CONFIG.apiVersion, "1.36.0")) { - ADVANCED_TUNING.itermThrottleThreshold = data.readU16(); - ADVANCED_TUNING.itermAcceleratorGain = data.readU16(); - } - if (semver.gte(CONFIG.apiVersion, "1.39.0")) { - ADVANCED_TUNING.dtermSetpointWeight = data.readU16(); + + if (semver.gte(CONFIG.apiVersion, "1.36.0")) { + ADVANCED_TUNING.itermThrottleThreshold = data.readU16(); + ADVANCED_TUNING.itermAcceleratorGain = data.readU16(); + + if (semver.gte(CONFIG.apiVersion, "1.39.0")) { + ADVANCED_TUNING.dtermSetpointWeight = data.readU16(); + + if (semver.gte(CONFIG.apiVersion, "1.40.0")) { + ADVANCED_TUNING.itermRotation = data.readU8(); + ADVANCED_TUNING.smartFeedforward = data.readU8(); + ADVANCED_TUNING.itermRelax = data.readU8(); + ADVANCED_TUNING.itermRelaxType = data.readU8(); + ADVANCED_TUNING.absoluteControlGain = data.readU8(); + ADVANCED_TUNING.throttleBoost = data.readU8(); + ADVANCED_TUNING.acroTrainerAngleLimit = data.readU8(); + ADVANCED_TUNING.feedforwardRoll = data.readU16(); + ADVANCED_TUNING.feedforwardPitch = data.readU16(); + ADVANCED_TUNING.feedforwardYaw = data.readU16(); + ADVANCED_TUNING.antiGravityMode = data.readU8(); + } + } + } } } break; @@ -1119,7 +1156,9 @@ MspHelper.prototype.process_data = function(dataHandler) { case MSPCodes.MSP_SET_ADJUSTMENT_RANGE: console.log('Adjustment range saved'); break; - + case MSPCodes.MSP_SET_BOARD_ALIGNMENT_CONFIG: + console.log('Board alignment saved'); + break; case MSPCodes.MSP_PID_CONTROLLER: PID.controller = data.readU8(); break; @@ -1195,6 +1234,11 @@ MspHelper.prototype.process_data = function(dataHandler) { console.log('Unknown code detected: ' + code); } else { console.log('FC reports unsupported message error: ' + code); + + switch (code) { + case MSPCodes.MSP_SET_REBOOT: + showErrorDialog(i18n.getMessage('operationNotSupported')); + } } } // trigger callbacks, cleanup/remove callback after trigger @@ -1217,7 +1261,6 @@ MspHelper.prototype.process_data = function(dataHandler) { } } - /** * Encode the request body for the MSP request with the given code and return it as an array of bytes. */ @@ -1526,24 +1569,47 @@ MspHelper.prototype.crunch = function(code) { .push16(ADVANCED_TUNING.yawItermIgnoreRate) .push16(ADVANCED_TUNING.yaw_p_limit) .push8(ADVANCED_TUNING.deltaMethod) - .push8(ADVANCED_TUNING.vbatPidCompensation) - .push8(ADVANCED_TUNING.dtermSetpointTransition) - .push8(Math.min(ADVANCED_TUNING.dtermSetpointWeight, 254)) - .push8(ADVANCED_TUNING.toleranceBand) - .push8(ADVANCED_TUNING.toleranceBandReduction) - .push8(ADVANCED_TUNING.itermThrottleGain) - .push16(ADVANCED_TUNING.pidMaxVelocity) - .push16(ADVANCED_TUNING.pidMaxVelocityYaw); + .push8(ADVANCED_TUNING.vbatPidCompensation); + + if (semver.gte(CONFIG.apiVersion, "1.40.0")) { + buffer.push8(ADVANCED_TUNING.feedforwardTransition); + } else { + buffer.push8(ADVANCED_TUNING.dtermSetpointTransition); + } + + buffer.push8(Math.min(ADVANCED_TUNING.dtermSetpointWeight, 254)) + .push8(ADVANCED_TUNING.toleranceBand) + .push8(ADVANCED_TUNING.toleranceBandReduction) + .push8(ADVANCED_TUNING.itermThrottleGain) + .push16(ADVANCED_TUNING.pidMaxVelocity) + .push16(ADVANCED_TUNING.pidMaxVelocityYaw); + if (semver.gte(CONFIG.apiVersion, "1.24.0")) { buffer.push8(ADVANCED_TUNING.levelAngleLimit) .push8(ADVANCED_TUNING.levelSensitivity); - } - if (semver.gte(CONFIG.apiVersion, "1.36.0")) { - buffer.push16(ADVANCED_TUNING.itermThrottleThreshold) - .push16(ADVANCED_TUNING.itermAcceleratorGain); - } - if (semver.gte(CONFIG.apiVersion, "1.39.0")) { - buffer.push16(ADVANCED_TUNING.dtermSetpointWeight); + + if (semver.gte(CONFIG.apiVersion, "1.36.0")) { + buffer.push16(ADVANCED_TUNING.itermThrottleThreshold) + .push16(ADVANCED_TUNING.itermAcceleratorGain); + + if (semver.gte(CONFIG.apiVersion, "1.39.0")) { + buffer.push16(ADVANCED_TUNING.dtermSetpointWeight); + + if (semver.gte(CONFIG.apiVersion, "1.40.0")) { + buffer.push8(ADVANCED_TUNING.itermRotation) + .push8(ADVANCED_TUNING.smartFeedforward) + .push8(ADVANCED_TUNING.itermRelax) + .push8(ADVANCED_TUNING.itermRelaxType) + .push8(ADVANCED_TUNING.absoluteControlGain) + .push8(ADVANCED_TUNING.throttleBoost) + .push8(ADVANCED_TUNING.acroTrainerAngleLimit) + .push16(ADVANCED_TUNING.feedforwardRoll) + .push16(ADVANCED_TUNING.feedforwardPitch) + .push16(ADVANCED_TUNING.feedforwardYaw) + .push8(ADVANCED_TUNING.antiGravityMode); + } + } + } } } // only supports 1 version pre bf 3.0 @@ -1894,7 +1960,6 @@ MspHelper.prototype.sendCurrentConfig = function(onCompleteCallback) { } - MspHelper.prototype.sendLedStripConfig = function(onCompleteCallback) { var nextFunction = send_next_led_strip_config; diff --git a/src/js/serial_backend.js b/src/js/serial_backend.js index e811c7ee..512c1b2c 100755 --- a/src/js/serial_backend.js +++ b/src/js/serial_backend.js @@ -1,6 +1,8 @@ 'use strict'; var mspHelper; +var connectionTimestamp; + function initializeSerialBackend() { GUI.updateManualPortVisibility = function(){ @@ -43,6 +45,8 @@ function initializeSerialBackend() { thisElement.data("clicks", !clicks); }; + GUI.configuration_loaded = false; + var selected_baud = parseInt($('div#port-picker #baud').val()); var selected_port = $('div#port-picker #port option:selected').data().isManual ? $('#port-override').val() : @@ -122,6 +126,15 @@ function initializeSerialBackend() { function finishClose(finishedCallback) { var wasConnected = CONFIGURATOR.connectionValid; + analytics.sendEvent(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'Disconnected'); + if (connectionTimestamp) { + var connectedTime = Date.now() - connectionTimestamp; + analytics.sendTiming(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'Connected', connectedTime); + + connectedTime = undefined; + } + analytics.resetFlightControllerData(); + serial.disconnect(onClosed); MSP.disconnect_cleanup(); @@ -198,13 +211,17 @@ function onOpen(openInfo) { // request configuration data MSP.send_message(MSPCodes.MSP_API_VERSION, false, false, function () { + analytics.setFlightControllerData(analytics.DATA.API_VERSION, CONFIG.apiVersion); + GUI.log(i18n.getMessage('apiVersionReceived', [CONFIG.apiVersion])); if (semver.gte(CONFIG.apiVersion, CONFIGURATOR.apiVersionAccepted)) { MSP.send_message(MSPCodes.MSP_FC_VARIANT, false, false, function () { + analytics.setFlightControllerData(analytics.DATA.FIRMWARE_TYPE, CONFIG.flightControllerIdentifier); if (CONFIG.flightControllerIdentifier === 'BTFL') { MSP.send_message(MSPCodes.MSP_FC_VERSION, false, false, function () { + analytics.setFlightControllerData(analytics.DATA.FIRMWARE_VERSION, CONFIG.flightControllerVersion); GUI.log(i18n.getMessage('fcInfoReceived', [CONFIG.flightControllerIdentifier, CONFIG.flightControllerVersion])); updateStatusBarVersion(CONFIG.flightControllerVersion, CONFIG.flightControllerIdentifier); @@ -215,13 +232,19 @@ function onOpen(openInfo) { GUI.log(i18n.getMessage('buildInfoReceived', [CONFIG.buildInfo])); MSP.send_message(MSPCodes.MSP_BOARD_INFO, false, false, function () { + analytics.setFlightControllerData(analytics.DATA.BOARD_TYPE, CONFIG.boardIdentifier); GUI.log(i18n.getMessage('boardInfoReceived', [CONFIG.boardIdentifier, CONFIG.boardVersion])); updateStatusBarVersion(CONFIG.flightControllerVersion, CONFIG.flightControllerIdentifier, CONFIG.boardIdentifier); updateTopBarVersion(CONFIG.flightControllerVersion, CONFIG.flightControllerIdentifier, CONFIG.boardIdentifier); MSP.send_message(MSPCodes.MSP_UID, false, false, function () { - GUI.log(i18n.getMessage('uniqueDeviceIdReceived', [CONFIG.uid[0].toString(16) + CONFIG.uid[1].toString(16) + CONFIG.uid[2].toString(16)])); + var uniqueDeviceIdentifier = CONFIG.uid[0].toString(16) + CONFIG.uid[1].toString(16) + CONFIG.uid[2].toString(16); + + analytics.setFlightControllerData(analytics.DATA.MCU_ID, objectHash.sha1(uniqueDeviceIdentifier)); + analytics.sendEvent(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'Connected'); + connectionTimestamp = Date.now(); + GUI.log(i18n.getMessage('uniqueDeviceIdReceived', [uniqueDeviceIdentifier])); if (semver.gte(CONFIG.apiVersion, "1.20.0")) { MSP.send_message(MSPCodes.MSP_NAME, false, false, function () { @@ -238,6 +261,8 @@ function onOpen(openInfo) { }); }); } else { + analytics.sendEvent(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'ConnectionRefused'); + var dialog = $('.dialogConnectWarning')[0]; $('.dialogConnectWarning-content').html(i18n.getMessage('firmwareTypeNotSupported')); @@ -252,6 +277,8 @@ function onOpen(openInfo) { } }); } else { + analytics.sendEvent(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'ConnectionRefused'); + var dialog = $('.dialogConnectWarning')[0]; $('.dialogConnectWarning-content').html(i18n.getMessage('firmwareVersionNotSupported', [CONFIGURATOR.apiVersionAccepted])); @@ -266,6 +293,8 @@ function onOpen(openInfo) { } }); } else { + analytics.sendEvent(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'SerialPortFailed'); + console.log('Failed to open serial port'); GUI.log(i18n.getMessage('serialPortOpenFail')); @@ -297,7 +326,7 @@ function finishOpen() { onConnect(); - $('#tabs ul.mode-connected .tab_setup a').click(); + GUI.selectDefaultTabWhenConnected(); } function connectCli() { diff --git a/src/js/tabs/adjustments.js b/src/js/tabs/adjustments.js index e5f723d8..38be7ab5 100644 --- a/src/js/tabs/adjustments.js +++ b/src/js/tabs/adjustments.js @@ -20,7 +20,6 @@ TABS.adjustments.initialize = function (callback) { } function load_html() { - self.adjust_template(); $('#content').load("./tabs/adjustments.html", process_html); } @@ -153,6 +152,8 @@ TABS.adjustments.initialize = function (callback) { function process_html() { + self.adjust_template(); + var auxChannelCount = RC.active_channels - 4; var modeTableBodyElement = $('.tab-adjustments .adjustments tbody'); @@ -272,14 +273,36 @@ TABS.adjustments.cleanup = function (callback) { }; TABS.adjustments.adjust_template = function () { - var availableFunctionCount; - if (semver.lt(CONFIG.apiVersion, "1.31.0")) { - availableFunctionCount = 21; // Available in betaflight 2.9 + + var selectFunction = $('#functionSelectionSelect'); + var elementsNumber; + + if (semver.gte(CONFIG.apiVersion, "1.40.0")) { + elementsNumber = 29; // PID Audio + } else if (semver.gte(CONFIG.apiVersion, "1.39.0")) { + elementsNumber = 26; // PID Audio + } else if (semver.gte(CONFIG.apiVersion, "1.37.0")) { + elementsNumber = 25; // Horizon Strength } else { - availableFunctionCount = 24; // RC rate Yaw / D setpoint / D setpoint transition added to 3.1.0 + elementsNumber = 24; // Setpoint transition + } + + for (let i = 0; i < elementsNumber; i++) { + selectFunction.append(new Option(i18n.getMessage('adjustmentsFunction' + i), i)); + } + + // For 1.40, the D Setpoint has been replaced, so we replace it with the correct values + if (semver.gte(CONFIG.apiVersion, "1.40.0")) { + + var element22 = selectFunction.find("option[value='22']"); + var element23 = selectFunction.find("option[value='23']"); + + // Change the "text" + element22.text(i18n.getMessage('adjustmentsFunction22_2')); + element23.text(i18n.getMessage('adjustmentsFunction23_2')); + + // Reorder, we insert it with the other FF elements to be coherent... + element22.insertAfter(selectFunction.find("option[value='25']")); + element23.insertAfter(selectFunction.find("option[value='28']")); } - var template = $('#tab-adjustments-templates .adjustments .adjustment'); - var functionList = $(template).find('.functionSelection .function'); - var functionListOptions = $(functionList).find('option').slice(0,availableFunctionCount); - functionList.empty().append(functionListOptions); }; diff --git a/src/js/tabs/auxiliary.js b/src/js/tabs/auxiliary.js index ce987c5d..c5dbeed5 100644 --- a/src/js/tabs/auxiliary.js +++ b/src/js/tabs/auxiliary.js @@ -244,8 +244,9 @@ TABS.auxiliary.initialize = function (callback) { } function update_ui() { - for (var i = 0; i < AUX_CONFIG.length; i++) { - var modeElement = $('#mode-' + i); + let hasUsedMode = false; + for (let i = 0; i < AUX_CONFIG.length; i++) { + let modeElement = $('#mode-' + i); if (modeElement.find(' .range').length == 0) { // if the mode is unused, skip it modeElement.removeClass('off').removeClass('on'); @@ -257,8 +258,17 @@ TABS.auxiliary.initialize = function (callback) { } else { $('.mode .name').eq(i).data('modeElement').removeClass('on').addClass('off'); } + hasUsedMode = true; } + let hideUnused = hideUnusedModes && hasUsedMode; + for (let i = 0; i < AUX_CONFIG.length; i++) { + let modeElement = $('#mode-' + i); + if (modeElement.find(' .range').length == 0) { + modeElement.toggle(!hideUnused); + } + } + auto_select_channel(RC.channels); var auxChannelCount = RC.active_channels - 4; @@ -306,6 +316,18 @@ TABS.auxiliary.initialize = function (callback) { return fillPrevChannelsValues(); } + let hideUnusedModes = false; + chrome.storage.local.get('hideUnusedModes', function (result) { + $("input#switch-toggle-unused") + .change(function() { + hideUnusedModes = $(this).prop("checked"); + chrome.storage.local.set({ hideUnusedModes: hideUnusedModes }); + update_ui(); + }) + .prop("checked", !!result.hideUnusedModes) + .change(); + }); + // update ui instantly on first load update_ui(); diff --git a/src/js/tabs/cli.js b/src/js/tabs/cli.js index 608f12e9..4fbb55a9 100644 --- a/src/js/tabs/cli.js +++ b/src/js/tabs/cli.js @@ -60,14 +60,13 @@ TABS.cli.initialize = function (callback) { var textarea = $('.tab-cli textarea'); $('.tab-cli .save').click(function() { - var prefix = 'cli'; var suffix = 'txt'; var filename = generateFilename(prefix, suffix); var accepts = [{ - extensions: [suffix], + description: suffix.toUpperCase() + ' files', extensions: [suffix], }]; chrome.fileSystem.chooseEntry({type: 'saveFile', suggestedName: filename, accepts: accepts}, function(entry) { @@ -87,9 +86,11 @@ TABS.cli.initialize = function (callback) { }; writer.onwriteend = function () { - if (writer.length === 0) { + if (self.outputHistory.length > 0 && writer.length === 0) { writer.write(new Blob([self.outputHistory], {type: 'text/plain'})); } else { + analytics.sendEvent(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'CliSave', self.outputHistory.length); + console.log('write complete'); } }; diff --git a/src/js/tabs/configuration.js b/src/js/tabs/configuration.js index 6ca6cc23..17d7efd0 100644 --- a/src/js/tabs/configuration.js +++ b/src/js/tabs/configuration.js @@ -2,7 +2,8 @@ TABS.configuration = { DSHOT_PROTOCOL_MIN_VALUE: 5, - SHOW_OLD_BATTERY_CONFIG: false + SHOW_OLD_BATTERY_CONFIG: false, + analyticsChanges: {}, }; TABS.configuration.initialize = function (callback, scrollPosition) { @@ -10,6 +11,7 @@ TABS.configuration.initialize = function (callback, scrollPosition) { if (GUI.active_tab != 'configuration') { GUI.active_tab = 'configuration'; + GUI.configuration_loaded = true; } if (semver.lt(CONFIG.apiVersion, "1.36.0")) { @@ -194,6 +196,10 @@ TABS.configuration.initialize = function (callback, scrollPosition) { load_config(); function process_html() { + var self = this; + + self.analyticsChanges = {}; + var mixer_list_e = $('select.mixerList'); for (var selectIndex = 0; selectIndex < mixerList.length; selectIndex++) { mixerList.forEach(function (mixerEntry, mixerIndex) { @@ -224,7 +230,15 @@ TABS.configuration.initialize = function (callback, scrollPosition) { reverseMotorSwitch_e.prop('checked', MIXER_CONFIG.reverseMotorDir != 0).change(); mixer_list_e.change(function () { - MIXER_CONFIG.mixer = parseInt($(this).val()); + var mixerValue = parseInt($(this).val()); + + var newValue; + if (mixerValue !== MIXER_CONFIG.mixer) { + newValue = $(this).find('option:selected').text(); + } + self.analyticsChanges['Mixer'] = newValue; + + MIXER_CONFIG.mixer = mixerValue; refreshMixerPreview(); }); @@ -355,11 +369,31 @@ TABS.configuration.initialize = function (callback, scrollPosition) { esc_protocol_e.append(''); } - esc_protocol_e.val(PID_ADVANCED_CONFIG.fast_pwm_protocol + 1); + $("input[id='unsyncedPWMSwitch']").change(function() { + if ($(this).is(':checked')) { + $('div.unsyncedpwmfreq').show(); + } else { + $('div.unsyncedpwmfreq').hide(); + } + }); + $('input[id="unsyncedPWMSwitch"]').prop('checked', PID_ADVANCED_CONFIG.use_unsyncedPwm !== 0).change(); + $('input[name="unsyncedpwmfreq"]').val(PID_ADVANCED_CONFIG.motor_pwm_rate); + $('input[name="digitalIdlePercent"]').val(PID_ADVANCED_CONFIG.digitalIdlePercent); + + + esc_protocol_e.val(PID_ADVANCED_CONFIG.fast_pwm_protocol + 1); esc_protocol_e.change(function () { + var escProtocolValue = parseInt($(this).val()) - 1; + + var newValue; + if (escProtocolValue !== PID_ADVANCED_CONFIG.fast_pwm_protocol) { + newValue = $(this).find('option:selected').text(); + } + self.analyticsChanges['EscProtocol'] = newValue; + //hide not used setting for DSHOT protocol - if ($(this).val() - 1 >= self.DSHOT_PROTOCOL_MIN_VALUE) { + if (escProtocolValue >= self.DSHOT_PROTOCOL_MIN_VALUE) { $('div.minthrottle').hide(); $('div.maxthrottle').hide(); $('div.mincommand').hide(); @@ -379,9 +413,6 @@ TABS.configuration.initialize = function (callback, scrollPosition) { } }).change(); - $('input[id="unsyncedPWMSwitch"]').prop('checked', PID_ADVANCED_CONFIG.use_unsyncedPwm !== 0); - $('input[name="unsyncedpwmfreq"]').val(PID_ADVANCED_CONFIG.motor_pwm_rate); - $('input[name="digitalIdlePercent"]').val(PID_ADVANCED_CONFIG.digitalIdlePercent); // Gyro and PID update var gyroUse32kHz_e = $('input[id="gyroUse32kHz"]'); @@ -611,7 +642,15 @@ TABS.configuration.initialize = function (callback, scrollPosition) { } serialRX_e.change(function () { - RX_CONFIG.serialrx_provider = parseInt($(this).val()); + var serialRxValue = parseInt($(this).val()); + + var newValue; + if (serialRxValue !== RX_CONFIG.serialrx_provider) { + newValue = $(this).find('option:selected').text(); + } + self.analyticsChanges['SerialRx'] = newValue; + + RX_CONFIG.serialrx_provider = serialRxValue; }); // select current serial RX type @@ -921,14 +960,6 @@ TABS.configuration.initialize = function (callback, scrollPosition) { checkUpdateCurrentControls(); } - $("input[id='unsyncedPWMSwitch']").change(function() { - if ($(this).is(':checked')) { - $('div.unsyncedpwmfreq').show(); - } else { - $('div.unsyncedpwmfreq').hide(); - } - }).change(); - $('a.save').click(function () { // gather data that doesn't have automatic change event bound BOARD_ALIGNMENT_CONFIG.roll = parseInt($('input[name="board_align_roll"]').val()); @@ -987,6 +1018,9 @@ TABS.configuration.initialize = function (callback, scrollPosition) { RX_CONFIG.fpvCamAngleDegrees = parseInt($('input[name="fpvCamAngleDegrees"]').val()); } + analytics.sendChangeEvents(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, self.analyticsChanges); + self.analyticsChanges = {}; + function save_serial_config() { var next_callback = save_feature_config; MSP.send_message(MSPCodes.MSP_SET_CF_SERIAL_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_CF_SERIAL_CONFIG), false, next_callback); diff --git a/src/js/tabs/firmware_flasher.js b/src/js/tabs/firmware_flasher.js index 3ca6f215..5d17f5af 100755 --- a/src/js/tabs/firmware_flasher.js +++ b/src/js/tabs/firmware_flasher.js @@ -2,7 +2,8 @@ TABS.firmware_flasher = { releases: null, - releaseChecker: new ReleaseChecker('firmware', 'https://api.github.com/repos/betaflight/betaflight/releases') + releaseChecker: new ReleaseChecker('firmware', 'https://api.github.com/repos/betaflight/betaflight/releases'), + jenkinsLoader: new JenkinsLoader('https://ci.betaflight.tech') }; TABS.firmware_flasher.initialize = function (callback) { @@ -28,7 +29,7 @@ TABS.firmware_flasher.initialize = function (callback) { : "normal"); } - $('#content').load("./tabs/firmware_flasher.html", function () { + function onDocumentLoad() { FirmwareCache.load(); FirmwareCache.onPutToCache(onFirmwareCacheUpdate); FirmwareCache.onRemoveFromCache(onFirmwareCacheUpdate); @@ -49,16 +50,18 @@ TABS.firmware_flasher.initialize = function (callback) { function process_hex(data, summary) { intel_hex = data; + analytics.setFirmwareData(analytics.DATA.FIRMWARE_CHECKSUM, objectHash.sha1(intel_hex)); + parse_hex(intel_hex, function (data) { parsed_hex = data; if (parsed_hex) { + analytics.setFirmwareData(analytics.DATA.FIRMWARE_SIZE, parsed_hex.bytes_total); + if (!FirmwareCache.has(summary)) { FirmwareCache.put(summary, intel_hex); } - var url; - $('span.progressLabel').html('Loaded Online Firmware: (' + parsed_hex.bytes_total + ' bytes)'); $('a.flash_firmware').removeClass('disabled'); @@ -243,24 +246,21 @@ TABS.firmware_flasher.initialize = function (callback) { { tag: 'firmwareFlasherOptionLabelBuildTypeReleaseCandidate', loader: () => self.releaseChecker.loadReleaseData(releaseData => buildBoardOptions(releaseData, true)) - }, - { - tag: 'firmwareFlasherOptionLabelBuildTypeDevelopment', - loader: () => new JenkinsLoader('https://ci.betaflight.tech', 'Betaflight').loadBuilds(buildJenkinsBoardOptions) - }, - { - tag: 'firmwareFlasherOptionLabelBuildTypeAKK3_3', - loader: () => new JenkinsLoader('https://ci.betaflight.tech', 'Betaflight Maintenance 3.3 (AKK - RDQ VTX Patch)').loadBuilds(buildJenkinsBoardOptions) - }, - { - tag: 'firmwareFlasherOptionLabelBuildTypeAKK3_4', - loader: () => new JenkinsLoader('https://ci.betaflight.tech', 'Betaflight Maintenance 3.4 (AKK - RDQ VTX Patch)').loadBuilds(buildJenkinsBoardOptions) } ]; + var ciBuildsTypes = self.jenkinsLoader._jobs.map(job => { + return { + title: job.title, + loader: () => self.jenkinsLoader.loadBuilds(job.name, buildJenkinsBoardOptions) + }; + }) + + buildTypes = buildTypes.concat(ciBuildsTypes); + var buildType_e = $('select[name="build_type"]'); buildTypes.forEach((build, index) => { - buildType_e.append($("".format(index, i18n.getMessage(build.tag)))) + buildType_e.append($("".format(index, build.tag ? i18n.getMessage(build.tag) : build.title))) }); showOrHideBuildTypeSelect(); @@ -270,6 +270,8 @@ TABS.firmware_flasher.initialize = function (callback) { i18n.localizePage(); buildType_e.change(function() { + analytics.setFirmwareData(analytics.DATA.FIRMWARE_CHANNEL, $(this).find('option:selected').text()); + $("a.load_remote_file").addClass('disabled'); var build_type = $(this).val(); @@ -325,7 +327,10 @@ TABS.firmware_flasher.initialize = function (callback) { // UI Hooks $('a.load_file').click(function () { - chrome.fileSystem.chooseEntry({type: 'openFile', accepts: [{extensions: ['hex']}]}, function (fileEntry) { + analytics.setFirmwareData(analytics.DATA.FIRMWARE_CHANNEL, undefined); + analytics.setFirmwareData(analytics.DATA.FIRMWARE_SOURCE, 'file'); + + chrome.fileSystem.chooseEntry({type: 'openFile', accepts: [{description: 'HEX files', extensions: ['hex']}]}, function (fileEntry) { if (chrome.runtime.lastError) { console.error(chrome.runtime.lastError.message); @@ -339,6 +344,7 @@ TABS.firmware_flasher.initialize = function (callback) { console.log('Loading file from: ' + path); fileEntry.file(function (file) { + analytics.setFirmwareData(analytics.DATA.FIRMWARE_NAME, file.name); var reader = new FileReader(); reader.onprogress = function (e) { @@ -355,10 +361,14 @@ TABS.firmware_flasher.initialize = function (callback) { intel_hex = e.target.result; + analytics.setFirmwareData(analytics.DATA.FIRMWARE_CHECKSUM, objectHash.sha1(intel_hex)); + parse_hex(intel_hex, function (data) { parsed_hex = data; if (parsed_hex) { + analytics.setFirmwareData(analytics.DATA.FIRMWARE_SIZE, parsed_hex.bytes_total); + $('a.flash_firmware').removeClass('disabled'); $('span.progressLabel').text(i18n.getMessage('firmwareFlasherFirmwareLocalLoaded', parsed_hex.bytes_total)); @@ -385,7 +395,10 @@ TABS.firmware_flasher.initialize = function (callback) { let isCached = FirmwareCache.has(release); if (evt.target.value=="0" || isCached) { if (isCached) { + analytics.setFirmwareData(analytics.DATA.FIRMWARE_SOURCE, 'cache'); + FirmwareCache.get(release, cached => { + analytics.setFirmwareData(analytics.DATA.FIRMWARE_NAME, release.file); console.info("Release found in cache: " + release.file); onLoadSuccess(cached.hexdata, release); }); @@ -398,6 +411,7 @@ TABS.firmware_flasher.initialize = function (callback) { }); $('a.load_remote_file').click(function (evt) { + analytics.setFirmwareData(analytics.DATA.FIRMWARE_SOURCE, 'http'); if ($('select[name="firmware_version"]').val() == "0") { GUI.log(i18n.getMessage('firmwareFlasherNoFirmwareSelected')); @@ -413,6 +427,7 @@ TABS.firmware_flasher.initialize = function (callback) { var summary = $('select[name="firmware_version"] option:selected').data('summary'); if (summary) { // undefined while list is loading or while running offline + analytics.setFirmwareData(analytics.DATA.FIRMWARE_NAME, summary.file); $("a.load_remote_file").text(i18n.getMessage('firmwareFlasherButtonDownloading')); $("a.load_remote_file").addClass('disabled'); $.get(summary.url, onLoadSuccess).fail(failed_to_load); @@ -427,14 +442,17 @@ TABS.firmware_flasher.initialize = function (callback) { if (parsed_hex != false) { var options = {}; + var eraseAll = false; if ($('input.erase_chip').is(':checked')) { options.erase_chip = true; + + eraseAll = true } + analytics.setFirmwareData(analytics.DATA.FIRMWARE_ERASE_ALL, eraseAll.toString()); if (String($('div#port-picker #port').val()) != 'DFU') { if (String($('div#port-picker #port').val()) != '0') { - var port = String($('div#port-picker #port').val()), - baud; + var port = String($('div#port-picker #port').val()), baud; baud = 115200; if ($('input.updating').is(':checked')) { @@ -447,6 +465,7 @@ TABS.firmware_flasher.initialize = function (callback) { baud = parseInt($('#flash_manual_baud_rate').val()); } + analytics.sendEvent(analytics.EVENT_CATEGORIES.FIRMWARE, 'Flashing'); STM32.connect(port, baud, parsed_hex, options); } else { @@ -454,6 +473,8 @@ TABS.firmware_flasher.initialize = function (callback) { GUI.log(i18n.getMessage('firmwareFlasherNoValidPort')); } } else { + analytics.sendEvent(analytics.EVENT_CATEGORIES.FIRMWARE, 'Flashing'); + STM32DFU.connect(usbDevices.STM32DFU, parsed_hex, options); } } else { @@ -465,7 +486,7 @@ TABS.firmware_flasher.initialize = function (callback) { $(document).on('click', 'span.progressLabel a.save_firmware', function () { var summary = $('select[name="firmware_version"] option:selected').data('summary'); - chrome.fileSystem.chooseEntry({type: 'saveFile', suggestedName: summary.file, accepts: [{extensions: ['hex']}]}, function (fileEntry) { + chrome.fileSystem.chooseEntry({type: 'saveFile', suggestedName: summary.file, accepts: [{description: 'HEX files', extensions: ['hex']}]}, function (fileEntry) { if (chrome.runtime.lastError) { console.error(chrome.runtime.lastError.message); return; @@ -626,6 +647,10 @@ TABS.firmware_flasher.initialize = function (callback) { }); GUI.content_ready(callback); + } + + self.jenkinsLoader.loadJobs('Firmware', () => { + $('#content').load("./tabs/firmware_flasher.html", onDocumentLoad); }); }; @@ -637,5 +662,7 @@ TABS.firmware_flasher.cleanup = function (callback) { $(document).unbind('keypress'); $(document).off('click', 'span.progressLabel a'); + analytics.resetFirmwareData(); + if (callback) callback(); }; diff --git a/src/js/tabs/landing.js b/src/js/tabs/landing.js index ce5bcc30..6d63e5bb 100644 --- a/src/js/tabs/landing.js +++ b/src/js/tabs/landing.js @@ -32,6 +32,26 @@ TABS.landing.initialize = function (callback) { $(this).data('state2', state); }); + // load privacy policy content + $('#privacy_policy .policy').load('./tabs/privacy_policy.html'); + + /** changelog trigger **/ + $("#privacy_policy_toggle").on('click', function() { + var state = $(this).data('state2'); + if (state) { + $("#privacy_policy").animate({right: -495}, 200, function () { + $("#content").removeClass('policy_open'); + }); + state = false; + } else { + $("#privacy_policy").animate({right: 0}, 200); + $("#content").addClass('policy_open'); + state = true; + } + $(this).text(state ? i18n.getMessage('close') : i18n.getMessage('defaultPrivacyPolicyAction')); + $(this).data('state2', state); + }); + GUI.content_ready(callback); }); diff --git a/src/js/tabs/logging.js b/src/js/tabs/logging.js index a7eb269c..5b3d65d0 100644 --- a/src/js/tabs/logging.js +++ b/src/js/tabs/logging.js @@ -236,7 +236,7 @@ TABS.logging.initialize = function (callback) { var filename = generateFilename(prefix, suffix); var accepts = [{ - extensions: [suffix], + description: suffix.toUpperCase() + ' files', extensions: [suffix], }]; // create or load the file diff --git a/src/js/tabs/motors.js b/src/js/tabs/motors.js index d90e3fa4..d8d6e4d5 100644 --- a/src/js/tabs/motors.js +++ b/src/js/tabs/motors.js @@ -45,7 +45,11 @@ TABS.motors.initialize = function (callback) { } function load_motor_data() { - MSP.send_message(MSPCodes.MSP_MOTOR, false, false, load_html); + MSP.send_message(MSPCodes.MSP_MOTOR, false, false, load_mixer_config); + } + + function load_mixer_config() { + MSP.send_message(MSPCodes.MSP_MIXER_CONFIG, false, false, load_html); } function load_html() { diff --git a/src/js/tabs/onboard_logging.js b/src/js/tabs/onboard_logging.js index 68dc1d12..0c41b141 100644 --- a/src/js/tabs/onboard_logging.js +++ b/src/js/tabs/onboard_logging.js @@ -145,6 +145,22 @@ TABS.onboard_logging.initialize = function (callback) { $("div.blackboxRate").show(); } }).change(); + + if (semver.gte(CONFIG.apiVersion, "1.40.0")) { + if (SDCARD.supported || DATAFLASH.supported) { + + $(".tab-onboard_logging") + .toggleClass("msc-supported", true); + + $('a.onboardLoggingRebootMsc').click(function () { + analytics.sendEvent(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'RebootMsc'); + + var buffer = []; + buffer.push(2); + MSP.send_message(MSPCodes.MSP_SET_REBOOT, buffer, false); + }); + } + } update_html(); @@ -284,6 +300,8 @@ TABS.onboard_logging.initialize = function (callback) { } function update_html() { + var dataflashPresent = DATAFLASH.totalSize > 0; + update_bar_width($(".tab-onboard_logging .dataflash-used"), DATAFLASH.usedSize, DATAFLASH.totalSize, i18n.getMessage('dataflashUsedSpace'), false); update_bar_width($(".tab-onboard_logging .dataflash-free"), DATAFLASH.totalSize - DATAFLASH.usedSize, DATAFLASH.totalSize, i18n.getMessage('dataflashFreeSpace'), false); @@ -296,27 +314,51 @@ TABS.onboard_logging.initialize = function (callback) { .toggleClass("sdcard-error", SDCARD.state === MSP.SDCARD_STATE_FATAL) .toggleClass("sdcard-initializing", SDCARD.state === MSP.SDCARD_STATE_CARD_INIT || SDCARD.state === MSP.SDCARD_STATE_FS_INIT) .toggleClass("sdcard-ready", SDCARD.state === MSP.SDCARD_STATE_READY); + + if (semver.gte(CONFIG.apiVersion, "1.40.0")) { + var mscIsReady = dataflashPresent || (SDCARD.state === MSP.SDCARD_STATE_READY); + $(".tab-onboard_logging") + .toggleClass("msc-not-ready", !mscIsReady); + + if (!mscIsReady) { + $('a.onboardLoggingRebootMsc').addClass('disabled'); + } else { + $('a.onboardLoggingRebootMsc').removeClass('disabled'); + } + } + var loggingStatus switch (SDCARD.state) { case MSP.SDCARD_STATE_NOT_PRESENT: $(".sdcard-status").text(i18n.getMessage('sdcardStatusNoCard')); + loggingStatus = 'SdCard: NotPresent'; break; case MSP.SDCARD_STATE_FATAL: $(".sdcard-status").html(i18n.getMessage('sdcardStatusReboot')); + loggingStatus = 'SdCard: Error'; break; case MSP.SDCARD_STATE_READY: $(".sdcard-status").text(i18n.getMessage('sdcardStatusReady')); + loggingStatus = 'SdCard: Ready'; break; case MSP.SDCARD_STATE_CARD_INIT: $(".sdcard-status").text(i18n.getMessage('sdcardStatusStarting')); + loggingStatus = 'SdCard: Init'; break; case MSP.SDCARD_STATE_FS_INIT: $(".sdcard-status").text(i18n.getMessage('sdcardStatusFileSystem')); + loggingStatus = 'SdCard: FsInit'; break; default: $(".sdcard-status").text(i18n.getMessage('sdcardStatusUnknown',[SDCARD.state])); } + if (dataflashPresent && SDCARD.state === MSP.SDCARD_STATE_NOT_PRESENT) { + loggingStatus = 'Dataflash'; + analytics.setFlightControllerData(analytics.DATA.LOG_SIZE, DATAFLASH.usedSize); + } + analytics.setFlightControllerData(analytics.DATA.LOGGING_STATUS, loggingStatus); + if (SDCARD.supported && !sdcardTimer) { // Poll for changes in SD card status sdcardTimer = setTimeout(function() { @@ -348,6 +390,8 @@ TABS.onboard_logging.initialize = function (callback) { } function mark_saving_dialog_done(startTime, totalBytes, totalBytesCompressed) { + analytics.sendEvent(analytics.EVENT_CATEGORIES.FLIGHT_CONTROLLER, 'SaveDataflash'); + var totalTime = (new Date().getTime() - startTime) / 1000; console.log('Received ' + totalBytes + ' bytes in ' + totalTime.toFixed(2) + 's (' + (totalBytes / totalTime / 1024).toFixed(2) + 'kB / s) with block size ' + self.blockSize + '.'); @@ -445,7 +489,7 @@ TABS.onboard_logging.initialize = function (callback) { var filename = generateFilename(prefix, suffix); chrome.fileSystem.chooseEntry({type: 'saveFile', suggestedName: filename, - accepts: [{extensions: [suffix]}]}, function(fileEntry) { + accepts: [{description: suffix.toUpperCase() + ' files', extensions: [suffix]}]}, function(fileEntry) { var error = chrome.runtime.lastError; if (error) { @@ -513,6 +557,9 @@ TABS.onboard_logging.initialize = function (callback) { }; TABS.onboard_logging.cleanup = function (callback) { + analytics.setFlightControllerData(analytics.DATA.LOGGING_STATUS, undefined); + analytics.setFlightControllerData(analytics.DATA.LOG_SIZE, undefined); + if (sdcardTimer) { clearTimeout(sdcardTimer); sdcardTimer = false; diff --git a/src/js/tabs/osd.js b/src/js/tabs/osd.js index d5c87efb..7c84282d 100755 --- a/src/js/tabs/osd.js +++ b/src/js/tabs/osd.js @@ -129,7 +129,7 @@ FONT.parseMCMFontFile = function(data) { FONT.openFontFile = function($preview) { return new Promise(function(resolve) { - chrome.fileSystem.chooseEntry({type: 'openFile', accepts: [{extensions: ['mcm']}]}, function (fileEntry) { + chrome.fileSystem.chooseEntry({type: 'openFile', accepts: [{description: 'MCM files', extensions: ['mcm']}]}, function (fileEntry) { FONT.data.loaded_font_file = fileEntry.name; if (chrome.runtime.lastError) { console.error(chrome.runtime.lastError.message); @@ -342,7 +342,7 @@ OSD.constants = { default_position: -9, draw_order: 110, positionable: true, - preview: FONT.symbol(SYM.THR) + FONT.symbol(SYM.THR1) + '69' + preview: FONT.symbol(SYM.THR) + FONT.symbol(SYM.THR1) + ' 69' }, CPU_LOAD: { name: 'CPU_LOAD', @@ -913,7 +913,8 @@ OSD.constants = { { file: "extra_large", name: "Extra Large" }, { file: "betaflight", name: "Betaflight" }, { file: "digital", name: "Digital" }, - { file: "clarity", name: "Clarity" } + { file: "clarity", name: "Clarity" }, + { file: "vision", name: "Vision" } ] }; @@ -1470,17 +1471,18 @@ TABS.osd.initialize = function (callback) { } $('#content').load("./tabs/osd.html", function () { - - // Generate font type buttons - var fontbuttons = $('.fontbuttons'); + // Generate font type select element + var fontselect = $('.fontpresets'); OSD.constants.FONT_TYPES.forEach(function(e, i) { - var button = $('