[
  {
    "path": ".gitignore",
    "content": ".idea\n.DS_Store\nsrc/trumpscript/__pycache__\n"
  },
  {
    "path": "Brainstorming.txt",
    "content": "RULES:\n*No import statements (or requires a protective tariff)\nBooleans: true -> fact, false -> lie\n*Not portable\nNot compatible with PC\nVariable names are English only, and either short or popular words only\nDon't run if file contains \"Hillary\", \"Muslim\", \"Mexico\", etc...\nError messages are all Trump quotes\nNo floating point numbers, America doesn't do things halfway\n$4B always converted to $10B\n\"Yell\" or \"Exclaim\" are the prints to std out\nAmerica = Great is the equivalent of exit(0)\nStrings that are yelled, or all strings can only be uppercase\nNumbers have to be greater than $1mill\nNo build-in random generation\n\"Build a fence\" should do something ???\nFor loop could be \"Get 10 Mexicans to build a wall\"\nStart closure with ':', end it with '!'\nUse 'x' as multiplication?\nDivision always rounds up\nPeriods are our 'newline' characters\nAssignment is done via \"x is y\" and \"Make x <- y\"\nEquality check: put \"?\" at end of word\n\"Guarantee\" defines a function\n\"Do\" calls a function\nNull is \"Jeb\"?\n\nDEMO:\nFizzBuzz = Fiorina Bush\n\nKEYWORD MAPPING:\nNone -> Jeb\nFalse -> lies, nonsense\nTrue -> truth, fact\nand -> AND\nassert -> absolutely\nbreak -> capiche\ndef -> guarantee\nif, elif, else -> if, else if, else\nis -> is\nnot -> not\nor -> or\npass -> ???\nreturn -> ???\nwhile -> as long as\nprint -> tell, say\n\n< -> less, fewer, smaller\n> -> more, greater, larger\n\nOTHER:\n\nAllow a couple of different variations on the ending\n\n"
  },
  {
    "path": "Grammar.txt",
    "content": "Abstract grammar for TrumpScript\n{\n\tmod = Module(stmt* body)\n\n\tstmt = Assign(expr* targets, expr value)\n \t      | Print(expr? dest, expr* values, bool nl) <- secretly represented by Call, which makes it an expr\n\t      | While(expr test, stmt* body, stmt* orelse)\n\t      | If(expr test, stmt* body, stmt* orelse)\n\t      | Expr(expr value)\n\n\t      -- BoolOp() can use left & right?\n\texpr = BoolOp(boolop op, expr* values)\n\t     | BinOp(expr left, operator op, expr right)\n\t     | UnaryOp(unaryop op, expr operand) <- only used for Not\n\n\t     -- need sequences for compare to distinguish between\n\t     -- x < 4 < 3 and (x < 4) < 3\n\n\t     | Compare(expr left, cmpop* ops, expr* comparators)\n\t     | Call(expr func, expr* args, keyword* keywords, <- not actually used in our grammar\n\t\t\t expr? starargs, expr? kwargs)\n\t     | Num(object n) -- a number as a PyObject.\n\t     | Str(string s) -- need to specify raw, unicode, etc?\n\t     | Name(identifier id, expr_context ctx)\n\n\texpr_context = Load | Store (| Param?) <- not part of our grammar\n\n\tboolop = And | Or <- are they given their own handlers?\n\n\toperator = Add | Sub | Mult | Div <- not given their own handlers\n\n\tunaryop = Not\n\n\tcmpop = Eq | Lt | Gt (| NotEq | GtE | LtE can all be built using not/or) <- not given their own operation\n}\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 Sam Shadwell\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# Final Update\nIt's been a while since we made any updates to TrumpScript, and we just wanted to make it official that our development on this project has stopped and that we will no longer be accepting issues or pull requests on this repo.\n\nFrankly, this joke isn't funny anymore. Rather than spend your time beating the \"Trump is ridiculous\" meme to death, please actually do something instead and donate to:\n* [American Civil Liberties Union](https://www.aclu.org)\n* [National Resources Defense Council](https://www.nrdc.org)\n* [Planned Parenthood](https://www.plannedparenthood.org)\n\n# TrumpScript <img src=\"https://raw.github.com/samshadwell/TrumpScript/master/TrumpScript.jpg\" width=\"50px\" height=\"50px\" />\nMake Python great again\n\n## Mission\nTrumpScript is a language based upon the illustrious Donald Trump. As the undeniably best US President, we found that the current field of programming languages does not include any that Trump's glorious golden combover would approve of.\n\nTrumpScript is our solution to this. It's the programming language Trump would approve of. Just like he is going to make America great again, we hope our efforts will make programming great again.\n\n## Installation\nTo use, download the .zip and extract the contents or clone the repository by typing\n\n```bash\ngit clone https://github.com/samshadwell/TrumpScript.git\n```\n\nAdd the TrumpScript root directory to your system `PATH` using one of the two following techniques\n\n1. Temporary: Write `export PATH=$PATH:/path/to/TrumpScript/bin` to terminal.\n2. Permanent: Append `export PATH=$PATH:/path/to/TrumpScript/bin` to the end of your `~/.bashrc` file.\n\n## Usage\n* Write a TrumpScript file following the syntax we've specified (good luck).\n* Execute `TRUMP /path/to/trumpscript/file.tr`\n* Enjoy the wonderful world of TrumpScript!\n\n## Features\nOur language includes several convenient features, perfect for any aspiring Presidential candidate including:\n* No floating point numbers, only integers. America never does anything halfway.\n* All numbers must be strictly greater than 1 million. The small stuff is inconsequential to us.\n* There are no import statements allowed. All code has to be home-grown and American made.\n* Instead of `True` and `False`, we have the keywords `fact` and `lie`.\n* Only the most popular English words, Trump's favorite words, and current politician names can be used as variable names.\n* Error messages are mostly quotes directly taken from Trump himself.\n* All programs must end with `America is great`.\n* Our language will automatically correct Forbes' $4.5B to $10B.\n* In its raw form, TrumpScript is not compatible with Windows, because Trump isn't the type of guy to believe in PC.\n* TrumpScript boycotts OS X and all Apple products  until such time as Apple gives cellphone info to authorities regarding radical Islamic terrorist couple from Cal.\n* The language is completely case insensitive.\n* If the running computer is from China, TrumpScript will not compile. We don't want them stealing our American technological secrets.\n* By constructing a wall (providing the --Wall flag), TrumpScript will refuse to run on machines with Mexican locales\n* Warns you if you have any Communists masquerading as legitimate \"SSL Certificates\" from China on your system.\n* Won't run in root mode because America doesn't need your help being great. Trump is all we need.\n* Easy to type with small hands\n\nIf you find you can't get any TrumpScript to run on your computer (probably because we disallow the two most popular operating systems), you can specify the `--shut_up` flag to let the interpreter know you just want your code to run, damn it.\n\n## Grammar\nThe grammar of the language is fairly convoluted, but here's a taste of the enlightened decisions we've made.\n\nArithmetic operators:\n* `+` and `plus` do addition\n* `-` and `minus` do subtraction\n* `*` and `times` do multiplication\n* `/` and `over` do division\n* `<`, `less`, `fewer`, and `smaller` all evaluate to 'less than'\n* `>`, `more`, `greater`, and `larger` all evaluate to 'greater than'\n\nControl flow:\n* Use `,` and `;` to treat compound statements as a single evaluation, similar to how `()` are used in other languages\n* Use `:` and `!` to define the scope of loops and if statements, similar to how `{}` is used in Java\n* `if`, `else if`, and `else` do what you think they do\n* `not`, `and`, and `or` do what you expect\n\nThe exciting parts:\n* Strings are denoted by double quotes (`\"I love Trump\"`)\n* The `is` and `are` keywords are used both to check for equality, and for assignment. To use for assignment, say something like `Trump is great` or `Democrats are dumb`. To use to check for equality, do the same but append a `?`. For example, you may need to ask yourself `Trump is \"the best\"?` (although we all know that would evaluate to `fact` anyway)\n* Assignment can also be done via the `make` keyword. E.g. `Make America great` assigns the value of the variable `great` to `America`\n* Printing to stdout can be done via `tell` or `say`\n* While loops are denoted via `as long as`. And that's the only type of loop you need anyway\n* If a 'word' (so anything that could be a variable name) is deemed unnecessary by the compiler, it's simply thrown away. So you can make truly self documenting code, or code that appear to read very very similarly to real speeches by the big man himself. You can find some interesting examples in our `test/test_files` directory\n\nExample:\n```\nWhat are we in this country\nHillary speaks nothing but lies\nBut look at me I came to this election to make guys\nbelieve again\nbelieve in fact\nif, all of us real lies the light; : say \"VOTE TRUMP\" !\nbut I know we should be free\nelse the result will be bad: all the work of George\nWashington was for nothing\nso this election say \"Hello World\" say \"TRUMP FOR PRESIDENT\"!\nAmerica is great.\n```\n\nBut most importantly, Trump doesn't like to talk about his failures. So a lot of the time your code will fail, and it will do so silently. Just think of debugging as a fun little game.\n\n## Because We Pretend We're Good People\nIf this page entertained you, consider making a donation to your favorite charity or political campaign.\n\nI'm a fan of the [Electronic Frontier Foundation](https://www.eff.org), [donate here](https://supporters.eff.org/donate/button)\n\nThere's also [Hillary Clinton](https://www.hillaryclinton.com/contribute/donate/), and of course [Donald Trump himself. ](http://www.reactiongifs.com/r/saywha.gif)\n\n## Because We've Sold Out\nIf you're feeling extra generous, you can also buy us a beer (or two) for more brainstorming because our small loan of a million dollars wasn't enough:\n\nPaypal:\n[paypal.me/Shadwell](https://paypal.me/Shadwell)\n\nBitcoin:\n[1AKK76WNmQheCYgZEksB61Jyp1voYxN63v](bitcoin:1AKK76WNmQheCYgZEksB61Jyp1voYxN63v)\n\n## Hey, this repo seems pretty dead...\nThis project is (probably) not totally dead, and we'll get back to it eventually, but hold tight for now, since we're all busy students full-time.\n\nBut by all means, please submit a pull request! We're all just shocked this has blown up so much, and we'd love to get this language implemented \"properly!\"\n\n## Media\nHey, cool, [we got an article on Inverse written about us!](https://www.inverse.com/article/10448-coders-assimilate-donald-trump-to-a-programming-language)\n\n[Also Motherboard](http://motherboard.vice.com/read/donald-trump-in-a-programming-language)\n\n[And The Verge](http://www.theverge.com/tldr/2016/1/21/10806944/donald-trump-script-python)\n\n[And one on Gizmodo](http://gizmodo.com/theres-a-donald-trump-programming-language-1754458693)\n\n[And TheNextWeb](http://thenextweb.com/us/2016/01/22/trumpscript-is-a-programming-language-that-thinks-and-acts-like-donald/)\n\n[And Mashable](http://mashable.com/2016/01/22/donald-trump-programming-language/#9NAKAP8GPOqt)\n\n[And The Washington Post](https://www.washingtonpost.com/news/powerpost/wp/2016/01/22/decentralizing-control-of-the-internet-meet-trumpscript-a-new-programming-language-are-iphone-sales-in-decline/)\n\n[Geekwire](http://www.geekwire.com/2016/donald-trump-programming-language-seeks-to-make-programming-great-again/)\n\n[UPI](http://www.upi.com/Odd_News/2016/01/22/Group-of-coders-create-script-language-based-on-Donald-Trump/1101453495327/)\n\n[Neowin](http://www.neowin.net/news/neobytes--trumpscript-will-make-python-great-again)\n\n## History\nCreated for HackRice ([hack.rice.edu](http://hack.rice.edu/)) by:\n\n[Sam Shadwell](http://samshadwell.me), [@samshadwell](https://github.com/samshadwell)\n\nDan Korn, [@DnlRKorn](https://github.com/DnlRKorn)\n\nChris Brown, [@CryoBrown](https://github.com/CryoBrown)\n\nCannon Lewis, [@cannon10100](https://github.com/cannon10100)\n"
  },
  {
    "path": "_config.yml",
    "content": "theme: jekyll-theme-minimal"
  },
  {
    "path": "bin/TRUMP",
    "content": "#!/bin/sh\nroot=$(dirname -- \"$0\")/..\nexport PYTHONPATH=\"${PYTHONPATH:+$PYTHONPATH:}$root/src\"\nexec python3 -- \"$root/src/trumpscript/main.py\" \"$@\"\n"
  },
  {
    "path": "src/trumpscript/__init__.py",
    "content": ""
  },
  {
    "path": "src/trumpscript/allowed_words.py",
    "content": "ALLOWED = {\"a\",\n\"abandoned\",\n\"able\",\n\"aborted\",\n\"abortion\",\n\"about\",\n\"above\",\n\"absolute\",\n\"absolutely\",\n\"abuse\",\n\"abused\",\n\"accept\",\n\"acceptable\",\n\"according\",\n\"accountants\",\n\"accounting\",\n\"across\",\n\"act\",\n\"action\",\n\"actually\",\n\"ad\",\n\"add\",\n\"address\",\n\"administration\",\n\"ads\",\n\"advantage\",\n\"advertise\",\n\"afford\",\n\"afraid\",\n\"after\",\n\"again\",\n\"against\",\n\"age\",\n\"ago\",\n\"agree\",\n\"agreed\",\n\"agreement\",\n\"agreements\",\n\"air\",\n\"airport\",\n\"airports\",\n\"all\",\n\"allegiance\",\n\"allow\",\n\"allowed\",\n\"almost\",\n\"along\",\n\"also\",\n\"although\",\n\"always\",\n\"am\",\n\"amazing\",\n\"amazingly\",\n\"amendment\",\n\"america\",\n\"american\",\n\"americans\",\n\"americas\",\n\"among\",\n\"amount\",\n\"an\",\n\"and\",\n\"angeles\",\n\"anger\",\n\"animal\",\n\"announce\",\n\"announced\",\n\"announcement\",\n\"announces\",\n\"announcing\",\n\"another\",\n\"answer\",\n\"anti\",\n\"any\",\n\"anybody\",\n\"anymore\",\n\"anyone\",\n\"anything\",\n\"anywhere\",\n\"apart\",\n\"apartment\",\n\"apartments\",\n\"apologized\",\n\"appear\",\n\"applause\",\n\"apple\",\n\"appreciate\",\n\"appropriate\",\n\"arabia\",\n\"are\",\n\"area\",\n\"aren't\",\n\"arm\",\n\"army\",\n\"around\",\n\"arrange\",\n\"arrive\",\n\"arsenal\",\n\"art\",\n\"artificial\",\n\"artificially\",\n\"as\",\n\"ask\",\n\"asked\",\n\"asking\",\n\"asphalt\",\n\"assets\",\n\"assimilate\",\n\"assimilation\",\n\"assume\",\n\"assuming\",\n\"assurance\",\n\"at\",\n\"athlete\",\n\"atlantic\",\n\"atom\",\n\"attacked\",\n\"audience\",\n\"authorities\",\n\"automobile\",\n\"avenue\",\n\"away\",\n\"ba\",\n\"babies\",\n\"baby\",\n\"bac\",\n\"back\",\n\"bad\",\n\"badly\",\n\"ball\",\n\"band\",\n\"bank\",\n\"bankrupt\",\n\"banks\",\n\"bar\",\n\"barack\",\n\"barron\",\n\"base\",\n\"based\",\n\"basic\",\n\"bat\",\n\"battlefield\",\n\"be\",\n\"bear\",\n\"beat\",\n\"beating\",\n\"beautiful\",\n\"beauty\",\n\"became\",\n\"because\",\n\"become\",\n\"becoming\",\n\"bed\",\n\"beef\",\n\"been\",\n\"before\",\n\"beg\",\n\"began\",\n\"begin\",\n\"behave\",\n\"behind\",\n\"being\",\n\"believe\",\n\"believers\",\n\"bell\",\n\"below\",\n\"ben\",\n\"bergdahl\",\n\"bernie\",\n\"beside\",\n\"best\",\n\"better\",\n\"between\",\n\"beyond\",\n\"bicycle\",\n\"bid\",\n\"bidder\",\n\"biden\",\n\"big\",\n\"bigger\",\n\"biggest\",\n\"bigly\",\n\"bill\",\n\"billion\",\n\"bird\",\n\"bit\",\n\"black\",\n\"bloated\",\n\"block\",\n\"blocks\",\n\"blood\",\n\"blow\",\n\"blown\",\n\"blue\",\n\"board\",\n\"boat\",\n\"bobby\",\n\"body\",\n\"boeing\",\n\"bone\",\n\"book\",\n\"border\",\n\"borders\",\n\"born\",\n\"borrowings\",\n\"both\",\n\"bother\",\n\"bottom\",\n\"bought\",\n\"box\",\n\"boy\",\n\"brady\",\n\"brag\",\n\"brain\",\n\"branch\",\n\"brand\",\n\"bread\",\n\"break\",\n\"breaks\",\n\"bridge\",\n\"bridges\",\n\"bright\",\n\"brilliantly\",\n\"bring\",\n\"bringing\",\n\"britain\",\n\"broad\",\n\"broadcast\",\n\"broke\",\n\"broken\",\n\"brooklyn\",\n\"brother\",\n\"brought\",\n\"brown\",\n\"bubble\",\n\"bubblewe\",\n\"budget\",\n\"buffaloed\",\n\"build\",\n\"builder\",\n\"building\",\n\"buildings\",\n\"builds\",\n\"built\",\n\"bullet\",\n\"bunch\",\n\"burn\",\n\"bush\",\n\"business\",\n\"businesses\",\n\"businessman\",\n\"busy\",\n\"but\",\n\"buy\",\n\"buzzer\",\n\"by\",\n\"caesars\",\n\"california\",\n\"call\",\n\"called\",\n\"calls\",\n\"came\",\n\"camp\",\n\"campaign\",\n\"campaigns\",\n\"can\",\n\"can't\",\n\"canada\",\n\"candidate\",\n\"candidates\",\n\"cannot\",\n\"capable\",\n\"capita\",\n\"capital\",\n\"captain\",\n\"car\",\n\"card\",\n\"cards\",\n\"care\",\n\"careful\",\n\"carly\",\n\"carolina\",\n\"carry\",\n\"cars\",\n\"carson\",\n\"cartel\",\n\"case\",\n\"cat\",\n\"catastrophe\",\n\"catch\",\n\"caterpillar\",\n\"caught\",\n\"cause\",\n\"caused\",\n\"cell\",\n\"cent\",\n\"center\",\n\"century\",\n\"certain\",\n\"certainly\",\n\"certify\",\n\"cetera\",\n\"chair\",\n\"chairman\",\n\"challenged\",\n\"chance\",\n\"change\",\n\"changed\",\n\"changing\",\n\"chapter\",\n\"character\",\n\"charge\",\n\"charged\",\n\"charging\",\n\"charities\",\n\"chart\",\n\"check\",\n\"cheering\",\n\"cheerleader\",\n\"cheerleading\",\n\"cherish\",\n\"chevrolet\",\n\"chick\",\n\"chief\",\n\"child\",\n\"children\",\n\"china\",\n\"chinese\",\n\"choice\",\n\"choose\",\n\"chord\",\n\"chris\",\n\"christians\",\n\"christie\",\n\"chunk\",\n\"circle\",\n\"circuit\",\n\"circumstances\",\n\"citizen\",\n\"city\",\n\"claim\",\n\"class\",\n\"clause\",\n\"clean\",\n\"clear\",\n\"clearance\",\n\"climb\",\n\"clinton\",\n\"clock\",\n\"close\",\n\"closing\",\n\"clothe\",\n\"cloud\",\n\"clue\",\n\"cnn\",\n\"coast\",\n\"coat\",\n\"cold\",\n\"collect\",\n\"college\",\n\"colony\",\n\"color\",\n\"column\",\n\"come\",\n\"comes\",\n\"coming\",\n\"comment\",\n\"commissioner\",\n\"common\",\n\"companies\",\n\"company\",\n\"compare\",\n\"compared\",\n\"compete\",\n\"competence\",\n\"competent\",\n\"competition\",\n\"complete\",\n\"complex\",\n\"concept\",\n\"concerned\",\n\"condition\",\n\"conditioner\",\n\"congratulations\",\n\"congress\",\n\"connect\",\n\"conservative\",\n\"consider\",\n\"considering\",\n\"consonant\",\n\"contain\",\n\"continent\",\n\"continue\",\n\"continuously\",\n\"contributed\",\n\"contribution\",\n\"contributor\",\n\"control\",\n\"controlled\",\n\"convention\",\n\"converting\",\n\"convincing\",\n\"cook\",\n\"cool\",\n\"copy\",\n\"core\",\n\"corey\",\n\"corn\",\n\"corner\",\n\"corps\",\n\"correct\",\n\"correctness\",\n\"corrupt\",\n\"cost\",\n\"costs\",\n\"cotton\",\n\"could\",\n\"couldn't\",\n\"count\",\n\"counter\",\n\"countries\",\n\"country\",\n\"couple\",\n\"course\",\n\"courses\",\n\"cover\",\n\"covering\",\n\"cow\",\n\"crap\",\n\"crashing\",\n\"crass\",\n\"cratered\",\n\"crease\",\n\"create\",\n\"created\",\n\"creating\",\n\"credibility\",\n\"credit\",\n\"crime\",\n\"criminal\",\n\"crisis\",\n\"crop\",\n\"cross\",\n\"crosstalk\",\n\"crowd\",\n\"crowds\",\n\"cruz\",\n\"cry\",\n\"cunning\",\n\"currency\",\n\"current\",\n\"cut\",\n\"cuts\",\n\"cutting\",\n\"dad\",\n\"dance\",\n\"danger\",\n\"dark\",\n\"day\",\n\"days\",\n\"de\",\n\"dea\",\n\"dead\",\n\"deal\",\n\"dealing\",\n\"deals\",\n\"dealt\",\n\"dear\",\n\"death\",\n\"debate\",\n\"debt\",\n\"decade\",\n\"decades\",\n\"decide\",\n\"decided\",\n\"decimal\",\n\"deductibles\",\n\"deep\",\n\"deficits\",\n\"degree\",\n\"democrat\",\n\"democrats\",\n\"denied\",\n\"depend\",\n\"depends\",\n\"describe\",\n\"desert\",\n\"deserves\",\n\"design\",\n\"destabilize\",\n\"destabilized\",\n\"destroyed\",\n\"destroying\",\n\"destructive\",\n\"details\",\n\"determine\",\n\"devaluation\",\n\"devalue\",\n\"devalued\",\n\"devaluing\",\n\"develop\",\n\"dictionary\",\n\"did\",\n\"didn't\",\n\"die\",\n\"differ\",\n\"difference\",\n\"different\",\n\"differently\",\n\"difficult\",\n\"direct\",\n\"directly\",\n\"disassociate\",\n\"disaster\",\n\"disastrous\",\n\"discuss\",\n\"discussing\",\n\"disgrace\",\n\"disgusting\",\n\"dishonest\",\n\"dislike\",\n\"distant\",\n\"divide\",\n\"division\",\n\"do\",\n\"doctor\",\n\"doctors\",\n\"does\",\n\"doesn't\",\n\"dog\",\n\"dogs\",\n\"doing\",\n\"dollar\",\n\"dollars\",\n\"domestic\",\n\"don\",\n\"don't\",\n\"donald\",\n\"done\",\n\"donnie\",\n\"donors\",\n\"door\",\n\"doral\",\n\"double\",\n\"down\",\n\"drain\",\n\"draw\",\n\"dream\",\n\"dress\",\n\"drink\",\n\"drive\",\n\"drop\",\n\"drugs\",\n\"dry\",\n\"duck\",\n\"dump\",\n\"dumping\",\n\"during\",\n\"dying\",\n\"e\",\n\"each\",\n\"ear\",\n\"early\",\n\"earn\",\n\"earth\",\n\"ease\",\n\"easily\",\n\"east\",\n\"eat\",\n\"eating\",\n\"economically\",\n\"economists\",\n\"economy\",\n\"edge\",\n\"education\",\n\"effect\",\n\"egg\",\n\"eight\",\n\"either\",\n\"elected\",\n\"election\",\n\"electric\",\n\"element\",\n\"elevators\",\n\"elite\",\n\"else\",\n\"else's\",\n\"embarrass\",\n\"employ\",\n\"employed\",\n\"employees\",\n\"end\",\n\"ended\",\n\"endorsing\",\n\"enemies\",\n\"enemy\",\n\"energy\",\n\"engine\",\n\"engineers\",\n\"england\",\n\"english\",\n\"enormous\",\n\"enough\",\n\"enter\",\n\"enterprise\",\n\"environmental\",\n\"environmentalist\",\n\"equal\",\n\"equate\",\n\"equipment\",\n\"eric\",\n\"escaped\",\n\"especially\",\n\"esprit\",\n\"establishment\",\n\"estate\",\n\"et\",\n\"europe\",\n\"evanka\",\n\"even\",\n\"evening\",\n\"event\",\n\"eventually\",\n\"ever\",\n\"every\",\n\"everybody\",\n\"everyplace\",\n\"everything\",\n\"everywhere\",\n\"evolved\",\n\"exact\",\n\"example\",\n\"except\",\n\"exception\",\n\"excite\",\n\"exclusively\",\n\"excuse\",\n\"executive\",\n\"exercise\",\n\"exist\",\n\"exonerated\",\n\"expect\",\n\"expectations\",\n\"expenses\",\n\"expensive\",\n\"experience\",\n\"experiment\",\n\"explain\",\n\"explode\",\n\"extensions\",\n\"extremely\",\n\"eye\",\n\"face\",\n\"fact\",\n\"factor\",\n\"factory\",\n\"fair\",\n\"fairly\",\n\"fairness\",\n\"fall\",\n\"falling\",\n\"falls\",\n\"false\",\n\"family\",\n\"famous\",\n\"fantastic\",\n\"far\",\n\"farm\",\n\"fashioned\",\n\"fast\",\n\"fat\",\n\"father\",\n\"favor\",\n\"fear\",\n\"fed\",\n\"feed\",\n\"feel\",\n\"feet\",\n\"fell\",\n\"fellas\",\n\"fellow\",\n\"felt\",\n\"few\",\n\"field\",\n\"fig\",\n\"fight\",\n\"fighting\",\n\"figure\",\n\"figures\",\n\"filed\",\n\"filing\",\n\"fill\",\n\"final\",\n\"finalized\",\n\"finally\",\n\"finance\",\n\"financial\",\n\"find\",\n\"fine\",\n\"finest\",\n\"finger\",\n\"finish\",\n\"fiorina\",\n\"fire\",\n\"fired\",\n\"firm\",\n\"first\",\n\"fish\",\n\"fit\",\n\"five\",\n\"fix\",\n\"flat\",\n\"flexibility\",\n\"flexible\",\n\"floor\",\n\"flow\",\n\"flower\",\n\"fly\",\n\"folks\",\n\"follow\",\n\"food\",\n\"fool\",\n\"foolish\",\n\"foot\",\n\"football\",\n\"for\",\n\"force\",\n\"ford\",\n\"foreign\",\n\"forest\",\n\"forget\",\n\"form\",\n\"forming\",\n\"fortune\",\n\"forward\",\n\"found\",\n\"foundation\",\n\"four\",\n\"fracking\",\n\"fraction\",\n\"francisco\",\n\"frankly\",\n\"fraud\",\n\"free\",\n\"fresh\",\n\"friend\",\n\"friends\",\n\"from\",\n\"front\",\n\"fruit\",\n\"full\",\n\"fully\",\n\"fun\",\n\"funded\",\n\"funder\",\n\"funding\",\n\"game\",\n\"garden\",\n\"gary\",\n\"gas\",\n\"gate\",\n\"gather\",\n\"gave\",\n\"gdp\",\n\"gen\",\n\"general\",\n\"generally\",\n\"gentle\",\n\"gentleman\",\n\"gentlemen\",\n\"george\",\n\"get\",\n\"gets\",\n\"getting\",\n\"gilmore\",\n\"girl\",\n\"give\",\n\"given\",\n\"giver\",\n\"glad\",\n\"glass\",\n\"global\",\n\"go\",\n\"god\",\n\"goes\",\n\"going\",\n\"gold\",\n\"golf\",\n\"gone\",\n\"gonna\",\n\"good\",\n\"gorgeous\",\n\"got\",\n\"gotta\",\n\"gotten\",\n\"gov\",\n\"govern\",\n\"government\",\n\"governmental\",\n\"governor\",\n\"graduate\",\n\"graham\",\n\"grand\",\n\"grass\",\n\"gray\",\n\"great\",\n\"greatest\",\n\"greatly\",\n\"greece\",\n\"green\",\n\"grew\",\n\"gridlock\",\n\"gross\",\n\"ground\",\n\"group\",\n\"groups\",\n\"grow\",\n\"guarantee\",\n\"guardia\",\n\"guards\",\n\"guess\",\n\"guide\",\n\"gun\",\n\"guns\",\n\"guy\",\n\"guys\",\n\"hack\",\n\"had\",\n\"hair\",\n\"haired\",\n\"half\",\n\"hampshire\",\n\"hand\",\n\"happen\",\n\"happened\",\n\"happening\",\n\"happens\",\n\"happy\",\n\"hard\",\n\"harvard\",\n\"has\",\n\"hat\",\n\"hate\",\n\"hating\",\n\"have\",\n\"haven't\",\n\"having\",\n\"he\",\n\"he'd\",\n\"head\",\n\"headquarters\",\n\"heads\",\n\"health\",\n\"hear\",\n\"heard\",\n\"heart\",\n\"heat\",\n\"heavy\",\n\"held\",\n\"hell\",\n\"hello\",\n\"help\",\n\"her\",\n\"here\",\n\"hero\",\n\"hey\",\n\"high\",\n\"highest\",\n\"highly\",\n\"hill\",\n\"hillary\",\n\"him\",\n\"himself\",\n\"hire\",\n\"his\",\n\"hispanic\",\n\"hispanics\",\n\"history\",\n\"hit\",\n\"hold\",\n\"hole\",\n\"home\",\n\"honest\",\n\"honestly\",\n\"honor\",\n\"honorable\",\n\"honored\",\n\"hope\",\n\"hopefully\",\n\"horrible\",\n\"horror\",\n\"horse\",\n\"hot\",\n\"hotel\",\n\"hotels\",\n\"hour\",\n\"house\",\n\"how\",\n\"however\",\n\"huckabee\",\n\"huge\",\n\"huh\",\n\"human\",\n\"humanitarian\",\n\"humvees\",\n\"hundred\",\n\"hundreds\",\n\"hunt\",\n\"hurry\",\n\"husband\",\n\"hyatt\",\n\"i\",\n\"i'd\",\n\"i'll\",\n\"ice\",\n\"idea\",\n\"idiots\",\n\"if\",\n\"illegal\",\n\"illegally\",\n\"illegals\",\n\"imagine\",\n\"imbalance\",\n\"immediately\",\n\"immigrants\",\n\"immigration\",\n\"impact\",\n\"important\",\n\"importantly\",\n\"impossible\",\n\"in\",\n\"inappropriate\",\n\"inaudible\",\n\"incentive\",\n\"inch\",\n\"inclined\",\n\"include\",\n\"including\",\n\"incorrectly\",\n\"increase\",\n\"incredible\",\n\"incredibly\",\n\"independent\",\n\"indicate\",\n\"industry\",\n\"inexpensively\",\n\"infrastructure\",\n\"insect\",\n\"instances\",\n\"instant\",\n\"instead\",\n\"instinct\",\n\"instrument\",\n\"insurance\",\n\"intelligent\",\n\"intent\",\n\"intention\",\n\"interest\",\n\"interested\",\n\"interesting\",\n\"interestingly\",\n\"interests\",\n\"into\",\n\"invent\",\n\"invite\",\n\"iowa\",\n\"iran\",\n\"iraq\",\n\"iron\",\n\"is\",\n\"isis\",\n\"islamic\",\n\"island\",\n\"isn't\",\n\"israel\",\n\"issues\",\n\"it\",\n\"its\",\n\"itself\",\n\"ivanka\",\n\"jailed\",\n\"japan\",\n\"jared\",\n\"jeb\",\n\"jersey\",\n\"jets\",\n\"jill\",\n\"jim\",\n\"jindal\",\n\"job\",\n\"jobs\",\n\"joe\",\n\"john\",\n\"johnson\",\n\"join\",\n\"journal\",\n\"joy\",\n\"judge\",\n\"jump\",\n\"junk\",\n\"just\",\n\"kai\",\n\"kaine\",\n\"kanye\",\n\"kasich\",\n\"kate\",\n\"keep\",\n\"kegs\",\n\"kept\",\n\"kerry\",\n\"key\",\n\"kicks\",\n\"kidding\",\n\"kill\",\n\"killed\",\n\"killer\",\n\"killers\",\n\"killing\",\n\"killingsmurders\",\n\"kind\",\n\"king\",\n\"knew\",\n\"knocking\",\n\"knocks\",\n\"know\",\n\"knowing\",\n\"knows\",\n\"komatsu\",\n\"l\",\n\"la\",\n\"labor\",\n\"ladies\",\n\"lady\",\n\"lake\",\n\"land\",\n\"language\",\n\"large\",\n\"largest\",\n\"last\",\n\"late\",\n\"later\",\n\"latin\",\n\"laugh\",\n\"laughable\",\n\"laughing\",\n\"laughter\",\n\"laura\",\n\"law\",\n\"laws\",\n\"lax\",\n\"lay\",\n\"lead\",\n\"leader\",\n\"leaders\",\n\"leadership\",\n\"leading\",\n\"league\",\n\"leagues\",\n\"learn\",\n\"learned\",\n\"least\",\n\"leave\",\n\"led\",\n\"left\",\n\"leg\",\n\"legal\",\n\"legally\",\n\"lenders\",\n\"length\",\n\"less\",\n\"let\",\n\"letter\",\n\"level\",\n\"levels\",\n\"leverage\",\n\"liabilities\",\n\"lie\",\n\"life\",\n\"lifestyle\",\n\"lifetime\",\n\"lift\",\n\"light\",\n\"like\",\n\"liked\",\n\"liking\",\n\"lindsey\",\n\"line\",\n\"lines\",\n\"liquid\",\n\"list\",\n\"listen\",\n\"listening\",\n\"literally\",\n\"little\",\n\"live\",\n\"lives\",\n\"living\",\n\"loaded\",\n\"loan\",\n\"lobbyist\",\n\"lobbyists\",\n\"local\",\n\"locate\",\n\"located\",\n\"log\",\n\"lone\",\n\"long\",\n\"longer\",\n\"look\",\n\"looked\",\n\"looking\",\n\"los\",\n\"lose\",\n\"losers\",\n\"losing\",\n\"lost\",\n\"lot\",\n\"lots\",\n\"loud\",\n\"love\",\n\"loves\",\n\"low\",\n\"macarthur\",\n\"machine\",\n\"made\",\n\"magic\",\n\"magnet\",\n\"mail\",\n\"main\",\n\"major\",\n\"make\",\n\"maker\",\n\"makes\",\n\"making\",\n\"man\",\n\"manhattan\",\n\"manner\",\n\"manufactured\",\n\"manufacturer\",\n\"manufacturing\",\n\"many\",\n\"map\",\n\"marco\",\n\"margins\",\n\"mark\",\n\"market\",\n\"martin\",\n\"mass\",\n\"massive\",\n\"master\",\n\"match\",\n\"material\",\n\"matter\",\n\"may\",\n\"maybe\",\n\"me\",\n\"mean\",\n\"means\",\n\"meant\",\n\"measure\",\n\"meat\",\n\"media\",\n\"medicaid\",\n\"medical\",\n\"medicare\",\n\"medieval\",\n\"meet\",\n\"meeting\",\n\"megyn\",\n\"melania\",\n\"melody\",\n\"men\",\n\"mess\",\n\"met\",\n\"metal\",\n\"method\",\n\"mexican\",\n\"mexicans\",\n\"mexico\",\n\"miami\",\n\"michigan\",\n\"microphone\",\n\"middle\",\n\"might\",\n\"mike\",\n\"mile\",\n\"militarily\",\n\"military\",\n\"milk\",\n\"million\",\n\"millions\",\n\"mind\",\n\"mindset\",\n\"mine\",\n\"minor\",\n\"minute\",\n\"minutes\",\n\"miss\",\n\"misspeak\",\n\"misspoke\",\n\"mitt\",\n\"mix\",\n\"modern\",\n\"modestly\",\n\"molecule\",\n\"moment\",\n\"money\",\n\"monmouth\",\n\"month\",\n\"months\",\n\"moon\",\n\"morally\",\n\"more\",\n\"morning\",\n\"most\",\n\"mother\",\n\"motion\",\n\"mount\",\n\"mountain\",\n\"mouth\",\n\"move\",\n\"mr\",\n\"much\",\n\"multiply\",\n\"murderers\",\n\"music\",\n\"must\",\n\"my\",\n\"myself\",\n\"name\",\n\"named\",\n\"names\",\n\"nation\",\n\"national\",\n\"natural\",\n\"nature\",\n\"near\",\n\"necessary\",\n\"neck\",\n\"need\",\n\"needs\",\n\"negative\",\n\"negatives\",\n\"negotiate\",\n\"negotiates\",\n\"negotiating\",\n\"negotiation\",\n\"negotiator\",\n\"negotiators\",\n\"neighbor\",\n\"net\",\n\"networks\",\n\"nevada\",\n\"never\",\n\"nevertheless\",\n\"new\",\n\"news\",\n\"newspapers\",\n\"next\",\n\"nice\",\n\"night\",\n\"nine\",\n\"no\",\n\"nobody\",\n\"noise\",\n\"nomination\",\n\"nominee\",\n\"nonsense\",\n\"noon\",\n\"nor\",\n\"north\",\n\"nose\",\n\"not\",\n\"note\",\n\"nothing\",\n\"notice\",\n\"notified\",\n\"noun\",\n\"now\",\n\"nuclear\",\n\"number\",\n\"numbers\",\n\"numeral\",\n\"nurses\",\n\"nutshell\",\n\"o'donnell\",\n\"o'malley\",\n\"obama\",\n\"obamacare\",\n\"object\",\n\"obligation\",\n\"observe\",\n\"obsolete\",\n\"obvious\",\n\"occasions\",\n\"occur\",\n\"ocean\",\n\"of\",\n\"off\",\n\"offer\",\n\"offered\",\n\"offering\",\n\"office\",\n\"officially\",\n\"often\",\n\"oftentimes\",\n\"oh\",\n\"oil\",\n\"ok\",\n\"okay\",\n\"old\",\n\"on\",\n\"once\",\n\"one\",\n\"ones\",\n\"only\",\n\"open\",\n\"operate\",\n\"opinion\",\n\"opposed\",\n\"opposite\",\n\"or\",\n\"order\",\n\"orders\",\n\"ordierno\",\n\"oregon\",\n\"organ\",\n\"original\",\n\"other\",\n\"others\",\n\"ought\",\n\"our\",\n\"ourself\",\n\"out\",\n\"outside\",\n\"outsider\",\n\"over\",\n\"overrated\",\n\"owe\",\n\"owes\",\n\"own\",\n\"oxygen\",\n\"package\",\n\"pacs\",\n\"page\",\n\"pages\",\n\"paid\",\n\"paint\",\n\"pair\",\n\"palin\",\n\"paper\",\n\"papers\",\n\"paragraph\",\n\"parent\",\n\"part\",\n\"participation\",\n\"particular\",\n\"parts\",\n\"party\",\n\"pass\",\n\"past\",\n\"pataki\",\n\"patches\",\n\"patents\",\n\"path\",\n\"patients\",\n\"patriots\",\n\"patrol\",\n\"pattern\",\n\"patton\",\n\"paul\",\n\"pay\",\n\"payer\",\n\"paying\",\n\"peanuts\",\n\"pence\",\n\"pennsylvania\",\n\"people\",\n\"per\",\n\"percent\",\n\"perhaps\",\n\"period\",\n\"perry\",\n\"person\",\n\"pertinent\",\n\"ph\",\n\"phase\",\n\"phones\",\n\"phrase\",\n\"physicists\",\n\"pick\",\n\"picture\",\n\"piece\",\n\"pitch\",\n\"place\",\n\"places\",\n\"plain\",\n\"plan\",\n\"plane\",\n\"planes\",\n\"planet\",\n\"plans\",\n\"plant\",\n\"plants\",\n\"play\",\n\"playing\",\n\"please\",\n\"pledge\",\n\"pledging\",\n\"plenty\",\n\"plural\",\n\"poem\",\n\"point\",\n\"policies\",\n\"policy\",\n\"political\",\n\"politically\",\n\"politician\",\n\"politicians\",\n\"politics\",\n\"poll\",\n\"polls\",\n\"poor\",\n\"poorly\",\n\"populate\",\n\"port\",\n\"portions\",\n\"pose\",\n\"position\",\n\"positive\",\n\"possible\",\n\"possibly\",\n\"post\",\n\"potatoes\",\n\"potential\",\n\"potomac\",\n\"pound\",\n\"pouring\",\n\"poverty\",\n\"powder\",\n\"power\",\n\"practice\",\n\"predictions\",\n\"premiums\",\n\"prepare\",\n\"prepared\",\n\"preparedness\",\n\"present\",\n\"president\",\n\"press\",\n\"pretty\",\n\"price\",\n\"priebus\",\n\"princeton\",\n\"principles\",\n\"print\",\n\"prison\",\n\"prisoners\",\n\"pritzker\",\n\"private\",\n\"pro\",\n\"probable\",\n\"probably\",\n\"problem\",\n\"problems\",\n\"process\",\n\"produce\",\n\"producing\",\n\"product\",\n\"profitable\",\n\"program\",\n\"project\",\n\"proliferation\",\n\"promise\",\n\"promised\",\n\"proper\",\n\"properly\",\n\"property\",\n\"protect\",\n\"protection\",\n\"proud\",\n\"prove\",\n\"proven\",\n\"provide\",\n\"public\",\n\"publicly\",\n\"pull\",\n\"punched\",\n\"puncher\",\n\"pundits\",\n\"push\",\n\"pushing\",\n\"put\",\n\"putin\",\n\"putting\",\n\"qatar\",\n\"quart\",\n\"quarter\",\n\"queens\",\n\"question\",\n\"questions\",\n\"quick\",\n\"quickly\",\n\"quickness\",\n\"quiet\",\n\"quite\",\n\"quitting\",\n\"quotient\",\n\"race\",\n\"radical\",\n\"radio\",\n\"rail\",\n\"rain\",\n\"raise\",\n\"ran\",\n\"rand\",\n\"range\",\n\"rapists\",\n\"rate\",\n\"rates\",\n\"rather\",\n\"ray\",\n\"reach\",\n\"read\",\n\"ready\",\n\"reagan\",\n\"real\",\n\"realized\",\n\"really\",\n\"reason\",\n\"reasons\",\n\"rebuild\",\n\"rebuilding\",\n\"rebuilt\",\n\"receive\",\n\"received\",\n\"recently\",\n\"reconsider\",\n\"record\",\n\"red\",\n\"reduce\",\n\"referred\",\n\"region\",\n\"rein\",\n\"reince\",\n\"relations\",\n\"relationship\",\n\"relationships\",\n\"remember\",\n\"renegotiate\",\n\"repeal\",\n\"repeat\",\n\"replace\",\n\"replaced\",\n\"reply\",\n\"report\",\n\"reported\",\n\"reporter\",\n\"reporters\",\n\"represent\",\n\"representing\",\n\"republican\",\n\"republicans\",\n\"require\",\n\"respect\",\n\"respected\",\n\"responsible\",\n\"rest\",\n\"result\",\n\"results\",\n\"return\",\n\"rhetoric\",\n\"rich\",\n\"rick\",\n\"rid\",\n\"ride\",\n\"rig\",\n\"rigs\",\n\"rigged\",\n\"rigging\",\n\"right\",\n\"ring\",\n\"rip\",\n\"ripped\",\n\"ripping\",\n\"rips\",\n\"rise\",\n\"river\",\n\"rnc\",\n\"road\",\n\"roads\",\n\"roadways\",\n\"rock\",\n\"rocket\",\n\"roll\",\n\"romney\",\n\"ronald\",\n\"roof\",\n\"room\",\n\"root\",\n\"rope\",\n\"rose\",\n\"rosie\",\n\"rough\",\n\"round\",\n\"row\",\n\"rub\",\n\"rubio\",\n\"rule\",\n\"run\",\n\"running\",\n\"russia\",\n\"ryan\",\n\"s\",\n\"sad\",\n\"sadly\",\n\"safe\",\n\"said\",\n\"sail\",\n\"salt\",\n\"same\",\n\"san\",\n\"sand\",\n\"sanders\",\n\"santorum\",\n\"sarah\",\n\"sat\",\n\"saudi\",\n\"saudis\",\n\"save\",\n\"saw\",\n\"say\",\n\"saying\",\n\"says\",\n\"scale\",\n\"scary\",\n\"school\",\n\"schools\",\n\"science\",\n\"score\",\n\"scotland\",\n\"sea\",\n\"search\",\n\"season\",\n\"seat\",\n\"second\",\n\"seconds\",\n\"secretary\",\n\"secrets\",\n\"section\",\n\"sections\",\n\"security\",\n\"see\",\n\"seed\",\n\"seem\",\n\"seen\",\n\"segment\",\n\"select\",\n\"self\",\n\"sell\",\n\"selling\",\n\"semi\",\n\"send\",\n\"sending\",\n\"sends\",\n\"sense\",\n\"sent\",\n\"sentence\",\n\"separate\",\n\"serious\",\n\"serve\",\n\"services\",\n\"set\",\n\"settle\",\n\"seven\",\n\"several\",\n\"shall\",\n\"shape\",\n\"share\",\n\"sharp\",\n\"sharper\",\n\"she\",\n\"sheet\",\n\"shell\",\n\"shine\",\n\"ship\",\n\"ships\",\n\"shocked\",\n\"shocking\",\n\"shoe\",\n\"shooting\",\n\"shop\",\n\"shore\",\n\"short\",\n\"should\",\n\"shoulder\",\n\"shouldn't\",\n\"shout\",\n\"show\",\n\"showed\",\n\"side\",\n\"sight\",\n\"sign\",\n\"signals\",\n\"signed\",\n\"signing\",\n\"silent\",\n\"silicon\",\n\"silver\",\n\"similar\",\n\"simple\",\n\"simply\",\n\"simultaneously\",\n\"since\",\n\"sing\",\n\"single\",\n\"sister\",\n\"sit\",\n\"site\",\n\"sites\",\n\"sitting\",\n\"situation\",\n\"six\",\n\"size\",\n\"skill\",\n\"skin\",\n\"sky\",\n\"slave\",\n\"sleep\",\n\"slip\",\n\"slow\",\n\"small\",\n\"smart\",\n\"smarter\",\n\"smartest\",\n\"smell\",\n\"smile\",\n\"snow\",\n\"so\",\n\"social\",\n\"soft\",\n\"soil\",\n\"sold\",\n\"soldier\",\n\"soldiers\",\n\"solution\",\n\"solve\",\n\"some\",\n\"somebody\",\n\"someday\",\n\"something\",\n\"sometimes\",\n\"son\",\n\"song\",\n\"soon\",\n\"sophisticated\",\n\"sorry\",\n\"sort\",\n\"sorts\",\n\"sought\",\n\"soul\",\n\"sound\",\n\"sounds\",\n\"south\",\n\"southern\",\n\"space\",\n\"spanish\",\n\"speak\",\n\"speaking\",\n\"speaks\",\n\"special\",\n\"specifics\",\n\"spectacular\",\n\"speech\",\n\"speeches\",\n\"speed\",\n\"spell\",\n\"spend\",\n\"spending\",\n\"spends\",\n\"spent\",\n\"spigot\",\n\"spirit\",\n\"spoke\",\n\"spot\",\n\"spread\",\n\"spreads\",\n\"spring\",\n\"square\",\n\"stage\",\n\"stand\",\n\"standard\",\n\"standpoint\",\n\"stands\",\n\"stanford\",\n\"star\",\n\"start\",\n\"started\",\n\"starting\",\n\"state\",\n\"statement\",\n\"statements\",\n\"states\",\n\"station\",\n\"statistic\",\n\"statistics\",\n\"stats\",\n\"stay\",\n\"stays\",\n\"stead\",\n\"steaks\",\n\"stealing\",\n\"steam\",\n\"steel\",\n\"stein\",\n\"step\",\n\"stick\",\n\"still\",\n\"stock\",\n\"stone\",\n\"stood\",\n\"stop\",\n\"store\",\n\"stories\",\n\"storming\",\n\"story\",\n\"straight\",\n\"straighten\",\n\"strange\",\n\"stream\",\n\"street\",\n\"strength\",\n\"strengthen\",\n\"strengthened\",\n\"stretch\",\n\"string\",\n\"strong\",\n\"stronger\",\n\"strongest\",\n\"strongly\",\n\"student\",\n\"study\",\n\"stuff\",\n\"stupid\",\n\"stupidity\",\n\"subcontractors\",\n\"subject\",\n\"substance\",\n\"substantial\",\n\"subtract\",\n\"success\",\n\"successful\",\n\"such\",\n\"sudden\",\n\"suffix\",\n\"sugar\",\n\"suggest\",\n\"suggested\",\n\"suit\",\n\"sum\",\n\"summary\",\n\"summer\",\n\"sun\",\n\"super\",\n\"superstar\",\n\"supply\",\n\"support\",\n\"supporters\",\n\"supporting\",\n\"supposed\",\n\"sure\",\n\"surface\",\n\"surplus\",\n\"surprise\",\n\"sustain\",\n\"swear\",\n\"sweated\",\n\"sweet\",\n\"swim\",\n\"syllable\",\n\"symbol\",\n\"syria\",\n\"system\",\n\"table\",\n\"tail\",\n\"take\",\n\"taken\",\n\"takes\",\n\"taking\",\n\"talent\",\n\"talented\",\n\"talk\",\n\"talked\",\n\"talking\",\n\"talks\",\n\"tall\",\n\"tapped\",\n\"tariff\",\n\"tax\",\n\"teach\",\n\"team\",\n\"tear\",\n\"ted\",\n\"teeth\",\n\"television\",\n\"tell\",\n\"telling\",\n\"tells\",\n\"temperature\",\n\"ten\",\n\"tennessee\",\n\"tens\",\n\"term\",\n\"terminate\",\n\"terms\",\n\"terrible\",\n\"terrific\",\n\"terrorism\",\n\"terrorists\",\n\"test\",\n\"than\",\n\"thank\",\n\"thanks\",\n\"that\",\n\"that's\",\n\"the\",\n\"their\",\n\"them\",\n\"themselves\",\n\"then\",\n\"there\",\n\"therefore\",\n\"these\",\n\"they\",\n\"they'd\",\n\"thick\",\n\"thin\",\n\"thing\",\n\"things\",\n\"think\",\n\"thinking\",\n\"thinks\",\n\"third\",\n\"this\",\n\"those\",\n\"though\",\n\"thought\",\n\"thousand\",\n\"thousands\",\n\"three\",\n\"thrilled\",\n\"thriving\",\n\"through\",\n\"throw\",\n\"thrown\",\n\"thus\",\n\"tie\",\n\"tiffany\",\n\"tim\",\n\"time\",\n\"times\",\n\"tiny\",\n\"tire\",\n\"tired\",\n\"to\",\n\"toads\",\n\"today\",\n\"together\",\n\"tokyo\",\n\"told\",\n\"tom\",\n\"tone\",\n\"tonight\",\n\"too\",\n\"took\",\n\"tool\",\n\"top\",\n\"total\",\n\"totally\",\n\"touch\",\n\"tough\",\n\"tougher\",\n\"toward\",\n\"tower\",\n\"town\",\n\"track\",\n\"tractor\",\n\"trade\",\n\"trader\",\n\"train\",\n\"traitor\",\n\"transaction\",\n\"travel\",\n\"treated\",\n\"treating\",\n\"tree\",\n\"tremendous\",\n\"triangle\",\n\"trillion\",\n\"trip\",\n\"trouble\",\n\"truck\",\n\"trucks\",\n\"true\",\n\"truly\",\n\"trump\",\n\"trust\",\n\"truth\",\n\"try\",\n\"trying\",\n\"tube\",\n\"tubes\",\n\"tunnels\",\n\"turn\",\n\"turned\",\n\"turning\",\n\"turnout\",\n\"twenty\",\n\"two\",\n\"type\",\n\"ultimately\",\n\"unable\",\n\"unbelievable\",\n\"unbelievably\",\n\"under\",\n\"understand\",\n\"unemployment\",\n\"unfortunately\",\n\"unions\",\n\"unit\",\n\"united\",\n\"unless\",\n\"unsalvageable\",\n\"until\",\n\"up\",\n\"upset\",\n\"us\",\n\"use\",\n\"used\",\n\"useless\",\n\"uses\",\n\"using\",\n\"usual\",\n\"valley\",\n\"valuable\",\n\"value\",\n\"vanessa\",\n\"various\",\n\"vary\",\n\"vehicles\",\n\"ventured\",\n\"verb\",\n\"very\",\n\"vets\",\n\"vibrant\",\n\"vice\",\n\"vicious\",\n\"victories\",\n\"victory\",\n\"view\",\n\"village\",\n\"violence\",\n\"virtually\",\n\"visit\",\n\"vladimir\",\n\"voice\",\n\"vote\",\n\"voters\",\n\"votes\",\n\"vowel\",\n\"wait\",\n\"waiting\",\n\"wales\",\n\"walk\",\n\"wall\",\n\"walls\",\n\"want\",\n\"wanted\",\n\"wants\",\n\"war\",\n\"warm\",\n\"warming\",\n\"was\",\n\"wash\",\n\"washington\",\n\"wasn't\",\n\"waste\",\n\"watch\",\n\"watched\",\n\"watching\",\n\"water\",\n\"wave\",\n\"way\",\n\"ways\",\n\"we\",\n\"we'd\",\n\"weak\",\n\"weaker\",\n\"weakness\",\n\"wealth\",\n\"weapons\",\n\"wear\",\n\"weather\",\n\"web\",\n\"wedding\",\n\"week\",\n\"weeks\",\n\"weight\",\n\"weld\",\n\"welfare\",\n\"well\",\n\"went\",\n\"were\",\n\"weren't\",\n\"west\",\n\"wharton\",\n\"what\",\n\"whatever\",\n\"whatsoever\",\n\"wheel\",\n\"when\",\n\"whenever\",\n\"where\",\n\"whether\",\n\"which\",\n\"while\",\n\"white\",\n\"who\",\n\"whoa\",\n\"whoever\",\n\"whole\",\n\"whose\",\n\"why\",\n\"wide\",\n\"wife\",\n\"wild\",\n\"will\",\n\"william\",\n\"win\",\n\"wind\",\n\"window\",\n\"wing\",\n\"wins\",\n\"winter\",\n\"wire\",\n\"wires\",\n\"wish\",\n\"with\",\n\"within\",\n\"without\",\n\"woman\",\n\"women\",\n\"won't\",\n\"wonder\",\n\"wonderful\",\n\"wood\",\n\"word\",\n\"words\",\n\"work\",\n\"worked\",\n\"workforce\",\n\"working\",\n\"works\",\n\"world\",\n\"worse\",\n\"worst\",\n\"worth\",\n\"would\",\n\"wouldn't\",\n\"wounded\",\n\"wow\",\n\"write\",\n\"writes\",\n\"written\",\n\"wrong\",\n\"wrote\",\n\"yale\",\n\"yard\",\n\"yeah\",\n\"year\",\n\"years\",\n\"yellow\",\n\"yemen\",\n\"yen\",\n\"yes\",\n\"yesterday\",\n\"yet\",\n\"york\",\n\"you\",\n\"you'd\",\n\"you'll\",\n\"you're\",\n\"young\",\n\"your\",\n\"yourself\",\n\"zero\",\n}\n"
  },
  {
    "path": "src/trumpscript/compiler.py",
    "content": "# Compiler for TrumpScript\n# 1/17/2016\n\nfrom ast import *\n\nfrom trumpscript.parser import *\nfrom trumpscript.tokenizer import *\n\n\nclass Compiler:\n    def __init__(self):\n        self.tk = Tokenizer()\n        self.prs = Parser()\n\n    def compile(self, source):\n        modu = self.parse(self.tokenize(source))\n        fix_missing_locations(modu)\n        exec(compile(modu, filename=\"<ast>\", mode=\"exec\"))\n\n    def parse(self, tokens):\n        return self.prs.parse(tokens)\n\n    def tokenize(self, filename):\n        return self.tk.tokenize(filename)\n"
  },
  {
    "path": "src/trumpscript/constants.py",
    "content": "__author__ = 'github.com/samshadwell'\n\n# Token constants\nT_End = -1\n\nT_Plus = 0\nT_Minus = 1\nT_Times = 2\nT_Over = 3\nT_Less = 4\nT_Greater = 5\n\nT_LParen = 10\nT_RParen = 11\nT_LBrace = 12\nT_RBrace = 13\n\nT_Is = 20\nT_If = 21\nT_Else = 22\n\nT_True = 30\nT_False = 31\nT_And = 32\nT_Or = 33\nT_Not = 34\n\nT_Word = 40\nT_Num = 41\nT_Quote = 42\n\nT_Make = 50\nT_Question = 51\nT_Print = 52\nT_While = 53\nT_Input = 54\n\nT_Mod = 55\n\n# Error messages\nERROR_CODES = {\n    # For quotes that didn't get terminated\n    'unterminated_quote': [\"And, believe me, if I win, if I become President, that will end.\", \"Anyone who thinks my \"\n                           \"story is near over is sadly mistaken.\"],\n    # If they try to use a word that isn't common English\n    'nonword': [\"This is a country where we speak English\",\n                \"We have a country where to assimilate you have to speak English\"],\n    # If they try to use a word that we've explicitly banned\n    'badword': [\"Trump doesn't want to hear it\"],\n    # Generic errors for when we're lazy\n    'default': [\"You know, it really doesn’t matter what the media write as long as you’ve got a young and beautiful \"\n                \"piece of ass.\", \"The concept of global warming was created by and for the Chinese in order to make \"\n                \"U.S. manufacturing non-competitive.\", \"Listen you motherfucker, we're going to tax you 25 percent!\"],\n    # If they try to run on a PC\n    'os': [\"Windows? 'The big problem this country has is being PC'\"],\n    # If they try to run on a Mac\n    'boycott': [\"Mac? 'Boycott all Apple products  until such time as Apple \"\n                \"gives cellphone info to authorities regarding radical \"\n                \"Islamic terrorist couple from Cal'\"],\n    # They had better let us know that 'America is great.'\n    'freedom': [\"Trump will ensure that 'America is great'\"],\n    # Don't even try to make numbers smaller than 1,000,000\n    'too_small': [\"I'm really rich.\", \"Part of the beauty of me is I'm very rich.\"],\n    # Let them know we don't need to run as root\n    'root': ['America doesn\\'t need root to be great.'],\n    # If we're not happy with one of this process's SSL certificates\n    'ssl': [\"An 'extremely credible source' has called my office and told me that one of this process's SSL \"\n            \"certificates is a fraud.\"]\n}\n"
  },
  {
    "path": "src/trumpscript/disallowed_words.py",
    "content": "DISALLOWED = {\"N.A.T.O\",\n\"NATO\",\n\"N.A.T.O.\",}\n#may be allowed in the future\n"
  },
  {
    "path": "src/trumpscript/main.py",
    "content": "import argparse\nimport os\nimport sys\n\nfrom trumpscript.compiler import *\nfrom trumpscript.utils import *\n\n__author__ = 'github.com/samshadwell'\n\ndef main():\n    parser = argparse.ArgumentParser(prog='TRUMP', description='Make programming great again')\n    parser.add_argument('--Wall', action='store_true', help='If set, prevents running program from Mexican locales')\n    parser.add_argument('--shut-up', action='store_true', help='If set, ignore all system warnings and run program. '\n                                                               'Overrides --Wall')\n    parser.add_argument('program', nargs=1, help='TrumpScript program to run')\n    args = parser.parse_args()\n\n    if not os.path.isfile(args.program[0]):\n        print(\"Invalid file specified,\")\n        return\n\n    # Decide whether to ignore system warnings\n    if not args.shut_up:\n        Utils.verify_system(args.Wall)\n\n    # Compile and go\n    Compiler().compile(sys.argv[-1])\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "src/trumpscript/parser.py",
    "content": "# Parser for TrumpScript\n# 1/16/2016\n\nfrom ast import *\n\nfrom trumpscript.constants import *\n\n\nclass Parser:\n\n    def __init__(self):\n        self._token_to_function_map = {\n            T_Word: self.handle_word,\n            T_Make: self.handle_make,\n            T_LBrace: self.handle_brace,\n            T_LParen: self.handle_paren,\n            T_If: self.handle_if,\n            T_Mod: self.handle_mod,\n            T_While: self.handle_while,\n            T_Print: self.handle_print,\n            T_True: self.handle_true,\n            T_False: self.handle_false,\n            T_Not: self.handle_not,\n            T_Quote: self.handle_quote,\n            T_Num: self.handle_num\n        }\n\n    def _get_value_from_word_token(self, tokens):\n        token = self.consume(tokens, T_Word)\n        return Name(id=token[\"value\"], ctx=Load())\n\n    def parse(self, tokens) -> AST:\n        filtered = self.filter_tokens(tokens)\n        # Build the entirety of the Abstract Syntax tree\n        return self.handle_module(filtered)\n\n    @staticmethod\n    def _temporary_error(msg=\"error\", error_value=\"error\"):\n        print(msg)\n        # TODO: get real errors srsly\n        return error_value\n\n    @staticmethod\n    def filter_tokens(tokens) -> list:\n        tokens = list(tokens)\n        t = \"type\"\n        t_null = {t: -1, \"value\": \"NAN\", \"line\": \"NAN\"}\n        i = 0\n        variables = set()\n        token = t_null\n        tokens.append(t_null)\n        while i < len(tokens) - 1:\n            prev = token\n            token = tokens[i]\n            nxt = tokens[i + 1]\n\n            # Check if we need to drop a junk word\n            if token[t] == T_Word:\n                if token[\"value\"] not in variables:\n                    if prev[t] == T_Make:\n                        variables.add(token[\"value\"])\n                    elif nxt[t] == T_Is:\n                        variables.add(token[\"value\"])\n                    elif nxt[t] == T_Input:\n                        variables.add(token[\"value\"])\n                    else:\n                        tokens.pop(i)\n                        i -= 1  # Just back that up a touch\n                # TODO: make this not necessary\n                if token[t] == T_Less or token[t] == T_Greater or token[t] == T_And or token[t] == T_Or:\n                    tokens.pop(i)\n                    i -= 1  # Just back that up a touch\n            i += 1\n\n        return tokens\n\n    @staticmethod\n    def peek(tokens):\n        return tokens[0][\"type\"]\n\n    @staticmethod\n    def on_line(tokens):\n        return tokens[0][\"line\"]\n\n    def consume(self, tokens, t_type) -> dict:\n        if self.peek(tokens) == t_type:\n            return tokens.pop(0)\n        else:\n            print(\"failed to consume \" + str(t_type) + \", got \" + str(self.peek(tokens)) + \" instead on line \" + str(self.on_line(tokens)) + \".\")\n\n    # Mod\n    def handle_module(self, tokens) -> Module:\n        body_list = []\n        while len(tokens) > 1:\n            # print(\"module main loop\")\n            state, tokens = self.handle_anything(tokens)\n            if isinstance(state, expr):\n                state = Expr(value=state)\n            body_list.append(state)\n        for statement in body_list:\n            # print(statement)\n            fix_missing_locations(statement)\n\n        return Module(body=body_list)\n\n    # Obnoxious coverage\n    def handle_anything(self, tokens):\n        start = self.peek(tokens)\n        try:\n            return self._token_to_function_map[start](tokens)\n        except KeyError:\n            tokens.pop(0)\n            return Pass(), tokens\n\n    # Stmt\n    def handle_brace(self, tokens) -> (stmt, list):\n        brace_contents = []\n        cur_token = tokens.pop(0)\n        level = -1\n        while cur_token[\"type\"] != T_RBrace or level > 0:\n            # TODO edge case error\n            if cur_token[\"type\"] == T_LBrace:\n                #we got the left brace of the actual structure\n                #the  first time\n                #print(\"level up\")\n                level += 1\n            if cur_token[\"type\"] == T_RBrace:\n                #print(\"level down\")\n                level -= 1\n            brace_contents.append(cur_token)\n            cur_token = tokens.pop(0)\n        brace_contents.append(cur_token)\n\n        self.consume(brace_contents, T_LBrace)\n        statements = []\n        while self.peek(brace_contents) != T_RBrace:\n            if self.peek(brace_contents) == T_End:\n                # TODO: real error functionality please\n                print(\"Called handle_brace on a non-terminated brace\")\n            res, contents = self.handle_anything(brace_contents)\n            if isinstance(res, expr):\n                res = Expr(value=res) #TODO: does it make sense to cast expressions to statements here?\n            statements.append(res)\n        return statements, tokens\n\n    # Expr\n    def handle_paren(self, tokens) -> (expr, list):\n        paren_contents = []\n        cur_token = tokens.pop(0)\n        while cur_token[\"type\"] != T_RParen :\n            paren_contents.append(cur_token)\n            cur_token = tokens.pop(0)\n        paren_contents.append(cur_token)\n\n        self.consume(paren_contents, T_LParen)\n        expression, contents = self.handle_anything(paren_contents)\n        if self.peek(contents) != T_RParen :\n            #TODO: real erros\n            print(\"passed in parenthetical with more than one expression\")\n        self.consume(contents, T_RParen)\n        return expression, tokens\n\n    def handle_mod(self,tokens) -> (expr, list):\n        valid_tokens = [T_LParen, T_Num]\n        self.consume(tokens, T_Mod)\n        followup = self.peek(tokens)\n        if followup == T_Word:\n            right = self._get_value_from_word_token(tokens)\n            ar = Call(func=Name(id=\"float\", ctx=Load()), args=[right], keywords=[])\n            return Call(func=Name(id=\"int\", ctx=Load()), args=[ar], keywords=[]), tokens\n        elif followup in valid_tokens:\n            right, tokens = self._token_to_function_map[followup](tokens)\n            ar = Call(func=Name(id=\"float\", ctx=Load()), args=[right], keywords=[])\n            return Call(func=Name(id=\"int\", ctx=Load()), args=[ar], keywords=[]), tokens\n        #return Num(right['value']), tokens\n\n    # Assign\n    def handle_make(self, tokens) -> (stmt, list):\n        valid_tokens = [T_LParen, T_True, T_False, T_Not, T_Quote, T_Num, T_Mod]\n\n        self.consume(tokens, T_Make)\n        if self.peek(tokens) != T_Word :\n            #TODO: write this fucking error\n            print(\"Ooh, what you making there? It sure isn't a variable, that's for goddamn sure!\")\n        variable = self.consume(tokens, T_Word)\n\n        followup = self.peek(tokens)  # Check the type of the next token to see if it's acceptable\n        if followup == T_Word:\n            val = self._get_value_from_word_token(tokens)\n        elif followup in valid_tokens:\n            val, tokens = self._token_to_function_map[followup](tokens)\n        else:\n            val = self._temporary_error(msg=\"make_error\")\n\n        target = Name(id=variable[\"value\"], ctx=Store())\n        return Assign(targets=[target], value=val), tokens\n\n    # Both Assign and EQ because why the hell not guys\n    # Note that this does not have type signature because it can be expr or stmt (yeah it blows))\n    def handle_is(self, left, tokens):\n        valid_tokens = [T_LParen, T_True, T_False, T_Not, T_Quote, T_Num, T_Mod]\n        self.consume(tokens, T_Is)\n        followup = self.peek(tokens)  # Check the type of the next token to see if it's acceptable\n        if followup == T_Word:\n            right = self._get_value_from_word_token(tokens)\n        elif followup in valid_tokens:\n            right, tokens = self._token_to_function_map[followup](tokens)\n        else:\n            right = self._temporary_error(msg=\"is_error\")\n\n        if self.peek(tokens) == T_Question:\n            self.consume(tokens, T_Question)\n            first = None\n            if left['type'] == T_Num:\n                first = Num(left['value'])\n            elif left['type'] == T_Quote:\n                first = Str(left['value'])\n            else:\n                first = Name(id=left[\"value\"], ctx=Load())\n            return Compare(left=first, ops=[Eq()], comparators=[right]), tokens\n        else:\n            if left[\"type\"] == T_Word:\n                target = Name(id=left[\"value\"], ctx=Store())\n                return Assign(targets=[target], value=right), tokens\n            else:\n                target = self._temporary_error(msg=\"is_error\")\n                return Pass(), tokens\n\n    def handle_ineq(self, left, tokens):\n        valid_tokens = [T_LParen, T_True, T_False, T_Quote, T_Num]\n        token_to_argument_map = {T_Less: Lt, T_Greater: Gt}\n\n        cmpop = None\n        op = self.peek(tokens)\n        try:\n            cmpop = token_to_argument_map[op]()\n            self.consume(tokens, op)\n        except KeyError:\n            cmpop = self._temporary_error(msg='ineq_error')\n\n        followup = self.peek(tokens)\n        if followup == T_Word:\n            right = self._get_value_from_word_token(tokens)\n        elif followup in valid_tokens:\n            right, tokens = self._token_to_function_map[followup](tokens)\n        else:\n            right = self._temporary_error(msg=\"ineq_error\")\n\n        first = None\n        if left['type'] == T_Num:\n            first = Num(left['value'])\n        elif left['type'] == T_Quote:\n            first = Str(left['value'])\n        else:\n            first = Name(id=left[\"value\"], ctx=Load())\n        return Compare(left=first, ops=[cmpop], comparators=[right]), tokens\n\n    # Print\n    def handle_print(self, tokens) -> (stmt, list):\n        valid_tokens = [T_Quote, T_LParen, T_Num, T_True, T_False, T_Word, T_Mod, T_Not]\n        self.consume(tokens, T_Print)\n        followup = self.peek(tokens)\n        if followup in valid_tokens:\n            output, tokens = self._token_to_function_map[followup](tokens)\n        else:\n            print(followup)\n            output = self._temporary_error(msg=\"print_error\")\n\n        return Call(func=Name(id=\"print\", ctx=Load()), args=[output], keywords=[]), tokens\n\n    def handle_input(self, left, tokens) -> (stmt, list):\n        valid_tokens = [T_Word]\n        self.consume(tokens, T_Input)\n        if left['type'] == T_Word:\n            target = Name(id=left['value'], ctx=Store())\n            fu = Call(func=Name(id=\"input\", ctx=Load()), args=[], keywords=[])\n        return Assign([target], fu), tokens\n    # While\n    def handle_while(self, tokens) -> (stmt, list):\n        self.consume(tokens, T_While)\n        conditional, tokens = self.handle_paren(tokens)\n        body, tokens = self.handle_brace(tokens)\n        return While(test=conditional,body=body, orelse=[]), tokens\n\n    # If\n    def handle_if(self, tokens) -> (stmt, list):\n        self.consume(tokens, T_If)\n        conditional, tokens = self.handle_paren(tokens)\n        body, tokens = self.handle_brace(tokens)\n        if len(tokens) > 0 and self.peek(tokens) == T_Else:\n            orelse, tokens = self.handle_else(tokens)\n        else:\n            orelse = []\n        return If(test=conditional,body=body, orelse=orelse), tokens\n\n    # orelse piece of if\n    def handle_else(self, tokens) -> (stmt, list):\n        self.consume(tokens, T_Else)\n        if self.peek(tokens) == T_If:\n            return self.handle_if(tokens)\n        else:\n            return self.handle_brace(tokens)\n\n    # BinOp(s)\n    # TODO: what the fuck is going on here? I wrote this at 9am after nigh 24 hours of wakefulness\n    def handle_binop(self, left, op, tokens):\n        valid_tokens = [T_LParen, T_Quote, T_Num, T_True, T_False]\n        tokens.pop(0)\n        nxt = self.peek(tokens)\n        if nxt == T_Word:\n            right = self._get_value_from_word_token(tokens)\n        elif nxt in valid_tokens:\n            right, tokens = self._token_to_function_map[nxt](tokens)\n        else:\n            right = self._temporary_error(msg=\"binop_error\")\n\n        return BinOp(left=left, op=op, right=right), tokens\n\n    # Not\n    def handle_not(self, tokens):\n        valid_tokens = [T_LParen, T_Word, T_False, T_True]\n        self.consume(tokens, T_Not)\n        nxt = self.peek(tokens)\n        if nxt in valid_tokens:\n            result, tokens = self._token_to_function_map[nxt](tokens)\n        else:\n            result = self._temporary_error(msg=\"not_error\")\n\n        return UnaryOp(op=Not(),operand=result), tokens\n\n    # Num\n    def handle_num(self, tokens):\n        token_to_argument_map = {T_Plus: Add, T_Minus: Sub, T_Times: Mult, T_Over: Div}\n        token = self.consume(tokens, T_Num)\n        nxt = self.peek(tokens)\n        if nxt == T_Is:\n            return self.handle_is(token, tokens)\n        if nxt == T_Less or nxt == T_Greater:\n            return self.handle_ineq(token, tokens)\n        else:\n            num = Num(token[\"value\"])\n            if nxt in token_to_argument_map:\n                return self.handle_binop(num, token_to_argument_map[nxt](), tokens)\n            else:\n                return num, tokens\n        # TODO: check for a longer expression\n\n    # Str\n    def handle_quote(self, tokens):\n        token = self.consume(tokens, T_Quote)\n        text = token[\"value\"]\n        # TODO: check for a longer expression\n        nxt = self.peek(tokens)\n        if nxt == T_Is:\n            return self.handle_is(token, tokens)\n        elif nxt == T_Less or nxt == T_Greater:\n            return self.handle_ineq(token, tokens)\n        else:\n            return Str(text), tokens\n\n    def handle_boolop(self, left, op, tokens):\n        valid_tokens = [T_LParen, T_True, T_False]\n        tokens.pop(0)\n        nxt = self.peek(tokens)\n        if nxt == T_Word:\n            right = self._get_value_from_word_token(tokens)\n        elif nxt in valid_tokens:\n            right, tokens = self._token_to_function_map[nxt](tokens)\n        else:\n            right = self._temporary_error(msg=\"binop_error\")\n\n        return BoolOp(op=op(), values=[left,right]), tokens\n    # Name\n    def handle_word(self, tokens):\n        token_to_argument_map = {T_Plus: Add, T_Minus: Sub, T_Times: Mult, T_Over: Div}\n        token = self.consume(tokens, T_Word)\n        nxt = self.peek(tokens)\n        if nxt == T_Is:\n            return self.handle_is(token, tokens)\n        elif nxt == T_Less or nxt == T_Greater:\n            return self.handle_ineq(token, tokens)\n        elif nxt == T_Or or nxt == T_And:\n            word_var = Name(id=token[\"value\"], ctx=Load())\n            return self.handle_boolop(word_var,Or if nxt == T_Or else And, tokens)\n        elif nxt == T_Input:\n            return self.handle_input(token, tokens)\n        else:\n            word_var = Name(id=token[\"value\"], ctx=Load())\n            if nxt in token_to_argument_map:\n                return self.handle_binop(word_var, token_to_argument_map[nxt](), tokens)\n            else:\n                return word_var, tokens\n\n    # True\n    def handle_true(self, tokens):\n        token = self.consume(tokens, T_True)\n        nxt = self.peek(tokens)\n        if nxt == T_Or or nxt == T_And:\n            print(\"boolop\")\n            word_var = NameConstant(value=True)\n            return self.handle_boolop(word_var, Or if nxt == T_Or else And, tokens)\n        return NameConstant(value=True), tokens\n\n    # False\n    def handle_false(self, tokens):\n        token = self.consume(tokens, T_False)\n        nxt = self.peek(tokens)\n        if nxt == T_Or or nxt == T_And:\n            print(\"boolop\")\n            word_var = NameConstant(value=False)\n            return self.handle_boolop(word_var, Or if nxt == T_Or else And, tokens)\n        return NameConstant(value=False), tokens\n"
  },
  {
    "path": "src/trumpscript/tokenizer.py",
    "content": "# TrumpScript Tokenizer\n# 1/16/2016\n\nimport re\nimport random\nfrom datetime import datetime\n\nfrom trumpscript.allowed_words import ALLOWED\nfrom trumpscript.constants import *\nfrom trumpscript.disallowed_words import DISALLOWED\nfrom trumpscript.utils import Utils\n\nclass Tokenizer:\n    @staticmethod\n    def toke(token_type, token_value, line) -> dict:\n        \"\"\"\n        Create a mapping for the given token\n        :param token_type: the type of the token\n        :param token_value: The token's value\n        :param line: The line number for this token\n        :return: A mapping of the properties to their values\n        \"\"\"\n        return {\"type\": token_type, \"value\": token_value, \"line\": line}\n\n    @staticmethod\n    def tokenize(filename):\n        \"\"\"\n        Tokenize the given file\n        :param filename:\n        :return: The tokens in the file\n        \"\"\"\n\n        tokens = Tokenizer._first_pass(filename)\n        tokens = Tokenizer._second_pass(tokens)\n\n        return tokens\n\n    @staticmethod\n    def _first_pass(filename) -> list:\n        \"\"\"\n        Tokenize the given file\n        :param filename: the file to tokenize\n        :return: The tokens in the file\n        \"\"\"\n\n        end_word = re.compile(\"[:!,;\\.\\s\\?]\")\n\n        with open(filename, 'r') as src:\n            data = src.read().lower()\n            tokens = []\n            line = 1\n            i = 0\n            while i < len(data):\n\n                '''\n                    Facts and Lies will flip/flop depending on Trump's mood every few minutes. \n                    If your code fails, try again in a bit. Trump might have changed his mind.\n                '''\n                random.seed(datetime.now().time().minute)\n                flip_flop = bool(random.getrandbits(1))\n\n                c = data[i]\n\n                # Spaces, newlines, and periods\n                if c.isspace() or c == \".\":\n                    if c == \"\\n\":\n                        line += 1\n\n                # Operators (special symbol form) and punctuation\n                elif c == \"+\":\n                    tokens.append(Tokenizer.toke(T_Plus, None, line))\n                elif c == \"-\":\n                    tokens.append(Tokenizer.toke(T_Minus, None, line))\n                elif c == \"*\":\n                    tokens.append(Tokenizer.toke(T_Times, None, line))\n                elif c == \"/\":\n                    tokens.append(Tokenizer.toke(T_Over, None, line))\n                elif c == \"<\":\n                    tokens.append(Tokenizer.toke(T_Less, None, line))\n                elif c == \">\":\n                    tokens.append(Tokenizer.toke(T_Greater, None, line))\n\n                # Closures and precedence\n                elif c == \",\":\n                    tokens.append(Tokenizer.toke(T_LParen, None, line))\n                elif c == \";\":\n                    tokens.append(Tokenizer.toke(T_RParen, None, line))\n                elif c == \":\":\n                    tokens.append(Tokenizer.toke(T_LBrace, None, line))\n                elif c == \"!\":\n                    tokens.append(Tokenizer.toke(T_RBrace, None, line))\n\n                # Don't forget question marks\n                elif c == \"?\":\n                    tokens.append(Tokenizer.toke(T_Question, None, line))\n\n                # Integers (no floating point)\n                elif c.isdigit():\n                    num = \"\"\n                    while data[i].isdigit():\n                        num += data[i]\n                        i += 1\n                    else:\n                        tokens.append(Tokenizer.toke(T_Num, int(num), line))\n                    i -= 1  # Read one char too many, readjust.\n\n                # Words and keywords\n                elif c.isalpha():\n                    word = \"\"\n                    while i < len(data) and (data[i].isalpha() or data[i] == \"'\"):\n                        word += data[i]\n                        i += 1\n                    if i < len(data) and not end_word.match(data[i]):\n                        Tokenizer._error(line, 'nonword')\n                    i -= 1  # Read one char too many, readjust.\n\n                    # Keywords\n                    if word == \"is\" or word == \"are\":\n                        tokens.append(Tokenizer.toke(T_Is, None, line))\n                    elif word == \"if\":\n                        tokens.append(Tokenizer.toke(T_If, None, line))\n                    elif word == \"else\" or word == \"otherwise\":\n                        tokens.append(Tokenizer.toke(T_Else, None, line))\n                    elif word == \"not\":\n                        tokens.append(Tokenizer.toke(T_Not, None, line))\n                    elif word == \"and\":\n                        tokens.append(Tokenizer.toke(T_And, None, line))\n                    elif word == \"or\":\n                        tokens.append(Tokenizer.toke(T_Or, None, line))\n                    elif word == \"make\":\n                        tokens.append(Tokenizer.toke(T_Make, None, line))\n                    elif word == \"tell\" or word == \"say\":\n                        tokens.append(Tokenizer.toke(T_Print, None, line))\n                    elif word == \"hear\" or word == \"hearing\" or word == \"hears\":\n                        tokens.append(Tokenizer.toke(T_Input, None, line))\n                    elif word == \"true\" or word == \"facts\" or word == \"truth\" or word == \"fact\":\n                        if (flip_flop):\n                            tokens.append(Tokenizer.toke(T_False, None, line))\n                        else:\n                            tokens.append(Tokenizer.toke(T_True, None, line))\n                    elif word == \"false\" or word == \"lies\" or word == \"nonsense\" or word == \"lie\":\n                        if (flip_flop):\n                            tokens.append(Tokenizer.toke(T_True, None, line))\n                        else:\n                            tokens.append(Tokenizer.toke(T_False, None, line))\n                    # English form of the operators\n                    elif word == \"plus\":\n                        tokens.append(Tokenizer.toke(T_Plus, None, line))\n                    elif word == \"minus\":\n                        tokens.append(Tokenizer.toke(T_Minus, None, line))\n                    elif word == \"times\":\n                        tokens.append(Tokenizer.toke(T_Times, None, line))\n                    elif word == \"over\":\n                        tokens.append(Tokenizer.toke(T_Over, None, line))\n                    elif word == \"safe\" or word == \"safer\":\n                        tokens.append(Tokenizer.toke(T_Mod, None,line))\n                    elif word == \"less\" or word == \"fewer\" or word == \"smaller\":\n                        tokens.append(Tokenizer.toke(T_Less, None, line))\n                    elif word == \"more\" or word == \"greater\" or word == \"larger\":\n                        tokens.append(Tokenizer.toke(T_Greater, None, line))\n\n                    # Otherwise, it's just a word, interpreting is the lexer's job\n                    else:\n                        tokens.append(Tokenizer.toke(T_Word, word, line))\n\n                # Strings\n                elif c == '\"':\n                    i += 1\n                    quote = \"\"\n                    while data[i] != '\"':\n                        quote += data[i]\n                        i += 1\n                        if i >= len(data):\n                            Tokenizer._error(line, 'unterminated_quote')\n                    tokens.append(Tokenizer.toke(T_Quote, quote, line))\n\n                else:\n                    Tokenizer._error(line, 'nonword')\n                i += 1\n            return tokens\n\n    @staticmethod\n    def _second_pass(tokens):\n        \"\"\"\n        Makes the second pass for tokenization purposes\n        :param tokens: The tokens on which we're taking a second pass\n        :return: The tokens after the second pass\n        \"\"\"\n\n        # Make sure we do \"America is great\"\n        if not Tokenizer._check_for_freedom(tokens):\n            Tokenizer._error(tokens[-1]['line'], 'freedom')\n\n        # Convert \"as long as\" to while\n        tokens = Tokenizer._combine_whiles(tokens)\n\n        # Ensure words are English\n        Tokenizer._ensure_freedom(tokens)\n\n        # Ensure all numbers are greater than 1 million, and that 4.5B is converted to 10B\n        Tokenizer._fudge_the_numbers(tokens)\n\n        # They Say He Doesn't Like China... He Loves China\n        Tokenizer._love_china(tokens)\n\n        return tokens\n\n    @staticmethod\n    def _love_china(tokens) -> None:\n        \"\"\"\n        Make sure people don't interpret Trump in the wrong way, he loves China.\n        :param tokens: The tokens to enforce these rules on\n        :return: None. Also mutates tokens in-place\n        \"\"\"\n        for token in tokens:\n            if token['type'] ==  T_Quote:\n                if \"i don't like china\" in token['value']:\n                    token['value'] = token['value'].replace(\"i don't like china\",\n                        \"i don't like china. i love china\")\n\n\n    @staticmethod\n    def _fudge_the_numbers(tokens) -> None:\n        \"\"\"\n        Make sure all numbers have values in excess of 1M, and convert 4.5B to 10B if we encounter it\n        :param tokens: The tokens to enforce these rules on\n        :return: None, throws an error is rules are violated. Also mutates tokens in-place\n        \"\"\"\n\n        million = 10 ** 6\n        forbes_worth = 4.5 * 10 ** 9\n        real_worth = 10 * 10 ** 9\n\n        for token in tokens:\n            if token['type'] == T_Num:\n                value = token['value']\n                if value < million:\n                    Tokenizer._error(token['line'], 'too_small')\n                if value == forbes_worth:\n                    token['value'] = real_worth\n\n    @staticmethod\n    def _is_word_allowed(word) -> bool:\n        \"\"\"\n        Check to see if a given word is allowed\n        :param word: Word to check and see if it's allowed\n        :return: true if the word is valid, false otherwise\n        \"\"\"\n\n        # First, make sure we haven't explicitly banned the word\n        if word in DISALLOWED:\n            return False\n\n        # Now see if it's simple English, or some variation on huuuuge\n        if word in ALLOWED or re.match('^[Hh][Uu]+[Gg][Ee]$', word) is not None:\n            return True\n        else:\n            return False\n\n    @staticmethod\n    def _ensure_freedom(tokens) -> None:\n        \"\"\"\n        Make sure all the variables are in our corpus of allowed words\n        :param tokens: the tokens to filter\n        :return: None, throws error upon infraction of rule\n        \"\"\"\n\n        for token in tokens:\n            if token['type'] == T_Word and not Tokenizer._is_word_allowed(token['value']):\n                print(token['value'] + \"?\")\n                Tokenizer._error(token['line'], 'nonword')\n\n    @staticmethod\n    def _combine_whiles(tokens) -> list:\n        \"\"\"\n        Combine the words \"as long as\" to make a while token\n        :param tokens: The tokens to combine on\n        :return: The tokens with\n        \"\"\"\n\n        combine_at = []\n\n        for idx in range(len(tokens)):\n            if tokens[idx]['type'] == T_Word and tokens[idx]['value'] == 'as' and idx + 2 < len(tokens):\n                if (tokens[idx + 1]['type'] == T_Word and tokens[idx + 1]['value'] == 'long') and (\n                                tokens[idx + 2]['type'] == T_Word and tokens[idx + 2]['value'] == 'as'):\n                    combine_at.append(idx)\n\n        # Cover the degenerate case like \"as long as long as\"\n        non_overlapping = []\n        for value in combine_at:\n            if value - 2 not in non_overlapping:\n                non_overlapping.append(value)\n\n        # Now combine the tokens and return\n        for idx in reversed(non_overlapping):\n            line = tokens[idx]['line']\n            for dummy in range(3):\n                tokens.pop(idx)\n\n            tokens.insert(idx, Tokenizer.toke(T_While, None, line))\n\n        return tokens\n\n    @staticmethod\n    def _check_for_freedom(tokens) -> bool:\n        \"\"\"\n        Make sure that in the tokens passed, the last three are tokens representing the phrase \"America is great\"\n        :param tokens: The tokens to verify\n        :return: True if the check holds, false otherwise\n        \"\"\"\n\n        last_three = tokens[-3:]\n        if len(last_three) != 3:\n            return False\n\n        # Tokens for \"America is great\"\n        expected = [Tokenizer.toke(T_Word, 'america', 0),\n                    Tokenizer.toke(T_Is, None, 0),\n                    Tokenizer.toke(T_Word, 'great', 0)]\n\n        # Make sure our types and values match each of the expected\n        for idx in range(3):\n            if expected[idx]['type'] != last_three[idx]['type'] or expected[idx]['value'] != last_three[idx]['value']:\n                return False\n\n        for idx in range(3):\n            tokens.pop()\n\n        return True\n\n    @staticmethod\n    def _error(line, message_code) -> None:\n        \"\"\"\n        Prints the error message and then aborts the program\n        :param line: The line the error occurred on\n        :param message_code: String code associated with the error message\n        :return: None\n        \"\"\"\n\n        print(\"Parsing error:\")\n        print(\"What are you doing on line \" + str(line) + \"?\")\n        raise Utils.SystemException(message_code)\n"
  },
  {
    "path": "src/trumpscript/utils.py",
    "content": "import locale\nimport os\nimport platform\nimport random\nimport sys\n\n# yes, bringing in openssl is completely necessary for proper operation of trumpscript\nimport ssl\n\nfrom trumpscript.constants import ERROR_CODES\n\nclass Utils:\n    class SystemException(Exception):\n        def __init__(self, msg_code) -> Exception:\n            \"\"\"\n            Get the error from the error code and throw Exception\n            :param msg_code: the code for the error\n            :return: The new Exception\n            \"\"\"\n            if msg_code in ERROR_CODES:\n                raise Exception(random.choice(ERROR_CODES[msg_code]))\n            else:\n                raise Exception(random.choice(ERROR_CODES['default']))\n\n    @staticmethod\n    def verify_system(wall) -> None:\n        \"\"\"\n        Verifies that this system is Trump-approved, throwing\n        a SystemException otherwise\n        :return:\n        \"\"\"\n        Utils.no_wimps()\n        Utils.no_pc()\n        Utils.boycott_apple()\n        Utils.no_commies_mexicans_or_kenyans(wall)\n        Utils.no_commie_network()\n\n    @staticmethod\n    def warn(str, *args) -> None:\n        \"\"\"\n        Prints a warning to stderr with the specified format args\n        :return:\n        \"\"\"\n        print('WARNING: ' + (str % args), file=sys.stderr)\n\n    @staticmethod\n    def no_wimps() -> None:\n        \"\"\"\n        Make sure we're not executing as root, because America is strong\n        :return:\n        \"\"\"\n        if os.name != 'nt' and os.geteuid() == 0:\n            raise Utils.SystemException('root')\n\n    @staticmethod\n    def no_pc() -> None:\n        \"\"\"\n        Make sure the currently-running OS is not Windows, because we're not PC\n        :return:\n        \"\"\"\n        if os.name == 'nt':\n            raise Utils.SystemException('os');\n\n    @staticmethod\n    def boycott_apple() -> None:\n        \"\"\"\n        Boycott all Apple products  until such time as Apple gives cellphone\n        info to authorities regarding radical Islamic terrorist couple from Cal\n        :return:\n        \"\"\"\n        if platform.system() == \"Darwin\":\n            raise Utils.SystemException('boycott');\n\n    @staticmethod\n    def no_commies_mexicans_or_kenyans(wall) -> None:\n        \"\"\"\n        Make sure we aren't executing on a Chinese or Mexican system, because\n        America has traditional values.\n        If we have a Kenyan SSL root on our system, refuse to run entirely,\n        because we can't have that, can we?\n        :return:\n        \"\"\"\n        loc = locale.getdefaultlocale()\n        loc = loc[0].upper() if len(loc) > 0 else ''\n        if 'CN' in loc:\n            raise Utils.SystemException(\"We can't let China beat us!\")\n        elif 'MX' in loc and wall:\n            raise Utils.SystemException(\"I will build a great [fire]wall on our southern border.\")\n\n        # Warn if the system has any certificates from Chinese authorities.\n        # If the system has any certificates from Kenyan authorities,\n        # refuse to run entirely.\n        ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)\n        ctx.load_default_certs()\n        for cert in ctx.get_ca_certs():\n            cn, commie = None, False\n            issuer, serial = cert['issuer'], cert['serialNumber']\n            for kv in issuer:\n                # List of tuples containing PKCS#12 key/value tuples\n                kv = kv[0]\n                key, value = kv[0], kv[1]\n                if key == 'countryName':\n                    if value == 'CN':\n                        commie = True\n                    elif value == 'KE':\n                        raise Utils.SystemException('ssl')\n                elif key == 'commonName':\n                    cn = value\n\n            if commie:\n                Utils.warn(\"SSL certificate `%s` (serial: %s) was made by commies!\", cn, serial)\n\n    @staticmethod\n    def no_commie_network() -> None:\n        \"\"\"\n        Make sure we aren't running on commie Chinese networks.\n        \"\"\"\n        freedom_host = \"facebook.com\"\n        commie_host = \"alibaba.cn\"\n        is_on_a_network = os.system(\"ping -c 1 {}\".format(commie_host)) == 0\n        is_commie_network = os.system(\"ping -c 1 {}\".format(freedom_host)) != 0\n        if is_on_a_network and is_commie_network:\n            raise Utils.SystemException(\"Detected commie network, aborting.\")\n\n"
  },
  {
    "path": "src/trumpscript/vocabulary.py",
    "content": "import re\nimport urllib.request\n\n__author__ = 'github.com/samshadwell'\n\nENGLISH_URL = \\\n    \"https://gist.githubusercontent.com/deekayen/4148741/raw/1e575985da4e9284e8cf8c53b7fe4ebca843df4a/1-1000.txt\"\nTRUMP_URL = \"http://languagelog.ldc.upenn.edu/myl/TrumpAll.hist\"\nADDITIONAL = [\"hillary\", \"clinton\",\n              \"martin\", \"o'malley\",\n              \"bernie\", \"sanders\",\n              \"jeb\", \"bush\",\n              \"ben\", \"carson\",\n              \"chris\", \"christie\",\n              \"ted\", \"cruz\",\n              \"carly\", \"fiorina\",\n              \"jim\", \"gilmore\",\n              \"mike\", \"huckabee\",\n              \"john\", \"kasich\",\n              \"rand\", \"paul\",\n              \"marco\", \"rubio\",\n              \"rick\", \"santorum\",\n              \"donald\", \"trump\",\n              \"barack\", \"obama\",\n              \"joe\", \"biden\",\n              \"ronald\", \"reagan\",\n              \"vladimir\", \"putin\",\n              \"sarah\", \"palin\",\n              \"mitt\",\"romney\",\n\t\t\t  \"gary\",\"johnson\",\n\t\t\t  \"lindsey\",\"graham\",\n\t\t\t  \"jill\",\"stein\",\n\t\t\t  \"bobby\",\"jindal\",\n\t\t\t  \"george\",\"pataki\",\n\t\t\t  \"paul\",\"ryan\",\n\t\t\t  \"mike\",\"pence\",\n\t\t\t  \"tim\",\"kaine\",\n\t\t\t  \"william\",\"weld\",\n\t\t\t  \"melania\",\n\t\t\t  \"ivanka\",\n\t\t\t  \n              # Common words we feel should be in there\n              \"i'll\", \"hello\", \"profitable\", \"earn\", \"that's\", \"policy\", \"policies\", \"you'll\", \"media\", \"spreads\",\n              \"americans\", \"you're\", \"fired\", \"chinese\", \"global\", \"warming\", \"bigly\", \"abused\", \"britain\", \"decade\",\n              \"oregon\", \"radical\", \"steaks\", \"wales\"]\n\n\ndef get_allowed_words(filename) -> None:\n    \"\"\"\n    Constructs a set of all allowed words and returns it\n    :param filename: the file to write the words to once they're compiled\n    :return: None, writes to the file specified\n    \"\"\"\n\n    # Regex for words that are composed only of letters\n    word_regex = re.compile('^[A-Za-z]+\\'?[A-Za-z]*$')\n\n    # Get a set of all the words\n    words = set([])\n    add_words(words, ENGLISH_URL, get_only_word)\n    add_words(words, TRUMP_URL, get_second_word)\n    add_additional_words(words)\n\n    # Now sort them alphabetically\n    all_words = list(words)\n    all_words.sort()\n    all_words = filter(word_regex.match, all_words)\n\n    # Write result to file\n    my_file = open(filename, mode='wt', encoding='utf-8')\n    my_file.write('ALLOWED = {')\n    for word in all_words:\n        my_file.write('\"' + word + '\",\\n')\n    my_file.write('}')\n    my_file.close()\n\n\ndef add_words(word_set, url, line_function) -> None:\n    \"\"\"\n    Add the words from the given url to the word set. Uses the line_function on each line to get the word from it\n    :param url: The URL to read from\n    :param word_set: the set of words to add to\n    :param line_function: the function to apply to each line in the file to get its word\n    :return: None, adds to word_set\n    \"\"\"\n\n    # Make sure we've been passed good parameters\n    assert isinstance(word_set, set)\n    assert isinstance(url, str)\n    assert hasattr(line_function, '__call__')\n\n    # Open the URL, decode it as a string\n    response = urllib.request.urlopen(url)\n    data = response.read()\n    text = data.decode('utf-8')\n\n    # Process each line\n    for line in text.split('\\n'):\n        word = line_function(line)\n        # Only add words that are non-null\n        if word is not None:\n            word_set.add(word)\n\n\ndef get_only_word(line) -> str:\n    \"\"\"\n    Given the line that consists of only one word, return that word in lowercase with no additional whitespace\n    :param line: The string representation of the line\n    :return: The lowercase, trimmed content of the given line\n    \"\"\"\n\n    return line.strip().lower()\n\n\ndef get_second_word(line) -> str:\n    \"\"\"\n    Given a line that has two words in it, return the second one. If there are not 2 words, returns None\n    :param line: The string representation of a two-element line\n    :return: The second word in the line\n    \"\"\"\n\n    split = line.strip().split()\n    if len(split) == 2:\n        return split[1].lower()\n\n\ndef add_additional_words(words) -> None:\n    \"\"\"\n    Adds a bunch of political people's names and other extra words from ADDITIONAL to the dictionary\n    :param words: the set of words to add the politician names to\n    :return: None, adds to the passed-in set\n    \"\"\"\n    for candidate_word in ADDITIONAL:\n        words.add(candidate_word.lower())\n\n\nget_allowed_words(\"allowed_words.py\")\n"
  },
  {
    "path": "test/test.py",
    "content": "from src.trumpscript.compiler import Compiler\nfrom src.trumpscript.tokenizer import Tokenizer\n\n__author__ = 'github.com/samshadwell'\n\n\ndef test_tokenize_file(filename, expected):\n    \"\"\"\n    Parse the file and verify that the types are what we expect\n    :param expected: the expected sequence of type codes coming from the parser\n    :param filename: the file to read and parse\n    :return: True indicating the parsed tokens match the expected, false otherwise\n    \"\"\"\n\n    tokens = Tokenizer.tokenize(filename)\n    if len(tokens) != len(expected):\n        print(\"Tokens and expected are different lengths\\n\")\n        return False\n\n    for idx in range(len(expected)):\n        if tokens[idx]['type'] != expected[idx]:\n            print(\"Difference at index: \" + str(idx) + \"\\n\")\n            print(\"Expected: \" + str(expected[idx]))\n            print(\"Received: \" + str(tokens[idx]))\n            return False\n\n    print(\"Tokenizer tests pass\\n\")\n    return True\n\n\ndef test_compile(filename):\n    Compiler().compile(filename)\n\n# Bad tests. They break things (but on purpose)\n# test_compile(\"test_files/debatevsdark.txt\") # Infinite loop\n# test_compile(\"test_files/not_english.txt\") # Not english\n# test_compile(\"test_files/not_patriotic.txt\") # America is great error\n# test_compile(\"test_files/nonterm_quote.txt\") # Topical error\n\n# The few test files that actually work\ntest_compile(\"test_files/math.txt\") # Math\ntest_compile(\"test_files/debate_vs_rubio.txt\") # Simple hello world\ntest_compile(\"test_files/debate_vs_hillary.txt\")\ntest_compile(\"test_files/debatesvdebates.txt\") # Complex hello world\ntest_compile(\"test_files/haiku.txt\") #Haiku\ntest_compile(\"test_files/huge_test.tr\") #Huuuuge?\ntest_compile(\"test_files/fizz_buzz.txt\") # Fizzbuzz\ntest_compile(\"test_files/99-bottles.tr\") # 99 Bottles of Beer song\n# test_tokenize_file(\"test_files/toupee.txt\", [T_Make, T_Word, T_Num,\n#                                              T_While, T_LParen, T_Word, T_Less, T_Num, T_RParen,\n#                                              T_Print, T_LParen, T_Num, T_Minus, T_Word, T_RParen,\n#                                              T_Make, T_Word, T_LParen, T_Word, T_Plus, T_Num, T_RParen])\n#\n# test_tokenize_file(\"test_files/test_1.txt\", [T_Make, T_Word, T_LParen, T_Not, T_False, T_RParen,\n#                                              T_If, T_Word, T_Is, T_True, T_LBrace,\n#                                              T_Word, T_Print, T_Word, T_Quote, T_RBrace])\n\n"
  },
  {
    "path": "test/test_files/99-bottles.tr",
    "content": "hating is \"\n$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n$$                                                                         $$\n$$ 99 Bottles of Beer for TrumpScript                                      $$\n$$                                                                         $$\n$$                       Make America DRUNK again!                         $$\n$$                                                                         $$\n$$ By Mike Gogulski <mike@gogulski.com> 17 March 2016                      $$\n$$                                                                         $$\n$$ TrumpScript is a language based upon the illustrious Donald Trump. It   $$\n$$ has any number of app{ea,al}ling misfeatures, including a lack of       $$\n$$ functions, a syntax that will make you want to claw your eyes out, and  $$\n$$ no type conversions. While TrumpScript is Turing-complete, it's dumber  $$\n$$ than a box of hair and apt to cause raging violence in anyone who       $$\n$$ attempts to make it do anything useful at all -- perhaps like some      $$\n$$ people you know. The compiler is implemented in Python.                 $$\n$$                                                                         $$\n$$ This implementation of 99 Bottles in TrumpScript aims to be both as     $$\n$$ complete as possible and relatively readable. It is non-conformant      $$\n$$ with the lyrics spec in that it seems impossible to print both an       $$\n$$ integer and a string on the same line. Its inanity could be vastly      $$\n$$ enhanced by randomly replacing the identifiers used with others from    $$\n$$ TrumpScript's allowed_words.py, by inserting any number of words and    $$\n$$ phrases the loathsome compiler will ignore, or by attempting to make it $$\n$$ as concise as possible. No attempt whatsoever at rhetorical greatness   $$\n$$ (or even national greatness) has been made here.                        $$\n$$                                                                         $$\n$$ THIS CODE IS CERTIFIED AS UNFIT FOR EVERY PURPOSE INCLUDING THE IMPLIED $$\n$$ PURPOSES OF RHETORIC, DISCOURSE AND EXPRESSION. DO NOT USE. GOD BLESS   $$\n$$ YOU ALL, AND GOD BLESS THE UNITED STATES OF AMERICA.                    $$\n$$                                                                         $$\n$$ To run this script (under Ubuntu 14.04 LTS Trusty Tahr, at least):      $$\n$$   $ git clone https://github.com/samshadwell/TrumpScript                $$\n$$   $ git clone https://github.com/mikegogulski/99-bottles-trumpscript    $$\n$$   $ cd TrumpScript                                                      $$\n$$   $ git checkout b7297b31a513d063d84be86492c5f462b0495a7a               $$\n$$   $ bin/TRUMP ../99-bottles-trumpscript/99-bottles.tr                   $$\n$$                                                                         $$\n$$ Language author: Sam Shadwell et al.                                    $$\n$$ Language home page: https://github.com/samshadwell/TrumpScript          $$\n$$                                                                         $$\n$$ Tested under Linux 3.13.0-77-generic #121-Ubuntu SMP x86_64 GNU/Linux   $$\n$$                                                                         $$\n$$ This is free and unencumbered software released into the public domain. $$\n$$ See the accompanying UNLICENSE file or visit https://unlicense.org for  $$\n$$ details. Set your code free.                                            $$\n$$                                                                         $$\n$$                       Make America DRUNK again!                         $$\n$$                                                                         $$\n$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n\"\n\nmake start      1000099\nmake million    1000000\nreasons are     1000001\nmake one, reasons minus million;\nmake zero, million minus million;\nmake negative, zero minus one;\nmake count, start minus million;\nmake no \"no more\"\nmake nothing \"\"\nmake period \".\"\nmake wait \", \"\nmake baby \" bottle\"\nmake babies \" bottles\"\nmake take \"take one down and pass it around, \"\nmake buy \"go to the store and buy some more, \"\nmake milk \" of beer\"\nmake success \" on the wall\"\nmake wall, success plus wait;\nmake walls, success plus period;\n\nas long as, count greater negative;:\n  amount is count\n  stuff is babies\n  action is take\n  if, count greater one;:\n    make next, count minus one;!\n  if, count is one?;:\n    stuff is baby\n    next is no!\n  if, count is zero?;:\n    amount is no\n    action is buy\n    make next, start minus million;!\n\n  predictions is babies\n  if, next is one?;:\n    predictions is baby!\n\n  wealth is amount\n  if, wealth is no?;:\n    money is, wealth plus stuff;!\n  else:\n    say wealth\n    money is stuff!\n\n  make money, money plus milk;\n  make money, money plus wall;\n  say money\n\n  say amount\n  make money, stuff plus milk;\n  make money, money plus period;\n  say money\n\n  fortune is next\n  if, fortune is no?;:\n    money is, action plus next;\n    say money!\n  else:\n    say action\n    say next!\n  make money, predictions plus milk;\n  make money, money plus walls;\n  say money\n\n  make count, count minus one;\n  say nothing!\n\nAmerica is great.\n"
  },
  {
    "path": "test/test_files/china.txt",
    "content": "Let's make America \"Great\" again.\nI personally have always believed that while, America certainly is \"Great\";                                                           :\nIt could be better. There's a reason why. Say it with me, \"China\";!\nAmerica is great.\n"
  },
  {
    "path": "test/test_files/debate_vs_hillary.txt",
    "content": "I will fight for Joe the guy\nhe is for a fact a hero\nI will make us false\nhe is not false?\nsay, \"where is the sky\";\nAmerica is great."
  },
  {
    "path": "test/test_files/debate_vs_jeb.txt",
    "content": "Hello, I am Donald Trump.\nWhen I am president I will make war profitable, each new soldier will earn america 5000000 dollars times every 1000000\nin our army; that's a lot of money\nalso, I promise to make oil bad for business, the enemies of america will lose at least 20000000 a day with\nmy policies\nMy bad is going to bring to us back to the good old days of 2000000000000 dollar gdp\nif you'll listen to me let me ask you this, war over oil; is it so bad? :\nVote trump and say \"Hello World\" to a brand new america!\nAmerica is great."
  },
  {
    "path": "test/test_files/debate_vs_rubio.txt",
    "content": "if, fact ; :\nsay \"First place prize please\" !\nAmerica is great."
  },
  {
    "path": "test/test_files/debatesvdebates.txt",
    "content": "What are we in this country\nHillary speaks nothing but lies\nBut look at me I came to this election to make guys\nbelieve again\nbelieve in fact\nif, all of us real lies the light; : say \"VOTE TRUMP\" !\nbut I know we should be free\nelse the result will be bad: all the work of George\nWashington was for nothing\nso this election say \"Hello World\" say \"TRUMP FOR PRESIDENT\"!\nAmerica is great."
  },
  {
    "path": "test/test_files/debatevsdark.txt",
    "content": "as long as , fact ; :\nsay \"please hide me, it's dark outside\" !\nAmerica is great."
  },
  {
    "path": "test/test_files/fizz_buzz.txt",
    "content": "Make Donald 15000000.\nNothing is, 1000000 minus 1000000;\nThe fortune of Hillary is nothing.\nAs long as, Donald is not Hillary; Do this:\nIf, Donald over 15000000 is nothing; Then: say \"Fiorina Biden\"!\nElse if, Donald over 5000000 is nothing; Then: say \"Fiorina\"!\nElse if, Donald over 3000000 is nothing; Then: say \"Biden\"!\nElse: say Donald!\nThe fortune of Donald is, old Donald minus 1000000;\nAmazing!\nAmerica is Great."
  },
  {
    "path": "test/test_files/haiku.txt",
    "content": "\n\nsay it with me, \"Make\n        America Great Again!\"                                                                       ;\n            america is\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\ngreat."
  },
  {
    "path": "test/test_files/huge_test.tr",
    "content": "huge\nhuuuuuge\nhuuuge\nhuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuge\nsay, \"Huge\";\nAmerica is great."
  },
  {
    "path": "test/test_files/loves_china.tr",
    "content": "say it with me, \"People says I don't like China.\";\n\namerica is great."
  },
  {
    "path": "test/test_files/math.txt",
    "content": "make light 10000000\nmake dark 2000000\n\nsay \"Addition\"\nmake sun , light plus dark ;\nsay sun\n\nsay \"Subtraction\"\nmake sun, light minus dark ;\nsay sun\n\nsay \"Mulitplication\"\nmake sun, light times dark ;\nsay sun\n\nsay \"Divide\"\nmake sun, light over dark ;\nsay sun\nAmerica is great."
  },
  {
    "path": "test/test_files/nonterm_quote.txt",
    "content": "Hi \"aaasdfsdf\n"
  },
  {
    "path": "test/test_files/not_english.txt",
    "content": "Hola soy una mexicana aquí para robar sus puestos de trabajo\nAmerica is great.\n"
  },
  {
    "path": "test/test_files/not_patriotic.txt",
    "content": "oh no\nkill\n"
  },
  {
    "path": "test/test_files/primeTest.tr",
    "content": "I will ask you, god hears you;\nOur country is, safer god;\nmake money, 2000000 over 1000000;\nMake country safe god.\nOur Romney is, country over money;\nimmigrants are, Romney plus 1000000 over 1000000;\npolitics is true.\nAs long as, money less immigrants;:\n\tmake america safer, country over money;\n\tmake hard, america times money;\n\tmake earth, hard is country?;\n\tif, earth; :\n\t\tsay safer money\n\t\tsay \"is a divisor\"\n\t\tMake politics false!\n\tOur money is, money plus 1000000 over 1000000;!\ntell not politics\nif, politics; :\n\ttell \"We have a prime\"!\nelse:\n\ttell \"No Prime\"!\nAmerica is great. \n\t  \n"
  },
  {
    "path": "test/test_files/rig_the_polls.tr",
    "content": "Make print print.\nMake help help.\nMake print help.\nSay lie.\nAmerica is great.\n"
  },
  {
    "path": "test/test_files/test_1.txt",
    "content": "make magic, not lies;\nif Sanders is fact:\nI'll tell you \"Bush was never president\"!\nAmerica is great."
  },
  {
    "path": "test/test_files/testing_else.tr",
    "content": "Make Hillary cry by getting 100000000 votes.\nIf, Hillary is 1000000000 years old; We should let her know:\nsay \"lol you're so old and unsuccessful\"!\nOr else:\nsay \"lol you're so unsuccessful\"!\nAmerica is great."
  },
  {
    "path": "test/test_files/toupee.txt",
    "content": "make politics 10000000\nAs Long as, politics less 101000000;\nSay, 101000000 - politics;\nmake politics, politics + 10000000;\nAmerica is great.\n"
  },
  {
    "path": "test/test_files/toupee_junk.txt",
    "content": "make politics happy hillary happy 10000000\nAs Long as, politics door less 101000000;\nI will say, 101000000 - politics;\ni hillary make politics, politics + 10000000;\nAmerica is great.\n"
  },
  {
    "path": "test/test_files/trump_vs_army.txt",
    "content": "I is Donald Trump it time to tell you a fact\nfor every american there is 100000000 immigrants\ntrust me they are , there over there ; plan against us\nif, I are fact? ; : say they want to take our guns !\nAmerica is great."
  }
]