Monday, January 28, 2008

History of Linux


a. In The Beginning

It was 1991, and the ruthless agonies of the cold war were gradually coming to an end. There was an air of peace and tranquility that prevailed in the horizon. In the field of computing, a great future seemed to be in the offing, as powerful hardware pushed the limits of the computers beyond what anyone expected.

But still, something was missing.

And it was the none other than the Operating Systems, where a great void seemed to have appeared.

For one thing, DOS was still reigning supreme in its vast empire of personal computers. Bought by Bill Gates from a Seattle hacker for $50,000, the bare bones operating system had sneaked into every corner of the world by virtue of a clever marketing strategy. PC users had no other choice. Apple Macs were better, but with astronomical prices that nobody could afford, they remained a horizon away from the eager millions.

The other dedicated camp of computing was the Unixworld. But Unix itself was far more expensive. In quest of big money, the Unix vendors priced it high enough to ensure small PC users stayed away from it. The source code of Unix, once taught in universities courtesy of Bell Labs, was now cautiously guarded and not published publicly. To add to the frustration of PC users worldwide, the big players in the software market failed to provide an efficient solution to this problem.

A solution seemed to appear in form of MINIX. It was written from scratch by Andrew S. Tanenbaum, a US-born Dutch professor who wanted to teach his students the inner workings of a real operating system. It was designed to run on the Intel 8086 microprocessors that had flooded the world market.

As an operating system, MINIX was not a superb one. But it had the advantage that the source code was available. Anyone who happened to get the book 'Operating Systems: Design and Implementation' by Tanenbaum could get hold of the 12,000 lines of code, written in C and assembly language. For the first time, an aspiring programmer or hacker could read the source codes of the operating system, which to that time the software vendors had guarded vigorously. A superb author, Tanenbaum captivated the brightest minds of computer science with the elaborate and immaculately lively discussion of the art of creating a working operating system. Students of Computer Science all over the world pored over the book, reading through the codes to understand the very system that runs their computer.

And one of them was Linus Torvalds.



https://netfiles.uiuc.edu/rhasan/linux/

Monday, January 07, 2008

Boeing's New 787 May Be Vulnerable to Hacker Attack



Boeing's new 787 Dreamliner passenger jet may have a serious security vulnerability in its onboard computer networks that could allow passengers to access the plane's control systems, according to the U.S. Federal Aviation Administration.

The computer network in the Dreamliner's passenger compartment, designed to give passengers in-flight internet access, is connected to the plane's control, navigation and communication systems, an FAA report reveals.

The revelation is causing concern in security circles because the physical connection of the networks makes the plane's control systems vulnerable to hackers. A more secure design would physically separate the two computer networks. Boeing said it's aware of the issue and has designed a solution it will test shortly.

"This is serious," said Mark Loveless, a network security analyst with Autonomic Networks, a company in stealth mode, who presented a conference talk last year on Hacking the Friendly Skies (PowerPoint). "This isn’t a desktop computer. It's controlling the systems that are keeping people from plunging to their deaths. So I hope they are really thinking about how to get this right."

Currently in the final stages of production, the 787 Dreamliner is Boeing's new mid-sized jet, which will seat between 210 and 330 passengers, depending on configuration.

Boeing says it has taken more than 800 advance orders for the new plane, which is due to enter service in November 2008. But the FAA is requiring Boeing to demonstrate that it has addressed the computer-network issue before the planes begin service.

According to the FAA document published in the Federal Register (mirrored at Cryptome.org), the vulnerability exists because the plane's computer systems connect the passenger network with the flight-safety, control and navigation network. It also connects to the airline's business and administrative-support network, which communicates maintenance issues to ground crews.

The design "allows new kinds of passenger connectivity to previously isolated data networks connected to systems that perform functions required for the safe operation of the airplane," says the FAA document. "Because of this new passenger connectivity, the proposed data-network design and integration may result in security vulnerabilities from intentional or unintentional corruption of data and systems critical to the safety and maintenance of the airplane."

The information is published in a "special conditions" document that the FAA produces when it encounters new aircraft designs and technologies that aren't addressed by existing regulations and standards.

An FAA spokesman said he would not be able to comment on the issue until next week.

Boeing spokeswoman Lori Gunter said the wording of the FAA document is misleading, and that the plane's networks don't completely connect.

Gunter wouldn't go into detail about how Boeing is tackling the issue but says it is employing a combination of solutions that involves some physical separation of the networks, known as "air gaps," and software firewalls. Gunter also mentioned other technical solutions, which she said are proprietary and didn't want to discuss in public.

"There are places where the networks are not touching, and there are places where they are," she said.

Gunter added that although data can pass between the networks, "there are protections in place" to ensure that the passenger internet service doesn't access the maintenance data or the navigation system "under any circumstance."

She said the safeguards protect the critical networks from unauthorized access, but the company still needs to conduct lab and in-flight testing to ensure that they work. This will occur in March when the first Dreamliner is ready for a test flight.

Gunter said Boeing has been working on the issue with the FAA for a number of years already and was aware that the agency was planning to publish a "special conditions" document regarding the Dreamliner.

Gunter said the FAA and Boeing have already agreed on the tests that the plane manufacturer will have to do to demonstrate that it has addressed the FAA's security concerns.

"It will all be done before the first airplane is delivered," she said.

Loveless said he's glad the FAA and Boeing are addressing the issue, but without knowing specifically what Boeing is doing, it is impossible to say whether the proposed solution will work as intended. Loveless said software firewalls offer some protection, but are not bulletproof, and he noted that the FAA has previously overlooked serious onboard-security issues.

"The fact that they are not sharing information about it is a concern," he said. "I'd be happier if a credible auditing firm took a look at it."

Special conditions are not unusual. The FAA publishes them whenever it encounters unusual issues regarding a plane's design or performance in order to communicate on record that it expects the manufacturer to address the issue. It's then up to the manufacturer to demonstrate to the FAA that it has solved the problem. Gunter said the FAA has issued eight special conditions on the Boeing 787, but that not all of them pertain to the plane's computer systems.

Wednesday, December 05, 2007

Wireless Keyboard "Encryption" Cracked

Security researchers have cracked the rudimentary encryption used in a range of popular wireless keyboards.

Bluetooth is increasingly becoming the de-facto standard for wireless communication in peripheral devices and is reckoned to be secure. But some manufacturers such as Logitech and Microsoft rely on 27 MHz radio technology which, it transpires, is anything but secure.

Using nothing more than a simple radio receiver, a soundcard and suitable software, Swiss security firm Dreamlab Technologies managed to capture and decode the radio communications between a keyboard and a PC. The attack opens the way up to all sorts of mischief including keystroke logging to capture login credentials to online banking sites or email accounts.

Dreamlab cracked the encryption key used within Microsoft Wireless Optical Desktop 1000 and 2000 keyboards. As most products in Microsoft's wireless range are based on the same technology other products are likely to be insecure. Max Moser and Phillipp Schrödel of Dreamlab Technologies succeeded in eavesdropping traffic from a distance of up to ten meters using a simple radio receiver. More sensitive receivers may make it possible to capture keystrokes over larger distances.

Sniffing traffic between wireless keyboards and their base stations was possible because of the weak encryption used, as explained in a white paper from Dreamlab:

To our surprise, only the actual keystroke data seems to be encrypted. The Metaflags and identifier bits aren't encrypted or obfuscated. The one byte USB Hid code is encrypted using a simple XOR mechanism with a single byte of random data generated during the association procedure.

This means that there are only 256 different key values possible per keyboard and receiver pair. We did not notice any automated key change interval and therefore assume that the encryption key stays the same until the user reassociates the keyboard. 256 key combination can be brute forced even with very slow computers today. We did not analyze the quality of the random number so far because it was not needed to successfully break the encryption.

"Wireless communication is only as secure as the encryption technology used. Due to its nature, it can be tapped with little effort," said Dreamlab's Max Moser.

Thursday, October 04, 2007

A Brief History of Slashdot Part 1, Chips & Dips

As part of our 10 year anniversary celebration, I've decided to post a story here telling the tale of the transition from Chips & Dips to Slashdot back in 1997. For those of you who are new here (cough), CnD was the precursor to Slashdot, hosted on my personal homepage on the CompSci cluster of Hope College. Along with a number of random Linux related webpages, themes for window managers, random bits of code I wrote, this page was read by a great number of folks, mostly from the IRC scene. Hit the link below to read the tale of its transformation into an Internet superstar (and maybe later I'll write the the sequel where I talk of the transformation into sellout mega corporate evil and eventually irrelevant blemish on the history of the net ;) And don't forget to check for a Slashdot 10 year anniversary party in your area.


In the summer of 1997 I was contacted by a stranger out of the blue with a kind of random offer. During the previous school year Nate Oostendorp (who now works with SourceForge, Inc. while working on his Masters) had coded a Space Invaders clone. He wrote a Java sprite library, and I wrote the game and illustrated the alien armada. This guy had an old DEC Alpha Multia 166, and a client that wanted to remake the game with popcorn instead of aliens. So I drew the popcorn up, replaced the gifs, and he mailed me my first non x86 box since the 286 I got in middle school. (Later Sun sent me legal threats forcing me to take the game offline since it was called Java Invaders, and clearly this was an evil crime against the universe. My hatred for Java has never died since that moment.)

I immediately installed Red Hat on it. I was working at an ad agency called The Image Group at the time as a webmaster. I coded whatever needed doing and handled various admin tasks to keep their clients happy. At the time they needed full control over email addresses on the domains they built. Since they shared their mailserver with their ISP, there were frequent name collisions -- if the client wanted bob@theirdomain.com but there already was a bob on the system, they couldn't do it. They agreed to let me move my little Alpha onto their network to host their email... and I could use it to fart around with on my personal hobbies.

I named the box Ariel. It sat under my desk. I learned enough Perl to write a stupid simple CMS to replace the functionality of Chips & Dips, which up until that point was just a text file. Dave DeMaagd wrote a simple comment system. Since we both had a long history with BBSes, it seemed obvious to us that there needed to be a discussion system. There were no user accounts -- you entered whatever name you wanted each time you posted. If you left it blank, it auto-filled the space with the name 'Anonymous Coward', a title that stuck and spread throughout the net.

The original system was written in Perl because I wanted to learn more Perl. All the data storage was flat text files. (We lost most of the original stories during a data import a year or so later) The files were named like 0000001.shtml and so forth and were all rendered at time of page request. Best of all, since the system was written as a CGI, the whole script needed to be compiled every time there was a page request. It was months before I ported the whole thing to use MySQL and mod_Perl.

I registered the domain name Slashdot.org as a joke. It was 'org' because I didn't want a .com -- those were so common. I always thought org would be cooler, and besides, I had no commercial plans in mind. (Years later this bit me on the ass since someone else registered the .com. Doh!) The URL was meant to be unpronounceable by anyone -- a joke ultimately that has backfired on me countless times when I'm called and asked what the URL is to the damn thing. Jeff 'Hemos' Bates (now a VP of something or other with SourceForge, Inc.) was in the living room when I was registering the domain name. We all wanted email addresses with a unique domain name that wasn't attached to our school, so he chipped in on the registration fee.

When it came time to design the website's look, I took elements from a theme we had designed at The Image Group -- Paul Hart and I spent hours on it -- that was supposed to be the new website for the company, but it was passed on for another look. I still liked it, so I redesigned it more to my personal aesthetics (choosing #006666 as the dominant green replacing an earth tone green) and putting drop shadows all over everything (a habit I still haven't broken, and for which I am still mocked). Within days, most of the design elements you see on Slashdot were in place... the curves, the greens, the polls, the vertical list of stories so common in 2007, and, of course, discussions on each story.

And Slashdot was born. At first it had just a few thousand daily readers migrating over from Chips & Dips, but in a matter of weeks it had grown so fast that we started really having fun with it. One night we put up a poll asking how many shots Kurt 'The Pope' DeMaagd should drink. (Kurt later became our defacto HR man when we formed Blockstackers... today he is a professor at MSU.) But that night, Slashdot readers told him to take a dozen shots of alcohol -- he failed, but he tried.

I remember around the same time just watching 'tail -f' on the access_log. My world was rocked over and over again as I watched the domain names... mit.com! ibm.com! redhat.com! Hell, even microsoft.com kept scrolling through the log. I knew we had something... people from around the world, from the highest institutions in the land, from the biggest companies in the tech sector and to the most influential in the Linux world were all reading Slashdot. In fact, they were posting comments... as were a lot of people. It became commonplace to see hundreds of comments on stories, and the so-called 'Slashdot Effect' slowly grew into our lexicon as site after site buckled under our links.

In those days the content was a lot more personal then it is today. Stories would frequently refer to alcohol-related activities. I'd constantly mention that I had to leave to go to class so there wouldn't be more stories posted for a few hours. And when a professor in my pottery class assigned homework of to mass produce and sell some pottery as a lesson in being a commercial artist, I posted it, and ended up getting over 100 requests to buy my shitty mugs (all glazed teal ;) In the end I never did sell them -- I fulfilled the assignment locally. I think I still have one of those mugs left but I'm not sure- over the years my mediocre ceramics have been filtered out of a home increasingly tastefully decorated by my wife.

I continued to go to class and work my part time job. Ariel soon had loads so great that the machine was unusable during the day. And occasionally I would accidentally kick it and knock out a cable, bringing the machine offline. Soon after it saturated the office T1, I started realizing that there was no way I was going to be able to do this as "Just" a hobby. Essentially, every second of my life was consumed without time for a break. I'd go to class -- and often just work on Slashdot in the back row. (This was the first year we had computers at our desks in the CS dept at Hope.) My classwork suffered. On the upside, I became far more proficient at webwork, which really helped the part time job. I'd go home and code, post stories, reply to email until 2-3 a.m. and repeat it the next day. It was going to eventually be a full time job, requiring revenue and infrastructure that didn't exist back then. But I guess that's another story.

Wednesday, October 03, 2007

Parallel programming environments: less is more

The single most important paper for programming language designers to read came out in 2000. It wasn’t written by a computer scientist, mathematician, or physical scientist. It was written by a couple professors studying social psychology:

“When Choice is Demotivating: Can One Desire too Much of a Good Thing?” Iyengar, S. S., & Lepper, M. Journal of Personality and Social Psychology, 79, 995-1006. (2000).

This paper explored the phenomena of “choice overload.” Here is what they did.

They created two displays of gourmet jams. One display had 24 jars. The other had 6. Each display invited people to try the jams and offered them a discount coupon to buy the jam. They alternated these displays in a grocery store and tracked how many people passed the displays, how many people stopped and sampled the jams, and how many subsequently used the offered coupon to buy the jam.

The results were surprising.

  • 24 jar display: 60% of the people passing the display sampled the jam, 3% purchased jam.
  • 6 jar display: 40% of the people passing the display sampled the jam, 30% purchased jam.

The larger display was better at getting people’s attention. But the number of choices overwhelmed them and they just walked away with out deciding to purchase a jam. In other words, if the goal is to attract consumers, less is more. Too much choice is demotivating. Admittedly, selecting a gourmet jam is insignificant. Maybe for more important issues, “choice overload” is not relevant? The authors of this paper, however, went on to consider more important choices such as 401K plans, and once again, a clear choice overload effect was found. Choice overload is real. When people are faced with too many choices, the natural tendency is to “not make a choice” and just walk away (probably in frustration).

Why is this relevant to parallel programming?

Think about it. We (that is, computer companies) want to sell hardware. To do that, we need software. We display our platforms and hope software developers will spend their valuable development dollars porting to our platform.

So what is the situation today with multi-core processors? A software vendor walks up to “our display.” We show them our nice hardware with its many cores and we tell them they will need to convert their software so that it will scale. And then we show them the parallel programming environments they can work with: MPI, OpenMP, Ct, HPF, TBB, Erlang, Shmemm, Portals, ZPL, BSP, CHARM++, Cilk, Co-array Fortran, PVM, Pthreads, windows threads, Tstreams, GA, Java, UPC, Titanium, Parlog, NESL,Split-C … and the list goes on and on. If we aren’t careful, the result could very well be a “choice overload” experience with softwre vendors running away in frustration.

Think about the impression this glut of choices creates. If we “experts” can’t agree on how to write a parallel program, what makes us believe parallel programming is ready for the masses? In our quest to find that perfect language to make parallel programming easy, we actually harm our agenda and scare away the software developers we need.

We need to spend less time creating new languages and more time making the languages we have work. This is why anytime I hear someone talk about their great new language, I pretty much ignore them. Tell me how to make OpenMP work. Tell me how to fix MPI so it runs with equal efficiency on shared memory and distributed memory systems. Help me figure out how to get pthreads and OpenMP components to work together. Help me understand solution frameworks so high level programmers can create the software they need without becoming parallel algorithm experts. But don’t waste my time with new languages. With hundreds of languages and API’s out there, is anyone really dumb enough to think “yet another one” will fix our parallel programming problems?

Thursday, April 05, 2007

I loved what I did

Text of Steve Jobs' Commencement address (2005)

This is the text of the Commencement address by Steve Jobs, CEO of Apple Computer and of Pixar Animation Studios, delivered on June 12, 2005.

I'm convinced that the only thing that kept me going was that I loved what I did.

And most important, have the courage to follow your heart and intuition. They somehow already know what you truly want to become.


I am honored to be with you today at your commencement from one of the finest universities in the world. I never graduated from college. Truth be told, this is the closest I've ever gotten to a college graduation. Today I want to tell you three stories from my life. That's it. No big deal. Just three stories.

The first story is about connecting the dots.

I dropped out of Reed College after the first 6 months, but then stayed around as a drop-in for another 18 months or so before I really quit. So why did I drop out?

It started before I was born. My biological mother was a young, unwed college graduate student, and she decided to put me up for adoption. She felt very strongly that I should be adopted by college graduates, so everything was all set for me to be adopted at birth by a lawyer and his wife. Except that when I popped out they decided at the last minute that they really wanted a girl. So my parents, who were on a waiting list, got a call in the middle of the night asking: "We have an unexpected baby boy; do you want him?" They said: "Of course." My biological mother later found out that my mother had never graduated from college and that my father had never graduated from high school. She refused to sign the final adoption papers. She only relented a few months later when my parents promised that I would someday go to college.

And 17 years later I did go to college. But I naively chose a college that was almost as expensive as Stanford, and all of my working-class parents' savings were being spent on my college tuition. After six months, I couldn't see the value in it. I had no idea what I wanted to do with my life and no idea how college was going to help me figure it out. And here I was spending all of the money my parents had saved their entire life. So I decided to drop out and trust that it would all work out OK. It was pretty scary at the time, but looking back it was one of the best decisions I ever made. The minute I dropped out I could stop taking the required classes that didn't interest me, and begin dropping in on the ones that looked interesting.

It wasn't all romantic. I didn't have a dorm room, so I slept on the floor in friends' rooms, I returned coke bottles for the 5¢ deposits to buy food with, and I would walk the 7 miles across town every Sunday night to get one good meal a week at the Hare Krishna temple. I loved it. And much of what I stumbled into by following my curiosity and intuition turned out to be priceless later on. Let me give you one example:

Reed College at that time offered perhaps the best calligraphy instruction in the country. Throughout the campus every poster, every label on every drawer, was beautifully hand calligraphed. Because I had dropped out and didn't have to take the normal classes, I decided to take a calligraphy class to learn how to do this. I learned about serif and san serif typefaces, about varying the amount of space between different letter combinations, about what makes great typography great. It was beautiful, historical, artistically subtle in a way that science can't capture, and I found it fascinating.

None of this had even a hope of any practical application in my life. But ten years later, when we were designing the first Macintosh computer, it all came back to me. And we designed it all into the Mac. It was the first computer with beautiful typography. If I had never dropped in on that single course in college, the Mac would have never had multiple typefaces or proportionally spaced fonts. And since Windows just copied the Mac, its likely that no personal computer would have them. If I had never dropped out, I would have never dropped in on this calligraphy class, and personal computers might not have the wonderful typography that they do. Of course it was impossible to connect the dots looking forward when I was in college. But it was very, very clear looking backwards ten years later.

Again, you can't connect the dots looking forward; you can only connect them looking backwards. So you have to trust that the dots will somehow connect in your future. You have to trust in something — your gut, destiny, life, karma, whatever. This approach has never let me down, and it has made all the difference in my life.

My second story is about love and loss.

I was lucky — I found what I loved to do early in life. Woz and I started Apple in my parents garage when I was 20. We worked hard, and in 10 years Apple had grown from just the two of us in a garage into a $2 billion company with over 4000 employees. We had just released our finest creation — the Macintosh — a year earlier, and I had just turned 30. And then I got fired. How can you get fired from a company you started? Well, as Apple grew we hired someone who I thought was very talented to run the company with me, and for the first year or so things went well. But then our visions of the future began to diverge and eventually we had a falling out. When we did, our Board of Directors sided with him. So at 30 I was out. And very publicly out. What had been the focus of my entire adult life was gone, and it was devastating.

I really didn't know what to do for a few months. I felt that I had let the previous generation of entrepreneurs down - that I had dropped the baton as it was being passed to me. I met with David Packard and Bob Noyce and tried to apologize for screwing up so badly. I was a very public failure, and I even thought about running away from the valley. But something slowly began to dawn on me — I still loved what I did. The turn of events at Apple had not changed that one bit. I had been rejected, but I was still in love. And so I decided to start over.

I didn't see it then, but it turned out that getting fired from Apple was the best thing that could have ever happened to me. The heaviness of being successful was replaced by the lightness of being a beginner again, less sure about everything. It freed me to enter one of the most creative periods of my life.

During the next five years, I started a company named NeXT, another company named Pixar, and fell in love with an amazing woman who would become my wife. Pixar went on to create the worlds first computer animated feature film, Toy Story, and is now the most successful animation studio in the world. In a remarkable turn of events, Apple bought NeXT, I returned to Apple, and the technology we developed at NeXT is at the heart of Apple's current renaissance. And Laurene and I have a wonderful family together.

I'm pretty sure none of this would have happened if I hadn't been fired from Apple. It was awful tasting medicine, but I guess the patient needed it. Sometimes life hits you in the head with a brick. Don't lose faith. I'm convinced that the only thing that kept me going was that I loved what I did. You've got to find what you love. And that is as true for your work as it is for your lovers. Your work is going to fill a large part of your life, and the only way to be truly satisfied is to do what you believe is great work. And the only way to do great work is to love what you do. If you haven't found it yet, keep looking. Don't settle. As with all matters of the heart, you'll know when you find it. And, like any great relationship, it just gets better and better as the years roll on. So keep looking until you find it. Don't settle.

My third story is about death.

When I was 17, I read a quote that went something like: "If you live each day as if it was your last, someday you'll most certainly be right." It made an impression on me, and since then, for the past 33 years, I have looked in the mirror every morning and asked myself: "If today were the last day of my life, would I want to do what I am about to do today?" And whenever the answer has been "No" for too many days in a row, I know I need to change something.

Remembering that I'll be dead soon is the most important tool I've ever encountered to help me make the big choices in life. Because almost everything — all external expectations, all pride, all fear of embarrassment or failure - these things just fall away in the face of death, leaving only what is truly important. Remembering that you are going to die is the best way I know to avoid the trap of thinking you have something to lose. You are already naked. There is no reason not to follow your heart.

About a year ago I was diagnosed with cancer. I had a scan at 7:30 in the morning, and it clearly showed a tumor on my pancreas. I didn't even know what a pancreas was. The doctors told me this was almost certainly a type of cancer that is incurable, and that I should expect to live no longer than three to six months. My doctor advised me to go home and get my affairs in order, which is doctor's code for prepare to die. It means to try to tell your kids everything you thought you'd have the next 10 years to tell them in just a few months. It means to make sure everything is buttoned up so that it will be as easy as possible for your family. It means to say your goodbyes.

I lived with that diagnosis all day. Later that evening I had a biopsy, where they stuck an endoscope down my throat, through my stomach and into my intestines, put a needle into my pancreas and got a few cells from the tumor. I was sedated, but my wife, who was there, told me that when they viewed the cells under a microscope the doctors started crying because it turned out to be a very rare form of pancreatic cancer that is curable with surgery. I had the surgery and I'm fine now.

This was the closest I've been to facing death, and I hope its the closest I get for a few more decades. Having lived through it, I can now say this to you with a bit more certainty than when death was a useful but purely intellectual concept:

No one wants to die. Even people who want to go to heaven don't want to die to get there. And yet death is the destination we all share. No one has ever escaped it. And that is as it should be, because Death is very likely the single best invention of Life. It is Life's change agent. It clears out the old to make way for the new. Right now the new is you, but someday not too long from now, you will gradually become the old and be cleared away. Sorry to be so dramatic, but it is quite true.

Your time is limited, so don't waste it living someone else's life. Don't be trapped by dogma — which is living with the results of other people's thinking. Don't let the noise of others' opinions drown out your own inner voice. And most important, have the courage to follow your heart and intuition. They somehow already know what you truly want to become. Everything else is secondary.

When I was young, there was an amazing publication called The Whole Earth Catalog, which was one of the bibles of my generation. It was created by a fellow named Stewart Brand not far from here in Menlo Park, and he brought it to life with his poetic touch. This was in the late 1960's, before personal computers and desktop publishing, so it was all made with typewriters, scissors, and polaroid cameras. It was sort of like Google in paperback form, 35 years before Google came along: it was idealistic, and overflowing with neat tools and great notions.

Stewart and his team put out several issues of The Whole Earth Catalog, and then when it had run its course, they put out a final issue. It was the mid-1970s, and I was your age. On the back cover of their final issue was a photograph of an early morning country road, the kind you might find yourself hitchhiking on if you were so adventurous. Beneath it were the words: "Stay Hungry. Stay Foolish." It was their farewell message as they signed off. Stay Hungry. Stay Foolish. And I have always wished that for myself. And now, as you graduate to begin anew, I wish that for you.

Stay Hungry. Stay Foolish.

Thank you all very much.

Friday, March 16, 2007

Natural language

In this paper I am going to describe about my new prototype, for a new language I am developing. I am naming it as "Natural language" instead of bringing it under the term "Computer language". Because I believe a language should be used to express the ideas instead of implementing it. A language should be used to express the idea and tool should be used to implement it.

All existing computer languages are merely tools and not exactly a language. They provide syntax base to implement our ideas. For example, in order to compute the circumference or area of a circle, all we have to know is the formula and technique. We know that circumference of circle in terms of radius is "2 pi r" and area in terms of radius is "pi r square". If I want to express or calculate this using a existing computer language, for example C language, it goes like this:

main
{
float pi = 3.1415;
float radius = 5;
float area, circumference;

circumference = 2 * pi * radius;
area = pi * radius * radius;

printf("Circumference of the circle: %f\n", circumference);
printf("Area of the circle: %f\n", area);
}

or if the value of pi and radius, have to be received from the user:

main()
{
float p, radius, area, circumference;

scanf("%f", &p);
scanf("%f", &radius);

circumference = 2 * p * radius;
area = p * radius * radius;

printf("Circumference of the circle: %f\n", circumference);
printf("Area of the circle: %f\n", area);

}

so, here instead of expressing the idea, I am just implementing it. Otherwise, lets say if I write "scanf("%f", &p);" as "scanf("%f", p);", this is going to result in a big mistake, because this is due to syntax. Hence, when we want to express our ideas using existing languages, we need to know 2 fundamental concepts

1) what to express
2) how to express

But, How actually a language should look like is:

start:

to find circumference of the circle:
assume pi as 3.1415;
receive the radius from the user via console and store it in rad;
receive the diameter from the user via console and store it in dia;
now compute the circumference of the circle;
store this result in circumference;

to find the area of the circle:
assume pi as 3.1415
receive the radius from the user via console and store it in rad;
receive the diameter from the user via console and store it in dia;
now compute the area of the circle;
store this result in area;

display the output:
display the computed circumference and area via console;

end:

you may ask Why I have not put ";" in the end of the line next to "to find the area of the circle:", because there is no syntax in my language. It is all about ideas and expressions !

this is very easy, simple and straightforward, as this only talks about the idea instead of implementation. Though, one way this can be termed as implementation, there is no way you are going to bother about variables, syntax; etc.

To put it otherwise, if you make some mistake, you are going to end up only logical errors instead of logical plus syntax errors !!!

Thursday, March 15, 2007

OpenBSD's IPv6 mbufs remote kernel buffer overflow

OpenBSD's IPv6 mbufs remote kernel buffer overflow


Core Security Technologies - CoreLabs Advisory

Vendors contacted: OpenBSD.org

  • 2007-02-20: First notification sent by Core.
  • 2007-02-20: Acknowledgement of first notification received from the OpenBSD team.
  • 2007-02-21: Core sends draft advisory and proof of concept code that demonstrates remote kernel panic.
  • 2007-02-26: OpenBSD team develops a fix and commits it to the HEAD branch of source tree.
  • 2007-02-26: OpenBSD team communicates that the issue is specific to OpenBSD. OpenBSD no longer uses the term "vulnerability" when referring to bugs that lead to a remote denial of service attack, as opposed to bugs that lead to remote control of vulnerable systems to avoid oversimplifying ("pablumfication") the use of the term.
  • 2007-02-26: Core email sent to OpenBSD team explaining that Core considers a remote denial of service a security issue and therefore does use the term "vulnerability" to refer to it and that although remote code execution could not be proved in this specific case, the possibility should not be discarded. Core requests details about the bug and if possible an analysis of why the OpenBSD team may or may not consider the bug exploitable for remote code execution.
  • 2007-02-28: OpenBSD team indicates that the bug results in corruption of mbuf chains and that only IPv6 code uses that mbuf code, there is no user data in the mbuf header fields that become corrupted and it would be surprising to be able to run arbitrary code using a bug so deep in the mbuf code. The bug simply leads to corruption of the mbuf chain.
  • 2007-03-05: Core develops proof of concept code that demonstrates remote code execution in the kernel context by exploiting the mbuf overflow.
  • 2007-03-05: OpenBSD team notified of PoC availability.
  • 2007-03-07: OpenBSD team commits fix to OpenBSD 4.0 and 3.9 source tree branches and releases a "reliability fix" notice on the project's website.
  • 2007-03-08: Core sends final draft advisory to OpenBSD requesting comments and official vendor fix/patch information.

  • 2007-03-09: OpenBSD team changes notice on the project's website to "security fix" and indicates that Core's advisory should reflect the requirement of IPv6 connectivity for a successful attack from outside of the local network.
  • 2007-03-12: Advisory updates with fix and workaround information and with IPv6 connectivity comments from OpenBSD team. The "vendors contacted" section of the advisory is adjusted to reflect more accurately the nature of the communications with the OpenBSD team regarding this issue.
  • 2007-03-12: Workaround recommendations revisited. It is not yet conclusive that the "scrub in inet6" directive will prevent exploitation. It effectively stops the bug from triggering according to Core's tests but OpenBSD's source code inspection does not provide a clear understanding of why that happens. It could just be that the attack traffic is malformed in some other way that is not meaningful for exploiting the vulnerability (an error in the exploit code rather than an effective workaround?). The "scrub" workaround recommendation is removed from the advisory as precaution.
  • 2007-03-13: Core releases this advisory.

Release Mode: FORCED RELEASE

Vulnerability Description
The OpenBSD kernel contains a memory corruption vulnerability in the code that handles IPv6 packets. Exploitation of this vulnerability can result in:

1) Remote execution of arbitrary code at the kernel level on the vulnerable systems (complete system compromise), or;

2) Remote denial of service attacks against vulnerable systems (system crash due to a kernel panic)

The issue can be triggered by sending a specially crafted IPv6 fragmented packet.

OpenBSD systems using default installations are vulnerable because the default pre-compiled kernel binary (GENERIC) has IPv6 enabled and OpenBSD's firewall does not filter inbound IPv6 packets in its default configuration.

However, in order to exploit a vulnerable system an attacker needs to be able to inject fragmented IPv6 packets on the target system's local network. This requires direct physical/logical access to the target's local network -in which case the attacking system does not need to have a working IPv6 stack- or the ability to route or tunnel IPv6 packets to the target from a remote network.

Vulnerable Packages

OpenBSD 4.1 prior to Feb. 26th, 2006.
OpenBSD 4.0 Current
OpenBSD 4.0 Stable
OpenBSD 3.9
OpenBSD 3.8
OpenBSD 3.6
OpenBSD 3.1

All other releases that implement the IPv6 protocol stack may be vulnerable.

Thursday, March 01, 2007

Sorting in ASM - Non Optimized snippet

# sorting - no optimized snippet

.section .data
list: .long 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
dis: .ascii "\0\0\0\0\0"
newline: .ascii "\n\0"
space: .ascii " \0"
bsm: .ascii "Before sorting ... \n\0"
asm: .ascii "\nAfter sorting ... \n\0"

.section .text
.globl _start

_start:

pushl $bsm
pushl $20
call _printstr
addl $8, %esp

movl $10, %ecx
movl $0, %edi
bs:
cmpl $0, %ecx
je end_bs

movl list(, %edi, 4), %eax
# print the list
# *****************************************
pushl $dis
pushl %eax
call _int2str
addl $8, %esp

pushl $dis
pushl $1
call _printstr
addl $8, %esp

decl %ecx
incl %edi
jmp bs
# ****************************************
# end of print list

end_bs:

pushl $list
pushl $10
call _sort
addl $8, %esp

pushl $asm
pushl $21
call _printstr
addl $8, %esp

movl $10, %ecx
movl $0, %edi
as:
cmpl $0, %ecx
je end_as

movl list(, %edi, 4), %eax

# print the list
# *****************************************
pushl $dis
pushl %eax
call _int2str
addl $8, %esp

pushl $dis
pushl $1
call _printstr
addl $8, %esp

decl %ecx
incl %edi
jmp as
# ****************************************
# end of print list

end_as:
pushl $newline
pushl $1
call _printstr
addl $8, %esp

call _exit


.type _sort, @function
_sort:
pushl %ebp
movl %esp, %ebp
subl $20, %esp

# -4 = outer loop counter, -8 = = inc of 4, -12 = addr1, -16 = addr2, -20 = main loop

movl 12(%ebp), %esi # address of the list
movl 8(%ebp), %edi # number of items

movl $0, -8(%ebp) # incrementer of 4
movl $0, -12(%ebp)

movl %edi, -4(%ebp)
movl %edi, %ecx # outer loop counter
movl %ecx, -20(%ebp) # main loop counter

main_loop:
movl -20(%ebp), %ecx
cmpl $0, %ecx
je end_main_loop
decl %ecx
movl %ecx, -20(%ebp)

movl 12(%ebp), %esi
movl 8(%ebp), %edi

movl %edi, -4(%ebp)
movl %edi, %ecx
movl $0, -8(%ebp)

outer:
movl -4(%ebp), %ecx
cmpl $0, %ecx
#je end_outer
je main_loop

decl %ecx
movl %ecx, -4(%ebp)

movl -8(%ebp), %edx
addl %edx, %esi
movl (%esi), %eax # retrieve data
movl %esi, -12(%ebp) # store addr1

cmpl $0, -4(%ebp)
je yes
addl $4, %esi # next address jump
movl (%esi), %ebx # retrieve next data
movl %esi, -16(%ebp) # store addr2

movl 12(%ebp), %esi # restore base address

cmpl %eax, %ebx
jl less
jmp not_less
less:
xchg %eax, %ebx
movl -12(%ebp), %esi
movl %eax, (%esi)
movl -16(%ebp), %esi
movl %ebx, (%esi)
movl 12(%ebp), %esi # restore base address
not_less:

yes:
movl -8(%ebp), %edx
addl $4, %edx
movl %edx, -8(%ebp)

jmp outer

end_main_loop:
end_outer:
movl %ebp, %esp
popl %ebp
ret



.type int2str, @function
_int2str:
pushl %ebp
movl %esp, %ebp

# store original registers
pushl %eax
pushl %ebx
pushl %ecx
pushl %edx
pushl %esi
pushl %edi

movl 8(%ebp), %eax # original number
movl $0, %ecx # count, for length of the string
movl $10, %edi # the divisor, base

start_conversion:
movl $0, %edx
divl %edi
addl $'0', %edx
pushl %edx
incl %ecx
cmpl $0, %eax
je end_conversion
jmp start_conversion

end_conversion:
movl 12(%ebp), %edx # stores the address of the buffer

start_reversing:
popl %eax
movb %al, (%edx)
incl %edx
decl %ecx
cmpl $0, %ecx
je end_reversing
jmp start_reversing

end_reversing:
movb $0, (%edx) # null terminating character

# retirieve original registers
popl %edi
popl %esi
popl %edx
popl %ecx
popl %ebx
popl %eax

movl %ebp, %esp
popl %ebp
ret

.type printstr, @function
_printstr:
pushl %ebp
movl %esp, %ebp

# store original registers
pushl %eax
pushl %ebx
pushl %ecx
pushl %edx
pushl %edi
pushl %esi


movl $4, %eax
movl $1, %ebx
movl 12(%ebp), %ecx # the string
movl 8(%ebp), %edx
int $0x80

# retirieve original registers
popl %esi
popl %edi
popl %edx
popl %ecx
popl %ebx
popl %eax

movl %ebp, %esp
popl %ebp
ret

.type _exit, @function
_exit:
pushl %ebp
mov %esp, %ebp

pushl %eax
pushl %ebx

movl $1, %eax
movl $0, %ebx
int $0x80

popl %ebx
popl %eax

movl %ebp, %esp
popl %ebp
ret

Friday, February 23, 2007

Linux: 2.6.20 Kernel Released

From: Linus Torvalds [email blocked]
To: Linux Kernel Mailing List [email blocked]
Subject: Super Kernel Sunday!
Date: Sun, 4 Feb 2007 11:10:36 -0800 (PST)


In a widely anticipated move, Linux "headcase" Torvalds today
announced the immediate availability of the most advanced
Linux kernel to date, version 2.6.20.

Before downloading the actual new kernel, most avid kernel
hackers have been involved in a 2-hour pre-kernel-compilation
count-down, with some even spending the preceding week doing
typing exercises and reciting PI to a thousand decimal places.

The half-time entertainment is provided by randomly inserted
trivial syntax errors that nerds are expected to fix at home
before completing the compile, but most people actually seem to
mostly enjoy watching the compile warnings, sponsored by
Anheuser-Busch, scroll past.

As ICD head analyst Walter Dickweed put it: "Releasing a new
kernel on Superbowl Sunday means that the important 'pasty
white nerd' constituency finally has something to do while the
rest of the country sits comatose in front of their 65" plasma screens".

Walter was immediately attacked for his racist and insensitive
remarks by Geeks without Borders representative Marilyn vos
Savant, who pointed out that not all of their members are either
pasty nor white. "Some of them even shower!" she added, claiming
that the constant stereotyping hurts nerds' standing in society.

Geeks outside the US were just confused about the whole issue, and were heard wondering what the big hoopla was all about. Some of the more culturally aware of them were heard snickering about balls that weren't even round.

Linus

---

Shortlog since 2.6.20-rc7. Fixes, fixes.

There's a full ChangeLog together with the tar-ball and patches, but let
me just summarize it as: "A lot of stuff. All over. And KVM."

I tried rather hard to make 2.6.20 largely a "stabilization release".
Unlike a lot of kernels lately, there aren't really any big fundamental
changes to some core infrastructure area, and while we always have bugs, I
really am hoping that we fixed many more than we introduced.

Have fun. And remember: the thousandth decimal is, of course, 9. There
*will* be a test on this afterwards.


Adrian Bunk (1):
[NETFILTER]: nf_conntrack_h323: fix compile error with CONFIG_IPV6=m,
CONFIG_NF_CONNTRACK_H323=y

Al Viro (12):
netxen patches
fix frv headers_check
mca_nmi_hook() can be called at any point
ide section fixes
endianness bug: ntohl() misspelled as >> 24 in fh_verify().
fork_idle() should be __cpuinit, not __devinit
__crc_... is intended to be absolute
efi_set_rtc_mmss() is not __init
sanitize sections for sparc32 smp
radio modems sitting on serial port are not for s390
uml-i386: fix build breakage with CONFIG_HIGHMEM
fix rtl8150

Alan (3):
pata_atiixp: propogate cable detection hack from drivers/ide to the new driver
pata_via: Correct missing comments
libata: Fix ata_busy_wait() kernel docs

Andrew Morton (2):
pci: remove warning messages
revert blockdev direct io back to 2.6.19 version

Auke Kok (1):
e100: fix napi ifdefs removing needed code

Avi Kivity (1):
KVM: fix lockup on 32-bit intel hosts with nx disabled in the bios

Bartlomiej Zolnierkiewicz (1):
via82cxxx: fix typo ("cx7000" should be corrected to "cx700")

Bob Breuer (1):
[SPARC32]: Fix over-optimization by GCC near ip_fast_csum.

Brian King (1):
libata: Initialize nbytes for internal sg commands

David C Somayajulu (1):
[SCSI] qla4xxx: bug fixes

Evgeniy Dushistov (1):
MAINTAINERS: ufs entry

Frédéric Riss (1):
EFI x86: pass firmware call parameters on the stack

Guillaume Chazarain (1):
procfs: Fix listing of /proc/NOT_A_TGID/task

Haavard Skinnemoen (1):
Remove [email blocked] from MAINTAINERS

Jean Delvare (1):
via quirk update

Jeff Garzik (1):
x86-64: define dma noncoherent API functions

Jens Osterkamp (1):
spidernet : fix memory leak in spider_net_stop

John Keller (1):
Altix: more ACPI PRT support

Kai Makisara (1):
[SCSI] st: A MTIOCTOP/MTWEOF within the early warning will cause the file number to be incorrect

Ken Chen (1):
aio: fix buggy put_ioctx call in aio_complete - v2

Lars Immisch (1):
[NETFILTER]: SIP conntrack: fix skipping over user info in SIP headers

Li Yewang (1):
[IPV6]: fix BUG of ndisc_send_redirect()

Linus Torvalds (3):
Revert "[PATCH] mm: micro optimise zone_watermark_ok"
Revert "[PATCH] fix typo in geode_configre()@cyrix.c"
Linux 2.6.20

Magnus Damm (1):
kexec: Avoid migration of already disabled irqs (ia64)

Matthew Wilcox (1):
[SCSI] Fix scsi_add_device() for async scanning

Michael Chan (1):
[BNX2]: PHY workaround for 5709 A0.

Mike Frysinger (1):
alpha: fix epoll syscall enumerations

Nagendra Singh Tomar (1):
[SCSI] sd: udev accessing an uninitialized scsi_disk field results in a crash

Neil Horman (1):
[IPV6]: Fix up some CONFIG typos

Patrick McHardy (5):
[NETFILTER]: xt_connbytes: fix division by zero
[NETFILTER]: SIP conntrack: fix out of bounds memory access
[NETFILTER]: xt_hashlimit: fix ip6tables dependency
[NET_SCHED]: act_ipt: fix regression in ipt action
[NETFILTER]: ctnetlink: fix compile failure with NF_CONNTRACK_MARK=n

Peter Korsgaard (1):
net/smc911x: match up spin lock/unlock

Randy Dunlap (2):
[MAINTAINERS]: netfilter@ is subscribers-only
sysrq: showBlockedTasks is sysrq-W

Tejun Heo (1):
ahci/pata_jmicron: fix JMicron quirk

Vlad Yasevich (1):
[SCTP]: Force update of the rto when processing HB-ACK

Friday, November 03, 2006

Power of 2 - Computation

Computing to find whether the number is power of two :

Problem:
The role of Power of 2 numbers are significant in science. We can very well understand the applications of these numbers in implementing Filters, implementing Fast Fourier Transforms (FFT). To exactly find the importance of Power of 2 number in FFT:

Question:
How can you correctly scale the output of the FFT function to obtain a meaningful power versus frequency plot?

Answer:
Assume "x" is a vector containing your data. For the fastest possible ffts, you will want to pad your data with enough zeros to make its length a power of 2.

Like this the significant use of these kind of number grows. There is also a famous Proof by Jeff Shallit that "the sum of the divisors of N (denoted by s(N)) is a power of 2 if and only if N is a product of distinct Mersenne primes".

Considering this, I will explain one feasible method to identify the power of two numbers.

First, taking numbers from 1 - 65536, only the following numbers are power of 2

1
2
4
8
16
32
64
128
256
512
1024
2048
4096
8192
16384
32768
65536

The following are the binary representation of those.
(16 bit representation)

00000000000000001 - 1
00000000000000010 - 2
00000000000000100 - 4
00000000000001000 - 8
00000000000010000 - 16
00000000000100000 - 32
00000000001000000 - 64
00000000010000000 - 128
00000000100000000 - 256
00000001000000000 - 512
00000010000000000 - 1024
00000100000000000 - 2048
00001000000000000 - 4096
00010000000000000 - 8192
00100000000000000 - 16384
01000000000000000 - 32768
10000000000000000 - 65536

Thus it reveals that the bit '1', left shifts to one position in every consecutive number, when the number is a power of 2.
Now when analyzing the former number, we can represent it as:

00000000000000000 - 0
00000000000000001 - 1

00000000000000001 - 1
00000000000000010 - 2

00000000000000011 - 3
00000000000000100 - 4

00000000000000111 - 7
00000000000001000 - 8

00000000000001111 - 15
00000000000010000 - 16

00000000000011111 - 31
00000000000100000 - 32

00000000000111111 - 63
00000000001000000 - 64

00000000001111111 - 127
00000000010000000 - 128

00000000011111111 - 255
00000000100000000 - 256

00000000111111111 - 511
00000001000000000 - 512

00000001111111111 - 1023
00000010000000000 - 1024

00000011111111111 - 2047
00000100000000000 - 2048

00000111111111111 - 4095
00001000000000000 - 4096

00001111111111111 - 8191
00010000000000000 - 8192

00011111111111111 - 16383
00100000000000000 - 16384

00111111111111111 - 32767
01000000000000000 - 32768

01111111111111111 - 65535
10000000000000000 - 65536

Clearly this shows that if we AND the number say "x" with "x - 1", we should get 0, if the number "x" is a power of two.
Now let us take a number, say 700, which is not a power of two.

699 - 1010111011
700 - 1010111100
----------------
696 - 1010111000 -> 699 & 700 => 696 != 0

Thus, the number "700" AND "699" will not be 0, hence the number 700 is not power of 2, which is actually not. You take any number, which is not power of two, the above rule will apply.

Thus this method is comparatively fast to compute the powers of two, instead of using loops.
Looping brings the linear complexity. I have also profiled both methods and find results:


General Method:
Avoids bitwise and uses loop, to find whether the number is power of 2 or not.

Snippet:

main()
{
int Number = 65536, Power = 1, i = 0;
for(i = 0; Power < Number+1;)
{
Power = pow(2, i);
if(Power == Number)
{ printf("%d is Power of 2\n", Number); }
i++;
}
}

Time:

To find number, which is power of 2 (Sample given 65536): 0.002 ms
To find number, which is not power of 2 (Sample given 65535): 0.001 ms


Bitwise Method (2's Complement):
Avoid using loops and use bitwise method.

Snippet:

main()
{
int Number = 65536;
if((Number & (Number - 1)) == 0)
{ printf("%d is Power of 2 \n", Number); }
}

Time:

To find number, which is power of 2 (Sample given 65536): 0.001 ms
To find number, which is not power of 2 (Sample given 65535): 0.001 ms

Thus we save 0.001 ms to find the number and also we avoid looping, one extra variable (actually one memory reference!).

Profiling System:
System: Pentium IV 1.86 Ghz, 512 MB DDR and 40 GB Hard drive.
OS: Fedora Core 4 with gcc

Tuesday, May 30, 2006

0's and 1's

0's and 1's represents the DNA structure of a code.

9216 bits forms a Hello World! program. The following bits are required to make a Windows console print "Hello World!".

01001101010110100000000000000001000011000000000000000001000
00000001000000000000000000000000000001111111111111111010010
00000000011000000000000000000000000000000000000000000000000
00000000000000000100010000000000000000000000000000000010000
00001111101100100000011100100110101000000001000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000001011101000000000000000010010111010
00100100010110111110000000000110110100001100001100110100100
00110001011001011100000001000000000100010110001111000101100
00000000100011101101101010100011100100100000000010001100000
00110100100000000000010001001000111101000110000000000100010
01001011101010110000000000110001110000011010010110000000001
11111111111111111101000001101000000000111000100001111101000
10100000000010001011110001111000101111011000101110011111111
10111111100100110100000010011110100111000001101110111010100
01100100100110100010110101010100000010100000001111101000111
10101110101000100001000000011100110110111111111111100000110
10010110000000001000000011111110010110010111010100000100111
11111000001101001011000000000111100101010111011100011011000
01010000110010011000111000000001010111010111010110100000001
10011011000000011110111110110011000100100001110100010100000
00001011100100000001000000001101001111100011100000111100001
10000100010000011111000111111100010001001000111101000111000
00000010001100110110100010101111101010100010110011111000001
00000000010100000011111111100000000000000100111001100000111
10111111000000000000001010001001001111100000100000000010100
00001110001110111010000000100011100100010100000000011001111
10000001100000001001110010001000101011000100000100110100111
11011110100011100111011111011110111001000011001100000110011
11100000100000000010000000000111010000000111100000110011111
00000011000000010000000000111010100001110101111110000000000
01000000111011111011110111011100000111100010111111110111101
01100000011111010010010000100000001100010111101111100000011
11011010100010010001111010100100000000001000100100011110101
01000000000001010000110010000000000000010101111011000100011
10110000001011010001001010010101111100110100100001010111111
10100111110011111111010100011101101001010001011111001111111
10110011001111000000001011101000111000000110111110000000000
11011111100101110000001001011100101110100000001000010101111
00111111110011101010100000111011111111000101100010000000000
10011101000011111010000000111101000011001010000001010110100
00000000110011010001101010001001000101101001100000000000100
01001000011101001101000000000111111110001011000100100000001
00111111110011011010001000000000001111111100110110100001100
00000001111111100110110100001000000000011101000110111010000
00000101000011101000001000100000000100101110100011100001111
01111100000000001111010000111110000000000000011101111111100
01011000100010000001000011001111000000100010111111000010111
00100101111000000001001000011111100000000100000010010000000
11010100000000000100011011100010111110000010110100110111000
01101100100000111010000001010101110010001100100000000100100
00101110100010111100000000111010001000101100000000100010111
11011001011010001001100100010100100011000000010110011010010
00011011100100001110000000001001000010111010010010000000000
01110100110000111000000000001111010111000000000000011010111
00110100100001100010010001111001110100000000001000110000000
11001110110000000001011100000000100001101011100110100100001
10001001000111100111100000000000100011000000011001111010000
00000101110000000010100110101110011010010000110001001000111
10011111000000000010001100000001100111111000000000101110000
00001100011010111001101001000011000100100011110100000000000
00001000110000000110100000100000000010111000000000000010010
11000110011001010100011101101101010111010010110000000000111
00110100100001000111111100001100011110101110000000000000100
10111000101000101100111010000000000110011010010000100011111
00011110101110000000010000100101110001010001011001111000000
00000110011010010000100011111000111101011100000000101001001
01110001010001011001111100000000001100110100100001000111110
00111101011100000000110001001011100010100010110100000000000
00001100110100100001000111111100001111000111000001101001011
00000000000000000000000001100101111000011101101000100000010
11101100000010000000001100110100100001110000111011100100011
11000000000100100001011101001010110000000000010111010001110
00011110111110000000000111101000111010011111111110111000000
00011000000000101000011101000001010011111111100000000000000
00010101011000101111101100101110001001010000000001010100001
11010001010011100000110010110010101110111000011010101011000
10111110110001010110100010110111011000000100000010111111011
00111110000010100100000111111111001011000011101100000001110
11111001010111000000001000100100110110101001000000000110001
01010000100101001100000000110011000100101101110101100001101
11110111110111101000001111111110001000110111011111101010110
00111000001101010010000000001111111111111111110001011110001
10101000111001010000000000101110001111111111111111111010110
00000000101111001011101110000100000001000000000110000110101
01011000101111101100111010110000101010001011000111100000101
00000001011010001111000111111111110010111001011100000010010
10000100001010000000101111111100001110000010100000001000001
01111000000011101011110101111111111000101100000000000000010
11111111000101100000001000000010111111110001011000000100000
00010111111110111011000000100111010001011001011111110010110
01010111011100001100000000000000000000000000000000000000000
00000000010111010001111000001100111001000000010001011101000
11000001111001110100000000101111110010001110000001101001000
00000000010111110100000000000000000110010111001000010011010
10110001000000100011001100010110000111110101101001001110001
01100110110100010100000000010000011110001100000001010111001
00000001000000001000000000111110100100100000000000000011011
10010000100011000111000000110100011000000000010001011111111
10101100010111111100110010110000001111001010101110111000110
11101101000000011110001011111111000001111101100000000101011
10000000000100000000000000111100001100000011110000010010010
11111111011111111100010111111110000101011111110000111001001
10000010001011111001111000110011000000100011101101100010001
10011010000100011101100000001010001010010011111001110100100
00110010110000001010101010001110110111011000011111110010100
00111110110011000101111000011100010111101000001000011111010
00000110010000000001110111000001110111001001000000111010000
00100100000000001110111111110010011110000100000011101000000
10000011110000001101011101000000010000111100000010010111010
11110100000110010110000001110101111100100000010111100000001
11010000000111010000101010101000001010110000000111010100000
00101000011100001101110000000110010110000001111100111100011
00010101101011000100100100101100001000100111010000001111000
00100001000100011110001011100011101010000011110000000001111
00001000100111010100000010101011000100100100001011111101101
10000111110100110110110111111100101100100000011110010100010
11101000111000011110011101000000001010001001000111101000010
00000000001000011000000111101101110001011111101001000101111
10110000101011111010110111001011100110100010111110010110001
00100101110100001100000000011100011000011101000100101110110
00000000100000111100010100000010001101101010110000001010110
00000111000001111101001110100111100000011001111000000100010
01010001100000000000101110111111110010011001110010000000101
00010110000111010001010000000000101000111101000010001110000
00010101100110001011111110000000101111000000011101000010010
00001111000011110000001111000111000011110100011000000000000
11001111110110111111001111001110100100000111111000101111111
00000000110111111110011011010001110000000001110100000101001
00000001100000111100010000000010100010111101100000000111101
00011100010000000000000001011110000000111010100000011111010
01010010011111111000110011110000001011100111111111111111111
00010010011111110000011110000110000001011110010101011100010
01100011100000000101011101011111010010001001000001111100001
10101010110001011111011001000001100111110000010100000001000
10000001110101000001011011100000000001000000001110101100010
10110001011010001100000010010001011000111100000101000000010
11010001111000111000100110000111001011100000010011111111000
00110000010100000001000110011110000001110101100000000010111
01110000110101010110001011111011000101011001010111100010110
11111100000010010001011010001010000011010100011011100000000
01000011101111000111011101010000100011000111000001100111000
00000010000000000000000001110101100010000100010110111010100
00010010001011000111100111000000000100100010010111011100000
10010100001011100000000010010001001010001000000011001011111
01011110010111011100001101010101100010111110110001010110010
10111100010110111111000000100100010110100011000000110001010
01000001011000101100110101000000111111011110001011010001100
00001100100000010001001000001001000100101111100000000101010
00010110111000000100001110111100011101110101000001101000100
10011011001101110000001001110101100001000100010111111111000
00001101111110000001101000100101110101000000101000101111000
11000000101000001000000000011101011000000000101111101011110
01011101110000110101010110001011111011000101011010001011010
00110000001000011001111010010001001011111111111111111100000
01111000100000000000000000010100100101000011101000111110010
00000000101100101011001100010111111000010000011111111101111
11110111010100000100001100111100000011101011000110001010000
10110111000000100100010010100010000000010100010110100011000
00010001000000100010010000010010001001001101100110111000000
10010100001011011100000010000000101000001000000000011101011
00000000010111100101110111000011010101011000101111101100010
10110100010110100011000000100001100111101001000100101111111
11111111111000000111100010000000000000000001010010010100001
11010001011110000000000010110010101100110001011111100001000
00111111111011111111011101010000010000110011110000001110101
10001010110001001001101100111001000000100100010010011011001
10111000000100100010110100011000000100010000001000100100000
10010001011110001100000010100000100000000001110101100000000
01011110010111011100001101010101100010111110110001010110010
10111100010110111111000000100000010111111111101110100000001
01100000111111111111110100011101100000010000110011110000001
11010110101101010001011110001110000010100001011000000000010
01011111100011111111100010111111100010000011001111100111001
00000010000000000011101010000011101010111111010001001110011
11111101011001111010110100001010001011001101100111000000000
10010001011110001100000101111000000011101000011000110001011
00000100100010111101011110000011110000100010100000111011110
00010011100100000100101010111010101101110100000001000111111
11010110010101100111101011001001001000101100000100001110111
10001110111001000001110010101101110100011001100111111100101
10011111111100000100100010111100011000000101000001000000000
01110101100010000100010110111010000000110001110110011011001
11000000000100011101011100111101010111111010000001110111111
11101011001111010110000000001011111010111100101110111000011
01010101100010111110110010001011010001100000010010001011110
10100100000011110101000000000000000010011101111000010011100
11000001111010001110011110000000000011001111000000111010110
00010111100011100000110100101000000000000001000000000001011
10001111111111111111111010110000000001011101110000110101010
11000101111101100100010110100011000000100100010110101011000
00011000000011000001101001111000000000100000111101001000000
00010001011110010001000000111000001000000000000000110000011
11010010000000000000101111010010011101010000101000111011110
01100011100110000011010000111000001101001111000000000111010
11000010111100011100000110100101000000000000001000000000001
01110001111111111111111111010110000000001011101110000110101
01011000101111101100111111110111011000000100111010001001111
11111111101011001111010110000000001011101110000110101010110
00101111101100100010110100011000000100100110010101001001010
00011101000101100101111111110001011111001011110101100000000
01011101110000110101010110001011111011001000000111101100100
01010000000000101011001010111100010110100011000001000010000
00001111010000001000000000011100110000010100110011110000001
11010011111011000000000100010110101111000000100110100011110
00111111011110000111010011000000001100000000100000000111010
00001001011111111011101100000100011111111011101100000011011
11111101110110000001001110100011100011000000001000001111000
10000000110111010011101011100000000100010110101111000000100
11010001111000111000000110100111010011000000001111111111111
11101100010110100011000000110100010011000011001111100111111
11100010110100011000001000100010011000011001111000111111111
00011011011011001111110111111111110101101101101111111111000
11100111100011111111100010111001111001111100111111111111111
11000011001111100111111111000101000000111100010001000011001
11101111111111001111000000101001110101000001001100011000000
10000001101010001101000101010000110011110111111111110001000
00000100010001101000110110000110011111101111111110001011110
10110001010111101000010000001111110101000000000000000011111
00001111101000110110000110011111101111111110001011111111100
01010111111100001010111100011011000011001111110111111110101
00001111111101110110000001001110100001111011000000001000001
11100010000000110100010011000011001110110111111110011101111
00011101110100000110111000001110111110011101101111111100000
00001110011000001011011100011111111111111111110101100001101
10001011010001100000100000101011100001100111100011111111000
00011100001100111011011111111001010111100011111101011010011
11100011011011011001111110111111111000001110111110011110001
11111110000000001110100000000111110100110001001111111111000
11011000011001111110111111111000101111111110001010111111100
01000101111000111000010111100000001110110001011100101011110
00110110000110011111101111111101010000111111110111011000000
10011101000001011010000000010000011110001000000011010001001
10000110011101101111111100111011110001110111010000010111100
00011101111100111011011111111000000000111001100000101101110
00111111111111111111101011000010011000101101000110000010000
00000111000011001110110111111110010101111000111111010110000
01011000101101000110000010001110101100000000010111110101111
01000101111100101010111011100001101010101100010111110110010
00101101011110000001001101000111100011111101111000011101001
10000000011000000000000100001110100000100001011100000000010
00000000010100000011001111000000010100000101000011111111011
10110000001001110100000101000000000001000101111100101101101
00010000001000101101011110000001001000101101001110000010001
00010110101011000000110110011010010000101110010000011110101
00001000101101011110000001001101000111100011100000011000111
10100110000000011000000000001000001011000111010110000011001
01000011101000000101011111101111101011000000000101110111000
01101010101100010111110110010001011010111100000010011010001
11100011100000011010011101001100000000111111111111111101101
10100010000101000101001000110000010101000101101011110000001
00100010110100111000001000100010110101011000000110110011010
01000010111001000000010111010110000011101010000111010001110
10111111101010011001111010110000000001011101110000110101010
11000101111101100100000111110110000100010010101100101011100
00011010001011011111100000101000011110000001111000101101011
11000001000100000111111101100100100011101110101100010000000
11111011000000100111001001010011100010110100011000001100100
01011010011100000111000001011110010010111110100010001100000
00011111100000011000000000011101000000101111000110000001010
01011010100011111110111110110011111011111011000100000111101
10010000000010001101011101101101111011100011000011111001000
10010101111010010111101111111001110010001111101111111001110
00100000010100010001101110001100001001111010111111000100101
01111010010111101111111001110001000000101000100011000001011
11000000011101011111010110001101010011101101111011110111110
11001000000111100111011111100010011101000101000000100001011
00000010100111001100000100000001000011101011101011000000110
00000100100011000000100101010101110001011101111101100000000
00001010101000000111100010110100011000001010111010110000000
00101111101011110100010111110010101011101110000100000110000
00000001010101100010111110110010000011011111100000100000001
01001110101000001101000101101000110000001001001100111101011
00000101100010110100011000000100001100111101001001010010010
10000111111110111011000000110111111110111011000001000101100
00000000010101000010110000011000010101000011101000010111001
11111111110101100000000010111011100001101010101100010111110
11001111111101110110000001101111111101110110000001001111111
10111011000001000111111110111011000001010101100000000000001
01000010110000011000010101000011101000010000001111111111101
01100000000010111011100001101010101100010111110110011111111
01110110000001101111111101110110000001001111111101110110000
01000111111110111011000001010100000110111111000001010000010
10011101010000010110111000000000010000000011101011000000100
01100111100000001010000101100000110000101010000111010000001
10011111111111101011000000000101110111000011101110100111010
00000001111101011000000111011101001111001000000111011100100
00010100000000100100001011010001000000101110110000001000000
00011001101001000011011100100100111000000001001000010111010
01111110000000111011010001000000110011010010000111101001101
10101111110010101010110001011111011000101011001010111100010
11011101100000010010001011010001000000111000111011110001100
11101000000010110111000111111111111111111101011011001101000
00110011110000000000011111000010110111110111010001000000001
00000100000000000011101010000110010001011010001000000101010
00101111010110100000111100001000000101001110111100001001110
10100010110110001110000010000000000000000001000101101000100
00001010100010111101011010000011110000100000010100111011110
00010011101010000011010001011010001000000100010001001010001
00000010100011001111000000111010110011010010001011011111000
00001100000001100111100010001110010100100111100010101111000
10110100010000001000100010010100010000001010010100001000101
00100010000000100100110000101000011101000000100101111110110
00001111000100000001100011101111000111011101000001000111110
11101000100000000100000000000000010011101010000101010000001
01001100000000100001000000000000101110001111111111111111111
01011000001000011001111000000111010110000000001011111010111
10010111011100001101010101100010111110110010111000111000010
00010010101000010111000000111000000001001010000111111110111
01100000010010001101010001100000011001010000111010000001001
10000001011101011000000000101110111000011010101011000101111
10110010001011010111100000011011111111000011111111111101110
11000000110100010100100011000000100100110000101000011101000
00000110000000001000101111100101111010110000000001011101110
00011010101011000101111101100100000111110110000000010010101
10100010110111011000000110100010100100011000000100100010000
10001101111111111111111000001000111110100110110100010100100
01101111111111111111010001000000101010001011010111000000101
01000100001000111111111111111011101000100000000100000100000
00000001110100000110111000000001111110111111110000101001110
10000000110100000000111111011111111000011010111010100001111
01010110111010000001100111111111010110010000101111000000011
10100000001101011100011111111111111111110100110100111000000
00100010100100011011111111101101000000000011101001100111110
00000001111111100001100111101110100010000000010100100000000
00000111010100000111111101110100010000000010000000100000000
00111010100001011100000010100110000000010000100000000000010
11100011111111111111111110100110000100000000001000000101001
10000000010000000000000000110000011011111000000011000000000
01110100001001001000001100111100000000000111010000010000010
10110111010001101011111111110010110010000101111000000011101
00000001011011100011111111111111111110101101100110111010110
00010101000101101000100000001101011101011111111111111110010
10111101000010001001000101001110100101111110111111111110101
10101010110000000011111101111111100001010011101010001111111
11011101000100000000100100000000000000011101010001100010111
00000000001000000000101000010111000101001100000001101010000
10001010010001000000010010011000010100001110100000100010111
11101100000111100010000000110001111010000000100000000011101
01000110001011100000000001000000000101000010001101010001100
00001000101000010001010010001000000010010011000010100001110
10000000101011111101100000111100010000000110001111010000000
10000000001110100000100011111011101000100000000100000000000
00001001110101000010101000000101001100000000100001000000000
00010111000111111111111111111101011000001111000101001000110
11111111101101000000000011101011000000000101111010001011111
00101010111011100001101010101100010111110110001010110100010
11011101100000010010111000000111000000001001010000010101101
11010000000001111111111010110010101100111101011000000000101
11100101110111000011010101011000101111101100100000111110110
00000001001010110010101111000101101110110000001001000101101
11111000000110100010010111111011111110111101110100010000000
01000001000000000000111010000100110111010110001101001010110
10001011010111100000100011111111010001100000100010001010000
00111100110000101000011101000110101001111111001011001010110
01001111011111111111111111011101010000010100110011110000001
11010011000011100000000100010111100011101001111000010111100
00000111010111011111111010010111100000000000111101110100010
00000001001000000000000000111010000111000100000110111110000
00011000000000011101000011001010001011010001000000011000111
01111000111011100110010101110000011001111000000000001110100
00001101010101101110100011110001111111010101100100001011110
00000011101000000010000110011110000001110101101010111010101
11111111110111011000001000100010100100010000000100100110000
10100001110100001011111111111001000001111000100000001100011
10111100011101110011000001000011001111000000111010110100000
01110101100111001111010110011000011111111000001000111110100
01010110001011010111100000100011111111010001100000100010001
01000000111111111110100010000001010100010110101110000001010
10001000010001111111111110110100000000001110101100001110010
10110100010110101111000001000111111110100011000001000111111
11001101111110100000111111111111100101100101011001001111011
11111111111111101110101000001000011001111000000111010110000
11001000101111000111010011110000101111000000011101011100100
11000101101000110111111101110101100000000010111110101111010
00101111100101010111011100001000000110000000001111111100100
11000100110000001000101010110001011111011001000101101010110
00000100101110010000010000001111101110111010111100000011111
11100100010101100011011010010111010001101011110101010100010
10110001100010001011000101110101111010101010001010110000101
10100101110100011010111101010101000101011000010001000101100
01011101011110101010111010110000000001011101110000100000001
00000000001010101100010111110110010000001111011001001100000
00000001010110010101111100011101000110101010000000000000000
00011000110010001101010101101010000110001110100011011111110
00000000000000001110101101000001010101111011100111111111111
11111001100101100000011110010101011101111011111010001010010
01010111111100001110001000000001010100011111111110010011101
01010110111111000101011010100110101000101010010000001101000
11010100011010101100001010111111100010001101010001101010110
00101000001010111111111110111011000001000111111110101011000
00101000001011110000000111010100000101110001110100011011111
11000000001000000001100011001000110101010110101000000000001
01111110101010001000110101111110101011000000011101011010010
11001010110111100001100000110111111001000110101111110101011
00100010011011111001101010111111111000101110111110011010101
11111111000101101110110000001101010110000001010110000000111
01000001000100111100001001010111010000010000100010000000010
10100011111111110010011101010101101111111111011111110100010
11000011111111111010111110101011101001011111000000010010001
00110110110011101101111111110101100001111000010010101110100
11100111100010011011111001101010111111110011001111001001100
01001100011100111010011111111100010011000111001101000111111
11100010001000111001110011111111111100011110000110011011101
11111111111111111111111110001111000011001110000111111111111
11111111111111101011000000011010110000110010111001001000101
11101000010001011110110001000000011101011001000001000000011
11101101100000011100110100011110001010100111111011111100000
01110001011110000110011110100010111000000000111011000000011
11101001001001000000010010001011110110001101000111100011001
01110111111111010011110100101000010111111000000001011110110
00000010110011000100001100111001000000101101010110000011000
11000000000110010100010000011001010110000001100101111000000
11000001011100001100111100010000110011001100000011001101000
00000110011010100000011000111011000001101001010000000111011
00100100001101111010010000110110010011000011111100000000001
11111000000000011111100000000001111000000110000110000001101
00001100111010011110100000000011100000001111110100000000011
10111111110001000001110001110011010001111111100000001111010
11100110111000000011111101000000000111011111101100100000111
00011100110100011111111000000101110101110001111100000001111
11010000000001110111111000001000000010111110011100111111111
10010101101110100000001001000100010010110011100111111111111
10100101111100111111111000001110100110011010001111111111011
11110110101000001011110100101110010111111111000001110001110
01101000111111110010000010110101000001011110100101101000111
11111100000001111110100000000011101110100010011110111100001
10011010001111111100000010000000000111010100100001100000111
00011100110100011111111000010001011010100000001111010010101
00011111111111101001100011110000001110001011011111100000010
01000101100000101100000110100011000000100000000101000000011
11110100000010011100110000100110001001100001100110111011111
11110110101000000111110100100110111111111111000000011111101
00000100011101011110000110001001100001100111000011111111111
11110110001011110100100101001111111111000000011111101000001
00011100111101001110110101000001001110100100011111111111111
00100100010110000110000100110001000000011111101000000100111
01110001101110110101000000101000011110000110011011101111111
10000101111000000011111001101001011010001111000001000101111
01000011010001111000001101000111100000000000111100001000000
00110000110011011101111111111101001111110111111111010000000
11111101000001000111010110100101100001111000011001110000111
11111000010111100000001111100101101001101000111100000100010
11110100001101000111100000110100011110000000000011110000100
00000011000011001110000111111111110100111011101111111101000
00111000111001101000111111110001000010110101000001011110100
11101001111111110100000011000111001101000111111110000000000
00000110000011101001100110100011111111111011111011010100000
10111101001110000111111111010000011101001100110100011111111
11101111100000011000111001101000111111111000000000000000101
10101000001011110100110110011111111101011011100001000111010
11000010101011011100001010111010110000101110110111000100001
01100111110100100000010110110101100011010000110011100111111
11110000000011000110100001100110110111111111000000001000100
01001011001101100111111111000101101111110000001001000101100
00010100110011110100101110101100010001101101110000101011000
11010000110011011011111111100000001100010001001011001101100
11111111100010110111111000000100100010110000010110011001010
00111010001111000100101110110000001101111011110000110011010
00111111110001000000000000011101000000010010001011000101010
10001110100011110001001011111100000010010001101101111100111
10011111111100001011110000000111010100110011000010111101001
00111010100101111100000111011111001110000111111110000000001
11010100101101100010111011111001101010111111111000101110001
11001101110111111111110001100011011100000111111100111111111
01110100000101101000101110000110011010001111111100100101000
01000000000000111010000000100101100100011000011101011000000
10101100100010000010001010110000101110100010101101111111011
11000101111100111101001111010011111110110000011100011100110
10001111111100000100010100100101000001010111100010101100011
11001100001010000100010101000011001101101111111110101000001
01001111101000101110111111100100010110000001111000101110010
11001110000111111110000101111010010011111110000001111101001
00010100000000011110100100100001000000011000100010010110011
01100111111111000100101110110000001101000110110111110011110
00111111111000101101011110000001001111111100110111010000110
10000111000100101011110000001001111011110000110011010001111
11110010000000000000011101000000111111111111001101110100001
10100001110001001010111100000010000010110000001111110100000
00100111111101101100000011101010101010000101100000011111101
00000000001111111011100011000000101000000001100011010000110
01101101111111110000000010000011101001100110100011111111111
11011100011011000111001111000111111110010101111111001100001
11110011111000101110010110011100001111111100111011110100010
11111110000001010001011110100011110100110111110000000001000
10010111011000000110100010001001011001101100111111111000101
10111111000000100100010110000010110000011010001100000010000
00001000010110000001111000110110111110011110011111111100110
01011100100100010010000010110111001000000010000000011101001
11011111000000001000100101110110000001101000100010010110011
01100111111111000101101111110000001001111011110000110011010
00111111110010000000000000011101010000110010001011001111011
00000110100011000000100000000100001111000000111000010111111
11111110101100001010110001000011110110000011010001100000010
00000010010001100110000000000101111000111011101010000010100
01111000000111101111111010100000000011111010001101000111111
10000111011100011100111000011111111011101100000010010001011
10001110011100001111111111101001101000000000000010001001011
10110000001101000100010010110011011001111111110001011011111
10000001001000101110001110011100001111111100001011110010010
11111010000001110111001000001100000000001010111010100011000
11011001111001111001111111110101001101010010101110000000000
10000000000100011100001100110100011111111010100001000101110
00011001101000111111111010100110000000000000000111010000001
01010111000000000100000000011000111010001101111110000000100
00000000111010110001011110101001000000000000000101110100000
01010101110000000100000000000110001110100011011111100000010
10000000001110101100001000110001110100011011111100000010000
00000001011100000000110000000000101000011101000001010011111
11001000101101000110111111000000000101000110000001000001011
00000011110001101101111100111100111111111111101111000011001
10100011111111000010000000000001110100000110101000101110010
11001101110111111110000101111010010011111100001001011101000
01010010111111000010011010000000001111010010110101110101000
00001010010010010101111010001011111100000010010001001100101
10011101001111111110001010100001100111001111111111000010101
10000000111010000010100001001101000000000111101001011010111
01000000111010000011101011100111010011111111000000011000001
11001011001110100111111110000000001001111001001101000100000
00010111101000001001001111110010001011111101111000101110111
11001101010111111111000101110011110011011101111111110111000
00000101000000000010001110000110011010001111111100111101000
00101000000000111010100010110100010101010011001101100111111
11100000001111110001101111011101010001000010000011101111100
11101001111111100000000011111110000011011000111100001100111
01001111111100000001000000001110101100011111100100001000000
01111110001111000011101000000010110000000111111000101100001
11010100010100100000111000111001101000111111110100000001001
01101001011100000111010111001110100111111110000001001111101
00000110110001111000011001110100111111110000000000000000000
00011100011100111010011111111111101111000011001101000111111
11000000100000000001110101000011001110101100000110101100000
01000001110100011010001111110110100101100111011110110010111
11111111011011110111100001100110100011111111010000000000000
00111010000001100101100000011000011101000101111111111101110
00101010000110011011001111111111101000101110001111101110001
01110010110011101001111111100001011110100100111111000100111
00101011110010100010101111011010001001101000101000000100001
11100001011010111010000001000001111000010000001110100000001
00001111000010101101110101000001110010011010101100111010001
00110001111101101001001010010111000011111001010111000110000
01111011000000110000111010001000110111111011111000101111100
11000011111001010111000110001000100101011110110010010011010
10110010001000000001010100011111111110010011101010101101111
11100000011111010001000000011111011111000101111000100001011
11011011011111100000100110001011110010111011000000100000111
01000011010111111101111100010111110011110100110100111111110
11100010010111011000000110100010110111111000000100111101111
00001100110100011111111001000000000000001110101000010101000
10110011110110000011010001100000010000000010000111100000011
11110101100000110110001000011110110000011010001100000010000
00010010111000010100000000000000101010010001101010101100000
01101000110101010000010011010001001000001011110100101110110
11111011100010111011011001110110111111111000101110111110011
01010111111111011000000100101111010000010110011111011101011
00000010101100000001110101111110001000000001111110101010110
10100000111110100000011111010000010011011111011000001111000
00110111111011111110000000000111010000000111101110001111111
11111111111101011000001111110101100000101100010110100011010
10100011101011000000000101111101011110100010111110010101011
10111000010000010000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000001010100011101010111001001100010011011
11001011010100001100100000001011010010000001000011011011110
11100000111100101110010011010010110011101101000011101000010
00000010100001100011001010010010000000110001001110010011100
00011100000100000010000100110111101110010011011000110000101
10111001100100001000000100100101101110011101000110110000101
11000000000010011100111010101101100011011000010000001110000
01101111011010010110111001110100011001010111001000100000011
00001011100110111001101101001011001110110111001101101011001
01011011100111010000001101000010100100010001101001011101100
11010010110010001100101001000000110010101110010011100100110
11110111001000001101000010100100000101100010011011100110111
10111001001101101011000010110110000100000011100000111001001
10111101100111011100100110000101101101001000000111010001100
10101110010011011010110100101101110011000010111010001101001
01101111011011100000110100001010000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000001
11010000000100011101000000010001110100000001000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000010010000110010101101100
01101100011011110010000001010111011011110111001001101100011
00100001000010010000000001010000000000000000000000000000000
00000000000001001100000010000000100000010000000101000001100
00010000000100000001000000101000001010100000101000100111111
11110001011000000101000100010000001011111111111111111111111
11111111111111111111111111111111111111111111111111111111111
11111111111111111111110000010100000101111111111111111111111
11111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111100001111111
11111001000110000001011111111000011111111111111111111111111
11111111110001001111111111111111110000001000000010000001010
00011110000001011111111111111111111111100010011111111111111
11111111111111111111111111111111111111111111111111110010001
11111111111111111111111111111111100100011111111110001001111
11111100000000010000100000001001000010000000100100001000000
01000000000000000000000000000010000000000000000000000000000
00000000000010010000001000000000000000000000000000000000000
00000000000000000000000000000000000000000000000001100000000
10000000000000000000001010000000100000000100000000000000000
00000000000000000000000000000000000000000000000000000000001
11000000001000000000000000000000001000000010000000100000000
00000000000000000000000000000000000000000000000000000000000
00000000101100000000100000000000000000010000110000001000000
01100000000000000000000000000000000000000000000000000000000
00000000000000000011110000000010000000000000000001000010000
00010000001000000000000000000000000000000000000000000000000
00000000000000000000000000010011000000001000000000000000000
00000000000000011111111000000000000000000000000000000000000
00000000000000000000000000000000000001011100000000100000000
00000000000000000000000001111111100000000000000000000000000
00000000000000000000000000000000000000000000000110110000000
01000000000000000000000000000000000111111110000000000000000
00000000000000000000000000000000000000000000000000000000011
11100000000100000000000000000000000000000000011111111000000
00000000000000000000000000000000000000000000000000000000000
00000001000110000000010000000000000000000000000000000001111
11110000000000000000000000000000000000000000000000000000000
00000000000000000100111000000001000000000000000000000000000
00000011111111000000000000000000000000000000000000000000000
00000000000000000000000000010101100000000100000000000000000
00000000000000001111111100000000000000000000000000000000000
00000000000000000000000000000000000001011110000000010000000
00000000000000000000000000111111110000000000000000000000000
00000000000000000000000000000000000000000000000110011000000
00100000000000000000000000000000000011111111000000000000000
00000000000000000000000000000000000000000000000000000000011
01110000000010000000000000000000000000000000001111111100000
00000000000000000000000000000000000000000000000000000000000
00000000111011000000001000000000000000000000000000000000111
11111000000000000000000000000000000000000000000000000000000
00000000000000000011111100000000100000000000000000000000000
00000001111111100000000000000000000000000000000000000000000
00000000000000000000000000000000110000000011000000000000000
00000000000000000111111110000000000000000000000000000000000
00000000000000000000000000000000000000000111000000001100000
00000000000000000000000000011111111000000000000000000000000
00000000000000000000000000000000000000000000000000101100000
00011000000000000000000000000000000001111111100000000000000
00000000000000000000000000000000000000000000000000000000000
01111000000001100000001001000000000001000100000000000100010
00000000010010100000000000101010000011111111111111111111111
11111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111110111000001110010011
01001011011100111010000100000011100110110001101100001011011
10011001100010000000111010001000000110011001101100011011110
11000010111010001101001011011100110011100100000011100000110
11110110100101101110011101000010000001100110011011110111001
00110110101100001011101000111001100100000011011100110111101
11010000100000011011000110100101101110011010110110010101100
10000001101000010100000000000001101000000000010100001101110
01110101011011000110110000101001000000000011000000110001001
10010001100110011010000110101001101100011011100111000001110
01010000010100001001000011010001000100010101000110000000000
00101000001010000000001000101000001010100010100000101000001
01000001010000000010000000000001010000000011000001000001010
00000100100000101000001010000010100000101000001010000010100
00010100000101000001010001010000010100000101000001010000010
10000010100000101000001010000010100000101000001010000001111
00010111000011110000100000010100000101000001010000000111000
10100000101100001010000010100000101000001010000010100000101
00000101000001010000010100000011010001010000010100000101000
00101000001010000010100000101000001010000010100000101000001
00000000101000001111000011110000111100001000000010100001010
00001010000000110000101000001001000001011000011100001010000
01010000010001000101000000110000010100000101000000110100010
10000010100000101000001010000010100000101000001010000000000
11010010000000011101001000000001110110010000000100001100000
01000000100010000100000010001000010000001000100001000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000001111101101010010000010000000001011101
10000000011000000000000000001101101000000000001100100000000
00000000000000000101001100000000010100110000000000010111000
00000000000000000000000000010000000000000001100000000000000
01000000000000000100000000000000010000000000101110000101100
00000000000000000000000000000000000000000000000000000010000
00000000000000000000000000000000000000000000000000000000000
10000000000000000000000000000000000000000000000000000000000
00000100000010000000000000000000000000001000010000000100000
00000000000000000000000001100000000000000000000000010100101
00000001000000000000000000000000000001000000000000000000000
00000111000100000000100000000000000000000000000000101000000
00000000000000000011111000000000010000000000000000000000000
00001100000000000011000000000001111101000000001000000000000
00000001100000000111000000000000000000000000000001110000001
00000000000000000000000000000100000000000000000000000000001
00001100000010000000000000000000000000000010010000000000000
00000000000011110000000001000000000000000000000000000001010
00000000000000000000000001100011000000110000000000000000000
00000000010110000000000000000000000001010110100000011000000
00000000000000000000001100000000000000000000000000110100110
00000110000000000000000000000000000110100000000000000000000
00001011001000000100000000000000000000000000000011100000000
00000000000000000001001010000010100000000000000000000000000
00111100000000000000000000000001001001000001010000000000000
00000000000000100000000000000000000000000000111110100000101
00000000000000000000000000010001000000000000000000000000100
01011000001010000000000000000000000000001001000000000000000
00000000001001110100000101000000000000000000000000000100110
00000000000000000000000101100000000011000000000000000000000
00000001010000000000000000000000000011110110000001100000000
00000000000000000000101010000000000000000000000000010000100
00011100000000000000000000000000010110000000000000000000000
00010100000000001110000000000000000000000000001011100000000
00000000000000001100100100000111000000000000000000000000000
11000000000000000000000000000111001010000011100000000000000
00000000000001100100000000000000000000000000101101000010000
00000000000000000000000000110100000000000011000000000001010
10110000100000000000000000000000000000011011000000000000000
00000000011000100000010000000000000000000000000000001110000
00000000000000000000001101110100001000000000000000000000000
00000011101000000000000000000000000110010110000100100000000
00000000000000000001111000000000000000000000000011100001000
01001000000000000000000000000000111110000000000000000000000
00101001000000101000000000000000000000000000100000000000000
00000000000000011010011000010100000000000000000000000000010
00010000000000000000000000000111010000000000000000000000000
10000000000100010000000000000000000000000011110000000000000
00000000000001000000000010001100000000000000000000000001111
10000000000000000000000000100000000001001000000000000000000
00000000100000000000000000000000000000010000000000100101000
00000000000000000000010000100000000000000000000000001000000
00001001100000000000000000000000001000011000000000000000000
00000010000000000100111000000000000000000000000100010000000
00000000000000000001000000000010100000000000000000000000000
01000101000000000000000000000000100000000001010010000000000
00000000000000100011000000000000000000000000010000000000101
01000000000000000000000000010001110000000000000000000000001
00000000001010110000000000000000000000001001000000000000000
00000000000010000000000101100000000000000000000000000100100
10000000000000000000000001000000000010110100000000000000000
00000001001001000000000000000000000000100000000001011100000
00000000000000000000100100110000000000000000000000010000000
00010111100000000000000000000000010010100000000000000000000
00000100000000001100000000000000000000000000001001011000000
00000000000000000010000000000110001000000000000000000000000
10011000000000000000000000000001000000000011001000000000000
00000000000001001110000000000000000000000000100000000001100
11000000000000000000000000100111100000000000000000000000010
00000000011010000000000000000000000000010100000000000000000
00000000000100000000001101010000000000000000000000001010001
00000000000000000000000010000000000110110000000000000000000
00000010100110000000000000000000000001000000000011011100000
00000000000000000001010101000000000000000000000000100000000
00111000000000000000000000000000101011100000000000000000000
00001000000000011100100000000000000000000000001101110000000
01000000000000000100000000001110100000000000000000000000000
11110100000000100000000000000010000000000111011000000000000
00000000000001111110000000010000000000000001000000000011110
00000000000000000000000001000001000000001000000000000000100
00000000111101000000000000000000000000100001000000000100000
00000000001000000000011111000000000000000000000000010000110
00000001000000000000000100000000001111110000000000000000000
00000100010000000000100000000000000010000000001000000000000
00000000000000000010001010000000010000000000000001000000000
10000010000000000000000000000001000110000000001000000000000
00010000000001000010000000000000000000000000100011100000000
10000000000000001000000000100001100000000000000000000000010
01001000000001000000000000000100000000010001000000000000000
00000000000101001000000000100000000000000010000000001000101
00000000000000000000000010100110000000010000000000000001000
00000010001100000000000000000000000000000000000000010000000
00000000010000000001000111000000000000000000000000000000100
00000100000000000000001000000000100100000000000000000000000
00000000010000000010000000000000000100000000010010010000000
00000000000000000000001100000001000000000000000010000000001
00101000000000000000000000000000001000000000100000000000000
00100000000010010110000000000000000000000000000101000000010
00000000000000010000000001001100000000000000000000000000000
01100000000100000000000000001000000000100110100000000000000
00000000000100110000000011000000000000000100000000010011100
00000000000000000000000001001100000010000000000000000010000
00000100111100000000000000000000000000101000000001000000000
00000000100000000010100000000000000000000000000000010111000
00010000000000000000010000000001010001000000000000000000000
00001101110000001000000000000000001000000000101001000000000
00000000000000000111000000000100000000000000000100000000010
10011000000000000000000000000011100100000010000000000000000
01000000000101010100000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000010101110000000000000001000010010000000
00000000000000000000000000000000100000000000000010000000000
00000100000000000000010000000001011001000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000101101000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000010110110
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00101110000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000010111010000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000001011110000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000101111100000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000011000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000001100001
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00011000100000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000001100011000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000110010000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000011001010000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000001100110000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000110011
10000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00001101000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000110100100000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000011010100000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000001101011000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000110110000000000
00000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000011011
01000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000
00000101100000000000001001000110110010111110001101000000000
10000000011111010000000010000001100000000111111010000000100
00010000000000000001010000001000000000000000000000000000000
00000000000000000000000000000000000111110100000000100001101
00000000000000000000000000000000000000000000000100000000000
00000000000001111110100000001000010100000000000000010000000
00000000000000000011111010000000010000110100000000000000010
00000000000001000000000000000010000000000000001000000000000
00010000000000000001000000000000000100000000000000110000000
00000000000000000000000000000000000000000000000000000000000
00000000000100000000000000000000000001000000000000000000000
01000000000100000001111111111111111111111110111111100000000
00000000000000000000010100000000000000000000001000000000000
00000000001000000000000000000100000001111111111111111111111
11011111110000000000000000000001100000000000000000000001000
00000000000000000000110000000000000000000000000000000001000
00001111111111111111111111110111111100001000000000000000000
00000000100000000000000000000100000000000000000000000000000
00000000000000111111110000000000000000000000000000100100000
00000000000000000100000000000000000000010100000000000000000
00000000000000000000000011111111111111110000000000000000000
01010000000000000000000000100000000000000000000001100000000
00000000000000000000000000000000001111111111111111111111111
11111110000110100000000000000000000010000000000000000000000
00000000000000001111000000000000000000001000000000000000000
00000000000000000000100000000000000000000000010100000000000
00000000000000000000000000111000000000000000000000011000000
00000000000000000000000000000101000000000000000000000000001
00000000000000000000000000000000000011000000000000000000000
00001000000000000000000010011000000000000000000000000000000
00000000001111111100000000000000000000000000000111000000000
00000000000100000000000000000000000000000000000000010110000
00000000000000001000000000000000000000000000000000000010101
10000000000000000000010100000000000000000000000000000000000
10001100000000000000000000000000000000000000000000010000000
00000000000000000000000000000000000000000000000000000000000
00000000010111110101111101100011011101100111010001100110011
00001011010110000000001011111010111110110010101111000011010
01011101000000000001011111010111110111001001100101011100110
11101000110111101110010011001010111101001100101011100100110
11110000000001011111011000010110001001101111011100100111010
00000000001000100010001110101001001001111010101010101000001
00000000000000010111110110110101100001011010010110111000000
00001011111010111110100100101001111010001010101001001010010
01001111010100100000000001011111011001010111100001101001011
10100000000000101111101011111011100110110010101110100011000
01011100100110011101110110000000000101111101011111011100110
11001010111010001100101011011100111011001110000000000000101
11110110000101110100011001010111100001101001011101000000000
00101111101011111010111110111000001110101011011000110110001
01111101100110011100100110010101100101010111110110001001101
10001101111011000110110101100000000010111110110110101100001
01101100011011000110111101100011000000000101111101011111010
11111011000100111001001101011000000000101111101011111010111
11011100110110001001110010011010110000000001011111011000100
11100100110101100000000010111110111001101100010011100100110
10110000000001011111011101110111001001101001011101000110010
10000000001011111010111110111011101110010011010010111010001
10010100000000010111110110110001110011011001010110010101101
01100000000010111110101111101001100010011110100111001000111
01010100010011110100000100000000010111110110100101110100011
01111011000010000000001011111011101010110110001110100011011
11011000010000000001011111011011000111010001101111011000010
00000000101111101100110011001100110110001110101011100110110
10000000000001011111011100000111001001101001011011100111010
00110011000000000010111110101111101100110011100000111010101
11010001100011000000000101111101100110011100000111010101110
10001100011000000000101111101100110011100000111010101110100
01100011011010000110000101110010000000000101111101011111010
00110010100000101010101010100010011100000000001011111010111
11010100100100010101000001010011000100001101010110010101000
00000000101111101011111010101100101000001010010010010010100
11100101010001000101010100100000000001011111010111110100100
10110111001110100001100000101011001100101011000110111010001
10111101110010000000000101111101011111010010010110111001110
10000110100010101100110010101100011011101000110111101110010
00000000010111110101111101001001011011100111010000110101010
10110011001010110001101110100011011110111001000000000010111
11010111110100100101101110011101000011011001010110011001010
11000110111010001101111011100100000000001011111010111110110
00010111001001100111011000110000000001011111010111110110000
10111001001100111011101100000000001011111011001010110111001
11011001101001011100100110111101101110000000000101111101011
11101100101011011100111011001001100011011100110011100000000
01011111010111110110010101101110011101100111001101100101011
00111000000000101111101011111011001010110111001110110010100
11011010010111101001100101000000000101111101011111011100000
11100110111000000000000010111110101111101110110011001010111
00100111001101101001011011110110111000000000010111110101111
10110111101110011011011010110000101101010011011110111001000
00000001011111010111110110111101110011011011010110100101101
11001101111011100100000000001011111011001010111001001110010
01101110011011110000000001011111010111110011100000110000001
11000001101110000000001011111010111110101001101110100011000
01011100100111010001010100011010010110110101100101000000000
10111110101111101011111011010000110010101100001011100000110
00100110000101110011011001010000000001011111010111110101111
10110001001110010011010110110110001110110011011000000000001
01111101011111010111110110100001100101011000010111000001110
10001101111011100000000000001011111010111110110100001100101
01100001011100000110001001100001011100110110010100000000010
11111010111110110001001110010011010110110110001110110011011
00000000000101111101011111011010000110010101100001011100000
11101000110111101110000000000000110010101101101011101110111
00110101111101101100011010010110110101101001011101000101001
10101000000000000011001010110110101110111011100110101111101
10100101101110011010010111010001101001011000010110110001010
01101010000000000000110010101101101011101110111001101011111
01110011011000010111011001100101010101100110010101100011011
10100011011110111001000000000011001010110110101110111011100
11010111110110111001101101011010010101011001100101011000110
11101000110111101110010000000000110010101101101011101110111
00110101111101110011011101000110000101110100011101010111001
10000000001100101011011010111011101110011010111110110001101
10111101101110011101000111001001101111011011000000000001100
10101101101011101110111001101011111010101000100111101010011
00000000011001010110110101110111011100110101111101100001011
00100011010100111010101110011011101000000000001100101011011
01011101110111001101011111011001100110100101111000010100110
11001010110011100000000011001010110110101110111011100110101
11110100001001010000011100110110000101100110011001010000000
00110010101101101011101110111001101011111011100110111010001
10000101101101011100000000000001100101011011010111011101110
01101011111011101100110010101110010011100110110100101101111
01101110000000000101111101011111011001000110111101110011011
00101011100100111001001101110011011110000000001011111010111
11011001000110111101110011010001010111001001110010011011110
11100100101010001101111010100110101011000000000010111110101
11110110010101111000011010010111010001100010011101010110011
00000000001011111010111110110010101111000011010010111010001
10011001101111011100000110010101101110000000000101111101011
11101100101011110000110100101110100011011110111000001100101
01101110000000000101111101011111011010000110010101100001011
10000011011000110010101101110000000000101111101011111011100
11011101000110101101101100011001010110111000000000010111110
10111110110000101110100011001010111100001101001011101000110
00110110111001110100000000000101111101011111011100110111010
00111001001100101011000010110110101110011000000000101111101
01111101101111011100000110010101101110011001100110010000000
00001011111010111110101001001100101011000010110110001000011
01110110011101000101011001100101011000110111010001101111011
10010000000000101111101011111010100110110001101100001011011
10010101000110111101100100010101100110010101100011011101000
11011110111001000000000010111110101111101100001011101000110
01010111100001101001011101000111010001100010011011000000000
00101111101011111010111110110110001100001011100110111010000
00000001011111010111110101111101110010011011110111011001100
10101110010000000000101111101011111010111110110011001101001
01110010011100110111010000000000010000110011000001010011000
00000010000110011000001010011000000000100111001001111010011
10010000010100110101000101001011100100001100000000010011100
10011110100111001000001010011010100010100000000010011100100
11110100111001000001010011010100010100101110010000110000000
00100100101001111010001010101001001010010010011110101001000
00000001000101010110000100100101010100000000000100100001000
10101000001010100000100110001000101010011100000000001010011
01000101010101000100000101010010010001110101011000000000010
10011010001010101010001000101010011100101011001010000000000
00010100110101010001001011010011000100010101001110000000000
10000010101010001000101010110000100100101010100000000000100
11010100000101001100010011000100111101000011000000000100001
00101001001001011000000000100011001001001010011000100010101
01001100000000010001100100100101001100010001010101001100110
01000000000010101110101001001001001010101000100010100000000
01010111010100100100100101010100010001010100000100000000010
01100010100110100010101000101010010110000000001001100010101
00010011110100000100000000010000110101011001010100010001100
10000010100101100000000010001100100011001001100010101010101
00110100100000000000010100000101001001001001010011100101010
00100011000000000010100000101010101010100010000110000000001
01001001000101010000010100110001000011010101100101010000000
00001010110010100000101001001001001010011100101010001000101
010100100000000011111111

Copy the above bits into a file bits.txt. Use my program (Assemble.exe), and it will create a executable magic_bits.exe and run it. Remember, there should not be any space between 0's and 1's. The bits.txt should have all the 0's & 1's placed in contiguous way.

0's and 1's are the basic tools to understand malicious codes. this helps in behavior analysis and pattern analysis.
most of the worms (at least the best) are written in asm. it is well suited, since worm coding requires good optimization (spreads faster), smaller code (spreads easily) and lots more like controlling the stack register, which can be done only in asm. Disassembling the malware and analyzing it bit by bit, will enhance the process of understanding the malware better.