[
  {
    "path": ".gitignore",
    "content": "venv/\n"
  },
  {
    "path": "3D Printed WiFi Access QR Codes/Pipfile",
    "content": "[[source]]\nurl = \"https://pypi.python.org/simple\"\nverify_ssl = true\nname = \"pypi\"\n\n[packages]\npyqrcode = \"*\"\npypng = \"*\"\nsolidpython = \"*\"\nnumpy = \"*\"\n\n[dev-packages]\n\n[requires]\npython_version = \"3.7\"\n"
  },
  {
    "path": "3D Printed WiFi Access QR Codes/main.py",
    "content": "import pyqrcode as pq\nimport numpy as np\nfrom solid import color, cube, scad_render, translate, union\n\n\ndef create_wifi_qr(ssid: str, security: str, password: str):\n    qr = pq.create(f'WIFI:S:{ssid};T:{security};P:{password};;')\n    return qr\n\n\ndef qr2array(qr):\n    arr = []\n    for line in qr.text().split():\n        if line:\n            arr.append([int(bit) for bit in line])\n    return np.vstack(arr)\n\n\ndef make_solid(arr):\n    HEIGHT = 1\n    SCALE = 2  # output defaults to 1 mm per unit; this lets us increase the size of objects proportionally.\n    cubes = [translate([i * SCALE, j * SCALE, 0])(color('black')(cube(size=[SCALE, SCALE, HEIGHT])))\n             for i, row in enumerate(arr)\n             for j, col in enumerate(row)\n             if arr[i, j] == 1]\n\n    base_plate = color('white')(cube(size=(arr.shape[0] * SCALE, arr.shape[1] * SCALE, HEIGHT / 2)))\n    qrobj = union()(*cubes, base_plate)\n    return qrobj\n\n\ndef main():\n    ssid = \"Family Guest Network\"\n    security = \"WPA\"\n    password = \"vn8h2sncu093y3nd!\"\n    qr = create_wifi_qr(ssid, security, password)\n    arr = qr2array(qr)\n    solid_object = make_solid(arr)\n    print(scad_render(solid_object))\n\n\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2018 \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": "List Comprehensions/examples.py",
    "content": "\"\"\"\nList Comprehensions Examples\n\"\"\"\n\nmy_list = []\n# my_list.append()\n# my_list.extend()\n\n\n\"\"\"\nWhen to use ListComps\n\"\"\"\nphones = [\n    {\n        'number': '111-111-1111',\n        'label': 'phone',\n        'extension': '1234',\n    },\n\n    {\n        'number': '222-222-2222',\n        'label': 'mobile',\n        'extension': None,\n    }\n]\n\nmy_phone_list = []\nfor phone in phones:\n    my_phone_list.append(phone['number'])\n\n# List Comprehension\n[phone['number'] for phone in phones]\n\n\"\"\"\nAdvanced Usage\n\"\"\"\n\n# Buld an explicit nested list\ntable = [\n    [1, 2, 3],\n    [1, 2, 3],\n    [1, 2, 3],\n]\n\nfields = ['x', 'y', 'z']\nrows = [1, 2, 3]\n\ntable = []\nfor r in rows:\n    row = []\n    for field in fields:\n        row.append(field)\n    table.append(row)\n\n[field for field in fields]\n[row for row in rows]\n\n\ntable = [[field for field in fields] for row in rows]\n\n\"\"\"\nDictionary Comprehensions\n\"\"\"\n\n\n[{str(item): item} for item in [1, 2, 3, ]]\n\ndict1 = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}\n\ndouble_dict1 = {k: v * 2 for (k, v) in dict1.items()}\n\ndict_map = {\n\t'apple' : 1,\n\t'cherry': 2,\n\t'earwax': 3,\n}\n\n\n{v:k for (k, v) in dict_map.items()}\n\nitems = dict_map.items()\n\n\n\"\"\"\nLogical Comparisons\n\"\"\"\n\n\n\nvalues = [1,2,3]\n[i for i in values if i < 3]\n\n[k for k, v in dict_map.items() if v < 3]\n\n\n\"\"\"\nPerformance, Spongecase Example\n\"\"\"\n\noriginal_string = 'hello world'\nspongecase_letters = []\nfor index, letter in enumerate(original_string):\n    if index % 2 == 1:\n        spongecase_letters.append(letter.upper())\n    else:\n        spongecase_letters.append(letter)\nspongecase_string = ''.join(spongecase_letters)\n\n\n# hElLo wOrLd\n\ndef spongecase(index, letter):\n    if index % 2 == 1:\n        return letter.upper()\n    else:\n        return letter\n\n\noriginal_string = 'hello world'\nspongecase_letters = []\nfor index, letter in enumerate(original_string):\n    transformed_letter = spongecase(index, letter)\n    spongecase_letters.append(transformed_letter)\nspongecase_string = ''.join(spongecase_letters)\n# hElLo wOrLd\n"
  },
  {
    "path": "Modeling Trees with SQLAlchemy ORM and Postgres Ltree/Dockerfile.postgres",
    "content": "FROM postgres\nCOPY ltree.sql /docker-entrypoint-initdb.d\n"
  },
  {
    "path": "Modeling Trees with SQLAlchemy ORM and Postgres Ltree/Dockerfile.python",
    "content": "FROM python\nRUN apt-get update && apt-get install -y netcat && rm -rf /var/lib/apt/lists/*\nWORKDIR /usr/src/app\nCOPY Pipfile Pipfile.lock wait-for.sh ./\nRUN pip install --no-cache-dir pipenv \nRUN pipenv install --system --deploy\nCOPY main.py ./\nCMD [ \"python\", \"./main.py\" ]\n"
  },
  {
    "path": "Modeling Trees with SQLAlchemy ORM and Postgres Ltree/Pipfile",
    "content": "[[source]]\nurl = \"https://pypi.org/simple\"\nverify_ssl = true\nname = \"pypi\"\n\n[packages]\nsqlalchemy = \"*\"\nsqlalchemy-utils = \"*\"\n\"psycopg2-binary\" = \"*\"\n\n[dev-packages]\n\n[requires]\npython_version = \"3.7\"\n"
  },
  {
    "path": "Modeling Trees with SQLAlchemy ORM and Postgres Ltree/docker-compose.yml",
    "content": "version: \"3\"\nservices:\n  postgres:\n    build: \n      dockerfile: Dockerfile.postgres\n      context: .\n    image: kiteco/postgres-ltree\n    environment:\n      - POSTGRES_PASSWORD=mysecret\n  python:\n    build:\n      dockerfile: Dockerfile.python\n      context: .\n    image: kiteco/python-ltree\n    command: [\"./wait-for.sh\", \"postgres:5432\", \"--\", \"python\", \"main.py\"]\n"
  },
  {
    "path": "Modeling Trees with SQLAlchemy ORM and Postgres Ltree/ltree.sql",
    "content": "CREATE EXTENSION IF NOT EXISTS ltree;"
  },
  {
    "path": "Modeling Trees with SQLAlchemy ORM and Postgres Ltree/main.py",
    "content": "from sqlalchemy import Column, Integer, String, Sequence, Index, func, create_engine\nfrom sqlalchemy.ext.declarative import declarative_base\nfrom sqlalchemy.orm import relationship, remote, foreign, sessionmaker\nfrom sqlalchemy.sql import expression\nfrom sqlalchemy_utils import LtreeType, Ltree\nfrom sqlalchemy_utils.types.ltree import LQUERY\n\nBase = declarative_base()\n\nengine = create_engine(\"postgresql://postgres:mysecret@postgres/postgres\")\n\nid_seq = Sequence(\"nodes_id_seq\")\n\n\nclass Node(Base):\n    __tablename__ = \"nodes\"\n\n    id = Column(Integer, id_seq, primary_key=True)\n    name = Column(String, nullable=False)\n    path = Column(LtreeType, nullable=False)\n\n    parent = relationship(\n        \"Node\",\n        primaryjoin=(remote(path) == foreign(func.subpath(path, 0, -1))),\n        backref=\"children\",\n        viewonly=True,\n    )\n\n    def __init__(self, name, parent=None):\n        _id = engine.execute(id_seq)\n        self.id = _id\n        self.name = name\n        ltree_id = Ltree(str(_id))\n        self.path = ltree_id if parent is None else parent.path + ltree_id\n\n    __table_args__ = (Index(\"ix_nodes_path\", path, postgresql_using=\"gist\"),)\n\n    def __str__(self):\n        return self.name\n\n    def __repr__(self):\n        return 'Node({})'.format(self.name)\n\n\nBase.metadata.create_all(engine)\nSession = sessionmaker(bind=engine)\nsession = Session()\n\n# To create a tree like the example shown\n# at the top of this post:\ncats = Node(\"cats\")\nbig = Node(\"big\", parent=cats)\nsmall = Node(\"small\", parent=cats)\nwild = Node(\"wild\", parent=small)\ndomestic = Node(\"domestic\", parent=small)\nsession.add_all((cats, big, small, wild, domestic))\nfor big_cat in (\"lion\", \"tiger\", \"jaguar\"):\n    session.add(Node(big_cat, parent=big))\nfor small_wildcat in (\"ocelot\", \"bobcat\"):\n    session.add(Node(small_wildcat, parent=wild))\nfor domestic_cat in (\"persian\", \"bengal\", \"shorthair\"):\n    session.add(Node(domestic_cat, parent=domestic))\n\nsession.flush()\n\n# To retrieve a whole subtree:\nwhole_subtree = session.query(Node).filter(Node.path.descendant_of(domestic.path)).all()\nprint('Whole subtree:', whole_subtree)\n# [domestic, persian, bengal, shorthair]\n\n# Get only the third layer of nodes:\nthird_layer = session.query(Node).filter(func.nlevel(Node.path) == 3).all()\nprint('Third layer:', third_layer)\n# [wild, domestic, lion, tiger, jaguar]\n\n# Get all the siblings of a node:\nshorthair = session.query(Node).filter_by(name=\"shorthair\").one()\nsiblings = session.query(Node).filter(\n    # We can use Python's slice notation on ltree paths:\n    Node.path.descendant_of(shorthair.path[:-1]),\n    func.nlevel(Node.path) == len(shorthair.path),\n    Node.id != shorthair.id,\n).all()\nprint('Siblings of shorthair:', siblings)\n# [persian, bengal]\n\n# Using an LQuery to get immediate children of two parent nodes at different depths:\nquery = \"*.%s|%s.*{1}\" % (big.id, wild.id)\nlquery = expression.cast(query, LQUERY)\nimmediate_children = session.query(Node).filter(Node.path.lquery(lquery)).all()\nprint('Immediate children of big and wild:', immediate_children)\n# [lion, tiger, ocelot, jaguar, bobcat]\n"
  },
  {
    "path": "Modeling Trees with SQLAlchemy ORM and Postgres Ltree/wait-for.sh",
    "content": "#!/bin/sh\n\nTIMEOUT=15\nQUIET=0\n\nechoerr() {\n  if [ \"$QUIET\" -ne 1 ]; then printf \"%s\\n\" \"$*\" 1>&2; fi\n}\n\nusage() {\n  exitcode=\"$1\"\n  cat << USAGE >&2\nUsage:\n  $cmdname host:port [-t timeout] [-- command args]\n  -q | --quiet                        Do not output any status messages\n  -t TIMEOUT | --timeout=timeout      Timeout in seconds, zero for no timeout\n  -- COMMAND ARGS                     Execute command with args after the test finishes\nUSAGE\n  exit \"$exitcode\"\n}\n\nwait_for() {\n  for i in `seq $TIMEOUT` ; do\n    nc -z \"$HOST\" \"$PORT\" > /dev/null 2>&1\n    \n    result=$?\n    if [ $result -eq 0 ] ; then\n      if [ $# -gt 0 ] ; then\n        exec \"$@\"\n      fi\n      exit 0\n    fi\n    sleep 1\n  done\n  echo \"Operation timed out\" >&2\n  exit 1\n}\n\nwhile [ $# -gt 0 ]\ndo\n  case \"$1\" in\n    *:* )\n    HOST=$(printf \"%s\\n\" \"$1\"| cut -d : -f 1)\n    PORT=$(printf \"%s\\n\" \"$1\"| cut -d : -f 2)\n    shift 1\n    ;;\n    -q | --quiet)\n    QUIET=1\n    shift 1\n    ;;\n    -t)\n    TIMEOUT=\"$2\"\n    if [ \"$TIMEOUT\" = \"\" ]; then break; fi\n    shift 2\n    ;;\n    --timeout=*)\n    TIMEOUT=\"${1#*=}\"\n    shift 1\n    ;;\n    --)\n    shift\n    break\n    ;;\n    --help)\n    usage 0\n    ;;\n    *)\n    echoerr \"Unknown argument: $1\"\n    usage 1\n    ;;\n  esac\ndone\n\nif [ \"$HOST\" = \"\" -o \"$PORT\" = \"\" ]; then\n  echoerr \"Error: you need to provide a host and port to test.\"\n  usage 2\nfi\n\nwait_for \"$@\"\n"
  },
  {
    "path": "Patterns in Gothic Literature/Leroux_ThePhantomOfTheOpera_Gutenberg.txt",
    "content": "The Phantom of the Opera\n\n\nby\n\nGaston Leroux\n\n\n\nAuthor of \"The Mystery of the Yellow Room\" and\n\"The Perfume of the Lady in Black\"\n\n\n\n\nContents\n\nChapter\n \tPROLOGUE\nI  \tIS IT A GHOST?\nII  \tTHE NEW MARGARITA\nIII  \tTHE MYSTERIOUS REASON\nIV  \tBOX FIVE\nV  \tTHE ENCHANTED VIOLIN\nVI  \tA VISIT TO BOX FIVE\nVII  \tFAUST AND WHAT FOLLOWED\nVIII  \tTHE MYSTERIOUS BROUGHAM\nIX  \tAT THE MASKED BALL\nX  \tFORGET THE NAME OF THE MAN'S VOICE\nXI  \tABOVE THE TRAP-DOORS\nXII  \tAPOLLO'S LYRE\nXIII  \tA MASTER-STROKE OF THE TRAP-DOOR LOVER\nXIV  \tTHE SINGULAR ATTITUDE OF A SAFETY-PIN\nXV  \tCHRISTINE! CHRISTINE!\nXVI  \tMME. GIRY'S REVELATIONS\nXVII  \tTHE SAFETY-PIN AGAIN\nXVIII  \tTHE COMMISSARY, THE VISCOUNT AND THE PERSIAN\nXIX  \tTHE VISCOUNT AND THE PERSIAN\nXX  \tIN THE CELLARS OF THE OPERA\nXXI  \tINTERESTING VICISSITUDES\nXXII  \tIN THE TORTURE CHAMBER\nXXIII  \tTHE TORTURES BEGIN\nXXIV  \tBARRELS! BARRELS!\nXXV  \tTHE SCORPION OR THE GRASSHOPPER: WHICH\nXXVI  \tTHE END OF THE GHOST'S LOVE STORY\n \tEPILOGUE\n \t(plus a \"bonus chapter\" called \"THE PARIS OPERA HOUSE\")\n\n\n\nThe Phantom of the Opera\n\n\nPrologue\n\nIN WHICH THE AUTHOR OF THIS SINGULAR WORK INFORMS THE READER HOW HE ACQUIRED THE CERTAINTY THAT THE OPERA GHOST REALLY EXISTED\n\nThe Opera ghost really existed. He was not, as was long believed, a creature of the imagination of the artists, the superstition of the managers, or a product of the absurd and impressionable brains of the young ladies of the ballet, their mothers, the box-keepers, the cloak-room attendants or the concierge. Yes, he existed in flesh and blood, although he assumed the complete appearance of a real phantom; that is to say, of a spectral shade.\n\nWhen I began to ransack the archives of the National Academy of Music I was at once struck by the surprising coincidences between the phenomena ascribed to the \"ghost\" and the most extraordinary and fantastic tragedy that ever excited the Paris upper classes; and I soon conceived the idea that this tragedy might reasonably be explained by the phenomena in question. The events do not date more than thirty years back; and it would not be difficult to find at the present day, in the foyer of the ballet, old men of the highest respectability, men upon whose word one could absolutely rely, who would remember as though they happened yesterday the mysterious and dramatic conditions that attended the kidnapping of Christine Daae, the disappearance of the Vicomte de Chagny and the death of his elder brother, Count Philippe, whose body was found on the bank of the lake that exists in the lower cellars of the Opera on the Rue-Scribe side. But none of those witnesses had until that day thought that there was any reason for connecting the more or less legendary figure of the Opera ghost with that terrible story.\n\nThe truth was slow to enter my mind, puzzled by an inquiry that at every moment was complicated by events which, at first sight, might be looked upon as superhuman; and more than once I was within an ace of abandoning a task in which I was exhausting myself in the hopeless pursuit of a vain image. At last, I received the proof that my presentiments had not deceived me, and I was rewarded for all my efforts on the day when I acquired the certainty that the Opera ghost was more than a mere shade.\n\nOn that day, I had spent long hours over THE MEMOIRS OF A MANAGER, the light and frivolous work of the too-skeptical Moncharmin, who, during his term at the Opera, understood nothing of the mysterious behavior of the ghost and who was making all the fun of it that he could at the very moment when he became the first victim of the curious financial operation that went on inside the \"magic envelope.\"\n\nI had just left the library in despair, when I met the delightful acting-manager of our National Academy, who stood chatting on a landing with a lively and well-groomed little old man, to whom he introduced me gaily. The acting-manager knew all about my investigations and how eagerly and unsuccessfully I had been trying to discover the whereabouts of the examining magistrate in the famous Chagny case, M. Faure. Nobody knew what had become of him, alive or dead; and here he was back from Canada, where he had spent fifteen years, and the first thing he had done, on his return to Paris, was to come to the secretarial offices at the Opera and ask for a free seat. The little old man was M. Faure himself.\n\nWe spent a good part of the evening together and he told me the whole Chagny case as he had understood it at the time. He was bound to conclude in favor of the madness of the viscount and the accidental death of the elder brother, for lack of evidence to the contrary; but he was nevertheless persuaded that a terrible tragedy had taken place between the two brothers in connection with Christine Daae. He could not tell me what became of Christine or the viscount. When I mentioned the ghost, he only laughed. He, too, had been told of the curious manifestations that seemed to point to the existence of an abnormal being, residing in one of the most mysterious corners of the Opera, and he knew the story of the envelope; but he had never seen anything in it worthy of his attention as magistrate in charge of the Chagny case, and it was as much as he had done to listen to the evidence of a witness who appeared of his own accord and declared that he had often met the ghost. This witness was none other than the man whom all Paris called the \"Persian\" and who was well-known to every subscriber to the Opera. The magistrate took him for a visionary.\n\nI was immensely interested by this story of the Persian. I wanted, if there were still time, to find this valuable and eccentric witness. My luck began to improve and I discovered him in his little flat in the Rue de Rivoli, where he had lived ever since and where he died five months after my visit. I was at first inclined to be suspicious; but when the Persian had told me, with child-like candor, all that he knew about the ghost and had handed me the proofs of the ghost's existence—including the strange correspondence of Christine Daae—to do as I pleased with, I was no longer able to doubt. No, the ghost was not a myth!\n\nI have, I know, been told that this correspondence may have been forged from first to last by a man whose imagination had certainly been fed on the most seductive tales; but fortunately I discovered some of Christine's writing outside the famous bundle of letters and, on a comparison between the two, all my doubts were removed. I also went into the past history of the Persian and found that he was an upright man, incapable of inventing a story that might have defeated the ends of justice.\n\nThis, moreover, was the opinion of the more serious people who, at one time or other, were mixed up in the Chagny case, who were friends of the Chagny family, to whom I showed all my documents and set forth all my inferences. In this connection, I should like to print a few lines which I received from General D——:\n\nSIR:\n\nI can not urge you too strongly to publish the results of your inquiry. I remember perfectly that, a few weeks before the disappearance of that great singer, Christine Daae, and the tragedy which threw the whole of the Faubourg Saint-Germain into mourning, there was a great deal of talk, in the foyer of the ballet, on the subject of the \"ghost;\" and I believe that it only ceased to be discussed in consequence of the later affair that excited us all so greatly. But, if it be possible—as, after hearing you, I believe—to explain the tragedy through the ghost, then I beg you sir, to talk to us about the ghost again.\n\nMysterious though the ghost may at first appear, he will always be more easily explained than the dismal story in which malevolent people have tried to picture two brothers killing each other who had worshiped each other all their lives.\n\nBelieve me, etc.\n\nLastly, with my bundle of papers in hand, I once more went over the ghost's vast domain, the huge building which he had made his kingdom. All that my eyes saw, all that my mind perceived, corroborated the Persian's documents precisely; and a wonderful discovery crowned my labors in a very definite fashion. It will be remembered that, later, when digging in the substructure of the Opera, before burying the phonographic records of the artist's voice, the workmen laid bare a corpse. Well, I was at once able to prove that this corpse was that of the Opera ghost. I made the acting-manager put this proof to the test with his own hand; and it is now a matter of supreme indifference to me if the papers pretend that the body was that of a victim of the Commune.\n\nThe wretches who were massacred, under the Commune, in the cellars of the Opera, were not buried on this side; I will tell where their skeletons can be found in a spot not very far from that immense crypt which was stocked during the siege with all sorts of provisions. I came upon this track just when I was looking for the remains of the Opera ghost, which I should never have discovered but for the unheard-of chance described above.\n\nBut we will return to the corpse and what ought to be done with it. For the present, I must conclude this very necessary introduction by thanking M. Mifroid (who was the commissary of police called in for the first investigations after the disappearance of Christine Daae), M. Remy, the late secretary, M. Mercier, the late acting-manager, M. Gabriel, the late chorus-master, and more particularly Mme. la Baronne de Castelot-Barbezac, who was once the \"little Meg\" of the story (and who is not ashamed of it), the most charming star of our admirable corps de ballet, the eldest daughter of the worthy Mme. Giry, now deceased, who had charge of the ghost's private box. All these were of the greatest assistance to me; and, thanks to them, I shall be able to reproduce those hours of sheer love and terror, in their smallest details, before the reader's eyes.\n\nAnd I should be ungrateful indeed if I omitted, while standing on the threshold of this dreadful and veracious story, to thank the present management the Opera, which has so kindly assisted me in all my inquiries, and M. Messager in particular, together with M. Gabion, the acting-manager, and that most amiable of men, the architect intrusted with the preservation of the building, who did not hesitate to lend me the works of Charles Garnier, although he was almost sure that I would never return them to him. Lastly, I must pay a public tribute to the generosity of my friend and former collaborator, M. J. Le Croze, who allowed me to dip into his splendid theatrical library and to borrow the rarest editions of books by which he set great store.\n\nGASTON LEROUX.\n\n\n\n\nChapter I Is it the Ghost?\n\nIt was the evening on which MM. Debienne and Poligny, the managers of the Opera, were giving a last gala performance to mark their retirement. Suddenly the dressing-room of La Sorelli, one of the principal dancers, was invaded by half-a-dozen young ladies of the ballet, who had come up from the stage after \"dancing\" Polyeucte. They rushed in amid great confusion, some giving vent to forced and unnatural laughter, others to cries of terror. Sorelli, who wished to be alone for a moment to \"run through\" the speech which she was to make to the resigning managers, looked around angrily at the mad and tumultuous crowd. It was little Jammes—the girl with the tip-tilted nose, the forget-me-not eyes, the rose-red cheeks and the lily-white neck and shoulders—who gave the explanation in a trembling voice:\n\n\"It's the ghost!\" And she locked the door.\n\nSorelli's dressing-room was fitted up with official, commonplace elegance. A pier-glass, a sofa, a dressing-table and a cupboard or two provided the necessary furniture. On the walls hung a few engravings, relics of the mother, who had known the glories of the old Opera in the Rue le Peletier; portraits of Vestris, Gardel, Dupont, Bigottini. But the room seemed a palace to the brats of the corps de ballet, who were lodged in common dressing-rooms where they spent their time singing, quarreling, smacking the dressers and hair-dressers and buying one another glasses of cassis, beer, or even rhum, until the call-boy's bell rang.\n\nSorelli was very superstitious. She shuddered when she heard little Jammes speak of the ghost, called her a \"silly little fool\" and then, as she was the first to believe in ghosts in general, and the Opera ghost in particular, at once asked for details:\n\n\"Have you seen him?\"\n\n\"As plainly as I see you now!\" said little Jammes, whose legs were giving way beneath her, and she dropped with a moan into a chair.\n\nThereupon little Giry—the girl with eyes black as sloes, hair black as ink, a swarthy complexion and a poor little skin stretched over poor little bones—little Giry added:\n\n\"If that's the ghost, he's very ugly!\"\n\n\"Oh, yes!\" cried the chorus of ballet-girls.\n\nAnd they all began to talk together. The ghost had appeared to them in the shape of a gentleman in dress-clothes, who had suddenly stood before them in the passage, without their knowing where he came from. He seemed to have come straight through the wall.\n\n\"Pooh!\" said one of them, who had more or less kept her head. \"You see the ghost everywhere!\"\n\nAnd it was true. For several months, there had been nothing discussed at the Opera but this ghost in dress-clothes who stalked about the building, from top to bottom, like a shadow, who spoke to nobody, to whom nobody dared speak and who vanished as soon as he was seen, no one knowing how or where. As became a real ghost, he made no noise in walking. People began by laughing and making fun of this specter dressed like a man of fashion or an undertaker; but the ghost legend soon swelled to enormous proportions among the corps de ballet. All the girls pretended to have met this supernatural being more or less often. And those who laughed the loudest were not the most at ease. When he did not show himself, he betrayed his presence or his passing by accident, comic or serious, for which the general superstition held him responsible. Had any one met with a fall, or suffered a practical joke at the hands of one of the other girls, or lost a powderpuff, it was at once the fault of the ghost, of the Opera ghost.\n\nAfter all, who had seen him? You meet so many men in dress-clothes at the Opera who are not ghosts. But this dress-suit had a peculiarity of its own. It covered a skeleton. At least, so the ballet-girls said. And, of course, it had a death's head.\n\nWas all this serious? The truth is that the idea of the skeleton came from the description of the ghost given by Joseph Buquet, the chief scene-shifter, who had really seen the ghost. He had run up against the ghost on the little staircase, by the footlights, which leads to \"the cellars.\" He had seen him for a second—for the ghost had fled—and to any one who cared to listen to him he said:\n\n\"He is extraordinarily thin and his dress-coat hangs on a skeleton frame. His eyes are so deep that you can hardly see the fixed pupils. You just see two big black holes, as in a dead man's skull. His skin, which is stretched across his bones like a drumhead, is not white, but a nasty yellow. His nose is so little worth talking about that you can't see it side-face; and THE ABSENCE of that nose is a horrible thing TO LOOK AT. All the hair he has is three or four long dark locks on his forehead and behind his ears.\"\n\nThis chief scene-shifter was a serious, sober, steady man, very slow at imagining things. His words were received with interest and amazement; and soon there were other people to say that they too had met a man in dress-clothes with a death's head on his shoulders. Sensible men who had wind of the story began by saying that Joseph Buquet had been the victim of a joke played by one of his assistants. And then, one after the other, there came a series of incidents so curious and so inexplicable that the very shrewdest people began to feel uneasy.\n\nFor instance, a fireman is a brave fellow! He fears nothing, least of all fire! Well, the fireman in question, who had gone to make a round of inspection in the cellars and who, it seems, had ventured a little farther than usual, suddenly reappeared on the stage, pale, scared, trembling, with his eyes starting out of his head, and practically fainted in the arms of the proud mother of little Jammes.[1] And why? Because he had seen coming toward him, AT THE LEVEL OF HIS HEAD, BUT WITHOUT A BODY ATTACHED TO IT, A HEAD OF FIRE! And, as I said, a fireman is not afraid of fire.\n\nThe fireman's name was Pampin.\n\nThe corps de ballet was flung into consternation. At first sight, this fiery head in no way corresponded with Joseph Buquet's description of the ghost. But the young ladies soon persuaded themselves that the ghost had several heads, which he changed about as he pleased. And, of course, they at once imagined that they were in the greatest danger. Once a fireman did not hesitate to faint, leaders and front-row and back-row girls alike had plenty of excuses for the fright that made them quicken their pace when passing some dark corner or ill-lighted corridor. Sorelli herself, on the day after the adventure of the fireman, placed a horseshoe on the table in front of the stage-door-keeper's box, which every one who entered the Opera otherwise than as a spectator must touch before setting foot on the first tread of the staircase. This horse-shoe was not invented by me—any more than any other part of this story, alas!—and may still be seen on the table in the passage outside the stage-door-keeper's box, when you enter the Opera through the court known as the Cour de l'Administration.\n\nTo return to the evening in question.\n\n\"It's the ghost!\" little Jammes had cried.\n\nAn agonizing silence now reigned in the dressing-room. Nothing was heard but the hard breathing of the girls. At last, Jammes, flinging herself upon the farthest corner of the wall, with every mark of real terror on her face, whispered:\n\n\"Listen!\"\n\nEverybody seemed to hear a rustling outside the door. There was no sound of footsteps. It was like light silk sliding over the panel. Then it stopped.\n\nSorelli tried to show more pluck than the others. She went up to the door and, in a quavering voice, asked:\n\n\"Who's there?\"\n\nBut nobody answered. Then feeling all eyes upon her, watching her last movement, she made an effort to show courage, and said very loudly:\n\n\"Is there any one behind the door?\"\n\n\"Oh, yes, yes! Of course there is!\" cried that little dried plum of a Meg Giry, heroically holding Sorelli back by her gauze skirt. \"Whatever you do, don't open the door! Oh, Lord, don't open the door!\"\n\nBut Sorelli, armed with a dagger that never left her, turned the key and drew back the door, while the ballet-girls retreated to the inner dressing-room and Meg Giry sighed:\n\n\"Mother! Mother!\"\n\nSorelli looked into the passage bravely. It was empty; a gas-flame, in its glass prison, cast a red and suspicious light into the surrounding darkness, without succeeding in dispelling it. And the dancer slammed the door again, with a deep sigh.\n\n\"No,\" she said, \"there is no one there.\"\n\n\"Still, we saw him!\" Jammes declared, returning with timid little steps to her place beside Sorelli. \"He must be somewhere prowling about. I shan't go back to dress. We had better all go down to the foyer together, at once, for the 'speech,' and we will come up again together.\"\n\nAnd the child reverently touched the little coral finger-ring which she wore as a charm against bad luck, while Sorelli, stealthily, with the tip of her pink right thumb-nail, made a St. Andrew's cross on the wooden ring which adorned the fourth finger of her left hand. She said to the little ballet-girls:\n\n\"Come, children, pull yourselves together! I dare say no one has ever seen the ghost.\"\n\n\"Yes, yes, we saw him—we saw him just now!\" cried the girls. \"He had his death's head and his dress-coat, just as when he appeared to Joseph Buquet!\"\n\n\"And Gabriel saw him too!\" said Jammes. \"Only yesterday! Yesterday afternoon—in broad day-light——\"\n\n\"Gabriel, the chorus-master?\"\n\n\"Why, yes, didn't you know?\"\n\n\"And he was wearing his dress-clothes, in broad daylight?\"\n\n\"Who? Gabriel?\"\n\n\"Why, no, the ghost!\"\n\n\"Certainly! Gabriel told me so himself. That's what he knew him by. Gabriel was in the stage-manager's office. Suddenly the door opened and the Persian entered. You know the Persian has the evil eye——\"\n\n\"Oh, yes!\" answered the little ballet-girls in chorus, warding off ill-luck by pointing their forefinger and little finger at the absent Persian, while their second and third fingers were bent on the palm and held down by the thumb.\n\n\"And you know how superstitious Gabriel is,\" continued Jammes. \"However, he is always polite. When he meets the Persian, he just puts his hand in his pocket and touches his keys. Well, the moment the Persian appeared in the doorway, Gabriel gave one jump from his chair to the lock of the cupboard, so as to touch iron! In doing so, he tore a whole skirt of his overcoat on a nail. Hurrying to get out of the room, he banged his forehead against a hat-peg and gave himself a huge bump; then, suddenly stepping back, he skinned his arm on the screen, near the piano; he tried to lean on the piano, but the lid fell on his hands and crushed his fingers; he rushed out of the office like a madman, slipped on the staircase and came down the whole of the first flight on his back. I was just passing with mother. We picked him up. He was covered with bruises and his face was all over blood. We were frightened out of our lives, but, all at once, he began to thank Providence that he had got off so cheaply. Then he told us what had frightened him. He had seen the ghost behind the Persian, THE GHOST WITH THE DEATH'S HEAD just like Joseph Buquet's description!\"\n\nJammes had told her story ever so quickly, as though the ghost were at her heels, and was quite out of breath at the finish. A silence followed, while Sorelli polished her nails in great excitement. It was broken by little Giry, who said:\n\n\"Joseph Buquet would do better to hold his tongue.\"\n\n\"Why should he hold his tongue?\" asked somebody.\n\n\"That's mother's opinion,\" replied Meg, lowering her voice and looking all about her as though fearing lest other ears than those present might overhear.\n\n\"And why is it your mother's opinion?\"\n\n\"Hush! Mother says the ghost doesn't like being talked about.\"\n\n\"And why does your mother say so?\"\n\n\"Because—because—nothing—\"\n\nThis reticence exasperated the curiosity of the young ladies, who crowded round little Giry, begging her to explain herself. They were there, side by side, leaning forward simultaneously in one movement of entreaty and fear, communicating their terror to one another, taking a keen pleasure in feeling their blood freeze in their veins.\n\n\"I swore not to tell!\" gasped Meg.\n\nBut they left her no peace and promised to keep the secret, until Meg, burning to say all she knew, began, with her eyes fixed on the door:\n\n\"Well, it's because of the private box.\"\n\n\"What private box?\"\n\n\"The ghost's box!\"\n\n\"Has the ghost a box? Oh, do tell us, do tell us!\"\n\n\"Not so loud!\" said Meg. \"It's Box Five, you know, the box on the grand tier, next to the stage-box, on the left.\"\n\n\"Oh, nonsense!\"\n\n\"I tell you it is. Mother has charge of it. But you swear you won't say a word?\"\n\n\"Of course, of course.\"\n\n\"Well, that's the ghost's box. No one has had it for over a month, except the ghost, and orders have been given at the box-office that it must never be sold.\"\n\n\"And does the ghost really come there?\"\n\n\"Yes.\"\n\n\"Then somebody does come?\"\n\n\"Why, no! The ghost comes, but there is nobody there.\"\n\nThe little ballet-girls exchanged glances. If the ghost came to the box, he must be seen, because he wore a dress-coat and a death's head. This was what they tried to make Meg understand, but she replied:\n\n\"That's just it! The ghost is not seen. And he has no dress-coat and no head! All that talk about his death's head and his head of fire is nonsense! There's nothing in it. You only hear him when he is in the box. Mother has never seen him, but she has heard him. Mother knows, because she gives him his program.\"\n\nSorelli interfered.\n\n\"Giry, child, you're getting at us!\"\n\nThereupon little Giry began to cry.\n\n\"I ought to have held my tongue—if mother ever came to know! But I was quite right, Joseph Buquet had no business to talk of things that don't concern him—it will bring him bad luck—mother was saying so last night——\"\n\nThere was a sound of hurried and heavy footsteps in the passage and a breathless voice cried:\n\n\"Cecile! Cecile! Are you there?\"\n\n\"It's mother's voice,\" said Jammes. \"What's the matter?\"\n\nShe opened the door. A respectable lady, built on the lines of a Pomeranian grenadier, burst into the dressing-room and dropped groaning into a vacant arm-chair. Her eyes rolled madly in her brick-dust colored face.\n\n\"How awful!\" she said. \"How awful!\"\n\n\"What? What?\"\n\n\"Joseph Buquet!\"\n\n\"What about him?\"\n\n\"Joseph Buquet is dead!\"\n\nThe room became filled with exclamations, with astonished outcries, with scared requests for explanations.\n\n\"Yes, he was found hanging in the third-floor cellar!\"\n\n\"It's the ghost!\" little Giry blurted, as though in spite of herself; but she at once corrected herself, with her hands pressed to her mouth: \"No, no!—I, didn't say it!—I didn't say it!——\"\n\nAll around her, her panic-stricken companions repeated under their breaths:\n\n\"Yes—it must be the ghost!\"\n\nSorelli was very pale.\n\n\"I shall never be able to recite my speech,\" she said.\n\nMa Jammes gave her opinion, while she emptied a glass of liqueur that happened to be standing on a table; the ghost must have something to do with it.\n\nThe truth is that no one ever knew how Joseph Buquet met his death. The verdict at the inquest was \"natural suicide.\" In his Memoirs of Manager, M. Moncharmin, one of the joint managers who succeeded MM. Debienne and Poligny, describes the incident as follows:\n\n\"A grievous accident spoiled the little party which MM. Debienne and Poligny gave to celebrate their retirement. I was in the manager's office, when Mercier, the acting-manager, suddenly came darting in. He seemed half mad and told me that the body of a scene-shifter had been found hanging in the third cellar under the stage, between a farm-house and a scene from the Roi de Lahore. I shouted:\n\n\"'Come and cut him down!'\n\n\"By the time I had rushed down the staircase and the Jacob's ladder, the man was no longer hanging from his rope!\"\n\nSo this is an event which M. Moncharmin thinks natural. A man hangs at the end of a rope; they go to cut him down; the rope has disappeared. Oh, M. Moncharmin found a very simple explanation! Listen to him:\n\n\"It was just after the ballet; and leaders and dancing-girls lost no time in taking their precautions against the evil eye.\"\n\nThere you are! Picture the corps de ballet scuttling down the Jacob's ladder and dividing the suicide's rope among themselves in less time than it takes to write! When, on the other hand, I think of the exact spot where the body was discovered—the third cellar underneath the stage!—imagine that SOMEBODY must have been interested in seeing that the rope disappeared after it had effected its purpose; and time will show if I am wrong.\n\nThe horrid news soon spread all over the Opera, where Joseph Buquet was very popular. The dressing-rooms emptied and the ballet-girls, crowding around Sorelli like timid sheep around their shepherdess, made for the foyer through the ill-lit passages and staircases, trotting as fast as their little pink legs could carry them.\n\n\n\n[1] I have the anecdote, which is quite authentic, from M. Pedro Gailhard himself, the late manager of the Opera.\n\n\n\n\nChapter II The New Margarita\n\nOn the first landing, Sorelli ran against the Comte de Chagny, who was coming up-stairs. The count, who was generally so calm, seemed greatly excited.\n\n\"I was just going to you,\" he said, taking off his hat. \"Oh, Sorelli, what an evening! And Christine Daae: what a triumph!\"\n\n\"Impossible!\" said Meg Giry. \"Six months ago, she used to sing like a CROCK! But do let us get by, my dear count,\" continues the brat, with a saucy curtsey. \"We are going to inquire after a poor man who was found hanging by the neck.\"\n\nJust then the acting-manager came fussing past and stopped when he heard this remark.\n\n\"What!\" he exclaimed roughly. \"Have you girls heard already? Well, please forget about it for tonight—and above all don't let M. Debienne and M. Poligny hear; it would upset them too much on their last day.\"\n\nThey all went on to the foyer of the ballet, which was already full of people. The Comte de Chagny was right; no gala performance ever equalled this one. All the great composers of the day had conducted their own works in turns. Faure and Krauss had sung; and, on that evening, Christine Daae had revealed her true self, for the first time, to the astonished and enthusiastic audience. Gounod had conducted the Funeral March of a Marionnette; Reyer, his beautiful overture to Siguar; Saint Saens, the Danse Macabre and a Reverie Orientale; Massenet, an unpublished Hungarian march; Guiraud, his Carnaval; Delibes, the Valse Lente from Sylvia and the Pizzicati from Coppelia. Mlle. Krauss had sung the bolero in the Vespri Siciliani; and Mlle. Denise Bloch the drinking song in Lucrezia Borgia.\n\nBut the real triumph was reserved for Christine Daae, who had begun by singing a few passages from Romeo and Juliet. It was the first time that the young artist sang in this work of Gounod, which had not been transferred to the Opera and which was revived at the Opera Comique after it had been produced at the old Theatre Lyrique by Mme. Carvalho. Those who heard her say that her voice, in these passages, was seraphic; but this was nothing to the superhuman notes that she gave forth in the prison scene and the final trio in FAUST, which she sang in the place of La Carlotta, who was ill. No one had ever heard or seen anything like it.\n\nDaae revealed a new Margarita that night, a Margarita of a splendor, a radiance hitherto unsuspected. The whole house went mad, rising to its feet, shouting, cheering, clapping, while Christine sobbed and fainted in the arms of her fellow-singers and had to be carried to her dressing-room. A few subscribers, however, protested. Why had so great a treasure been kept from them all that time? Till then, Christine Daae had played a good Siebel to Carlotta's rather too splendidly material Margarita. And it had needed Carlotta's incomprehensible and inexcusable absence from this gala night for the little Daae, at a moment's warning, to show all that she could do in a part of the program reserved for the Spanish diva! Well, what the subscribers wanted to know was, why had Debienne and Poligny applied to Daae, when Carlotta was taken ill? Did they know of her hidden genius? And, if they knew of it, why had they kept it hidden? And why had she kept it hidden? Oddly enough, she was not known to have a professor of singing at that moment. She had often said she meant to practise alone for the future. The whole thing was a mystery.\n\nThe Comte de Chagny, standing up in his box, listened to all this frenzy and took part in it by loudly applauding. Philippe Georges Marie Comte de Chagny was just forty-one years of age. He was a great aristocrat and a good-looking man, above middle height and with attractive features, in spite of his hard forehead and his rather cold eyes. He was exquisitely polite to the women and a little haughty to the men, who did not always forgive him for his successes in society. He had an excellent heart and an irreproachable conscience. On the death of old Count Philibert, he became the head of one of the oldest and most distinguished families in France, whose arms dated back to the fourteenth century. The Chagnys owned a great deal of property; and, when the old count, who was a widower, died, it was no easy task for Philippe to accept the management of so large an estate. His two sisters and his brother, Raoul, would not hear of a division and waived their claim to their shares, leaving themselves entirely in Philippe's hands, as though the right of primogeniture had never ceased to exist. When the two sisters married, on the same day, they received their portion from their brother, not as a thing rightfully belonging to them, but as a dowry for which they thanked him.\n\nThe Comtesse de Chagny, nee de Moerogis de La Martyniere, had died in giving birth to Raoul, who was born twenty years after his elder brother. At the time of the old count's death, Raoul was twelve years of age. Philippe busied himself actively with the youngster's education. He was admirably assisted in this work first by his sisters and afterward by an old aunt, the widow of a naval officer, who lived at Brest and gave young Raoul a taste for the sea. The lad entered the Borda training-ship, finished his course with honors and quietly made his trip round the world. Thanks to powerful influence, he had just been appointed a member of the official expedition on board the Requin, which was to be sent to the Arctic Circle in search of the survivors of the D'Artoi's expedition, of whom nothing had been heard for three years. Meanwhile, he was enjoying a long furlough which would not be over for six months; and already the dowagers of the Faubourg Saint-Germain were pitying the handsome and apparently delicate stripling for the hard work in store for him.\n\nThe shyness of the sailor-lad—I was almost saying his innocence—was remarkable. He seemed to have but just left the women's apron-strings. As a matter of fact, petted as he was by his two sisters and his old aunt, he had retained from this purely feminine education manners that were almost candid and stamped with a charm that nothing had yet been able to sully. He was a little over twenty-one years of age and looked eighteen. He had a small, fair mustache, beautiful blue eyes and a complexion like a girl's.\n\nPhilippe spoiled Raoul. To begin with, he was very proud of him and pleased to foresee a glorious career for his junior in the navy in which one of their ancestors, the famous Chagny de La Roche, had held the rank of admiral. He took advantage of the young man's leave of absence to show him Paris, with all its luxurious and artistic delights. The count considered that, at Raoul's age, it is not good to be too good. Philippe himself had a character that was very well-balanced in work and pleasure alike; his demeanor was always faultless; and he was incapable of setting his brother a bad example. He took him with him wherever he went. He even introduced him to the foyer of the ballet. I know that the count was said to be \"on terms\" with Sorelli. But it could hardly be reckoned as a crime for this nobleman, a bachelor, with plenty of leisure, especially since his sisters were settled, to come and spend an hour or two after dinner in the company of a dancer, who, though not so very, very witty, had the finest eyes that ever were seen! And, besides, there are places where a true Parisian, when he has the rank of the Comte de Chagny, is bound to show himself; and at that time the foyer of the ballet at the Opera was one of those places.\n\nLastly, Philippe would perhaps not have taken his brother behind the scenes of the Opera if Raoul had not been the first to ask him, repeatedly renewing his request with a gentle obstinacy which the count remembered at a later date.\n\nOn that evening, Philippe, after applauding the Daae, turned to Raoul and saw that he was quite pale.\n\n\"Don't you see,\" said Raoul, \"that the woman's fainting?\"\n\n\"You look like fainting yourself,\" said the count. \"What's the matter?\"\n\nBut Raoul had recovered himself and was standing up.\n\n\"Let's go and see,\" he said, \"she never sang like that before.\"\n\nThe count gave his brother a curious smiling glance and seemed quite pleased. They were soon at the door leading from the house to the stage. Numbers of subscribers were slowly making their way through. Raoul tore his gloves without knowing what he was doing and Philippe had much too kind a heart to laugh at him for his impatience. But he now understood why Raoul was absent-minded when spoken to and why he always tried to turn every conversation to the subject of the Opera.\n\nThey reached the stage and pushed through the crowd of gentlemen, scene-shifters, supers and chorus-girls, Raoul leading the way, feeling that his heart no longer belonged to him, his face set with passion, while Count Philippe followed him with difficulty and continued to smile. At the back of the stage, Raoul had to stop before the inrush of the little troop of ballet-girls who blocked the passage which he was trying to enter. More than one chaffing phrase darted from little made-up lips, to which he did not reply; and at last he was able to pass, and dived into the semi-darkness of a corridor ringing with the name of \"Daae! Daae!\" The count was surprised to find that Raoul knew the way. He had never taken him to Christine's himself and came to the conclusion that Raoul must have gone there alone while the count stayed talking in the foyer with Sorelli, who often asked him to wait until it was her time to \"go on\" and sometimes handed him the little gaiters in which she ran down from her dressing-room to preserve the spotlessness of her satin dancing-shoes and her flesh-colored tights. Sorelli had an excuse; she had lost her mother.\n\nPostponing his usual visit to Sorelli for a few minutes, the count followed his brother down the passage that led to Daae's dressing-room and saw that it had never been so crammed as on that evening, when the whole house seemed excited by her success and also by her fainting fit. For the girl had not yet come to; and the doctor of the theater had just arrived at the moment when Raoul entered at his heels. Christine, therefore, received the first aid of the one, while opening her eyes in the arms of the other. The count and many more remained crowding in the doorway.\n\n\"Don't you think, Doctor, that those gentlemen had better clear the room?\" asked Raoul coolly. \"There's no breathing here.\"\n\n\"You're quite right,\" said the doctor.\n\nAnd he sent every one away, except Raoul and the maid, who looked at Raoul with eyes of the most undisguised astonishment. She had never seen him before and yet dared not question him; and the doctor imagined that the young man was only acting as he did because he had the right to. The viscount, therefore, remained in the room watching Christine as she slowly returned to life, while even the joint managers, Debienne and Poligny, who had come to offer their sympathy and congratulations, found themselves thrust into the passage among the crowd of dandies. The Comte de Chagny, who was one of those standing outside, laughed:\n\n\"Oh, the rogue, the rogue!\" And he added, under his breath: \"Those youngsters with their school-girl airs! So he's a Chagny after all!\"\n\nHe turned to go to Sorelli's dressing-room, but met her on the way, with her little troop of trembling ballet-girls, as we have seen.\n\nMeanwhile, Christine Daae uttered a deep sigh, which was answered by a groan. She turned her head, saw Raoul and started. She looked at the doctor, on whom she bestowed a smile, then at her maid, then at Raoul again.\n\n\"Monsieur,\" she said, in a voice not much above a whisper, \"who are you?\"\n\n\"Mademoiselle,\" replied the young man, kneeling on one knee and pressing a fervent kiss on the diva's hand, \"I AM THE LITTLE BOY WHO WENT INTO THE SEA TO RESCUE YOUR SCARF.\"\n\nChristine again looked at the doctor and the maid; and all three began to laugh.\n\nRaoul turned very red and stood up.\n\n\"Mademoiselle,\" he said, \"since you are pleased not to recognize me, I should like to say something to you in private, something very important.\"\n\n\"When I am better, do you mind?\" And her voice shook. \"You have been very good.\"\n\n\"Yes, you must go,\" said the doctor, with his pleasantest smile. \"Leave me to attend to mademoiselle.\"\n\n\"I am not ill now,\" said Christine suddenly, with strange and unexpected energy.\n\nShe rose and passed her hand over her eyelids.\n\n\"Thank you, Doctor. I should like to be alone. Please go away, all of you. Leave me. I feel very restless this evening.\"\n\nThe doctor tried to make a short protest, but, perceiving the girl's evident agitation, he thought the best remedy was not to thwart her. And he went away, saying to Raoul, outside:\n\n\"She is not herself to-night. She is usually so gentle.\"\n\nThen he said good night and Raoul was left alone. The whole of this part of the theater was now deserted. The farewell ceremony was no doubt taking place in the foyer of the ballet. Raoul thought that Daae might go to it and he waited in the silent solitude, even hiding in the favoring shadow of a doorway. He felt a terrible pain at his heart and it was of this that he wanted to speak to Daae without delay.\n\nSuddenly the dressing-room door opened and the maid came out by herself, carrying bundles. He stopped her and asked how her mistress was. The woman laughed and said that she was quite well, but that he must not disturb her, for she wished to be left alone. And she passed on. One idea alone filled Raoul's burning brain: of course, Daae wished to be left alone FOR HIM! Had he not told her that he wanted to speak to her privately?\n\nHardly breathing, he went up to the dressing-room and, with his ear to the door to catch her reply, prepared to knock. But his hand dropped. He had heard A MAN'S VOICE in the dressing-room, saying, in a curiously masterful tone:\n\n\"Christine, you must love me!\"\n\nAnd Christine's voice, infinitely sad and trembling, as though accompanied by tears, replied:\n\n\"How can you talk like that? WHEN I SING ONLY FOR YOU!\"\n\nRaoul leaned against the panel to ease his pain. His heart, which had seemed gone for ever, returned to his breast and was throbbing loudly. The whole passage echoed with its beating and Raoul's ears were deafened. Surely, if his heart continued to make such a noise, they would hear it inside, they would open the door and the young man would be turned away in disgrace. What a position for a Chagny! To be caught listening behind a door! He took his heart in his two hands to make it stop.\n\nThe man's voice spoke again: \"Are you very tired?\"\n\n\"Oh, to-night I gave you my soul and I am dead!\" Christine replied.\n\n\"Your soul is a beautiful thing, child,\" replied the grave man's voice, \"and I thank you. No emperor ever received so fair a gift. THE ANGELS WEPT TONIGHT.\"\n\nRaoul heard nothing after that. Nevertheless, he did not go away, but, as though he feared lest he should be caught, he returned to his dark corner, determined to wait for the man to leave the room. At one and the same time, he had learned what love meant, and hatred. He knew that he loved. He wanted to know whom he hated. To his great astonishment, the door opened and Christine Daae appeared, wrapped in furs, with her face hidden in a lace veil, alone. She closed the door behind her, but Raoul observed that she did not lock it. She passed him. He did not even follow her with his eyes, for his eyes were fixed on the door, which did not open again.\n\nWhen the passage was once more deserted, he crossed it, opened the door of the dressing-room, went in and shut the door. He found himself in absolute darkness. The gas had been turned out.\n\n\"There is some one here!\" said Raoul, with his back against the closed door, in a quivering voice. \"What are you hiding for?\"\n\nAll was darkness and silence. Raoul heard only the sound of his own breathing. He quite failed to see that the indiscretion of his conduct was exceeding all bounds.\n\n\"You shan't leave this until I let you!\" he exclaimed. \"If you don't answer, you are a coward! But I'll expose you!\"\n\nAnd he struck a match. The blaze lit up the room. There was no one in the room! Raoul, first turning the key in the door, lit the gas-jets. He went into the dressing-closet, opened the cupboards, hunted about, felt the walls with his moist hands. Nothing!\n\n\"Look here!\" he said, aloud. \"Am I going mad?\"\n\nHe stood for ten minutes listening to the gas flaring in the silence of the empty room; lover though he was, he did not even think of stealing a ribbon that would have given him the perfume of the woman he loved. He went out, not knowing what he was doing nor where he was going. At a given moment in his wayward progress, an icy draft struck him in the face. He found himself at the bottom of a staircase, down which, behind him, a procession of workmen were carrying a sort of stretcher, covered with a white sheet.\n\n\"Which is the way out, please?\" he asked of one of the men.\n\n\"Straight in front of you, the door is open. But let us pass.\"\n\nPointing to the stretcher, he asked mechanically: \"What's that?\"\n\nThe workmen answered:\n\n\"'That' is Joseph Buquet, who was found in the third cellar, hanging between a farm-house and a scene from the ROI DE LAHORE.\"\n\nHe took off his hat, fell back to make room for the procession and went out.\n\n\n\n\nChapter III The Mysterious Reason\n\nDuring this time, the farewell ceremony was taking place. I have already said that this magnificent function was being given on the occasion of the retirement of M. Debienne and M. Poligny, who had determined to \"die game,\" as we say nowadays. They had been assisted in the realization of their ideal, though melancholy, program by all that counted in the social and artistic world of Paris. All these people met, after the performance, in the foyer of the ballet, where Sorelli waited for the arrival of the retiring managers with a glass of champagne in her hand and a little prepared speech at the tip of her tongue. Behind her, the members of the Corps de Ballet, young and old, discussed the events of the day in whispers or exchanged discreet signals with their friends, a noisy crowd of whom surrounded the supper-tables arranged along the slanting floor.\n\nA few of the dancers had already changed into ordinary dress; but most of them wore their skirts of gossamer gauze; and all had thought it the right thing to put on a special face for the occasion: all, that is, except little Jammes, whose fifteen summers—happy age!—seemed already to have forgotten the ghost and the death of Joseph Buquet. She never ceased to laugh and chatter, to hop about and play practical jokes, until Mm. Debienne and Poligny appeared on the steps of the foyer, when she was severely called to order by the impatient Sorelli.\n\nEverybody remarked that the retiring managers looked cheerful, as is the Paris way. None will ever be a true Parisian who has not learned to wear a mask of gaiety over his sorrows and one of sadness, boredom or indifference over his inward joy. You know that one of your friends is in trouble; do not try to console him: he will tell you that he is already comforted; but, should he have met with good fortune, be careful how you congratulate him: he thinks it so natural that he is surprised that you should speak of it. In Paris, our lives are one masked ball; and the foyer of the ballet is the last place in which two men so \"knowing\" as M. Debienne and M. Poligny would have made the mistake of betraying their grief, however genuine it might be. And they were already smiling rather too broadly upon Sorelli, who had begun to recite her speech, when an exclamation from that little madcap of a Jammes broke the smile of the managers so brutally that the expression of distress and dismay that lay beneath it became apparent to all eyes:\n\n\"The Opera ghost!\"\n\nJammes yelled these words in a tone of unspeakable terror; and her finger pointed, among the crowd of dandies, to a face so pallid, so lugubrious and so ugly, with two such deep black cavities under the straddling eyebrows, that the death's head in question immediately scored a huge success.\n\n\"The Opera ghost! The Opera ghost!\" Everybody laughed and pushed his neighbor and wanted to offer the Opera ghost a drink, but he was gone. He had slipped through the crowd; and the others vainly hunted for him, while two old gentlemen tried to calm little Jammes and while little Giry stood screaming like a peacock.\n\nSorelli was furious; she had not been able to finish her speech; the managers, had kissed her, thanked her and run away as fast as the ghost himself. No one was surprised at this, for it was known that they were to go through the same ceremony on the floor above, in the foyer of the singers, and that finally they were themselves to receive their personal friends, for the last time, in the great lobby outside the managers' office, where a regular supper would be served.\n\nHere they found the new managers, M. Armand Moncharmin and M. Firmin Richard, whom they hardly knew; nevertheless, they were lavish in protestations of friendship and received a thousand flattering compliments in reply, so that those of the guests who had feared that they had a rather tedious evening in store for them at once put on brighter faces. The supper was almost gay and a particularly clever speech of the representative of the government, mingling the glories of the past with the successes of the future, caused the greatest cordiality to prevail.\n\nThe retiring managers had already handed over to their successors the two tiny master-keys which opened all the doors—thousands of doors—of the Opera house. And those little keys, the object of general curiosity, were being passed from hand to hand, when the attention of some of the guests was diverted by their discovery, at the end of the table, of that strange, wan and fantastic face, with the hollow eyes, which had already appeared in the foyer of the ballet and been greeted by little Jammes' exclamation:\n\n\"The Opera ghost!\"\n\nThere sat the ghost, as natural as could be, except that he neither ate nor drank. Those who began by looking at him with a smile ended by turning away their heads, for the sight of him at once provoked the most funereal thoughts. No one repeated the joke of the foyer, no one exclaimed:\n\n\"There's the Opera ghost!\"\n\nHe himself did not speak a word and his very neighbors could not have stated at what precise moment he had sat down between them; but every one felt that if the dead did ever come and sit at the table of the living, they could not cut a more ghastly figure. The friends of Firmin Richard and Armand Moncharmin thought that this lean and skinny guest was an acquaintance of Debienne's or Poligny's, while Debienne's and Poligny's friends believed that the cadaverous individual belonged to Firmin Richard and Armand Moncharmin's party.\n\nThe result was that no request was made for an explanation; no unpleasant remark; no joke in bad taste, which might have offended this visitor from the tomb. A few of those present who knew the story of the ghost and the description of him given by the chief scene-shifter—they did not know of Joseph Buquet's death—thought, in their own minds, that the man at the end of the table might easily have passed for him; and yet, according to the story, the ghost had no nose and the person in question had. But M. Moncharmin declares, in his Memoirs, that the guest's nose was transparent: \"long, thin and transparent\" are his exact words. I, for my part, will add that this might very well apply to a false nose. M. Moncharmin may have taken for transparency what was only shininess. Everybody knows that orthopaedic science provides beautiful false noses for those who have lost their noses naturally or as the result of an operation.\n\nDid the ghost really take a seat at the managers' supper-table that night, uninvited? And can we be sure that the figure was that of the Opera ghost himself? Who would venture to assert as much? I mention the incident, not because I wish for a second to make the reader believe—or even to try to make him believe—that the ghost was capable of such a sublime piece of impudence; but because, after all, the thing is impossible.\n\nM. Armand Moncharmin, in chapter eleven of his Memoirs, says:\n\n\"When I think of this first evening, I can not separate the secret confided to us by MM. Debienne and Poligny in their office from the presence at our supper of that GHOSTLY person whom none of us knew.\"\n\nWhat happened was this: Mm. Debienne and Poligny, sitting at the center of the table, had not seen the man with the death's head. Suddenly he began to speak.\n\n\"The ballet-girls are right,\" he said. \"The death of that poor Buquet is perhaps not so natural as people think.\"\n\nDebienne and Poligny gave a start.\n\n\"Is Buquet dead?\" they cried.\n\n\"Yes,\" replied the man, or the shadow of a man, quietly. \"He was found, this evening, hanging in the third cellar, between a farm-house and a scene from the Roi de Lahore.\"\n\nThe two managers, or rather ex-managers, at once rose and stared strangely at the speaker. They were more excited than they need have been, that is to say, more excited than any one need be by the announcement of the suicide of a chief scene-shifter. They looked at each other. They, had both turned whiter than the table-cloth. At last, Debienne made a sign to Mm. Richard and Moncharmin; Poligny muttered a few words of excuse to the guests; and all four went into the managers' office. I leave M. Moncharmin to complete the story. In his Memoirs, he says:\n\n\"Mm. Debienne and Poligny seemed to grow more and more excited, and they appeared to have something very difficult to tell us. First, they asked us if we knew the man, sitting at the end of the table, who had told them of the death of Joseph Buquet; and, when we answered in the negative, they looked still more concerned. They took the master-keys from our hands, stared at them for a moment and advised us to have new locks made, with the greatest secrecy, for the rooms, closets and presses that we might wish to have hermetically closed. They said this so funnily that we began to laugh and to ask if there were thieves at the Opera. They replied that there was something worse, which was the GHOST. We began to laugh again, feeling sure that they were indulging in some joke that was intended to crown our little entertainment. Then, at their request, we became 'serious,' resolving to humor them and to enter into the spirit of the game. They told us that they never would have spoken to us of the ghost, if they had not received formal orders from the ghost himself to ask us to be pleasant to him and to grant any request that he might make. However, in their relief at leaving a domain where that tyrannical shade held sway, they had hesitated until the last moment to tell us this curious story, which our skeptical minds were certainly not prepared to entertain. But the announcement of the death of Joseph Buquet had served them as a brutal reminder that, whenever they had disregarded the ghost's wishes, some fantastic or disastrous event had brought them to a sense of their dependence.\n\n\"During these unexpected utterances made in a tone of the most secret and important confidence, I looked at Richard. Richard, in his student days, had acquired a great reputation for practical joking, and he seemed to relish the dish which was being served up to him in his turn. He did not miss a morsel of it, though the seasoning was a little gruesome because of the death of Buquet. He nodded his head sadly, while the others spoke, and his features assumed the air of a man who bitterly regretted having taken over the Opera, now that he knew that there was a ghost mixed up in the business. I could think of nothing better than to give him a servile imitation of this attitude of despair. However, in spite of all our efforts, we could not, at the finish, help bursting out laughing in the faces of MM. Debienne and Poligny, who, seeing us pass straight from the gloomiest state of mind to one of the most insolent merriment, acted as though they thought that we had gone mad.\n\n\"The joke became a little tedious; and Richard asked half-seriously and half in jest:\n\n\"'But, after all, what does this ghost of yours want?'\n\n\"M. Poligny went to his desk and returned with a copy of the memorandum-book. The memorandum-book begins with the well-known words saying that 'the management of the Opera shall give to the performance of the National Academy of Music the splendor that becomes the first lyric stage in France' and ends with Clause 98, which says that the privilege can be withdrawn if the manager infringes the conditions stipulated in the memorandum-book. This is followed by the conditions, which are four in number.\n\n\"The copy produced by M. Poligny was written in black ink and exactly similar to that in our possession, except that, at the end, it contained a paragraph in red ink and in a queer, labored handwriting, as though it had been produced by dipping the heads of matches into the ink, the writing of a child that has never got beyond the down-strokes and has not learned to join its letters. This paragraph ran, word for word, as follows:\n\n\"'5. Or if the manager, in any month, delay for more than a fortnight the payment of the allowance which he shall make to the Opera ghost, an allowance of twenty thousand francs a month, say two hundred and forty thousand francs a year.'\n\n\"M. Poligny pointed with a hesitating finger to this last clause, which we certainly did not expect.\n\n\"'Is this all? Does he not want anything else?' asked Richard, with the greatest coolness.\n\n\"'Yes, he does,' replied Poligny.\n\n\"And he turned over the pages of the memorandum-book until he came to the clause specifying the days on which certain private boxes were to be reserved for the free use of the president of the republic, the ministers and so on. At the end of this clause, a line had been added, also in red ink:\n\n\"'Box Five on the grand tier shall be placed at the disposal of the Opera ghost for every performance.'\n\n\"When we saw this, there was nothing else for us to do but to rise from our chairs, shake our two predecessors warmly by the hand and congratulate them on thinking of this charming little joke, which proved that the old French sense of humor was never likely to become extinct. Richard added that he now understood why MM. Debienne and Poligny were retiring from the management of the National Academy of Music. Business was impossible with so unreasonable a ghost.\n\n\"'Certainly, two hundred and forty thousand francs are not be picked up for the asking,' said M. Poligny, without moving a muscle of his face. 'And have you considered what the loss over Box Five meant to us? We did not sell it once; and not only that, but we had to return the subscription: why, it's awful! We really can't work to keep ghosts! We prefer to go away!'\n\n\"'Yes,' echoed M. Debienne, 'we prefer to go away. Let us go.'\"\n\n\"And he stood up. Richard said: 'But, after all all, it seems to me that you were much too kind to the ghost. If I had such a troublesome ghost as that, I should not hesitate to have him arrested.'\n\n\"'But how? Where?' they cried, in chorus. 'We have never seen him!'\n\n\"'But when he comes to his box?'\n\n\"'WE HAVE NEVER SEEN HIM IN HIS BOX.'\n\n\"'Then sell it.'\n\n\"'Sell the Opera ghost's box! Well, gentlemen, try it.'\n\n\"Thereupon we all four left the office. Richard and I had 'never laughed so much in our lives.'\"\n\n\n\n\nChapter IV Box Five\n\nArmand Moncharmin wrote such voluminous Memoirs during the fairly long period of his co-management that we may well ask if he ever found time to attend to the affairs of the Opera otherwise than by telling what went on there. M. Moncharmin did not know a note of music, but he called the minister of education and fine arts by his Christian name, had dabbled a little in society journalism and enjoyed a considerable private income. Lastly, he was a charming fellow and showed that he was not lacking in intelligence, for, as soon as he made up his mind to be a sleeping partner in the Opera, he selected the best possible active manager and went straight to Firmin Richard.\n\nFirmin Richard was a very distinguished composer, who had published a number of successful pieces of all kinds and who liked nearly every form of music and every sort of musician. Clearly, therefore, it was the duty of every sort of musician to like M. Firmin Richard. The only things to be said against him were that he was rather masterful in his ways and endowed with a very hasty temper.\n\nThe first few days which the partners spent at the Opera were given over to the delight of finding themselves the head of so magnificent an enterprise; and they had forgotten all about that curious, fantastic story of the ghost, when an incident occurred that proved to them that the joke—if joke it were—was not over. M. Firmin Richard reached his office that morning at eleven o'clock. His secretary, M. Remy, showed him half a dozen letters which he had not opened because they were marked \"private.\" One of the letters had at once attracted Richard's attention not only because the envelope was addressed in red ink, but because he seemed to have seen the writing before. He soon remembered that it was the red handwriting in which the memorandum-book had been so curiously completed. He recognized the clumsy childish hand. He opened the letter and read:\n\nDEAR MR. MANAGER:\n\nI am sorry to have to trouble you at a time when you must be so very busy, renewing important engagements, signing fresh ones and generally displaying your excellent taste. I know what you have done for Carlotta, Sorelli and little Jammes and for a few others whose admirable qualities of talent or genius you have suspected.\n\nOf course, when I use these words, I do not mean to apply them to La Carlotta, who sings like a squirt and who ought never to have been allowed to leave the Ambassadeurs and the Cafe Jacquin; nor to La Sorelli, who owes her success mainly to the coach-builders; nor to little Jammes, who dances like a calf in a field. And I am not speaking of Christine Daae either, though her genius is certain, whereas your jealousy prevents her from creating any important part. When all is said, you are free to conduct your little business as you think best, are you not?\n\nAll the same, I should like to take advantage of the fact that you have not yet turned Christine Daae out of doors by hearing her this evening in the part of Siebel, as that of Margarita has been forbidden her since her triumph of the other evening; and I will ask you not to dispose of my box to-day nor on the FOLLOWING DAYS, for I can not end this letter without telling you how disagreeably surprised I have been once or twice, to hear, on arriving at the Opera, that my box had been sold, at the box-office, by your orders.\n\nI did not protest, first, because I dislike scandal, and, second, because I thought that your predecessors, MM. Debienne and Poligny, who were always charming to me, had neglected, before leaving, to mention my little fads to you. I have now received a reply from those gentlemen to my letter asking for an explanation, and this reply proves that you know all about my Memorandum-Book and, consequently, that you are treating me with outrageous contempt. IF YOU WISH TO LIVE IN PEACE, YOU MUST NOT BEGIN BY TAKING AWAY MY PRIVATE BOX.\n\nBelieve me to be, dear Mr. Manager, without prejudice to these little observations,\n\nYour Most Humble and Obedient Servant,\n      OPERA GHOST.\nThe letter was accompanied by a cutting from the agony-column of the Revue Theatrale, which ran:\n\nO. G.—There is no excuse for R. and M. We told them and left your memorandum-book in their hands. Kind regards.\n\nM. Firmin Richard had hardly finished reading this letter when M. Armand Moncharmin entered, carrying one exactly similar. They looked at each other and burst out laughing.\n\n\"They are keeping up the joke,\" said M. Richard, \"but I don't call it funny.\"\n\n\"What does it all mean?\" asked M. Moncharmin. \"Do they imagine that, because they have been managers of the Opera, we are going to let them have a box for an indefinite period?\"\n\n\"I am not in the mood to let myself be laughed at long,\" said Firmin Richard.\n\n\"It's harmless enough,\" observed Armand Moncharmin. \"What is it they really want? A box for to-night?\"\n\nM. Firmin Richard told his secretary to send Box Five on the grand tier to Mm. Debienne and Poligny, if it was not sold. It was not. It was sent off to them. Debienne lived at the corner of the Rue Scribe and the Boulevard des Capucines; Poligny, in the Rue Auber. O. Ghost's two letters had been posted at the Boulevard des Capucines post-office, as Moncharmin remarked after examining the envelopes.\n\n\"You see!\" said Richard.\n\nThey shrugged their shoulders and regretted that two men of that age should amuse themselves with such childish tricks.\n\n\"They might have been civil, for all that!\" said Moncharmin. \"Did you notice how they treat us with regard to Carlotta, Sorelli and Little Jammes?\"\n\n\"Why, my dear fellow, these two are mad with jealousy! To think that they went to the expense of, an advertisement in the Revue Theatrale! Have they nothing better to do?\"\n\n\"By the way,\" said Moncharmin, \"they seem to be greatly interested in that little Christine Daae!\"\n\n\"You know as well as I do that she has the reputation of being quite good,\" said Richard.\n\n\"Reputations are easily obtained,\" replied Moncharmin. \"Haven't I a reputation for knowing all about music? And I don't know one key from another.\"\n\n\"Don't be afraid: you never had that reputation,\" Richard declared.\n\nThereupon he ordered the artists to be shown in, who, for the last two hours, had been walking up and down outside the door behind which fame and fortune—or dismissal—awaited them.\n\nThe whole day was spent in discussing, negotiating, signing or cancelling contracts; and the two overworked managers went to bed early, without so much as casting a glance at Box Five to see whether M. Debienne and M. Poligny were enjoying the performance.\n\nNext morning, the managers received a card of thanks from the ghost:\n\nDEAR, MR. MANAGER:\n\nThanks. Charming evening. Daae exquisite. Choruses want waking up. Carlotta a splendid commonplace instrument. Will write you soon for the 240,000 francs, or 233,424 fr. 70 c., to be correct. Mm. Debienne and Poligny have sent me the 6,575 fr. 30 c. representing the first ten days of my allowance for the current year; their privileges finished on the evening of the tenth inst.\n\nKind regards. O. G.\n\nOn the other hand, there was a letter from Mm. Debienne and Poligny:\n\nGENTLEMEN:\n\nWe are much obliged for your kind thought of us, but you will easily understand that the prospect of again hearing Faust, pleasant though it is to ex-managers of the Opera, can not make us forget that we have no right to occupy Box Five on the grand tier, which is the exclusive property of HIM of whom we spoke to you when we went through the memorandum-book with you for the last time. See Clause 98, final paragraph.\n\nAccept, gentlemen, etc.\n\n\"Oh, those fellows are beginning to annoy me!\" shouted Firmin Richard, snatching up the letter.\n\nAnd that evening Box Five was sold.\n\nThe next morning, Mm. Richard and Moncharmin, on reaching their office, found an inspector's report relating to an incident that had happened, the night before, in Box Five. I give the essential part of the report:\n\nI was obliged to call in a municipal guard twice, this evening, to clear Box Five on the grand tier, once at the beginning and once in the middle of the second act. The occupants, who arrived as the curtain rose on the second act, created a regular scandal by their laughter and their ridiculous observations. There were cries of \"Hush!\" all around them and the whole house was beginning to protest, when the box-keeper came to fetch me. I entered the box and said what I thought necessary. The people did not seem to me to be in their right mind; and they made stupid remarks. I said that, if the noise was repeated, I should be compelled to clear the box. The moment I left, I heard the laughing again, with fresh protests from the house. I returned with a municipal guard, who turned them out. They protested, still laughing, saying they would not go unless they had their money back. At last, they became quiet and I allowed them to enter the box again. The laughter at once recommenced; and, this time, I had them turned out definitely.\n\n\"Send for the inspector,\" said Richard to his secretary, who had already read the report and marked it with blue pencil.\n\nM. Remy, the secretary, had foreseen the order and called the inspector at once.\n\n\"Tell us what happened,\" said Richard bluntly.\n\nThe inspector began to splutter and referred to the report.\n\n\"Well, but what were those people laughing at?\" asked Moncharmin.\n\n\"They must have been dining, sir, and seemed more inclined to lark about than to listen to good music. The moment they entered the box, they came out again and called the box-keeper, who asked them what they wanted. They said, 'Look in the box: there's no one there, is there?' 'No,' said the woman. 'Well,' said they, 'when we went in, we heard a voice saying THAT THE BOX WAS TAKEN!'\"\n\nM. Moncharmin could not help smiling as he looked at M. Richard; but M. Richard did not smile. He himself had done too much in that way in his time not to recognize, in the inspector's story, all the marks of one of those practical jokes which begin by amusing and end by enraging the victims. The inspector, to curry favor with M. Moncharmin, who was smiling, thought it best to give a smile too. A most unfortunate smile! M. Richard glared at his subordinate, who thenceforth made it his business to display a face of utter consternation.\n\n\"However, when the people arrived,\" roared Richard, \"there was no one in the box, was there?\"\n\n\"Not a soul, sir, not a soul! Nor in the box on the right, nor in the box on the left: not a soul, sir, I swear! The box-keeper told it me often enough, which proves that it was all a joke.\"\n\n\"Oh, you agree, do you?\" said Richard. \"You agree! It's a joke! And you think it funny, no doubt?\"\n\n\"I think it in very bad taste, sir.\"\n\n\"And what did the box-keeper say?\"\n\n\"Oh, she just said that it was the Opera ghost. That's all she said!\"\n\nAnd the inspector grinned. But he soon found that he had made a mistake in grinning, for the words had no sooner left his mouth than M. Richard, from gloomy, became furious.\n\n\"Send for the box-keeper!\" he shouted. \"Send for her! This minute! This minute! And bring her in to me here! And turn all those people out!\"\n\nThe inspector tried to protest, but Richard closed his mouth with an angry order to hold his tongue. Then, when the wretched man's lips seemed shut for ever, the manager commanded him to open them once more.\n\n\"Who is this 'Opera ghost?'\" he snarled.\n\nBut the inspector was by this time incapable of speaking a word. He managed to convey, by a despairing gesture, that he knew nothing about it, or rather that he did not wish to know.\n\n\"Have you ever seen him, have you seen the Opera ghost?\"\n\nThe inspector, by means of a vigorous shake of the head, denied ever having seen the ghost in question.\n\n\"Very well!\" said M. Richard coldly.\n\nThe inspector's eyes started out of his head, as though to ask why the manager had uttered that ominous \"Very well!\"\n\n\"Because I'm going to settle the account of any one who has not seen him!\" explained the manager. \"As he seems to be everywhere, I can't have people telling me that they see him nowhere. I like people to work for me when I employ them!\"\n\nHaving said this, M. Richard paid no attention to the inspector and discussed various matters of business with his acting-manager, who had entered the room meanwhile. The inspector thought he could go and was gently—oh, so gently!—sidling toward the door, when M. Richard nailed the man to the floor with a thundering:\n\n\"Stay where you are!\"\n\nM. Remy had sent for the box-keeper to the Rue de Provence, close to the Opera, where she was engaged as a porteress. She soon made her appearance.\n\n\"What's your name?\"\n\n\"Mme. Giry. You know me well enough, sir; I'm the mother of little Giry, little Meg, what!\"\n\nThis was said in so rough and solemn a tone that, for a moment, M. Richard was impressed. He looked at Mme. Giry, in her faded shawl, her worn shoes, her old taffeta dress and dingy bonnet. It was quite evident from the manager's attitude, that he either did not know or could not remember having met Mme. Giry, nor even little Giry, nor even \"little Meg!\" But Mme. Giry's pride was so great that the celebrated box-keeper imagined that everybody knew her.\n\n\"Never heard of her!\" the manager declared. \"But that's no reason, Mme. Giry, why I shouldn't ask you what happened last night to make you and the inspector call in a municipal guard.\"\n\n\"I was just wanting to see you, sir, and talk to you about it, so that you mightn't have the same unpleasantness as M. Debienne and M. Poligny. They wouldn't listen to me either, at first.\"\n\n\"I'm not asking you about all that. I'm asking what happened last night.\"\n\nMme. Giry turned purple with indignation. Never had she been spoken to like that. She rose as though to go, gathering up the folds of her skirt and waving the feathers of her dingy bonnet with dignity, but, changing her mind, she sat down again and said, in a haughty voice:\n\n\"I'll tell you what happened. The ghost was annoyed again!\"\n\nThereupon, as M. Richard was on the point of bursting out, M. Moncharmin interfered and conducted the interrogatory, whence it appeared that Mme. Giry thought it quite natural that a voice should be heard to say that a box was taken, when there was nobody in the box. She was unable to explain this phenomenon, which was not new to her, except by the intervention of the ghost. Nobody could see the ghost in his box, but everybody could hear him. She had often heard him; and they could believe her, for she always spoke the truth. They could ask M. Debienne and M. Poligny, and anybody who knew her; and also M. Isidore Saack, who had had a leg broken by the ghost!\n\n\"Indeed!\" said Moncharmin, interrupting her. \"Did the ghost break poor Isidore Saack's leg?\"\n\nMme. Giry opened her eyes with astonishment at such ignorance. However, she consented to enlighten those two poor innocents. The thing had happened in M. Debienne and M. Poligny's time, also in Box Five and also during a performance of FAUST. Mme. Giry coughed, cleared her throat—it sounded as though she were preparing to sing the whole of Gounod's score—and began:\n\n\"It was like this, sir. That night, M. Maniera and his lady, the jewelers in the Rue Mogador, were sitting in the front of the box, with their great friend, M. Isidore Saack, sitting behind Mme. Maniera. Mephistopheles was singing\"—Mme. Giry here burst into song herself—\"'Catarina, while you play at sleeping,' and then M. Maniera heard a voice in his right ear (his wife was on his left) saying, 'Ha, ha! Julie's not playing at sleeping!' His wife happened to be called Julie. So. M. Maniera turns to the right to see who was talking to him like that. Nobody there! He rubs his ear and asks himself, if he's dreaming. Then Mephistopheles went on with his serenade... But, perhaps I'm boring you gentlemen?\"\n\n\"No, no, go on.\"\n\n\"You are too good, gentlemen,\" with a smirk. \"Well, then, Mephistopheles went on with his serenade\"—Mme. Giry, burst into song again—\"'Saint, unclose thy portals holy and accord the bliss, to a mortal bending lowly, of a pardon-kiss.' And then M. Maniera again hears the voice in his right ear, saying, this time, 'Ha, ha! Julie wouldn't mind according a kiss to Isidore!' Then he turns round again, but, this time, to the left; and what do you think he sees? Isidore, who had taken his lady's hand and was covering it with kisses through the little round place in the glove—like this, gentlemen\"—rapturously kissing the bit of palm left bare in the middle of her thread gloves. \"Then they had a lively time between them! Bang! Bang! M. Maniera, who was big and strong, like you, M. Richard, gave two blows to M. Isidore Saack, who was small and weak like M. Moncharmin, saving his presence. There was a great uproar. People in the house shouted, 'That will do! Stop them! He'll kill him!' Then, at last, M. Isidore Saack managed to run away.\"\n\n\"Then the ghost had not broken his leg?\" asked M. Moncharmin, a little vexed that his figure had made so little impression on Mme. Giry.\n\n\"He did break it for him, sir,\" replied Mme. Giry haughtily. \"He broke it for him on the grand staircase, which he ran down too fast, sir, and it will be long before the poor gentleman will be able to go up it again!\"\n\n\"Did the ghost tell you what he said in M. Maniera's right ear?\" asked M. Moncharmin, with a gravity which he thought exceedingly humorous.\n\n\"No, sir, it was M. Maniera himself. So——\"\n\n\"But you have spoken to the ghost, my good lady?\"\n\n\"As I'm speaking to you now, my good sir!\" Mme. Giry replied.\n\n\"And, when the ghost speaks to you, what does he say?\"\n\n\"Well, he tells me to bring him a footstool!\"\n\nThis time, Richard burst out laughing, as did Moncharmin and Remy, the secretary. Only the inspector, warned by experience, was careful not to laugh, while Mme. Giry ventured to adopt an attitude that was positively threatening.\n\n\"Instead of laughing,\" she cried indignantly, \"you'd do better to do as M. Poligny did, who found out for himself.\"\n\n\"Found out about what?\" asked Moncharmin, who had never been so much amused in his life.\n\n\"About the ghost, of course! ... Look here ...\"\n\nShe suddenly calmed herself, feeling that this was a solemn moment in her life:\n\n\"LOOK HERE,\" she repeated. \"They were playing La Juive. M. Poligny thought he would watch the performance from the ghost's box... Well, when Leopold cries, 'Let us fly!'—you know—and Eleazer stops them and says, 'Whither go ye?' ... well, M. Poligny—I was watching him from the back of the next box, which was empty—M. Poligny got up and walked out quite stiffly, like a statue, and before I had time to ask him, 'Whither go ye?' like Eleazer, he was down the staircase, but without breaking his leg.\n\n\"Still, that doesn't let us know how the Opera ghost came to ask you for a footstool,\" insisted M. Moncharmin.\n\n\"Well, from that evening, no one tried to take the ghost's private box from him. The manager gave orders that he was to have it at each performance. And, whenever he came, he asked me for a footstool.\"\n\n\"Tut, tut! A ghost asking for a footstool! Then this ghost of yours is a woman?\"\n\n\"No, the ghost is a man.\"\n\n\"How do you know?\"\n\n\"He has a man's voice, oh, such a lovely man's voice! This is what happens: When he comes to the opera, it's usually in the middle of the first act. He gives three little taps on the door of Box Five. The first time I heard those three taps, when I knew there was no one in the box, you can think how puzzled I was! I opened the door, listened, looked; nobody! And then I heard a voice say, 'Mme. Jules' my poor husband's name was Jules—'a footstool, please.' Saving your presence, gentlemen, it made me feel all-overish like. But the voice went on, 'Don't be frightened, Mme. Jules, I'm the Opera ghost!' And the voice was so soft and kind that I hardly felt frightened. THE VOICE WAS SITTING IN THE CORNER CHAIR, ON THE RIGHT, IN THE FRONT ROW.\"\n\n\"Was there any one in the box on the right of Box Five?\" asked Moncharmin.\n\n\"No; Box Seven, and Box Three, the one on the left, were both empty. The curtain had only just gone up.\"\n\n\"And what did you do?\"\n\n\"Well, I brought the footstool. Of course, it wasn't for himself he wanted it, but for his lady! But I never heard her nor saw her.\"\n\n\"Eh? What? So now the ghost is married!\" The eyes of the two managers traveled from Mme. Giry to the inspector, who, standing behind the box-keeper, was waving his arms to attract their attention. He tapped his forehead with a distressful forefinger, to convey his opinion that the widow Jules Giry was most certainly mad, a piece of pantomime which confirmed M. Richard in his determination to get rid of an inspector who kept a lunatic in his service. Meanwhile, the worthy lady went on about her ghost, now painting his generosity:\n\n\"At the end of the performance, he always gives me two francs, sometimes five, sometimes even ten, when he has been many days without coming. Only, since people have begun to annoy him again, he gives me nothing at all.\n\n\"Excuse me, my good woman,\" said Moncharmin, while Mme. Giry tossed the feathers in her dingy hat at this persistent familiarity, \"excuse me, how does the ghost manage to give you your two francs?\"\n\n\"Why, he leaves them on the little shelf in the box, of course. I find them with the program, which I always give him. Some evenings, I find flowers in the box, a rose that must have dropped from his lady's bodice ... for he brings a lady with him sometimes; one day, they left a fan behind them.\"\n\n\"Oh, the ghost left a fan, did he? And what did you do with it?\"\n\n\"Well, I brought it back to the box next night.\"\n\nHere the inspector's voice was raised.\n\n\"You've broken the rules; I shall have to fine you, Mme. Giry.\"\n\n\"Hold your tongue, you fool!\" muttered M. Firmin Richard.\n\n\"You brought back the fan. And then?\"\n\n\"Well, then, they took it away with them, sir; it was not there at the end of the performance; and in its place they left me a box of English sweets, which I'm very fond of. That's one of the ghost's pretty thoughts.\"\n\n\"That will do, Mme. Giry. You can go.\"\n\nWhen Mme. Giry had bowed herself out, with the dignity that never deserted her, the manager told the inspector that they had decided to dispense with that old madwoman's services; and, when he had gone in his turn, they instructed the acting-manager to make up the inspector's accounts. Left alone, the managers told each other of the idea which they both had in mind, which was that they should look into that little matter of Box Five themselves.\n\n\n\n\nChapter V The Enchanted Violin\n\nChristine Daae, owing to intrigues to which I will return later, did not immediately continue her triumph at the Opera. After the famous gala night, she sang once at the Duchess de Zurich's; but this was the last occasion on which she was heard in private. She refused, without plausible excuse, to appear at a charity concert to which she had promised her assistance. She acted throughout as though she were no longer the mistress of her own destiny and as though she feared a fresh triumph.\n\nShe knew that the Comte de Chagny, to please his brother, had done his best on her behalf with M. Richard; and she wrote to thank him and also to ask him to cease speaking in her favor. Her reason for this curious attitude was never known. Some pretended that it was due to overweening pride; others spoke of her heavenly modesty. But people on the stage are not so modest as all that; and I think that I shall not be far from the truth if I ascribe her action simply to fear. Yes, I believe that Christine Daae was frightened by what had happened to her. I have a letter of Christine's (it forms part of the Persian's collection), relating to this period, which suggests a feeling of absolute dismay:\n\n\"I don't know myself when I sing,\" writes the poor child.\n\nShe showed herself nowhere; and the Vicomte de Chagny tried in vain to meet her. He wrote to her, asking to call upon her, but despaired of receiving a reply when, one morning, she sent him the following note:\n\nMONSIEUR:\n\nI have not forgotten the little boy who went into the sea to rescue my scarf. I feel that I must write to you to-day, when I am going to Perros, in fulfilment of a sacred duty. To-morrow is the anniversary of the death of my poor father, whom you knew and who was very fond of you. He is buried there, with his violin, in the graveyard of the little church, at the bottom of the slope where we used to play as children, beside the road where, when we were a little bigger, we said good-by for the last time.\n\nThe Vicomte de Chagny hurriedly consulted a railway guide, dressed as quickly as he could, wrote a few lines for his valet to take to his brother and jumped into a cab which brought him to the Gare Montparnasse just in time to miss the morning train. He spent a dismal day in town and did not recover his spirits until the evening, when he was seated in his compartment in the Brittany express. He read Christine's note over and over again, smelling its perfume, recalling the sweet pictures of his childhood, and spent the rest of that tedious night journey in feverish dreams that began and ended with Christine Daae. Day was breaking when he alighted at Lannion. He hurried to the diligence for Perros-Guirec. He was the only passenger. He questioned the driver and learned that, on the evening of the previous day, a young lady who looked like a Parisian had gone to Perros and put up at the inn known as the Setting Sun.\n\nThe nearer he drew to her, the more fondly he remembered the story of the little Swedish singer. Most of the details are still unknown to the public.\n\nThere was once, in a little market-town not far from Upsala, a peasant who lived there with his family, digging the earth during the week and singing in the choir on Sundays. This peasant had a little daughter to whom he taught the musical alphabet before she knew how to read. Daae's father was a great musician, perhaps without knowing it. Not a fiddler throughout the length and breadth of Scandinavia played as he did. His reputation was widespread and he was always invited to set the couples dancing at weddings and other festivals. His wife died when Christine was entering upon her sixth year. Then the father, who cared only for his daughter and his music, sold his patch of ground and went to Upsala in search of fame and fortune. He found nothing but poverty.\n\nHe returned to the country, wandering from fair to fair, strumming his Scandinavian melodies, while his child, who never left his side, listened to him in ecstasy or sang to his playing. One day, at Ljimby Fair, Professor Valerius heard them and took them to Gothenburg. He maintained that the father was the first violinist in the world and that the daughter had the making of a great artist. Her education and instruction were provided for. She made rapid progress and charmed everybody with her prettiness, her grace of manner and her genuine eagerness to please.\n\nWhen Valerius and his wife went to settle in France, they took Daae and Christine with them. \"Mamma\" Valerius treated Christine as her daughter. As for Daae, he began to pine away with homesickness. He never went out of doors in Paris, but lived in a sort of dream which he kept up with his violin. For hours at a time, he remained locked up in his bedroom with his daughter, fiddling and singing, very, very softly. Sometimes Mamma Valerius would come and listen behind the door, wipe away a tear and go down-stairs again on tiptoe, sighing for her Scandinavian skies.\n\nDaae seemed not to recover his strength until the summer, when the whole family went to stay at Perros-Guirec, in a far-away corner of Brittany, where the sea was of the same color as in his own country. Often he would play his saddest tunes on the beach and pretend that the sea stopped its roaring to listen to them. And then he induced Mamma Valerius to indulge a queer whim of his. At the time of the \"pardons,\" or Breton pilgrimages, the village festival and dances, he went off with his fiddle, as in the old days, and was allowed to take his daughter with him for a week. They gave the smallest hamlets music to last them for a year and slept at night in a barn, refusing a bed at the inn, lying close together on the straw, as when they were so poor in Sweden. At the same time, they were very neatly dressed, made no collection, refused the halfpence offered them; and the people around could not understand the conduct of this rustic fiddler, who tramped the roads with that pretty child who sang like an angel from Heaven. They followed them from village to village.\n\nOne day, a little boy, who was out with his governess, made her take a longer walk than he intended, for he could not tear himself from the little girl whose pure, sweet voice seemed to bind him to her. They came to the shore of an inlet which is still called Trestraou, but which now, I believe, harbors a casino or something of the sort. At that time, there was nothing but sky and sea and a stretch of golden beach. Only, there was also a high wind, which blew Christine's scarf out to sea. Christine gave a cry and put out her arms, but the scarf was already far on the waves. Then she heard a voice say:\n\n\"It's all right, I'll go and fetch your scarf out of the sea.\"\n\nAnd she saw a little boy running fast, in spite of the outcries and the indignant protests of a worthy lady in black. The little boy ran into the sea, dressed as he was, and brought her back her scarf. Boy and scarf were both soaked through. The lady in black made a great fuss, but Christine laughed merrily and kissed the little boy, who was none other than the Vicomte Raoul de Chagny, staying at Lannion with his aunt.\n\nDuring the season, they saw each other and played together almost every day. At the aunt's request, seconded by Professor Valerius, Daae consented to give the young viscount some violin lessons. In this way, Raoul learned to love the same airs that had charmed Christine's childhood. They also both had the same calm and dreamy little cast of mind. They delighted in stories, in old Breton legends; and their favorite sport was to go and ask for them at the cottage-doors, like beggars:\n\n\"Ma'am ...\" or, \"Kind gentleman ... have you a little story to tell us, please?\"\n\nAnd it seldom happened that they did not have one \"given\" them; for nearly every old Breton grandame has, at least once in her life, seen the \"korrigans\" dance by moonlight on the heather.\n\nBut their great treat was, in the twilight, in the great silence of the evening, after the sun had set in the sea, when Daae came and sat down by them on the roadside and, in a low voice, as though fearing lest he should frighten the ghosts whom he evoked, told them the legends of the land of the North. And, the moment he stopped, the children would ask for more.\n\nThere was one story that began:\n\n\"A king sat in a little boat on one of those deep, still lakes that open like a bright eye in the midst of the Norwegian mountains ...\"\n\nAnd another:\n\n\"Little Lotte thought of everything and nothing. Her hair was golden as the sun's rays and her soul as clear and blue as her eyes. She wheedled her mother, was kind to her doll, took great care of her frock and her little red shoes and her fiddle, but most of all loved, when she went to sleep, to hear the Angel of Music.\"\n\nWhile the old man told this story, Raoul looked at Christine's blue eyes and golden hair; and Christine thought that Lotte was very lucky to hear the Angel of Music when she went to sleep. The Angel of Music played a part in all Daddy Daae's tales; and he maintained that every great musician, every great artist received a visit from the Angel at least once in his life. Sometimes the Angel leans over their cradle, as happened to Lotte, and that is how there are little prodigies who play the fiddle at six better than men at fifty, which, you must admit, is very wonderful. Sometimes, the Angel comes much later, because the children are naughty and won't learn their lessons or practise their scales. And, sometimes, he does not come at all, because the children have a bad heart or a bad conscience.\n\nNo one ever sees the Angel; but he is heard by those who are meant to hear him. He often comes when they least expect him, when they are sad and disheartened. Then their ears suddenly perceive celestial harmonies, a divine voice, which they remember all their lives. Persons who are visited by the Angel quiver with a thrill unknown to the rest of mankind. And they can not touch an instrument, or open their mouths to sing, without producing sounds that put all other human sounds to shame. Then people who do not know that the Angel has visited those persons say that they have genius.\n\nLittle Christine asked her father if he had heard the Angel of Music. But Daddy Daae shook his head sadly; and then his eyes lit up, as he said:\n\n\"You will hear him one day, my child! When I am in Heaven, I will send him to you!\"\n\nDaddy was beginning to cough at that time.\n\nThree years later, Raoul and Christine met again at Perros. Professor Valerius was dead, but his widow remained in France with Daddy Daae and his daughter, who continued to play the violin and sing, wrapping in their dream of harmony their kind patroness, who seemed henceforth to live on music alone. The young man, as he now was, had come to Perros on the chance of finding them and went straight to the house in which they used to stay. He first saw the old man; and then Christine entered, carrying the tea-tray. She flushed at the sight of Raoul, who went up to her and kissed her. She asked him a few questions, performed her duties as hostess prettily, took up the tray again and left the room. Then she ran into the garden and took refuge on a bench, a prey to feelings that stirred her young heart for the first time. Raoul followed her and they talked till the evening, very shyly. They were quite changed, cautious as two diplomatists, and told each other things that had nothing to do with their budding sentiments. When they took leave of each other by the roadside, Raoul, pressing a kiss on Christine's trembling hand, said:\n\n\"Mademoiselle, I shall never forget you!\"\n\nAnd he went away regretting his words, for he knew that Christine could not be the wife of the Vicomte de Chagny.\n\nAs for Christine, she tried not to think of him and devoted herself wholly to her art. She made wonderful progress and those who heard her prophesied that she would be the greatest singer in the world. Meanwhile, the father died; and, suddenly, she seemed to have lost, with him, her voice, her soul and her genius. She retained just, but only just, enough of this to enter the CONSERVATOIRE, where she did not distinguish herself at all, attending the classes without enthusiasm and taking a prize only to please old Mamma Valerius, with whom she continued to live.\n\nThe first time that Raoul saw Christine at the Opera, he was charmed by the girl's beauty and by the sweet images of the past which it evoked, but was rather surprised at the negative side of her art. He returned to listen to her. He followed her in the wings. He waited for her behind a Jacob's ladder. He tried to attract her attention. More than once, he walked after her to the door of her box, but she did not see him. She seemed, for that matter, to see nobody. She was all indifference. Raoul suffered, for she was very beautiful and he was shy and dared not confess his love, even to himself. And then came the lightning-flash of the gala performance: the heavens torn asunder and an angel's voice heard upon earth for the delight of mankind and the utter capture of his heart.\n\nAnd then ... and then there was that man's voice behind the door—\"You must love me!\"—and no one in the room...\n\nWhy did she laugh when he reminded her of the incident of the scarf? Why did she not recognize him? And why had she written to him? ...\n\nPerros was reached at last. Raoul walked into the smoky sitting-room of the Setting Sun and at once saw Christine standing before him, smiling and showing no astonishment.\n\n\"So you have come,\" she said. \"I felt that I should find you here, when I came back from mass. Some one told me so, at the church.\"\n\n\"Who?\" asked Raoul, taking her little hand in his.\n\n\"Why, my poor father, who is dead.\"\n\nThere was a silence; and then Raoul asked:\n\n\"Did your father tell you that I love you, Christine, and that I can not live without you?\"\n\nChristine blushed to the eyes and turned away her head. In a trembling voice, she said:\n\n\"Me? You are dreaming, my friend!\"\n\nAnd she burst out laughing, to put herself in countenance.\n\n\"Don't laugh, Christine; I am quite serious,\" Raoul answered.\n\nAnd she replied gravely: \"I did not make you come to tell me such things as that.\"\n\n\"You 'made me come,' Christine; you knew that your letter would not leave me indignant and that I should hasten to Perros. How can you have thought that, if you did not think I loved you?\"\n\n\"I thought you would remember our games here, as children, in which my father so often joined. I really don't know what I thought... Perhaps I was wrong to write to you ... This anniversary and your sudden appearance in my room at the Opera, the other evening, reminded me of the time long past and made me write to you as the little girl that I then was...\"\n\nThere was something in Christine's attitude that seemed to Raoul not natural. He did not feel any hostility in her; far from it: the distressed affection shining in her eyes told him that. But why was this affection distressed? That was what he wished to know and what was irritating him.\n\n\"When you saw me in your dressing-room, was that the first time you noticed me, Christine?\"\n\nShe was incapable of lying.\n\n\"No,\" she said, \"I had seen you several times in your brother's box. And also on the stage.\"\n\n\"I thought so!\" said Raoul, compressing his lips. \"But then why, when you saw me in your room, at your feet, reminding you that I had rescued your scarf from the sea, why did you answer as though you did not know me and also why did you laugh?\"\n\nThe tone of these questions was so rough that Christine stared at Raoul without replying. The young man himself was aghast at the sudden quarrel which he had dared to raise at the very moment when he had resolved to speak words of gentleness, love and submission to Christine. A husband, a lover with all rights, would talk no differently to a wife, a mistress who had offended him. But he had gone too far and saw no other way out of the ridiculous position than to behave odiously.\n\n\"You don't answer!\" he said angrily and unhappily. \"Well, I will answer for you. It was because there was some one in the room who was in your way, Christine, some one that you did not wish to know that you could be interested in any one else!\"\n\n\"If any one was in my way, my friend,\" Christine broke in coldly, \"if any one was in my way, that evening, it was yourself, since I told you to leave the room!\"\n\n\"Yes, so that you might remain with the other!\"\n\n\"What are you saying, monsieur?\" asked the girl excitedly. \"And to what other do you refer?\"\n\n\"To the man to whom you said, 'I sing only for you! ... to-night I gave you my soul and I am dead!'\"\n\nChristine seized Raoul's arm and clutched it with a strength which no one would have suspected in so frail a creature.\n\n\"Then you were listening behind the door?\"\n\n\"Yes, because I love you everything ... And I heard everything ...\"\n\n\"You heard what?\"\n\nAnd the young girl, becoming strangely calm, released Raoul's arm.\n\n\"He said to you, 'Christine, you must love me!'\"\n\nAt these words, a deathly pallor spread over Christine's face, dark rings formed round her eyes, she staggered and seemed on the point of swooning. Raoul darted forward, with arms outstretched, but Christine had overcome her passing faintness and said, in a low voice:\n\n\"Go on! Go on! Tell me all you heard!\"\n\nAt an utter loss to understand, Raoul answered: \"I heard him reply, when you said you had given him your soul, 'Your soul is a beautiful thing, child, and I thank you. No emperor ever received so fair a gift. The angels wept tonight.'\"\n\nChristine carried her hand to her heart, a prey to indescribable emotion. Her eyes stared before her like a madwoman's. Raoul was terror-stricken. But suddenly Christine's eyes moistened and two great tears trickled, like two pearls, down her ivory cheeks.\n\n\"Christine!\"\n\n\"Raoul!\"\n\nThe young man tried to take her in his arms, but she escaped and fled in great disorder.\n\nWhile Christine remained locked in her room, Raoul was at his wit's end what to do. He refused to breakfast. He was terribly concerned and bitterly grieved to see the hours, which he had hoped to find so sweet, slip past without the presence of the young Swedish girl. Why did she not come to roam with him through the country where they had so many memories in common? He heard that she had had a mass said, that morning, for the repose of her father's soul and spent a long time praying in the little church and on the fiddler's tomb. Then, as she seemed to have nothing more to do at Perros and, in fact, was doing nothing there, why did she not go back to Paris at once?\n\nRaoul walked away, dejectedly, to the graveyard in which the church stood and was indeed alone among the tombs, reading the inscriptions; but, when he turned behind the apse, he was suddenly struck by the dazzling note of the flowers that straggled over the white ground. They were marvelous red roses that had blossomed in the morning, in the snow, giving a glimpse of life among the dead, for death was all around him. It also, like the flowers, issued from the ground, which had flung back a number of its corpses. Skeletons and skulls by the hundred were heaped against the wall of the church, held in position by a wire that left the whole gruesome stack visible. Dead men's bones, arranged in rows, like bricks, to form the first course upon which the walls of the sacristy had been built. The door of the sacristy opened in the middle of that bony structure, as is often seen in old Breton churches.\n\nRaoul said a prayer for Daae and then, painfully impressed by all those eternal smiles on the mouths of skulls, he climbed the slope and sat down on the edge of the heath overlooking the sea. The wind fell with the evening. Raoul was surrounded by icy darkness, but he did not feel the cold. It was here, he remembered, that he used to come with little Christine to see the Korrigans dance at the rising of the moon. He had never seen any, though his eyes were good, whereas Christine, who was a little shortsighted, pretended that she had seen many. He smiled at the thought and then suddenly gave a start. A voice behind him said:\n\n\"Do you think the Korrigans will come this evening?\"\n\nIt was Christine. He tried to speak. She put her gloved hand on his mouth.\n\n\"Listen, Raoul. I have decided to tell you something serious, very serious ... Do you remember the legend of the Angel of Music?\"\n\n\"I do indeed,\" he said. \"I believe it was here that your father first told it to us.\"\n\n\"And it was here that he said, 'When I am in Heaven, my child, I will send him to you.' Well, Raoul, my father is in Heaven, and I have been visited by the Angel of Music.\"\n\n\"I have no doubt of it,\" replied the young man gravely, for it seemed to him that his friend, in obedience to a pious thought, was connecting the memory of her father with the brilliancy of her last triumph.\n\nChristine appeared astonished at the Vicomte de Chagny's coolness:\n\n\"How do you understand it?\" she asked, bringing her pale face so close to his that he might have thought that Christine was going to give him a kiss; but she only wanted to read his eyes in spite of the dark.\n\n\"I understand,\" he said, \"that no human being can sing as you sang the other evening without the intervention of some miracle. No professor on earth can teach you such accents as those. You have heard the Angel of Music, Christine.\"\n\n\"Yes,\" she said solemnly, \"IN MY DRESSING-ROOM. That is where he comes to give me my lessons daily.\"\n\n\"In your dressing-room?\" he echoed stupidly.\n\n\"Yes, that is where I have heard him; and I have not been the only one to hear him.\"\n\n\"Who else heard him, Christine?\"\n\n\"You, my friend.\"\n\n\"I? I heard the Angel of Music?\"\n\n\"Yes, the other evening, it was he who was talking when you were listening behind the door. It was he who said, 'You must love me.' But I then thought that I was the only one to hear his voice. Imagine my astonishment when you told me, this morning, that you could hear him too.\"\n\nRaoul burst out laughing. The first rays of the moon came and shrouded the two young people in their light. Christine turned on Raoul with a hostile air. Her eyes, usually so gentle, flashed fire.\n\n\"What are you laughing at? YOU think you heard a man's voice, I suppose?\"\n\n\"Well! ...\" replied the young man, whose ideas began to grow confused in the face of Christine's determined attitude.\n\n\"It's you, Raoul, who say that? You, an old playfellow of my own! A friend of my father's! But you have changed since those days. What are you thinking of? I am an honest girl, M. le Vicomte de Chagny, and I don't lock myself up in my dressing-room with men's voices. If you had opened the door, you would have seen that there was nobody in the room!\"\n\n\"That's true! I did open the door, when you were gone, and I found no one in the room.\"\n\n\"So you see! ... Well?\"\n\nThe viscount summoned up all his courage.\n\n\"Well, Christine, I think that somebody is making game of you.\"\n\nShe gave a cry and ran away. He ran after her, but, in a tone of fierce anger, she called out: \"Leave me! Leave me!\" And she disappeared.\n\nRaoul returned to the inn feeling very weary, very low-spirited and very sad. He was told that Christine had gone to her bedroom saying that she would not be down to dinner. Raoul dined alone, in a very gloomy mood. Then he went to his room and tried to read, went to bed and tried to sleep. There was no sound in the next room.\n\nThe hours passed slowly. It was about half-past eleven when he distinctly heard some one moving, with a light, stealthy step, in the room next to his. Then Christine had not gone to bed! Without troubling for a reason, Raoul dressed, taking care not to make a sound, and waited. Waited for what? How could he tell? But his heart thumped in his chest when he heard Christine's door turn slowly on its hinges. Where could she be going, at this hour, when every one was fast asleep at Perros? Softly opening the door, he saw Christine's white form, in the moonlight, slipping along the passage. She went down the stairs and he leaned over the baluster above her. Suddenly he heard two voices in rapid conversation. He caught one sentence: \"Don't lose the key.\"\n\nIt was the landlady's voice. The door facing the sea was opened and locked again. Then all was still.\n\nRaoul ran back to his room and threw back the window. Christine's white form stood on the deserted quay.\n\nThe first floor of the Setting Sun was at no great height and a tree growing against the wall held out its branches to Raoul's impatient arms and enabled him to climb down unknown to the landlady. Her amazement, therefore, was all the greater when, the next morning, the young man was brought back to her half frozen, more dead than alive, and when she learned that he had been found stretched at full length on the steps of the high altar of the little church. She ran at once to tell Christine, who hurried down and, with the help of the landlady, did her best to revive him. He soon opened his eyes and was not long in recovering when he saw his friend's charming face leaning over him.\n\nA few weeks later, when the tragedy at the Opera compelled the intervention of the public prosecutor, M. Mifroid, the commissary of police, examined the Vicomte de Chagny touching the events of the night at Perros. I quote the questions and answers as given in the official report pp. 150 et seq.:\n\nQ. \"Did Mlle. Daae not see you come down from your room by the curious road which you selected?\"\n\nR. \"No, monsieur, no, although, when walking behind her, I took no pains to deaden the sound of my footsteps. In fact, I was anxious that she should turn round and see me. I realized that I had no excuse for following her and that this way of spying on her was unworthy of me. But she seemed not to hear me and acted exactly as though I were not there. She quietly left the quay and then suddenly walked quickly up the road. The church-clock had struck a quarter to twelve and I thought that this must have made her hurry, for she began almost to run and continued hastening until she came to the church.\"\n\nQ. \"Was the gate open?\"\n\nR. \"Yes, monsieur, and this surprised me, but did not seem to surprise Mlle. Daae.\"\n\nQ. \"Was there no one in the churchyard?\"\n\nR. \"I did not see any one; and, if there had been, I must have seen him. The moon was shining on the snow and made the night quite light.\"\n\nQ. \"Was it possible for any one to hide behind the tombstones?\"\n\nR. \"No, monsieur. They were quite small, poor tombstones, partly hidden under the snow, with their crosses just above the level of the ground. The only shadows were those of the crosses and ourselves. The church stood out quite brightly. I never saw so clear a night. It was very fine and very cold and one could see everything.\"\n\nQ. \"Are you at all superstitious?\"\n\nR. \"No, monsieur, I am a practising Catholic,\"\n\nQ. \"In what condition of mind were you?\"\n\nR. \"Very healthy and peaceful, I assure you. Mlle. Daae's curious action in going out at that hour had worried me at first; but, as soon as I saw her go to the churchyard, I thought that she meant to fulfil some pious duty on her father's grave and I considered this so natural that I recovered all my calmness. I was only surprised that she had not heard me walking behind her, for my footsteps were quite audible on the hard snow. But she must have been taken up with her intentions and I resolved not to disturb her. She knelt down by her father's grave, made the sign of the cross and began to pray. At that moment, it struck midnight. At the last stroke, I saw Mlle. Daae life{sic} her eyes to the sky and stretch out her arms as though in ecstasy. I was wondering what the reason could be, when I myself raised my head and everything within me seemed drawn toward the invisible, WHICH WAS PLAYING THE MOST PERFECT MUSIC! Christine and I knew that music; we had heard it as children. But it had never been executed with such divine art, even by M. Daae. I remembered all that Christine had told me of the Angel of Music. The air was The Resurrection of Lazarus, which old M. Daae used to play to us in his hours of melancholy and of faith. If Christine's Angel had existed, he could not have played better, that night, on the late musician's violin. When the music stopped, I seemed to hear a noise from the skulls in the heap of bones; it was as though they were chuckling and I could not help shuddering.\"\n\nQ. \"Did it not occur to you that the musician might be hiding behind that very heap of bones?\"\n\nR. \"It was the one thought that did occur to me, monsieur, so much so that I omitted to follow Mlle. Daae, when she stood up and walked slowly to the gate. She was so much absorbed just then that I am not surprised that she did not see me.\"\n\nQ. \"Then what happened that you were found in the morning lying half-dead on the steps of the high altar?\"\n\nR. \"First a skull rolled to my feet ... then another ... then another ... It was as if I were the mark of that ghastly game of bowls. And I had an idea that false step must have destroyed the balance of the structure behind which our musician was concealed. This surmise seemed to be confirmed when I saw a shadow suddenly glide along the sacristy wall. I ran up. The shadow had already pushed open the door and entered the church. But I was quicker than the shadow and caught hold of a corner of its cloak. At that moment, we were just in front of the high altar; and the moonbeams fell straight upon us through the stained-glass windows of the apse. As I did not let go of the cloak, the shadow turned round; and I saw a terrible death's head, which darted a look at me from a pair of scorching eyes. I felt as if I were face to face with Satan; and, in the presence of this unearthly apparition, my heart gave way, my courage failed me ... and I remember nothing more until I recovered consciousness at the Setting Sun.\"\n\n\n\n\nChapter VI A Visit to Box Five\n\nWe left M. Firmin Richard and M. Armand Moncharmin at the moment when they were deciding \"to look into that little matter of Box Five.\"\n\nLeaving behind them the broad staircase which leads from the lobby outside the managers' offices to the stage and its dependencies, they crossed the stage, went out by the subscribers' door and entered the house through the first little passage on the left. Then they made their way through the front rows of stalls and looked at Box Five on the grand tier, They could not see it well, because it was half in darkness and because great covers were flung over the red velvet of the ledges of all the boxes.\n\nThey were almost alone in the huge, gloomy house; and a great silence surrounded them. It was the time when most of the stage-hands go out for a drink. The staff had left the boards for the moment, leaving a scene half set. A few rays of light, a wan, sinister light, that seemed to have been stolen from an expiring luminary, fell through some opening or other upon an old tower that raised its pasteboard battlements on the stage; everything, in this deceptive light, adopted a fantastic shape. In the orchestra stalls, the drugget covering them looked like an angry sea, whose glaucous waves had been suddenly rendered stationary by a secret order from the storm phantom, who, as everybody knows, is called Adamastor. MM. Moncharmin and Richard were the shipwrecked mariners amid this motionless turmoil of a calico sea. They made for the left boxes, plowing their way like sailors who leave their ship and try to struggle to the shore. The eight great polished columns stood up in the dusk like so many huge piles supporting the threatening, crumbling, big-bellied cliffs whose layers were represented by the circular, parallel, waving lines of the balconies of the grand, first and second tiers of boxes. At the top, right on top of the cliff, lost in M. Lenepveu's copper ceiling, figures grinned and grimaced, laughed and jeered at MM. Richard and Moncharmin's distress. And yet these figures were usually very serious. Their names were Isis, Amphitrite, Hebe, Pandora, Psyche, Thetis, Pomona, Daphne, Clytie, Galatea and Arethusa. Yes, Arethusa herself and Pandora, whom we all know by her box, looked down upon the two new managers of the Opera, who ended by clutching at some piece of wreckage and from there stared silently at Box Five on the grand tier.\n\nI have said that they were distressed. At least, I presume so. M. Moncharmin, in any case, admits that he was impressed. To quote his own words, in his Memoirs:\n\n\"This moonshine about the Opera ghost in which, since we first took over the duties of MM. Poligny and Debienne, we had been so nicely steeped\"—Moncharmin's style is not always irreproachable—\"had no doubt ended by blinding my imaginative and also my visual faculties. It may be that the exceptional surroundings in which we found ourselves, in the midst of an incredible silence, impressed us to an unusual extent. It may be that we were the sport of a kind of hallucination brought about by the semi-darkness of the theater and the partial gloom that filled Box Five. At any rate, I saw and Richard also saw a shape in the box. Richard said nothing, nor I either. But we spontaneously seized each other's hand. We stood like that for some minutes, without moving, with our eyes fixed on the same point; but the figure had disappeared. Then we went out and, in the lobby, communicated our impressions to each other and talked about 'the shape.' The misfortune was that my shape was not in the least like Richard's. I had seen a thing like a death's head resting on the ledge of the box, whereas Richard saw the shape of an old woman who looked like Mme. Giry. We soon discovered that we had really been the victims of an illusion, whereupon, without further delay and laughing like madmen, we ran to Box Five on the grand tier, went inside and found no shape of any kind.\"\n\nBox Five is just like all the other grand tier boxes. There is nothing to distinguish it from any of the others. M. Moncharmin and M. Richard, ostensibly highly amused and laughing at each other, moved the furniture of the box, lifted the cloths and the chairs and particularly examined the arm-chair in which \"the man's voice\" used to sit. But they saw that it was a respectable arm-chair, with no magic about it. Altogether, the box was the most ordinary box in the world, with its red hangings, its chairs, its carpet and its ledge covered in red velvet. After, feeling the carpet in the most serious manner possible, and discovering nothing more here or anywhere else, they went down to the corresponding box on the pit tier below. In Box Five on the pit tier, which is just inside the first exit from the stalls on the left, they found nothing worth mentioning either.\n\n\"Those people are all making fools of us!\" Firmin Richard ended by exclaiming. \"It will be FAUST on Saturday: let us both see the performance from Box Five on the grand tier!\"\n\n\n\n\nChapter VII Faust and What Followed\n\nOn the Saturday morning, on reaching their office, the joint managers found a letter from O. G. worded in these terms:\n\nMY DEAR MANAGERS:\n\nSo it is to be war between us?\n\nIf you still care for peace, here is my ultimatum. It consists of the four following conditions:\n\n1. You must give me back my private box; and I wish it to be at my free disposal from henceforward.\n\n2. The part of Margarita shall be sung this evening by Christine Daae. Never mind about Carlotta; she will be ill.\n\n3. I absolutely insist upon the good and loyal services of Mme. Giry, my box-keeper, whom you will reinstate in her functions forthwith.\n\n4. Let me know by a letter handed to Mme. Giry, who will see that it reaches me, that you accept, as your predecessors did, the conditions in my memorandum-book relating to my monthly allowance. I will inform you later how you are to pay it to me.\n\nIf you refuse, you will give FAUST to-night in a house with a curse upon it.\n\nTake my advice and be warned in time. O. G.\n\n\"Look here, I'm getting sick of him, sick of him!\" shouted Richard, bringing his fists down on his office-table.\n\nJust then, Mercier, the acting-manager, entered.\n\n\"Lachenel would like to see one of you gentlemen,\" he said. \"He says that his business is urgent and he seems quite upset.\"\n\n\"Who's Lachenel?\" asked Richard.\n\n\"He's your stud-groom.\"\n\n\"What do you mean? My stud-groom?\"\n\n\"Yes, sir,\" explained Mercier, \"there are several grooms at the Opera and M. Lachenel is at the head of them.\"\n\n\"And what does this groom do?\"\n\n\"He has the chief management of the stable.\"\n\n\"What stable?\"\n\n\"Why, yours, sir, the stable of the Opera.\"\n\n\"Is there a stable at the Opera? Upon my word, I didn't know. Where is it?\"\n\n\"In the cellars, on the Rotunda side. It's a very important department; we have twelve horses.\"\n\n\"Twelve horses! And what for, in Heaven's name?\"\n\n\"Why, we want trained horses for the processions in the Juive, The Profeta and so on; horses 'used to the boards.' It is the grooms' business to teach them. M. Lachenel is very clever at it. He used to manage Franconi's stables.\"\n\n\"Very well ... but what does he want?\"\n\n\"I don't know; I never saw him in such a state.\"\n\n\"He can come in.\"\n\nM. Lachenel came in, carrying a riding-whip, with which he struck his right boot in an irritable manner.\n\n\"Good morning, M. Lachenel,\" said Richard, somewhat impressed. \"To what do we owe the honor of your visit?\"\n\n\"Mr. Manager, I have come to ask you to get rid of the whole stable.\"\n\n\"What, you want to get rid of our horses?\"\n\n\"I'm not talking of the horses, but of the stablemen.\"\n\n\"How many stablemen have you, M. Lachenel?\"\n\n\"Six stablemen! That's at least two too many.\"\n\n\"These are 'places,'\" Mercier interposed, \"created and forced upon us by the under-secretary for fine arts. They are filled by protegees of the government and, if I may venture to ...\"\n\n\"I don't care a hang for the government!\" roared Richard. \"We don't need more than four stablemen for twelve horses.\"\n\n\"Eleven,\" said the head riding-master, correcting him.\n\n\"Twelve,\" repeated Richard.\n\n\"Eleven,\" repeated Lachenel.\n\n\"Oh, the acting-manager told me that you had twelve horses!\"\n\n\"I did have twelve, but I have only eleven since Cesar was stolen.\"\n\nAnd M. Lachenel gave himself a great smack on the boot with his whip.\n\n\"Has Cesar been stolen?\" cried the acting-manager. \"Cesar, the white horse in the Profeta?\"\n\n\"There are not two Cesars,\" said the stud-groom dryly. \"I was ten years at Franconi's and I have seen plenty of horses in my time. Well, there are not two Cesars. And he's been stolen.\"\n\n\"How?\"\n\n\"I don't know. Nobody knows. That's why I have come to ask you to sack the whole stable.\"\n\n\"What do your stablemen say?\"\n\n\"All sorts of nonsense. Some of them accuse the supers. Others pretend that it's the acting-manager's doorkeeper ...\"\n\n\"My doorkeeper? I'll answer for him as I would for myself!\" protested Mercier.\n\n\"But, after all, M. Lachenel,\" cried Richard, \"you must have some idea.\"\n\n\"Yes, I have,\" M. Lachenel declared. \"I have an idea and I'll tell you what it is. There's no doubt about it in my mind.\" He walked up to the two managers and whispered. \"It's the ghost who did the trick!\"\n\nRichard gave a jump.\n\n\"What, you too! You too!\"\n\n\"How do you mean, I too? Isn't it natural, after what I saw?\"\n\n\"What did you see?\"\n\n\"I saw, as clearly as I now see you, a black shadow riding a white horse that was as like Cesar as two peas!\"\n\n\"And did you run after them?\"\n\n\"I did and I shouted, but they were too fast for me and disappeared in the darkness of the underground gallery.\"\n\nM. Richard rose. \"That will do, M. Lachenel. You can go ... We will lodge a complaint against THE GHOST.\"\n\n\"And sack my stable?\"\n\n\"Oh, of course! Good morning.\"\n\nM. Lachenel bowed and withdrew. Richard foamed at the mouth.\n\n\"Settle that idiot's account at once, please.\"\n\n\"He is a friend of the government representative's!\" Mercier ventured to say.\n\n\"And he takes his vermouth at Tortoni's with Lagrene, Scholl and Pertuiset, the lion-hunter,\" added Moncharmin. \"We shall have the whole press against us! He'll tell the story of the ghost; and everybody will be laughing at our expense! We may as well be dead as ridiculous!\"\n\n\"All right, say no more about it.\"\n\nAt that moment the door opened. It must have been deserted by its usual Cerberus, for Mme. Giry entered without ceremony, holding a letter in her hand, and said hurriedly:\n\n\"I beg your pardon, excuse me, gentlemen, but I had a letter this morning from the Opera ghost. He told me to come to you, that you had something to ...\"\n\nShe did not complete the sentence. She saw Firmin Richard's face; and it was a terrible sight. He seemed ready to burst. He said nothing, he could not speak. But suddenly he acted. First, his left arm seized upon the quaint person of Mme. Giry and made her describe so unexpected a semicircle that she uttered a despairing cry. Next, his right foot imprinted its sole on the black taffeta of a skirt which certainly had never before undergone a similar outrage in a similar place. The thing happened so quickly that Mme. Giry, when in the passage, was still quite bewildered and seemed not to understand. But, suddenly, she understood; and the Opera rang with her indignant yells, her violent protests and threats.\n\nAbout the same time, Carlotta, who had a small house of her own in the Rue du Faubourg St. Honore, rang for her maid, who brought her letters to her bed. Among them was an anonymous missive, written in red ink, in a hesitating, clumsy hand, which ran:\n\nIf you appear to-night, you must be prepared for a great misfortune at the moment when you open your mouth to sing ... a misfortune worse than death.\n\nThe letter took away Carlotta's appetite for breakfast. She pushed back her chocolate, sat up in bed and thought hard. It was not the first letter of the kind which she had received, but she never had one couched in such threatening terms.\n\nShe thought herself, at that time, the victim of a thousand jealous attempts and went about saying that she had a secret enemy who had sworn to ruin her. She pretended that a wicked plot was being hatched against her, a cabal which would come to a head one of those days; but she added that she was not the woman to be intimidated.\n\nThe truth is that, if there was a cabal, it was led by Carlotta herself against poor Christine, who had no suspicion of it. Carlotta had never forgiven Christine for the triumph which she had achieved when taking her place at a moment's notice. When Carlotta heard of the astounding reception bestowed upon her understudy, she was at once cured of an incipient attack of bronchitis and a bad fit of sulking against the management and lost the slightest inclination to shirk her duties. From that time, she worked with all her might to \"smother\" her rival, enlisting the services of influential friends to persuade the managers not to give Christine an opportunity for a fresh triumph. Certain newspapers which had begun to extol the talent of Christine now interested themselves only in the fame of Carlotta. Lastly, in the theater itself, the celebrated, but heartless and soulless diva made the most scandalous remarks about Christine and tried to cause her endless minor unpleasantnesses.\n\nWhen Carlotta had finished thinking over the threat contained in the strange letter, she got up.\n\n\"We shall see,\" she said, adding a few oaths in her native Spanish with a very determined air.\n\nThe first thing she saw, when looking out of her window, was a hearse. She was very superstitious; and the hearse and the letter convinced her that she was running the most serious dangers that evening. She collected all her supporters, told them that she was threatened at that evening's performance with a plot organized by Christine Daae and declared that they must play a trick upon that chit by filling the house with her, Carlotta's, admirers. She had no lack of them, had she? She relied upon them to hold themselves prepared for any eventuality and to silence the adversaries, if, as she feared, they created a disturbance.\n\nM. Richard's private secretary called to ask after the diva's health and returned with the assurance that she was perfectly well and that, \"were she dying,\" she would sing the part of Margarita that evening. The secretary urged her, in his chief's name, to commit no imprudence, to stay at home all day and to be careful of drafts; and Carlotta could not help, after he had gone, comparing this unusual and unexpected advice with the threats contained in the letter.\n\nIt was five o'clock when the post brought a second anonymous letter in the same hand as the first. It was short and said simply:\n\nYou have a bad cold. If you are wise, you will see that it is madness to try to sing to-night.\n\nCarlotta sneered, shrugged her handsome shoulders and sang two or three notes to reassure herself.\n\nHer friends were faithful to their promise. They were all at the Opera that night, but looked round in vain for the fierce conspirators whom they were instructed to suppress. The only unusual thing was the presence of M. Richard and M. Moncharmin in Box Five. Carlotta's friends thought that, perhaps, the managers had wind, on their side, of the proposed disturbance and that they had determined to be in the house, so as to stop it then and there; but this was unjustifiable supposition, as the reader knows. M. Richard and M. Moncharmin were thinking of nothing but their ghost.\n\n\"Vain! In vain do I call, through my vigil weary, On creation and its Lord! Never reply will break the silence dreary! No sign! No single word!\"\n\nThe famous baritone, Carolus Fonta, had hardly finished Doctor Faust's first appeal to the powers of darkness, when M. Firmin Richard, who was sitting in the ghost's own chair, the front chair on the right, leaned over to his partner and asked him chaffingly:\n\n\"Well, has the ghost whispered a word in your ear yet?\"\n\n\"Wait, don't be in such a hurry,\" replied M. Armand Moncharmin, in the same gay tone. \"The performance has only begun and you know that the ghost does not usually come until the middle of the first act.\"\n\nThe first act passed without incident, which did not surprise Carlotta's friends, because Margarita does not sing in this act. As for the managers, they looked at each other, when the curtain fell.\n\n\"That's one!\" said Moncharmin.\n\n\"Yes, the ghost is late,\" said Firmin Richard.\n\n\"It's not a bad house,\" said Moncharmin, \"for 'a house with a curse on it.'\"\n\nM. Richard smiled and pointed to a fat, rather vulgar woman, dressed in black, sitting in a stall in the middle of the auditorium with a man in a broadcloth frock-coat on either side of her.\n\n\"Who on earth are 'those?'\" asked Moncharmin.\n\n\"'Those,' my dear fellow, are my concierge, her husband and her brother.\"\n\n\"Did you give them their tickets?\"\n\n\"I did ... My concierge had never been to the Opera—this is, the first time—and, as she is now going to come every night, I wanted her to have a good seat, before spending her time showing other people to theirs.\"\n\nMoncharmin asked what he meant and Richard answered that he had persuaded his concierge, in whom he had the greatest confidence, to come and take Mme. Giry's place. Yes, he would like to see if, with that woman instead of the old lunatic, Box Five would continue to astonish the natives?\n\n\"By the way,\" said Moncharmin, \"you know that Mother Giry is going to lodge a complaint against you.\"\n\n\"With whom? The ghost?\"\n\nThe ghost! Moncharmin had almost forgotten him. However, that mysterious person did nothing to bring himself to the memory of the managers; and they were just saying so to each other for the second time, when the door of the box suddenly opened to admit the startled stage-manager.\n\n\"What's the matter?\" they both asked, amazed at seeing him there at such a time.\n\n\"It seems there's a plot got up by Christine Daae's friends against Carlotta. Carlotta's furious.\"\n\n\"What on earth ... ?\" said Richard, knitting his brows.\n\nBut the curtain rose on the kermess scene and Richard made a sign to the stage-manager to go away. When the two were alone again, Moncharmin leaned over to Richard:\n\n\"Then Daae has friends?\" he asked.\n\n\"Yes, she has.\"\n\n\"Whom?\"\n\nRichard glanced across at a box on the grand tier containing no one but two men.\n\n\"The Comte de Chagny?\"\n\n\"Yes, he spoke to me in her favor with such warmth that, if I had not known him to be Sorelli's friend ...\"\n\n\"Really? Really?\" said Moncharmin. \"And who is that pale young man beside him?\"\n\n\"That's his brother, the viscount.\"\n\n\"He ought to be in his bed. He looks ill.\"\n\nThe stage rang with gay song:\n\n\"Red or white liquor,\nCoarse or fine!\nWhat can it matter,\nSo we have wine?\"\nStudents, citizens, soldiers, girls and matrons whirled light-heartedly before the inn with the figure of Bacchus for a sign. Siebel made her entrance. Christine Daae looked charming in her boy's clothes; and Carlotta's partisans expected to hear her greeted with an ovation which would have enlightened them as to the intentions of her friends. But nothing happened.\n\nOn the other hand, when Margarita crossed the stage and sang the only two lines allotted her in this second act:\n\n\"No, my lord, not a lady am I, nor yet a beauty,\nAnd do not need an arm to help me on my way,\"\nCarlotta was received with enthusiastic applause. It was so unexpected and so uncalled for that those who knew nothing about the rumors looked at one another and asked what was happening. And this act also was finished without incident.\n\nThen everybody said: \"Of course, it will be during the next act.\"\n\nSome, who seemed to be better informed than the rest, declared that the \"row\" would begin with the ballad of the KING OF THULE and rushed to the subscribers' entrance to warn Carlotta. The managers left the box during the entr'acte to find out more about the cabal of which the stage-manager had spoken; but they soon returned to their seats, shrugging their shoulders and treating the whole affair as silly.\n\nThe first thing they saw, on entering the box, was a box of English sweets on the little shelf of the ledge. Who had put it there? They asked the box-keepers, but none of them knew. Then they went back to the shelf and, next to the box of sweets, found an opera glass. They looked at each other. They had no inclination to laugh. All that Mme. Giry had told them returned to their memory ... and then ... and then ... they seemed to feel a curious sort of draft around them ... They sat down in silence.\n\nThe scene represented Margarita's garden:\n\n\"Gentle flow'rs in the dew,\n    Be message from me ...\"\nAs she sang these first two lines, with her bunch of roses and lilacs in her hand, Christine, raising her head, saw the Vicomte de Chagny in his box; and, from that moment, her voice seemed less sure, less crystal-clear than usual. Something seemed to deaden and dull her singing...\n\n\"What a queer girl she is!\" said one of Carlotta's friends in the stalls, almost aloud. \"The other day she was divine; and to-night she's simply bleating. She has no experience, no training.\"\n\n\"Gentle flow'rs, lie ye there\n    And tell her from me ...\"\nThe viscount put his head under his hands and wept. The count, behind him, viciously gnawed his mustache, shrugged his shoulders and frowned. For him, usually so cold and correct, to betray his inner feelings like that, by outward signs, the count must be very angry. He was. He had seen his brother return from a rapid and mysterious journey in an alarming state of health. The explanation that followed was unsatisfactory and the count asked Christine Daae for an appointment. She had the audacity to reply that she could not see either him or his brother...\n\n\"Would she but deign to hear me\nAnd with one smile to cheer me ...\"\n\"The little baggage!\" growled the count.\n\nAnd he wondered what she wanted. What she was hoping for... She was a virtuous girl, she was said to have no friend, no protector of any sort ... That angel from the North must be very artful!\n\nRaoul, behind the curtain of his hands that veiled his boyish tears, thought only of the letter which he received on his return to Paris, where Christine, fleeing from Perros like a thief in the night, had arrived before him:\n\nMY DEAR LITTLE PLAYFELLOW:\n\nYou must have the courage not to see me again, not to speak of me again. If you love me just a little, do this for me, for me who will never forget you, my dear Raoul. My life depends upon it. Your life depends upon it. YOUR LITTLE CHRISTINE.\n\nThunders of applause. Carlotta made her entrance.\n\n\"I wish I could but know who was he\nThat addressed me,\nIf he was noble, or, at least, what his name is ...\"\nWhen Margarita had finished singing the ballad of the KING OF THULE, she was loudly cheered and again when she came to the end of the jewel song:\n\n\"Ah, the joy of past compare\nThese jewels bright to wear! ...\"\nThenceforth, certain of herself, certain of her friends in the house, certain of her voice and her success, fearing nothing, Carlotta flung herself into her part without restraint of modesty ... She was no longer Margarita, she was Carmen. She was applauded all the more; and her debut with Faust seemed about to bring her a new success, when suddenly ... a terrible thing happened.\n\nFaust had knelt on one knee:\n\n\"Let me gaze on the form below me,\n    While from yonder ether blue\nLook how the star of eve, bright and tender,\n        lingers o'er me,\n    To love thy beauty too!\"\nAnd Margarita replied:\n\n\"Oh, how strange!\n      Like a spell does the evening bind me!\nAnd a deep languid charm\nI feel without alarm\n      With its melody enwind me\nAnd all my heart subdue.\"\nAt that moment, at that identical moment, the terrible thing happened... Carlotta croaked like a toad:\n\n\"Co-ack!\"\n\nThere was consternation on Carlotta's face and consternation on the faces of all the audience. The two managers in their box could not suppress an exclamation of horror. Every one felt that the thing was not natural, that there was witchcraft behind it. That toad smelt of brimstone. Poor, wretched, despairing, crushed Carlotta!\n\nThe uproar in the house was indescribable. If the thing had happened to any one but Carlotta, she would have been hooted. But everybody knew how perfect an instrument her voice was; and there was no display of anger, but only of horror and dismay, the sort of dismay which men would have felt if they had witnessed the catastrophe that broke the arms of the Venus de Milo... And even then they would have seen ... and understood ...\n\nBut here that toad was incomprehensible! So much so that, after some seconds spent in asking herself if she had really heard that note, that sound, that infernal noise issue from her throat, she tried to persuade herself that it was not so, that she was the victim of an illusion, an illusion of the ear, and not of an act of treachery on the part of her voice....\n\nMeanwhile, in Box Five, Moncharmin and Richard had turned very pale. This extraordinary and inexplicable incident filled them with a dread which was the more mysterious inasmuch as for some little while, they had fallen within the direct influence of the ghost. They had felt his breath. Moncharmin's hair stood on end. Richard wiped the perspiration from his forehead. Yes, the ghost was there, around them, behind them, beside them; they felt his presence without seeing him, they heard his breath, close, close, close to them! ... They were sure that there were three people in the box ... They trembled ... They thought of running away ... They dared not ... They dared not make a movement or exchange a word that would have told the ghost that they knew that he was there! ... What was going to happen?\n\nThis happened.\n\n\"Co-ack!\" Their joint exclamation of horror was heard all over the house. THEY FELT THAT THEY WERE SMARTING UNDER THE GHOST'S ATTACKS. Leaning over the ledge of their box, they stared at Carlotta as though they did not recognize her. That infernal girl must have given the signal for some catastrophe. Ah, they were waiting for the catastrophe! The ghost had told them it would come! The house had a curse upon it! The two managers gasped and panted under the weight of the catastrophe. Richard's stifled voice was heard calling to Carlotta:\n\n\"Well, go on!\"\n\nNo, Carlotta did not go on ... Bravely, heroically, she started afresh on the fatal line at the end of which the toad had appeared.\n\nAn awful silence succeeded the uproar. Carlotta's voice alone once more filled the resounding house:\n\n\"I feel without alarm ...\"\n\nThe audience also felt, but not without alarm. ..\n\n\"I feel without alarm ...\nI feel without alarm—co-ack!\nWith its melody enwind me—co-ack!\nAnd all my heart sub—co-ack!\"\nThe toad also had started afresh!\n\nThe house broke into a wild tumult. The two managers collapsed in their chairs and dared not even turn round; they had not the strength; the ghost was chuckling behind their backs! And, at last, they distinctly heard his voice in their right ears, the impossible voice, the mouthless voice, saying:\n\n\"SHE IS SINGING TO-NIGHT TO BRING THE CHANDELIER DOWN!\"\n\nWith one accord, they raised their eyes to the ceiling and uttered a terrible cry. The chandelier, the immense mass of the chandelier was slipping down, coming toward them, at the call of that fiendish voice. Released from its hook, it plunged from the ceiling and came smashing into the middle of the stalls, amid a thousand shouts of terror. A wild rush for the doors followed.\n\nThe papers of the day state that there were numbers wounded and one killed. The chandelier had crashed down upon the head of the wretched woman who had come to the Opera for the first time in her life, the one whom M. Richard had appointed to succeed Mme. Giry, the ghost's box-keeper, in her functions! She died on the spot and, the next morning, a newspaper appeared with this heading:\n\nTWO HUNDRED KILOS ON THE HEAD OF A CONCIERGE\n\nThat was her sole epitaph!\n\n\n\n\nChapter VIII The Mysterious Brougham\n\nThat tragic evening was bad for everybody. Carlotta fell ill. As for Christine Daae, she disappeared after the performance. A fortnight elapsed during which she was seen neither at the Opera nor outside.\n\nRaoul, of course, was the first to be astonished at the prima donna's absence. He wrote to her at Mme. Valerius' flat and received no reply. His grief increased and he ended by being seriously alarmed at never seeing her name on the program. FAUST was played without her.\n\nOne afternoon he went to the managers' office to ask the reason of Christine's disappearance. He found them both looking extremely worried. Their own friends did not recognize them: they had lost all their gaiety and spirits. They were seen crossing the stage with hanging heads, care-worn brows, pale cheeks, as though pursued by some abominable thought or a prey to some persistent sport of fate.\n\nThe fall of the chandelier had involved them in no little responsibility; but it was difficult to make them speak about it. The inquest had ended in a verdict of accidental death, caused by the wear and tear of the chains by which the chandelier was hung from the ceiling; but it was the duty of both the old and the new managers to have discovered this wear and tear and to have remedied it in time. And I feel bound to say that MM. Richard and Moncharmin at this time appeared so changed, so absent-minded, so mysterious, so incomprehensible that many of the subscribers thought that some event even more horrible than the fall of the chandelier must have affected their state of mind.\n\nIn their daily intercourse, they showed themselves very impatient, except with Mme. Giry, who had been reinstated in her functions. And their reception of the Vicomte de Chagny, when he came to ask about Christine, was anything but cordial. They merely told him that she was taking a holiday. He asked how long the holiday was for, and they replied curtly that it was for an unlimited period, as Mlle. Daae had requested leave of absence for reasons of health.\n\n\"Then she is ill!\" he cried. \"What is the matter with her?\"\n\n\"We don't know.\"\n\n\"Didn't you send the doctor of the Opera to see her?\"\n\n\"No, she did not ask for him; and, as we trust her, we took her word.\"\n\nRaoul left the building a prey to the gloomiest thoughts. He resolved, come what might, to go and inquire of Mamma Valerius. He remembered the strong phrases in Christine's letter, forbidding him to make any attempt to see her. But what he had seen at Perros, what he had heard behind the dressing-room door, his conversation with Christine at the edge of the moor made him suspect some machination which, devilish though it might be, was none the less human. The girl's highly strung imagination, her affectionate and credulous mind, the primitive education which had surrounded her childhood with a circle of legends, the constant brooding over her dead father and, above all, the state of sublime ecstasy into which music threw her from the moment that this art was made manifest to her in certain exceptional conditions, as in the churchyard at Perros; all this seemed to him to constitute a moral ground only too favorable for the malevolent designs of some mysterious and unscrupulous person. Of whom was Christine Daae the victim? This was the very reasonable question which Raoul put to himself as he hurried off to Mamma Valerius.\n\nHe trembled as he rang at a little flat in the Rue Notre-Dame-des-Victoires. The door was opened by the maid whom he had seen coming out of Christine's dressing-room one evening. He asked if he could speak to Mme. Valerius. He was told that she was ill in bed and was not receiving visitors.\n\n\"Take in my card, please,\" he said.\n\nThe maid soon returned and showed him into a small and scantily furnished drawing-room, in which portraits of Professor Valerius and old Daae hung on opposite walls.\n\n\"Madame begs Monsieur le Vicomte to excuse her,\" said the servant. \"She can only see him in her bedroom, because she can no longer stand on her poor legs.\"\n\nFive minutes later, Raoul was ushered into an ill-lit room where he at once recognized the good, kind face of Christine's benefactress in the semi-darkness of an alcove. Mamma Valerius' hair was now quite white, but her eyes had grown no older; never, on the contrary, had their expression been so bright, so pure, so child-like.\n\n\"M. de Chagny!\" she cried gaily, putting out both her hands to her visitor. \"Ah, it's Heaven that sends you here! ... We can talk of HER.\"\n\nThis last sentence sounded very gloomily in the young man's ears. He at once asked:\n\n\"Madame ... where is Christine?\"\n\nAnd the old lady replied calmly:\n\n\"She is with her good genius!\"\n\n\"What good genius?\" exclaimed poor Raoul.\n\n\"Why, the Angel of Music!\"\n\nThe viscount dropped into a chair. Really? Christine was with the Angel of Music? And there lay Mamma Valerius in bed, smiling to him and putting her finger to her lips, to warn him to be silent! And she added:\n\n\"You must not tell anybody!\"\n\n\"You can rely on me,\" said Raoul.\n\nHe hardly knew what he was saying, for his ideas about Christine, already greatly confused, were becoming more and more entangled; and it seemed as if everything was beginning to turn around him, around the room, around that extraordinary good lady with the white hair and forget-me-not eyes.\n\n\"I know! I know I can!\" she said, with a happy laugh. \"But why don't you come near me, as you used to do when you were a little boy? Give me your hands, as when you brought me the story of little Lotte, which Daddy Daae had told you. I am very fond of you, M. Raoul, you know. And so is Christine too!\"\n\n\"She is fond of me!\" sighed the young man. He found a difficulty in collecting his thoughts and bringing them to bear on Mamma Valerius' \"good genius,\" on the Angel of Music of whom Christine had spoken to him so strangely, on the death's head which he had seen in a sort of nightmare on the high altar at Perros and also on the Opera ghost, whose fame had come to his ears one evening when he was standing behind the scenes, within hearing of a group of scene-shifters who were repeating the ghastly description which the hanged man, Joseph Buquet, had given of the ghost before his mysterious death.\n\nHe asked in a low voice: \"What makes you think that Christine is fond of me, madame?\"\n\n\"She used to speak of you every day.\"\n\n\"Really? ... And what did she tell you?\"\n\n\"She told me that you had made her a proposal!\"\n\nAnd the good old lady began laughing wholeheartedly. Raoul sprang from his chair, flushing to the temples, suffering agonies.\n\n\"What's this? Where are you going? Sit down again at once, will you? ... Do you think I will let you go like that? ... If you're angry with me for laughing, I beg your pardon... After all, what has happened isn't your fault... Didn't you know? ... Did you think that Christine was free? ...\"\n\n\"Is Christine engaged to be married?\" the wretched Raoul asked, in a choking voice.\n\n\"Why no! Why no! ... You know as well as I do that Christine couldn't marry, even if she wanted to!\"\n\n\"But I don't know anything about it! ... And why can't Christine marry?\"\n\n\"Because of the Angel of Music, of course! ...\"\n\n\"I don't follow ...\"\n\n\"Yes, he forbids her to! ...\"\n\n\"He forbids her! ... The Angel of Music forbids her to marry!\"\n\n\"Oh, he forbids her ... without forbidding her. It's like this: he tells her that, if she got married, she would never hear him again. That's all! ... And that he would go away for ever! ... So, you understand, she can't let the Angel of Music go. It's quite natural.\"\n\n\"Yes, yes,\" echoed Raoul submissively, \"it's quite natural.\"\n\n\"Besides, I thought Christine had told you all that, when she met you at Perros, where she went with her good genius.\"\n\n\"Oh, she went to Perros with her good genius, did she?\"\n\n\"That is to say, he arranged to meet her down there, in Perros churchyard, at Daae's grave. He promised to play her The Resurrection of Lazarus on her father's violin!\"\n\nRaoul de Chagny rose and, with a very authoritative air, pronounced these peremptory words:\n\n\"Madame, you will have the goodness to tell me where that genius lives.\"\n\nThe old lady did not seem surprised at this indiscreet command. She raised her eyes and said:\n\n\"In Heaven!\"\n\nSuch simplicity baffled him. He did not know what to say in the presence of this candid and perfect faith in a genius who came down nightly from Heaven to haunt the dressing-rooms at the Opera.\n\nHe now realized the possible state of mind of a girl brought up between a superstitious fiddler and a visionary old lady and he shuddered when he thought of the consequences of it all.\n\n\"Is Christine still a good girl?\" he asked suddenly, in spite of himself.\n\n\"I swear it, as I hope to be saved!\" exclaimed the old woman, who, this time, seemed to be incensed. \"And, if you doubt it, sir, I don't know what you are here for!\"\n\nRaoul tore at his gloves.\n\n\"How long has she known this 'genius?'\"\n\n\"About three months ... Yes, it's quite three months since he began to give her lessons.\"\n\nThe viscount threw up his arms with a gesture of despair.\n\n\"The genius gives her lessons! ... And where, pray?\"\n\n\"Now that she has gone away with him, I can't say; but, up to a fortnight ago, it was in Christine's dressing-room. It would be impossible in this little flat. The whole house would hear them. Whereas, at the Opera, at eight o'clock in the morning, there is no one about, do you see!\"\n\n\"Yes, I see! I see!\" cried the viscount.\n\nAnd he hurriedly took leave of Mme. Valerius, who asked herself if the young nobleman was not a little off his head.\n\nHe walked home to his brother's house in a pitiful state. He could have struck himself, banged his head against the walls! To think that he had believed in her innocence, in her purity! The Angel of Music! He knew him now! He saw him! It was beyond a doubt some unspeakable tenor, a good-looking jackanapes, who mouthed and simpered as he sang! He thought himself as absurd and as wretched as could be. Oh, what a miserable, little, insignificant, silly young man was M. le Vicomte de Chagny! thought Raoul, furiously. And she, what a bold and damnable sly creature!\n\nHis brother was waiting for him and Raoul fell into his arms, like a child. The count consoled him, without asking for explanations; and Raoul would certainly have long hesitated before telling him the story of the Angel of Music. His brother suggested taking him out to dinner. Overcome as he was with despair, Raoul would probably have refused any invitation that evening, if the count had not, as an inducement, told him that the lady of his thoughts had been seen, the night before, in company of the other sex in the Bois. At first, the viscount refused to believe; but he received such exact details that he ceased protesting. She had been seen, it appeared, driving in a brougham, with the window down. She seemed to be slowly taking in the icy night air. There was a glorious moon shining. She was recognized beyond a doubt. As for her companion, only his shadowy outline was distinguished leaning back in the dark. The carriage was going at a walking pace in a lonely drive behind the grand stand at Longchamp.\n\nRaoul dressed in frantic haste, prepared to forget his distress by flinging himself, as people say, into \"the vortex of pleasure.\" Alas, he was a very sorry guest and, leaving his brother early, found himself, by ten o'clock in the evening, in a cab, behind the Longchamp race-course.\n\nIt was bitterly cold. The road seemed deserted and very bright under the moonlight. He told the driver to wait for him patiently at the corner of a near turning and, hiding himself as well as he could, stood stamping his feet to keep warm. He had been indulging in this healthy exercise for half an hour or so, when a carriage turned the corner of the road and came quietly in his direction, at a walking pace.\n\nAs it approached, he saw that a woman was leaning her head from the window. And, suddenly, the moon shed a pale gleam over her features.\n\n\"Christine!\"\n\nThe sacred name of his love had sprung from his heart and his lips. He could not keep it back... He would have given anything to withdraw it, for that name, proclaimed in the stillness of the night, had acted as though it were the preconcerted signal for a furious rush on the part of the whole turn-out, which dashed past him before he could put into execution his plan of leaping at the horses' heads. The carriage window had been closed and the girl's face had disappeared. And the brougham, behind which he was now running, was no more than a black spot on the white road.\n\nHe called out again: \"Christine!\"\n\nNo reply. And he stopped in the midst of the silence.\n\nWith a lack-luster eye, he stared down that cold, desolate road and into the pale, dead night. Nothing was colder than his heart, nothing half so dead: he had loved an angel and now he despised a woman!\n\nRaoul, how that little fairy of the North has trifled with you! Was it really, was it really necessary to have so fresh and young a face, a forehead so shy and always ready to cover itself with the pink blush of modesty in order to pass in the lonely night, in a carriage and pair, accompanied by a mysterious lover? Surely there should be some limit to hypocrisy and lying! ...\n\nShe had passed without answering his cry ... And he was thinking of dying; and he was twenty years old! ...\n\nHis valet found him in the morning sitting on his bed. He had not undressed and the servant feared, at the sight of his face, that some disaster had occurred. Raoul snatched his letters from the man's hands. He had recognized Christine's paper and hand-writing. She said:\n\nDEAR:\n\nGo to the masked ball at the Opera on the night after to-morrow. At twelve o'clock, be in the little room behind the chimney-place of the big crush-room. Stand near the door that leads to the Rotunda. Don't mention this appointment to any one on earth. Wear a white domino and be carefully masked. As you love me, do not let yourself be recognized. CHRISTINE.\n\n\n\n\nChapter IX At the Masked Ball\n\nThe envelope was covered with mud and unstamped. It bore the words \"To be handed to M. le Vicomte Raoul de Chagny,\" with the address in pencil. It must have been flung out in the hope that a passer-by would pick up the note and deliver it, which was what happened. The note had been picked up on the pavement of the Place de l'Opera.\n\nRaoul read it over again with fevered eyes. No more was needed to revive his hope. The somber picture which he had for a moment imagined of a Christine forgetting her duty to herself made way for his original conception of an unfortunate, innocent child, the victim of imprudence and exaggerated sensibility. To what extent, at this time, was she really a victim? Whose prisoner was she? Into what whirlpool had she been dragged? He asked himself these questions with a cruel anguish; but even this pain seemed endurable beside the frenzy into which he was thrown at the thought of a lying and deceitful Christine. What had happened? What influence had she undergone? What monster had carried her off and by what means? ...\n\nBy what means indeed but that of music? He knew Christine's story. After her father's death, she acquired a distaste of everything in life, including her art. She went through the CONSERVATOIRE like a poor soulless singing-machine. And, suddenly, she awoke as though through the intervention of a god. The Angel of Music appeared upon the scene! She sang Margarita in FAUST and triumphed! ...\n\nThe Angel of Music! ... For three months the Angel of Music had been giving Christine lessons ... Ah, he was a punctual singing-master! ... And now he was taking her for drives in the Bois! ...\n\nRaoul's fingers clutched at his flesh, above his jealous heart. In his inexperience, he now asked himself with terror what game the girl was playing? Up to what point could an opera-singer make a fool of a good-natured young man, quite new to love? O misery! ...\n\nThus did Raoul's thoughts fly from one extreme to the other. He no longer knew whether to pity Christine or to curse her; and he pitied and cursed her turn and turn about. At all events, he bought a white domino.\n\nThe hour of the appointment came at last. With his face in a mask trimmed with long, thick lace, looking like a pierrot in his white wrap, the viscount thought himself very ridiculous. Men of the world do not go to the Opera ball in fancy-dress! It was absurd. One thought, however, consoled the viscount: he would certainly never be recognized!\n\nThis ball was an exceptional affair, given some time before Shrovetide, in honor of the anniversary of the birth of a famous draftsman; and it was expected to be much gayer, noisier, more Bohemian than the ordinary masked ball. Numbers of artists had arranged to go, accompanied by a whole cohort of models and pupils, who, by midnight, began to create a tremendous din. Raoul climbed the grand staircase at five minutes to twelve, did not linger to look at the motley dresses displayed all the way up the marble steps, one of the richest settings in the world, allowed no facetious mask to draw him into a war of wits, replied to no jests and shook off the bold familiarity of a number of couples who had already become a trifle too gay. Crossing the big crush-room and escaping from a mad whirl of dancers in which he was caught for a moment, he at last entered the room mentioned in Christine's letter. He found it crammed; for this small space was the point where all those who were going to supper in the Rotunda crossed those who were returning from taking a glass of champagne. The fun, here, waxed fast and furious.\n\nRaoul leaned against a door-post and waited. He did not wait long. A black domino passed and gave a quick squeeze to the tips of his fingers. He understood that it was she and followed her:\n\n\"Is that you, Christine?\" he asked, between his teeth.\n\nThe black domino turned round promptly and raised her finger to her lips, no doubt to warn him not to mention her name again. Raoul continued to follow her in silence.\n\nHe was afraid of losing her, after meeting her again in such strange circumstances. His grudge against her was gone. He no longer doubted that she had \"nothing to reproach herself with,\" however peculiar and inexplicable her conduct might seem. He was ready to make any display of clemency, forgiveness or cowardice. He was in love. And, no doubt, he would soon receive a very natural explanation of her curious absence.\n\nThe black domino turned back from time to time to see if the white domino was still following.\n\nAs Raoul once more passed through the great crush-room, this time in the wake of his guide, he could not help noticing a group crowding round a person whose disguise, eccentric air and gruesome appearance were causing a sensation. It was a man dressed all in scarlet, with a huge hat and feathers on the top of a wonderful death's head. From his shoulders hung an immense red-velvet cloak, which trailed along the floor like a king's train; and on this cloak was embroidered, in gold letters, which every one read and repeated aloud, \"Don't touch me! I am Red Death stalking abroad!\"\n\nThen one, greatly daring, did try to touch him ... but a skeleton hand shot out of a crimson sleeve and violently seized the rash one's wrist; and he, feeling the clutch of the knucklebones, the furious grasp of Death, uttered a cry of pain and terror. When Red Death released him at last, he ran away like a very madman, pursued by the jeers of the bystanders.\n\nIt was at this moment that Raoul passed in front of the funereal masquerader, who had just happened to turn in his direction. And he nearly exclaimed:\n\n\"The death's head of Perros-Guirec!\"\n\nHe had recognized him! ... He wanted to dart forward, forgetting Christine; but the black domino, who also seemed a prey to some strange excitement, caught him by the arm and dragged him from the crush-room, far from the mad crowd through which Red Death was stalking...\n\nThe black domino kept on turning back and, apparently, on two occasions saw something that startled her, for she hurried her pace and Raoul's as though they were being pursued.\n\nThey went up two floors. Here, the stairs and corridors were almost deserted. The black domino opened the door of a private box and beckoned to the white domino to follow her. Then Christine, whom he recognized by the sound of her voice, closed the door behind them and warned him, in a whisper, to remain at the back of the box and on no account to show himself. Raoul took off his mask. Christine kept hers on. And, when Raoul was about to ask her to remove it, he was surprised to see her put her ear to the partition and listen eagerly for a sound outside. Then she opened the door ajar, looked out into the corridor and, in a low voice, said:\n\n\"He must have gone up higher.\" Suddenly she exclaimed: \"He is coming down again!\"\n\nShe tried to close the door, but Raoul prevented her; for he had seen, on the top step of the staircase that led to the floor above, A RED FOOT, followed by another ... and slowly, majestically, the whole scarlet dress of Red Death met his eyes. And he once more saw the death's head of Perros-Guirec.\n\n\"It's he!\" he exclaimed. \"This time, he shall not escape me! ...\"\n\nBut Christian{sic} had slammed the door at the moment when Raoul was on the point of rushing out. He tried to push her aside.\n\n\"Whom do you mean by 'he'?\" she asked, in a changed voice. \"Who shall not escape you?\"\n\nRaoul tried to overcome the girl's resistance by force, but she repelled him with a strength which he would not have suspected in her. He understood, or thought he understood, and at once lost his temper.\n\n\"Who?\" he repeated angrily. \"Why, he, the man who hides behind that hideous mask of death! ... The evil genius of the churchyard at Perros! ... Red Death! ... In a word, madam, your friend ... your Angel of Music! ... But I shall snatch off his mask, as I shall snatch off my own; and, this time, we shall look each other in the face, he and I, with no veil and no lies between us; and I shall know whom you love and who loves you!\"\n\nHe burst into a mad laugh, while Christine gave a disconsolate moan behind her velvet mask. With a tragic gesture, she flung out her two arms, which fixed a barrier of white flesh against the door.\n\n\"In the name of our love, Raoul, you shall not pass! ...\"\n\nHe stopped. What had she said? ... In the name of their love? ... Never before had she confessed that she loved him. And yet she had had opportunities enough ... Pooh, her only object was to gain a few seconds! ... She wished to give the Red Death time to escape ... And, in accents of childish hatred, he said:\n\n\"You lie, madam, for you do not love me and you have never loved me! What a poor fellow I must be to let you mock and flout me as you have done! Why did you give me every reason for hope, at Perros ... for honest hope, madam, for I am an honest man and I believed you to be an honest woman, when your only intention was to deceive me! Alas, you have deceived us all! You have taken a shameful advantage of the candid affection of your benefactress herself, who continues to believe in your sincerity while you go about the Opera ball with Red Death! ... I despise you! ...\"\n\nAnd he burst into tears. She allowed him to insult her. She thought of but one thing, to keep him from leaving the box.\n\n\"You will beg my pardon, one day, for all those ugly words, Raoul, and when you do I shall forgive you!\"\n\nHe shook his head. \"No, no, you have driven me mad! When I think that I had only one object in life: to give my name to an opera wench!\"\n\n\"Raoul! ... How can you?\"\n\n\"I shall die of shame!\"\n\n\"No, dear, live!\" said Christine's grave and changed voice. \"And ... good-by. Good-by, Raoul ...\"\n\nThe boy stepped forward, staggering as he went. He risked one more sarcasm:\n\n\"Oh, you must let me come and applaud you from time to time!\"\n\n\"I shall never sing again, Raoul! ...\"\n\n\"Really?\" he replied, still more satirically. \"So he is taking you off the stage: I congratulate you! ... But we shall meet in the Bois, one of these evenings!\"\n\n\"Not in the Bois nor anywhere, Raoul: you shall not see me again ...\"\n\n\"May one ask at least to what darkness you are returning? ... For what hell are you leaving, mysterious lady ... or for what paradise?\"\n\n\"I came to tell you, dear, but I can't tell you now ... you would not believe me! You have lost faith in me, Raoul; it is finished!\"\n\nShe spoke in such a despairing voice that the lad began to feel remorse for his cruelty.\n\n\"But look here!\" he cried. \"Can't you tell me what all this means! ... You are free, there is no one to interfere with you... You go about Paris ... You put on a domino to come to the ball... Why do you not go home? ... What have you been doing this past fortnight? ... What is this tale about the Angel of Music, which you have been telling Mamma Valerius? Some one may have taken you in, played upon your innocence. I was a witness of it myself, at Perros ... but you know what to believe now! You seem to me quite sensible, Christine. You know what you are doing ... And meanwhile Mamma Valerius lies waiting for you at home and appealing to your 'good genius!' ... Explain yourself, Christine, I beg of you! Any one might have been deceived as I was. What is this farce?\"\n\nChristine simply took off her mask and said: \"Dear, it is a tragedy!\"\n\nRaoul now saw her face and could not restrain an exclamation of surprise and terror. The fresh complexion of former days was gone. A mortal pallor covered those features, which he had known so charming and so gentle, and sorrow had furrowed them with pitiless lines and traced dark and unspeakably sad shadows under her eyes.\n\n\"My dearest! My dearest!\" he moaned, holding out his arms. \"You promised to forgive me ...\"\n\n\"Perhaps! ... Some day, perhaps!\" she said, resuming her mask; and she went away, forbidding him, with a gesture, to follow her.\n\nHe tried to disobey her; but she turned round and repeated her gesture of farewell with such authority that he dared not move a step.\n\nHe watched her till she was out of sight. Then he also went down among the crowd, hardly knowing what he was doing, with throbbing temples and an aching heart; and, as he crossed the dancing-floor, he asked if anybody had seen Red Death. Yes, every one had seen Red Death; but Raoul could not find him; and, at two o'clock in the morning, he turned down the passage, behind the scenes, that led to Christine Daae's dressing-room.\n\nHis footsteps took him to that room where he had first known suffering. He tapped at the door. There was no answer. He entered, as he had entered when he looked everywhere for \"the man's voice.\" The room was empty. A gas-jet was burning, turned down low. He saw some writing-paper on a little desk. He thought of writing to Christine, but he heard steps in the passage. He had only time to hide in the inner room, which was separated from the dressing-room by a curtain.\n\nChristine entered, took off her mask with a weary movement and flung it on the table. She sighed and let her pretty head fall into her two hands. What was she thinking of? Of Raoul? No, for Raoul heard her murmur: \"Poor Erik!\"\n\nAt first, he thought he must be mistaken. To begin with, he was persuaded that, if any one was to be pitied, it was he, Raoul. It would have been quite natural if she had said, \"Poor Raoul,\" after what had happened between them. But, shaking her head, she repeated: \"Poor Erik!\"\n\nWhat had this Erik to do with Christine's sighs and why was she pitying Erik when Raoul was so unhappy?\n\nChristine began to write, deliberately, calmly and so placidly that Raoul, who was still trembling from the effects of the tragedy that separated them, was painfully impressed.\n\n\"What coolness!\" he said to himself.\n\nShe wrote on, filling two, three, four sheets. Suddenly, she raised her head and hid the sheets in her bodice ... She seemed to be listening ... Raoul also listened ... Whence came that strange sound, that distant rhythm? ... A faint singing seemed to issue from the walls ... yes, it was as though the walls themselves were singing! ... The song became plainer ... the words were now distinguishable ... he heard a voice, a very beautiful, very soft, very captivating voice ... but, for all its softness, it remained a male voice ... The voice came nearer and nearer ... it came through the wall ... it approached ... and now the voice was IN THE ROOM, in front of Christine. Christine rose and addressed the voice, as though speaking to some one:\n\n\"Here I am, Erik,\" she said. \"I am ready. But you are late.\"\n\nRaoul, peeping from behind the curtain, could not believe his eyes, which showed him nothing. Christine's face lit up. A smile of happiness appeared upon her bloodless lips, a smile like that of sick people when they receive the first hope of recovery.\n\nThe voice without a body went on singing; and certainly Raoul had never in his life heard anything more absolutely and heroically sweet, more gloriously insidious, more delicate, more powerful, in short, more irresistibly triumphant. He listened to it in a fever and he now began to understand how Christine Daae was able to appear one evening, before the stupefied audience, with accents of a beauty hitherto unknown, of a superhuman exaltation, while doubtless still under the influence of the mysterious and invisible master.\n\nThe voice was singing the Wedding-night Song from Romeo and Juliet. Raoul saw Christine stretch out her arms to the voice as she had done, in Perros churchyard, to the invisible violin playing The Resurrection of Lazarus. And nothing could describe the passion with which the voice sang:\n\n\"Fate links thee to me for ever and a day!\"\n\nThe strains went through Raoul's heart. Struggling against the charm that seemed to deprive him of all his will and all his energy and of almost all his lucidity at the moment when he needed them most, he succeeded in drawing back the curtain that hid him and he walked to where Christine stood. She herself was moving to the back of the room, the whole wall of which was occupied by a great mirror that reflected her image, but not his, for he was just behind her and entirely covered by her.\n\n\"Fate links thee to me for ever and a day!\"\n\nChristine walked toward her image in the glass and the image came toward her. The two Christines—the real one and the reflection—ended by touching; and Raoul put out his arms to clasp the two in one embrace. But, by a sort of dazzling miracle that sent him staggering, Raoul was suddenly flung back, while an icy blast swept over his face; he saw, not two, but four, eight, twenty Christines spinning round him, laughing at him and fleeing so swiftly that he could not touch one of them. At last, everything stood still again; and he saw himself in the glass. But Christine had disappeared.\n\nHe rushed up to the glass. He struck at the walls. Nobody! And meanwhile the room still echoed with a distant passionate singing:\n\n\"Fate links thee to me for ever and a day!\"\n\nWhich way, which way had Christine gone? ... Which way would she return? ...\n\nWould she return? Alas, had she not declared to him that everything was finished? And was the voice not repeating:\n\n\"Fate links thee to me for ever and a day!\"\n\nTo me? To whom?\n\nThen, worn out, beaten, empty-brained, he sat down on the chair which Christine had just left. Like her, he let his head fall into his hands. When he raised it, the tears were streaming down his young cheeks, real, heavy tears like those which jealous children shed, tears that wept for a sorrow which was in no way fanciful, but which is common to all the lovers on earth and which he expressed aloud:\n\n\"Who is this Erik?\" he said.\n\n\n\n\nChapter X Forget the Name of the Man's Voice\n\nThe day after Christine had vanished before his eyes in a sort of dazzlement that still made him doubt the evidence of his senses, M. le Vicomte de Chagny called to inquire at Mamma Valerius'. He came upon a charming picture. Christine herself was seated by the bedside of the old lady, who was sitting up against the pillows, knitting. The pink and white had returned to the young girl's cheeks. The dark rings round her eyes had disappeared. Raoul no longer recognized the tragic face of the day before. If the veil of melancholy over those adorable features had not still appeared to the young man as the last trace of the weird drama in whose toils that mysterious child was struggling, he could have believed that Christine was not its heroine at all.\n\nShe rose, without showing any emotion, and offered him her hand. But Raoul's stupefaction was so great that he stood there dumfounded, without a gesture, without a word.\n\n\"Well, M. de Chagny,\" exclaimed Mamma Valerius, \"don't you know our Christine? Her good genius has sent her back to us!\"\n\n\"Mamma!\" the girl broke in promptly, while a deep blush mantled to her eyes. \"I thought, mamma, that there was to be no more question of that! ... You know there is no such thing as the Angel of Music!\"\n\n\"But, child, he gave you lessons for three months!\"\n\n\"Mamma, I have promised to explain everything to you one of these days; and I hope to do so but you have promised me, until that day, to be silent and to ask me no more questions whatever!\"\n\n\"Provided that you promised never to leave me again! But have you promised that, Christine?\"\n\n\"Mamma, all this can not interest M. de Chagny.\"\n\n\"On the contrary, mademoiselle,\" said the young man, in a voice which he tried to make firm and brave, but which still trembled, \"anything that concerns you interests me to an extent which perhaps you will one day understand. I do not deny that my surprise equals my pleasure at finding you with your adopted mother and that, after what happened between us yesterday, after what you said and what I was able to guess, I hardly expected to see you here so soon. I should be the first to delight at your return, if you were not so bent on preserving a secrecy that may be fatal to you ... and I have been your friend too long not to be alarmed, with Mme. Valerius, at a disastrous adventure which will remain dangerous so long as we have not unraveled its threads and of which you will certainly end by being the victim, Christine.\"\n\nAt these words, Mamma Valerius tossed about in her bed.\n\n\"What does this mean?\" she cried. \"Is Christine in danger?\"\n\n\"Yes, madame,\" said Raoul courageously, notwithstanding the signs which Christine made to him.\n\n\"My God!\" exclaimed the good, simple old woman, gasping for breath. \"You must tell me everything, Christine! Why did you try to reassure me? And what danger is it, M. de Chagny?\"\n\n\"An impostor is abusing her good faith.\"\n\n\"Is the Angel of Music an impostor?\"\n\n\"She told you herself that there is no Angel of Music.\"\n\n\"But then what is it, in Heaven's name? You will be the death of me!\"\n\n\"There is a terrible mystery around us, madame, around you, around Christine, a mystery much more to be feared than any number of ghosts or genii!\"\n\nMamma Valerius turned a terrified face to Christine, who had already run to her adopted mother and was holding her in her arms.\n\n\"Don't believe him, mummy, don't believe him,\" she repeated.\n\n\"Then tell me that you will never leave me again,\" implored the widow.\n\nChristine was silent and Raoul resumed.\n\n\"That is what you must promise, Christine. It is the only thing that can reassure your mother and me. We will undertake not to ask you a single question about the past, if you promise us to remain under our protection in future.\"\n\n\"That is an undertaking which I have not asked of you and a promise which I refuse to make you!\" said the young girl haughtily. \"I am mistress of my own actions, M. de Chagny: you have no right to control them, and I will beg you to desist henceforth. As to what I have done during the last fortnight, there is only one man in the world who has the right to demand an account of me: my husband! Well, I have no husband and I never mean to marry!\"\n\nShe threw out her hands to emphasize her words and Raoul turned pale, not only because of the words which he had heard, but because he had caught sight of a plain gold ring on Christine's finger.\n\n\"You have no husband and yet you wear a wedding-ring.\"\n\nHe tried to seize her hand, but she swiftly drew it back.\n\n\"That's a present!\" she said, blushing once more and vainly striving to hide her embarrassment.\n\n\"Christine! As you have no husband, that ring can only have been given by one who hopes to make you his wife! Why deceive us further? Why torture me still more? That ring is a promise; and that promise has been accepted!\"\n\n\"That's what I said!\" exclaimed the old lady.\n\n\"And what did she answer, madame?\"\n\n\"What I chose,\" said Christine, driven to exasperation. \"Don't you think, monsieur, that this cross-examination has lasted long enough? As far as I am concerned ...\"\n\nRaoul was afraid to let her finish her speech. He interrupted her:\n\n\"I beg your pardon for speaking as I did, mademoiselle. You know the good intentions that make me meddle, just now, in matters which, you no doubt think, have nothing to do with me. But allow me to tell you what I have seen—and I have seen more than you suspect, Christine—or what I thought I saw, for, to tell you the truth, I have sometimes been inclined to doubt the evidence of my eyes.\"\n\n\"Well, what did you see, sir, or think you saw?\"\n\n\"I saw your ecstasy AT THE SOUND OF THE VOICE, Christine: the voice that came from the wall or the next room to yours ... yes, YOUR ECSTASY! And that is what makes me alarmed on your behalf. You are under a very dangerous spell. And yet it seems that you are aware of the imposture, because you say to-day THAT THERE IS NO ANGEL OF MUSIC! In that case, Christine, why did you follow him that time? Why did you stand up, with radiant features, as though you were really hearing angels? ... Ah, it is a very dangerous voice, Christine, for I myself, when I heard it, was so much fascinated by it that you vanished before my eyes without my seeing which way you passed! Christine, Christine, in the name of Heaven, in the name of your father who is in Heaven now and who loved you so dearly and who loved me too, Christine, tell us, tell your benefactress and me, to whom does that voice belong? If you do, we will save you in spite of yourself. Come, Christine, the name of the man! The name of the man who had the audacity to put a ring on your finger!\"\n\n\"M. de Chagny,\" the girl declared coldly, \"you shall never know!\"\n\nThereupon, seeing the hostility with which her ward had addressed the viscount, Mamma Valerius suddenly took Christine's part.\n\n\"And, if she does love that man, Monsieur le Vicomte, even then it is no business of yours!\"\n\n\"Alas, madame,\" Raoul humbly replied, unable to restrain his tears, \"alas, I believe that Christine really does love him! ... But it is not only that which drives me to despair; for what I am not certain of, madame, is that the man whom Christine loves is worthy of her love!\"\n\n\"It is for me to be the judge of that, monsieur!\" said Christine, looking Raoul angrily in the face.\n\n\"When a man,\" continued Raoul, \"adopts such romantic methods to entice a young girl's affections. ..\"\n\n\"The man must be either a villain, or the girl a fool: is that it?\"\n\n\"Christine!\"\n\n\"Raoul, why do you condemn a man whom you have never seen, whom no one knows and about whom you yourself know nothing?\"\n\n\"Yes, Christine ... Yes ... I at least know the name that you thought to keep from me for ever ... The name of your Angel of Music, mademoiselle, is Erik!\"\n\nChristine at once betrayed herself. She turned as white as a sheet and stammered: \"Who told you?\"\n\n\"You yourself!\"\n\n\"How do you mean?\"\n\n\"By pitying him the other night, the night of the masked ball. When you went to your dressing-room, did you not say, 'Poor Erik?' Well, Christine, there was a poor Raoul who overheard you.\"\n\n\"This is the second time that you have listened behind the door, M. de Chagny!\"\n\n\"I was not behind the door ... I was in the dressing-room, in the inner room, mademoiselle.\"\n\n\"Oh, unhappy man!\" moaned the girl, showing every sign of unspeakable terror. \"Unhappy man! Do you want to be killed?\"\n\n\"Perhaps.\"\n\nRaoul uttered this \"perhaps\" with so much love and despair in his voice that Christine could not keep back a sob. She took his hands and looked at him with all the pure affection of which she was capable:\n\n\"Raoul,\" she said, \"forget THE MAN'S VOICE and do not even remember its name... You must never try to fathom the mystery of THE MAN'S VOICE.\"\n\n\"Is the mystery so very terrible?\"\n\n\"There is no more awful mystery on this earth. Swear to me that you will make no attempt to find out,\" she insisted. \"Swear to me that you will never come to my dressing-room, unless I send for you.\"\n\n\"Then you promise to send for me sometimes, Christine?\"\n\n\"I promise.\"\n\n\"When?\"\n\n\"To-morrow.\"\n\n\"Then I swear to do as you ask.\"\n\nHe kissed her hands and went away, cursing Erik and resolving to be patient.\n\n\n\n\nChapter XI Above the Trap-Doors\n\nThe next day, he saw her at the Opera. She was still wearing the plain gold ring. She was gentle and kind to him. She talked to him of the plans which he was forming, of his future, of his career.\n\nHe told her that the date of the Polar expedition had been put forward and that he would leave France in three weeks, or a month at latest. She suggested, almost gaily, that he must look upon the voyage with delight, as a stage toward his coming fame. And when he replied that fame without love was no attraction in his eyes, she treated him as a child whose sorrows were only short-lived.\n\n\"How can you speak so lightly of such serious things?\" he asked. \"Perhaps we shall never see each other again! I may die during that expedition.\"\n\n\"Or I,\" she said simply.\n\nShe no longer smiled or jested. She seemed to be thinking of some new thing that had entered her mind for the first time. Her eyes were all aglow with it.\n\n\"What are you thinking of, Christine?\"\n\n\"I am thinking that we shall not see each other again ...\"\n\n\"And does that make you so radiant?\"\n\n\"And that, in a month, we shall have to say good-by for ever!\"\n\n\"Unless, Christine, we pledge our faith and wait for each other for ever.\"\n\nShe put her hand on his mouth.\n\n\"Hush, Raoul! ... You know there is no question of that ... And we shall never be married: that is understood!\"\n\nShe seemed suddenly almost unable to contain an overpowering gaiety. She clapped her hands with childish glee. Raoul stared at her in amazement.\n\n\"But ... but,\" she continued, holding out her two hands to Raoul, or rather giving them to him, as though she had suddenly resolved to make him a present of them, \"but if we can not be married, we can ... we can be engaged! Nobody will know but ourselves, Raoul. There have been plenty of secret marriages: why not a secret engagement? ... We are engaged, dear, for a month! In a month, you will go away, and I can be happy at the thought of that month all my life long!\"\n\nShe was enchanted with her inspiration. Then she became serious again.\n\n\"This,\" she said, \"IS A HAPPINESS THAT WILL HARM NO ONE.\"\n\nRaoul jumped at the idea. He bowed to Christine and said:\n\n\"Mademoiselle, I have the honor to ask for your hand.\"\n\n\"Why, you have both of them already, my dear betrothed! ... Oh, Raoul, how happy we shall be! ... We must play at being engaged all day long.\"\n\nIt was the prettiest game in the world and they enjoyed it like the children that they were. Oh, the wonderful speeches they made to each other and the eternal vows they exchanged! They played at hearts as other children might play at ball; only, as it was really their two hearts that they flung to and fro, they had to be very, very handy to catch them, each time, without hurting them.\n\nOne day, about a week after the game began, Raoul's heart was badly hurt and he stopped playing and uttered these wild words:\n\n\"I shan't go to the North Pole!\"\n\nChristine, who, in her innocence, had not dreamed of such a possibility, suddenly discovered the danger of the game and reproached herself bitterly. She did not say a word in reply to Raoul's remark and went straight home.\n\nThis happened in the afternoon, in the singer's dressing-room, where they met every day and where they amused themselves by dining on three biscuits, two glasses of port and a bunch of violets. In the evening, she did not sing; and he did not receive his usual letter, though they had arranged to write to each other daily during that month. The next morning, he ran off to Mamma Valerius, who told him that Christine had gone away for two days. She had left at five o'clock the day before.\n\nRaoul was distracted. He hated Mamma Valerius for giving him such news as that with such stupefying calmness. He tried to sound her, but the old lady obviously knew nothing.\n\nChristine returned on the following day. She returned in triumph. She renewed her extraordinary success of the gala performance. Since the adventure of the \"toad,\" Carlotta had not been able to appear on the stage. The terror of a fresh \"co-ack\" filled her heart and deprived her of all her power of singing; and the theater that had witnessed her incomprehensible disgrace had become odious to her. She contrived to cancel her contract. Daae was offered the vacant place for the time. She received thunders of applause in the Juive.\n\nThe viscount, who, of course, was present, was the only one to suffer on hearing the thousand echoes of this fresh triumph; for Christine still wore her plain gold ring. A distant voice whispered in the young man's ear:\n\n\"She is wearing the ring again to-night; and you did not give it to her. She gave her soul again tonight and did not give it to you... If she will not tell you what she has been doing the past two days ... you must go and ask Erik!\"\n\nHe ran behind the scenes and placed himself in her way. She saw him for her eyes were looking for him. She said:\n\n\"Quick! Quick! ... Come!\"\n\nAnd she dragged him to her dressing-room.\n\nRaoul at once threw himself on his knees before her. He swore to her that he would go and he entreated her never again to withhold a single hour of the ideal happiness which she had promised him. She let her tears flow. They kissed like a despairing brother and sister who have been smitten with a common loss and who meet to mourn a dead parent.\n\nSuddenly, she snatched herself from the young man's soft and timid embrace, seemed to listen to something, and, with a quick gesture, pointed to the door. When he was on the threshold, she said, in so low a voice that the viscount guessed rather than heard her words:\n\n\"To-morrow, my dear betrothed! And be happy, Raoul: I sang for you to-night!\"\n\nHe returned the next day. But those two days of absence had broken the charm of their delightful make-believe. They looked at each other, in the dressing-room, with their sad eyes, without exchanging a word. Raoul had to restrain himself not to cry out:\n\n\"I am jealous! I am jealous! I am jealous!\"\n\nBut she heard him all the same. Then she said:\n\n\"Come for a walk, dear. The air will do you good.\"\n\nRaoul thought that she would propose a stroll in the country, far from that building which he detested as a prison whose jailer he could feel walking within the walls ... the jailer Erik ... But she took him to the stage and made him sit on the wooden curb of a well, in the doubtful peace and coolness of a first scene set for the evening's performance.\n\nOn another day, she wandered with him, hand in, hand, along the deserted paths of a garden whose creepers had been cut out by a decorator's skilful hands. It was as though the real sky, the real flowers, the real earth were forbidden her for all time and she condemned to breathe no other air than that of the theater. An occasional fireman passed, watching over their melancholy idyll from afar. And she would drag him up above the clouds, in the magnificent disorder of the grid, where she loved to make him giddy by running in front of him along the frail bridges, among the thousands of ropes fastened to the pulleys, the windlasses, the rollers, in the midst of a regular forest of yards and masts. If he hesitated, she said, with an adorable pout of her lips:\n\n\"You, a sailor!\"\n\nAnd then they returned to terra firma, that is to say, to some passage that led them to the little girls' dancing-school, where brats between six and ten were practising their steps, in the hope of becoming great dancers one day, \"covered with diamonds ...\" Meanwhile, Christine gave them sweets instead.\n\nShe took him to the wardrobe and property-rooms, took him all over her empire, which was artificial, but immense, covering seventeen stories from the ground-floor to the roof and inhabited by an army of subjects. She moved among them like a popular queen, encouraging them in their labors, sitting down in the workshops, giving words of advice to the workmen whose hands hesitated to cut into the rich stuffs that were to clothe heroes. There were inhabitants of that country who practised every trade. There were cobblers, there were goldsmiths. All had learned to know her and to love her, for she always interested herself in all their troubles and all their little hobbies.\n\nShe knew unsuspected corners that were secretly occupied by little old couples. She knocked at their door and introduced Raoul to them as a Prince Charming who had asked for her hand; and the two of them, sitting on some worm-eaten \"property,\" would listen to the legends of the Opera, even as, in their childhood, they had listened to the old Breton tales. Those old people remembered nothing outside the Opera. They had lived there for years without number. Past managements had forgotten them; palace revolutions had taken no notice of them; the history of France had run its course unknown to them; and nobody recollected their existence.\n\nThe precious days sped in this way; and Raoul and Christine, by affecting excessive interest in outside matters, strove awkwardly to hide from each other the one thought of their hearts. One fact was certain, that Christine, who until then had shown herself the stronger of the two, became suddenly inexpressibly nervous. When on their expeditions, she would start running without reason or else suddenly stop; and her hand, turning ice-cold in a moment, would hold the young man back. Sometimes her eyes seemed to pursue imaginary shadows. She cried, \"This way,\" and \"This way,\" and \"This way,\" laughing a breathless laugh that often ended in tears. Then Raoul tried to speak, to question her, in spite of his promises. But, even before he had worded his question, she answered feverishly:\n\n\"Nothing ... I swear it is nothing.\"\n\nOnce, when they were passing before an open trapdoor on the stage, Raoul stopped over the dark cavity.\n\n\"You have shown me over the upper part of your empire, Christine, but there are strange stories told of the lower part. Shall we go down?\"\n\nShe caught him in her arms, as though she feared to see him disappear down the black hole, and, in a trembling voice, whispered:\n\n\"Never! ... I will not have you go there! ... Besides, it's not mine ... EVERYTHING THAT IS UNDERGROUND BELONGS TO HIM!\"\n\nRaoul looked her in the eyes and said roughly:\n\n\"So he lives down there, does he?\"\n\n\"I never said so ... Who told you a thing like that? Come away! I sometimes wonder if you are quite sane, Raoul ... You always take things in such an impossible way ... Come along! Come!\"\n\nAnd she literally dragged him away, for he was obstinate and wanted to remain by the trap-door; that hole attracted him.\n\nSuddenly, the trap-door was closed and so quickly that they did not even see the hand that worked it; and they remained quite dazed.\n\n\"Perhaps HE was there,\" Raoul said, at last.\n\nShe shrugged her shoulders, but did not seem easy.\n\n\"No, no, it was the 'trap-door-shutters.' They must do something, you know ... They open and shut the trap-doors without any particular reason ... It's like the 'door-shutters:' they must spend their time somehow.\"\n\n\"But suppose it were HE, Christine?\"\n\n\"No, no! He has shut himself up, he is working.\"\n\n\"Oh, really! He's working, is he?\"\n\n\"Yes, he can't open and shut the trap-doors and work at the same time.\" She shivered.\n\n\"What is he working at?\"\n\n\"Oh, something terrible! ... But it's all the better for us... When he's working at that, he sees nothing; he does not eat, drink, or breathe for days and nights at a time ... he becomes a living dead man and has no time to amuse himself with the trap-doors.\" She shivered again. She was still holding him in her arms. Then she sighed and said, in her turn:\n\n\"Suppose it were HE!\"\n\n\"Are you afraid of him?\"\n\n\"No, no, of course not,\" she said.\n\nFor all that, on the next day and the following days, Christine was careful to avoid the trap-doors. Her agitation only increased as the hours passed. At last, one afternoon, she arrived very late, with her face so desperately pale and her eyes so desperately red, that Raoul resolved to go to all lengths, including that which he foreshadowed when he blurted out that he would not go on the North Pole expedition unless she first told him the secret of the man's voice.\n\n\"Hush! Hush, in Heaven's name! Suppose HE heard you, you unfortunate Raoul!\"\n\nAnd Christine's eyes stared wildly at everything around her.\n\n\"I will remove you from his power, Christine, I swear it. And you shall not think of him any more.\"\n\n\"Is it possible?\"\n\nShe allowed herself this doubt, which was an encouragernent, while dragging the young man up to the topmost floor of the theater, far, very far from the trap-doors.\n\n\"I shall hide you in some unknown corner of the world, where HE can not come to look for you. You will be safe; and then I shall go away ... as you have sworn never to marry.\"\n\nChristine seized Raoul's hands and squeezed them with incredible rapture. But, suddenly becoming alarmed again, she turned away her head.\n\n\"Higher!\" was all she said. \"Higher still!\"\n\nAnd she dragged him up toward the summit.\n\nHe had a difficulty in following her. They were soon under the very roof, in the maze of timber-work. They slipped through the buttresses, the rafters, the joists; they ran from beam to beam as they might have run from tree to tree in a forest.\n\nAnd, despite the care which she took to look behind her at every moment, she failed to see a shadow which followed her like her own shadow, which stopped when she stopped, which started again when she did and which made no more noise than a well-conducted shadow should. As for Raoul, he saw nothing either; for, when he had Christine in front of him, nothing interested him that happened behind.\n\n\n\n\nChapter XII Apollo's Lyre\n\nOn this way, they reached the roof. Christine tripped over it as lightly as a swallow. Their eyes swept the empty space between the three domes and the triangular pediment. She breathed freely over Paris, the whole valley of which was seen at work below. She called Raoul to come quite close to her and they walked side by side along the zinc streets, in the leaden avenues; they looked at their twin shapes in the huge tanks, full of stagnant water, where, in the hot weather, the little boys of the ballet, a score or so, learn to swim and dive.\n\nThe shadow had followed behind them clinging to their steps; and the two children little suspected its presence when they at last sat down, trustingly, under the mighty protection of Apollo, who, with a great bronze gesture, lifted his huge lyre to the heart of a crimson sky.\n\nIt was a gorgeous spring evening. Clouds, which had just received their gossamer robe of gold and purple from the setting sun, drifted slowly by; and Christine said to Raoul:\n\n\"Soon we shall go farther and faster than the clouds, to the end of the world, and then you will leave me, Raoul. But, if, when the moment comes for you to take me away, I refuse to go with you—well you must carry me off by force!\"\n\n\"Are you afraid that you will change your mind, Christine?\"\n\n\"I don't know,\" she said, shaking her head in an odd fashion. \"He is a demon!\" And she shivered and nestled in his arms with a moan. \"I am afraid now of going back to live with him ... in the ground!\"\n\n\"What compels you to go back, Christine?\"\n\n\"If I do not go back to him, terrible misfortunes may happen! ... But I can't do it, I can't do it! ... I know one ought to be sorry for people who live underground ... But he is too horrible! And yet the time is at hand; I have only a day left; and, if I do not go, he will come and fetch me with his voice. And he will drag me with him, underground, and go on his knees before me, with his death's head. And he will tell me that he loves me! And he will cry! Oh, those tears, Raoul, those tears in the two black eye-sockets of the death's head! I can not see those tears flow again!\"\n\nShe wrung her hands in anguish, while Raoul pressed her to his heart.\n\n\"No, no, you shall never again hear him tell you that he loves you! You shall not see his tears! Let us fly, Christine, let us fly at once!\"\n\nAnd he tried to drag her away, then and there. But she stopped him.\n\n\"No, no,\" she said, shaking her head sadly. \"Not now! ... It would be too cruel ... let him hear me sing to-morrow evening ... and then we will go away. You must come and fetch me in my dressing-room at midnight exactly. He will then be waiting for me in the dining-room by the lake ... we shall be free and you shall take me away ... You must promise me that, Raoul, even if I refuse; for I feel that, if I go back this time, I shall perhaps never return.\"\n\nAnd she gave a sigh to which it seemed to her that another sigh, behind her, replied.\n\n\"Didn't you hear?\"\n\nHer teeth chattered.\n\n\"No,\" said Raoul, \"I heard nothing.\"\n\n\"It is too terrible,\" she confessed, \"to be always trembling like this! ... And yet we run no danger here; we are at home, in the sky, in the open air, in the light. The sun is flaming; and night-birds can not bear to look at the sun. I have never seen him by daylight ... it must be awful! ... Oh, the first time I saw him! ... I thought that he was going to die.\"\n\n\"Why?\" asked Raoul, really frightened at the aspect which this strange confidence was taking.\n\n\"BECAUSE I HAD SEEN HIM!\"\n\nThis time, Raoul and Christine turned round at the same time:\n\n\"There is some one in pain,\" said Raoul. \"Perhaps some one has been hurt. Did you hear?\"\n\n\"I can't say,\" Christine confessed. \"Even when he is not there, my ears are full of his sighs. Still, if you heard ...\"\n\nThey stood up and looked around them. They were quite alone on the immense lead roof. They sat down again and Raoul said:\n\n\"Tell me how you saw him first.\"\n\n\"I had heard him for three months without seeing him. The first time I heard it, I thought, as you did, that that adorable voice was singing in another room. I went out and looked everywhere; but, as you know, Raoul, my dressing-room is very much by itself; and I could not find the voice outside my room, whereas it went on steadily inside. And it not only sang, but it spoke to me and answered my questions, like a real man's voice, with this difference, that it was as beautiful as the voice of an angel. I had never got the Angel of Music whom my poor father had promised to send me as soon as he was dead. I really think that Mamma Valerius was a little bit to blame. I told her about it; and she at once said, 'It must be the Angel; at any rate, you can do no harm by asking him.' I did so; and the man's voice replied that, yes, it was the Angel's voice, the voice which I was expecting and which my father had promised me. From that time onward, the voice and I became great friends. It asked leave to give me lessons every day. I agreed and never failed to keep the appointment which it gave me in my dressing-room. You have no idea, though you have heard the voice, of what those lessons were like.\"\n\n\"No, I have no idea,\" said Raoul. \"What was your accompaniment?\"\n\n\"We were accompanied by a music which I do not know: it was behind the wall and wonderfully accurate. The voice seemed to understand mine exactly, to know precisely where my father had left off teaching me. In a few weeks' time, I hardly knew myself when I sang. I was even frightened. I seemed to dread a sort of witchcraft behind it; but Mamma Valerius reassured me. She said that she knew I was much too simple a girl to give the devil a hold on me ... My progress, by the voice's own order, was kept a secret between the voice, Mamma Valerius and myself. It was a curious thing, but, outside the dressing-room, I sang with my ordinary, every-day voice and nobody noticed anything. I did all that the voice asked. It said, 'Wait and see: we shall astonish Paris!' And I waited and lived on in a sort of ecstatic dream. It was then that I saw you for the first time one evening, in the house. I was so glad that I never thought of concealing my delight when I reached my dressing-room. Unfortunately, the voice was there before me and soon noticed, by my air, that something had happened. It asked what was the matter and I saw no reason for keeping our story secret or concealing the place which you filled in my heart. Then the voice was silent. I called to it, but it did not reply; I begged and entreated, but in vain. I was terrified lest it had gone for good. I wish to Heaven it had, dear! ... That night, I went home in a desperate condition. I told Mamma Valerius, who said, 'Why, of course, the voice is jealous!' And that, dear, first revealed to me that I loved you.\"\n\nChristine stopped and laid her head on Raoul's shoulder. They sat like that for a moment, in silence, and they did not see, did not perceive the movement, at a few steps from them, of the creeping shadow of two great black wings, a shadow that came along the roof so near, so near them that it could have stifled them by closing over them.\n\n\"The next day,\" Christine continued, with a sigh, \"I went back to my dressing-room in a very pensive frame of mind. The voice was there, spoke to me with great sadness and told me plainly that, if I must bestow my heart on earth, there was nothing for the voice to do but to go back to Heaven. And it said this with such an accent of HUMAN sorrow that I ought then and there to have suspected and begun to believe that I was the victim of my deluded senses. But my faith in the voice, with which the memory of my father was so closely intermingled, remained undisturbed. I feared nothing so much as that I might never hear it again; I had thought about my love for you and realized all the useless danger of it; and I did not even know if you remembered me. Whatever happened, your position in society forbade me to contemplate the possibility of ever marrying you; and I swore to the voice that you were no more than a brother to me nor ever would be and that my heart was incapable of any earthly love. And that, dear, was why I refused to recognize or see you when I met you on the stage or in the passages. Meanwhile, the hours during which the voice taught me were spent in a divine frenzy, until, at last, the voice said to me, 'You can now, Christine Daae, give to men a little of the music of Heaven.' I don't know how it was that Carlotta did not come to the theater that night nor why I was called upon to sing in her stead; but I sang with a rapture I had never known before and I felt for a moment as if my soul were leaving my body!\"\n\n\"Oh, Christine,\" said Raoul, \"my heart quivered that night at every accent of your voice. I saw the tears stream down your cheeks and I wept with you. How could you sing, sing like that while crying?\"\n\n\"I felt myself fainting,\" said Christine, \"I closed my eyes. When I opened them, you were by my side. But the voice was there also, Raoul! I was afraid for your sake and again I would not recognize you and began to laugh when you reminded me that you had picked up my scarf in the sea! ... Alas, there is no deceiving the voice! ... The voice recognized you and the voice was jealous! ... It said that, if I did not love you, I would not avoid you, but treat you like any other old friend. It made me scene upon scene. At last, I said to the voice, 'That will do! I am going to Perros to-morrow, to pray on my father's grave, and I shall ask M. Raoul de Chagny to go with me.' 'Do as you please,' replied the voice, 'but I shall be at Perros too, for I am wherever you are, Christine; and, if you are still worthy of me, if you have not lied to me, I will play you The Resurrection of Lazarus, on the stroke of midnight, on your father's tomb and on your father's violin.' That, dear, was how I came to write you the letter that brought you to Perros. How could I have been so beguiled? How was it, when I saw the personal, the selfish point of view of the voice, that I did not suspect some impostor? Alas, I was no longer mistress of myself: I had become his thing!\"\n\n\"But, after all,\" cried Raoul, \"you soon came to know the truth! Why did you not at once rid yourself of that abominable nightmare?\"\n\n\"Know the truth, Raoul? Rid myself of that nightmare? But, my poor boy, I was not caught in the nightmare until the day when I learned the truth! ... Pity me, Raoul, pity me! ... You remember the terrible evening when Carlotta thought that she had been turned into a toad on the stage and when the house was suddenly plunged in darkness through the chandelier crashing to the floor? There were killed and wounded that night and the whole theater rang with terrified screams. My first thought was for you and the voice. I was at once easy, where you were concerned, for I had seen you in your brother's box and I knew that you were not in danger. But the voice had told me that it would be at the performance and I was really afraid for it, just as if it had been an ordinary person who was capable of dying. I thought to myself, 'The chandelier may have come down upon the voice.' I was then on the stage and was nearly running into the house, to look for the voice among the killed and wounded, when I thought that, if the voice was safe, it would be sure to be in my dressing-room and I rushed to my room. The voice was not there. I locked my door and, with tears in my eyes, besought it, if it were still alive, to manifest itself to me. The voice did not reply, but suddenly I heard a long, beautiful wail which I knew well. It is the plaint of Lazarus when, at the sound of the Redeemer's voice, he begins to open his eyes and see the light of day. It was the music which you and I, Raoul, heard at Perros. And then the voice began to sing the leading phrase, 'Come! And believe in me! Whoso believes in me shall live! Walk! Whoso hath believed in me shall never die! ...' I can not tell you the effect which that music had upon me. It seemed to command me, personally, to come, to stand up and come to it. It retreated and I followed. 'Come! And believe in me!' I believed in it, I came ... I came and—this was the extraordinary thing—my dressing-room, as I moved, seemed to lengthen out ... to lengthen out ... Evidently, it must have been an effect of mirrors ... for I had the mirror in front of me ... And, suddenly, I was outside the room without knowing how!\"\n\n\"What! Without knowing how? Christine, Christine, you must really stop dreaming!\"\n\n\"I was not dreaming, dear, I was outside my room without knowing how. You, who saw me disappear from my room one evening, may be able to explain it; but I can not. I can only tell you that, suddenly, there was no mirror before me and no dressing-room. I was in a dark passage, I was frightened and I cried out. It was quite dark, but for a faint red glimmer at a distant corner of the wall. I tried out. My voice was the only sound, for the singing and the violin had stopped. And, suddenly, a hand was laid on mine ... or rather a stone-cold, bony thing that seized my wrist and did not let go. I cried out again. An arm took me round the waist and supported me. I struggled for a little while and then gave up the attempt. I was dragged toward the little red light and then I saw that I was in the hands of a man wrapped in a large cloak and wearing a mask that hid his whole face. I made one last effort; my limbs stiffened, my mouth opened to scream, but a hand closed it, a hand which I felt on my lips, on my skin ... a hand that smelt of death. Then I fainted away.\n\n\"When I opened my eyes, we were still surrounded by darkness. A lantern, standing on the ground, showed a bubbling well. The water splashing from the well disappeared, almost at once, under the floor on which I was lying, with my head on the knee of the man in the black cloak and the black mask. He was bathing my temples and his hands smelt of death. I tried to push them away and asked, 'Who are you? Where is the voice?' His only answer was a sigh. Suddenly, a hot breath passed over my face and I perceived a white shape, beside the man's black shape, in the darkness. The black shape lifted me on to the white shape, a glad neighing greeted my astounded ears and I murmured, 'Cesar!' The animal quivered. Raoul, I was lying half back on a saddle and I had recognized the white horse out of the PROFETA, which I had so often fed with sugar and sweets. I remembered that, one evening, there was a rumor in the theater that the horse had disappeared and that it had been stolen by the Opera ghost. I believed in the voice, but had never believed in the ghost. Now, however, I began to wonder, with a shiver, whether I was the ghost's prisoner. I called upon the voice to help me, for I should never have imagined that the voice and the ghost were one. You have heard about the Opera ghost, have you not, Raoul?\"\n\n\"Yes, but tell me what happened when you were on the white horse of the Profeta?\"\n\n\"I made no movement and let myself go. The black shape held me up, and I made no effort to escape. A curious feeling of peacefulness came over me and I thought that I must be under the influence of some cordial. I had the full command of my senses; and my eyes became used to the darkness, which was lit, here and there, by fitful gleams. I calculated that we were in a narrow circular gallery, probably running all round the Opera, which is immense, underground. I had once been down into those cellars, but had stopped at the third floor, though there were two lower still, large enough to hold a town. But the figures of which I caught sight had made me run away. There are demons down there, quite black, standing in front of boilers, and they wield shovels and pitchforks and poke up fires and stir up flames and, if you come too near them, they frighten you by suddenly opening the red mouths of their furnaces ... Well, while Cesar was quietly carrying me on his back, I saw those black demons in the distance, looking quite small, in front of the red fires of their furnaces: they came into sight, disappeared and came into sight again, as we went on our winding way. At last, they disappeared altogether. The shape was still holding me up and Cesar walked on, unled and sure-footed. I could not tell you, even approximately, how long this ride lasted; I only know that we seemed to turn and turn and often went down a spiral stair into the very heart of the earth. Even then, it may be that my head was turning, but I don't think so: no, my mind was quite clear. At last, Cesar raised his nostrils, sniffed the air and quickened his pace a little. I felt a moistness in the air and Cesar stopped. The darkness had lifted. A sort of bluey light surrounded us. We were on the edge of a lake, whose leaden waters stretched into the distance, into the darkness; but the blue light lit up the bank and I saw a little boat fastened to an iron ring on the wharf!\"\n\n\"A boat!\"\n\n\"Yes, but I knew that all that existed and that there was nothing supernatural about that underground lake and boat. But think of the exceptional conditions in which I arrived upon that shore! I don't know whether the effects of the cordial had worn off when the man's shape lifted me into the boat, but my terror began all over again. My gruesome escort must have noticed it, for he sent Cesar back and I heard his hoofs trampling up a staircase while the man jumped into the boat, untied the rope that held it and seized the oars. He rowed with a quick, powerful stroke; and his eyes, under the mask, never left me. We slipped across the noiseless water in the bluey light which I told you of; then we were in the dark again and we touched shore. And I was once more taken up in the man's arms. I cried aloud. And then, suddenly, I was silent, dazed by the light... Yes, a dazzling light in the midst of which I had been put down. I sprang to my feet. I was in the middle of a drawing-room that seemed to me to be decorated, adorned and furnished with nothing but flowers, flowers both magnificent and stupid, because of the silk ribbons that tied them to baskets, like those which they sell in the shops on the boulevards. They were much too civilized flowers, like those which I used to find in my dressing-room after a first night. And, in the midst of all these flowers, stood the black shape of the man in the mask, with arms crossed, and he said, 'Don't be afraid, Christine; you are in no danger.' IT WAS THE VOICE!\n\n\"My anger equaled my amazement. I rushed at the mask and tried to snatch it away, so as to see the face of the voice. The man said, 'You are in no danger, so long as you do not touch the mask.' And, taking me gently by the wrists, he forced me into a chair and then went down on his knees before me and said nothing more! His humility gave me back some of my courage; and the light restored me to the realties of life. However extraordinary the adventure might be, I was now surrounded by mortal, visible, tangible things. The furniture, the hangings, the candles, the vases and the very flowers in their baskets, of which I could almost have told whence they came and what they cost, were bound to confine my imagination to the limits of a drawing-room quite as commonplace as any that, at least, had the excuse of not being in the cellars of the Opera. I had, no doubt, to do with a terrible, eccentric person, who, in some mysterious fashion, had succeeded in taking up his abode there, under the Opera house, five stories below the level of the ground. And the voice, the voice which I had recognized under the mask, was on its knees before me, WAS A MAN! And I began to cry... The man, still kneeling, must have understood the cause of my tears, for he said, 'It is true, Christine! ... I am not an Angel, nor a genius, nor a ghost ... I am Erik!'\"\n\nChristine's narrative was again interrupted. An echo behind them seemed to repeat the word after her.\n\n\"Erik!\"\n\nWhat echo? ... They both turned round and saw that night had fallen. Raoul made a movement as though to rise, but Christine kept him beside her.\n\n\"Don't go,\" she said. \"I want you to know everything HERE!\"\n\n\"But why here, Christine? I am afraid of your catching cold.\"\n\n\"We have nothing to fear except the trap-doors, dear, and here we are miles away from the trap-doors ... and I am not allowed to see you outside the theater. This is not the time to annoy him. We must not arouse his suspicion.\"\n\n\"Christine! Christine! Something tells me that we are wrong to wait till to-morrow evening and that we ought to fly at once.\"\n\n\"I tell you that, if he does not hear me sing tomorrow, it will cause him infinite pain.\"\n\n\"It is difficult not to cause him pain and yet to escape from him for good.\"\n\n\"You are right in that, Raoul, for certainly he will die of my flight.\" And she added in a dull voice, \"But then it counts both ways ... for we risk his killing us.\"\n\n\"Does he love you so much?\"\n\n\"He would commit murder for me.\"\n\n\"But one can find out where he lives. One can go in search of him. Now that we know that Erik is not a ghost, one can speak to him and force him to answer!\"\n\nChristine shook her head.\n\n\"No, no! There is nothing to be done with Erik except to run away!\"\n\n\"Then why, when you were able to run away, did you go back to him?\"\n\n\"Because I had to. And you will understand that when I tell you how I left him.\"\n\n\"Oh, I hate him!\" cried Raoul. \"And you, Christine, tell me, do you hate him too?\"\n\n\"No,\" said Christine simply.\n\n\"No, of course not ... Why, you love him! Your fear, your terror, all of that is just love and love of the most exquisite kind, the kind which people do not admit even to themselves,\" said Raoul bitterly. \"The kind that gives you a thrill, when you think of it... Picture it: a man who lives in a palace underground!\" And he gave a leer.\n\n\"Then you want me to go back there?\" said the young girl cruelly. \"Take care, Raoul; I have told you: I should never return!\"\n\nThere was an appalling silence between the three of them: the two who spoke and the shadow that listened, behind them.\n\n\"Before answering that,\" said Raoul, at last, speaking very slowly, \"I should like to know with what feeling he inspires you, since you do not hate him.\"\n\n\"With horror!\" she said. \"That is the terrible thing about it. He fills me with horror and I do not hate him. How can I hate him, Raoul? Think of Erik at my feet, in the house on the lake, underground. He accuses himself, he curses himself, he implores my forgiveness! ... He confesses his cheat. He loves me! He lays at my feet an immense and tragic love... He has carried me off for love! ... He has imprisoned me with him, underground, for love! ... But he respects me: he crawls, he moans, he weeps! ... And, when I stood up, Raoul, and told him that I could only despise him if he did not, then and there, give me my liberty ... he offered it ... he offered to show me the mysterious road ... Only ... only he rose too ... and I was made to remember that, though he was not an angel, nor a ghost, nor a genius, he remained the voice ... for he sang. And I listened ... and stayed! ... That night, we did not exchange another word. He sang me to sleep.\n\n\"When I woke up, I was alone, lying on a sofa in a simply furnished little bedroom, with an ordinary mahogany bedstead, lit by a lamp standing on the marble top of an old Louis-Philippe chest of drawers. I soon discovered that I was a prisoner and that the only outlet from my room led to a very comfortable bath-room. On returning to the bedroom, I saw on the chest of drawers a note, in red ink, which said, 'My dear Christine, you need have no concern as to your fate. You have no better nor more respectful friend in the world than myself. You are alone, at present, in this home which is yours. I am going out shopping to fetch you all the things that you can need.' I felt sure that I had fallen into the hands of a madman. I ran round my little apartment, looking for a way of escape which I could not find. I upbraided myself for my absurd superstition, which had caused me to fall into the trap. I felt inclined to laugh and to cry at the same time.\n\n\"This was the state of mind in which Erik found me. After giving three taps on the wall, he walked in quietly through a door which I had not noticed and which he left open. He had his arms full of boxes and parcels and arranged them on the bed, in a leisurely fashion, while I overwhelmed him with abuse and called upon him to take off his mask, if it covered the face of an honest man. He replied serenely, 'You shall never see Erik's face.' And he reproached me with not having finished dressing at that time of day: he was good enough to tell me that it was two o'clock in the afternoon. He said he would give me half an hour and, while he spoke, wound up my watch and set it for me. After which, he asked me to come to the dining-room, where a nice lunch was waiting for us.\n\n\"I was very angry, slammed the door in his face and went to the bath-room ... When I came out again, feeling greatly refreshed, Erik said that he loved me, but that he would never tell me so except when I allowed him and that the rest of the time would be devoted to music. 'What do you mean by the rest of the time?' I asked. 'Five days,' he said, with decision. I asked him if I should then be free and he said, 'You will be free, Christine, for, when those five days are past, you will have learned not to see me; and then, from time to time, you will come to see your poor Erik!' He pointed to a chair opposite him, at a small table, and I sat down, feeling greatly perturbed. However, I ate a few prawns and the wing of a chicken and drank half a glass of tokay, which he had himself, he told me, brought from the Konigsberg cellars. Erik did not eat or drink. I asked him what his nationality was and if that name of Erik did not point to his Scandinavian origin. He said that he had no name and no country and that he had taken the name of Erik by accident.\n\n\"After lunch, he rose and gave me the tips of his fingers, saying he would like to show me over his flat; but I snatched away my hand and gave a cry. What I had touched was cold and, at the same time, bony; and I remembered that his hands smelt of death. 'Oh, forgive me!' he moaned. And he opened a door before me. 'This is my bedroom, if you care to see it. It is rather curious.' His manners, his words, his attitude gave me confidence and I went in without hesitation. I felt as if I were entering the room of a dead person. The walls were all hung with black, but, instead of the white trimmings that usually set off that funereal upholstery, there was an enormous stave of music with the notes of the DIES IRAE, many times repeated. In the middle of the room was a canopy, from which hung curtains of red brocaded stuff, and, under the canopy, an open coffin. 'That is where I sleep,' said Erik. 'One has to get used to everything in life, even to eternity.' The sight upset me so much that I turned away my head.\n\n\"Then I saw the keyboard of an organ which filled one whole side of the walls. On the desk was a music-book covered with red notes. I asked leave to look at it and read, 'Don Juan Triumphant.' 'Yes,' he said, 'I compose sometimes.' I began that work twenty years ago. When I have finished, I shall take it away with me in that coffin and never wake up again.' 'You must work at it as seldom as you can,' I said. He replied, 'I sometimes work at it for fourteen days and nights together, during which I live on music only, and then I rest for years at a time.' 'Will you play me something out of your Don Juan Triumphant?' I asked, thinking to please him. 'You must never ask me that,' he said, in a gloomy voice. 'I will play you Mozart, if you like, which will only make you weep; but my Don Juan, Christine, burns; and yet he is not struck by fire from Heaven.' Thereupon we returned to the drawing-room. I noticed that there was no mirror in the whole apartment. I was going to remark upon this, but Erik had already sat down to the piano. He said, 'You see, Christine, there is some music that is so terrible that it consumes all those who approach it. Fortunately, you have not come to that music yet, for you would lose all your pretty coloring and nobody would know you when you returned to Paris. Let us sing something from the Opera, Christine Daae.' He spoke these last words as though he were flinging an insult at me.\"\n\n\"What did you do?\"\n\n\"I had no time to think about the meaning he put into his words. We at once began the duet in Othello and already the catastrophe was upon us. I sang Desdemona with a despair, a terror which I had never displayed before. As for him, his voice thundered forth his revengeful soul at every note. Love, jealousy, hatred, burst out around us in harrowing cries. Erik's black mask made me think of the natural mask of the Moor of Venice. He was Othello himself. Suddenly, I felt a need to see beneath the mask. I wanted to know the FACE of the voice, and, with a movement which I was utterly unable to control, swiftly my fingers tore away the mask. Oh, horror, horror, horror!\"\n\nChristine stopped, at the thought of the vision that had scared her, while the echoes of the night, which had repeated the name of Erik, now thrice moaned the cry:\n\n\"Horror! ... Horror! ... Horror!\"\n\nRaoul and Christine, clasping each other closely, raised their eyes to the stars that shone in a clear and peaceful sky. Raoul said:\n\n\"Strange, Christine, that this calm, soft night should be so full of plaintive sounds. One would think that it was sorrowing with us.\"\n\n\"When you know the secret, Raoul, your ears, like mine, will be full of lamentations.\"\n\nShe took Raoul's protecting hands in hers and, with a long shiver, continued:\n\n\"Yes, if I lived to be a hundred, I should always hear the superhuman cry of grief and rage which he uttered when the terrible sight appeared before my eyes ... Raoul, you have seen death's heads, when they have been dried and withered by the centuries, and, perhaps, if you were not the victim of a nightmare, you saw HIS death's head at Perros. And then you saw Red Death stalking about at the last masked ball. But all those death's heads were motionless and their dumb horror was not alive. But imagine, if you can, Red Death's mask suddenly coming to life in order to express, with the four black holes of its eyes, its nose, and its mouth, the extreme anger, the mighty fury of a demon; AND NOT A RAY OF LIGHT FROM THE SOCKETS, for, as I learned later, you can not see his blazing eyes except in the dark.\n\n\"I fell back against the wall and he came up to me, grinding his teeth, and, as I fell upon my knees, he hissed mad, incoherent words and curses at me. Leaning over me, he cried, 'Look! You want to see! See! Feast your eyes, glut your soul on my cursed ugliness! Look at Erik's face! Now you know the face of the voice! You were not content to hear me, eh? You wanted to know what I looked like! Oh, you women are so inquisitive! Well, are you satisfied? I'm a very good-looking fellow, eh? ... When a woman has seen me, as you have, she belongs to me. She loves me for ever. I am a kind of Don Juan, you know!' And, drawing himself up to his full height, with his hand on his hip, wagging the hideous thing that was his head on his shoulders, he roared, 'Look at me! I AM DON JUAN TRIUMPHANT!' And, when I turned away my head and begged for mercy, he drew it to him, brutally, twisting his dead fingers into my hair.\"\n\n\"Enough! Enough!\" cried Raoul. \"I will kill him. In Heaven's name, Christine, tell me where the dining-room on the lake is! I must kill him!\"\n\n\"Oh, be quiet, Raoul, if you want to know!\"\n\n\"Yes, I want to know how and why you went back; I must know! ... But, in any case, I will kill him!\"\n\n\"Oh, Raoul, listen, listen! ... He dragged me by my hair and then ... and then ... Oh, it is too horrible!\"\n\n\"Well, what? Out with it!\" exclaimed Raoul fiercely. \"Out with it, quick!\"\n\n\"Then he hissed at me. 'Ah, I frighten you, do I? ... I dare say! ... Perhaps you think that I have another mask, eh, and that this ... this ... my head is a mask? Well,' he roared, 'tear it off as you did the other! Come! Come along! I insist! Your hands! Your hands! Give me your hands!' And he seized my hands and dug them into his awful face. He tore his flesh with my nails, tore his terrible dead flesh with my nails! ... 'Know,' he shouted, while his throat throbbed and panted like a furnace, 'know that I am built up of death from head to foot and that it is a corpse that loves you and adores you and will never, never leave you! ... Look, I am not laughing now, I am crying, crying for you, Christine, who have torn off my mask and who therefore can never leave me again! ... As long as you thought me handsome, you could have come back, I know you would have come back ... but, now that you know my hideousness, you would run away for good... So I shall keep you here! ... Why did you want to see me? Oh, mad Christine, who wanted to see me! ... When my own father never saw me and when my mother, so as not to see me, made me a present of my first mask!'\n\n\"He had let go of me at last and was dragging himself about on the floor, uttering terrible sobs. And then he crawled away like a snake, went into his room, closed the door and left me alone to my reflections. Presently I heard the sound of the organ; and then I began to understand Erik's contemptuous phrase when he spoke about Opera music. What I now heard was utterly different from what I had heard up to then. His Don Juan Triumphant (for I had not a doubt but that he had rushed to his masterpiece to forget the horror of the moment) seemed to me at first one long, awful, magnificent sob. But, little by little, it expressed every emotion, every suffering of which mankind is capable. It intoxicated me; and I opened the door that separated us. Erik rose, as I entered, BUT DARED NOT TURN IN MY DIRECTION. 'Erik,' I cried, 'show me your face without fear! I swear that you are the most unhappy and sublime of men; and, if ever again I shiver when I look at you, it will be because I am thinking of the splendor of your genius!' Then Erik turned round, for he believed me, and I also had faith in myself. He fell at my feet, with words of love ... with words of love in his dead mouth ... and the music had ceased ... He kissed the hem of my dress and did not see that I closed my eyes.\n\n\"What more can I tell you, dear? You now know the tragedy. It went on for a fortnight—a fortnight during which I lied to him. My lies were as hideous as the monster who inspired them; but they were the price of my liberty. I burned his mask; and I managed so well that, even when he was not singing, he tried to catch my eye, like a dog sitting by its master. He was my faithful slave and paid me endless little attentions. Gradually, I gave him such confidence that he ventured to take me walking on the banks of the lake and to row me in the boat on its leaden waters; toward the end of my captivity he let me out through the gates that closed the underground passages in the Rue Scribe. Here a carriage awaited us and took us to the Bois. The night when we met you was nearly fatal to me, for he is terribly jealous of you and I had to tell him that you were soon going away ... Then, at last, after a fortnight of that horrible captivity, during which I was filled with pity, enthusiasm, despair and horror by turns, he believed me when I said, 'I WILL COME BACK!'\"\n\n\"And you went back, Christine,\" groaned Raoul.\n\n\"Yes, dear, and I must tell you that it was not his frightful threats when setting me free that helped me to keep my word, but the harrowing sob which he gave on the threshold of the tomb. ... That sob attached me to the unfortunate man more than I myself suspected when saying good-by to him. Poor Erik! Poor Erik!\"\n\n\"Christine,\" said Raoul, rising, \"you tell me that you love me; but you had recovered your liberty hardly a few hours before you returned to Erik! Remember the masked ball!\"\n\n\"Yes; and do you remember those hours which I passed with you, Raoul ... to the great danger of both of us?\"\n\n\"I doubted your love for me, during those hours.\"\n\n\"Do you doubt it still, Raoul? ... Then know that each of my visits to Erik increased my horror of him; for each of those visits, instead of calming him, as I hoped, made him mad with love! And I am so frightened, so frightened! ...\"\n\n\"You are frightened ... but do you love me? If Erik were good-looking, would you love me, Christine?\"\n\nShe rose in her turn, put her two trembling arms round the young man's neck and said:\n\n\"Oh, my betrothed of a day, if I did not love you, I would not give you my lips! Take them, for the first time and the last.\"\n\nHe kissed her lips; but the night that surrounded them was rent asunder, they fled as at the approach of a storm and their eyes, filled with dread of Erik, showed them, before they disappeared, high up above them, an immense night-bird that stared at them with its blazing eyes and seemed to cling to the string of Apollo's lyre.\n\n\n\n\nChapter XIII A Master-Stroke of the Trap-Door Lover\n\nRaoul and Christine ran, eager to escape from the roof and the blazing eyes that showed only in the dark; and they did not stop before they came to the eighth floor on the way down.\n\nThere was no performance at the Opera that night and the passages were empty. Suddenly, a queer-looking form stood before them and blocked the road:\n\n\"No, not this way!\"\n\nAnd the form pointed to another passage by which they were to reach the wings. Raoul wanted to stop and ask for an explanation. But the form, which wore a sort of long frock-coat and a pointed cap, said:\n\n\"Quick! Go away quickly!\"\n\nChristine was already dragging Raoul, compelling him to start running again.\n\n\"But who is he? Who is that man?\" he asked.\n\nChristine replied: \"It's the Persian.\"\n\n\"What's he doing here?\"\n\n\"Nobody knows. He is always in the Opera.\"\n\n\"You are making me run away, for the first time in my life. If we really saw Erik, what I ought to have done was to nail him to Apollo's lyre, just as we nail the owls to the walls of our Breton farms; and there would have been no more question of him.\"\n\n\"My dear Raoul, you would first have had to climb up to Apollo's lyre: that is no easy matter.\"\n\n\"The blazing eyes were there!\"\n\n\"Oh, you are getting like me now, seeing him everywhere! What I took for blazing eyes was probably a couple of stars shining through the strings of the lyre.\"\n\nAnd Christine went down another floor, with Raoul following her.\n\n\"As you have quite made up your mind to go, Christine, I assure you it would be better to go at once. Why wait for to-morrow? He may have heard us to-night.\"\n\n\"No, no, he is working, I tell you, at his Don Juan Triumphant and not thinking of us.\"\n\n\"You're so sure of that you keep on looking behind you!\"\n\n\"Come to my dressing-room.\"\n\n\"Hadn't we better meet outside the Opera?\"\n\n\"Never, till we go away for good! It would bring us bad luck, if I did not keep my word. I promised him to see you only here.\"\n\n\"It's a good thing for me that he allowed you even that. Do you know,\" said Raoul bitterly, \"that it was very plucky of you to let us play at being engaged?\"\n\n\"Why, my dear, he knows all about it! He said, 'I trust you, Christine. M. de Chagny is in love with you and is going abroad. Before he goes, I want him to be as happy as I am.' Are people so unhappy when they love?\"\n\n\"Yes, Christine, when they love and are not sure of being loved.\"\n\nThey came to Christine's dressing-room.\n\n\"Why do you think that you are safer in this room than on the stage?\" asked Raoul. \"You heard him through the walls here, therefore he can certainly hear us.\"\n\n\"No. He gave me his word not to be behind the walls of my dressing-room again and I believe Erik's word. This room and my bedroom on the lake are for me, exclusively, and not to be approached by him.\"\n\n\"How can you have gone from this room into that dark passage, Christine? Suppose we try to repeat your movements; shall we?\"\n\n\"It is dangerous, dear, for the glass might carry me off again; and, instead of running away, I should be obliged to go to the end of the secret passage to the lake and there call Erik.\"\n\n\"Would he hear you?\"\n\n\"Erik will hear me wherever I call him. He told me so. He is a very curious genius. You must not think, Raoul, that he is simply a man who amuses himself by living underground. He does things that no other man could do; he knows things which nobody in the world knows.\"\n\n\"Take care, Christine, you are making a ghost of him again!\"\n\n\"No, he is not a ghost; he is a man of Heaven and earth, that is all.\"\n\n\"A man of Heaven and earth ... that is all! ... A nice way to speak of him! ... And are you still resolved to run away from him?\"\n\n\"Yes, to-morrow.\"\n\n\"To-morrow, you will have no resolve left!\"\n\n\"Then, Raoul, you must run away with me in spite of myself; is that understood?\"\n\n\"I shall be here at twelve to-morrow night; I shall keep my promise, whatever happens. You say that, after listening to the performance, he is to wait for you in the dining-room on the lake?\"\n\n\"Yes.\"\n\n\"And how are you to reach him, if you don't know how to go out by the glass?\"\n\n\"Why, by going straight to the edge of the lake.\"\n\nChristine opened a box, took out an enormous key and showed it to Raoul.\n\n\"What's that?\" he asked.\n\n\"The key of the gate to the underground passage in the Rue Scribe.\"\n\n\"I understand, Christine. It leads straight to the lake. Give it to me, Christine, will you?\"\n\n\"Never!\" she said. \"That would be treacherous!\"\n\nSuddenly Christine changed color. A mortal pallor overspread her features.\n\n\"Oh heavens!\" she cried. \"Erik! Erik! Have pity on me!\"\n\n\"Hold your tongue!\" said Raoul. \"You told me he could hear you!\"\n\nBut the singer's attitude became more and more inexplicable. She wrung her fingers, repeating, with a distraught air:\n\n\"Oh, Heaven! Oh, Heaven!\"\n\n\"But what is it? What is it?\" Raoul implored.\n\n\"The ring ... the gold ring he gave me.\"\n\n\"Oh, so Erik gave you that ring!\"\n\n\"You know he did, Raoul! But what you don't know is that, when he gave it to me, he said, 'I give you back your liberty, Christine, on condition that this ring is always on your finger. As long as you keep it, you will be protected against all danger and Erik will remain your friend. But woe to you if you ever part with it, for Erik will have his revenge!' ... My dear, my dear, the ring is gone! ... Woe to us both!\"\n\nThey both looked for the ring, but could not find it. Christine refused to be pacified.\n\n\"It was while I gave you that kiss, up above, under Apollo's lyre,\" she said. \"The ring must have slipped from my finger and dropped into the street! We can never find it. And what misfortunes are in store for us now! Oh, to run away!\"\n\n\"Let us run away at once,\" Raoul insisted, once more.\n\nShe hesitated. He thought that she was going to say yes... Then her bright pupils became dimmed and she said:\n\n\"No! To-morrow!\"\n\nAnd she left him hurriedly, still wringing and rubbing her fingers, as though she hoped to bring the ring back like that.\n\nRaoul went home, greatly perturbed at all that he had heard.\n\n[Illustration: They Sat Like that for a Moment in Silence]\n\n\"If I don't save her from the hands of that humbug,\" he said, aloud, as he went to bed, \"she is lost. But I shall save her.\"\n\nHe put out his lamp and felt a need to insult Erik in the dark. Thrice over, he shouted:\n\n\"Humbug! ... Humbug! ... Humbug!\"\n\nBut, suddenly, he raised himself on his elbow. A cold sweat poured from his temples. Two eyes, like blazing coals, had appeared at the foot of his bed. They stared at him fixedly, terribly, in the darkness of the night.\n\nRaoul was no coward; and yet he trembled. He put out a groping, hesitating hand toward the table by his bedside. He found the matches and lit his candle. The eyes disappeared.\n\nStill uneasy in his mind, he thought to himself:\n\n\"She told me that HIS eyes only showed in the dark. His eyes have disappeared in the light, but HE may be there still.\"\n\nAnd he rose, hunted about, went round the room. He looked under his bed, like a child. Then he thought himself absurd, got into bed again and blew out the candle. The eyes reappeared.\n\nHe sat up and stared back at them with all the courage he possessed. Then he cried:\n\n\"Is that you, Erik? Man, genius, or ghost, is it you?\"\n\nHe reflected: \"If it's he, he's on the balcony!\"\n\nThen he ran to the chest of drawers and groped for his revolver. He opened the balcony window, looked out, saw nothing and closed the window again. He went back to bed, shivering, for the night was cold, and put the revolver on the table within his reach.\n\nThe eyes were still there, at the foot of the bed. Were they between the bed and the window-pane or behind the pane, that is to say, on the balcony? That was what Raoul wanted to know. He also wanted to know if those eyes belonged to a human being... He wanted to know everything. Then, patiently, calmly, he seized his revolver and took aim. He aimed a little above the two eyes. Surely, if they were eyes and if above those two eyes there was a forehead and if Raoul was not too clumsy ...\n\nThe shot made a terrible din amid the silence of the slumbering house. And, while footsteps came hurrying along the passages, Raoul sat up with outstretched arm, ready to fire again, if need be.\n\nThis time, the two eyes had disappeared.\n\nServants appeared, carrying lights; Count Philippe, terribly anxious:\n\n\"What is it?\"\n\n\"I think I have been dreaming,\" replied the young man. \"I fired at two stars that kept me from sleeping.\"\n\n\"You're raving! Are you ill? For God's sake, tell me, Raoul: what happened?\"\n\nAnd the count seized hold of the revolver.\n\n\"No, no, I'm not raving... Besides, we shall soon see ...\"\n\nHe got out of bed, put on a dressing-gown and slippers, took a light from the hands of a servant and, opening the window, stepped out on the balcony.\n\nThe count saw that the window had been pierced by a bullet at a man's height. Raoul was leaning over the balcony with his candle: \"Aha!\" he said. \"Blood! ... Blood! ... Here, there, more blood! ... That's a good thing! A ghost who bleeds is less dangerous!\" he grinned.\n\n\"Raoul! Raoul! Raoul!\"\n\nThe count was shaking him as though he were trying to waken a sleep-walker.\n\n\"But, my dear brother, I'm not asleep!\" Raoul protested impatiently. \"You can see the blood for yourself. I thought I had been dreaming and firing at two stars. It was Erik's eyes ... and here is his blood! ... After all, perhaps I was wrong to shoot; and Christine is quite capable of never forgiving me ... All this would not have happened if I had drawn the curtains before going to bed.\"\n\n\"Raoul, have you suddenly gone mad? Wake up!\"\n\n\"What, still? You would do better to help me find Erik ... for, after all, a ghost who bleeds can always be found.\"\n\nThe count's valet said:\n\n\"That is so, sir; there is blood on the balcony.\"\n\nThe other man-servant brought a lamp, by the light of which they examined the balcony carefully. The marks of blood followed the rail till they reached a gutter-spout; then they went up the gutter-spout.\n\n\"My dear fellow,\" said Count Philippe, \"you have fired at a cat.\"\n\n\"The misfortune is,\" said Raoul, with a grin, \"that it's quite possible. With Erik, you never know. Is it Erik? Is it the cat? Is it the ghost? No, with Erik, you can't tell!\"\n\nRaoul went on making this strange sort of remarks which corresponded so intimately and logically with the preoccupation of his brain and which, at the same time, tended to persuade many people that his mind was unhinged. The count himself was seized with this idea; and, later, the examining magistrate, on receiving the report of the commissary of police, came to the same conclusion.\n\n\"Who is Erik?\" asked the count, pressing his brother's hand.\n\n\"He is my rival. And, if he's not dead, it's a pity.\"\n\nHe dismissed the servants with a wave of the hand and the two Chagnys were left alone. But the men were not out of earshot before the count's valet heard Raoul say, distinctly and emphatically:\n\n\"I shall carry off Christine Daae to-night.\"\n\nThis phrase was afterward repeated to M. Faure, the examining-magistrate. But no one ever knew exactly what passed between the two brothers at this interview. The servants declared that this was not their first quarrel. Their voices penetrated the wall; and it was always an actress called Christine Daae that was in question.\n\nAt breakfast—the early morning breakfast, which the count took in his study—Philippe sent for his brother. Raoul arrived silent and gloomy. The scene was a very short one. Philippe handed his brother a copy of the Epoque and said:\n\n\"Read that!\"\n\nThe viscount read:\n\n\"The latest news in the Faubourg is that there is a promise of marriage between Mlle. Christine Daae, the opera-singer, and M. le Vicomte Raoul de Chagny. If the gossips are to be credited, Count Philippe has sworn that, for the first time on record, the Chagnys shall not keep their promise. But, as love is all-powerful, at the Opera as—and even more than—elsewhere, we wonder how Count Philippe intends to prevent the viscount, his brother, from leading the new Margarita to the altar. The two brothers are said to adore each other; but the count is curiously mistaken if he imagines that brotherly love will triumph over love pure and simple.\"\n\n\"You see, Raoul,\" said the count, \"you are making us ridiculous! That little girl has turned your head with her ghost-stories.\"\n\nThe viscount had evidently repeated Christine's narrative to his brother, during the night. All that he now said was:\n\n\"Good-by, Philippe.\"\n\n\"Have you quite made up your mind? You are going to-night? With her?\"\n\nNo reply.\n\n\"Surely you will not do anything so foolish? I SHALL know how to prevent you!\"\n\n\"Good-by, Philippe,\" said the viscount again and left the room.\n\nThis scene was described to the examining-magistrate by the count himself, who did not see Raoul again until that evening, at the Opera, a few minutes before Christine's disappearance.\n\nRaoul, in fact, devoted the whole day to his preparations for the flight. The horses, the carriage, the coachman, the provisions, the luggage, the money required for the journey, the road to be taken (he had resolved not to go by train, so as to throw the ghost off the scent): all this had to be settled and provided for; and it occupied him until nine o'clock at night.\n\nAt nine o'clock, a sort of traveling-barouche with the curtains of its windows close-down, took its place in the rank on the Rotunda side. It was drawn by two powerful horses driven by a coachman whose face was almost concealed in the long folds of a muffler. In front of this traveling-carriage were three broughams, belonging respectively to Carlotta, who had suddenly returned to Paris, to Sorelli and, at the head of the rank, to Comte Philippe de Chagny. No one left the barouche. The coachman remained on his box, and the three other coachmen remained on theirs.\n\nA shadow in a long black cloak and a soft black felt hat passed along the pavement between the Rotunda and the carriages, examined the barouche carefully, went up to the horses and the coachman and then moved away without saying a word, The magistrate afterward believed that this shadow was that of the Vicomte Raoul de Chagny; but I do not agree, seeing that that evening, as every evening, the Vicomte de Chagny was wearing a tall hat, which hat, besides, was subsequently found. I am more inclined to think that the shadow was that of the ghost, who knew all about the whole affair, as the reader will soon perceive.\n\nThey were giving FAUST, as it happened, before a splendid house. The Faubourg was magnificently represented; and the paragraph in that morning's EPOQUE had already produced its effect, for all eyes were turned to the box in which Count Philippe sat alone, apparently in a very indifferent and careless frame of mind. The feminine element in the brilliant audience seemed curiously puzzled; and the viscount's absence gave rise to any amount of whispering behind the fans. Christine Daae met with a rather cold reception. That special audience could not forgive her for aiming so high.\n\nThe singer noticed this unfavorable attitude of a portion of the house and was confused by it.\n\nThe regular frequenters of the Opera, who pretended to know the truth about the viscount's love-story, exchanged significant smiles at certain passages in Margarita's part; and they made a show of turning and looking at Philippe de Chagny's box when Christine sang:\n\n\"I wish I could but know who was he\nThat addressed me,\nIf he was noble, or, at least, what his name is.\"\nThe count sat with his chin on his hand and seemed to pay no attention to these manifestations. He kept his eyes fixed on the stage; but his thoughts appeared to be far away.\n\nChristine lost her self-assurance more and more. She trembled. She felt on the verge of a breakdown ... Carolus Fonta wondered if she was ill, if she could keep the stage until the end of the Garden Act. In the front of the house, people remembered the catastrophe that had befallen Carlotta at the end of that act and the historic \"co-ack\" which had momentarily interrupted her career in Paris.\n\nJust then, Carlotta made her entrance in a box facing the stage, a sensational entrance. Poor Christine raised her eyes upon this fresh subject of excitement. She recognized her rival. She thought she saw a sneer on her lips. That saved her. She forgot everything, in order to triumph once more.\n\nFrom that moment the prima donna sang with all her heart and soul. She tried to surpass all that she had done till then; and she succeeded. In the last act when she began the invocation to the angels, she made all the members of the audience feel as though they too had wings.\n\nIn the center of the amphitheater a man stood up and remained standing, facing the singer. It was Raoul.\n\n\"Holy angel, in Heaven blessed ...\"\n\nAnd Christine, her arms outstretched, her throat filled with music, the glory of her hair falling over her bare shoulders, uttered the divine cry:\n\n\"My spirit longs with thee to rest!\"\n\nIt was at that moment that the stage was suddenly plunged in darkness. It happened so quickly that the spectators hardly had time to utter a sound of stupefaction, for the gas at once lit up the stage again. But Christine Daae was no longer there!\n\nWhat had become of her? What was that miracle? All exchanged glances without understanding, and the excitement at once reached its height. Nor was the tension any less great on the stage itself. Men rushed from the wings to the spot where Christine had been singing that very instant. The performance was interrupted amid the greatest disorder.\n\nWhere had Christine gone? What witchcraft had snatched her, away before the eyes of thousands of enthusiastic onlookers and from the arms of Carolus Fonta himself? It was as though the angels had really carried her up \"to rest.\"\n\nRaoul, still standing up in the amphitheater, had uttered a cry. Count Philippe had sprung to his feet in his box. People looked at the stage, at the count, at Raoul, and wondered if this curious event was connected in any way with the paragraph in that morning's paper. But Raoul hurriedly left his seat, the count disappeared from his box and, while the curtain was lowered, the subscribers rushed to the door that led behind the scenes. The rest of the audience waited amid an indescribable hubbub. Every one spoke at once. Every one tried to suggest an explanation of the extraordinary incident.\n\nAt last, the curtain rose slowly and Carolus Fonta stepped to the conductor's desk and, in a sad and serious voice, said:\n\n\"Ladies and gentlemen, an unprecedented event has taken place and thrown us into a state of the greatest alarm. Our sister-artist, Christine Daae, has disappeared before our eyes and nobody can tell us how!\"\n\n\n\n\nChapter XIV The Singular Attitude of a Safety-Pin\n\nBehind the curtain, there was an indescribable crowd. Artists, scene-shifters, dancers, supers, choristers, subscribers were all asking questions, shouting and hustling one another.\n\n\"What became of her?\"\n\n\"She's run away.\"\n\n\"With the Vicomte de Chagny, of course!\"\n\n\"No, with the count!\"\n\n\"Ah, here's Carlotta! Carlotta did the trick!\"\n\n\"No, it was the ghost!\" And a few laughed, especially as a careful examination of the trap-doors and boards had put the idea of an accident out of the question.\n\nAmid this noisy throng, three men stood talking in a low voice and with despairing gestures. They were Gabriel, the chorus-master; Mercier, the acting-manager; and Remy, the secretary. They retired to a corner of the lobby by which the stage communicates with the wide passage leading to the foyer of the ballet. Here they stood and argued behind some enormous \"properties.\"\n\n\"I knocked at the door,\" said Remy. \"They did not answer. Perhaps they are not in the office. In any case, it's impossible to find out, for they took the keys with them.\"\n\n\"They\" were obviously the managers, who had given orders, during the last entr'acte, that they were not to be disturbed on any pretext whatever. They were not in to anybody.\n\n\"All the same,\" exclaimed Gabriel, \"a singer isn't run away with, from the middle of the stage, every day!\"\n\n\"Did you shout that to them?\" asked Mercier, impatiently.\n\n\"I'll go back again,\" said Remy, and disappeared at a run.\n\nThereupon the stage-manager arrived.\n\n\"Well, M. Mercier, are you coming? What are you two doing here? You're wanted, Mr. Acting-Manager.\"\n\n\"I refuse to know or to do anything before the commissary arrives,\" declared Mercier. \"I have sent for Mifroid. We shall see when he comes!\"\n\n\"And I tell you that you ought to go down to the organ at once.\"\n\n\"Not before the commissary comes.\"\n\n\"I've been down to the organ myself already.\"\n\n\"Ah! And what did you see?\"\n\n\"Well, I saw nobody! Do you hear—nobody!\"\n\n\"What do you want me to do down there for{sic}?\"\n\n\"You're right!\" said the stage-manager, frantically pushing his hands through his rebellious hair. \"You're right! But there might be some one at the organ who could tell us how the stage came to be suddenly darkened. Now Mauclair is nowhere to be found. Do you understand that?\"\n\nMauclair was the gas-man, who dispensed day and night at will on the stage of the Opera.\n\n\"Mauclair is not to be found!\" repeated Mercier, taken aback. \"Well, what about his assistants?\"\n\n\"There's no Mauclair and no assistants! No one at the lights, I tell you! You can imagine,\" roared the stage-manager, \"that that little girl must have been carried off by somebody else: she didn't run away by herself! It was a calculated stroke and we have to find out about it ... And what are the managers doing all this time? ... I gave orders that no one was to go down to the lights and I posted a fireman in front of the gas-man's box beside the organ. Wasn't that right?\"\n\n\"Yes, yes, quite right, quite right. And now let's wait for the commissary.\"\n\nThe stage-manager walked away, shrugging his shoulders, fuming, muttering insults at those milksops who remained quietly squatting in a corner while the whole theater was topsyturvy{sic}.\n\nGabriel and Mercier were not so quiet as all that. Only they had received an order that paralyzed them. The managers were not to be disturbed on any account. Remy had violated that order and met with no success.\n\nAt that moment he returned from his new expedition, wearing a curiously startled air.\n\n\"Well, have you seen them?\" asked Mercier.\n\n\"Moncharmin opened the door at last. His eyes were starting out of his head. I thought he meant to strike me. I could not get a word in; and what do you think he shouted at me? 'Have you a safety-pin?' 'No!' 'Well, then, clear out!' I tried to tell him that an unheard-of thing had happened on the stage, but he roared, 'A safety-pin! Give me a safety-pin at once!' A boy heard him—he was bellowing like a bull—ran up with a safety-pin and gave it to him; whereupon Moncharmin slammed the door in my face, and there you are!\"\n\n\"And couldn't you have said, 'Christine Daae.'\"\n\n\"I should like to have seen you in my place. He was foaming at the mouth. He thought of nothing but his safety-pin. I believe, if they hadn't brought him one on the spot, he would have fallen down in a fit! ... Oh, all this isn't natural; and our managers are going mad! ... Besides, it can't go on like this! I'm not used to being treated in that fashion!\"\n\nSuddenly Gabriel whispered:\n\n\"It's another trick of O. G.'s.\"\n\nRimy gave a grin, Mercier a sigh and seemed about to speak ... but, meeting Gabriel's eye, said nothing.\n\nHowever, Mercier felt his responsibility increased as the minutes passed without the managers' appearing; and, at last, he could stand it no longer.\n\n\"Look here, I'll go and hunt them out myself!\"\n\nGabriel, turning very gloomy and serious, stopped him.\n\n\"Be careful what you're doing, Mercier! If they're staying in their office, it's probably because they have to! O. G. has more than one trick in his bag!\"\n\nBut Mercier shook his head.\n\n\"That's their lookout! I'm going! If people had listened to me, the police would have known everything long ago!\"\n\nAnd he went.\n\n\"What's everything?\" asked Remy. \"What was there to tell the police? Why don't you answer, Gabriel? ... Ah, so you know something! Well, you would do better to tell me, too, if you don't want me to shout out that you are all going mad! ... Yes, that's what you are: mad!\"\n\nGabriel put on a stupid look and pretended not to understand the private secretary's unseemly outburst.\n\n\"What 'something' am I supposed to know?\" he said. \"I don't know what you mean.\"\n\nRemy began to lose his temper.\n\n\"This evening, Richard and Moncharmin were behaving like lunatics, here, between the acts.\"\n\n\"I never noticed it,\" growled Gabriel, very much annoyed.\n\n\"Then you're the only one! ... Do you think that I didn't see them? ... And that M. Parabise, the manager of the Credit Central, noticed nothing? ... And that M. de La Borderie, the ambassador, has no eyes to see with? ... Why, all the subscribers were pointing at our managers!\"\n\n\"But what were our managers doing?\" asked Gabriel, putting on his most innocent air.\n\n\"What were they doing? You know better than any one what they were doing! ... You were there! ... And you were watching them, you and Mercier! ... And you were the only two who didn't laugh.\"\n\n\"I don't understand!\"\n\nGabriel raised his arms and dropped them to his sides again, which gesture was meant to convey that the question did not interest him in the least. Remy continued:\n\n\"What is the sense of this new mania of theirs? WHY WON'T THEY HAVE ANY ONE COME NEAR THEM NOW?\"\n\n\"What? WON'T THEY HAVE ANY ONE COME NEAR THEM?\"\n\n\"AND THEY WON'T LET ANY ONE TOUCH THEM!\"\n\n\"Really? Have you noticed THAT THEY WON'T LET ANY ONE TOUCH THEM? That is certainly odd!\"\n\n\"Oh, so you admit it! And high time, too! And THEN, THEY WALK BACKWARD!\"\n\n\"BACKWARD! You have seen our managers WALK BACKWARD? Why, I thought that only crabs walked backward!\"\n\n\"Don't laugh, Gabriel; don't laugh!\"\n\n\"I'm not laughing,\" protested Gabriel, looking as solemn as a judge.\n\n\"Perhaps you can tell me this, Gabriel, as you're an intimate friend of the management: When I went up to M. Richard, outside the foyer, during the Garden interval, with my hand out before me, why did M. Moncharmin hurriedly whisper to me, 'Go away! Go away! Whatever you do, don't touch M. le Directeur!' Am I supposed to have an infectious disease?\"\n\n\"It's incredible!\"\n\n\"And, a little later, when M. de La Borderie went up to M. Richard, didn't you see M. Moncharmin fling himself between them and hear him exclaim, 'M. l'Ambassadeur I entreat you not to touch M. le Directeur'?\"\n\n\"It's terrible! ... And what was Richard doing meanwhile?\"\n\n\"What was he doing? Why, you saw him! He turned about, BOWED IN FRONT OF HIM, THOUGH THERE WAS NOBODY IN FRONT OF HIM, AND WITHDREW BACKWARD.\"\n\n\"BACKWARD?\"\n\n\"And Moncharmin, behind Richard, also turned about; that is, he described a semicircle behind Richard and also WALKED BACKWARD! ... And they went LIKE THAT to the staircase leading to the managers' office: BACKWARD, BACKWARD, BACKWARD! ... Well, if they are not mad, will you explain what it means?\"\n\n\"Perhaps they were practising a figure in the ballet,\" suggested Gabriel, without much conviction in his voice.\n\nThe secretary was furious at this wretched joke, made at so dramatic a moment. He knit his brows and contracted his lips. Then he put his mouth to Gabriel's ear:\n\n\"Don't be so sly, Gabriel. There are things going on for which you and Mercier are partly responsible.\"\n\n\"What do you mean?\" asked Gabriel.\n\n\"Christine Daae is not the only one who suddenly disappeared to-night.\"\n\n\"Oh, nonsense!\"\n\n\"There's no nonsense about it. Perhaps you can tell me why, when Mother Giry came down to the foyer just now, Mercier took her by the hand and hurried her away with him?\"\n\n\"Really?\" said Gabriel, \"I never saw it.\"\n\n\"You did see it, Gabriel, for you went with Mercier and Mother Giry to Mercier's office. Since then, you and Mercier have been seen, but no one has seen Mother Giry.\"\n\n\"Do you think we've eaten her?\"\n\n\"No, but you've locked her up in the office; and any one passing the office can hear her yelling, 'Oh, the scoundrels! Oh, the scoundrels!'\"\n\nAt this point of this singular conversation, Mercier arrived, all out of breath.\n\n\"There!\" he said, in a gloomy voice. \"It's worse than ever! ... I shouted, 'It's a serious matter! Open the door! It's I, Mercier.' I heard footsteps. The door opened and Moncharmin appeared. He was very pale. He said, 'What do you want?' I answered, 'Some one has run away with Christine Daae.' What do you think he said? 'And a good job, too!' And he shut the door, after putting this in my hand.\"\n\nMercier opened his hand; Remy and Gabriel looked.\n\n\"The safety-pin!\" cried Remy.\n\n\"Strange! Strange!\" muttered Gabriel, who could not help shivering.\n\nSuddenly a voice made them all three turn round.\n\n\"I beg your pardon, gentlemen. Could you tell me where Christine Daae is?\"\n\nIn spite of the seriousness of the circumstances, the absurdity of the question would have made them roar with laughter, if they had not caught sight of a face so sorrow-stricken that they were at once seized with pity. It was the Vicomte Raoul de Chagny.\n\n\n\n\nChapter XV Christine! Christine!\n\nRaoul's first thought, after Christine Daae's fantastic disappearance, was to accuse Erik. He no longer doubted the almost supernatural powers of the Angel of Music, in this domain of the Opera in which he had set up his empire. And Raoul rushed on the stage, in a mad fit of love and despair.\n\n\"Christine! Christine!\" he moaned, calling to her as he felt that she must be calling to him from the depths of that dark pit to which the monster had carried her. \"Christine! Christine!\"\n\nAnd he seemed to hear the girl's screams through the frail boards that separated him from her. He bent forward, he listened, ... he wandered over the stage like a madman. Ah, to descend, to descend into that pit of darkness every entrance to which was closed to him, ... for the stairs that led below the stage were forbidden to one and all that night!\n\n\"Christine! Christine! ...\"\n\nPeople pushed him aside, laughing. They made fun of him. They thought the poor lover's brain was gone!\n\nBy what mad road, through what passages of mystery and darkness known to him alone had Erik dragged that pure-souled child to the awful haunt, with the Louis-Philippe room, opening out on the lake?\n\n\"Christine! Christine! ... Why don't you answer? ... Are you alive? ...\"\n\nHideous thoughts flashed through Raoul's congested brain. Of course, Erik must have discovered their secret, must have known that Christine had played him false. What a vengeance would be his!\n\nAnd Raoul thought again of the yellow stars that had come, the night before, and roamed over his balcony. Why had he not put them out for good? There were some men's eyes that dilated in the darkness and shone like stars or like cats' eyes. Certainly Albinos, who seemed to have rabbits' eyes by day, had cats' eyes at night: everybody knew that! ... Yes, yes, he had undoubtedly fired at Erik. Why had he not killed him? The monster had fled up the gutter-spout like a cat or a convict who—everybody knew that also—would scale the very skies, with the help of a gutter-spout ... No doubt Erik was at that time contemplating some decisive step against Raoul, but he had been wounded and had escaped to turn against poor Christine instead.\n\nSuch were the cruel thoughts that haunted Raoul as he ran to the singer's dressing-room.\n\n\"Christine! Christine!\"\n\nBitter tears scorched the boy's eyelids as he saw scattered over the furniture the clothes which his beautiful bride was to have worn at the hour of their flight. Oh, why had she refused to leave earlier?\n\nWhy had she toyed with the threatening catastrophe? Why toyed with the monster's heart? Why, in a final access of pity, had she insisted on flinging, as a last sop to that demon's soul, her divine song:\n\n\"Holy angel, in Heaven blessed,\nMy spirit longs with thee to rest!\"\nRaoul, his throat filled with sobs, oaths and insults, fumbled awkwardly at the great mirror that had opened one night, before his eyes, to let Christine pass to the murky dwelling below. He pushed, pressed, groped about, but the glass apparently obeyed no one but Erik ... Perhaps actions were not enough with a glass of the kind? Perhaps he was expected to utter certain words? When he was a little boy, he had heard that there were things that obeyed the spoken word!\n\nSuddenly, Raoul remembered something about a gate opening into the Rue Scribe, an underground passage running straight to the Rue Scribe from the lake ... Yes, Christine had told him about that... And, when he found that the key was no longer in the box, he nevertheless ran to the Rue Scribe. Outside, in the street, he passed his trembling hands over the huge stones, felt for outlets ... met with iron bars ... were those they? ... Or these? ... Or could it be that air-hole? ... He plunged his useless eyes through the bars ... How dark it was in there! ... He listened ... All was silence! ... He went round the building ... and came to bigger bars, immense gates! ... It was the entrance to the Cour de l'Administration.\n\nRaoul rushed into the doorkeeper's lodge.\n\n\"I beg your pardon, madame, could you tell me where to find a gate or door, made of bars, iron bars, opening into the Rue Scribe ... and leading to the lake? ... You know the lake I mean? ... Yes, the underground lake ... under the Opera.\"\n\n\"Yes, sir, I know there is a lake under the Opera, but I don't know which door leads to it. I have never been there!\"\n\n\"And the Rue Scribe, madame, the Rue Scribe? Have you never been to the Rue Scribe?\"\n\nThe woman laughed, screamed with laughter! Raoul darted away, roaring with anger, ran up-stairs, four stairs at a time, down-stairs, rushed through the whole of the business side of the opera-house, found himself once more in the light of the stage.\n\nHe stopped, with his heart thumping in his chest: suppose Christine Daae had been found? He saw a group of men and asked:\n\n\"I beg your pardon, gentlemen. Could you tell me where Christine Daae is?\"\n\nAnd somebody laughed.\n\nAt the same moment the stage buzzed with a new sound and, amid a crowd of men in evening-dress, all talking and gesticulating together, appeared a man who seemed very calm and displayed a pleasant face, all pink and chubby-cheeked, crowned with curly hair and lit up by a pair of wonderfully serene blue eyes. Mercier, the acting-manager, called the Vicomte de Chagny's attention to him and said:\n\n\"This is the gentleman to whom you should put your question, monsieur. Let me introduce Mifroid, the commissary of police.\"\n\n\"Ah, M. le Vicomte de Chagny! Delighted to meet you, monsieur,\" said the commissary. \"Would you mind coming with me? ... And now where are the managers? ... Where are the managers?\"\n\nMercier did not answer, and Remy, the secretary, volunteered the information that the managers were locked up in their office and that they knew nothing as yet of what had happened.\n\n\"You don't mean to say so! Let us go up to the office!\"\n\nAnd M. Mifroid, followed by an ever-increasing crowd, turned toward the business side of the building. Mercier took advantage of the confusion to slip a key into Gabriel's hand:\n\n\"This is all going very badly,\" he whispered. \"You had better let Mother Giry out.\"\n\nAnd Gabriel moved away.\n\nThey soon came to the managers' door. Mercier stormed in vain: the door remained closed.\n\n\"Open in the name of the law!\" commanded M. Mifroid, in a loud and rather anxious voice.\n\nAt last the door was opened. All rushed in to the office, on the commissary's heels.\n\nRaoul was the last to enter. As he was about to follow the rest into the room, a hand was laid on his shoulder and he heard these words spoken in his ear:\n\n\"ERIK'S SECRETS CONCERN NO ONE BUT HIMSELF!\"\n\nHe turned around, with a stifled exclamation. The hand that was laid on his shoulder was now placed on the lips of a person with an ebony skin, with eyes of jade and with an astrakhan cap on his head: the Persian! The stranger kept up the gesture that recommended discretion and then, at the moment when the astonished viscount was about to ask the reason of his mysterious intervention, bowed and disappeared.\n\n\n\n\nChapter XVI Mme. Giry's Astounding Revelations\nas to Her Personal Relations with the Opera Ghost\n\nBefore following the commissary into the manager's office I must describe certain extraordinary occurrences that took place in that office which Remy and Mercier had vainly tried to enter and into which MM. Richard and Moncharmin had locked themselves with an object which the reader does not yet know, but which it is my duty, as an historian, to reveal without further postponement.\n\nI have had occasion to say that the managers' mood had undergone a disagreeable change for some time past and to convey the fact that this change was due not only to the fall of the chandelier on the famous night of the gala performance.\n\nThe reader must know that the ghost had calmly been paid his first twenty thousand francs. Oh, there had been wailing and gnashing of teeth, indeed! And yet the thing had happened as simply as could be.\n\nOne morning, the managers found on their table an envelope addressed to \"Monsieur O. G. (private)\" and accompanied by a note from O. G. himself:\n\nThe time has come to carry out the clause in the memorandum-book. Please put twenty notes of a thousand francs each into this envelope, seal it with your own seal and hand it to Mme. Giry, who will do what is necessary.\n\nThe managers did not hesitate; without wasting time in asking how these confounded communications came to be delivered in an office which they were careful to keep locked, they seized this opportunity of laying hands, on the mysterious blackmailer. And, after telling the whole story, under the promise of secrecy, to Gabriel and Mercier, they put the twenty thousand francs into the envelope and without asking for explanations, handed it to Mme. Giry, who had been reinstated in her functions. The box-keeper displayed no astonishment. I need hardly say that she was well watched. She went straight to the ghost's box and placed the precious envelope on the little shelf attached to the ledge. The two managers, as well as Gabriel and Mercier, were hidden in such a way that they did not lose sight of the envelope for a second during the performance and even afterward, for, as the envelope had not moved, those who watched it did not move either; and Mme. Giry went away while the managers, Gabriel and Mercier were still there. At last, they became tired of waiting and opened the envelope, after ascertaining that the seals had not been broken.\n\nAt first sight, Richard and Moncharmin thought that the notes were still there; but soon they perceived that they were not the same. The twenty real notes were gone and had been replaced by twenty notes, of the \"Bank of St. Farce\"![1]\n\nThe managers' rage and fright were unmistakable. Moncharmin wanted to send for the commissary of police, but Richard objected. He no doubt had a plan, for he said:\n\n\"Don't let us make ourselves ridiculous! All Paris would laugh at us. O. G. has won the first game: we will win the second.\"\n\nHe was thinking of the next month's allowance.\n\nNevertheless, they had been so absolutely tricked that they were bound to suffer a certain dejection. And, upon my word, it was not difficult to understand. We must not forget that the managers had an idea at the back of their minds, all the time, that this strange incident might be an unpleasant practical joke on the part of their predecessors and that it would not do to divulge it prematurely. On the other hand, Moncharmin was sometimes troubled with a suspicion of Richard himself, who occasionally took fanciful whims into his head. And so they were content to await events, while keeping an eye on Mother Giry. Richard would not have her spoken to.\n\n\"If she is a confederate,\" he said, \"the notes are gone long ago. But, in my opinion, she is merely an idiot.\"\n\n\"She's not the only idiot in this business,\" said Moncharmin pensively.\n\n\"Well, who could have thought it?\" moaned Richard. \"But don't be afraid ... next time, I shall have taken my precautions.\"\n\nThe next time fell on the same day that beheld the disappearance of Christine Daae. In the morning, a note from the ghost reminded them that the money was due. It read:\n\nDo just as you did last time. It went very well. Put the twenty thousand in the envelope and hand it to our excellent Mme. Giry.\n\nAnd the note was accompanied by the usual envelope. They had only to insert the notes.\n\nThis was done about half an hour before the curtain rose on the first act of Faust. Richard showed the envelope to Moncharmin. Then he counted the twenty thousand-franc notes in front of him and put the notes into the envelope, but without closing it.\n\n\"And now,\" he said, \"let's have Mother Giry in.\"\n\nThe old woman was sent for. She entered with a sweeping courtesy. She still wore her black taffeta dress, the color of which was rapidly turning to rust and lilac, to say nothing of the dingy bonnet. She seemed in a good temper. She at once said:\n\n\"Good evening, gentlemen! It's for the envelope, I suppose?\"\n\n\"Yes, Mme. Giry,\" said Richard, most amiably. \"For the envelope ... and something else besides.\"\n\n\"At your service, M. Richard, at your service. And what is the something else, please?\"\n\n\"First of all, Mme. Giry, I have a little question to put to you.\"\n\n\"By all means, M. Richard: Mme. Giry is here to answer you.\"\n\n\"Are you still on good terms with the ghost?\"\n\n\"Couldn't be better, sir; couldn't be better.\"\n\n\"Ah, we are delighted ... Look here, Mme. Giry,\" said Richard, in the tone of making an important confidence. \"We may just as well tell you, among ourselves ... you're no fool!\"\n\n\"Why, sir,\" exclaimed the box-keeper, stopping the pleasant nodding of the black feathers in her dingy bonnet, \"I assure you no one has ever doubted that!\"\n\n\"We are quite agreed and we shall soon understand one another. The story of the ghost is all humbug, isn't it? ... Well, still between ourselves, ... it has lasted long enough.\"\n\nMme. Giry looked at the managers as though they were talking Chinese. She walked up to Richard's table and asked, rather anxiously:\n\n\"What do you mean? I don't understand.\"\n\n\"Oh, you, understand quite well. In any case, you've got to understand... And, first of all, tell us his name.\"\n\n\"Whose name?\"\n\n\"The name of the man whose accomplice you are, Mme. Giry!\"\n\n\"I am the ghost's accomplice? I? ... His accomplice in what, pray?\"\n\n\"You do all he wants.\"\n\n\"Oh! He's not very troublesome, you know.\"\n\n\"And does he still tip you?\"\n\n\"I mustn't complain.\"\n\n\"How much does he give you for bringing him that envelope?\"\n\n\"Ten francs.\"\n\n\"You poor thing! That's not much, is it?\n\n\"Why?\"\n\n\"I'll tell you that presently, Mme. Giry. Just now we should like to know for what extraordinary reason you have given yourself body and soul, to this ghost ... Mme. Giry's friendship and devotion are not to be bought for five francs or ten francs.\"\n\n\"That's true enough ... And I can tell you the reason, sir. There's no disgrace about it... on the contrary.\"\n\n\"We're quite sure of that, Mme. Giry!\"\n\n\"Well, it's like this ... only the ghost doesn't like me to talk about his business.\"\n\n\"Indeed?\" sneered Richard.\n\n\"But this is a matter that concerns myself alone ... Well, it was in Box Five one evening, I found a letter addressed to myself, a sort of note written in red ink. I needn't read the letter to you sir; I know it by heart, and I shall never forget it if I live to be a hundred!\"\n\nAnd Mme. Giry, drawing herself up, recited the letter with touching eloquence:\n\nMADAM:\n\n1825. Mlle. Menetrier, leader of the ballet, became Marquise de Cussy.\n\n1832. Mlle. Marie Taglioni, a dancer, became Comtesse Gilbert des Voisins.\n\n1846. La Sota, a dancer, married a brother of the King of Spain.\n\n1847. Lola Montes, a dancer, became the morganatic wife of King Louis of Bavaria and was created Countess of Landsfeld.\n\n1848. Mlle. Maria, a dancer, became Baronne d'Herneville.\n\n1870. Theresa Hessier, a dancer, married Dom Fernando, brother to the King of Portugal.\n\nRichard and Moncharmin listened to the old woman, who, as she proceeded with the enumeration of these glorious nuptials, swelled out, took courage and, at last, in a voice bursting with pride, flung out the last sentence of the prophetic letter:\n\n1885. Meg Giry, Empress!\n\nExhausted by this supreme effort, the box-keeper fell into a chair, saying:\n\n\"Gentlemen, the letter was signed, 'Opera Ghost.' I had heard much of the ghost, but only half believed in him. From the day when he declared that my little Meg, the flesh of my flesh, the fruit of my womb, would be empress, I believed in him altogether.\"\n\nAnd really it was not necessary to make a long study of Mme. Giry's excited features to understand what could be got out of that fine intellect with the two words \"ghost\" and \"empress.\"\n\nBut who pulled the strings of that extraordinary puppet? That was the question.\n\n\"You have never seen him; he speaks to you and you believe all he says?\" asked Moncharmin.\n\n\"Yes. To begin with, I owe it to him that my little Meg was promoted to be the leader of a row. I said to the ghost, 'If she is to be empress in 1885, there is no time to lose; she must become a leader at once.' He said, 'Look upon it as done.' And he had only a word to say to M. Poligny and the thing was done.\"\n\n\"So you see that M. Poligny saw him!\"\n\n\"No, not any more than I did; but he heard him. The ghost said a word in his ear, you know, on the evening when he left Box Five, looking so dreadfully pale.\"\n\nMoncharmin heaved a sigh. \"What a business!\" he groaned.\n\n\"Ah!\" said Mme. Giry. \"I always thought there were secrets between the ghost and M. Poligny. Anything that the ghost asked M. Poligny to do M. Poligny did. M. Poligny could refuse the ghost nothing.\"\n\n\"You hear, Richard: Poligny could refuse the ghost nothing.\"\n\n\"Yes, yes, I hear!\" said Richard. \"M. Poligny is a friend of the ghost; and, as Mme. Giry is a friend of M. Poligny, there we are! ... But I don't care a hang about M. Poligny,\" he added roughly. \"The only person whose fate really interests me is Mme. Giry... Mme. Giry, do you know what is in this envelope?\"\n\n\"Why, of course not,\" she said.\n\n\"Well, look.\"\n\nMine. Giry looked into the envelope with a lackluster eye, which soon recovered its brilliancy.\n\n\"Thousand-franc notes!\" she cried.\n\n\"Yes, Mme. Giry, thousand-franc notes! And you knew it!\"\n\n\"I, sir? I? ... I swear ...\"\n\n\"Don't swear, Mme. Giry! ... And now I will tell you the second reason why I sent for you. Mme. Giry, I am going to have you arrested.\"\n\nThe two black feathers on the dingy bonnet, which usually affected the attitude of two notes of interrogation, changed into two notes of exclamation; as for the bonnet itself, it swayed in menace on the old lady's tempestuous chignon. Surprise, indignation, protest and dismay were furthermore displayed by little Meg's mother in a sort of extravagant movement of offended virtue, half bound, half slide, that brought her right under the nose of M. Richard, who could not help pushing back his chair.\n\n\"HAVE ME ARRESTED!\"\n\nThe mouth that spoke those words seemed to spit the three teeth that were left to it into Richard's face.\n\nM. Richard behaved like a hero. He retreated no farther. His threatening forefinger seemed already to be pointing out the keeper of Box Five to the absent magistrates.\n\n\"I am going to have you arrested, Mme. Giry, as a thief!\"\n\n\"Say that again!\"\n\nAnd Mme. Giry caught Mr. Manager Richard a mighty box on the ear, before Mr. Manager Moncharmin had time to intervene. But it was not the withered hand of the angry old beldame that fell on the managerial ear, but the envelope itself, the cause of all the trouble, the magic envelope that opened with the blow, scattering the bank-notes, which escaped in a fantastic whirl of giant butterflies.\n\nThe two managers gave a shout, and the same thought made them both go on their knees, feverishly, picking up and hurriedly examining the precious scraps of paper.\n\n\"Are they still genuine, Moncharmin?\"\n\n\"Are they still genuine, Richard?\"\n\n\"Yes, they are still genuine!\"\n\nAbove their heads, Mme. Giry's three teeth were clashing in a noisy contest, full of hideous interjections. But all that could be clearly distinguished was this LEIT-MOTIF:\n\n\"I, a thief! ... I, a thief, I?\"\n\nShe choked with rage. She shouted:\n\n\"I never heard of such a thing!\"\n\nAnd, suddenly, she darted up to Richard again.\n\n\"In any case,\" she yelped, \"you, M. Richard, ought to know better than I where the twenty thousand francs went to!\"\n\n\"I?\" asked Richard, astounded. \"And how should I know?\"\n\nMoncharmin, looking severe and dissatisfied, at once insisted that the good lady should explain herself.\n\n\"What does this mean, Mme. Giry?\" he asked. \"And why do you say that M. Richard ought to know better than you where the twenty-thousand francs went to?\"\n\nAs for Richard, who felt himself turning red under Moncharmin's eyes, he took Mme. Giry by the wrist and shook it violently. In a voice growling and rolling like thunder, he roared:\n\n\"Why should I know better than you where the twenty-thousand francs went to? Why? Answer me!\"\n\n\"Because they went into your pocket!\" gasped the old woman, looking at him as if he were the devil incarnate.\n\nRichard would have rushed upon Mme. Giry, if Moncharmin had not stayed his avenging hand and hastened to ask her, more gently:\n\n\"How can you suspect my partner, M. Richard, of putting twenty-thousand francs in his pocket?\"\n\n\"I never said that,\" declared Mme. Giry, \"seeing that it was myself who put the twenty-thousand francs into M. Richard's pocket.\" And she added, under her voice, \"There! It's out! ... And may the ghost forgive me!\"\n\nRichard began bellowing anew, but Moncharmin authoritatively ordered him to be silent.\n\n\"Allow me! Allow me! Let the woman explain herself. Let me question her.\" And he added: \"It is really astonishing that you should take up such a tone! ... We are on the verge of clearing up the whole mystery. And you're in a rage! ... You're wrong to behave like that... I'm enjoying myself immensely.\"\n\nMme. Giry, like the martyr that she was, raised her head, her face beaming with faith in her own innocence.\n\n\"You tell me there were twenty-thousand francs in the envelope which I put into M. Richard's pocket; but I tell you again that I knew nothing about it ... Nor M. Richard either, for that matter!\"\n\n\"Aha!\" said Richard, suddenly assuming a swaggering air which Moncharmin did not like. \"I knew nothing either! You put twenty-thousand francs in my pocket and I knew nothing either! I am very glad to hear it, Mme. Giry!\"\n\n\"Yes,\" the terrible dame agreed, \"yes, it's true. We neither of us knew anything. But you, you must have ended by finding out!\"\n\nRichard would certainly have swallowed Mme. Giry alive, if Moncharmin had not been there! But Moncharmin protected her. He resumed his questions:\n\n\"What sort of envelope did you put in M. Richard's pocket? It was not the one which we gave you, the one which you took to Box Five before our eyes; and yet that was the one which contained the twenty-thousand francs.\"\n\n\"I beg your pardon. The envelope which M. le Directeur gave me was the one which I slipped into M. le Directeur's pocket,\" explained Mme. Giry. \"The one which I took to the ghost's box was another envelope, just like it, which the ghost gave me beforehand and which I hid up my sleeve.\"\n\nSo saying, Mme. Giry took from her sleeve an envelope ready prepared and similarly addressed to that containing the twenty-thousand francs. The managers took it from her. They examined it and saw that it was fastened with seals stamped with their own managerial seal. They opened it. It contained twenty Bank of St. Farce notes like those which had so much astounded them the month before.\n\n\"How simple!\" said Richard.\n\n\"How simple!\" repeated Moncharmin. And he continued with his eyes fixed upon Mme. Giry, as though trying to hypnotize her.\n\n\"So it was the ghost who gave you this envelope and told you to substitute it for the one which we gave you? And it was the ghost who told you to put the other into M. Richard's pocket?\"\n\n\"Yes, it was the ghost.\"\n\n\"Then would you mind giving us a specimen of your little talents? Here is the envelope. Act as though we knew nothing.\"\n\n\"As you please, gentlemen.\"\n\nMme. Giry took the envelope with the twenty notes inside it and made for the door. She was on the point of going out when the two managers rushed at her:\n\n\"Oh, no! Oh, no! We're not going to be 'done' a second time! Once bitten, twice shy!\"\n\n\"I beg your pardon, gentlemen,\" said the old woman, in self-excuse, \"you told me to act as though you knew nothing ... Well, if you knew nothing, I should go away with your envelope!\"\n\n\"And then how would you slip it into my pocket?\" argued Richard, whom Moncharmin fixed with his left eye, while keeping his right on Mme. Giry: a proceeding likely to strain his sight, but Moncharmin was prepared to go to any length to discover the truth.\n\n\"I am to slip it into your pocket when you least expect it, sir. You know that I always take a little turn behind the scenes, in the course of the evening, and I often go with my daughter to the ballet-foyer, which I am entitled to do, as her mother; I bring her her shoes, when the ballet is about to begin ... in fact, I come and go as I please ... The subscribers come and go too... So do you, sir ... There are lots of people about ... I go behind you and slip the envelope into the tail-pocket of your dress-coat ... There's no witchcraft about that!\"\n\n\"No witchcraft!\" growled Richard, rolling his eyes like Jupiter Tonans. \"No witchcraft! Why, I've just caught you in a lie, you old witch!\"\n\nMme. Giry bristled, with her three teeth sticking out of her mouth.\n\n\"And why, may I ask?\"\n\n\"Because I spent that evening watching Box Five and the sham envelope which you put there. I did not go to the ballet-foyer for a second.\"\n\n\"No, sir, and I did not give you the envelope that evening, but at the next performance ... on the evening when the under-secretary of state for fine arts ...\"\n\nAt these words, M. Richard suddenly interrupted Mme. Giry:\n\n\"Yes, that's true, I remember now! The under-secretary went behind the scenes. He asked for me. I went down to the ballet-foyer for a moment. I was on the foyer steps ... The under-secretary and his chief clerk were in the foyer itself. I suddenly turned around ... you had passed behind me, Mme. Giry ... You seemed to push against me ... Oh, I can see you still, I can see you still!\"\n\n\"Yes, that's it, sir, that's it. I had just finished my little business. That pocket of yours, sir, is very handy!\"\n\nAnd Mme. Giry once more suited the action to the word, She passed behind M. Richard and, so nimbly that Moncharmin himself was impressed by it, slipped the envelope into the pocket of one of the tails of M. Richard's dress-coat.\n\n\"Of course!\" exclaimed Richard, looking a little pale. \"It's very clever of O. G. The problem which he had to solve was this: how to do away with any dangerous intermediary between the man who gives the twenty-thousand francs and the man who receives it. And by far the best thing he could hit upon was to come and take the money from my pocket without my noticing it, as I myself did not know that it was there. It's wonderful!\"\n\n\"Oh, wonderful, no doubt!\" Moncharmin agreed. \"Only, you forget, Richard, that I provided ten-thousand francs of the twenty and that nobody put anything in my pocket!\"\n\n\n\n[1] Flash notes drawn on the \"Bank of St. Farce\" in France correspond with those drawn on the \"Bank of Engraving\" in England.—Translator's Note.\n\n\n\n\nChapter XVII The Safety-Pin Again\n\nMoncharmin's last phrase so dearly expressed the suspicion in which he now held his partner that it was bound to cause a stormy explanation, at the end of which it was agreed that Richard should yield to all Moncharmin's wishes, with the object of helping him to discover the miscreant who was victimizing them.\n\nThis brings us to the interval after the Garden Act, with the strange conduct observed by M. Remy and those curious lapses from the dignity that might be expected of the managers. It was arranged between Richard and Moncharmin, first, that Richard should repeat the exact movements which he had made on the night of the disappearance of the first twenty-thousand francs; and, second, that Moncharmin should not for an instant lose sight of Richard's coat-tail pocket, into which Mme. Giry was to slip the twenty-thousand francs.\n\nM. Richard went and placed himself at the identical spot where he had stood when he bowed to the under-secretary for fine arts. M. Moncharmin took up his position a few steps behind him.\n\nMme. Giry passed, rubbed up against M. Richard, got rid of her twenty-thousand francs in the manager's coat-tail pocket and disappeared ... Or rather she was conjured away. In accordance with the instructions received from Moncharmin a few minutes earlier, Mercier took the good lady to the acting-manager's office and turned the key on her, thus making it impossible for her to communicate with her ghost.\n\nMeanwhile, M. Richard was bending and bowing and scraping and walking backward, just as if he had that high and mighty minister, the under-secretary for fine arts, before him. Only, though these marks of politeness would have created no astonishment if the under-secretary of state had really been in front of M. Richard, they caused an easily comprehensible amazement to the spectators of this very natural but quite inexplicable scene when M. Richard had no body in front of him.\n\nM. Richard bowed ... to nobody; bent his back ... before nobody; and walked backward ... before nobody ... And, a few steps behind him, M. Moncharmin did the same thing that he was doing in addition to pushing away M. Remy and begging M. de La Borderie, the ambassador, and the manager of the Credit Central \"not to touch M. le Directeur.\"\n\nMoncharmin, who had his own ideas, did not want Richard to come to him presently, when the twenty-thousand francs were gone, and say:\n\n\"Perhaps it was the ambassador ... or the manager of the Credit Central ... or Remy.\"\n\nThe more so as, at the time of the first scene, as Richard himself admitted, Richard had met nobody in that part of the theater after Mme. Giry had brushed up against him...\n\nHaving begun by walking backward in order to bow, Richard continued to do so from prudence, until he reached the passage leading to the offices of the management. In this way, he was constantly watched by Moncharmin from behind and himself kept an eye on any one approaching from the front. Once more, this novel method of walking behind the scenes, adopted by the managers of our National Academy of Music, attracted attention; but the managers themselves thought of nothing but their twenty-thousand francs.\n\nOn reaching the half-dark passage, Richard said to Moncharmin, in a low voice:\n\n\"I am sure that nobody has touched me ... You had now better keep at some distance from me and watch me till I come to door of the office: it is better not to arouse suspicion and we can see anything that happens.\"\n\nBut Moncharmin replied. \"No, Richard, no! You walk ahead and I'll walk immediately behind you! I won't leave you by a step!\"\n\n\"But, in that case,\" exclaimed Richard, \"they will never steal our twenty-thousand francs!\"\n\n\"I should hope not, indeed!\" declared Moncharmin.\n\n\"Then what we are doing is absurd!\"\n\n\"We are doing exactly what we did last time ... Last time, I joined you as you were leaving the stage and followed close behind you down this passage.\"\n\n\"That's true!\" sighed Richard, shaking his head and passively obeying Moncharmin.\n\nTwo minutes later, the joint managers locked themselves into their office. Moncharmin himself put the key in his pocket:\n\n\"We remained locked up like this, last time,\" he said, \"until you left the Opera to go home.\"\n\n\"That's so. No one came and disturbed us, I suppose?\"\n\n\"No one.\"\n\n\"Then,\" said Richard, who was trying to collect his memory, \"then I must certainly have been robbed on my way home from the Opera.\"\n\n\"No,\" said Moncharmin in a drier tone than ever, \"no, that's impossible. For I dropped you in my cab. The twenty-thousand francs disappeared at your place: there's not a shadow of a doubt about that.\"\n\n\"It's incredible!\" protested Richard. \"I am sure of my servants ... and if one of them had done it, he would have disappeared since.\"\n\nMoncharmin shrugged his shoulders, as though to say that he did not wish to enter into details, and Richard began to think that Moncharmin was treating him in a very insupportable fashion.\n\n\"Moncharmin, I've had enough of this!\"\n\n\"Richard, I've had too much of it!\"\n\n\"Do you dare to suspect me?\"\n\n\"Yes, of a silly joke.\"\n\n\"One doesn't joke with twenty-thousand francs.\"\n\n\"That's what I think,\" declared Moncharmin, unfolding a newspaper and ostentatiously studying its contents.\n\n\"What are you doing?\" asked Richard. \"Are you going to read the paper next?\"\n\n\"Yes, Richard, until I take you home.\"\n\n\"Like last time?\"\n\n\"Yes, like last time.\"\n\nRichard snatched the paper from Moncharmin's hands. Moncharmin stood up, more irritated than ever, and found himself faced by an exasperated Richard, who, crossing his arms on his chest, said:\n\n\"Look here, I'm thinking of this, I'M THINKING OF WHAT I MIGHT THINK if, like last time, after my spending the evening alone with you, you brought me home and if, at the moment of parting, I perceived that twenty-thousand francs had disappeared from my coat-pocket ... like last time.\"\n\n\"And what might you think?\" asked Moncharmin, crimson with rage.\n\n\"I might think that, as you hadn't left me by a foot's breadth and as, by your own wish, you were the only one to approach me, like last time, I might think that, if that twenty-thousand francs was no longer in my pocket, it stood a very good chance of being in yours!\"\n\nMoncharmin leaped up at the suggestion.\n\n\"Oh!\" he shouted. \"A safety-pin!\"\n\n\"What do you want a safety-pin for?\"\n\n\"To fasten you up with! ... A safety-pin! ... A safety-pin!\"\n\n\"You want to fasten me with a safety-pin?\"\n\n\"Yes, to fasten you to the twenty-thousand francs! Then, whether it's here, or on the drive from here to your place, or at your place, you will feel the hand that pulls at your pocket and you will see if it's mine! Oh, so you're suspecting me now, are you? A safety-pin!\"\n\nAnd that was the moment when Moncharmin opened the door on the passage and shouted:\n\n\"A safety-pin! ... somebody give me a safety-pin!\"\n\nAnd we also know how, at the same moment, Remy, who had no safety-pin, was received by Moncharmin, while a boy procured the pin so eagerly longed for. And what happened was this: Moncharmin first locked the door again. Then he knelt down behind Richard's back.\n\n\"I hope,\" he said, \"that the notes are still there?\"\n\n\"So do I,\" said Richard.\n\n\"The real ones?\" asked Moncharmin, resolved not to be \"had\" this time.\n\n\"Look for yourself,\" said Richard. \"I refuse to touch them.\"\n\nMoncharmin took the envelope from Richard's pocket and drew out the bank-notes with a trembling hand, for, this time, in order frequently to make sure of the presence of the notes, he had not sealed the envelope nor even fastened it. He felt reassured on finding that they were all there and quite genuine. He put them back in the tail-pocket and pinned them with great care. Then he sat down behind Richard's coat-tails and kept his eyes fixed on them, while Richard, sitting at his writing-table, did not stir.\n\n\"A little patience, Richard,\" said Moncharmin. \"We have only a few minutes to wait ... The clock will soon strike twelve. Last time, we left at the last stroke of twelve.\"\n\n\"Oh, I shall have all the patience necessary!\"\n\nThe time passed, slow, heavy, mysterious, stifling. Richard tried to laugh.\n\n\"I shall end by believing in the omnipotence of the ghost,\" he said. \"Just now, don't you find something uncomfortable, disquieting, alarming in the atmosphere of this room?\"\n\n\"You're quite right,\" said Moncharmin, who was really impressed.\n\n\"The ghost!\" continued Richard, in a low voice, as though fearing lest he should be overheard by invisible ears. \"The ghost! Suppose, all the same, it were a ghost who puts the magic envelopes on the table ... who talks in Box Five ... who killed Joseph Buquet ... who unhooked the chandelier ... and who robs us! For, after all, after all, after all, there is no one here except you and me, and, if the notes disappear and neither you nor I have anything to do with it, well, we shall have to believe in the ghost ... in the ghost.\"\n\nAt that moment, the clock on the mantlepiece gave its warning click and the first stroke of twelve struck.\n\nThe two managers shuddered. The perspiration streamed from their foreheads. The twelfth stroke sounded strangely in their ears.\n\nWhen the clock stopped, they gave a sigh and rose from their chairs.\n\n\"I think we can go now,\" said Moncharmin.\n\n\"I think so,\" Richard a agreed.\n\n\"Before we go, do you mind if I look in your pocket?\"\n\n\"But, of course, Moncharmin, YOU MUST! ... Well?\" he asked, as Moncharmin was feeling at the pocket.\n\n\"Well, I can feel the pin.\"\n\n\"Of course, as you said, we can't be robbed without noticing it.\"\n\nBut Moncharmin, whose hands were still fumbling, bellowed:\n\n\"I can feel the pin, but I can't feel the notes!\"\n\n\"Come, no joking, Moncharmin! ... This isn't the time for it.\"\n\n\"Well, feel for yourself.\"\n\nRichard tore off his coat. The two managers turned the pocket inside out. THE POCKET WAS EMPTY. And the curious thing was that the pin remained, stuck in the same place.\n\nRichard and Moncharmin turned pale. There was no longer any doubt about the witchcraft.\n\n\"The ghost!\" muttered Moncharmin.\n\nBut Richard suddenly sprang upon his partner.\n\n\"No one but you has touched my pocket! Give me back my twenty-thousand francs! ... Give me back my twenty-thousand francs! ...\"\n\n\"On my soul,\" sighed Moncharmin, who was ready to swoon, \"on my soul, I swear that I haven't got it!\"\n\nThen somebody knocked at the door. Moncharmin opened it automatically, seemed hardly to recognize Mercier, his business-manager, exchanged a few words with him, without knowing what he was saying and, with an unconscious movement, put the safety-pin, for which he had no further use, into the hands of his bewildered subordinate ...\n\n\n\n\nChapter XVIII The Commissary, The Viscount and the Persian\n\nThe first words of the commissary of police, on entering the managers' office, were to ask after the missing prima donna.\n\n\"Is Christine Daae here?\"\n\n\"Christine Daae here?\" echoed Richard. \"No. Why?\"\n\nAs for Moncharmin, he had not the strength left to utter a word.\n\nRichard repeated, for the commissary and the compact crowd which had followed him into the office observed an impressive silence.\n\n\"Why do you ask if Christine Daae is here, M. LE COMMISSAIRE?\"\n\n\"Because she has to be found,\" declared the commissary of police solemnly.\n\n\"What do you mean, she has to be found? Has she disappeared?\"\n\n\"In the middle of the performance!\"\n\n\"In the middle of the performance? This is extraordinary!\"\n\n\"Isn't it? And what is quite as extraordinary is that you should first learn it from me!\"\n\n\"Yes,\" said Richard, taking his head in his hands and muttering. \"What is this new business? Oh, it's enough to make a man send in his resignation!\"\n\nAnd he pulled a few hairs out of his mustache without even knowing what he was doing.\n\n\"So she ... so she disappeared in the middle of the performance?\" he repeated.\n\n\"Yes, she was carried off in the Prison Act, at the moment when she was invoking the aid of the angels; but I doubt if she was carried off by an angel.\"\n\n\"And I am sure that she was!\"\n\nEverybody looked round. A young man, pale and trembling with excitement, repeated:\n\n\"I am sure of it!\"\n\n\"Sure of what?\" asked Mifroid.\n\n\"That Christine Daae was carried off by an angel, M. LE COMMISSAIRE and I can tell you his name.\"\n\n\"Aha, M. le Vicomte de Chagny! So you maintain that Christine Daae was carried off by an angel: an angel of the Opera, no doubt?\"\n\n\"Yes, monsieur, by an angel of the Opera; and I will tell you where he lives ... when we are alone.\"\n\n\"You are right, monsieur.\"\n\nAnd the commissary of police, inviting Raoul to take a chair, cleared the room of all the rest, excepting the managers.\n\nThen Raoul spoke:\n\n\"M. le Commissaire, the angel is called Erik, he lives in the Opera and he is the Angel of Music!\"\n\n\"The Angel of Music! Really! That is very curious! ... The Angel of Music!\" And, turning to the managers, M. Mifroid asked, \"Have you an Angel of Music on the premises, gentlemen?\"\n\nRichard and Moncharmin shook their heads, without even speaking.\n\n\"Oh,\" said the viscount, \"those gentlemen have heard of the Opera ghost. Well, I am in a position to state that the Opera ghost and the Angel of Music are one and the same person; and his real name is Erik.\"\n\nM. Mifroid rose and looked at Raoul attentively.\n\n\"I beg your pardon, monsieur but is it your intention to make fun of the law? And, if not, what is all this about the Opera ghost?\"\n\n\"I say that these gentlemen have heard of him.\"\n\n\"Gentlemen, it appears that you know the Opera ghost?\"\n\nRichard rose, with the remaining hairs of his mustache in his hand.\n\n\"No, M. Commissary, no, we do not know him, but we wish that we did, for this very evening he has robbed us of twenty-thousand francs!\"\n\nAnd Richard turned a terrible look on Moncharmin, which seemed to say:\n\n\"Give me back the twenty-thousand francs, or I'll tell the whole story.\"\n\nMoncharmin understood what he meant, for, with a distracted gesture, he said:\n\n\"Oh, tell everything and have done with it!\"\n\nAs for Mifroid, he looked at the managers and at Raoul by turns and wondered whether he had strayed into a lunatic asylum. He passed his hand through his hair.\n\n\"A ghost,\" he said, \"who, on the same evening, carries off an opera-singer and steals twenty-thousand francs is a ghost who must have his hands very full! If you don't mind, we will take the questions in order. The singer first, the twenty-thousand francs after. Come, M. de Chagny, let us try to talk seriously. You believe that Mlle. Christine Daae has been carried off by an individual called Erik. Do you know this person? Have you seen him?\"\n\n\"Yes.\"\n\n\"Where?\"\n\n\"In a church yard.\"\n\nM. Mifroid gave a start, began to scrutinize Raoul again and said:\n\n\"Of course! ... That's where ghosts usually hang out! ... And what were you doing in that churchyard?\"\n\n\"Monsieur,\" said Raoul, \"I can quite understand how absurd my replies must seem to you. But I beg you to believe that I am in full possession of my faculties. The safety of the person dearest to me in the world is at stake. I should like to convince you in a few words, for time is pressing and every minute is valuable. Unfortunately, if I do not tell you the strangest story that ever was from the beginning, you will not believe me. I will tell you all I know about the Opera ghost, M. Commissary. Alas, I do not know much! ...\"\n\n\"Never mind, go on, go on!\" exclaimed Richard and Moncharmin, suddenly greatly interested.\n\nUnfortunately for their hopes of learning some detail that could put them on the track of their hoaxer, they were soon compelled to accept the fact that M. Raoul de Chagny had completely lost his head. All that story about Perros-Guirec, death's heads and enchanted violins, could only have taken birth in the disordered brain of a youth mad with love. It was evident, also, that Mr. Commissary Mifroid shared their view; and the magistrate would certainly have cut short the incoherent narrative if circumstances had not taken it upon themselves to interrupt it.\n\nThe door opened and a man entered, curiously dressed in an enormous frock-coat and a tall hat, at once shabby and shiny, that came down to his ears. He went up to the commissary and spoke to him in a whisper. It was doubtless a detective come to deliver an important communication.\n\nDuring this conversation, M. Mifroid did not take his eyes off Raoul. At last, addressing him, he said:\n\n\"Monsieur, we have talked enough about the ghost. We will now talk about yourself a little, if you have no objection: you were to carry off Mlle. Christine Daae to-night?\"\n\n\"Yes, M. le Commissaire.\"\n\n\"After the performance?\"\n\n\"Yes, M. le Commissaire.\"\n\n\"All your arrangements were made?\"\n\n\"Yes, M. le Commissaire.\"\n\n\"The carriage that brought you was to take you both away... There were fresh horses in readiness at every stage ...\"\n\n\"That is true, M. le Commissaire.\"\n\n\"And nevertheless your carriage is still outside the Rotunda awaiting your orders, is it not?\"\n\n\"Yes, M. le Commissaire.\"\n\n\"Did you know that there were three other carriages there, in addition to yours?\"\n\n\"I did not pay the least attention.\"\n\n\"They were the carriages of Mlle. Sorelli, which could not find room in the Cour de l'Administration; of Carlotta; and of your brother, M. le Comte de Chagny...\"\n\n\"Very likely...\"\n\n\"What is certain is that, though your carriage and Sorelli's and Carlotta's are still there, by the Rotunda pavement, M. le Comte de Chagny's carriage is gone.\"\n\n\"This has nothing to say to ...\"\n\n\"I beg your pardon. Was not M. le Comte opposed to your marriage with Mlle. Daae?\"\n\n\"That is a matter that only concerns the family.\"\n\n\"You have answered my question: he was opposed to it ... and that was why you were carrying Christine Daae out of your brother's reach... Well, M. de Chagny, allow me to inform you that your brother has been smarter than you! It is he who has carried off Christine Daae!\"\n\n\"Oh, impossible!\" moaned Raoul, pressing his hand to his heart. \"Are you sure?\"\n\n\"Immediately after the artist's disappearance, which was procured by means which we have still to ascertain, he flung into his carriage, which drove right across Paris at a furious pace.\"\n\n\"Across Paris?\" asked poor Raoul, in a hoarse voice. \"What do you mean by across Paris?\"\n\n\"Across Paris and out of Paris ... by the Brussels road.\"\n\n\"Oh,\" cried the young man, \"I shall catch them!\" And he rushed out of the office.\n\n\"And bring her back to us!\" cried the commisary gaily ... \"Ah, that's a trick worth two of the Angel of Music's!\"\n\nAnd, turning to his audience, M. Mifroid delivered a little lecture on police methods.\n\n\"I don't know for a moment whether M. le Comte de Chagny has really carried Christine Daae off or not ... but I want to know and I believe that, at this moment, no one is more anxious to inform us than his brother ... And now he is flying in pursuit of him! He is my chief auxiliary! This, gentlemen, is the art of the police, which is believed to be so complicated and which, nevertheless appears so simple as soon its you see that it consists in getting your work done by people who have nothing to do with the police.\"\n\nBut M. le Commissaire de Police Mifroid would not have been quite so satisfied with himself if he had known that the rush of his rapid emissary was stopped at the entrance to the very first corridor. A tall figure blocked Raoul's way.\n\n\"Where are you going so fast, M. de Chagny?\" asked a voice.\n\nRaoul impatiently raised his eyes and recognized the astrakhan cap of an hour ago. He stopped:\n\n\"It's you!\" he cried, in a feverish voice. \"You, who know Erik's secrets and don't want me to speak of them. Who are you?\"\n\n\"You know who I am! ... I am the Persian!\"\n\n\n\n\nChapter XIX The Viscount and the Persian\n\nRaoul now remembered that his brother had once shown him that mysterious person, of whom nothing was known except that he was a Persian and that he lived in a little old-fashioned flat in the Rue de Rivoli.\n\nThe man with the ebony skin, the eyes of jade and the astrakhan cap bent over Raoul.\n\n\"I hope, M. de Chagny,\" he said, \"that you have not betrayed Erik's secret?\"\n\n\"And why should I hesitate to betray that monster, sir?\" Raoul rejoined haughtily, trying to shake off the intruder. \"Is he your friend, by any chance?\"\n\n\"I hope that you said nothing about Erik, sir, because Erik's secret is also Christine Daae's and to talk about one is to talk about the other!\"\n\n\"Oh, sir,\" said Raoul, becoming more and more impatient, \"you seem to know about many things that interest me; and yet I have no time to listen to you!\"\n\n\"Once more, M. de Chagny, where are you going so fast?\"\n\n\"Can not you guess? To Christine Daae's assistance...\"\n\n\"Then, sir, stay here, for Christine Daae is here!\"\n\n\"With Erik?\"\n\n\"With Erik.\"\n\n\"How do you know?\"\n\n\"I was at the performance and no one in the world but Erik could contrive an abduction like that! ... Oh,\" he said, with a deep sigh, \"I recognized the monster's touch! ...\"\n\n\"You know him then?\"\n\nThe Persian did not reply, but heaved a fresh sigh.\n\n\"Sir,\" said Raoul, \"I do not know what your intentions are, but can you do anything to help me? I mean, to help Christine Daae?\"\n\n\"I think so, M. de Chagny, and that is why I spoke to you.\"\n\n\"What can you do?\"\n\n\"Try to take you to her ... and to him.\"\n\n\"If you can do me that service, sir, my life is yours! ... One word more: the commissary of police tells me that Christine Daae has been carried off by my brother, Count Philippe.\"\n\n\"Oh, M. de Chagny, I don't believe a word of it.\"\n\n\"It's not possible, is it?\"\n\n\"I don't know if it is possible or not; but there are ways and ways of carrying people off; and M. le Comte Philippe has never, as far as I know, had anything to do with witchcraft.\"\n\n\"Your arguments are convincing, sir, and I am a fool! ... Oh, let us make haste! I place myself entirely in your hands! ... How should I not believe you, when you are the only one to believe me ... when you are the only one not to smile when Erik's name is mentioned?\"\n\nAnd the young man impetuously seized the Persian's hands. They were ice-cold.\n\n\"Silence!\" said the Persian, stopping and listening to the distant sounds of the theater. \"We must not mention that name here. Let us say 'he' and 'him;' then there will be less danger of attracting his attention.\"\n\n\"Do you think he is near us?\"\n\n\"It is quite possible, Sir, if he is not, at this moment, with his victim, IN THE HOUSE ON THE LAKE.\"\n\n\"Ah, so you know that house too?\"\n\n\"If he is not there, he may be here, in this wall, in this floor, in this ceiling! ... Come!\"\n\nAnd the Persian, asking Raoul to deaden the sound of his footsteps, led him down passages which Raoul had never seen before, even at the time when Christine used to take him for walks through that labyrinth.\n\n\"If only Darius has come!\" said the Persian.\n\n\"Who is Darius?\"\n\n\"Darius? My servant.\"\n\nThey were now in the center of a real deserted square, an immense apartment ill-lit by a small lamp. The Persian stopped Raoul and, in the softest of whispers, asked:\n\n\"What did you say to the commissary?\"\n\n\"I said that Christine Daae's abductor was the Angel of Music, ALIAS the Opera ghost, and that the real name was ...\"\n\n\"Hush! ... And did he believe you?\"\n\n\"No.\"\n\n\"He attached no importance to what you said?\"\n\n\"No.\"\n\n\"He took you for a bit of a madman?\"\n\n\"Yes.\"\n\n\"So much the better!\" sighed the Persian.\n\nAnd they continued their road. After going up and down several staircases which Raoul had never seen before, the two men found themselves in front of a door which the Persian opened with a master-key. The Persian and Raoul were both, of course, in dress-clothes; but, whereas Raoul had a tall hat, the Persian wore the astrakhan cap which I have already mentioned. It was an infringement of the rule which insists upon the tall hat behind the scenes; but in France foreigners are allowed every license: the Englishman his traveling-cap, the Persian his cap of astrakhan.\n\n\"Sir,\" said the Persian, \"your tall hat will be in your way: you would do well to leave it in the dressing-room.\"\n\n\"What dressing-room?\" asked Raoul.\n\n\"Christine Daae's.\"\n\nAnd the Persian, letting Raoul through the door which he had just opened, showed him the actress' room opposite. They were at the end of the passage the whole length of which Raoul had been accustomed to traverse before knocking at Christine's door.\n\n\"How well you know the Opera, sir!\"\n\n\"Not so well as 'he' does!\" said the Persian modestly.\n\nAnd he pushed the young man into Christine's dressing-room, which was as Raoul had left it a few minutes earlier.\n\nClosing the door, the Persian went to a very thin partition that separated the dressing-room from a big lumber-room next to it. He listened and then coughed loudly.\n\nThere was a sound of some one stirring in the lumber-room; and, a few seconds later, a finger tapped at the door.\n\n\"Come in,\" said the Persian.\n\nA man entered, also wearing an astrakhan cap and dressed in a long overcoat. He bowed and took a richly carved case from under his coat, put it on the dressing-table, bowed once again and went to the door.\n\n\"Did no one see you come in, Darius?\"\n\n\"No, master.\"\n\n\"Let no one see you go out.\"\n\nThe servant glanced down the passage and swiftly disappeared.\n\nThe Persian opened the case. It contained a pair of long pistols.\n\n\"When Christine Daae was carried off, sir, I sent word to my servant to bring me these pistols. I have had them a long time and they can be relied upon.\"\n\n\"Do you mean to fight a duel?\" asked the young man.\n\n\"It will certainly be a duel which we shall have to fight,\" said the other, examining the priming of his pistols. \"And what a duel!\" Handing one of the pistols to Raoul, he added, \"In this duel, we shall be two to one; but you must be prepared for everything, for we shall be fighting the most terrible adversary that you can imagine. But you love Christine Daae, do you not?\"\n\n\"I worship the ground she stands on! But you, sir, who do not love her, tell me why I find you ready to risk your life for her! You must certainly hate Erik!\"\n\n\"No, sir,\" said the Persian sadly, \"I do not hate him. If I hated him, he would long ago have ceased doing harm.\"\n\n\"Has he done you harm?\"\n\n\"I have forgiven him the harm which he has done me.\"\n\n\"I do not understand you. You treat him as a monster, you speak of his crime, he has done you harm and I find in you the same inexplicable pity that drove me to despair when I saw it in Christine!\"\n\nThe Persian did not reply. He fetched a stool and set it against the wall facing the great mirror that filled the whole of the wall-space opposite. Then he climbed on the stool and, with his nose to the wallpaper, seemed to be looking for something.\n\n\"Ah,\" he said, after a long search, \"I have it!\" And, raising his finger above his head, he pressed against a corner in the pattern of the paper. Then he turned round and jumped off the stool:\n\n\"In half a minute,\" he said, \"he shall be ON HIS ROAD!\" and crossing the whole of the dressing-room he felt the great mirror.\n\n\"No, it is not yielding yet,\" he muttered.\n\n\"Oh, are we going out by the mirror?\" asked Raoul. \"Like Christine Daae.\"\n\n\"So you knew that Christine Daae went out by that mirror?\"\n\n\"She did so before my eyes, sir! I was hidden behind the curtain of the inner room and I saw her vanish not by the glass, but in the glass!\"\n\n\"And what did you do?\"\n\n\"I thought it was an aberration of my senses, a mad dream.\n\n\"Or some new fancy of the ghost's!\" chuckled the Persian. \"Ah, M. de Chagny,\" he continued, still with his hand on the mirror, \"would that we had to do with a ghost! We could then leave our pistols in their case ... Put down your hat, please ... there ... and now cover your shirt-front as much as you can with your coat ... as I am doing ... Bring the lapels forward ... turn up the collar ... We must make ourselves as invisible as possible.\"\n\nBearing against the mirror, after a short silence, he said:\n\n\"It takes some time to release the counterbalance, when you press on the spring from the inside of the room. It is different when you are behind the wall and can act directly on the counterbalance. Then the mirror turns at once and is moved with incredible rapidity.\"\n\n\"What counterbalance?\" asked Raoul.\n\n\"Why, the counterbalance that lifts the whole of this wall on to its pivot. You surely don't expect it to move of itself, by enchantment! If you watch, you will see the mirror first rise an inch or two and then shift an inch or two from left to right. It will then be on a pivot and will swing round.\"\n\n\"It's not turning!\" said Raoul impatiently.\n\n\"Oh, wait! You have time enough to be impatient, sir! The mechanism has obviously become rusty, or else the spring isn't working... Unless it is something else,\" added the Persian, anxiously.\n\n\"What?\"\n\n\"He may simply have cut the cord of the counterbalance and blocked the whole apparatus.\"\n\n\"Why should he? He does not know that we are coming this way!\"\n\n\"I dare say he suspects it, for he knows that I understand the system.\"\n\n\"It's not turning! ... And Christine, sir, Christine?\"\n\nThe Persian said coldly:\n\n\"We shall do all that it is humanly possible to do! ... But he may stop us at the first step! ... He commands the walls, the doors and the trapdoors. In my country, he was known by a name which means the 'trap-door lover.'\"\n\n\"But why do these walls obey him alone? He did not build them!\"\n\n\"Yes, sir, that is just what he did!\"\n\nRaoul looked at him in amazement; but the Persian made a sign to him to be silent and pointed to the glass ... There was a sort of shivering reflection. Their image was troubled as in a rippling sheet of water and then all became stationary again.\n\n\"You see, sir, that it is not turning! Let us take another road!\"\n\n\"To-night, there is no other!\" declared the Persian, in a singularly mournful voice. \"And now, look out! And be ready to fire.\"\n\nHe himself raised his pistol opposite the glass. Raoul imitated his movement. With his free arm, the Persian drew the young man to his chest and, suddenly, the mirror turned, in a blinding daze of cross-lights: it turned like one of those revolving doors which have lately been fixed to the entrances of most restaurants, it turned, carrying Raoul and the Persian with it and suddenly hurling them from the full light into the deepest darkness.\n\n\n\n\nChapter XX In the Cellars of the Opera\n\n\"Your hand high, ready to fire!\" repeated Raoul's companion quickly.\n\nThe wall, behind them, having completed the circle which it described upon itself, closed again; and the two men stood motionless for a moment, holding their breath.\n\nAt last, the Persian decided to make a movement; and Raoul heard him slip on his knees and feel for something in the dark with his groping hands. Suddenly, the darkness was made visible by a small dark lantern and Raoul instinctively stepped backward as though to escape the scrutiny of a secret enemy. But he soon perceived that the light belonged to the Persian, whose movements he was closely observing. The little red disk was turned in every direction and Raoul saw that the floor, the walls and the ceiling were all formed of planking. It must have been the ordinary road taken by Erik to reach Christine's dressing-room and impose upon her innocence. And Raoul, remembering the Persian's remark, thought that it had been mysteriously constructed by the ghost himself. Later, he learned that Erik had found, all prepared for him, a secret passage, long known to himself alone and contrived at the time of the Paris Commune to allow the jailers to convey their prisoners straight to the dungeons that had been constructed for them in the cellars; for the Federates had occupied the opera-house immediately after the eighteenth of March and had made a starting-place right at the top for their Mongolfier balloons, which carried their incendiary proclamations to the departments, and a state prison right at the bottom.\n\nThe Persian went on his knees and put his lantern on the ground. He seemed to be working at the floor; and suddenly he turned off his light. Then Raoul heard a faint click and saw a very pale luminous square in the floor of the passage. It was as though a window had opened on the Opera cellars, which were still lit. Raoul no longer saw the Persian, but he suddenly felt him by his side and heard him whisper:\n\n\"Follow me and do all that I do.\"\n\nRaoul turned to the luminous aperture. Then he saw the Persian, who was still on his knees, hang by his hands from the rim of the opening, with his pistol between his teeth, and slide into the cellar below.\n\nCuriously enough, the viscount had absolute confidence in the Persian, though he knew nothing about him. His emotion when speaking of the \"monster\" struck him as sincere; and, if the Persian had cherished any sinister designs against him, he would not have armed him with his own hands. Besides, Raoul must reach Christine at all costs. He therefore went on his knees also and hung from the trap with both hands.\n\n\"Let go!\" said a voice.\n\nAnd he dropped into the arms of the Persian, who told him to lie down flat, closed the trap-door above him and crouched down beside him. Raoul tried to ask a question, but the Persian's hand was on his mouth and he heard a voice which he recognized as that of the commissary of police.\n\nRaoul and the Persian were completely hidden behind a wooden partition. Near them, a small staircase led to a little room in which the commissary appeared to be walking up and down, asking questions. The faint light was just enough to enable Raoul to distinguish the shape of things around him. And he could not restrain a dull cry: there were three corpses there.\n\nThe first lay on the narrow landing of the little staircase; the two others had rolled to the bottom of the staircase. Raoul could have touched one of the two poor wretches by passing his fingers through the partition.\n\n\"Silence!\" whispered the Persian.\n\nHe too had seen the bodies and he gave one word in explanation:\n\n\"HE!\"\n\nThe commissary's voice was now heard more distinctly. He was asking for information about the system of lighting, which the stage-manager supplied. The commissary therefore must be in the \"organ\" or its immediate neighborhood.\n\nContrary to what one might think, especially in connection with an opera-house, the \"organ\" is not a musical instrument. At that time, electricity was employed only for a very few scenic effects and for the bells. The immense building and the stage itself were still lit by gas; hydrogen was used to regulate and modify the lighting of a scene; and this was done by means of a special apparatus which, because of the multiplicity of its pipes, was known as the \"organ.\" A box beside the prompter's box was reserved for the chief gas-man, who from there gave his orders to his assistants and saw that they were executed. Mauclair stayed in this box during all the performances.\n\nBut now Mauclair was not in his box and his assistants not in their places.\n\n\"Mauclair! Mauclair!\"\n\nThe stage-manager's voice echoed through the cellars. But Mauclair did not reply.\n\nI have said that a door opened on a little staircase that led to the second cellar. The commissary pushed it, but it resisted.\n\n\"I say,\" he said to the stage-manager, \"I can't open this door: is it always so difficult?\"\n\nThe stage-manager forced it open with his shoulder. He saw that, at the same time, he was pushing a human body and he could not keep back an exclamation, for he recognized the body at once:\n\n\"Mauclair! Poor devil! He is dead!\"\n\nBut Mr. Commissary Mifroid, whom nothing surprised, was stooping over that big body.\n\n\"No,\" he said, \"he is dead-drunk, which is not quite the same thing.\"\n\n\"It's the first time, if so,\" said the stage-manager\n\n\"Then some one has given him a narcotic. That is quite possible.\"\n\nMifroid went down a few steps and said:\n\n\"Look!\"\n\nBy the light of a little red lantern, at the foot of the stairs, they saw two other bodies. The stage-manager recognized Mauclair's assistants. Mifroid went down and listened to their breathing.\n\n\"They are sound asleep,\" he said. \"Very curious business! Some person unknown must have interfered with the gas-man and his staff ... and that person unknown was obviously working on behalf of the kidnapper ... But what a funny idea to kidnap a performer on the stage! ... Send for the doctor of the theater, please.\" And Mifroid repeated, \"Curious, decidedly curious business!\"\n\nThen he turned to the little room, addressing the people whom Raoul and the Persian were unable to see from where they lay.\n\n\"What do you say to all this, gentlemen? You are the only ones who have not given your views. And yet you must have an opinion of some sort.\"\n\nThereupon, Raoul and the Persian saw the startled faces of the joint managers appear above the landing—and they heard Moncharmin's excited voice:\n\n\"There are things happening here, Mr. Commissary, which we are unable to explain.\"\n\nAnd the two faces disappeared.\n\n\"Thank you for the information, gentlemen,\" said Mifroid, with a jeer.\n\nBut the stage-manager, holding his chin in the hollow of his right hand, which is the attitude of profound thought, said:\n\n\"It is not the first time that Mauclair has fallen asleep in the theater. I remember finding him, one evening, snoring in his little recess, with his snuff-box beside him.\"\n\n\"Is that long ago?\" asked M. Mifroid, carefully wiping his eye-glasses.\n\n\"No, not so very long ago ... Wait a bit! ... It was the night ... of course, yes ... It was the night when Carlotta—you know, Mr. Commissary—gave her famous 'co-ack'!\"\n\n\"Really? The night when Carlotta gave her famous 'co-ack'?\"\n\nAnd M. Mifroid, replacing his gleaming glasses on his nose, fixed the stage-manager with a contemplative stare.\n\n\"So Mauclair takes snuff, does he?\" he asked carelessly.\n\n\"'Yes, Mr. Commissary ... Look, there is his snuff-box on that little shelf ... Oh! he's a great snuff-taker!\"\n\n\"So am I,\" said Mifroid and put the snuff-box in his pocket.\n\nRaoul and the Persian, themselves unobserved, watched the removal of the three bodies by a number of scene-shifters, who were followed by the commissary and all the people with him. Their steps were heard for a few minutes on the stage above. When they were alone the Persian made a sign to Raoul to stand up. Raoul did so; but, as he did not lift his hand in front of his eyes, ready to fire, the Persian told him to resume that attitude and to continue it, whatever happened.\n\n\"But it tires the hand unnecessarily,\" whispered Raoul. \"If I do fire, I shan't be sure of my aim.\"\n\n\"Then shift your pistol to the other hand,\" said the Persian.\n\n\"I can't shoot with my left hand.\"\n\nThereupon, the Persian made this queer reply, which was certainly not calculated to throw light into the young man's flurried brain:\n\n\"It's not a question of shooting with the right hand or the left; it's a question of holding one of your hands as though you were going to pull the trigger of a pistol with your arm bent. As for the pistol itself, when all is said, you can put that in your pocket!\" And he added, \"Let this be clearly understood, or I will answer for nothing. It is a matter of life and death. And now, silence and follow me!\"\n\nThe cellars of the Opera are enormous and they are five in number. Raoul followed the Persian and wondered what he would have done without his companion in that extraordinary labyrinth. They went down to the third cellar; and their progress was still lit by some distant lamp.\n\nThe lower they went, the more precautions the Persian seemed to take. He kept on turning to Raoul to see if he was holding his arm properly, showing him how he himself carried his hand as if always ready to fire, though the pistol was in his pocket.\n\nSuddenly, a loud voice made them stop. Some one above them shouted:\n\n\"All the door-shutters on the stage! The commissary of police wants them!\"\n\nSteps were heard and shadows glided through the darkness. The Persian drew Raoul behind a set piece. They saw passing before and above them old men bent by age and the past burden of opera-scenery. Some could hardly drag themselves along; others, from habit, with stooping bodies and outstretched hands, looked for doors to shut.\n\nThey were the door-shutters, the old, worn-out scene-shifters, on whom a charitable management had taken pity, giving them the job of shutting doors above and below the stage. They went about incessantly, from top to bottom of the building, shutting the doors; and they were also called \"The draft-expellers,\" at least at that time, for I have little doubt that by now they are all dead. Drafts are very bad for the voice, wherever they may come from.[1]\n\nThe two men might have stumbled over them, waking them up and provoking a request for explanations. For the moment, M. Mifroid's inquiry saved them from any such unpleasant encounters.\n\nThe Persian and Raoul welcomed this incident, which relieved them of inconvenient witnesses, for some of those door-shutters, having nothing else to do or nowhere to lay their heads, stayed at the Opera, from idleness or necessity, and spent the night there.\n\nBut they were not left to enjoy their solitude for long. Other shades now came down by the same way by which the door-shutters had gone up. Each of these shades carried a little lantern and moved it about, above, below and all around, as though looking for something or somebody.\n\n\"Hang it!\" muttered the Persian. \"I don't know what they are looking for, but they might easily find us ... Let us get away, quick! ... Your hand up, sir, ready to fire! ... Bend your arm ... more ... that's it! ... Hand at the level of your eye, as though you were fighting a duel and waiting for the word to fire! Oh, leave your pistol in your pocket. Quick, come along, down-stairs. Level of your eye! Question of life or death! ... Here, this way, these stairs!\" They reached the fifth cellar. \"Oh, what a duel, sir, what a duel!\"\n\nOnce in the fifth cellar, the Persian drew breath. He seemed to enjoy a rather greater sense of security than he had displayed when they both stopped in the third; but he never altered the attitude of his hand. And Raoul, remembering the Persian's observation—\"I know these pistols can be relied upon\"—was more and more astonished, wondering why any one should be so gratified at being able to rely upon a pistol which he did not intend to use!\n\nBut the Persian left him no time for reflection. Telling Raoul to stay where he was, he ran up a few steps of the staircase which they had just left and then returned.\n\n\"How stupid of us!\" he whispered. \"We shall soon have seen the end of those men with their lanterns. It is the firemen going their rounds.\"[2]\n\nThe two men waited five minutes longer. Then the Persian took Raoul up the stairs again; but suddenly he stopped him with a gesture. Something moved in the darkness before them.\n\n\"Flat on your stomach!\" whispered the Persian.\n\nThe two men lay flat on the floor.\n\nThey were only just in time. A shade, this time carrying no light, just a shade in the shade, passed. It passed close to them, near enough to touch them.\n\nThey felt the warmth of its cloak upon them. For they could distinguish the shade sufficiently to see that it wore a cloak which shrouded it from head to foot. On its head it had a soft felt hat ...\n\nIt moved away, drawing its feet against the walls and sometimes giving a kick into a corner.\n\n\"Whew!\" said the Persian. \"We've had a narrow escape; that shade knows me and has twice taken me to the managers' office.\"\n\n\"Is it some one belonging to the theater police?\" asked Raoul.\n\n\"It's some one much worse than that!\" replied the Persian, without giving any further explanation.[3]\n\n\"It's not ... he?\"\n\n\"He? ... If he does not come behind us, we shall always see his yellow eyes! That is more or less our safeguard to-night. But he may come from behind, stealing up; and we are dead men if we do not keep our hands as though about to fire, at the level of our eyes, in front!\"\n\nThe Persian had hardly finished speaking, when a fantastic face came in sight ... a whole fiery face, not only two yellow eyes!\n\nYes, a head of fire came toward them, at a man's height, but with no body attached to it. The face shed fire, looked in the darkness like a flame shaped as a man's face.\n\n\"Oh,\" said the Persian, between his teeth. \"I have never seen this before! ... Pampin was not mad, after all: he had seen it! ... What can that flame be? It is not HE, but he may have sent it! ... Take care! ... Take care! Your hand at the level of your eyes, in Heaven's name, at the level of your eyes! ... know most of his tricks ... but not this one ... Come, let us run ... it is safer. Hand at the level of your eyes!\"\n\nAnd they fled down the long passage that opened before them.\n\nAfter a few seconds, that seemed to them like long minutes, they stopped.\n\n\"He doesn't often come this way,\" said the Persian. \"This side has nothing to do with him. This side does not lead to the lake nor to the house on the lake ... But perhaps he knows that we are at his heels ... although I promised him to leave him alone and never to meddle in his business again!\"\n\nSo saying, he turned his head and Raoul also turned his head; and they again saw the head of fire behind their two heads. It had followed them. And it must have run also, and perhaps faster than they, for it seemed to be nearer to them.\n\nAt the same time, they began to perceive a certain noise of which they could not guess the nature. They simply noticed that the sound seemed to move and to approach with the fiery face. It was a noise as though thousands of nails had been scraped against a blackboard, the perfectly unendurable noise that is sometimes made by a little stone inside the chalk that grates on the blackboard.\n\nThey continued to retreat, but the fiery face came on, came on, gaining on them. They could see its features clearly now. The eyes were round and staring, the nose a little crooked and the mouth large, with a hanging lower lip, very like the eyes, nose and lip of the moon, when the moon is quite red, bright red.\n\nHow did that red moon manage to glide through the darkness, at a man's height, with nothing to support it, at least apparently? And how did it go so fast, so straight ahead, with such staring, staring eyes? And what was that scratching, scraping, grating sound which it brought with it?\n\nThe Persian and Raoul could retreat no farther and flattened themselves against the wall, not knowing what was going to happen because of that incomprehensible head of fire, and especially now, because of the more intense, swarming, living, \"numerous\" sound, for the sound was certainly made up of hundreds of little sounds that moved in the darkness, under the fiery face.\n\nAnd the fiery face came on ... with its noise ... came level with them! ...\n\nAnd the two companions, flat against their wall, felt their hair stand on end with horror, for they now knew what the thousand noises meant. They came in a troop, hustled along in the shadow by innumerable little hurried waves, swifter than the waves that rush over the sands at high tide, little night-waves foaming under the moon, under the fiery head that was like a moon. And the little waves passed between their legs, climbing up their legs, irresistibly, and Raoul and the Persian could no longer restrain their cries of horror, dismay and pain. Nor could they continue to hold their hands at the level of their eyes: their hands went down to their legs to push back the waves, which were full of little legs and nails and claws and teeth.\n\nYes, Raoul and the Persian were ready to faint, like Pampin the fireman. But the head of fire turned round in answer to their cries, and spoke to them:\n\n\"Don't move! Don't move! ... Whatever you do, don't come after me! ... I am the rat-catcher! ... Let me pass, with my rats! ...\"\n\nAnd the head of fire disappeared, vanished in the darkness, while the passage in front of it lit up, as the result of the change which the rat-catcher had made in his dark lantern. Before, so as not to scare the rats in front of him, he had turned his dark lantern on himself, lighting up his own head; now, to hasten their flight, he lit the dark space in front of him. And he jumped along, dragging with him the waves of scratching rats, all the thousand sounds.\n\nRaoul and the Persian breathed again, though still trembling.\n\n\"I ought to have remembered that Erik talked to me about the rat-catcher,\" said the Persian. \"But he never told me that he looked like that ... and it's funny that I should never have met him before ... Of course, Erik never comes to this part!\"\n\n[Illustration: two page color illustration]\n\n\"Are we very far from the lake, sir?\" asked Raoul. \"When shall we get there? ... Take me to the lake, oh, take me to the lake! ... When we are at the lake, we will call out! ... Christine will hear us! ... And HE will hear us, too! ... And, as you know him, we shall talk to him!\" \"Baby!\" said the Persian. \"We shall never enter the house on the lake by the lake! ... I myself have never landed on the other bank ... the bank on which the house stands. ... You have to cross the lake first ... and it is well guarded! ... I fear that more than one of those men—old scene-shifters, old door-shutters—who have never been seen again were simply tempted to cross the lake ... It is terrible ... I myself would have been nearly killed there ... if the monster had not recognized me in time! ... One piece of advice, sir; never go near the lake... And, above all, shut your ears if you hear the voice singing under the water, the siren's voice!\"\n\n\"But then, what are we here for?\" asked Raoul, in a transport of fever, impatience and rage. \"If you can do nothing for Christine, at least let me die for her!\" The Persian tried to calm the young man.\n\n\"We have only one means of saving Christine Daae, believe me, which is to enter the house unperceived by the monster.\"\n\n\"And is there any hope of that, sir?\"\n\n\"Ah, if I had not that hope, I would not have come to fetch you!\"\n\n\"And how can one enter the house on the lake without crossing the lake?\"\n\n\"From the third cellar, from which we were so unluckily driven away. We will go back there now ... I will tell you,\" said the Persian, with a sudden change in his voice, \"I will tell you the exact place, sir: it is between a set piece and a discarded scene from ROI DE LAHORE, exactly at the spot where Joseph Buquet died... Come, sir, take courage and follow me! And hold your hand at the level of your eyes! ... But where are we?\"\n\nThe Persian lit his lamp again and flung its rays down two enormous corridors that crossed each other at right angles.\n\n\"We must be,\" he said, \"in the part used more particularly for the waterworks. I see no fire coming from the furnaces.\"\n\nHe went in front of Raoul, seeking his road, stopping abruptly when he was afraid of meeting some waterman. Then they had to protect themselves against the glow of a sort of underground forge, which the men were extinguishing, and at which Raoul recognized the demons whom Christine had seen at the time of her first captivity.\n\nIn this way, they gradually arrived beneath the huge cellars below the stage. They must at this time have been at the very bottom of the \"tub\" and at an extremely great depth, when we remember that the earth was dug out at fifty feet below the water that lay under the whole of that part of Paris.[4]\n\nThe Persian touched a partition-wall and said:\n\n\"If I am not mistaken, this is a wall that might easily belong to the house on the lake.\"\n\nHe was striking a partition-wall of the \"tub,\" and perhaps it would be as well for the reader to know how the bottom and the partition-walls of the tub were built. In order to prevent the water surrounding the building-operations from remaining in immediate contact with the walls supporting the whole of the theatrical machinery, the architect was obliged to build a double case in every direction. The work of constructing this double case took a whole year. It was the wall of the first inner case that the Persian struck when speaking to Raoul of the house on the lake. To any one understanding the architecture of the edifice, the Persian's action would seem to indicate that Erik's mysterious house had been built in the double case, formed of a thick wall constructed as an embankment or dam, then of a brick wall, a tremendous layer of cement and another wall several yards in thickness.\n\nAt the Persian's words, Raoul flung himself against the wall and listened eagerly. But he heard nothing ... nothing ... except distant steps sounding on the floor of the upper portions of the theater.\n\nThe Persian darkened his lantern again.\n\n\"Look out!\" he said. \"Keep your hand up! And silence! For we shall try another way of getting in.\"\n\nAnd he led him to the little staircase by which they had come down lately.\n\nThey went up, stopping at each step, peering into the darkness and the silence, till they came to the third cellar. Here the Persian motioned to Raoul to go on his knees; and, in this way, crawling on both knees and one hand—for the other hand was held in the position indicated—they reached the end wall.\n\nAgainst this wall stood a large discarded scene from the ROI DE LAHORE. Close to this scene was a set piece. Between the scene and the set piece there was just room for a body ... for a body which one day was found hanging there. The body of Joseph Buquet.\n\nThe Persian, still kneeling, stopped and listened. For a moment, he seemed to hesitate and looked at Raoul; then he turned his eyes upward, toward the second cellar, which sent down the faint glimmer of a lantern, through a cranny between two boards. This glimmer seemed to trouble the Persian.\n\nAt last, he tossed his head and made up his mind to act. He slipped between the set piece and the scene from the ROI DE LAHORE, with Raoul close upon his heels. With his free hand, the Persian felt the wall. Raoul saw him bear heavily upon the wall, just as he had pressed against the wall in Christine's dressing-room. Then a stone gave way, leaving a hole in the wall.\n\nThis time, the Persian took his pistol from his pocket and made a sign to Raoul to do as he did. He cocked the pistol.\n\nAnd, resolutely, still on his knees, he wiggled through the hole in the wall. Raoul, who had wished to pass first, had to be content to follow him.\n\nThe hole was very narrow. The Persian stopped almost at once. Raoul heard him feeling the stones around him. Then the Persian took out his dark lantern again, stooped forward, examined something beneath him and immediately extinguished his lantern. Raoul heard him say, in a whisper:\n\n\"We shall have to drop a few yards, without making a noise; take off your boots.\"\n\nThe Persian handed his own shoes to Raoul.\n\n\"Put them outside the wall,\" he said. \"We shall find them there when we leave.\"[5]\n\nHe crawled a little farther on his knees, then turned right round and said:\n\n\"I am going to hang by my hands from the edge of the stone and let myself drop INTO HIS HOUSE. You must do exactly the same. Do not be afraid. I will catch you in my arms.\"\n\nRaoul soon heard a dull sound, evidently produced by the fall of the Persian, and then dropped down.\n\nHe felt himself clasped in the Persian's arms.\n\n\"Hush!\" said the Persian.\n\nAnd they stood motionless, listening.\n\nThe darkness was thick around them, the silence heavy and terrible.\n\nThen the Persian began to make play with the dark lantern again, turning the rays over their heads, looking for the hole through which they had come, and failing to find it:\n\n\"Oh!\" he said. \"The stone has closed of itself!\"\n\nAnd the light of the lantern swept down the wall and over the floor.\n\nThe Persian stooped and picked up something, a sort of cord, which he examined for a second and flung away with horror.\n\n\"The Punjab lasso!\" he muttered.\n\n\"What is it?\" asked Raoul.\n\nThe Persian shivered. \"It might very well be the rope by which the man was hanged, and which was looked for so long.\"\n\nAnd, suddenly seized with fresh anxiety, he moved the little red disk of his lantern over the walls. In this way, he lit up a curious thing: the trunk of a tree, which seemed still quite alive, with its leaves; and the branches of that tree ran right up the walls and disappeared in the ceiling.\n\nBecause of the smallness of the luminous disk, it was difficult at first to make out the appearance of things: they saw a corner of a branch ... and a leaf ... and another leaf ... and, next to it, nothing at all, nothing but the ray of light that seemed to reflect itself ... Raoul passed his hand over that nothing, over that reflection.\n\n\"Hullo!\" he said. \"The wall is a looking-glass!\"\n\n\"Yes, a looking-glass!\" said the Persian, in a tone of deep emotion. And, passing the hand that held the pistol over his moist forehead, he added, \"We have dropped into the torture-chamber!\"\n\nWhat the Persian knew of this torture-chamber and what there befell him and his companion shall be told in his own words, as set down in a manuscript which he left behind him, and which I copy VERBATIM.\n\n\n\n[1] M. Pedro Gailhard has himself told me that he created a few additional posts as door-shutters for old stage-carpenters whom he was unwilling to dismiss from the service of the Opera.\n\n[2] In those days, it was still part of the firemen's duty to watch over the safety of the Opera house outside the performances; but this service has since been suppressed. I asked M. Pedro Gailhard the reason, and he replied:\n\n\"It was because the management was afraid that, in their utter inexperience of the cellars of the Opera, the firemen might set fire to the building!\"\n\n[3] Like the Persian, I can give no further explanation touching the apparition of this shade. Whereas, in this historic narrative, everything else will be normally explained, however abnormal the course of events may seem, I can not give the reader expressly to understand what the Persian meant by the words, \"It is some one much worse than that!\" The reader must try to guess for himself, for I promised M. Pedro Gailhard, the former manager of the Opera, to keep his secret regarding the extremely interesting and useful personality of the wandering, cloaked shade which, while condemning itself to live in the cellars of the Opera, rendered such immense services to those who, on gala evenings, for instance, venture to stray away from the stage. I am speaking of state services; and, upon my word of honor, I can say no more.\n\n[4] All the water had to be exhausted, in the building of the Opera. To give an idea of the amount of water that was pumped up, I can tell the reader that it represented the area of the courtyard of the Louvre and a height half as deep again as the towers of Notre Dame. And nevertheless the engineers had to leave a lake.\n\n[5] These two pairs of boots, which were placed, according to the Persian's papers, just between the set piece and the scene from the ROI DE LAHORE, on the spot where Joseph Buquet was found hanging, were never discovered. They must have been taken by some stage-carpenter or \"door-shutter.\"\n\n\n\n\nChapter XXI Interesting and Instructive Vicissitudes\nof a Persian in the Cellars of the Opera\n\nTHE PERSIAN'S NARRATIVE\n\nIt was the first time that I entered the house on the lake. I had often begged the \"trap-door lover,\" as we used to call Erik in my country, to open its mysterious doors to me. He always refused. I made very many attempts, but in vain, to obtain admittance. Watch him as I might, after I first learned that he had taken up his permanent abode at the Opera, the darkness was always too thick to enable me to see how he worked the door in the wall on the lake. One day, when I thought myself alone, I stepped into the boat and rowed toward that part of the wall through which I had seen Erik disappear. It was then that I came into contact with the siren who guarded the approach and whose charm was very nearly fatal to me.\n\nI had no sooner put off from the bank than the silence amid which I floated on the water was disturbed by a sort of whispered singing that hovered all around me. It was half breath, half music; it rose softly from the waters of the lake; and I was surrounded by it through I knew not what artifice. It followed me, moved with me and was so soft that it did not alarm me. On the contrary, in my longing to approach the source of that sweet and enticing harmony, I leaned out of my little boat over the water, for there was no doubt in my mind that the singing came from the water itself. By this time, I was alone in the boat in the middle of the lake; the voice—for it was now distinctly a voice—was beside me, on the water. I leaned over, leaned still farther. The lake was perfectly calm, and a moonbeam that passed through the air hole in the Rue Scribe showed me absolutely nothing on its surface, which was smooth and black as ink. I shook my ears to get rid of a possible humming; but I soon had to accept the fact that there was no humming in the ears so harmonious as the singing whisper that followed and now attracted me.\n\nHad I been inclined to superstition, I should have certainly thought that I had to do with some siren whose business it was to confound the traveler who should venture on the waters of the house on the lake. Fortunately, I come from a country where we are too fond of fantastic things not to know them through and through; and I had no doubt but that I was face to face with some new invention of Erik's. But this invention was so perfect that, as I leaned out of the boat, I was impelled less by a desire to discover its trick than to enjoy its charm; and I leaned out, leaned out until I almost overturned the boat.\n\nSuddenly, two monstrous arms issued from the bosom of the waters and seized me by the neck, dragging me down to the depths with irresistible force. I should certainly have been lost, if I had not had time to give a cry by which Erik knew me. For it was he; and, instead of drowning me, as was certainly his first intention, he swam with me and laid me gently on the bank:\n\n\"How imprudent you are!\" he said, as he stood before me, dripping with water. \"Why try to enter my house? I never invited you! I don't want you there, nor anybody! Did you save my life only to make it unbearable to me? However great the service you rendered him, Erik may end by forgetting it; and you know that nothing can restrain Erik, not even Erik himself.\"\n\nHe spoke, but I had now no other wish than to know what I already called the trick of the siren. He satisfied my curiosity, for Erik, who is a real monster—I have seen him at work in Persia, alas—is also, in certain respects, a regular child, vain and self-conceited, and there is nothing he loves so much, after astonishing people, as to prove all the really miraculous ingenuity of his mind.\n\nHe laughed and showed me a long reed.\n\n\"It's the silliest trick you ever saw,\" he said, \"but it's very useful for breathing and singing in the water. I learned it from the Tonkin pirates, who are able to remain hidden for hours in the beds of the rivers.\"[1]\n\nI spoke to him severely.\n\n\"It's a trick that nearly killed me!\" I said. \"And it may have been fatal to others! You know what you promised me, Erik? No more murders!\"\n\n\"Have I really committed murders?\" he asked, putting on his most amiable air.\n\n\"Wretched man!\" I cried. \"Have you forgotten the rosy hours of Mazenderan?\"\n\n\"Yes,\" he replied, in a sadder tone, \"I prefer to forget them. I used to make the little sultana laugh, though!\"\n\n\"All that belongs to the past,\" I declared; \"but there is the present ... and you are responsible to me for the present, because, if I had wished, there would have been none at all for you. Remember that, Erik: I saved your life!\"\n\nAnd I took advantage of the turn of conversation to speak to him of something that had long been on my mind:\n\n\"Erik,\" I asked, \"Erik, swear that ...\"\n\n\"What?\" he retorted. \"You know I never keep my oaths. Oaths are made to catch gulls with.\"\n\n\"Tell me ... you can tell me, at any rate...\"\n\n\"Well?\"\n\n\"Well, the chandelier ... the chandelier, Erik? ...\"\n\n\"What about the chandelier?\"\n\n\"You know what I mean.\"\n\n\"Oh,\" he sniggered, \"I don't mind telling you about the chandelier! ... IT WASN'T I! ... The chandelier was very old and worn.\"\n\nWhen Erik laughed, he was more terrible than ever. He jumped into the boat, chuckling so horribly that I could not help trembling.\n\n\"Very old and worn, my dear daroga![2] Very old and worn, the chandelier! ... It fell of itself! ... It came down with a smash! ... And now, daroga, take my advice and go and dry yourself, or you'll catch a cold in the head! ... And never get into my boat again ... And, whatever you do, don't try to enter my house: I'm not always there ... daroga! And I should be sorry to have to dedicate my Requiem Mass to you!\"\n\nSo saying, swinging to and fro, like a monkey, and still chuckling, he pushed off and soon disappeared in the darkness of the lake.\n\nFrom that day, I gave up all thought of penetrating into his house by the lake. That entrance was obviously too well guarded, especially since he had learned that I knew about it. But I felt that there must be another entrance, for I had often seen Erik disappear in the third cellar, when I was watching him, though I could not imagine how.\n\nEver since I had discovered Erik installed in the Opera, I lived in a perpetual terror of his horrible fancies, not in so far as I was concerned, but I dreaded everything for others.[3]\n\nAnd whenever some accident, some fatal event happened, I always thought to myself, \"I should not be surprised if that were Erik,\" even as others used to say, \"It's the ghost!\" How often have I not heard people utter that phrase with a smile! Poor devils! If they had known that the ghost existed in the flesh, I swear they would not have laughed!\n\nAlthough Erik announced to me very solemnly that he had changed and that he had become the most virtuous of men SINCE HE WAS LOVED FOR HIMSELF—a sentence that, at first, perplexed me most terribly—I could not help shuddering when I thought of the monster. His horrible, unparalleled and repulsive ugliness put him without the pale of humanity; and it often seemed to me that, for this reason, he no longer believed that he had any duty toward the human race. The way in which he spoke of his love affairs only increased my alarm, for I foresaw the cause of fresh and more hideous tragedies in this event to which he alluded so boastfully.\n\nOn the other hand, I soon discovered the curious moral traffic established between the monster and Christine Daae. Hiding in the lumber-room next to the young prima donna's dressing-room, I listened to wonderful musical displays that evidently flung Christine into marvelous ecstasy; but, all the same, I would never have thought that Erik's voice—which was loud as thunder or soft as angels' voices, at will—could have made her forget his ugliness. I understood all when I learned that Christine had not yet seen him! I had occasion to go to the dressing-room and, remembering the lessons he had once given me, I had no difficulty in discovering the trick that made the wall with the mirror swing round and I ascertained the means of hollow bricks and so on—by which he made his voice carry to Christine as though she heard it close beside her. In this way also I discovered the road that led to the well and the dungeon—the Communists' dungeon—and also the trap-door that enabled Erik to go straight to the cellars below the stage.\n\nA few days later, what was not my amazement to learn by my own eyes and ears that Erik and Christine Daae saw each other and to catch the monster stooping over the little well, in the Communists' road and sprinkling the forehead of Christine Daae, who had fainted. A white horse, the horse out of the PROFETA, which had disappeared from the stables under the Opera, was standing quietly beside them. I showed myself. It was terrible. I saw sparks fly from those yellow eyes and, before I had time to say a word, I received a blow on the head that stunned me.\n\nWhen I came to myself, Erik, Christine and the white horse had disappeared. I felt sure that the poor girl was a prisoner in the house on the lake. Without hesitation, I resolved to return to the bank, notwithstanding the attendant danger. For twenty-four hours, I lay in wait for the monster to appear; for I felt that he must go out, driven by the need of obtaining provisions. And, in this connection, I may say, that, when he went out in the streets or ventured to show himself in public, he wore a pasteboard nose, with a mustache attached to it, instead of his own horrible hole of a nose. This did not quite take away his corpse-like air, but it made him almost, I say almost, endurable to look at.\n\nI therefore watched on the bank of the lake and, weary of long waiting, was beginning to think that he had gone through the other door, the door in the third cellar, when I heard a slight splashing in the dark, I saw the two yellow eyes shining like candles and soon the boat touched shore. Erik jumped out and walked up to me:\n\n\"You've been here for twenty-four hours,\" he said, \"and you're annoying me. I tell you, all this will end very badly. And you will have brought it upon yourself; for I have been extraordinarily patient with you. You think you are following me, you great booby, whereas it's I who am following you; and I know all that you know about me, here. I spared you yesterday, in MY COMMUNISTS' ROAD; but I warn you, seriously, don't let me catch you there again! Upon my word, you don't seem able to take a hint!\"\n\nHe was so furious that I did not think, for the moment, of interrupting him. After puffing and blowing like a walrus, he put his horrible thought into words:\n\n\"Yes, you must learn, once and for all—once and for all, I say—to take a hint! I tell you that, with your recklessness—for you have already been twice arrested by the shade in the felt hat, who did not know what you were doing in the cellars and took you to the managers, who looked upon you as an eccentric Persian interested in stage mechanism and life behind the scenes: I know all about it, I was there, in the office; you know I am everywhere—well, I tell you that, with your recklessness, they will end by wondering what you are after here ... and they will end by knowing that you are after Erik ... and then they will be after Erik themselves and they will discover the house on the lake ... If they do, it will be a bad lookout for you, old chap, a bad lookout! ... I won't answer for anything.\"\n\nAgain he puffed and blew like a walrus.\n\n\"I won't answer for anything! ... If Erik's secrets cease to be Erik's secrets, IT WILL BE A BAD LOOKOUT FOR A GOODLY NUMBER OF THE HUMAN RACE! That's all I have to tell you, and unless you are a great booby, it ought to be enough for you ... except that you don't know how to take a hint.\"\n\nHe had sat down on the stern of his boat and was kicking his heels against the planks, waiting to hear what I had to answer. I simply said:\n\n\"It's not Erik that I'm after here!\"\n\n\"Who then?\"\n\n\"You know as well as I do: it's Christine Daae,\" I answered.\n\nHe retorted: \"I have every right to see her in my own house. I am loved for my own sake.\"\n\n\"That's not true,\" I said. \"You have carried her off and are keeping her locked up.\"\n\n\"Listen,\" he said. \"Will you promise never to meddle with my affairs again, if I prove to you that I am loved for my own sake?\"\n\n\"Yes, I promise you,\" I replied, without hesitation, for I felt convinced that for such a monster the proof was impossible.\n\n\"Well, then, it's quite simple ... Christine Daae shall leave this as she pleases and come back again! ... Yes, come back again, because she wishes ... come back of herself, because she loves me for myself! ...\"\n\n\"Oh, I doubt if she will come back! ... But it is your duty to let her go.\" \"My duty, you great booby! ... It is my wish ... my wish to let her go; and she will come back again ... for she loves me! ... All this will end in a marriage ... a marriage at the Madeleine, you great booby! Do you believe me now? When I tell you that my nuptial mass is written ... wait till you hear the KYRIE...\"\n\nHe beat time with his heels on the planks of the boat and sang:\n\n\"KYRIE! ... KYRIE! ... KYRIE ELEISON! ... Wait till you hear, wait till you hear that mass.\"\n\n\"Look here,\" I said. \"I shall believe you if I see Christine Daae come out of the house on the lake and go back to it of her own accord.\"\n\n\"And you won't meddle any more in my affairs?\"\n\n\"No.\"\n\n\"Very well, you shall see that to-night. Come to the masked ball. Christine and I will go and have a look round. Then you can hide in the lumber-room and you shall see Christine, who will have gone to her dressing-room, delighted to come back by the Communists' road... And, now, be off, for I must go and do some shopping!\"\n\nTo my intense astonishment, things happened as he had announced. Christine Daae left the house on the lake and returned to it several times, without, apparently, being forced to do so. It was very difficult for me to clear my mind of Erik. However, I resolved to be extremely prudent, and did not make the mistake of returning to the shore of the lake, or of going by the Communists' road. But the idea of the secret entrance in the third cellar haunted me, and I repeatedly went and waited for hours behind a scene from the Roi de Lahore, which had been left there for some reason or other. At last my patience was rewarded. One day, I saw the monster come toward me, on his knees. I was certain that he could not see me. He passed between the scene behind which I stood and a set piece, went to the wall and pressed on a spring that moved a stone and afforded him an ingress. He passed through this, and the stone closed behind him.\n\nI waited for at least thirty minutes and then pressed the spring in my turn. Everything happened as with Erik. But I was careful not to go through the hole myself, for I knew that Erik was inside. On the other hand, the idea that I might be caught by Erik suddenly made me think of the death of Joseph Buquet. I did not wish to jeopardize the advantages of so great a discovery which might be useful to many people, \"to a goodly number of the human race,\" in Erik's words; and I left the cellars of the Opera after carefully replacing the stone.\n\nI continued to be greatly interested in the relations between Erik and Christine Daae, not from any morbid curiosity, but because of the terrible thought which obsessed my mind that Erik was capable of anything, if he once discovered that he was not loved for his own sake, as he imagined. I continued to wander, very cautiously, about the Opera and soon learned the truth about the monster's dreary love-affair.\n\nHe filled Christine's mind, through the terror with which he inspired her, but the dear child's heart belonged wholly to the Vicomte Raoul de Chagny. While they played about, like an innocent engaged couple, on the upper floors of the Opera, to avoid the monster, they little suspected that some one was watching over them. I was prepared to do anything: to kill the monster, if necessary, and explain to the police afterward. But Erik did not show himself; and I felt none the more comfortable for that.\n\nI must explain my whole plan. I thought that the monster, being driven from his house by jealousy, would thus enable me to enter it, without danger, through the passage in the third cellar. It was important, for everybody's sake, that I should know exactly what was inside. One day, tired of waiting for an opportunity, I moved the stone and at once heard an astounding music: the monster was working at his Don Juan Triumphant, with every door in his house wide open. I knew that this was the work of his life. I was careful not to stir and remained prudently in my dark hole.\n\nHe stopped playing, for a moment, and began walking about his place, like a madman. And he said aloud, at the top of his voice:\n\n\"It must be finished FIRST! Quite finished!\"\n\nThis speech was not calculated to reassure me and, when the music recommenced, I closed the stone very softly.\n\nOn the day of the abduction of Christine Daae, I did not come to the theater until rather late in the evening, trembling lest I should hear bad news. I had spent a horrible day, for, after reading in a morning paper the announcement of a forthcoming marriage between Christine and the Vicomte de Chagny, I wondered whether, after all, I should not do better to denounce the monster. But reason returned to me, and I was persuaded that this action could only precipitate a possible catastrophe.\n\nWhen, my cab set me down before the Opera, I was really almost astonished to see it still standing! But I am something of a fatalist, like all good Orientals, and I entered ready, for anything.\n\nChristine Daae's abduction in the Prison Act, which naturally surprised everybody, found me prepared. I was quite certain that she had been juggled away by Erik, that prince of conjurers. And I thought positively that this was the end of Christine and perhaps of everybody, so much so that I thought of advising all these people who were staying on at the theater to make good their escape. I felt, however, that they would be sure to look upon me as mad and I refrained.\n\nOn the other hand, I resolved to act without further delay, as far as I was concerned. The chances were in my favor that Erik, at that moment, was thinking only of his captive. This was the moment to enter his house through the third cellar; and I resolved to take with me that poor little desperate viscount, who, at the first suggestion, accepted, with an amount of confidence in myself that touched me profoundly. I had sent my servant for my pistols. I gave one to the viscount and advised him to hold himself ready to fire, for, after all, Erik might be waiting for us behind the wall. We were to go by the Communists' road and through the trap-door.\n\nSeeing my pistols, the little viscount asked me if we were going to fight a duel. I said:\n\n\"Yes; and what a duel!\" But, of course, I had no time to explain anything to him. The little viscount is a brave fellow, but he knew hardly anything about his adversary; and it was so much the better. My great fear was that he was already somewhere near us, preparing the Punjab lasso. No one knows better than he how to throw the Punjab lasso, for he is the king of stranglers even as he is the prince of conjurors. When he had finished making the little sultana laugh, at the time of the \"rosy hours of Mazenderan,\" she herself used to ask him to amuse her by giving her a thrill. It was then that he introduced the sport of the Punjab lasso.\n\nHe had lived in India and acquired an incredible skill in the art of strangulation. He would make them lock him into a courtyard to which they brought a warrior—usually, a man condemned to death—armed with a long pike and broadsword. Erik had only his lasso; and it was always just when the warrior thought that he was going to fell Erik with a tremendous blow that we heard the lasso whistle through the air. With a turn of the wrist, Erik tightened the noose round his adversary's neck and, in this fashion, dragged him before the little sultana and her women, who sat looking from a window and applauding. The little sultana herself learned to wield the Punjab lasso and killed several of her women and even of the friends who visited her. But I prefer to drop this terrible subject of the rosy hours of Mazenderan. I have mentioned it only to explain why, on arriving with the Vicomte de Chagny in the cellars of the Opera, I was bound to protect my companion against the ever-threatening danger of death by strangling. My pistols could serve no purpose, for Erik was not likely to show himself; but Erik could always strangle us. I had no time to explain all this to the viscount; besides, there was nothing to be gained by complicating the position. I simply told M. de Chagny to keep his hand at the level of his eyes, with the arm bent, as though waiting for the command to fire. With his victim in this attitude, it is impossible even for the most expert strangler to throw the lasso with advantage. It catches you not only round the neck, but also round the arm or hand. This enables you easily to unloose the lasso, which then becomes harmless.\n\nAfter avoiding the commissary of police, a number of door-shutters and the firemen, after meeting the rat-catcher and passing the man in the felt hat unperceived, the viscount and I arrived without obstacle in the third cellar, between the set piece and the scene from the Roi de Lahore. I worked the stone, and we jumped into the house which Erik had built himself in the double case of the foundation-walls of the Opera. And this was the easiest thing in the world for him to do, because Erik was one of the chief contractors under Philippe Garnier, the architect of the Opera, and continued to work by himself when the works were officially suspended, during the war, the siege of Paris and the Commune.\n\nI knew my Erik too well to feel at all comfortable on jumping into his house. I knew what he had made of a certain palace at Mazenderan. From being the most honest building conceivable, he soon turned it into a house of the very devil, where you could not utter a word but it was overheard or repeated by an echo. With his trap-doors the monster was responsible for endless tragedies of all kinds. He hit upon astonishing inventions. Of these, the most curious, horrible and dangerous was the so-called torture-chamber. Except in special cases, when the little sultana amused herself by inflicting suffering upon some unoffending citizen, no one was let into it but wretches condemned to death. And, even then, when these had \"had enough,\" they were always at liberty to put an end to themselves with a Punjab lasso or bowstring, left for their use at the foot of an iron tree.\n\nMy alarm, therefore, was great when I saw that the room into which M. le Vicomte de Chagny and I had dropped was an exact copy of the torture-chamber of the rosy hours of Mazenderan. At our feet, I found the Punjab lasso which I had been dreading all the evening. I was convinced that this rope had already done duty for Joseph Buquet, who, like myself, must have caught Erik one evening working the stone in the third cellar. He probably tried it in his turn, fell into the torture-chamber and only left it hanged. I can well imagine Erik dragging the body, in order to get rid of it, to the scene from the Roi de Lahore, and hanging it there as an example, or to increase the superstitious terror that was to help him in guarding the approaches to his lair! Then, upon reflection, Erik went back to fetch the Punjab lasso, which is very curiously made out of catgut, and which might have set an examining magistrate thinking. This explains the disappearance of the rope.\n\nAnd now I discovered the lasso, at our feet, in the torture-chamber! ... I am no coward, but a cold sweat covered my forehead as I moved the little red disk of my lantern over the walls.\n\nM. de Chagny noticed it and asked:\n\n\"What is the matter, sir?\"\n\nI made him a violent sign to be silent.\n\n\n\n[1] An official report from Tonkin, received in Paris at the end of July, 1909, relates how the famous pirate chief De Tham was tracked, together with his men, by our soldiers; and how all of them succeeded in escaping, thanks to this trick of the reeds.\n\n[2] DAROGA is Persian for chief of police.\n\n[3] The Persian might easily have admitted that Erik's fate also interested himself, for he was well aware that, if the government of Teheran had learned that Erik was still alive, it would have been all up with the modest pension of the erstwhile daroga. It is only fair, however, to add that the Persian had a noble and generous heart; and I do not doubt for a moment that the catastrophes which he feared for others greatly occupied his mind. His conduct, throughout this business, proves it and is above all praise.\n\n\n\n\nChapter XXII In the Torture Chamber\n\nTHE PERSIAN'S NARRATIVE CONTINUED\n\nWe were in the middle of a little six-cornered room, the sides of which were covered with mirrors from top to bottom. In the corners, we could clearly see the \"joins\" in the glasses, the segments intended to turn on their gear; yes, I recognized them and I recognized the iron tree in the corner, at the bottom of one of those segments ... the iron tree, with its iron branch, for the hanged men.\n\nI seized my companion's arm: the Vicomte de Chagny was all a-quiver, eager to shout to his betrothed that he was bringing her help. I feared that he would not be able to contain himself.\n\nSuddenly, we heard a noise on our left. It sounded at first like a door opening and shutting in the next room; and then there was a dull moan. I clutched M. de Chagny's arm more firmly still; and then we distinctly heard these words:\n\n\"You must make your choice! The wedding mass or the requiem mass!\" I recognized the voice of the monster.\n\nThere was another moan, followed by a long silence.\n\nI was persuaded by now that the monster was unaware of our presence in his house, for otherwise he would certainly have managed not to let us hear him. He would only have had to close the little invisible window through which the torture-lovers look down into the torture-chamber. Besides, I was certain that, if he had known of our presence, the tortures would have begun at once.\n\nThe important thing was not to let him know; and I dreaded nothing so much as the impulsiveness of the Vicomte de Chagny, who wanted to rush through the walls to Christine Daae, whose moans we continued to hear at intervals.\n\n\"The requiem mass is not at all gay,\" Erik's voice resumed, \"whereas the wedding mass—you can take my word for it—is magnificent! You must take a resolution and know your own mind! I can't go on living like this, like a mole in a burrow! Don Juan Triumphant is finished; and now I want to live like everybody else. I want to have a wife like everybody else and to take her out on Sundays. I have invented a mask that makes me look like anybody. People will not even turn round in the streets. You will be the happiest of women. And we will sing, all by ourselves, till we swoon away with delight. You are crying! You are afraid of me! And yet I am not really wicked. Love me and you shall see! All I wanted was to be loved for myself. If you loved me I should be as gentle as a lamb; and you could do anything with me that you pleased.\"\n\nSoon the moans that accompanied this sort of love's litany increased and increased. I have never heard anything more despairing; and M. de Chagny and I recognized that this terrible lamentation came from Erik himself. Christine seemed to be standing dumb with horror, without the strength to cry out, while the monster was on his knees before her.\n\nThree times over, Erik fiercely bewailed his fate:\n\n\"You don't love me! You don't love me! You don't love me!\"\n\nAnd then, more gently:\n\n\"Why do you cry? You know it gives me pain to see you cry!\"\n\nA silence.\n\nEach silence gave us fresh hope. We said to ourselves:\n\n\"Perhaps he has left Christine behind the wall.\"\n\nAnd we thought only of the possibility of warning Christine Daae of our presence, unknown to the monster. We were unable to leave the torture-chamber now, unless Christine opened the door to us; and it was only on this condition that we could hope to help her, for we did not even know where the door might be.\n\nSuddenly, the silence in the next room was disturbed by the ringing of an electric bell. There was a bound on the other side of the wall and Erik's voice of thunder:\n\n\"Somebody ringing! Walk in, please!\"\n\nA sinister chuckle.\n\n\"Who has come bothering now? Wait for me here ... I AM GOING TO TELL THE SIREN TO OPEN THE DOOR.\"\n\nSteps moved away, a door closed. I had no time to think of the fresh horror that was preparing; I forgot that the monster was only going out perhaps to perpetrate a fresh crime; I understood but one thing: Christine was alone behind the wall!\n\nThe Vicomte de Chagny was already calling to her:\n\n\"Christine! Christine!\"\n\nAs we could hear what was said in the next room, there was no reason why my companion should not be heard in his turn. Nevertheless, the viscount had to repeat his cry time after time.\n\nAt last, a faint voice reached us.\n\n\"I am dreaming!\" it said.\n\n\"Christine, Christine, it is I, Raoul!\"\n\nA silence.\n\n\"But answer me, Christine! ... In Heaven's name, if you are alone, answer me!\"\n\nThen Christine's voice whispered Raoul's name.\n\n\"Yes! Yes! It is I! It is not a dream! ... Christine, trust me! ... We are here to save you ... but be prudent! When you hear the monster, warn us!\"\n\nThen Christine gave way to fear. She trembled lest Erik should discover where Raoul was hidden; she told us in a few hurried words that Erik had gone quite mad with love and that he had decided TO KILL EVERYBODY AND HIMSELF WITH EVERYBODY if she did not consent to become his wife. He had given her till eleven o'clock the next evening for reflection. It was the last respite. She must choose, as he said, between the wedding mass and the requiem.\n\nAnd Erik had then uttered a phrase which Christine did not quite understand:\n\n\"Yes or no! If your answer is no, everybody will be dead AND BURIED!\"\n\nBut I understood the sentence perfectly, for it corresponded in a terrible manner with my own dreadful thought.\n\n\"Can you tell us where Erik is?\" I asked.\n\nShe replied that he must have left the house.\n\n\"Could you make sure?\"\n\n\"No. I am fastened. I can not stir a limb.\"\n\nWhen we heard this, M. de Chagny and I gave a yell of fury. Our safety, the safety of all three of us, depended on the girl's liberty of movement.\n\n\"But where are you?\" asked Christine. \"There are only two doors in my room, the Louis-Philippe room of which I told you, Raoul; a door through which Erik comes and goes, and another which he has never opened before me and which he has forbidden me ever to go through, because he says it is the most dangerous of the doors, the door of the torture-chamber!\"\n\n\"Christine, that is where we are!\"\n\n\"You are in the torture-chamber?\"\n\n\"Yes, but we can not see the door.\"\n\n\"Oh, if I could only drag myself so far! I would knock at the door and that would tell you where it is.\"\n\n\"Is it a door with a lock to it?\" I asked.\n\n\"Yes, with a lock.\"\n\n\"Mademoiselle,\" I said, \"it is absolutely necessary, that you should open that door to us!\"\n\n\"But how?\" asked the poor girl tearfully.\n\nWe heard her straining, trying to free herself from the bonds that held her.\n\n\"I know where the key is,\" she said, in a voice that seemed exhausted by the effort she had made. \"But I am fastened so tight ... Oh, the wretch!\"\n\nAnd she gave a sob.\n\n\"Where is the key?\" I asked, signing to M. de Chagny not to speak and to leave the business to me, for we had not a moment to lose.\n\n\"In the next room, near the organ, with another little bronze key, which he also forbade me to touch. They are both in a little leather bag which he calls the bag of life and death... Raoul! Raoul! Fly! Everything is mysterious and terrible here, and Erik will soon have gone quite mad, and you are in the torture-chamber! ... Go back by the way you came. There must be a reason why the room is called by that name!\"\n\n\"Christine,\" said the young man. \"We will go from here together or die together!\"\n\n\"We must keep cool,\" I whispered. \"Why has he fastened you, mademoiselle? You can't escape from his house; and he knows it!\"\n\n\"I tried to commit suicide! The monster went out last night, after carrying me here fainting and half chloroformed. He was going TO HIS BANKER, so he said! ... When he returned he found me with my face covered with blood ... I had tried to kill myself by striking my forehead against the walls.\"\n\n\"Christine!\" groaned Raoul; and he began to sob.\n\n\"Then he bound me ... I am not allowed to die until eleven o'clock to-morrow evening.\"\n\n\"Mademoiselle,\" I declared, \"the monster bound you ... and he shall unbind you. You have only to play the necessary part! Remember that he loves you!\"\n\n\"Alas!\" we heard. \"Am I likely to forget it!\"\n\n\"Remember it and smile to him ... entreat him ... tell him that your bonds hurt you.\"\n\nBut Christine Daae said:\n\n\"Hush! ... I hear something in the wall on the lake! ... It is he! ... Go away! Go away! Go away!\"\n\n\"We could not go away, even if we wanted to,\" I said, as impressively as I could. \"We can not leave this! And we are in the torture-chamber!\"\n\n\"Hush!\" whispered Christine again.\n\nHeavy steps sounded slowly behind the wall, then stopped and made the floor creak once more. Next came a tremendous sigh, followed by a cry of horror from Christine, and we heard Erik's voice:\n\n\"I beg your pardon for letting you see a face like this! What a state I am in, am I not? It's THE OTHER ONE'S FAULT! Why did he ring? Do I ask people who pass to tell me the time? He will never ask anybody the time again! It is the siren's fault.\"\n\n[Illustration: two page color illustration]\n\nAnother sigh, deeper, more tremendous still, came from the abysmal depths of a soul.\n\n\"Why did you cry out, Christine?\"\n\n\"Because I am in pain, Erik.\"\n\n\"I thought I had frightened you.\"\n\n\"Erik, unloose my bonds ... Am I not your prisoner?\"\n\n\"You will try to kill yourself again.\"\n\n\"You have given me till eleven o'clock to-morrow evening, Erik.\"\n\nThe footsteps dragged along the floor again.\n\n\"After all, as we are to die together ... and I am just as eager as you ... yes, I have had enough of this life, you know... Wait, don't move, I will release you ... You have only one word to say: 'NO!' And it will at once be over WITH EVERYBODY! ... You are right, you are right; why wait till eleven o'clock to-morrow evening? True, it would have been grander, finer ... But that is childish nonsense ... We should only think of ourselves in this life, of our own death ... the rest doesn't matter... YOU'RE LOOKING AT ME BECAUSE I AM ALL WET? ... Oh, my dear, it's raining cats and dogs outside! ... Apart from that, Christine, I think I am subject to hallucinations ... You know, the man who rang at the siren's door just now—go and look if he's ringing at the bottom of the lake-well, he was rather like... There, turn round ... are you glad? You're free now... Oh, my poor Christine, look at your wrists: tell me, have I hurt them? ... That alone deserves death ... Talking of death, I MUST SING HIS REQUIEM!\"\n\nHearing these terrible remarks, I received an awful presentiment ... I too had once rung at the monster's door ... and, without knowing it, must have set some warning current in motion.\n\nAnd I remembered the two arms that had emerged from the inky waters... What poor wretch had strayed to that shore this time? Who was 'the other one,' the one whose requiem we now heard sung?\n\nErik sang like the god of thunder, sang a DIES IRAE that enveloped us as in a storm. The elements seemed to rage around us. Suddenly, the organ and the voice ceased so suddenly that M. de Chagny sprang back, on the other side of the wall, with emotion. And the voice, changed and transformed, distinctly grated out these metallic syllables: \"WHAT HAVE YOU DONE WITH MY BAG?\"\n\n\n\n\nChapter XXIII The Tortures Begin\n\nTHE PERSIAN'S NARRATIVE CONTINUED.\n\nThe voice repeated angrily: \"What have you done with my bag? So it was to take my bag that you asked me to release you!\"\n\nWe heard hurried steps, Christine running back to the Louis-Philippe room, as though to seek shelter on the other side of our wall.\n\n\"What are you running away for?\" asked the furious voice, which had followed her. \"Give me back my bag, will you? Don't you know that it is the bag of life and death?\"\n\n\"Listen to me, Erik,\" sighed the girl. \"As it is settled that we are to live together ... what difference can it make to you?\"\n\n\"You know there are only two keys in it,\" said the monster. \"What do you want to do?\"\n\n\"I want to look at this room which I have never seen and which you have always kept from me ... It's woman's curiosity!\" she said, in a tone which she tried to render playful.\n\nBut the trick was too childish for Erik to be taken in by it.\n\n\"I don't like curious women,\" he retorted, \"and you had better remember the story of BLUE-BEARD and be careful ... Come, give me back my bag! ... Give me back my bag! ... Leave the key alone, will you, you inquisitive little thing?\"\n\nAnd he chuckled, while Christine gave a cry of pain. Erik had evidently recovered the bag from her.\n\nAt that moment, the viscount could not help uttering an exclamation of impotent rage.\n\n\"Why, what's that?\" said the monster. \"Did you hear, Christine?\"\n\n\"No, no,\" replied the poor girl. \"I heard nothing.\"\n\n\"I thought I heard a cry.\"\n\n\"A cry! Are you going mad, Erik? Whom do you expect to give a cry, in this house? ... I cried out, because you hurt me! I heard nothing.\"\n\n\"I don't like the way you said that! ... You're trembling... You're quite excited ... You're lying! ... That was a cry, there was a cry! ... There is some one in the torture-chamber! ... Ah, I understand now!\"\n\n\"There is no one there, Erik!\"\n\n\"I understand!\"\n\n\"No one!\"\n\n\"The man you want to marry, perhaps!\"\n\n\"I don't want to marry anybody, you know I don't.\"\n\nAnother nasty chuckle. \"Well, it won't take long to find out. Christine, my love, we need not open the door to see what is happening in the torture-chamber. Would you like to see? Would you like to see? Look here! If there is some one, if there is really some one there, you will see the invisible window light up at the top, near the ceiling. We need only draw the black curtain and put out the light in here. There, that's it ... Let's put out the light! You're not afraid of the dark, when you're with your little husband!\"\n\nThen we heard Christine's voice of anguish:\n\n\"No! ... I'm frightened! ... I tell you, I'm afraid of the dark! ... I don't care about that room now ... You're always frightening me, like a child, with your torture-chamber! ... And so I became inquisitive... But I don't care about it now ... not a bit ... not a bit!\"\n\nAnd that which I feared above all things began, AUTOMATICALLY. We were suddenly flooded with light! Yes, on our side of the wall, everything seemed aglow. The Vicomte de Chagny was so much taken aback that he staggered. And the angry voice roared:\n\n\"I told you there was some one! Do you see the window now? The lighted window, right up there? The man behind the wall can't see it! But you shall go up the folding steps: that is what they are there for! ... You have often asked me to tell you; and now you know! ... They are there to give a peep into the torture-chamber ... you inquisitive little thing!\"\n\n\"What tortures? ... Who is being tortured? ... Erik, Erik, say you are only trying to frighten me! ... Say it, if you love me, Erik! ... There are no tortures, are there?\"\n\n\"Go and look at the little window, dear!\"\n\nI do not know if the viscount heard the girl's swooning voice, for he was too much occupied by the astounding spectacle that now appeared before his distracted gaze. As for me, I had seen that sight too often, through the little window, at the time of the rosy hours of Mazenderan; and I cared only for what was being said next door, seeking for a hint how to act, what resolution to take.\n\n\"Go and peep through the little window! Tell me what he looks like!\"\n\nWe heard the steps being dragged against the wall.\n\n\"Up with you! ... No! ... No, I will go up myself, dear!\"\n\n\"Oh, very well, I will go up. Let me go!\"\n\n\"Oh, my darling, my darling! ... How sweet of you! ... How nice of you to save me the exertion at my age! ... Tell me what he looks like!\"\n\nAt that moment, we distinctly heard these words above our heads:\n\n\"There is no one there, dear!\"\n\n\"No one? ... Are you sure there is no one?\"\n\n\"Why, of course not ... no one!\"\n\n\"Well, that's all right! ... What's the matter, Christine? You're not going to faint, are you ... as there is no one there? ... Here ... come down ... there! ... Pull yourself together ... as there is no one there! ... BUT HOW DO YOU LIKE THE LANDSCAPE?\"\n\n\"Oh, very much!\"\n\n\"There, that's better! ... You're better now, are you not? ... That's all right, you're better! ... No excitement! ... And what a funny house, isn't it, with landscapes like that in it?\"\n\n\"Yes, it's like the Musee Grevin ... But, say, Erik ... there are no tortures in there! ... What a fright you gave me!\"\n\n\"Why ... as there is no one there?\"\n\n\"Did you design that room? It's very handsome. You're a great artist, Erik.\"\n\n\"Yes, a great artist, in my own line.\"\n\n\"But tell me, Erik, why did you call that room the torture-chamber?\"\n\n\"Oh, it's very simple. First of all, what did you see?\"\n\n\"I saw a forest.\"\n\n\"And what is in a forest?\"\n\n\"Trees.\"\n\n\"And what is in a tree?\"\n\n\"Birds.\"\n\n\"Did you see any birds?\"\n\n\"No, I did not see any birds.\"\n\n\"Well, what did you see? Think! You saw branches And what are the branches?\" asked the terrible voice. \"THERE'S A GIBBET! That is why I call my wood the torture-chamber! ... You see, it's all a joke. I never express myself like other people. But I am very tired of it! ... I'm sick and tired of having a forest and a torture-chamber in my house and of living like a mountebank, in a house with a false bottom! ... I'm tired of it! I want to have a nice, quiet flat, with ordinary doors and windows and a wife inside it, like anybody else! A wife whom I could love and take out on Sundays and keep amused on week-days ... Here, shall I show you some card-tricks? That will help us to pass a few minutes, while waiting for eleven o'clock to-morrow evening ... My dear little Christine! ... Are you listening to me? ... Tell me you love me! ... No, you don't love me ... but no matter, you will! ... Once, you could not look at my mask because you knew what was behind... And now you don't mind looking at it and you forget what is behind! ... One can get used to everything ... if one wishes... Plenty of young people who did not care for each other before marriage have adored each other since! Oh, I don't know what I am talking about! But you would have lots of fun with me. For instance, I am the greatest ventriloquist that ever lived, I am the first ventriloquist in the world! ... You're laughing ... Perhaps you don't believe me? Listen.\"\n\nThe wretch, who really was the first ventriloquist in the world, was only trying to divert the child's attention from the torture-chamber; but it was a stupid scheme, for Christine thought of nothing but us! She repeatedly besought him, in the gentlest tones which she could assume:\n\n\"Put out the light in the little window! ... Erik, do put out the light in the little window!\"\n\nFor she saw that this light, which appeared so suddenly and of which the monster had spoken in so threatening a voice, must mean something terrible. One thing must have pacified her for a moment; and that was seeing the two of us, behind the wall, in the midst of that resplendent light, alive and well. But she would certainly have felt much easier if the light had been put out.\n\nMeantime, the other had already begun to play the ventriloquist. He said:\n\n\"Here, I raise my mask a little ... Oh, only a little! ... You see my lips, such lips as I have? They're not moving! ... My mouth is closed—such mouth as I have—and yet you hear my voice... Where will you have it? In your left ear? In your right ear? In the table? In those little ebony boxes on the mantelpiece? ... Listen, dear, it's in the little box on the right of the mantelpiece: what does it say? 'SHALL I TURN THE SCORPION?' ... And now, crack! What does it say in the little box on the left? 'SHALL I TURN THE GRASSHOPPER?' ... And now, crack! Here it is in the little leather bag ... What does it say? 'I AM THE LITTLE BAG OF LIFE AND DEATH!' ... And now, crack! It is in Carlotta's throat, in Carlotta's golden throat, in Carlotta's crystal throat, as I live! What does it say? It says, 'It's I, Mr. Toad, it's I singing! I FEEL WITHOUT ALARM—CO-ACK—WITH ITS MELODY ENWIND ME—CO-ACK!' ... And now, crack! It is on a chair in the ghost's box and it says, 'MADAME CARLOTTA IS SINGING TO-NIGHT TO BRING THE CHANDELIER DOWN!' ... And now, crack! Aha! Where is Erik's voice now? Listen, Christine, darling! Listen! It is behind the door of the torture-chamber! Listen! It's myself in the torture-chamber! And what do I say? I say, 'Woe to them that have a nose, a real nose, and come to look round the torture-chamber! Aha, aha, aha!'\"\n\nOh, the ventriloquist's terrible voice! It was everywhere, everywhere. It passed through the little invisible window, through the walls. It ran around us, between us. Erik was there, speaking to us! We made a movement as though to fling ourselves upon him. But, already, swifter, more fleeting than the voice of the echo, Erik's voice had leaped back behind the wall!\n\nSoon we heard nothing more at all, for this is what happened:\n\n\"Erik! Erik!\" said Christine's voice. \"You tire me with your voice. Don't go on, Erik! Isn't it very hot here?\"\n\n\"Oh, yes,\" replied Erik's voice, \"the heat is unendurable!\"\n\n\"But what does this mean? ... The wall is really getting quite hot! ... The wall is burning!\"\n\n\"I'll tell you, Christine, dear: it is because of the forest next door.\"\n\n\"Well, what has that to do with it? The forest?\"\n\n\"WHY, DIDN'T YOU SEE THAT IT WAS AN AFRICAN FOREST?\"\n\nAnd the monster laughed so loudly and hideously that we could no longer distinguish Christine's supplicating cries! The Vicomte de Chagny shouted and banged against the walls like a madman. I could not restrain him. But we heard nothing except the monster's laughter, and the monster himself can have heard nothing else. And then there was the sound of a body falling on the floor and being dragged along and a door slammed and then nothing, nothing more around us save the scorching silence of the south in the heart of a tropical forest!\n\n\n\n\nChapter XXIV \"Barrels! ... Barrels! ... Any Barrels to Sell?\"\n\nTHE PERSIAN'S NARRATIVE CONTINUED\n\nI have said that the room in which M. le Vicomte de Chagny and I were imprisoned was a regular hexagon, lined entirely with mirrors. Plenty of these rooms have been seen since, mainly at exhibitions: they are called \"palaces of illusion,\" or some such name. But the invention belongs entirely to Erik, who built the first room of this kind under my eyes, at the time of the rosy hours of Mazenderan. A decorative object, such as a column, for instance, was placed in one of the corners and immediately produced a hall of a thousand columns; for, thanks to the mirrors, the real room was multiplied by six hexagonal rooms, each of which, in its turn, was multiplied indefinitely. But the little sultana soon tired of this infantile illusion, whereupon Erik altered his invention into a \"torture-chamber.\" For the architectural motive placed in one corner, he substituted an iron tree. This tree, with its painted leaves, was absolutely true to life and was made of iron so as to resist all the attacks of the \"patient\" who was locked into the torture-chamber. We shall see how the scene thus obtained was twice altered instantaneously into two successive other scenes, by means of the automatic rotation of the drums or rollers in the corners. These were divided into three sections, fitting into the angles of the mirrors and each supporting a decorative scheme that came into sight as the roller revolved upon its axis.\n\nThe walls of this strange room gave the patient nothing to lay hold of, because, apart from the solid decorative object, they were simply furnished with mirrors, thick enough to withstand any onslaught of the victim, who was flung into the chamber empty-handed and barefoot.\n\nThere was no furniture. The ceiling was capable of being lit up. An ingenious system of electric heating, which has since been imitated, allowed the temperature of the walls and room to be increased at will.\n\nI am giving all these details of a perfectly natural invention, producing, with a few painted branches, the supernatural illusion of an equatorial forest blazing under the tropical sun, so that no one may doubt the present balance of my brain or feel entitled to say that I am mad or lying or that I take him for a fool.[1]\n\nI now return to the facts where I left them. When the ceiling lit up and the forest became visible around us, the viscount's stupefaction was immense. That impenetrable forest, with its innumerable trunks and branches, threw him into a terrible state of consternation. He passed his hands over his forehead, as though to drive away a dream; his eyes blinked; and, for a moment, he forgot to listen.\n\nI have already said that the sight of the forest did not surprise me at all; and therefore I listened for the two of us to what was happening next door. Lastly, my attention was especially attracted, not so much to the scene, as to the mirrors that produced it. These mirrors were broken in parts. Yes, they were marked and scratched; they had been \"starred,\" in spite of their solidity; and this proved to me that the torture-chamber in which we now were HAD ALREADY SERVED A PURPOSE.\n\nYes, some wretch, whose feet were not bare like those of the victims of the rosy hours of Mazenderan, had certainly fallen into this \"mortal illusion\" and, mad with rage, had kicked against those mirrors which, nevertheless, continued to reflect his agony. And the branch of the tree on which he had put an end to his own sufferings was arranged in such a way that, before dying, he had seen, for his last consolation, a thousand men writhing in his company.\n\nYes, Joseph Buquet had undoubtedly been through all this! Were we to die as he had done? I did not think so, for I knew that we had a few hours before us and that I could employ them to better purpose than Joseph Buquet was able to do. After all, I was thoroughly acquainted with most of Erik's \"tricks;\" and now or never was the time to turn my knowledge to account.\n\nTo begin with, I gave up every idea of returning to the passage that had brought us to that accursed chamber. I did not trouble about the possibility of working the inside stone that closed the passage; and this for the simple reason that to do so was out of the question. We had dropped from too great a height into the torture-chamber; there was no furniture to help us reach that passage; not even the branch of the iron tree, not even each other's shoulders were of any avail.\n\nThere was only one possible outlet, that opening into the Louis-Philippe room in which Erik and Christine Daae were. But, though this outlet looked like an ordinary door on Christine's side, it was absolutely invisible to us. We must therefore try to open it without even knowing where it was.\n\nWhen I was quite sure that there was no hope for us from Christine Daae's side, when I had heard the monster dragging the poor girl from the Louis-Philippe room LEST SHE SHOULD INTERFERE WITH OUR TORTURES, I resolved to set to work without delay.\n\nBut I had first to calm M. de Chagny, who was already walking about like a madman, uttering incoherent cries. The snatches of conversation which he had caught between Christine and the monster had contributed not a little to drive him beside himself: add to that the shock of the magic forest and the scorching heat which was beginning to make the prespiration{sic} stream down his temples and you will have no difficulty in understanding his state of mind. He shouted Christine's name, brandished his pistol, knocked his forehead against the glass in his endeavors to run down the glades of the illusive forest. In short, the torture was beginning to work its spell upon a brain unprepared for it.\n\nI did my best to induce the poor viscount to listen to reason. I made him touch the mirrors and the iron tree and the branches and explained to him, by optical laws, all the luminous imagery by which we were surrounded and of which we need not allow ourselves to be the victims, like ordinary, ignorant people.\n\n\"We are in a room, a little room; that is what you must keep saying to yourself. And we shall leave the room as soon as we have found the door.\"\n\nAnd I promised him that, if he let me act, without disturbing me by shouting and walking up and down, I would discover the trick of the door in less than an hour's time.\n\nThen he lay flat on the floor, as one does in a wood, and declared that he would wait until I found the door of the forest, as there was nothing better to do! And he added that, from where he was, \"the view was splendid!\" The torture was working, in spite of all that I had said.\n\nMyself, forgetting the forest, I tackled a glass panel and began to finger it in every direction, hunting for the weak point on which to press in order to turn the door in accordance with Erik's system of pivots. This weak point might be a mere speck on the glass, no larger than a pea, under which the spring lay hidden. I hunted and hunted. I felt as high as my hands could reach. Erik was about the same height as myself and I thought that he would not have placed the spring higher than suited his stature.\n\nWhile groping over the successive panels with the greatest care, I endeavored not to lose a minute, for I was feeling more and more overcome with the heat and we were literally roasting in that blazing forest.\n\nI had been working like this for half an hour and had finished three panels, when, as ill-luck would have it, I turned round on hearing a muttered exclamation from the viscount.\n\n\"I am stifling,\" he said. \"All those mirrors are sending out an infernal heat! Do you think you will find that spring soon? If you are much longer about it, we shall be roasted alive!\"\n\nI was not sorry to hear him talk like this. He had not said a word of the forest and I hoped that my companion's reason would hold out some time longer against the torture. But he added:\n\n\"What consoles me is that the monster has given Christine until eleven to-morrow evening. If we can't get out of here and go to her assistance, at least we shall be dead before her! Then Erik's mass can serve for all of us!\"\n\nAnd he gulped down a breath of hot air that nearly made him faint.\n\nAs I had not the same desperate reasons as M. le Vicomte for accepting death, I returned, after giving him a word of encouragement, to my panel, but I had made the mistake of taking a few steps while speaking and, in the tangle of the illusive forest, I was no longer able to find my panel for certain! I had to begin all over again, at random, feeling, fumbling, groping.\n\nNow the fever laid hold of me in my turn ... for I found nothing, absolutely nothing. In the next room, all was silence. We were quite lost in the forest, without an outlet, a compass, a guide or anything. Oh, I knew what awaited us if nobody came to our aid ... or if I did not find the spring! But, look as I might, I found nothing but branches, beautiful branches that stood straight up before me, or spread gracefully over my head. But they gave no shade. And this was natural enough, as we were in an equatorial forest, with the sun right above our heads, an African forest.\n\nM. de Chagny and I had repeatedly taken off our coats and put them on again, finding at one time that they made us feel still hotter and at another that they protected us against the heat. I was still making a moral resistance, but M. de Chagny seemed to me quite \"gone.\" He pretended that he had been walking in that forest for three days and nights, without stopping, looking for Christine Daae! From time to time, he thought he saw her behind the trunk of a tree, or gliding between the branches; and he called to her with words of supplication that brought the tears to my eyes. And then, at last:\n\n\"Oh, how thirsty I am!\" he cried, in delirious accents.\n\nI too was thirsty. My throat was on fire. And, yet, squatting on the floor, I went on hunting, hunting, hunting for the spring of the invisible door ... especially as it was dangerous to remain in the forest as evening drew nigh. Already the shades of night were beginning to surround us. It had happened very quickly: night falls quickly in tropical countries ... suddenly, with hardly any twilight.\n\nNow night, in the forests of the equator, is always dangerous, particularly when, like ourselves, one has not the materials for a fire to keep off the beasts of prey. I did indeed try for a moment to break off the branches, which I would have lit with my dark lantern, but I knocked myself also against the mirrors and remembered, in time, that we had only images of branches to do with.\n\nThe heat did not go with the daylight; on the contrary, it was now still hotter under the blue rays of the moon. I urged the viscount to hold our weapons ready to fire and not to stray from camp, while I went on looking for my spring.\n\nSuddenly, we heard a lion roaring a few yards away.\n\n\"Oh,\" whispered the viscount, \"he is quite close! ... Don't you see him? ... There ... through the trees ... in that thicket! If he roars again, I will fire! ...\"\n\nAnd the roaring began again, louder than before. And the viscount fired, but I do not think that he hit the lion; only, he smashed a mirror, as I perceived the next morning, at daybreak. We must have covered a good distance during the night, for we suddenly found ourselves on the edge of the desert, an immense desert of sand, stones and rocks. It was really not worth while leaving the forest to come upon the desert. Tired out, I flung myself down beside the viscount, for I had had enough of looking for springs which I could not find.\n\nI was quite surprised—and I said so to the viscount—that we had encountered no other dangerous animals during the night. Usually, after the lion came the leopard and sometimes the buzz of the tsetse fly. These were easily obtained effects; and I explained to M. de Chagny that Erik imitated the roar of a lion on a long tabour or timbrel, with an ass's skin at one end. Over this skin he tied a string of catgut, which was fastened at the middle to another similar string passing through the whole length of the tabour. Erik had only to rub this string with a glove smeared with resin and, according to the manner in which he rubbed it, he imitated to perfection the voice of the lion or the leopard, or even the buzzing of the tsetse fly.\n\nThe idea that Erik was probably in the room beside us, working his trick, made me suddenly resolve to enter into a parley with him, for we must obviously give up all thought of taking him by surprise. And by this time he must be quite aware who were the occupants of his torture-chamber. I called him: \"Erik! Erik!\"\n\nI shouted as loudly as I could across the desert, but there was no answer to my voice. All around us lay the silence and the bare immensity of that stony desert. What was to become of us in the midst of that awful solitude?\n\nWe were beginning literally to die of heat, hunger and thirst ... of thirst especially. At last, I saw M. de Chagny raise himself on his elbow and point to a spot on the horizon. He had discovered an oasis!\n\nYes, far in the distance was an oasis ... an oasis with limpid water, which reflected the iron trees! ... Tush, it was the scene of the mirage ... I recognized it at once ... the worst of the three! ... No one had been able to fight against it ... no one... I did my utmost to keep my head AND NOT TO HOPE FOR WATER, because I knew that, if a man hoped for water, the water that reflected the iron tree, and if, after hoping for water, he struck against the mirror, then there was only one thing for him to do: to hang himself on the iron tree!\n\nSo I cried to M. de Chagny:\n\n\"It's the mirage! ... It's the mirage! ... Don't believe in the water! ... It's another trick of the mirrors! ...\"\n\nThen he flatly told me to shut up, with my tricks of the mirrors, my springs, my revolving doors and my palaces of illusions! He angrily declared that I must be either blind or mad to imagine that all that water flowing over there, among those splendid, numberless trees, was not real water! ... And the desert was real! ... And so was the forest! ... And it was no use trying to take him in ... he was an old, experienced traveler ... he had been all over the place!\n\nAnd he dragged himself along, saying: \"Water! Water!\"\n\nAnd his mouth was open, as though he were drinking.\n\nAnd my mouth was open too, as though I were drinking.\n\nFor we not only saw the water, but WE HEARD IT! ... We heard it flow, we heard it ripple! ... Do you understand that word \"ripple?\" ... IT IS A SOUND WHICH YOU HEAR WITH YOUR TONGUE! ... You put your tongue out of your mouth to listen to it better!\n\nLastly—and this was the most pitiless torture of all—we heard the rain and it was not raining! This was an infernal invention... Oh, I knew well enough how Erik obtained it! He filled with little stones a very long and narrow box, broken up inside with wooden and metal projections. The stones, in falling, struck against these projections and rebounded from one to another; and the result was a series of pattering sounds that exactly imitated a rainstorm.\n\nAh, you should have seen us putting out our tongues and dragging ourselves toward the rippling river-bank! Our eyes and ears were full of water, but our tongues were hard and dry as horn!\n\nWhen we reached the mirror, M. de Chagny licked it ... and I also licked the glass.\n\nIt was burning hot!\n\nThen we rolled on the floor with a hoarse cry of despair. M. de Chagny put the one pistol that was still loaded to his temple; and I stared at the Punjab lasso at the foot of the iron tree. I knew why the iron tree had returned, in this third change of scene! ... The iron tree was waiting for me! ...\n\nBut, as I stared at the Punjab lasso, I saw a thing that made me start so violently that M. de Chagny delayed his attempt at suicide. I took his arm. And then I caught the pistol from him ... and then I dragged myself on my knees toward what I had seen.\n\nI had discovered, near the Punjab lasso, in a groove in the floor, a black-headed nail of which I knew the use. At last I had discovered the spring! I felt the nail ... I lifted a radiant face to M. de Chagny ... The black-headed nail yielded to my pressure ...\n\nAnd then ...\n\nAnd then we saw not a door opened in the wall, but a cellar-flap released in the floor. Cool air came up to us from the black hole below. We stooped over that square of darkness as though over a limpid well. With our chins in the cool shade, we drank it in. And we bent lower and lower over the trap-door. What could there be in that cellar which opened before us? Water? Water to drink?\n\nI thrust my arm into the darkness and came upon a stone and another stone ... a staircase ... a dark staircase leading into the cellar. The viscount wanted to fling himself down the hole; but I, fearing a new trick of the monster's, stopped him, turned on my dark lantern and went down first.\n\nThe staircase was a winding one and led down into pitchy darkness. But oh, how deliciously cool were the darkness and the stairs? The lake could not be far away.\n\nWe soon reached the bottom. Our eyes were beginning to accustom themselves to the dark, to distinguish shapes around us ... circular shapes ... on which I turned the light of my lantern.\n\nBarrels!\n\nWe were in Erik's cellar: it was here that he must keep his wine and perhaps his drinking-water. I knew that Erik was a great lover of good wine. Ah, there was plenty to drink here!\n\nM. de Chagny patted the round shapes and kept on saying:\n\n\"Barrels! Barrels! What a lot of barrels! ...\"\n\nIndeed, there was quite a number of them, symmetrically arranged in two rows, one on either side of us. They were small barrels and I thought that Erik must have selected them of that size to facilitate their carriage to the house on the lake.\n\nWe examined them successively, to see if one of them had not a funnel, showing that it had been tapped at some time or another. But all the barrels were hermetically closed.\n\nThen, after half lifting one to make sure it was full, we went on our knees and, with the blade of a small knife which I carried, I prepared to stave in the bung-hole.\n\nAt that moment, I seemed to hear, coming from very far, a sort of monotonous chant which I knew well, from often hearing it in the streets of Paris:\n\n\"Barrels! ... Barrels! ... Any barrels to sell?\"\n\nMy hand desisted from its work. M. de Chagny had also heard. He said:\n\n\"That's funny! It sounds as if the barrel were singing!\"\n\nThe song was renewed, farther away:\n\n\"Barrels! ... Barrels! ... Any barrels to sell? ...\"\n\n\"Oh, I swear,\" said the viscount, \"that the tune dies away in the barrel! ...\"\n\nWe stood up and went to look behind the barrel.\n\n\"It's inside,\" said M. de Chagny, \"it's inside!\"\n\nBut we heard nothing there and were driven to accuse the bad condition of our senses. And we returned to the bung-hole. M. de Chagny put his two hands together underneath it and, with a last effort, I burst the bung.\n\n\"What's this?\" cried the viscount. \"This isn't water!\"\n\nThe viscount put his two full hands close to my lantern ... I stooped to look ... and at once threw away the lantern with such violence that it broke and went out, leaving us in utter darkness.\n\nWhat I had seen in M. de Chagny's hands ... was gun-powder!\n\n\n\n[1] It is very natural that, at the time when the Persian was writing, he should take so many precautions against any spirit of incredulity on the part of those who were likely to read his narrative. Nowadays, when we have all seen this sort of room, his precautions would be superfluous.\n\n\n\n\nChapter XXV The Scorpion or the Grasshopper: Which?\n\nTHE PERSIAN'S NARRATIVE CONCLUDED\n\nThe discovery flung us into a state of alarm that made us forget all our past and present sufferings. We now knew all that the monster meant to convey when he said to Christine Daae:\n\n\"Yes or no! If your answer is no, everybody will be dead AND BURIED!\"\n\nYes, buried under the ruins of the Paris Grand Opera!\n\nThe monster had given her until eleven o'clock in the evening. He had chosen his time well. There would be many people, many \"members of the human race,\" up there, in the resplendent theater. What finer retinue could be expected for his funeral? He would go down to the tomb escorted by the whitest shoulders in the world, decked with the richest jewels.\n\nEleven o'clock to-morrow evening!\n\nWe were all to be blown up in the middle of the performance ... if Christine Daae said no!\n\nEleven o'clock to-morrow evening! ...\n\nAnd what else could Christine say but no? Would she not prefer to espouse death itself rather than that living corpse? She did not know that on her acceptance or refusal depended the awful fate of many members of the human race!\n\nEleven o'clock to-morrow evening!\n\nAnd we dragged ourselves through the darkness, feeling our way to the stone steps, for the light in the trap-door overhead that led to the room of mirrors was now extinguished; and we repeated to ourselves:\n\n\"Eleven o'clock to-morrow evening!\"\n\nAt last, I found the staircase. But, suddenly I drew myself up on the first step, for a terrible thought had come to my mind:\n\n\"What is the time?\"\n\nAh, what was the time? ... For, after all, eleven o'clock to-morrow evening might be now, might be this very moment! Who could tell us the time? We seemed to have been imprisoned in that hell for days and days ... for years ... since the beginning of the world. Perhaps we should be blown up then and there! Ah, a sound! A crack! \"Did you hear that? ... There, in the corner ... good heavens! ... Like a sound of machinery! ... Again! ... Oh, for a light! ... Perhaps it's the machinery that is to blow everything up! ... I tell you, a cracking sound: are you deaf?\"\n\nM. de Chagny and I began to yell like madmen. Fear spurred us on. We rushed up the treads of the staircase, stumbling as we went, anything to escape the dark, to return to the mortal light of the room of mirrors!\n\nWe found the trap-door still open, but it was now as dark in the room of mirrors as in the cellar which we had left. We dragged ourselves along the floor of the torture-chamber, the floor that separated us from the powder-magazine. What was the time? We shouted, we called: M. de Chagny to Christine, I to Erik. I reminded him that I had saved his life. But no answer, save that of our despair, of our madness: what was the time? We argued, we tried to calculate the time which we had spent there, but we were incapable of reasoning. If only we could see the face of a watch! ... Mine had stopped, but M. de Chagny's was still going ... He told me that he had wound it up before dressing for the Opera ... We had not a match upon us ... And yet we must know ... M. de Chagny broke the glass of his watch and felt the two hands... He questioned the hands of the watch with his finger-tips, going by the position of the ring of the watch ... Judging by the space between the hands, he thought it might be just eleven o'clock!\n\nBut perhaps it was not the eleven o'clock of which we stood in dread. Perhaps we had still twelve hours before us!\n\nSuddenly, I exclaimed: \"Hush!\"\n\nI seemed to hear footsteps in the next room. Some one tapped against the wall. Christine Daae's voice said:\n\n\"Raoul! Raoul!\" We were now all talking at once, on either side of the wall. Christine sobbed; she was not sure that she would find M. de Chagny alive. The monster had been terrible, it seemed, had done nothing but rave, waiting for her to give him the \"yes\" which she refused. And yet she had promised him that \"yes,\" if he would take her to the torture-chamber. But he had obstinately declined, and had uttered hideous threats against all the members of the human race! At last, after hours and hours of that hell, he had that moment gone out, leaving her alone to reflect for the last time.\n\n\"Hours and hours? What is the time now? What is the time, Christine?\"\n\n\"It is eleven o'clock! Eleven o'clock, all but five minutes!\"\n\n\"But which eleven o'clock?\"\n\n\"The eleven o'clock that is to decide life or death! ... He told me so just before he went ... He is terrible ... He is quite mad: he tore off his mask and his yellow eyes shot flames! ... He did nothing but laugh! ... He said, 'I give you five minutes to spare your blushes! Here,' he said, taking a key from the little bag of life and death, 'here is the little bronze key that opens the two ebony caskets on the mantelpiece in the Louis-Philippe room... In one of the caskets, you will find a scorpion, in the other, a grasshopper, both very cleverly imitated in Japanese bronze: they will say yes or no for you. If you turn the scorpion round, that will mean to me, when I return, that you have said yes. The grasshopper will mean no.' And he laughed like a drunken demon. I did nothing but beg and entreat him to give me the key of the torture-chamber, promising to be his wife if he granted me that request ... But he told me that there was no future need for that key and that he was going to throw it into the lake! ... And he again laughed like a drunken demon and left me. Oh, his last words were, 'The grasshopper! Be careful of the grasshopper! A grasshopper does not only turn: it hops! It hops! And it hops jolly high!'\"\n\nThe five minutes had nearly elapsed and the scorpion and the grasshopper were scratching at my brain. Nevertheless, I had sufficient lucidity left to understand that, if the grasshopper were turned, it would hop ... and with it many members of the human race! There was no doubt but that the grasshopper controlled an electric current intended to blow up the powder-magazine!\n\nM. de Chagny, who seemed to have recovered all his moral force from hearing Christine's voice, explained to her, in a few hurried words, the situation in which we and all the Opera were. He told her to turn the scorpion at once.\n\nThere was a pause.\n\n\"Christine,\" I cried, \"where are you?\"\n\n\"By the scorpion.\"\n\n\"Don't touch it!\"\n\nThe idea had come to me—for I knew my Erik—that the monster had perhaps deceived the girl once more. Perhaps it was the scorpion that would blow everything up. After all, why wasn't he there? The five minutes were long past ... and he was not back... Perhaps he had taken shelter and was waiting for the explosion! ... Why had he not returned? ... He could not really expect Christine ever to consent to become his voluntary prey! ... Why had he not returned?\n\n\"Don't touch the scorpion!\" I said.\n\n\"Here he comes!\" cried Christine. \"I hear him! Here he is!\"\n\nWe heard his steps approaching the Louis-Philippe room. He came up to Christine, but did not speak. Then I raised my voice:\n\n\"Erik! It is I! Do you know me?\"\n\nWith extraordinary calmness, he at once replied:\n\n\"So you are not dead in there? Well, then, see that you keep quiet.\"\n\nI tried to speak, but he said coldly:\n\n\"Not a word, daroga, or I shall blow everything up.\" And he added, \"The honor rests with mademoiselle ... Mademoiselle has not touched the scorpion\"—how deliberately he spoke!—\"mademoiselle has not touched the grasshopper\"—with that composure!—\"but it is not too late to do the right thing. There, I open the caskets without a key, for I am a trap-door lover and I open and shut what I please and as I please. I open the little ebony caskets: mademoiselle, look at the little dears inside. Aren't they pretty? If you turn the grasshopper, mademoiselle, we shall all be blown up. There is enough gun-powder under our feet to blow up a whole quarter of Paris. If you turn the scorpion, mademoiselle, all that powder will be soaked and drowned. Mademoiselle, to celebrate our wedding, you shall make a very handsome present to a few hundred Parisians who are at this moment applauding a poor masterpiece of Meyerbeer's ... you shall make them a present of their lives ... For, with your own fair hands, you shall turn the scorpion ... And merrily, merrily, we will be married!\"\n\nA pause; and then:\n\n\"If, in two minutes, mademoiselle, you have not turned the scorpion, I shall turn the grasshopper ... and the grasshopper, I tell you, HOPS JOLLY HIGH!\"\n\nThe terrible silence began anew. The Vicomte de Chagny, realizing that there was nothing left to do but pray, went down on his knees and prayed. As for me, my blood beat so fiercely that I had to take my heart in both hands, lest it should burst. At last, we heard Erik's voice:\n\n\"The two minutes are past ... Good-by, mademoiselle... Hop, grasshopper! \"Erik,\" cried Christine, \"do you swear to me, monster, do you swear to me that the scorpion is the one to turn?\n\n\"Yes, to hop at our wedding.\"\n\n\"Ah, you see! You said, to hop!\"\n\n\"At our wedding, ingenuous child! ... The scorpion opens the ball... But that will do! ... You won't have the scorpion? Then I turn the grasshopper!\"\n\n\"Erik!\"\n\n\"Enough!\"\n\nI was crying out in concert with Christine. M. de Chagny was still on his knees, praying.\n\n\"Erik! I have turned the scorpion!\"\n\nOh, the second through which we passed!\n\nWaiting! Waiting to find ourselves in fragments, amid the roar and the ruins!\n\nFeeling something crack beneath our feet, hearing an appalling hiss through the open trap-door, a hiss like the first sound of a rocket!\n\nIt came softly, at first, then louder, then very loud. But it was not the hiss of fire. It was more like the hiss of water. And now it became a gurgling sound: \"Guggle! Guggle!\"\n\nWe rushed to the trap-door. All our thirst, which vanished when the terror came, now returned with the lapping of the water.\n\nThe water rose in the cellar, above the barrels, the powder-barrels—\"Barrels! ... Barrels! Any barrels to sell?\"—and we went down to it with parched throats. It rose to our chins, to our mouths. And we drank. We stood on the floor of the cellar and drank. And we went up the stairs again in the dark, step by step, went up with the water.\n\nThe water came out of the cellar with us and spread over the floor of the room. If, this went on, the whole house on the lake would be swamped. The floor of the torture-chamber had itself become a regular little lake, in which our feet splashed. Surely there was water enough now! Erik must turn off the tap!\n\n\"Erik! Erik! That is water enough for the gunpowder! Turn off the tap! Turn off the scorpion!\"\n\nBut Erik did not reply. We heard nothing but the water rising: it was half-way to our waists!\n\n\"Christine!\" cried M. de Chagny. \"Christine! The water is up to our knees!\"\n\nBut Christine did not reply ... We heard nothing but the water rising.\n\nNo one, no one in the next room, no one to turn the tap, no one to turn the scorpion!\n\nWe were all alone, in the dark, with the dark water that seized us and clasped us and froze us!\n\n\"Erik! Erik!\"\n\n\"Christine! Christine!\"\n\nBy this time, we had lost our foothold and were spinning round in the water, carried away by an irresistible whirl, for the water turned with us and dashed us against the dark mirror, which thrust us back again; and our throats, raised above the whirlpool, roared aloud.\n\nWere we to die here, drowned in the torture-chamber? I had never seen that. Erik, at the time of the rosy hours of Mazenderan, had never shown me that, through the little invisible window.\n\n\"Erik! Erik!\" I cried. \"I saved your life! Remember! ... You were sentenced to death! But for me, you would be dead now! ... Erik!\"\n\nWe whirled around in the water like so much wreckage. But, suddenly, my straying hands seized the trunk of the iron tree! I called M. de Chagny, and we both hung to the branch of the iron tree.\n\nAnd the water rose still higher.\n\n\"Oh! Oh! Can you remember? How much space is there between the branch of the tree and the dome-shaped ceiling? Do try to remember! ... After all, the water may stop, it must find its level! ... There, I think it is stopping! ... No, no, oh, horrible! ... Swim! Swim for your life!\"\n\nOur arms became entangled in the effort of swimming; we choked; we fought in the dark water; already we could hardly breathe the dark air above the dark water, the air which escaped, which we could hear escaping through some vent-hole or other.\n\n\"Oh, let us turn and turn and turn until we find the air hole and then glue our mouths to it!\"\n\nBut I lost my strength; I tried to lay hold of the walls! Oh, how those glass walls slipped from under my groping fingers! ... We whirled round again! ... We began to sink! ... One last effort! ... A last cry: \"Erik! ... Christine! ...\"\n\n\"Guggle, guggle, guggle!\" in our ears. \"Guggle! Guggle!\" At the bottom of the dark water, our ears went, \"Guggle! Guggle!\"\n\nAnd, before losing consciousness entirely, I seemed to hear, between two guggles:\n\n\"Barrels! Barrels! Any barrels to sell?\"\n\n\n\n\nChapter XXVI The End of the Ghost's Love Story\n\nThe previous chapter marks the conclusion of the written narrative which the Persian left behind him.\n\nNotwithstanding the horrors of a situation which seemed definitely to abandon them to their deaths, M. de Chagny and his companion were saved by the sublime devotion of Christine Daae. And I had the rest of the story from the lips of the daroga himself.\n\nWhen I went to see him, he was still living in his little flat in the Rue de Rivoli, opposite the Tuileries. He was very ill, and it required all my ardor as an historian pledged to the truth to persuade him to live the incredible tragedy over again for my benefit. His faithful old servant Darius showed me in to him. The daroga received me at a window overlooking the garden of the Tuileries. He still had his magnificent eyes, but his poor face looked very worn. He had shaved the whole of his head, which was usually covered with an astrakhan cap; he was dressed in a long, plain coat and amused himself by unconsciously twisting his thumbs inside the sleeves; but his mind was quite clear, and he told me his story with perfect lucidity.\n\nIt seems that, when he opened his eyes, the daroga found himself lying on a bed. M. de Chagny was on a sofa, beside the wardrobe. An angel and a devil were watching over them.\n\nAfter the deceptions and illusions of the torture-chamber, the precision of the details of that quiet little middle-class room seemed to have been invented for the express purpose of puzzling the mind of the mortal rash enough to stray into that abode of living nightmare. The wooden bedstead, the waxed mahogany chairs, the chest of drawers, those brasses, the little square antimacassars carefully placed on the backs of the chairs, the clock on the mantelpiece and the harmless-looking ebony caskets at either end, lastly, the whatnot filled with shells, with red pin-cushions, with mother-of-pearl boats and an enormous ostrich-egg, the whole discreetly lighted by a shaded lamp standing on a small round table: this collection of ugly, peaceable, reasonable furniture, AT THE BOTTOM OF THE OPERA CELLARS, bewildered the imagination more than all the late fantastic happenings.\n\nAnd the figure of the masked man seemed all the more formidable in this old-fashioned, neat and trim little frame. It bent down over the Persian and said, in his ear:\n\n\"Are you better, daroga? ... You are looking at my furniture? ... It is all that I have left of my poor unhappy mother.\"\n\nChristine Daae did not say a word: she moved about noiselessly, like a sister of charity, who had taken a vow of silence. She brought a cup of cordial, or of hot tea, he did not remember which. The man in the mask took it from her hands and gave it to the Persian. M. de Chagny was still sleeping.\n\nErik poured a drop of rum into the daroga's cup and, pointing to the viscount, said:\n\n\"He came to himself long before we knew if you were still alive, daroga. He is quite well. He is asleep. We must not wake him.\"\n\nErik left the room for a moment, and the Persian raised himself on his elbow, looked around him and saw Christine Daae sitting by the fireside. He spoke to her, called her, but he was still very weak and fell back on his pillow. Christine came to him, laid her hand on his forehead and went away again. And the Persian remembered that, as she went, she did not give a glance at M. de Chagny, who, it is true, was sleeping peacefully; and she sat down again in her chair by the chimney-corner, silent as a sister of charity who had taken a vow of silence.\n\nErik returned with some little bottles which he placed on the mantelpiece. And, again in a whisper, so as not to wake M. de Chagny, he said to the Persian, after sitting down and feeling his pulse:\n\n\"You are now saved, both of you. And soon I shall take you up to the surface of the earth, TO PLEASE MY WIFE.\"\n\nThereupon he rose, without any further explanation, and disappeared once more.\n\nThe Persian now looked at Christine's quiet profile under the lamp. She was reading a tiny book, with gilt edges, like a religious book. There are editions of THE IMITATION that look like that. The Persian still had in his ears the natural tone in which the other had said, \"to please my wife.\" Very gently, he called her again; but Christine was wrapped up in her book and did not hear him.\n\nErik returned, mixed the daroga a draft and advised him not to speak to \"his wife\" again nor to any one, BECAUSE IT MIGHT BE VERY DANGEROUS TO EVERYBODY'S HEALTH.\n\nEventually, the Persian fell asleep, like M. de Chagny, and did not wake until he was in his own room, nursed by his faithful Darius, who told him that, on the night before, he was found propped against the door of his flat, where he had been brought by a stranger, who rang the bell before going away.\n\nAs soon as the daroga recovered his strength and his wits, he sent to Count Philippe's house to inquire after the viscount's health. The answer was that the young man had not been seen and that Count Philippe was dead. His body was found on the bank of the Opera lake, on the Rue-Scribe side. The Persian remembered the requiem mass which he had heard from behind the wall of the torture-chamber, and had no doubt concerning the crime and the criminal. Knowing Erik as he did, he easily reconstructed the tragedy. Thinking that his brother had run away with Christine Daae, Philippe had dashed in pursuit of him along the Brussels Road, where he knew that everything was prepared for the elopement. Failing to find the pair, he hurried back to the Opera, remembered Raoul's strange confidence about his fantastic rival and learned that the viscount had made every effort to enter the cellars of the theater and that he had disappeared, leaving his hat in the prima donna's dressing-room beside an empty pistol-case. And the count, who no longer entertained any doubt of his brother's madness, in his turn darted into that infernal underground maze. This was enough, in the Persian's eyes, to explain the discovery of the Comte de Chagny's corpse on the shore of the lake, where the siren, Erik's siren, kept watch.\n\nThe Persian did not hesitate. He determined to inform the police. Now the case was in the hands of an examining-magistrate called Faure, an incredulous, commonplace, superficial sort of person, (I write as I think), with a mind utterly unprepared to receive a confidence of this kind. M. Faure took down the daroga's depositions and proceeded to treat him as a madman.\n\nDespairing of ever obtaining a hearing, the Persian sat down to write. As the police did not want his evidence, perhaps the press would be glad of it; and he had just written the last line of the narrative I have quoted in the preceding chapters, when Darius announced the visit of a stranger who refused his name, who would not show his face and declared simply that he did not intend to leave the place until he had spoken to the daroga.\n\nThe Persian at once felt who his singular visitor was and ordered him to be shown in. The daroga was right. It was the ghost, it was Erik!\n\nHe looked extremely weak and leaned against the wall, as though he were afraid of falling. Taking off his hat, he revealed a forehead white as wax. The rest of the horrible face was hidden by the mask.\n\nThe Persian rose to his feet as Erik entered.\n\n\"Murderer of Count Philippe, what have you done with his brother and Christine Daae?\"\n\nErik staggered under this direct attack, kept silent for a moment, dragged himself to a chair and heaved a deep sigh. Then, speaking in short phrases and gasping for breath between the words:\n\n\"Daroga, don't talk to me ... about Count Philippe ... He was dead ... by the time ... I left my house ... he was dead ... when ... the siren sang ... It was an ... accident ... a sad ... a very sad ... accident. He fell very awkwardly ... but simply and naturally ... into the lake! ...\"\n\n\"You lie!\" shouted the Persian.\n\nErik bowed his head and said:\n\n\"I have not come here ... to talk about Count Philippe ... but to tell you that ... I am going ... to die...\"\n\n\"Where are Raoul de Chagny and Christine Daae?\"\n\n\"I am going to die.\"\n\n\"Raoul de Chagny and Christine Daae?\"\n\n\"Of love ... daroga ... I am dying ... of love ... That is how it is ... loved her so! ... And I love her still ... daroga ... and I am dying of love for her, I ... I tell you! ... If you knew how beautiful she was ... when she let me kiss her ... alive ... It was the first ... time, daroga, the first ... time I ever kissed a woman ... Yes, alive ... I kissed her alive ... and she looked as beautiful as if she had been dead!\"\n\nThe Persian shook Erik by the arm:\n\n\"Will you tell me if she is alive or dead.\"\n\n\"Why do you shake me like that?\" asked Erik, making an effort to speak more connectedly. \"I tell you that I am going to die... Yes, I kissed her alive ...\"\n\n\"And now she is dead?\"\n\n\"I tell you I kissed her just like that, on her forehead ... and she did not draw back her forehead from my lips! ... Oh, she is a good girl! ... As to her being dead, I don't think so; but it has nothing to do with me ... No, no, she is not dead! And no one shall touch a hair of her head! She is a good, honest girl, and she saved your life, daroga, at a moment when I would not have given twopence for your Persian skin. As a matter of fact, nobody bothered about you. Why were you there with that little chap? You would have died as well as he! My word, how she entreated me for her little chap! But I told her that, as she had turned the scorpion, she had, through that very fact, and of her own free will, become engaged to me and that she did not need to have two men engaged to her, which was true enough.\n\n\"As for you, you did not exist, you had ceased to exist, I tell you, and you were going to die with the other! ... Only, mark me, daroga, when you were yelling like the devil, because of the water, Christine came to me with her beautiful blue eyes wide open, and swore to me, as she hoped to be saved, that she consented to be MY LIVING WIFE! ... Until then, in the depths of her eyes, daroga, I had always seen my dead wife; it was the first time I saw MY LIVING WIFE there. She was sincere, as she hoped to be saved. She would not kill herself. It was a bargain ... Half a minute later, all the water was back in the lake; and I had a hard job with you, daroga, for, upon my honor, I thought you were done for! ... However! ... There you were! ... It was understood that I was to take you both up to the surface of the earth. When, at last, I cleared the Louis-Philippe room of you, I came back alone ...\"\n\n\"What have you done with the Vicomte de Chagny?\" asked the Persian, interrupting him.\n\n\"Ah, you see, daroga, I couldn't carry HIM up like that, at once. ... He was a hostage ... But I could not keep him in the house on the lake, either, because of Christine; so I locked him up comfortably, I chained him up nicely—a whiff of the Mazenderan scent had left him as limp as a rag—in the Communists' dungeon, which is in the most deserted and remote part of the Opera, below the fifth cellar, where no one ever comes, and where no one ever hears you. Then I came back to Christine, she was waiting for me.\"\n\nErik here rose solemnly. Then he continued, but, as he spoke, he was overcome by all his former emotion and began to tremble like a leaf:\n\n\"Yes, she was waiting for me ... waiting for me erect and alive, a real, living bride ... as she hoped to be saved ... And, when I ... came forward, more timid than ... a little child, she did not run away ... no, no ... she stayed ... she waited for me ... I even believe ... daroga ... that she put out her forehead ... a little ... oh, not much ... just a little ... like a living bride ... And ... and ... I ... kissed her! ... I! ... I! ... I! ... And she did not die! ... Oh, how good it is, daroga, to kiss somebody on the forehead! ... You can't tell! ... But I! I! ... My mother, daroga, my poor, unhappy mother would never ... let me kiss her ... She used to run away ... and throw me my mask! ... Nor any other woman ... ever, ever! ... Ah, you can understand, my happiness was so great, I cried. And I fell at her feet, crying ... and I kissed her feet ... her little feet ... crying. You're crying, too, daroga ... and she cried also ... the angel cried! ...\" Erik sobbed aloud and the Persian himself could not retain his tears in the presence of that masked man, who, with his shoulders shaking and his hands clutched at his chest, was moaning with pain and love by turns.\n\n\"Yes, daroga ... I felt her tears flow on my forehead ... on mine, mine! ... They were soft ... they were sweet! ... They trickled under my mask ... they mingled with my tears in my eyes ... yes ... they flowed between my lips ... Listen, daroga, listen to what I did ... I tore off my mask so as not to lose one of her tears ... and she did not run away! ... And she did not die! ... She remained alive, weeping over me, with me. We cried together! I have tasted all the happiness the world can offer!\"\n\nAnd Erik fell into a chair, choking for breath:\n\n\"Ah, I am not going to die yet ... presently I shall ... but let me cry! ... Listen, daroga ... listen to this ... While I was at her feet ... I heard her say, 'Poor, unhappy Erik!' ... AND SHE TOOK MY HAND! ... I had become no more, you know, than a poor dog ready to die for her ... I mean it, daroga! ... I held in my hand a ring, a plain gold ring which I had given her ... which she had lost ... and which I had found again ... a wedding-ring, you know ... I slipped it into her little hand and said, 'There! ... Take it! ... Take it for you ... and him! ... It shall be my wedding-present a present from your poor, unhappy Erik ... I know you love the boy ... don't cry any more! ... She asked me, in a very soft voice, what I meant ... Then I made her understand that, where she was concerned, I was only a poor dog, ready to die for her ... but that she could marry the young man when she pleased, because she had cried with me and mingled her tears with mine! ...\"\n\nErik's emotion was so great that he had to tell the Persian not to look at him, for he was choking and must take off his mask. The daroga went to the window and opened it. His heart was full of pity, but he took care to keep his eyes fixed on the trees in the Tuileries gardens, lest he should see the monster's face.\n\n\"I went and released the young man,\" Erik continued, \"and told him to come with me to Christine ... They kissed before me in the Louis-Philippe room ... Christine had my ring ... I made Christine swear to come back, one night, when I was dead, crossing the lake from the Rue-Scribe side, and bury me in the greatest secrecy with the gold ring, which she was to wear until that moment. ... I told her where she would find my body and what to do with it... Then Christine kissed me, for the first time, herself, here, on the forehead—don't look, daroga!—here, on the forehead ... on my forehead, mine—don't look, daroga!—and they went off together... Christine had stopped crying ... I alone cried ... Daroga, daroga, if Christine keeps her promise, she will come back soon! ...\"\n\nThe Persian asked him no questions. He was quite reassured as to the fate of Raoul Chagny and Christine Daae; no one could have doubted the word of the weeping Erik that night.\n\nThe monster resumed his mask and collected his strength to leave the daroga. He told him that, when he felt his end to be very near at hand, he would send him, in gratitude for the kindness which the Persian had once shown him, that which he held dearest in the world: all Christine Daae's papers, which she had written for Raoul's benefit and left with Erik, together with a few objects belonging to her, such as a pair of gloves, a shoe-buckle and two pocket-handkerchiefs. In reply to the Persian's questions, Erik told him that the two young people, at soon as they found themselves free, had resolved to go and look for a priest in some lonely spot where they could hide their happiness and that, with this object in view, they had started from \"the northern railway station of the world.\" Lastly, Erik relied on the Persian, as soon as he received the promised relics and papers, to inform the young couple of his death and to advertise it in the EPOQUE.\n\nThat was all. The Persian saw Erik to the door of his flat, and Darius helped him down to the street. A cab was waiting for him. Erik stepped in; and the Persian, who had gone back to the window, heard him say to the driver:\n\n\"Go to the Opera.\"\n\nAnd the cab drove off into the night.\n\nThe Persian had seen the poor, unfortunate Erik for the last time. Three weeks later, the Epoque published this advertisement:\n\n\"Erik is dead.\"\n\n\n\n\nEpilogue.\n\nI have now told the singular, but veracious story of the Opera ghost. As I declared on the first page of this work, it is no longer possible to deny that Erik really lived. There are to-day so many proofs of his existence within the reach of everybody that we can follow Erik's actions logically through the whole tragedy of the Chagnys.\n\nThere is no need to repeat here how greatly the case excited the capital. The kidnapping of the artist, the death of the Comte de Chagny under such exceptional conditions, the disappearance of his brother, the drugging of the gas-man at the Opera and of his two assistants: what tragedies, what passions, what crimes had surrounded the idyll of Raoul and the sweet and charming Christine! ... What had become of that wonderful, mysterious artist of whom the world was never, never to hear again? ... She was represented as the victim of a rivalry between the two brothers; and nobody suspected what had really happened, nobody understood that, as Raoul and Christine had both disappeared, both had withdrawn far from the world to enjoy a happiness which they would not have cared to make public after the inexplicable death of Count Philippe ... They took the train one day from \"the northern railway station of the world.\" ... Possibly, I too shall take the train at that station, one day, and go and seek around thy lakes, O Norway, O silent Scandinavia, for the perhaps still living traces of Raoul and Christine and also of Mamma Valerius, who disappeared at the same time! ... Possibly, some day, I shall hear the lonely echoes of the North repeat the singing of her who knew the Angel of Music! ...\n\nLong after the case was pigeonholed by the unintelligent care of M. le Juge d'Instruction Faure, the newspapers made efforts, at intervals, to fathom the mystery. One evening paper alone, which knew all the gossip of the theaters, said:\n\n\"We recognize the touch of the Opera ghost.\"\n\nAnd even that was written by way of irony.\n\nThe Persian alone knew the whole truth and held the main proofs, which came to him with the pious relics promised by the ghost. It fell to my lot to complete those proofs with the aid of the daroga himself. Day by day, I kept him informed of the progress of my inquiries; and he directed them. He had not been to the Opera for years and years, but he had preserved the most accurate recollection of the building, and there was no better guide than he possible to help me discover its most secret recesses. He also told me where to gather further information, whom to ask; and he sent me to call on M. Poligny, at a moment when the poor man was nearly drawing his last breath. I had no idea that he was so very ill, and I shall never forget the effect which my questions about the ghost produced upon him. He looked at me as if I were the devil and answered only in a few incoherent sentences, which showed, however—and that was the main thing—the extent of the perturbation which O. G., in his time, had brought into that already very restless life (for M. Poligny was what people call a man of pleasure).\n\nWhen I came and told the Persian of the poor result of my visit to M. Poligny, the daroga gave a faint smile and said:\n\n\"Poligny never knew how far that extraordinary blackguard of an Erik humbugged him.\"—The Persian, by the way, spoke of Erik sometimes as a demigod and sometimes as the lowest of the low—\"Poligny was superstitious and Erik knew it. Erik knew most things about the public and private affairs of the Opera. When M. Poligny heard a mysterious voice tell him, in Box Five, of the manner in which he used to spend his time and abuse his partner's confidence, he did not wait to hear any more. Thinking at first that it was a voice from Heaven, he believed himself damned; and then, when the voice began to ask for money, he saw that he was being victimized by a shrewd blackmailer to whom Debienne himself had fallen a prey. Both of them, already tired of management for various reasons, went away without trying to investigate further into the personality of that curious O. G., who had forced such a singular memorandum-book upon them. They bequeathed the whole mystery to their successors and heaved a sigh of relief when they were rid of a business that had puzzled them without amusing them in the least.\"\n\nI then spoke of the two successors and expressed my surprise that, in his Memoirs of a Manager, M. Moncharmin should describe the Opera ghost's behavior at such length in the first part of the book and hardly mention it at all in the second. In reply to this, the Persian, who knew the MEMOIRS as thoroughly as if he had written them himself, observed that I should find the explanation of the whole business if I would just recollect the few lines which Moncharmin devotes to the ghost in the second part aforesaid. I quote these lines, which are particularly interesting because they describe the very simple manner in which the famous incident of the twenty-thousand francs was closed:\n\n\"As for O. G., some of whose curious tricks I have related in the first part of my Memoirs, I will only say that he redeemed by one spontaneous fine action all the worry which he had caused my dear friend and partner and, I am bound to say, myself. He felt, no doubt, that there are limits to a joke, especially when it is so expensive and when the commissary of police has been informed, for, at the moment when we had made an appointment in our office with M. Mifroid to tell him the whole story, a few days after the disappearance of Christine Daae, we found, on Richard's table, a large envelope, inscribed, in red ink, \"WITH O. G.'S COMPLIMENTS.\" It contained the large sum of money which he had succeeded in playfully extracting, for the time being, from the treasury. Richard was at once of the opinion that we must be content with that and drop the business. I agreed with Richard. All's well that ends well. What do you say, O. G.?\"\n\nOf course, Moncharmin, especially after the money had been restored, continued to believe that he had, for a short while, been the butt of Richard's sense of humor, whereas Richard, on his side, was convinced that Moncharmin had amused himself by inventing the whole of the affair of the Opera ghost, in order to revenge himself for a few jokes.\n\nI asked the Persian to tell me by what trick the ghost had taken twenty-thousand francs from Richard's pocket in spite of the safety-pin. He replied that he had not gone into this little detail, but that, if I myself cared to make an investigation on the spot, I should certainly find the solution to the riddle in the managers' office by remembering that Erik had not been nicknamed the trap-door lover for nothing. I promised the Persian to do so as soon as I had time, and I may as well tell the reader at once that the results of my investigation were perfectly satisfactory; and I hardly believed that I should ever discover so many undeniable proofs of the authenticity of the feats ascribed to the ghost.\n\nThe Persian's manuscript, Christine Daae's papers, the statements made to me by the people who used to work under MM. Richard and Moncharmin, by little Meg herself (the worthy Madame Giry, I am sorry to say, is no more) and by Sorelli, who is now living in retirement at Louveciennes: all the documents relating to the existence of the ghost, which I propose to deposit in the archives of the Opera, have been checked and confirmed by a number of important discoveries of which I am justly proud. I have not been able to find the house on the lake, Erik having blocked up all the secret entrances.[1] On the other hand, I have discovered the secret passage of the Communists, the planking of which is falling to pieces in parts, and also the trap-door through which Raoul and the Persian penetrated into the cellars of the opera-house. In the Communists' dungeon, I noticed numbers of initials traced on the walls by the unfortunate people confined in it; and among these were an \"R\" and a \"C.\" R. C.: Raoul de Chagny. The letters are there to this day.\n\nIf the reader will visit the Opera one morning and ask leave to stroll where he pleases, without being accompanied by a stupid guide, let him go to Box Five and knock with his fist or stick on the enormous column that separates this from the stage-box. He will find that the column sounds hollow. After that, do not be astonished by the suggestion that it was occupied by the voice of the ghost: there is room inside the column for two men. If you are surprised that, when the various incidents occurred, no one turned round to look at the column, you must remember that it presented the appearance of solid marble, and that the voice contained in it seemed rather to come from the opposite side, for, as we have seen, the ghost was an expert ventriloquist.\n\nThe column was elaborately carved and decorated with the sculptor's chisel; and I do not despair of one day discovering the ornament that could be raised or lowered at will, so as to admit of the ghost's mysterious correspondence with Mme. Giry and of his generosity.\n\nHowever, all these discoveries are nothing, to my mind, compared with that which I was able to make, in the presence of the acting-manager, in the managers' office, within a couple of inches from the desk-chair, and which consisted of a trap-door, the width of a board in the flooring and the length of a man's fore-arm and no longer; a trap-door that falls back like the lid of a box; a trap-door through which I can see a hand come and dexterously fumble at the pocket of a swallow-tail coat.\n\nThat is the way the forty-thousand francs went! ... And that also is the way by which, through some trick or other, they were returned.\n\nSpeaking about this to the Persian, I said:\n\n\"So we may take it, as the forty-thousand francs were returned, that Erik was simply amusing himself with that memorandum-book of his?\"\n\n\"Don't you believe it!\" he replied. \"Erik wanted money. Thinking himself without the pale of humanity, he was restrained by no scruples and he employed his extraordinary gifts of dexterity and imagination, which he had received by way of compensation for his extraordinary uglinesss, to prey upon his fellow-men. His reason for restoring the forty-thousand francs, of his own accord, was that he no longer wanted it. He had relinquished his marriage with Christine Daae. He had relinquished everything above the surface of the earth.\"\n\nAccording to the Persian's account, Erik was born in a small town not far from Rouen. He was the son of a master-mason. He ran away at an early age from his father's house, where his ugliness was a subject of horror and terror to his parents. For a time, he frequented the fairs, where a showman exhibited him as the \"living corpse.\" He seems to have crossed the whole of Europe, from fair to fair, and to have completed his strange education as an artist and magician at the very fountain-head of art and magic, among the Gipsies. A period of Erik's life remained quite obscure. He was seen at the fair of Nijni-Novgorod, where he displayed himself in all his hideous glory. He already sang as nobody on this earth had ever sung before; he practised ventriloquism and gave displays of legerdemain so extraordinary that the caravans returning to Asia talked about it during the whole length of their journey. In this way, his reputation penetrated the walls of the palace at Mazenderan, where the little sultana, the favorite of the Shah-in-Shah, was boring herself to death. A dealer in furs, returning to Samarkand from Nijni-Novgorod, told of the marvels which he had seen performed in Erik's tent. The trader was summoned to the palace and the daroga of Mazenderan was told to question him. Next the daroga was instructed to go and find Erik. He brought him to Persia, where for some months Erik's will was law. He was guilty of not a few horrors, for he seemed not to know the difference between good and evil. He took part calmly in a number of political assassinations; and he turned his diabolical inventive powers against the Emir of Afghanistan, who was at war with the Persian empire. The Shah took a liking to him.\n\nThis was the time of the rosy hours of Mazenderan, of which the daroga's narrative has given us a glimpse. Erik had very original ideas on the subject of architecture and thought out a palace much as a conjuror contrives a trick-casket. The Shah ordered him to construct an edifice of this kind. Erik did so; and the building appears to have been so ingenious that His Majesty was able to move about in it unseen and to disappear without a possibility of the trick's being discovered. When the Shah-in-Shah found himself the possessor of this gem, he ordered Erik's yellow eyes to be put out. But he reflected that, even when blind, Erik would still be able to build so remarkable a house for another sovereign; and also that, as long as Erik was alive, some one would know the secret of the wonderful palace. Erik's death was decided upon, together with that of all the laborers who had worked under his orders. The execution of this abominable decree devolved upon the daroga of Mazenderan. Erik had shown him some slight services and procured him many a hearty laugh. He saved Erik by providing him with the means of escape, but nearly paid with his head for his generous indulgence.\n\nFortunately for the daroga, a corpse, half-eaten by the birds of prey, was found on the shore of the Caspian Sea, and was taken for Erik's body, because the daroga's friends had dressed the remains in clothing that belonged to Erik. The daroga was let off with the loss of the imperial favor, the confiscation of his property and an order of perpetual banishment. As a member of the Royal House, however, he continued to receive a monthly pension of a few hundred francs from the Persian treasury; and on this he came to live in Paris.\n\nAs for Erik, he went to Asia Minor and thence to Constantinople, where he entered the Sultan's employment. In explanation of the services which he was able to render a monarch haunted by perpetual terrors, I need only say that it was Erik who constructed all the famous trap-doors and secret chambers and mysterious strong-boxes which were found at Yildiz-Kiosk after the last Turkish revolution. He also invented those automata, dressed like the Sultan and resembling the Sultan in all respects,[2] which made people believe that the Commander of the Faithful was awake at one place, when, in reality, he was asleep elsewhere.\n\nOf course, he had to leave the Sultan's service for the same reasons that made him fly from Persia: he knew too much. Then, tired of his adventurous, formidable and monstrous life, he longed to be some one \"like everybody else.\" And he became a contractor, like any ordinary contractor, building ordinary houses with ordinary bricks. He tendered for part of the foundations in the Opera. His estimate was accepted. When he found himself in the cellars of the enormous playhouse, his artistic, fantastic, wizard nature resumed the upper hand. Besides, was he not as ugly as ever? He dreamed of creating for his own use a dwelling unknown to the rest of the earth, where he could hide from men's eyes for all time.\n\nThe reader knows and guesses the rest. It is all in keeping with this incredible and yet veracious story. Poor, unhappy Erik! Shall we pity him? Shall we curse him? He asked only to be \"some one,\" like everybody else. But he was too ugly! And he had to hide his genius OR USE IT TO PLAY TRICKS WITH, when, with an ordinary face, he would have been one of the most distinguished of mankind! He had a heart that could have held the empire of the world; and, in the end, he had to content himself with a cellar. Ah, yes, we must needs pity the Opera ghost.\n\nI have prayed over his mortal remains, that God might show him mercy notwithstanding his crimes. Yes, I am sure, quite sure that I prayed beside his body, the other day, when they took it from the spot where they were burying the phonographic records. It was his skeleton. I did not recognize it by the ugliness of the head, for all men are ugly when they have been dead as long as that, but by the plain gold ring which he wore and which Christine Daae had certainly slipped on his finger, when she came to bury him in accordance with her promise.\n\nThe skeleton was lying near the little well, in the place where the Angel of Music first held Christine Daae fainting in his trembling arms, on the night when he carried her down to the cellars of the opera-house.\n\nAnd, now, what do they mean to do with that skeleton? Surely they will not bury it in the common grave! ... I say that the place of the skeleton of the Opera ghost is in the archives of the National Academy of Music. It is no ordinary skeleton.\n\n\n\n[1] Even so, I am convinced that it would be easy to reach it by draining the lake, as I have repeatedly requested the Ministry of Fine Arts to do. I was speaking about it to M. Dujardin-Beaumetz, the under-secretary for fine arts, only forty-eight hours before the publication of this book. Who knows but that the score of DON JUAN TRIUMPHANT might yet be discovered in the house on the lake?\n\n[2] See the interview of the special correspondent of the MATIN, with Mohammed-Ali Bey, on the day after the entry of the Salonika troops into Constantinople.\n\n\n\n\nTHE END\n\n\n\n\nThe Paris Opera House\n\nTHE SCENE OF GASTON LEROUX'S NOVEL, \"THE PHANTOM OF THE OPERA\"\n\nThat Mr. Leroux has used, for the scene of his story, the Paris Opera House as it really is and has not created a building out of his imagination, is shown by this interesting description of it taken from an article which appeared in Scribner's Magazine in 1879, a short time after the building was completed:\n\n\"The new Opera House, commenced under the Empire and finished under the Republic, is the most complete building of the kind in the world and in many respects the most beautiful. No European capital possesses an opera house so comprehensive in plan and execution, and none can boast an edifice equally vast and splendid.\n\n\"The site of the Opera House was chosen in 1861. It was determined to lay the foundation exceptionally deep and strong. It was well known that water would be met with, but it was impossible to foresee at what depth or in what quantity it would be found. Exceptional depth also was necessary, as the stage arrangements were to be such as to admit a scene fifty feet high to be lowered on its frame. It was therefore necessary to lay a foundation in a soil soaked with water which should be sufficiently solid to sustain a weight of 22,000,000 pounds, and at the same time to be perfectly dry, as the cellars were intended for the storage of scenery and properties. While the work was in progress, the excavation was kept free from water by means of eight pumps, worked by steam power, and in operation, without interruption, day and night, from March second to October thirteenth. The floor of the cellar was covered with a layer of concrete, then with two coats of cement, another layer of concrete and a coat of bitumen. The wall includes an outer wall built as a coffer-dam, a brick wall, a coat of cement, and a wall proper, a little over a yard thick. After all this was done the whole was filled with water, in order that the fluid, by penetrating into the most minute interstices, might deposit a sediment which would close them more surely and perfectly than it would be possible to do by hand. Twelve years elapsed before the completion of the building, and during that time it was demonstrated that the precautions taken secured absolute impermeability and solidity.\n\n\"The events of 1870 interrupted work just as it was about to be prosecuted most vigorously, and the new Opera House was put to new and unexpected uses. During the siege, it was converted into a vast military storehouse and filled with a heterogeneous mass of goods. After the siege the building fell into the hands of the Commune and the roof was turned into a balloon station. The damage done, however, was slight.\n\n\"The fine stone employed in the construction was brought from quarries in Sweden, Scotland, Italy, Algeria, Finland, Spain, Belgium and France. While work on the exterior was in progress, the building was covered in by a wooden shell, rendered transparent by thousands of small panes of glass. In 1867 a swarm of men, supplied with hammers and axes, stripped the house of its habit, and showed in all its splendor the great structure. No picture can do justice to the rich colors of the edifice or to the harmonious tone resulting from the skilful use of many diverse materials. The effect of the frontage is completed by the cupola of the auditorium, topped with a cap of bronze sparingly adorned with gilding. Farther on, on a level with the towers of Notre-Dame, is the gable end of the roof of the stage, a 'Pegasus', by M. Lequesne, rising at either end of the roof, and a bronze group by M. Millet, representing 'Apollo lifting his golden lyre', commanding the apex. Apollo, it may here be mentioned, is useful as well as ornamental, for his lyre is tipped with a metal point which does duty as a lightning-rod, and conducts the fluid to the body and down the nether limbs of the god.\n\n\"The spectator, having climbed ten steps and left behind him a gateway, reaches a vestibule in which are statues of Lully, Rameau, Gluck, and Handel. Ten steps of green Swedish marble lead to a second vestibule for ticket-sellers. Visitors who enter by the pavilion reserved for carriages pass through a hallway where ticket offices are situated. The larger number of the audience, before entering the auditorium, traverse a large circular vestibule located exactly beneath it. The ceiling of this portion of the building is upheld by sixteen fluted columns of Jura stone, with white marble capitals, forming a portico. Here servants are to await their masters, and spectators may remain until their carriages are summoned. The third entrance, which is quite distinct from the others, is reserved for the Executive. The section of the building set aside for the use of the Emperor Napoleon was to have included an antechamber for the bodyguards; a salon for the aides-de-camp; a large salon and a smaller one for the Empress; hat and cloak rooms, etc. Moreover, there were to be in close proximity to the entrance, stables for three coaches, for the outriders' horses, and for the twenty-one horsemen acting as an escort; a station for a squad of infantry of thirty-one men and ten cent-gardes, and a stable for the horses of the latter; and, besides, a salon for fifteen or twenty domestics. Thus arrangements had to be made to accommodate in this part of the building about one hundred persons, fifty horses, and half-a-dozen carriages. The fall of the Empire suggested some changes, but ample provision still exists for emergencies.\n\n\"Its novel conception, perfect fitness, and rare splendor of material, make the grand stairway unquestionably one of the most remarkable features of the building. It presents to the spectator, who has just passed through the subscribers' pavilion, a gorgeous picture. From this point he beholds the ceiling formed by the central landing; this and the columns sustaining it, built of Echaillon stone, are honeycombed with arabesques and heavy with ornaments; the steps are of white marble, and antique red marble balusters rest on green marble sockets and support a balustrade of onyx. To the right and to the left of this landing are stairways to the floor, on a plane with the first row of boxes. On this floor stand thirty monolith columns of Sarrancolin marble, with white marble bases and capitals. Pilasters of peach-blossom and violet stone are against the corresponding walls. More than fifty blocks had to be extracted from the quarry to find thirty perfect monoliths.\n\n\"The foyer de la danse has particular interest for the habitues of the Opera. It is a place of reunion to which subscribers to three performances a week are admitted between the acts in accordance with a usage established in 1870. Three immense looking-glasses cover the back wall of the FOYER, and a chandelier with one hundred and seven burners supplies it with light. The paintings include twenty oval medallions, in which are portrayed the twenty danseuses of most celebrity since the opera has existed in France, and four panels by M. Boulanger, typifying 'The War Dance', 'The Rustic Dance', 'The Dance of Love' and 'The Bacchic Dance.' While the ladies of the ballet receive their admirers in this foyer, they can practise their steps. Velvet-cushioned bars have to this end been secured at convenient points, and the floor has been given the same slope as that of the stage, so that the labor expended may be thoroughly profitable to the performance. The singers' foyer, on the same floor, is a much less lively resort than the foyer de la danse, as vocalists rarely leave their dressing-rooms before they are summoned to the stage. Thirty panels with portraits of the artists of repute in the annals of the Opera adorn this foyer.\n\n\"Some estimate ... may be arrived at by sitting before the concierge an hour or so before the representation commences. First appear the stage carpenters, who are always seventy, and sometimes, when L'Africaine, for example, with its ship scene, is the opera, one hundred and ten strong. Then come stage upholsterers, whose sole duty is to lay carpets, hang curtains, etc.; gas-men, and a squad of firemen. Claqueurs, call-boys, property-men, dressers, coiffeurs, supernumeraries, and artists, follow. The supernumeraries number about one hundred; some are hired by the year, but the 'masses' are generally recruited at the last minute and are generally working-men who seek to add to their meagre earnings. There are about a hundred choristers, and about eighty musicians.\n\n\"Next we behold equeries, whose horses are hoisted on the stage by means of an elevator; electricians who manage the light-producing batteries; hydrauliciens to take charge of the water-works in ballets like La Source; artificers who prepare the conflagration in Le Profeta; florists who make ready Margarita's garden, and a host of minor employees. This personnel is provided for as follows: Eighty dressing-rooms are reserved for the artists, each including a small antechamber, the dressing-room proper, and a little closet. Besides these apartments, the Opera has a dressing-room for sixty male, and another for fifty female choristers; a third for thirty-four male dancers; four dressing-rooms for twenty female dancers of different grades; a dressing-room for one hundred and ninety supernumeraries, etc.\"\n\nA few figures taken from the article will suggest the enormous capacity and the perfect convenience of the house. \"There are 2,531 doors and 7,593 keys; 14 furnaces and grates heat the house; the gaspipes if connected would form a pipe almost 16 miles long; 9 reservoirs, and two tanks hold 22,222 gallons of water and distribute their contents through 22,829 2-5 feet of piping; 538 persons have places assigned wherein to change their attire. The musicians have a foyer with 100 closets for their instruments.\"\n\nThe author remarks of his visit to the Opera House that it \"was almost as bewildering as it was agreeable. Giant stairways and colossal halls, huge frescoes and enormous mirrors, gold and marble, satin and velvet, met the eye at every turn.\"\n\nIn a recent letter Mr. Andre Castaigne, whose remarkable pictures illustrate the text, speaks of a river or lake under the Opera House and mentions the fact that there are now also three metropolitan railway tunnels, one on top of the other.\n"
  },
  {
    "path": "Patterns in Gothic Literature/color_names.csv",
    "content": "Colour Name,First Usage,Colour Family,hex,URL,Part of Speech,0000D category\r\nwhite,0,white,white,,adjective,The external world > matter > colour > named colors\r\nblank,1325,white,white,,adjective,The external world > matter > colour > named colors\r\nblanch,1330,white,white,,adjective,The external world > matter > colour > named colors\r\npaper-white,1430,white,white,,adjective,The external world > matter > colour > named colors\r\ncandid,1635,white,white,,adjective,The external world > matter > colour > named colors\r\nwhitish,1398,whitish,white,,adjective,The external world > matter > colour > named colors\r\nwhitelike,1608,whitish,white,,adjective,The external world > matter > colour > named colors\r\nalbid,1657,whitish,white,,adjective,The external world > matter > colour > named colors\r\nincandent,1854,brilliantly white,white,,adjective,The external world > matter > colour > named colors\r\nall-white,0,pure white,white,http://www.ansiindia.com/blowups/pure-white-pebbles.jpg,adjective,The external world > matter > colour > named colors\r\ndead white,1794,pure white,white,http://www.ansiindia.com/blowups/pure-white-pebbles.jpg,adjective,The external world > matter > colour > named colors\r\nsnow-white,1000,white as snow,snow,http://www.marcodebiasi.net/MDhobbies/MDphoto/photogalleries/nature/whitesnow05.jpg,adjective,The external world > matter > colour > named colors\r\nsnowish,1374,white as snow,snow,http://www.marcodebiasi.net/MDhobbies/MDphoto/photogalleries/nature/whitesnow05.jpg,adjective,The external world > matter > colour > named colors\r\nsnowy,1590,white as snow,snow,http://www.marcodebiasi.net/MDhobbies/MDphoto/photogalleries/nature/whitesnow05.jpg,adjective,The external world > matter > colour > named colors\r\nnixious,1623,white as snow,snow,http://www.marcodebiasi.net/MDhobbies/MDphoto/photogalleries/nature/whitesnow05.jpg,adjective,The external world > matter > colour > named colors\r\nsnow-like,1663,white as snow,snow,http://www.marcodebiasi.net/MDhobbies/MDphoto/photogalleries/nature/whitesnow05.jpg,adjective,The external world > matter > colour > named colors\r\nsnow,1750,white as snow,snow,http://www.marcodebiasi.net/MDhobbies/MDphoto/photogalleries/nature/whitesnow05.jpg,adjective,The external world > matter > colour > named colors\r\nmilk-white,0,white as milk,white,http://cdn1.medicalnewstoday.com/content/images/articles/273451-milk.jpg,adjective,The external world > matter > colour > named colors\r\nmilkish,1398,white as milk,white,http://cdn1.medicalnewstoday.com/content/images/articles/273451-milk.jpg,adjective,The external world > matter > colour > named colors\r\nmilky,1398,white as milk,white,http://cdn1.medicalnewstoday.com/content/images/articles/273451-milk.jpg,adjective,The external world > matter > colour > named colors\r\nmilk,1500,white as milk,white,http://cdn1.medicalnewstoday.com/content/images/articles/273451-milk.jpg,adjective,The external world > matter > colour > named colors\r\nmilken,1586,white as milk,white,http://cdn1.medicalnewstoday.com/content/images/articles/273451-milk.jpg,adjective,The external world > matter > colour > named colors\r\nlacteal,1633,white as milk,white,http://cdn1.medicalnewstoday.com/content/images/articles/273451-milk.jpg,adjective,The external world > matter > colour > named colors\r\nlacteous,1646,white as milk,white,http://cdn1.medicalnewstoday.com/content/images/articles/273451-milk.jpg,adjective,The external world > matter > colour > named colors\r\nlactaceous,1656,white as milk,white,http://cdn1.medicalnewstoday.com/content/images/articles/273451-milk.jpg,adjective,The external world > matter > colour > named colors\r\nlactean,1659,white as milk,white,http://cdn1.medicalnewstoday.com/content/images/articles/273451-milk.jpg,adjective,The external world > matter > colour > named colors\r\nlactescent,1758,white as milk,white,http://cdn1.medicalnewstoday.com/content/images/articles/273451-milk.jpg,adjective,The external world > matter > colour > named colors\r\nbone,1275,white as ivory or bone,ivory,http://i.ebayimg.com/00/s/MzQ4WDM0OA==/z/DBAAAOSwZVlXnmGm/$_1.JPG?set_id=2,adjective,The external world > matter > colour > named colors\r\nivory,1586,white as ivory or bone,ivory,http://i.ebayimg.com/00/s/MzQ4WDM0OA==/z/DBAAAOSwZVlXnmGm/$_1.JPG?set_id=2,adjective,The external world > matter > colour > named colors\r\nivory-white,1595,white as ivory or bone,ivory,http://i.ebayimg.com/00/s/MzQ4WDM0OA==/z/DBAAAOSwZVlXnmGm/$_1.JPG?set_id=2,adjective,The external world > matter > colour > named colors\r\neburnean,1656,white as ivory or bone,ivory,http://i.ebayimg.com/00/s/MzQ4WDM0OA==/z/DBAAAOSwZVlXnmGm/$_1.JPG?set_id=2,adjective,The external world > matter > colour > named colors\r\neburnine,1822,white as ivory or bone,ivory,http://i.ebayimg.com/00/s/MzQ4WDM0OA==/z/DBAAAOSwZVlXnmGm/$_1.JPG?set_id=2,adjective,The external world > matter > colour > named colors\r\nbone-white,1856,white as ivory or bone,ivory,http://i.ebayimg.com/00/s/MzQ4WDM0OA==/z/DBAAAOSwZVlXnmGm/$_1.JPG?set_id=2,adjective,The external world > matter > colour > named colors\r\nivorine,1888,white as ivory or bone,ivory,http://i.ebayimg.com/00/s/MzQ4WDM0OA==/z/DBAAAOSwZVlXnmGm/$_1.JPG?set_id=2,adjective,The external world > matter > colour > named colors\r\nivoried,1890,white as ivory or bone,ivory,http://i.ebayimg.com/00/s/MzQ4WDM0OA==/z/DBAAAOSwZVlXnmGm/$_1.JPG?set_id=2,adjective,The external world > matter > colour > named colors\r\nbone-coloured,1951,white as ivory or bone,ivory,http://i.ebayimg.com/00/s/MzQ4WDM0OA==/z/DBAAAOSwZVlXnmGm/$_1.JPG?set_id=2,adjective,The external world > matter > colour > named colors\r\nlily-white,1325,white as lily,floralwhite,https://tse1.mm.bing.net/th?id=OIP.YoTvnt8BqgxkpLIDaOfXCgEsC7&pid=Api&w=288&h=181,adjective,The external world > matter > colour > named colors\r\nlily,1500,white as lily,floralwhite,https://tse1.mm.bing.net/th?id=OIP.YoTvnt8BqgxkpLIDaOfXCgEsC7&pid=Api&w=288&h=181,adjective,The external world > matter > colour > named colors\r\nlily-whited,1560,white as lily,floralwhite,https://tse1.mm.bing.net/th?id=OIP.YoTvnt8BqgxkpLIDaOfXCgEsC7&pid=Api&w=288&h=181,adjective,The external world > matter > colour > named colors\r\nlily-wristed,1648,white as lily,floralwhite,https://tse1.mm.bing.net/th?id=OIP.YoTvnt8BqgxkpLIDaOfXCgEsC7&pid=Api&w=288&h=181,adjective,The external world > matter > colour > named colors\r\nlily-like,1652,white as lily,floralwhite,https://tse1.mm.bing.net/th?id=OIP.YoTvnt8BqgxkpLIDaOfXCgEsC7&pid=Api&w=288&h=181,adjective,The external world > matter > colour > named colors\r\nlily-coloured,1866,white as lily,floralwhite,https://tse1.mm.bing.net/th?id=OIP.YoTvnt8BqgxkpLIDaOfXCgEsC7&pid=Api&w=288&h=181,adjective,The external world > matter > colour > named colors\r\nchalk-white,1400,white as chalk,white,https://img1.etsystatic.com/115/0/13166338/il_570xN.1034939389_3avz.jpg,adjective,The external world > matter > colour > named colors\r\nchalky,1611,white as chalk,white,https://img1.etsystatic.com/115/0/13166338/il_570xN.1034939389_3avz.jpg,adjective,The external world > matter > colour > named colors\r\nchalkish,1657,white as chalk,white,https://img1.etsystatic.com/115/0/13166338/il_570xN.1034939389_3avz.jpg,adjective,The external world > matter > colour > named colors\r\nermine,1610,white as ermine,white,https://img1.etsystatic.com/115/0/13166338/il_570xN.1034939389_3avz.jpg,adjective,The external world > matter > colour > named colors\r\nermined,1823,white as ermine,white,https://img1.etsystatic.com/115/0/13166338/il_570xN.1034939389_3avz.jpg,adjective,The external world > matter > colour > named colors\r\nmarble,1565,white as marble or alabaster,white,http://www.inneocreative.com/wp-content/uploads/2011/11/alabaster-bianco-32x64.jpg,adjective,The external world > matter > colour > named colors\r\nalabaster,1566,white as marble or alabaster,white,http://www.inneocreative.com/wp-content/uploads/2011/11/alabaster-bianco-32x64.jpg,adjective,The external world > matter > colour > named colors\r\nalabastrine,1578,white as marble or alabaster,white,http://www.inneocreative.com/wp-content/uploads/2011/11/alabaster-bianco-32x64.jpg,adjective,The external world > matter > colour > named colors\r\nmarmorean,1656,white as marble or alabaster,white,http://www.inneocreative.com/wp-content/uploads/2011/11/alabaster-bianco-32x64.jpg,adjective,The external world > matter > colour > named colors\r\nmarbly,1814,white as marble or alabaster,white,http://www.inneocreative.com/wp-content/uploads/2011/11/alabaster-bianco-32x64.jpg,adjective,The external world > matter > colour > named colors\r\nmarmoreal,1869,white as marble or alabaster,white,http://www.inneocreative.com/wp-content/uploads/2011/11/alabaster-bianco-32x64.jpg,adjective,The external world > matter > colour > named colors\r\npearly,1596,white as pearl,seashell,https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcRNHMTsW08tA6iW262oVeKsdPOYcTMoD23e-8rSbpx-jomr_z-4,adjective,The external world > matter > colour > named colors\r\nswan-white,1393,other whites,white,,adjective,The external world > matter > colour > named colors\r\nice-white,1641,other whites,white,,adjective,The external world > matter > colour > named colors\r\npearl white,1779,other whites,seashell,,adjective,The external world > matter > colour > named colors\r\nlint-white,1794,other whites,white,,adjective,The external world > matter > colour > named colors\r\nwool-white,1819,other whites,white,,adjective,The external world > matter > colour > named colors\r\nfish belly,1878,other whites,white,,adjective,The external world > matter > colour > named colors\r\nwax-white,1883,other whites,white,,adjective,The external world > matter > colour > named colors\r\ncottonary,1658,white as cotton,white,https://3.imimg.com/data3/HT/BS/MY-3476148/raw-cotton-250x250.jpg,adjective,The external world > matter > colour > named colors\r\ncottonous,1664,white as cotton,white,https://3.imimg.com/data3/HT/BS/MY-3476148/raw-cotton-250x250.jpg,adjective,The external world > matter > colour > named colors\r\ncottony,1664,white as cotton,white,https://3.imimg.com/data3/HT/BS/MY-3476148/raw-cotton-250x250.jpg,adjective,The external world > matter > colour > named colors\r\ndead white,1794,dull white,ghostwhite,,adjective,The external world > matter > colour > named colors\r\nsheep-hued,1583,off-white,oldlace,,adjective,The external world > matter > colour > named colors\r\necru,1869,off-white,oldlace,,adjective,The external world > matter > colour > named colors\r\nnatural-coloured,1909,off-white,oldlace,,adjective,The external world > matter > colour > named colors\r\noff-white,1931,off-white,oldlace,,adjective,The external world > matter > colour > named colors\r\noysterous,1882,greyish white,whitesmoke,,adjective,The external world > matter > colour > named colors\r\noyster,1893,greyish white,whitesmoke,,adjective,The external world > matter > colour > named colors\r\nwhite,0,silvery,silver,http://www.chemicool.com/elements/images/300-galena.jpg,adjective,The external world > matter > colour > named colors\r\nsilver,1405,silvery,silver,http://www.chemicool.com/elements/images/300-galena.jpg,adjective,The external world > matter > colour > named colors\r\nsilverish,1530,silvery,silver,http://www.chemicool.com/elements/images/300-galena.jpg,adjective,The external world > matter > colour > named colors\r\nargentine,1578,silvery,silver,http://www.chemicool.com/elements/images/300-galena.jpg,adjective,The external world > matter > colour > named colors\r\nargent,1593,silvery,silver,http://www.chemicool.com/elements/images/300-galena.jpg,adjective,The external world > matter > colour > named colors\r\nsilver-coloured,1594,silvery,silver,http://www.chemicool.com/elements/images/300-galena.jpg,adjective,The external world > matter > colour > named colors\r\nsilver-white,1598,silvery,silver,http://www.chemicool.com/elements/images/300-galena.jpg,adjective,The external world > matter > colour > named colors\r\nsilver-like,1611,silvery,silver,http://www.chemicool.com/elements/images/300-galena.jpg,adjective,The external world > matter > colour > named colors\r\nsilvery,1611,silvery,silver,http://www.chemicool.com/elements/images/300-galena.jpg,adjective,The external world > matter > colour > named colors\r\nargenteous,1881,silvery,silver,http://www.chemicool.com/elements/images/300-galena.jpg,adjective,The external world > matter > colour > named colors\r\nsilvern,1885,silvery,silver,http://www.chemicool.com/elements/images/300-galena.jpg,adjective,The external world > matter > colour > named colors\r\nflatten,1625,bluish white,aliceblue,,adjective,The external world > matter > colour > named colors\r\nfleeten,1640,bluish white,aliceblue,,adjective,The external world > matter > colour > named colors\r\nblue-white,1819,bluish white,aliceblue,,adjective,The external world > matter > colour > named colors\r\nblush-white,1882,reddish white,misty rose,,adjective,The external world > matter > colour > named colors\r\ncream-coloured,1707,cream,ivory,http://www.lifetasteslikefood.com/wp-content/uploads/2012/01/IMG_8891-1024x682.jpg,adjective,The external world > matter > colour > named colors\r\ncreamy,1845,cream,ivory,http://www.lifetasteslikefood.com/wp-content/uploads/2012/01/IMG_8891-1024x682.jpg,adjective,The external world > matter > colour > named colors\r\ncream,1861,cream,ivory,http://www.lifetasteslikefood.com/wp-content/uploads/2012/01/IMG_8891-1024x682.jpg,adjective,The external world > matter > colour > named colors\r\nblack,0,black,black,,adjective,The external world > matter > colour > named colors\r\nblok,1200,black,black,,adjective,The external world > matter > colour > named colors\r\nneger,1425,black,black,,adjective,The external world > matter > colour > named colors\r\nsable,1470,black,black,,adjective,The external world > matter > colour > named colors\r\nblack-coloured,1528,black,black,,adjective,The external world > matter > colour > named colors\r\nsable-coloured,1596,black,black,,adjective,The external world > matter > colour > named colors\r\nebon,1607,black,black,,adjective,The external world > matter > colour > named colors\r\nEthiop,1616,black,black,,adjective,The external world > matter > colour > named colors\r\ntorrid,1634,black,black,,adjective,The external world > matter > colour > named colors\r\natred,1654,black,black,,adjective,The external world > matter > colour > named colors\r\npullous,1698,black,black,,adjective,The external world > matter > colour > named colors\r\nnigricant,1772,black,black,,adjective,The external world > matter > colour > named colors\r\nnigrific,1804,black,black,,adjective,The external world > matter > colour > named colors\r\nNegro,1816,black,black,,adjective,The external world > matter > colour > named colors\r\nnigritudinous,1849,black,black,,adjective,The external world > matter > colour > named colors\r\nnigrine,1885,black,black,,adjective,The external world > matter > colour > named colors\r\nblackish,1450,blackish,black,,adjective,The external world > matter > colour > named colors\r\nblacky,1594,blackish,black,,adjective,The external world > matter > colour > named colors\r\nnigrescent,1725,blackish,black,,adjective,The external world > matter > colour > named colors\r\nbigresceous,1887,blackish,black,,adjective,The external world > matter > colour > named colors\r\nfor-black,1405,very or completely black,black,,adjective,The external world > matter > colour > named colors\r\nself-black,1558,very or completely black,black,,adjective,The external world > matter > colour > named colors\r\nnigrous,1826,very or completely black,black,,adjective,The external world > matter > colour > named colors\r\nall-black,1847,very or completely black,black,,adjective,The external world > matter > colour > named colors\r\njet-black,1477,black as jet,black,http://upload.wikimedia.org/wikipedia/commons/thumb/2/27/Sample_of_jet_2013.JPG/300px-Sample_of_jet_2013.JPG,adjective,The external world > matter > colour > named colors\r\njetty,1477,black as jet,black,http://upload.wikimedia.org/wikipedia/commons/thumb/2/27/Sample_of_jet_2013.JPG/300px-Sample_of_jet_2013.JPG,adjective,The external world > matter > colour > named colors\r\njetty-black,1477,black as jet,black,http://upload.wikimedia.org/wikipedia/commons/thumb/2/27/Sample_of_jet_2013.JPG/300px-Sample_of_jet_2013.JPG,adjective,The external world > matter > colour > named colors\r\njettish,1599,black as jet,black,http://upload.wikimedia.org/wikipedia/commons/thumb/2/27/Sample_of_jet_2013.JPG/300px-Sample_of_jet_2013.JPG,adjective,The external world > matter > colour > named colors\r\njet,1607,black as jet,black,http://upload.wikimedia.org/wikipedia/commons/thumb/2/27/Sample_of_jet_2013.JPG/300px-Sample_of_jet_2013.JPG,adjective,The external world > matter > colour > named colors\r\ncoal-black,1275,black as coal,black,http://energynewsbd.com/panel/newspicture/1465400395c.jpg,adjective,The external world > matter > colour > named colors\r\nas black as coal,1400,black as coal,black,http://energynewsbd.com/panel/newspicture/1465400395c.jpg,adjective,The external world > matter > colour > named colors\r\ncoaly,1565,black as coal,black,http://energynewsbd.com/panel/newspicture/1465400395c.jpg,adjective,The external world > matter > colour > named colors\r\nnight-black,1591,black as night,black,http://www.qingdaonese.com/wp-content/uploads/2012/04/qingdaophotos_nightskyHuangdao.jpg,adjective,The external world > matter > colour > named colors\r\nnight-dark,1879,black as night,black,http://www.qingdaonese.com/wp-content/uploads/2012/04/qingdaophotos_nightskyHuangdao.jpg,adjective,The external world > matter > colour > named colors\r\nravenish,1500,black as raven,black,http://wpmedia.edmontonjournal.com/2016/02/edmonton-alberta-july-6-2015-a-raven-perchs-on-a-trash-c.jpeg?quality=55&strip=all&w=840&h=630&crop=1,adjective,The external world > matter > colour > named colors\r\nraven-black,1582,black as raven,black,http://wpmedia.edmontonjournal.com/2016/02/edmonton-alberta-july-6-2015-a-raven-perchs-on-a-trash-c.jpeg?quality=55&strip=all&w=840&h=630&crop=1,adjective,The external world > matter > colour > named colors\r\nraven-coloured,1594,black as raven,black,http://wpmedia.edmontonjournal.com/2016/02/edmonton-alberta-july-6-2015-a-raven-perchs-on-a-trash-c.jpeg?quality=55&strip=all&w=840&h=630&crop=1,adjective,The external world > matter > colour > named colors\r\nraven,1637,black as raven,black,http://wpmedia.edmontonjournal.com/2016/02/edmonton-alberta-july-6-2015-a-raven-perchs-on-a-trash-c.jpeg?quality=55&strip=all&w=840&h=630&crop=1,adjective,The external world > matter > colour > named colors\r\ninky,1593,black as ink,black,http://www.bluemaize.net/im/arts-crafts-sewing/black-ink-9.jpg,adjective,The external world > matter > colour > named colors\r\nsepian,1631,black as ink,black,http://www.bluemaize.net/im/arts-crafts-sewing/black-ink-9.jpg,adjective,The external world > matter > colour > named colors\r\natramental,1646,black as ink,black,http://www.bluemaize.net/im/arts-crafts-sewing/black-ink-9.jpg,adjective,The external world > matter > colour > named colors\r\natramentous,1646,black as ink,black,http://www.bluemaize.net/im/arts-crafts-sewing/black-ink-9.jpg,adjective,The external world > matter > colour > named colors\r\nchalcanthous,1646,black as ink,black,http://www.bluemaize.net/im/arts-crafts-sewing/black-ink-9.jpg,adjective,The external world > matter > colour > named colors\r\natramentitious,1650,black as ink,black,http://www.bluemaize.net/im/arts-crafts-sewing/black-ink-9.jpg,adjective,The external world > matter > colour > named colors\r\ninkish,1670,black as ink,black,http://www.bluemaize.net/im/arts-crafts-sewing/black-ink-9.jpg,adjective,The external world > matter > colour > named colors\r\natramentaceous,1713,black as ink,black,http://www.bluemaize.net/im/arts-crafts-sewing/black-ink-9.jpg,adjective,The external world > matter > colour > named colors\r\natramentarious,1717,black as ink,black,http://www.bluemaize.net/im/arts-crafts-sewing/black-ink-9.jpg,adjective,The external world > matter > colour > named colors\r\nblack as pitch,1300,black as pitch,black,https://i.kinja-img.com/gawker-media/image/upload/t_original/685722504901980592.jpg,adjective,The external world > matter > colour > named colors\r\npitchy,1522,black as pitch,black,https://i.kinja-img.com/gawker-media/image/upload/t_original/685722504901980592.jpg,adjective,The external world > matter > colour > named colors\r\npitch black,1598,black as pitch,black,https://i.kinja-img.com/gawker-media/image/upload/t_original/685722504901980592.jpg,adjective,The external world > matter > colour > named colors\r\npitch-coloured,1601,black as pitch,black,https://i.kinja-img.com/gawker-media/image/upload/t_original/685722504901980592.jpg,adjective,The external world > matter > colour > named colors\r\npitchy black,1615,black as pitch,black,https://i.kinja-img.com/gawker-media/image/upload/t_original/685722504901980592.jpg,adjective,The external world > matter > colour > named colors\r\npiceous,1726,black as pitch,black,https://i.kinja-img.com/gawker-media/image/upload/t_original/685722504901980592.jpg,adjective,The external world > matter > colour > named colors\r\npicescent,1847,black as pitch,black,https://i.kinja-img.com/gawker-media/image/upload/t_original/685722504901980592.jpg,adjective,The external world > matter > colour > named colors\r\nsooty,1593,black as soot,black,https://us.123rf.com/450wm/kzwwsko/kzwwsko1503/kzwwsko150302309/37644600-black-soot-on-the-metal.jpg?ver=6,adjective,The external world > matter > colour > named colors\r\nfuliginated,1634,black as soot,black,https://us.123rf.com/450wm/kzwwsko/kzwwsko1503/kzwwsko150302309/37644600-black-soot-on-the-metal.jpg?ver=6,adjective,The external world > matter > colour > named colors\r\nfuliginous,1657,black as soot,black,https://us.123rf.com/450wm/kzwwsko/kzwwsko1503/kzwwsko150302309/37644600-black-soot-on-the-metal.jpg?ver=6,adjective,The external world > matter > colour > named colors\r\npit-black,1871,black as soot,black,https://us.123rf.com/450wm/kzwwsko/kzwwsko1503/kzwwsko150302309/37644600-black-soot-on-the-metal.jpg?ver=6,adjective,The external world > matter > colour > named colors\r\nBible-black,1953,black as soot,black,https://us.123rf.com/450wm/kzwwsko/kzwwsko1503/kzwwsko150302309/37644600-black-soot-on-the-metal.jpg?ver=6,adjective,The external world > matter > colour > named colors\r\nfusco-piceous,1847,reddish-black,black,,adjective,The external world > matter > colour > named colors\r\nbrownish-black,1685,brownish-black,darkbrown,,adjective,The external world > matter > colour > named colors\r\nbrown-black,1849,brownish-black,darkbrown,,adjective,The external world > matter > colour > named colors\r\npukish,1566,bluish-black,midnightblue,,adjective,The external world > matter > colour > named colors\r\nblue-black,1626,bluish-black,midnightblue,,adjective,The external world > matter > colour > named colors\r\nsloe-black,1735,bluish-black,midnightblue,,adjective,The external world > matter > colour > named colors\r\nblack-rimmed,1704,bluish-black,midnightblue,,adjective,The external world > matter > colour > named colors\r\nblacked-edged,1706,bluish-black,midnightblue,,adjective,The external world > matter > colour > named colors\r\nblack-bordered,1774,bluish-black,midnightblue,,adjective,The external world > matter > colour > named colors\r\nsmutting,1631,blackening,black,,adjective,The external world > matter > colour > named colors\r\nblackening,1684,blackening,black,,adjective,The external world > matter > colour > named colors\r\nnigricanting,1715,blackening,black,,adjective,The external world > matter > colour > named colors\r\nforswarted,1305,blackened,black,,adjective,The external world > matter > colour > named colors\r\nbletchy,1520,blackened,black,,adjective,The external world > matter > colour > named colors\r\nblackened,1522,blackened,black,,adjective,The external world > matter > colour > named colors\r\nwell-blacked,1592,blackened,black,,adjective,The external world > matter > colour > named colors\r\ncollied,1600,blackened,black,,adjective,The external world > matter > colour > named colors\r\nblacked,1643,blackened,black,,adjective,The external world > matter > colour > named colors\r\nlamp-blacked,1864,blackened,black,,adjective,The external world > matter > colour > named colors\r\ncorked,1836,blackened,black,,adjective,The external world > matter > colour > named colors\r\nburnt-corked,1884,blackened,black,,adjective,The external world > matter > colour > named colors\r\nsootied,1615,blackened,black,,adjective,The external world > matter > colour > named colors\r\nfuliginous,1843,blackened,black,,adjective,The external world > matter > colour > named colors\r\nfire-swart,0,blackened,black,,adjective,The external world > matter > colour > named colors\r\ncharred,1794,blackened,black,,adjective,The external world > matter > colour > named colors\r\nblackleaded,1798,blackened,black,,adjective,The external world > matter > colour > named colors\r\nplumbagoed,1860,blackened,black,,adjective,The external world > matter > colour > named colors\r\npitchy,1425,blackened,black,,adjective,The external world > matter > colour > named colors\r\nunblacked,1836,blackened,black,,adjective,The external world > matter > colour > named colors\r\nred,0,red ,red,,adjective,The external world > matter > colour > named colors\r\nreod,0,red ,red,,adjective,The external world > matter > colour > named colors\r\nruddy,1398,red ,red,,adjective,The external world > matter > colour > named colors\r\nreddy,1400,red ,red,,adjective,The external world > matter > colour > named colors\r\nrouge,1425,red ,red,,adjective,The external world > matter > colour > named colors\r\nredly,1486,red ,red,,adjective,The external world > matter > colour > named colors\r\ngules,1503,red ,red,,adjective,The external world > matter > colour > named colors\r\nred-coloured,1547,red ,red,,adjective,The external world > matter > colour > named colors\r\nguly,1592,red ,red,,adjective,The external world > matter > colour > named colors\r\nblushing,1597,red ,red,,adjective,The external world > matter > colour > named colors\r\nrubric,1623,red ,red,,adjective,The external world > matter > colour > named colors\r\nnacarine,1643,red ,red,,adjective,The external world > matter > colour > named colors\r\nminious,1646,red ,red,,adjective,The external world > matter > colour > named colors\r\nrubriform,1704,red ,red,,adjective,The external world > matter > colour > named colors\r\ncarbuncly,1726,red ,red,,adjective,The external world > matter > colour > named colors\r\nblushful,1804,red ,red,,adjective,The external world > matter > colour > named colors\r\nenvermeiled,1822,red ,red,,adjective,The external world > matter > colour > named colors\r\nablush,1852,red ,red,,adjective,The external world > matter > colour > named colors\r\nflammulated,1872,red ,red,,adjective,The external world > matter > colour > named colors\r\nrubrical,1641,red ,red,,adjective,The external world > matter > colour > named colors\r\nredward,1880,reddish,red,,adjective,The external world > matter > colour > named colors\r\nreddish,1398,reddish,red,,adjective,The external world > matter > colour > named colors\r\nrubicund,1425,reddish,red,,adjective,The external world > matter > colour > named colors\r\nruddish,1563,reddish,red,,adjective,The external world > matter > colour > named colors\r\nruddyish,1651,reddish,red,,adjective,The external world > matter > colour > named colors\r\nrutilous,1654,reddish,red,,adjective,The external world > matter > colour > named colors\r\nflushy,1706,reddish,red,,adjective,The external world > matter > colour > named colors\r\nrubescent,1731,reddish,red,,adjective,The external world > matter > colour > named colors\r\nrufescent,1802,reddish,red,,adjective,The external world > matter > colour > named colors\r\nrufulous,1883,reddish,red,,adjective,The external world > matter > colour > named colors\r\nruddy,1440,reddish,red,,adjective,The external world > matter > colour > named colors\r\nrufous,1782,reddish,red,,adjective,The external world > matter > colour > named colors\r\nreddy,1845,reddish,red,,adjective,The external world > matter > colour > named colors\r\ninred,1225,very red,red,,adjective,The external world > matter > colour > named colors\r\nfoxy,1783,excessively red,red,,adjective,The external world > matter > colour > named colors\r\nangered,1300,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\nscarlet,1386,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\npuniceous,1398,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\nvermeil,1400,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\ncoral,1522,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\nPunic,1553,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\norient,1578,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\nvermilion,1589,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\nwax-red,1593,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\ncherry-red,1594,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\nPunical,1606,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\ncoralline,1608,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\nscarleted,1641,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\ncoccineous,1654,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\ncinnabrian,1668,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\npoppy-coloured,1677,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\nminiaceous,1688,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\nphoeniceous,1688,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\ncherry-coloured,1695,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\ncoral-red,1700,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\ncherried,1762,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\npunicean,1786,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\ncinnabar,1807,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\ngeraniumed,1819,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\nminiatous,1826,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\nvermilion-coloured,1836,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\ngeranium-coloured,1836,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\npink,1846,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\nlobster-red,1846,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\nphoenicean,1857,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\nmagenta,1877,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\ncardinal,1879,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\nscarlet-vermilion,1882,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\ncanellia-red,1890,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\nminiate,1891,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\nnasturtium-red,1896,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\nsealing-wax red,1907,bright red or scarlet,red,,adjective,The external world > matter > colour > named colors\r\nblood-red,0,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\nbloody,0,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\npurpurine,1300,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\nsanguine,1382,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\ntuly,1398,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\nmurrey,1400,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\npurpure,1400,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\ncrimson,1416,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\nsanguinolent,1450,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\ncramoisy,1480,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\nruby-red,1487,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\nruby,1500,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\nsanguineous,1520,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\nsanguine-coloured,1552,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\nblood-coloured,1567,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\npurple-red,1578,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\nrubied,1594,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\nincarnadine,1605,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\nTyrian,1614,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\nrubious,1616,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\nmurrey-coloured,1657,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\nhaematine,1658,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\nvinaceous,1688,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\ncarmine,1737,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\nclaret-coloured,1779,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\nensanguined,1785,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\npeony,1810,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\nsanguinaceous,1816,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\ngory,1822,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\ncrimsony,1830,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\nvinous,1834,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\nlaky,1849,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\ngrenat,1851,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\nmadder,1852,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\nwine-dark,1855,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\npoppy crimson,1879,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\nclaret,1882,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\nvinous,1894,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\nalizarin,1923,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\nwine,1950,deep red or crimson,crimson,,adjective,The external world > matter > colour > named colors\r\nrusty,1398,brownish-red,darkred,,adjective,The external world > matter > colour > named colors\r\nhepatic,1420,brownish-red,darkred,,adjective,The external world > matter > colour > named colors\r\nhorse-flesh,1530,brownish-red,darkred,,adjective,The external world > matter > colour > named colors\r\nrubiginous,1538,brownish-red,darkred,,adjective,The external world > matter > colour > named colors\r\niron,1587,brownish-red,darkred,,adjective,The external world > matter > colour > named colors\r\nsand-red,1639,brownish-red,darkred,,adjective,The external world > matter > colour > named colors\r\nferruginous,1656,brownish-red,darkred,,adjective,The external world > matter > colour > named colors\r\nlateritious,1656,brownish-red,darkred,,adjective,The external world > matter > colour > named colors\r\nblood bay,1684,brownish-red,darkred,,adjective,The external world > matter > colour > named colors\r\ntestaceous,1688,brownish-red,darkred,,adjective,The external world > matter > colour > named colors\r\nrust-coloured,1691,brownish-red,darkred,,adjective,The external world > matter > colour > named colors\r\nbrick-coloured,1708,brownish-red,darkred,,adjective,The external world > matter > colour > named colors\r\nmaroon,1771,brownish-red,darkred,,adjective,The external world > matter > colour > named colors\r\nrufous,1782,brownish-red,darkred,,adjective,The external world > matter > colour > named colors\r\nrusted,1818,brownish-red,darkred,,adjective,The external world > matter > colour > named colors\r\nbrick-red,1823,brownish-red,darkred,,adjective,The external world > matter > colour > named colors\r\nworm red,1831,brownish-red,darkred,,adjective,The external world > matter > colour > named colors\r\nbrownish-red,1832,brownish-red,darkred,,adjective,The external world > matter > colour > named colors\r\nbrown-red,1835,brownish-red,darkred,,adjective,The external world > matter > colour > named colors\r\nfoxy,1850,brownish-red,darkred,,adjective,The external world > matter > colour > named colors\r\nrush,1854,brownish-red,darkred,,adjective,The external world > matter > colour > named colors\r\nbrickdust-like,1856,brownish-red,darkred,,adjective,The external world > matter > colour > named colors\r\nbrickdusty,1856,brownish-red,darkred,,adjective,The external world > matter > colour > named colors\r\nchestnut-red,1882,brownish-red,darkred,,adjective,The external world > matter > colour > named colors\r\nterra-cotta,1882,brownish-red,darkred,,adjective,The external world > matter > colour > named colors\r\ncopper-red,1883,brownish-red,darkred,,adjective,The external world > matter > colour > named colors\r\nbricky,1884,brownish-red,darkred,,adjective,The external world > matter > colour > named colors\r\nbrickish,1900,brownish-red,darkred,,adjective,The external world > matter > colour > named colors\r\nfox-red,1910,brownish-red,darkred,,adjective,The external world > matter > colour > named colors\r\noxblood,1918,brownish-red,darkred,,adjective,The external world > matter > colour > named colors\r\ntony,1921,brownish-red,darkred,,adjective,The external world > matter > colour > named colors\r\nrusty,1500,brownish-red,darkred,,adjective,The external world > matter > colour > named colors\r\nmahogany-red,1843,brownish-red,darkred,,adjective,The external world > matter > colour > named colors\r\nclaret,1547,yellowish-red,lightsalmon,,adjective,The external world > matter > colour > named colors\r\nroan,1558,yellowish-red,lightsalmon,,adjective,The external world > matter > colour > named colors\r\nsherry-red,1898,yellowish-red,lightsalmon,,adjective,The external world > matter > colour > named colors\r\nport-winey,1881,yellowish-red,lightsalmon,,adjective,The external world > matter > colour > named colors\r\nfire-red,1382,orange-red,orangered,,adjective,The external world > matter > colour > named colors\r\nflame-red,1382,orange-red,orangered,,adjective,The external world > matter > colour > named colors\r\nflammid,1610,orange-red,orangered,,adjective,The external world > matter > colour > named colors\r\nflammeous,1656,orange-red,orangered,,adjective,The external world > matter > colour > named colors\r\npimento,1921,orange-red,orangered,,adjective,The external world > matter > colour > named colors\r\npimiento,1963,orange-red,orangered,,adjective,The external world > matter > colour > named colors\r\nflame,1970,orange-red,orangered,,adjective,The external world > matter > colour > named colors\r\nrosen,0,rose-red or pink,pink,http://www.shzongyue.com/data/out/102/39584753-rose-red.jpg,adjective,The external world > matter > colour > named colors\r\nrose-red,0,rose-red or pink,pink,http://www.shzongyue.com/data/out/102/39584753-rose-red.jpg,adjective,The external world > matter > colour > named colors\r\nrosy,1381,rose-red or pink,pink,http://www.shzongyue.com/data/out/102/39584753-rose-red.jpg,adjective,The external world > matter > colour > named colors\r\nroseate,1449,rose-red or pink,pink,http://www.shzongyue.com/data/out/102/39584753-rose-red.jpg,adjective,The external world > matter > colour > named colors\r\nroset,1500,rose-red or pink,pink,http://www.shzongyue.com/data/out/102/39584753-rose-red.jpg,adjective,The external world > matter > colour > named colors\r\nrosing,1505,rose-red or pink,pink,http://www.shzongyue.com/data/out/102/39584753-rose-red.jpg,adjective,The external world > matter > colour > named colors\r\nrose-coloured,1526,rose-red or pink,pink,http://www.shzongyue.com/data/out/102/39584753-rose-red.jpg,adjective,The external world > matter > colour > named colors\r\nrose-like,1530,rose-red or pink,pink,http://www.shzongyue.com/data/out/102/39584753-rose-red.jpg,adjective,The external world > matter > colour > named colors\r\nroseal,1531,rose-red or pink,pink,http://www.shzongyue.com/data/out/102/39584753-rose-red.jpg,adjective,The external world > matter > colour > named colors\r\nrosal,1566,rose-red or pink,pink,http://www.shzongyue.com/data/out/102/39584753-rose-red.jpg,adjective,The external world > matter > colour > named colors\r\nrosy-fingered,1590,rose-red or pink,pink,http://www.shzongyue.com/data/out/102/39584753-rose-red.jpg,adjective,The external world > matter > colour > named colors\r\nred rose,1591,rose-red or pink,pink,http://www.shzongyue.com/data/out/102/39584753-rose-red.jpg,adjective,The external world > matter > colour > named colors\r\ncarnation,1598,rose-red or pink,pink,http://www.shzongyue.com/data/out/102/39584753-rose-red.jpg,adjective,The external world > matter > colour > named colors\r\ndamask,1598,rose-red or pink,pink,http://www.shzongyue.com/data/out/102/39584753-rose-red.jpg,adjective,The external world > matter > colour > named colors\r\nrosied,1600,rose-red or pink,pink,http://www.shzongyue.com/data/out/102/39584753-rose-red.jpg,adjective,The external world > matter > colour > named colors\r\ndamasked,1609,rose-red or pink,pink,http://www.shzongyue.com/data/out/102/39584753-rose-red.jpg,adjective,The external world > matter > colour > named colors\r\nroseac,1638,rose-red or pink,pink,http://www.shzongyue.com/data/out/102/39584753-rose-red.jpg,adjective,The external world > matter > colour > named colors\r\nrose,1667,rose-red or pink,pink,http://www.shzongyue.com/data/out/102/39584753-rose-red.jpg,adjective,The external world > matter > colour > named colors\r\nrose pink,1778,rose-red or pink,pink,http://www.shzongyue.com/data/out/102/39584753-rose-red.jpg,adjective,The external world > matter > colour > named colors\r\nrosaceous,1783,rose-red or pink,pink,http://www.shzongyue.com/data/out/102/39584753-rose-red.jpg,adjective,The external world > matter > colour > named colors\r\nrose-tinted,1783,rose-red or pink,pink,http://www.shzongyue.com/data/out/102/39584753-rose-red.jpg,adjective,The external world > matter > colour > named colors\r\nblush-rose,1888,rose-red or pink,pink,http://www.shzongyue.com/data/out/102/39584753-rose-red.jpg,adjective,The external world > matter > colour > named colors\r\nincarnate,1533,pale-red or pink,pink,,adjective,The external world > matter > colour > named colors\r\nfleshy,1555,pale-red or pink,pink,,adjective,The external world > matter > colour > named colors\r\nincarnation,1562,pale-red or pink,pink,,adjective,The external world > matter > colour > named colors\r\npallet,1565,pale-red or pink,pink,,adjective,The external world > matter > colour > named colors\r\npeach,1583,pale-red or pink,pink,,adjective,The external world > matter > colour > named colors\r\nbepurfurate,1584,pale-red or pink,pink,,adjective,The external world > matter > colour > named colors\r\nblush,1597,pale-red or pink,pink,,adjective,The external world > matter > colour > named colors\r\ncarnation,1598,pale-red or pink,pink,,adjective,The external world > matter > colour > named colors\r\npeachy,1599,pale-red or pink,pink,,adjective,The external world > matter > colour > named colors\r\npeach-coloured,1600,pale-red or pink,pink,,adjective,The external world > matter > colour > named colors\r\npink-coloured,1600,pale-red or pink,pink,,adjective,The external world > matter > colour > named colors\r\npink,1607,pale-red or pink,pink,,adjective,The external world > matter > colour > named colors\r\nblush-coloured,1626,pale-red or pink,pink,,adjective,The external world > matter > colour > named colors\r\nblushy,1626,pale-red or pink,pink,,adjective,The external world > matter > colour > named colors\r\ngridelin,1652,pale-red or pink,pink,,adjective,The external world > matter > colour > named colors\r\ncarnationed,1658,pale-red or pink,pink,,adjective,The external world > matter > colour > named colors\r\npinky,1661,pale-red or pink,pink,,adjective,The external world > matter > colour > named colors\r\ncarneous,1673,pale-red or pink,pink,,adjective,The external world > matter > colour > named colors\r\npeach blossom,1702,pale-red or pink,pink,,adjective,The external world > matter > colour > named colors\r\nflesh-coloured,1703,pale-red or pink,pink,,adjective,The external world > matter > colour > named colors\r\nflesh-colour,1711,pale-red or pink,pink,,adjective,The external world > matter > colour > named colors\r\nmushroom-coloured,1770,pale-red or pink,pink,,adjective,The external world > matter > colour > named colors\r\nsalmon-coloured,1776,pale-red or pink,pink,,adjective,The external world > matter > colour > named colors\r\npinkish,1785,pale-red or pink,pink,,adjective,The external world > matter > colour > named colors\r\nsalmon,1786,pale-red or pink,pink,,adjective,The external world > matter > colour > named colors\r\nblush-tinted,1818,pale-red or pink,pink,,adjective,The external world > matter > colour > named colors\r\nflesh-red,1819,pale-red or pink,pink,,adjective,The external world > matter > colour > named colors\r\nnaturelle,1873,pale-red or pink,pink,,adjective,The external world > matter > colour > named colors\r\nflesh-pink,1882,pale-red or pink,pink,,adjective,The external world > matter > colour > named colors\r\nlilac-pink,1882,pale-red or pink,pink,,adjective,The external world > matter > colour > named colors\r\nnude,1922,pale-red or pink,pink,,adjective,The external world > matter > colour > named colors\r\nmagnolia-pink,1931,pale-red or pink,pink,,adjective,The external world > matter > colour > named colors\r\nsalmony,1935,pale-red or pink,pink,,adjective,The external world > matter > colour > named colors\r\nmagnolia,1963,pale-red or pink,pink,,adjective,The external world > matter > colour > named colors\r\npoppy pink,1894,pale-red or pink,pink,,adjective,The external world > matter > colour > named colors\r\nstrawberry,1675,other reds,red,,adjective,The external world > matter > colour > named colors\r\nraspberry red,1735,other reds,red,,adjective,The external world > matter > colour > named colors\r\npomegranate,1844,other reds,red,,adjective,The external world > matter > colour > named colors\r\nframboise,1904,other reds,red,,adjective,The external world > matter > colour > named colors\r\nraspberry,1909,other reds,red,,adjective,The external world > matter > colour > named colors\r\ncrushed raspberry,1931,other reds,red,,adjective,The external world > matter > colour > named colors\r\npink-washed,1895,other reds,red,,adjective,The external world > matter > colour > named colors\r\nrubent,1568,becoming red,red,,adjective,The external world > matter > colour > named colors\r\nreddening,1701,becoming red,red,,adjective,The external world > matter > colour > named colors\r\nerubescent,1736,becoming red,red,,adjective,The external world > matter > colour > named colors\r\nrubifying,1405,making red,red,,adjective,The external world > matter > colour > named colors\r\nrubificative,1580,making red,red,,adjective,The external world > matter > colour > named colors\r\nruddy,1693,making red,red,,adjective,The external world > matter > colour > named colors\r\nrubific,1701,making red,red,,adjective,The external world > matter > colour > named colors\r\nred-making,1704,making red,red,,adjective,The external world > matter > colour > named colors\r\nrubific,1704,making red,red,,adjective,The external world > matter > colour > named colors\r\nrubified,1526,made red,red,,adjective,The external world > matter > colour > named colors\r\nreddened,1552,made red,red,,adjective,The external world > matter > colour > named colors\r\nempurpled,1600,made red,red,,adjective,The external world > matter > colour > named colors\r\ncrimsoned,1641,made red,red,,adjective,The external world > matter > colour > named colors\r\nruddied,1793,made red,red,,adjective,The external world > matter > colour > named colors\r\nincarnadined,1821,made red,red,,adjective,The external world > matter > colour > named colors\r\ncarnationed,1823,made red,red,,adjective,The external world > matter > colour > named colors\r\npurpured,1382,made red,red,,adjective,The external world > matter > colour > named colors\r\nin grain,1386,made red,red,,adjective,The external world > matter > colour > named colors\r\npurpled,1450,made red,red,,adjective,The external world > matter > colour > named colors\r\nengored,1602,made red,red,,adjective,The external world > matter > colour > named colors\r\nencrimsoned,1609,made red,red,,adjective,The external world > matter > colour > named colors\r\nvermeiled,1616,made red,red,,adjective,The external world > matter > colour > named colors\r\nraddled,1656,made red,red,,adjective,The external world > matter > colour > named colors\r\nruddled,1691,made red,red,,adjective,The external world > matter > colour > named colors\r\nvermilioned,1725,made red,red,,adjective,The external world > matter > colour > named colors\r\nincrimsoned,1831,made red,red,,adjective,The external world > matter > colour > named colors\r\nincarmined,1863,made red,red,,adjective,The external world > matter > colour > named colors\r\ncarmined,1893,made red,red,,adjective,The external world > matter > colour > named colors\r\nrosed,1577,made red,red,,adjective,The external world > matter > colour > named colors\r\nrosied,1600,made red,red,,adjective,The external world > matter > colour > named colors\r\npinkified,1886,made red,red,,adjective,The external world > matter > colour > named colors\r\nrubric,1475,made red,red,,adjective,The external world > matter > colour > named colors\r\nrubricate,1604,made red,red,,adjective,The external world > matter > colour > named colors\r\nrubricated,1604,made red,red,,adjective,The external world > matter > colour > named colors\r\nrubrical,1655,made red,red,,adjective,The external world > matter > colour > named colors\r\nrubricked,1728,made red,red,,adjective,The external world > matter > colour > named colors\r\nBrazil,1600,red colouring matter,red,,adjective,The external world > matter > colour > named colors\r\npelagian,1601,red colouring matter,red,,adjective,The external world > matter > colour > named colors\r\nrubric,1835,red colouring matter,red,,adjective,The external world > matter > colour > named colors\r\ngreen,0,green,green,,adjective,The external world > matter > colour > named colors\r\nverdant,1581,green,green,,adjective,The external world > matter > colour > named colors\r\nverdurant,1583,green,green,,adjective,The external world > matter > colour > named colors\r\nsinople,1590,green,green,,adjective,The external world > matter > colour > named colors\r\nvernant,1594,green,green,,adjective,The external world > matter > colour > named colors\r\nviricund,1599,green,green,,adjective,The external world > matter > colour > named colors\r\nvirid,1600,green,green,,adjective,The external world > matter > colour > named colors\r\ndeep green,1609,green,green,,adjective,The external world > matter > colour > named colors\r\nvirideous,1688,green,green,,adjective,The external world > matter > colour > named colors\r\nevergreen,1796,green,green,,adjective,The external world > matter > colour > named colors\r\nvirent,1830,green,green,,adjective,The external world > matter > colour > named colors\r\ngreenish,1398,greenish,green,,adjective,The external world > matter > colour > named colors\r\nherbish,1562,greenish,green,,adjective,The external world > matter > colour > named colors\r\nwatchet,1609,greenish,green,,adjective,The external world > matter > colour > named colors\r\nwillowish,1653,greenish,green,,adjective,The external world > matter > colour > named colors\r\ngreeny,1657,greenish,green,,adjective,The external world > matter > colour > named colors\r\nviridescent,1847,greenish,green,,adjective,The external world > matter > colour > named colors\r\ngreensome,1883,greenish,green,,adjective,The external world > matter > colour > named colors\r\ngreenery,1896,greenish,green,,adjective,The external world > matter > colour > named colors\r\nsmaragdine,1591,bright green,mediumseagreen,,adjective,The external world > matter > colour > named colors\r\nemerald-green,1637,bright green,mediumseagreen,,adjective,The external world > matter > colour > named colors\r\npoison green,1749,bright green,mediumseagreen,,adjective,The external world > matter > colour > named colors\r\nemeraldine,1855,bright green,mediumseagreen,,adjective,The external world > matter > colour > named colors\r\nlime-green,1890,bright green,mediumseagreen,,adjective,The external world > matter > colour > named colors\r\ntwig-green,1892,bright green,mediumseagreen,,adjective,The external world > matter > colour > named colors\r\nsteel-green,1560,dark green,darkgreen,,adjective,The external world > matter > colour > named colors\r\nbottle-green,1785,dark green,darkgreen,,adjective,The external world > matter > colour > named colors\r\ncorbeau,1810,dark green,darkgreen,,adjective,The external world > matter > colour > named colors\r\nforest-green,1810,dark green,darkgreen,,adjective,The external world > matter > colour > named colors\r\nrifle green,1829,dark green,darkgreen,,adjective,The external world > matter > colour > named colors\r\nspinach-green,1845,dark green,darkgreen,,adjective,The external world > matter > colour > named colors\r\npine green,1892,dark green,darkgreen,,adjective,The external world > matter > colour > named colors\r\narmy green,1897,dark green,darkgreen,,adjective,The external world > matter > colour > named colors\r\nmalachite,1900,dark green,darkgreen,,adjective,The external world > matter > colour > named colors\r\nseaweed-green,1937,dark green,darkgreen,,adjective,The external world > matter > colour > named colors\r\nlight green,0,light green,lightgreen,,adjective,The external world > matter > colour > named colors\r\nberyl,1508,light green,lightgreen,,adjective,The external world > matter > colour > named colors\r\nwater,1592,light green,lightgreen,,adjective,The external world > matter > colour > named colors\r\nberylline,1847,light green,lightgreen,,adjective,The external world > matter > colour > named colors\r\nchlorine,1849,light green,lightgreen,,adjective,The external world > matter > colour > named colors\r\npeppermint,1868,light green,lightgreen,,adjective,The external world > matter > colour > named colors\r\nreseda,1873,light green,lightgreen,,adjective,The external world > matter > colour > named colors\r\nspring green,1891,light green,lightgreen,,adjective,The external world > matter > colour > named colors\r\nlily-green,1965,light green,lightgreen,,adjective,The external world > matter > colour > named colors\r\npepperminty,1981,light green,lightgreen,,adjective,The external world > matter > colour > named colors\r\ngrass green,700,grass green,lawngreen,http://wonderopolis.org/wp-content/uploads//2014/03/dreamstime_xl_13459006-custom.jpg,adjective,The external world > matter > colour > named colors\r\ngrassy,1567,grass green,lawngreen,http://wonderopolis.org/wp-content/uploads//2014/03/dreamstime_xl_13459006-custom.jpg,adjective,The external world > matter > colour > named colors\r\nprasine,1398,leek green,mediumseagreen,http://www.churchofthemessiah.ca/wp-content/uploads/2014/10/29987836_xl-200x300.jpg,adjective,The external world > matter > colour > named colors\r\nleeky,1552,leek green,mediumseagreen,http://www.churchofthemessiah.ca/wp-content/uploads/2014/10/29987836_xl-200x300.jpg,adjective,The external world > matter > colour > named colors\r\nleekish,1576,leek green,mediumseagreen,http://www.churchofthemessiah.ca/wp-content/uploads/2014/10/29987836_xl-200x300.jpg,adjective,The external world > matter > colour > named colors\r\nporraceous,1600,leek green,mediumseagreen,http://www.churchofthemessiah.ca/wp-content/uploads/2014/10/29987836_xl-200x300.jpg,adjective,The external world > matter > colour > named colors\r\nleek-green,1864,leek green,mediumseagreen,http://www.churchofthemessiah.ca/wp-content/uploads/2014/10/29987836_xl-200x300.jpg,adjective,The external world > matter > colour > named colors\r\ngaudy-green,1400,yellowish-green,yellowgreen,,adjective,The external world > matter > colour > named colors\r\ngosling-colour,1600,yellowish-green,yellowgreen,,adjective,The external world > matter > colour > named colors\r\ngosling-green,1756,yellowish-green,yellowgreen,,adjective,The external world > matter > colour > named colors\r\nchrysoprase,1835,yellowish-green,yellowgreen,,adjective,The external world > matter > colour > named colors\r\ntilleul,1884,yellowish-green,yellowgreen,,adjective,The external world > matter > colour > named colors\r\nolive green,1600,yellowish-green,yellowgreen,,adjective,The external world > matter > colour > named colors\r\nolive,1600,yellowish-green,yellowgreen,,adjective,The external world > matter > colour > named colors\r\nolive-coloured,1752,yellowish-green,yellowgreen,,adjective,The external world > matter > colour > named colors\r\nolivaceous,1776,yellowish-green,yellowgreen,,adjective,The external world > matter > colour > named colors\r\nolive-greenish,1858,yellowish-green,yellowgreen,,adjective,The external world > matter > colour > named colors\r\nolivescent,1900,yellowish-green,yellowgreen,,adjective,The external world > matter > colour > named colors\r\nglaucy,1593,blusih green,lightseagreen,,adjective,The external world > matter > colour > named colors\r\nsea-green,1603,blusih green,lightseagreen,,adjective,The external world > matter > colour > named colors\r\nwave-green,1626,blusih green,lightseagreen,,adjective,The external world > matter > colour > named colors\r\naeruginous,1646,blusih green,lightseagreen,,adjective,The external world > matter > colour > named colors\r\nglaucous,1671,blusih green,lightseagreen,,adjective,The external world > matter > colour > named colors\r\neruginary,1681,blusih green,lightseagreen,,adjective,The external world > matter > colour > named colors\r\nverdazurine,1681,blusih green,lightseagreen,,adjective,The external world > matter > colour > named colors\r\nblue-green,1704,blusih green,lightseagreen,,adjective,The external world > matter > colour > named colors\r\nbluish-green,1754,blusih green,lightseagreen,,adjective,The external world > matter > colour > named colors\r\ncaesious,1835,blusih green,lightseagreen,,adjective,The external world > matter > colour > named colors\r\nverditer,1857,blusih green,lightseagreen,,adjective,The external world > matter > colour > named colors\r\nverd-asure,1876,blusih green,lightseagreen,,adjective,The external world > matter > colour > named colors\r\nverdigrisy,1897,blusih green,lightseagreen,,adjective,The external world > matter > colour > named colors\r\nbrown green,1882,brownish green,olive,,adjective,The external world > matter > colour > named colors\r\ngreyish green,0,greyish green,darkslategray,,adjective,The external world > matter > colour > named colors\r\nglass,1547,greyish green,lightseagreen,,adjective,The external world > matter > colour > named colors\r\nsage-coloured,1596,greyish green,lightseagreen,,adjective,The external world > matter > colour > named colors\r\nsage,1785,greyish green,lightseagreen,,adjective,The external world > matter > colour > named colors\r\nsage-greeny,1884,greyish green,lightseagreen,,adjective,The external world > matter > colour > named colors\r\navocado,1947,avocado green,lightseagreen,https://www.bbcgoodfood.com/sites/default/files/glossary/avocado.jpg,adjective,The external world > matter > colour > named colors\r\nbeech-green,1450,other green,green,,adjective,The external world > matter > colour > named colors\r\nviper-green,1602,other green,green,,adjective,The external world > matter > colour > named colors\r\nsap-green,1658,other green,green,,adjective,The external world > matter > colour > named colors\r\nlettuce green,1834,other green,green,,adjective,The external world > matter > colour > named colors\r\nKendal green,1866,other green,green,,adjective,The external world > matter > colour > named colors\r\njade-green,1868,other green,green,,adjective,The external world > matter > colour > named colors\r\npistachio,1875,other green,green,,adjective,The external world > matter > colour > named colors\r\nlizard-green,1897,other green,green,,adjective,The external world > matter > colour > named colors\r\nmango,1991,other green,green,,adjective,The external world > matter > colour > named colors\r\ngreening,1590,becoming green,green,,adjective,The external world > matter > colour > named colors\r\nvirescent,1826,becoming green,green,,adjective,The external world > matter > colour > named colors\r\ngreenable,1871,becoming green,green,,adjective,The external world > matter > colour > named colors\r\nchlorophyllous,1863,green colouring matter,green,,adjective,The external world > matter > colour > named colors\r\nchlorophyllian,1880,green colouring matter,green,,adjective,The external world > matter > colour > named colors\r\nchlorophyllaceous,1882,green colouring matter,green,,adjective,The external world > matter > colour > named colors\r\naeruginous,1425,green colouring matter,green,,adjective,The external world > matter > colour > named colors\r\nverdigris,0,green colouring matter,green,,adjective,The external world > matter > colour > named colors\r\nviridian,1902,green colouring matter,green,,adjective,The external world > matter > colour > named colors\r\nyellow,700,yellow,yellow,,adjective,The external world > matter > colour > named colors\r\nblayk,1400,yellow,yellow,,adjective,The external world > matter > colour > named colors\r\njaune,1430,yellow,yellow,,adjective,The external world > matter > colour > named colors\r\nflaw,1450,yellow,yellow,,adjective,The external world > matter > colour > named colors\r\njaundiced,1640,yellow,yellow,,adjective,The external world > matter > colour > named colors\r\nflaxed,1652,yellow,yellow,,adjective,The external world > matter > colour > named colors\r\nflave,1657,yellow,yellow,,adjective,The external world > matter > colour > named colors\r\nflavous,1666,yellow,yellow,,adjective,The external world > matter > colour > named colors\r\nblake,1691,yellow,yellow,,adjective,The external world > matter > colour > named colors\r\ngambogian,1837,yellow,yellow,,adjective,The external world > matter > colour > named colors\r\nyellowish,1379,yellowish,yellow,,adjective,The external world > matter > colour > named colors\r\nsaffronish,1530,yellowish,yellow,,adjective,The external world > matter > colour > named colors\r\njaunish,1597,yellowish,yellow,,adjective,The external world > matter > colour > named colors\r\nsanded,1600,yellowish,yellow,,adjective,The external world > matter > colour > named colors\r\nsaffrony,1630,yellowish,yellow,,adjective,The external world > matter > colour > named colors\r\nyellowy,1667,yellowish,yellow,,adjective,The external world > matter > colour > named colors\r\nsallow,1747,yellowish,yellow,,adjective,The external world > matter > colour > named colors\r\nsallowish,1753,yellowish,yellow,,adjective,The external world > matter > colour > named colors\r\nsandy,1819,yellowish,yellow,,adjective,The external world > matter > colour > named colors\r\nflavescent,1853,yellowish,yellow,,adjective,The external world > matter > colour > named colors\r\nsandyish,1863,yellowish,yellow,,adjective,The external world > matter > colour > named colors\r\nflavicant,1871,yellowish,yellow,,adjective,The external world > matter > colour > named colors\r\nchromy,1883,yellowish,yellow,,adjective,The external world > matter > colour > named colors\r\nsunnish,1374,bright yellow,yellow,,adjective,The external world > matter > colour > named colors\r\nsunny,1600,bright yellow,yellow,,adjective,The external world > matter > colour > named colors\r\ncanary,1818,bright yellow,yellow,,adjective,The external world > matter > colour > named colors\r\nmarigold,1872,bright yellow,yellow,,adjective,The external world > matter > colour > named colors\r\nbuttercup,1875,bright yellow,yellow,,adjective,The external world > matter > colour > named colors\r\nnasturtium-yellow,1892,bright yellow,yellow,,adjective,The external world > matter > colour > named colors\r\nsunshine-yellow,1971,bright yellow,yellow,,adjective,The external world > matter > colour > named colors\r\ntopazine,1826,dark lustrous yellow,gold,,adjective,The external world > matter > colour > named colors\r\ntopaz-tinted,1845,dark lustrous yellow,gold,,adjective,The external world > matter > colour > named colors\r\ntopas-coloured,1902,dark lustrous yellow,gold,,adjective,The external world > matter > colour > named colors\r\npale yellow,0,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\ngull,1300,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\nflaxen,1523,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\npalew,1547,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\nstraw-coloured,1585,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\nbranlie,1589,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\nstraw colour,1589,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\nflaxy,1634,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\nfestucine,1646,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\nsulphureous,1656,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\nflaxenish,1661,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\nstrawy,1668,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\nstraw-yellow,1794,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\nbomycinous,1796,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\nsulphur-coloured,1811,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\nsherry-yellow,1813,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\nsulphur-yellow,1816,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\nbombasic,1825,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\nstraw,1842,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\nwax-coloured,1842,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\nstramineous,1845,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\nmaize-coloured,1852,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\ndaffodil,1855,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\ndaw,1856,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\nflax,1873,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\nsherry-coloured,1875,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\nmastic,1890,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\nsulpho-chromic,1895,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\nochroid,1897,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\nwheat-coloured,1898,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\nsulphurous,1899,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\nsulphury,1900,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\ntea-rose,1900,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\nstraw-pale,1922,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\nsubcitrine,1386,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\ncitrine,1398,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\ncitron-coloured,1574,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\nprimrose-coloured,1747,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\nlemon-coloured,1758,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\nprimrose,1788,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\nlemon-yellow,1807,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\ncitron-hued,1852,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\nlemon,1875,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\nprimrosy,1882,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\ncitron,1924,pale yellow,lightyellow,,adjective,The external world > matter > colour > named colors\r\ngolden,1300,golden yellow,gold,,adjective,The external world > matter > colour > named colors\r\ndory,1398,golden yellow,gold,,adjective,The external world > matter > colour > named colors\r\ngoldish,1398,golden yellow,gold,,adjective,The external world > matter > colour > named colors\r\ngoldly,1430,golden yellow,gold,,adjective,The external world > matter > colour > named colors\r\naureate,1450,golden yellow,gold,,adjective,The external world > matter > colour > named colors\r\ngoldy,1450,golden yellow,gold,,adjective,The external world > matter > colour > named colors\r\ngilden,1586,golden yellow,gold,,adjective,The external world > matter > colour > named colors\r\nscorn-gold,1586,golden yellow,gold,,adjective,The external world > matter > colour > named colors\r\nPactolian,1586,golden yellow,gold,,adjective,The external world > matter > colour > named colors\r\naureal,1587,golden yellow,gold,,adjective,The external world > matter > colour > named colors\r\ngold,1600,golden yellow,gold,,adjective,The external world > matter > colour > named colors\r\ngilded,1616,golden yellow,gold,,adjective,The external world > matter > colour > named colors\r\ngold-coloured,1687,golden yellow,gold,,adjective,The external world > matter > colour > named colors\r\nspun gold,1728,golden yellow,gold,,adjective,The external world > matter > colour > named colors\r\naurulent,1731,golden yellow,gold,,adjective,The external world > matter > colour > named colors\r\naurelian,1791,golden yellow,gold,,adjective,The external world > matter > colour > named colors\r\ndeaurated,1818,golden yellow,gold,,adjective,The external world > matter > colour > named colors\r\ntuscan,1830,golden yellow,gold,,adjective,The external world > matter > colour > named colors\r\ncorn-coloured,1854,golden yellow,gold,,adjective,The external world > matter > colour > named colors\r\naureoline,1881,golden yellow,gold,,adjective,The external world > matter > colour > named colors\r\ntuscan-coloured,1905,golden yellow,gold,,adjective,The external world > matter > colour > named colors\r\nguinea-gold,1938,golden yellow,gold,,adjective,The external world > matter > colour > named colors\r\nspun-golden,1978,golden yellow,gold,,adjective,The external world > matter > colour > named colors\r\nbrazen,1596,brassy yellow,gold,,adjective,The external world > matter > colour > named colors\r\nbrassy,1789,brassy yellow,gold,,adjective,The external world > matter > colour > named colors\r\naeneous,1847,brassy yellow,gold,,adjective,The external world > matter > colour > named colors\r\nbrass-coloured,1851,brassy yellow,gold,,adjective,The external world > matter > colour > named colors\r\nred-yellow,1578,reddish yellow,peachpuff,,adjective,The external world > matter > colour > named colors\r\nred-gold,1838,reddish yellow,peachpuff,,adjective,The external world > matter > colour > named colors\r\nsaffron-hued,1513,reddish yellow,peachpuff,,adjective,The external world > matter > colour > named colors\r\nsaffron-coloured,1548,reddish yellow,peachpuff,,adjective,The external world > matter > colour > named colors\r\nsaffron,1567,reddish yellow,peachpuff,,adjective,The external world > matter > colour > named colors\r\ncrocean,1629,reddish yellow,peachpuff,,adjective,The external world > matter > colour > named colors\r\ncroceal,1647,reddish yellow,peachpuff,,adjective,The external world > matter > colour > named colors\r\ncroceous,1657,reddish yellow,peachpuff,,adjective,The external world > matter > colour > named colors\r\ncroceate,1867,reddish yellow,peachpuff,,adjective,The external world > matter > colour > named colors\r\nsaffronic,1949,reddish yellow,peachpuff,,adjective,The external world > matter > colour > named colors\r\nfallow,0,reddish yellow,peachpuff,,adjective,The external world > matter > colour > named colors\r\nfavel,1490,reddish yellow,peachpuff,,adjective,The external world > matter > colour > named colors\r\nfulvid,1598,reddish yellow,peachpuff,,adjective,The external world > matter > colour > named colors\r\nfulve,1657,reddish yellow,peachpuff,,adjective,The external world > matter > colour > named colors\r\nfulvous,1664,reddish yellow,peachpuff,,adjective,The external world > matter > colour > named colors\r\nfallow-coloured,1688,reddish yellow,peachpuff,,adjective,The external world > matter > colour > named colors\r\nflavid,1762,reddish yellow,peachpuff,,adjective,The external world > matter > colour > named colors\r\nfox-coloured,1796,reddish yellow,peachpuff,,adjective,The external world > matter > colour > named colors\r\nfulvescent,1817,reddish yellow,peachpuff,,adjective,The external world > matter > colour > named colors\r\nmeline,1398,greenish yellow,khaki,,adjective,The external world > matter > colour > named colors\r\ngreenish yellow,0,greenish yellow,khaki,,adjective,The external world > matter > colour > named colors\r\ngangrenous,1794,greenish yellow,khaki,,adjective,The external world > matter > colour > named colors\r\ngreenery-yallery,1881,greenish yellow,khaki,,adjective,The external world > matter > colour > named colors\r\nochry,1567,brownish yellow,darkkhaki,,adjective,The external world > matter > colour > named colors\r\nolive-coloured,1612,brownish yellow,darkkhaki,,adjective,The external world > matter > colour > named colors\r\nsand-coloured,1627,brownish yellow,darkkhaki,,adjective,The external world > matter > colour > named colors\r\nshammy,1661,brownish yellow,darkkhaki,,adjective,The external world > matter > colour > named colors\r\nbuff-coloured,1686,brownish yellow,darkkhaki,,adjective,The external world > matter > colour > named colors\r\npea soup,1703,brownish yellow,darkkhaki,,adjective,The external world > matter > colour > named colors\r\nochreish,1747,brownish yellow,darkkhaki,,adjective,The external world > matter > colour > named colors\r\nochreous,1761,brownish yellow,darkkhaki,,adjective,The external world > matter > colour > named colors\r\nbuff,1765,brownish yellow,darkkhaki,,adjective,The external world > matter > colour > named colors\r\nochraceous,1776,brownish yellow,darkkhaki,,adjective,The external world > matter > colour > named colors\r\nbuff-colour,1796,brownish yellow,darkkhaki,,adjective,The external world > matter > colour > named colors\r\nbuffish,1802,brownish yellow,darkkhaki,,adjective,The external world > matter > colour > named colors\r\nmustard-coloured,1825,brownish yellow,darkkhaki,,adjective,The external world > matter > colour > named colors\r\nnankeen,1838,brownish yellow,darkkhaki,,adjective,The external world > matter > colour > named colors\r\nbuffy,1842,brownish yellow,darkkhaki,,adjective,The external world > matter > colour > named colors\r\nochre-coloured,1845,brownish yellow,darkkhaki,,adjective,The external world > matter > colour > named colors\r\nmustardy,1850,brownish yellow,darkkhaki,,adjective,The external world > matter > colour > named colors\r\nochrous,1877,brownish yellow,darkkhaki,,adjective,The external world > matter > colour > named colors\r\nbuff-yellow,1882,brownish yellow,darkkhaki,,adjective,The external world > matter > colour > named colors\r\nbuff-washed,1883,brownish yellow,darkkhaki,,adjective,The external world > matter > colour > named colors\r\nmustard,1919,brownish yellow,darkkhaki,,adjective,The external world > matter > colour > named colors\r\nSahara,1923,brownish yellow,darkkhaki,,adjective,The external world > matter > colour > named colors\r\nwheaten,1975,brownish yellow,darkkhaki,,adjective,The external world > matter > colour > named colors\r\npinkish yellow,0,pinkish yellow,papayawhip,,adjective,The external world > matter > colour > named colors\r\nchampagne,1903,pinkish yellow,papayawhip,,adjective,The external world > matter > colour > named colors\r\ngreyish-yellow,0,greyish yellow,darkkhaki,,adjective,The external world > matter > colour > named colors\r\nvitelline,1412,orange yellow,lightsalmon,,adjective,The external world > matter > colour > named colors\r\nluteous,1657,orange yellow,lightsalmon,,adjective,The external world > matter > colour > named colors\r\norange-yellow,1662,orange yellow,lightsalmon,,adjective,The external world > matter > colour > named colors\r\norange-buff,1844,orange yellow,lightsalmon,,adjective,The external world > matter > colour > named colors\r\nhoney-yellow,1615,other yellows,yellow,,adjective,The external world > matter > colour > named colors\r\ngamboge,1819,other yellows,yellow,,adjective,The external world > matter > colour > named colors\r\nhoney-gold,1849,other yellows,yellow,,adjective,The external world > matter > colour > named colors\r\nlily-yellow,1865,other yellows,yellow,,adjective,The external world > matter > colour > named colors\r\napple-yellow,1884,other yellows,yellow,,adjective,The external world > matter > colour > named colors\r\nbutter-coloured,1894,other yellows,yellow,,adjective,The external world > matter > colour > named colors\r\nmimosa,1928,other yellows,yellow,,adjective,The external world > matter > colour > named colors\r\nyellowing,1757,becoming yellow,yellow,,adjective,The external world > matter > colour > named colors\r\nsaffroned,1303,becoming yellow,yellow,,adjective,The external world > matter > colour > named colors\r\nsaffred,1466,becoming yellow,yellow,,adjective,The external world > matter > colour > named colors\r\nyellowed,1824,becoming yellow,yellow,,adjective,The external world > matter > colour > named colors\r\nxanthophyllic,1941,colouring matter,yellow,,adjective,The external world > matter > colour > named colors\r\nTurner,1835,colouring matter,yellow,,adjective,The external world > matter > colour > named colors\r\nblue,1300,blue,blue,,adjective,The external world > matter > colour > named colors\r\ninde,1359,blue,blue,,adjective,The external world > matter > colour > named colors\r\nblae,1400,blue,blue,,adjective,The external world > matter > colour > named colors\r\nglawke,1412,blue,blue,,adjective,The external world > matter > colour > named colors\r\nazure,1450,blue,blue,,adjective,The external world > matter > colour > named colors\r\nblusih,1398,bluish,blue,,adjective,The external world > matter > colour > named colors\r\nazury,1600,bluish,blue,,adjective,The external world > matter > colour > named colors\r\nbluey,1727,bluish,blue,,adjective,The external world > matter > colour > named colors\r\nblue-bleak,1877,bluish,blue,,adjective,The external world > matter > colour > named colors\r\nbright blue,0,bright blue,aqua,,adjective,The external world > matter > colour > named colors\r\nsapphirine,1413,bright blue,aqua,,adjective,The external world > matter > colour > named colors\r\nsapphire,1433,bright blue,aqua,,adjective,The external world > matter > colour > named colors\r\nsapphire-hued,1446,bright blue,aqua,,adjective,The external world > matter > colour > named colors\r\nsapphire-coloured,1586,bright blue,aqua,,adjective,The external world > matter > colour > named colors\r\nsapphiric,1605,bright blue,aqua,,adjective,The external world > matter > colour > named colors\r\nsapphire-blue,1782,bright blue,aqua,,adjective,The external world > matter > colour > named colors\r\nelectric blue,1877,bright blue,aqua,,adjective,The external world > matter > colour > named colors\r\npirate blue,1896,bright blue,aqua,,adjective,The external world > matter > colour > named colors\r\nblue-brilliant,1923,bright blue,aqua,,adjective,The external world > matter > colour > named colors\r\ndeep blue,0,deep blue,darkblue,,adjective,The external world > matter > colour > named colors\r\nflaxen,1605,deep blue,,,adjective,The external world > matter > colour > named colors\r\nmazarine,1684,deep blue,,,adjective,The external world > matter > colour > named colors\r\ncyaneous,1688,deep blue,,,adjective,The external world > matter > colour > named colors\r\nultramarine,1781,deep blue,,,adjective,The external world > matter > colour > named colors\r\npoweder blue,1781,deep blue,,,adjective,The external world > matter > colour > named colors\r\nsmalt-blue,1801,deep blue,,,adjective,The external world > matter > colour > named colors\r\ncobalt,1849,deep blue,,,adjective,The external world > matter > colour > named colors\r\nnight-blue,1858,deep blue,,,adjective,The external world > matter > colour > named colors\r\nlazuline,1877,deep blue,,,adjective,The external world > matter > colour > named colors\r\nsmalt,1880,deep blue,,,adjective,The external world > matter > colour > named colors\r\ngentian,1908,deep blue,,,adjective,The external world > matter > colour > named colors\r\ndark blue,0,dark blue,darkblue,,adjective,The external world > matter > colour > named colors\r\nblewebis,1330,dark blue,darkblue,,adjective,The external world > matter > colour > named colors\r\nsloe-blue,1795,dark blue,darkblue,,adjective,The external world > matter > colour > named colors\r\nOxford blue,1856,dark blue,darkblue,,adjective,The external world > matter > colour > named colors\r\ncoal blue,1861,dark blue,darkblue,,adjective,The external world > matter > colour > named colors\r\nlead-blue,1882,dark blue,darkblue,,adjective,The external world > matter > colour > named colors\r\nnavy,1896,dark blue,darkblue,,adjective,The external world > matter > colour > named colors\r\nlight blue,0,light blue,lightblue,,adjective,The external world > matter > colour > named colors\r\nwatchet,1400,light blue,lightblue,,adjective,The external world > matter > colour > named colors\r\nazurine,1577,light blue,lightblue,,adjective,The external world > matter > colour > named colors\r\nwatchet-coloured,1609,light blue,lightblue,,adjective,The external world > matter > colour > named colors\r\nwatercoloured,1660,light blue,lightblue,,adjective,The external world > matter > colour > named colors\r\npowder blue,1789,light blue,lightblue,,adjective,The external world > matter > colour > named colors\r\nEton blue,1851,light blue,lightblue,,adjective,The external world > matter > colour > named colors\r\nopal blue,1856,light blue,lightblue,,adjective,The external world > matter > colour > named colors\r\nwatchet-hued,1895,light blue,lightblue,,adjective,The external world > matter > colour > named colors\r\nsky blue,1703,sky blue,skyblue,http://fox41blogs.typepad.com/.a/6a0148c78b79ee970c017d411f6990970c-500wi,adjective,The external world > matter > colour > named colors\r\nazured,1490,sky blue,skyblue,http://fox41blogs.typepad.com/.a/6a0148c78b79ee970c017d411f6990970c-500wi,adjective,The external world > matter > colour > named colors\r\nazure,1513,sky blue,skyblue,http://fox41blogs.typepad.com/.a/6a0148c78b79ee970c017d411f6990970c-500wi,adjective,The external world > matter > colour > named colors\r\nsky colour,1552,sky blue,skyblue,http://fox41blogs.typepad.com/.a/6a0148c78b79ee970c017d411f6990970c-500wi,adjective,The external world > matter > colour > named colors\r\nsky-coloured,1567,sky blue,skyblue,http://fox41blogs.typepad.com/.a/6a0148c78b79ee970c017d411f6990970c-500wi,adjective,The external world > matter > colour > named colors\r\nceruleous,1575,sky blue,skyblue,http://fox41blogs.typepad.com/.a/6a0148c78b79ee970c017d411f6990970c-500wi,adjective,The external world > matter > colour > named colors\r\ncerule,1591,sky blue,skyblue,http://fox41blogs.typepad.com/.a/6a0148c78b79ee970c017d411f6990970c-500wi,adjective,The external world > matter > colour > named colors\r\nsky-like,1594,sky blue,skyblue,http://fox41blogs.typepad.com/.a/6a0148c78b79ee970c017d411f6990970c-500wi,adjective,The external world > matter > colour > named colors\r\nceruleal,1634,sky blue,skyblue,http://fox41blogs.typepad.com/.a/6a0148c78b79ee970c017d411f6990970c-500wi,adjective,The external world > matter > colour > named colors\r\nazurne,1637,sky blue,skyblue,http://fox41blogs.typepad.com/.a/6a0148c78b79ee970c017d411f6990970c-500wi,adjective,The external world > matter > colour > named colors\r\ncerulous,1651,sky blue,skyblue,http://fox41blogs.typepad.com/.a/6a0148c78b79ee970c017d411f6990970c-500wi,adjective,The external world > matter > colour > named colors\r\nlazure,1671,sky blue,skyblue,http://fox41blogs.typepad.com/.a/6a0148c78b79ee970c017d411f6990970c-500wi,adjective,The external world > matter > colour > named colors\r\ncerulean,1677,sky blue,skyblue,http://fox41blogs.typepad.com/.a/6a0148c78b79ee970c017d411f6990970c-500wi,adjective,The external world > matter > colour > named colors\r\nskyey,1778,sky blue,skyblue,http://fox41blogs.typepad.com/.a/6a0148c78b79ee970c017d411f6990970c-500wi,adjective,The external world > matter > colour > named colors\r\nazure-blue,1859,sky blue,skyblue,http://fox41blogs.typepad.com/.a/6a0148c78b79ee970c017d411f6990970c-500wi,adjective,The external world > matter > colour > named colors\r\ncerulescent,1880,sky blue,skyblue,http://fox41blogs.typepad.com/.a/6a0148c78b79ee970c017d411f6990970c-500wi,adjective,The external world > matter > colour > named colors\r\nazurean,1882,sky blue,skyblue,http://fox41blogs.typepad.com/.a/6a0148c78b79ee970c017d411f6990970c-500wi,adjective,The external world > matter > colour > named colors\r\nturquoise,1573,greenish blue,turquoise,,adjective,The external world > matter > colour > named colors\r\npavonaceous,1688,greenish blue,turquoise,,adjective,The external world > matter > colour > named colors\r\naquamarine,1846,greenish blue,turquoise,,adjective,The external world > matter > colour > named colors\r\nverditer,1857,greenish blue,turquoise,,adjective,The external world > matter > colour > named colors\r\npeacock,1873,greenish blue,turquoise,,adjective,The external world > matter > colour > named colors\r\ngreenish blue,0,greenish blue,turquoise,,adjective,The external world > matter > colour > named colors\r\ngreyish blue,0,greyish blue,cadetblue,,adjective,The external world > matter > colour > named colors\r\nplunket,1415,greyish blue,cadetblue,,adjective,The external world > matter > colour > named colors\r\nperse,1425,greyish blue,cadetblue,,adjective,The external world > matter > colour > named colors\r\ngrey-blue,1741,greyish blue,cadetblue,,adjective,The external world > matter > colour > named colors\r\niron blue,1758,greyish blue,cadetblue,,adjective,The external world > matter > colour > named colors\r\nsmoke-blue,1807,greyish blue,cadetblue,,adjective,The external world > matter > colour > named colors\r\ngunpowder,1817,greyish blue,cadetblue,,adjective,The external world > matter > colour > named colors\r\nslaty-blue,1854,greyish blue,cadetblue,,adjective,The external world > matter > colour > named colors\r\nSilurian,1892,greyish blue,cadetblue,,adjective,The external world > matter > colour > named colors\r\npurplish-blue,0,purplish blue,mediumslateblue,,adjective,The external world > matter > colour > named colors\r\nhyacinthine,1656,purplish blue,mediumslateblue,,adjective,The external world > matter > colour > named colors\r\nviolaceous,1657,purplish blue,mediumslateblue,,adjective,The external world > matter > colour > named colors\r\nviolacean,1711,purplish blue,mediumslateblue,,adjective,The external world > matter > colour > named colors\r\nlilac-blue,1851,purplish blue,mediumslateblue,,adjective,The external world > matter > colour > named colors\r\nhyacinthian,1858,purplish blue,mediumslateblue,,adjective,The external world > matter > colour > named colors\r\nhyacinth,1876,purplish blue,mediumslateblue,,adjective,The external world > matter > colour > named colors\r\nlavender,1882,purplish blue,mediumslateblue,,adjective,The external world > matter > colour > named colors\r\nviolet blue,1882,purplish blue,mediumslateblue,,adjective,The external world > matter > colour > named colors\r\nindigo-blue,1832,indigo blue,midnightblue,https://static1.squarespace.com/static/538d3109e4b0f6391fd9ca16/t/539a43b7e4b0c09f2ad2c586/1402618868669/SeaIslandIndigo_workshops2.jpg?format=1500w,adjective,The external world > matter > colour > named colors\r\nindigo,1856,indigo blue,mediumblue,https://static1.squarespace.com/static/538d3109e4b0f6391fd9ca16/t/539a43b7e4b0c09f2ad2c586/1402618868669/SeaIslandIndigo_workshops2.jpg?format=1500w,adjective,The external world > matter > colour > named colors\r\nmetallic,0,metallic blue,steelblue,,adjective,The external world > matter > colour > named colors\r\nsteel-blue,1560,metallic blue,steelblue,,adjective,The external world > matter > colour > named colors\r\nchalybeous,1826,metallic blue,steelblue,,adjective,The external world > matter > colour > named colors\r\nwan,700,livid,dodgerblue,,adjective,The external world > matter > colour > named colors\r\nblae,1325,livid,dodgerblue,,adjective,The external world > matter > colour > named colors\r\nblo,1325,livid,dodgerblue,,adjective,The external world > matter > colour > named colors\r\nhaw,1420,livid,dodgerblue,,adjective,The external world > matter > colour > named colors\r\nlivid,1425,livid,dodgerblue,,adjective,The external world > matter > colour > named colors\r\nlividous,1598,livid,dodgerblue,,adjective,The external world > matter > colour > named colors\r\nblue in the face,1792,livid,dodgerblue,,adjective,The external world > matter > colour > named colors\r\nswart,1400,colour of plagues,mediumblue,,adjective,The external world > matter > colour > named colors\r\nmourning,1709,other blues,blue,,adjective,The external world > matter > colour > named colors\r\nPrussian blue,1753,other blues,blue,,adjective,The external world > matter > colour > named colors\r\nwater blue,1851,other blues,blue,,adjective,The external world > matter > colour > named colors\r\nberyl-blue,1881,other blues,blue,,adjective,The external world > matter > colour > named colors\r\nWedgwood,1900,other blues,blue,,adjective,The external world > matter > colour > named colors\r\nscale-blue,1906,other blues,blue,,adjective,The external world > matter > colour > named colors\r\nwhale-blue,1946,other blues,blue,,adjective,The external world > matter > colour > named colors\r\nazured,1562,made blue,blue,,adjective,The external world > matter > colour > named colors\r\nceruleated,1634,made blue,blue,,adjective,The external world > matter > colour > named colors\r\nsapphired,1820,made blue,blue,,adjective,The external world > matter > colour > named colors\r\nblue-washed,1906,made blue,blue,,adjective,The external world > matter > colour > named colors\r\ncerulific,1701,made blue,blue,,adjective,The external world > matter > colour > named colors\r\nultramarinish,1667,blue colouring matter,blue,,adjective,The external world > matter > colour > named colors\r\nindigotic,1838,blue colouring matter,blue,,adjective,The external world > matter > colour > named colors\r\nbrown,1393,brown,brown,,adjective,The external world > matter > colour > named colors\r\nbrown-coloured,1835,brown,brown,,adjective,The external world > matter > colour > named colors\r\nbrownish,1555,brownish,brown,,adjective,The external world > matter > colour > named colors\r\nbrowny,1582,brownish,brown,,adjective,The external world > matter > colour > named colors\r\nbrownish-coloured,1685,brownish,brown,,adjective,The external world > matter > colour > named colors\r\nburnet,1200,dark brown,sienna,,adjective,The external world > matter > colour > named colors\r\nfusk,1599,dark brown,sienna,,adjective,The external world > matter > colour > named colors\r\nfusky,1610,dark brown,sienna,,adjective,The external world > matter > colour > named colors\r\nchocolate-coloured,1736,dark brown,sienna,,adjective,The external world > matter > colour > named colors\r\nbrunneous,1815,dark brown,sienna,,adjective,The external world > matter > colour > named colors\r\nchocolate,1819,dark brown,sienna,,adjective,The external world > matter > colour > named colors\r\nustulate,1826,dark brown,sienna,,adjective,The external world > matter > colour > named colors\r\nscorched,1832,dark brown,sienna,,adjective,The external world > matter > colour > named colors\r\nfuscescent,1881,dark brown,sienna,,adjective,The external world > matter > colour > named colors\r\nforest-brown,1892,dark brown,sienna,,adjective,The external world > matter > colour > named colors\r\nburnt-coloured,1896,dark brown,sienna,,adjective,The external world > matter > colour > named colors\r\nJacobean,1918,dark brown,sienna,,adjective,The external world > matter > colour > named colors\r\nlight brown,0,light brown,burlywood,,adjective,The external world > matter > colour > named colors\r\nparchment,1597,light brown,burlywood,,adjective,The external world > matter > colour > named colors\r\nwhited brown,1650,light brown,burlywood,,adjective,The external world > matter > colour > named colors\r\nwhitey-brown,1656,light brown,burlywood,,adjective,The external world > matter > colour > named colors\r\ncoffee-coloured,1695,light brown,burlywood,,adjective,The external world > matter > colour > named colors\r\ndust-coloured,1800,light brown,burlywood,,adjective,The external world > matter > colour > named colors\r\nochre-brown,1853,light brown,burlywood,,adjective,The external world > matter > colour > named colors\r\nblonde,1866,light brown,burlywood,,adjective,The external world > matter > colour > named colors\r\nmousy,1888,light brown,burlywood,,adjective,The external world > matter > colour > named colors\r\ntoast-coloured,1898,light brown,burlywood,,adjective,The external world > matter > colour > named colors\r\ndull brown,0,dull brown,peru,,adjective,The external world > matter > colour > named colors\r\ndun,953,dull brown,peru,,adjective,The external world > matter > colour > named colors\r\ndunned,1440,dull brown,peru,,adjective,The external world > matter > colour > named colors\r\ndunny,1529,dull brown,peru,,adjective,The external world > matter > colour > named colors\r\ndunnish,1551,dull brown,peru,,adjective,The external world > matter > colour > named colors\r\ndrab-coloured,1715,dull brown,peru,,adjective,The external world > matter > colour > named colors\r\ndrab,1775,dull brown,peru,,adjective,The external world > matter > colour > named colors\r\nrusset,1428,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nreddish-brown,1530,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nsorrel,1534,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nberry-brown,1575,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nsored,1587,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nrussetish,1600,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nChelidonian,1601,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nweaselled-coloured,1607,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\ndeer-coloured,1611,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nspadiceous,1646,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nrusseted,1654,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\ntestaceous,1688,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nrussety,1697,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nmahogany,1744,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nred-brown,1786,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nreddy-brown,1845,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nfusco-testaceous,1847,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nmahogany-brown,1881,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\npersimmon,1897,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nnut-brown,1400,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nhazel,1597,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nchestnut-coloured,1636,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nhazeled,1651,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nchestnut,1656,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nchestnut-brown,1656,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\ncastaneous,1688,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nnutty brown,1839,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nchestnutty,1893,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nnutmeg,1965,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nliver-hued,1616,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nliver-coloured,1654,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nliver,1802,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nbeveren,1400,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nbeaver-hued,1400,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nbeaver-coloured,1895,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nmusk colour,1631,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nmusk-coloured,1684,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\ncopper-coloured,1697,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\ncopper,1699,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\ncopperish,1774,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\ncoppery,1791,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\ncupreous,1804,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\ncopper-brown,1842,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nbayard,1330,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nbay,1374,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nbayed,1440,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nbay-coloured,1591,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nbullace-bay,1690,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nbayish,1697,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nbay-brown,1852,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nbrown-bay,0,reddish brown,firebrick,,adjective,The external world > matter > colour > named colors\r\nhoney-coloured,1603,yellowish brown,goldenrod,,adjective,The external world > matter > colour > named colors\r\ncinnamon-coloured,1679,yellowish brown,goldenrod,,adjective,The external world > matter > colour > named colors\r\ncinnamon,1685,yellowish brown,goldenrod,,adjective,The external world > matter > colour > named colors\r\nlurid,1767,yellowish brown,goldenrod,,adjective,The external world > matter > colour > named colors\r\nrhubarb,1792,yellowish brown,goldenrod,,adjective,The external world > matter > colour > named colors\r\ntomabac-brown,1794,yellowish brown,goldenrod,,adjective,The external world > matter > colour > named colors\r\nsherry-bay,1856,yellowish brown,goldenrod,,adjective,The external world > matter > colour > named colors\r\nkhaki,1863,yellowish brown,goldenrod,,adjective,The external world > matter > colour > named colors\r\nkhaki coloured,1879,yellowish brown,goldenrod,,adjective,The external world > matter > colour > named colors\r\nrhubarby,1885,yellowish brown,goldenrod,,adjective,The external world > matter > colour > named colors\r\ncrotal,1901,yellowish brown,goldenrod,,adjective,The external world > matter > colour > named colors\r\nbrown-gold,1909,yellowish brown,goldenrod,,adjective,The external world > matter > colour > named colors\r\nSahara,1923,yellowish brown,goldenrod,,adjective,The external world > matter > colour > named colors\r\nsafari,1934,yellowish brown,goldenrod,,adjective,The external world > matter > colour > named colors\r\norange-brown,1775,orange brown,sandybrown,,adjective,The external world > matter > colour > named colors\r\nmud-coloured,1772,greyish brown,dimgrey,,adjective,The external world > matter > colour > named colors\r\nsmoke-brown,1807,greyish brown,dimgrey,,adjective,The external world > matter > colour > named colors\r\nmud colour,1818,greyish brown,dimgrey,,adjective,The external world > matter > colour > named colors\r\nlead-brown,1897,greyish brown,dimgrey,,adjective,The external world > matter > colour > named colors\r\nbluish-brown,1792,bluish-brown,rosybrown,,adjective,The external world > matter > colour > named colors\r\ndamson brown,1661,purplish brown,rosybrown,,adjective,The external world > matter > colour > named colors\r\nlavender-brown,1813,purplish brown,rosybrown,,adjective,The external world > matter > colour > named colors\r\nbronze,1828,bronze,darkgoldenrod,https://c1.staticflickr.com/7/6197/6127537096_630787a494_b.jpg,adjective,The external world > matter > colour > named colors\r\nbronzine,1853,bronze,darkgoldenrod,https://c1.staticflickr.com/7/6197/6127537096_630787a494_b.jpg,adjective,The external world > matter > colour > named colors\r\nbronzy,1863,bronze,darkgoldenrod,https://c1.staticflickr.com/7/6197/6127537096_630787a494_b.jpg,adjective,The external world > matter > colour > named colors\r\nbronze-golden,1882,bronze,darkgoldenrod,https://c1.staticflickr.com/7/6197/6127537096_630787a494_b.jpg,adjective,The external world > matter > colour > named colors\r\nwainscot,1577,other browns,brown,,adjective,The external world > matter > colour > named colors\r\nturd-coloured,1704,other browns,brown,,adjective,The external world > matter > colour > named colors\r\nhoney-brown,1774,other browns,brown,,adjective,The external world > matter > colour > named colors\r\nsnuff-coloured,1787,other browns,brown,,adjective,The external world > matter > colour > named colors\r\nsnuffy,1789,other browns,brown,,adjective,The external world > matter > colour > named colors\r\nmoorit,1795,other browns,brown,,adjective,The external world > matter > colour > named colors\r\number,1802,other browns,brown,,adjective,The external world > matter > colour > named colors\r\numbery,1850,other browns,brown,,adjective,The external world > matter > colour > named colors\r\nsienna-brown,1853,other browns,brown,,adjective,The external world > matter > colour > named colors\r\noily-brown,1861,other browns,brown,,adjective,The external world > matter > colour > named colors\r\nseal-brown,1881,other browns,brown,,adjective,The external world > matter > colour > named colors\r\ntabac,1881,other browns,brown,,adjective,The external world > matter > colour > named colors\r\nglandaceous,1885,other browns,brown,,adjective,The external world > matter > colour > named colors\r\ncigar-brown,1895,other browns,brown,,adjective,The external world > matter > colour > named colors\r\nbead-brown,1912,other browns,brown,,adjective,The external world > matter > colour > named colors\r\ncocoa,1942,other browns,brown,,adjective,The external world > matter > colour > named colors\r\ntoffee-brown,1961,other browns,brown,,adjective,The external world > matter > colour > named colors\r\ntoffee,1962,other browns,brown,,adjective,The external world > matter > colour > named colors\r\nsludgy,1975,other browns,brown,,adjective,The external world > matter > colour > named colors\r\nbrowning,1595,becoming brown,brown,,adjective,The external world > matter > colour > named colors\r\nembrowning,1863,becoming brown,brown,,adjective,The external world > matter > colour > named colors\r\numbered,1616,becoming brown,brown,,adjective,The external world > matter > colour > named colors\r\nwell-browned,1723,becoming brown,brown,,adjective,The external world > matter > colour > named colors\r\nembrowned,1739,becoming brown,brown,,adjective,The external world > matter > colour > named colors\r\nbrowned,1871,becoming brown,brown,,adjective,The external world > matter > colour > named colors\r\nadusted,1550,becoming brown,brown,,adjective,The external world > matter > colour > named colors\r\nsunburnt,1893,becoming brown,brown,,adjective,The external world > matter > colour > named colors\r\nstaneraw,1820,becoming brown,brown,,adjective,The external world > matter > colour > named colors\r\nbistred,1876,becoming brown,brown,,adjective,The external world > matter > colour > named colors\r\nrusseting,1874,becoming brown,brown,,adjective,The external world > matter > colour > named colors\r\nbronzing,1880,becoming brown,brown,,adjective,The external world > matter > colour > named colors\r\nbronzed,1748,becoming brown,brown,,adjective,The external world > matter > colour > named colors\r\ngrey,0,grey,grey,,adjective,The external world > matter > colour > named colors\r\ngris,1386,grey,grey,,adjective,The external world > matter > colour > named colors\r\ngrizzle,1425,grey,grey,,adjective,The external world > matter > colour > named colors\r\ngrison,1438,grey,grey,,adjective,The external world > matter > colour > named colors\r\nkennet-colour,1530,grey,grey,,adjective,The external world > matter > colour > named colors\r\ngrisy,1590,grey,grey,,adjective,The external world > matter > colour > named colors\r\ngrizzly,1594,grey,grey,,adjective,The external world > matter > colour > named colors\r\ngrisard,1607,grey,grey,,adjective,The external world > matter > colour > named colors\r\ngrysande,1400,greyish,grey,,adjective,The external world > matter > colour > named colors\r\ngreyish,1562,greyish,grey,,adjective,The external world > matter > colour > named colors\r\ngrizzlish,1680,greyish,grey,,adjective,The external world > matter > colour > named colors\r\nslaty,1822,greyish,grey,,adjective,The external world > matter > colour > named colors\r\npeppery,1962,greyish,grey,,adjective,The external world > matter > colour > named colors\r\nsabelline,1888,dark grey,darkgrey,,adjective,The external world > matter > colour > named colors\r\nshadow-grey,1918,dark grey,darkgrey,,adjective,The external world > matter > colour > named colors\r\nwalnyed,1440,light grey,lightgrey,,adjective,The external world > matter > colour > named colors\r\ncanvas,1486,light grey,lightgrey,,adjective,The external world > matter > colour > named colors\r\nhoar,0,hoary,gainsboro,,adjective,The external world > matter > colour > named colors\r\nfor-hoar,1366,hoary,gainsboro,,adjective,The external world > matter > colour > named colors\r\nhoarsih,1398,hoary,gainsboro,,adjective,The external world > matter > colour > named colors\r\nhoary,1573,hoary,gainsboro,,adjective,The external world > matter > colour > named colors\r\nincanescent,1866,hoary,gainsboro,,adjective,The external world > matter > colour > named colors\r\ncrane,1517,ashy grey,dimgrey,https://goo.gl/uFdH1t,adjective,The external world > matter > colour > named colors\r\ncrane-coloured,1549,ashy grey,dimgrey,https://goo.gl/uFdH1t,adjective,The external world > matter > colour > named colors\r\ncrane-feather,1557,ashy grey,dimgrey,https://goo.gl/uFdH1t,adjective,The external world > matter > colour > named colors\r\nash-colour,1586,ashy grey,dimgrey,https://goo.gl/uFdH1t,adjective,The external world > matter > colour > named colors\r\nsubcineritious,1657,ashy grey,dimgrey,https://goo.gl/uFdH1t,adjective,The external world > matter > colour > named colors\r\ncinereous,1661,ashy grey,dimgrey,https://goo.gl/uFdH1t,adjective,The external world > matter > colour > named colors\r\ncinereal,1878,ashy grey,dimgrey,https://goo.gl/uFdH1t,adjective,The external world > matter > colour > named colors\r\nsmoky,1555,smoky grey,whitesmoke,https://goo.gl/vEd8n0,adjective,The external world > matter > colour > named colors\r\nsmoked,1827,smoky grey,whitesmoke,https://goo.gl/vEd8n0,adjective,The external world > matter > colour > named colors\r\nsmoke,1872,smoky grey,whitesmoke,https://goo.gl/vEd8n0,adjective,The external world > matter > colour > named colors\r\niron-grey,0,iron or steel grey,lightslategrey,http://www.hannibalservices.com/productos/minerales.jpg,adjective,The external world > matter > colour > named colors\r\niron,1398,iron or steel grey,lightslategrey,http://www.hannibalservices.com/productos/minerales.jpg,adjective,The external world > matter > colour > named colors\r\nsteel-grey,1560,iron or steel grey,lightslategrey,http://www.hannibalservices.com/productos/minerales.jpg,adjective,The external world > matter > colour > named colors\r\nsteely,1596,iron or steel grey,lightslategrey,http://www.hannibalservices.com/productos/minerales.jpg,adjective,The external world > matter > colour > named colors\r\nsteel,1851,iron or steel grey,lightslategrey,http://www.hannibalservices.com/productos/minerales.jpg,adjective,The external world > matter > colour > named colors\r\nleaden,1386,lead grey,slategrey,http://www.gravitatechnomech.com/images/Lead.jpg,adjective,The external world > matter > colour > named colors\r\nleasih,1398,lead grey,slategrey,http://www.gravitatechnomech.com/images/Lead.jpg,adjective,The external world > matter > colour > named colors\r\nleady,1398,lead grey,slategrey,http://www.gravitatechnomech.com/images/Lead.jpg,adjective,The external world > matter > colour > named colors\r\nwan,1398,lead grey,slategrey,http://www.gravitatechnomech.com/images/Lead.jpg,adjective,The external world > matter > colour > named colors\r\nplumby,1486,lead grey,slategrey,http://www.gravitatechnomech.com/images/Lead.jpg,adjective,The external world > matter > colour > named colors\r\nplumbine,1597,lead grey,slategrey,http://www.gravitatechnomech.com/images/Lead.jpg,adjective,The external world > matter > colour > named colors\r\nleaden-coloured,1598,lead grey,slategrey,http://www.gravitatechnomech.com/images/Lead.jpg,adjective,The external world > matter > colour > named colors\r\nlead-coloured,1611,lead grey,slategrey,http://www.gravitatechnomech.com/images/Lead.jpg,adjective,The external world > matter > colour > named colors\r\nplumbean,1656,lead grey,slategrey,http://www.gravitatechnomech.com/images/Lead.jpg,adjective,The external world > matter > colour > named colors\r\nplumbeous,1658,lead grey,slategrey,http://www.gravitatechnomech.com/images/Lead.jpg,adjective,The external world > matter > colour > named colors\r\nlead-grey,1837,lead grey,slategrey,http://www.gravitatechnomech.com/images/Lead.jpg,adjective,The external world > matter > colour > named colors\r\nleaden-hued,1877,lead grey,slategrey,http://www.gravitatechnomech.com/images/Lead.jpg,adjective,The external world > matter > colour > named colors\r\nQuaker-coloured,1757,drab or dingy grey,dimgrey,,adjective,The external world > matter > colour > named colors\r\nprison-grey,1882,drab or dingy grey,dimgrey,,adjective,The external world > matter > colour > named colors\r\nflinty,1642,flint grey,dimgrey,http://vgawesomerocks.weebly.com/uploads/1/6/5/8/16581868/6837395.jpg,adjective,The external world > matter > colour > named colors\r\npearl-coloured,1604,pearl grey,seashell,https://goo.gl/x3K7rK,adjective,The external world > matter > colour > named colors\r\npearl shell,1614,pearl grey,seashell,https://goo.gl/x3K7rK,adjective,The external world > matter > colour > named colors\r\npearl,1688,pearl grey,seashell,https://goo.gl/x3K7rK,adjective,The external world > matter > colour > named colors\r\npearled,1699,pearl grey,seashell,https://goo.gl/x3K7rK,adjective,The external world > matter > colour > named colors\r\npearly,1790,pearl grey,seashell,https://goo.gl/x3K7rK,adjective,The external world > matter > colour > named colors\r\npearl-hued,1843,pearl grey,seashell,https://goo.gl/x3K7rK,adjective,The external world > matter > colour > named colors\r\npearlish,1885,pearl grey,seashell,https://goo.gl/x3K7rK,adjective,The external world > matter > colour > named colors\r\npewter,1887,silvery grey,silver,,adjective,The external world > matter > colour > named colors\r\nmouse-coloured,1605,yellowish grey,darkkhaki,,adjective,The external world > matter > colour > named colors\r\nmouse-colour,1607,yellowish grey,darkkhaki,,adjective,The external world > matter > colour > named colors\r\nmouse-dun,1686,yellowish grey,darkkhaki,,adjective,The external world > matter > colour > named colors\r\nputty-coloured,1820,yellowish grey,darkkhaki,,adjective,The external world > matter > colour > named colors\r\nbeige,1879,yellowish grey,darkkhaki,,adjective,The external world > matter > colour > named colors\r\nbeige-coloured,1879,yellowish grey,darkkhaki,,adjective,The external world > matter > colour > named colors\r\ngreige,1927,yellowish grey,darkkhaki,,adjective,The external world > matter > colour > named colors\r\nbice,1330,brownish grey,dimgrey,,adjective,The external world > matter > colour > named colors\r\nbutter-nut,1772,brownish grey,dimgrey,,adjective,The external world > matter > colour > named colors\r\nstone-coloured,1772,brownish grey,dimgrey,,adjective,The external world > matter > colour > named colors\r\nstone,1848,brownish grey,dimgrey,,adjective,The external world > matter > colour > named colors\r\nficelle-coloured,1882,brownish grey,dimgrey,,adjective,The external world > matter > colour > named colors\r\noatmeal,1885,brownish grey,dimgrey,,adjective,The external world > matter > colour > named colors\r\nmoleskin-coloured,1903,brownish grey,dimgrey,,adjective,The external world > matter > colour > named colors\r\nbrowny-grey,1905,brownish grey,dimgrey,,adjective,The external world > matter > colour > named colors\r\nmole-grey,1906,brownish grey,dimgrey,,adjective,The external world > matter > colour > named colors\r\nmole,1908,brownish grey,dimgrey,,adjective,The external world > matter > colour > named colors\r\nstony,1910,brownish grey,dimgrey,,adjective,The external world > matter > colour > named colors\r\ntaupe,1911,brownish grey,dimgrey,,adjective,The external world > matter > colour > named colors\r\nglawke,1412,bluish grey,cadetblue,,adjective,The external world > matter > colour > named colors\r\nwaterish,1425,bluish grey,cadetblue,,adjective,The external world > matter > colour > named colors\r\nblunket,1488,bluish grey,cadetblue,,adjective,The external world > matter > colour > named colors\r\nbluish-grey,1578,bluish grey,cadetblue,,adjective,The external world > matter > colour > named colors\r\nblue-grey,1590,bluish grey,cadetblue,,adjective,The external world > matter > colour > named colors\r\nwater,1592,bluish grey,cadetblue,,adjective,The external world > matter > colour > named colors\r\nslate-grey,1794,bluish grey,cadetblue,,adjective,The external world > matter > colour > named colors\r\nslate-coloured,1801,bluish grey,cadetblue,,adjective,The external world > matter > colour > named colors\r\ngriseous,1819,bluish grey,cadetblue,,adjective,The external world > matter > colour > named colors\r\nneutral,1821,bluish grey,cadetblue,,adjective,The external world > matter > colour > named colors\r\nslaty,1822,bluish grey,cadetblue,,adjective,The external world > matter > colour > named colors\r\nschistous,1858,bluish grey,cadetblue,,adjective,The external world > matter > colour > named colors\r\nslatish,1860,bluish grey,cadetblue,,adjective,The external world > matter > colour > named colors\r\ncomumbine,1420,pinkish or purplish grey,lavender,,adjective,The external world > matter > colour > named colors\r\ncolumbe,1561,pinkish or purplish grey,lavender,,adjective,The external world > matter > colour > named colors\r\ndove-colour,1598,pinkish or purplish grey,lavender,,adjective,The external world > matter > colour > named colors\r\ndove-coloured,1727,pinkish or purplish grey,lavender,,adjective,The external world > matter > colour > named colors\r\nlavender-grey,1834,pinkish or purplish grey,lavender,,adjective,The external world > matter > colour > named colors\r\nlilac-grey,1880,pinkish or purplish grey,lavender,,adjective,The external world > matter > colour > named colors\r\ndove,1895,pinkish or purplish grey,lavender,,adjective,The external world > matter > colour > named colors\r\npinko-grey,1953,pinkish or purplish grey,lavender,,adjective,The external world > matter > colour > named colors\r\npearl grey,1705,pearl grey,seashell,,adjective,The external world > matter > colour > named colors\r\nelephant,1875,other greys,grey,,adjective,The external world > matter > colour > named colors\r\ndesert-grey,1901,other greys,grey,,adjective,The external world > matter > colour > named colors\r\ngreying,1796,becoming grey,grey,,adjective,The external world > matter > colour > named colors\r\npurpurine,1300,purple ,purple,,adjective,The external world > matter > colour > named colors\r\npurpure,1400,purple ,purple,,adjective,The external world > matter > colour > named colors\r\npurple,1415,purple ,purple,,adjective,The external world > matter > colour > named colors\r\npurpurate,1422,purple ,purple,,adjective,The external world > matter > colour > named colors\r\npurple-coloured,1567,purple ,purple,,adjective,The external world > matter > colour > named colors\r\nporphyrite,1601,purple ,purple,,adjective,The external world > matter > colour > named colors\r\npurpurean,1656,purple ,purple,,adjective,The external world > matter > colour > named colors\r\nblattean,1658,purple ,purple,,adjective,The external world > matter > colour > named colors\r\npurpureal,1708,purple ,purple,,adjective,The external world > matter > colour > named colors\r\nporphyrous,1798,purple ,purple,,adjective,The external world > matter > colour > named colors\r\nBabylonian,1846,purple ,purple,,adjective,The external world > matter > colour > named colors\r\npurplish,1562,purplish,purple,,adjective,The external world > matter > colour > named colors\r\npurply,1725,purplish,purple,,adjective,The external world > matter > colour > named colors\r\njacinthinous,1495,deep purple,darkmagenta,,adjective,The external world > matter > colour > named colors\r\ndamson,1661,deep purple,darkmagenta,,adjective,The external world > matter > colour > named colors\r\ngridelin,1652,light purple,plum,,adjective,The external world > matter > colour > named colors\r\nlilac-coloured,1766,light purple,plum,,adjective,The external world > matter > colour > named colors\r\nlilac,1804,light purple,plum,,adjective,The external world > matter > colour > named colors\r\nlilac-tinted,1847,light purple,plum,,adjective,The external world > matter > colour > named colors\r\nlilaceous,1855,light purple,plum,,adjective,The external world > matter > colour > named colors\r\nlilacky,1863,light purple,plum,,adjective,The external world > matter > colour > named colors\r\nlilac-purple,1882,light purple,plum,,adjective,The external world > matter > colour > named colors\r\nprune-coloured,1792,reddish purple,magenta,,adjective,The external world > matter > colour > named colors\r\nprune-dark,1941,reddish purple,magenta,,adjective,The external world > matter > colour > named colors\r\npuce,1787,brownish purple,maroon,,adjective,The external world > matter > colour > named colors\r\npuce-coloured,1790,brownish purple,maroon,,adjective,The external world > matter > colour > named colors\r\nviolet,1370,bluish purple,blueviolet,,adjective,The external world > matter > colour > named colors\r\nblue-violet,1382,bluish purple,blueviolet,,adjective,The external world > matter > colour > named colors\r\nblue-purple,1425,bluish purple,blueviolet,,adjective,The external world > matter > colour > named colors\r\nviolet-coloured,1552,bluish purple,blueviolet,,adjective,The external world > matter > colour > named colors\r\nbluish-purple,1578,bluish purple,blueviolet,,adjective,The external world > matter > colour > named colors\r\nianthine,1609,bluish purple,blueviolet,,adjective,The external world > matter > colour > named colors\r\namethystine,1671,bluish purple,blueviolet,,adjective,The external world > matter > colour > named colors\r\npansy purple,1814,bluish purple,blueviolet,,adjective,The external world > matter > colour > named colors\r\nviolety,1831,bluish purple,blueviolet,,adjective,The external world > matter > colour > named colors\r\nviolescent,1847,bluish purple,blueviolet,,adjective,The external world > matter > colour > named colors\r\nvioletish,1871,bluish purple,blueviolet,,adjective,The external world > matter > colour > named colors\r\npansy-coloured,1891,bluish purple,blueviolet,,adjective,The external world > matter > colour > named colors\r\nmulberry-coloured,1787,other purples,purple,,adjective,The external world > matter > colour > named colors\r\nplum-coloured,1799,other purples,purple,,adjective,The external world > matter > colour > named colors\r\nmulberry,1803,other purples,purple,,adjective,The external world > matter > colour > named colors\r\nmauve,1833,other purples,purple,,adjective,The external world > matter > colour > named colors\r\nmauve-colour,1859,other purples,purple,,adjective,The external world > matter > colour > named colors\r\nmauve-coloured,1859,other purples,purple,,adjective,The external world > matter > colour > named colors\r\namarantine,1874,other purples,purple,,adjective,The external world > matter > colour > named colors\r\nmauvish,1876,other purples,purple,,adjective,The external world > matter > colour > named colors\r\npontifical,1880,other purples,purple,,adjective,The external world > matter > colour > named colors\r\nplummy,1885,other purples,purple,,adjective,The external world > matter > colour > named colors\r\nplum,1887,other purples,purple,,adjective,The external world > matter > colour > named colors\r\npetunia,1892,other purples,purple,,adjective,The external world > matter > colour > named colors\r\npalatinate,1893,other purples,purple,,adjective,The external world > matter > colour > named colors\r\nempurpling,1775,turning purple,purple,,adjective,The external world > matter > colour > named colors\r\npurpured,1382,turning purple,purple,,adjective,The external world > matter > colour > named colors\r\npurpled,1450,turning purple,purple,,adjective,The external world > matter > colour > named colors\r\nempurpled,1708,turning purple,purple,,adjective,The external world > matter > colour > named colors\r\nMeliboean,1667,turning purple,purple,,adjective,The external world > matter > colour > named colors\r\norange,1532,orange,orange,,adjective,The external world > matter > colour > named colors\r\noranged,1538,orange,orange,,adjective,The external world > matter > colour > named colors\r\norange-coloured,1551,orange,orange,,adjective,The external world > matter > colour > named colors\r\norange-tawny,1637,orange,orange,,adjective,The external world > matter > colour > named colors\r\norangey,1779,orange,orange,,adjective,The external world > matter > colour > named colors\r\norangish,1888,orange,orange,,adjective,The external world > matter > colour > named colors\r\nflame-coloured,1598,bright orange,tomato,,adjective,The external world > matter > colour > named colors\r\ntangerine-coloured,1977,deep orange,darkorange,,adjective,The external world > matter > colour > named colors\r\ngingerish,1910,ginger,moccasin,https://goo.gl/cp64yQ,adjective,The external world > matter > colour > named colors\r\nred-orange,1678,reddish orange,orangered,,adjective,The external world > matter > colour > named colors\r\nhyacinth,1694,reddish orange,orangered,,adjective,The external world > matter > colour > named colors\r\nhennaed,1924,stained with henna,chocolate,https://goo.gl/oEysu4,adjective,The external world > matter > colour > named colors\r\n"
  },
  {
    "path": "Patterns in Gothic Literature/empty",
    "content": "empty file\n"
  },
  {
    "path": "Patterns in Gothic Literature/gothic_post.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<img src=\\\"portfolio_gothic.png\\\" />\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"If someone says “gothic” to you, do you think of lush rolling countryside or a sunny day?\\n\",\n    \"\\n\",\n    \"Chances are you don’t.  Most people - myself included - associate that word with things that are dark, mysterious and even frightening.  Maybe you picture ornate stone architecture of a castle with gargoyles. Or perhaps foreboding skies rolling over said castle.  Or very morose, pale people wearing black capes and veils.  Or vampires with all of the above.\\n\",\n    \"\\n\",\n    \"About a year ago, [Caroline Winter](https://carolinewinter.com/), a PhD student at the University of Victoria, emailed me with a question.  She had assembled a [corpus of 134 works of European Gothic literature](https://github.com/eleanorstrib/gothic/tree/master/corpora) that had been written or translated into English, ranging from the 18th century to the early 20th.  Could I write her a short script to count and analyze color words for a broad corpus she’d assembled as a survey of Gothic literature she was studying?  Because her hunch was that gothic literature was greener and less bleak and grim than most people thought.\\n\",\n    \"\\n\",\n    \"This post tells the story of how a quick Python project for a Sunday afternoon morphed into a talk at PyCon.  Through some straightforward counting and matching techniques, we were able to find some interesting patterns that challenged my gloomy picture of “gothic”.  \\n\",\n    \"\\n\",\n    \"This Jupyter Notebook is a companion to the post on the [Kite.com blog](https://kite.com/blog) published in October 2018.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"[nltk_data] Downloading package punkt to\\n\",\n      \"[nltk_data]     /Users/eleanorstrib/nltk_data...\\n\",\n      \"[nltk_data]   Package punkt is already up-to-date!\\n\",\n      \"[nltk_data] Downloading package averaged_perceptron_tagger to\\n\",\n      \"[nltk_data]     /Users/eleanorstrib/nltk_data...\\n\",\n      \"[nltk_data]   Package averaged_perceptron_tagger is already up-to-\\n\",\n      \"[nltk_data]       date!\\n\",\n      \"[nltk_data] Downloading package stopwords to\\n\",\n      \"[nltk_data]     /Users/eleanorstrib/nltk_data...\\n\",\n      \"[nltk_data]   Package stopwords is already up-to-date!\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# first let's import the libraries and functions we need\\n\",\n    \"import csv\\n\",\n    \"from itertools import tee\\n\",\n    \"import json\\n\",\n    \"import matplotlib.pyplot as plt\\n\",\n    \"import numpy as np\\n\",\n    \"import string\\n\",\n    \"from collections import Counter, defaultdict, OrderedDict\\n\",\n    \"import nltk\\n\",\n    \"from nltk import pos_tag, word_tokenize\\n\",\n    \"from nltk.corpus import stopwords\\n\",\n    \"nltk.download('punkt')\\n\",\n    \"nltk.download('averaged_perceptron_tagger')\\n\",\n    \"nltk.download('stopwords')\\n\",\n    \"from operator import itemgetter \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# for this example, I've selected one text from the \\\"corpora\\\" folder; the path will be added when we run the function\\n\",\n    \"title_file = 'Leroux_ThePhantomOfTheOpera_Gutenberg.txt'\\n\",\n    \"title = \\\"The Phantom of the Opera\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Beyond black, white and red\\n\",\n    \"\\n\",\n    \"The first step in the project was to define which color words we were looking for. The challenge here was that both the vocabulary used to describe color and the actual coloring of objects themselves were different in the gothic era than we think of them in the late 2010s.\\n\",\n    \"\\n\",\n    \"Rather than guess about historical color words, we turned to the [Oxford English Dictionary’s Historical Thesaurus](http://www.oed.com/public/htoed/loginpage) (hereafter the <i>Historical Thesaurus</i>).  It lists color words used in English and primarily in Europe, the year of each one’s first recorded use, and its color family.  \\n\",\n    \"\\n\",\n    \"After adding some html color names based on color grouping to our csv file of the [original data set](https://github.com/eleanorstrib/gothic-colors-blog/blob/master/color_names.csv), I read a csv file with the Historical Thesaurus data into a short function and eliminated everything that came into usage after 1914, since it’s not clear from the data when words fell out of usage.  \\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def id_color_words():\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    Gets color words from the csv file and puts them into a dict where key = word\\n\",\n    \"    and value = (hex value, color family); removes pre-1914 color words.\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    color_word_dict = {}\\n\",\n    \"    modern_color_words = []\\n\",\n    \"    color_data = csv.DictReader(open('./color_names.csv'), delimiter=\\\",\\\", quotechar='\\\"')\\n\",\n    \"\\n\",\n    \"    for row in color_data:\\n\",\n    \"        name = row['Colour Name'].lower()\\n\",\n    \"        year = int(row['First Usage'])\\n\",\n    \"        if ' ' not in name:\\n\",\n    \"            if year < 1914:\\n\",\n    \"                family = row['Colour Family'].lower()\\n\",\n    \"                hex_value = row['hex'].lower()\\n\",\n    \"                color_word_dict[name] = (hex_value, family)\\n\",\n    \"            else:\\n\",\n    \"                modern_color_words.append((year, name))\\n\",\n    \"                   \\n\",\n    \"    return color_word_dict, modern_color_words\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This gave us a dictionary of 980 pre-WWI color words ranging from the familiar, like blue (first usage in 1300), crimson (1416), or jet (1607), to the uncommon, like corbeau (1810, dark green), damask (1598, pink) or ochroid (1897, pale yellow).  There were also some instances where the way words were categorized reflected a historical state of familiar things. For example, ‘glass’ is categorized as a greyish green, not pale blue or clear as we may think of it today.\\n\",\n    \"\\n\",\n    \"Now we knew what we were looking for, but generating an accurate analysis was about more than simply counting these color words.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"There are 980 color words in our dictionary that were in use before 1914, per the OED.\\n\",\n      \"\\n\",\n      \"Here is a sample - first value in the tuple is the HTML color, the second is the color family.\\n\",\n      \"mulberry-coloured : ('purple', 'other purples')\\n\",\n      \"blue-white : ('aliceblue', 'bluish white')\\n\",\n      \"navy : ('darkblue', 'dark blue')\\n\",\n      \"azurean : ('skyblue', 'sky blue')\\n\",\n      \"brownish-red : ('darkred', 'brownish-red')\\n\",\n      \"bead-brown : ('brown', 'other browns')\\n\",\n      \"wan : ('slategrey', 'lead grey')\\n\",\n      \"blonde : ('burlywood', 'light brown')\\n\",\n      \"mahogany-brown : ('firebrick', 'reddish brown')\\n\",\n      \"ivoried : ('ivory', 'white as ivory or bone')\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"color_dict, modern_color_words = id_color_words()\\n\",\n    \"\\n\",\n    \"print(\\\"There are %d color words in our dictionary that were in use before 1914, per the OED.\\\" % len(color_dict))\\n\",\n    \"print()\\n\",\n    \"sample_colors = list(color_dict.keys())[330:340]\\n\",\n    \"print(\\\"Here is a sample - first value in the tuple is the HTML color, the second is the color family.\\\")\\n\",\n    \"for s in sample_colors:\\n\",\n    \"    print(s, \\\":\\\", color_dict[s])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Here are the post-1914 words and the year of first usage according to the Oxford English Dictionary.\\n\",\n      \"The 20th century ushered in food-related color words including avocado, citron, cocoa, mustard, pimento & toffee.\\n\",\n      \"\\n\",\n      \"{\\n\",\n      \" \\\"1921\\\": \\\"pimento\\\",\\n\",\n      \" \\\"1922\\\": \\\"straw-pale\\\",\\n\",\n      \" \\\"1923\\\": \\\"sahara\\\",\\n\",\n      \" \\\"1924\\\": \\\"hennaed\\\",\\n\",\n      \" \\\"1927\\\": \\\"greige\\\",\\n\",\n      \" \\\"1928\\\": \\\"mimosa\\\",\\n\",\n      \" \\\"1931\\\": \\\"magnolia-pink\\\",\\n\",\n      \" \\\"1934\\\": \\\"safari\\\",\\n\",\n      \" \\\"1935\\\": \\\"salmony\\\",\\n\",\n      \" \\\"1937\\\": \\\"seaweed-green\\\",\\n\",\n      \" \\\"1938\\\": \\\"guinea-gold\\\",\\n\",\n      \" \\\"1941\\\": \\\"prune-dark\\\",\\n\",\n      \" \\\"1942\\\": \\\"cocoa\\\",\\n\",\n      \" \\\"1946\\\": \\\"whale-blue\\\",\\n\",\n      \" \\\"1947\\\": \\\"avocado\\\",\\n\",\n      \" \\\"1949\\\": \\\"saffronic\\\",\\n\",\n      \" \\\"1950\\\": \\\"wine\\\",\\n\",\n      \" \\\"1951\\\": \\\"bone-coloured\\\",\\n\",\n      \" \\\"1953\\\": \\\"pinko-grey\\\",\\n\",\n      \" \\\"1961\\\": \\\"toffee-brown\\\",\\n\",\n      \" \\\"1962\\\": \\\"peppery\\\",\\n\",\n      \" \\\"1963\\\": \\\"magnolia\\\",\\n\",\n      \" \\\"1965\\\": \\\"nutmeg\\\",\\n\",\n      \" \\\"1991\\\": \\\"mango\\\",\\n\",\n      \" \\\"1970\\\": \\\"flame\\\",\\n\",\n      \" \\\"1971\\\": \\\"sunshine-yellow\\\",\\n\",\n      \" \\\"1975\\\": \\\"sludgy\\\",\\n\",\n      \" \\\"1977\\\": \\\"tangerine-coloured\\\",\\n\",\n      \" \\\"1978\\\": \\\"spun-golden\\\",\\n\",\n      \" \\\"1981\\\": \\\"pepperminty\\\",\\n\",\n      \" \\\"1918\\\": \\\"shadow-grey\\\",\\n\",\n      \" \\\"1919\\\": \\\"mustard\\\"\\n\",\n      \"}\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# what we're discarding from the data set is also interesting\\n\",\n    \"print(\\\"Here are the post-1914 words and the year of first usage according to the Oxford English Dictionary.\\\")\\n\",\n    \"print(\\\"The 20th century ushered in food-related color words including avocado, citron, cocoa, mustard, pimento & toffee.\\\")\\n\",\n    \"print()\\n\",\n    \"print(json.dumps(dict(sorted(modern_color_words, key=lambda x: x[0])), indent=1))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### ‘rose’ != ‘rose’ != ‘rose’\\n\",\n    \"<div align=\\\"center\\\" style=\\\"margin: 0 auto;\\\">\\n\",\n    \"    <div style=\\\"width: 30%;float: left;\\\"><img src=\\\"roseisarose.gif\\\"></div>\\n\",\n    \"    <div><p>\\n\",\n    \"    English is a tricky language, with many words that sound the same meaning different things and many words that look the same meaning different things depending on their context. ‘Rose’ is a great example: it can be a noun, adjective, or verb, as demonstrated in the gif.</p>\\n\",\n    \"\\n\",\n    \"<p>So which words should we count?  Should every word on the list be included?</p>\\n\",\n    \"\\n\",\n    \"<p>To make this decision, we needed to write more code to parse our corpus and look at the results. </p>\\n\",\n    \"\\n\",\n    \"<p>I used the `process_text` function below to get the text ready for analysis.  It does three things.  First, it reads in the .txt file for the work we’re analyzing.  Then, it removes removes the “gristle” of stop words, punctuation, upper case letters.   Finally the function leverages the `pos_tag` function from the [Natural Language Toolkit (NLTK)](https://www.nltk.org/) to tags each remaining words as a part of speech (noun, verb, adjective, etc).</p>\\n\",\n    \"\\n\",\n    \"    </div>\\n\",\n    \"</div>\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def process_text(filename):\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    This function generates a list of tokens with punctuation stopwords, and spaces removed for the whole text.\\n\",\n    \"    It also applies NLTK's part of speech tagging function to determine if words are nouns, adjectives, verbs, etc.\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    text_tokens = []\\n\",\n    \"    \\n\",\n    \"    # create a list of the words and punctuation we want to remove before analyzing\\n\",\n    \"    stop_punc = set(stopwords.words('english') + [*string.punctuation] + [\\\"''\\\", '``'])\\n\",\n    \"    \\n\",\n    \"    with open(filename) as text:\\n\",\n    \"        for row in text:\\n\",\n    \"            # puts everything in lowercase, postion tags\\n\",\n    \"            for token in pos_tag(word_tokenize(row.lower())):\\n\",\n    \"                #removes tokens if contains punctuation or stopwords\\n\",\n    \"                if token and token[0] not in stop_punc:\\n\",\n    \"                    text_tokens.append(token)\\n\",\n    \"\\n\",\n    \"    return text_tokens\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"[('memoirs', 'NNS'), ('manager', 'NN'), ('light', 'NN'), ('frivolous', 'JJ'), ('work', 'NN'), ('too-skeptical', 'JJ'), ('moncharmin', 'NN'), ('term', 'NN'), ('opera', 'NN'), ('understood', 'JJ'), ('nothing', 'NN'), ('mysterious', 'JJ'), ('behavior', 'NN'), ('ghost', 'NN'), ('making', 'VBG'), ('fun', 'NN'), ('could', 'MD'), ('moment', 'NN'), ('became', 'VBD'), ('first', 'JJ')]\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# let's run the function and look at a sample of the data we've generated\\n\",\n    \"processed = process_text(title_file)\\n\",\n    \"print(processed[300:320])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Next, we needed to isolate the color words from the text and do some analysis of the context to make sure there weren’t any glaring issues in the data we were generating. Here Caroline’s literature background was extremely helpful in identifying what looked inaccurate, and I went off to pull out the context of the suspicious words so she could make a final call.\\n\",\n    \"\\n\",\n    \"Some examples of words we eliminated based on context were:\\n\",\n    \"- Isabella, a yellowish color that was also the name of a couple of characters in our corpus;\\n\",\n    \"- Imperial, a purple color that in the texts actually meant the political structure, not the color; and\\n\",\n    \"- Angry, sometimes used to describe a red-pink flushed color, but was used more often as an emotion word than a color word.\\n\",\n    \"\\n\",\n    \"At this stage, I also experimented with stemming and lemmatizing the color words in our master list and in the texts themselves to see if that changed how many color words we were finding, rather than looking for exact matches. What this means, for example, is transforming the word “whitish” from the <i>Historical Thesaurus</i> to its root, or stem (“white”), and doing the same to the words in the text we were analyzing. However, because the <i>Historical Thesaurus</i> is so comprehensive and already included many forms of each word, the results didn’t change much and we decided to leave this step out.\\n\",\n    \"\\n\",\n    \"Looking at the preliminary data, we also found that we got some combinations of color words, like “rose” followed by “red” or “milky” followed by “white”. While the <i>Historical Thesaurus</i> covers common combinations of these when they’re joined with a “-” (e.g. “rose-red”) we decided to isolate those examples in the output of the `find_color_words` to help us determine if we wanted to exclude those samples from the final analysis.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Analysis & Visualization - the (really) fun part\\n\",\n    \"With adjustments made to the color word list, we can run the tagged text through the `find_color_words` function below and see both the concurrent color words and the full list.  To do this, the code below leverages Python’s itertools with a couple of helper functions, `pairwise` and `is_color_word`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"# we'll use the itertools library to loop through the text and compare the color words\\n\",\n    \"def pairwise(iterable):\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    Returns a zip object, consisting of tuple pairs of words where the second word of tuple #1\\n\",\n    \"    will be the first word of tuple #2, e.g. [('room', 'NN'), ('perfume', 'NN'),  ('lady', 'NN'), ('black', 'JJ')]\\n\",\n    \"    from our `processed` variable becomes:\\n\",\n    \"        [(('room', 'NN'), ('perfume', 'NN'))\\n\",\n    \"        (('perfume', 'NN'), ('lady', 'NN'))\\n\",\n    \"        (('lady', 'NN'), ('black', 'JJ'))\\n\",\n    \"        (('black', 'JJ'), ('contents', 'NNS')]\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    a, b = tee(iterable)\\n\",\n    \"    next(b, None)\\n\",\n    \"    return zip(a, b)\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"def is_color_word(word, color_dict):\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    Compares at each word, tag tuple in `processed` to both the color dict and the allowed tags\\n\",\n    \"    for adjectives and nouns\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    color, tag = word\\n\",\n    \"    tags = {'JJ', 'NN'} # JJ = adjectives, NN = nouns\\n\",\n    \"    return tag in tags and color in color_dict\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"def find_color_words(t, color_dict):\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    Leverages the previous two functions to identify the color words in the text and look for concurrent \\n\",\n    \"    color words (e.g. 'white marble'), then returns each in a seperate list.\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    color_words = []\\n\",\n    \"    concurrent_color_words = []\\n\",\n    \"    \\n\",\n    \"    \\n\",\n    \"    for o in t:\\n\",\n    \"        if is_color_word(o, color_dict):\\n\",\n    \"            color_words.append(o)\\n\",\n    \"            \\n\",\n    \"       \\n\",\n    \"    for p, n in pairwise(t):\\n\",\n    \"        if is_color_word(p, color_dict) and is_color_word(n, color_dict):\\n\",\n    \"            concurrent_color_words.append((p, n))\\n\",\n    \"            \\n\",\n    \"    return color_words, concurrent_color_words\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Here's a sample of what our list of color words looks like:\\n\",\n      \"[('yellow', 'JJ'), ('black', 'JJ'), ('mourning', 'NN'), ('rose-red', 'JJ'), ('lily-white', 'JJ'), ('black', 'JJ'), ('black', 'JJ'), ('black', 'JJ'), ('white', 'JJ'), ('yellow', 'NN'), ('plum', 'NN'), ('glass', 'NN'), ('red', 'JJ'), ('coral', 'JJ'), ('pink', 'NN'), ('iron', 'NN'), ('glass', 'NN'), ('pink', 'JJ'), ('candid', 'JJ'), ('blue', 'JJ')]\\n\",\n      \"\\n\",\n      \"Here is a sample of the concurrent color words, instances where we had a color noun with a color adjective:\\n\",\n      \"[(('glass', 'NN'), ('champagne', 'NN')), (('red', 'JJ'), ('white', 'JJ')), (('pink', 'NN'), ('blush', 'NN')), (('glass', 'NN'), ('champagne', 'NN')), (('pink', 'NN'), ('white', 'JJ')), (('gold', 'NN'), ('purple', 'NN')), (('water', 'NN'), ('bluey', 'NN')), (('glass', 'NN'), ('glass', 'NN')), (('red', 'JJ'), ('red', 'JJ')), (('water', 'NN'), ('water', 'NN'))]\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"color_in_text, concurrent_color_words = find_color_words(processed, color_dict)\\n\",\n    \"\\n\",\n    \"print(\\\"Here's a sample of what our list of color words looks like:\\\")\\n\",\n    \"print(color_in_text[:20])\\n\",\n    \"print()\\n\",\n    \"if len(concurrent_color_words) > 1:\\n\",\n    \"    print(\\\"Here is a sample of the concurrent color words, instances where we had a color noun with a color adjective:\\\")\\n\",\n    \"    print(concurrent_color_words[:10])\\n\",\n    \"else:\\n\",\n    \"    print(\\\"No concurrent color words (e.g. 'red rose' or 'yellow orange') were found!\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This function outputs the whole text that looks like this - as you can see `pos_tag` doesn’t look like it gets the part of speech correct every time, but it’s pretty close.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Here's a sample of what our list of color words looks like:\\n\",\n      \"[('yellow', 'JJ'), ('black', 'JJ'), ('mourning', 'NN'), ('rose-red', 'JJ'), ('lily-white', 'JJ'), ('black', 'JJ'), ('black', 'JJ'), ('black', 'JJ'), ('white', 'JJ'), ('yellow', 'NN'), ('plum', 'NN'), ('glass', 'NN'), ('red', 'JJ'), ('coral', 'JJ'), ('pink', 'NN'), ('iron', 'NN'), ('glass', 'NN'), ('pink', 'JJ'), ('candid', 'JJ'), ('blue', 'JJ')]\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(\\\"Here's a sample of what our list of color words looks like:\\\")\\n\",\n    \"print(color_in_text[:20])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Here’s what we get from this function.\\n\",\n    \"\\n\",\n    \"First, a list of all of the identified color words in the text and their tag, like this:\\n\",\n    \"\\n\",\n    \"`[('yellow', 'JJ'), ('black', 'JJ'), ('mourning', 'NN'), ('rose-red', 'JJ'), ('lily-white', 'JJ'), ('black', 'JJ'), ('black', 'JJ'), ('black', 'JJ'), ('white', 'JJ'), ('yellow', 'NN'), ('plum', 'NN'), ('glass', 'NN'), ('red', 'JJ'), ('coral', 'JJ'), ('pink', 'NN'), ('iron', 'NN'), ('glass', 'NN'), ('pink', 'JJ'), ('candid', 'JJ'), ('blue', 'JJ')]`\\n\",\n    \"\\n\",\n    \"Second, we get a list of tuples containing the color words that were adjectives or nouns followed by another adjective or noun closely in the original text.  From The Phantom of the Opera, we get examples like:\\n\",\n    \"`(('glass', 'NN'), ('champagne', 'NN'))\\n\",\n    \"(('pink', 'NN'), ('white', 'JJ'))\\n\",\n    \"(('gold', 'NN'), ('purple', 'NN'))\\n\",\n    \"(('water', 'NN'), ('bluey', 'NN'))`\\n\",\n    \"In most cases we didn’t think one of these took anything away from or obscured the other; in fact their close association painted a clearer picture of color and in some cases texture.  So we left both words in.\\n\",\n    \"\\n\",\n    \"From this you can get some summary stats, like what percentage of the uncommon words in the text were color words (Phantom is 0.9%), and what proportion are nouns versus adjectives (Phantom is 52-47).\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"There are 182 nouns in our color word list:\\n\",\n      \"Counter({'water': 56, 'glass': 24, 'iron': 20, 'stone': 19, 'gold': 10, 'bronze': 5, 'pink': 4, 'marble': 4, 'snow': 4, 'crimson': 3, 'rush': 3, 'wan': 2, 'blush': 2, 'mahogany': 2, 'scarlet': 2, 'champagne': 2, 'bluey': 2, 'inky': 1, 'violet': 1, 'stony': 1, 'blue': 1, 'straw': 1, 'incarnate': 1, 'ivory': 1, 'mourning': 1, 'purple': 1, 'candid': 1, 'plum': 1, 'yellow': 1, 'peacock': 1, 'copper': 1, 'chocolate': 1, 'gunpowder': 1, 'mole': 1, 'navy': 1})\\n\",\n      \"\\n\",\n      \"And 169 adjectives in our color word list:\\n\",\n      \"Counter({'red': 45, 'black': 40, 'white': 30, 'rosy': 9, 'yellow': 8, 'blue': 8, 'marble': 7, 'golden': 5, 'leaden': 3, 'candid': 2, 'green': 2, 'rose-red': 1, 'purple': 1, 'lily-white': 1, 'pitchy': 1, 'metallic': 1, 'coral': 1, 'pink': 1, 'rusty': 1, 'glaucous': 1, 'smoky': 1})\\n\",\n      \"\\n\",\n      \"The Phantom of the Opera is 0.84 percent color words.\\n\",\n      \"~51 percent of the color words are nouns.\\n\",\n      \"~48 percent of the color words are adjectives.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"#some descriptive statistics!\\n\",\n    \"nouns = Counter([n[0] for n in color_in_text if n[1] == 'NN'])\\n\",\n    \"total_nouns = sum(nouns.values())\\n\",\n    \"adjectives = Counter([a[0] for a in color_in_text if a[1] == 'JJ'])\\n\",\n    \"total_adjectives = sum(adjectives.values())\\n\",\n    \"total_color_words = len(color_in_text)\\n\",\n    \"pct_color_words = round((total_color_words/len(processed))*100, 2)\\n\",\n    \"\\n\",\n    \"print(\\\"There are %d nouns in our color word list:\\\" % total_nouns)\\n\",\n    \"print(nouns)\\n\",\n    \"print()\\n\",\n    \"print(\\\"And %d adjectives in our color word list:\\\" % total_adjectives)\\n\",\n    \"print(adjectives)\\n\",\n    \"print()\\n\",\n    \"print(\\\"%s is %s percent color words.\\\"% (title, pct_color_words))\\n\",\n    \"print(\\\"~%d percent of the color words are nouns.\\\" % round((total_nouns/total_color_words)*100, 1))\\n\",\n    \"print(\\\"~%d percent of the color words are adjectives.\\\" % round((total_adjectives/total_color_words)*100, 1))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Analysis & Visualization - the (really) fun part\\n\",\n    \"With adjustments made to the color word list, we were ready to run the texts through our `find_color_words` function again to see the results. \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [],\n   \"source\": [\n    \"def group_to_plot(color_dict, c_i_t):\\n\",\n    \"    color_summary = defaultdict(int)\\n\",\n    \"    for c in c_i_t:\\n\",\n    \"        color_summary[color_dict[c[0]][0]] += 1\\n\",\n    \"    \\n\",\n    \"    color_sum_a = sorted(color_summary.items(), key=lambda t: t[1], reverse=True)\\n\",\n    \"    color_sum_d = sorted(color_summary.items(), key=lambda t: t[1])\\n\",\n    \"    return color_sum_a, color_sum_d\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"#1 - cadetblue: 57\\n\",\n      \"#2 - red: 48\\n\",\n      \"#3 - black: 42\\n\",\n      \"#4 - silver: 30\\n\",\n      \"#5 - lightseagreen: 25\\n\",\n      \"#6 - dimgrey: 21\\n\",\n      \"#7 - lightslategrey: 20\\n\",\n      \"#8 - pink: 18\\n\",\n      \"#9 - gold: 15\\n\",\n      \"#10 - white: 14\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"html_color_counts_asc, html_color_counts_dsc  = group_to_plot(color_dict, color_in_text)\\n\",\n    \"\\n\",\n    \"# here are the top 10 HTML colors evoked in the text with their counts\\n\",\n    \"for i in range(10):\\n\",\n    \"    print(\\\"#%s - %s: %s\\\" % (i+1, html_color_counts_asc[i][0], html_color_counts_asc[i][1]))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's use matplotlib to add a bar chart of the top 10 colors in the book.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"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\\nzMwK4f8D13yupikIIJAAAAAASUVORK5CYII=\\n\",\n      \"text/plain\": [\n       \"<matplotlib.figure.Figure at 0x11d64f4e0>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"colors = [t[0] for t in html_color_counts_dsc][-10:]\\n\",\n    \"counts = [t[1] for t in html_color_counts_dsc][-10:]\\n\",\n    \"\\n\",\n    \"y_pos = np.arange(len(counts))\\n\",\n    \"\\n\",\n    \"plt.barh(y_pos, counts, align='center', color=colors, edgecolor='black', linewidth=0.5)\\n\",\n    \"plt.yticks(y_pos, colors)\\n\",\n    \"plt.xlabel('# times evoked')\\n\",\n    \"plt.title('Top 10 HTML colors in ' + title)\\n\",\n    \"\\n\",\n    \"plt.show()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"There are many of interesting options for visualizing this data. The original talk included a [website](https://afternoon-taiga-69837.herokuapp.com/), built with the Django framework and ChartJS and lots of CSS where - using a slightly different HTML color match up - we visualized each book as a series of color blocks in their order of appearance, and each author's works as a radial chart.\\n\",\n    \"\\n\",\n    \"<img src='phantom.png' width=30% align=\\\"left\\\">\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Beyond this post\\n\",\n    \"Our talk at PyCon in 2017 was in no means the end of the project. A few months later, we were contacted by a scholar who used some of our color palettes for his research, and Caroline is in the process of writing up and publishing our findings, which are one of the few explorations of color in gothic literature and as far as we know the only quantitative study on the topic. The project also inspired her to take a course in Python.\\n\",\n    \"\\n\",\n    \"There is so many ways that computing could be used for humanities scholarship to complement the strong traditions already there.  If you’d like to learn more about this project after reviewing , please [watch the original talk](https://www.youtube.com/watch?v=3dDtACSYVx0) and [visit the website](https://afternoon-taiga-69837.herokuapp.com/), check out the [repo and the corpus](https://github.com/eleanorstrib/gothic).  If you prefer to work with more recent literature, check out my 2018 project where I [explain and quantify gender bias in the Harry Potter series using Python](https://medium.com/agatha-codes/a-bossy-sort-of-voice-3c3a18de3093). \\n\",\n    \"\\n\",\n    \"\\n\",\n    \"This post is a part of Kite’s new series on Python. Interested in contributing? Comments on this post? Drop us a line at [contact@kite.com](mailto:contact@kite.com)! \"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python [default]\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.5.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "Patterns in Gothic Literature/requirements.txt",
    "content": "backcall==0.1.0\nbleach==2.1.4\ncolorama==0.3.9\ncycler==0.10.0\ndecorator==4.3.0\ndefusedxml==0.5.0\nentrypoints==0.2.3\nhtml5lib==1.0.1\nipykernel==4.9.0\nipython==5.0.0\nipython-genutils==0.2.0\nipywidgets==7.4.2\njedi==0.12.1\nJinja2==2.10\njsonschema==2.6.0\njupyter==1.0.0\njupyter-client==5.2.3\njupyter-console==5.2.0\njupyter-core==4.4.0\nkiwisolver==1.0.1\nMarkupSafe==1.0\nmatplotlib==3.0.0\nmistune==0.8.3\nnbconvert==5.4.0\nnbformat==4.4.0\nnltk==3.3\nnotebook==5.7.0\nnumpy==1.15.2\npandocfilters==1.4.2\nparso==0.3.1\npickleshare==0.7.4\nprometheus-client==0.3.1\nprompt-toolkit==1.0.15\nPygments==2.2.0\npyparsing==2.2.1\npython-dateutil==2.7.3\npywinpty==0.5.4\npyzmq==17.1.2\nqtconsole==4.4.1\nSend2Trash==1.5.0\nsimplegeneric==0.8.1\nsix==1.11.0\nterminado==0.8.1\ntestpath==0.3.1\ntornado==5.1.1\ntraitlets==4.3.2\nwcwidth==0.1.7\nwebencodings==0.5.1\nwidgetsnbextension==3.4.2\nwin-unicode-console==0.5\n"
  },
  {
    "path": "Practical Machine Learning with Python and Keras/Kite blog post code.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import numpy as np\\n\",\n    \"import matplotlib.pyplot as plt\\n\",\n    \"import gzip\\n\",\n    \"from typing import List\\n\",\n    \"from sklearn.preprocessing import OneHotEncoder\\n\",\n    \"import tensorflow.keras as keras\\n\",\n    \"from sklearn.model_selection import train_test_split\\n\",\n    \"from sklearn.metrics import confusion_matrix\\n\",\n    \"import itertools\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"%matplotlib inline\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# The MNIST Dataset\\n\",\n    \"\\n\",\n    \"The MNIST dataset is a large database of handwritten digits that is used as a benchmark and an introduction to machine learning and image processing systems. We like MNIST because the dataset is very clean and this allows us to focus on the actual network training and evaluation. Remember: a clean dataset is a luxury in the ML world! So let’s enjoy and celebrate MNIST’s cleanliness while we can :)\\n\",\n    \"\\n\",\n    \"## The objective\\n\",\n    \"\\n\",\n    \"Given a dataset of 60,000 handwritten digit images (represented by 28x28 pixels, each containing a value 0 - 255 with its grayscale value), train a system to classify each image with it's respective label (the digit that is displayed).\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## The dataset\\n\",\n    \"\\n\",\n    \"The dataset is composed of a training and testing dataset, but for simplicity we are only going to be using the training set. Below we can download the train dataset\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"%%bash\\n\",\n    \"\\n\",\n    \"rm -Rf train-images-idx3-ubyte.gz\\n\",\n    \"rm -Rf train-labels-idx1-ubyte.gz \\n\",\n    \"wget -q http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz\\n\",\n    \"wget -q http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Reading the labels\\n\",\n    \"\\n\",\n    \"There are 10 possible handwritten digits: (0-9), therefore every label must be a number from 0 to 9. The file that we downloaded, `train-labels-idx1-ubyte.gz`, encodes labels as following:\\n\",\n    \"\\n\",\n    \"### TRAINING SET LABEL FILE (train-labels-idx1-ubyte):\\n\",\n    \"\\n\",\n    \"```\\n\",\n    \"[offset] [type]          [value]          [description] \\n\",\n    \"0000     32 bit integer  0x00000801(2049) magic number (MSB first) \\n\",\n    \"0004     32 bit integer  60000            number of items \\n\",\n    \"0008     unsigned byte   ??               label \\n\",\n    \"0009     unsigned byte   ??               label \\n\",\n    \"........ \\n\",\n    \"xxxx     unsigned byte   ??               label\\n\",\n    \"The labels values are 0 to 9.\\n\",\n    \"```\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"It looks like the first 8 bytes (or the first 2 32-bit integers) can be skipped because they contain metadata of the file that is usually useful to lower-level programming languages.\\n\",\n    \"To parse the file, we can perform the following operations:\\n\",\n    \"\\n\",\n    \"- Open the file using the gzip library, so that we can decompress the file\\n\",\n    \"- Read the entire byte array into memory\\n\",\n    \"- Skip the first 8 bytes\\n\",\n    \"- Iterate over every byte, and cast that byte to integer\\n\",\n    \"\\n\",\n    \"NOTE: If this file was not from a trusted source, a lot more checking would need to be done. For the purpose of this blog post, I'm going to assume the file is valid in it's integrity.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"with gzip.open('train-labels-idx1-ubyte.gz') as train_labels:\\n\",\n    \"    data_from_train_file = train_labels.read()\\n\",\n    \"\\n\",\n    \"# Skip the first 8 bytes, we know exactly how many labels there are\\n\",\n    \"label_data = data_from_train_file[8:]\\n\",\n    \"assert len(label_data) == 60000\\n\",\n    \"\\n\",\n    \"# Convert every byte to an integer. This will be a number between 0 and 9\\n\",\n    \"labels = [int(label_byte) for label_byte in label_data]\\n\",\n    \"assert min(labels) == 0 and max(labels) == 9\\n\",\n    \"assert len(labels) == 60000\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Reading the images\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"\\n\",\n    \"\\n\",\n    \"```\\n\",\n    \"[offset] [type]          [value]          [description] \\n\",\n    \"0000     32 bit integer  0x00000803(2051) magic number \\n\",\n    \"0004     32 bit integer  60000            number of images \\n\",\n    \"0008     32 bit integer  28               number of rows \\n\",\n    \"0012     32 bit integer  28               number of columns \\n\",\n    \"0016     unsigned byte   ??               pixel \\n\",\n    \"0017     unsigned byte   ??               pixel \\n\",\n    \"........ \\n\",\n    \"xxxx     unsigned byte   ??               pixel\\n\",\n    \"```\\n\",\n    \"\\n\",\n    \"Reading images is slightly different than reading labels. The first 16 bytes contain metadata that we already know. We can skip those bytes and directly proceed to reading the images. Every image is represented as a 28*28 unsigned byte array. All we have to do is read one image at a time and save it into an array.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(60000, 784)\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"SIZE_OF_ONE_IMAGE = 28 ** 2\\n\",\n    \"images = []\\n\",\n    \"\\n\",\n    \"# Iterate over the train file, and read one image at a time\\n\",\n    \"with gzip.open('train-images-idx3-ubyte.gz') as train_images:\\n\",\n    \"    train_images.read(4 * 4)\\n\",\n    \"    ctr = 0\\n\",\n    \"    for _ in range(60000):\\n\",\n    \"        image = train_images.read(size=SIZE_OF_ONE_IMAGE)\\n\",\n    \"        assert len(image) == SIZE_OF_ONE_IMAGE\\n\",\n    \"        \\n\",\n    \"        # Convert to numpy\\n\",\n    \"        image_np = np.frombuffer(image, dtype='uint8') / 255\\n\",\n    \"        images.append(image_np)\\n\",\n    \"\\n\",\n    \"images = np.array(images)\\n\",\n    \"images.shape\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Our `images` list now contains 60,000 images. Each image is represented as a byte vector of `SIZE_OF_ONE_IMAGE` \\n\",\n    \"Let's try to plot an image using the `matplotlib` library:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<Figure size 432x288 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {\n      \"needs_background\": \"light\"\n     },\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"def plot_image(pixels: np.array):\\n\",\n    \"    plt.imshow(pixels.reshape((28, 28)), cmap='gray')\\n\",\n    \"    plt.show()\\n\",\n    \"\\n\",\n    \"plot_image(images[25])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Encoding image labels using one-hot encoding\\n\",\n    \"\\n\",\n    \"We are going to use [One-hot encoding](https://en.wikipedia.org/wiki/One-hot) to transform our target labels into a vector. \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"array([[0., 0., 0., ..., 0., 0., 0.],\\n\",\n       \"       [1., 0., 0., ..., 0., 0., 0.],\\n\",\n       \"       [0., 0., 0., ..., 0., 0., 0.],\\n\",\n       \"       ...,\\n\",\n       \"       [0., 0., 0., ..., 0., 0., 0.],\\n\",\n       \"       [0., 0., 0., ..., 0., 0., 0.],\\n\",\n       \"       [0., 0., 0., ..., 0., 1., 0.]])\"\n      ]\n     },\n     \"execution_count\": 6,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"labels_np = np.array(labels).reshape((-1, 1))\\n\",\n    \"\\n\",\n    \"encoder = OneHotEncoder(categories='auto')\\n\",\n    \"labels_np_onehot = encoder.fit_transform(labels_np).toarray()\\n\",\n    \"\\n\",\n    \"labels_np_onehot\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"We have successfully created input and output vectors that will be fed into the input and output layers of our neural network. The input vector at index `i` will correspond to the output vector at index `i`\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"array([0., 0., 0., 0., 0., 0., 1., 0., 0., 0.])\"\n      ]\n     },\n     \"execution_count\": 7,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"labels_np_onehot[999]\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<Figure size 432x288 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {\n      \"needs_background\": \"light\"\n     },\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"plot_image(images[999])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"In the example above, we can see that the image at index `999` clearly represents a 6. It's associated output vector contains 10 digits (since there are 10 available labels) and the digit at index 6 is set to 1, indicating that it's the correct label. \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Building train and test split\\n\",\n    \"\\n\",\n    \"In order to check that our ANN has correctly been trained, we take a percentage of the train dataset (our 60,000 images) and set it aside for testing purposes.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"X_train, X_test, y_train, y_test = train_test_split(images, labels_np_onehot)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(45000, 10)\"\n      ]\n     },\n     \"execution_count\": 10,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"y_train.shape\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(15000, 10)\"\n      ]\n     },\n     \"execution_count\": 11,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"y_test.shape\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"As you can see, our dataset of 60,000 images was split into one dataset of 45,000 images, and the other of 15,000 images.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Training a Neural Network using Keras\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"_________________________________________________________________\\n\",\n      \"Layer (type)                 Output Shape              Param #   \\n\",\n      \"=================================================================\\n\",\n      \"dense (Dense)                (None, 128)               100480    \\n\",\n      \"_________________________________________________________________\\n\",\n      \"dense_1 (Dense)              (None, 10)                1290      \\n\",\n      \"=================================================================\\n\",\n      \"Total params: 101,770\\n\",\n      \"Trainable params: 101,770\\n\",\n      \"Non-trainable params: 0\\n\",\n      \"_________________________________________________________________\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"model = keras.Sequential()\\n\",\n    \"model.add(keras.layers.Dense(input_shape=(SIZE_OF_ONE_IMAGE,), units=128, activation='relu'))\\n\",\n    \"model.add(keras.layers.Dense(10, activation='softmax'))\\n\",\n    \"\\n\",\n    \"model.summary()\\n\",\n    \"\\n\",\n    \"model.compile(optimizer='sgd',\\n\",\n    \"              loss='categorical_crossentropy',\\n\",\n    \"              metrics=['accuracy'])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"(45000, 784)\"\n      ]\n     },\n     \"execution_count\": 13,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"X_train.shape\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Epoch 1/20\\n\",\n      \"45000/45000 [==============================] - 8s 169us/step - loss: 1.3758 - acc: 0.6651\\n\",\n      \"Epoch 2/20\\n\",\n      \"45000/45000 [==============================] - 7s 165us/step - loss: 0.6496 - acc: 0.8504\\n\",\n      \"Epoch 3/20\\n\",\n      \"45000/45000 [==============================] - 8s 180us/step - loss: 0.4972 - acc: 0.8735\\n\",\n      \"Epoch 4/20\\n\",\n      \"45000/45000 [==============================] - 9s 191us/step - loss: 0.4330 - acc: 0.8858\\n\",\n      \"Epoch 5/20\\n\",\n      \"45000/45000 [==============================] - 8s 186us/step - loss: 0.3963 - acc: 0.8931\\n\",\n      \"Epoch 6/20\\n\",\n      \"45000/45000 [==============================] - 8s 183us/step - loss: 0.3714 - acc: 0.8986\\n\",\n      \"Epoch 7/20\\n\",\n      \"45000/45000 [==============================] - 8s 182us/step - loss: 0.3530 - acc: 0.9028\\n\",\n      \"Epoch 8/20\\n\",\n      \"45000/45000 [==============================] - 9s 191us/step - loss: 0.3387 - acc: 0.9055\\n\",\n      \"Epoch 9/20\\n\",\n      \"45000/45000 [==============================] - 8s 175us/step - loss: 0.3266 - acc: 0.9091\\n\",\n      \"Epoch 10/20\\n\",\n      \"45000/45000 [==============================] - 9s 199us/step - loss: 0.3163 - acc: 0.9117\\n\",\n      \"Epoch 11/20\\n\",\n      \"45000/45000 [==============================] - 8s 185us/step - loss: 0.3074 - acc: 0.9140\\n\",\n      \"Epoch 12/20\\n\",\n      \"45000/45000 [==============================] - 10s 214us/step - loss: 0.2991 - acc: 0.9162\\n\",\n      \"Epoch 13/20\\n\",\n      \"45000/45000 [==============================] - 8s 187us/step - loss: 0.2919 - acc: 0.9185\\n\",\n      \"Epoch 14/20\\n\",\n      \"45000/45000 [==============================] - 9s 202us/step - loss: 0.2851 - acc: 0.9203\\n\",\n      \"Epoch 15/20\\n\",\n      \"45000/45000 [==============================] - 9s 201us/step - loss: 0.2788 - acc: 0.9222\\n\",\n      \"Epoch 16/20\\n\",\n      \"45000/45000 [==============================] - 9s 206us/step - loss: 0.2730 - acc: 0.9241\\n\",\n      \"Epoch 17/20\\n\",\n      \"45000/45000 [==============================] - 7s 164us/step - loss: 0.2674 - acc: 0.9254\\n\",\n      \"Epoch 18/20\\n\",\n      \"45000/45000 [==============================] - 9s 189us/step - loss: 0.2622 - acc: 0.9271\\n\",\n      \"Epoch 19/20\\n\",\n      \"45000/45000 [==============================] - 10s 219us/step - loss: 0.2573 - acc: 0.9286\\n\",\n      \"Epoch 20/20\\n\",\n      \"45000/45000 [==============================] - 9s 197us/step - loss: 0.2526 - acc: 0.9302\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"<tensorflow.python.keras.callbacks.History at 0x1129f1f28>\"\n      ]\n     },\n     \"execution_count\": 14,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"model.fit(X_train, y_train, epochs=20, batch_size=128)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"15000/15000 [==============================] - 2s 158us/step\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[0.2567395991722743, 0.9264]\"\n      ]\n     },\n     \"execution_count\": 15,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"model.evaluate(X_test, y_test)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Inspecting the results\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Congratulations! you just trained a neural network to predict handwritten digits with more than 90% accuracy! Let's test out the network with one of the pictures we have in our testset\\n\",\n    \"\\n\",\n    \"Let's take a random image, in this case the image at index `1010`. We take the predicted label (in this case, the value is a 4 because the 5th index is set to 1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"array([0., 0., 0., 0., 1., 0., 0., 0., 0., 0.])\"\n      ]\n     },\n     \"execution_count\": 16,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"y_test[1010]\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's plot the image of the corresponding image\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<Figure size 432x288 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {\n      \"needs_background\": \"light\"\n     },\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"plot_image(X_test[1010])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Understanding the output of a softmax activation layer\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now, let's run this nuber through the neural network and we can see what our predicted output looks like!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"predicted_results = model.predict(X_test[1010].reshape((1, -1)))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The output of a softmax layer is a probability distribution for every output. In our case, there are 10 possible outputs (digits 0-9). Of course, every one of our images is expected to only match one specific output (in other words, all of our images only contain one distinct digit).\\n\",\n    \"\\n\",\n    \"Because this is a probability distribution, the sum of the predicted results is ~1.0\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1.0000001\"\n      ]\n     },\n     \"execution_count\": 19,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"predicted_results.sum()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Reading the output of a softmax activation layer for our digit\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"As you can see below, the 7th index is really close to 1 (0.9) which means that there is a 90% probability that this digit is a 6... which it is! congrats!\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"array([[1.2202066e-06, 3.4432333e-08, 3.5151488e-06, 1.2011528e-06,\\n\",\n       \"        9.9889344e-01, 3.5855610e-05, 1.6140550e-05, 7.6822333e-05,\\n\",\n       \"        1.0446112e-04, 8.6736667e-04]], dtype=float32)\"\n      ]\n     },\n     \"execution_count\": 20,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"predicted_results\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Viewing the confusion matrix\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 21,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"\\n\",\n    \"predicted_outputs = np.argmax(model.predict(X_test), axis=1)\\n\",\n    \"expected_outputs = np.argmax(y_test, axis=1)\\n\",\n    \"\\n\",\n    \"predicted_confusion_matrix = confusion_matrix(expected_outputs, predicted_outputs)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 22,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"array([[1413,    0,   10,    3,    2,   12,   12,    2,   10,    1],\\n\",\n       \"       [   0, 1646,   12,    6,    3,    8,    0,    5,    9,    3],\\n\",\n       \"       [  16,    9, 1353,   16,   22,    1,   18,   28,   44,    3],\\n\",\n       \"       [   1,    6,   27, 1420,    0,   48,   11,   16,   25,   17],\\n\",\n       \"       [   3,    7,    5,    1, 1403,    1,   12,    3,    7,   40],\\n\",\n       \"       [  15,   13,    7,   36,    5, 1194,   24,    6,   18,   15],\\n\",\n       \"       [  10,    8,    9,    1,   21,   16, 1363,    0,    9,    0],\\n\",\n       \"       [   2,   14,   18,    4,   16,    4,    2, 1491,    1,   27],\\n\",\n       \"       [   4,   28,   19,   31,   10,   28,   13,    2, 1280,   25],\\n\",\n       \"       [   5,   13,    1,   21,   58,   10,    1,   36,   13, 1333]])\"\n      ]\n     },\n     \"execution_count\": 22,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"predicted_confusion_matrix\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 23,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<Figure size 432x288 with 2 Axes>\"\n      ]\n     },\n     \"metadata\": {\n      \"needs_background\": \"light\"\n     },\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"\\n\",\n    \"\\n\",\n    \"# Source code: https://scikit-learn.org/stable/auto_examples/model_selection/plot_confusion_matrix.html \\n\",\n    \"def plot_confusion_matrix(cm, classes,\\n\",\n    \"                          title='Confusion matrix',\\n\",\n    \"                          cmap=plt.cm.Blues):\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    This function prints and plots the confusion matrix.\\n\",\n    \"    Normalization can be applied by setting `normalize=True`.\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"\\n\",\n    \"    plt.imshow(cm, interpolation='nearest', cmap=cmap)\\n\",\n    \"    plt.title(title)\\n\",\n    \"    plt.colorbar()\\n\",\n    \"    tick_marks = np.arange(len(classes))\\n\",\n    \"    plt.xticks(tick_marks, classes, rotation=45)\\n\",\n    \"    plt.yticks(tick_marks, classes)\\n\",\n    \"\\n\",\n    \"    fmt = 'd'\\n\",\n    \"    thresh = cm.max() / 2.\\n\",\n    \"    for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):\\n\",\n    \"        plt.text(j, i, format(cm[i, j], fmt),\\n\",\n    \"                 horizontalalignment=\\\"center\\\",\\n\",\n    \"                 color=\\\"white\\\" if cm[i, j] > thresh else \\\"black\\\")\\n\",\n    \"\\n\",\n    \"    plt.ylabel('True label')\\n\",\n    \"    plt.xlabel('Predicted label')\\n\",\n    \"    plt.tight_layout()\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"# Compute confusion matrix\\n\",\n    \"class_names = [str(idx) for idx in range(10)]\\n\",\n    \"cnf_matrix = confusion_matrix(expected_outputs, predicted_outputs)\\n\",\n    \"np.set_printoptions(precision=2)\\n\",\n    \"\\n\",\n    \"# Plot non-normalized confusion matrix\\n\",\n    \"plt.figure()\\n\",\n    \"plot_confusion_matrix(cnf_matrix, classes=class_names,\\n\",\n    \"                      title='Confusion matrix, without normalization')\\n\",\n    \"\\n\",\n    \"plt.show()\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.5\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "Practical Machine Learning with Python and Keras/empty",
    "content": "empty file \n"
  },
  {
    "path": "Practical Machine Learning with Python and Keras/environment.yml",
    "content": "name: kite-blog-post\nchannels:\n- defaults\ndependencies:\n- _tflow_select=2.2.0=eigen\n- absl-py=0.6.1=py36_0\n- appnope=0.1.0=py36hf537a9a_0\n- astor=0.7.1=py36_0\n- backcall=0.1.0=py36_0\n- blas=1.0=mkl\n- bleach=3.0.2=py36_0\n- c-ares=1.15.0=h1de35cc_1\n- ca-certificates=2018.03.07=0\n- certifi=2018.11.29=py36_0\n- cycler=0.10.0=py36hfc81398_0\n- dbus=1.13.2=h760590f_1\n- decorator=4.3.0=py36_0\n- entrypoints=0.2.3=py36_2\n- expat=2.2.6=h0a44026_0\n- freetype=2.9.1=hb4e5f40_0\n- gast=0.2.0=py36_0\n- gettext=0.19.8.1=h15daf44_3\n- glib=2.56.2=hd9629dc_0\n- grpcio=1.14.1=py36h9011c5e_0\n- h5py=2.9.0=py36h3134771_0\n- hdf5=1.10.4=hfa1e0ec_0\n- icu=58.2=h4b95b61_1\n- intel-openmp=2019.1=144\n- ipykernel=5.1.0=py36h39e3cac_0\n- ipython=7.2.0=py36h39e3cac_0\n- ipython_genutils=0.2.0=py36h241746c_0\n- ipywidgets=7.4.2=py36_0\n- jedi=0.13.2=py36_0\n- jinja2=2.10=py36_0\n- jpeg=9b=he5867d9_2\n- jsonschema=2.6.0=py36hb385e00_0\n- jupyter=1.0.0=py36_7\n- jupyter_client=5.2.4=py36_0\n- jupyter_console=6.0.0=py36_0\n- jupyter_core=4.4.0=py36_0\n- keras-applications=1.0.6=py36_0\n- keras-preprocessing=1.0.5=py36_0\n- kiwisolver=1.0.1=py36h0a44026_0\n- libcxx=4.0.1=hcfea43d_1\n- libcxxabi=4.0.1=hcfea43d_1\n- libedit=3.1.20170329=hb402a30_2\n- libffi=3.2.1=h475c297_4\n- libgfortran=3.0.1=h93005f0_2\n- libiconv=1.15=hdd342a3_7\n- libpng=1.6.35=ha441bb4_0\n- libprotobuf=3.6.1=hd9629dc_0\n- libsodium=1.0.16=h3efe00b_0\n- markdown=3.0.1=py36_0\n- markupsafe=1.1.0=py36h1de35cc_0\n- matplotlib=3.0.2=py36h54f8f79_0\n- mistune=0.8.4=py36h1de35cc_0\n- mkl=2019.1=144\n- mkl_fft=1.0.6=py36h27c97d8_0\n- mkl_random=1.0.2=py36h27c97d8_0\n- nbconvert=5.3.1=py36_0\n- nbformat=4.4.0=py36h827af21_0\n- ncurses=6.1=h0a44026_1\n- notebook=5.7.4=py36_0\n- numpy=1.15.4=py36hacdab7b_0\n- numpy-base=1.15.4=py36h6575580_0\n- openssl=1.0.2p=h1de35cc_0\n- pandoc=2.2.3.2=0\n- pandocfilters=1.4.2=py36_1\n- parso=0.3.1=py36_0\n- pcre=8.42=h378b8a2_0\n- pexpect=4.6.0=py36_0\n- pickleshare=0.7.5=py36_0\n- pip=18.1=py36_0\n- prometheus_client=0.5.0=py36_0\n- prompt_toolkit=2.0.7=py36_0\n- protobuf=3.6.1=py36h0a44026_0\n- ptyprocess=0.6.0=py36_0\n- pygments=2.3.1=py36_0\n- pyparsing=2.3.0=py36_0\n- pyqt=5.9.2=py36h655552a_2\n- python=3.6.5=hc167b69_1\n- python-dateutil=2.7.5=py36_0\n- pytz=2018.7=py36_0\n- pyzmq=17.1.2=py36h1de35cc_0\n- qt=5.9.7=h468cd18_1\n- qtconsole=4.4.3=py36_0\n- readline=7.0=h1de35cc_5\n- scikit-learn=0.20.2=py36h27c97d8_0\n- scipy=1.1.0=py36h1410ff5_2\n- send2trash=1.5.0=py36_0\n- setuptools=40.6.3=py36_0\n- sip=4.19.8=py36h0a44026_0\n- six=1.12.0=py36_0\n- sqlite=3.26.0=ha441bb4_0\n- tensorboard=1.12.2=py36haf313ee_0\n- tensorflow=1.12.0=eigen_py36hce7705b_0\n- tensorflow-base=1.12.0=eigen_py36h4f0eeca_0\n- termcolor=1.1.0=py36_1\n- terminado=0.8.1=py36_1\n- testpath=0.4.2=py36_0\n- tk=8.6.8=ha441bb4_0\n- tornado=5.1.1=py36h1de35cc_0\n- traitlets=4.3.2=py36h65bd3ce_0\n- wcwidth=0.1.7=py36h8c6ec74_0\n- webencodings=0.5.1=py36_1\n- werkzeug=0.14.1=py36_0\n- wheel=0.32.3=py36_0\n- widgetsnbextension=3.4.2=py36_0\n- xz=5.2.4=h1de35cc_4\n- zeromq=4.2.5=h0a44026_1\n- zlib=1.2.11=h1de35cc_3\n"
  },
  {
    "path": "Python in the Command Line - a Tutorial on Click/qrwifi/__init__.py",
    "content": ""
  },
  {
    "path": "Python in the Command Line - a Tutorial on Click/qrwifi/app.py",
    "content": ""
  },
  {
    "path": "Python in the Command Line - a Tutorial on Click/qrwifi/cli.py",
    "content": "import numpy as np\n\nimport pyqrcode as pq\n\nimport click\n\nfrom .functions import wifi_qr, qr2array\n\n\n@click.group()\n@click.option(\"--ssid\", help=\"WiFi network name.\")\n@click.option(\"--security\", type=click.Choice([\"WEP\", \"WPA\", \"\"]))\n@click.option(\"--password\", help=\"WiFi password.\")\n@click.pass_context\ndef main(ctx, ssid: str, security: str = \"\", password: str = \"\"):\n    qr = wifi_qr(ssid=ssid, security=security, password=password)\n    ctx.obj[\"qr\"] = qr\n    ctx.obj[\"ssid\"] = ssid\n    ctx.obj[\"security\"] = security\n    ctx.obj[\"password\"] = password\n\n\n@main.command()\n@click.pass_context\ndef terminal(ctx):\n    print(ctx.obj[\"qr\"].terminal())\n\n\n@main.command()\n@click.option(\"--filename\", help=\"full path to the png file\")\n@click.pass_context\ndef png(ctx, filename, scale: int = 10):\n    ctx.obj[\"qr\"].png(filename, scale)\n\n\ndef start():\n    main(obj={})\n\n\nif __name__ == \"__main__\":\n    start()\n"
  },
  {
    "path": "Python in the Command Line - a Tutorial on Click/qrwifi/functions.py",
    "content": "import numpy as np\nimport pyqrcode as pq\n\n\ndef wifi_qr(ssid: str, security: str, password: str):\n    \"\"\"\n    Creates the WiFi QR code object.\n    \"\"\"\n    qr = pq.create(f\"WIFI:S:{ssid};T:{security};P:{password};;\")\n    return qr\n\n\ndef qr2array(qr):\n    \"\"\"\n    Convert a QR code object into its array representation.\n    \"\"\"\n    arr = []\n    for line in qr.text().split(\"\\n\"):\n        if line:\n            arr.append(list(map(int, line)))\n    return np.vstack(arr)\n\n\ndef png_b64(qr, scale: int = 10):\n    \"\"\"\n    Return the base64 encoded PNG of the QR code.\n    \"\"\"\n    return qr.png_data_uri(scale=scale)\n\n"
  },
  {
    "path": "Python in the Command Line - a Tutorial on Click/setup.py",
    "content": "from setuptools import setup, find_packages\n\nsetup(\n      # mandatory\n      name=\"qrwifi\",\n      # mandatory\n      version=\"0.1\",\n      # mandatory\n      author_email=\"username@email.address\",\n      packages=['qrwifi'],\n      package_data={},\n      install_requires=['pyqrcode', 'SolidPython', 'numpy', 'Flask', 'click'],\n      entry_points={\n        'console_scripts': ['qrwifi = qrwifi.cli:start']\n      }\n)\n"
  },
  {
    "path": "QR Codes Using Flask/empty",
    "content": "empty file\n"
  },
  {
    "path": "QR Codes Using Flask/qr_app_pt1/main.py",
    "content": "import pyqrcode as pq\nimport numpy as np\nfrom solid import color, cube, scad_render, translate, union\n\n\ndef create_wifi_qr(ssid: str, security: str, password: str):\n    qr = pq.create(f'WIFI:S:{ssid};T:{security};P:{password};;')\n    return qr\n\n\ndef qr2array(qr):\n    arr = []\n    for line in qr.text().split():\n        if line:\n            arr.append([int(bit) for bit in line])\n    return np.vstack(arr)\n\n\ndef make_solid(arr):\n    HEIGHT = 1\n    SCALE = 2  # output defaults to 1 mm per unit; this lets us increase the size of objects proportionally.\n    cubes = [translate([i * SCALE, j * SCALE, 0])(color('black')(cube(size=[SCALE, SCALE, HEIGHT])))\n             for i, row in enumerate(arr)\n             for j, col in enumerate(row)\n             if arr[i, j] == 1]\n\n    base_plate = color('white')(cube(size=(arr.shape[0] * SCALE, arr.shape[1] * SCALE, HEIGHT / 2)))\n    qrobj = union()(*cubes, base_plate)\n    return qrobj\n\n\ndef main():\n    ssid = \"Family Guest Network\"\n    security = \"WPA\"\n    password = \"vn8h2sncu093y3nd!\"\n    qr = create_wifi_qr(ssid, security, password)\n    arr = qr2array(qr)\n    solid_object = make_solid(arr)\n    print(scad_render(solid_object))\n\n\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "QR Codes Using Flask/qr_app_pt1/requirements.txt",
    "content": "Click==7.0\neuclid3==0.1\nFlask==1.0.2\nitsdangerous==1.1.0\nJinja2==2.10\nMarkupSafe==1.1.0\nnumpy==1.15.4\nprettytable==0.7.2\npypng==0.0.18\nPyQRCode==1.2.1\nsolidpython==0.2.0\nWerkzeug==0.14.1\n"
  },
  {
    "path": "QR Codes Using Flask/qr_app_pt1/setting_up.py",
    "content": "\"\"\"\nInstallation commands...\n\npip install pyqrcode\npip install pypng\n\npip install SolidPython\npip install numpy\n\npip install click\npip install Flask\n\n\n\"\"\""
  },
  {
    "path": "QR Codes Using Flask/qr_app_pt1/step_1.py",
    "content": "\"\"\"\nEncoding WiFi credentials in a QR code\n\nExample Inputs:\nSSID (a.k.a. Network Name): Family Guest Network\nPassword: vn8h2sncu093y3nd!\nSecurity Type (one of WPA or WEP): WPA\n\n\"\"\"\n\nimport pyqrcode as pq\nssid = \"Family Guest Network\"\nsecurity = \"WPA\"\npassword = \"vn8h2sncu093y3nd!\"\n\n# Create the QR code and print it to terminal\nqr = pq.create(f'WIFI:S:{ssid};T:{security};P:{password};;')\nprint(qr.terminal())\n\n# Save the QR code to a PNG\nqr.png('home_guest_wifi.png')"
  },
  {
    "path": "QR Codes Using Flask/qr_app_pt1/step_2.py",
    "content": "\"\"\"\n3d Printing a QR Code\n\"\"\"\n\nimport pyqrcode as pq\n\n\"\"\"\nPlain Text Representation\n\"\"\"\n\n\ndef create_wifi_qr(ssid: str, security: str, password: str):\n    qr = pq.create(f'WIFI:S:{ssid};T:{security};P:{password};;')\n    return qr\n\n\nssid = \"Family Guest Network\"\nsecurity = \"WPA\"\npassword = \"vn8h2sncu093y3nd!\"\n\nqr = create_wifi_qr(ssid, security, password)\nprint(qr.text())\n\n\"\"\"\nArray Representation\n\"\"\"\n\nimport numpy as np\n\n\ndef qr2array(qr):\n    arr = []\n    for line in qr.text().split('\\n'):\n        if len(line) != 0:\n            arr.append([int(bit) for bit in line])\n    return np.vstack(arr)\n\n\narr = qr2array(qr)\n\n\"\"\"\nBuild 3d Model from Array\n\"\"\"\n\nfrom solid import color, cube, scad_render, translate, union\n\nHEIGHT = 1\nSCALE = 2  # output defaults to 1 mm per unit; this lets us increase the size of objects proportionally.\ncubes = [translate([i * SCALE, j * SCALE, 0])(color('black')(cube(size=[SCALE, SCALE, HEIGHT])))\n         for i, row in enumerate(arr)\n         for j, col in enumerate(row)\n         if arr[i, j] == 1]\n\nbase_plate = color('white')(cube(size=(arr.shape[0] * SCALE, arr.shape[1] * SCALE, HEIGHT / 2)))\nqrobj = union()(*cubes, base_plate)\n\nprint(scad_render(qrobj))\n"
  },
  {
    "path": "QR Codes Using Flask/qr_app_pt2/qrwifi/cli.py",
    "content": "\"\"\"\nCreate a CLI interface such that...\n\n$ qrwifi --ssid ”<SSID_NAME>” \\\n          --security ”<SECURITY>” \\\n          --password ”<PASSWORD>” \\\n          [terminal|png --filename ”<FILEPATH>”]\n\n\n\"\"\"\n\nimport click\n\n# Depending on your IDE settings ...\n# from .functions import wifi_qr, qr2array\n\nfrom qrwifi.functions import wifi_qr\n\n\n@click.group()\n@click.option(\"--ssid\", help=\"WiFi network name.\")\n@click.option(\"--security\", type=click.Choice([\"WEP\", \"WPA\", \"\"]))\n@click.option(\"--password\", help=\"WiFi password.\")\n@click.pass_context\ndef main(ctx, ssid: str, security: str = \"\", password: str = \"\"):\n    qr = wifi_qr(ssid=ssid, security=security, password=password)\n    ctx.obj[\"qr\"] = qr\n\n\n@main.command()\n@click.pass_context\ndef terminal(ctx):\n    \"\"\"Print QR code to the terminal.\"\"\"\n    print(ctx.obj[\"qr\"].terminal())\n\n\n@main.command()\n@click.option(\"--filename\", help=\"full path to the png file\")\n@click.pass_context\ndef png(ctx, filename, scale: int = 10):\n    \"\"\"Create a PNG file of the QR code.\"\"\"\n    ctx.obj[\"qr\"].png(filename, scale)\n\n\ndef start():\n    main(obj={})\n\n\nif __name__ == \"__main__\":\n    start()\n"
  },
  {
    "path": "QR Codes Using Flask/qr_app_pt2/qrwifi/functions.py",
    "content": "import numpy as np\nimport pyqrcode as pq\n\n\ndef wifi_qr(ssid: str, security: str, password: str):\n    \"\"\"\n    Creates the WiFi QR code object.\n    \"\"\"\n    qr = pq.create(f\"WIFI:S:{ssid};T:{security};P:{password};;\")\n    return qr\n\n\ndef qr2array(qr):\n    \"\"\"\n    Convert a QR code object into its array representation.\n    \"\"\"\n    arr = []\n    for line in qr.text().split(\"\\n\"):\n        if line:\n            arr.append(list(map(int, line)))\n    return np.vstack(arr)\n\n\ndef png_b64(qr, scale: int = 10):\n    \"\"\"\n    Return the base64 encoded PNG of the QR code.\n    \"\"\"\n    return qr.png_data_uri(scale=scale)\n"
  },
  {
    "path": "QR Codes Using Flask/qr_app_pt2/setup.py",
    "content": "\"\"\"\nNote: Setup.py must be one level higher than qrwifi directory.\n\n\"\"\"\n\nfrom setuptools import setup, find_packages\n\nsetup(\n    # mandatory\n    name=\"qrwifi\",\n    # mandatory\n    version=\"0.1\",\n    # mandatory\n    author_email=\"username@email.address\",\n    packages=['qrwifi'],\n    package_data={},\n    install_requires=['pyqrcode', 'SolidPython', 'numpy', 'Flask', 'click'],\n    entry_points={\n        'console_scripts': ['qrwifi = qrwifi.cli:start']\n    }\n)\n"
  },
  {
    "path": "QR Codes Using Flask/qr_app_pt3/app.py",
    "content": "from flask import Flask, render_template, request\n\nfrom qrwifi.functions import wifi_qr\n\napp = Flask(__name__)\n\n@app.route(\"/\")\ndef home():\n    return render_template(\"index.html.j2\")\n\n@app.route(\"/create\", methods=[\"POST\"])\ndef create():\n    res = request.form\n    qr = wifi_qr(ssid=res[\"ssid\"], password=res[\"password\"], security=res[\"security\"])\n    # qr_b64 = qr.png_as_base64_str(scale=10)\n    qr_b64 = qr.png('static/file.png', scale=10)\n    return render_template(\"qr.html.j2\", qr_b64=qr_b64)\n\ndef run():\n    app.run(debug=True, port=5690, host=\"0.0.0.0\")\n\nif __name__ == \"__main__\":\n    run()"
  },
  {
    "path": "QR Codes Using Flask/qr_app_pt3/qrwifi/cli.py",
    "content": "\"\"\"\nCreate a CLI interface such that...\n\n$ qrwifi --ssid ”<SSID_NAME>” \\\n          --security ”<SECURITY>” \\\n          --password ”<PASSWORD>” \\\n          [terminal|png --filename ”<FILEPATH>”]\n\n\n\"\"\"\n\nimport click\n\n# Depending on your IDE settings ...\n# from .functions import wifi_qr, qr2array\n\nfrom qrwifi.functions import wifi_qr\n\n\n@click.group()\n@click.option(\"--ssid\", help=\"WiFi network name.\")\n@click.option(\"--security\", type=click.Choice([\"WEP\", \"WPA\", \"\"]))\n@click.option(\"--password\", help=\"WiFi password.\")\n@click.pass_context\ndef main(ctx, ssid: str, security: str = \"\", password: str = \"\"):\n    qr = wifi_qr(ssid=ssid, security=security, password=password)\n    ctx.obj[\"qr\"] = qr\n\n\n@main.command()\n@click.pass_context\ndef terminal(ctx):\n    \"\"\"Print QR code to the terminal.\"\"\"\n    print(ctx.obj[\"qr\"].terminal())\n\n\n@main.command()\n@click.option(\"--filename\", help=\"full path to the png file\")\n@click.pass_context\ndef png(ctx, filename, scale: int = 10):\n    \"\"\"Create a PNG file of the QR code.\"\"\"\n    ctx.obj[\"qr\"].png(filename, scale)\n\n\ndef start():\n    main(obj={})\n\n\nif __name__ == \"__main__\":\n    start()\n"
  },
  {
    "path": "QR Codes Using Flask/qr_app_pt3/qrwifi/functions.py",
    "content": "import numpy as np\nimport pyqrcode as pq\n\n\ndef wifi_qr(ssid: str, security: str, password: str):\n    \"\"\"\n    Creates the WiFi QR code object.\n    \"\"\"\n    qr = pq.create(f\"WIFI:S:{ssid};T:{security};P:{password};;\")\n    return qr\n\n\ndef qr2array(qr):\n    \"\"\"\n    Convert a QR code object into its array representation.\n    \"\"\"\n    arr = []\n    for line in qr.text().split(\"\\n\"):\n        if line:\n            arr.append(list(map(int, line)))\n    return np.vstack(arr)\n\n\ndef png_b64(qr, scale: int = 10):\n    \"\"\"\n    Return the base64 encoded PNG of the QR code.\n    \"\"\"\n    return qr.png_data_uri(scale=scale)\n"
  },
  {
    "path": "QR Codes Using Flask/qr_app_pt3/templates/index.html.j2",
    "content": "{% extends \"template.html.j2\" %}\n\n\n{% block body %}\n\n<div class=\"row\">\n  <div class=\"col-12\">\n    <h1>WiFi QR Code Creator</h1>\n  </div>\n  <div class=\"col-12\">\n    <form action=\"/create\" method=\"post\">\n      <div class=\"form-group\">\n        <label for=\"ssid\">SSID</label>\n        <input class=\"form-control\" type=\"text\" name=\"ssid\" id=\"ssid\" placeholder=\"My WiFi Network Name\">\n      </div>\n\n      <div class=\"form-group\">\n        <label for=\"security\">Security Mode</label>\n        <select class=\"form-control\" name=\"security\" id=\"security\">\n          <option value=\"WPA\">WPA</option>\n          <option value=\"WEP\">WEP</option>\n          <option value=\"\">None</option>\n        </select>\n      </div>\n\n      <div class=\"form-group\">\n        <label for=\"password\">Password</label>\n        <input class=\"form-control\" type=\"password\" name=\"password\" id=\"password\" placeholder=\"Protection is good!\">\n      </div>\n\n      <div class=\"form-group\">\n        <button class=\"btn btn-lg btn-success\" type=\"submit\">Create QR Code!</button>\n      </div>\n\n    </form>\n  </div>\n</div>\n\n{% endblock %}\n"
  },
  {
    "path": "QR Codes Using Flask/qr_app_pt3/templates/qr.html.j2",
    "content": "{% extends \"template.html.j2\" %}\n\n{% block body %}\n<div class=\"row\">\n    <div class=\"col-12\">\n        <h1>WiFi QR Code Creator</h1>\n        <p>Here is your QR Code!</p>\n        <img src=\"static/file.png\">\n    </div>\n</div>\n{% endblock %}"
  },
  {
    "path": "QR Codes Using Flask/qr_app_pt3/templates/template.html.j2",
    "content": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <!-- Required meta tags -->\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n\n    <!-- Bootstrap CSS -->\n    <link rel=\"stylesheet\" href=\"https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css\" integrity=\"sha384-9gVQ4dYFwwWSjIDZnLEWnxCjeSWFphJiwGPXr1jddIhOegiu1FwO5qRGvFXOdJZ4\" crossorigin=\"anonymous\">\n\n    <title>Hello, world!</title>\n  </head>\n  <body>\n    <div class=\"container\">\n      {% block body %}\n      {% endblock %}\n    </div>\n    <!-- Optional JavaScript -->\n    <!-- jQuery first, then Popper.js, then Bootstrap JS -->\n    <script src=\"https://code.jquery.com/jquery-3.3.1.slim.min.js\" integrity=\"sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo\" crossorigin=\"anonymous\"></script>\n    <script src=\"https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js\" integrity=\"sha384-cs/chFZiN24E4KMATLdqdvsezGxaGsi4hLGOzlXwp5UZB1LY//20VyM2taTB4QvJ\" crossorigin=\"anonymous\"></script>\n    <script src=\"https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js\" integrity=\"sha384-uefMccjFJAIv6A+rW+L4AHf99KvxDjWSu1z9VI8SKNVmz4sk7buKt/6v9KI65qnm\" crossorigin=\"anonymous\"></script>\n  </body>\n</html>"
  },
  {
    "path": "README.md",
    "content": "# kite-blog-post-code\nCode snippets from Kite blog posts\n"
  },
  {
    "path": "Top Machine Learning Libraries/caffe_example.py",
    "content": "# 1) install caffe using command `sudo apt install caffe-cpu`\n# 2) train network `./examples/mnist/train_lenet.sh`\n# 3) build pycaffe (instructions could be taken here - https://github.com/dungba88/caffe-python3-install/blob/master/install-caffe.md), run make pycaffe after make all\n\n# Remarks on step 3:\n# The Makefile.config file might reference to older version of python (3.5). If your system has Python 3.6, make appropriate changes (3.5 -> 3.6) in Python 3 section.\n# pycaffe module builds will be located in caffe/python directory. To be able to import it you will need to set PYTHONPATH environment variable to caffe/python \nimport caffe\nimport numpy as np\nimport cv2\nimport sys\n\nmodel = \"examples/mnist/lenet.prototxt\"\nweights = \"examples/mnist/lenet_iter_10000.caffemodel\"\nnet = caffe.Net(model, weights, caffe.TEST)\ncaffe.set_mode_cpu()\n\nimg = cv2.imread(sys.argv[1], 0)\nif img.shape != [28, 28]:\n    img = cv2.resize(img, (28, 28))\nimg = img.reshape(28, 28, -1)\nimg = 1.0 - img / 255.0\n\nout = net.forward_all(data=np.asarray([img.transpose(2, 0, 1)]))\n\nprint('The recognized digit is', out[\"prob\"][0].argmax())\n"
  },
  {
    "path": "Top Machine Learning Libraries/requirements.txt",
    "content": "absl-py==0.6.1\nastor==0.7.1\ncycler==0.10.0\ngast==0.2.0\ngrpcio==1.16.0\nh5py==2.8.0\nKeras-Applications==1.0.6\nKeras-Preprocessing==1.0.5\nkiwisolver==1.0.1\nMarkdown==3.0.1\nmatplotlib==3.0.1\nnumpy==1.15.3\npkg-resources==0.0.0\nprotobuf==3.6.1\npyparsing==2.2.2\npython-dateutil==2.7.4\nscikit-learn==0.20.0\nscipy==1.1.0\nsix==1.11.0\ntensorboard==1.11.0\ntensorflow==1.11.0\ntermcolor==1.1.0\nTheano==1.0.3\ntorch==0.4.1\nWerkzeug==0.14.1\n"
  },
  {
    "path": "Top Machine Learning Libraries/sklearn_example.py",
    "content": "import matplotlib.pyplot as plt\nfrom sklearn import datasets\nfrom sklearn import svm\n\n# load dataset containing images of digits\ndigits = datasets.load_digits()\n\n# print the length of the dataset\nprint(len(digits.data))\n\n# input vector excluding the last item to x\n# Assign the target vector to y\nx, y = digits.data[:-1], digits.target[:-1]\n\n# Initiate Support Vector Machines for Classification\nclf = svm.SVC(gamma=0.001, C=100)\n\n# Fit the classifier instance to the model so that it learns from it\nclf.fit(x, y)\n\n# Predict what digit is in the last item of the input array\nprint(clf.predict(digits.data[-1:]))\n\n# Plot the image\nplt.imshow(digits.images[-1], cmap=plt.cm.gray_r, interpolation=\"nearest\")\nplt.show()\n"
  },
  {
    "path": "Top Machine Learning Libraries/tensorflow_example1.py",
    "content": "# A Basic operation using tensorflow\nimport tensorflow as tf\n\n# Define 2 tensorflow constants\na = tf.constant(2, name=\"a\")\nb = tf.constant(3, name=\"b\")\n# Use the tensorflow function 'add' to add the two constants\nc = tf.add(a, b, name=\"c\")\n# Tensorflow now creates a graph and runs it in a session.\nsess = tf.Session()\nresult = sess.run(c)\nprint(result)\n# Close the session\nsess.close()\n"
  },
  {
    "path": "Top Machine Learning Libraries/tensorflow_example2.py",
    "content": "# A Hello World code using Tensorflow\nimport tensorflow as tf\n\nhello = tf.constant(\"Hello, TensorFlow!\")\n# Start tf session\nsess = tf.Session()\n# Run the op\nprint(sess.run(hello))\n"
  },
  {
    "path": "Top Machine Learning Libraries/theano_example.py",
    "content": "import theano\r\nfrom theano import tensor\r\n\r\n# declare two floating point scalars as a and b\r\na = tensor.dscalar()\r\nb = tensor.dscalar()\r\n\r\n# create a simple expression of multiplication\r\nc = a * b\r\n\r\n# convert the expression into an object that takes a and b as input\r\n# and calculates a value for c\r\nf = theano.function([a, b], c)\r\n\r\n# bind 1.5 to 'a', 2.5 to 'b', and evaluate 'c'\r\n# assert if the function, f predicts the right answer when 1.5 and 2.5 are multiplied\r\nassert 3.75 == f(1.5, 2.5)\r\n"
  },
  {
    "path": "Top Machine Learning Libraries/torch_example.py",
    "content": "# Add two matrices of size 2x3 using Pytorch\nimport torch\n\na = [[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]\na = torch.Tensor(a)\nb = a[0] + a[1]\nprint(\"sum of the two matrices of the 2-D tensor:\", b)\n"
  },
  {
    "path": "Turbocharging Python with Command Line Tools/LICENSE",
    "content": "Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License Copyright (c) 2017 Noah Gift\n\nBy exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License (\"Public License\"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions.\n\nSection 1 – Definitions.\n\nAdapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. BY-NC-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses, approved by Creative Commons as essentially the equivalent of this Public License. Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. License Elements means the license attributes listed in the name of a Creative Commons Public License. The License Elements of this Public License are Attribution, NonCommercial, and ShareAlike. Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License. Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. Licensor means the individual(s) or entity(ies) granting rights under this Public License. NonCommercial means not primarily intended for or directed towards commercial advantage or monetary compensation. For purposes of this Public License, the exchange of the Licensed Material for other material subject to Copyright and Similar Rights by digital file-sharing or similar means is NonCommercial provided there is no payment of monetary compensation in connection with the exchange. Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. Section 2 – Scope.\n\nLicense grant. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: reproduce and Share the Licensed Material, in whole or in part, for NonCommercial purposes only; and produce, reproduce, and Share Adapted Material for NonCommercial purposes only. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. Term. The term of this Public License is specified in Section 6(a). Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. Downstream recipients. Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. Additional offer from the Licensor – Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter’s License You apply. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). Other rights.\n\nMoral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. Patent and trademark rights are not licensed under this Public License. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties, including when the Licensed Material is used other than for NonCommercial purposes. Section 3 – License Conditions.\n\nYour exercise of the Licensed Rights is expressly made subject to the following conditions.\n\nAttribution.\n\nIf You Share the Licensed Material (including in modified form), You must:\n\nretain the following if it is supplied by the Licensor with the Licensed Material: identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); a copyright notice; a notice that refers to this Public License; a notice that refers to the disclaimer of warranties; a URI or hyperlink to the Licensed Material to the extent reasonably practicable; indicate if You modified the Licensed Material and retain an indication of any previous modifications; and indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. ShareAlike. In addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply.\n\nThe Adapter’s License You apply must be a Creative Commons license with the same License Elements, this version or later, or a BY-NC-SA Compatible License. You must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply. Section 4 – Sui Generis Database Rights.\n\nWhere the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material:\n\nfor the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database for NonCommercial purposes only; if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. Section 5 – Disclaimer of Warranties and Limitation of Liability.\n\nUnless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You. To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. Section 6 – Term and Termination.\n\nThis Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates:\n\nautomatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or upon express reinstatement by the Licensor. For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. Section 7 – Other Terms and Conditions.\n\nThe Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. Section 8 – Interpretation.\n\nFor the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” The text of the Creative Commons public licenses is dedicated to the public domain under the CC0 Public Domain Dedication. Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at creativecommons.org/policies, Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses.\n\nCreative Commons may be contacted at creativecommons.org.\n"
  },
  {
    "path": "Turbocharging Python with Command Line Tools/Makefile",
    "content": "install:\n\tpip install -r requirements.txt\n\nlint:\n\tpylint --disable=R,C nuclearcli"
  },
  {
    "path": "Turbocharging Python with Command Line Tools/README.md",
    "content": "# Nuclear Powered Command-Line Tools\n\nExamples of extremely powerful, small command-line tools and notebooks\n\n![nuclear powered](https://user-images.githubusercontent.com/58792/47737559-6c658900-dc2e-11e8-85fc-56ad0c9bf2d6.jpg)\n\nTechniques used:\n\n* [GPU (Using CUDA)](https://github.com/noahgift/nuclear_powered_command_line_tools/blob/master/nuclearcli.py#L136)\n* [JIT](https://github.com/noahgift/nuclear_powered_command_line_tools/blob/master/nuclearcli.py#L159)\n* [Machine Learning (Kmeans Clustering)](https://github.com/noahgift/nuclear_powered_command_line_tools/blob/master/nuclearcli.py#L170)\n* [True Multi-Threaded (no GIL) Parallelization](https://github.com/noahgift/nuclear_powered_command_line_tools/blob/master/nuclearcli.py#L123)\n* [Colored output from Click](https://github.com/noahgift/nuclear_powered_command_line_tools/blob/master/nuclearcli.py#L164)\n* [Timing decorators](https://github.com/noahgift/nuclear_powered_command_line_tools/blob/master/nuclearcli.py#L29)\n* [GPU Mandelbrot (Jupyter Notebook)](https://github.com/noahgift/nuclear_powered_command_line_tools/blob/master/notebooks/numba-cuda.ipynb)\n\n\n![mandelbrot](https://user-images.githubusercontent.com/58792/47740395-f31d6480-dc34-11e8-9695-756bdb68d3ab.png)\n\n\n![Pragmatic AI Labs](https://paiml.com/images/logo_with_slogan_white_background.png)\n\nThese cli tools, notebooks and tutorials were produced by [Pragmatic AI Labs](https://paiml.com/).  You can continue learning about these topics by:\n\n*   Buying a copy of [Pragmatic AI: An Introduction to Cloud-Based Machine Learning](http://www.informit.com/store/pragmatic-ai-an-introduction-to-cloud-based-machine-9780134863863)\n*   Watching 8+ Hour Video Series on Safari: [Essential Machine Learning and AI with Python and Jupyter Notebook](https://www.safaribooksonline.com/videos/essential-machine-learning/9780135261118)\n*   Reading online with Safari:  [Pragmatic AI: An Introduction to Cloud-Based Machine Learning, First Edition](https://www.safaribooksonline.com/library/view/pragmatic-ai-an/9780134863924/)\n*  Watching video [Essential Machine Learning and AI with Python and Jupyter Notebook-Video-SafariOnline](https://www.safaribooksonline.com/videos/essential-machine-learning/9780135261118) on Safari Books Online.\n* Purchasing video [Essential Machine Learning and AI with Python and Jupyter Notebook- Purchase Video](http://www.informit.com/store/essential-machine-learning-and-ai-with-python-and-jupyter-9780135261095)\n*   Register for an [upcoming online training on Safari](https://www.safaribooksonline.com/search/?query=noah%20gift).\n*   Browsing [Pragmatic AI Source Code](https://github.com/noahgift/pragmaticai)\n*   Viewing more content at [noahgift.com](https://noahgift.com/)\n*   Viewing more content at [Pragmatic AI Labs](https://paiml.com/)\n*   Viewing more content on the [Pragmatic AI Labs YouTube Channel](https://www.youtube.com/channel/UCNDfiL0D1LUeKWAkRE1xO5Q)\n*   Reading content on [Pragmatic AI Medium](https://medium.com/pragmatic-ai-labs)\n*   Hear more about the some of the topics covered in [TWIML podcast](https://twimlai.com/twiml-talk-158-growth-hacking-sports-w-machine-learning-with-noah-gift/)\n\n\n"
  },
  {
    "path": "Turbocharging Python with Command Line Tools/notebooks/numba-cuda.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# A Numba + Cuda Mandelbrot Example\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This notebook was written by Mark Harris based on code examples from Continuum Analytics that I modified somewhat. This is an example that demonstrates accelerating a Mandelbrot fractal computation using \\\"CUDA Python\\\" with Numba.\\n\",\n    \"\\n\",\n    \"Noah Gift changed it to use the next version of the numba API (numbapro is depreciated) and code was also changed to be python3 compatible.\\n\",\n    \"\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import numpy as np\\n\",\n    \"from pylab import imshow, show\\n\",\n    \"from timeit import default_timer as timer\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"The `mandel` function performs the Mandelbrot set calculation for a given (x,y) position on the imaginary plane. It returns the number of iterations before the computation \\\"escapes\\\".\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def mandel(x, y, max_iters):\\n\",\n    \"  \\\"\\\"\\\"\\n\",\n    \"    Given the real and imaginary parts of a complex number,\\n\",\n    \"    determine if it is a candidate for membership in the Mandelbrot\\n\",\n    \"    set given a fixed number of iterations.\\n\",\n    \"  \\\"\\\"\\\"\\n\",\n    \"  c = complex(x, y)\\n\",\n    \"  z = 0.0j\\n\",\n    \"  for i in range(max_iters):\\n\",\n    \"    z = z*z + c\\n\",\n    \"    if (z.real*z.real + z.imag*z.imag) >= 4:\\n\",\n    \"      return i\\n\",\n    \"\\n\",\n    \"  return max_iters\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"`create_fractal` iterates over all the pixels in the image, computing the complex coordinates from the pixel coordinates, and calls the `mandel` function at each pixel. The return value of `mandel` is used to color the pixel.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def create_fractal(min_x, max_x, min_y, max_y, image, iters):\\n\",\n    \"  height = image.shape[0]\\n\",\n    \"  width = image.shape[1]\\n\",\n    \"\\n\",\n    \"  pixel_size_x = (max_x - min_x) / width\\n\",\n    \"  pixel_size_y = (max_y - min_y) / height\\n\",\n    \"    \\n\",\n    \"  for x in range(width):\\n\",\n    \"    real = min_x + x * pixel_size_x\\n\",\n    \"    for y in range(height):\\n\",\n    \"      imag = min_y + y * pixel_size_y\\n\",\n    \"      color = mandel(real, imag, iters)\\n\",\n    \"      image[y, x] = color\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Next we create a 1024x1024 pixel image as a numpy array of bytes. We then call `create_fractal` with appropriate coordinates to fit the whole mandelbrot set.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Mandelbrot created in 4.333119 s\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<Figure size 432x288 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {\n      \"needs_background\": \"light\"\n     },\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"image = np.zeros((1024, 1536), dtype = np.uint8)\\n\",\n    \"start = timer()\\n\",\n    \"create_fractal(-2.0, 1.0, -1.0, 1.0, image, 20) \\n\",\n    \"dt = timer() - start\\n\",\n    \"\\n\",\n    \"print(\\\"Mandelbrot created in %f s\\\" % dt)\\n\",\n    \"imshow(image)\\n\",\n    \"show()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You can play with the coordinates to zoom in on different regions in the fractal.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAAXgAAAD8CAYAAAB9y7/cAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvqOYd8AAAIABJREFUeJztvX+QHOV94P15dmdXu8ysVgusdrUCYSTWF+AwAYQNsYhVwQ62jrNz9caGvKk7zOm16n1fcq8vfq/OOKHOdXfUxblLOfZVUfEp0fHiK94Y7Mud/VLEFHYiB7kIQbYjY4SNfhlZWq12gdVoZ1hpd7TP+0f309vT0z3TPdM90z3z/VRtaaanp/uZVvenv/19fimtNYIgCEL30dfpAgiCIAjJIIIXBEHoUkTwgiAIXYoIXhAEoUsRwQuCIHQpInhBEIQupe2CV0p9WCn1M6XUUaXUw+3evyAIQq+g2tkOXinVD7wOfAg4BbwM/JbW+nDbCiEIgtAjtDuCfy9wVGt9XGu9DHwN+FibyyAIgtAT5Nq8v83AL1zvTwHvc6+glNoD7AHop/+2y1hvLe/vt1bI9Ufaoe6XagZBEKKRJm/oflX1/uI7b7NysawCVq+i3YL3K1RVjkhrvRfYC7BeXa7fp+4GoH90DDU2GnmHl8by0UspCELPsjI61OkiALA86q/nQ3/15dDbaLfgTwFXu95fBcy0uQyCIAi+pEHuQWJvhnYL/mVgWil1LXAauB/4X5PamUTvgiCEodvEbmir4LXWFaXU7wDPAf3Af9Vav9rOMgiCIBi6VeyGdkfwaK2fBZ5t934FQRDcdFruSYrd0HbBC4IgdJpOyr0dYjd0reAl/y4IgpdeEbshPY0969A/NtbpIgiCkHF6Te7QxRG8IAgCdE7snZK6m86XIAEkPSMIQi9G7F7SUQpBEISY6OWI3UsmcvCCIAhhELlXk85StYCkZwSh9xCx+5Pu0gmCINRBxF6fbJQSmhpJUhCE7kTEHo5slVbIFGEvwoHihYRLInQLIvZoZLPUAUj+PV7adTHFtR+5UXQnIvXmyf4vEFqm04MuxUWj3yE3gGwh7dhbpzt+hRCKbhF5s8gNIP10+hztFrEbuubXSHqmmk5fKFlEbgCdodPnardJ3U33/rIepNMXSrcTdHxF/M2RhvO1m+UOIvhMk4YLRKj//yDyXyMt52u3S91N7/zSLiEtF4kQjl5O+6TtXO0lsRu64hd3c/49bReJEC/dcANI8znai1J309u/PsWk+aIR2keY86AdN4GsnY+9LnaDHIUUkbWLSEgHct5YiNRrkSOSAuQCFYTmEbEHI0emg4jYBaE5ROrhSP1RajThdhYrWEXsghAdkXp05Ii1ERG7IERDpN4amTh6WR8LXsQuCOERqceHHMkEEbELQmNE6MmR6SOb1vy7iF0Q/IlL5suFvli20yyDpdWO7j8smRZ82hCxC4JFqyLvtMAb0ah8abkBiOBjQuQu9BpxplbSLvSo+P2eTkhfBN8iInahG2hnHtwrv+URVbPO4KJuV3HaRiekn1nBpyH/LnIXmqWXKhb9xLY8olgZgaXJVXIlGCgpBharP3fTjcKH5KXfO2dZjIjYBT96SdphCBI7wMrI2rJKQTNQsoTvlrzf97pV9G7cx61V2csZGRGRe+8iAq9Pozy6XypmNX/JfmV9t57kzTZ6QfIG7zGNKvymazaUUlcrpf5aKfWaUupVpdSn7eWXK6WeV0odsf8ds5crpdR/VkodVUr9WCl1a7P77hQi995geTTn+yfUslzoc/4C1xlRvnIH6Cv3MzZ5npVCeGnX2163s1zoQ/eHX7+VqusK8H9rra8H7gAeUkrdADwMfFdrPQ18134P8BFg2v7bA/xJC/tuKyujQyL3LkZEHp1GUnfWqyNiI/VdWw5TKehIkm+0bcGi6bNZa30GOGO/XlRKvQZsBj4G7LRXewLYD3zWXv5VrbUG/lYptUEptcneTmoRsXcfIvHmSKIpY66keOrwbc77lYJmYDG8uHstZROVWM50pdS7gFuAl4AJI22t9Rml1EZ7tc3AL1xfO2UvqxK8UmoPVoTPEJf57q9dLWhE7t2BCL01mhV7lAh7NX+JCv3kGlS2Bu1HJO9Py7dkpVQB+O/Av9Ran6+3qs+ymv8VrfVerfV2rfX2Ada1WrymkJRM9pGUS2uEya3X/X4EuVdKA7x7mxXnVSKmaZrZXy/RkuCVUgNYcn9Sa/0X9uKzSqlN9uebgDl7+SngatfXrwJmWtm/ILgRqbdOK1KPgonQKwVNX7mf+XKe0W0LrlY1Qhy00opGAfuA17TWX3R99C3gAfv1A8A3Xcv/md2a5g6gmLb8u0Tu2UOkHg9xir2ZaHo8XwYgV1iJXNnayn67nVauivcD/xR4RSn19/ay3wO+ADytlNoNnAQ+bn/2LLALOAq8AzwYZiftGgtexJ4tROjx0MkxYAZKitVtS4wUlpjKFzn646sAWC1oVkZUpDy8QfLx1bTSiuYA/nl1gLt91tfAQ83uL0lE7tlApB4vScg9ShS9UtBUSgNQWOLQ3FTNZ9Cc5IU1MjeEW9wtaETu6UdSMPHSrjx7GPrK/RSPjXHzxhn6Ji4AVtNJsCS/MlI9rEEYJFWzRk9fNSL3dCNSj5e0SB1qpX1obsqK5vOXoFT7/x616aRgkZ7/8TYjck8vErHHS7si9mYiZxOtL8yuZ2yytpW1u8I1SiQvUbxFzwpeSB8i9vhJU9Ru8Io6V1LkCivcvHHGV/Le70ZN2fQy6fvfr0Nc+XeJ3tOFiD1+0pRnd2Pk7G0KOVJYAmCxNByqs1MYyUsU34M5eJF7ehCpx08apW6oJ+WF2fUcsl+vBuTh/bYnefn6pPdsSACRe3oQucdPmuXuZaBUG10vloadSN4dxdfr+NQoku/1KD47Z0SLiNzTgaRj4icN6ZhGIq0nYjNcAVhDB7uXh0Fy8sH0hOBF7p1HxJ4MnRZ7GKII+PSFDeQKK4nuo5dI/9nRIiL3ziNij580RO1xs3p2iMe3vOCkaWBtvtYwBEm+l9M0cuUJiSFiT4Ysib1eZD1QUlX59dX8Jab3f9J5bdI2UfcnFa9rZOZMaaaJpETvnUPkngxZknsY/KLzHVuPATQ9dLDfTaVXo/juOltciNw7h8g9froxJWPI+UjeTACymr/U9PDBQhcLXmg/UpGaDFkVe5SKTxOtV0oDzJRH+cTUQXa+56ecuPdPY9t3L0bx2TxzGiDRe/sRsSdDVuXeDGOT53n3tjM8d/0zHChOc2huimuf+RSVgm4qipeWNV1YySpybz8i92ToJbnvfM9PeWD8+2wdOM++4nXMlEdZmF3f6WJlHrkyhaYRsSdDN4g9avS8/8e/xIHCNu674QcAzJerG1WYTk9hm0y6y+FuVdNrMz6l+kxS/dGaSUn03j5E7snQDXKPipF3pTTAU4dvc5Z7OzyZVE3UdI33ZtNLufiuOZtE7u1D5J4M3SL3KNG7kbW7zfvLb13jTMJd73vSuqYx3XFGCW1BWskkR7fIPQpBgj5+9kqm8kXfz7zj04QVfa9G8Zk4qxp1cpLoPXlE7MnQDe3b45JlX7nfmrYPaoYsaIRI3p9sn1lCWxC5J0PWxd4KRsjeiLyv3M9IYYlH5m7iizd+3fe7QaNMrjSZo+9mMn/lSvSeLCL3ZOhWuYfJvzcS8A+3PwXArQfvI1dYYbWZMWkCBinLcqsa88ShI5w63XmWCbEgck+GbpV7GMJE19P7P8mDJ+9yKlr9xqQJNa1fQDSfpVTN8ohy/poh02eaRO/JIXJPBpF7fYzMzXAFYDWXbHbgMbNf7779JJ8G0buFHkd5evdsEwIRuSeDyD08x89eye7R2aplrUjelMFdjrSMVxOn0L1k9oyT6D0ZRO7J0K1yd0spKP8eVu5ugY8Ulnjw5F01LWlalbwpjylTkOSTFH3cUXo90n3W5aJXrgjNI3JPhm6VexiaadFimkoempvi5o0zgZIPO2dro7LVmwmqVQl7Zd7uJ4TUX9F+beAleo8XEXsydLvYG0XvrTRXXCwNs3XiTR4Y/z5/UN7FAtUDjzU745ObSkFTKWh7PHrrtwTNBpWG/HwzdPcZKDRE5J4M3S73RkSVuzf1UikNMJUvsnN4Fagdl8ZZL+J+jNTd31ueqDD4/reA7htiWK7uHkbkngy9IPd60XsUuedKylfSucIKM+VRTlZKgJWTX2QtfQPRovigG8Fq/hJjk+dZmF1P3+RqVTQP2Z/fNXNnoqRn4kHkngy9IPcg4u5FOl/O8/mZjzjj0owUlsgVVqqi+dX8pYZRvN/nq/lL9E1c4JG7/j+gerAzb0sb85dF5CrvQUTuydArcveL3uMeHsBdsbp56ByHmKr63Ei+UhqwJI8laPf8rm6xe1NA5vsHitO++/frCesn+bRH+C1f6UqpfuAgcFprfa9S6lrga8DlwA+Bf6q1XlZKrQO+CtwGvAXcp7X+eav7F6Ihck8GkXtzBKVnDDPlUR7f8gKnL2xgpjwKWBWw3nVH7DSLEX295pS5wgojhSUemv4eX/jRh6mUBpxUxlql69rvqjfJSLORfbtuDHGclZ8GXnO9/0Pgj7XW08ACsNtevhtY0FpfB/yxvV4kJD3TGq3K3Yx8GPavV+iV35pU5O6WsRG2W+KPzN3EjtEjADXjxI8UlhgpLPHD7U8xNnmevokL9E1cqLu/kcISN2+c4bEjHwhVviQGL3Onfvz+4qKlM1MpdRXwj4A/s98r4NeAb9irPAH8hv36Y/Z77M/vttcX2kAzcm9V2L0g/W78TV6C2m/HLb6gljKnL2zgQ/mjVbl48zeeLzOeL/PI3E012/Lm68Ga2Hs8X2bz0DmgutK2Hu0eoTIu4bf6vP4l4F8DpghXAOe01hX7/Slgs/16M/ALAK11RSlVtNd/071BpdQeYA/AUC6jNRspI6zc2yEr7z4GS6uJ7zMJWj1WcbWrTnIkRF+p25fk0qT//1suwpyp7vRMkNwNe9++kx2jRzjAtDNGjcmfPzD+ff7g57sYz5erIn/3tk1Ofzxf5hNTB9k9OsuTf3dHpPKHSdkkhVvyOkLz/6YFr5S6F5jTWv9AKbXTLPZZVYf4bG2B1nuBvQCjQ5PO55KeaY5Gcu90BJpF4Uc5Zkl3kAmz/bA3gUbbWhmxJLc8UWFs8jzFY2M161RJu44IzXqr+UsN5W74UP6oMz7N/qU+TgyNc+26eQCm8kUnR+/FXWH73PXPcM9r9/LYkfqTCNUjaCjiNNJKBP9+4KNKqV3AELAeK6LfoJTK2VH8VcCMvf4p4GrglFIqB4wCb7ew/5bwE99gseKzZnapJ/dOiz0IU660ij7McUtbr8dWyuOOHFfsDkJ95X4WS8P83of/p1NJCdS0SfeTvXtZ38SFhjlik5Y5fWEDx1fWsyVnnRc7h1fZOfwKYMneWXfCGqgMqIrap/JFdowe4cGTdzFfzvtG+lHIiuSbFrzW+nPA5wDsCP5faa1/Wyn1deA3sVrSPAB80/7Kt+z3L9qf/5XWOvHEVpTcc9C6WRR/0G9Jq9i9pFH09Y5d2qTeKo06L62eHeLExfGqDkh+LVeM9L1NFnOFFbZOvMl8eS2SdkvXVIQaNg+dc3q1etk5vMoxuxJ295ZZ7uHemnU2D53jxMXxwCi/GbIg+STazH0W+JpS6lHgR8A+e/k+4L8ppY5iRe73J7BvIP6mgN7tpV34fr8/K2L34i53p2TfC2KvV5EXVMH41OHbePiWb/PYkQ/U9DI1+LU/78MS+O1XvMHp/Frzx/F8mfly3om4H9/yAvuKkwBsG5yrW/4P5Y+yJVdgX3GyZsLuHaNH2D06yz2vVYs/V1gJXckaRNolH4sJtdb7gf326+PAe33WuQB8vJnth82/t6uNt3s/aZO99xhkVex+dEL2fscvq1KP2hqjXsuR1fwl+oDHjnyAH25/ilsP3sdCHVn65dlffusaPjF1kKfL251l7qh9X3GS3aOznKyUOL6yvub7brbkCpyslNg2OMcB1jovbR46x+7RWaeVTb30TJQKYjedrHxtRFf0eulk5x2z7zSIvpvl7mW50Jeo5IOOXZbk3krzujDNAiulARaBe167ly/e+HWOTW90cvJhK04PFK1WMScujnP6woaaz09WSmzJFZzcez3MTWDH6BFOXFyrgN1XnPTddtykMZpPteB1f4gKrZT0zOy06N3HoZvF7iapiN57/LIi9bg6yERp810pDXCcK9k6fZ7vLN5oVWwWliJVYrrTL0bEm4fOsW1wrqpitREmR79zeJb9S3POMpPmmcoXq3L+EE+axk3aJJ8OOzZBWsTupRPpm26SeyOZBjX5a1X2WU3FxD0IVrMTdHzqyP1M5YvcvHGGQ3NTTguWING7e6R+Z/FG9lz+Is8D166bZ9vgHDuHV53ovRncFbLetI2XXGGF1RbHlneTJsmn05Iustz+vR1RvdlHFsXejEC93/ETfhTZZzUVk8TohmHk7je8b66wwnw5z3w5zw+3P8WD3MVMeZT5ct5qZeORvJG/uzL0+fJ1Nfn2ZuXuZefwKox/n53DqzwydBPPnryhpkxmwLJm8/Be0iL51Avej3ZG782K0y2WJESf5ag9Tnn6bcst/TR1SoqDpIatjasr/oMn72LH6BGeLm+vGTdmsTTsDC/gbeli0jRh8+1R2Tm8yv6lPk5f2MDNG2eYyVstd0zKZhFijeIhHZWv2TID7ZF7HGOn+I3Bsjyai6X87qg9K3Jv55yUYefA7ORcmVFJckzyOMdZmSmPcuLiuDOcAOCMF7Nj6zG+eOPXuf2KN6q+YypDzeQeSeFO25gbzK4th/nijV9npLDkjC3f6lyvXto9jo2bTEXw7ZJ7ktsdLK02HdE3itrrSSrJMUvqkQZxBo2CONCCT9o5DniSk020Kh/36I8m9fLyW9fw6PWvcOLiGzWtV44tb+SDI69ybN1GTlwcB6w27BBfSiaI/Ut9zqiUJy6O8/iWF3hk7ib+4Oe7nN+y6uqYFVe6BjqXssmM4JOWe7si4er9hKuQDRJ7FHmGyV3HTSfkHqbDTqWg7Q441nFt5sJz7ycp2Sc9i1BccvcylS/yyNxNVsVp+TpnUDAzgqMVSc9VpWXagTW8gTWWzb6ilU4ydQUmJ286ZvWV+yNF8mFuBq2mbMz3dQRVZUbwSdHJFEeQ7OutG5c03duJW/btFHtYCa74dJXnbM75rJXoKgnZpzlqD8vz5ev4UP6o0yrGjBkD1LxvFycrpaqbjhfTbNIt+jA0uhm4bwBRRN/yTbilb7eJpKL3JOUeVXLLI9aJVFVB2CZRmv3EIfp2lTmKAP0ukq0Tb/LzY1dXrRPHI7QpV7OiT3vUbp5+GnVkOn1hAx8cebWq0tQ7lkzQ2DJJsiVXcFJD4N+z1d023j3UQljZ+1HT8qik2nKjTbXgw3R0apbEcu0tjty3Yn9/aXKVXKn2Lp9k7rdV0bdD7q0K0Fxo8+U8yxMVBs+uXQJx5klXRqL/X2VF7mOT5wPbt3tbx6SRa9fNN9WzNWpUX49GwyrXeyJoy3jw7SKJ6D0Jucc1JCtYF6J7ImG3dNqR+40qerN+GEG1UuZmBOiW2lru3RrzZP/seudCcs/DGafkDfV+dzPT30Uto3fbzbQUMXLfteUwL791DbDWzHA8X+a5659xeo1CZyL0MJhKXYBDc1O+69Tr4RpHVO/exuqENbLm68c2tbRNP1Iv+Lipl8tud+RaT1hh/pObTQeEF6Wqe0yiiN1v32HLHUdk22j2ILfow0o+WkTsv71mo2r39xqV1V25HAXvXKkmLDp9YQO3X/EGL791TVWbdjM4WCdy61EwHancqRo/wgxjsJq/FEnIfkMqm9ZHzeb/65EZwQdF3VG6pS8X+hq2i4Zook9C7pWCdiYOrjDU+AKOkA6IKuOVEcXAon/dQKviDVNu74QTED56NRNU+LFj9AgHCttqOreEaR7XjJS9TxJuWm2OFyT7ZsTuJyAvM+VR/u3UXwLUpDpOVkrsHG5Pq5hWMIObuTtjBU33F0byUF/IQcc1V1hxbpLHubLmO61KPtWC1/3WyVp3PO6Q3dIbyb1q3ZCiXx5RvpKLIq0gnJMqf4kw/dEaybKVoWJXCvDOJrtcBU0uoP14M1HvSsH6nl/ZzRRxjbbht996cjcR00hhieLZ2qEwTGeXXEn5CjMK3jKs5i/x7m1neP3YJt/JMBrJvpGs3ZWgQTMt+VFPQH7sffvOqmaQzQwO1il2Dq/yxLx1Y2pUZ7BYGm4o+XqRd6Mb5taJN52OX1sn3uT10qaqz1uN5lMteIg2VsjySD+FM7UHtLTJOjhRJegXvZp9121vXSd14ictr6DcM95Y04+tnVz1JOMnyyBJBsk4aPvuOTSDxuyoF2HXL7dmpbAWPUed19MddQ/YKZYgEY5Nngdg9+gsj1EbJbkvyOU8rG6zLt5GF5i3nEH7N8LMFVaoEDzNXdjt+ZXbnDtGFvVyxvUE5Cd3M1676X3qbgaZBcxYN5uHztU8fZho3j3ipDNoWoPtuo/VyOR5xvNljp+9MjA0c4/H8+hGa+rBBy9sYH4yYLx6902mL0L7/NBrdoCg2uJ6s70vjPSTn9FONL/w7n7f9bzyDRL2O5s0KyOK/Ix1UMtTqm7+0xv5XnZm7fN3NtX+x3i7RpsIb76c5/Yr3mAqX+QA23wl4yeBSkGzNAnDs30sTa76rucupzdC9UtRmPL1TVxgtLBE8dhY3fUqBc3wbF/VNuuV2f3bf+XOn7L/x79UE926v+cnu+UJq6PY6jbrQlv1RFzmAnxo+ntOG2hrTJJydUcXz/e2TrzJca7E3Q3N74bgvum5K3Pd65tJMm6/4g1rn1SPf+K9uZjv1psKz/s9sOQxlS8yP5lnYXZ91e93i8KdVze4P3NPVg3W8TJjrW8bnHM6KKU9Yndj8u/mBmVwT+VnZpZyvx/Pl63JSWa2151m0GD+j+utM54vs3noXFWdRb2Ukang/tJA4zSaId2C71uLlt2CBUscRp7vbFqrFFspaM69GyoF632uVC0yq/mhYmlSs/5IHysja8uMOLxyXJpcZWnSEtyq/Uhv1jcyM+u7PwM498sVfvu9f8uTf3eHc7GapnnLE5Wqix+sC+v2K97g0eutu/rJSom7j/+OE/HlCiusnh1iNX+J5bxHHq7XP/n0V7j2mU85PfLM5+5HvtX8JZYnrBPHiKCv3O/Isq/cb/1m1wQON2+c4UBpmEppgOV8bY7SbLe87RI732PJump/+TXZuL9nZLN56Jz1uf07+yYuWI+/EyvOyISmPG4ZrZYGGJs87wxXuwhVQ9aa1weK0zy+5QUAHt/ygjMJs9m2ifDNhfan01/jN8q7qyO4wlpZ+uzf0Tdxgfy2JSdycx+zEVe5xvNlrl0370iDibW22F7ZjhSWeGj6e3zhRx9mpLDEwux6p4mie5t+g3htHjrHTH6U8W3lKtGY8dofmv4ejx35gFNeZ4JqO2Xw8lvXMF/OWzfB8qiz3d2js8AsWcUMQ7x14DzPu5a7hzAwlchg1TFsHjrHtevm2T06aw2/YE8zOJUvMpMftaYevLC2bPPQOR7d+IqzzLQwMlMGetNC5unnO3ZPX2d7+bXjPlO29vPoxlfYmws3mQqkXPCwFlmvRc5rMndHxEuTqwzP9gVGln5R37lftg5Uo8dv38f4Us5ZXt62th3vZwAfHHmVJ7nD+b4RqNmWe55KwHlkM5jJiRc8QjRiASvyNK/7XOtQWKn63AjJvY3xfJkF1jtjcbjFZKKIkcISu7Ycdl4v2AJzT7rsvglVSgNO13T3dr25TGdfnmFl/SaOGM+Xq94bGbvFvHnoHIeYYuvEm0B1M775ct4pk8GI0GzHrGck93z5OistsZEamZrX5mZibgqm7Gab7vJP5YtWM70pnCcJc4Nxr2fkaia2BpwnOy/u75rfd+26ebiiuhLUHR1uG5xz3u/Yeszpsm++ezq/wZGLkZY36s0q5snjQ/mjHF9Z7wyZcGx5I0DVOWJee+eENRKeyhfZc/mLfH7mI87x+uDIqzXbAapuvgazrnn9xIX3+7bTn8oXmzr+SuvOjXTWiPyVV+sb/tHv1iyvl6IxjL1uRareFI3BL09dL93iflqo2k6DSjh3TjwoRWMwsn/4lm87y05cHOepw7f5VpjVS3f86p2v8jcv3thwXZNKAWqeQtzrmrKZSNKUxZ2WcGMqKN3b9G47TAVkUHm8uJ+AoPbpAKpvUo9ufIV9xUnnkdstYvcN0NSDeJ9SvPt1L/emTMxycwM2QjXbDUrDeI+33zb9JrUeKSw50X1NiqYB5neaG6bB3JxMpGsmuc4aJgdvZG6aSpp2/QZ3YGDwS9EAVUGQYdeWwzx78oa664zny9x+xRuO5L+zeKPz5BT0vV1bDvOl/+VF3jlyplaCPqRa8IWxq/X1Hw0neMPgoq5pTVPa1B+q/XVQHt6khwwmTdQIv/34SR6qbxQXb34HwJFL37HhqhRUI9x5/6BKVu8+nfVDVLIauQRVgEatZHUL250GM4Tt6dcoBw5w3XtOAVbq5VNH7me+nKd4bAzwr3AM2xolbKVo38QFV+U5Nb81aJtRKlnH7Eo+03GmpgwhW3n43RR2bD1m/Tt6pGqCjqxUspp897HljVXj0bhz8H5PSRA8O5UbJ9XlqdsJWgescxFwzsd6+6qUBpj9D1/m4vHToSSU+hSNH35tsv3EbiicuUSJxs2M/ITs11QyP6PrtqSp11LnsjP1W+AATo59vpCnUhog77rQg54YzHLvvgcWYWCx8T692/EK2V2vEEXs7s+CJG+i/YFF4Mhl1v7r3Ji8ZagZzqGkWCnUzjwE8PqxTYxNnuf58nVVcodagedKioFjA6yz33vblddr4RP0lFIpDcAEdVvm+G03aHvesq/mL7FYGq4RRNC+gp4ETFm9kj80N+WkjmCW58vX2a/XUg1plr3JwT8x/35nmZG7n9jNcfRrJul3AzRPTMXyWE3LJrMdk2pdLAxz3w0/4PnydYCVhml0U+4DqITvSJZqwatLa9IO7OhUR+xuCmcuRWoL36gN/OCiZnCxuY5OA4vh2qUc5cGpAAAb9ElEQVQvlobrRo1usTVqex92n/W3rTAZ/mY6OQXdAPzK7r0xhWn77ve5nxAXS8McKE4HRkne9u9h9xm0LUOloOkr9zvRe9B6UbZX891Szhklc5DGkb8hSPR+kp8pj/LA+Pd5ZO4mJ1f8xIX3s2P0iD0MQLpTN6YlDVTLvV7UHGZ5X7m/qqLcfe36DQZeKQ3w1OHb2DrxJlP5YuCwCa10dkq14N00M5Gy/zbqD7sbdbiCwUUdu+RzJUWF/tBTiIXtxWrWCx3N2+v7HRNzc2ulN2uYcpvj1Ixc60ne/UjuJoxoo6TL3Dj1HbOX1TwVNEO9pxgvrYjeT/LuzkJutuQKmUjb7Bg9UlXJHVXuXhpJOKiepVIaYL6QZypfDP3UFYXMCD4uBkurLBf6Yh0DvRXJg79wzcngHu0w6PvN7tcQ1Dcg6lNM1BtHWKLemLx40xtVaRLPOhD+ZlKvUj78KKDN95QNU06/dcLIvqYDFmtphk9MHXSa/Bnc49FAbauTNGEm/tg9OsutB+9rSe5RJBxU97FYGmYmPxqp53FYek7wsCb5WLdpyzAu0Rux+6YKYh5FMqrYvZgbXNLT2EVNM0F17t95Mspfqsq3NiP3oH3VLAuROgP/p5SoaalGZVsJUXcQSClHpdzPIvDYkQ8A1RWBx7mSmYm1dtsHmGbr1F+msqXN/qU+vrN4I6cvbGha7q1KuEr25X6Onr0qkQmyUy14dWmVwWIlkSGDk5A8xCP6gUVV1XnL/VnSNPtk0+xTTFTiiOZXJ1ZYLA3XPB3FOWdmHE8pcc/hWa+iOwzWDXIosNv+fDlf1YknrePSGLlDbf+LRsQVXbcywJwK35E13YI3ZE3y0EQU7KljKJxZex33dH01+44pXdXKzS0qUUTvFZtfTjnucrXy/SQn/mhV8oDTw9gPd2/OY8sb2Tpw1MnH71/qY+vAeSeq975vB/uX+qo6Enk7z4F/5Wkc+Em93k08jhmfMiH4JGnUSqcd+3be+0y8vTyac9YbLMUr+6Qm3m5XNA+1HdYC13OJra/cTwWrlYn787jK0SqtPqU03H4LkneG6Ahxk9w9Osu+ojXa5BOsDQewJbc2H2u7o/ydw6scW6ZqsDF3FB9HHrxRdN5MHU/T/19NfasDJBXFO9tPMJr37sd57SP0mvVd6xjZ+1USx9X8My7aGc0bGnVgc18wfrNlxbW/uEhS9M22BHITJHm/ZpRgD80wClsHjnJs+Tpn+c7h9oxt4x7Ua8/lL3J8ZT1PsNYe3ki+UUe+Zom7ficMmRF8O0gymo8qdt9t2Dc5v3K2S9xR6YTovbhFvPZ00Xi4i6BttJuk0zatYCTvHUnRNKN0D1QG1tAAe+3hAdzy3zY4l3i6ZufwqnPTMYOK7Rg9womhcZ4t31DV+SxNcveiIjzwZErwSUfxzn5cMm5F9mFSMJG3aW/DHc1ngXaKPkzzTi/taAXUCklF83Hk5N2YQbEePHmX09fAPZDZIaacMeUN3uGHk2L/Up9zUzFjzzw2Z7UIGs+XKZatXs1plntUMiV4aJ/knf15JO0n1EadsOIQu982g6L5NOM3zESc2/T9POD/J+gJqJNPG41IQvRxpGsMZghmt9S9lZiHmKoa2hissWFMqmb/Ul/snaTMVILfGTrnDALmLtfC7Hr66C65QwYFD+2XfNW+I/SoTULs3u2b45ClaN7QrFTDpKPC/D8FPamlIa3UiKRE30jyfp2kKqUBxu3u9o/M3VTV5d6vCaIZltmdvvlQ/ij7l2pHzYwLM2bOy29d41umODsXGTotd2hR8EqpDcCfAf8Q0MA/B34GPAW8C/g58Amt9YJSSgFfBnYB7wCf1Fr/sNE+BooXWBmtHXHPnapIG0mL3W9fWYzm3cRRh9DKcBb16jWyIHqIR/bNpGxyhRU+MXXQEaghSvtyM4SvyY0fGz3i9IZtJpp3N8HcV5ysGpbAi+nRHFf0ngaxG1o1wZeBb2utfwm4GXgNeBj4rtZ6Gviu/R7gI8C0/bcH+JNGG1eXQkRhbZRpPQaLFeevU/t3Xscwbk9WGCytOn9xbq9q2aJObSW2G2uAthja4kcQlBkz35rpCY6fvdJ3NEsvbtHuufxFvrN4IweK006O/EBx2m5Hfz5oEzWcrJSqhgN+vnxdVcuZoPGH4iRNcocWInil1HrgV4FPAmitl4FlpdTHgJ32ak8A+4HPAh8DvqqtAej/Vim1QSm1SWt9hhbpaMomJTcYqE3ZQDaj+TAkfRPLakRvCDvncOD3Q0Typonk7Ve8wT2v3VszMYp3PT82D51j79t3OpG/dzq7KBWvZpTIB0/e5WwbrPTPiYvjvoIPO5hYGNImd2gtRbMVmAceV0rdDPwA+DQwYaSttT6jlNpor78Z+IXr+6fsZVWCV0rtwYrwGcpZZ2VQmsaNt714kqRJ6l68N7tuE327n0786jayJHpD1EluoL7k+8r9UFhhx9ZjvPzWNYFyB//ZtcCSuZm31GBem6kN9xWt9vLbBucapmp2Dq86g52B1QzTPBE8uvEV7nnrGmeSjSjpozCkUe7QmuBzwK3Av9Bav6SU+jJr6Rg//I5Azdmjtd4L7AUYHZps6rk4CdmnWepe/J5osiz6Tqecgiqws9Lyph5+4vcbD8dP9Fsn3qyaerAephLTuYrsdvNBFbLzhTyf5yPO+xND4+wcrp6r2M3+pT6OLW9k9+gsB4rTVTeNp8vbOXHxDWeeXYO3zH7zOYchrXKH1nLwp4BTWuuX7PffwBL+WaXUJgD73znX+le7vn8VUN0gNgHcufGwkvZ+J0tyNwSVudOyjEKcufVWaVSWrOTpw+CXy/dKrG/iArdf8Yav3PvK/TV/3s+Kx8Y4cHwbgG/OfrE0XCX/0xc2VOXT3exf6uOJ+fdzoDjNgyfv4tDcFMfPXlmV5z99YQN7Ln8x2oEIQZrlDi1E8FrrWaXUL5RS/0Br/TPgbuCw/fcA8AX732/aX/kW8DtKqa8B7wOKceTfo5JFWTdLUN1EXB25kiAtQg+iUXPUtEf1QZ28gvAbznh5osLv3fJtHn3hH9fMYuSmXjRcKWhWzw6x0GBMG/fgZVaFq5WTN5OKAM4E2qbtvblZmBvHSGGJ+XKeT5XvdybOBpyp85oh7WI3tJq/+BfAk0qpQeA48CDWU8HTSqndwEng4/a6z2I1kTyK1UzywSg7CpOHF2ppVAGdhtRN2qXuJWyfg6gybbo8LT45hCln9bSNOUfufoRJc5hBy8zAb2FG93y+bA1cZgYtO1CcZvPQOR7d+IrTDDKo3b2R/IHitNOk88nZOxru04+syB1aFLzW+u+B7T4f3e2zrgYeamV/QnOEaWUUpsdubOXJmND9aLZjWVbSOEFPIpboFQOlgZZ7vroncm80OuWjG1/hkbmbAHh6Zjvz5bzTWeqet67h9iveCJzTFNbEP5MfZdv4HCcujjM2ed6ZJNvQKA/fSbmbm2zXjQcvtE7UpqRxCr8bhO5HFnsPN4N3+OekBj8LkvzmoXPsK046FaRm0nITmY/ny3xw5FWe5Yaa7Xl5vbSJz5Q/zq4thwHrySFMU8lOiD2OsZFE8D1EK/0FulXSrZKGFFc78DYNNZE8tD6GjXtCaj/J77n8RT4/Y7Wo8fZENXn2z5Q/zmJpOJSsF0vDPHvyBnZtOcxTh29ruH7Sck9ykLtMCV7y8K3TyU5h3UwvRvMmko9jAhEv7uGH9759p5N+8cuxV0oDFM9aXvD7H3BPcG3WXwSePXkDWyfe5DhXshpQnxBF7mkcjbT7z0ihhl5qSdROeuUpx52fd+YRjjHKrZQGHJF7e7Z61zNjuOdKyvcPapttuvfx3PXPVN1MGk3A7m5C6v1LI5kT/EDRfy5IIRoi+WToFcn7EXcqYzxfZsfoESf3blIw5g9w5B6EW/QGI/rVs0NM7/8kD01/ryrKHygp57dkQeL1yJzghfgQySdDL0jeL4qH6JL3S8+AFWF/YuqgM4iZX349yhC/fqIHawLxR1/4x+QKKwzP9tWIPeuI4HsckXwy9ILkg3BHwGHxyjpXWHE6JE3li4GVp1GHFgiK6NcdugzoHrEbUl/b1r9Q5tJYdc25VLbGi1S8JkO3V7z6Vbi6aaXy1eTFzdADXlqdoMObaw8j9ah9GNLQkzndV3UlQot+oSVE8snQ7ZJvRLMTiIAVuR+am6ppORPX7EvudIwf7eghnDSZPfOksjV+JF2TDGkaNC1uwkgwbLrGLe7F0rAzJEHQOs3OwOStRPWS5MBxZtvtGpwus4IXkiGro2dmgW6VvKFemiNqTn6ksMTu0dlEx20Pkns7SVr2mRa8RPHJIZJPhm6XfD3CSN5E6OP5Mve8di9AVZPIVvadNrn77T9u4Wda8EKyiOSTQSRfn60Tb/Lc9c84wxJ4x5SH8OkZvxY9aZS7H3EIP/OClyg+WUTyydCtkg/TGqWR5OfLeU5WSjw0/b3myxGhqWYa5e6HEb2KcOpkXvBC8ojkk6FbJR8FbyRuepQ+X76Ox458wH8S7wbD+dYTu/cGlBW5N0smBN+/UK77uUTxySOST4ZukHwzkvST8Gr+ErnCCoulYQ4UpyNVsIaJ2HtN7pARwQvpQCSfDN3cjLIeQUI2k3mH3UaYVEwvyh26SPASxbcHaUaZHN0i+Shd/Y2c3YN9fWLqYM247waTnmlmOIReJNWC15ei9WQVybcPkXwydIvko+DOqT98y7c5cXEcqJ2RyS33KPRq9A4pF7yQbkTyydCTki+ssPM9Pw3+PCa59xpdJ3iJ4tuLSD4Zsi75ZsR6aG6Kp2e28+jGV7h540zN1H1xpGR6KXqHLhS80H4kL58MvVT5WikNsDC7ntePbeLBk3fx+JYX+NP3fZWxyfPkmsy393r0DmkfTbJJZDjhziAjUiZDVkek9BtCOAgz8baJ2h+Zu4kn/+4OAAab3LeXXoveoYsjeEnVdAaJ5JOhmyN576xOO0aP8NTh2wBL/NJapnkyI/hGnZ38EMl3BknZJEM3pmz8xor/wo8+HDiDUxgkel8jM4IXsodIPhmyJPl6eXCv3PvK/Tx8y7cZKSz5DjDW6v56ka4XvETxnUWi+WToxmh+NX/JmYfVkIswI1RSMzNlma4XPIjk04BIPhmyIPmwUXWusMJz1z/Dwuz6ZAvUQ/SE4EEknwYkmk+GNETzjaLkepLPlZQzVMGtB++rWh4WSc340zOCB5F8WhDRJ0OnJR8Fv7TLSGHJGUHSLfdGw//Wk3svp2egxwQvpAsRffykIZoPom4UX1hh15bDQPip+SRqb0ymBN9MU0kvEsWnD5F8/GRR8gD33fCDUKmZMHLv9egdurQnayOkp2v6cEteesPGg5F8GnvBDrhax1QKmtXSAM+evIGF2fUNe65K5B6elv7nlVK/q5R6VSn1E6XUnyulhpRS1yqlXlJKHVFKPaWUGrTXXWe/P2p//q44fkCzSCSfXiSij5d2RfNhI2Y/QecKK76tZ8JMmN1KWbqdpgWvlNoM/F/Adq31PwT6gfuBPwT+WGs9DSwAu+2v7AYWtNbXAX9sr9dRRPLpxeTnRfbxkNbcvBmm4OFbvk2usBKYf29UmSr40+qzWw4YVkrlgMuAM8CvAd+wP38C+A379cfs99if362U6vggEyL59COij4+0iN4t69FtC1UTbBvpm+g9qtglel+jacFrrU8DfwScxBJ7EfgBcE5rba7GU8Bm+/Vm4Bf2dyv2+ld4t6uU2qOUOqiUOrjCxZr9xlHR6kUknw1E9PGRlOijyvXYfV/h5o0zjOfLVdF7s3IXqmklRTOGFZVfC0wBeeAjPqua/3G/aL3mbNBa79Vab9dabx9gXbPFi4xIPjtI+iY+Oh3Rb3vqf+dvXrwRsCJ50+Gp2ZSMRO/VtJKi+SBwQms9r7VeAf4C+BVgg52yAbgKmLFfnwKuBrA/HwXebrQTvVBsoYjREMlnDxF9PHRa9GaS7VxhheHZ5rQkcq+lFcGfBO5QSl1m59LvBg4Dfw38pr3OA8A37dffst9jf/5XWuvU/Y+I5LOJRPXxEIfoo4jWDFPwxRu/TvHYGKtnpflynLSSg38Jq7L0h8Ar9rb2Ap8FPqOUOoqVY99nf2UfcIW9/DPAwy2UO1EGihdE9BlGZN86rYq+keS9Mz09+F2rsV2U8Wei7K9XaalHidb688DnPYuPA+/1WfcC8PFW9mfoXyhzaSwfx6bqIh2iso9X8tKJKhpuySfVYSpXWGH17JAjd2k1Ex/p6+KWMiSS7y7c0b1E+NGIGtWHEW+loNk68eaa3CNG8CL3+ojgQyCS715E+NGJIvp6AjYyNxWsIvf4kefVkBjJS8qmuwmSvKR2agmbvhlc1CyP+Mu7b+ICC7PryUeQe6+LXV0Kv66ctRGRvHxv0ii67/UbgDei9wrfSNkr+tWzQ1VphEb5916UeyuV3b19VjaJSF7wEia900s3gaDo3kTzA4trLWnCtJzpJbHH2R8hs2dcu1rSBCEpGyEqacjxd+Im45W9kfXgIgws1k/t9AJJdjDLrODTgoheyBJx3WSavVF4ZTZYSud49UnR7t7CIviYkLSN0EvEWRndKH+fVdIwaqcIPkYkmhd6nXpPCGHlX0+MaZN/GiRej0wLvtN5+CAkmheEWvzkHzXib1WoNa17Ui7oVsm04NOMRPOC0Jh2DyXR7UL3kq7nnQDaOWRw3MjAZYIQHulVHC8SwbcJiegFIRpuyfdSH4I4yUQEX48kpvBLEonoBSE6Etk3R+oFf2lhodNFSAQRvSA0h8g+PPLc02Hckpf0jSBEQ9I49ZEjkiJE9kKrxP1UmKXzUGRfixyFlCKVsoKbTqXz6u03zeemkX2vi74rfn1aOzzFgUT13U9W62KCyp2m87TXRd+bvzqjiOyzS1Yl3gx+v7XT52uvpm9655d2Gd6LqNMXUK/TSwJvhjSdr70U1Xf/L+wRJLpvHyLz1knD+doLou+aX9bNefiopPEROUuIwNtLp2XfzaLvvl8k+JKFCrF2IQJPL51sPdaNou+eXyI0RTeKXwSefToZ1XeT6LP/C1xImiY+okoyiYtQRC1A56L6bhB9dksupAqRsZA0nRY9ZE/2qR9sTBAEwU0nB+rL2gBnmRF8lif9EAQhfjol+iyNZJkZwYcla+PDC4LQGiL6YLpO8IIg9CYi+lpE8IIgdBUi+jVE8IIgdCUi+i4VvOThBUEwdLLFTadF31DwSqn/qpSaU0r9xLXscqXU80qpI/a/Y/ZypZT6z0qpo0qpHyulbnV95wF7/SNKqQeiFLJb52UVBKE9dLppZadEHyaC/3+AD3uWPQx8V2s9DXzXfg/wEWDa/tsD/AlYNwTg88D7gPcCnzc3haSQKF4QBC+d7JDXCdE3FLzW+m+Atz2LPwY8Yb9+AvgN1/Kvaou/BTYopTYB9wDPa63f1lovAM9Te9MQBEFInE5G89Be0Tebg5/QWp8BsP/daC/fDPzCtd4pe1nQ8hqUUnuUUgeVUgdXuNhk8QRBEOrT6eE12iH6uCtZlc8yXWd57UKt92qtt2uttw+wLtbCCYIguOl0NA/Jir5ZwZ+1Uy/Y/87Zy08BV7vWuwqYqbM8USQPLwhCGDoteUhG9M0K/luAaQnzAPBN1/J/ZremuQMo2imc54BfV0qN2ZWrv24vEwRBSAVpkDzEO6BZw7EvlVJ/DuwErlRKncJqDfMF4Gml1G7gJPBxe/VngV3AUeAd4EEArfXbSql/D7xsr/fvtNbeituG6IUiamw06tcEQRBC0ckZpdzENRa90to3FZ4KlFKLwM86XY6QXAm82elChCAr5YTslDUr5YTslDUr5YT2l/UarfV4mBXTPnr9z7TW2ztdiDAopQ5moaxZKSdkp6xZKSdkp6xZKSeku6xdOVSBIAiCIIIXBEHoWtIu+L2dLkAEslLWrJQTslPWrJQTslPWrJQTUlzWVFeyCoIgCM2T9gheEARBaBIRvCAIQpeSWsErpT6slPqZPbb8w42/kWhZrlZK/bVS6jWl1KtKqU/byyOPi9+m8vYrpX6klHrGfn+tUuolu5xPKaUG7eXr7PdH7c/f1eZyblBKfUMp9VP72N6Z4mP6u/b//U+UUn+ulBpKw3FNw3wNLZb1P9n//z9WSv0PpdQG12efs8v6M6XUPa7librBr5yuz/6VUkorpa6033f0mDZEa526P6AfOAZsBQaBQ8ANHSzPJuBW+/UI8DpwA/AfgYft5Q8Df2i/3gX8JdYga3cAL7W5vJ8B/l/gGfv908D99uuvAP+H/fr/BL5iv74feKrN5XwC+N/s14PAhjQeU6yRT08Aw67j+ck0HFfgV4FbgZ+4lkU6hsDlwHH73zH79VibyvrrQM5+/Yeust5gX/frgGttH/S3ww1+5bSXX401xMobwJVpOKYNf0u7dxjyAN8JPOd6/zngc50ul6s83wQ+hNXLdpO9bBNWxyyA/wL8lmt9Z702lO0qrElYfg14xj7x3nRdRM6xtU/WO+3XOXs91aZyrrelqTzL03hMzXDXl9vH6RmsOQ5ScVyBd3mkGekYAr8F/BfX8qr1kiyr57N/Ajxpv6665s0xbZcb/MoJfAO4Gfg5a4Lv+DGt95fWFE3o8ePbjf24fQvwEtHHxW8HXwL+NbBqv78COKe1NiMYucvilNP+vGiv3w62AvPA43Y66c+UUnlSeEy11qeBP8Iad+kM1nH6Aek8rpDgfA0J88+xomFIWVmVUh8FTmutD3k+SlU5vaRV8KHHj28nSqkC8N+Bf6m1Pl9vVZ9liZdfKXUvMKe1/kHIsnTyOOewHoP/RGt9C1BmbepHPzpWVjuH/TGsVMEUkMeanjKoPKk8f4lhvoakUEr9PlABnjSLfFbrSFmVUpcBvw/8G7+PA8rT8WMK6RV8R8aPr4dSagBL7k9qrf/CXhx1XPykeT/wUaXUz4GvYaVpvoQ1daIZd8hdFqec9uej1E7PmBSngFNa65fs99/AEn7ajinAB4ETWut5rfUK8BfAr5DO4woZma/BYFdA3gv8trbzGXXK1ImybsO6uR+yr62rgB8qpSZTVs4a0ir4l4Fpu5XCIFZF1bc6VRillAL2Aa9prb/o+ijquPiJorX+nNb6Kq31u7CO2V9prX8b+GvgNwPKacr/m/b6bYkytNazwC+UUv/AXnQ3cJiUHVObk8AdSqnL7HPBlDV1x9Vn/6mer0Ep9WHgs8BHtdbveH7D/XaLpGuBaeDv6IAbtNavaK03aq3fZV9bp7AaXcySwmPqLXwq/7Bqp1/HqjH//Q6XZQfW49WPgb+3/3Zh5VW/Cxyx/73cXl8Bj9llfwXY3oEy72StFc1WrIvjKPB1YJ29fMh+f9T+fGuby/jLwEH7uP5PrNYGqTymwL8Ffgr8BPhvWK07On5cgT/HqhdYwRLP7maOIVb++6j992Aby3oUK1dtrquvuNb/fbusPwM+4lqeqBv8yun5/OesVbJ29Jg2+pOhCgRBELqUtKZoBEEQhBYRwQuCIHQpInhBEIQuRQQvCILQpYjgBUEQuhQRvCAIQpcighcEQehS/n8tL2lSp4TdoAAAAABJRU5ErkJggg==\\n\",\n      \"text/plain\": [\n       \"<Figure size 432x288 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {\n      \"needs_background\": \"light\"\n     },\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"create_fractal(-2.0, -1.7, -0.1, 0.1, image, 20) \\n\",\n    \"imshow(image)\\n\",\n    \"show()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Faster Execution with Numba\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"[Numba](https://github.com/numba/numba) is a Numpy-aware dynamic Python compiler based on the popular LLVM compiler infrastructure. \\n\",\n    \"\\n\",\n    \"Numba is an Open Source NumPy-aware optimizing compiler for Python sponsored by Continuum Analytics, Inc. It uses the remarkable compiler infrastructure to compile Python syntax to machine code. It is aware of NumPy arrays as typed memory regions and so can speed-up code using NumPy arrays, such as our Mandelbrot functions.\\n\",\n    \"\\n\",\n    \"The simplest way to use Numba is to decorate the functions you want to compile with @autojit. Numba will compile them for the CPU (if it can resolve the types used).\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"from numba import autojit\\n\",\n    \"\\n\",\n    \"@autojit\\n\",\n    \"def mandel(x, y, max_iters):\\n\",\n    \"  \\\"\\\"\\\"\\n\",\n    \"    Given the real and imaginary parts of a complex number,\\n\",\n    \"    determine if it is a candidate for membership in the Mandelbrot\\n\",\n    \"    set given a fixed number of iterations.\\n\",\n    \"  \\\"\\\"\\\"\\n\",\n    \"  c = complex(x, y)\\n\",\n    \"  z = 0.0j\\n\",\n    \"  for i in range(max_iters):\\n\",\n    \"    z = z*z + c\\n\",\n    \"    if (z.real*z.real + z.imag*z.imag) >= 4:\\n\",\n    \"      return i\\n\",\n    \"\\n\",\n    \"  return max_iters\\n\",\n    \"\\n\",\n    \"@autojit\\n\",\n    \"def create_fractal(min_x, max_x, min_y, max_y, image, iters):\\n\",\n    \"  height = image.shape[0]\\n\",\n    \"  width = image.shape[1]\\n\",\n    \"\\n\",\n    \"  pixel_size_x = (max_x - min_x) / width\\n\",\n    \"  pixel_size_y = (max_y - min_y) / height\\n\",\n    \"    \\n\",\n    \"  for x in range(width):\\n\",\n    \"    real = min_x + x * pixel_size_x\\n\",\n    \"    for y in range(height):\\n\",\n    \"      imag = min_y + y * pixel_size_y\\n\",\n    \"      color = mandel(real, imag, iters)\\n\",\n    \"      image[y, x] = color\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"Let's run the `@autojit` code and see if it is faster.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Mandelbrot created in 0.290273 s\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<Figure size 432x288 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {\n      \"needs_background\": \"light\"\n     },\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"image = np.zeros((1024, 1536), dtype = np.uint8)\\n\",\n    \"start = timer()\\n\",\n    \"create_fractal(-2.0, 1.0, -1.0, 1.0, image, 20) \\n\",\n    \"dt = timer() - start\\n\",\n    \"\\n\",\n    \"print(\\\"Mandelbrot created in %f s\\\" % dt)\\n\",\n    \"imshow(image)\\n\",\n    \"show()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"On my desktop computer, the time to compute the 1024x1024 mandelbrot set dropped from 6.92s down to 0.06s. That's a speedup of 115x! The reason this is so much faster is that Numba uses Numpy type information to convert the dynamic Python code into statically compiled machine code, which is many times faster to execute than dynamically typed, interpreted Python code. \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Even Bigger Speedups with CUDA Python\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"[Anaconda](https://store.continuum.io/cshop/anaconda/), from Continuum Analytics, is a \\\"completely free enterprise-ready Python distribution for large-scale data processing, predictive analytics, and scientific computing.\\\" [Anaconda Accelerate](https://store.continuum.io/cshop/accelerate/) is an add-on for Anaconda that includes the NumbaPro Python compiler.\\n\",\n    \"\\n\",\n    \"[NumbaPro](http://docs.continuum.io/numbapro/index.html) is an enhanced Numba that targets multi-core CPUs and GPUs directly from simple Python syntax, providing the performance of compiled parallel code with the productivity of the Python language.\\n\",\n    \"\\n\",\n    \"CUDA Python\\n\",\n    \"-----------\\n\",\n    \"\\n\",\n    \"In addition to various types of automatic vectorization and generalized Numpy Ufuncs, NumbaPro also enables developers to access the CUDA parallel programming model using Python syntax. With CUDA Python, you use parallelism explicitly just as in other CUDA languages such as CUDA C and CUDA Fortran. \\n\",\n    \"\\n\",\n    \"Let's write a CUDA version of our Python Mandelbrot set. We need to import `cuda` from the `numbapro` module. Then, we need to create a version of the mandel function compiled for the GPU. We can do this without any code duplication by calling `cuda.jit` on the function, providing it with the return type and the argument types, and specifying `device=True` to indicate that this is a function that will run on the GPU *device*.\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"from numba import cuda\\n\",\n    \"from numba import *\\n\",\n    \"\\n\",\n    \"mandel_gpu = cuda.jit(restype=uint32, argtypes=[f8, f8, uint32], device=True)(mandel)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"In CUDA, a *kernel* is a function that runs in parallel using many threads on the device. We can write a kernel version of our mandelbrot function by simply assuming that it will be run by a *grid* of threads. NumbaPro provides the familiar CUDA `threadIdx`, `blockIdx`, `blockDim` and `gridDim` intrinsics, as well as a `grid()` convenience function which evaluates to `blockDim * blockIdx + threadIdx`.\\n\",\n    \"\\n\",\n    \"Our example juse needs a minor modification to compute a grid-size stride for the x and y ranges, since we will have many threads running in parallel. We just add these three lines:\\n\",\n    \"\\n\",\n    \"    startX, startY = cuda.grid(2)\\n\",\n    \"    gridX = cuda.gridDim.x * cuda.blockDim.x;\\n\",\n    \"    gridY = cuda.gridDim.y * cuda.blockDim.y;\\n\",\n    \"\\n\",\n    \"And we modify the range in the `x` loop to use `range(startX, width, gridX)` (and likewise for the `y` loop).\\n\",\n    \"\\n\",\n    \"We decorate the function with @cuda.jit, passing it the type signature of the function. Since kernels cannot have a return value, we do not need the `restype` argument.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"@cuda.jit(argtypes=[f8, f8, f8, f8, uint8[:,:], uint32])\\n\",\n    \"def mandel_kernel(min_x, max_x, min_y, max_y, image, iters):\\n\",\n    \"  height = image.shape[0]\\n\",\n    \"  width = image.shape[1]\\n\",\n    \"\\n\",\n    \"  pixel_size_x = (max_x - min_x) / width\\n\",\n    \"  pixel_size_y = (max_y - min_y) / height\\n\",\n    \"\\n\",\n    \"  startX, startY = cuda.grid(2)\\n\",\n    \"  gridX = cuda.gridDim.x * cuda.blockDim.x;\\n\",\n    \"  gridY = cuda.gridDim.y * cuda.blockDim.y;\\n\",\n    \"\\n\",\n    \"  for x in range(startX, width, gridX):\\n\",\n    \"    real = min_x + x * pixel_size_x\\n\",\n    \"    for y in range(startY, height, gridY):\\n\",\n    \"      imag = min_y + y * pixel_size_y \\n\",\n    \"      image[y, x] = mandel_gpu(real, imag, iters)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Device Memory\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"CUDA kernels must operate on data allocated on the device. NumbaPro provides the cuda.to_device() function to copy a Numpy array to the GPU. \\n\",\n    \"\\n\",\n    \"    d_image = cuda.to_device(image)\\n\",\n    \"\\n\",\n    \"The return value (`d_image`) is of type DeviceNDArray, which is a subclass of numpy.ndarray, and provides the `to_host()` function to copy the array back from GPU to CPU memory\\n\",\n    \"\\n\",\n    \"    d_image.to_host()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Launching Kernels\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"To launch a kernel on the GPU, we must configure it, specifying the size of the grid in blocks, and the size of each thread block. For a 2D image calculation like the Mandelbrot set, we use a 2D grid of 2D blocks. We'll use blocks of 32x8 threads, and launch 32x16 of them in a 2D grid so that we have plenty of blocks to occupy all of the multiprocessors on the GPU.\\n\",\n    \"\\n\",\n    \"Putting this all together, we launch the kernel like this.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Mandelbrot created on GPU in 0.011260 s\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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\\n\",\n      \"text/plain\": [\n       \"<Figure size 432x288 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {\n      \"needs_background\": \"light\"\n     },\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"gimage = np.zeros((1024, 1536), dtype = np.uint8)\\n\",\n    \"blockdim = (32, 8)\\n\",\n    \"griddim = (32,16)\\n\",\n    \"\\n\",\n    \"start = timer()\\n\",\n    \"d_image = cuda.to_device(gimage)\\n\",\n    \"mandel_kernel[griddim, blockdim](-2.0, 1.0, -1.0, 1.0, d_image, 20) \\n\",\n    \"d_image.to_host()\\n\",\n    \"dt = timer() - start\\n\",\n    \"\\n\",\n    \"print(\\\"Mandelbrot created on GPU in %f s\\\" % dt)\\n\",\n    \"\\n\",\n    \"imshow(gimage)\\n\",\n    \"show()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"You may notice that when you ran the above code, the image was generated almost instantly. On the NVIDIA Tesla K20c GPU installed in my desktop, it ran in 311 milliseconds, which is an additional 19.3x speedup over the `@autojit` (compiled CPU) code, or a total of over 2000x faster than interpreted Python code.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": []\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.6.6\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 1\n}\n"
  },
  {
    "path": "Turbocharging Python with Command Line Tools/nuclearcli.py",
    "content": "\"\"\"\nNuclear Powered Cli\n\n* GPU parallization\n* Machine Learning/Clustering\n* JIT\n* Multi-threading\n* Colored output\n\n\"\"\"\n\n\nimport click\n\nfrom numba import (cuda, vectorize)\nimport numba\nimport pandas as pd\nimport numpy as np\nfrom sklearn.preprocessing import MinMaxScaler\nfrom sklearn.cluster import KMeans\n\nfrom functools import wraps\nfrom time import time\n\n@click.group()\ndef cli():\n    pass\n\ndef timing(f):\n    @wraps(f)\n    def wrap(*args, **kw):\n        ts = time()\n        result = f(*args, **kw)\n        te = time()\n        print(f\"fun: {f.__name__}, args: [{args}, {kw}] took: {te-ts} sec\")\n        return result\n    return wrap\n\n\ndef real_estate_df():\n    \"\"\"30 Years of Housing Prices\"\"\"\n\n    df = pd.read_csv(\"https://raw.githubusercontent.com/noahgift/real_estate_ml/master/data/Zip_Zhvi_SingleFamilyResidence.csv\")\n    df.rename(columns={\"RegionName\":\"ZipCode\"}, inplace=True)\n    df[\"ZipCode\"]=df[\"ZipCode\"].map(lambda x: \"{:.0f}\".format(x))\n    df[\"RegionID\"]=df[\"RegionID\"].map(lambda x: \"{:.0f}\".format(x))\n    return df\n\ndef numerical_real_estate_array(df):\n    \"\"\"Converts df to numpy numerical array\"\"\"\n\n    columns_to_drop = ['RegionID', 'ZipCode', 'City', 'State', 'Metro', 'CountyName']\n    df_numerical = df.dropna()\n    df_numerical = df_numerical.drop(columns_to_drop, axis=1)\n    return df_numerical.values\n\ndef real_estate_array():\n    \"\"\"Returns Real Estate Array\"\"\"\n\n    df = real_estate_df()\n    rea = numerical_real_estate_array(df)\n    return np.float32(rea)\n\ndef kmeans_cluster_housing(clusters=3):\n    \"\"\"Kmeans cluster a dataframe\"\"\"\n    \n    val_housing_win_df =\\\n        pd.read_csv(\"https://raw.githubusercontent.com/noahgift/socialpowernba/master/data/nba_2017_att_val_elo_win_housing.csv\")\n    numerical_df =\\\n        val_housing_win_df.loc[:,[\"TOTAL_ATTENDANCE_MILLIONS\", \"ELO\", \n        \"VALUE_MILLIONS\", \"MEDIAN_HOME_PRICE_COUNTY_MILLIONS\"]]\n    #scale data\n    scaler = MinMaxScaler()\n    scaler.fit(numerical_df)\n    scaler.transform(numerical_df)\n    #cluster data\n    k_means = KMeans(n_clusters=clusters)\n    kmeans = k_means.fit(scaler.transform(numerical_df))\n    val_housing_win_df['cluster'] = kmeans.labels_\n    return val_housing_win_df\n\n@timing\ndef expmean(rea):\n    \"\"\"Regular Function\"\"\"\n\n    val = rea.mean() ** 2\n    return val\n\n@timing\n@numba.jit(nopython=True)\ndef expmean_jit(rea):\n    \"\"\"Perform multiple mean calculations\"\"\"\n\n    val = rea.mean() ** 2\n    return val\n\n@vectorize(['float32(float32, float32)'], target='cuda')\ndef add_ufunc(x, y):\n    return x + y\n\n\n@timing\n@numba.jit(parallel=True)\ndef add_sum_threaded(rea):\n    \"\"\"Use all the cores\"\"\"\n\n    x,_ = rea.shape\n    total = 0\n    for _ in numba.prange(x):\n        total += rea.sum()  \n        print(total)\n\n@timing\ndef add_sum(rea):\n    \"\"\"traditional for loop\"\"\"\n\n    x,_ = rea.shape\n    total = 0\n    for _ in numba.prange(x):\n        total += rea.sum()  \n        print(total)\n\n@cli.command()\n@click.option('--threads/--no-jit', default=False)\ndef thread_test(threads):\n    rea = real_estate_array()\n    if threads:\n        click.echo(click.style('Running with multicore threads', fg='green'))\n        add_sum_threaded(rea)\n    else:\n        click.echo(click.style('Running NO THREADS', fg='red'))\n        add_sum(rea)\n\n\n\n@cli.command()\ndef cuda_operation():\n    \"\"\"Performs Vectorized Operations on GPU\"\"\"\n\n    x = real_estate_array()\n    y = real_estate_array()\n\n    print(\"Moving calculations to GPU memory\")\n    x_device = cuda.to_device(x)\n    y_device = cuda.to_device(y)\n    out_device = cuda.device_array(\n        shape=(x_device.shape[0],x_device.shape[1]), dtype=np.float32)\n    print(x_device)\n    print(x_device.shape)\n    print(x_device.dtype)\n\n    print(\"Calculating on GPU\")\n    add_ufunc(x_device,y_device, out=out_device)\n\n    out_host = out_device.copy_to_host()\n    print(f\"Calculations from GPU {out_host}\")\n\n\n@cli.command()\n@click.option('--jit/--no-jit', default=False)\ndef jit_test(jit):\n    rea = real_estate_array()\n    if jit:\n        click.echo(click.style('Running with JIT', fg='green'))\n        expmean_jit(rea)\n    else:\n        click.echo(click.style('Running NO JIT', fg='red'))\n        expmean(rea)\n\n@cli.command()\n@click.option(\"--num\", default=3, help=\"number of clusters\")\ndef cluster(num):\n    df = kmeans_cluster_housing(clusters=num)\n    click.echo(\"Clustered DataFrame\")\n    click.echo(df.head())\n\n\nif __name__ == \"__main__\":\n    cli()\n"
  },
  {
    "path": "Turbocharging Python with Command Line Tools/requirements.txt",
    "content": "pylint\npandas\nnumba\nclick\nscikit-learn"
  },
  {
    "path": "Web Scraping Tutorial/Pipfile",
    "content": "[[source]]\nurl = \"https://pypi.python.org/simple\"\nverify_ssl = true\nname = \"pypi\"\n\n[packages]\nrequests = \"*\"\n\"beautifulsoup4\" = \"*\"\n\n[dev-packages]\n\n[requires]\npython_version = \"3.7\"\n"
  },
  {
    "path": "Web Scraping Tutorial/script.py",
    "content": "import json\nfrom urllib.parse import urlparse\n\n# import the requests library to help use query a website\nimport requests\n\n# import the BeautifulSoup library to help us parse the websites\nfrom bs4 import BeautifulSoup\n\n\n# The function to query a website\ndef scrap_website(url):\n\n    # query the web page\n    page = requests.get(url)\n\n    # parse the fetched html content using a html parser\n    # since our page content is going to be in html format\n    soup = BeautifulSoup(page.content, 'html.parser')\n\n    # You can also view the source on the terminal by uncommenting the following line\n    # print(soup.prettify)\n\n    # find the repositories container div\n    main_content = soup.find('div', {'id': 'user-repositories-list'})\n\n    # Extract the list of repositories\n    list_of_repos = main_content.findAll('li')\n\n    # put the results of the scraping in a list of dictionaries\n    results = []\n\n    # Extract the details for each repo\n    for repo in list_of_repos:\n        # create a new repository details dictionary\n        repository = {}\n\n        # add the repository name, note that we strip a leading newline and\n        # leading and trailing whitespaces\n        repository[\"name\"] = repo.a.string.strip()\n\n        # Extract the base url for the url passed into the function\n        base_url = '{uri.scheme}://{uri.netloc}'.format(uri=urlparse(url))\n        # generate the repository link\n        repository[\"link\"] = \"{0}{1}\".format(base_url, repo.a.get('href'))\n\n        # Check if there is a repo description and add it to our dictionary\n        if repo.p and repo.p.string:\n            repository[\"description\"] = repo.p.string.strip()\n\n        # if no description is found\n        else:\n            repository[\"description\"] = \"No description available for this repository.\"\n\n        # add the programming language of the repository\n        programming_language = soup.find(attrs={\"itemprop\": \"programmingLanguage\"}).string.strip()\n        repository[\"programming_language\"] = programming_language\n        \n        # Add the repository to our results\n        results.append(repository)\n\n    # return our list of repositories as the output of our function\n    return results\n\n\nprint(json.dumps(scrap_website(\"https://github.com/gvanrossum?tab=repositories\"), indent=4))\n\nparsed_uri = urlparse(\"https://github.com/gvanrossum?tab=repositories\")\nresult = '{uri.scheme}://{uri.netloc}'.format(uri=parsed_uri)\nprint(result)\n"
  },
  {
    "path": "campfire-burn-prediction/.gitignore",
    "content": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n.hypothesis/\n.pytest_cache/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\ndb.sqlite3\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\n\n# PyBuilder\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# pyenv\n.python-version\n\n# celery beat schedule file\ncelerybeat-schedule\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n.DS_Store\n"
  },
  {
    "path": "campfire-burn-prediction/README.md",
    "content": "# Campfire Burn Severity Prediction\nThis repo contains the code (Jupyter Notebook) for a research project I was involed in which studied\nthe use ofconvolutional neural networks to predict the burn severity of affect human structures from\nthe 2018 Campfire using post-wildfire aerial imagery. \n\nWe recommend running the code outside of Jupyter notebooks, as you may see performance advantages \non your machine (not to mention better tools and environments).\n\n\n## Sample dataset \nThe sample dataset provides a CSV as well as 180 total images from the original data.\n\n-----\n\n## Vanilla Python Instructions\n\nSet up your project normally and install dependencies with:\n\n```bash\npip install -r requirements.txt\npip install git+https://github.com/gustaver/imbalanced-learn.git\n```\nYou can run most of the code with packages from PyPI, but the second instruction will allow\nyou to run the forked version of imblearn.\n\nIf using venv, activate your venv and run the code in snippets against the python console\nwith the article. \n\n###  Common Errors and Solutions:\n  Try installing the major packages independently, these are:\n  pandas, numpy, matplotlib, tensorflow, sklearn, imblearn, scipy, and imutils\n\n  Also you may need to install\n  opencv-python (in case you get a `no module named cv2` error) and\n  Pillow (in case you get a `Could not import PIL.Image` error\n\n  Try setting up placeholder log files:\n  model_checkpoints/baseline/log.csv and \n  model_checkpoints/baseline_datagen/log.csv\n\nNote for PyCharm users:\ntensorflow.keras imports return inspection errors even though the code will run fine. \nThe reason for this is a \"won't fix\" issue with Tensorflow and is beyond the scope of this tutorial.\n\n------\n\n## Jupyter Notebook Instructions\n\nThe Jupyter Notebook contains code for building and creating the dataset (images and labels), as\nwell as train/test split, model building, training, and test evaluation. The notebook has headers\nfor each of these sections. Some extras are included at the bottom of the notebook. \n\n## Conda environment \nConda can be used to install the necessary packages to run the code in this project. This can be\ndone by running the command: \n```bash\nconda env create -f environment.yml -n campfire\n```\nAnd then activating the environment: \n```bash\nsource activate campfire\n```\nSince n-dimensional arrays are not currently supported in \n[Imbalanced-Learn](https://github.com/scikit-learn-contrib/imbalanced-learn), I created a forked\nversion which can be installed by running the command: \n```bash\npip install git+https://github.com/gustaver/imbalanced-learn.git\n```\n"
  },
  {
    "path": "campfire-burn-prediction/campfire-burn-severity-prediction.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Campfire Burn Severity Prediction \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Imports \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import os \\n\",\n    \"import re\\n\",\n    \"from collections import Counter\\n\",\n    \"import pandas as pd \\n\",\n    \"import numpy as np \\n\",\n    \"import matplotlib.pyplot as plt \\n\",\n    \"import tensorflow as tf\\n\",\n    \"from tensorflow.keras.models import Sequential, load_model\\n\",\n    \"from tensorflow.keras.layers import BatchNormalization, Conv2D, MaxPooling2D, Activation, Flatten, Dropout, Dense\\n\",\n    \"from tensorflow.keras.preprocessing.image import img_to_array, load_img, ImageDataGenerator\\n\",\n    \"from tensorflow.keras.optimizers import Adam\\n\",\n    \"from tensorflow.keras.callbacks import ModelCheckpoint, CSVLogger\\n\",\n    \"from sklearn.preprocessing import LabelBinarizer\\n\",\n    \"from sklearn.model_selection import train_test_split\\n\",\n    \"from sklearn.utils.multiclass import unique_labels\\n\",\n    \"from sklearn.metrics import accuracy_score, classification_report, roc_curve, auc, balanced_accuracy_score, confusion_matrix, roc_auc_score\\n\",\n    \"from imblearn.over_sampling import RandomOverSampler\\n\",\n    \"from imblearn.under_sampling import RandomUnderSampler\\n\",\n    \"from imblearn.keras import balanced_batch_generator\\n\",\n    \"from scipy import interp\\n\",\n    \"from imutils import paths\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Move images \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"campfire_df = pd.read_csv('dataset/campfire_subset.csv')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"images = list(paths.list_images('dataset/'))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"for img_path in images:\\n\",\n    \"    obj_id = int(img_path.strip('dataset/OBJID_').strip('.tif'))\\n\",\n    \"    if obj_id in campfire_df.OBJECTID.values:\\n\",\n    \"        damage = campfire_df.loc[campfire_df.OBJECTID == obj_id].iloc[0].DAMAGE\\n\",\n    \"        os.rename('dataset/OBJID_{}.tif'.format(obj_id), 'dataset/{0}/OBJID_{1}.tif'.format(damage, obj_id))\\n\",\n    \"    else: \\n\",\n    \"        os.rename('dataset/OBJID_{}.tif'.format(obj_id), 'dataset/Unburned (0%)/OBJID_{}.tif'.format(obj_id))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Settings \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"EPOCHS = 50\\n\",\n    \"INIT_LR = 1e-3\\n\",\n    \"BS = 16\\n\",\n    \"IMAGE_DIMS = (128, 128, 3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Create Dataset \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def create_dataset(path, width, height, resample=None, random_state=0):\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    Converts a dataset of images in the directory structure {CLASS_LABEL}/{FILENAME}.{IMAGE_EXTENSION} \\n\",\n    \"    to list of 3D NumPy arrays and their corresponding labels. Images resized to (width, height). Dataset \\n\",\n    \"    is resampled to balance class distribution based on resample='over'|'under'.\\n\",\n    \"    # Arguments\\n\",\n    \"        path: path to dataset \\n\",\n    \"        width: width of resized image \\n\",\n    \"        height: height of resized image \\n\",\n    \"        (optional) resample: resample dataset using ROS('over')/RUS('under')\\n\",\n    \"    # Returns\\n\",\n    \"        data: A list of 3D NumPy arrays converted from images \\n\",\n    \"        labels: A list of labels of the images \\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    image_paths = list(paths.list_images(path))\\n\",\n    \"    labels = [image_path.split(os.path.sep)[-2] for image_path in image_paths]\\n\",\n    \"    \\n\",\n    \"    if resample:\\n\",\n    \"        if resample == 'over':\\n\",\n    \"            sampler = RandomOverSampler(random_state=random_state)\\n\",\n    \"        elif resample == 'under':\\n\",\n    \"            sampler = RandomUnderSampler(random_state=random_state)\\n\",\n    \"        image_paths = [[image_path] for image_path in image_paths]\\n\",\n    \"        image_paths_resampled, labels = sampler.fit_resample(image_paths, labels)\\n\",\n    \"        image_paths = image_paths_resampled.ravel()\\n\",\n    \"\\n\",\n    \"    data = [img_to_array(load_img(img_path, target_size=(width, height))) for img_path in image_paths]    \\n\",\n    \"    \\n\",\n    \"    return np.array(data, dtype=\\\"float\\\") / 255.0, np.array(labels)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"data, labels = create_dataset('dataset/', IMAGE_DIMS[0], IMAGE_DIMS[1])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"np.save('dataset/data.npy', data)\\n\",\n    \"np.save('dataset/labels.npy', labels)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Load Dataset\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"data, labels = np.load('dataset/data.npy'), np.load('dataset/labels.npy')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"classes = np.unique(labels)\\n\",\n    \"n_classes = len(classes)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"labels\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"fig, axs = plt.subplots(2, 3)\\n\",\n    \"axs = axs.flatten()\\n\",\n    \"fig.set_size_inches((8, 8))\\n\",\n    \"for i, c in enumerate(classes):\\n\",\n    \"    axs[i].imshow(data[labels == c][np.random.choice(data[labels == c].shape[0], 1)[0]])\\n\",\n    \"    axs[i].set_title(c)\\n\",\n    \"fig.delaxes(axs[5])\\n\",\n    \"fig.delaxes(axs[4])\\n\",\n    \"for ax in axs:\\n\",\n    \"    ax.label_outer()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Create Training/Testing Data \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"X_train, X_test, y_train, y_test = train_test_split(data, labels, test_size=0.2, random_state=0, stratify=labels)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"Counter(y_train)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"Counter(y_test)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def class_distribution(arr):\\n\",\n    \"    total = sum(Counter(arr).values())\\n\",\n    \"    return {c: c_count / total for c, c_count in Counter(arr).items()}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"class_distribution(y_train)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"class_distribution(y_test)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"lb = LabelBinarizer()\\n\",\n    \"y_train_bin = lb.fit_transform(y_train)\\n\",\n    \"y_test_bin = lb.transform(y_test)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Model Building and Configuration\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"class MiniVGGNet:\\n\",\n    \"    \\n\",\n    \"    def __init__(self, name, input_shape, n_classes, init_lr, epochs, batch_size):\\n\",\n    \"        self.model = MiniVGGNet.build(input_shape=input_shape, n_classes=n_classes)\\n\",\n    \"        self.epochs = epochs\\n\",\n    \"        self.batch_size = batch_size\\n\",\n    \"        opt = Adam(lr=init_lr, decay=init_lr / epochs)\\n\",\n    \"        self.model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])\\n\",\n    \"        model_filepath = 'model_checkpoints/{}/model.h5'.format(name)\\n\",\n    \"        mcp_save = ModelCheckpoint(model_filepath, save_best_only=True, monitor='val_loss', mode='min')\\n\",\n    \"        csv_logger = CSVLogger('model_checkpoints/{}/log.csv'.format(name))\\n\",\n    \"        self.callbacks = [mcp_save, csv_logger]\\n\",\n    \"    \\n\",\n    \"    def fit(self, X_train, y_train, X_test, y_test):\\n\",\n    \"        return self.model.fit(\\n\",\n    \"            X_train, \\n\",\n    \"            y_train, \\n\",\n    \"            batch_size=self.batch_size,\\n\",\n    \"            validation_data=(X_test, y_test),\\n\",\n    \"            epochs=self.epochs, \\n\",\n    \"            callbacks=self.callbacks)\\n\",\n    \"            \\n\",\n    \"    def fit_generator(self, X_train, y_train, X_test, y_test, generator, steps_per_epoch):\\n\",\n    \"        return self.model.fit_generator(\\n\",\n    \"            generator,\\n\",\n    \"            validation_data=(X_test, y_test),\\n\",\n    \"            epochs=self.epochs, \\n\",\n    \"            steps_per_epoch=steps_per_epoch,\\n\",\n    \"            callbacks=self.callbacks)\\n\",\n    \"        \\n\",\n    \"    @staticmethod\\n\",\n    \"    def build(input_shape, n_classes):\\n\",\n    \"        model = Sequential()\\n\",\n    \"\\n\",\n    \"        model.add(Conv2D(64, (3, 3), padding=\\\"same\\\", input_shape=input_shape, data_format='channels_last'))\\n\",\n    \"        model.add(Activation(\\\"relu\\\"))\\n\",\n    \"        model.add(BatchNormalization())\\n\",\n    \"        model.add(MaxPooling2D(pool_size=(2, 2)))\\n\",\n    \"        model.add(Dropout(0.25))\\n\",\n    \"\\n\",\n    \"        model.add(Conv2D(128, (3, 3), padding=\\\"same\\\"))\\n\",\n    \"        model.add(Activation(\\\"relu\\\"))\\n\",\n    \"        model.add(BatchNormalization())\\n\",\n    \"        model.add(Conv2D(128, (3, 3), padding=\\\"same\\\"))\\n\",\n    \"        model.add(Activation(\\\"relu\\\"))\\n\",\n    \"        model.add(BatchNormalization())\\n\",\n    \"        model.add(MaxPooling2D(pool_size=(2, 2)))\\n\",\n    \"        model.add(Dropout(0.25))\\n\",\n    \"\\n\",\n    \"        model.add(Conv2D(256, (3, 3), padding=\\\"same\\\"))\\n\",\n    \"        model.add(Activation(\\\"relu\\\"))\\n\",\n    \"        model.add(BatchNormalization())\\n\",\n    \"        model.add(Conv2D(256, (3, 3), padding=\\\"same\\\"))\\n\",\n    \"        model.add(Activation(\\\"relu\\\"))\\n\",\n    \"        model.add(BatchNormalization())\\n\",\n    \"        model.add(MaxPooling2D(pool_size=(2, 2)))\\n\",\n    \"        model.add(Dropout(0.25))\\n\",\n    \"\\n\",\n    \"        model.add(Flatten())\\n\",\n    \"        model.add(Dense(1024))\\n\",\n    \"        model.add(Activation(\\\"relu\\\"))\\n\",\n    \"        model.add(BatchNormalization())\\n\",\n    \"        model.add(Dropout(0.5))\\n\",\n    \"\\n\",\n    \"        model.add(Dense(n_classes))\\n\",\n    \"        model.add(Activation(\\\"softmax\\\"))\\n\",\n    \"\\n\",\n    \"        return model\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Model Fitting \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"baseline = MiniVGGNet('baseline', IMAGE_DIMS, n_classes, INIT_LR, EPOCHS, BS)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"baseline.fit(X_train, y_train_bin, X_test, y_test_bin)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"ros = MiniVGGNet('baseline_ros', IMAGE_DIMS, n_classes, INIT_LR, EPOCHS, BS)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"ros_generator, steps_per_epoch_ros = balanced_batch_generator(\\n\",\n    \"    X_train, \\n\",\n    \"    y_train_bin, \\n\",\n    \"    sampler=RandomOverSampler(),\\n\",\n    \"    batch_size=BS,\\n\",\n    \"    random_state=0)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"ros.fit_generator(X_train, y_train_bin, X_test, y_test_bin, ros_generator, steps_per_epoch_ros)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"img_datagen = MiniVGGNet('baseline_datagen', IMAGE_DIMS, n_classes, INIT_LR, EPOCHS, BS)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"img_data_generator = ImageDataGenerator(\\n\",\n    \"    rotation_range=25, \\n\",\n    \"    width_shift_range=0.1,\\n\",\n    \"    height_shift_range=0.1, \\n\",\n    \"    shear_range=0.2, \\n\",\n    \"    zoom_range=0.2, \\n\",\n    \"    horizontal_flip=True, \\n\",\n    \"    fill_mode=\\\"nearest\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"img_datagen.fit_generator(X_train, y_train_bin, X_test, y_test_bin, img_data_generator.flow(X_train, y_train_bin, batch_size=BS), X_train.shape[0] // BS)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Model Evaluation \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"model = load_model('model_checkpoints/baseline_datagen/model.h5')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"y_test_pred = model.predict(X_test)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"y_test_pred_labels = np.argmax(y_test_pred, axis=-1)\\n\",\n    \"y_test_labels = np.argmax(y_test_bin, axis=-1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"y_test_pred_bin = []\\n\",\n    \"for l in y_test_pred_labels:\\n\",\n    \"    pred_bin = [0] * n_classes\\n\",\n    \"    pred_bin[l] = 1\\n\",\n    \"    y_test_pred_bin.append(pred_bin)\\n\",\n    \"y_test_pred_bin = np.array(y_test_pred_bin)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"accuracy_score(y_test_labels, y_test_pred_labels)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"balanced_accuracy_score(y_test_labels, y_test_pred_labels)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"print(classification_report(y_test_labels, y_test_pred_labels, target_names=classes))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def plot_confusion_matrix(y_true, y_pred, classes, normalize=False, title=None, cmap=plt.cm.Blues):\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    This function prints and plots the confusion matrix.\\n\",\n    \"    Normalization can be applied by setting `normalize=True`.\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    if not title:\\n\",\n    \"        if normalize:\\n\",\n    \"            title = 'Normalized confusion matrix'\\n\",\n    \"        else:\\n\",\n    \"            title = 'Confusion matrix, without normalization'\\n\",\n    \"\\n\",\n    \"    # Compute confusion matrix\\n\",\n    \"    cm = confusion_matrix(y_true, y_pred)\\n\",\n    \"    # Only use the labels that appear in the data\\n\",\n    \"    classes = classes[unique_labels(y_true, y_pred)]\\n\",\n    \"    if normalize:\\n\",\n    \"        cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]\\n\",\n    \"        print(\\\"Normalized confusion matrix\\\")\\n\",\n    \"    else:\\n\",\n    \"        print('Confusion matrix, without normalization')\\n\",\n    \"\\n\",\n    \"    print(cm)\\n\",\n    \"\\n\",\n    \"    fig, ax = plt.subplots()\\n\",\n    \"    im = ax.imshow(cm, interpolation='nearest', cmap=cmap)\\n\",\n    \"    ax.figure.colorbar(im, ax=ax)\\n\",\n    \"    # We want to show all ticks...\\n\",\n    \"    ax.set(xticks=np.arange(cm.shape[1]),\\n\",\n    \"           yticks=np.arange(cm.shape[0]),\\n\",\n    \"           # ... and label them with the respective list entries\\n\",\n    \"           xticklabels=classes, yticklabels=classes,\\n\",\n    \"           title=title,\\n\",\n    \"           ylabel='True label',\\n\",\n    \"           xlabel='Predicted label')\\n\",\n    \"\\n\",\n    \"    # Rotate the tick labels and set their alignment.\\n\",\n    \"    plt.setp(ax.get_xticklabels(), rotation=45, ha=\\\"right\\\",\\n\",\n    \"             rotation_mode=\\\"anchor\\\")\\n\",\n    \"\\n\",\n    \"    # Loop over data dimensions and create text annotations.\\n\",\n    \"    fmt = '.2f' if normalize else 'd'\\n\",\n    \"    thresh = cm.max() / 2.\\n\",\n    \"    for i in range(cm.shape[0]):\\n\",\n    \"        for j in range(cm.shape[1]):\\n\",\n    \"            ax.text(j, i, format(cm[i, j], fmt),\\n\",\n    \"                    ha=\\\"center\\\", va=\\\"center\\\",\\n\",\n    \"                    color=\\\"white\\\" if cm[i, j] > thresh else \\\"black\\\")\\n\",\n    \"    fig.tight_layout()\\n\",\n    \"    return ax\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"ax = plot_confusion_matrix(y_test_labels, y_test_pred_labels, np.array(class_names), normalize=True, title='Datagen Model Confusion Matrix')\\n\",\n    \"plt.savefig('datagen_conf_matrix.png')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"class_names = [re.sub(r' ?\\\\([^)]+\\\\)', '', c) for c in classes]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Compute ROC curve and ROC area for each class\\n\",\n    \"fpr, tpr, roc_auc = {}, {}, {}\\n\",\n    \"for i, c in enumerate(class_names):\\n\",\n    \"    fpr[c], tpr[c], _ = roc_curve(y_test_bin[:, i], y_test_pred_bin[:, i])\\n\",\n    \"    roc_auc[c] = auc(fpr[c], tpr[c])\\n\",\n    \"    \\n\",\n    \"# Compute micro-average ROC curve and ROC area\\n\",\n    \"fpr['micro'], tpr['micro'], _ = roc_curve(y_test_bin.ravel(), y_test_pred_bin.ravel())\\n\",\n    \"roc_auc['micro'] = auc(fpr['micro'], tpr['micro'])\\n\",\n    \"\\n\",\n    \"# Compute macro-average ROC curve and ROC area\\n\",\n    \"lw = 2\\n\",\n    \"\\n\",\n    \"# First aggregate all false positive rates\\n\",\n    \"all_fpr = np.unique(np.concatenate([fpr[c] for c in class_names]))\\n\",\n    \"\\n\",\n    \"# Then interpolate all ROC curves at this points\\n\",\n    \"mean_tpr = np.zeros_like(all_fpr)\\n\",\n    \"for c in class_names:\\n\",\n    \"    mean_tpr += interp(all_fpr, fpr[c], tpr[c])\\n\",\n    \"\\n\",\n    \"# Finally average it and compute AUC\\n\",\n    \"mean_tpr /= n_classes\\n\",\n    \"\\n\",\n    \"fpr[\\\"macro\\\"] = all_fpr\\n\",\n    \"tpr[\\\"macro\\\"] = mean_tpr\\n\",\n    \"roc_auc[\\\"macro\\\"] = auc(fpr[\\\"macro\\\"], tpr[\\\"macro\\\"])\\n\",\n    \"\\n\",\n    \"# Plot all ROC curves\\n\",\n    \"plt.figure()\\n\",\n    \"plt.plot(fpr[\\\"micro\\\"], tpr[\\\"micro\\\"],\\n\",\n    \"         label='micro-average (area = {0:0.2f})'\\n\",\n    \"               ''.format(roc_auc[\\\"micro\\\"]),\\n\",\n    \"         color='deeppink', linestyle=':', linewidth=4)\\n\",\n    \"\\n\",\n    \"plt.plot(fpr[\\\"macro\\\"], tpr[\\\"macro\\\"],\\n\",\n    \"         label='macro-average (area = {0:0.2f})'\\n\",\n    \"               ''.format(roc_auc[\\\"macro\\\"]),\\n\",\n    \"         color='navy', linestyle=':', linewidth=4)\\n\",\n    \"\\n\",\n    \"colors = ['aqua', 'darkorange', 'cornflowerblue', 'purple', 'green']\\n\",\n    \"for c, color in zip(class_names, colors):\\n\",\n    \"    plt.plot(fpr[c], tpr[c], color=color, lw=lw,\\n\",\n    \"             label='{0} (area = {1:0.2f})'\\n\",\n    \"             ''.format(c, roc_auc[c]))\\n\",\n    \"\\n\",\n    \"plt.plot([0, 1], [0, 1], 'k--', lw=lw)\\n\",\n    \"plt.xlim([0.0, 1.0])\\n\",\n    \"plt.ylim([0.0, 1.05])\\n\",\n    \"plt.xlabel('False Positive Rate')\\n\",\n    \"plt.ylabel('True Positive Rate')\\n\",\n    \"plt.title('Datagen Multiclass ROC/AUC')\\n\",\n    \"plt.legend(loc=\\\"lower right\\\")\\n\",\n    \"plt.savefig('datagen_roc_auc.png')\\n\",\n    \"plt.show()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Extras \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def get_class_weights(y):\\n\",\n    \"    counter = Counter(y)\\n\",\n    \"    majority = max(counter.values())\\n\",\n    \"    return  {cls: float(majority/count) for cls, count in counter.items()}\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"class_weights_train = get_class_weights(labels)\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.7.5\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "campfire-burn-prediction/campfire-burn-severity-prediction.py",
    "content": "#!/usr/bin/env python\n# coding: utf-8\nimport os\nimport re\nfrom collections import Counter\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport tensorflow as tf\nfrom tensorflow.keras.models import Sequential, load_model\nfrom tensorflow.keras.layers import BatchNormalization, Conv2D, MaxPooling2D, Activation, Flatten, Dropout, Dense\nfrom tensorflow.keras.preprocessing.image import img_to_array, load_img, ImageDataGenerator\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.callbacks import ModelCheckpoint, CSVLogger\nfrom sklearn.preprocessing import LabelBinarizer\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.utils.multiclass import unique_labels\nfrom sklearn.metrics import accuracy_score, classification_report, roc_curve, auc, balanced_accuracy_score, \\\n    confusion_matrix, roc_auc_score\nfrom imblearn.over_sampling import RandomOverSampler\nfrom imblearn.under_sampling import RandomUnderSampler\nfrom imblearn.keras import balanced_batch_generator\nfrom scipy import interp\nfrom imutils import paths\n\n# Move images (Unless images already moved)\ncampfire_df = pd.read_csv('dataset/campfire_subset.csv')\nimages = list(paths.list_images('dataset/'))\n\n# for img_path in images:\n#     obj_id = int(img_path.strip('dataset/OBJID_').strip('.tif'))\n#     if obj_id in campfire_df.OBJECTID.values:\n#         damage = campfire_df.loc[campfire_df.OBJECTID == obj_id].iloc[0].DAMAGE\n#         os.rename('dataset/OBJID_{}.tif'.format(obj_id), 'dataset/{0}/OBJID_{1}.tif'.format(damage, obj_id))\n#     else:\n#         os.rename('dataset/OBJID_{}.tif'.format(obj_id), 'dataset/Unburned (0%)/OBJID_{}.tif'.format(obj_id))\n\n# Settings\n\nEPOCHS = 50\nINIT_LR = 1e-3\nBS = 16\nIMAGE_DIMS = (128, 128, 3)\n\n\n# Create Dataset\n\ndef create_dataset(path, width, height, resample=None, random_state=0):\n    \"\"\"\n    Converts a dataset of images in the directory structure {CLASS_LABEL}/{FILENAME}.{IMAGE_EXTENSION} \n    to list of 3D NumPy arrays and their corresponding labels. Images resized to (width, height). Dataset \n    is resampled to balance class distribution based on resample='over'|'under'.\n    # Arguments\n        path: path to dataset \n        width: width of resized image \n        height: height of resized image \n        (optional) resample: resample dataset using ROS('over')/RUS('under')\n    # Returns\n        data: A list of 3D NumPy arrays converted from images \n        labels: A list of labels of the images \n    \"\"\"\n    image_paths = list(paths.list_images(path))\n    labels = [image_path.split(os.path.sep)[-2] for image_path in image_paths]\n\n    if resample:\n        if resample == 'over':\n            sampler = RandomOverSampler(random_state=random_state)\n        elif resample == 'under':\n            sampler = RandomUnderSampler(random_state=random_state)\n        image_paths = [[image_path] for image_path in image_paths]\n        image_paths_resampled, labels = sampler.fit_resample(image_paths, labels)\n        image_paths = image_paths_resampled.ravel()\n\n    data = [img_to_array(load_img(img_path, target_size=(width, height))) for img_path in image_paths]\n\n    return np.array(data, dtype=\"float\") / 255.0, np.array(labels)\n\n\ndata, labels = create_dataset('dataset/', IMAGE_DIMS[0], IMAGE_DIMS[1])\n\nnp.save('dataset/data.npy', data)\nnp.save('dataset/labels.npy', labels)\n\n# Load Dataset\n\ndata, labels = np.load('dataset/data.npy'), np.load('dataset/labels.npy')\n\nclasses = np.unique(labels)\nn_classes = len(classes)\n\nlabels\n\nfig, axs = plt.subplots(2, 3)\naxs = axs.flatten()\nfig.set_size_inches((8, 8))\nfor i, c in enumerate(classes):\n    axs[i].imshow(data[labels == c][np.random.choice(data[labels == c].shape[0], 1)[0]])\n    axs[i].set_title(c)\nfig.delaxes(axs[5])\nfig.delaxes(axs[4])\nfor ax in axs:\n    ax.label_outer()\n\n# explicitly call the chart\nplt.show()\n\n# Create Training/Testing Data\n\nX_train, X_test, y_train, y_test = train_test_split(data, labels, test_size=0.2, random_state=0, stratify=labels)\n\nCounter(y_train)\n\nCounter(y_test)\n\n\ndef class_distribution(arr):\n    total = sum(Counter(arr).values())\n    return {c: c_count / total for c, c_count in Counter(arr).items()}\n\n\nclass_distribution(y_train)\n\nclass_distribution(y_test)\n\nlb = LabelBinarizer()\ny_train_bin = lb.fit_transform(y_train)\ny_test_bin = lb.transform(y_test)\n\n\n# Model Building and Configuration\n\n\nclass MiniVGGNet:\n\n    def __init__(self, name, input_shape, n_classes, init_lr, epochs, batch_size):\n        self.model = MiniVGGNet.build(input_shape=input_shape, n_classes=n_classes)\n        self.epochs = epochs\n        self.batch_size = batch_size\n        opt = Adam(lr=init_lr, decay=init_lr / epochs)\n        self.model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])\n        model_filepath = 'model_checkpoints/{}/model.h5'.format(name)\n        mcp_save = ModelCheckpoint(model_filepath, save_best_only=True, monitor='val_loss', mode='min')\n        csv_logger = CSVLogger('model_checkpoints/{}/log.csv'.format(name))\n        self.callbacks = [mcp_save, csv_logger]\n\n    def fit(self, X_train, y_train, X_test, y_test):\n        return self.model.fit(\n            X_train,\n            y_train,\n            batch_size=self.batch_size,\n            validation_data=(X_test, y_test),\n            epochs=self.epochs,\n            callbacks=self.callbacks)\n\n    def fit_generator(self, X_train, y_train, X_test, y_test, generator, steps_per_epoch):\n        return self.model.fit_generator(\n            generator,\n            validation_data=(X_test, y_test),\n            epochs=self.epochs,\n            steps_per_epoch=steps_per_epoch,\n            callbacks=self.callbacks)\n\n    @staticmethod\n    def build(input_shape, n_classes):\n        model = Sequential()\n\n        model.add(Conv2D(64, (3, 3), padding=\"same\", input_shape=input_shape, data_format='channels_last'))\n        model.add(Activation(\"relu\"))\n        model.add(BatchNormalization())\n        model.add(MaxPooling2D(pool_size=(2, 2)))\n        model.add(Dropout(0.25))\n\n        model.add(Conv2D(128, (3, 3), padding=\"same\"))\n        model.add(Activation(\"relu\"))\n        model.add(BatchNormalization())\n        model.add(Conv2D(128, (3, 3), padding=\"same\"))\n        model.add(Activation(\"relu\"))\n        model.add(BatchNormalization())\n        model.add(MaxPooling2D(pool_size=(2, 2)))\n        model.add(Dropout(0.25))\n\n        model.add(Conv2D(256, (3, 3), padding=\"same\"))\n        model.add(Activation(\"relu\"))\n        model.add(BatchNormalization())\n        model.add(Conv2D(256, (3, 3), padding=\"same\"))\n        model.add(Activation(\"relu\"))\n        model.add(BatchNormalization())\n        model.add(MaxPooling2D(pool_size=(2, 2)))\n        model.add(Dropout(0.25))\n\n        model.add(Flatten())\n        model.add(Dense(1024))\n        model.add(Activation(\"relu\"))\n        model.add(BatchNormalization())\n        model.add(Dropout(0.5))\n\n        model.add(Dense(n_classes))\n        model.add(Activation(\"softmax\"))\n\n        return model\n\n\n# Model Fitting\n\nbaseline = MiniVGGNet('baseline', IMAGE_DIMS, n_classes, INIT_LR, EPOCHS, BS)\n\n# takes some time to run, depending on hardware (resume here)\nbaseline.fit(X_train, y_train_bin, X_test, y_test_bin)\n\nros = MiniVGGNet('baseline_ros', IMAGE_DIMS, n_classes, INIT_LR, EPOCHS, BS)\n\n# ValueError: Found array with dim 4. Estimator expected <= 2.\nros_generator, steps_per_epoch_ros = balanced_batch_generator(\n    X_train,\n    y_train_bin,\n    sampler=RandomOverSampler(),\n    batch_size=BS,\n    random_state=0)\n\nros.fit_generator(X_train, y_train_bin, X_test, y_test_bin, ros_generator, steps_per_epoch_ros)\n\nimg_datagen = MiniVGGNet('baseline_datagen', IMAGE_DIMS, n_classes, INIT_LR, EPOCHS, BS)\n\nimg_data_generator = ImageDataGenerator(\n    rotation_range=25,\n    width_shift_range=0.1,\n    height_shift_range=0.1,\n    shear_range=0.2,\n    zoom_range=0.2,\n    horizontal_flip=True,\n    fill_mode=\"nearest\")\n\nimg_datagen.fit_generator(X_train, y_train_bin, X_test, y_test_bin,\n                          img_data_generator.flow(X_train, y_train_bin, batch_size=BS), X_train.shape[0] // BS)\n\n# ## Model Evaluation \n\n\nmodel = load_model('model_checkpoints/baseline_datagen/model.h5')\n\ny_test_pred = model.predict(X_test)\n\ny_test_pred_labels = np.argmax(y_test_pred, axis=-1)\ny_test_labels = np.argmax(y_test_bin, axis=-1)\n\ny_test_pred_bin = []\nfor l in y_test_pred_labels:\n    pred_bin = [0] * n_classes\n    pred_bin[l] = 1\n    y_test_pred_bin.append(pred_bin)\ny_test_pred_bin = np.array(y_test_pred_bin)\n\naccuracy_score(y_test_labels, y_test_pred_labels)\n\nbalanced_accuracy_score(y_test_labels, y_test_pred_labels)\n\nprint(classification_report(y_test_labels, y_test_pred_labels, target_names=classes))\n\n\ndef plot_confusion_matrix(y_true, y_pred, classes, normalize=False, title=None, cmap=plt.cm.Blues):\n    \"\"\"\n    This function prints and plots the confusion matrix.\n    Normalization can be applied by setting `normalize=True`.\n    \"\"\"\n    if not title:\n        if normalize:\n            title = 'Normalized confusion matrix'\n        else:\n            title = 'Confusion matrix, without normalization'\n\n    # Compute confusion matrix\n    cm = confusion_matrix(y_true, y_pred)\n    # Only use the labels that appear in the data\n    classes = classes[unique_labels(y_true, y_pred)]\n    if normalize:\n        cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]\n        print(\"Normalized confusion matrix\")\n    else:\n        print('Confusion matrix, without normalization')\n\n    print(cm)\n\n    fig, ax = plt.subplots()\n    im = ax.imshow(cm, interpolation='nearest', cmap=cmap)\n    ax.figure.colorbar(im, ax=ax)\n    # We want to show all ticks...\n    ax.set(xticks=np.arange(cm.shape[1]),\n           yticks=np.arange(cm.shape[0]),\n           # ... and label them with the respective list entries\n           xticklabels=classes, yticklabels=classes,\n           title=title,\n           ylabel='True label',\n           xlabel='Predicted label')\n\n    # Rotate the tick labels and set their alignment.\n    plt.setp(ax.get_xticklabels(), rotation=45, ha=\"right\",\n             rotation_mode=\"anchor\")\n\n    # Loop over data dimensions and create text annotations.\n    fmt = '.2f' if normalize else 'd'\n    thresh = cm.max() / 2.\n    for i in range(cm.shape[0]):\n        for j in range(cm.shape[1]):\n            ax.text(j, i, format(cm[i, j], fmt),\n                    ha=\"center\", va=\"center\",\n                    color=\"white\" if cm[i, j] > thresh else \"black\")\n    fig.tight_layout()\n    return ax\n\n\nclass_names = [re.sub(r' ?\\([^)]+\\)', '', c) for c in classes]\n\nax = plot_confusion_matrix(y_test_labels, y_test_pred_labels, np.array(class_names), normalize=True,\n                           title='Datagen Model Confusion Matrix')\nplt.savefig('datagen_conf_matrix.png')\nplt.show()\n\n# Compute ROC curve and ROC area for each class\nfpr, tpr, roc_auc = {}, {}, {}\nfor i, c in enumerate(class_names):\n    fpr[c], tpr[c], _ = roc_curve(y_test_bin[:, i], y_test_pred_bin[:, i])\n    roc_auc[c] = auc(fpr[c], tpr[c])\n\n# Compute micro-average ROC curve and ROC area\nfpr['micro'], tpr['micro'], _ = roc_curve(y_test_bin.ravel(), y_test_pred_bin.ravel())\nroc_auc['micro'] = auc(fpr['micro'], tpr['micro'])\n\n# Compute macro-average ROC curve and ROC area\nlw = 2\n\n# First aggregate all false positive rates\nall_fpr = np.unique(np.concatenate([fpr[c] for c in class_names]))\n\n# Then interpolate all ROC curves at this points\nmean_tpr = np.zeros_like(all_fpr)\nfor c in class_names:\n    mean_tpr += interp(all_fpr, fpr[c], tpr[c])\n\n# Finally average it and compute AUC\nmean_tpr /= n_classes\n\nfpr[\"macro\"] = all_fpr\ntpr[\"macro\"] = mean_tpr\nroc_auc[\"macro\"] = auc(fpr[\"macro\"], tpr[\"macro\"])\n\n# Plot all ROC curves\nplt.figure()\nplt.plot(fpr[\"micro\"], tpr[\"micro\"],\n         label='micro-average (area = {0:0.2f})'\n               ''.format(roc_auc[\"micro\"]),\n         color='deeppink', linestyle=':', linewidth=4)\n\nplt.plot(fpr[\"macro\"], tpr[\"macro\"],\n         label='macro-average (area = {0:0.2f})'\n               ''.format(roc_auc[\"macro\"]),\n         color='navy', linestyle=':', linewidth=4)\n\ncolors = ['aqua', 'darkorange', 'cornflowerblue', 'purple', 'green']\nfor c, color in zip(class_names, colors):\n    plt.plot(fpr[c], tpr[c], color=color, lw=lw,\n             label='{0} (area = {1:0.2f})'\n                   ''.format(c, roc_auc[c]))\n\nplt.plot([0, 1], [0, 1], 'k--', lw=lw)\nplt.xlim([0.0, 1.0])\nplt.ylim([0.0, 1.05])\nplt.xlabel('False Positive Rate')\nplt.ylabel('True Positive Rate')\nplt.title('Datagen Multiclass ROC/AUC')\nplt.legend(loc=\"lower right\")\nplt.savefig('datagen_roc_auc.png')\nplt.show()\n\n\n# Extras\n\n\ndef get_class_weights(y):\n    counter = Counter(y)\n    majority = max(counter.values())\n    return {cls: float(majority / count) for cls, count in counter.items()}\n\n\nclass_weights_train = get_class_weights(labels)\n"
  },
  {
    "path": "campfire-burn-prediction/dataset/campfire_subset.csv",
    "content": "OBJECTID,DAMAGE\n5000,Destroyed (>50%)\n5001,Destroyed (>50%)\n5002,Destroyed (>50%)\n5003,Destroyed (>50%)\n5004,Affected (1-9%)\n5005,Affected (1-9%)\n5007,Destroyed (>50%)\n5008,Destroyed (>50%)\n5009,Destroyed (>50%)\n5010,Destroyed (>50%)\n5011,Destroyed (>50%)\n5012,Destroyed (>50%)\n5013,Destroyed (>50%)\n5014,Destroyed (>50%)\n5015,Destroyed (>50%)\n5016,Destroyed (>50%)\n5017,Destroyed (>50%)\n5018,Destroyed (>50%)\n5019,Destroyed (>50%)\n5020,Destroyed (>50%)\n5021,Destroyed (>50%)\n5022,Destroyed (>50%)\n5023,Destroyed (>50%)\n5024,Destroyed (>50%)\n5025,Destroyed (>50%)\n5026,Destroyed (>50%)\n5027,Destroyed (>50%)\n5028,Destroyed (>50%)\n5029,Destroyed (>50%)\n5030,Destroyed (>50%)\n5031,Destroyed (>50%)\n5032,Destroyed (>50%)\n5033,Destroyed (>50%)\n5034,Destroyed (>50%)\n5035,Destroyed (>50%)\n5036,Destroyed (>50%)\n5037,Destroyed (>50%)\n5041,Major (26-50%)\n5043,Destroyed (>50%)\n5044,Destroyed (>50%)\n5045,Destroyed (>50%)\n5046,Destroyed (>50%)\n5048,Destroyed (>50%)\n5049,Destroyed (>50%)\n5050,Destroyed (>50%)\n5051,Destroyed (>50%)\n5052,Destroyed (>50%)\n5053,Destroyed (>50%)\n5054,Destroyed (>50%)\n5055,Destroyed (>50%)\n5056,Destroyed (>50%)\n5057,Destroyed (>50%)\n5058,Destroyed (>50%)\n5060,Destroyed (>50%)\n5061,Destroyed (>50%)\n5062,Destroyed (>50%)\n5063,Destroyed (>50%)\n5064,Destroyed (>50%)\n5065,Destroyed (>50%)\n5066,Destroyed (>50%)\n5124,Destroyed (>50%)\n5125,Destroyed (>50%)\n5126,Destroyed (>50%)\n5127,Destroyed (>50%)\n5128,Destroyed (>50%)\n5129,Destroyed (>50%)\n5130,Destroyed (>50%)\n5131,Destroyed (>50%)\n5132,Destroyed (>50%)\n5133,Destroyed (>50%)\n5134,Destroyed (>50%)\n5135,Destroyed (>50%)\n5146,Affected (1-9%)\n5147,Affected (1-9%)\n5148,Affected (1-9%)\n5281,Affected (1-9%)\n5367,Affected (1-9%)\n5398,Affected (1-9%)\n5399,Major (26-50%)\n5408,Affected (1-9%)\n5456,Minor (10-25%)\n5461,Affected (1-9%)\n5470,Affected (1-9%)\n5589,Affected (1-9%)\n5693,Affected (1-9%)\n5696,Affected (1-9%)\n5757,Affected (1-9%)\n5786,Affected (1-9%)\n5803,Affected (1-9%)\n5809,Affected (1-9%)\n5819,Affected (1-9%)\n5820,Affected (1-9%)\n5825,Affected (1-9%)\n5837,Affected (1-9%)\n5940,Affected (1-9%)\n6037,Affected (1-9%)\n6092,Affected (1-9%)\n6123,Affected (1-9%)\n6338,Affected (1-9%)\n6357,Major (26-50%)\n6402,Affected (1-9%)\n6631,Affected (1-9%)\n6664,Affected (1-9%)\n6793,Affected (1-9%)\n6891,Affected (1-9%)\n6939,Affected (1-9%)\n7074,Affected (1-9%)\n7108,Affected (1-9%)\n7195,Affected (1-9%)\n7274,Affected (1-9%)\n7307,Affected (1-9%)\n7316,Minor (10-25%)\n7399,Minor (10-25%)\n7423,Major (26-50%)\n7625,Affected (1-9%)\n7629,Affected (1-9%)\n7655,Affected (1-9%)\n10188,Major (26-50%)\n10253,Minor (10-25%)\n10260,Major (26-50%)\n10276,Minor (10-25%)\n10487,Minor (10-25%)\n10516,Major (26-50%)\n10740,Minor (10-25%)\n11054,Minor (10-25%)\n11353,Minor (10-25%)\n11675,Minor (10-25%)\n11830,Minor (10-25%)\n12117,Minor (10-25%)\n12332,Minor (10-25%)\n12465,Minor (10-25%)\n12931,Minor (10-25%)\n13409,Minor (10-25%)\n13782,Minor (10-25%)\n13875,Minor (10-25%)\n13887,Minor (10-25%)\n13923,Minor (10-25%)\n14243,Minor (10-25%)\n14274,Minor (10-25%)\n14406,Minor (10-25%)\n14531,Minor (10-25%)\n14606,Minor (10-25%)\n15043,Minor (10-25%)\n15537,Minor (10-25%)\n15547,Major (26-50%)\n15560,Minor (10-25%)\n16288,Major (26-50%)\n17339,Major (26-50%)\n17373,Minor (10-25%)\n17802,Minor (10-25%)\n18115,Major (26-50%)\n19473,Minor (10-25%)\n19588,Minor (10-25%)\n19815,Minor (10-25%)\n20146,Major (26-50%)\n20656,Minor (10-25%)\n20657,Major (26-50%)\n20667,Minor (10-25%)\n20830,Minor (10-25%)\n20893,Minor (10-25%)\n21446,Minor (10-25%)\n21907,Minor (10-25%)\n21931,Major (26-50%)\n21992,Minor (10-25%)\n22382,Minor (10-25%)\n22695,Major (26-50%)\n22805,Minor (10-25%)\n22937,Minor (10-25%)\n22964,Major (26-50%)\n23008,Minor (10-25%)\n23015,Minor (10-25%)\n23592,Minor (10-25%)\n23797,Major (26-50%)\n23936,Minor (10-25%)\n24298,Minor (10-25%)\n24529,Minor (10-25%)\n24762,Minor (10-25%)\n25196,Minor (10-25%)\n25460,Minor (10-25%)\n25889,Major (26-50%)\n"
  },
  {
    "path": "campfire-burn-prediction/environment.yml",
    "content": "name: campfire\nchannels:\n  - defaults\ndependencies:\n  - _tflow_select=2.3.0=mkl\n  - absl-py=0.8.0=py37_0\n  - appnope=0.1.0=py37_0\n  - astor=0.8.0=py37_0\n  - attrs=19.3.0=py_0\n  - backcall=0.1.0=py37_0\n  - blas=1.0=mkl\n  - bleach=3.1.0=py37_0\n  - bzip2=1.0.8=h1de35cc_0\n  - c-ares=1.15.0=h1de35cc_1001\n  - ca-certificates=2019.10.16=0\n  - cairo=1.14.12=hc4e6be7_4\n  - certifi=2019.9.11=py37_0\n  - cycler=0.10.0=py37_0\n  - dbus=1.13.12=h90a0687_0\n  - decorator=4.4.1=py_0\n  - defusedxml=0.6.0=py_0\n  - entrypoints=0.3=py37_0\n  - expat=2.2.6=h0a44026_0\n  - ffmpeg=4.0=h01ea3c9_0\n  - fontconfig=2.13.0=h5d5b041_1\n  - freetype=2.9.1=hb4e5f40_0\n  - gast=0.2.2=py37_0\n  - gettext=0.19.8.1=h15daf44_3\n  - glib=2.63.1=hd977a24_0\n  - google-pasta=0.1.7=py_0\n  - graphite2=1.3.13=h2098e52_0\n  - grpcio=1.16.1=py37h044775b_1\n  - h5py=2.8.0=py37h878fce3_3\n  - harfbuzz=1.8.8=hb8d4a28_0\n  - hdf5=1.10.2=hfa1e0ec_1\n  - icu=58.2=h4b95b61_1\n  - importlib_metadata=0.23=py37_0\n  - intel-openmp=2019.4=233\n  - ipykernel=5.1.3=py37h39e3cac_0\n  - ipython=7.9.0=py37h39e3cac_0\n  - ipython_genutils=0.2.0=py37_0\n  - ipywidgets=7.5.1=py_0\n  - jasper=2.0.14=h636a363_1\n  - jedi=0.15.1=py37_0\n  - jinja2=2.10.3=py_0\n  - joblib=0.13.2=py37_0\n  - jpeg=9b=he5867d9_2\n  - jsonschema=3.1.1=py37_0\n  - jupyter=1.0.0=py37_7\n  - jupyter_client=5.3.4=py37_0\n  - jupyter_console=6.0.0=py37_0\n  - jupyter_core=4.6.1=py37_0\n  - keras-applications=1.0.8=py_0\n  - keras-preprocessing=1.1.0=py_1\n  - kiwisolver=1.1.0=py37h0a44026_0\n  - libcxx=4.0.1=hcfea43d_1\n  - libcxxabi=4.0.1=hcfea43d_1\n  - libedit=3.1.20181209=hb402a30_0\n  - libffi=3.2.1=h475c297_4\n  - libgfortran=3.0.1=h93005f0_2\n  - libiconv=1.15=hdd342a3_7\n  - libopencv=3.4.2=h7c891bd_1\n  - libopus=1.3=h1de35cc_0\n  - libpng=1.6.37=ha441bb4_0\n  - libprotobuf=3.9.2=hd9629dc_0\n  - libsodium=1.0.16=h3efe00b_0\n  - libtiff=4.0.10=hcb84e12_2\n  - libvpx=1.7.0=h378b8a2_0\n  - libxml2=2.9.9=hf6e021a_1\n  - llvm-openmp=4.0.1=hcfea43d_1\n  - markdown=3.1.1=py37_0\n  - markupsafe=1.1.1=py37h1de35cc_0\n  - matplotlib=3.1.1=py37h54f8f79_0\n  - mistune=0.8.4=py37h1de35cc_0\n  - mkl=2019.4=233\n  - mkl-service=2.3.0=py37hfbe908c_0\n  - mkl_fft=1.0.15=py37h5e564d8_0\n  - mkl_random=1.1.0=py37ha771720_0\n  - more-itertools=7.2.0=py37_0\n  - nbconvert=5.6.1=py37_0\n  - nbformat=4.4.0=py37_0\n  - ncurses=6.1=h0a44026_1\n  - notebook=6.0.1=py37_0\n  - numpy=1.17.3=py37h4174a10_0\n  - numpy-base=1.17.3=py37h6575580_0\n  - olefile=0.46=py37_0\n  - opencv=3.4.2=py37h6fd60c2_1\n  - openssl=1.1.1d=h1de35cc_3\n  - opt_einsum=3.1.0=py_0\n  - pandas=0.25.2=py37h0a44026_0\n  - pandoc=2.2.3.2=0\n  - pandocfilters=1.4.2=py37_1\n  - parso=0.5.1=py_0\n  - pcre=8.43=h0a44026_0\n  - pexpect=4.7.0=py37_0\n  - pickleshare=0.7.5=py37_0\n  - pillow=6.2.1=py37hb68e598_0\n  - pip=19.3.1=py37_0\n  - pixman=0.38.0=h1de35cc_0\n  - prometheus_client=0.7.1=py_0\n  - prompt_toolkit=2.0.10=py_0\n  - protobuf=3.9.2=py37h0a44026_0\n  - ptyprocess=0.6.0=py37_0\n  - py-opencv=3.4.2=py37h7c891bd_1\n  - pygments=2.4.2=py_0\n  - pyparsing=2.4.2=py_0\n  - pyqt=5.9.2=py37h655552a_2\n  - pyrsistent=0.15.4=py37h1de35cc_0\n  - python=3.7.5=h359304d_0\n  - python-dateutil=2.8.0=py37_0\n  - pytz=2019.3=py_0\n  - pyzmq=18.1.0=py37h0a44026_0\n  - qt=5.9.7=h468cd18_1\n  - qtconsole=4.5.5=py_0\n  - readline=7.0=h1de35cc_5\n  - scikit-learn=0.21.3=py37h27c97d8_0\n  - scipy=1.3.1=py37h1410ff5_0\n  - send2trash=1.5.0=py37_0\n  - setuptools=41.6.0=py37_0\n  - sip=4.19.8=py37h0a44026_0\n  - six=1.12.0=py37_0\n  - sqlite=3.30.1=ha441bb4_0\n  - tensorboard=2.0.0=pyhb230dea_0\n  - tensorflow=2.0.0=mkl_py37hda344b4_0\n  - tensorflow-base=2.0.0=mkl_py37h66b1bf0_0\n  - tensorflow-estimator=2.0.0=pyh2649769_0\n  - termcolor=1.1.0=py37_1\n  - terminado=0.8.2=py37_0\n  - testpath=0.4.2=py37_0\n  - tk=8.6.8=ha441bb4_0\n  - tornado=6.0.3=py37h1de35cc_0\n  - traitlets=4.3.3=py37_0\n  - wcwidth=0.1.7=py37_0\n  - webencodings=0.5.1=py37_1\n  - werkzeug=0.16.0=py_0\n  - wheel=0.33.6=py37_0\n  - widgetsnbextension=3.5.1=py37_0\n  - wrapt=1.11.2=py37h1de35cc_0\n  - xz=5.2.4=h1de35cc_4\n  - zeromq=4.3.1=h0a44026_3\n  - zipp=0.6.0=py_0\n  - zlib=1.2.11=h1de35cc_3\n  - zstd=1.3.7=h5bba6e5_0\n  - pip:\n    - imbalanced-learn==0.5.0.dev0\n    - imutils==0.5.3\nprefix: /usr/local/Caskroom/miniconda/base/envs/campfire\n\n"
  },
  {
    "path": "campfire-burn-prediction/requirements.txt",
    "content": "absl-py==0.8.1\nastor==0.8.0\nattrs==19.3.0\nbackcall==0.1.0\nbleach==3.1.0\ncachetools==3.1.1\ncertifi==2019.9.11\nchardet==3.0.4\ncycler==0.10.0\ndecorator==4.4.1\ndefusedxml==0.6.0\nentrypoints==0.3\ngast==0.2.2\ngoogle-auth==1.7.1\ngoogle-auth-oauthlib==0.4.1\ngoogle-pasta==0.1.8\ngrpcio==1.25.0\nh5py==2.10.0\nidna==2.8\nimbalanced-learn==0.5.0\nimblearn==0.0\nimportlib-metadata==0.23\nimutils==0.5.3\nipykernel==5.1.3\nipython==7.9.0\nipython-genutils==0.2.0\nipywidgets==7.5.1\njedi==0.15.1\nJinja2==2.10.3\njoblib==0.14.0\njsonschema==3.1.1\njupyter==1.0.0\njupyter-client==5.3.4\njupyter-console==6.0.0\njupyter-core==4.6.1\nKeras-Applications==1.0.8\nKeras-Preprocessing==1.1.0\nkiwisolver==1.1.0\nMarkdown==3.1.1\nMarkupSafe==1.1.1\nmatplotlib==3.1.1\nmistune==0.8.4\nmore-itertools==7.2.0\nnbconvert==5.6.1\nnbformat==4.4.0\nnotebook==6.0.2\nnumpy==1.17.4\noauthlib==3.1.0\nopencv-python==4.1.1.26\nopt-einsum==3.1.0\npandas==0.25.3\npandocfilters==1.4.2\nparso==0.5.1\npexpect==4.7.0\npickleshare==0.7.5\nPillow==6.2.1\nprometheus-client==0.7.1\nprompt-toolkit==2.0.10\nprotobuf==3.10.0\nptyprocess==0.6.0\npyasn1==0.4.7\npyasn1-modules==0.2.7\nPygments==2.4.2\npyparsing==2.4.5\npyrsistent==0.15.5\npython-dateutil==2.8.1\npytz==2019.3\npyzmq==18.1.1\nqtconsole==4.5.5\nrequests==2.22.0\nrequests-oauthlib==1.3.0\nrsa==4.0\nscikit-learn==0.21.3\nscipy==1.3.2\nSend2Trash==1.5.0\nsix==1.13.0\nsklearn==0.0\ntensorboard==2.0.1\ntensorflow==2.0.0\ntensorflow-estimator==2.0.1\ntermcolor==1.1.0\nterminado==0.8.3\ntestpath==0.4.4\ntornado==6.0.3\ntraitlets==4.3.3\nurllib3==1.25.7\nwcwidth==0.1.7\nwebencodings==0.5.1\nWerkzeug==0.16.0\nwidgetsnbextension==3.5.1\nwrapt==1.11.2\nxlrd==1.2.0\nzipp==0.6.0\n"
  },
  {
    "path": "convolutional-neural-networks-pytorch/README.md",
    "content": "### Examples from \"Convolutional Neural Networks using PyTorch\"\n\n- examples.py"
  },
  {
    "path": "convolutional-neural-networks-pytorch/examples.py",
    "content": "import torch\nimport torch.nn as nn\nimport torchvision.transforms as transforms\nfrom torch.autograd import Variable\nfrom torchvision.datasets import FashionMNIST\n\ntransform = transforms.Compose([transforms.ToTensor(),\n                                transforms.Normalize((0.1307,), (0.3081,))])\ntrain_dataset = FashionMNIST(root='./data',\n                             train=True,\n                             transform=transform,\n                             download=True\n                             )\ntest_dataset = FashionMNIST(root='./data',\n                            train=False,\n                            transform=transform, )\n\nbatch_size = 100\nn_iters = 5500\nnum_epochs = n_iters / (len(train_dataset) / batch_size)\nnum_epochs = int(num_epochs)\ntrain_loader = torch.utils.data.DataLoader(dataset=train_dataset,\n                                           batch_size=batch_size,\n                                           shuffle=True)\ntest_loader = torch.utils.data.DataLoader(dataset=test_dataset,\n                                          batch_size=batch_size,\n                                          shuffle=False)\n\n\nclass CNNModel(nn.Module):\n\n    def __init__(self):\n        super(CNNModel, self).__init__()\n        self.cnn1 = nn.Conv2d(in_channels=1, out_channels=16, kernel_size=5, stride=1, padding=0)\n        self.relu1 = nn.ReLU()\n        self.maxpool1 = nn.MaxPool2d(kernel_size=2)\n        self.cnn2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=5, stride=1, padding=0)\n        self.relu2 = nn.ReLU()\n        self.maxpool2 = nn.MaxPool2d(kernel_size=2)\n        self.dropout = nn.Dropout(p=0.5)\n        self.fc1 = nn.Linear(32 * 4 * 4, 10)\n\n    def forward(self, x):\n        out = self.cnn1(x)\n        out = self.relu1(out)\n        out = self.maxpool1(out)\n        out = self.cnn2(out)\n        out = self.relu2(out)\n        out = self.maxpool2(out)\n        out = out.view(out.size(0), -1)\n        out = self.dropout(out)\n        out = self.fc1(out)\n        return out\n\n\nmodel = CNNModel()\ncriterion = nn.CrossEntropyLoss()\nlearning_rate = 0.001\noptimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)\n\niter = 0\nlosses = []\nfor epoch in range(num_epochs):\n    for i, (images, labels) in enumerate(train_loader):\n        images = Variable(images)\n        labels = Variable(labels)\n\n        optimizer.zero_grad()\n\n        outputs = model(images)\n\n        loss = criterion(outputs, labels)\n        losses.append(loss)\n\n        loss.backward()\n        optimizer.step()\n\n        iter += 1\n\n        if iter % 500 == 0:\n            correct = 0\n            total = 0\n\n            for images, labels in test_loader:\n                images = Variable(images)\n\n                outputs = model(images)\n\n                _, predicted = torch.max(outputs.data, 1)\n                total += labels.size(0)\n                correct += (predicted == labels).sum()\n\n            accuracy = 100 * correct / total\n            print('Iteration: {}. Loss: {}. Accuracy: {}'.format(iter, loss.data, accuracy))\n"
  },
  {
    "path": "django-rest-framework-fast/Dockerfile",
    "content": "# Base Image\nFROM python:3-alpine\n\n# Set execution environment\nCOPY requirements /requirements\n\n# Install dependencies from repository\nRUN set -ex \\\n    && apk add --no-cache --virtual .build-deps \\\n            gcc \\\n            make \\\n            libc-dev \\\n            musl-dev \\\n            linux-headers \\\n            pcre-dev \\\n            postgresql-dev \\\n            jpeg-dev \\\n            zlib-dev \\\n    && python -m venv --upgrade /ourenv \\\n    && /ourenv/bin/pip install -U pip \\\n    && LIBRARY_PATH=/lib:/usr/lib /bin/sh -c \"/ourenv/bin/pip install --no-cache-dir -r /requirements/dev.txt\" \\\n    && run_deps=\"$( \\\n            scanelf --needed --nobanner --recursive /ourenv \\\n                    | awk '{ gsub(/,/, \"\\nso:\", $2); print \"so:\" $2 }' \\\n                    | sort -u \\\n                    | xargs -r apk info --installed \\\n                    | sort -u \\\n    )\" \\\n    && apk add --virtual .python-rundeps $run_deps \\\n    && apk del .build-deps\n\nRUN apk add --no-cache \\\n    curl \\\n    openssh \\\n    bash\n\nRUN mkdir /code/\nWORKDIR /code/\nCOPY . /code/\n\nENV IN_DOCKER=True\n\nRUN /ourenv/bin/python manage.py migrate\nRUN /ourenv/bin/python manage.py collectstatic --noinput\nCMD /ourenv/bin/gunicorn config.wsgi\n"
  },
  {
    "path": "django-rest-framework-fast/README.md",
    "content": "## Superhero Storyboard\n\nThis is a tutorial project for checking out Django REST Framework and comparing some of the ways to create an API using the framework, as well as a popular method of using stock Django to create the same API\n\nThis project can be run with Docker. To get started:\n\n1. `$ docker-compose build`\n2. `$ docker-compose up`\n\nAfterward, you should be able to access the different versions of the API at:\n\n`0.0.0.0:8009/api/v{1,2,3}/characters`\n\nThe different versions of the API each have a readme.md to explain what they are and why they exist.\nA brief explanation is:\n\n1: [v1 represents one of the popular stock Django ways to build APIs](/api/v1/readme.md)\n\n2: [v2 is an example of a basic implementation of Django REST Framework API endpoints](/api/v2/readme.md)\n\n3: [v3 uses DRF a ViewSet to automatically generate the API endpoints](/api/v3/readme.md)\n"
  },
  {
    "path": "django-rest-framework-fast/api/__init__.py",
    "content": ""
  },
  {
    "path": "django-rest-framework-fast/api/urls.py",
    "content": "from django.urls import path, include\n\nfrom .v1.urls import v1_patterns\nfrom .v2.urls import v2_patterns\nfrom .v3.urls import v3_patterns\n\napi_patterns = [\n    path('v1/', include((v1_patterns, 'v1'))),\n    path('v2/', include((v2_patterns, 'v2'))),  # Uses Django REST Framework Generic Views\n    path('v3/', include((v3_patterns, 'v3'))),  # Uses Django REST Framework ViewSets\n]\n"
  },
  {
    "path": "django-rest-framework-fast/api/v1/__init__.py",
    "content": ""
  },
  {
    "path": "django-rest-framework-fast/api/v1/apps.py",
    "content": "from django.apps import AppConfig\n\n\nclass V1Config(AppConfig):\n    name = 'v1'\n"
  },
  {
    "path": "django-rest-framework-fast/api/v1/readme.md",
    "content": "# v1 - Old School Django Generic Class-based View based API\n\nThis is one of the popular methods of creating an API that simply uses Django Genseric Views and specifies JSON as the response type.\n\nFrom this example, you can see that for the most part, these views mimic the views used in the non-api part of the codebase for form submission, which means you as the developer are maintaining two sets of almost identical code to have a browser-based path, and API path, for your project.\n\n"
  },
  {
    "path": "django-rest-framework-fast/api/v1/tests.py",
    "content": "from django.test import TestCase\n\n# Create your tests here.\n"
  },
  {
    "path": "django-rest-framework-fast/api/v1/urls.py",
    "content": "from django.urls import path, include\n\nfrom api.v1 import views\n\n\ncharacter_api_patterns = [\n    path('', views.CharacterListAPIView.as_view(), name='list'),\n    path('<int:pk>', views.CharacterDetailAPIView.as_view(), name='detail'),\n    path('create', views.CharacterCreateAPIView.as_view(), name='create'),\n    path('<int:pk>/update', views.CharacterUpdateAPIView.as_view(), name='update'),\n    path('<int:pk>/delete', views.CharacterDeleteAPIView.as_view(), name='delete'),\n]\n\nv1_patterns = [\n    path('characters/', include((character_api_patterns, 'characters')))\n]\n"
  },
  {
    "path": "django-rest-framework-fast/api/v1/views.py",
    "content": "from django.core import serializers\nfrom django.http import JsonResponse\nfrom django.views.generic import UpdateView, CreateView, DetailView, ListView\nfrom django.views.generic.detail import BaseDetailView\n\nfrom characters.models import Character\nfrom common.mixins import JsonResponseMixin\n\n\nclass CharacterListAPIView(JsonResponseMixin, ListView):\n    model = Character\n\n    def get_response(self):\n        return serializers.serialize('json', self.object_list)\n\n    def get_response_kwargs(self):\n        return {'safe': False}\n\n\nclass CharacterDetailAPIView(JsonResponseMixin, DetailView):\n    model = Character\n\n    def get_response(self):\n        return serializers.serialize('json', [self.object])\n\n    def get_response_kwargs(self):\n        return {'safe': False}\n\n\nclass CharacterCreateAPIView(CreateView):\n    model = Character\n    fields = ('name', 'description', 'profession', 'mentor', 'team', 'type',)\n\n    def form_valid(self, form):\n        super().form_valid(form)\n        return JsonResponse(serializers.serialize('json', [self.object]), safe=False)\n\n\nclass CharacterUpdateAPIView(UpdateView):\n    model = Character\n    fields = ('name', 'description', 'profession', 'mentor', 'team', 'type',)\n\n    def form_valid(self, form):\n        super().form_valid(form)\n        return JsonResponse(serializers.serialize('json', [self.object]), safe=False)\n\n\nclass CharacterDeleteAPIView(BaseDetailView):\n    model = Character\n\n    def post(self):\n        self.object = self.get_object()\n        self.object.delete()\n        return JsonResponse({'success': True})\n"
  },
  {
    "path": "django-rest-framework-fast/api/v2/__init__.py",
    "content": ""
  },
  {
    "path": "django-rest-framework-fast/api/v2/apps.py",
    "content": "from django.apps import AppConfig\n\n\nclass V2Config(AppConfig):\n    name = 'v2'\n"
  },
  {
    "path": "django-rest-framework-fast/api/v2/readme.md",
    "content": "# v2 - Django REST Framework Generic Views\n\nBy using Django REST Framework views, you can consolidate the examples from the api.v1 into more succinct views that handle all the API based actions for you.\n\nIn this example, our views no longer mimic the browser-based views used in our webapp frontend, but are now their own thing and handle all the API verbs one would expect. On top of that, the endpoints automatically return the serialized data in the format expected. If accessed via a browser, the browsable API is returned.\n\nOur urls.py is also much smaller and easier to maintain.\n\n"
  },
  {
    "path": "django-rest-framework-fast/api/v2/tests.py",
    "content": "from django.test import TestCase\n\n# Create your tests here.\n"
  },
  {
    "path": "django-rest-framework-fast/api/v2/urls.py",
    "content": "from django.urls import path, include\nfrom rest_framework.urlpatterns import format_suffix_patterns\n\nfrom . import views\n\n\ncharacter_drf_patterns = [\n    path('', views.CharacterListView.as_view(), name='list_create'),\n    path('<int:pk>', views.CharacterDetailView.as_view(), name='get_update_delete'),\n]\n\n# append suffix specifiers for drf\ncharacter_drf_patterns = format_suffix_patterns(character_drf_patterns)\n\nv2_patterns = [\n    path('characters/', include((character_drf_patterns, 'characters')))\n]\n"
  },
  {
    "path": "django-rest-framework-fast/api/v2/views.py",
    "content": "from characters.models import Character\nfrom characters.serializers import CharacterSerializer\nfrom rest_framework import generics\n\n\nclass CharacterListView(generics.ListCreateAPIView):\n    queryset = Character.objects.all()\n    serializer_class = CharacterSerializer\n\n\nclass CharacterDetailView(generics.RetrieveUpdateDestroyAPIView):\n    queryset = Character.objects.all()\n    serializer_class = CharacterSerializer\n"
  },
  {
    "path": "django-rest-framework-fast/api/v3/__init__.py",
    "content": ""
  },
  {
    "path": "django-rest-framework-fast/api/v3/apps.py",
    "content": "from django.apps import AppConfig\n\n\nclass V3Config(AppConfig):\n    name = 'v3'\n"
  },
  {
    "path": "django-rest-framework-fast/api/v3/readme.md",
    "content": "# v3 - Django REST Framework ViewSets\n\nBy using Django REST Framework ViewSets, you can consolidate the examples from the api.v2 even further, reducing the code to a single ViewSet. Our urls also take advantage of Django REST Framework ViewSet handling and we only have a single route to handle all requests to our endpoint. All verbs are handled properly and the browsable API is again, accessible if the endpoint is hit via a browser.\n"
  },
  {
    "path": "django-rest-framework-fast/api/v3/tests.py",
    "content": "from django.test import TestCase\n\n# Create your tests here.\n"
  },
  {
    "path": "django-rest-framework-fast/api/v3/urls.py",
    "content": "from django.urls import path, include\nfrom rest_framework.routers import DefaultRouter\n\nfrom . import views\n\n\nrouter = DefaultRouter()\nrouter.register(r'characters', views.CharacterViewSet)\n\nv3_patterns = [\n    path('', include(router.urls)),\n]\n"
  },
  {
    "path": "django-rest-framework-fast/api/v3/views.py",
    "content": "\"\"\"\nViews for the Character API\n\"\"\"\nfrom characters.models import Character\nfrom characters.serializers import CharacterSerializer\nfrom rest_framework import viewsets\n\n\nclass CharacterViewSet(viewsets.ModelViewSet):\n    queryset = Character.objects.all()\n    serializer_class = CharacterSerializer\n"
  },
  {
    "path": "django-rest-framework-fast/characters/__init__.py",
    "content": ""
  },
  {
    "path": "django-rest-framework-fast/characters/admin.py",
    "content": "from django.contrib import admin\n\nfrom characters.models import Character, Team, Line, LineModifier\n\nadmin.site.register(Character)\nadmin.site.register(Team)\nadmin.site.register(Line)\nadmin.site.register(LineModifier)\n"
  },
  {
    "path": "django-rest-framework-fast/characters/apps.py",
    "content": "from django.apps import AppConfig\n\n\nclass CharactersConfig(AppConfig):\n    name = 'characters'\n"
  },
  {
    "path": "django-rest-framework-fast/characters/constants.py",
    "content": "HERO = 'hero'\nVILLAIN = 'villain'\nSIDEKICK = 'sidekick'\nCOMEDIC = 'comedic'\nEXTRA = 'extra'\nSOLO = 'solo'\n\nCHARACTER_TYPES = (\n    (HERO, 'Hero'),\n    (VILLAIN, 'Villain'),\n    (SIDEKICK, 'Sidekick'),\n    (COMEDIC, 'Comedic'),\n    (EXTRA, 'Extra'),\n    (SOLO, 'Solo Artist'),\n)\n"
  },
  {
    "path": "django-rest-framework-fast/characters/forms.py",
    "content": "\"\"\"\nForms for Character model\n\"\"\"\nfrom django import forms\n\nfrom characters.models import Character\n\n\nclass CharacterCreateView(forms.ModelForm):\n    class Meta:\n        model = Character\n        fields = ('name', 'description', 'profession', 'mentor', 'team', 'type',)\n\n\nclass CharacterUpdateView(forms.ModelForm):\n    class Meta:\n        model = Character\n        fields = ('name', 'description', 'profession', 'mentor', 'team', 'type',)\n"
  },
  {
    "path": "django-rest-framework-fast/characters/migrations/0001_squashed_0003_auto_20190416_1625.py",
    "content": "# Generated by Django 2.2 on 2019-04-16 19:59\n\nfrom django.db import migrations, models\nimport django.db.models.deletion\n\n\nclass Migration(migrations.Migration):\n\n    initial = True\n\n    dependencies = [\n    ]\n\n    operations = [\n        migrations.CreateModel(\n            name='Line',\n            fields=[\n                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),\n                ('line_text', models.TextField()),\n            ],\n        ),\n        migrations.CreateModel(\n            name='Team',\n            fields=[\n                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),\n                ('name', models.CharField(max_length=100)),\n                ('description', models.TextField()),\n            ],\n        ),\n        migrations.CreateModel(\n            name='Character',\n            fields=[\n                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),\n                ('name', models.CharField(max_length=100)),\n                ('description', models.TextField()),\n                ('profession', models.CharField(max_length=50)),\n                ('type', models.CharField(choices=[('hero', 'Hero'), ('villain', 'Villain'), ('sidekick', 'Sidekick'), ('comedic', 'Comedic'), ('extra', 'Extra'), ('solo', 'Solo Artist')], default='extra', max_length=20)),\n                ('mentor', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='proteges', to='characters.Character')),\n                ('team', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='characters.Team')),\n            ],\n        ),\n        migrations.CreateModel(\n            name='LineModifier',\n            fields=[\n                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),\n                ('modifier', models.CharField(max_length=50)),\n                ('character', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='line_modifiers', to='characters.Character')),\n            ],\n        ),\n    ]\n"
  },
  {
    "path": "django-rest-framework-fast/characters/migrations/__init__.py",
    "content": ""
  },
  {
    "path": "django-rest-framework-fast/characters/models.py",
    "content": "\"\"\"\nCharacter models\n\"\"\"\n\nimport random\n\nfrom django.db import models\nfrom django.urls import reverse_lazy\n\nfrom .constants import CHARACTER_TYPES, EXTRA\n\n\nclass Character(models.Model):\n    name = models.CharField(max_length=100)\n    description = models.TextField()\n    profession = models.CharField(max_length=50)  # Choices later\n    mentor = models.ForeignKey('Character', models.DO_NOTHING, related_name='proteges', null=True, blank=True)\n    team = models.ForeignKey('Team', models.DO_NOTHING, null=True, blank=True)\n    type = models.CharField(max_length=20, choices=CHARACTER_TYPES, default=EXTRA)\n\n    def __str__(self):\n        return '{name} ({team_name})'.format(name=self.name, team_name=self.team.name)\n\n    @staticmethod\n    def get_random_line():\n        try:\n            return random.choice(Line.objects.all())\n        except IndexError:\n            return 'Say what..?'\n\n    def get_random_line_modifier(self):\n        try:\n            return random.choice(self.line_modifiers.all())\n        except IndexError:\n            return ''\n\n    def get_line(self):\n        return '{} {}'.format(self.get_random_line(), self.get_random_line_modifier())\n\n    def get_absolute_url(self):\n        return reverse_lazy('characters:detail', kwargs={'pk': self.pk})\n\n\nclass Team(models.Model):\n    name = models.CharField(max_length=100)\n    description = models.TextField()\n\n    def __str__(self):\n        return self.name\n\n\nclass LineModifier(models.Model):\n    character = models.ForeignKey('Character', models.DO_NOTHING, related_name='line_modifiers')\n    modifier = models.CharField(max_length=50)\n\n    def __str__(self):\n        return self.modifier\n\n\nclass Line(models.Model):\n\n    line_text = models.TextField()\n\n    def __str__(self):\n        return self.line_text\n"
  },
  {
    "path": "django-rest-framework-fast/characters/serializers.py",
    "content": "\"\"\"\nSerializers for Character model\n\"\"\"\n\nfrom rest_framework import serializers\n\nfrom characters.models import Character\n\n\nclass CharacterSerializer(serializers.ModelSerializer):\n    mentor = serializers.StringRelatedField()\n    team = serializers.StringRelatedField()\n    random_line = serializers.SerializerMethodField()\n\n    @staticmethod\n    def get_random_line(obj):\n        return obj.get_line()\n\n    class Meta:\n        model = Character\n        fields = (\n            'name', 'description', 'profession', 'mentor', 'team', 'type', 'random_line',\n        )\n"
  },
  {
    "path": "django-rest-framework-fast/characters/templates/characters/character_confirm_delete.html",
    "content": "{% extends 'common/__base.html' %}\n\n{% load crispy_forms_tags %}\n\n{% block content %}\n     <form method=\"post\">\n         <div class=\"text-center\">\n             <p>Are you sure you want to delete character: {{ object.name }}</p>\n             {% csrf_token %}\n             {{ form|crispy }}\n             <button type=\"submit\" class=\"btn btn-primary\">Submit</button>\n             <a href=\"{{ object.get_absolute_url }}\" class=\"btn btn-primary\">Cancel</a>\n         </div>\n     </form>\n{% endblock content %}\n"
  },
  {
    "path": "django-rest-framework-fast/characters/templates/characters/character_detail.html",
    "content": "{% extends 'common/__base.html' %}\n\n{% block content %}\n    <div class=\"text-center\">\n        <h1>{{ character.name}}</h1>\n        <h2>{{character.description}}</h2>\n        <h3>{{ character.name}} is part of the {{ character.team.name|title }}</h3>\n        <p>\n            {% if character.line_modifiers.exists %}\n                \"{{ character.get_line }}\"\n            {% endif %}\n        </p>\n        <a href=\"{% url 'characters:delete' pk=character.pk %}\" class=\"btn btn-primary btn-sm\">Delete</a>\n        <a href=\"{% url 'characters:update' pk=character.pk %}\" class=\"btn btn-primary btn-sm\">Update</a>\n    </div>\n{% endblock content %}\n"
  },
  {
    "path": "django-rest-framework-fast/characters/templates/characters/character_form.html",
    "content": "{% extends 'common/__base.html' %}\n\n{% load crispy_forms_tags %}\n\n{% block content %}\n     <form method=\"post\">\n         {% csrf_token %}\n         {{ form|crispy }}\n         <button type=\"submit\" class=\"btn btn-primary\">Submit</button>\n     </form>\n{% endblock content %}\n"
  },
  {
    "path": "django-rest-framework-fast/characters/templates/characters/character_list.html",
    "content": "{% extends 'common/__base.html' %}\n\n{% block content %}\n    <div class=\"row\">\n        <div class=\"col-lg-4\">\n            <div class=\"bs-component\">\n                <div class=\"list-group\">\n                    <span class=\"list-group-item list-group-item-action active\">\n                        Characters\n                    </span>\n                    {% for object in object_list %}\n                        <a href=\"{{ object.get_absolute_url }}\" class=\"list-group-item list-group-item-action\">\n                            {{ object.name }}\n                        </a>\n                    {% endfor %}\n                </div>\n            </div>\n        </div>\n    </div>\n{% endblock content %}\n"
  },
  {
    "path": "django-rest-framework-fast/characters/templates/characters/character_update_form.html",
    "content": "{% extends 'common/__base.html' %}\n\n{% load crispy_forms_tags %}\n\n{% block content %}\n     <form method=\"post\">\n         {% csrf_token %}\n         {{ form|crispy }}\n         <button type=\"submit\" class=\"btn btn-primary\">Submit</button>\n     </form>\n{% endblock content %}\n"
  },
  {
    "path": "django-rest-framework-fast/characters/tests.py",
    "content": "from django.test import TestCase\n\n# Create your tests here.\n"
  },
  {
    "path": "django-rest-framework-fast/characters/urls.py",
    "content": "\"\"\"\nUrls for the characters app\n\"\"\"\nfrom django.urls import path\n\nfrom .views import (\n    CharacterListView, CharacterDetailView, CharacterCreateView,\n    CharacterUpdateView, CharacterDeleteView,\n)\n\ncharacter_patterns = [\n    path('', CharacterListView.as_view(), name='list'),\n    path('<int:pk>', CharacterDetailView.as_view(), name='detail'),\n    path('create', CharacterCreateView.as_view(), name='create'),\n    path('<int:pk>/update', CharacterUpdateView.as_view(), name='update'),\n    path('<int:pk>/delete', CharacterDeleteView.as_view(), name='delete'),\n]\n"
  },
  {
    "path": "django-rest-framework-fast/characters/views.py",
    "content": "from django.urls import reverse_lazy\nfrom django.views.generic import DeleteView, UpdateView, CreateView, DetailView, ListView\n\nfrom characters.models import Character\n\n\nclass CharacterListView(ListView):\n    model = Character\n\n\nclass CharacterDetailView(DetailView):\n    model = Character\n\n\nclass CharacterCreateView(CreateView):\n    model = Character\n    fields = ('name', 'description', 'profession', 'mentor', 'team', 'type',)\n\n\nclass CharacterUpdateView(UpdateView):\n    model = Character\n    fields = ('name', 'description', 'profession', 'mentor', 'team', 'type',)\n\n\nclass CharacterDeleteView(DeleteView):\n    model = Character\n    success_url = reverse_lazy('character:list')\n"
  },
  {
    "path": "django-rest-framework-fast/common/__init__.py",
    "content": ""
  },
  {
    "path": "django-rest-framework-fast/common/admin.py",
    "content": "from django.contrib import admin\n\n# Register your models here.\n"
  },
  {
    "path": "django-rest-framework-fast/common/apps.py",
    "content": "from django.apps import AppConfig\n\n\nclass CommonConfig(AppConfig):\n    name = 'common'\n"
  },
  {
    "path": "django-rest-framework-fast/common/migrations/__init__.py",
    "content": ""
  },
  {
    "path": "django-rest-framework-fast/common/mixins.py",
    "content": "from django.http import JsonResponse\n\n\nclass JsonResponseMixin(object):\n    \"\"\"\n    JsonResponse that can be dropped into class-based views relying on render_to_response\n    \"\"\"\n    response_class = JsonResponse\n    response_parser_kwargs = {}\n\n    def get_response_kwargs(self):\n        \"\"\"\n        Override this in your child class if you need to add kwargs to your response_class\n\n        :return: the keyword arguments for instantiating the response_class\n        \"\"\"\n        return self.response_parser_kwargs\n\n    def render_to_response(self, context):\n        \"\"\"\n        Cache context on the instance and return the response through the response_class\n        \"\"\"\n        self.context = context\n        return self.response_class(self.get_response(), **self.get_response_kwargs())\n"
  },
  {
    "path": "django-rest-framework-fast/common/models.py",
    "content": "from django.db import models\n\n# Create your models here.\n"
  },
  {
    "path": "django-rest-framework-fast/common/templates/common/__base.html",
    "content": "{%  load static %}\n\n<!doctype html>\n<!--[if lt IE 7]>      <html class=\"no-js lt-ie9 lt-ie8 lt-ie7\" lang=\"\"> <![endif]-->\n<!--[if IE 7]>         <html class=\"no-js lt-ie9 lt-ie8\" lang=\"\"> <![endif]-->\n<!--[if IE 8]>         <html class=\"no-js lt-ie9\" lang=\"\"> <![endif]-->\n<!--[if gt IE 8]><!--> <html class=\"no-js\" lang=\"\"> <!--<![endif]-->\n    <head>\n        <meta charset=\"utf-8\">\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n        <title></title>\n        <meta name=\"description\" content=\"\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\n        <link rel=\"stylesheet\" href=\"{% static 'css/bootstrap.min.css' %}\">\n        <style>\n            body {\n                padding-top: 50px;\n                padding-bottom: 20px;\n            }\n        </style>\n        <link rel=\"stylesheet\" href=\"{% static 'css/bootstrap-theme.min.css' %}\">\n        <link rel=\"stylesheet\" href=\"{% static 'css/main.css' %}\">\n\n        <script src=\"{% static 'js/vendor/modernizr-2.8.3-respond-1.4.2.min.js' %}\"></script>\n    </head>\n    <body>\n        <!--[if lt IE 8]>\n            <p class=\"browserupgrade\">You are using an <strong>outdated</strong> browser. Please <a href=\"http://browsehappy.com/\">upgrade your browser</a> to improve your experience.</p>\n        <![endif]-->\n\n    <!-- Main jumbotron for a primary marketing message or call to action -->\n    <div class=\"container\">\n        <div class=\"jumbotron\">\n            {% block content %}\n                {# nothing to see here, inherit from your other templates to put content in this block #}\n            {% endblock content %}\n        </div>\n    </div>\n\n    <footer>\n    </footer>\n\n    </div> <!-- /container -->        <script src=\"//ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js\"></script>\n        <script>window.jQuery || document.write('<script src=\"{% static 'common/js/jquery-1.12.4.min.js' %}\"><\\/script>')</script>\n\n        <script src=\"{% static 'js/vendor/bootstrap.min.js' %}\"></script>\n\n        <script src=\"{% static 'js/main.js' %}\"></script>\n\n        <!-- Google Analytics: change UA-XXXXX-X to be your site's ID. -->\n        <script>\n            (function(b,o,i,l,e,r){b.GoogleAnalyticsObject=l;b[l]||(b[l]=\n            function(){(b[l].q=b[l].q||[]).push(arguments)});b[l].l=+new Date;\n            e=o.createElement(i);r=o.getElementsByTagName(i)[0];\n            e.src='//www.google-analytics.com/analytics.js';\n            r.parentNode.insertBefore(e,r)}(window,document,'script','ga'));\n            ga('create','UA-XXXXX-X','auto');ga('send','pageview');\n        </script>\n    </body>\n</html>\n"
  },
  {
    "path": "django-rest-framework-fast/common/tests.py",
    "content": "from django.test import TestCase\n\n# Create your tests here.\n"
  },
  {
    "path": "django-rest-framework-fast/common/views.py",
    "content": "from django.shortcuts import render\n\n# Create your views here.\n"
  },
  {
    "path": "django-rest-framework-fast/config/__init__.py",
    "content": ""
  },
  {
    "path": "django-rest-framework-fast/config/settings/__init__.py",
    "content": ""
  },
  {
    "path": "django-rest-framework-fast/config/settings/base.py",
    "content": "\"\"\"\nDjango settings for config project.\n\nGenerated by 'django-admin startproject' using Django 2.2.\n\nFor more information on this file, see\nhttps://docs.djangoproject.com/en/2.2/topics/settings/\n\nFor the full list of settings and their values, see\nhttps://docs.djangoproject.com/en/2.2/ref/settings/\n\"\"\"\n\nimport os\n\nfrom django.core.exceptions import ImproperlyConfigured\nfrom unipath import Path\n\n# Build paths inside the project like this: BASE_DIR.child('dirname')\nBASE_DIR = Path(__file__).ancestor(3)\n\n\ndef get_env_variable(var_name, default=None):\n    \"\"\"\n    Get the environment variable or return exception\n    \"\"\"\n    try:\n        return os.environ[var_name]\n    except KeyError:\n        if default is not None:\n            return default\n        message = 'Set the {} environment variable'.format(var_name)\n        raise ImproperlyConfigured(message)\n\n# Quick-start development settings - unsuitable for production\n# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/\n\n# SECURITY WARNING: keep the secret key used in production secret!\nSECRET_KEY = 'uxvty6%s420zixu_-3#ra4qi8g3qj=ca^4p@9bjfseoq(ny!h3'\n\n# SECURITY WARNING: don't run with debug turned on in production!\nDEBUG = True\n\nALLOWED_HOSTS = []\n\n\n# Application definition\n\nINSTALLED_APPS = [\n    'django.contrib.admin',\n    'django.contrib.auth',\n    'django.contrib.contenttypes',\n    'django.contrib.sessions',\n    'django.contrib.messages',\n    'django.contrib.staticfiles',\n    'rest_framework',\n    'crispy_forms',\n\n    # our apps\n    'characters',\n    'common',\n    'api',\n]\n\nMIDDLEWARE = [\n    'django.middleware.security.SecurityMiddleware',\n    'django.contrib.sessions.middleware.SessionMiddleware',\n    'django.middleware.common.CommonMiddleware',\n    'django.middleware.csrf.CsrfViewMiddleware',\n    'django.contrib.auth.middleware.AuthenticationMiddleware',\n    'django.contrib.messages.middleware.MessageMiddleware',\n    'django.middleware.clickjacking.XFrameOptionsMiddleware',\n]\n\nROOT_URLCONF = 'config.urls'\n\nTEMPLATES = [\n    {\n        'BACKEND': 'django.template.backends.django.DjangoTemplates',\n        'DIRS': [],\n        'APP_DIRS': True,\n        'OPTIONS': {\n            'context_processors': [\n                'django.template.context_processors.debug',\n                'django.template.context_processors.request',\n                'django.contrib.auth.context_processors.auth',\n                'django.contrib.messages.context_processors.messages',\n            ],\n        },\n    },\n]\n\nCRISPY_TEMPLATE_PACK = 'bootstrap4'\n\nWSGI_APPLICATION = 'config.wsgi.application'\n\n# Password validation\n# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators\n\nAUTH_PASSWORD_VALIDATORS = [\n    {\n        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',\n    },\n    {\n        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',\n    },\n    {\n        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',\n    },\n    {\n        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',\n    },\n]\n\n\n# Internationalization\n# https://docs.djangoproject.com/en/2.2/topics/i18n/\n\nLANGUAGE_CODE = 'en-us'\n\nTIME_ZONE = 'UTC'\n\nUSE_I18N = True\n\nUSE_L10N = True\n\nUSE_TZ = True\n\n\n# Static files (CSS, JavaScript, Images)\n# https://docs.djangoproject.com/en/2.2/howto/static-files/\n\n\nSTATICFILES_DIRS = ['static']  # Where we put our static files to be collected by collectstatic call\nSTATIC_ROOT = 'staticfiles'  # Where the system puts our files after collection\nSTATIC_URL = '/static/'  # The url at which our files are served from our web server to the browser\n"
  },
  {
    "path": "django-rest-framework-fast/config/settings/dev.py",
    "content": "from config.settings.base import *\n\nDEBUG = True\nALLOWED_HOSTS = ['*']\n\n# Database\nDATABASES = {\n    'default': {\n        'ENGINE': 'django.db.backends.sqlite3',\n        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),\n    }\n}\n\nINSTALLED_APPS += [\n    'django_extensions',\n]\n"
  },
  {
    "path": "django-rest-framework-fast/config/settings/prod.py",
    "content": "import django_heroku\nimport dj_database_url\n\nfrom config.settings.base import *\n\n# Database\n# Heroku: Update database configuration from $DATABASE_URL.\nDATABASES = {'default': dj_database_url.config(conn_max_age=500)}\n\ndjango_heroku.settings(locals(), logging=False, staticfiles=False)\n"
  },
  {
    "path": "django-rest-framework-fast/config/settings/test.py",
    "content": "import logging\n\nfrom config.settings.base import *\n\nlogging.disable(logging.CRITICAL)\n\nDEBUG = True\nALLOWED_HOSTS = ['*']\n\n# Database\nDATABASES = {\n    'default': {\n        'ENGINE': 'django.db.backends.postgresql',\n        'HOST': get_env_variable('PSQL_HOST'),\n        'NAME': get_env_variable('PSQL_NAME'),\n        'USER': get_env_variable('PSQL_USERNAME'),\n        'PASSWORD': get_env_variable('PSQL_USERNAME'),\n    }\n}\n"
  },
  {
    "path": "django-rest-framework-fast/config/urls.py",
    "content": "\"\"\"config URL Configuration\n\nThe `urlpatterns` list routes URLs to views. For more information please see:\n    https://docs.djangoproject.com/en/2.2/topics/http/urls/\nExamples:\nFunction views\n    1. Add an import:  from my_app import views\n    2. Add a URL to urlpatterns:  path('', views.home, name='home')\nClass-based views\n    1. Add an import:  from other_app.views import Home\n    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')\nIncluding another URLconf\n    1. Import the include() function: from django.urls import include, path\n    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))\n\"\"\"\nfrom django.contrib import admin\nfrom django.urls import path, include\n\nfrom api.urls import api_patterns\nfrom characters.urls import character_patterns\n\nurlpatterns = [\n    path('admin/', admin.site.urls),\n    path('characters/', include((character_patterns, 'characters'))),\n\n    path('api/', include((api_patterns, 'api')))\n]\n"
  },
  {
    "path": "django-rest-framework-fast/config/wsgi.py",
    "content": "\"\"\"\nWSGI config for config project.\n\nIt exposes the WSGI callable as a module-level variable named ``application``.\n\nFor more information on this file, see\nhttps://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/\n\"\"\"\n\nimport os\n\nfrom django.core.wsgi import get_wsgi_application\n\nos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.dev')\n\napplication = get_wsgi_application()\n"
  },
  {
    "path": "django-rest-framework-fast/docker-compose.yml",
    "content": "version: \"3.3\"\n\nservices:\n  superstoryboard_db:\n    image: postgres:alpine\n    environment:\n      POSTGRES_DB: superstoryboard\n      POSTGRES_USER: superstoryboard\n      POSTGRES_PASSWORD: superstoryboard\n    volumes:\n      - /var/run/superstoryboard-postgres-data:/var/lib/postgresql/data\n\n  superstoryboard:\n    depends_on:\n      - superstoryboard_db\n    build:\n      context: .\n      dockerfile: Dockerfile\n    image: superstoryboard\n    command: \"/ourenv/bin/python manage.py runserver 0.0.0.0:8009\"\n    ports:\n    - \"8009:8009\"\n    restart: always\n    volumes:\n      - .:/code\n    working_dir: /code\n    environment:\n      - DJANGO_SETTINGS_MODULE=config.settings.dev\n      - PYTHONUNBUFFERED=1\n      - PYTHONDONTWRITEBYTECODE=1\n      - PSQL_HOST=superstoryboard_db\n      - PSQL_NAME=superstoryboard\n      - PSQL_USERNAME=superstoryboard\n      - PSQL_PASSWORD=superstoryboard\n"
  },
  {
    "path": "django-rest-framework-fast/manage.py",
    "content": "#!/usr/bin/env python\n\"\"\"Django's command-line utility for administrative tasks.\"\"\"\nimport os\nimport sys\n\n\ndef main():\n    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.dev')\n    try:\n        from django.core.management import execute_from_command_line\n    except ImportError as exc:\n        raise ImportError(\n            \"Couldn't import Django. Are you sure it's installed and \"\n            \"available on your PYTHONPATH environment variable? Did you \"\n            \"forget to activate a virtual environment?\"\n        ) from exc\n    execute_from_command_line(sys.argv)\n\n\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "django-rest-framework-fast/requirements/base.txt",
    "content": "Unipath==1.1\ndj-database-url==0.5.0\nDjango==2.2\ndjango-storages==1.7.1\ndjangorestframework==3.9.2\nipython==7.4.0\npsycopg2==2.8.1\nwhitenoise==4.1.2\ndjango-crispy-forms==1.7.2\n"
  },
  {
    "path": "django-rest-framework-fast/requirements/dev.txt",
    "content": "-r base.txt  # includes base requirements\n\ndjango-debug-toolbar==1.11\ndjango-extensions==2.1.6\nisort==4.3.17\n"
  },
  {
    "path": "django-rest-framework-fast/requirements/prod.txt",
    "content": "-r base.txt  # includes base requirements\n\ngunicorn==19.9.0\ndjango-heroku==0.3.1\n"
  },
  {
    "path": "django-rest-framework-fast/requirements.txt",
    "content": "-r requirements/prod.txt  # shortcut to prod requirements\n\n# Modifications to prod requirements should go in requirements/prod.txt.\n# This file is for convenience only\n\n"
  },
  {
    "path": "django-rest-framework-fast/static/404.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <title>Page Not Found</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <style>\n\n        * {\n            line-height: 1.2;\n            margin: 0;\n        }\n\n        html {\n            color: #888;\n            display: table;\n            font-family: sans-serif;\n            height: 100%;\n            text-align: center;\n            width: 100%;\n        }\n\n        body {\n            display: table-cell;\n            vertical-align: middle;\n            margin: 2em auto;\n        }\n\n        h1 {\n            color: #555;\n            font-size: 2em;\n            font-weight: 400;\n        }\n\n        p {\n            margin: 0 auto;\n            width: 280px;\n        }\n\n        @media only screen and (max-width: 280px) {\n\n            body, p {\n                width: 95%;\n            }\n\n            h1 {\n                font-size: 1.5em;\n                margin: 0 0 0.3em;\n            }\n\n        }\n\n    </style>\n</head>\n<body>\n    <h1>Page Not Found</h1>\n    <p>Sorry, but the page you were trying to view does not exist.</p>\n</body>\n</html>\n<!-- IE needs 512+ bytes: http://blogs.msdn.com/b/ieinternals/archive/2010/08/19/http-error-pages-in-internet-explorer.aspx -->\n"
  },
  {
    "path": "django-rest-framework-fast/static/css/bootstrap-theme.css",
    "content": "/*!\n * Bootstrap v3.3.1 (http://getbootstrap.com)\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n  text-shadow: none;\n}\n.btn:active,\n.btn.active {\n  background-image: none;\n}\n.btn-default {\n  text-shadow: 0 1px 0 #fff;\n  background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n  background-image:      -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));\n  background-image:         linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #dbdbdb;\n  border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n  background-color: #e0e0e0;\n  background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n  background-color: #e0e0e0;\n  border-color: #dbdbdb;\n}\n.btn-default:disabled,\n.btn-default[disabled] {\n  background-color: #e0e0e0;\n  background-image: none;\n}\n.btn-primary {\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n  background-image:      -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));\n  background-image:         linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n  background-color: #265a88;\n  background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n  background-color: #265a88;\n  border-color: #245580;\n}\n.btn-primary:disabled,\n.btn-primary[disabled] {\n  background-color: #265a88;\n  background-image: none;\n}\n.btn-success {\n  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n  background-image:      -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));\n  background-image:         linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n  background-color: #419641;\n  background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n  background-color: #419641;\n  border-color: #3e8f3e;\n}\n.btn-success:disabled,\n.btn-success[disabled] {\n  background-color: #419641;\n  background-image: none;\n}\n.btn-info {\n  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n  background-image:      -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));\n  background-image:         linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n  background-color: #2aabd2;\n  background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n  background-color: #2aabd2;\n  border-color: #28a4c9;\n}\n.btn-info:disabled,\n.btn-info[disabled] {\n  background-color: #2aabd2;\n  background-image: none;\n}\n.btn-warning {\n  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n  background-image:      -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));\n  background-image:         linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n  background-color: #eb9316;\n  background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n  background-color: #eb9316;\n  border-color: #e38d13;\n}\n.btn-warning:disabled,\n.btn-warning[disabled] {\n  background-color: #eb9316;\n  background-image: none;\n}\n.btn-danger {\n  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n  background-image:      -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));\n  background-image:         linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n  background-color: #c12e2a;\n  background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n  background-color: #c12e2a;\n  border-color: #b92c28;\n}\n.btn-danger:disabled,\n.btn-danger[disabled] {\n  background-color: #c12e2a;\n  background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);\n          box-shadow: 0 1px 2px rgba(0, 0, 0, .075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  background-color: #e8e8e8;\n  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image:      -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));\n  background-image:         linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n  background-repeat: repeat-x;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  background-color: #2e6da4;\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n  background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n  background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n  background-repeat: repeat-x;\n}\n.navbar-default {\n  background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);\n  background-image:      -o-linear-gradient(top, #fff 0%, #f8f8f8 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));\n  background-image:         linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n  background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n  background-image:      -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));\n  background-image:         linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n  background-repeat: repeat-x;\n  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n  text-shadow: 0 1px 0 rgba(255, 255, 255, .25);\n}\n.navbar-inverse {\n  background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);\n  background-image:      -o-linear-gradient(top, #3c3c3c 0%, #222 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));\n  background-image:         linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n  background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n  background-image:      -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));\n  background-image:         linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n  background-repeat: repeat-x;\n  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);\n          box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  border-radius: 0;\n}\n@media (max-width: 767px) {\n  .navbar .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #fff;\n    background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n    background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n    background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n    background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n    background-repeat: repeat-x;\n  }\n}\n.alert {\n  text-shadow: 0 1px 0 rgba(255, 255, 255, .2);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);\n}\n.alert-success {\n  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n  background-image:      -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));\n  background-image:         linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #b2dba1;\n}\n.alert-info {\n  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n  background-image:      -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));\n  background-image:         linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #9acfea;\n}\n.alert-warning {\n  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n  background-image:      -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));\n  background-image:         linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #f5e79e;\n}\n.alert-danger {\n  background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n  background-image:      -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));\n  background-image:         linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #dca7a7;\n}\n.progress {\n  background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n  background-image:      -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));\n  background-image:         linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar {\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n  background-image:      -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));\n  background-image:         linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar-success {\n  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n  background-image:      -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));\n  background-image:         linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar-info {\n  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n  background-image:      -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));\n  background-image:         linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar-warning {\n  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n  background-image:      -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));\n  background-image:         linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar-danger {\n  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n  background-image:      -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));\n  background-image:         linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar-striped {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.list-group {\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);\n          box-shadow: 0 1px 2px rgba(0, 0, 0, .075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  text-shadow: 0 -1px 0 #286090;\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n  background-image:      -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a));\n  background-image:         linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n  text-shadow: none;\n}\n.panel {\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);\n          box-shadow: 0 1px 2px rgba(0, 0, 0, .05);\n}\n.panel-default > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image:      -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));\n  background-image:         linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n  background-repeat: repeat-x;\n}\n.panel-primary > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n  background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n  background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n  background-repeat: repeat-x;\n}\n.panel-success > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n  background-image:      -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));\n  background-image:         linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n  background-repeat: repeat-x;\n}\n.panel-info > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n  background-image:      -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));\n  background-image:         linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n  background-repeat: repeat-x;\n}\n.panel-warning > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n  background-image:      -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));\n  background-image:         linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n  background-repeat: repeat-x;\n}\n.panel-danger > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n  background-image:      -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));\n  background-image:         linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n  background-repeat: repeat-x;\n}\n.well {\n  background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n  background-image:      -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));\n  background-image:         linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #dcdcdc;\n  -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);\n          box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */\n"
  },
  {
    "path": "django-rest-framework-fast/static/css/bootstrap.css",
    "content": "/*!\n * Bootstrap v3.3.1 (http://getbootstrap.com)\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\nhtml {\n  font-family: sans-serif;\n  -webkit-text-size-adjust: 100%;\n      -ms-text-size-adjust: 100%;\n}\nbody {\n  margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block;\n  vertical-align: baseline;\n}\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n[hidden],\ntemplate {\n  display: none;\n}\na {\n  background-color: transparent;\n}\na:active,\na:hover {\n  outline: 0;\n}\nabbr[title] {\n  border-bottom: 1px dotted;\n}\nb,\nstrong {\n  font-weight: bold;\n}\ndfn {\n  font-style: italic;\n}\nh1 {\n  margin: .67em 0;\n  font-size: 2em;\n}\nmark {\n  color: #000;\n  background: #ff0;\n}\nsmall {\n  font-size: 80%;\n}\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\nsup {\n  top: -.5em;\n}\nsub {\n  bottom: -.25em;\n}\nimg {\n  border: 0;\n}\nsvg:not(:root) {\n  overflow: hidden;\n}\nfigure {\n  margin: 1em 40px;\n}\nhr {\n  height: 0;\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n}\npre {\n  overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  margin: 0;\n  font: inherit;\n  color: inherit;\n}\nbutton {\n  overflow: visible;\n}\nbutton,\nselect {\n  text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button;\n  cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\ninput {\n  line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n  padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\nfieldset {\n  padding: .35em .625em .75em;\n  margin: 0 2px;\n  border: 1px solid #c0c0c0;\n}\nlegend {\n  padding: 0;\n  border: 0;\n}\ntextarea {\n  overflow: auto;\n}\noptgroup {\n  font-weight: bold;\n}\ntable {\n  border-spacing: 0;\n  border-collapse: collapse;\n}\ntd,\nth {\n  padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n  *,\n  *:before,\n  *:after {\n    color: #000 !important;\n    text-shadow: none !important;\n    background: transparent !important;\n    -webkit-box-shadow: none !important;\n            box-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  a[href^=\"#\"]:after,\n  a[href^=\"javascript:\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  select {\n    background: #fff !important;\n  }\n  .navbar {\n    display: none;\n  }\n  .btn > .caret,\n  .dropup > .btn > .caret {\n    border-top-color: #000 !important;\n  }\n  .label {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n@font-face {\n  font-family: 'Glyphicons Halflings';\n\n  src: url('../fonts/glyphicons-halflings-regular.eot');\n  src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n  content: \"\\2a\";\n}\n.glyphicon-plus:before {\n  content: \"\\2b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n  content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n  content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n  content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n  content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n  content: \"\\270f\";\n}\n.glyphicon-glass:before {\n  content: \"\\e001\";\n}\n.glyphicon-music:before {\n  content: \"\\e002\";\n}\n.glyphicon-search:before {\n  content: \"\\e003\";\n}\n.glyphicon-heart:before {\n  content: \"\\e005\";\n}\n.glyphicon-star:before {\n  content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n  content: \"\\e007\";\n}\n.glyphicon-user:before {\n  content: \"\\e008\";\n}\n.glyphicon-film:before {\n  content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n  content: \"\\e010\";\n}\n.glyphicon-th:before {\n  content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n  content: \"\\e012\";\n}\n.glyphicon-ok:before {\n  content: \"\\e013\";\n}\n.glyphicon-remove:before {\n  content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n  content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n  content: \"\\e016\";\n}\n.glyphicon-off:before {\n  content: \"\\e017\";\n}\n.glyphicon-signal:before {\n  content: \"\\e018\";\n}\n.glyphicon-cog:before {\n  content: \"\\e019\";\n}\n.glyphicon-trash:before {\n  content: \"\\e020\";\n}\n.glyphicon-home:before {\n  content: \"\\e021\";\n}\n.glyphicon-file:before {\n  content: \"\\e022\";\n}\n.glyphicon-time:before {\n  content: \"\\e023\";\n}\n.glyphicon-road:before {\n  content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n  content: \"\\e025\";\n}\n.glyphicon-download:before {\n  content: \"\\e026\";\n}\n.glyphicon-upload:before {\n  content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n  content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n  content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n  content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n  content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n  content: \"\\e032\";\n}\n.glyphicon-lock:before {\n  content: \"\\e033\";\n}\n.glyphicon-flag:before {\n  content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n  content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n  content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n  content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n  content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n  content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n  content: \"\\e040\";\n}\n.glyphicon-tag:before {\n  content: \"\\e041\";\n}\n.glyphicon-tags:before {\n  content: \"\\e042\";\n}\n.glyphicon-book:before {\n  content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n  content: \"\\e044\";\n}\n.glyphicon-print:before {\n  content: \"\\e045\";\n}\n.glyphicon-camera:before {\n  content: \"\\e046\";\n}\n.glyphicon-font:before {\n  content: \"\\e047\";\n}\n.glyphicon-bold:before {\n  content: \"\\e048\";\n}\n.glyphicon-italic:before {\n  content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n  content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n  content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n  content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n  content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n  content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n  content: \"\\e055\";\n}\n.glyphicon-list:before {\n  content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n  content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n  content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n  content: \"\\e059\";\n}\n.glyphicon-picture:before {\n  content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n  content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n  content: \"\\e063\";\n}\n.glyphicon-tint:before {\n  content: \"\\e064\";\n}\n.glyphicon-edit:before {\n  content: \"\\e065\";\n}\n.glyphicon-share:before {\n  content: \"\\e066\";\n}\n.glyphicon-check:before {\n  content: \"\\e067\";\n}\n.glyphicon-move:before {\n  content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n  content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n  content: \"\\e070\";\n}\n.glyphicon-backward:before {\n  content: \"\\e071\";\n}\n.glyphicon-play:before {\n  content: \"\\e072\";\n}\n.glyphicon-pause:before {\n  content: \"\\e073\";\n}\n.glyphicon-stop:before {\n  content: \"\\e074\";\n}\n.glyphicon-forward:before {\n  content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n  content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n  content: \"\\e077\";\n}\n.glyphicon-eject:before {\n  content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n  content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n  content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n  content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n  content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n  content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n  content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n  content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n  content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n  content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n  content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n  content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n  content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n  content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n  content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n  content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n  content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n  content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n  content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n  content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\";\n}\n.glyphicon-gift:before {\n  content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n  content: \"\\e103\";\n}\n.glyphicon-fire:before {\n  content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n  content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n  content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n  content: \"\\e107\";\n}\n.glyphicon-plane:before {\n  content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n  content: \"\\e109\";\n}\n.glyphicon-random:before {\n  content: \"\\e110\";\n}\n.glyphicon-comment:before {\n  content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n  content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n  content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n  content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n  content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n  content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n  content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n  content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n  content: \"\\e122\";\n}\n.glyphicon-bell:before {\n  content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n  content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n  content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n  content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n  content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n  content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\";\n}\n.glyphicon-globe:before {\n  content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n  content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n  content: \"\\e137\";\n}\n.glyphicon-filter:before {\n  content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n  content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n  content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n  content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n  content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n  content: \"\\e143\";\n}\n.glyphicon-link:before {\n  content: \"\\e144\";\n}\n.glyphicon-phone:before {\n  content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n  content: \"\\e146\";\n}\n.glyphicon-usd:before {\n  content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n  content: \"\\e149\";\n}\n.glyphicon-sort:before {\n  content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n  content: \"\\e157\";\n}\n.glyphicon-expand:before {\n  content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n  content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n  content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n  content: \"\\e161\";\n}\n.glyphicon-flash:before {\n  content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n  content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n  content: \"\\e164\";\n}\n.glyphicon-record:before {\n  content: \"\\e165\";\n}\n.glyphicon-save:before {\n  content: \"\\e166\";\n}\n.glyphicon-open:before {\n  content: \"\\e167\";\n}\n.glyphicon-saved:before {\n  content: \"\\e168\";\n}\n.glyphicon-import:before {\n  content: \"\\e169\";\n}\n.glyphicon-export:before {\n  content: \"\\e170\";\n}\n.glyphicon-send:before {\n  content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n  content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n  content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n  content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n  content: \"\\e179\";\n}\n.glyphicon-header:before {\n  content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n  content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n  content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n  content: \"\\e183\";\n}\n.glyphicon-tower:before {\n  content: \"\\e184\";\n}\n.glyphicon-stats:before {\n  content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n  content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n  content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n  content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n  content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n  content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\";\n}\n* {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\nhtml {\n  font-size: 10px;\n\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #333;\n  background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\na {\n  color: #337ab7;\n  text-decoration: none;\n}\na:hover,\na:focus {\n  color: #23527c;\n  text-decoration: underline;\n}\na:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\nfigure {\n  margin: 0;\n}\nimg {\n  vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  max-width: 100%;\n  height: auto;\n}\n.img-rounded {\n  border-radius: 6px;\n}\n.img-thumbnail {\n  display: inline-block;\n  max-width: 100%;\n  height: auto;\n  padding: 4px;\n  line-height: 1.42857143;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: all .2s ease-in-out;\n       -o-transition: all .2s ease-in-out;\n          transition: all .2s ease-in-out;\n}\n.img-circle {\n  border-radius: 50%;\n}\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eee;\n}\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  margin: 0;\n  overflow: visible;\n  clip: auto;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: inherit;\n  font-weight: 500;\n  line-height: 1.1;\n  color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n  font-weight: normal;\n  line-height: 1;\n  color: #777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n  font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n  font-size: 75%;\n}\nh1,\n.h1 {\n  font-size: 36px;\n}\nh2,\n.h2 {\n  font-size: 30px;\n}\nh3,\n.h3 {\n  font-size: 24px;\n}\nh4,\n.h4 {\n  font-size: 18px;\n}\nh5,\n.h5 {\n  font-size: 14px;\n}\nh6,\n.h6 {\n  font-size: 12px;\n}\np {\n  margin: 0 0 10px;\n}\n.lead {\n  margin-bottom: 20px;\n  font-size: 16px;\n  font-weight: 300;\n  line-height: 1.4;\n}\n@media (min-width: 768px) {\n  .lead {\n    font-size: 21px;\n  }\n}\nsmall,\n.small {\n  font-size: 85%;\n}\nmark,\n.mark {\n  padding: .2em;\n  background-color: #fcf8e3;\n}\n.text-left {\n  text-align: left;\n}\n.text-right {\n  text-align: right;\n}\n.text-center {\n  text-align: center;\n}\n.text-justify {\n  text-align: justify;\n}\n.text-nowrap {\n  white-space: nowrap;\n}\n.text-lowercase {\n  text-transform: lowercase;\n}\n.text-uppercase {\n  text-transform: uppercase;\n}\n.text-capitalize {\n  text-transform: capitalize;\n}\n.text-muted {\n  color: #777;\n}\n.text-primary {\n  color: #337ab7;\n}\na.text-primary:hover {\n  color: #286090;\n}\n.text-success {\n  color: #3c763d;\n}\na.text-success:hover {\n  color: #2b542c;\n}\n.text-info {\n  color: #31708f;\n}\na.text-info:hover {\n  color: #245269;\n}\n.text-warning {\n  color: #8a6d3b;\n}\na.text-warning:hover {\n  color: #66512c;\n}\n.text-danger {\n  color: #a94442;\n}\na.text-danger:hover {\n  color: #843534;\n}\n.bg-primary {\n  color: #fff;\n  background-color: #337ab7;\n}\na.bg-primary:hover {\n  background-color: #286090;\n}\n.bg-success {\n  background-color: #dff0d8;\n}\na.bg-success:hover {\n  background-color: #c1e2b3;\n}\n.bg-info {\n  background-color: #d9edf7;\n}\na.bg-info:hover {\n  background-color: #afd9ee;\n}\n.bg-warning {\n  background-color: #fcf8e3;\n}\na.bg-warning:hover {\n  background-color: #f7ecb5;\n}\n.bg-danger {\n  background-color: #f2dede;\n}\na.bg-danger:hover {\n  background-color: #e4b9b9;\n}\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eee;\n}\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n  margin-bottom: 0;\n}\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n.list-inline {\n  padding-left: 0;\n  margin-left: -5px;\n  list-style: none;\n}\n.list-inline > li {\n  display: inline-block;\n  padding-right: 5px;\n  padding-left: 5px;\n}\ndl {\n  margin-top: 0;\n  margin-bottom: 20px;\n}\ndt,\ndd {\n  line-height: 1.42857143;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    overflow: hidden;\n    clear: left;\n    text-align: right;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n}\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #777;\n}\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  font-size: 17.5px;\n  border-left: 5px solid #eee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n  margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n  display: block;\n  font-size: 80%;\n  line-height: 1.42857143;\n  color: #777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n  content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  text-align: right;\n  border-right: 5px solid #eee;\n  border-left: 0;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n  content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n  content: '\\00A0 \\2014';\n}\naddress {\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #fff;\n  background-color: #333;\n  border-radius: 3px;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n}\nkbd kbd {\n  padding: 0;\n  font-size: 100%;\n  font-weight: bold;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.42857143;\n  color: #333;\n  word-break: break-all;\n  word-wrap: break-word;\n  background-color: #f5f5f5;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n}\npre code {\n  padding: 0;\n  font-size: inherit;\n  color: inherit;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border-radius: 0;\n}\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n.container {\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n@media (min-width: 768px) {\n  .container {\n    width: 750px;\n  }\n}\n@media (min-width: 992px) {\n  .container {\n    width: 970px;\n  }\n}\n@media (min-width: 1200px) {\n  .container {\n    width: 1170px;\n  }\n}\n.container-fluid {\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n.row {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n  float: left;\n}\n.col-xs-12 {\n  width: 100%;\n}\n.col-xs-11 {\n  width: 91.66666667%;\n}\n.col-xs-10 {\n  width: 83.33333333%;\n}\n.col-xs-9 {\n  width: 75%;\n}\n.col-xs-8 {\n  width: 66.66666667%;\n}\n.col-xs-7 {\n  width: 58.33333333%;\n}\n.col-xs-6 {\n  width: 50%;\n}\n.col-xs-5 {\n  width: 41.66666667%;\n}\n.col-xs-4 {\n  width: 33.33333333%;\n}\n.col-xs-3 {\n  width: 25%;\n}\n.col-xs-2 {\n  width: 16.66666667%;\n}\n.col-xs-1 {\n  width: 8.33333333%;\n}\n.col-xs-pull-12 {\n  right: 100%;\n}\n.col-xs-pull-11 {\n  right: 91.66666667%;\n}\n.col-xs-pull-10 {\n  right: 83.33333333%;\n}\n.col-xs-pull-9 {\n  right: 75%;\n}\n.col-xs-pull-8 {\n  right: 66.66666667%;\n}\n.col-xs-pull-7 {\n  right: 58.33333333%;\n}\n.col-xs-pull-6 {\n  right: 50%;\n}\n.col-xs-pull-5 {\n  right: 41.66666667%;\n}\n.col-xs-pull-4 {\n  right: 33.33333333%;\n}\n.col-xs-pull-3 {\n  right: 25%;\n}\n.col-xs-pull-2 {\n  right: 16.66666667%;\n}\n.col-xs-pull-1 {\n  right: 8.33333333%;\n}\n.col-xs-pull-0 {\n  right: auto;\n}\n.col-xs-push-12 {\n  left: 100%;\n}\n.col-xs-push-11 {\n  left: 91.66666667%;\n}\n.col-xs-push-10 {\n  left: 83.33333333%;\n}\n.col-xs-push-9 {\n  left: 75%;\n}\n.col-xs-push-8 {\n  left: 66.66666667%;\n}\n.col-xs-push-7 {\n  left: 58.33333333%;\n}\n.col-xs-push-6 {\n  left: 50%;\n}\n.col-xs-push-5 {\n  left: 41.66666667%;\n}\n.col-xs-push-4 {\n  left: 33.33333333%;\n}\n.col-xs-push-3 {\n  left: 25%;\n}\n.col-xs-push-2 {\n  left: 16.66666667%;\n}\n.col-xs-push-1 {\n  left: 8.33333333%;\n}\n.col-xs-push-0 {\n  left: auto;\n}\n.col-xs-offset-12 {\n  margin-left: 100%;\n}\n.col-xs-offset-11 {\n  margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n  margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n  margin-left: 75%;\n}\n.col-xs-offset-8 {\n  margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n  margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n  margin-left: 50%;\n}\n.col-xs-offset-5 {\n  margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n  margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n  margin-left: 25%;\n}\n.col-xs-offset-2 {\n  margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n  margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n    float: left;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-11 {\n    width: 91.66666667%;\n  }\n  .col-sm-10 {\n    width: 83.33333333%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-8 {\n    width: 66.66666667%;\n  }\n  .col-sm-7 {\n    width: 58.33333333%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-5 {\n    width: 41.66666667%;\n  }\n  .col-sm-4 {\n    width: 33.33333333%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-2 {\n    width: 16.66666667%;\n  }\n  .col-sm-1 {\n    width: 8.33333333%;\n  }\n  .col-sm-pull-12 {\n    right: 100%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-sm-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-sm-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-sm-pull-0 {\n    right: auto;\n  }\n  .col-sm-push-12 {\n    left: 100%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666667%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666667%;\n  }\n  .col-sm-push-7 {\n    left: 58.33333333%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666667%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-2 {\n    left: 16.66666667%;\n  }\n  .col-sm-push-1 {\n    left: 8.33333333%;\n  }\n  .col-sm-push-0 {\n    left: auto;\n  }\n  .col-sm-offset-12 {\n    margin-left: 100%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-sm-offset-0 {\n    margin-left: 0;\n  }\n}\n@media (min-width: 992px) {\n  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n    float: left;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-11 {\n    width: 91.66666667%;\n  }\n  .col-md-10 {\n    width: 83.33333333%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-8 {\n    width: 66.66666667%;\n  }\n  .col-md-7 {\n    width: 58.33333333%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-5 {\n    width: 41.66666667%;\n  }\n  .col-md-4 {\n    width: 33.33333333%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-2 {\n    width: 16.66666667%;\n  }\n  .col-md-1 {\n    width: 8.33333333%;\n  }\n  .col-md-pull-12 {\n    right: 100%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-md-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-md-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-md-pull-0 {\n    right: auto;\n  }\n  .col-md-push-12 {\n    left: 100%;\n  }\n  .col-md-push-11 {\n    left: 91.66666667%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-8 {\n    left: 66.66666667%;\n  }\n  .col-md-push-7 {\n    left: 58.33333333%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-5 {\n    left: 41.66666667%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-2 {\n    left: 16.66666667%;\n  }\n  .col-md-push-1 {\n    left: 8.33333333%;\n  }\n  .col-md-push-0 {\n    left: auto;\n  }\n  .col-md-offset-12 {\n    margin-left: 100%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0;\n  }\n}\n@media (min-width: 1200px) {\n  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n    float: left;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-11 {\n    width: 91.66666667%;\n  }\n  .col-lg-10 {\n    width: 83.33333333%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-8 {\n    width: 66.66666667%;\n  }\n  .col-lg-7 {\n    width: 58.33333333%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-5 {\n    width: 41.66666667%;\n  }\n  .col-lg-4 {\n    width: 33.33333333%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-2 {\n    width: 16.66666667%;\n  }\n  .col-lg-1 {\n    width: 8.33333333%;\n  }\n  .col-lg-pull-12 {\n    right: 100%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-lg-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-lg-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-lg-pull-0 {\n    right: auto;\n  }\n  .col-lg-push-12 {\n    left: 100%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666667%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666667%;\n  }\n  .col-lg-push-7 {\n    left: 58.33333333%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666667%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-2 {\n    left: 16.66666667%;\n  }\n  .col-lg-push-1 {\n    left: 8.33333333%;\n  }\n  .col-lg-push-0 {\n    left: auto;\n  }\n  .col-lg-offset-12 {\n    margin-left: 100%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0;\n  }\n}\ntable {\n  background-color: transparent;\n}\ncaption {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  color: #777;\n  text-align: left;\n}\nth {\n  text-align: left;\n}\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n  padding: 8px;\n  line-height: 1.42857143;\n  vertical-align: top;\n  border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n  border-top: 0;\n}\n.table > tbody + tbody {\n  border-top: 2px solid #ddd;\n}\n.table .table {\n  background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n  padding: 5px;\n}\n.table-bordered {\n  border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n  border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-child(odd) {\n  background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n  background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n  position: static;\n  display: table-column;\n  float: none;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  position: static;\n  display: table-cell;\n  float: none;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n  background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n  background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n  background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n  background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n  background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n  background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n  background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n  background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n  background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n  background-color: #ebcccc;\n}\n.table-responsive {\n  min-height: .01%;\n  overflow-x: auto;\n}\n@media screen and (max-width: 767px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-y: hidden;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid #ddd;\n  }\n  .table-responsive > .table {\n    margin-bottom: 0;\n  }\n  .table-responsive > .table > thead > tr > th,\n  .table-responsive > .table > tbody > tr > th,\n  .table-responsive > .table > tfoot > tr > th,\n  .table-responsive > .table > thead > tr > td,\n  .table-responsive > .table > tbody > tr > td,\n  .table-responsive > .table > tfoot > tr > td {\n    white-space: nowrap;\n  }\n  .table-responsive > .table-bordered {\n    border: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:first-child,\n  .table-responsive > .table-bordered > tbody > tr > th:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n  .table-responsive > .table-bordered > thead > tr > td:first-child,\n  .table-responsive > .table-bordered > tbody > tr > td:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:last-child,\n  .table-responsive > .table-bordered > tbody > tr > th:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n  .table-responsive > .table-bordered > thead > tr > td:last-child,\n  .table-responsive > .table-bordered > tbody > tr > td:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0;\n  }\n  .table-responsive > .table-bordered > tbody > tr:last-child > th,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n  .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n    border-bottom: 0;\n  }\n}\nfieldset {\n  min-width: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n  display: inline-block;\n  max-width: 100%;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  line-height: normal;\n}\ninput[type=\"file\"] {\n  display: block;\n}\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\nselect[multiple],\nselect[size] {\n  height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\noutput {\n  display: block;\n  padding-top: 7px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555;\n}\n.form-control {\n  display: block;\n  width: 100%;\n  height: 34px;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555;\n  background-color: #fff;\n  background-image: none;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n  -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;\n       -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n          transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);\n          box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);\n}\n.form-control::-moz-placeholder {\n  color: #999;\n  opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n  color: #999;\n}\n.form-control::-webkit-input-placeholder {\n  color: #999;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n  background-color: #eee;\n  opacity: 1;\n}\ntextarea.form-control {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n  input[type=\"date\"],\n  input[type=\"time\"],\n  input[type=\"datetime-local\"],\n  input[type=\"month\"] {\n    line-height: 34px;\n  }\n  input[type=\"date\"].input-sm,\n  input[type=\"time\"].input-sm,\n  input[type=\"datetime-local\"].input-sm,\n  input[type=\"month\"].input-sm {\n    line-height: 30px;\n  }\n  input[type=\"date\"].input-lg,\n  input[type=\"time\"].input-lg,\n  input[type=\"datetime-local\"].input-lg,\n  input[type=\"month\"].input-lg {\n    line-height: 46px;\n  }\n}\n.form-group {\n  margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n  min-height: 20px;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  position: absolute;\n  margin-top: 4px \\9;\n  margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  vertical-align: middle;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n  cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n  cursor: not-allowed;\n}\n.form-control-static {\n  padding-top: 7px;\n  padding-bottom: 7px;\n  margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n  padding-right: 0;\n  padding-left: 0;\n}\n.input-sm,\n.form-group-sm .form-control {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-sm,\nselect.form-group-sm .form-control {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-sm,\ntextarea.form-group-sm .form-control,\nselect[multiple].input-sm,\nselect[multiple].form-group-sm .form-control {\n  height: auto;\n}\n.input-lg,\n.form-group-lg .form-control {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\nselect.input-lg,\nselect.form-group-lg .form-control {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-lg,\ntextarea.form-group-lg .form-control,\nselect[multiple].input-lg,\nselect[multiple].form-group-lg .form-control {\n  height: auto;\n}\n.has-feedback {\n  position: relative;\n}\n.has-feedback .form-control {\n  padding-right: 42.5px;\n}\n.form-control-feedback {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 2;\n  display: block;\n  width: 34px;\n  height: 34px;\n  line-height: 34px;\n  text-align: center;\n  pointer-events: none;\n}\n.input-lg + .form-control-feedback {\n  width: 46px;\n  height: 46px;\n  line-height: 46px;\n}\n.input-sm + .form-control-feedback {\n  width: 30px;\n  height: 30px;\n  line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n  color: #3c763d;\n}\n.has-success .form-control {\n  border-color: #3c763d;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-success .form-control:focus {\n  border-color: #2b542c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #3c763d;\n}\n.has-success .form-control-feedback {\n  color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n  color: #8a6d3b;\n}\n.has-warning .form-control {\n  border-color: #8a6d3b;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-warning .form-control:focus {\n  border-color: #66512c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #8a6d3b;\n}\n.has-warning .form-control-feedback {\n  color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n  color: #a94442;\n}\n.has-error .form-control {\n  border-color: #a94442;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-error .form-control:focus {\n  border-color: #843534;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #a94442;\n}\n.has-error .form-control-feedback {\n  color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n  top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n  top: 0;\n}\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .form-inline .form-control-static {\n    display: inline-block;\n  }\n  .form-inline .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .form-inline .input-group .input-group-addon,\n  .form-inline .input-group .input-group-btn,\n  .form-inline .input-group .form-control {\n    width: auto;\n  }\n  .form-inline .input-group > .form-control {\n    width: 100%;\n  }\n  .form-inline .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio label,\n  .form-inline .checkbox label {\n    padding-left: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .form-inline .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  padding-top: 7px;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n  min-height: 27px;\n}\n.form-horizontal .form-group {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    padding-top: 7px;\n    margin-bottom: 0;\n    text-align: right;\n  }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n  right: 15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-lg .control-label {\n    padding-top: 14.3px;\n  }\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-sm .control-label {\n    padding-top: 6px;\n  }\n}\n.btn {\n  display: inline-block;\n  padding: 6px 12px;\n  margin-bottom: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.42857143;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  -ms-touch-action: manipulation;\n      touch-action: manipulation;\n  cursor: pointer;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n  color: #333;\n  text-decoration: none;\n}\n.btn:active,\n.btn.active {\n  background-image: none;\n  outline: 0;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  pointer-events: none;\n  cursor: not-allowed;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n          box-shadow: none;\n  opacity: .65;\n}\n.btn-default {\n  color: #333;\n  background-color: #fff;\n  border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus,\n.btn-default.focus,\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  color: #333;\n  background-color: #e6e6e6;\n  border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  background-image: none;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n  background-color: #fff;\n  border-color: #ccc;\n}\n.btn-default .badge {\n  color: #fff;\n  background-color: #333;\n}\n.btn-primary {\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #2e6da4;\n}\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary.focus,\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  color: #fff;\n  background-color: #286090;\n  border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  background-image: none;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n  background-color: #337ab7;\n  border-color: #2e6da4;\n}\n.btn-primary .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.btn-success {\n  color: #fff;\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success:hover,\n.btn-success:focus,\n.btn-success.focus,\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  color: #fff;\n  background-color: #449d44;\n  border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  background-image: none;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success .badge {\n  color: #5cb85c;\n  background-color: #fff;\n}\n.btn-info {\n  color: #fff;\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.btn-info:hover,\n.btn-info:focus,\n.btn-info.focus,\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  color: #fff;\n  background-color: #31b0d5;\n  border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  background-image: none;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.btn-info .badge {\n  color: #5bc0de;\n  background-color: #fff;\n}\n.btn-warning {\n  color: #fff;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning.focus,\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  color: #fff;\n  background-color: #ec971f;\n  border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  background-image: none;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning .badge {\n  color: #f0ad4e;\n  background-color: #fff;\n}\n.btn-danger {\n  color: #fff;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger.focus,\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  color: #fff;\n  background-color: #c9302c;\n  border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  background-image: none;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger .badge {\n  color: #d9534f;\n  background-color: #fff;\n}\n.btn-link {\n  font-weight: normal;\n  color: #337ab7;\n  border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n  border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n  color: #23527c;\n  text-decoration: underline;\n  background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #777;\n  text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-block {\n  display: block;\n  width: 100%;\n}\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity .15s linear;\n       -o-transition: opacity .15s linear;\n          transition: opacity .15s linear;\n}\n.fade.in {\n  opacity: 1;\n}\n.collapse {\n  display: none;\n  visibility: hidden;\n}\n.collapse.in {\n  display: block;\n  visibility: visible;\n}\ntr.collapse.in {\n  display: table-row;\n}\ntbody.collapse.in {\n  display: table-row-group;\n}\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition-timing-function: ease;\n       -o-transition-timing-function: ease;\n          transition-timing-function: ease;\n  -webkit-transition-duration: .35s;\n       -o-transition-duration: .35s;\n          transition-duration: .35s;\n  -webkit-transition-property: height, visibility;\n       -o-transition-property: height, visibility;\n          transition-property: height, visibility;\n}\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px solid;\n  border-right: 4px solid transparent;\n  border-left: 4px solid transparent;\n}\n.dropdown {\n  position: relative;\n}\n.dropdown-toggle:focus {\n  outline: 0;\n}\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  font-size: 14px;\n  text-align: left;\n  list-style: none;\n  background-color: #fff;\n  -webkit-background-clip: padding-box;\n          background-clip: padding-box;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, .15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n          box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n}\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu .divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.42857143;\n  color: #333;\n  white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  color: #262626;\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #fff;\n  text-decoration: none;\n  background-color: #337ab7;\n  outline: 0;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.open > .dropdown-menu {\n  display: block;\n}\n.open > a {\n  outline: 0;\n}\n.dropdown-menu-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu-left {\n  right: auto;\n  left: 0;\n}\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.42857143;\n  color: #777;\n  white-space: nowrap;\n}\n.dropdown-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 990;\n}\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  content: \"\";\n  border-top: 0;\n  border-bottom: 4px solid;\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 1px;\n}\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    right: 0;\n    left: auto;\n  }\n  .navbar-right .dropdown-menu-left {\n    right: auto;\n    left: 0;\n  }\n}\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n  z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n  margin-left: -1px;\n}\n.btn-toolbar {\n  margin-left: -5px;\n}\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n  float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n  margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child > .btn:last-child,\n.btn-group > .btn-group:first-child > .dropdown-toggle {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n  padding-right: 8px;\n  padding-left: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-right: 12px;\n  padding-left: 12px;\n}\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n.btn .caret {\n  margin-left: 0;\n}\n.btn-lg .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n  border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n  display: block;\n  float: none;\n  width: 100%;\n  max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n  float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n  border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n  display: table-cell;\n  float: none;\n  width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n  width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n  left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none;\n}\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n  float: none;\n  padding-right: 0;\n  padding-left: 0;\n}\n.input-group .form-control {\n  position: relative;\n  z-index: 2;\n  float: left;\n  width: 100%;\n  margin-bottom: 0;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n.input-group-addon {\n  padding: 6px 12px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1;\n  color: #555;\n  text-align: center;\n  background-color: #eee;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n}\n.input-group-addon.input-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  border-radius: 3px;\n}\n.input-group-addon.input-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n.input-group-btn {\n  position: relative;\n  font-size: 0;\n  white-space: nowrap;\n}\n.input-group-btn > .btn {\n  position: relative;\n}\n.input-group-btn > .btn + .btn {\n  margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n  margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n  margin-left: -1px;\n}\n.nav {\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n.nav > li {\n  position: relative;\n  display: block;\n}\n.nav > li > a {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eee;\n}\n.nav > li.disabled > a {\n  color: #777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #777;\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eee;\n  border-color: #337ab7;\n}\n.nav .nav-divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.nav > li > a > img {\n  max-width: none;\n}\n.nav-tabs {\n  border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n  float: left;\n  margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n  margin-right: 2px;\n  line-height: 1.42857143;\n  border: 1px solid transparent;\n  border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n  border-color: #eee #eee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n  color: #555;\n  cursor: default;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-bottom-color: transparent;\n}\n.nav-tabs.nav-justified {\n  width: 100%;\n  border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n  float: none;\n}\n.nav-tabs.nav-justified > li > a {\n  margin-bottom: 5px;\n  text-align: center;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-tabs.nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs.nav-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n  border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li > a {\n    border-bottom: 1px solid #ddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs.nav-justified > .active > a,\n  .nav-tabs.nav-justified > .active > a:hover,\n  .nav-tabs.nav-justified > .active > a:focus {\n    border-bottom-color: #fff;\n  }\n}\n.nav-pills > li {\n  float: left;\n}\n.nav-pills > li > a {\n  border-radius: 4px;\n}\n.nav-pills > li + li {\n  margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n  color: #fff;\n  background-color: #337ab7;\n}\n.nav-stacked > li {\n  float: none;\n}\n.nav-stacked > li + li {\n  margin-top: 2px;\n  margin-left: 0;\n}\n.nav-justified {\n  width: 100%;\n}\n.nav-justified > li {\n  float: none;\n}\n.nav-justified > li > a {\n  margin-bottom: 5px;\n  text-align: center;\n}\n.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs-justified {\n  border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n  border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs-justified > li > a {\n    border-bottom: 1px solid #ddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs-justified > .active > a,\n  .nav-tabs-justified > .active > a:hover,\n  .nav-tabs-justified > .active > a:focus {\n    border-bottom-color: #fff;\n  }\n}\n.tab-content > .tab-pane {\n  display: none;\n  visibility: hidden;\n}\n.tab-content > .active {\n  display: block;\n  visibility: visible;\n}\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.navbar {\n  position: relative;\n  min-height: 50px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 4px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n.navbar-collapse {\n  padding-right: 15px;\n  padding-left: 15px;\n  overflow-x: visible;\n  -webkit-overflow-scrolling: touch;\n  border-top: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);\n}\n.navbar-collapse.in {\n  overflow-y: auto;\n}\n@media (min-width: 768px) {\n  .navbar-collapse {\n    width: auto;\n    border-top: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n  .navbar-collapse.collapse {\n    display: block !important;\n    height: auto !important;\n    padding-bottom: 0;\n    overflow: visible !important;\n    visibility: visible !important;\n  }\n  .navbar-collapse.in {\n    overflow-y: visible;\n  }\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-static-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n  max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    max-height: 200px;\n  }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container-fluid > .navbar-header,\n  .container > .navbar-collapse,\n  .container-fluid > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n.navbar-static-top {\n  z-index: 1000;\n  border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n  .navbar-static-top {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n@media (min-width: 768px) {\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n  border-width: 1px 0 0;\n}\n.navbar-brand {\n  float: left;\n  height: 50px;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n.navbar-brand > img {\n  display: block;\n}\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand,\n  .navbar > .container-fluid .navbar-brand {\n    margin-left: -15px;\n  }\n}\n.navbar-toggle {\n  position: relative;\n  float: right;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-right: 15px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.navbar-toggle:focus {\n  outline: 0;\n}\n.navbar-toggle .icon-bar {\n  display: block;\n  width: 22px;\n  height: 2px;\n  border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n@media (min-width: 768px) {\n  .navbar-toggle {\n    display: none;\n  }\n}\n.navbar-nav {\n  margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 20px;\n}\n@media (max-width: 767px) {\n  .navbar-nav .open .dropdown-menu {\n    position: static;\n    float: none;\n    width: auto;\n    margin-top: 0;\n    background-color: transparent;\n    border: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n  .navbar-nav .open .dropdown-menu > li > a,\n  .navbar-nav .open .dropdown-menu .dropdown-header {\n    padding: 5px 15px 5px 25px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a {\n    line-height: 20px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-nav .open .dropdown-menu > li > a:focus {\n    background-image: none;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-nav {\n    float: left;\n    margin: 0;\n  }\n  .navbar-nav > li {\n    float: left;\n  }\n  .navbar-nav > li > a {\n    padding-top: 15px;\n    padding-bottom: 15px;\n  }\n}\n.navbar-form {\n  padding: 10px 15px;\n  margin-top: 8px;\n  margin-right: -15px;\n  margin-bottom: 8px;\n  margin-left: -15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);\n}\n@media (min-width: 768px) {\n  .navbar-form .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control-static {\n    display: inline-block;\n  }\n  .navbar-form .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .navbar-form .input-group .input-group-addon,\n  .navbar-form .input-group .input-group-btn,\n  .navbar-form .input-group .form-control {\n    width: auto;\n  }\n  .navbar-form .input-group > .form-control {\n    width: 100%;\n  }\n  .navbar-form .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio label,\n  .navbar-form .checkbox label {\n    padding-left: 0;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .navbar-form .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n  .navbar-form .form-group:last-child {\n    margin-bottom: 0;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    padding-top: 0;\n    padding-bottom: 0;\n    margin-right: 0;\n    margin-left: 0;\n    border: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n}\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  border-top-left-radius: 4px;\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n  margin-top: 14px;\n  margin-bottom: 14px;\n}\n.navbar-text {\n  margin-top: 15px;\n  margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n  .navbar-text {\n    float: left;\n    margin-right: 15px;\n    margin-left: 15px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n    margin-right: -15px;\n  }\n  .navbar-right ~ .navbar-right {\n    margin-right: 0;\n  }\n}\n.navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n  color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #5e5e5e;\n  background-color: transparent;\n}\n.navbar-default .navbar-text {\n  color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n  color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n  color: #333;\n  background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n  color: #555;\n  background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n  color: #ccc;\n  background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n  border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n  color: #555;\n  background-color: #e7e7e7;\n}\n@media (max-width: 767px) {\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #777;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #333;\n    background-color: transparent;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #555;\n    background-color: #e7e7e7;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #ccc;\n    background-color: transparent;\n  }\n}\n.navbar-default .navbar-link {\n  color: #777;\n}\n.navbar-default .navbar-link:hover {\n  color: #333;\n}\n.navbar-default .btn-link {\n  color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n  color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n  color: #ccc;\n}\n.navbar-inverse {\n  background-color: #222;\n  border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #fff;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #fff;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n  color: #fff;\n  background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n  color: #444;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n  border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n  color: #fff;\n  background-color: #080808;\n}\n@media (max-width: 767px) {\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n    border-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n    color: #9d9d9d;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #fff;\n    background-color: transparent;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #fff;\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #444;\n    background-color: transparent;\n  }\n}\n.navbar-inverse .navbar-link {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n  color: #fff;\n}\n.navbar-inverse .btn-link {\n  color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n  color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n  color: #444;\n}\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n}\n.breadcrumb > li {\n  display: inline-block;\n}\n.breadcrumb > li + li:before {\n  padding: 0 5px;\n  color: #ccc;\n  content: \"/\\00a0\";\n}\n.breadcrumb > .active {\n  color: #777;\n}\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px;\n}\n.pagination > li {\n  display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n  position: relative;\n  float: left;\n  padding: 6px 12px;\n  margin-left: -1px;\n  line-height: 1.42857143;\n  color: #337ab7;\n  text-decoration: none;\n  background-color: #fff;\n  border: 1px solid #ddd;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n  margin-left: 0;\n  border-top-left-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n  color: #23527c;\n  background-color: #eee;\n  border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n  z-index: 2;\n  color: #fff;\n  cursor: default;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n  color: #777;\n  cursor: not-allowed;\n  background-color: #fff;\n  border-color: #ddd;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n  border-top-left-radius: 6px;\n  border-bottom-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-top-right-radius: 6px;\n  border-bottom-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n  border-top-left-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-top-right-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  text-align: center;\n  list-style: none;\n}\n.pager li {\n  display: inline;\n}\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #eee;\n}\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #777;\n  cursor: not-allowed;\n  background-color: #fff;\n}\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n  color: #fff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.label:empty {\n  display: none;\n}\n.btn .label {\n  position: relative;\n  top: -1px;\n}\n.label-default {\n  background-color: #777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #5e5e5e;\n}\n.label-primary {\n  background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #286090;\n}\n.label-success {\n  background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #449d44;\n}\n.label-info {\n  background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #31b0d5;\n}\n.label-warning {\n  background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #ec971f;\n}\n.label-danger {\n  background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #c9302c;\n}\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  line-height: 1;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  background-color: #777;\n  border-radius: 10px;\n}\n.badge:empty {\n  display: none;\n}\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n.btn-xs .badge {\n  top: 0;\n  padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n  color: #fff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.list-group-item > .badge {\n  float: right;\n}\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n.jumbotron {\n  padding: 30px 15px;\n  margin-bottom: 30px;\n  color: inherit;\n  background-color: #eee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n  color: inherit;\n}\n.jumbotron p {\n  margin-bottom: 15px;\n  font-size: 21px;\n  font-weight: 200;\n}\n.jumbotron > hr {\n  border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n  border-radius: 6px;\n}\n.jumbotron .container {\n  max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding: 48px 0;\n  }\n  .container .jumbotron,\n  .container-fluid .jumbotron {\n    padding-right: 60px;\n    padding-left: 60px;\n  }\n  .jumbotron h1,\n  .jumbotron .h1 {\n    font-size: 63px;\n  }\n}\n.thumbnail {\n  display: block;\n  padding: 4px;\n  margin-bottom: 20px;\n  line-height: 1.42857143;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: border .2s ease-in-out;\n       -o-transition: border .2s ease-in-out;\n          transition: border .2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n  margin-right: auto;\n  margin-left: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #337ab7;\n}\n.thumbnail .caption {\n  padding: 9px;\n  color: #333;\n}\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n.alert .alert-link {\n  font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n  margin-bottom: 0;\n}\n.alert > p + p {\n  margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n  padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n.alert-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n  color: #2b542c;\n}\n.alert-info {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n  color: #245269;\n}\n.alert-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.alert-warning hr {\n  border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n  color: #66512c;\n}\n.alert-danger {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.alert-danger hr {\n  border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n  color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@-o-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n.progress {\n  height: 20px;\n  margin-bottom: 20px;\n  overflow: hidden;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);\n          box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);\n}\n.progress-bar {\n  float: left;\n  width: 0;\n  height: 100%;\n  font-size: 12px;\n  line-height: 20px;\n  color: #fff;\n  text-align: center;\n  background-color: #337ab7;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);\n          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);\n  -webkit-transition: width .6s ease;\n       -o-transition: width .6s ease;\n          transition: width .6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  -webkit-background-size: 40px 40px;\n          background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n       -o-animation: progress-bar-stripes 2s linear infinite;\n          animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n  background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n  background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n  background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n  background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.media {\n  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n.media-right,\n.media > .pull-right {\n  padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n  padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n  display: table-cell;\n  vertical-align: top;\n}\n.media-middle {\n  vertical-align: middle;\n}\n.media-bottom {\n  vertical-align: bottom;\n}\n.media-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n.list-group {\n  padding-left: 0;\n  margin-bottom: 20px;\n}\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n  border-top-left-radius: 4px;\n  border-top-right-radius: 4px;\n}\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\na.list-group-item {\n  color: #555;\n}\na.list-group-item .list-group-item-heading {\n  color: #333;\n}\na.list-group-item:hover,\na.list-group-item:focus {\n  color: #555;\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n  color: #777;\n  cursor: not-allowed;\n  background-color: #eee;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n  color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n  color: #777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  z-index: 2;\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n  color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n  color: #c7ddef;\n}\n.list-group-item-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n}\na.list-group-item-success {\n  color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-success:hover,\na.list-group-item-success:focus {\n  color: #3c763d;\n  background-color: #d0e9c6;\n}\na.list-group-item-success.active,\na.list-group-item-success.active:hover,\na.list-group-item-success.active:focus {\n  color: #fff;\n  background-color: #3c763d;\n  border-color: #3c763d;\n}\n.list-group-item-info {\n  color: #31708f;\n  background-color: #d9edf7;\n}\na.list-group-item-info {\n  color: #31708f;\n}\na.list-group-item-info .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-info:hover,\na.list-group-item-info:focus {\n  color: #31708f;\n  background-color: #c4e3f3;\n}\na.list-group-item-info.active,\na.list-group-item-info.active:hover,\na.list-group-item-info.active:focus {\n  color: #fff;\n  background-color: #31708f;\n  border-color: #31708f;\n}\n.list-group-item-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n}\na.list-group-item-warning {\n  color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-warning:hover,\na.list-group-item-warning:focus {\n  color: #8a6d3b;\n  background-color: #faf2cc;\n}\na.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus {\n  color: #fff;\n  background-color: #8a6d3b;\n  border-color: #8a6d3b;\n}\n.list-group-item-danger {\n  color: #a94442;\n  background-color: #f2dede;\n}\na.list-group-item-danger {\n  color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-danger:hover,\na.list-group-item-danger:focus {\n  color: #a94442;\n  background-color: #ebcccc;\n}\na.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus {\n  color: #fff;\n  background-color: #a94442;\n  border-color: #a94442;\n}\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n.panel {\n  margin-bottom: 20px;\n  background-color: #fff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05);\n          box-shadow: 0 1px 1px rgba(0, 0, 0, .05);\n}\n.panel-body {\n  padding: 15px;\n}\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n  color: inherit;\n}\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n  color: inherit;\n}\n.panel-title > a {\n  color: inherit;\n}\n.panel-footer {\n  padding: 10px 15px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #ddd;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n  margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n  border-width: 1px 0;\n  border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n  border-top: 0;\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n  border-bottom: 0;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n.list-group + .panel-footer {\n  border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n  margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n  padding-right: 15px;\n  padding-left: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n  border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n  border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n  border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n  border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n  border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n  border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n  border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n  border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n  border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n  border-bottom: 0;\n}\n.panel > .table-responsive {\n  margin-bottom: 0;\n  border: 0;\n}\n.panel-group {\n  margin-bottom: 20px;\n}\n.panel-group .panel {\n  margin-bottom: 0;\n  border-radius: 4px;\n}\n.panel-group .panel + .panel {\n  margin-top: 5px;\n}\n.panel-group .panel-heading {\n  border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n  border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n  border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #ddd;\n}\n.panel-default {\n  border-color: #ddd;\n}\n.panel-default > .panel-heading {\n  color: #333;\n  background-color: #f5f5f5;\n  border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n  color: #f5f5f5;\n  background-color: #333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ddd;\n}\n.panel-primary {\n  border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #337ab7;\n}\n.panel-success {\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n  color: #dff0d8;\n  background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n.panel-info {\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n  color: #d9edf7;\n  background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #bce8f1;\n}\n.panel-warning {\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n  color: #fcf8e3;\n  background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #faebcc;\n}\n.panel-danger {\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n  color: #f2dede;\n  background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n  position: relative;\n  display: block;\n  height: 0;\n  padding: 0;\n  overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  border: 0;\n}\n.embed-responsive.embed-responsive-16by9 {\n  padding-bottom: 56.25%;\n}\n.embed-responsive.embed-responsive-4by3 {\n  padding-bottom: 75%;\n}\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);\n}\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, .15);\n}\n.well-lg {\n  padding: 24px;\n  border-radius: 6px;\n}\n.well-sm {\n  padding: 9px;\n  border-radius: 3px;\n}\n.close {\n  float: right;\n  font-size: 21px;\n  font-weight: bold;\n  line-height: 1;\n  color: #000;\n  text-shadow: 0 1px 0 #fff;\n  filter: alpha(opacity=20);\n  opacity: .2;\n}\n.close:hover,\n.close:focus {\n  color: #000;\n  text-decoration: none;\n  cursor: pointer;\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\nbutton.close {\n  -webkit-appearance: none;\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n}\n.modal-open {\n  overflow: hidden;\n}\n.modal {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  display: none;\n  overflow: hidden;\n  -webkit-overflow-scrolling: touch;\n  outline: 0;\n}\n.modal.fade .modal-dialog {\n  -webkit-transition: -webkit-transform .3s ease-out;\n       -o-transition:      -o-transform .3s ease-out;\n          transition:         transform .3s ease-out;\n  -webkit-transform: translate(0, -25%);\n      -ms-transform: translate(0, -25%);\n       -o-transform: translate(0, -25%);\n          transform: translate(0, -25%);\n}\n.modal.in .modal-dialog {\n  -webkit-transform: translate(0, 0);\n      -ms-transform: translate(0, 0);\n       -o-transform: translate(0, 0);\n          transform: translate(0, 0);\n}\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px;\n}\n.modal-content {\n  position: relative;\n  background-color: #fff;\n  -webkit-background-clip: padding-box;\n          background-clip: padding-box;\n  border: 1px solid #999;\n  border: 1px solid rgba(0, 0, 0, .2);\n  border-radius: 6px;\n  outline: 0;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);\n          box-shadow: 0 3px 9px rgba(0, 0, 0, .5);\n}\n.modal-backdrop {\n  position: absolute;\n  top: 0;\n  right: 0;\n  left: 0;\n  background-color: #000;\n}\n.modal-backdrop.fade {\n  filter: alpha(opacity=0);\n  opacity: 0;\n}\n.modal-backdrop.in {\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\n.modal-header {\n  min-height: 16.42857143px;\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n  margin-top: -2px;\n}\n.modal-title {\n  margin: 0;\n  line-height: 1.42857143;\n}\n.modal-body {\n  position: relative;\n  padding: 15px;\n}\n.modal-footer {\n  padding: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n  margin-bottom: 0;\n  margin-left: 5px;\n}\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n@media (min-width: 768px) {\n  .modal-dialog {\n    width: 600px;\n    margin: 30px auto;\n  }\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);\n            box-shadow: 0 5px 15px rgba(0, 0, 0, .5);\n  }\n  .modal-sm {\n    width: 300px;\n  }\n}\n@media (min-width: 992px) {\n  .modal-lg {\n    width: 900px;\n  }\n}\n.tooltip {\n  position: absolute;\n  z-index: 1070;\n  display: block;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 12px;\n  font-weight: normal;\n  line-height: 1.4;\n  visibility: visible;\n  filter: alpha(opacity=0);\n  opacity: 0;\n}\n.tooltip.in {\n  filter: alpha(opacity=90);\n  opacity: .9;\n}\n.tooltip.top {\n  padding: 5px 0;\n  margin-top: -3px;\n}\n.tooltip.right {\n  padding: 0 5px;\n  margin-left: 3px;\n}\n.tooltip.bottom {\n  padding: 5px 0;\n  margin-top: 3px;\n}\n.tooltip.left {\n  padding: 0 5px;\n  margin-left: -3px;\n}\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #fff;\n  text-align: center;\n  text-decoration: none;\n  background-color: #000;\n  border-radius: 4px;\n}\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n  right: 5px;\n  bottom: 0;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-width: 5px 5px 5px 0;\n  border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-width: 5px 0 5px 5px;\n  border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1060;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.42857143;\n  text-align: left;\n  white-space: normal;\n  background-color: #fff;\n  -webkit-background-clip: padding-box;\n          background-clip: padding-box;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, .2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);\n          box-shadow: 0 5px 10px rgba(0, 0, 0, .2);\n}\n.popover.top {\n  margin-top: -10px;\n}\n.popover.right {\n  margin-left: 10px;\n}\n.popover.bottom {\n  margin-top: 10px;\n}\n.popover.left {\n  margin-left: -10px;\n}\n.popover-title {\n  padding: 8px 14px;\n  margin: 0;\n  font-size: 14px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-radius: 5px 5px 0 0;\n}\n.popover-content {\n  padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.popover > .arrow {\n  border-width: 11px;\n}\n.popover > .arrow:after {\n  content: \"\";\n  border-width: 10px;\n}\n.popover.top > .arrow {\n  bottom: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-color: #999;\n  border-top-color: rgba(0, 0, 0, .25);\n  border-bottom-width: 0;\n}\n.popover.top > .arrow:after {\n  bottom: 1px;\n  margin-left: -10px;\n  content: \" \";\n  border-top-color: #fff;\n  border-bottom-width: 0;\n}\n.popover.right > .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-right-color: #999;\n  border-right-color: rgba(0, 0, 0, .25);\n  border-left-width: 0;\n}\n.popover.right > .arrow:after {\n  bottom: -10px;\n  left: 1px;\n  content: \" \";\n  border-right-color: #fff;\n  border-left-width: 0;\n}\n.popover.bottom > .arrow {\n  top: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-width: 0;\n  border-bottom-color: #999;\n  border-bottom-color: rgba(0, 0, 0, .25);\n}\n.popover.bottom > .arrow:after {\n  top: 1px;\n  margin-left: -10px;\n  content: \" \";\n  border-top-width: 0;\n  border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-right-width: 0;\n  border-left-color: #999;\n  border-left-color: rgba(0, 0, 0, .25);\n}\n.popover.left > .arrow:after {\n  right: 1px;\n  bottom: -10px;\n  content: \" \";\n  border-right-width: 0;\n  border-left-color: #fff;\n}\n.carousel {\n  position: relative;\n}\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n.carousel-inner > .item {\n  position: relative;\n  display: none;\n  -webkit-transition: .6s ease-in-out left;\n       -o-transition: .6s ease-in-out left;\n          transition: .6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n  .carousel-inner > .item {\n    -webkit-transition: -webkit-transform .6s ease-in-out;\n         -o-transition:      -o-transform .6s ease-in-out;\n            transition:         transform .6s ease-in-out;\n\n    -webkit-backface-visibility: hidden;\n            backface-visibility: hidden;\n    -webkit-perspective: 1000;\n            perspective: 1000;\n  }\n  .carousel-inner > .item.next,\n  .carousel-inner > .item.active.right {\n    left: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n            transform: translate3d(100%, 0, 0);\n  }\n  .carousel-inner > .item.prev,\n  .carousel-inner > .item.active.left {\n    left: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n            transform: translate3d(-100%, 0, 0);\n  }\n  .carousel-inner > .item.next.left,\n  .carousel-inner > .item.prev.right,\n  .carousel-inner > .item.active {\n    left: 0;\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0);\n  }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n.carousel-inner > .active {\n  left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.carousel-inner > .next {\n  left: 100%;\n}\n.carousel-inner > .prev {\n  left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n.carousel-inner > .active.left {\n  left: -100%;\n}\n.carousel-inner > .active.right {\n  left: 100%;\n}\n.carousel-control {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 15%;\n  font-size: 20px;\n  color: #fff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\n.carousel-control.left {\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n  background-image:      -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001)));\n  background-image:         linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n  background-repeat: repeat-x;\n}\n.carousel-control.right {\n  right: 0;\n  left: auto;\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n  background-image:      -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5)));\n  background-image:         linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n  background-repeat: repeat-x;\n}\n.carousel-control:hover,\n.carousel-control:focus {\n  color: #fff;\n  text-decoration: none;\n  filter: alpha(opacity=90);\n  outline: 0;\n  opacity: .9;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n  position: absolute;\n  top: 50%;\n  z-index: 5;\n  display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n  left: 50%;\n  margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n  right: 50%;\n  margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  font-family: serif;\n}\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  padding-left: 0;\n  margin-left: -30%;\n  text-align: center;\n  list-style: none;\n}\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  cursor: pointer;\n  background-color: #000 \\9;\n  background-color: rgba(0, 0, 0, 0);\n  border: 1px solid #fff;\n  border-radius: 10px;\n}\n.carousel-indicators .active {\n  width: 12px;\n  height: 12px;\n  margin: 0;\n  background-color: #fff;\n}\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #fff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n}\n.carousel-caption .btn {\n  text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -15px;\n    font-size: 30px;\n  }\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .icon-prev {\n    margin-left: -15px;\n  }\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-next {\n    margin-right: -15px;\n  }\n  .carousel-caption {\n    right: 20%;\n    left: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-footer:after {\n  clear: both;\n}\n.center-block {\n  display: block;\n  margin-right: auto;\n  margin-left: auto;\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n.affix {\n  position: fixed;\n}\n@-ms-viewport {\n  width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n  display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n  display: none !important;\n}\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important;\n  }\n  table.visible-xs {\n    display: table;\n  }\n  tr.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-block {\n    display: block !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline {\n    display: inline !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm {\n    display: block !important;\n  }\n  table.visible-sm {\n    display: table;\n  }\n  tr.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-block {\n    display: block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important;\n  }\n  table.visible-md {\n    display: table;\n  }\n  tr.visible-md {\n    display: table-row !important;\n  }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-block {\n    display: block !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important;\n  }\n  table.visible-lg {\n    display: table;\n  }\n  tr.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-block {\n    display: block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (max-width: 767px) {\n  .hidden-xs {\n    display: none !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm {\n    display: none !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .hidden-lg {\n    display: none !important;\n  }\n}\n.visible-print {\n  display: none !important;\n}\n@media print {\n  .visible-print {\n    display: block !important;\n  }\n  table.visible-print {\n    display: table;\n  }\n  tr.visible-print {\n    display: table-row !important;\n  }\n  th.visible-print,\n  td.visible-print {\n    display: table-cell !important;\n  }\n}\n.visible-print-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-block {\n    display: block !important;\n  }\n}\n.visible-print-inline {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline {\n    display: inline !important;\n  }\n}\n.visible-print-inline-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline-block {\n    display: inline-block !important;\n  }\n}\n@media print {\n  .hidden-print {\n    display: none !important;\n  }\n}\n/*# sourceMappingURL=bootstrap.css.map */\n"
  },
  {
    "path": "django-rest-framework-fast/static/css/main.css",
    "content": "\n\n/* ==========================================================================\n   Author's custom styles\n   ========================================================================== */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "django-rest-framework-fast/static/humans.txt",
    "content": "# humanstxt.org/\n# The humans responsible & technology colophon\n\n# TEAM\n\n    <name> -- <role> -- <twitter>\n\n# THANKS\n\n    <name>\n\n# TECHNOLOGY COLOPHON\n\n    HTML5, CSS3\n    jQuery, Modernizr\n"
  },
  {
    "path": "django-rest-framework-fast/static/js/main.js",
    "content": "\n"
  },
  {
    "path": "django-rest-framework-fast/static/js/vendor/bootstrap.js",
    "content": "/*!\n * Bootstrap v3.3.1 (http://getbootstrap.com)\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\nif (typeof jQuery === 'undefined') {\n  throw new Error('Bootstrap\\'s JavaScript requires jQuery')\n}\n\n+function ($) {\n  var version = $.fn.jquery.split(' ')[0].split('.')\n  if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1)) {\n    throw new Error('Bootstrap\\'s JavaScript requires jQuery version 1.9.1 or higher')\n  }\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: transition.js v3.3.1\n * http://getbootstrap.com/javascript/#transitions\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)\n  // ============================================================\n\n  function transitionEnd() {\n    var el = document.createElement('bootstrap')\n\n    var transEndEventNames = {\n      WebkitTransition : 'webkitTransitionEnd',\n      MozTransition    : 'transitionend',\n      OTransition      : 'oTransitionEnd otransitionend',\n      transition       : 'transitionend'\n    }\n\n    for (var name in transEndEventNames) {\n      if (el.style[name] !== undefined) {\n        return { end: transEndEventNames[name] }\n      }\n    }\n\n    return false // explicit for ie8 (  ._.)\n  }\n\n  // http://blog.alexmaccaw.com/css-transitions\n  $.fn.emulateTransitionEnd = function (duration) {\n    var called = false\n    var $el = this\n    $(this).one('bsTransitionEnd', function () { called = true })\n    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }\n    setTimeout(callback, duration)\n    return this\n  }\n\n  $(function () {\n    $.support.transition = transitionEnd()\n\n    if (!$.support.transition) return\n\n    $.event.special.bsTransitionEnd = {\n      bindType: $.support.transition.end,\n      delegateType: $.support.transition.end,\n      handle: function (e) {\n        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)\n      }\n    }\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: alert.js v3.3.1\n * http://getbootstrap.com/javascript/#alerts\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // ALERT CLASS DEFINITION\n  // ======================\n\n  var dismiss = '[data-dismiss=\"alert\"]'\n  var Alert   = function (el) {\n    $(el).on('click', dismiss, this.close)\n  }\n\n  Alert.VERSION = '3.3.1'\n\n  Alert.TRANSITION_DURATION = 150\n\n  Alert.prototype.close = function (e) {\n    var $this    = $(this)\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = $(selector)\n\n    if (e) e.preventDefault()\n\n    if (!$parent.length) {\n      $parent = $this.closest('.alert')\n    }\n\n    $parent.trigger(e = $.Event('close.bs.alert'))\n\n    if (e.isDefaultPrevented()) return\n\n    $parent.removeClass('in')\n\n    function removeElement() {\n      // detach from parent, fire event then clean up data\n      $parent.detach().trigger('closed.bs.alert').remove()\n    }\n\n    $.support.transition && $parent.hasClass('fade') ?\n      $parent\n        .one('bsTransitionEnd', removeElement)\n        .emulateTransitionEnd(Alert.TRANSITION_DURATION) :\n      removeElement()\n  }\n\n\n  // ALERT PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.alert')\n\n      if (!data) $this.data('bs.alert', (data = new Alert(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  var old = $.fn.alert\n\n  $.fn.alert             = Plugin\n  $.fn.alert.Constructor = Alert\n\n\n  // ALERT NO CONFLICT\n  // =================\n\n  $.fn.alert.noConflict = function () {\n    $.fn.alert = old\n    return this\n  }\n\n\n  // ALERT DATA-API\n  // ==============\n\n  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: button.js v3.3.1\n * http://getbootstrap.com/javascript/#buttons\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // BUTTON PUBLIC CLASS DEFINITION\n  // ==============================\n\n  var Button = function (element, options) {\n    this.$element  = $(element)\n    this.options   = $.extend({}, Button.DEFAULTS, options)\n    this.isLoading = false\n  }\n\n  Button.VERSION  = '3.3.1'\n\n  Button.DEFAULTS = {\n    loadingText: 'loading...'\n  }\n\n  Button.prototype.setState = function (state) {\n    var d    = 'disabled'\n    var $el  = this.$element\n    var val  = $el.is('input') ? 'val' : 'html'\n    var data = $el.data()\n\n    state = state + 'Text'\n\n    if (data.resetText == null) $el.data('resetText', $el[val]())\n\n    // push to event loop to allow forms to submit\n    setTimeout($.proxy(function () {\n      $el[val](data[state] == null ? this.options[state] : data[state])\n\n      if (state == 'loadingText') {\n        this.isLoading = true\n        $el.addClass(d).attr(d, d)\n      } else if (this.isLoading) {\n        this.isLoading = false\n        $el.removeClass(d).removeAttr(d)\n      }\n    }, this), 0)\n  }\n\n  Button.prototype.toggle = function () {\n    var changed = true\n    var $parent = this.$element.closest('[data-toggle=\"buttons\"]')\n\n    if ($parent.length) {\n      var $input = this.$element.find('input')\n      if ($input.prop('type') == 'radio') {\n        if ($input.prop('checked') && this.$element.hasClass('active')) changed = false\n        else $parent.find('.active').removeClass('active')\n      }\n      if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')\n    } else {\n      this.$element.attr('aria-pressed', !this.$element.hasClass('active'))\n    }\n\n    if (changed) this.$element.toggleClass('active')\n  }\n\n\n  // BUTTON PLUGIN DEFINITION\n  // ========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.button')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.button', (data = new Button(this, options)))\n\n      if (option == 'toggle') data.toggle()\n      else if (option) data.setState(option)\n    })\n  }\n\n  var old = $.fn.button\n\n  $.fn.button             = Plugin\n  $.fn.button.Constructor = Button\n\n\n  // BUTTON NO CONFLICT\n  // ==================\n\n  $.fn.button.noConflict = function () {\n    $.fn.button = old\n    return this\n  }\n\n\n  // BUTTON DATA-API\n  // ===============\n\n  $(document)\n    .on('click.bs.button.data-api', '[data-toggle^=\"button\"]', function (e) {\n      var $btn = $(e.target)\n      if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')\n      Plugin.call($btn, 'toggle')\n      e.preventDefault()\n    })\n    .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^=\"button\"]', function (e) {\n      $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))\n    })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: carousel.js v3.3.1\n * http://getbootstrap.com/javascript/#carousel\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // CAROUSEL CLASS DEFINITION\n  // =========================\n\n  var Carousel = function (element, options) {\n    this.$element    = $(element)\n    this.$indicators = this.$element.find('.carousel-indicators')\n    this.options     = options\n    this.paused      =\n    this.sliding     =\n    this.interval    =\n    this.$active     =\n    this.$items      = null\n\n    this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))\n\n    this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element\n      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))\n      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))\n  }\n\n  Carousel.VERSION  = '3.3.1'\n\n  Carousel.TRANSITION_DURATION = 600\n\n  Carousel.DEFAULTS = {\n    interval: 5000,\n    pause: 'hover',\n    wrap: true,\n    keyboard: true\n  }\n\n  Carousel.prototype.keydown = function (e) {\n    if (/input|textarea/i.test(e.target.tagName)) return\n    switch (e.which) {\n      case 37: this.prev(); break\n      case 39: this.next(); break\n      default: return\n    }\n\n    e.preventDefault()\n  }\n\n  Carousel.prototype.cycle = function (e) {\n    e || (this.paused = false)\n\n    this.interval && clearInterval(this.interval)\n\n    this.options.interval\n      && !this.paused\n      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))\n\n    return this\n  }\n\n  Carousel.prototype.getItemIndex = function (item) {\n    this.$items = item.parent().children('.item')\n    return this.$items.index(item || this.$active)\n  }\n\n  Carousel.prototype.getItemForDirection = function (direction, active) {\n    var delta = direction == 'prev' ? -1 : 1\n    var activeIndex = this.getItemIndex(active)\n    var itemIndex = (activeIndex + delta) % this.$items.length\n    return this.$items.eq(itemIndex)\n  }\n\n  Carousel.prototype.to = function (pos) {\n    var that        = this\n    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))\n\n    if (pos > (this.$items.length - 1) || pos < 0) return\n\n    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, \"slid\"\n    if (activeIndex == pos) return this.pause().cycle()\n\n    return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))\n  }\n\n  Carousel.prototype.pause = function (e) {\n    e || (this.paused = true)\n\n    if (this.$element.find('.next, .prev').length && $.support.transition) {\n      this.$element.trigger($.support.transition.end)\n      this.cycle(true)\n    }\n\n    this.interval = clearInterval(this.interval)\n\n    return this\n  }\n\n  Carousel.prototype.next = function () {\n    if (this.sliding) return\n    return this.slide('next')\n  }\n\n  Carousel.prototype.prev = function () {\n    if (this.sliding) return\n    return this.slide('prev')\n  }\n\n  Carousel.prototype.slide = function (type, next) {\n    var $active   = this.$element.find('.item.active')\n    var $next     = next || this.getItemForDirection(type, $active)\n    var isCycling = this.interval\n    var direction = type == 'next' ? 'left' : 'right'\n    var fallback  = type == 'next' ? 'first' : 'last'\n    var that      = this\n\n    if (!$next.length) {\n      if (!this.options.wrap) return\n      $next = this.$element.find('.item')[fallback]()\n    }\n\n    if ($next.hasClass('active')) return (this.sliding = false)\n\n    var relatedTarget = $next[0]\n    var slideEvent = $.Event('slide.bs.carousel', {\n      relatedTarget: relatedTarget,\n      direction: direction\n    })\n    this.$element.trigger(slideEvent)\n    if (slideEvent.isDefaultPrevented()) return\n\n    this.sliding = true\n\n    isCycling && this.pause()\n\n    if (this.$indicators.length) {\n      this.$indicators.find('.active').removeClass('active')\n      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])\n      $nextIndicator && $nextIndicator.addClass('active')\n    }\n\n    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, \"slid\"\n    if ($.support.transition && this.$element.hasClass('slide')) {\n      $next.addClass(type)\n      $next[0].offsetWidth // force reflow\n      $active.addClass(direction)\n      $next.addClass(direction)\n      $active\n        .one('bsTransitionEnd', function () {\n          $next.removeClass([type, direction].join(' ')).addClass('active')\n          $active.removeClass(['active', direction].join(' '))\n          that.sliding = false\n          setTimeout(function () {\n            that.$element.trigger(slidEvent)\n          }, 0)\n        })\n        .emulateTransitionEnd(Carousel.TRANSITION_DURATION)\n    } else {\n      $active.removeClass('active')\n      $next.addClass('active')\n      this.sliding = false\n      this.$element.trigger(slidEvent)\n    }\n\n    isCycling && this.cycle()\n\n    return this\n  }\n\n\n  // CAROUSEL PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.carousel')\n      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)\n      var action  = typeof option == 'string' ? option : options.slide\n\n      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))\n      if (typeof option == 'number') data.to(option)\n      else if (action) data[action]()\n      else if (options.interval) data.pause().cycle()\n    })\n  }\n\n  var old = $.fn.carousel\n\n  $.fn.carousel             = Plugin\n  $.fn.carousel.Constructor = Carousel\n\n\n  // CAROUSEL NO CONFLICT\n  // ====================\n\n  $.fn.carousel.noConflict = function () {\n    $.fn.carousel = old\n    return this\n  }\n\n\n  // CAROUSEL DATA-API\n  // =================\n\n  var clickHandler = function (e) {\n    var href\n    var $this   = $(this)\n    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) // strip for ie7\n    if (!$target.hasClass('carousel')) return\n    var options = $.extend({}, $target.data(), $this.data())\n    var slideIndex = $this.attr('data-slide-to')\n    if (slideIndex) options.interval = false\n\n    Plugin.call($target, options)\n\n    if (slideIndex) {\n      $target.data('bs.carousel').to(slideIndex)\n    }\n\n    e.preventDefault()\n  }\n\n  $(document)\n    .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)\n    .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)\n\n  $(window).on('load', function () {\n    $('[data-ride=\"carousel\"]').each(function () {\n      var $carousel = $(this)\n      Plugin.call($carousel, $carousel.data())\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: collapse.js v3.3.1\n * http://getbootstrap.com/javascript/#collapse\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // COLLAPSE PUBLIC CLASS DEFINITION\n  // ================================\n\n  var Collapse = function (element, options) {\n    this.$element      = $(element)\n    this.options       = $.extend({}, Collapse.DEFAULTS, options)\n    this.$trigger      = $(this.options.trigger).filter('[href=\"#' + element.id + '\"], [data-target=\"#' + element.id + '\"]')\n    this.transitioning = null\n\n    if (this.options.parent) {\n      this.$parent = this.getParent()\n    } else {\n      this.addAriaAndCollapsedClass(this.$element, this.$trigger)\n    }\n\n    if (this.options.toggle) this.toggle()\n  }\n\n  Collapse.VERSION  = '3.3.1'\n\n  Collapse.TRANSITION_DURATION = 350\n\n  Collapse.DEFAULTS = {\n    toggle: true,\n    trigger: '[data-toggle=\"collapse\"]'\n  }\n\n  Collapse.prototype.dimension = function () {\n    var hasWidth = this.$element.hasClass('width')\n    return hasWidth ? 'width' : 'height'\n  }\n\n  Collapse.prototype.show = function () {\n    if (this.transitioning || this.$element.hasClass('in')) return\n\n    var activesData\n    var actives = this.$parent && this.$parent.find('> .panel').children('.in, .collapsing')\n\n    if (actives && actives.length) {\n      activesData = actives.data('bs.collapse')\n      if (activesData && activesData.transitioning) return\n    }\n\n    var startEvent = $.Event('show.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    if (actives && actives.length) {\n      Plugin.call(actives, 'hide')\n      activesData || actives.data('bs.collapse', null)\n    }\n\n    var dimension = this.dimension()\n\n    this.$element\n      .removeClass('collapse')\n      .addClass('collapsing')[dimension](0)\n      .attr('aria-expanded', true)\n\n    this.$trigger\n      .removeClass('collapsed')\n      .attr('aria-expanded', true)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.$element\n        .removeClass('collapsing')\n        .addClass('collapse in')[dimension]('')\n      this.transitioning = 0\n      this.$element\n        .trigger('shown.bs.collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    var scrollSize = $.camelCase(['scroll', dimension].join('-'))\n\n    this.$element\n      .one('bsTransitionEnd', $.proxy(complete, this))\n      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])\n  }\n\n  Collapse.prototype.hide = function () {\n    if (this.transitioning || !this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('hide.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var dimension = this.dimension()\n\n    this.$element[dimension](this.$element[dimension]())[0].offsetHeight\n\n    this.$element\n      .addClass('collapsing')\n      .removeClass('collapse in')\n      .attr('aria-expanded', false)\n\n    this.$trigger\n      .addClass('collapsed')\n      .attr('aria-expanded', false)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.transitioning = 0\n      this.$element\n        .removeClass('collapsing')\n        .addClass('collapse')\n        .trigger('hidden.bs.collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    this.$element\n      [dimension](0)\n      .one('bsTransitionEnd', $.proxy(complete, this))\n      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)\n  }\n\n  Collapse.prototype.toggle = function () {\n    this[this.$element.hasClass('in') ? 'hide' : 'show']()\n  }\n\n  Collapse.prototype.getParent = function () {\n    return $(this.options.parent)\n      .find('[data-toggle=\"collapse\"][data-parent=\"' + this.options.parent + '\"]')\n      .each($.proxy(function (i, element) {\n        var $element = $(element)\n        this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)\n      }, this))\n      .end()\n  }\n\n  Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {\n    var isOpen = $element.hasClass('in')\n\n    $element.attr('aria-expanded', isOpen)\n    $trigger\n      .toggleClass('collapsed', !isOpen)\n      .attr('aria-expanded', isOpen)\n  }\n\n  function getTargetFromTrigger($trigger) {\n    var href\n    var target = $trigger.attr('data-target')\n      || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '') // strip for ie7\n\n    return $(target)\n  }\n\n\n  // COLLAPSE PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.collapse')\n      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data && options.toggle && option == 'show') options.toggle = false\n      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.collapse\n\n  $.fn.collapse             = Plugin\n  $.fn.collapse.Constructor = Collapse\n\n\n  // COLLAPSE NO CONFLICT\n  // ====================\n\n  $.fn.collapse.noConflict = function () {\n    $.fn.collapse = old\n    return this\n  }\n\n\n  // COLLAPSE DATA-API\n  // =================\n\n  $(document).on('click.bs.collapse.data-api', '[data-toggle=\"collapse\"]', function (e) {\n    var $this   = $(this)\n\n    if (!$this.attr('data-target')) e.preventDefault()\n\n    var $target = getTargetFromTrigger($this)\n    var data    = $target.data('bs.collapse')\n    var option  = data ? 'toggle' : $.extend({}, $this.data(), { trigger: this })\n\n    Plugin.call($target, option)\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: dropdown.js v3.3.1\n * http://getbootstrap.com/javascript/#dropdowns\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // DROPDOWN CLASS DEFINITION\n  // =========================\n\n  var backdrop = '.dropdown-backdrop'\n  var toggle   = '[data-toggle=\"dropdown\"]'\n  var Dropdown = function (element) {\n    $(element).on('click.bs.dropdown', this.toggle)\n  }\n\n  Dropdown.VERSION = '3.3.1'\n\n  Dropdown.prototype.toggle = function (e) {\n    var $this = $(this)\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    clearMenus()\n\n    if (!isActive) {\n      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {\n        // if mobile we use a backdrop because click events don't delegate\n        $('<div class=\"dropdown-backdrop\"/>').insertAfter($(this)).on('click', clearMenus)\n      }\n\n      var relatedTarget = { relatedTarget: this }\n      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))\n\n      if (e.isDefaultPrevented()) return\n\n      $this\n        .trigger('focus')\n        .attr('aria-expanded', 'true')\n\n      $parent\n        .toggleClass('open')\n        .trigger('shown.bs.dropdown', relatedTarget)\n    }\n\n    return false\n  }\n\n  Dropdown.prototype.keydown = function (e) {\n    if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return\n\n    var $this = $(this)\n\n    e.preventDefault()\n    e.stopPropagation()\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    if ((!isActive && e.which != 27) || (isActive && e.which == 27)) {\n      if (e.which == 27) $parent.find(toggle).trigger('focus')\n      return $this.trigger('click')\n    }\n\n    var desc = ' li:not(.divider):visible a'\n    var $items = $parent.find('[role=\"menu\"]' + desc + ', [role=\"listbox\"]' + desc)\n\n    if (!$items.length) return\n\n    var index = $items.index(e.target)\n\n    if (e.which == 38 && index > 0)                 index--                        // up\n    if (e.which == 40 && index < $items.length - 1) index++                        // down\n    if (!~index)                                      index = 0\n\n    $items.eq(index).trigger('focus')\n  }\n\n  function clearMenus(e) {\n    if (e && e.which === 3) return\n    $(backdrop).remove()\n    $(toggle).each(function () {\n      var $this         = $(this)\n      var $parent       = getParent($this)\n      var relatedTarget = { relatedTarget: this }\n\n      if (!$parent.hasClass('open')) return\n\n      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))\n\n      if (e.isDefaultPrevented()) return\n\n      $this.attr('aria-expanded', 'false')\n      $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)\n    })\n  }\n\n  function getParent($this) {\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = selector && $(selector)\n\n    return $parent && $parent.length ? $parent : $this.parent()\n  }\n\n\n  // DROPDOWN PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.dropdown')\n\n      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  var old = $.fn.dropdown\n\n  $.fn.dropdown             = Plugin\n  $.fn.dropdown.Constructor = Dropdown\n\n\n  // DROPDOWN NO CONFLICT\n  // ====================\n\n  $.fn.dropdown.noConflict = function () {\n    $.fn.dropdown = old\n    return this\n  }\n\n\n  // APPLY TO STANDARD DROPDOWN ELEMENTS\n  // ===================================\n\n  $(document)\n    .on('click.bs.dropdown.data-api', clearMenus)\n    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })\n    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)\n    .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)\n    .on('keydown.bs.dropdown.data-api', '[role=\"menu\"]', Dropdown.prototype.keydown)\n    .on('keydown.bs.dropdown.data-api', '[role=\"listbox\"]', Dropdown.prototype.keydown)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: modal.js v3.3.1\n * http://getbootstrap.com/javascript/#modals\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // MODAL CLASS DEFINITION\n  // ======================\n\n  var Modal = function (element, options) {\n    this.options        = options\n    this.$body          = $(document.body)\n    this.$element       = $(element)\n    this.$backdrop      =\n    this.isShown        = null\n    this.scrollbarWidth = 0\n\n    if (this.options.remote) {\n      this.$element\n        .find('.modal-content')\n        .load(this.options.remote, $.proxy(function () {\n          this.$element.trigger('loaded.bs.modal')\n        }, this))\n    }\n  }\n\n  Modal.VERSION  = '3.3.1'\n\n  Modal.TRANSITION_DURATION = 300\n  Modal.BACKDROP_TRANSITION_DURATION = 150\n\n  Modal.DEFAULTS = {\n    backdrop: true,\n    keyboard: true,\n    show: true\n  }\n\n  Modal.prototype.toggle = function (_relatedTarget) {\n    return this.isShown ? this.hide() : this.show(_relatedTarget)\n  }\n\n  Modal.prototype.show = function (_relatedTarget) {\n    var that = this\n    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })\n\n    this.$element.trigger(e)\n\n    if (this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = true\n\n    this.checkScrollbar()\n    this.setScrollbar()\n    this.$body.addClass('modal-open')\n\n    this.escape()\n    this.resize()\n\n    this.$element.on('click.dismiss.bs.modal', '[data-dismiss=\"modal\"]', $.proxy(this.hide, this))\n\n    this.backdrop(function () {\n      var transition = $.support.transition && that.$element.hasClass('fade')\n\n      if (!that.$element.parent().length) {\n        that.$element.appendTo(that.$body) // don't move modals dom position\n      }\n\n      that.$element\n        .show()\n        .scrollTop(0)\n\n      if (that.options.backdrop) that.adjustBackdrop()\n      that.adjustDialog()\n\n      if (transition) {\n        that.$element[0].offsetWidth // force reflow\n      }\n\n      that.$element\n        .addClass('in')\n        .attr('aria-hidden', false)\n\n      that.enforceFocus()\n\n      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })\n\n      transition ?\n        that.$element.find('.modal-dialog') // wait for modal to slide in\n          .one('bsTransitionEnd', function () {\n            that.$element.trigger('focus').trigger(e)\n          })\n          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :\n        that.$element.trigger('focus').trigger(e)\n    })\n  }\n\n  Modal.prototype.hide = function (e) {\n    if (e) e.preventDefault()\n\n    e = $.Event('hide.bs.modal')\n\n    this.$element.trigger(e)\n\n    if (!this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = false\n\n    this.escape()\n    this.resize()\n\n    $(document).off('focusin.bs.modal')\n\n    this.$element\n      .removeClass('in')\n      .attr('aria-hidden', true)\n      .off('click.dismiss.bs.modal')\n\n    $.support.transition && this.$element.hasClass('fade') ?\n      this.$element\n        .one('bsTransitionEnd', $.proxy(this.hideModal, this))\n        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :\n      this.hideModal()\n  }\n\n  Modal.prototype.enforceFocus = function () {\n    $(document)\n      .off('focusin.bs.modal') // guard against infinite focus loop\n      .on('focusin.bs.modal', $.proxy(function (e) {\n        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {\n          this.$element.trigger('focus')\n        }\n      }, this))\n  }\n\n  Modal.prototype.escape = function () {\n    if (this.isShown && this.options.keyboard) {\n      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {\n        e.which == 27 && this.hide()\n      }, this))\n    } else if (!this.isShown) {\n      this.$element.off('keydown.dismiss.bs.modal')\n    }\n  }\n\n  Modal.prototype.resize = function () {\n    if (this.isShown) {\n      $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))\n    } else {\n      $(window).off('resize.bs.modal')\n    }\n  }\n\n  Modal.prototype.hideModal = function () {\n    var that = this\n    this.$element.hide()\n    this.backdrop(function () {\n      that.$body.removeClass('modal-open')\n      that.resetAdjustments()\n      that.resetScrollbar()\n      that.$element.trigger('hidden.bs.modal')\n    })\n  }\n\n  Modal.prototype.removeBackdrop = function () {\n    this.$backdrop && this.$backdrop.remove()\n    this.$backdrop = null\n  }\n\n  Modal.prototype.backdrop = function (callback) {\n    var that = this\n    var animate = this.$element.hasClass('fade') ? 'fade' : ''\n\n    if (this.isShown && this.options.backdrop) {\n      var doAnimate = $.support.transition && animate\n\n      this.$backdrop = $('<div class=\"modal-backdrop ' + animate + '\" />')\n        .prependTo(this.$element)\n        .on('click.dismiss.bs.modal', $.proxy(function (e) {\n          if (e.target !== e.currentTarget) return\n          this.options.backdrop == 'static'\n            ? this.$element[0].focus.call(this.$element[0])\n            : this.hide.call(this)\n        }, this))\n\n      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\n      this.$backdrop.addClass('in')\n\n      if (!callback) return\n\n      doAnimate ?\n        this.$backdrop\n          .one('bsTransitionEnd', callback)\n          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :\n        callback()\n\n    } else if (!this.isShown && this.$backdrop) {\n      this.$backdrop.removeClass('in')\n\n      var callbackRemove = function () {\n        that.removeBackdrop()\n        callback && callback()\n      }\n      $.support.transition && this.$element.hasClass('fade') ?\n        this.$backdrop\n          .one('bsTransitionEnd', callbackRemove)\n          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :\n        callbackRemove()\n\n    } else if (callback) {\n      callback()\n    }\n  }\n\n  // these following methods are used to handle overflowing modals\n\n  Modal.prototype.handleUpdate = function () {\n    if (this.options.backdrop) this.adjustBackdrop()\n    this.adjustDialog()\n  }\n\n  Modal.prototype.adjustBackdrop = function () {\n    this.$backdrop\n      .css('height', 0)\n      .css('height', this.$element[0].scrollHeight)\n  }\n\n  Modal.prototype.adjustDialog = function () {\n    var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight\n\n    this.$element.css({\n      paddingLeft:  !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',\n      paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''\n    })\n  }\n\n  Modal.prototype.resetAdjustments = function () {\n    this.$element.css({\n      paddingLeft: '',\n      paddingRight: ''\n    })\n  }\n\n  Modal.prototype.checkScrollbar = function () {\n    this.bodyIsOverflowing = document.body.scrollHeight > document.documentElement.clientHeight\n    this.scrollbarWidth = this.measureScrollbar()\n  }\n\n  Modal.prototype.setScrollbar = function () {\n    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)\n    if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)\n  }\n\n  Modal.prototype.resetScrollbar = function () {\n    this.$body.css('padding-right', '')\n  }\n\n  Modal.prototype.measureScrollbar = function () { // thx walsh\n    var scrollDiv = document.createElement('div')\n    scrollDiv.className = 'modal-scrollbar-measure'\n    this.$body.append(scrollDiv)\n    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth\n    this.$body[0].removeChild(scrollDiv)\n    return scrollbarWidth\n  }\n\n\n  // MODAL PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option, _relatedTarget) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.modal')\n      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))\n      if (typeof option == 'string') data[option](_relatedTarget)\n      else if (options.show) data.show(_relatedTarget)\n    })\n  }\n\n  var old = $.fn.modal\n\n  $.fn.modal             = Plugin\n  $.fn.modal.Constructor = Modal\n\n\n  // MODAL NO CONFLICT\n  // =================\n\n  $.fn.modal.noConflict = function () {\n    $.fn.modal = old\n    return this\n  }\n\n\n  // MODAL DATA-API\n  // ==============\n\n  $(document).on('click.bs.modal.data-api', '[data-toggle=\"modal\"]', function (e) {\n    var $this   = $(this)\n    var href    = $this.attr('href')\n    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\\s]+$)/, ''))) // strip for ie7\n    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())\n\n    if ($this.is('a')) e.preventDefault()\n\n    $target.one('show.bs.modal', function (showEvent) {\n      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown\n      $target.one('hidden.bs.modal', function () {\n        $this.is(':visible') && $this.trigger('focus')\n      })\n    })\n    Plugin.call($target, option, this)\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: tooltip.js v3.3.1\n * http://getbootstrap.com/javascript/#tooltip\n * Inspired by the original jQuery.tipsy by Jason Frame\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // TOOLTIP PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Tooltip = function (element, options) {\n    this.type       =\n    this.options    =\n    this.enabled    =\n    this.timeout    =\n    this.hoverState =\n    this.$element   = null\n\n    this.init('tooltip', element, options)\n  }\n\n  Tooltip.VERSION  = '3.3.1'\n\n  Tooltip.TRANSITION_DURATION = 150\n\n  Tooltip.DEFAULTS = {\n    animation: true,\n    placement: 'top',\n    selector: false,\n    template: '<div class=\"tooltip\" role=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>',\n    trigger: 'hover focus',\n    title: '',\n    delay: 0,\n    html: false,\n    container: false,\n    viewport: {\n      selector: 'body',\n      padding: 0\n    }\n  }\n\n  Tooltip.prototype.init = function (type, element, options) {\n    this.enabled   = true\n    this.type      = type\n    this.$element  = $(element)\n    this.options   = this.getOptions(options)\n    this.$viewport = this.options.viewport && $(this.options.viewport.selector || this.options.viewport)\n\n    var triggers = this.options.trigger.split(' ')\n\n    for (var i = triggers.length; i--;) {\n      var trigger = triggers[i]\n\n      if (trigger == 'click') {\n        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))\n      } else if (trigger != 'manual') {\n        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'\n        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'\n\n        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))\n        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))\n      }\n    }\n\n    this.options.selector ?\n      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :\n      this.fixTitle()\n  }\n\n  Tooltip.prototype.getDefaults = function () {\n    return Tooltip.DEFAULTS\n  }\n\n  Tooltip.prototype.getOptions = function (options) {\n    options = $.extend({}, this.getDefaults(), this.$element.data(), options)\n\n    if (options.delay && typeof options.delay == 'number') {\n      options.delay = {\n        show: options.delay,\n        hide: options.delay\n      }\n    }\n\n    return options\n  }\n\n  Tooltip.prototype.getDelegateOptions = function () {\n    var options  = {}\n    var defaults = this.getDefaults()\n\n    this._options && $.each(this._options, function (key, value) {\n      if (defaults[key] != value) options[key] = value\n    })\n\n    return options\n  }\n\n  Tooltip.prototype.enter = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget).data('bs.' + this.type)\n\n    if (self && self.$tip && self.$tip.is(':visible')) {\n      self.hoverState = 'in'\n      return\n    }\n\n    if (!self) {\n      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())\n      $(obj.currentTarget).data('bs.' + this.type, self)\n    }\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'in'\n\n    if (!self.options.delay || !self.options.delay.show) return self.show()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'in') self.show()\n    }, self.options.delay.show)\n  }\n\n  Tooltip.prototype.leave = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget).data('bs.' + this.type)\n\n    if (!self) {\n      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())\n      $(obj.currentTarget).data('bs.' + this.type, self)\n    }\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'out'\n\n    if (!self.options.delay || !self.options.delay.hide) return self.hide()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'out') self.hide()\n    }, self.options.delay.hide)\n  }\n\n  Tooltip.prototype.show = function () {\n    var e = $.Event('show.bs.' + this.type)\n\n    if (this.hasContent() && this.enabled) {\n      this.$element.trigger(e)\n\n      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])\n      if (e.isDefaultPrevented() || !inDom) return\n      var that = this\n\n      var $tip = this.tip()\n\n      var tipId = this.getUID(this.type)\n\n      this.setContent()\n      $tip.attr('id', tipId)\n      this.$element.attr('aria-describedby', tipId)\n\n      if (this.options.animation) $tip.addClass('fade')\n\n      var placement = typeof this.options.placement == 'function' ?\n        this.options.placement.call(this, $tip[0], this.$element[0]) :\n        this.options.placement\n\n      var autoToken = /\\s?auto?\\s?/i\n      var autoPlace = autoToken.test(placement)\n      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'\n\n      $tip\n        .detach()\n        .css({ top: 0, left: 0, display: 'block' })\n        .addClass(placement)\n        .data('bs.' + this.type, this)\n\n      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)\n\n      var pos          = this.getPosition()\n      var actualWidth  = $tip[0].offsetWidth\n      var actualHeight = $tip[0].offsetHeight\n\n      if (autoPlace) {\n        var orgPlacement = placement\n        var $container   = this.options.container ? $(this.options.container) : this.$element.parent()\n        var containerDim = this.getPosition($container)\n\n        placement = placement == 'bottom' && pos.bottom + actualHeight > containerDim.bottom ? 'top'    :\n                    placement == 'top'    && pos.top    - actualHeight < containerDim.top    ? 'bottom' :\n                    placement == 'right'  && pos.right  + actualWidth  > containerDim.width  ? 'left'   :\n                    placement == 'left'   && pos.left   - actualWidth  < containerDim.left   ? 'right'  :\n                    placement\n\n        $tip\n          .removeClass(orgPlacement)\n          .addClass(placement)\n      }\n\n      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)\n\n      this.applyPlacement(calculatedOffset, placement)\n\n      var complete = function () {\n        var prevHoverState = that.hoverState\n        that.$element.trigger('shown.bs.' + that.type)\n        that.hoverState = null\n\n        if (prevHoverState == 'out') that.leave(that)\n      }\n\n      $.support.transition && this.$tip.hasClass('fade') ?\n        $tip\n          .one('bsTransitionEnd', complete)\n          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :\n        complete()\n    }\n  }\n\n  Tooltip.prototype.applyPlacement = function (offset, placement) {\n    var $tip   = this.tip()\n    var width  = $tip[0].offsetWidth\n    var height = $tip[0].offsetHeight\n\n    // manually read margins because getBoundingClientRect includes difference\n    var marginTop = parseInt($tip.css('margin-top'), 10)\n    var marginLeft = parseInt($tip.css('margin-left'), 10)\n\n    // we must check for NaN for ie 8/9\n    if (isNaN(marginTop))  marginTop  = 0\n    if (isNaN(marginLeft)) marginLeft = 0\n\n    offset.top  = offset.top  + marginTop\n    offset.left = offset.left + marginLeft\n\n    // $.fn.offset doesn't round pixel values\n    // so we use setOffset directly with our own function B-0\n    $.offset.setOffset($tip[0], $.extend({\n      using: function (props) {\n        $tip.css({\n          top: Math.round(props.top),\n          left: Math.round(props.left)\n        })\n      }\n    }, offset), 0)\n\n    $tip.addClass('in')\n\n    // check to see if placing tip in new offset caused the tip to resize itself\n    var actualWidth  = $tip[0].offsetWidth\n    var actualHeight = $tip[0].offsetHeight\n\n    if (placement == 'top' && actualHeight != height) {\n      offset.top = offset.top + height - actualHeight\n    }\n\n    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)\n\n    if (delta.left) offset.left += delta.left\n    else offset.top += delta.top\n\n    var isVertical          = /top|bottom/.test(placement)\n    var arrowDelta          = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight\n    var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'\n\n    $tip.offset(offset)\n    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)\n  }\n\n  Tooltip.prototype.replaceArrow = function (delta, dimension, isHorizontal) {\n    this.arrow()\n      .css(isHorizontal ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')\n      .css(isHorizontal ? 'top' : 'left', '')\n  }\n\n  Tooltip.prototype.setContent = function () {\n    var $tip  = this.tip()\n    var title = this.getTitle()\n\n    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)\n    $tip.removeClass('fade in top bottom left right')\n  }\n\n  Tooltip.prototype.hide = function (callback) {\n    var that = this\n    var $tip = this.tip()\n    var e    = $.Event('hide.bs.' + this.type)\n\n    function complete() {\n      if (that.hoverState != 'in') $tip.detach()\n      that.$element\n        .removeAttr('aria-describedby')\n        .trigger('hidden.bs.' + that.type)\n      callback && callback()\n    }\n\n    this.$element.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    $tip.removeClass('in')\n\n    $.support.transition && this.$tip.hasClass('fade') ?\n      $tip\n        .one('bsTransitionEnd', complete)\n        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :\n      complete()\n\n    this.hoverState = null\n\n    return this\n  }\n\n  Tooltip.prototype.fixTitle = function () {\n    var $e = this.$element\n    if ($e.attr('title') || typeof ($e.attr('data-original-title')) != 'string') {\n      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')\n    }\n  }\n\n  Tooltip.prototype.hasContent = function () {\n    return this.getTitle()\n  }\n\n  Tooltip.prototype.getPosition = function ($element) {\n    $element   = $element || this.$element\n\n    var el     = $element[0]\n    var isBody = el.tagName == 'BODY'\n\n    var elRect    = el.getBoundingClientRect()\n    if (elRect.width == null) {\n      // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093\n      elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })\n    }\n    var elOffset  = isBody ? { top: 0, left: 0 } : $element.offset()\n    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }\n    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null\n\n    return $.extend({}, elRect, scroll, outerDims, elOffset)\n  }\n\n  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {\n    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2  } :\n           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2  } :\n           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :\n        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width   }\n\n  }\n\n  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {\n    var delta = { top: 0, left: 0 }\n    if (!this.$viewport) return delta\n\n    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0\n    var viewportDimensions = this.getPosition(this.$viewport)\n\n    if (/right|left/.test(placement)) {\n      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll\n      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight\n      if (topEdgeOffset < viewportDimensions.top) { // top overflow\n        delta.top = viewportDimensions.top - topEdgeOffset\n      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow\n        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset\n      }\n    } else {\n      var leftEdgeOffset  = pos.left - viewportPadding\n      var rightEdgeOffset = pos.left + viewportPadding + actualWidth\n      if (leftEdgeOffset < viewportDimensions.left) { // left overflow\n        delta.left = viewportDimensions.left - leftEdgeOffset\n      } else if (rightEdgeOffset > viewportDimensions.width) { // right overflow\n        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset\n      }\n    }\n\n    return delta\n  }\n\n  Tooltip.prototype.getTitle = function () {\n    var title\n    var $e = this.$element\n    var o  = this.options\n\n    title = $e.attr('data-original-title')\n      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)\n\n    return title\n  }\n\n  Tooltip.prototype.getUID = function (prefix) {\n    do prefix += ~~(Math.random() * 1000000)\n    while (document.getElementById(prefix))\n    return prefix\n  }\n\n  Tooltip.prototype.tip = function () {\n    return (this.$tip = this.$tip || $(this.options.template))\n  }\n\n  Tooltip.prototype.arrow = function () {\n    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))\n  }\n\n  Tooltip.prototype.enable = function () {\n    this.enabled = true\n  }\n\n  Tooltip.prototype.disable = function () {\n    this.enabled = false\n  }\n\n  Tooltip.prototype.toggleEnabled = function () {\n    this.enabled = !this.enabled\n  }\n\n  Tooltip.prototype.toggle = function (e) {\n    var self = this\n    if (e) {\n      self = $(e.currentTarget).data('bs.' + this.type)\n      if (!self) {\n        self = new this.constructor(e.currentTarget, this.getDelegateOptions())\n        $(e.currentTarget).data('bs.' + this.type, self)\n      }\n    }\n\n    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)\n  }\n\n  Tooltip.prototype.destroy = function () {\n    var that = this\n    clearTimeout(this.timeout)\n    this.hide(function () {\n      that.$element.off('.' + that.type).removeData('bs.' + that.type)\n    })\n  }\n\n\n  // TOOLTIP PLUGIN DEFINITION\n  // =========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this    = $(this)\n      var data     = $this.data('bs.tooltip')\n      var options  = typeof option == 'object' && option\n      var selector = options && options.selector\n\n      if (!data && option == 'destroy') return\n      if (selector) {\n        if (!data) $this.data('bs.tooltip', (data = {}))\n        if (!data[selector]) data[selector] = new Tooltip(this, options)\n      } else {\n        if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))\n      }\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.tooltip\n\n  $.fn.tooltip             = Plugin\n  $.fn.tooltip.Constructor = Tooltip\n\n\n  // TOOLTIP NO CONFLICT\n  // ===================\n\n  $.fn.tooltip.noConflict = function () {\n    $.fn.tooltip = old\n    return this\n  }\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: popover.js v3.3.1\n * http://getbootstrap.com/javascript/#popovers\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // POPOVER PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Popover = function (element, options) {\n    this.init('popover', element, options)\n  }\n\n  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')\n\n  Popover.VERSION  = '3.3.1'\n\n  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {\n    placement: 'right',\n    trigger: 'click',\n    content: '',\n    template: '<div class=\"popover\" role=\"tooltip\"><div class=\"arrow\"></div><h3 class=\"popover-title\"></h3><div class=\"popover-content\"></div></div>'\n  })\n\n\n  // NOTE: POPOVER EXTENDS tooltip.js\n  // ================================\n\n  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)\n\n  Popover.prototype.constructor = Popover\n\n  Popover.prototype.getDefaults = function () {\n    return Popover.DEFAULTS\n  }\n\n  Popover.prototype.setContent = function () {\n    var $tip    = this.tip()\n    var title   = this.getTitle()\n    var content = this.getContent()\n\n    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)\n    $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events\n      this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'\n    ](content)\n\n    $tip.removeClass('fade top bottom left right in')\n\n    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do\n    // this manually by checking the contents.\n    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()\n  }\n\n  Popover.prototype.hasContent = function () {\n    return this.getTitle() || this.getContent()\n  }\n\n  Popover.prototype.getContent = function () {\n    var $e = this.$element\n    var o  = this.options\n\n    return $e.attr('data-content')\n      || (typeof o.content == 'function' ?\n            o.content.call($e[0]) :\n            o.content)\n  }\n\n  Popover.prototype.arrow = function () {\n    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))\n  }\n\n  Popover.prototype.tip = function () {\n    if (!this.$tip) this.$tip = $(this.options.template)\n    return this.$tip\n  }\n\n\n  // POPOVER PLUGIN DEFINITION\n  // =========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this    = $(this)\n      var data     = $this.data('bs.popover')\n      var options  = typeof option == 'object' && option\n      var selector = options && options.selector\n\n      if (!data && option == 'destroy') return\n      if (selector) {\n        if (!data) $this.data('bs.popover', (data = {}))\n        if (!data[selector]) data[selector] = new Popover(this, options)\n      } else {\n        if (!data) $this.data('bs.popover', (data = new Popover(this, options)))\n      }\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.popover\n\n  $.fn.popover             = Plugin\n  $.fn.popover.Constructor = Popover\n\n\n  // POPOVER NO CONFLICT\n  // ===================\n\n  $.fn.popover.noConflict = function () {\n    $.fn.popover = old\n    return this\n  }\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: scrollspy.js v3.3.1\n * http://getbootstrap.com/javascript/#scrollspy\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // SCROLLSPY CLASS DEFINITION\n  // ==========================\n\n  function ScrollSpy(element, options) {\n    var process  = $.proxy(this.process, this)\n\n    this.$body          = $('body')\n    this.$scrollElement = $(element).is('body') ? $(window) : $(element)\n    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)\n    this.selector       = (this.options.target || '') + ' .nav li > a'\n    this.offsets        = []\n    this.targets        = []\n    this.activeTarget   = null\n    this.scrollHeight   = 0\n\n    this.$scrollElement.on('scroll.bs.scrollspy', process)\n    this.refresh()\n    this.process()\n  }\n\n  ScrollSpy.VERSION  = '3.3.1'\n\n  ScrollSpy.DEFAULTS = {\n    offset: 10\n  }\n\n  ScrollSpy.prototype.getScrollHeight = function () {\n    return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)\n  }\n\n  ScrollSpy.prototype.refresh = function () {\n    var offsetMethod = 'offset'\n    var offsetBase   = 0\n\n    if (!$.isWindow(this.$scrollElement[0])) {\n      offsetMethod = 'position'\n      offsetBase   = this.$scrollElement.scrollTop()\n    }\n\n    this.offsets = []\n    this.targets = []\n    this.scrollHeight = this.getScrollHeight()\n\n    var self     = this\n\n    this.$body\n      .find(this.selector)\n      .map(function () {\n        var $el   = $(this)\n        var href  = $el.data('target') || $el.attr('href')\n        var $href = /^#./.test(href) && $(href)\n\n        return ($href\n          && $href.length\n          && $href.is(':visible')\n          && [[$href[offsetMethod]().top + offsetBase, href]]) || null\n      })\n      .sort(function (a, b) { return a[0] - b[0] })\n      .each(function () {\n        self.offsets.push(this[0])\n        self.targets.push(this[1])\n      })\n  }\n\n  ScrollSpy.prototype.process = function () {\n    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset\n    var scrollHeight = this.getScrollHeight()\n    var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()\n    var offsets      = this.offsets\n    var targets      = this.targets\n    var activeTarget = this.activeTarget\n    var i\n\n    if (this.scrollHeight != scrollHeight) {\n      this.refresh()\n    }\n\n    if (scrollTop >= maxScroll) {\n      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)\n    }\n\n    if (activeTarget && scrollTop < offsets[0]) {\n      this.activeTarget = null\n      return this.clear()\n    }\n\n    for (i = offsets.length; i--;) {\n      activeTarget != targets[i]\n        && scrollTop >= offsets[i]\n        && (!offsets[i + 1] || scrollTop <= offsets[i + 1])\n        && this.activate(targets[i])\n    }\n  }\n\n  ScrollSpy.prototype.activate = function (target) {\n    this.activeTarget = target\n\n    this.clear()\n\n    var selector = this.selector +\n        '[data-target=\"' + target + '\"],' +\n        this.selector + '[href=\"' + target + '\"]'\n\n    var active = $(selector)\n      .parents('li')\n      .addClass('active')\n\n    if (active.parent('.dropdown-menu').length) {\n      active = active\n        .closest('li.dropdown')\n        .addClass('active')\n    }\n\n    active.trigger('activate.bs.scrollspy')\n  }\n\n  ScrollSpy.prototype.clear = function () {\n    $(this.selector)\n      .parentsUntil(this.options.target, '.active')\n      .removeClass('active')\n  }\n\n\n  // SCROLLSPY PLUGIN DEFINITION\n  // ===========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.scrollspy')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.scrollspy\n\n  $.fn.scrollspy             = Plugin\n  $.fn.scrollspy.Constructor = ScrollSpy\n\n\n  // SCROLLSPY NO CONFLICT\n  // =====================\n\n  $.fn.scrollspy.noConflict = function () {\n    $.fn.scrollspy = old\n    return this\n  }\n\n\n  // SCROLLSPY DATA-API\n  // ==================\n\n  $(window).on('load.bs.scrollspy.data-api', function () {\n    $('[data-spy=\"scroll\"]').each(function () {\n      var $spy = $(this)\n      Plugin.call($spy, $spy.data())\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: tab.js v3.3.1\n * http://getbootstrap.com/javascript/#tabs\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // TAB CLASS DEFINITION\n  // ====================\n\n  var Tab = function (element) {\n    this.element = $(element)\n  }\n\n  Tab.VERSION = '3.3.1'\n\n  Tab.TRANSITION_DURATION = 150\n\n  Tab.prototype.show = function () {\n    var $this    = this.element\n    var $ul      = $this.closest('ul:not(.dropdown-menu)')\n    var selector = $this.data('target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    if ($this.parent('li').hasClass('active')) return\n\n    var $previous = $ul.find('.active:last a')\n    var hideEvent = $.Event('hide.bs.tab', {\n      relatedTarget: $this[0]\n    })\n    var showEvent = $.Event('show.bs.tab', {\n      relatedTarget: $previous[0]\n    })\n\n    $previous.trigger(hideEvent)\n    $this.trigger(showEvent)\n\n    if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return\n\n    var $target = $(selector)\n\n    this.activate($this.closest('li'), $ul)\n    this.activate($target, $target.parent(), function () {\n      $previous.trigger({\n        type: 'hidden.bs.tab',\n        relatedTarget: $this[0]\n      })\n      $this.trigger({\n        type: 'shown.bs.tab',\n        relatedTarget: $previous[0]\n      })\n    })\n  }\n\n  Tab.prototype.activate = function (element, container, callback) {\n    var $active    = container.find('> .active')\n    var transition = callback\n      && $.support.transition\n      && (($active.length && $active.hasClass('fade')) || !!container.find('> .fade').length)\n\n    function next() {\n      $active\n        .removeClass('active')\n        .find('> .dropdown-menu > .active')\n          .removeClass('active')\n        .end()\n        .find('[data-toggle=\"tab\"]')\n          .attr('aria-expanded', false)\n\n      element\n        .addClass('active')\n        .find('[data-toggle=\"tab\"]')\n          .attr('aria-expanded', true)\n\n      if (transition) {\n        element[0].offsetWidth // reflow for transition\n        element.addClass('in')\n      } else {\n        element.removeClass('fade')\n      }\n\n      if (element.parent('.dropdown-menu')) {\n        element\n          .closest('li.dropdown')\n            .addClass('active')\n          .end()\n          .find('[data-toggle=\"tab\"]')\n            .attr('aria-expanded', true)\n      }\n\n      callback && callback()\n    }\n\n    $active.length && transition ?\n      $active\n        .one('bsTransitionEnd', next)\n        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :\n      next()\n\n    $active.removeClass('in')\n  }\n\n\n  // TAB PLUGIN DEFINITION\n  // =====================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.tab')\n\n      if (!data) $this.data('bs.tab', (data = new Tab(this)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.tab\n\n  $.fn.tab             = Plugin\n  $.fn.tab.Constructor = Tab\n\n\n  // TAB NO CONFLICT\n  // ===============\n\n  $.fn.tab.noConflict = function () {\n    $.fn.tab = old\n    return this\n  }\n\n\n  // TAB DATA-API\n  // ============\n\n  var clickHandler = function (e) {\n    e.preventDefault()\n    Plugin.call($(this), 'show')\n  }\n\n  $(document)\n    .on('click.bs.tab.data-api', '[data-toggle=\"tab\"]', clickHandler)\n    .on('click.bs.tab.data-api', '[data-toggle=\"pill\"]', clickHandler)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: affix.js v3.3.1\n * http://getbootstrap.com/javascript/#affix\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // AFFIX CLASS DEFINITION\n  // ======================\n\n  var Affix = function (element, options) {\n    this.options = $.extend({}, Affix.DEFAULTS, options)\n\n    this.$target = $(this.options.target)\n      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))\n      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))\n\n    this.$element     = $(element)\n    this.affixed      =\n    this.unpin        =\n    this.pinnedOffset = null\n\n    this.checkPosition()\n  }\n\n  Affix.VERSION  = '3.3.1'\n\n  Affix.RESET    = 'affix affix-top affix-bottom'\n\n  Affix.DEFAULTS = {\n    offset: 0,\n    target: window\n  }\n\n  Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {\n    var scrollTop    = this.$target.scrollTop()\n    var position     = this.$element.offset()\n    var targetHeight = this.$target.height()\n\n    if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false\n\n    if (this.affixed == 'bottom') {\n      if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'\n      return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'\n    }\n\n    var initializing   = this.affixed == null\n    var colliderTop    = initializing ? scrollTop : position.top\n    var colliderHeight = initializing ? targetHeight : height\n\n    if (offsetTop != null && colliderTop <= offsetTop) return 'top'\n    if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'\n\n    return false\n  }\n\n  Affix.prototype.getPinnedOffset = function () {\n    if (this.pinnedOffset) return this.pinnedOffset\n    this.$element.removeClass(Affix.RESET).addClass('affix')\n    var scrollTop = this.$target.scrollTop()\n    var position  = this.$element.offset()\n    return (this.pinnedOffset = position.top - scrollTop)\n  }\n\n  Affix.prototype.checkPositionWithEventLoop = function () {\n    setTimeout($.proxy(this.checkPosition, this), 1)\n  }\n\n  Affix.prototype.checkPosition = function () {\n    if (!this.$element.is(':visible')) return\n\n    var height       = this.$element.height()\n    var offset       = this.options.offset\n    var offsetTop    = offset.top\n    var offsetBottom = offset.bottom\n    var scrollHeight = $('body').height()\n\n    if (typeof offset != 'object')         offsetBottom = offsetTop = offset\n    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)\n    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)\n\n    var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)\n\n    if (this.affixed != affix) {\n      if (this.unpin != null) this.$element.css('top', '')\n\n      var affixType = 'affix' + (affix ? '-' + affix : '')\n      var e         = $.Event(affixType + '.bs.affix')\n\n      this.$element.trigger(e)\n\n      if (e.isDefaultPrevented()) return\n\n      this.affixed = affix\n      this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null\n\n      this.$element\n        .removeClass(Affix.RESET)\n        .addClass(affixType)\n        .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')\n    }\n\n    if (affix == 'bottom') {\n      this.$element.offset({\n        top: scrollHeight - height - offsetBottom\n      })\n    }\n  }\n\n\n  // AFFIX PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.affix')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.affix\n\n  $.fn.affix             = Plugin\n  $.fn.affix.Constructor = Affix\n\n\n  // AFFIX NO CONFLICT\n  // =================\n\n  $.fn.affix.noConflict = function () {\n    $.fn.affix = old\n    return this\n  }\n\n\n  // AFFIX DATA-API\n  // ==============\n\n  $(window).on('load', function () {\n    $('[data-spy=\"affix\"]').each(function () {\n      var $spy = $(this)\n      var data = $spy.data()\n\n      data.offset = data.offset || {}\n\n      if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom\n      if (data.offsetTop    != null) data.offset.top    = data.offsetTop\n\n      Plugin.call($spy, data)\n    })\n  })\n\n}(jQuery);\n"
  },
  {
    "path": "django-rest-framework-fast/static/js/vendor/npm.js",
    "content": "// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.\nrequire('../../js/transition.js')\nrequire('../../js/alert.js')\nrequire('../../js/button.js')\nrequire('../../js/carousel.js')\nrequire('../../js/collapse.js')\nrequire('../../js/dropdown.js')\nrequire('../../js/modal.js')\nrequire('../../js/tooltip.js')\nrequire('../../js/popover.js')\nrequire('../../js/scrollspy.js')\nrequire('../../js/tab.js')\nrequire('../../js/affix.js')"
  },
  {
    "path": "django-rest-framework-fast/static/robots.txt",
    "content": "# www.robotstxt.org/\n\n# Allow crawling of all content\nUser-agent: *\nDisallow:\n"
  },
  {
    "path": "flask-tutorial/flask-and-sqlalchemy/app.py",
    "content": "from flask import Flask, render_template, request, redirect, url_for\n\napp = Flask(__name__)\n\nfrom sqlalchemy import create_engine\nfrom sqlalchemy.orm import sessionmaker\nfrom database_setup import Base, Book\n\n# Connect to Database and create database session\nengine = create_engine('sqlite:///books-collection.db')\nBase.metadata.bind = engine\n\nDBSession = sessionmaker(bind=engine)\nsession = DBSession()\n\n\n# landing page that will display all the books in our database\n# This function operate on the Read operation.\n@app.route('/')\n@app.route('/books')\ndef showBooks():\n    books = session.query(Book).all()\n    return render_template(\"books.html\", books=books)\n\n\n# This will let us Create a new book and save it in our database\n@app.route('/books/new/', methods=['GET', 'POST'])\ndef newBook():\n    if request.method == 'POST':\n        newBook = Book(title=request.form['name'], author=request.form['author'], genre=request.form['genre'])\n        session.add(newBook)\n        session.commit()\n        return redirect(url_for('showBooks'))\n    else:\n        return render_template('newBook.html')\n\n\n# This will let us Update our books and save it in our database\n@app.route(\"/books/<int:book_id>/edit/\", methods=['GET', 'POST'])\ndef editBook(book_id):\n    editedBook = session.query(Book).filter_by(id=book_id).one()\n    if request.method == 'POST':\n        if request.form['name']:\n            editedBook.title = request.form['name']\n            return redirect(url_for('showBooks'))\n    else:\n        return render_template('editBook.html', book=editedBook)\n\n\n# This will let us Delete our book\n@app.route('/books/<int:book_id>/delete/', methods=['GET', 'POST'])\ndef deleteBook(book_id):\n    bookToDelete = session.query(Book).filter_by(id=book_id).one()\n    if request.method == 'POST':\n        session.delete(bookToDelete)\n        session.commit()\n        return redirect(url_for('showBooks', book_id=book_id))\n    else:\n        return render_template('deleteBook.html', book=bookToDelete)\n\n\nif __name__ == '__main__':\n    app.debug = True\n    app.run(host='0.0.0.0', port=4996)\n"
  },
  {
    "path": "flask-tutorial/flask-and-sqlalchemy/database_setup.py",
    "content": "import sys\n\n# for creating the mapper code\nfrom sqlalchemy import Column, ForeignKey, Integer, String\n\n# for configuration and class code\nfrom sqlalchemy.ext.declarative import declarative_base\n\n# for creating foreign key relationship between the tables\nfrom sqlalchemy.orm import relationship\n\n# for configuration\nfrom sqlalchemy import create_engine\n\n# create declarative_base instance\nBase = declarative_base()\n\n\n# we create the class Book and extend it from the Base Class.\nclass Book(Base):\n    __tablename__ = 'book'\n\n    id = Column(Integer, primary_key=True)\n    title = Column(String(250), nullable=False)\n    author = Column(String(250), nullable=False)\n    genre = Column(String(250))\n\n\n# creates a create_engine instance at the bottom of the file\nengine = create_engine('sqlite:///books-collection.db')\n\nBase.metadata.create_all(engine)\n"
  },
  {
    "path": "flask-tutorial/flask-and-sqlalchemy/populate.py",
    "content": "from sqlalchemy import create_engine\nfrom sqlalchemy.orm import sessionmaker\n\n# Let's import our Book and Base classes from our database_setup.py file\nfrom database_setup import Book, Base\n\n# bind the engine to the metadata of the Base class so that the\n# declaratives can be accessed through a DBSession instance\nengine = create_engine('sqlite:///books-collection.db')\nBase.metadata.bind = engine\n\nDBSession = sessionmaker(bind=engine)\n# A DBSession() instance establishes all conversations with the database\n# and represents a \"staging zone\" for all the objects loaded into the\n# database session object.\nsession = DBSession()\n\n# Create\n\nbookOne = Book(title=\"The Bell Jar\", author=\"Sylvia Pla\", genre=\"roman a clef\")\nsession.add(bookOne)\nsession.commit()\n\n# Read\n\nsession.query(Book).all()\nsession.query(Book).first()\n\n# Update\neditedBook = session.query(Book).filter_by(id=1).one()\neditedBook.author = \"Sylvia Plath\"\nsession.add(editedBook)\nsession.commit()\n\n# Delete\n\nbookToDelete = session.query(Book).filter_by(title='The Bell Jar').one()\nsession.delete(bookToDelete)\nsession.commit()\n"
  },
  {
    "path": "flask-tutorial/flask-and-sqlalchemy/sql_strings.py",
    "content": "# imports sqlite\nimport sqlite3\n\n# connects it to the books-collection database\nconn = sqlite3.connect('books-collection.db')\n\n# creates the cursor\nc = conn.cursor()\n\n# execute the query which creates the table called books with id and name  #as the columns\nc.execute('''\n          CREATE TABLE books\n          (id INTEGER PRIMARY KEY ASC, \n\t     name varchar(250) NOT NULL)\n          ''')\n\n# executes the query which inserts values in the table\nc.execute(\"INSERT INTO books VALUES(1, 'The Bell Jar')\")\n\n# commits the executions\nconn.commit()\n\n# closes the connection\nconn.close()\n"
  },
  {
    "path": "flask-tutorial/flask-and-sqlalchemy/templates/books.html",
    "content": "<html>\n<body>\n<h1>Books</h1>\n<a href=\"{{url_for('newBook')}}\">\n    <button>Add Restaurant</button>\n</a>\n<ol>\n    {% for book in books %}\n    <li> {{book.title}} by {{book.author}}</li>\n    <a href=\"{{url_for('editBook', book_id = book.id )}}\">\n        Edit\n    </a>\n    <a href=\"{{url_for('deleteBook', book_id = book.id )}}\" style=\"margin-left: 10px;\">\n        Delete\n    </a>\n    <br> <br>\n    {% endfor %}\n</ol>\n</body>\n</html>"
  },
  {
    "path": "flask-tutorial/flask-and-sqlalchemy/templates/deleteBook.html",
    "content": "<h2> Are you sure you want to delete {{book.title}}? </h2>\n<form action=\"#\" method='post'>\n    <button type=\"submit\"> Delete</button>\n    <a href='{{url_for('showBooks')}}'>\n    <button> Cancel</button>\n    </a>\n</form>"
  },
  {
    "path": "flask-tutorial/flask-and-sqlalchemy/templates/editBook.html",
    "content": "<form action=\"{{ url_for('editBook',book_id = book.id)}}\" method=\"post\">\n    <div class=\"form-group\">\n        <label for=\"name\">Title:</label>\n        <input type=\"text\" class=\"form-control\" name=\"name\" value=\"{{book.title }}\">\n        <button type=\"submit\"> SAVE</button>\n        <a href='{{url_for('showBooks')}}'>\n            <button>Cancel</button>\n        </a>\n    </div>\n</form>"
  },
  {
    "path": "flask-tutorial/flask-and-sqlalchemy/templates/newBook.html",
    "content": "<h1>Add a Book</h1>\n<form action=\"#\" method=\"post\">\n   <div class=\"form-group\">\n       <label for=\"name\">Title:</label>\n       <input type=\"text\" maxlength=\"100\" name=\"name\" placeholder=\"Name of the book\">\n\n       <label for=\"author\">Author:</label>\n       <input maxlength=\"100\" name=\"author\" placeholder=\"Author of the book\">\n\n       <label for=\"genre\">Genre:</label>\n       <input maxlength=\"100\" name=\"genre\" placeholder=\"Genre of the book\">\n\n       <button type=\"submit\">Create</button>\n   </div>\n</form>"
  },
  {
    "path": "flask-tutorial/restful-apis-with-flask/app.py",
    "content": "from flask import Flask, render_template, request, redirect, url_for\n\napp = Flask(__name__)\n\nfrom sqlalchemy import create_engine\nfrom sqlalchemy.orm import sessionmaker\nfrom database_setup import Base, Book\n\n# Connect to Database and create database session\nengine = create_engine('sqlite:///books-collection.db?check_same_thread=False')\nBase.metadata.bind = engine\n\nDBSession = sessionmaker(bind=engine)\nsession = DBSession()\n\n\n# landing page that will display all the books in our database\n# This function will operate on the Read operation.\n@app.route('/')\n@app.route('/books')\ndef showBooks():\n    books = session.query(Book).all()\n    return render_template('books.html', books=books)\n\n\n# This will let us Create a new book and save it in our database\n@app.route('/books/new/', methods=['GET', 'POST'])\ndef newBook():\n    if request.method == 'POST':\n        newBook = Book(title=request.form['name'],\n                       author=request.form['author'],\n                       genre=request.form['genre'])\n        session.add(newBook)\n        session.commit()\n        return redirect(url_for('showBooks'))\n    else:\n        return render_template('newBook.html')\n\n\n# This will let us Update our books and save it in our database\n@app.route(\"/books/<int:book_id>/edit/\", methods=['GET', 'POST'])\ndef editBook(book_id):\n    editedBook = session.query(Book).filter_by(id=book_id).one()\n    if request.method == 'POST':\n        if request.form['name']:\n            editedBook.title = request.form['name']\n            return redirect(url_for('showBooks'))\n    else:\n        return render_template('editBook.html', book=editedBook)\n\n\n# This will let us Delete our book\n@app.route('/books/<int:book_id>/delete/', methods=['GET', 'POST'])\ndef deleteBook(book_id):\n    bookToDelete = session.query(Book).filter_by(id=book_id).one()\n    if request.method == 'POST':\n        session.delete(bookToDelete)\n        session.commit()\n        return redirect(url_for('showBooks', book_id=book_id))\n    else:\n        return render_template('deleteBook.html', book=bookToDelete)\n\n\n\"\"\"\napi functions\n\"\"\"\nfrom flask import jsonify\n\n\ndef get_books():\n    books = session.query(Book).all()\n    return jsonify(books=[b.serialize for b in books])\n\n\ndef get_book(book_id):\n    books = session.query(Book).filter_by(id=book_id).one()\n    return jsonify(books=books.serialize)\n\n\ndef makeANewBook(title, author, genre):\n    addedbook = Book(title=title, author=author, genre=genre)\n    session.add(addedbook)\n    session.commit()\n    return jsonify(Book=addedbook.serialize)\n\n\ndef updateBook(id, title, author, genre):\n    updatedBook = session.query(Book).filter_by(id=id).one()\n    if not title:\n        updatedBook.title = title\n    if not author:\n        updatedBook.author = author\n    if not genre:\n        updatedBook.genre = genre\n    session.add(updatedBook)\n    session.commit()\n    return 'Updated a Book with id %s' % id\n\n\ndef deleteABook(id):\n    bookToDelete = session.query(Book).filter_by(id=id).one()\n    session.delete(bookToDelete)\n    session.commit()\n    return 'Removed Book with id %s' % id\n\n\n@app.route('/')\n@app.route('/booksApi', methods=['GET', 'POST'])\ndef booksFunction():\n    if request.method == 'GET':\n        return get_books()\n    elif request.method == 'POST':\n        title = request.args.get('title', '')\n        author = request.args.get('author', '')\n        genre = request.args.get('genre', '')\n        return makeANewBook(title, author, genre)\n\n\n@app.route('/booksApi/<int:id>', methods=['GET', 'PUT', 'DELETE'])\ndef bookFunctionId(id):\n    if request.method == 'GET':\n        return get_book(id)\n\n    elif request.method == 'PUT':\n        title = request.args.get('title', '')\n        author = request.args.get('author', '')\n        genre = request.args.get('genre', '')\n        return updateBook(id, title, author, genre)\n\n    elif request.method == 'DELETE':\n        return deleteABook(id)\n\n\nif __name__ == '__main__':\n    app.debug = True\n    app.run(host='0.0.0.0', port=4996)\n"
  },
  {
    "path": "flask-tutorial/restful-apis-with-flask/database_setup.py",
    "content": "import sys\n\n# for creating the mapper code\nfrom sqlalchemy import Column, ForeignKey, Integer, String\n\n# for configuration and class code\nfrom sqlalchemy.ext.declarative import declarative_base\n\n# for creating foreign key relationship between the tables\nfrom sqlalchemy.orm import relationship\n\n# for configuration\nfrom sqlalchemy import create_engine\n\n# create declarative_base instance\nBase = declarative_base()\n\n\n# We will add classes here\nclass Book(Base):\n    __tablename__ = 'book'\n\n    id = Column(Integer, primary_key=True)\n    title = Column(String(250), nullable=False)\n    author = Column(String(250), nullable=False)\n    genre = Column(String(250))\n\n    @property\n    def serialize(self):\n        return {\n            'title': self.title,\n            'author': self.author,\n            'genre': self.genre,\n            'id': self.id,\n        }\n\n\n# creates a create_engine instance at the bottom of the file\nengine = create_engine('sqlite:///books-collection.db')\nBase.metadata.create_all(engine)\n"
  },
  {
    "path": "future-of-data-science/example.py",
    "content": "from sklearn import datasets, linear_model\nimport matplotlib.pyplot as plt\n\niris = datasets.load_iris()\n\n# data and features are both numpy arrays\ndata = iris.data\nfeatures = iris.feature_names\n\n# create the regression model\nregression = linear_model.LinearRegression()\n\n# Reshape the Numpy arras so that they are columnar\nx_data = data[:, 2].reshape(-1, 1)\ny_data = data[:, 3].reshape(-1, 1)\n\n# Train the regression model to fit the data from iris (comparing the petal width)\nregression.fit(x_data, y_data)\n\nplt.plot(x_data, regression.predict(x_data), color='black', linewidth=3)\nplt.scatter(x_data, y_data)\n\nplt.show()"
  },
  {
    "path": "image-segmentation/README.md",
    "content": "# image-segmentation-validation\nThis repo contains notebook showing grayscale to binary image segmentation and validation \n"
  },
  {
    "path": "image-segmentation/image_segmentation.py",
    "content": "\"\"\"\nGrayscale Image Segmentation And Validation\n\"\"\"\n\nimport cv2\nimport matplotlib.pyplot as plt\nimport nose.tools\nimport numpy as np\nimport scipy.misc\nimport scipy.ndimage\nimport skimage.filters\nimport sklearn.metrics\n# Optional, added to ignore scipy read warnings\nimport warnings\n\nwarnings.simplefilter('ignore')\n\n# Optional\n# plt.ion()\n\n# LOADING AND VISUALIZING DATA\ngrayscale = scipy.misc.imread(\"grayscale.png\")\ngrayscale = 255 - grayscale\nground_truth = scipy.misc.imread(\"groundtruth.png\")\n\nplt.subplot(1, 3, 1)\nplt.imshow(255 - grayscale, cmap='gray')\nplt.title(\"grayscale\")\nplt.axis(\"off\")\nplt.subplot(1, 3, 2)\nplt.imshow(grayscale, cmap='gray')\nplt.title(\"inverted grayscale\")\nplt.axis(\"off\")\nplt.subplot(1, 3, 3)\nplt.imshow(ground_truth, cmap='gray')\nplt.title(\"groundtruth binary\")\nplt.axis(\"off\")\nplt.show()\n\n# PRE-PROCESSING\nmedian_filtered = scipy.ndimage.median_filter(grayscale, size=3)\nplt.imshow(median_filtered, cmap='gray')\nplt.axis('off')\nplt.title(\"median filtered image\")\nplt.show()\n\n# Histogram\ncounts, vals = np.histogram(grayscale, bins=range(2 ** 8))\nplt.plot(range(0, (2 ** 8) - 1), counts)\nplt.title(\"Grayscale image histogram\")\nplt.xlabel(\"Pixel intensity\")\nplt.ylabel(\"Count\")\nplt.show()\n\n# Otsu thresholding and visualization\nresult = skimage.filters.thresholding.try_all_threshold(median_filtered)\nthreshold = skimage.filters.threshold_otsu(median_filtered)\nprint(\"Threshold value is {}\".format(threshold))\npredicted = np.uint8(median_filtered > threshold) * 255\nplt.imshow(predicted, cmap='gray')\nplt.axis('off')\nplt.title(\"otsu predicted binary image\")\nplt.show()\n\n\ndef _assert_valid_lists(groundtruth_list, predicted_list):\n    assert len(groundtruth_list) == len(predicted_list)\n    for unique_element in np.unique(groundtruth_list).tolist():\n        assert unique_element in [0, 1]\n\n\ndef _all_class_1_predicted_as_class_1(groundtruth_list, predicted_list):\n    _assert_valid_lists(groundtruth_list, predicted_list)\n    return np.unique(groundtruth_list).tolist() == np.unique(predicted_list).tolist() == [1]\n\n\ndef _all_class_0_predicted_as_class_0(groundtruth_list, predicted_list):\n    _assert_valid_lists(groundtruth_list, predicted_list)\n    return np.unique(groundtruth_list).tolist() == np.unique(predicted_list).tolist() == [0]\n\n\ndef get_confusion_matrix_elements(groundtruth_list, predicted_list):\n    \"\"\"\n    Return confusion matrix elements covering edge cases\n\n    :param groundtruth_list list of groundtruth elements\n    :param predicted_list list of predicted elements\n    :return returns confusion matrix elements i.e TN, FP, FN, TP in that order and as floats\n    returned as floats to make it feasible for float division for further calculations on them\n    \"\"\"\n    _assert_valid_lists(groundtruth_list, predicted_list)\n\n    if _all_class_1_predicted_as_class_1(groundtruth_list, predicted_list) is True:\n        tn, fp, fn, tp = 0, 0, 0, np.float64(len(groundtruth_list))\n\n    elif _all_class_0_predicted_as_class_0(groundtruth_list, predicted_list) is True:\n        tn, fp, fn, tp = np.float64(len(groundtruth_list)), 0, 0, 0\n\n    else:\n        tn, fp, fn, tp = sklearn.metrics.confusion_matrix(groundtruth_list, predicted_list).ravel()\n        tn, fp, fn, tp = np.float64(tn), np.float64(fp), np.float64(fn), np.float64(tp)\n\n    return tn, fp, fn, tp\n\n\n\ndef _all_class_0_predicted_as_class_1(groundtruth_list, predicted_list):\n    _assert_valid_lists(groundtruth_list, predicted_list)\n    return np.unique(groundtruth_list).tolist() == [0] and np.unique(predicted_list).tolist() == [1]\n\n\ndef _all_class_1_predicted_as_class_0(groundtruth_list, predicted_list):\n    _assert_valid_lists(groundtruth_list, predicted_list)\n    return np.unique(groundtruth_list).tolist() == [1] and np.unique(predicted_list).tolist() == [0]\n\n\ndef _mcc_denominator_zero(tn, fp, fn, tp):\n    _assert_valid_lists(groundtruth_list, predicted_list)\n    return (tn == 0 and fn == 0) or (tn == 0 and fp == 0) or (tp == 0 and fp == 0) or (tp == 0 and fn == 0)\n\n\ndef get_f1_score(groundtruth_list, predicted_list):\n    \"\"\"\n    Return f1 score covering edge cases\n\n    :param groundtruth_list list of groundtruth elements\n    :param predicted_list list of predicted elements\n    :return returns f1 score\n    \"\"\"\n    _assert_valid_lists(groundtruth_list, predicted_list)\n    tn, fp, fn, tp = get_confusion_matrix_elements(groundtruth_list, predicted_list)\n\n    if _all_class_0_predicted_as_class_0(groundtruth_list, predicted_list) is True:\n        f1_score = 1\n    elif _all_class_1_predicted_as_class_1(groundtruth_list, predicted_list) is True:\n        f1_score = 1\n    else:\n        f1_score = (2 * tp) / ((2 * tp) + fp + fn)\n\n    return f1_score\n\n\ndef get_mcc(groundtruth_list, predicted_list):\n    \"\"\"\n    Return mcc covering edge cases\n\n    :param groundtruth_list list of groundtruth elements\n    :param predicted_list list of predicted elements\n    :return returns mcc\n    \"\"\"\n    _assert_valid_lists(groundtruth_list, predicted_list)\n    tn, fp, fn, tp = get_confusion_matrix_elements(groundtruth_list, predicted_list)\n\n    if _all_class_0_predicted_as_class_0(groundtruth_list, predicted_list) is True:\n        mcc = 1\n    elif _all_class_1_predicted_as_class_1(groundtruth_list, predicted_list) is True:\n        mcc = 1\n    elif _all_class_1_predicted_as_class_0(groundtruth_list, predicted_list) is True:\n        mcc = -1\n    elif _all_class_0_predicted_as_class_1(groundtruth_list, predicted_list) is True:\n        mcc = -1\n    elif _mcc_denominator_zero(tn, fp, fn, tp) is True:\n        mcc = -1\n    else:\n        mcc = ((tp * tn) - (fp * fn)) / (\n            np.sqrt((tp + fp) * (tp + fn) * (tn + fp) * (tn + fn)))\n\n    return mcc\n\n\ndef get_accuracy(groundtruth_list, predicted_list):\n    \"\"\"\n    Return accuracy\n\n    :param groundtruth_list list of elements\n    :param predicted_list list of elements\n    :return returns accuracy\n    \"\"\"\n    _assert_valid_lists(groundtruth_list, predicted_list)\n    tn, fp, fn, tp = get_confusion_matrix_elements(groundtruth_list, predicted_list)\n\n    total = tp + fp + fn + tn\n    accuracy = (tp + tn) / total\n\n    return accuracy\n\n\ndef get_validation_metrics(groundtruth_list, predicted_list):\n    \"\"\"\n    Return validation metrics dictionary with accuracy, f1 score, mcc after\n    comparing ground truth and predicted image\n\n    :param groundtruth_list list of elements\n    :param predicted_list list of elements\n    :return returns a dictionary with accuracy, f1 score, and mcc as keys\n    one could add other stats like FPR, FNR, TP, TN, FP, FN etc\n    \"\"\"\n    _assert_valid_lists(groundtruth_list, predicted_list)\n    validation_metrics = {}\n\n    validation_metrics[\"accuracy\"] = get_accuracy(groundtruth_list, predicted_list)\n    validation_metrics[\"f1_score\"] = get_f1_score(groundtruth_list, predicted_list)\n    validation_metrics[\"mcc\"] = get_mcc(groundtruth_list, predicted_list)\n\n    return validation_metrics\n\n\nnumber_foreground_pixels = np.sum(ground_truth == 255)\nnumber_background_pixels = np.sum(ground_truth == 0)\n\nprint(\"Number of foreground(255) pixels are {}\".format(number_foreground_pixels))\nprint(\"Number of background(0) pixels are {}\".format(number_background_pixels))\n\ngroundtruth_scaled = ground_truth // 255\npredicted_scaled = predicted // 255\n\ngroundtruth_list = (groundtruth_scaled).flatten().tolist()\npredicted_list = (predicted_scaled).flatten().tolist()\nvalidation_metrics = get_validation_metrics(groundtruth_list, predicted_list)\nprint(\"Validation Metrics comparing Otsu and ground truth\")\nprint(validation_metrics)\n\n# VALIDATION VISUALIZATION\n# Confusion matrix overlay masks where TP, FP, FN, TN columns in the masks are in different colors\n\ndef get_confusion_matrix_intersection_mats(groundtruth, predicted):\n    \"\"\"\n    Returns a dictionary of 4 boolean numpy arrays containing True at TP, FP, FN, TN.\n    \"\"\"\n    confusion_matrix_arrs = {}\n\n    groundtruth_inverse = np.logical_not(groundtruth)\n    predicted_inverse = np.logical_not(predicted)\n\n    confusion_matrix_arrs[\"tp\"] = np.logical_and(groundtruth, predicted)\n    confusion_matrix_arrs[\"tn\"] = np.logical_and(groundtruth_inverse, predicted_inverse)\n    confusion_matrix_arrs[\"fp\"] = np.logical_and(groundtruth_inverse, predicted)\n    confusion_matrix_arrs[\"fn\"] = np.logical_and(groundtruth, predicted_inverse)\n\n    return confusion_matrix_arrs\n\n\ndef get_confusion_matrix_overlaid_mask(image, groundtruth, predicted, alpha, colors):\n    \"\"\"\n    Returns overlay the 'image' with a color mask where TP, FP, FN, TN are\n    each a color given by the 'colors' dictionary\n    \"\"\"\n    image = cv2.cvtColor(image, cv2.COLOR_GRAY2RGB)\n    masks = get_confusion_matrix_intersection_mats(groundtruth, predicted)\n    color_mask = np.zeros_like(image)\n\n    for label, mask in masks.items():\n        color = colors[label]\n        mask_rgb = np.zeros_like(image)\n        mask_rgb[mask != 0] = color\n        color_mask += mask_rgb\n\n    return cv2.addWeighted(image, alpha, color_mask, 1 - alpha, 0)\n\n\nalpha = 0.7\nconfusion_matrix_colors = {\n    \"tp\": (0, 255, 255),  # cyan\n    \"fp\": (255, 0, 255),  # magenta\n    \"fn\": (255, 255, 0),  # yellow\n    \"tn\": (0, 0, 0)  # black\n}\n\nvalidation_mask = get_confusion_matrix_overlaid_mask(255 - grayscale, ground_truth, predicted, alpha,\n                                                     confusion_matrix_colors)\nprint(\"Cyan - TP\")\nprint(\"Magenta - FP\")\nprint(\"Yellow - FN\")\nprint(\"Black - TN\")\n\nplt.imshow(validation_mask)\nplt.axis('off')\nplt.title(\"confusion matrix overlay mask\")\nplt.show()\n\nZEROS = [0, 0, 0, 0, 0, 0, 0, 0, 0]\nONES = [1, 1, 1, 1, 1, 1, 1, 1, 1]\nORIGINAL = [1, 0, 1, 0, 1, 1, 0, 0, 0]\nPREDICTED = [1, 0, 1, 0, 0, 1, 1, 0, 0]\nORIGINAL_ARRAY = np.array(ORIGINAL).reshape(3, 3).astype(np.uint8)\nPREDICTED_ARRAY = np.array(PREDICTED).reshape(3, 3).astype(np.uint8)\n\n\"\"\"\nTESTS\n\"\"\"\n\ndef test_get_validation_metrics():\n    validation_metrics = get_validation_metrics(ZEROS, ONES)\n    nose.tools.assert_equal(validation_metrics[\"f1_score\"], 0)\n    nose.tools.assert_equal(validation_metrics[\"mcc\"], -1)\n\n    validation_metrics = get_validation_metrics(ONES, ONES)\n    nose.tools.assert_equal(validation_metrics[\"f1_score\"], 1)\n    nose.tools.assert_equal(validation_metrics[\"mcc\"], 1)\n\n    validation_metrics = get_validation_metrics(ZEROS, ZEROS)\n    nose.tools.assert_equal(validation_metrics[\"f1_score\"], 1)\n    nose.tools.assert_equal(validation_metrics[\"mcc\"], 1)\n\n    validation_metrics = get_validation_metrics(ONES, ZEROS)\n    nose.tools.assert_equal(validation_metrics[\"f1_score\"], 0)\n    nose.tools.assert_equal(validation_metrics[\"mcc\"], -1)\n\n    validation_metrics = get_validation_metrics(ORIGINAL, ORIGINAL)\n    nose.tools.assert_equal(validation_metrics[\"f1_score\"], 1)\n    nose.tools.assert_equal(validation_metrics[\"accuracy\"], 1)\n    nose.tools.assert_equal(validation_metrics[\"mcc\"], 1)\n\n    validation_metrics = get_validation_metrics(ORIGINAL, PREDICTED)\n    nose.tools.assert_almost_equal(validation_metrics[\"f1_score\"], 0.75, places=3)\n\n\ntest_get_validation_metrics()\n\n\ndef test_get_confusion_matrix_intersection_mats():\n    confusion_matrix_mats = get_confusion_matrix_intersection_mats(ORIGINAL, PREDICTED)\n    nose.tools.assert_equal(confusion_matrix_mats[\"tp\"].sum(), 3.0)\n    nose.tools.assert_equal(confusion_matrix_mats[\"fp\"].sum(), 1.0)\n    nose.tools.assert_equal(confusion_matrix_mats[\"fn\"].sum(), 1.0)\n    nose.tools.assert_equal(confusion_matrix_mats[\"tn\"].sum(), 4.0)\n\n\ntest_get_confusion_matrix_intersection_mats()\n\n\ndef test_get_confusion_matrix_overlaid_mask():\n    confusion_matrix_mask = get_confusion_matrix_overlaid_mask(\n        ORIGINAL_ARRAY, ORIGINAL_ARRAY, PREDICTED_ARRAY, 0.5, confusion_matrix_colors)\n    expected = [0, 128, 128, 0, 0, 0, 0, 128, 128, 0, 0, 0, 128, 128, 0, 0, 128, 128, 128, 0, 128, 0, 0, 0, 0, 0, 0]\n    np.testing.assert_array_equal(confusion_matrix_mask.flatten().tolist(), expected)\n\n\ntest_get_confusion_matrix_overlaid_mask()\n"
  },
  {
    "path": "image-segmentation/requirements.txt",
    "content": "cycler==0.10.0\ndecorator==4.4.0\nimageio==2.5.0\nkiwisolver==1.0.1\nmatplotlib==3.0.3\nnetworkx==2.3\nnose==1.3.7\nnumpy==1.16.2\nopencv-python==4.1.0.25\nPillow==6.0.0\npyparsing==2.4.0\npython-dateutil==2.8.0\nPyWavelets==1.0.3\nscikit-image==0.15.0\nscikit-learn==0.20.3\nscipy==1.2.1\nsix==1.12.0\n"
  },
  {
    "path": "matplotlib Explained/data.csv",
    "content": "3.241000000000000103e+00 6.280000000000000027e-01 1.206300000000000061e+01 1.653999999999999915e+00\n4.217999999999999972e+00 3.524999999999999911e+00 1.405499999999999972e+01 1.921999999999999931e+00\n4.889999999999999902e-01 6.039999999999999813e-01 9.701000000000000512e+00 1.020000000000000018e+00\n5.330000000000000293e-01 5.370000000000000329e-01 1.196299999999999919e+01 7.900000000000000078e-02\n5.899999999999999689e-01 1.020000000000000018e+00 9.163000000000000256e+00 1.199000000000000066e+00\n5.623999999999999666e+00 8.371999999999999886e+00 1.485100000000000087e+01 3.561999999999999833e+00\n2.580900000000000105e+01 2.572500000000000142e+01 2.039699999999999847e+01 1.024499999999999922e+01\n2.734499999999999886e+01 2.738500000000000156e+01 1.739999999999999858e+01 1.039300000000000068e+01\n2.273999999999999844e+01 2.356899999999999906e+01 1.752700000000000102e+01 9.191000000000000725e+00\n1.479400000000000048e+01 1.246799999999999997e+01 1.545400000000000063e+01 1.162400000000000055e+01\n7.729000000000000092e+00 8.898999999999999133e+00 1.816000000000000014e+01 8.744999999999999218e+00\n1.359699999999999953e+01 1.566900000000000048e+01 1.747700000000000031e+01 8.599999999999999312e-02\n1.598199999999999932e+01 1.474399999999999977e+01 2.197500000000000142e+01 1.161800000000000033e+01\n1.929899999999999949e+01 1.957400000000000162e+01 1.894399999999999906e+01 1.288499999999999979e+01\n2.138599999999999923e+01 2.052400000000000091e+01 2.379599999999999937e+01 1.376699999999999946e+01\n7.924999999999999822e+00 1.445299999999999940e+01 2.436499999999999844e+01 1.572199999999999953e+01\n7.019999999999999574e+00 1.376099999999999923e+01 2.265399999999999991e+01 1.273399999999999999e+01\n7.926999999999999602e+00 1.498900000000000077e+01 3.012199999999999989e+01 2.217500000000000071e+01\n5.301000000000000156e+00 8.762999999999999901e+00 3.325399999999999778e+01 5.352999999999999758e+00\n1.354999999999999982e+00 2.918000000000000149e+00 4.161699999999999733e+01 1.784400000000000119e+01\n1.626599999999999824e+01 1.755300000000000082e+01 3.576400000000000290e+01 2.707100000000000151e+01\n5.945999999999999730e+00 1.422300000000000075e+01 4.277600000000000335e+01 2.030000000000000071e+01\n"
  },
  {
    "path": "matplotlib Explained/truth.csv",
    "content": "3.240000000000000102e-01\n1.171999999999999931e+00\n1.324999999999999956e+00\n1.439000000000000057e+00\n1.633000000000000007e+00\n6.189000000000000057e+00\n1.039700000000000024e+01\n1.349600000000000044e+01\n1.395800000000000018e+01\n1.439499999999999957e+01\n1.579599999999999937e+01\n1.703999999999999915e+01\n1.704500000000000171e+01\n1.927599999999999980e+01\n2.354500000000000171e+01\n3.002799999999999869e+01\n3.164300000000000068e+01\n3.562800000000000011e+01\n4.044899999999999807e+01\n4.996300000000000097e+01\n5.014399999999999835e+01\n5.270600000000000307e+01\n"
  },
  {
    "path": "neural-networks-intro/SimpleNeuralNetwork.py",
    "content": "#!/usr/bin/env python\n# coding: utf-8\n\nfrom numpy import exp, dot, random, array\n\n\"\"\"Python code for simple Artificial Neural Network with one hidden layer\"\"\"\n\n\ndef initialize_weights():\n    # Generate random numbers\n    random.seed(1)\n\n    # Assign random weights to a 3 x 1 matrix\n    synaptic_weights = random.uniform(low=-1, high=1, size=(3, 1))\n    return synaptic_weights\n\n\ndef sigmoid(x):\n    return 1 / (1 + exp(-x))\n\n\ndef sigmoid_derivative(x):\n    return x * (1 - x)\n\n\ndef train(inputs, expected_output, synaptic_weights, bias, learning_rate, training_iterations):\n    for epoch in range(training_iterations):\n        # Forward pass -- Pass the training set through the network.\n        predicted_output = learn(inputs, synaptic_weights, bias)\n\n        # Backaward pass\n        # Calculate the error\n        error = sigmoid_derivative(predicted_output) * (expected_output - predicted_output)\n\n        # Adjust the weights and bias by a factor\n        weight_factor = dot(inputs.T, error) * learning_rate\n        bias_factor = error * learning_rate\n\n        # Update the synaptic weights\n        synaptic_weights += weight_factor\n\n        # Update the bias\n        bias += bias_factor\n\n        if ((epoch % 1000) == 0):\n            print(\"Epoch\", epoch)\n            print(\"Predicted Output = \", predicted_output.T)\n            print(\"Expected Output = \", expected_output.T)\n            print()\n    return synaptic_weights\n\n\ndef learn(inputs, synaptic_weights, bias):\n    return sigmoid(dot(inputs, synaptic_weights) + bias)\n\n\nif __name__ == \"__main__\":\n    # Initialize random weights for the network\n    synaptic_weights = initialize_weights()\n\n    # The training set\n    inputs = array([[0, 1, 1],\n                    [1, 0, 0],\n                    [1, 0, 1]])\n\n    # Target set\n    expected_output = array([[1, 0, 1]]).T\n\n    # Test set\n    test = array([1, 0, 1])\n\n    # Train the neural network\n    trained_weights = train(inputs, expected_output, synaptic_weights, bias=0.001, learning_rate=0.98,\n                            training_iterations=1000000)\n\n    # Test the neural network with a test example\n    accuracy = (learn(test, trained_weights, bias=0.01)) * 100\n\n    print(\"accuracy =\", accuracy[0], \"%\")\n"
  },
  {
    "path": "neural-networks-intro/readme.md",
    "content": "# Example Code for Intro to Neural Netorks"
  },
  {
    "path": "pandas-time-series-analysis/amazon_stock.csv",
    "content": "None,ticker,Date,Open,High,Low,Close,Volume,Adj_Close\n0,AMZN,3/27/2018,1572.4,1575.96,1482.32,1497.05,6793279,1497.05\n1,AMZN,3/26/2018,1530,1556.99,1499.25,1555.86,5547618,1555.86\n2,AMZN,3/23/2018,1539.01,1549.02,1495.36,1495.56,7843966,1495.56\n3,AMZN,3/22/2018,1565.47,1573.85,1542.4,1544.1,6177737,1544.1\n4,AMZN,3/21/2018,1586.45,1590,1563.17,1581.86,4667291,1581.86\n5,AMZN,3/20/2018,1550.34,1587,1545.41,1586.51,4507049,1586.51\n6,AMZN,3/19/2018,1554.53,1561.66,1525.35,1544.93,6376619,1544.93\n7,AMZN,3/16/2018,1583.45,1589.44,1567.5,1571.68,5145054,1571.68\n8,AMZN,3/15/2018,1595,1596.91,1578.11,1582.32,4026744,1582.32\n9,AMZN,3/14/2018,1597,1606.44,1590.89,1591,4164395,1591\n10,AMZN,3/13/2018,1615.96,1617.54,1578.01,1588.18,6427066,1588.18\n11,AMZN,3/12/2018,1592.6,1605.33,1586.7,1598.39,5115886,1598.39\n12,AMZN,3/9/2018,1563.5,1578.94,1559.08,1578.89,4417059,1578.89\n13,AMZN,3/8/2018,1550,1554.88,1545.25,1551.86,3512528,1551.86\n14,AMZN,3/7/2018,1526.52,1545.9,1522.51,1545,4174123,1545\n15,AMZN,3/6/2018,1533.2,1542.13,1528,1537.64,4561718,1537.64\n16,AMZN,3/5/2018,1494.24,1525.38,1481,1523.61,5233934,1523.61\n17,AMZN,3/2/2018,1469.1,1501.05,1455.01,1500.25,6587564,1500.25\n18,AMZN,3/1/2018,1513.6,1518.49,1465,1493.45,6835230,1493.45\n19,AMZN,2/28/2018,1519.51,1528.7,1512,1512.45,4426580,1512.45\n20,AMZN,2/27/2018,1524.5,1526.78,1507.21,1511.98,4708378,1511.98\n21,AMZN,2/26/2018,1509.2,1522.84,1507,1521.95,4909053,1521.95\n22,AMZN,2/23/2018,1495.34,1500,1486.5,1500,4327008,1500\n23,AMZN,2/22/2018,1495.36,1502.54,1475.76,1484.76,4732555,1484.76\n24,AMZN,2/21/2018,1485,1503.49,1478.92,1482.92,6216694,1482.92\n25,AMZN,2/20/2018,1446.49,1488.77,1446.49,1468.35,6388374,1468.35\n26,AMZN,2/16/2018,1457.37,1465.8,1446.56,1448.69,4410879,1448.69\n27,AMZN,2/15/2018,1466.89,1468.94,1436.84,1461.76,5598111,1461.76\n28,AMZN,2/14/2018,1406.25,1452.06,1403.36,1451.05,5881238,1451.05\n29,AMZN,2/13/2018,1385.93,1419.72,1383.53,1414.51,5858860,1414.51\n30,AMZN,2/12/2018,1364.67,1393.81,1344.01,1386.23,6682214,1386.23\n31,AMZN,2/9/2018,1373.49,1383.5,1265.93,1338.99,13787886,1338.99\n32,AMZN,2/8/2018,1429.67,1433.75,1349.94,1350.47,8108560,1350.47\n33,AMZN,2/7/2018,1449,1460.99,1415.15,1416.78,7066828,1416.78\n34,AMZN,2/6/2018,1361.46,1443.99,1351.79,1442.84,10773963,1442.84\n35,AMZN,2/5/2018,1402.62,1458.98,1320.72,1396.62,10756332,1396.62\n36,AMZN,2/2/2018,1477.39,1498,1414,1431,10915962,1431\n37,AMZN,2/1/2018,1445,1459.88,1385.14,1390,7812953,1390\n38,AMZN,1/31/2018,1451.3,1472.58,1450.04,1451.65,6220396,1451.65\n39,AMZN,1/30/2018,1403.17,1439.25,1392,1437.82,5736512,1437.82\n40,AMZN,1/29/2018,1409.18,1431.39,1400.44,1417.68,5628992,1417.68\n41,AMZN,1/26/2018,1392.01,1402.53,1380.91,1402.05,4584082,1402.05\n42,AMZN,1/25/2018,1368,1378.34,1357.62,1377.95,4621862,1377.95\n43,AMZN,1/24/2018,1374.82,1388.16,1338,1357.51,6730084,1357.51\n44,AMZN,1/23/2018,1338.09,1364.9,1337.34,1362.54,5056764,1362.54\n45,AMZN,1/22/2018,1297.17,1327.45,1296.66,1327.31,3970151,1327.31\n46,AMZN,1/19/2018,1312,1313,1292.99,1294.58,4395070,1294.58\n47,AMZN,1/18/2018,1293.95,1304.6,1284.02,1293.32,3941007,1293.32\n48,AMZN,1/17/2018,1312.24,1314,1280.88,1295,5166748,1295\n49,AMZN,1/16/2018,1323,1339.94,1292.3,1304.86,7111172,1304.86\n50,AMZN,1/12/2018,1273.39,1305.76,1273.39,1305.2,5360681,1305.2\n51,AMZN,1/11/2018,1259.74,1276.77,1256.46,1276.68,3075315,1276.68\n52,AMZN,1/10/2018,1245.15,1254.33,1237.23,1254.33,2659507,1254.33\n53,AMZN,1/9/2018,1256.9,1259.33,1241.76,1252.7,3646681,1252.7\n54,AMZN,1/8/2018,1236,1253.08,1232.03,1246.87,4177533,1246.87\n55,AMZN,1/5/2018,1217.51,1229.14,1210,1229.14,3430148,1229.14\n56,AMZN,1/4/2018,1205,1215.87,1204.66,1209.59,3000366,1209.59\n57,AMZN,1/3/2018,1188.3,1205.49,1188.3,1204.2,3044664,1204.2\n58,AMZN,1/2/2018,1172,1190,1170.51,1189.01,2587899,1189.01\n59,AMZN,12/29/2017,1182.35,1184,1167.5,1169.47,2625283,1169.47\n60,AMZN,12/28/2017,1189,1190.1,1184.38,1186.1,1803460,1186.1\n61,AMZN,12/27/2017,1179.91,1187.29,1175.61,1182.26,1779382,1182.26\n62,AMZN,12/26/2017,1168.36,1178.32,1160.55,1176.76,1964871,1176.76\n63,AMZN,12/22/2017,1172.08,1174.62,1167.83,1168.36,1553997,1168.36\n64,AMZN,12/21/2017,1175.9,1179.17,1167.64,1174.76,2042448,1174.76\n65,AMZN,12/20/2017,1190.5,1191,1176,1177.62,2318916,1177.62\n66,AMZN,12/19/2017,1189.15,1192.97,1179.14,1187.38,2555235,1187.38\n67,AMZN,12/18/2017,1187.37,1194.78,1180.91,1190.58,2767271,1190.58\n68,AMZN,12/15/2017,1179.03,1182.75,1169.33,1179.14,4539895,1179.14\n69,AMZN,12/14/2017,1163.71,1177.93,1162.45,1174.26,3069993,1174.26\n70,AMZN,12/13/2017,1170,1170.87,1160.27,1164.13,2555053,1164.13\n71,AMZN,12/12/2017,1166.51,1173.6,1161.61,1165.08,2197697,1165.08\n72,AMZN,12/11/2017,1164.6,1169.9,1157,1168.92,2257922,1168.92\n73,AMZN,12/8/2017,1170.4,1172.79,1157.1,1162,2957785,1162\n74,AMZN,12/7/2017,1156.59,1163.19,1151,1159.79,2408323,1159.79\n75,AMZN,12/6/2017,1137.99,1155.89,1136.08,1152.35,2756730,1152.35\n76,AMZN,12/5/2017,1128.26,1159.27,1124.74,1141.57,4033184,1141.57\n77,AMZN,12/4/2017,1173.85,1175.2,1128,1133.95,5872358,1133.95\n78,AMZN,12/1/2017,1172.05,1179.65,1152,1162.35,4070722,1162.35\n79,AMZN,11/30/2017,1167.1,1178.57,1160,1176.75,4406535,1176.75\n80,AMZN,11/29/2017,1194.8,1194.8,1145.19,1161.27,9179567,1161.27\n81,AMZN,11/28/2017,1204.88,1205.34,1188.52,1193.6,4463476,1193.6\n82,AMZN,11/27/2017,1202.66,1213.41,1191.15,1195.83,6701343,1195.83\n83,AMZN,11/24/2017,1160.7,1186.84,1160.7,1186,3526582,1186\n84,AMZN,11/22/2017,1141,1160.27,1141,1156.16,3516336,1156.16\n85,AMZN,11/21/2017,1132.86,1140,1128.2,1139.49,2449503,1139.49\n86,AMZN,11/20/2017,1129.77,1133.42,1122.55,1126.31,2134381,1126.31\n87,AMZN,11/17/2017,1138.28,1138.8,1125.81,1129.88,2333554,1129.88\n88,AMZN,11/16/2017,1130.16,1138.16,1130.05,1137.29,2190456,1137.29\n89,AMZN,11/15/2017,1127.01,1131.75,1121.63,1126.69,3897230,1126.69\n90,AMZN,11/14/2017,1130.11,1138,1123.89,1136.84,3042295,1136.84\n91,AMZN,11/13/2017,1123,1139.9,1122.34,1129.17,2897563,1129.17\n92,AMZN,11/10/2017,1126.1,1131.75,1124.06,1125.35,2162985,1125.35\n93,AMZN,11/9/2017,1125.96,1129.62,1115.77,1129.13,3661411,1129.13\n94,AMZN,11/7/2017,1124.74,1130.6,1117.5,1123.17,2623474,1123.17\n95,AMZN,11/6/2017,1109.15,1125.41,1108.77,1120.66,3313857,1120.66\n96,AMZN,11/3/2017,1091.15,1112.68,1088.52,1111.6,3685172,1111.6\n97,AMZN,11/2/2017,1097.81,1101.94,1086.87,1094.22,3658748,1094.22\n98,AMZN,11/1/2017,1105.4,1108.97,1096.74,1103.68,3723680,1103.68\n99,AMZN,10/31/2017,1109,1110.54,1101.12,1105.28,3428461,1105.28\n100,AMZN,10/30/2017,1095.01,1122.79,1093.56,1110.85,6516639,1110.85\n101,AMZN,10/27/2017,1058.14,1105.58,1050.55,1100.95,16360527,1100.95\n102,AMZN,10/26/2017,980.33,982.9,968.55,972.43,3670282,972.43\n103,AMZN,10/25/2017,978,984.44,966.24,972.91,2969295,972.91\n104,AMZN,10/24/2017,969,979.85,965,975.9,2666782,975.9\n105,AMZN,10/23/2017,986.73,986.775,962.5,966.3,3465469,966.3\n106,AMZN,10/20/2017,993.53,994.62,982,982.91,2294145,982.91\n107,AMZN,10/19/2017,990,991.05,980.24,986.61,3040066,986.61\n108,AMZN,10/18/2017,1009.27,1022.31,996.55,997,2477357,997\n109,AMZN,10/17/2017,1005.59,1011.47,1004.38,1009.13,2307075,1009.13\n110,AMZN,10/16/2017,1008.44,1009.57,1001.04,1006.34,1991556,1006.34\n111,AMZN,10/13/2017,1007,1007.77,1001.03,1002.94,2399403,1002.94\n112,AMZN,10/12/2017,996.81,1008.44,992.4,1000.93,4056172,1000.93\n113,AMZN,10/11/2017,991.27,995.5,986.695,995,2310872,995\n114,AMZN,10/10/2017,996.67,997.95,980.099,987.2,3062820,987.2\n115,AMZN,10/9/2017,993.24,998.5,987.5,990.99,2927994,990.99\n116,AMZN,10/6/2017,975.64,995.75,975.64,989.58,3719840,989.58\n117,AMZN,10/5/2017,970,981.51,969.64,980.85,3119487,980.85\n118,AMZN,10/4/2017,954.21,967.79,954.05,965.45,2460721,965.45\n119,AMZN,10/3/2017,958,963.69,950.37,957.1,2643484,957.1\n120,AMZN,10/2/2017,964,967.305,952.1201,959.19,2415846,959.19\n121,AMZN,9/29/2017,960.11,964.83,958.375,961.35,2411643,961.35\n122,AMZN,9/28/2017,951.86,959.7,950.101,956.4,2512567,956.4\n123,AMZN,9/27/2017,948,955.3,943.3,950.87,3111263,950.87\n124,AMZN,9/26/2017,945.49,948.63,931.75,938.6,3464183,938.6\n125,AMZN,9/25/2017,949.31,949.42,932.89,939.79,5065542,939.79\n126,AMZN,9/22/2017,961.01,965.61,954.42,955.1,2602418,955.1\n127,AMZN,9/21/2017,971.31,971.7,962.02,964.65,2252940,964.65\n128,AMZN,9/20/2017,971.79,974.81,962.1626,973.21,2727355,973.21\n129,AMZN,9/19/2017,977.25,978.24,967.46,969.86,2614059,969.86\n130,AMZN,9/18/2017,990.4,992.7922,968.17,974.19,3376772,974.19\n131,AMZN,9/15/2017,993.01,996.25,984.03,986.79,3697742,986.79\n132,AMZN,9/14/2017,996.8,998.56,987.74,992.21,3788472,992.21\n133,AMZN,9/13/2017,983.97,1000,979.42,999.6,3314978,999.6\n134,AMZN,9/12/2017,983.27,984.6718,975.517,982.58,2444699,982.58\n135,AMZN,9/11/2017,974.46,981.94,974.22,977.96,2134582,977.96\n136,AMZN,9/8/2017,979.1,979.88,963.47,965.9,2578269,965.9\n137,AMZN,9/7/2017,974,980.59,972.55,979.47,2536000,979.47\n138,AMZN,9/6/2017,968.32,971.84,960.6,967.8,2106605,967.8\n139,AMZN,9/5/2017,975.4,976.7699,960.37,965.27,2875228,965.27\n140,AMZN,9/1/2017,984.2,984.5,976.875,978.25,2423132,978.25\n141,AMZN,8/31/2017,974.7,981,972.76,980.6,3280945,980.6\n142,AMZN,8/30/2017,958.44,969.41,956.9062,967.59,2860718,967.59\n143,AMZN,8/29/2017,940,956,936.33,954.06,2853972,954.06\n144,AMZN,8/28/2017,946.54,953,942.25,946.02,2529087,946.02\n145,AMZN,8/25/2017,956,957.621,944.1,945.26,3292776,945.26\n146,AMZN,8/24/2017,957.42,959,941.14,952.45,5086748,952.45\n147,AMZN,8/23/2017,959.38,962,954.2,958,2590245,958\n148,AMZN,8/22/2017,955.52,967.93,955.495,966.9,2718261,966.9\n149,AMZN,8/21/2017,957.57,961.2,945.46,953.29,3008450,953.29\n150,AMZN,8/18/2017,961.4,965.43,954.65,958.47,3248677,958.47\n151,AMZN,8/17/2017,977.84,977.84,960.32,960.57,3396045,960.57\n152,AMZN,8/16/2017,981.65,986.4605,973.22,978.18,3096051,978.18\n153,AMZN,8/15/2017,988.9,991.74,982,982.74,2513139,982.74\n154,AMZN,8/14/2017,978.41,985.5,976.19,983.3,3008007,983.3\n155,AMZN,8/11/2017,960,970.39,951.38,967.99,3431423,967.99\n156,AMZN,8/10/2017,976.295,979.86,954.68,956.92,5560388,956.92\n157,AMZN,8/9/2017,982.6,988,975.27,982.01,3434077,982.01\n158,AMZN,8/8/2017,994.35,996.28,985.79,989.84,2847527,989.84\n159,AMZN,8/4/2017,989.68,991.672,982,987.58,2704026,987.58\n160,AMZN,8/3/2017,999.47,999.5,984.59,986.92,3203134,986.92\n161,AMZN,8/2/2017,1001.77,1003.21,981.73,995.89,4017780,995.89\n162,AMZN,8/1/2017,996.11,1006.4,991.58,996.19,4421395,996.19\n163,AMZN,7/31/2017,1019.05,1019.05,987.02,987.78,7246638,987.78\n164,AMZN,7/28/2017,1012.14,1032.85,1001,1020.04,7624498,1020.04\n165,AMZN,7/27/2017,1069.55,1083.31,1040.18,1046,9905158,1046\n166,AMZN,7/26/2017,1043.2,1053.2,1043.2,1052.8,2828980,1052.8\n167,AMZN,7/25/2017,1038.05,1043.33,1032.48,1039.87,2432328,1039.87\n168,AMZN,7/24/2017,1028.34,1043.01,1027.43,1038.95,3212499,1038.95\n169,AMZN,7/21/2017,1021.28,1026.1,1011,1025.67,2677517,1025.67\n170,AMZN,7/20/2017,1031.59,1034.97,1022.52,1028.7,2964341,1028.7\n171,AMZN,7/19/2017,1025,1031.59,1022.5,1026.87,2936902,1026.87\n172,AMZN,7/18/2017,1006,1026.03,1004,1024.38,3957892,1024.38\n173,AMZN,7/17/2017,1004.69,1014.75,1003.81,1010.04,3636801,1010.04\n174,AMZN,7/14/2017,1002.4,1004.45,996.89,1001.81,2066362,1001.81\n175,AMZN,7/13/2017,1004.62,1006.88,995.9,999.855,2864533,999.855\n176,AMZN,7/12/2017,1000.65,1008.55,998.1,1006.51,3491988,1006.51\n177,AMZN,7/11/2017,993,995.99,983.72,994.13,2947479,994.13\n178,AMZN,7/10/2017,985,999.4392,983.5,996.47,3462884,996.47\n179,AMZN,7/7/2017,969.55,980.11,969.14,978.76,2582645,978.76\n180,AMZN,7/6/2017,964.66,974.4,959.02,965.14,3229378,965.14\n181,AMZN,7/5/2017,961.53,975,955.25,971.4,3587645,971.4\n182,AMZN,7/3/2017,972.79,974.49,951.0001,953.66,2908267,953.66\n183,AMZN,6/30/2017,980.12,983.47,967.61,968,3309138,968\n184,AMZN,6/29/2017,979,987.56,965.25,975.93,4246765,975.93\n185,AMZN,6/28/2017,978.55,990.68,969.21,990.33,3708638,990.33\n186,AMZN,6/27/2017,990.69,998.8,976,976.78,3735360,976.78\n187,AMZN,6/26/2017,1008.5,1009.8,992,993.98,3347195,993.98\n188,AMZN,6/23/2017,1002.54,1004.62,998.02,1003.74,2645973,1003.74\n189,AMZN,6/22/2017,1002.23,1006.96,997.2,1001.3,2221035,1001.3\n190,AMZN,6/21/2017,998.7,1002.72,992.6518,1002.23,2892563,1002.23\n191,AMZN,6/20/2017,998,1004.88,992.02,992.59,4040990,992.59\n192,AMZN,6/19/2017,1017,1017,989.9,995.17,4967600,995.17\n193,AMZN,6/16/2017,996,999.75,982,987.71,11314754,987.71\n194,AMZN,6/15/2017,958.7,965.73,950.86,964.17,5202147,964.17\n195,AMZN,6/14/2017,988.59,990.34,966.71,976.47,3943670,976.47\n196,AMZN,6/13/2017,977.99,984.5,966.1,980.79,4533933,980.79\n197,AMZN,6/12/2017,967,975.95,945,964.83,9393802,964.83\n198,AMZN,6/9/2017,1012.5,1012.99,927,978.31,7548854,978.31\n199,AMZN,6/8/2017,1012.06,1013.61,1006.11,1009.94,2724408,1009.94\n200,AMZN,6/7/2017,1005.95,1010.25,1002,1010.07,2779551,1010.07\n201,AMZN,6/6/2017,1012,1016.5,1001.25,1002.97,3298378,1002.97\n202,AMZN,6/5/2017,1007.23,1013.21,1003.51,1011.34,2676857,1011.34\n203,AMZN,6/2/2017,998.99,1008.48,995.67,1006.73,3714954,1006.73\n204,AMZN,6/1/2017,998.59,998.99,991.37,995.95,2384298,995.95\n205,AMZN,5/31/2017,1000,1000.12,982.16,994.62,3912535,994.62\n206,AMZN,5/30/2017,996.51,1001.2,995.52,996.7,3245760,996.7\n207,AMZN,5/26/2017,995,998.65,989.2491,995.78,3394090,995.78\n208,AMZN,5/25/2017,984.85,999,982.11,993.38,4737390,993.38\n209,AMZN,5/24/2017,976,981,970.23,980.35,2407995,980.35\n210,AMZN,5/23/2017,975.02,975.2,966.85,971.54,2395510,971.54\n211,AMZN,5/22/2017,964,971.38,962.9,970.7,2613805,970.7\n212,AMZN,5/19/2017,962.84,968.92,959.72,959.84,3846299,959.84\n213,AMZN,5/18/2017,944.8,962.75,944.76,958.49,3876816,958.49\n214,AMZN,5/17/2017,954.7,960.3957,944.12,944.52,5073254,944.52\n215,AMZN,5/16/2017,961,970.06,960.91,966.07,3050005,966.07\n216,AMZN,5/15/2017,958.73,963.15,956.055,957.97,4245856,957.97\n217,AMZN,5/12/2017,954.5,962.79,951.53,961.35,3605620,961.35\n218,AMZN,5/11/2017,945.11,950.29,940.775,947.62,2135393,947.62\n219,AMZN,5/10/2017,953.5,953.7499,945,948.95,2083441,948.95\n220,AMZN,5/9/2017,952.8,957.89,950.2,952.82,3230630,952.82\n221,AMZN,5/8/2017,940.95,949.05,939.21,949.04,3370672,949.04\n222,AMZN,5/5/2017,940.52,940.79,930.3,934.15,2856585,934.15\n223,AMZN,5/4/2017,944.75,945,934.215,937.53,2380874,937.53\n224,AMZN,5/3/2017,946,946,935.9,941.03,3544234,941.03\n225,AMZN,5/2/2017,946.645,950.1,941.413,946.68,3800912,946.68\n226,AMZN,5/1/2017,927.8,954.4,927.8,948.43,5415793,948.43\n227,AMZN,4/28/2017,948.83,949.59,924.3335,924.99,7278819,924.99\n228,AMZN,4/27/2017,914.39,921.86,912.11,918.76,4255693,918.76\n229,AMZN,4/26/2017,910.3,915.749,907.56,909.29,2562595,909.29\n230,AMZN,4/25/2017,907.04,909.48,903,907.62,3367734,907.62\n231,AMZN,4/24/2017,908.68,909.99,903.82,907.41,3118123,907.41\n232,AMZN,4/21/2017,902.67,903.65,896.77,898.53,2420494,898.53\n233,AMZN,4/20/2017,899.7,905.32,896.29,902.06,2814441,902.06\n234,AMZN,4/19/2017,907.84,910.5,897.369,899.2,2870242,899.2\n235,AMZN,4/18/2017,900.99,909.61,900.78,903.78,2999238,903.78\n236,AMZN,4/17/2017,887.5,902.38,887.5,901.99,2854673,901.99\n237,AMZN,4/13/2017,891.45,894.97,884.49,884.67,3174583,884.67\n238,AMZN,4/12/2017,903.09,904.09,895.2501,896.23,2456140,896.23\n239,AMZN,4/11/2017,907.04,911.24,897.5,902.36,3012743,902.36\n240,AMZN,4/10/2017,899.63,908.51,899,907.04,3184301,907.04\n241,AMZN,4/7/2017,899.65,900.09,889.31,894.88,3707367,894.88\n242,AMZN,4/6/2017,913.8,917.1899,894.4927,898.28,6344065,898.28\n243,AMZN,4/5/2017,910.82,923.72,905.62,909.28,7508370,909.28\n244,AMZN,4/4/2017,891.5,908.5384,890.28,906.83,4984656,906.83\n245,AMZN,4/3/2017,888,893.49,885.42,891.51,3422328,891.51\n246,AMZN,3/31/2017,877,890.35,876.65,886.54,3957612,886.54\n247,AMZN,3/30/2017,874.95,877.06,871.66,876.34,2762730,876.34\n248,AMZN,3/29/2017,859.05,876.438,859.02,874.32,4485770,874.32\n249,AMZN,3/28/2017,851.75,858.46,850.1,856,3041633,856\n250,AMZN,3/27/2017,838.07,850.3,833.5,846.82,2755775,846.82\n251,AMZN,3/24/2017,851.68,851.8,843.53,845.61,2138269,845.61\n252,AMZN,3/23/2017,848.2,850.89,844.8,847.38,1952964,847.38\n253,AMZN,3/22/2017,840.43,849.37,839.05,848.06,2658669,848.06\n254,AMZN,3/21/2017,858.84,862.795,841.31,843.2,4382852,843.2\n255,AMZN,3/20/2017,851.51,857.8,851.01,856.97,2282727,856.97\n256,AMZN,3/17/2017,853.49,853.83,850.64,852.31,3384403,852.31\n257,AMZN,3/16/2017,855.3,855.5,850.51,853.42,1842296,853.42\n258,AMZN,3/15/2017,854.33,854.45,847.11,852.97,2562176,852.97\n259,AMZN,3/14/2017,853.55,853.75,847.55,852.53,2130586,852.53\n260,AMZN,3/13/2017,851.77,855.69,851.71,854.59,1909672,854.59\n261,AMZN,3/10/2017,857,857.35,851.72,852.46,2436434,852.46\n262,AMZN,3/9/2017,851,856.3999,850.31,853,2048187,853\n263,AMZN,3/8/2017,848,853.07,846.79,850.5,2288317,850.5\n264,AMZN,3/7/2017,845.48,848.46,843.75,846.02,2247554,846.02\n265,AMZN,3/6/2017,845.23,848.49,841.12,846.61,2610370,846.61\n266,AMZN,3/3/2017,847.2,851.985,846.27,849.88,1951575,849.88\n267,AMZN,3/2/2017,853.08,854.82,847.28,848.91,2132098,848.91\n268,AMZN,3/1/2017,853.05,854.83,849.01,853.08,2760083,853.08\n269,AMZN,2/28/2017,851.45,854.09,842.05,845.04,2793709,845.04\n270,AMZN,2/27/2017,842.38,852.5,839.67,848.64,2713627,848.64\n271,AMZN,2/24/2017,844.69,845.81,837.7501,845.24,3687963,845.24\n272,AMZN,2/23/2017,857.57,860.86,848,852.19,3461984,852.19\n273,AMZN,2/22/2017,856.95,858.43,852.18,855.61,2616971,855.61\n274,AMZN,2/21/2017,848.84,857.98,847.25,856.44,3507742,856.44\n275,AMZN,2/17/2017,842,847.27,840.73,845.07,3112275,845.07\n276,AMZN,2/16/2017,841.84,845,839.375,844.14,2714667,844.14\n277,AMZN,2/15/2017,834,842.81,832.82,842.7,2968853,842.7\n278,AMZN,2/14/2017,837,838.31,831.4522,836.39,2792442,836.39\n279,AMZN,2/13/2017,831.62,842.9999,828.55,836.53,4172618,836.53\n280,AMZN,2/10/2017,823.82,828,822.85,827.46,2429609,827.46\n281,AMZN,2/9/2017,821.6,825,819.71,821.36,2484948,821.36\n282,AMZN,2/8/2017,812.69,821.479,812.5,819.71,2857985,819.71\n283,AMZN,2/7/2017,809.31,816.16,807.5,812.5,3466091,812.5\n284,AMZN,2/6/2017,809.8,810.72,803,807.64,3897301,807.64\n285,AMZN,2/3/2017,806.72,818.3,804,810.2,10868773,810.2\n286,AMZN,2/2/2017,836.59,842.49,828.26,839.95,7350492,839.95\n287,AMZN,2/1/2017,829.21,833.78,824.94,832.35,3850181,832.35\n288,AMZN,1/31/2017,823.75,826.99,819.56,823.48,3137196,823.48\n289,AMZN,1/30/2017,833,833.5,816.38,830.38,3747336,830.38\n290,AMZN,1/27/2017,839,839.7,829.44,835.77,2998700,835.77\n291,AMZN,1/26/2017,835.53,843.84,833,839.15,3586323,839.15\n292,AMZN,1/25/2017,825.79,837.4183,825.288,836.52,4023078,836.52\n293,AMZN,1/24/2017,822,823.99,814.5,822.44,2971740,822.44\n294,AMZN,1/23/2017,806.8,818.5,805.08,817.88,2797474,817.88\n295,AMZN,1/20/2017,815.28,816.02,806.26,808.33,3376196,808.33\n296,AMZN,1/19/2017,810,813.51,807.32,809.04,2540784,809.04\n297,AMZN,1/18/2017,809.5,811.73,804.27,807.48,2354201,807.48\n298,AMZN,1/17/2017,815.7,816,803.44,809.72,3670529,809.72\n299,AMZN,1/13/2017,814.32,821.65,811.4,817.14,3791945,817.14\n300,AMZN,1/12/2017,800.31,814.13,799.5,813.64,4873922,813.64\n301,AMZN,1/11/2017,793.66,799.5,789.51,799.02,2992791,799.02\n302,AMZN,1/10/2017,796.6,798,789.5434,795.9,2558369,795.9\n303,AMZN,1/9/2017,798,801.7742,791.77,796.92,3446109,796.92\n304,AMZN,1/6/2017,782.36,799.44,778.48,795.99,5986234,795.99\n305,AMZN,1/5/2017,761.55,782.3999,760.2557,780.45,5830068,780.45\n306,AMZN,1/4/2017,758.39,759.68,754.2,757.18,2510526,757.18\n307,AMZN,1/3/2017,757.92,758.7595,747.7,753.67,3521066,753.67\n308,AMZN,12/30/2016,766.47,767.3999,748.28,749.87,4139449,749.87\n309,AMZN,12/29/2016,772.4,773.4,760.85,765.15,3158299,765.15\n310,AMZN,12/28/2016,776.25,780,770.5,772.13,3301025,772.13\n311,AMZN,12/27/2016,763.4,774.65,761.2,771.4,2638725,771.4\n312,AMZN,12/23/2016,764.55,766.5,757.99,760.59,1981616,760.59\n313,AMZN,12/22/2016,768.12,771.21,763.02,766.34,2543551,766.34\n314,AMZN,12/21/2016,770,771.22,765.7,770.6,2044629,770.6\n315,AMZN,12/20/2016,768.65,774.39,767.71,771.22,2703629,771.22\n316,AMZN,12/19/2016,758.89,770.5,756.16,766,3113240,766\n317,AMZN,12/16/2016,765,765.13,754,757.77,4848219,757.77\n318,AMZN,12/15/2016,766.28,769.1,760.31,761,3801927,761\n319,AMZN,12/14/2016,778.25,780.86,762.81,768.82,5454836,768.82\n320,AMZN,12/13/2016,764.96,782.46,762,774.34,5285288,774.34\n321,AMZN,12/12/2016,766.4,766.89,757.2,760.12,2963945,760.12\n322,AMZN,12/9/2016,770,770.25,765.34,768.66,2470923,768.66\n323,AMZN,12/8/2016,771.87,773.79,765.19,767.33,3189608,767.33\n324,AMZN,12/7/2016,764.55,770.42,755.82,770.42,3684906,770.42\n325,AMZN,12/6/2016,763.99,768.24,757.25,764.72,3794746,764.72\n326,AMZN,12/5/2016,745,761.49,742,759.36,4314723,759.36\n327,AMZN,12/2/2016,743.4,748.4903,736.7,740.34,3561307,740.34\n328,AMZN,12/1/2016,752.41,753.37,738.03,743.65,4665993,743.65\n329,AMZN,11/30/2016,762,768.09,750.25,750.57,4625946,750.57\n330,AMZN,11/29/2016,768,769.89,761.32,762.52,3272344,762.52\n331,AMZN,11/28/2016,776.99,777,764.24,766.77,4438828,766.77\n332,AMZN,11/25/2016,786.5,786.75,777.9,780.37,1837068,780.37\n333,AMZN,11/23/2016,781.73,781.75,773.12,780.12,3540263,780.12\n334,AMZN,11/22/2016,788.17,792.4,781,785.33,5311320,785.33\n335,AMZN,11/21/2016,766,780.35,765.11,780,4614574,780\n336,AMZN,11/18/2016,761,767.74,757.6435,760.16,4373408,760.16\n337,AMZN,11/17/2016,749.32,757.5,748,756.4,3690112,756.4\n338,AMZN,11/16/2016,718,749.87,735.61,746.49,3648791,746.49\n339,AMZN,11/15/2016,730,746.78,725.99,743.24,6755785,743.24\n340,AMZN,11/14/2016,745.51,746,710.1,719.07,7321344,719.07\n341,AMZN,11/11/2016,735.73,743.26,728.9,739.01,6622784,739.01\n342,AMZN,11/10/2016,778.81,778.83,717.7,742.38,12746994,742.38\n343,AMZN,11/9/2016,764,777.5,760.09,771.88,8562892,771.88\n344,AMZN,11/8/2016,784.97,791.7399,779.1,787.75,3412629,787.75\n345,AMZN,11/7/2016,771.64,787.732,770.94,784.93,5984354,784.93\n346,AMZN,11/4/2016,762.79,766,753.2301,755.05,5122103,755.05\n347,AMZN,11/3/2016,765.05,777,764,767.03,3872496,767.03\n348,AMZN,11/2/2016,783.93,784.75,763.55,765.56,5026504,765.56\n349,AMZN,11/1/2016,799,800.84,776.713,785.41,5305428,785.41\n350,AMZN,10/31/2016,781.03,793.7,780.11,789.82,5413326,789.82\n351,AMZN,10/28/2016,782,789.49,774.61,776.32,10841073,776.32\n352,AMZN,10/27/2016,831.24,831.72,815.43,818.36,7406385,818.36\n353,AMZN,10/26/2016,832.76,833.44,820,822.59,3998102,822.59\n354,AMZN,10/25/2016,839.3,843.09,833.22,835.18,3248358,835.18\n355,AMZN,10/24/2016,824.95,838.3,822.21,838.09,4060899,838.09\n356,AMZN,10/21/2016,809.36,819.42,809,818.99,2793015,818.99\n357,AMZN,10/20/2016,813.99,815.71,803.1,810.32,3151954,810.32\n358,AMZN,10/19/2016,820.4,820.67,815.17,817.69,2090706,817.69\n359,AMZN,10/18/2016,822.11,823.26,815.02,817.65,2512504,817.65\n360,AMZN,10/17/2016,821.5,822,811.68,812.95,3361492,812.95\n361,AMZN,10/14/2016,835.08,835.74,822.96,822.96,2999814,822.96\n362,AMZN,10/13/2016,829,831.8,821.21,829.28,3091387,829.28\n363,AMZN,10/12/2016,834,837.666,830.1,834.09,2380416,834.09\n364,AMZN,10/11/2016,841.02,841.29,828.35,831,3588180,831\n365,AMZN,10/10/2016,843.25,845.2,840.27,841.71,1827143,841.71\n366,AMZN,10/7/2016,845.79,845.95,837.45,839.43,2426228,839.43\n367,AMZN,10/6/2016,843.7,847.21,840.6,841.66,2684013,841.66\n368,AMZN,10/5/2016,838,845.67,836.12,844.36,3469055,844.36\n369,AMZN,10/4/2016,840.91,842.365,830.26,834.03,2950314,834.03\n370,AMZN,10/3/2016,836,839.86,831.25,836.74,2769448,836.74\n371,AMZN,9/30/2016,832.61,839.95,832.4,837.31,4430566,837.31\n372,AMZN,9/29/2016,828.26,837.5,824.63,829.05,4922248,829.05\n373,AMZN,9/28/2016,818,830.14,817.0337,828.72,4422078,828.72\n374,AMZN,9/27/2016,801.85,816.64,801.11,816.11,3819600,816.11\n375,AMZN,9/26/2016,801.8,805.93,797.145,799.16,2651397,799.16\n376,AMZN,9/23/2016,803.13,807.75,802.12,805.75,2353511,805.75\n377,AMZN,9/22/2016,794.27,805.889,794.27,804.7,4078910,804.7\n378,AMZN,9/21/2016,783.25,790.69,779.01,789.74,2718644,789.74\n379,AMZN,9/20/2016,776,781.37,776,780.22,1937164,780.22\n380,AMZN,9/19/2016,779.97,781.94,771,775.1,2297221,775.1\n381,AMZN,9/16/2016,773.28,780.46,771.66,778.52,5499182,778.52\n382,AMZN,9/15/2016,762,770.87,757.58,769.69,3043534,769.69\n383,AMZN,9/14/2016,762.2,767.5,758.85,761.09,2531822,761.09\n384,AMZN,9/13/2016,768.77,769.89,759.05,761.01,3117224,761.01\n385,AMZN,9/12/2016,757.35,772.66,756,771.49,3124704,771.49\n386,AMZN,9/9/2016,779.36,781,760.11,760.14,4257344,760.14\n387,AMZN,9/8/2016,783.89,786.5,781.44,784.06,2030511,784.06\n388,AMZN,9/7/2016,789.53,790.79,784.33,784.48,2424622,784.48\n389,AMZN,9/6/2016,774.04,789.48,770.22,788.87,3719788,788.87\n390,AMZN,9/2/2016,774.11,776,771.7,772.44,2181792,772.44\n391,AMZN,9/1/2016,770.9,772.04,766.75,770.62,1792271,770.62\n392,AMZN,8/31/2016,766.6,769.64,764,769.16,1633789,769.16\n393,AMZN,8/30/2016,771.05,771.8358,765.56,767.58,1709158,767.58\n394,AMZN,8/29/2016,768.72,774.98,768.6,771.29,2198560,771.29\n395,AMZN,8/26/2016,760.05,770,759.795,769,2776830,769\n396,AMZN,8/25/2016,756,760.56,754.741,759.22,1622992,759.22\n397,AMZN,8/24/2016,763,763.41,755.36,757.25,1744107,757.25\n398,AMZN,8/23/2016,763.31,764.7,761,762.45,1524131,762.45\n399,AMZN,8/22/2016,757.5,759.85,752.1,759.48,1679251,759.48\n400,AMZN,8/19/2016,761.9,762.49,756.89,757.31,2343237,757.31\n401,AMZN,8/18/2016,764,765.17,760.6,764.46,1458834,764.46\n402,AMZN,8/17/2016,764.41,765.22,759.199,764.63,1891116,764.63\n403,AMZN,8/16/2016,768.62,768.7317,763.82,764.04,1604561,764.04\n404,AMZN,8/15/2016,771.9,772.04,767.71,768.49,2118521,768.49\n405,AMZN,8/12/2016,768.46,773.15,768.4225,772.56,1563318,772.56\n406,AMZN,8/11/2016,769.94,773.75,769.12,771.24,2019740,771.24\n407,AMZN,8/10/2016,769.8,772.1,766.19,768.56,1604280,768.56\n408,AMZN,8/9/2016,767.39,772.6,766.9,768.31,1876091,768.31\n409,AMZN,8/8/2016,766.81,767,761.015,766.56,1986272,766.56\n410,AMZN,8/5/2016,764.81,768.47,763.09,765.98,2704391,765.98\n411,AMZN,8/4/2016,753.7,765,750.35,760.77,3178208,760.77\n412,AMZN,8/3/2016,757.06,758.89,752.25,754.64,3581525,754.64\n413,AMZN,8/2/2016,763.81,765.01,757.02,760.58,3603280,760.58\n414,AMZN,8/1/2016,759.87,770.5,757.06,767.74,3578205,767.74\n415,AMZN,7/29/2016,765,766,755,758.81,6777050,758.81\n416,AMZN,7/28/2016,745.98,753.36,739.7,752.61,7617580,752.61\n417,AMZN,7/27/2016,737.97,740.94,733.86,736.67,2913134,736.67\n418,AMZN,7/26/2016,742.71,743.13,732.7525,735.59,2529692,735.59\n419,AMZN,7/25/2016,746.55,748.5,735.35,739.61,2679290,739.61\n420,AMZN,7/22/2016,747.79,751.28,743.53,744.86,2277711,744.86\n421,AMZN,7/21/2016,747.5,749.36,742.7918,744.43,2317072,744.43\n422,AMZN,7/20/2016,744,746.25,740.7,745.72,2214023,745.72\n423,AMZN,7/19/2016,732.5,743.33,732.31,739.95,2216820,739.95\n424,AMZN,7/18/2016,735.49,741.5954,728.72,736.07,2954914,736.07\n425,AMZN,7/15/2016,746.55,746.55,734.05,735.44,3121385,735.44\n426,AMZN,7/14/2016,748.86,749.04,739.02,741.2,2390472,741.2\n427,AMZN,7/13/2016,746.76,756.87,741.25,742.63,4142265,742.63\n428,AMZN,7/12/2016,756.86,757.34,740.33,748.21,5623657,748.21\n429,AMZN,7/11/2016,750,755.9,747,753.78,3195272,753.78\n430,AMZN,7/8/2016,740.14,746.1,738,745.81,3429217,745.81\n431,AMZN,7/7/2016,739.33,739.55,731.63,736.57,2945783,736.57\n432,AMZN,7/6/2016,725.71,737.77,722.58,737.61,3938249,737.61\n433,AMZN,7/5/2016,722.8,728.11,719.61,728.1,2431431,728.1\n434,AMZN,7/1/2016,717.32,728,716.54,725.68,2920423,725.68\n435,AMZN,6/30/2016,717.2,719.37,712.54,715.62,2855142,715.62\n436,AMZN,6/29/2016,715.75,719.5,713.54,715.6,3070052,715.6\n437,AMZN,6/28/2016,700,708,698.1714,707.95,4036957,707.95\n438,AMZN,6/27/2016,692.01,696.8189,682.115,691.36,5584037,691.36\n439,AMZN,6/24/2016,693,712.5292,692.2,698.96,7632511,698.96\n440,AMZN,6/23/2016,715.5,722.12,712.5,722.08,2824974,722.08\n441,AMZN,6/22/2016,716.58,717,707.565,710.6,2260454,710.6\n442,AMZN,6/21/2016,715.72,718.4,712.721,715.82,2137534,715.82\n443,AMZN,6/20/2016,713.5,721.31,710.81,714.01,3677162,714.01\n444,AMZN,6/17/2016,718.19,718.2,699.18,706.39,5897788,706.39\n445,AMZN,6/16/2016,712.05,718,705.3,717.51,3097961,717.51\n446,AMZN,6/15/2016,722,722.56,713.3522,714.26,2709447,714.26\n447,AMZN,6/14/2016,712.33,720.805,712.27,719.3,2506922,719.3\n448,AMZN,6/13/2016,714.01,721.99,711.16,715.24,3352201,715.24\n449,AMZN,6/10/2016,722.35,724.98,714.21,717.91,3425718,717.91\n450,AMZN,6/9/2016,723.1,728.91,722.3,727.65,2170318,727.65\n451,AMZN,6/8/2016,726.4,729.42,721.6,726.64,2223366,726.64\n452,AMZN,6/7/2016,729.89,730,720.55,723.74,2732463,723.74\n453,AMZN,6/6/2016,726.5,731.5,724.42,726.73,2704806,726.73\n454,AMZN,6/3/2016,726.74,727,718.43,725.54,3367306,725.54\n455,AMZN,6/2/2016,720.97,728.28,715.5001,728.24,3026583,728.24\n456,AMZN,6/1/2016,720.9,726.43,718.22,719.44,3263107,719.44\n457,AMZN,5/31/2016,712.33,724.23,711.32,722.79,3618323,722.79\n458,AMZN,5/27/2016,715,716.6,711.1,712.24,2249164,712.24\n459,AMZN,5/26/2016,708.33,715,707.293,714.91,2446681,714.91\n460,AMZN,5/25/2016,708,710.86,705.5159,708.35,3276631,708.35\n461,AMZN,5/24/2016,698.01,707.5,698,704.2,3033782,704.2\n462,AMZN,5/23/2016,704.25,706,696.42,696.75,2595082,696.75\n463,AMZN,5/20/2016,701.05,707.24,700,702.8,2916165,702.8\n464,AMZN,5/19/2016,691.88,699.4,689.56,698.52,3025566,698.52\n465,AMZN,5/18/2016,689.56,702.5399,688.76,697.45,4283189,697.45\n466,AMZN,5/17/2016,709.9,714.47,693.91,695.27,5121357,695.27\n467,AMZN,5/16/2016,710.13,713.25,700.28,710.66,5432920,710.66\n468,AMZN,5/13/2016,714.64,719.25,706.51,709.92,4763419,709.92\n469,AMZN,5/12/2016,717.38,722.45,711.51,717.93,5048150,717.93\n470,AMZN,5/11/2016,705.79,719,701.65,713.23,7338196,713.23\n471,AMZN,5/10/2016,694,704.55,693.5,703.07,6105570,703.07\n472,AMZN,5/9/2016,673.95,686.98,671.41,679.75,3982161,679.75\n473,AMZN,5/6/2016,656.05,676.95,656.01,673.95,4365345,673.95\n474,AMZN,5/5/2016,673.31,676.49,656,659.09,4884114,659.09\n475,AMZN,5/4/2016,662.59,674,662.14,670.9,4635462,670.9\n476,AMZN,5/3/2016,677.36,680.3,670.43,671.32,4923351,671.32\n477,AMZN,5/2/2016,663.92,685.5,662.0251,683.85,6578517,683.85\n478,AMZN,4/29/2016,666,669.98,654,659.59,10310739,659.59\n479,AMZN,4/28/2016,615.54,626.8,599.2,602,7872605,602\n480,AMZN,4/27/2016,611.8,615.95,601.28,606.57,4068767,606.57\n481,AMZN,4/26/2016,626.17,626.7549,614.88,616.88,2521433,616.88\n482,AMZN,4/25/2016,616.61,626.98,616.2511,626.2,2682924,626.2\n483,AMZN,4/22/2016,624.47,628.25,611.56,620.5,5083904,620.5\n484,AMZN,4/21/2016,631,637.82,628.5,631,2596298,631\n485,AMZN,4/20/2016,630,636.55,623,632.99,2609425,632.99\n486,AMZN,4/19/2016,637.14,638.01,620.8,627.9,4055870,627.9\n487,AMZN,4/18/2016,625.35,637.64,624.9603,635.35,4360883,635.35\n488,AMZN,4/15/2016,621.92,626.77,618.11,625.89,2887681,625.89\n489,AMZN,4/14/2016,615.07,624.38,615.07,620.75,3512136,620.75\n490,AMZN,4/13/2016,607.68,616.81,605.29,614.82,4228349,614.82\n491,AMZN,4/12/2016,598.4,604.06,592.31,603.17,2641062,603.17\n492,AMZN,4/11/2016,596.14,604,594.91,595.93,2704267,595.93\n493,AMZN,4/8/2016,594.32,597.86,589,594.6,2591936,594.6\n494,AMZN,4/7/2016,598.76,599.6,589.08,591.43,3189037,591.43\n495,AMZN,4/6/2016,587.52,602.39,587.5,602.08,2849909,602.08\n496,AMZN,4/5/2016,590.77,593.47,585.25,586.14,2308884,586.14\n497,AMZN,4/4/2016,599,599.5,590.55,593.19,2470825,593.19\n498,AMZN,4/1/2016,590.49,599.03,588.3,598.5,2917386,598.5\n499,AMZN,3/31/2016,599.28,600.75,592.21,593.64,2681811,593.64\n500,AMZN,3/30/2016,596.71,603.24,595,598.69,3890461,598.69\n501,AMZN,3/29/2016,580.15,595.85,576.5,593.86,4392567,593.86\n502,AMZN,3/28/2016,584.4,584.75,575.56,579.87,3121522,579.87\n503,AMZN,3/24/2016,567.11,583.55,567.08,582.95,5185539,582.95\n504,AMZN,3/23/2016,561,572.48,558.1,569.63,3983720,569.63\n505,AMZN,3/22/2016,545.11,562.76,545.05,560.48,4000564,560.48\n506,AMZN,3/21/2016,548.91,555.24,538.58,553.98,5155732,553.98\n507,AMZN,3/18/2016,560.94,562.33,546.09,552.08,7296885,552.08\n508,AMZN,3/17/2016,569.51,571.4,555.01,559.44,5928105,559.44\n509,AMZN,3/16/2016,576.64,581.32,571.14,574.27,3537669,574.27\n510,AMZN,3/15/2016,571,581.52,567,577.02,3876821,577.02\n511,AMZN,3/14/2016,567,576.89,563.05,573.37,3454152,573.37\n512,AMZN,3/11/2016,566.95,570.06,562.73,569.61,3771310,569.61\n513,AMZN,3/10/2016,566.74,567,547.9,558.93,3919892,558.93\n514,AMZN,3/9/2016,559.56,560.35,550.125,559.47,4377283,559.47\n515,AMZN,3/8/2016,557.87,571.35,554.74,560.26,4679663,560.26\n516,AMZN,3/7/2016,573.54,573.63,555.55,562.8,4932527,562.8\n517,AMZN,3/4/2016,581.07,581.4,571.065,575.14,3416545,575.14\n518,AMZN,3/3/2016,577.96,579.866,573.11,577.49,2741292,577.49\n519,AMZN,3/2/2016,581.75,585,573.7,580.21,4582170,580.21\n520,AMZN,3/1/2016,556.29,579.25,556,579.04,5038452,579.04\n521,AMZN,2/29/2016,554,564.81,552.51,552.52,4145396,552.52\n522,AMZN,2/26/2016,560.12,562.5,553.17,555.23,4877039,555.23\n523,AMZN,2/25/2016,555.52,559.39,545.2946,555.15,4525463,555.15\n524,AMZN,2/24/2016,545.75,554.27,533.1501,554.04,6231668,554.04\n525,AMZN,2/23/2016,555.55,556.91,545.33,552.94,4050790,552.94\n526,AMZN,2/22/2016,542.2,560.65,541.08,559.5,5566553,559.5\n527,AMZN,2/19/2016,520.71,535.95,515.35,534.9,4974717,534.9\n528,AMZN,2/18/2016,541.19,541.2,523.73,525,4735008,525\n529,AMZN,2/17/2016,528.74,537.48,519.39,534.1,4824002,534.1\n530,AMZN,2/16/2016,519.48,524.45,511.66,521.1,5118500,521.1\n531,AMZN,2/12/2016,510.7,516.75,501.4932,507.08,5384787,507.08\n532,AMZN,2/11/2016,491.17,509.3,484,503.82,7397393,503.82\n533,AMZN,2/10/2016,491.76,504.66,486,490.48,6786181,490.48\n534,AMZN,2/9/2016,478.01,498.38,474,482.07,7077915,482.07\n535,AMZN,2/8/2016,486.47,493.5,475.21,488.1,9825509,488.1\n536,AMZN,2/5/2016,529.28,529.45,499.19,502.13,9708929,502.13\n537,AMZN,2/4/2016,525,538.99,519.2201,536.26,6199070,536.26\n538,AMZN,2/3/2016,553.5,556,521.9,531.07,10048709,531.07\n539,AMZN,2/2/2016,570,571.56,550.09,552.1,6312045,552.1\n540,AMZN,2/1/2016,578.15,581.8,570.31,574.81,6355123,574.81\n541,AMZN,1/29/2016,571.98,593,570,587,14677550,587\n542,AMZN,1/28/2016,608.37,638.06,597.55,635.35,14015171,635.35\n543,AMZN,1/27/2016,601.99,603.39,578.78,583.35,5152853,583.35\n544,AMZN,1/26/2016,603.45,604.5,590.38,601.25,3765655,601.25\n545,AMZN,1/25/2016,597.99,608.5,594.56,596.53,4396079,596.53\n546,AMZN,1/22/2016,588.73,600.1,584.1079,596.38,5120144,596.38\n547,AMZN,1/21/2016,573.58,588.81,568.22,575.02,4952217,575.02\n548,AMZN,1/20/2016,564.36,578.45,547.18,571.77,7966406,571.77\n549,AMZN,1/19/2016,577.09,584,566.45,574.48,4807165,574.48\n550,AMZN,1/15/2016,572.24,584.62,565.3,570.18,7784523,570.18\n551,AMZN,1/14/2016,580.25,602.25,569.88,593,7237978,593\n552,AMZN,1/13/2016,620.88,620.88,579.16,581.81,7655239,581.81\n553,AMZN,1/12/2016,625.25,625.99,612.2415,617.89,4724100,617.89\n554,AMZN,1/11/2016,612.48,619.85,598.57,617.74,4891551,617.74\n555,AMZN,1/8/2016,619.66,624.14,606,607.05,5512915,607.05\n556,AMZN,1/7/2016,621.8,630,605.21,607.94,7074915,607.94\n557,AMZN,1/6/2016,622,639.79,620.31,632.65,5329197,632.65\n558,AMZN,1/5/2016,646.86,646.91,627.65,633.79,5822603,633.79\n559,AMZN,1/4/2016,656.29,657.715,627.51,636.99,9314519,636.99\n560,AMZN,12/31/2015,686.08,687.75,675.89,675.89,3749560,675.89\n561,AMZN,12/30/2015,691.89,695.49,686.375,689.07,3519003,689.07\n562,AMZN,12/29/2015,677.98,696.44,677.8893,693.97,5734996,693.97\n563,AMZN,12/28/2015,665.56,675.5,665.5,675.2,3783555,675.2\n564,AMZN,12/24/2015,663.35,664.68,660.6,662.79,1092970,662.79\n565,AMZN,12/23/2015,666.5,666.597,656.63,663.7,2722922,663.7\n566,AMZN,12/22/2015,666.83,668.49,659.26,663.15,2667795,663.15\n567,AMZN,12/21/2015,668.5,669.9,658.93,664.51,3250900,664.51\n568,AMZN,12/18/2015,668.65,676.84,664.13,664.14,6841304,664.14\n569,AMZN,12/17/2015,680,682.5,670.65,670.65,3681645,670.65\n570,AMZN,12/16/2015,663.56,677.35,659.32,675.77,3964470,675.77\n571,AMZN,12/15/2015,665.03,671.5,657.35,658.64,4753415,658.64\n572,AMZN,12/14/2015,641.75,658.585,635.27,657.91,4361273,657.91\n573,AMZN,12/11/2015,651.23,657.88,639.62,640.15,5474420,640.15\n574,AMZN,12/10/2015,665.59,668.526,659.56,662.32,3455472,662.32\n575,AMZN,12/9/2015,678,679,655.68,664.79,5158172,664.79\n576,AMZN,12/8/2015,663.13,679.99,659.79,677.33,3651908,677.33\n577,AMZN,12/7/2015,674.74,675.46,660.5,669.83,3732814,669.83\n578,AMZN,12/4/2015,666,674.775,661.4,672.64,4534796,672.64\n579,AMZN,12/3/2015,679.44,682.79,661.48,666.25,5064736,666.25\n580,AMZN,12/2/2015,681,684.82,674.25,676.01,4273526,676.01\n581,AMZN,12/1/2015,673.75,681,667.86,679.06,4751152,679.06\n582,AMZN,11/30/2015,675.9,681.29,664.6,664.8,5693172,664.8\n583,AMZN,11/27/2015,680.8,680.99,672.1,673.26,1966801,673.26\n584,AMZN,11/25/2015,675,679.7,671.24,675.34,2697889,675.34\n585,AMZN,11/24/2015,674.14,675.8,661.2125,671.15,4543417,671.15\n586,AMZN,11/23/2015,671.5,682.77,668.45,678.99,4385057,678.99\n587,AMZN,11/20/2015,667.94,668.87,657.57,668.45,3896135,668.45\n588,AMZN,11/19/2015,664.99,672.86,659,661.27,4705237,661.27\n589,AMZN,11/18/2015,646.51,664.88,646.37,663.54,4469769,663.54\n590,AMZN,11/17/2015,650.65,653.25,641,643.3,4316843,643.3\n591,AMZN,11/16/2015,640.92,649.99,622.29,647.81,7435934,647.81\n592,AMZN,11/13/2015,663.57,667,640.45,642.35,6261076,642.35\n593,AMZN,11/12/2015,673,675.64,664.22,665.6,4284678,665.6\n594,AMZN,11/11/2015,663.25,675.96,663.25,673.25,5387309,673.25\n595,AMZN,11/10/2015,651.01,660,647.262,659.68,3489483,659.68\n596,AMZN,11/9/2015,658.65,661.955,647.8477,655.49,4048823,655.49\n597,AMZN,11/6/2015,655,662.26,652,659.37,4092165,659.37\n598,AMZN,11/5/2015,647.1,657,643.0901,655.65,4723825,655.65\n599,AMZN,11/4/2015,627.76,645.93,627.35,640.95,4840501,640.95\n600,AMZN,11/3/2015,629.53,629.89,622,625.31,3246910,625.31\n601,AMZN,11/2/2015,627.13,628.63,620.41,628.35,2816479,628.35\n602,AMZN,10/30/2015,626.01,630.72,625.28,625.9,3874363,625.9\n603,AMZN,10/29/2015,617.7,627.54,615.39,626.55,3896026,626.55\n604,AMZN,10/28/2015,612.3,617.23,609.5,617.1,3926200,617.1\n605,AMZN,10/27/2015,608.6,614.71,605.53,611.01,3787136,611.01\n606,AMZN,10/26/2015,602.3,609.85,596.29,608.61,4269715,608.61\n607,AMZN,10/23/2015,617.68,619.45,595.36,599.03,10692667,599.03\n608,AMZN,10/22/2015,562.7,569.146,556.67,563.91,7779372,563.91\n609,AMZN,10/21/2015,563.87,565.25,552.52,555.77,3361655,555.77\n610,AMZN,10/20/2015,572,573,555.28,560.88,4346209,560.88\n611,AMZN,10/19/2015,570.76,579,567.38,573.15,4375420,573.15\n612,AMZN,10/16/2015,565.27,570.94,560.31,570.76,4315792,570.76\n613,AMZN,10/15/2015,547.75,563,547,562.44,4937034,562.44\n614,AMZN,10/14/2015,551.34,552.25,539.68,544.83,3582060,544.83\n615,AMZN,10/13/2015,546.26,553.2,543.1,548.9,2938044,548.9\n616,AMZN,10/12/2015,539.96,550.82,539.8,550.19,2776103,550.19\n617,AMZN,10/9/2015,534.48,541.79,530.27,539.8,3537364,539.8\n618,AMZN,10/8/2015,536.71,539.386,519.89,533.16,4676440,533.16\n619,AMZN,10/7/2015,541.79,542,529,541.94,3812087,541.94\n620,AMZN,10/6/2015,545.5,551.5,533.33,537.48,4547519,537.48\n621,AMZN,10/5/2015,536.99,545.91,536,543.68,3391359,543.68\n622,AMZN,10/2/2015,512.99,532.6,508.1,532.54,4597795,532.54\n623,AMZN,10/1/2015,511,520.8,506,520.72,3768483,520.72\n624,AMZN,9/30/2015,505.44,512.8,501.6724,511.67,3902536,511.67\n625,AMZN,9/29/2015,506,511.48,490.5,496.07,4457532,496.07\n626,AMZN,9/28/2015,520.02,520.28,494.3337,504.06,5370668,504.06\n627,AMZN,9/25/2015,542.57,542.8,521.4,524.25,4030998,524.25\n628,AMZN,9/24/2015,530.55,534.56,522.87,533.75,3500964,533.75\n629,AMZN,9/23/2015,538.3,541.21,534,536.07,2237571,536.07\n630,AMZN,9/22/2015,539.71,543.55,532.66,538.4,3841748,538.4\n631,AMZN,9/21/2015,544.33,549.78,539.59,548.39,3283313,548.39\n632,AMZN,9/18/2015,534.62,546.237,531.35,540.26,6160075,540.26\n633,AMZN,9/17/2015,526.98,546.97,526.57,538.87,4169484,538.87\n634,AMZN,9/16/2015,521.98,528.3,518.52,527.39,2252790,527.39\n635,AMZN,9/15/2015,523.25,527.92,517.2,522.37,2865933,522.37\n636,AMZN,9/14/2015,529.44,532.45,518.58,521.38,3130241,521.38\n637,AMZN,9/11/2015,521.07,529.44,520.605,529.44,3227862,529.44\n638,AMZN,9/10/2015,515.15,526.13,514.78,522.24,2575982,522.24\n639,AMZN,9/9/2015,524,529.95,515.06,516.89,4370657,516.89\n640,AMZN,9/8/2015,508.69,518.35,508.5144,517.54,3810653,517.54\n641,AMZN,9/4/2015,497.65,502.85,495.64,499,2692510,499\n642,AMZN,9/3/2015,514.5,515.84,502.57,504.72,3149694,504.72\n643,AMZN,9/2/2015,505.09,510.86,497.72,510.55,3707116,510.55\n644,AMZN,9/1/2015,499.14,510,493.43,496.54,3864514,496.54\n645,AMZN,8/31/2015,516.44,519.41,509.07,512.89,3002293,512.89\n646,AMZN,8/28/2015,517.5,521.5,513.04,518.01,2746708,518.01\n647,AMZN,8/27/2015,514.03,522.69,507.261,518.37,6114506,518.37\n648,AMZN,8/26/2015,484.02,503.72,478.76,500.77,6358639,500.77\n649,AMZN,8/25/2015,487.49,489.44,466.25,466.37,5679329,466.37\n650,AMZN,8/24/2015,463.58,489.76,451,463.37,10097601,463.37\n651,AMZN,8/21/2015,507.36,512.33,494.47,494.47,6706466,494.47\n652,AMZN,8/20/2015,530.39,533.25,515.77,515.78,4407990,515.78\n653,AMZN,8/19/2015,533.74,537.25,529,532.92,2324040,532.92\n654,AMZN,8/18/2015,535.04,539.49,533,535.02,2071342,535.02\n655,AMZN,8/17/2015,531.29,538.74,527.12,535.22,2581680,535.22\n656,AMZN,8/14/2015,528.25,534.11,528.25,531.52,1994799,531.52\n657,AMZN,8/13/2015,527.37,534.66,525.4846,529.66,2895238,529.66\n658,AMZN,8/12/2015,523.75,527.5,513.06,525.91,4014684,525.91\n659,AMZN,8/11/2015,523.65,528.98,522,527.46,2676600,527.46\n660,AMZN,8/10/2015,528.52,532.2764,523,524,2615926,524\n661,AMZN,8/7/2015,529.16,529.4599,518.21,522.62,3969215,522.62\n662,AMZN,8/6/2015,539.3,542.74,527.52,529.46,3820453,529.46\n663,AMZN,8/5/2015,538.8,539.14,534.119,537.01,2866861,537.01\n664,AMZN,8/4/2015,529.69,536.95,529.163,531.9,2934590,531.9\n665,AMZN,8/3/2015,537.45,540.44,529.36,535.03,3014236,535.03\n666,AMZN,7/31/2015,539.09,542.84,534.5201,536.15,3025598,536.15\n667,AMZN,7/30/2015,527.65,539.2,524.29,536.76,3743065,536.76\n668,AMZN,7/29/2015,530.92,532.9655,525.02,529,3752634,529\n669,AMZN,7/28/2015,536,536.39,523.12,526.03,5273092,526.03\n670,AMZN,7/27/2015,527.75,544.95,526.6,531.41,7490960,531.41\n671,AMZN,7/24/2015,578.99,580.57,529.35,529.42,21909381,529.42\n672,AMZN,7/23/2015,491.66,491.66,475.7,482.18,9374431,482.18\n673,AMZN,7/22/2015,485.99,492.5,484.9,488.27,3114898,488.27\n674,AMZN,7/21/2015,487.9,488.88,482.55,488,3181831,488\n675,AMZN,7/20/2015,492.57,493.2,485.4,488.1,4752491,488.1\n676,AMZN,7/17/2015,477.7,485.42,477.25,483.01,4932176,483.01\n677,AMZN,7/16/2015,465.5,475.88,464.8,475.48,4095581,475.48\n678,AMZN,7/15/2015,463.04,464.7,460.2,461.19,2987399,461.19\n679,AMZN,7/14/2015,462.32,469.6,458.16,465.57,4736215,465.57\n680,AMZN,7/13/2015,448.29,457.87,447.54,455.57,3956802,455.57\n681,AMZN,7/10/2015,440.49,444.72,439,443.51,2400981,443.51\n682,AMZN,7/9/2015,434.9,438.72,434.15,434.39,2271395,434.39\n683,AMZN,7/8/2015,434.35,435.99,428.83,429.7,2383130,429.7\n684,AMZN,7/7/2015,435.68,437.73,425.57,436.72,3454248,436.72\n685,AMZN,7/6/2015,435.23,439.73,433.52,436.04,1903161,436.04\n686,AMZN,7/2/2015,437,438.2,433.48,437.71,1343397,437.71\n687,AMZN,7/1/2015,439.35,440,435.58,437.39,1987076,437.39\n688,AMZN,6/30/2015,434.2,435.57,430.46,434.09,2596873,434.09\n689,AMZN,6/29/2015,434.98,437,429,429.86,2753193,429.86\n690,AMZN,6/26/2015,441.76,443.49,435.06,438.1,2624479,438.1\n691,AMZN,6/25/2015,438.07,443.47,436.39,440.1,2237458,440.1\n692,AMZN,6/24/2015,444.97,446.47,440.23,440.84,2620827,440.84\n693,AMZN,6/23/2015,435.59,447.04,433.69,445.99,3245049,445.99\n694,AMZN,6/22/2015,437,439.24,434.18,436.29,1823572,436.29\n695,AMZN,6/19/2015,440.26,444.99,433.24,434.92,4495087,434.92\n696,AMZN,6/18/2015,430.3,439.73,429.405,439.39,3378360,439.39\n697,AMZN,6/17/2015,428.36,431.35,424.753,427.81,2185869,427.81\n698,AMZN,6/16/2015,424.15,427.97,422.67,427.26,2297469,427.26\n699,AMZN,6/15/2015,427.66,428.05,422.64,423.67,2050987,423.67\n700,AMZN,6/12/2015,431.25,432.36,428.26,429.92,2054385,429.92\n701,AMZN,6/11/2015,432.29,438.89,431.47,432.97,2922459,432.97\n702,AMZN,6/10/2015,426.46,432.2,425.66,430.77,2172333,430.77\n703,AMZN,6/9/2015,422.96,427.49,419.14,425.48,2288663,425.48\n704,AMZN,6/8/2015,425.62,426.8,421.425,423.5,2172525,423.5\n705,AMZN,6/5/2015,429.66,430.8,426.5,426.95,1907855,426.95\n706,AMZN,6/4/2015,434.4,436.755,429.26,430.78,2510761,430.78\n707,AMZN,6/3/2015,434.4,438.39,432.75,436.59,2727914,436.59\n708,AMZN,6/2/2015,430.07,433.23,426.25,430.99,1669845,430.99\n709,AMZN,6/1/2015,430.4,433.16,426.2,430.92,2253264,430.92\n710,AMZN,5/29/2015,427.23,432.5,427.23,429.23,3016060,429.23\n711,AMZN,5/28/2015,429.71,431.35,425.47,426.57,1912436,426.57\n712,AMZN,5/27/2015,427.45,431.85,425.01,431.42,2231088,431.42\n713,AMZN,5/26/2015,426.2,427,422,425.47,2244185,425.47\n714,AMZN,5/22/2015,431.55,432.44,427.61,427.63,2020629,427.63\n715,AMZN,5/21/2015,428,436.9,428,431.63,4121401,431.63\n716,AMZN,5/20/2015,420.6,427.1,418.36,423.86,2196159,423.86\n717,AMZN,5/19/2015,424.87,428.24,420.63,421.71,2465240,421.71\n718,AMZN,5/18/2015,426,427.27,421.46,425.24,2390229,425.24\n719,AMZN,5/15/2015,428,430.3962,424.3,426,4240306,426\n720,AMZN,5/14/2015,429.45,433,427.01,432.28,1888477,432.28\n721,AMZN,5/13/2015,429.98,433.528,425.8,426.87,1996328,426.87\n722,AMZN,5/12/2015,431.08,433.25,426.71,431.02,1947822,431.02\n723,AMZN,5/11/2015,432.51,439,431.37,432.85,2393737,432.85\n724,AMZN,5/8/2015,430.75,435.2,430.174,433.69,2908838,433.69\n725,AMZN,5/7/2015,424.15,428.5,422.85,426.88,2766132,426.88\n726,AMZN,5/6/2015,421.43,422.7165,414.55,419.1,2552474,419.1\n727,AMZN,5/5/2015,422.85,427.51,421.02,421.19,2856386,421.19\n728,AMZN,5/4/2015,424.8,429.77,422.42,423.04,2270448,423.04\n729,AMZN,5/1/2015,423.82,425.64,416,422.87,3565824,422.87\n730,AMZN,4/30/2015,427.11,431.75,419.24,421.78,3647877,421.78\n731,AMZN,4/29/2015,426.75,434.24,426.03,429.37,3621688,429.37\n732,AMZN,4/28/2015,438.51,439,428.04,429.31,4140483,429.31\n733,AMZN,4/27/2015,443.86,446.99,437.41,438.56,5430949,438.56\n734,AMZN,4/24/2015,439,452.65,439,445.1,17176904,445.1\n735,AMZN,4/23/2015,390.21,391.88,386.15,389.99,7979985,389.99\n736,AMZN,4/22/2015,391.91,394.28,388,389.8,3474724,389.8\n737,AMZN,4/21/2015,391.31,394.6,386.8,391.18,4643524,391.18\n738,AMZN,4/20/2015,378.55,391.94,377,389.51,5016148,389.51\n739,AMZN,4/17/2015,382.63,383.56,374.4,375.56,3839664,375.56\n740,AMZN,4/16/2015,383.69,387.45,383.55,386.04,2080418,386.04\n741,AMZN,4/15/2015,384.65,385.78,381.64,383.45,1933229,383.45\n742,AMZN,4/14/2015,383.51,387.81,381.2101,385.11,2583575,385.11\n743,AMZN,4/13/2015,383.53,385.28,380.14,382.36,1894453,382.36\n744,AMZN,4/10/2015,384.31,387.12,381.3151,382.65,2573519,382.65\n745,AMZN,4/9/2015,380.66,384.42,378.795,383.54,2392328,383.54\n746,AMZN,4/8/2015,374.66,381.58,374.65,381.2,2636434,381.2\n747,AMZN,4/7/2015,376.15,379.31,374.03,374.41,1954902,374.41\n748,AMZN,4/6/2015,370.1,380.2,369.36,377.04,3050709,377.04\n749,AMZN,4/2/2015,370.5,373.28,369,372.25,1875279,372.25\n750,AMZN,4/1/2015,372.1,373.16,368.34,370.255,2458095,370.255\n751,AMZN,3/31/2015,373.24,377.7,371.51,372.1,2506122,372.1\n752,AMZN,3/30/2015,371.87,376.12,371.55,374.59,1820933,374.59\n753,AMZN,3/27/2015,367.11,373.17,366.5734,370.56,2609774,370.56\n754,AMZN,3/26/2015,369.59,371.4,365.65,367.35,2929962,367.35\n755,AMZN,3/25/2015,375.17,380.5,370.285,370.96,3429497,370.96\n756,AMZN,3/24/2015,373.99,375.24,372.27,374.09,2228214,374.09\n757,AMZN,3/23/2015,378.07,381.77,374.94,375.11,2239343,375.11\n758,AMZN,3/20/2015,376.29,379.37,375.92,378.49,3763553,378.49\n759,AMZN,3/19/2015,373.87,377.11,372.19,373.24,1915671,373.24\n760,AMZN,3/18/2015,369.97,375.99,366.7,375.135,2654135,375.135\n761,AMZN,3/17/2015,371.11,374.5,369.64,371.92,2036961,371.92\n762,AMZN,3/16/2015,370.38,373.94,366.72,373.35,2354059,373.35\n763,AMZN,3/13/2015,371.52,373.99,366.68,370.58,2611658,370.58\n764,AMZN,3/12/2015,368.82,375.5,367.52,374.24,2810001,374.24\n765,AMZN,3/11/2015,370.61,373.35,366.26,366.37,2495097,366.37\n766,AMZN,3/10/2015,377.45,377.77,369.18,369.51,3120972,369.51\n767,AMZN,3/9/2015,378.4,379.33,375.28,378.56,2311390,378.56\n768,AMZN,3/6/2015,385.52,387,378.88,380.09,2627042,380.09\n769,AMZN,3/5/2015,385.61,388.4182,383.89,387.83,2693518,387.83\n770,AMZN,3/4/2015,385.71,387.9,382.19,382.72,2259141,382.72\n771,AMZN,3/3/2015,383.95,386.1,381.601,384.61,1946498,384.61\n772,AMZN,3/2/2015,380.85,385.9,379.481,385.655,2139205,385.655\n773,AMZN,2/27/2015,384,385.99,379.79,380.16,2532309,380.16\n774,AMZN,2/26/2015,384.07,389.37,383.28,384.8,2687107,384.8\n775,AMZN,2/25/2015,377.27,387.85,376.54,385.37,3174495,385.37\n776,AMZN,2/24/2015,378.65,380.48,376.16,378.59,1921850,378.59\n777,AMZN,2/23/2015,383.44,384.54,378,380.14,2176989,380.14\n778,AMZN,2/20/2015,378.62,383.7,375.84,383.66,3258023,383.66\n779,AMZN,2/19/2015,373.49,381.88,373.43,378.995,2953752,378.995\n780,AMZN,2/18/2015,373.78,376.74,372.85,373.37,2650610,373.37\n781,AMZN,2/17/2015,377.72,379.985,372.67,375.43,3673208,375.43\n782,AMZN,2/13/2015,378.41,383,377.01,381.83,3475069,381.83\n783,AMZN,2/12/2015,375.1,378.51,373.15,377.17,2791050,377.17\n784,AMZN,2/11/2015,371.23,377.1,371.1,375.14,2786523,375.14\n785,AMZN,2/10/2015,371.19,374.3,368.51,372.995,2287232,372.995\n786,AMZN,2/9/2015,371,374.41,367.2,370.56,2724630,370.56\n787,AMZN,2/6/2015,374.87,375.9899,371.01,374.28,3892382,374.28\n788,AMZN,2/5/2015,366,378.8,365.9,373.89,7247605,373.89\n789,AMZN,2/4/2015,358.38,367.5,358.23,364.75,4169927,364.75\n790,AMZN,2/3/2015,360.29,367.817,360.21,363.55,6212565,363.55\n791,AMZN,2/2/2015,350.05,365,350.01,364.47,10231914,364.47\n792,AMZN,1/30/2015,346.32,359.5,340.74,354.53,23856060,354.53\n793,AMZN,1/29/2015,304.73,312.8,299.33,311.78,8656567,311.78\n794,AMZN,1/28/2015,309.81,311.51,303.8,303.91,3063774,303.91\n795,AMZN,1/27/2015,306.3,310.243,302.625,306.75,2920315,306.75\n796,AMZN,1/26/2015,311.82,313,307.5201,309.66,3169665,309.66\n797,AMZN,1/23/2015,308.08,316.93,307.72,312.39,4496419,312.39\n798,AMZN,1/22/2015,300,312.25,300,310.32,5362640,310.32\n799,AMZN,1/21/2015,289.64,306,287.26,297.25,10065076,297.25\n800,AMZN,1/20/2015,292.59,293.3599,286.39,289.44,3075081,289.44\n801,AMZN,1/16/2015,286.28,290.79,285.25,290.74,3478176,290.74\n802,AMZN,1/15/2015,294,295.9995,286.815,286.95,4419196,286.95\n803,AMZN,1/14/2015,291.93,295.91,286.503,293.27,5538666,293.27\n804,AMZN,1/13/2015,297.48,301.4976,293.23,294.74,4136442,294.74\n805,AMZN,1/12/2015,297.56,298.51,289.281,291.41,3421392,291.41\n806,AMZN,1/9/2015,301.48,302.87,296.68,296.93,2570947,296.93\n807,AMZN,1/8/2015,300.32,303.14,296.11,300.46,3088398,300.46\n808,AMZN,1/7/2015,297.5,301.28,295.33,298.42,2640349,298.42\n809,AMZN,1/6/2015,302.24,303,292.38,295.29,3519034,295.29\n810,AMZN,1/5/2015,307.01,308.38,300.85,302.19,2774231,302.19\n811,AMZN,1/2/2015,312.58,314.75,306.9601,308.52,2788101,308.52\n812,AMZN,12/31/2014,311.55,312.98,310.01,310.35,2057766,310.35\n813,AMZN,12/30/2014,309.91,313.94,309.34,310.3,2093023,310.3\n814,AMZN,12/29/2014,307.85,314.27,306.58,312.04,3009046,312.04\n815,AMZN,12/26/2014,305,310.7799,303.81,309.09,2893801,309.09\n816,AMZN,12/24/2014,306.38,307,302.875,303.03,1518107,303.03\n817,AMZN,12/23/2014,306.98,307.49,303.252,306.285,2718359,306.285\n818,AMZN,12/22/2014,301.94,307.36,301.94,306.54,4003827,306.54\n819,AMZN,12/19/2014,296.91,301.54,295.52,299.9,8709129,299.9\n820,AMZN,12/18/2014,304.01,304.5,293.25,297.73,7738067,297.73\n821,AMZN,12/17/2014,296.37,299.67,293.03,298.88,4433505,298.88\n822,AMZN,12/16/2014,304.35,304.49,295.01,295.06,6501252,295.06\n823,AMZN,12/15/2014,308.87,310.86,302.15,306.07,3841577,306.07\n824,AMZN,12/12/2014,303.99,310.6399,303.01,307.32,3162322,307.32\n825,AMZN,12/11/2014,307.89,312.64,306.01,307.36,3272919,307.36\n826,AMZN,12/10/2014,312,313.19,304.68,305.84,3245890,305.84\n827,AMZN,12/9/2014,302.99,313.639,301.14,312.5,4049506,312.5\n828,AMZN,12/8/2014,311.57,316.56,304.821,306.64,3639180,306.64\n829,AMZN,12/5/2014,316.8,316.93,310.84,312.63,3265214,312.63\n830,AMZN,12/4/2014,315.53,318.59,313.47,316.93,3296642,316.93\n831,AMZN,12/3/2014,325.73,326.77,314.36,316.5,5689904,316.5\n832,AMZN,12/2/2014,327.5,327.93,323.25,326.31,2790257,326.31\n833,AMZN,12/1/2014,338.12,340.64,325.93,326,4944861,326\n834,AMZN,11/28/2014,336.03,341.26,336.03,338.64,3051798,338.64\n835,AMZN,11/26/2014,333.78,334.65,331.75,333.57,1985949,333.57\n836,AMZN,11/25/2014,335.27,336.3325,331.28,335.04,2564989,335.04\n837,AMZN,11/24/2014,334.78,337.39,333.6,335.64,2754186,335.64\n838,AMZN,11/21/2014,335.42,338.33,331.47,332.63,4466587,332.63\n839,AMZN,11/20/2014,324,332.67,323.33,330.54,3436721,330.54\n840,AMZN,11/19/2014,327.25,328.4,324.02,326.54,3281614,326.54\n841,AMZN,11/18/2014,323.99,329.56,323.25,324.93,3551161,324.93\n842,AMZN,11/17/2014,326.44,328,318.03,323.05,4784933,323.05\n843,AMZN,11/14/2014,317.12,332.88,316.401,327.82,8877785,327.82\n844,AMZN,11/13/2014,312,317.89,311.51,316.48,3686428,316.48\n845,AMZN,11/12/2014,310.75,312.58,308.79,311.51,2182982,311.51\n846,AMZN,11/11/2014,305.94,312.38,303.646,312.01,3807333,312.01\n847,AMZN,11/10/2014,300,305.799,300,305.11,2809056,305.11\n848,AMZN,11/7/2014,297.82,299.99,296.29,299.86,2647352,299.86\n849,AMZN,11/6/2014,296.69,297,292.29,296.64,3758121,296.64\n850,AMZN,11/5/2014,303.01,304,294.16,296.52,4674492,296.52\n851,AMZN,11/4/2014,303.99,304.25,300.17,302.81,3427384,302.81\n852,AMZN,11/3/2014,306.24,308.01,303.24,305.72,3244150,305.72\n853,AMZN,10/31/2014,305.15,305.72,301.5,305.46,4551795,305.46\n854,AMZN,10/30/2014,293.98,299.74,292.36,299.07,4055155,299.07\n855,AMZN,10/29/2014,299.11,299.61,293.0701,294.12,4883259,294.12\n856,AMZN,10/28/2014,289.76,298,289.76,295.59,5576646,295.59\n857,AMZN,10/27/2014,285.7,290.42,285.02,289.97,5950594,289.97\n858,AMZN,10/24/2014,284.4,293.81,284,287.06,19805911,287.06\n859,AMZN,10/23/2014,313.4,316.8,311.4,313.18,9038193,313.18\n860,AMZN,10/22/2014,315.43,318.98,312.64,312.97,3130049,312.97\n861,AMZN,10/21/2014,309.9,315.64,307.07,315.33,3563351,315.33\n862,AMZN,10/20/2014,302.95,306.53,302.02,306.21,3239490,306.21\n863,AMZN,10/17/2014,307.15,309.2,302.72,303.64,4409218,303.64\n864,AMZN,10/16/2014,293.83,306.82,293.83,302.86,4731866,302.86\n865,AMZN,10/15/2014,304.35,307.9,299.102,305.97,5348254,305.97\n866,AMZN,10/14/2014,308,312.24,305.75,308.31,3385809,308.31\n867,AMZN,10/13/2014,309.87,313.2,303.47,306.45,4369850,306.45\n868,AMZN,10/10/2014,314.02,317.77,311.38,311.39,3684314,311.39\n869,AMZN,10/9/2014,321.49,322.271,314.52,315.37,3589464,315.37\n870,AMZN,10/8/2014,316.58,324.11,314.14,322.7,3458960,322.7\n871,AMZN,10/7/2014,319.43,322,316.67,316.98,2365698,316.98\n872,AMZN,10/6/2014,323.5,324.13,319.6,322.2,2294194,322.2\n873,AMZN,10/3/2014,320.36,325.16,319.53,322.74,3037891,322.74\n874,AMZN,10/2/2014,316.92,318.53,311.31,318.41,3553944,318.41\n875,AMZN,10/1/2014,322.04,322.165,315.55,317.46,3096735,317.46\n876,AMZN,9/30/2014,321.36,323.43,318.51,322.44,2639967,322.44\n877,AMZN,9/29/2014,320.5,323.75,319,321.82,1929589,321.82\n878,AMZN,9/26/2014,320.6,323.5,317.64,323.21,3639155,323.21\n879,AMZN,9/25/2014,327.99,328.54,321.4,321.93,2925241,321.93\n880,AMZN,9/24/2014,324.17,329.44,319.56,328.21,2635754,328.21\n881,AMZN,9/23/2014,322.46,327.6,321.25,323.63,2352600,323.63\n882,AMZN,9/22/2014,328.49,329.49,321.06,324.5,3109700,324.5\n883,AMZN,9/19/2014,327.6,332.7559,325.57,331.32,6886200,331.32\n884,AMZN,9/18/2014,325.44,327.1,323.7105,325,2576900,325\n885,AMZN,9/17/2014,327.76,328,321.52,324,4136000,324\n886,AMZN,9/16/2014,321.07,329.48,320.1,327.76,3259900,327.76\n887,AMZN,9/15/2014,330.91,331.33,319,323.89,4000400,323.89\n888,AMZN,9/12/2014,329.56,332.89,328.79,331.19,3429300,331.19\n889,AMZN,9/11/2014,329.94,333.01,326.39,330.52,2720200,330.52\n890,AMZN,9/10/2014,334.3,334.98,328.82,331.33,3797400,331.33\n891,AMZN,9/9/2014,341.61,341.76,329.18,329.75,4634000,329.75\n892,AMZN,9/8/2014,344.54,345.81,339.04,342.34,2955300,342.34\n893,AMZN,9/5/2014,346.3,346.827,342.5,346.38,2107000,346.38\n894,AMZN,9/4/2014,343.69,349.38,343.58,345.95,3952200,345.95\n895,AMZN,9/3/2014,342.54,343.27,337.55,339,1993700,339\n896,AMZN,9/2/2014,339.98,342.5,337.1587,342.38,2326000,342.38\n897,AMZN,8/29/2014,341.76,341.8199,337.68,339.04,1939500,339.04\n898,AMZN,8/28/2014,340,341.79,338.8,340.02,2252700,340.02\n899,AMZN,8/27/2014,342.09,346.67,341.34,343.18,2961600,343.18\n900,AMZN,8/26/2014,337,344.36,334.55,341.83,3638200,341.83\n901,AMZN,8/25/2014,333.21,336.77,332.71,334.02,1957700,334.02\n902,AMZN,8/22/2014,332.99,334.08,330.8,331.59,2211200,331.59\n903,AMZN,8/21/2014,336.48,336.582,332.23,332.91,1971100,332.91\n904,AMZN,8/20/2014,334.68,337.16,334.022,335.78,1810500,335.78\n905,AMZN,8/19/2014,334.87,335.81,333.01,335.13,1713800,335.13\n906,AMZN,8/18/2014,335.48,337.8,333.77,334.53,2485400,334.53\n907,AMZN,8/15/2014,334,335,328.32,333.63,3896700,333.63\n908,AMZN,8/14/2014,327.8,334.09,326.71,333.21,3420400,333.21\n909,AMZN,8/13/2014,327.6,331.72,326.14,326.28,4939100,326.28\n910,AMZN,8/12/2014,318.89,321.31,316.95,319.32,1915800,319.32\n911,AMZN,8/11/2014,318.48,320.38,316.88,318.33,2468600,318.33\n912,AMZN,8/8/2014,311.94,317.32,310.66,316.8,2705900,316.8\n913,AMZN,8/7/2014,315.21,315.8774,309.655,311.45,2935600,311.45\n914,AMZN,8/6/2014,310.83,315.78,310.2,313.89,2296900,313.89\n915,AMZN,8/5/2014,313.3,314.55,310.06,312.32,2852100,312.32\n916,AMZN,8/4/2014,308.84,316.18,308.5,313.65,4200900,313.65\n917,AMZN,8/1/2014,313.69,315.83,304.588,307.06,7441500,307.06\n918,AMZN,7/31/2014,320.01,320.6836,311.86,312.99,5192000,312.99\n919,AMZN,7/30/2014,321.45,322.73,318.5,322.51,3969000,322.51\n920,AMZN,7/29/2014,321.98,322.8999,319.5,320,2883800,320\n921,AMZN,7/28/2014,324.25,324.82,316.5,320.41,5932000,320.41\n922,AMZN,7/25/2014,317.3,324.87,314.76,324.01,17846500,324.01\n923,AMZN,7/24/2014,359.98,364.85,358.52,358.61,7000000,358.61\n924,AMZN,7/23/2014,359.05,360.63,356.62,358.14,2687300,358.14\n925,AMZN,7/22/2014,355.25,362.93,355.25,360.84,2888900,360.84\n926,AMZN,7/21/2014,358.1,361.71,356.72,359.76,2278400,359.76\n927,AMZN,7/18/2014,354.4,359.68,352.08,358.66,3407400,358.66\n928,AMZN,7/17/2014,353.44,356.96,351.38,352.454,3636000,352.454\n929,AMZN,7/16/2014,355.62,359.32,353,355.9,3503600,355.9\n930,AMZN,7/15/2014,353.72,355.59,349.4,354.44,4170900,354.44\n931,AMZN,7/14/2014,347.03,355.77,345.356,355.32,5609900,355.32\n932,AMZN,7/11/2014,334.71,347,334.71,346.2,8300800,346.2\n933,AMZN,7/10/2014,324.34,329.98,322.65,327.92,2665000,327.92\n934,AMZN,7/9/2014,324.71,330.2,323.15,329.97,3166100,329.97\n935,AMZN,7/8/2014,333.1,333.7397,321.4,323.81,4271600,323.81\n936,AMZN,7/7/2014,337.5,337.55,332.52,333.55,2128900,333.55\n937,AMZN,7/3/2014,334.83,338.3,333.08,337.492,1944300,337.492\n938,AMZN,7/2/2014,333.2,336.76,331.66,332.85,2681300,332.85\n939,AMZN,7/1/2014,325.86,333.2,325.1,332.39,3173600,332.39\n940,AMZN,6/30/2014,324.98,326.98,322.24,324.78,2671300,324.78\n941,AMZN,6/27/2014,325.88,326.52,323.27,324.57,2416200,324.57\n942,AMZN,6/26/2014,328.49,328.65,322.13,325.69,2699500,325.69\n943,AMZN,6/25/2014,324.33,328.15,321.74,327.44,2327800,327.44\n944,AMZN,6/24/2014,327.54,329.73,322.738,324.16,2626600,324.16\n945,AMZN,6/23/2014,323.33,327.55,321.41,327.24,2604800,327.24\n946,AMZN,6/20/2014,327.76,328.22,320.42,324.2,6054000,324.2\n947,AMZN,6/19/2014,335.255,338.9,325.98,327,5320600,327\n948,AMZN,6/18/2014,328,335.75,325,334.38,6401500,334.38\n949,AMZN,6/17/2014,327.54,331.34,325.23,325.62,2904200,325.62\n950,AMZN,6/16/2014,324.86,328.6945,323.52,327.62,2396100,327.62\n951,AMZN,6/13/2014,327.05,329.298,323.5262,326.27,2764800,326.27\n952,AMZN,6/12/2014,335.55,335.55,324.66,325.91,4263000,325.91\n953,AMZN,6/11/2014,336,340.7199,333.8772,335.2,4436800,335.2\n954,AMZN,6/10/2014,327.65,335.5,327.5,332.41,3663400,332.41\n955,AMZN,6/9/2014,331.57,333,325.65,327.5,3212200,327.5\n956,AMZN,6/6/2014,325,330.88,324.93,329.67,5244000,329.67\n957,AMZN,6/5/2014,308.1,327.94,306.9,323.57,7796700,323.57\n958,AMZN,6/4/2014,306.85,309.5,303.84,306.78,2107100,306.78\n959,AMZN,6/3/2014,305.75,307.92,305.07,307.19,2379200,307.19\n960,AMZN,6/2/2014,312.59,312.6,307,308.84,2203400,308.84\n961,AMZN,5/30/2014,314.43,314.65,307.57,312.55,4260200,312.55\n962,AMZN,5/29/2014,310.42,314.87,310.2,313.78,2365500,313.78\n963,AMZN,5/28/2014,309.5,313.82,307.42,310.16,2726000,310.16\n964,AMZN,5/27/2014,314.41,314.6296,307.38,310.82,4862100,310.82\n965,AMZN,5/23/2014,305.46,312.35,304.9,312.24,3052900,312.24\n966,AMZN,5/22/2014,305.05,308.54,303.01,304.91,2576800,304.91\n967,AMZN,5/21/2014,302.21,305.96,301.5201,305.01,3408800,305.01\n968,AMZN,5/20/2014,297.1,304.46,296.75,301.19,4095700,301.19\n969,AMZN,5/19/2014,295.76,299,293.81,296.755,2284200,296.755\n970,AMZN,5/16/2014,292.8,298.88,291.55,297.7,3636800,297.7\n971,AMZN,5/15/2014,298.02,299.2,290.38,295.19,4295100,295.19\n972,AMZN,5/14/2014,302.5,304.64,296.66,297.62,3323300,297.62\n973,AMZN,5/13/2014,302.6,305.6,300.75,304.64,3509900,304.64\n974,AMZN,5/12/2014,294.3,303.34,294.16,302.86,3729600,302.86\n975,AMZN,5/9/2014,290.57,293.68,284.38,292.24,4063000,292.24\n976,AMZN,5/8/2014,290.82,295.8784,287.23,288.32,3848200,288.32\n977,AMZN,5/7/2014,295.56,296.4,286.68,292.71,7015200,292.71\n978,AMZN,5/6/2014,309.53,309.81,297.04,297.38,4682300,297.38\n979,AMZN,5/5/2014,306.37,310.23,305,310.05,2519900,310.05\n980,AMZN,5/2/2014,310.42,313.29,304.31,308.01,3995100,308.01\n981,AMZN,5/1/2014,304.13,310.48,304,307.89,4328600,307.89\n982,AMZN,4/30/2014,298.1,304.56,298.1,304.13,4088600,304.13\n983,AMZN,4/29/2014,296.44,301.84,290.45,300.38,6509300,300.38\n984,AMZN,4/28/2014,304,304.39,288,296.58,14479800,296.58\n985,AMZN,4/25/2014,316.25,316.49,302.71,303.83,16180200,303.83\n986,AMZN,4/24/2014,329.67,337.4,322.95,337.15,9293700,337.15\n987,AMZN,4/23/2014,333.06,333.13,323.39,324.58,3604600,324.58\n988,AMZN,4/22/2014,332,337.5,328.94,329.32,3711600,329.32\n989,AMZN,4/21/2014,323.97,331.1499,322.31,330.87,2999400,330.87\n990,AMZN,4/17/2014,319.76,328.66,319.76,324.91,4299200,324.91\n991,AMZN,4/16/2014,321.17,324,314.71,323.68,4284900,323.68\n992,AMZN,4/15/2014,316.7,318.28,305.5,316.08,5398600,316.08\n993,AMZN,4/14/2014,317.67,320.48,311.28,315.91,4293500,315.91\n994,AMZN,4/11/2014,314,316.5,309.5,311.73,7287500,311.73\n995,AMZN,4/10/2014,330.6,331,316.5,317.11,6126700,317.11\n996,AMZN,4/9/2014,328.47,332.18,322.5,331.805,5056600,331.805\n997,AMZN,4/8/2014,321.88,328,318.44,327.07,6577600,327.07\n998,AMZN,4/7/2014,320.99,324.94,313.13,317.76,7077400,317.76\n999,AMZN,4/4/2014,335.15,335.44,315.61,323,12534600,323\n1000,AMZN,4/3/2014,341.82,342.5,328.46,333.62,6399300,333.62\n1001,AMZN,4/2/2014,345.99,348.295,340.38,341.96,4475500,341.96\n1002,AMZN,4/1/2014,338.09,344.43,338,342.99,3600100,342.99\n1003,AMZN,3/31/2014,342.4,346.29,334.06,336.365,4297500,336.365\n1004,AMZN,3/28/2014,340.05,347,336.08,338.29,3986800,338.29\n1005,AMZN,3/27/2014,343.15,343.9999,330.88,338.47,5766400,338.47\n1006,AMZN,3/26/2014,357.13,357.6,343.4,343.41,4120700,343.41\n1007,AMZN,3/25/2014,354.03,358.97,348.84,354.71,4445700,354.71\n1008,AMZN,3/24/2014,360.09,361.5,348.6,351.85,4873500,351.85\n1009,AMZN,3/21/2014,371,372.84,358.4,360.62,5414100,360.62\n1010,AMZN,3/20/2014,370.64,373,366.22,368.97,2558500,368.97\n1011,AMZN,3/19/2014,378.77,379,369.42,373.23,2646700,373.23\n1012,AMZN,3/18/2014,377.32,379,375,378.77,2483500,378.77\n1013,AMZN,3/17/2014,375.72,378.85,374.88,375.04,2303000,375.04\n1014,AMZN,3/14/2014,372.8,378.568,371.55,373.74,4402200,373.74\n1015,AMZN,3/13/2014,376.62,383.11,368.08,371.51,6829000,371.51\n1016,AMZN,3/12/2014,366.4,371.16,363.61,370.64,2216600,370.64\n1017,AMZN,3/11/2014,370.99,372.8,367.28,368.82,2246100,368.82\n1018,AMZN,3/10/2014,372.69,372.73,367,370.53,2105800,370.53\n1019,AMZN,3/7/2014,374.58,374.99,369.531,372.06,2279800,372.06\n1020,AMZN,3/6/2014,374.05,375.33,368.9,372.16,2926600,372.16\n1021,AMZN,3/5/2014,364.13,372.728,363.9,372.37,3848300,372.37\n1022,AMZN,3/4/2014,363.9,365.68,362.46,363.9,2704400,363.9\n1023,AMZN,3/3/2014,358.735,360.96,354.48,359.78,2798300,359.78\n1024,AMZN,2/28/2014,360.6,365.865,357.084,362.1,3882000,362.1\n1025,AMZN,2/27/2014,357.22,360.59,355.5,360.13,3104900,360.13\n1026,AMZN,2/26/2014,359.86,364.75,357.17,359.8,3622100,359.8\n1027,AMZN,2/25/2014,353,361.08,351.58,358.32,3736400,358.32\n1028,AMZN,2/24/2014,345.19,353,343.29,351.78,3644700,351.78\n1029,AMZN,2/21/2014,352.44,354.141,346.75,346.76,4210000,346.76\n1030,AMZN,2/20/2014,348.8,350.46,344.38,349.8,3492800,349.8\n1031,AMZN,2/19/2014,352.64,354.54,346.1,347.38,4168100,347.38\n1032,AMZN,2/18/2014,355.28,355.73,349.45,353.65,4998000,353.65\n1033,AMZN,2/14/2014,359.34,359.34,353.35,357.35,3520200,357.35\n1034,AMZN,2/13/2014,347.7,357.2,346.5,357.2,4175000,357.2\n1035,AMZN,2/12/2014,356.43,357.75,346.32,349.25,6587700,349.25\n1036,AMZN,2/11/2014,361.842,363.61,356.25,361.79,3222100,361.79\n1037,AMZN,2/10/2014,361.61,365,359.35,360.87,3449700,360.87\n1038,AMZN,2/7/2014,358.98,361.8,352.49,361.08,4330500,361.08\n1039,AMZN,2/6/2014,347.403,354.82,347.403,354.59,3335700,354.59\n1040,AMZN,2/5/2014,346,349.37,337.73,346.45,4435400,346.45\n1041,AMZN,2/4/2014,349.59,353.9975,344.02,347.95,4812900,347.95\n1042,AMZN,2/3/2014,358.98,360.85,340.1,346.15,10280800,346.15\n1043,AMZN,1/31/2014,371.76,375.45,357.76,358.69,16154800,358.69\n1044,AMZN,1/30/2014,393.77,406.25,387.7,403.01,10473900,403.01\n1045,AMZN,1/29/2014,392.16,392.85,383.24,384.2,3382300,384.2\n1046,AMZN,1/28/2014,387.4,394.74,387.12,394.43,2894500,394.43\n1047,AMZN,1/27/2014,390.5,394.1,380.49,386.28,3936800,386.28\n1048,AMZN,1/24/2014,398.16,400.2,387.27,387.6,4458400,387.6\n1049,AMZN,1/23/2014,401,406.17,397.79,399.87,3025400,399.87\n1050,AMZN,1/22/2014,408,408.06,402,404.54,2060500,404.54\n1051,AMZN,1/21/2014,403,407.8,401.6,407.05,3122100,407.05\n1052,AMZN,1/17/2014,394.26,403.49,393.66,399.61,4505100,399.61\n1053,AMZN,1/16/2014,393.68,399.29,389.41,395.8,2601200,395.8\n1054,AMZN,1/15/2014,398.94,399.31,392.534,395.87,2678300,395.87\n1055,AMZN,1/14/2014,392.13,398.63,391.29,397.54,2340100,397.54\n1056,AMZN,1/13/2014,397.98,399.78,388.45,390.98,2844900,390.98\n1057,AMZN,1/10/2014,402.53,403.764,393.8,397.66,2679500,397.66\n1058,AMZN,1/9/2014,403.71,406.89,398.44,401.01,2103000,401.01\n1059,AMZN,1/8/2014,398.47,403,396.04,401.92,2316500,401.92\n1060,AMZN,1/7/2014,395.04,398.47,394.29,398.03,1916000,398.03\n1061,AMZN,1/6/2014,395.85,397,388.42,393.63,3170600,393.63\n1062,AMZN,1/3/2014,398.29,402.71,396.22,396.44,2210200,396.44\n1063,AMZN,1/2/2014,398.8,399.36,394.02,397.97,2137800,397.97\n1064,AMZN,12/31/2013,394.58,398.83,393.8,398.79,1996500,398.79\n1065,AMZN,12/30/2013,399.41,399.92,392.45,393.37,2487100,393.37\n1066,AMZN,12/27/2013,404.65,405.63,396.25,398.08,1986900,398.08\n1067,AMZN,12/26/2013,401.79,404.52,396.81,404.39,1868500,404.39\n1068,AMZN,12/24/2013,402.52,403.7249,396.37,399.2,1380400,399.2\n1069,AMZN,12/23/2013,403.69,405,399.2,402.92,2659500,402.92\n1070,AMZN,12/20/2013,396.55,404.72,395.78,402.2,5033900,402.2\n1071,AMZN,12/19/2013,394.27,397.29,392.6,395.19,2427200,395.19\n1072,AMZN,12/18/2013,389.23,396.3,383.1,395.96,3489100,395.96\n1073,AMZN,12/17/2013,390.65,391.36,386.5,387.65,2343900,387.65\n1074,AMZN,12/16/2013,385.03,391.7,385,388.97,2251700,388.97\n1075,AMZN,12/13/2013,385.32,389.42,383.8,384.24,3025000,384.24\n1076,AMZN,12/12/2013,381.26,385,379.5,381.25,2123700,381.25\n1077,AMZN,12/11/2013,387.34,388.98,382,382.19,2451300,382.19\n1078,AMZN,12/10/2013,383.74,389.06,383.02,387.78,2736800,387.78\n1079,AMZN,12/9/2013,388.11,388.21,382.57,384.89,2761800,384.89\n1080,AMZN,12/6/2013,388.35,388.35,383.83,386.95,1984700,386.95\n1081,AMZN,12/5/2013,386.65,386.65,381.371,384.49,1906500,384.49\n1082,AMZN,12/4/2013,383.5,389.69,381.4914,385.96,2355300,385.96\n1083,AMZN,12/3/2013,390.11,390.949,383.1,384.66,3702900,384.66\n1084,AMZN,12/2/2013,399,399,389.1,392.3,4714000,392.3\n1085,AMZN,11/29/2013,389.1,394.0999,388.62,393.62,2406000,393.62\n1086,AMZN,11/27/2013,383.5,387,382.611,386.71,2269700,386.71\n1087,AMZN,11/26/2013,377.61,382.5,374.8175,381.37,2724400,381.37\n1088,AMZN,11/25/2013,373.82,377.79,373.18,376.64,2972300,376.64\n1089,AMZN,11/22/2013,370,374.5,366.31,372.31,2965500,372.31\n1090,AMZN,11/21/2013,364.05,369.25,363.3,368.92,1964600,368.92\n1091,AMZN,11/20/2013,367.56,367.56,360.45,362.57,1771500,362.57\n1092,AMZN,11/19/2013,365.82,368.78,362.5,364.94,1904800,364.94\n1093,AMZN,11/18/2013,370.28,373.49,364.67,366.18,2737400,366.18\n1094,AMZN,11/15/2013,367.63,372.9,365.55,369.17,4491600,369.17\n1095,AMZN,11/14/2013,357.39,368.94,356.43,367.396,4159800,367.396\n1096,AMZN,11/13/2013,347.4,356.22,345.68,356.22,2773300,356.22\n1097,AMZN,11/12/2013,352.99,355.4826,347.282,349.53,2343100,349.53\n1098,AMZN,11/11/2013,350.59,355.37,348.06,354.378,2261700,354.378\n1099,AMZN,11/8/2013,345.95,351.05,344.04,350.31,2656900,350.31\n1100,AMZN,11/7/2013,355.86,357.9,341.88,343.56,4246300,343.56\n1101,AMZN,11/6/2013,360.45,362.87,354.5,356.18,2282300,356.18\n1102,AMZN,11/5/2013,356.78,360.17,354.84,358.892,2007100,358.892\n1103,AMZN,11/4/2013,360.12,361,354.4,358.74,1938400,358.74\n1104,AMZN,11/1/2013,365.63,365.77,356.1,359.002,3331000,359.002\n1105,AMZN,10/31/2013,361.73,366,359,364.03,2466800,364.03\n1106,AMZN,10/30/2013,362.62,365,358.65,361.08,4502200,361.08\n1107,AMZN,10/29/2013,358.96,362.89,356.29,362.7,2185400,362.7\n1108,AMZN,10/28/2013,359.92,362.75,357.2,358.16,3635800,358.16\n1109,AMZN,10/25/2013,358.6,368.4,352.62,363.39,12036800,363.39\n1110,AMZN,10/24/2013,329.63,332.6499,326.75,332.21,5884700,332.21\n1111,AMZN,10/23/2013,330.84,331.72,324.0601,326.756,2818200,326.756\n1112,AMZN,10/22/2013,327.72,337.11,325.68,332.54,3935500,332.54\n1113,AMZN,10/21/2013,329.89,330,323.8,326.44,2522300,326.44\n1114,AMZN,10/18/2013,319.36,331.89,316.75,328.931,5969800,328.931\n1115,AMZN,10/17/2013,307.07,311,305.24,310.77,2648400,310.77\n1116,AMZN,10/16/2013,308.38,310.8,305.554,310.49,2170700,310.49\n1117,AMZN,10/15/2013,309.87,310.79,305.26,306.4,2261100,306.4\n1118,AMZN,10/14/2013,309.22,311.645,307,310.7,1939100,310.7\n1119,AMZN,10/11/2013,304.77,310.93,303.84,310.889,2163100,310.889\n1120,AMZN,10/10/2013,304.63,306.7,302.5901,305.174,2555100,305.174\n1121,AMZN,10/9/2013,303.42,303.4978,296.5025,298.23,3247400,298.23\n1122,AMZN,10/8/2013,311.5,311.545,300.27,303.23,3166200,303.23\n1123,AMZN,10/7/2013,315.24,315.3399,309.74,310.03,2083200,310.03\n1124,AMZN,10/4/2013,315.13,319.2,312.62,319.04,1815000,319.04\n1125,AMZN,10/3/2013,320.39,322.92,313.02,314.76,2674800,314.76\n1126,AMZN,10/2/2013,318.04,321.73,317.52,320.51,2217400,320.51\n1127,AMZN,10/1/2013,314.22,321,313.65,320.95,2396400,320.95\n1128,AMZN,9/30/2013,313.41,315.31,311.06,312.64,1623600,312.64\n1129,AMZN,9/27/2013,316.92,317.21,313.35,316.01,1657500,316.01\n1130,AMZN,9/26/2013,313.9,319.37,313.26,318.12,1989900,318.12\n1131,AMZN,9/25/2013,314.53,316.71,310.75,312.65,2008600,312.65\n1132,AMZN,9/24/2013,312.43,318.0799,311.28,314.13,2033600,314.13\n1133,AMZN,9/23/2013,314.01,315.9,308.771,311.49,1884900,311.49\n1134,AMZN,9/20/2013,312.54,320.57,312.41,316.34,5302300,316.34\n1135,AMZN,9/19/2013,313.77,314.54,311.04,312.06,2350900,312.06\n1136,AMZN,9/18/2013,304.06,312.74,302.91,312.034,2946400,312.034\n1137,AMZN,9/17/2013,297.63,304.65,296.0101,304.17,2296500,304.17\n1138,AMZN,9/16/2013,299.82,301,295.26,296.06,1808400,296.06\n1139,AMZN,9/13/2013,300.14,300.22,296.201,297.92,1350600,297.92\n1140,AMZN,9/12/2013,299.39,302,297.661,298.86,1606200,298.86\n1141,AMZN,9/11/2013,298.91,301.86,297.84,299.64,1742600,299.64\n1142,AMZN,9/10/2013,300.55,301,297.22,300.36,1778400,300.36\n1143,AMZN,9/9/2013,297.22,299.96,296.6,299.71,1643600,299.71\n1144,AMZN,9/6/2013,295.33,298.88,290.8,295.86,2292000,295.86\n1145,AMZN,9/5/2013,293.63,297,292.71,294.1,1816600,294.1\n1146,AMZN,9/4/2013,288.33,295.23,287.58,293.64,2438600,293.64\n1147,AMZN,9/3/2013,284.73,291.39,284.17,288.8,2897600,288.8\n1148,AMZN,8/30/2013,284.59,284.87,280,280.98,1534700,280.98\n1149,AMZN,8/29/2013,281.45,285.98,280,283.98,1566400,283.98\n1150,AMZN,8/28/2013,280.36,283,279.33,281.58,1457100,281.58\n1151,AMZN,8/27/2013,283.87,285.28,279.74,280.93,2476000,280.93\n1152,AMZN,8/26/2013,290.43,291.0499,285.6207,286.21,1711700,286.21\n1153,AMZN,8/23/2013,291.21,291.5,287.9,290.01,1961900,290.01\n1154,AMZN,8/22/2013,284.8,289.87,284.8,289.73,1422600,289.73\n1155,AMZN,8/21/2013,285.09,288.5,283.83,284.57,1815300,284.57\n1156,AMZN,8/20/2013,285.88,289.515,285.74,287.09,1586300,287.09\n1157,AMZN,8/19/2013,285.19,289.56,283.48,285.57,2477400,285.57\n1158,AMZN,8/16/2013,286.55,288.33,284.5,284.82,2422500,284.82\n1159,AMZN,8/15/2013,288.79,289.3,285.15,286.47,2261400,286.47\n1160,AMZN,8/14/2013,294.29,294.29,290.54,291.34,1415000,291.34\n1161,AMZN,8/13/2013,295.88,296.37,290.67,293.97,2349900,293.97\n1162,AMZN,8/12/2013,295.79,299.08,295.26,296.69,1504500,296.69\n1163,AMZN,8/9/2013,295.68,299.27,294.2987,297.26,1950300,297.26\n1164,AMZN,8/8/2013,298.52,298.52,292.5501,295.74,2343400,295.74\n1165,AMZN,8/7/2013,300.15,300.99,296.15,296.91,1961000,296.91\n1166,AMZN,8/6/2013,300.51,301.36,297.52,300.75,1849000,300.75\n1167,AMZN,8/5/2013,303.4,303.62,298.3,300.99,2233200,300.99\n1168,AMZN,8/2/2013,304.63,305.33,301.5,304.21,2502600,304.21\n1169,AMZN,8/1/2013,303.08,306.21,298.905,305.57,2971700,305.57\n1170,AMZN,7/31/2013,303.91,305.15,301,301.22,1891300,301.22\n1171,AMZN,7/30/2013,307.72,309.7833,301.57,302.41,3053400,302.41\n1172,AMZN,7/29/2013,311.07,313,305.9,306.1,3211800,306.1\n1173,AMZN,7/26/2013,299.55,313.62,295.55,312.01,8817500,312.01\n1174,AMZN,7/25/2013,299,304.5,296.75,303.4,5405800,303.4\n1175,AMZN,7/24/2013,303.02,303.84,298.04,298.94,2000500,298.94\n1176,AMZN,7/23/2013,303.16,305.06,300.56,301.06,1999600,301.06\n1177,AMZN,7/22/2013,309.25,309.25,302,303.48,2520700,303.48\n1178,AMZN,7/19/2013,304.39,305.79,301.91,305.23,2973100,305.23\n1179,AMZN,7/18/2013,306.27,306.3408,301.87,304.11,3063800,304.11\n1180,AMZN,7/17/2013,306.97,308.8,305.69,308.69,2029700,308.69\n1181,AMZN,7/16/2013,307.3,309.39,305.5119,306.87,2660200,306.87\n1182,AMZN,7/15/2013,307.27,307.99,304.35,306.57,2245600,306.57\n1183,AMZN,7/12/2013,298.69,307.55,298.5,307.55,4539300,307.55\n1184,AMZN,7/11/2013,294.99,300.69,292.1,299.66,4007300,299.66\n1185,AMZN,7/10/2013,291.41,293.34,289.4,292.33,1810200,292.33\n1186,AMZN,7/9/2013,291,292.57,288.01,291.53,2775600,291.53\n1187,AMZN,7/8/2013,286.42,291.67,286.14,290.59,3046700,290.59\n1188,AMZN,7/5/2013,285,286.3799,282.07,285.88,1985400,285.88\n1189,AMZN,7/3/2013,282.6,285.4,282,284.03,1373000,284.03\n1190,AMZN,7/2/2013,281.04,286.58,280.59,283.73,3238200,283.73\n1191,AMZN,7/1/2013,279,283.29,277.16,282.1,2888200,282.1\n1192,AMZN,6/28/2013,276.19,279.83,276.19,277.69,3193300,277.69\n1193,AMZN,6/27/2013,279.18,280.2,274.54,277.55,2519500,277.55\n1194,AMZN,6/26/2013,273.98,277.98,273.5001,277.57,3029500,277.57\n1195,AMZN,6/25/2013,272.3,273.47,269,272.088,2449600,272.088\n1196,AMZN,6/24/2013,271.29,273.16,265,270.61,3863800,270.61\n1197,AMZN,6/21/2013,274.57,275.8399,269.79,273.36,4201000,273.36\n1198,AMZN,6/20/2013,275.14,278.6,272.39,273.44,2984000,273.44\n1199,AMZN,6/19/2013,281.26,283.34,277.87,278.16,2827500,278.16\n1200,AMZN,6/18/2013,279.08,282.91,278.11,281.76,2146100,281.76\n1201,AMZN,6/17/2013,276.35,280.2,275.65,278.06,2884000,278.06\n1202,AMZN,6/14/2013,275,277.07,273.442,273.99,2150800,273.99\n1203,AMZN,6/13/2013,271.5,276.8,270.2901,275.79,2649800,275.79\n1204,AMZN,6/12/2013,276.6,276.8,270.45,271.67,2238900,271.67\n1205,AMZN,6/11/2013,276,278.411,274.24,274.78,3097800,274.78\n1206,AMZN,6/10/2013,276.68,282.47,275.24,281.07,3086500,281.07\n1207,AMZN,6/7/2013,269.74,280.1,269.13,276.87,4632600,276.87\n1208,AMZN,6/6/2013,267.75,270.5,264.21,267.83,2476300,267.83\n1209,AMZN,6/5/2013,265.81,271.66,265.02,267.17,3512300,267.17\n1210,AMZN,6/4/2013,267,268.88,263.02,265.7,2088600,265.7\n1211,AMZN,6/3/2013,268.96,269.11,262.95,266.88,2543900,266.88\n1212,AMZN,5/31/2013,266,271.91,265.94,269.2,3374300,269.2\n1213,AMZN,5/30/2013,265.71,268.57,265.615,266.83,1667500,266.83\n1214,AMZN,5/29/2013,265.46,268.25,264.844,265.53,1903400,265.53\n1215,AMZN,5/28/2013,266.48,271.1,266,267.29,3471000,267.29\n1216,AMZN,5/24/2013,259.85,261.93,258.34,261.74,1696300,261.74\n1217,AMZN,5/23/2013,260.49,263.17,259.59,261.8,2000300,261.8\n1218,AMZN,5/22/2013,267.39,267.59,260.8,262.96,3332000,262.96\n1219,AMZN,5/21/2013,268.74,270.77,267.66,268.86,1741200,268.86\n1220,AMZN,5/20/2013,269,271.79,266.5,267.63,2209000,267.63\n1221,AMZN,5/17/2013,265.83,269.98,265,269.9,2527300,269.9\n1222,AMZN,5/16/2013,265.96,268.43,263.85,264.12,1643500,264.12\n1223,AMZN,5/15/2013,267.07,269.05,264.56,266.56,2720500,266.56\n1224,AMZN,5/14/2013,264.5,269.4,264.028,268.33,2700000,268.33\n1225,AMZN,5/13/2013,262.77,265.88,262,264.51,2149500,264.51\n1226,AMZN,5/10/2013,260.88,263.65,260.21,263.63,3145300,263.63\n1227,AMZN,5/9/2013,258.73,263.55,256.88,260.16,2769300,260.16\n1228,AMZN,5/8/2013,256.87,260.295,255.334,258.68,2677000,258.68\n1229,AMZN,5/7/2013,256.31,259.74,252.9101,257.73,3133700,257.73\n1230,AMZN,5/6/2013,258.09,259.5,253.4201,255.72,2347800,255.72\n1231,AMZN,5/3/2013,256.14,259.25,254.7,258.05,3514000,258.05\n1232,AMZN,5/2/2013,248.94,252.93,245.78,252.55,3936200,252.55\n1233,AMZN,5/1/2013,253.9,254.2,245.75,248.23,4391400,248.23\n1234,AMZN,4/30/2013,249.3701,254.68,248.56,253.81,4248800,253.81\n1235,AMZN,4/29/2013,254.9,257.01,249.15,249.74,7117000,249.74\n1236,AMZN,4/26/2013,269.97,272.02,252.81,254.81,14030000,254.81\n1237,AMZN,4/25/2013,271.53,275.8,270.5,274.7,6116500,274.7\n1238,AMZN,4/24/2013,269.5,271.47,266.81,268.78,1852800,268.78\n1239,AMZN,4/23/2013,264.5,269.87,264.5,268.9,2270600,268.9\n1240,AMZN,4/22/2013,259.35,264.6,258.03,263.55,2119100,263.55\n1241,AMZN,4/19/2013,258.16,262.88,257.5,260.32,2602500,260.32\n1242,AMZN,4/18/2013,266.81,266.9899,256.6,259.42,3137600,259.42\n1243,AMZN,4/17/2013,270.8,270.85,264.25,267.4,3135100,267.4\n1244,AMZN,4/16/2013,269.31,272.8,268.06,272.34,2137200,272.34\n1245,AMZN,4/15/2013,271.08,275.12,267.1,267.72,3326000,267.72\n1246,AMZN,4/12/2013,270.12,273.27,267.02,272.87,2866300,272.87\n1247,AMZN,4/11/2013,264.74,270.97,264.74,269.85,3090500,269.85\n1248,AMZN,4/10/2013,261.78,265.98,259.32,264.77,2322500,264.77\n1249,AMZN,4/9/2013,258.85,262.61,257,261.14,2156600,261.14\n1250,AMZN,4/8/2013,255.92,259.679,255.63,258.95,2295600,258.95\n1251,AMZN,4/5/2013,255.72,256.18,253.67,255.48,2557400,255.48\n1252,AMZN,4/4/2013,259.23,260.41,256.12,259.08,1964400,259.08\n1253,AMZN,4/3/2013,262.12,263.67,257.75,259.03,2413800,259.03\n1254,AMZN,4/2/2013,262.4,265.89,260.55,263.322,2631100,263.322\n1255,AMZN,4/1/2013,266.98,267.4,261.01,261.61,2524800,261.61\n1256,AMZN,3/28/2013,265.82,267.375,264.06,266.49,2473700,266.49\n1257,AMZN,3/27/2013,258.75,265.93,257.9,265.3,2874900,265.3\n1258,AMZN,3/26/2013,257.05,261.48,256.28,260.31,2421000,260.31\n1259,AMZN,3/25/2013,258.58,259.429,254.5,256.02,2513900,256.02\n1260,AMZN,3/22/2013,254.55,257.77,252.07,257.75,3124600,257.75\n1261,AMZN,3/21/2013,256.11,257,252.68,253.39,2806400,253.39\n1262,AMZN,3/20/2013,258.05,259.76,254.5501,257.278,2738900,257.278\n1263,AMZN,3/19/2013,258.4,259.5,252.62,256.41,3738500,256.41\n1264,AMZN,3/18/2013,259.3,261.49,257.12,257.89,2720200,257.89\n1265,AMZN,3/15/2013,264.98,267.26,260.05,261.82,4865900,261.82\n1266,AMZN,3/14/2013,269.67,270,263.53,265.74,5226700,265.74\n1267,AMZN,3/13/2013,275.24,276.5,272.64,275.1,1884200,275.1\n1268,AMZN,3/12/2013,271,277.4,270.3601,274.13,3246200,274.13\n1269,AMZN,3/11/2013,273.43,273.99,270.4,271.24,1904900,271.24\n1270,AMZN,3/8/2013,275,275.44,271.5,274.19,1879800,274.19\n1271,AMZN,3/7/2013,274.1,274.8,271.85,273.88,1939000,273.88\n1272,AMZN,3/6/2013,275.76,276.489,271.832,273.79,2050700,273.79\n1273,AMZN,3/5/2013,274,276.68,269.99,275.59,3686200,275.59\n1274,AMZN,3/4/2013,265.36,273.3,264.14,273.11,3453000,273.11\n1275,AMZN,3/1/2013,263.27,266.6,261.04,265.74,2957000,265.74\n1276,AMZN,2/28/2013,261.81,267,260.63,264.27,2667200,264.27\n1277,AMZN,2/27/2013,259.4,265.83,256.86,263.25,2908100,263.25\n1278,AMZN,2/26/2013,260.89,262.04,255.73,259.36,3348600,259.36\n1279,AMZN,2/25/2013,266.94,268.694,259.65,259.87,3032400,259.87\n1280,AMZN,2/22/2013,266.62,267.11,261.61,265.42,3124800,265.42\n1281,AMZN,2/21/2013,265.12,269.48,263.25,265.94,3637400,265.94\n1282,AMZN,2/20/2013,270.2,274.3,266.371,266.41,3528900,266.41\n1283,AMZN,2/19/2013,265.91,270.11,264.5,269.75,2854200,269.75\n1284,AMZN,2/15/2013,267.63,268.92,263.11,265.09,3979900,265.09\n1285,AMZN,2/14/2013,267.37,270.65,265.4,269.24,3463000,269.24\n1286,AMZN,2/13/2013,261.53,269.96,260.3,269.47,5293000,269.47\n1287,AMZN,2/12/2013,259.19,260.16,257,258.7,2943700,258.7\n1288,AMZN,2/11/2013,263.2,263.25,256.6,257.21,3403700,257.21\n1289,AMZN,2/8/2013,261.4,265.25,260.555,261.95,3879200,261.95\n1290,AMZN,2/7/2013,264.1,264.1,255.11,260.23,3975700,260.23\n1291,AMZN,2/6/2013,265.16,266.89,261.11,262.22,2770400,262.22\n1292,AMZN,2/5/2013,262,268.03,261.46,266.89,4012900,266.89\n1293,AMZN,2/4/2013,262.78,264.684,259.07,259.98,3723600,259.98\n1294,AMZN,2/1/2013,268.93,268.93,262.8,265,6115000,265\n1295,AMZN,1/31/2013,271.04,275.94,263.6991,265.5,6772100,265.5\n1296,AMZN,1/30/2013,283,284.2,267.11,272.764,13075400,272.764\n1297,AMZN,1/29/2013,275.35,275.46,258.35,260.35,10172600,260.35\n1298,AMZN,1/28/2013,283.78,284.48,274.4,276.04,4321400,276.04\n1299,AMZN,1/25/2013,275,284.72,274.4,283.99,4968100,283.99\n1300,AMZN,1/24/2013,269.37,276.65,269.37,273.62,3417000,273.62\n1301,AMZN,1/23/2013,270.57,271.09,266.65,268.11,2508900,268.11\n1302,AMZN,1/22/2013,271.62,272.1,269.23,270.19,2137700,270.19\n1303,AMZN,1/18/2013,270.83,274.5,269.6,272.12,2942000,272.12\n1304,AMZN,1/17/2013,271.43,271.97,269.21,270.48,1884600,270.48\n1305,AMZN,1/16/2013,270.53,271.24,267.83,268.93,2065600,268.93\n1306,AMZN,1/15/2013,270.68,272.73,269.3,271.9,2326900,271.9\n1307,AMZN,1/14/2013,268,274.26,267.54,272.73,4275000,272.73\n1308,AMZN,1/11/2013,265.1,268.43,264.11,267.94,2413300,267.94\n1309,AMZN,1/10/2013,268.54,268.74,262.3,265.34,2863400,265.34\n1310,AMZN,1/9/2013,268.17,269.5,265.401,266.35,2265600,266.35\n1311,AMZN,1/8/2013,267.07,268.98,263.567,266.38,3010700,266.38\n1312,AMZN,1/7/2013,262.97,269.725,262.67,268.4592,4910000,268.4592\n1313,AMZN,1/4/2013,257.58,259.8,256.65,259.15,1874200,259.15\n1314,AMZN,1/3/2013,257.27,260.88,256.37,258.48,2750900,258.48\n1315,AMZN,1/2/2013,256.08,258.0999,253.26,257.31,3271000,257.31\n"
  },
  {
    "path": "pandas-time-series-analysis/examples.py",
    "content": "# Importing required modules\nimport pandas as pd\nimport numpy as np\n\nimport matplotlib.pyplot as plt\n\n# Settings for pretty plots\nplt.style.use('fivethirtyeight')\nplt.show()\n\n# Reading in the data\ndata = pd.read_csv('amazon_stock.csv')\n\n# Inspecting the data\ndata.head()\n\n# Remove the first two columns\ndata.drop(columns=['None', 'ticker'], inplace=True)\ndata.head()\ndata.info()\n\n# Convert str to datetime\ndata['Date'] = data['Date'].apply(pd.to_datetime)\ndata.info()\n\n# Set 'Date' as index\ndata.set_index('Date', inplace=True)\ndata.head()\n\n# Plot the adjusted close\ndata['Adj_Close'].plot(figsize=(16, 8), title='Adjusted Closing Price')\n\n\"\"\"\nDates and Times in Pandas\n\"\"\"\n\nfrom datetime import datetime\n\nmy_year = 2019\nmy_month = 4\nmy_day = 21\nmy_hour = 10\nmy_minute = 5\nmy_second = 30\n\ntest_date = datetime(my_year, my_month, my_day)\ntest_date\n\n# Output\n# datetime.datetime(2019, 4, 21, 0, 0)\n\ntest_date = datetime(my_year, my_month, my_day, my_hour, my_minute, my_second)\nprint(\"The day is : \", test_date.day)\nprint(\"The hour is : \", test_date.hour)\nprint(\"The month is : \", test_date.month)\n\n# Index column is of type DatetimeIndex\ndata.info()\n\nprint(data.index.max())\nprint(data.index.min())\n\n# Retrieve index of earliest and latest dates\ndata.index.argmin()\ndata.index.argmax()\n\n\"\"\"\nTime Resampling\n\"\"\"\n# Resample by year\ndata.resample(rule='A').mean()\n\n# Plot charts for specific columns\ndata['Adj_Close'].resample('A').mean().plot(kind='bar', figsize=(10, 4))\nplt.title('Yearly Mean Adj Close Price for Amazon')\nplt.show()\n\n\"\"\"\nTime Shifting\n\"\"\"\n\ndata.shift(1).head()\ndata.shift(-1).head()\n\n# Using string value parameters\ndata.tshift(periods=3, freq='M').head()\n\n\"\"\"\nRolling Windows\n\"\"\"\n\ndata['Adj_Close'].plot(figsize=(16, 8))\n\ndata.rolling(7).mean().head(10)\n\ndata['Open'].plot()\ndata.rolling(window=30).mean()['Open'].plot(figsize=(16, 6))\n"
  },
  {
    "path": "pandas-time-series-analysis/readme.md",
    "content": "Example code for pandas-time-series-analysis\n"
  },
  {
    "path": "python-dictionary-article/article_examples.py",
    "content": "\"\"\"\nDictionary Creation\n\"\"\"\nmy_dict = {'key1': 1, 'key2': 2}\n\nmy_dict = dict(key1=1, key2=2)\n\nmy_dict = {}\n\nmy_dict = dict()\n\nmy_dict['key'] = 123\n\n# Define a dict with some string values and keys\nmy_dict = {\n    'my_nested_dict':\n        {\n            'a_key': 'a_value',\n            'another_key': 'another_value',\n        }\n}\n\nmy_variable = my_dict['my_nested_dict']\n\n\"\"\"\nPractical Use Cases\n\"\"\"\n\n\nclass User(object):\n    \"\"\"  Stores info about Users \"\"\"\n\n    def __init__(self, name, email, address, password, url):\n        self.name = name\n        self.email = email\n        ...\n\n    def send_email(self):\n        \"\"\" Send an email to our user\"\"\"\n        pass\n\n    # def __repr__():\n    #     \"\"\"Logic to properly format data\"\"\"\n\n\nbill = User('bill @ gmail.com', '123 Acme Dr.', 'secret-password',\n            'http: // www.bill.com')\nbill.send_email()\n\nbill = {'email': 'bill@gmail.com',\n        'address': '123 Acme Dr.',\n        'password': 'secret-password',\n        'url': 'http://www.bill.com'}\n\n\ndef send_email(user_dict):\n    pass\n\n\n# smtp email logic …\n\nsend_email(bill['email'])  # bracket notation or …\nsend_email(bill.get('email'))  # .get() method is handy, too\n\n# Sample user data\n\njson_response = [{\n    \"id\": 1,\n    \"first_name\": \"Florentia\",\n    \"last_name\": \"Schelle\",\n    \"email\": \"fschelle0@nyu.edu\",\n    \"url\": \"https://wired.com\"\n}, {\n    \"id\": 2,\n    \"first_name\": \"Montague\",\n    \"last_name\": \"McAteer\",\n    \"email\": \"mmcateer1@zdnet.com\",\n    \"url\": \"https://domainmarket.com\"\n}, {\n    \"id\": 3,\n    \"first_name\": \"Dav\",\n    \"last_name\": \"Yurin\",\n    \"email\": \"dyurin2@e-recht24.de\",\n    \"url\": \"http://wufoo.com\"\n}]\n\n# This is just a pattern, but a useful one!\nusers = []\nfor i in json_response:\n    users.append(User(\n        name=i['first_name'] + i['last_name'],\n        email=i['email'],\n        url=i['url'],\n        # ...\n    ))\n"
  },
  {
    "path": "python-for-loops/examples.py",
    "content": "\"\"\"\nExample code from Python For Loops: Quick Answers and Examples\n\n\"\"\"\n\n# Basic Usage\nword = 'Mississippi'\ncount = 0\nfor letter in word:\n    if letter == 'i':\n        count = count + 1\nprint(count)\n\n# Lists\nstudent_list = (\"jake\", \"john\", \"jim\")\nfor student in student_list:\n    print(student)\n\n# How do loops work?\nfor character in \"Kite\":\n    print(character)\n\n# iterating with next()\nexample_tuple = (\"smartwater\", \"fiji\", \"aquafina\")\nmy_tuple = iter(example_tuple)\n\nprint(next(my_tuple))\nprint(next(my_tuple))\nprint(next(my_tuple))\n\n# with a loop\nexample_tuple = (\"smartwater\", \"fiji\", \"aquafina\")\nfor x in example_tuple:\n    print(x)\n\n# break statement\nstudents = [\"John\", \"Jerry\", \"Sarah\"]\nfor x in students:\n    print(x)\n    if x == \"Jerry\":\n        break\n\nstudents = [\"John\", \"Jerry\", \"Sarah\"]\nfor x in students:\n    if x == \"Jerry\":\n        break\n    print(x)\n\n# continue statement\nstudents = [\"John\", \"Jerry\", \"Sarah\"]\nfor x in students:\n    if x == \"Jerry\":\n        continue\n    print(x)\n\n# range()\nfor x in range(5):\n    print(x)\n\nfor x in range(0, 10, 2):\n    print(x)\n\n# else\nfor x in range(5):\n    print(x)\nelse:\n    print(\"Finally finished!\")\n\n# non-nested loop\nlist_of_lists = [['yorkshire', 'jack russell', 'golden retriever'], [0, 1, 2], [11, 22, 33]]\n\nfor list_item in list_of_lists:\n    print(list_item)\n\n# nested loop\nlist_of_lists = [['yorkshire', 'jack russell', 'golden retriever'], [0, 1, 2], [11, 22, 33]]\n\nfor list_item in list_of_lists:\n    for item in list_item:\n        print(item)\n\n# nesting for combination\nadj = [\"red\", \"sporty\", \"electric\"]\ncars = [\"BMW\", \"Lexus\", \"Tesla\"]\n\nfor x in adj:\n    for y in cars:\n        print(x, y)\n\n# infinite loop\ncount = 0\ni = 1\nwhile i == 1:\n    count += 1\n\n# Calling range()\nfor i in range(6):\n    print(i)\n\nfor i in range(1, 6):\n    print(i)\n\nfor i in range(5):\n    print(i + 1)\n"
  },
  {
    "path": "python-optimization/README.md",
    "content": "### Code Examples for \"Python Optimization: Tips to Speed Up Your Programs\"\n- examples.py"
  },
  {
    "path": "python-optimization/examples.py",
    "content": "# profiling\nimport cProfile\n\n\ndef fib(n):\n    if n < 2:\n        return 1\n    return fib(n - 1) + fib(n - 2)\n\n\ncProfile.run('fib(30)')\n\n# basic timeit usage\nimport timeit\n\ntimeit.timeit('\"-\".join(str(n) for n in range(100))', number=10000)\ntimeit.timeit('\"-\".join([str(n) for n in range(100)])', number=10000)\ntimeit.timeit('\"-\".join(map(str, range(100)))', number=10000)\n\n# creating a decorator\nfrom timeit import default_timer\n\n\ndef timer(func):\n    def wrapper(*args, **kwargs):\n        begin = default_timer()\n        result = func(*args, **kwargs)\n        end = default_timer()\n        print(f\"{func.__name__} took {end - begin} seconds to compute.\")\n        return result\n\n    return wrapper\n\n\n@timer\ndef my_join():\n    return \"-\".join(map(str, range(10000)))\n\n\nmy_join()\n\n# Optimizing for speed\nmy_var = 'beautiful'\n\n# slow\nmsg = 'hello ' + my_var + ' world'\n\n# better\nmsg = 'hello %s world' % my_var\n\n# even better:\nmsg = 'hello {} world'.format(my_var)\n\n# best (and most Pythonic in Python 3)\nmsg = f'hello {my_var} world'\n\nx = 1\ny = 2\n\n# Bad\ntemp = x\nx = y\ny = temp\n\n# Good\nx, y = y, x\n\n# Bad\na = 42\nx = a\ny = a\n\n# Good\na = 42\nx = y = a\n\n\n# New Fibonacci calculator\ndef fibon(n):\n    a = b = 1\n    for i in range(n):\n        yield a\n        a, b = b, a + b\n\n\nlist(fibon(5))\n"
  },
  {
    "path": "python-string-formatting/python_string_formatting.py",
    "content": "\"\"\"\nExample Code for\n\"Python String Formatting\"\n\"\"\"\n\n\"\"\"\nThe old way: printf style formatting\n\"\"\"\n\n# Insert values by indicating their type\nthis = \"this\"\nfive = 5\n\"%s is a %d\" % (this, five)\n\n# %s can be used with any object\n\"%s is a list\" % [1, 2, 3]\n\n# %r is the same as calling repr()\n\"%s sounds like %r\" % (\"Seaweed\", \"Seaweed\")\n\n# Pass in the number of desired digits\n\"%.3f\" % 6.1234567\n\n# Add padding by specifying number of characters\nfor w in ['some', 'words', 'are', 'longer']:\n    print(\"|%15s\" % w)\n\n# Use a dictionary to insert values into the string\nship_info = {'ship': 'personiples', 'captain': 'Archaeus'}\n\n\"%(ship)s was run hard by %(captain)s\" % ship_info\n\n\"\"\"\nPython 3: str.format() - (Curly Braces)\n\"\"\"\n\"{} comes before {}\".format('a', 'b')\n\n# Specify the index for repeated arguments\n\"{1} is after {0} which is before {1}\".format('a', 'b')\n\n# Specify the argument by name\n\"{cat} loves {dog}, {dog} loves {cat}\".format(cat='Whiskers', dog='Rover')\n\n# Use dictionaries as named arguments\nship_captains = {'The Irish Rover': 'Mick McCann', 'Davey Crockett': 'Burgess'}\n\"{Davey Crockett} and {The Irish Rover} are both ship captains\".format(**ship_captains)\n\n\n# Access object attributes in replacement field\nclass Ship:\n    def __init__(self, name, masts, captain):\n        self.name = name\n        self.masts = masts\n        self.captain = captain\n\n    def __str__(self):\n        msg = \"{self.name} had {self.masts} masts and was captained by {self.captain}\"\n        return msg.format(self=self)\n\n\n# Create the ship objects\nships = [Ship(\"The Irish Rover\", 27, 'Mick McCann'),\n         Ship(\"Davey Crockett\", 3, 'Burgess'),\n         Ship(\"The John B\", 2, 'Richard Le Gallienne')]\n\n# Print() uses __str__ method\nfor ship in ships:\n    print(ship)\n\n# Add format specification\nfor ship in ships:\n    print(\"|{ship.name:>22}|{ship.captain:>22}|{ship.masts:>22}|\".format(ship=ship))\n\n\"\"\"\nF-Strings\n\"\"\"\nstrings_count = 5\nfrets_count = 21\nf\"My banjo has {strings_count} strings and {frets_count} frets\"\n\n# Access contents of a list\narrivals = ['The Irish Rover', 'The Titanic', 'The Rueben']\nf'The first to arrive was {arrivals[0]} and the last was {arrivals[-1]}'\n\n# Specify a conversion type\nship_name = \"Davey Crockett\"\nf'The ships name was spelled {ship_name!r}'\n\nf'The ships name was spelled {repr(ship_name)}'\n\n# ascii() function\ncheck = \"√\"\nf\"The ascii version of {check} is {check!a}\"\n\n# nesting fields\nrag_count = 1000000\npadding = 10\nf'Sligo rags: {rag_count:{padding}d}'\n"
  },
  {
    "path": "python-typing/hello_world.py",
    "content": "# hello_world.py\ndef hello_world(name: str = 'Joe') -> str:\n    return f'Hello {name}'\n\n\nhello_world(name='Mark')\n\nhello_world(name=2)\n"
  },
  {
    "path": "python-typing/mr.py",
    "content": "# mr.py\nfrom functools import reduce\nfrom typing import Callable, Iterable, TypeVar, Union, Optional\n\nT = TypeVar('T')\nS = TypeVar('S')\nNumber = Union[int, float]\n\n\nprint()\ndef map_reduce(\n    it: Iterable[T],\n    mapper: Callable[[T], S],\n    reducer: Callable[[S, S], S],\n    filterer: Optional[Callable[[S], bool]]\n) -> S:\n    mapped = map(mapper, it)\n    filtered = filter(filterer, mapped)\n    reduced = reduce(reducer, filtered)\n    return reduced\n\n\ndef mapper(x: Number) -> Number:\n    return x ** 2\n\n\ndef filterer(x: Number) -> bool:\n    return x % 2 == 0\n\n\ndef reducer(x: Number, y: Number) -> Number:\n    return x + y\n\n\nresults = map_reduce(\n    range(10),\n    mapper=mapper,\n    reducer=reducer,\n    filterer=filterer\n)\nprint(results)"
  },
  {
    "path": "python-typing/mypy.ini",
    "content": "[mypy]\n[mypy-numpy]\nignore_missing_imports = True"
  },
  {
    "path": "python-typing/readme.md",
    "content": "### Example code for 'Start “Typing” your Python Code'\n- Contains final version of tree.py\n- For starting iterations, see blog text"
  },
  {
    "path": "python-typing/rescale.py",
    "content": "# rescale.py\nimport numpy as np  # type: ignore\n\n\ndef rescale_from_to(array1d: np.ndarray,\n                    from_: float = 0.0, to: float = 5.0) -> np.ndarray:\n    min_ = np.min(array1d)\n    max_ = np.max(array1d)\n    rescaled = (array1d - min_) * (to - from_) / (max_ - min_) + from_\n    return rescaled\n\n\nmy_array: np.array = np.array([1, 2, 3, 4])\n\nrescaled_array = rescale_from_to(my_array)\n"
  },
  {
    "path": "python-typing/tree.py",
    "content": "# tree.py (final)\nfrom typing import Tuple, Iterable, Dict, List, DefaultDict, TypeVar\nfrom collections import defaultdict\n\nT = TypeVar('T')\n\nRelation = Tuple[T, T]\n\n\ndef create_tree(tuples: Iterable[Relation]) -> DefaultDict[T, List[T]]:\n    \"\"\"\n    Return a tree given tuples of (child, father)\n\n    The tree structure is as follows:\n\n        tree = {node_1: [node_2, node_3],\n                node_2: [node_4, node_5, node_6],\n                node_6: [node_7, node_8]}\n    \"\"\"\n    # convert to dict\n    tree: DefaultDict[T, List[T]] = defaultdict(list)\n    for pair in tuples:\n        child, father = pair\n        if father:\n            tree[father].append(child)\n\n    return tree\n\n\nprint(create_tree([(2.0, 1.0), (3.0, 1.0), (4.0, 3.0), (1.0, 6.0)]))\n\n\"\"\"\nGeneric Classes\n\"\"\"\n\n\ndef return_values() -> Iterable[float]:\n    yield 4.0\n    yield 5.0\n    yield 6.0\n\n\ndef chain(*args: Iterable[T]) -> Iterable[T]:\n    for arg in args:\n        yield from arg\n\n\nprint(list(chain([1, 2, 3], return_values(), 'string')))\n\n"
  },
  {
    "path": "python-write-to-file/blog-post.txt",
    "content": "How can developers and clients benefit from data being in a file format when there are so many other options out there? Why not just use a simple HTML page with AJAX requests and tables to display the data? In this blog post, let me show you why it may be a good idea to construct files using python to create and fill them with data. We will go over a few APIs to populate our files with data and how to use the Requests HTTP library to fetch data. In this post, we'll be using Python 3 and its toolkit.\n\nSetting Objectives\n\nLet's set objectives for our files! First, we want some inspiration. We will form a request to a famous quotes API using the Requests module in Python. Second, we want to make sure our investments in the stock market are looking solid. We'll use IEXFinance Python wrapper around the Investors Exchange Developer API. Third, we also want to make sure our cryptocurrencies are staying green as well. We'll fetch data with the Requests module from the Coinbase API to check on our digital assets. Lastly, we'll take all this fetched data and write to files that correspond to each time we run the script and have one accumulative file. All of our files will be in CSV format. I am assuming that we will utilize the functionality of spreadsheet software to graph this data we store in the files. Let's dive into how the Requests HTTP library works and get our quotes!\n\nUsing the Requests Module\n\nThe Requests HTTP Library is an elegant way to make HTTP requests without the need to do manual labor of forming the query-strings or to form-encode POST data. Our primary focus will be making a GET request to TheySaidSo or FavQs API to fetch our inspirational quote. First thing, we need to install the Requests library in our project's directory. In a Unix terminal, you can simply run 'pipenv install requests' if you have pipenv installed. If you don't have pipenv installed, use 'pip install pipenv' to install it!\n\nGetting Inspiration by Fetching Quotes\n\nNow that you have the Requests library available to use; let's form our first request. Since we will be tracking our favorite stocks and crypto coins, it may be a good idea to add hope to our file. We will form an API Get request to theysaidso.com's quotes API. The 'quote of the day' endpoint is straightforward to digest and will give us some inspiration when we need it most. Alternatively, you can also use the FavQs API. This quote API will allow for more requests if you plan to use the script more than 10 times per hour. Now it is time to form that request and format the response!\n\nAbove you'll see how we form the request and format the response. I provided an example for both APIs. I'll be referencing FavQs's API since I'm not paying for TheySaidSo's API. This way I can always have a quote each time I run the script since I won't hit their rate limit of 30 requests per 20 seconds. First, we make the request, and when it succeeds, we receive a response which needs JSON decoding. After decoding the response, we are able to simply combine the dictionary key/value pairs into a formatted string. This string will be ('quote' - 'author'). Not to forget, we may receive commas in the quote. We need to use the replace() function to replace all commas with HTML hex code value for commas or a value of your choosing that is still easily replaceable. Replacing it with the hex code value will enable future replacement to be just as easy. We can store this string as a constant to use later when we write it to our file. Next, let's fetch our favorite stocks prices.\n\nLassoing the Data-Driven Bull\n\nThere are a plethora of python modules to assist you in receiving stock information. I chose IEXFinance module which wraps around the Investors Exchange Developer API. You'll need to run 'pip install iexfinance' to have the module accessible in the script file. It provides a plethora of valuable features including real-time quotes, historical data, trading analyses, etc. We are only concerned with getting the stock price at the time we run the script. Analyzing the code above, we use the Stock() function to call a single ticker. We do this three times to keep the code simple, but you can use a list inside of Stock() to fetch various ticker information. Our top priority is to get the price of our favorite stocks: Tesla, Apple, and Google (Alphabet). Using the constants, we can call get_price() on them. The get_price() function returns a float which we need to convert into a string. I decided to use the str() function for conversion to maintain readability. Excellent, we have stock prices stored and a quote ready. It is time to get our crypto coin prices!\n\nCatching Coins with Virtual Flips\n\nCoinbase is one of the most famous exchanges operating today. Since Coinbase is very popular, they have graced their developer community with a superb API. They are also gracious to allow 10,000 API calls per hour! For this demonstration, I'll be checking the buy price of BTC, ETH, and LTC to USD. Looking at the provided example, we need to form three requests to the Coinbase API-- one for each currency. We get the response object on success, decode the JSON, then we set that amount to a constant per coin. Now that we have our quote, stock prices, and crypto prices there are only a few more steps we need to do to format the data correctly.\n\nNow it is time to get our data formatted correctly for our files we will be creating and updating. First, we need to think about how we will be naming our generated files and the organization structure. In my example, I use an output directory with the main file named master.csv and sub-directory named 'individual.' Within the 'individual' directory, I place the file we generate each time we run the script. What should the name be? \n\nAll in a Good Time\n\nHow about we use the DateTime module! I chose 'stock-crypto-check-YYYY-MM-DD-HH-MM' because we will generate a new file name each minute we run the script. I'm not concerned about running this down to seconds, so delimiting by minutes works for me. If you plan to run it once a day or once an hour, just change the formatting to remove the time format depending on your desired interval. In the example above, you'll see I created two other time formats as well. These two be in their corresponding files. I'm using the DateTime module by calling for today's date and time. I format the date constant by using the strftime() function which formats the date string using format codes. Let's revisit the data we received from our requests and module functions to get it ready for the files.\n\nFormatted Strings Attached\n\nSince we are writing and appending to CSV files, we need to start with a comma delimitated header line. I think going by ticker and price to start makes sense, but I also want to include our date and quote on the last line we write. Those fields will be the last two in the header and only filled on the last line of the output. When writing to a file, we need to be sure we create new lines. According to the python documentation, we can use '\\n' on a Unix machine ('\\r\\n' for Windows). Our stock and crypto strings ought to follow how we set up our header. Since we have three stocks and coins; I'll have six tickers, prices, and new lines but I'll have twelve empty cells in total. Each stock and cryptocurrency group will need a newline to ensure we follow the format correctly. Now that we have our stock and cryptocurrency strings formatted, we can move onto the satisfying part. Let's write all of this data to our files!\n\nPoetry in Motion\n\nThe most crucial part is ensuring we have our directories made for the master and individual files. Otherwise, we will get a 'FileNotFoundError' if the directory is not found.  First, let's create the master.csv file. The first argument is the name of the file and the second argument is the mode. Using the open function with 'a' as the mode signifies we will be appending to the file named. The appending mode will create the file if it does not exist, if it does, it will write after the last line. I only want to add the header once, so I opted to use the OS module to check the size of the file in bytes. If the file is brand new the size will be 0; thus we can add the header. Since this only happens once, you may opt to create the master.csv and add the header manually before running the script. Finally, the best part, we write our formatted data to the file. Since we are writing three lines (excluding the header), three write functions are needed. The last write function we will format our date and quote. To follow the header fields, we need two empty columns to start. Then we can concatenate master date and quote followed by a newline since we are appending to the master.csv file. We must close the file (using the close() function) once we are done to ensure we free up system resources used by the file.\n\nFor the individual files, we will follow the same pattern with a few minor changes. First, we will use the formatted file date within the name parameter of the open function and use the 'w' mode for writing. If you run the script within the same minute, then the previous file will be overwritten with the latest data received. You can prevent this from happening by adding seconds to the file name. Unlike the master file, want to add the header each time. We will run the write function four times in total for our individual files. The only other difference is not needing the newline after the date and quote data.\n\nIn Conclusion\n\nShazam! We now have a working script to generate output data to use for historical purposes with other projects. There is plenty of room to improve the code shown; using python 3.x convention, refactoring the Stock() function, use the context manager for opening files, etc. This tutorial gives you a starting point with a clear understanding of the capabilities to create a script to dynamically generate files and update existing ones. I hope you have gained insight about using data to write to files and generate dynamic files programmatically. Happy coding!\n\n"
  },
  {
    "path": "python-write-to-file/outline.txt",
    "content": "1. Intro\n    1. What the blog will be about\n        1. Writing data to a file\n            1. create new\n            2. append to existing\n            3. other possibilities (not in this post)\n        2. Using the requests library\n            1. Get call to quotes api\n        3. Using a stock API to track stocks\n        4. Writing stock data and quote to file\n        5. formatting for excel or google sheets compatibility.\n    2. Why is this exciting?\n    3. Use cases\n        1. Business data for excel\n        2. show database information without needing a web app\n2. Using the requests library\n    1. How to install\n    2. What is a request?\n        1. Get\n        2. Post\n        3. Briefly describe other request types\n    3. Why the Requests library?\n        1. Philosophy\n    4. How to form a request using the library\n        1. Url\n        2. Type\n        3. Return data\n        4. Life cycle of the request\n    5. Execute a request & use the received data\n        1. Get Request\n3. Stock API\n    1. Use iexfinance API\n        1. link to documentation\n    2. Grab 3 stocks\n        1. List them out by ticker, current price, and volume via iexfinance stock endpoint\n        2. Talk about how we can take this data a step further\n        3. format stock data\n4. Cryptos!\n    1. Use coinbase api\n        1. Provide link to documentation\n        2. Why use coinbase?\n            1. ease of use\n            2. good docs\n        3. How to get started\n            1. simple explanation\n            2. describe requirements\n        4. Grab some coins’ info\n            1. Get buy and sell price for BTC, ETH, and LTC\n            2. Talk about more advance functionality of the API to go further\n            3. Format coin data\n5. Tying all the data together to write to a file\n    1. Creating the files\n        1. stock file\n        2. coin file\n        3. quote file\n        4. accumulative file\n    2. create file and append\n        1. describe the difference between creating and appending functionality\n    3. Explain how writing to a file works\n6. Conclusion\n    1. include more resource references\n    2. reiterate why writing to a file is useful\n    3. end with a good note of understand why it is practical to know how to write to a file"
  },
  {
    "path": "python-write-to-file/resources.txt",
    "content": "Resources:\n\nhttps://www.pythonforbeginners.com/files/reading-and-writing-files-in-python\n\t- Reading and writing to txt file\n\t- Open a file\n\t- close a file\n\nhttps://www.w3schools.com/python/python_file_write.asp\n\t- Very basic understanding of writing to file\n\nhttps://www.datacamp.com/community/tutorials/reading-writing-files-python\n\t- Reading and writing files in Python tutorial\n\nhttps://github.com/coinbase/coinbase-python\n\t- Crypto currency API access\n\nhttps://pypi.org/project/googlefinance/\n\t- stock prices api through Google for python\n\n https://theysaidso.com/api/\n\t- for quotes"
  },
  {
    "path": "python-write-to-file/write-to-file-code/.gitignore",
    "content": "output/*\n!output/.gitkeep\nPipfile.lock"
  },
  {
    "path": "python-write-to-file/write-to-file-code/Pipfile",
    "content": "[[source]]\nname = \"pypi\"\nurl = \"https://pypi.org/simple\"\nverify_ssl = true\n\n[dev-packages]\n\n[packages]\nrequests = \"*\"\ndocstring = \"*\"\n\n[requires]\npython_version = \"3.6\"\n"
  },
  {
    "path": "python-write-to-file/write-to-file-code/checker.py",
    "content": "\"\"\"This file will write CSV files with\n   stock, crypto and other fun information!\"\"\"\nimport datetime\nimport os\nfrom iexfinance.stocks import Stock\nimport requests\n\n# Using theysaidso quote API, but\n# limited to 10 requests per hour.\n\n\n# quote_req = requests.get('http://quotes.rest/qod.json')\n# quote_resp = quote_req.json()\n\n# if 'contents' in quote_resp:\n#     quote = quote_resp['contents']['quotes'][0]['quote'] \\\n#           + \" - \" + quote_resp['contents']['quotes'][0]['author']\n# else:\n#     quote = \"Quote limit reached - no inspiration this time.\"\n\n# print(quote)\n\n\n\n# Using FavQs API to grab qotd.\n# Typically the quote changes per request.\n\nquote_req = requests.get('https://favqs.com/api/qotd')\nquote_resp = quote_req.json()\n\nquote = quote_resp['quote']['body'].replace(',', \"&#x2c;\") \\\n      + ' - ' + quote_resp['quote']['author']\nprint(quote)\n\n\n# Grab ETH and BTC prices in USD\n\nbtc_price_req = requests.get('https://api.coinbase.com/v2/prices/BTC-USD/buy')\neth_price_req = requests.get('https://api.coinbase.com/v2/prices/ETH-USD/buy')\nltc_price_req = requests.get('https://api.coinbase.com/v2/prices/LTC-USD/buy')\n\nbtc_price = btc_price_req.json()['data']['amount']\neth_price = eth_price_req.json()['data']['amount']\nltc_price = ltc_price_req.json()['data']['amount']\n\nprint('BTC: $' + btc_price \\\n     + ' & ETH: $' + eth_price \\\n     + ' & LTC: $' + ltc_price)\n\n# Grab our favorite stocks and format them to String.\n# The get_price() func returns a float\n# This can also be done using a list of stocks.\n# e.g. batch = Stock(['TSLA', 'AAPL', 'GOOGL'])\n\ntsla = Stock('TSLA')\naapl = Stock('AAPL')\ngoogl = Stock('GOOGL')\n\ntsla_price = str(tsla.get_price())\naapl_price = str(aapl.get_price())\ngoogl_price = str(googl.get_price())\n\nprint('TESLA: $' + tsla_price \\\n     + ' & APPLE: $' + aapl_price \\\n     + ' & GOOGLE: $' + googl_price)\n\n\n# Get today's date and format it!\n# One for master and the other for individual\n\ndate = datetime.datetime.today()\n\nformatted_file_date = date.strftime('%Y-%m-%d-%H-%M')\nformatted_master_date = date.strftime('%Y-%m-%d %H:%M:%S')\nformatted_output_date = date.strftime('%Y-%m-%d %H:%M')\n\n# newline helper and formatted strings\nnl = \"\\n\"\n\ncsv_header = \"TICKER,PRICE,DATE,QUOTE\" + nl\n\nformatted_stock_str = \"TSLA,\" + tsla_price + ',,' + nl \\\n                    + \"AAPL,\" + aapl_price + ',,' + nl \\\n                    + \"GOOGL,\" + googl_price + ',,' + nl\n\nformatted_crypto_str = \"BTC,\" + btc_price + ',,' + nl \\\n                     + \"ETH,\" + eth_price + ',,' + nl \\\n                     + \"LTC,\" + ltc_price + ',,' + nl\n\n\n# Write to the master CSV \"a\" (append) will create file\n# if not already available. Also, create\n# new files per script run to track individual\n\nmaster = open(\"output/master.csv\", \"a\")\n\nif os.stat(\"output/master.csv\").st_size == 0:\n    # only write header if file does not contain any information\n    master.write(csv_header)\n\nmaster.write(formatted_stock_str)\nmaster.write(formatted_crypto_str)\n# need a newline because we are appending\nmaster.write(',,' + formatted_master_date + ',' + quote + nl)\nmaster.close()\n\n# use formatted_file_date for kebab casing\noutput = open(\"output/individual/stock-crypto-check-\" + formatted_file_date + \".csv\", \"w\")\noutput.write(csv_header)\noutput.write(formatted_stock_str)\noutput.write(formatted_crypto_str)\noutput.write(',,' + formatted_output_date + ',' + quote)\noutput.close()\n"
  },
  {
    "path": "python-write-to-file/write-to-file-code/output/.gitkeep",
    "content": ""
  },
  {
    "path": "rekognition-ocr/.gitignore",
    "content": ".DS_Store\n.ipynb_checkpoints/\ndata/.DS_Store\ndata/images\t\ndata/\noutput/\n__pycache__/\npython/old/\npython/show_df.ipynb\npython/ocr_examples.py\npython/read_ocr_response.py\n!/data/\n"
  },
  {
    "path": "rekognition-ocr/Python/lib/__init__.py",
    "content": ""
  },
  {
    "path": "rekognition-ocr/Python/lib/mech_scrape.py",
    "content": "import os\nimport pandas as pd\nimport re\nimport requests\nfrom requests import get\n\nclass mechScraper(object):\n    \"\"\"\n        \n    \"\"\"\n\n    def __init__(self):\n        \"\"\"\n            Set initial class variables:\n            - mech data urls\n        \"\"\"\n\n        self.light_url = \"https://wiki.mwomercs.com/index.php?title=Light_Mechs&action=edit\"\n        self.medium_url = \"https://wiki.mwomercs.com/index.php?title=Medium_Mechs&action=edit\"\n        self.heavy_url = \"https://wiki.mwomercs.com/index.php?title=Heavy_Mechs&action=edit\"\n        self.assault_url = \"https://wiki.mwomercs.com/index.php?title=Assault_Mechs&action=edit\"\n        self.output_path = \"../output/\"\n\n    def get_mech_df(self, url=None):\n        \"\"\"\n            Scrapes page data from a passed URL to extract:\n            - mech names\n            - mech tonnage\n            - mech weight class\n            returns the data as a pandas dataframe\n        \"\"\"\n\n        #check if URL was supplied\n        if not url:\n            print(\"must pass URL\")\n            return\n        #scrape passed URL\n        print(\"scraping \" + url)\n        page = requests.get(url)\n        page_string = page.text\n\n        #set webscrape regex patterns\n        mech_obj = re.compile(r'===\\s[\\w\\s-]+[\\s()A-Z0-9-]*\\s===')\n        tonnage_obj = re.compile(r'Tonnage[\\']*:[\\s\\d+]+')\n        chassis_obj = re.compile(r'Var\\w\\wnts[\\']+:[\\sa-zA-Z0-9-,]+')\n        hero_obj = re.compile(r'[\\']+Hero[\\']+:[,\\s[()\\.\\'\\w-]+')\n        champ_obj = re.compile(r'[\\']+Champion[\\']+:\\s?[+\\s[()\\w-]+')\n        special_obj = re.compile(r'[\\']+Special[\\']+:\\s?[\\/,\\s[()\\w-]*')\n\n        #get matching name, tonnage, and variant list\n        mech_results = mech_obj.finditer(page_string)\n        tonnage_results = tonnage_obj.finditer(page_string)\n        chassis_results = chassis_obj.finditer(page_string)\n        hero_results = hero_obj.finditer(page_string)\n        champion_results = champ_obj.finditer(page_string)\n        special_results = special_obj.finditer(page_string)\n\n        #clean regex results to get desired text for each mech: name, weight, chassis variants\n        mech_names = [mech_name.group().replace(\"===\", \"\").strip() for mech_name in mech_results]\n        mech_weights = [mech_weight.group().replace(\"\\n\", \"\")[-3:].strip() for mech_weight in tonnage_results]\n        #get base chassis variants\n        #chassis variants is a list of lists\n        chassis_variants = [chassis.group().replace(\"\\n\",\"\")[12:].replace(\",\",\"\").split() for chassis in chassis_results]\n        \n\n        #clean scrape data for hero variants\n        hero_variants = [hero.group().replace(\"\\n\",\"\")[11:].strip() for hero in hero_results]\n        hero_names = [hero[:hero.find(\"(\")].strip() for hero in hero_variants]\n        #correct for missing single quote in web data\n        hero_names = [hero.replace(\"'''Special''\",\"\") for hero in hero_names]\n\n        for i in range(len(hero_variants)):\n            #fix Archer Tempest hero typo\n            if \"ACR-T\" in hero_variants[i]:\n                hero_variants[i] = hero_variants[i].replace(\"ACR-T\", \"ARC-T\")\n                print(\"Archer Tempest fixed \\n\\n\")\n            if \"(\" in hero_variants[i]:\n                #take from open parenthesis to the right\n                hero_variants[i] = hero_variants[i][hero_variants[i].index(\"(\"):].replace(\"'''Special'''\",\"\")\n            \n            if \",\" in hero_variants[i]:\n                hero_variants[i] = hero_variants[i].split(\",\")\n\n                for j in range(len(hero_variants[i])):\n                    if \"(\" in hero_variants[i][j]:\n                        hero_variants[i][j] = hero_variants[i][j][hero_variants[i][j].find(\"(\")+1:]\n                        hero_variants[i][j] = hero_variants[i][j].replace(\")\",\"\")                            \n            else:\n                hero_variants[i] = [hero_variants[i].replace(\"'''Special'''\",\"\").replace(\"(\",\"\").replace(\")\",\"\")]\n            \n        #process scrape data for champion variants\n        #convert to list from regex object\n        champion_variants = [champ.group() for champ in champion_results]\n        #split \"champion\" out of chassis designation\n        champion_variants = [champ[champ.index(\":\")+1:].strip().replace(\" \", \"\") for champ in champion_variants]\n        #remove blank entries\n        champion_variants = [champ for champ in champion_variants if champ != \"n\"]\n        \n        #process scrape data for special variants to remove clutter\n        #convert to list from regex\n        special_variants = [spec.group() for spec in special_results]\n        #remove \"special\" from chassis designation\n        special_variants = [spec[spec.index(\":\")+1:].strip().replace(\" \",\"\") for spec in special_variants]\n        special_list = [] #use list to hold all special variants as there are fewer than number of chassis\n        \n        for i in range(len(special_variants)):\n            if \",\" in special_variants[i]:\n                special_variants[i] = special_variants[i].split(\",\")\n            else:\n                special_variants[i] = [special_variants[i]]\n            #convert special variants to single list\n            for j in range(len(special_variants[i])):\n                special_list.append(special_variants[i][j])\n        \n        #Fix errors in screen pull data\n        for i in range(len(special_list)):\n            if special_list[i] == \"ACR-2R(S)\":\n                print(\"Archer special fixed\")\n                special_list[i] = \"ARC-2R(S)\"\n            if special_list[i] == \"SMNM-F(L)SMN-M(L)\":\n                special_list[i] = \"SMNM-F(L)\"\n                special_list.append(\"SMN-M(L)\")\n                print(\"Fixing SMNM-F(L) and SMNM-F(L)\")\n\n        for i in range(len(hero_names)):\n            if hero_names[i] == \"Wrat\":\n                hero_names[i] = \"Wrath\"\n                print(hero_names[i])\n            if hero_names[i] == \"Hi Ther\":\n                hero_names[i] = \"Hi There\"\n\n        for i in range(len(hero_variants)):\n            if hero_variants[i][0] == \"HMN-PK\":\n                hero_variants[i][0] = \"HMN-PA\"\n                print(\"Fixing HMN-PK: \", hero_variants[i])\n            if hero_variants[i][0] == \"EBJ-ESP\":\n                hero_variants[i][0] = \"EBJ-EC\"\n            if hero_variants[i][0] == \"MKII-DS\":\n                hero_variants[i][0] = \"MCII-DS\"\n\n        print()\n\n        #FIXME: fafnir wrath is missing h in hero name\n        #convert lists to dict as preprocess for converstion to dataframe\n        mech_dict = {\n                        \"mechs\":mech_names,\n                        \"tonnage\":mech_weights,\n                        \"variants\":chassis_variants,\n                        \"hero_chassis\":hero_variants,\n                        \"hero_names\":hero_names\n                    }\n\n        mech_df = pd.DataFrame(mech_dict)\n        \n        #match special variants to base chassis to get weight data\n        #use 3 letter chassis designation as match key\n        mech_df[\"special_variants\"] = \"\"\n        \n        for index, row in mech_df.iterrows():\n            add_specials = []\n            for i in range(len(special_list)):\n\n                #check for clan IIC model (disambiguation from inner sphere variants)\n                if \"IIC\" in row[\"variants\"][0]:\n                    clan = True\n                else:\n                    clan = False\n\n                mech_letters = row[\"variants\"][0][:3].upper()\n                if clan:\n                    if mech_letters == special_list[i][:3].upper() and \"IIC\" in special_list[i]:\n                        add_specials.append(special_list[i])\n                else:\n                    if mech_letters == special_list[i][:3].upper() and \"IIC\" not in special_list[i]:\n                        add_specials.append(special_list[i])\n\n            mech_df.at[index, \"special_variants\"] = add_specials\n        #match champion variants to base chassis to get weight data\n        #use 3 letter chassis designation as match key\n        mech_df[\"champion_variants\"] = \"\"\n        for index, row in mech_df.iterrows():\n            add_champions = []\n            for i in range(len(champion_variants)):\n\n                #check for clan IIC model (disambiguation from inner sphere variants)\n                if \"IIC\" in row[\"variants\"][0]:\n                    clan = True\n                else:\n                    clan = False\n\n                mech_letters = row[\"variants\"][0][:3].upper()\n                if clan:\n                    if mech_letters == champion_variants[i][:3].upper() and \"IIC\" in champion_variants[i]:\n                        add_specials.append(special_list[i])\n                else:\n                    if mech_letters == champion_variants[i][:3].upper() and \"IIC\" not in champion_variants[i]:\n                        add_champions.append(champion_variants[i])\n            mech_df.at[index, \"champion_variants\"] = add_champions\n\n        mech_df = mech_df[[\"mechs\", \"tonnage\",\"hero_names\", \"hero_chassis\", \"variants\",\n                           \"special_variants\", \"champion_variants\"]]\n\n        return mech_df\n\n            \n    def save_data(self, data, weight_class, output_path=None):\n        \"\"\"\n            Writes a pandas df to disc.\n            Uses the weight class as a name for pipe-delimited text file.\n        \"\"\"\n        if not output_path:\n            output_path = self.output_path\n        if not os.path.exists(output_path):\n            os.makedirs(output_path)\n        \n        print(\"saving data for \" + weight_class)\n        data.to_csv(output_path + weight_class + \".txt\", sep=\"|\", index=False)\n\n\n    def main(self):\n        \"\"\"\n            Scrapes URLs for mech data and compiles them to \n            pandas dataframes before writing them to disk.\n        \"\"\"\n\n        assault_mech_df = self.get_mech_df(url=self.assault_url)\n        heavy_mech_df = self.get_mech_df(url=self.heavy_url)\n        medium_mech_df = self.get_mech_df(url=self.medium_url)\n        light_mech_df = self.get_mech_df(url=self.light_url)\n        all_weights_df = pd.concat([assault_mech_df, heavy_mech_df, medium_mech_df, \n                                    light_mech_df])\n\n        self.save_data(assault_mech_df, \"assault\")\n        self.save_data(heavy_mech_df, \"heavy\")\n        self.save_data(medium_mech_df, \"medium\")\n        self.save_data(light_mech_df, \"light\")\n        self.save_data(all_weights_df, \"all_weights\")\n        #get maximum new columns needed for splitting variants\n        max_cols = all_weights_df.variants.apply(lambda x: len(x)).max()\n        melt_cols = []\n\n        for i in range(max_cols):\n            all_weights_df[\"var_\"+str(i)] = \"\"\n            melt_cols.append(\"var_\"+str(i))\n\n        variant_weights_df = pd.DataFrame()\n        for index, row in all_weights_df.iterrows():\n            for i in range(len(row[\"variants\"])):\n                #add each variant to variant weights as a row with mech, tonnage, variant\n                new_row_dict = {\n                                \"mech_name\":row[\"mechs\"],\n                                \"tonnage\":row[\"tonnage\"],\n                                \"variant\":row[\"variants\"][i].upper()\n                                }\n                new_row_df = pd.DataFrame(new_row_dict, index=[0])\n                variant_weights_df = pd.concat([variant_weights_df, new_row_df])\n\n            for i in range(len(row[\"hero_chassis\"])):\n                new_row_dict = {\n                                \"mech_name\":row[\"hero_names\"],\n                                \"tonnage\":row[\"tonnage\"],\n                                \"variant\":row[\"hero_chassis\"][i].upper()\n                                }\n                new_row_df = pd.DataFrame(new_row_dict, index=[0])\n                variant_weights_df = pd.concat([variant_weights_df, new_row_df])\n\n\n            for i in range(len(row[\"special_variants\"])):\n                new_row_dict = {\n                                \"mech_name\":row[\"mechs\"],\n                                \"tonnage\":row[\"tonnage\"],\n                                \"variant\":row[\"special_variants\"][i].upper()\n                                }\n                new_row_df = pd.DataFrame(new_row_dict, index=[0])\n                variant_weights_df = pd.concat([variant_weights_df, new_row_df])  \n\n            #add champion variants by matching on \n            for i in range(len(row[\"champion_variants\"])):\n                new_row_dict = {\n                                \"mech_name\":row[\"mechs\"],\n                                \"tonnage\":row[\"tonnage\"],\n                                \"variant\":row[\"champion_variants\"][i].upper()\n                                }\n                new_row_df = pd.DataFrame(new_row_dict, index=[0])\n                variant_weights_df = pd.concat([variant_weights_df, new_row_df])\n        #remove duplicate rows \n        variant_weights_df = variant_weights_df[variant_weights_df.duplicated(keep=\"first\")==False]\n        self.save_data(variant_weights_df, \"variant_weights\")\n\nif __name__ ==\"__main__\":\n    mechScraper().main()\n"
  },
  {
    "path": "rekognition-ocr/Python/lib/mwo_data_utils.py",
    "content": "import os\nimport pandas as pd\n\nclass mwo_data_engine(object):\n\t\n\tdef __init__(self):\n\t\t\"\"\"\n\t\t\"\"\"\n\t\tself.mech_info_csv = \"../output/variant_weights.txt\"\n\t\tself.score_df_path = \"../output/df_from_img/\"\n\t\tself.clean_df_path = \"../output/cleaned_df_from_img/\"\n\t\tself.no_name_clean_path = \"../output/no_name_data/\"\n\t\t\n\t\tif not os.path.exists(self.no_name_clean_path):\n\t\t\tos.makedirs(self.no_name_clean_path)\n\n\n\tdef combine_scores_with_scrape(self, scores_df, mech_info_df):\n\t\t\"\"\"\n\t\tCombines screenshot match data with mech variant, weightclass, and chassis web scrape\n\t\t\"\"\"\n\t\tif mech_info_df is None:\n\t\t\tmech_info_df = pd.read_csv(self.mech_info_csv, sep=\"|\")\n\n\t\t#merge datasets to get tonnage, and weight class for each mech\n\t\tscores_and_weights = scores_df.merge(mech_info_df, how=\"left\", left_on=\"mech\", right_on=\"variant\")\n\t\treturn scores_and_weights\n\n\tdef clean_mech_variants(self, scores_df):\n\t\t\"\"\"\n\t\tFixes bad OCR results in the mech name column\n\n\t\t\"\"\"\n\t\t#use dictionary to map bad read to actual\n\t\tprint(\"pre-changes \\n\", scores_df)\n\t\tmech_name_map = {\n\t\t\"-BW\":\"WHM-BW\",\n\t\t\"KGC-O00B\":\"KGC-000B\",\n\t\t\"UM- -R68(L)\":\"UM-R68(L)\",\n\t\t\"CTF-3 F-3D(C)\":\"CTF-3D(C)\",\n\t\t\"STK-3F(C) STK-3\":\"STK-3F(C)\",\n\t\t\"KGC-000(L) KGC-O\": \"KGC-000(L)\",\n\t\t\"DWF-PRIMI\":\"DWF-PRIME\",\n\t\t\"CRB- RB-27(R)\":\"CRB-27(R)\",\n\t\t\"ACW-PRIMI\":\"ACW-PRIME\",\n\t\t\"ACH-PRIME H-PRIME\":\"ACH-PRIME\",\n\t\t\"MAD-I1C-A\":\"MAD-IIC-A\",\n\t\t\"KFX- FX-G(L)\":\"KFX-G(L)\",\n\t\t\"MAL-1R(R) MAL-\":\"MAL-1R(R)\",\n\t\t\"HMN-PRIM\":\"HMN-PRIME\",\n\t\t\"TNS- NS-4S(S)\":\"TNS-4S(S)\",\n\t\t\"VA-PRIME\":\"NVA-PRIME\"\n\t\t}\n\n\t\t#test with pandas map to column\n\t\tfor mech in mech_name_map.keys():\n\t\t\tif mech in list(scores_df.mech):\n\t\t\t\tscores_df.at[scores_df.index[scores_df.mech==mech], \"mech\"] = mech_name_map[mech]\n\n\t\tnumber_cols = [\"kills\", \"assists\", \"damage\", \"ping\"]\n\t\tfor col in number_cols:\n\t\t\tscores_df[col] = scores_df[col].apply(lambda x: str(x).replace(\"O\", \"0\"))\n\t\t\tscores_df[col] = scores_df[col].apply(lambda x: str(x).replace(\"nan\", \"0\"))\n\t\t\tscores_df[col] = scores_df[col].apply(lambda x: x.split(\" \")[-1])\n\t\t#general rule: last entry in OCR number is correct if multiples are supplied\n\t\t#multiples occur with spaces, split on space and take last in list\n\t\t\n\t\treturn scores_df\n\n\n\tdef clean_20171118200711_1(self):\n\t\t\"\"\"\n\t\tCleans the image 20171118200711_1.txt\n\t\tThese modifications are to correct errors in the OCR return that cannot be done to all images \n\t\t\"\"\"\n\t\tbad_df = pd.read_csv(self.score_df_path+\"20171118200711_1.txt\", sep=\"|\")\n\t\tbad_df = self.clean_mech_variants(bad_df)\n\t\tbad_df.at[18, \"mech\"] = \"TBR-PRIME\" #change -PRIME to TBR-PRIME\n\t\tbad_df.at[0, \"kills\"] = 4 #change row 0 kills to 4\n\t\tbad_df.at[1, \"kills\"] = 2 #change row 1 kills to 2\n\t\tbad_df.at[3, \"kills\"] = 2 #change row 3 kills to 2\n\t\t#fill NAN with 0\n\t\tbad_df.fillna(0, inplace=True)\n\t\tbad_df.to_csv(self.clean_df_path+\"20171118200711_1.csv\", index=False, sep=\"|\")\n\n\n\tdef clean_20171118202707_1(self):\n\t\t\"\"\"\n\t\t\"\"\"\n\t\tbad_df = pd.read_csv(self.score_df_path+\"20171118202707_1.txt\", sep = \"|\")\n\t\tbad_df = self.clean_mech_variants(bad_df)\n\t\tbad_df.at[3, \"kills\"] = 1 #change row 3 kills to 1\n\t\tbad_df.at[22, \"kills\"] = 1 #change row 22 kills to 1\n\t\tbad_df.at[23, \"kills\"] = 1 #change row 23 kills to 1\n\t\tbad_df.at[0, \"assists\"] = 1 #change row 0 assists to 1\n\t\tbad_df.at[2, \"assists\"] = 1 #change row 2 assists to 1\n\t\tbad_df.at[4, \"assists\"] = 1 #change row 4 assists to 1\n\t\tbad_df.at[5, \"assists\"] = 1 #change row 5 assists to 1\n\t\tbad_df.at[6, \"assists\"] = 1 #change row 6 assists to 1\n\t\tbad_df.at[10, \"assists\"] = 1 #change row 10 assists to 1\n\t\tbad_df.at[11, \"assists\"] = 1 #change row 11 assists to 1\n\t\tbad_df.at[16, \"assists\"] = 1 #change row 16 assists to 1\n\t\tbad_df.at[18, \"assists\"] = 1 #change row 18 assists to 1\n\t\tbad_df.at[15, \"mech\"] = \"TNS-5P\" #set row 15 TNS-5 to TNS 5P\n\t\tbad_df.at[2, \"mech\"] = \"BJ-1DC\" #set row 2 to BJ-1DC\n\t\treturn bad_df\n\n\tdef clean_20171118203637_1(self):\n\t\t\"\"\"\n\t\t\"\"\"\n\n\t\tbad_df = pd.read_csv(self.score_df_path+\"20171118203637_1.txt\", sep=\"|\")\n\t\tbad_df = self.clean_mech_variants(bad_df)\n\t\tbad_df.at[22, \"mech\"] = \"TNS-5S\" #set row 22 mech to TNS-5S\n\t\tbad_df.at[1, \"kills\"] = 1 #set row 1 kills to 1\n\t\tbad_df.at[3, \"kills\"] = 1 #set row 4 kills to 1\n\t\tbad_df.at[3, \"assists\"] = 5 #set row 4 assists to 5\n\t\tbad_df.at[4, \"assists\"] = 1\n\t\tbad_df.at[15, \"assists\"] = 1 \n\t\treturn bad_df\n\n\tdef clean_20171118204451_1(self):\n\t\t\"\"\"\n\t\t\"\"\"\n\t\tbad_df = pd.read_csv(self.score_df_path+\"20171118204451_1.txt\", sep=\"|\")\n\t\tbad_df = self.clean_mech_variants(bad_df)\n\t\tbad_df.at[22, \"kills\"] = 1\n\t\tbad_df.at[8, \"assists\"] = 4\n\t\tbad_df.at[10, \"assists\"] = 4\n\t\tbad_df.at[11, \"assists\"] = 1\n\t\tbad_df.at[12, \"assists\"] = 1\n\t\tbad_df.at[13, \"assists\"] = 1\n\t\tbad_df.at[14, \"assists\"] = 1\n\t\tbad_df.at[17, \"assists\"] = 1\n\t\tbad_df.at[18, \"assists\"] = 1\n\t\tbad_df.at[19, \"assists\"] = 1\t\t\n\t\tbad_df.at[20, \"assists\"] = 1\n\t\tbad_df.at[21, \"assists\"] = 1\n\t\tbad_df.at[23, \"assists\"] = 1\t\n\t\tbad_df.at[10, \"mech\"] = \"NVA-PRIME\"\t\n\t\tbad_df.at[8, \"mech\"] = \"NVA-PRIME\"\n\t\treturn bad_df"
  },
  {
    "path": "rekognition-ocr/Python/lib/mwo_image_slicer.py",
    "content": "import io\nimport os\nfrom os import listdir\nfrom os.path import isfile, join\n\nimport boto3\nimport pandas as pd\nfrom PIL import Image, ImageFilter\nimport requests\n\n\nclass mwoImageSlicer(object):\n\t\"\"\"\n\n\t\"\"\"\n\n\tdef __init__(self, boto_client):\n\t\t\"\"\"\n\n\t\t\"\"\"\n\t\tself.boto_client = boto_client\n\t\tself.image_folder = \"../data/images/\"\n\t\tself.download_folder = \"../data/images/\"\n\t\tself.data_save = \"../output/df_from_img/\"\n\n\t\t#horizontal slicing dimensions\n\t\tself.score_1680_1050 = [(565, 205, 1380, 230),\n                                (565, 230, 1380, 255),\n                                (565, 253, 1380, 280),\n                                (565, 275, 1380, 300),\n                                (565, 303, 1380, 325),\n                                (565, 328, 1380, 350),\n                                (565, 350, 1380, 372),\n                                (565, 373, 1380, 395),\n                                (565, 403, 1380, 425),\n                                (565, 425, 1380, 450),\n                                (565, 448, 1380, 470),\n                                (565, 468, 1380, 492),\n                                (565, 503, 1380, 525),\n                                (565, 525, 1380, 549),\n                                (565, 548, 1380, 572),\n                                (565, 570, 1380, 595),\n                                (565, 600, 1380, 620),\n                                (565, 623, 1380, 645),\n                                (565, 645, 1380, 665),\n                                (565, 667, 1380, 689),\n                                (565, 696, 1380, 719),\n                                (565, 718, 1380, 740),\n                                (565, 742, 1380, 762),\n                                (565, 762, 1380, 789)]\n\n        #Vertical slicing dimensions\n        #these are the vertical coordinates for 1680 by 1050 resolution\n        #(x_start, y_start, x_end, y_end)\n        #FIXME: this won't work as the actual cropping is done from relative areas on non-standard image sizes\n\t\tself.score_parts_1680_1050 = {\n\t\t\t\t\t\t\t        \t\"clan_area\":(0, 0, 915, 1050),\n\t\t\t\t\t\t\t        \t\"name_area\":(50, 0, 1130, 1050),\n\t\t\t\t\t\t\t        \t\"mech_area\":(265, 0, 1220, 1050),\n\t\t\t\t\t\t\t        \t\"status_area\":(390, 0, 1330, 1050),\n\t\t\t\t\t\t\t        \t\"score_area\":(500, 0, 1430, 1050),\n\t\t\t\t\t\t\t        \t\"kills_area\":(590, 0, 1505, 1050),\n\t\t\t\t\t\t\t        \t\"assist_area\":(650, 0, 1560, 1050),\n\t\t\t\t\t\t\t        \t\"dmg_area\":(710, 0, 1640, 1050),\n\t\t\t\t\t\t\t        \t\"ping_area\":(760, 0, 1680, 1050)\n\t\t\t\t\t\t\t         }\n\n\tdef main(self, redo=False):\n\t\t\"\"\"\n\t\tCreates a list of all images in a directory\n\t\tSlices the images into cells\n\t\tCalls AWS Rekognition to get text for each image cell\n\t\tCompiles the cells into a dataframe\n\t\tSaves the dataframe\n\n\t\tSetting redo=True will repeat the process for images that have already been converted to dataframes\n\t\t\"\"\"\n\t\t#get list of images from directory\n\t\timg_list = self.get_files_in_folder()\n\t\tprint(len(img_list), \"images in folder\")\n\t\tif not redo:\n\t\t\tdf_files = self.get_files_in_folder(ext=\"txt\", folder=\"../output/df_from_img/\")\n\t\t\tdf_files = [file[:-4] for file in df_files]\n\t\t\timg_list = [score for score in img_list if score[:-4] not in df_files]\n\t\t\tprint(len(img_list), \"remaining images to process\")\n\t\t#loop over images\n\t\tfor mwo_img in img_list:\n\t\t\t#open img with PIL\n\t\t\timg = self.load_image(mwo_img)\n\t\t\t#check image resolution\n\t\t\tif img.size != (1680, 1050):\n\t\t\t\tprint(\"resizing image\", mwo_img)\n\t\t\t\t#resize if needed, this is done to match the slicing pattern\n\t\t\t\timg = self.resize_image(img, new_width=1680)\n\n\t\t\t#convert to dataframe\n\t\t\tprint(\"converting to dataframe {} of {}\".format(img_list.index(mwo_img), len(img_list)))\n\t\t\timg_df = self.img_to_dataframe(img, mwo_img, save_df=True)\n\t\t\t\n\n\tdef img_to_dataframe_h(self, img, save_img=False, resize=True, thresh=False, save_df=False, \n\t\t\t\t\t\tsave_name=\"test_df.txt\", filepath=None):\n\t\t\"\"\"\n\t\tUses AWS Rekognition to parse images from MWO screenshots\n\t\tScreenshots are split horizontal components (1 per player0 and resized before sending\n\t\tThe resulting text is assembled into a dataframe that matches the MWO scorecard\n\t\t\n\t\timg is the image to be processed\n\t\tSetting thresh=True will greyscale by calling the grey_min_max() function to threshold each image before sending to AWS\n\t\tSetting save_df=True saves the resulting dataframe as a pipe-delimited text file\n\t\tSetting save_img=True will save the image slices to ../data/test_data/\n\t\t\"\"\"\n\t\tmatch_dict = {\n\t\t\t\t\t\t\"clan\":[],\n\t\t\t\t\t\t\"name\":[],\n\t            \t\t\"mech\":[],\n\t            \t\t\"status\":[],\n\t            \t\t\"score\":[],\n\t            \t\t\"kills\":[],\n\t            \t\t\"assists\":[],\n\t            \t\t\"damage\":[], \n\t            \t\t\"ping\":[]\n\t\t}\n\n\t\tprint(\"horizontal slicing\")\n\t\th_slices = self.slice_image_horizontal(img)\n\t\t\n\t\t#save, resize, and threshold images if option was selected\n\t\tfor i in range(len(h_slices)):\n\t\t\tif thresh: #threshold images prior to OCR\n\t\t\t\t\th_slices[i] = self.grey_min_max(h_slices[i])\n\t\t\t\t\t\n\t\t\t#resizing images prior to OCR\n\t\t\tif resize:\n\t\t\t\th_slices[i] = self.resize_image(h_slices[i], mode=\"height\")\n\t\t\t\n\t\t\tif save_img:\n\t\t\t\t\th_slices[i].save(\"../data/test_data/\"+\"h_slice\"+str(i)+\"_.jpg\")\n\t\t\t\n\t\tfor i in range(len(h_slices)):\n\t\t\t#get OCR for each image in player slice\n\t\t\tplayer_row_ocr_resp = self.get_image_ocr(img=h_slices[i], full_resp=True, size=False, show=False)\n\t\t\t\n\t\t\t#get words from OCR reponse JSON\n\t\t\ttext_words = []\n\t\t\tfor text_detected in player_row_ocr_resp[\"TextDetections\"]:\n\t\t\t\t#Use only \"Word\" data from the TextDetections object\n\t\t\t\tif text_detected[\"Type\"] == \"WORD\":\n\t\t\t\t\ttext_words.append(text_detected[\"DetectedText\"]) #list of words that should have positional alignment to the match_dict\n\t\t\tprint()\n\t\t\tprint(text_words)\n\t\t\tif len(text_words) == 9:\n\t\t\t\tmatch_dict[\"clan\"].append(text_words[0])\n\t\t\t\tmatch_dict[\"name\"].append(text_words[1])\n\t\t\t\tmatch_dict[\"mech\"].append(text_words[2])\n\t\t\t\tmatch_dict[\"status\"].append(text_words[3])\n\t\t\t\tmatch_dict[\"score\"].append(text_words[4])\n\t\t\t\tmatch_dict[\"kills\"].append(text_words[5])\n\t\t\t\tmatch_dict[\"assists\"].append(text_words[6])\n\t\t\t\tmatch_dict[\"damage\"].append(text_words[7])\n\t\t\t\tmatch_dict[\"ping\"].append(text_words[8])\n\t\t\t\t\n\t\t\telif len(text_words) == 8:\n\t\t\t\tprint(\"incorrect number of words detected, attempting to omit clan and reposition\")\n\t\t\t\t#omit clan data from match_dict as it is not required for a player to have a clan\n\t\t\t\tmatch_dict[\"clan\"].append(\"NAN\")\n\t\t\t\tmatch_dict[\"name\"].append(text_words[0])\n\t\t\t\tmatch_dict[\"mech\"].append(text_words[1])\n\t\t\t\tmatch_dict[\"status\"].append(text_words[2])\n\t\t\t\tmatch_dict[\"score\"].append(text_words[3])\n\t\t\t\tmatch_dict[\"kills\"].append(text_words[4])\n\t\t\t\tmatch_dict[\"assists\"].append(text_words[5])\n\t\t\t\tmatch_dict[\"damage\"].append(text_words[6])\n\t\t\t\tmatch_dict[\"ping\"].append(text_words[7])\n\t\t\telif len(text_words) == 10:\n\t\t\t\tprint(\"incorrect number of words detected, attempting to combine player name pieces\")\n\t\t\t\t#combine 2nd and 3rd items. Assumption is that player name contained a space\n\t\t\t\tmatch_dict[\"clan\"].append(text_words[0])\n\t\t\t\tmatch_dict[\"name\"].append(text_words[1]+text_words[2])\n\t\t\t\tmatch_dict[\"mech\"].append(text_words[3])\n\t\t\t\tmatch_dict[\"status\"].append(text_words[4])\n\t\t\t\tmatch_dict[\"score\"].append(text_words[5])\n\t\t\t\tmatch_dict[\"kills\"].append(text_words[6])\n\t\t\t\tmatch_dict[\"assists\"].append(text_words[7])\n\t\t\t\tmatch_dict[\"damage\"].append(text_words[8])\n\t\t\t\tmatch_dict[\"ping\"].append(text_words[9])\n\t\t\telif len(text_words) == 11:\n\t\t\t\tprint(\"incorrect number of words detected, attempting to combine player name pieces\")\n\t\t\t\t#combine 2nd and 3rd items. Assumption is that player name contained a space\n\t\t\t\tmatch_dict[\"clan\"].append(text_words[0])\n\t\t\t\tmatch_dict[\"name\"].append(text_words[1]+text_words[2]+text_words[3])\n\t\t\t\tmatch_dict[\"mech\"].append(text_words[4])\n\t\t\t\tmatch_dict[\"status\"].append(text_words[5])\n\t\t\t\tmatch_dict[\"score\"].append(text_words[6])\n\t\t\t\tmatch_dict[\"kills\"].append(text_words[7])\n\t\t\t\tmatch_dict[\"assists\"].append(text_words[8])\n\t\t\t\tmatch_dict[\"damage\"].append(text_words[9])\n\t\t\t\tmatch_dict[\"ping\"].append(text_words[10])\n\n\t\t\telse:\n\t\t\t\tprint(\"text count does not match pattern, not adding to DF\")\n\t\t\t\tprint(text_words)\n\n\t\tprint(\"converting to dataframe\")\n\t\t#print(match_dict)\n\t\tmatch_df = pd.DataFrame.from_dict(match_dict)\n\t\tmatch_df = match_df[[\"clan\", \"name\", \"mech\", \"status\", \"score\", \"kills\", \n\t\t\t\t\t\t\t \"assists\", \"damage\", \"ping\"]]\n\t\tif save_df:\n\t\t\tprint(\"saving dataframe to\", filepath, save_name)\n\t\t\tself.save_dataframe(match_df, save_name, filepath)\n\n\t\treturn match_df\n\n\n\tdef img_to_dataframe(self, img, save_img=False, resize=True, thresh=False, save_df=False, \n\t\tfilepath=\"../output/df_from_img/\"):\n\t\t\"\"\"\n\t\tUses AWS Rekognition to parse images from MWO screenshots\n\t\tScreenshots are split into single element components and resized before sending\n\t\tThe resulting text is assembled into a dataframe that matches the MWO scorecard\n\n\t\timg is the image to be processed\n\t\tSetting thresh=True will greyscale by calling the grey_min_max() function to threshold each image before sending to AWS\n\t\tSetting save_df=True saves the resulting dataframe as a pipe-delimited text file\n\t\tSetting save_img=True will save the image slices to ../data/test_data/\n\t\t\n\t\t\"\"\"\n\t\tmatch_dict = {\n\t\t\t\t\t\t\"clan\":[],\n\t\t\t\t\t\t\"name\":[],\n\t            \t\t\"mech\":[],\n\t            \t\t\"status\":[],\n\t            \t\t\"score\":[],\n\t            \t\t\"kills\":[],\n\t            \t\t\"assists\":[],\n\t            \t\t\"damage\":[], \n\t            \t\t\"ping\":[]\n\t\t}\n\t\tprint(\"horizontal slicing\")\n\t\th_slices = self.slice_image_horizontal(img)\n\t\tprint(\"vertical slicing\")\n\t\tfor i in range(len(h_slices)):\n\t\t\t\n\t\t\tplayer_row_imgs = self.slice_image_vertical(h_slices[i])\n\t\t\t\n\t\t\tif save_img:\n\t\t\t\tfor j in range(len(player_row_imgs)):\n\t\t\t\t\tplayer_row_imgs[j].save(\"../data/test_data/\"+\"player_img\"+str(j)+\"_\"+str(i)+\".jpg\")\n\t\t\t#resize images prior to OCR\n\t\t\tif resize:\n\t\t\t\tfor j in range(len(player_row_imgs)):\n\t\t\t\t\tplayer_row_imgs[j] = self.resize_image(player_row_imgs[j], mode=\"width\")\n\n\t\t\t#threshold images prior to OCR\n\t\t\tif thresh:\n\t\t\t\tfor j in range(len(player_row_imgs)):\n\t\t\t\t\tplayer_row_imgs[j] = self.grey_min_max(player_row_imgs[j])\n\n\t\t\t#get OCR for each image in player slice\n\t\t\tprint(\"OCR runnin on slice {} of {}\".format(i, len(h_slices)))\n\t\t\tmatch_dict[\"clan\"].append(self.get_image_ocr(player_row_imgs[0])[\"text\"])\n\t\t\tmatch_dict[\"name\"].append(self.get_image_ocr(player_row_imgs[1])[\"text\"])\n\t\t\tmatch_dict[\"mech\"].append(self.get_image_ocr(player_row_imgs[2])[\"text\"])\n\t\t\t#threshing the status column removes \"dead\" entries as those are shown in red\n\t\t\tmatch_dict[\"status\"].append(self.get_image_ocr(player_row_imgs[3])[\"text\"])\n\t\t\tmatch_dict[\"score\"].append(self.get_image_ocr(player_row_imgs[4])[\"text\"])\n\t\t\tmatch_dict[\"kills\"].append(self.get_image_ocr(player_row_imgs[5])[\"text\"])\n\t\t\tmatch_dict[\"assists\"].append(self.get_image_ocr(player_row_imgs[6])[\"text\"])\n\t\t\tmatch_dict[\"damage\"].append(self.get_image_ocr(player_row_imgs[7])[\"text\"])\n\t\t\tmatch_dict[\"ping\"].append(self.get_image_ocr(player_row_imgs[8])[\"text\"])\n\n\t\tprint(\"converting to dataframe\")\n\t\tmatch_df = pd.DataFrame.from_dict(match_dict)\n\t\tmatch_df = match_df[[\"clan\", \"name\", \"mech\", \"status\", \"score\", \"kills\", \n\t\t\t\t\t\t\t \"assists\", \"damage\", \"ping\"]]\n\t\tif save_df:\n\t\t\tprint(\"saving dataframe to \", filepath, self.image_name)\n\t\t\tself.save_dataframe(match_df, file_name=self.image_name, file_path=filepath)\n\n\t\treturn match_df\n\n\n\tdef save_dataframe(self, dataframe, file_name, file_path):\n\t\t\"\"\"\n\t\tSaves a dataframe to pipe-delimited text format\n\t\t\"\"\"\n\n\t\tif not file_path:\n\t\t\tfile_path = self.data_save\n\n\t\tif not os.path.exists(file_path):\n\t\t\tos.makedirs(file_path)\n\t\tdataframe.to_csv(file_path+file_name[:-4] + \".txt\", sep=\"|\", index=False)\n\n\n\tdef grey_min_max(self, img, min_grey=185):\n\t\t\"\"\"\n\t\tSets all pixels below min_grey to black\n\t\tSets all pixesl above min_grey to white\n\t\t\"\"\"\n\n\t\timg = img.convert(\"L\")\n\t\timg_px = img.load()\n\t\tfor i in range(img.size[1]):\n\t\t\tfor j in range(img.size[0]):\n\t\t\t\tif img_px[j,i] < min_grey:\n\t\t\t\t\timg_px[j,i] = 0 \n\t\t\t\telse:\n\t\t\t\t\timg_px[j,i] = 255\n\t\t\timg.save(\"../data/test_data/testpx.jpg\")\n\t\treturn img\n\n\n\tdef get_image_ocr(self, img, full_resp=False, show=False, size=False):\n\t\t\"\"\"\n\t\tUses AWS Rekognition to get the text value from an image slice of a MWO screenshot\n\t\tThis function only returns a single word (it was designed for getting text resonse from a single cell of an image)\n\t\t\"\"\"\n\t\tif show:\n\t\t\timg.show()\n\t\tif size:\n\t\t\tprint(img.size)\n\t\t#convert image to byte array for use with AWS Rekognition API\n\t\timg_byte_arr = io.BytesIO()\n\t\timg.save(img_byte_arr, format='PNG')\n\t\timg_byte_arr = img_byte_arr.getvalue()\n\n\t\tresponse = self.boto_client.detect_text(Image={'Bytes': img_byte_arr})\n\t\t#limit return to first text read and confidence\n\t\t\n\t\ttry:\n\t\t\tresp_text = {\n\t\t\t\t\t\t\t\"text\":response['TextDetections'][0]['DetectedText'],\n\t\t\t\t\t\t\t\"confidence\":response['TextDetections'][0]['Confidence']\n\t\t\t\t\t\t}\n\t\texcept:\n\t\t\t#provide data for empty images\n\t\t\tresp_text = {\n\t\t\t\t\t\t\t\"text\":\"\",\n\t\t\t\t\t\t\t\"confidence\":0\n\t\t\t}\n\t\tif full_resp:\n\t\t\treturn response\n\t\telse:\n\t\t\treturn resp_text\n\n\n\tdef download_images(self, url, download_folder):\n\t\t\"\"\"\n\t\tThis does not currently function\n\t\tDownloads files from a target site\n\t\t\"\"\"\n\n\t\tgrid_url = \"https://steamcommunity.com/profiles/76561198090389241/screenshots/?appid=342200&sort=newestfirst&browsefilter=myfiles&view=grid\"\n#\t\t\t\t    https://steamcommunity.com/profiles/76561198090389241/screenshots/?p=2&appid=342200&sort=newestfirst&browsefilter=myfiles&view=grid&privacy=14\n\n\t\tsteam_mwo_url = \"https://steamcommunity.com/profiles/76561198090389241/screenshots/?appid=342200\"\n\t\t#steam image url:\n\t\t#https://steamuserimages-a.akamaihd.net/ugc/949601342893592988/26AACEA63DE6B2EB173C5FABF5766EE390BA31AA/\n\t\t#https://steamcommunity.com/sharedfiles/filedetails/?id=1664039570\n\n\n\tdef show_image(self, img, folder=\"../data/images/\"):\n\t\t\"\"\"\n\t\tUses the PIL library to display an image\n\t\t\"\"\"\n\t\tprint(type(img))\n\n\t\tif type(img) == str:\n\t\t\timg = Image.open(folder+img)\n\n\t\timg.show()\n\n\n\tdef get_resolution(self, img_file, folder=\"../data/images/\", display=False):\n\t\t\"\"\"\n\t\tReturns the weidth and height of an image\n\t\t\"\"\"\n\n\t\timg = Image.open(folder+img_file)\n\t\tif display:\n\t\t\timg.show()\n\t\treturn img.size\n\n\n\tdef get_files_in_folder(self, ext=\"jpg\", folder=\"../data/images/\"):\n\t\t\"\"\"\n\t\tReturns a list of files matching a passed extension in a specified folder \n\t\t\"\"\"\n\n\t\timg_files = [file for file in listdir(folder) if isfile(join(folder, file))]\n\t\timg_files = [file for file in img_files if file[-3:]==ext]\n\t\t\n\t\treturn img_files\n\n\n\tdef load_image(self, image, folder_path=\"../data/images/\"): #this might be unnecessary\n\t\t\"\"\"\n\t\tStores an image file as a class data object for manipulation\n\t\t\"\"\"\n\n\t\timg = Image.open(folder_path+image)\n\t\tself.current_img = img\n\t\tself.image_name = image\n\t\treturn img\n\n\n\tdef resize_image(self, img, mode=\"width\", new_base=300, print_size=False):\n\t\t\"\"\"\n\t\tResizes an image while maintaining aspect ratio\n\n\t\tnew_width is the new width of the image in pixels\n\t\theight will be set based on the aspect ratio and the passed width parameter\n\t\t\"\"\"\n\t\tif mode == \"width\":\n\t\t\twidth_pct = (new_base / float(img.size[0])) #get new width as a percent of old width for aspect ratio \n\t\t\tnew_height = int((float(img.size[1])*float(width_pct))) #get new height based on new/old width percentage\n\t\t\timg = img.resize((new_base, new_height), Image.ANTIALIAS) #resize image: AWS OCR needs minimum of 80x80 pixels\n\t\t\tif print_size:\n\t\t\t\tprint(\"new size\", img.size)\n\t\t\treturn img\n\n\t\telif mode == \"height\":\n\t\t\theight_pct = (new_base / float(img.size[1]))\n\t\t\tnew_width = int((float(img.size[0])*float(height_pct)))\n\t\t\timg = img.resize((new_width, new_base), Image.ANTIALIAS)\n\t\t\tif print_size:\n\t\t\t\tprint(\"new size\", img.size)\n\t\t\treturn img\n\n\tdef slice_image_horizontal(self, img, save_img=False):\n\t\t\"\"\"\n\t\t\tCuts a MWO scorecard screen capture into 24 horizontal segments, 1 for each player\n\t\t\tThese rectangles are further cut by slice_image_veritcal() before being sent to AWS Rekognition for OCR\n\t\t\t\n\t\t\tinput: MWO match screenshot\n\t\t\tReturns a list of horizontal slices of the screenshot, 1 per player\n\t\t\"\"\"\n\n\t\tif img is not None:\n           \n        \t#split image into 24 rectangles, 1 for each player\n            #args are (x start, y start, x end, y end)\n\t\t\tif type(img) == str:\n\t\t\t\timg = Image.open(self.image_folder+img)\n\t\t\t\n\t\t\tw, h = img.size\n\t\t\t#winning team players are positions 1-12 (index 0-11)\n\t\t\t#losing team players are positions 13-24 (index 12-23)\n\n\t\t\t#FIXME: test image resizing for other resolutions \n\t\t\t        #or create area maps for other resolutions\n\n\t\t\tplayer_images = [] #holds one image slice (horizontal bar) for each of the 24 players\n\t\t\tfor player_area in self.score_1680_1050:\n\t\t\t    player_images.append(img.crop(player_area))\n\t\t\t    #img.crop(player_area).show()\n\t\t\tif save_img:\n\t\t\t\tfor i in range(len(player_images)):\n\t\t\t\t\tplayer_images[i].save(\"../data/test_data/horizontal_slice_{}.jpg\".format(str(i)))\n\t\t\t\n\t\t\treturn player_images\n\n\t\telse:\n\t\t\tprint(\"no image supplied\")\n\t\t    \n\n\tdef slice_image_vertical(self, img, sharpen=False):\n\t\t\"\"\" \n\t\t\tCuts a MWO scorecard image into single elements in preparation for OCR and aggregation of data.\n\t\t\tThere are 24 players per match. \n\t\t\tThe following data elements will be captured for each player:\n\t\t\t\t- clan: string\n            \t- name: string\n\t            - mech: string\n\t            - status: string\n\t            - score: integer\n\t            - kills: integer\n\t            - assists: integer\n\t            - damage: integer\n\t            - ping: integer\n\n\t        input: a horizontal slice from slice_image_horizontal\n\t        return: a list of images containing the information listed above\n\t\t\"\"\"\n\n\t\tif img is not None:\n\n            #load image for processing if one was passed\n\t\t\tif type(img) == str:\n\t\t\t    img = Image.open(img)\n\n\t\t\tif sharpen:\n\t\t\t    #sharpen image\n\t\t\t    img = img.filter(ImageFilter.SHARPEN)\n\t\t\t    \n\t\t\timage_slices = []\n\t\t\tw, h = img.size #get size of passed image, these are the horizontal slices of player data\n\t\t\t#image cropping uses relative mapping\n\t\t\t#get clan    x_start, y_start, x_end,   y_end\n\t\t\tclan_area = (3, 0, w-760, h)\n\t\t\timage_slices.append(img.crop(clan_area))\n\t\t\t#get player name\n\t\t\tname_area = (50, 0, w-550, h)\n\t\t\timage_slices.append(img.crop(name_area))\n\t\t\t#get mech\n\t\t\tmech_area = (265, 0, w-445, h)\n\t\t\timage_slices.append(img.crop(mech_area))\n\t\t\t#get status\n\t\t\tstatus_area = (390, 0, w-350, h)\n\t\t\timage_slices.append(img.crop(status_area))\n\t\t\t#get match score\n\t\t\tscore_area = (500, 0, w-250, h)\n\t\t\timage_slices.append(img.crop(score_area))\n\t\t\t#get kills\n\t\t\tkills_area = (590, 0, w-175, h)\n\t\t\timage_slices.append(img.crop(kills_area))\n\t\t\t#get assists\n\t\t\tassist_area = (650, 0, w-120, h)\n\t\t\timage_slices.append(img.crop(assist_area))\n\t\t\t#get damage\n\t\t\tdmg_area = (710, 0, w-40, h)\n\t\t\timage_slices.append(img.crop(dmg_area))\n\t\t\t#get ping\n\t\t\tping_area = (760, 0, w, h)\n\t\t\timage_slices.append(img.crop(ping_area))\n\t\telse:\n\t\t\tprint(\"No image or area selected\")\n\n\t\treturn image_slices\n\n"
  },
  {
    "path": "rekognition-ocr/Python/run_mech_scrape.py",
    "content": "import pandas as pd\n\nfrom Python.lib import mech_scrape\n\nmwo_scraper = mech_scrape.mechScraper()\nmwo_scraper.main()\n"
  },
  {
    "path": "rekognition-ocr/Python/single_row_example.py",
    "content": "import io\nimport json\n\nimport boto3\nimport numpy as np \nimport os\nimport pandas as pd\nimport requests\nfrom PIL import Image, ImageFilter\n\nfrom lib import mwo_image_slicer\n\nclient = boto3.client('rekognition') #instantiate AWS client\n\ntest_imgs_path = \"E:/MWO/mwo_data/data/test_data/\" #test images folder\nif not os.path.exists(\"../output/blog_files/dataframes\"):\n    os.makedirs(\"../output/blog_files/dataframes\")\n\ndef convert_to_byte_array(img):\n\t\"\"\"\n\tConverts an image file to a byte array for use with the \n\tRekognition API\n\t\"\"\"\n\timg_byte_arr = io.BytesIO()\n\timg.save(img_byte_arr, format='PNG')\n\timg_byte_arr = img_byte_arr.getvalue()\n\treturn img_byte_arr\n\ndef grey_min_max(img, min_grey=185):\n\t\"\"\"\n\n\t\"\"\"\n\timg = img.convert(\"L\")\n\timg_px = img.load()\n\tfor i in range(img.size[1]):\n\t\tfor j in range(img.size[0]):\n\t\t\tif img_px[j,i] < min_grey:\n\t\t\t\timg_px[j,i] = 0 \n\t\t\telse:\n\t\t\t\timg_px[j,i] = 255\n\t\timg.save(\"../data/test_data/testpx.jpg\")\n\treturn img\n\n#instantiate image tools for project\nprint(\"loading image to slicer\")\nmwo_slicer = mwo_image_slicer.mwoImageSlicer(client) #handles image slicing and OCR requests\nmwo_slicer.load_image(image=\"20171118200711_1.jpg\") #set current image for handling\n\n#cut and save horizontal image slices to ../data/test_data/\nprint(\"slicing image horizontally and saving slices to ../data/test_data/\")\nh_slices = mwo_slicer.slice_image_horizontal(mwo_slicer.current_img, save_img=True) \n\n#pass single horizontal slice of the screenshot to AWS and get result\n#the example blog uses row 1\nhorizontal_slice = Image.open(\"../data/test_data/horizontal_slice_1.jpg\")\nhorizontal_slice_arr = convert_to_byte_array(horizontal_slice)\nhorizontal_slice_ocr_resp = client.detect_text(Image={\"Bytes\":horizontal_slice_arr})\n\nprint(\"writing JSON response to file\")\nwith open(\"../output/blog_files/ocr_responses/single_line_ocr_resp.json\", \"w\") as outfile:\n\tjson.dump(horizontal_slice_ocr_resp, outfile)\n\n#get detected words from OCR response\ntext_line = []\ntext_words = []\nfor text_detected in horizontal_slice_ocr_resp[\"TextDetections\"]:\n\t#print(text_detected[\"DetectedText\"])\n\tif text_detected[\"Type\"] == \"LINE\":\n\t\ttext_line.append(text_detected[\"DetectedText\"])\n\telif text_detected[\"Type\"] == \"WORD\":\n\t\ttext_words.append(text_detected[\"DetectedText\"])\nprint()\nprint(\"line text \\n\", text_line)\nprint(\"words text \\n\", text_words)\n#add line spacing for terminal output\nprint()\nprint()\n\n#greyscale and threshold horizontal image\nprint(\"converting image to greyscale and threshing\")\nhorizontal_slice_grey = grey_min_max(horizontal_slice)\nhorizontal_slice_grey_arr = convert_to_byte_array(horizontal_slice_grey)\nhorizontal_slice_grey_ocr_resp = client.detect_text(Image={\"Bytes\":horizontal_slice_grey_arr})\n\nprint(\"writing JSON response to file\")\nwith open(\"../output/blog_files/ocr_responses/single_line_grey_ocr_resp.json\", \"w\") as outfile:\n\tjson.dump(horizontal_slice_grey_ocr_resp, outfile)\n\n#get detected words from OCR response\ntext_line_grey = []\ntext_words_grey = []\nfor text_detected in horizontal_slice_grey_ocr_resp[\"TextDetections\"]:\n\t#print(text_detected[\"DetectedText\"])\n\tif text_detected[\"Type\"] == \"LINE\":\n\t\ttext_line_grey.append(text_detected[\"DetectedText\"])\n\telif text_detected[\"Type\"] == \"WORD\":\n\t\ttext_words_grey.append(text_detected[\"DetectedText\"])\n\nprint()\nprint(\"line text after greyscale and threshold \\n\", text_line_grey)\nprint(\"words text after greyscale and threshold \\n\", text_words_grey)\n\nprint(\"showing image before and after grey scale and threshold modifications\")\nhorizontal_slice.show()\nhorizontal_slice_grey.show()\n\n#add line spacing for terminal output\nprint()\nprint()\nprint(\"*\"*50) #show delineation of single line vs full dataframe results\nprint(\"Creating full dataframe from horizontal screenshot slices\")\n\n#create entire dataframe using horizontal slices\n#no greyscale or threshing\nhorizontal_slice_df = mwo_slicer.img_to_dataframe_h(mwo_slicer.current_img, save_img=True, \n\tthresh=False, save_df=True, save_name=\"h_method_df.txt\", filepath=\"../output/blog_files/dataframes/\")\nprint(horizontal_slice_df)\nprint()\nprint(\"*\"*50)\nprint(\"Creating full dataframe from horizontal screenshot slices using threshing method\")\n\n#create entire dataframe using horizontal slices\n#with greyscale and threshing\nhorizontal_slice_thresh_df = mwo_slicer.img_to_dataframe_h(mwo_slicer.current_img, save_img=True, \n\tthresh=True, save_df=True, save_name=\"h_method_threshed_df.txt\", filepath=\"../output/blog_files/dataframes/\")\nprint(horizontal_slice_thresh_df)\n\n## Construct entire dataframe: first without resize and thresholding, second with resize and thresholding"
  },
  {
    "path": "rekognition-ocr/Python/split_screenshot_example.py",
    "content": "import boto3\nimport io\nimport json\n\nimport os\nimport numpy as np \nimport pandas as pd\nimport requests\nfrom PIL import Image, ImageFilter\n\nfrom lib import mwo_image_slicer\n\nclient = boto3.client('rekognition') #instantiate AWS client\n\ntest_imgs_path = \"E:/MWO/mwo_data/data/test_data/\" #test images folder\nif not os.path.exists(\"../output/blog_files/dataframes\"):\n    os.makedirs(\"../output/blog_files/dataframes\")\n    \ndef convert_to_byte_array(img):\n\t\"\"\"\n\tConverts an image file to a byte array for use with the \n\tRekognition API\n\t\"\"\"\n\timg_byte_arr = io.BytesIO()\n\timg.save(img_byte_arr, format='PNG')\n\timg_byte_arr = img_byte_arr.getvalue()\n\treturn img_byte_arr\n\ndef grey_min_max(img, min_grey=185):\n\t\"\"\"\n\n\t\"\"\"\n\timg = img.convert(\"L\")\n\timg_px = img.load()\n\tfor i in range(img.size[1]):\n\t\tfor j in range(img.size[0]):\n\t\t\tif img_px[j,i] < min_grey:\n\t\t\t\timg_px[j,i] = 0 \n\t\t\telse:\n\t\t\t\timg_px[j,i] = 255\n\t\timg.save(\"../data/test_data/testpx.jpg\")\n\treturn img\n\n#instantiate image tools for project\nprint(\"loading image to slicer\")\nmwo_slicer = mwo_image_slicer.mwoImageSlicer(client) #handles image slicing and OCR requests\nmwo_slicer.load_image(image=\"20171118200711_1.jpg\") #set current image for handling\n\n\n#create entire dataframe using cell splitting method\n#no greyscale or threshing\nocr_df = mwo_slicer.img_to_dataframe(mwo_slicer.current_img, save_img=True, \n\t\t\t\t\t\t\t\t\t\tthresh=False, save_df=True)\n\nocr_df.to_csv(\"../output/blog_files/dataframes/split_cell_df.txt\", sep=\"|\", index=False)\nprint(ocr_df)\nprint(\"saving DF results to text file\")\n\n#create entire dataframe using cell splitting method\n#with greyscale and threshing\nocr_thresh_df = mwo_slicer.img_to_dataframe(mwo_slicer.current_img, save_img=True, \n\t\t\t\t\t\t\t\t\t\tthresh=True, save_df=True)\n\nprint(\"saving threshed DF results to text file\")\nocr_thresh_df.to_csv(\"../output/blog_files/dataframes/split_cell_threshed_df.txt\", sep=\"|\", \n\t\t\t\t\t\tindex=False)\nprint(ocr_thresh_df)\nmwo_slicer.current_img.show()"
  },
  {
    "path": "rekognition-ocr/Python/test_script.py",
    "content": "\nimport boto3\nimport io\n\nfrom lib import mwo_image_slicer\nfrom lib import mech_scrape\nfrom lib import mwo_data_utils\nimport pandas as pd\n#load mech variant weight data\n\n#instantiate ocr client\nclient = boto3.client('rekognition')\n#Scrape mech data from web and save as CSV files by weight class\nmech_data_scraper = mech_scrape.mechScraper()\nmech_data_scraper.main() #save mech variant web data to file\nmech_info_df = pd.read_csv(\"../output/variant_weights.txt\", sep=\"|\") #load all variant weights\n\nmwo_slicer = mwo_image_slicer.mwoImageSlicer(client)\nmwo_scores = mwo_slicer.get_files_in_folder()\n\nmwo_munger = mwo_data_utils.mwo_data_engine()\n#mwo_munger.clean_20171118200711_1()\nscores_df = mwo_munger.clean_20171118204451_1()\n#scores_df = pd.read_csv(\"../output/cleaned_df_from_img/20171118200711_1.csv\", sep=\"|\")\n#scores_df = mwo_munger.clean_mech_variants(scores_df)\njoined_df = mwo_munger.combine_scores_with_scrape(scores_df, mech_info_df)\nprint(joined_df)\n\n#joined_df.to_csv(\"../output/joint_test.txt\", index=False, sep=\"|\")\n#test_df = mwo_slicer.img_to_dataframe(mwo_scores[3])\n#imgs = mwo_slicer.get_images_in_folder(mwo_slicer.image_folder)\n#sliced = mwo_slicer.slice_image_horizontal(imgs[0])\n#print(test_df)\n#print(mwo_slicer.is_downloadable(\"https://steamuserimages-a.akamaihd.net/ugc/949601342893592988/26AACEA63DE6B2EB173C5FABF5766EE390BA31AA/\"))\n\n#mwo_slicer.show_image(mwo_slicer.resize_image(img, new_width=1680))\n#test_df = mwo_slicer.img_to_dataframe(mwo_slicer.resize_image(img, new_width=1680))\n#print(test_df)\n#mwo_slicer.main()\n\n"
  },
  {
    "path": "rekognition-ocr/Python/whole_screenshot_example.py",
    "content": "import io\nimport json\n\nimport boto3\nimport numpy as np \nimport pandas as pd\nimport requests\nfrom PIL import Image, ImageFilter\n\nfrom lib import mwo_image_slicer\n\nclient = boto3.client('rekognition') #instantiate AWS client\n\ntest_imgs_path = \"E:/MWO/mwo_data/data/test_data/\" #test images folder\n\ndef convert_to_byte_array(img):\n\t\"\"\"\n\tConverts an image file to a byte array for use with the \n\tRekognition API\n\t\"\"\"\n\timg_byte_arr = io.BytesIO()\n\timg.save(img_byte_arr, format='PNG')\n\timg_byte_arr = img_byte_arr.getvalue()\n\treturn img_byte_arr\n\ndef grey_min_max(img, min_grey=185):\n\t\"\"\"\n\n\t\"\"\"\n\timg = img.convert(\"L\")\n\timg_px = img.load()\n\tfor i in range(img.size[1]):\n\t\tfor j in range(img.size[0]):\n\t\t\tif img_px[j,i] < min_grey:\n\t\t\t\timg_px[j,i] = 0 \n\t\t\telse:\n\t\t\t\timg_px[j,i] = 255\n\t\timg.save(\"../../data/test_data/testpx.jpg\")\n\treturn img\n\n#pass entire image to AWS and get result\nprint(\"opening image\")\nscreenshot = Image.open(\"../data/images/20171118200711_1.jpg\")\nscreenshot_arr = convert_to_byte_array(screenshot)\nprint(\"sending to API\")\nscreenshot_ocr_resp = client.detect_text(Image={\"Bytes\":screenshot_arr})\n\nprint(\"writing JSON data to file\")\nwith open(\"../output/blog_files/ocr_responses/full_screenshot_ocr_resp.json\", \"w\") as outfile:\n\tjson.dump(screenshot_ocr_resp, outfile)\n\n\ntext_line = []\ntext_words = []\nfor text_detected in screenshot_ocr_resp[\"TextDetections\"]:\n\t#print(text_detected[\"DetectedText\"])\n\tif text_detected[\"Type\"] == \"LINE\":\n\t\ttext_line.append(text_detected[\"DetectedText\"])\n\telif text_detected[\"Type\"] == \"WORD\":\n\t\ttext_words.append(text_detected[\"DetectedText\"])\n\nprint(\"line text \\n\", text_line)\nprint(\"words text \\n\", text_words)"
  },
  {
    "path": "rekognition-ocr/readme.md",
    "content": "### Table of Contents\n[Blog Examples](https://github.com/Kibrael/mwo_data#blog-examples)  \n[Instructions](https://github.com/Kibrael/mwo_data#instructions)  \n[Repository Structure](https://github.com/Kibrael/mwo_data#repository-structure)  \n\n## MechWarrior Online Match Score Data Project\nDisclaimer: This project is not affiliated with [PGI](http://piranhagames.com/) or [MechWarrior](https://mwomercs.com/).\n### Project Goal:\nThis project aims to construct a dataset based on game results from MechWarrior online. \nMatch results will be combined with mech weights to facilitate analysis of tonnage deltas \nbetween teams.\n\nThe resulting dataset will contain nearly 600 images converted to pipe delimited text files\nand mech tonnage by variant in the same format.\n\nThe combination of these datasets will allow statistical inference into matchmaking engine\npriorities.\n\n## Blog Examples\nPlease see [this link](link to blog) for a discussion on the use and results of these code files.\t\n\nTo run the scripts below begin in the Python sub folder.\n\n- [Whole screenshot](Python/whole_screenshot_example.py): Code for sending the entire test image to the AWS Rekognition API. This is a test of the return and is not optimal for dataframe construction.  \n`python whole_screenshot_example.py`\n\n- [Horizontal slicing](Python/single_row_example.py): Code for sending horizontal slices of the test image to the AWS Rekognition APi. This example includes both a single row return as well as an example on assembling a dataframe from multiple API calls. This method optimizes cost at the expense of data cleaning time.\n`python single_row_example.py`\n\n- [Horizontal and vertical slicing combination](Python/split_screenshot_example.py): This example slices an image into individual cells and sends each cell individually to the Rekognition API. This method optimizes for data cleaning time at the expense of cost.\n`python split_screenshot_example.py`\n\n- [Dataframe output from OCR](https://github.com/Kibrael/mwo_data/tree/master/output/blog_files/dataframes) contains text files of dataframes produced by the example code files\n- [Images of dataframe output from OCR](https://github.com/Kibrael/mwo_data/tree/master/output/blog_files/df_screenshots) contains images of the dataframes produced by the example code files  \n*Analysis powered by [kite](kite.com)*\n\n\n\n## Instructions\n- This project relies on [Python](https://www.python.org/downloads/) 3.7\n- Install [requirements](requirements.txt)\n- Set up your [AWS credentials](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html)\n- running web scrape code from the Python subfolder will generate a list of mech variants and tonnages: `python run_mech_scrape.py`\n- running code for single screenshot: TBD\n- running code for many screenshots: TBD\n\n\n## Repository Structure\n- image data\n\t- data source (screencapture)\n- [Web Scraping](Python/run_mech_scrape.py): Uses the [mech_scrape](Python/lib/mech_scrape.py) class to gather tonnage for each mech variant in [MechWarrior Online](https://mwomercs.com/).\n- [test data](https://github.com/Kibrael/mwo_data/tree/master/data/test_data) contains image files sliced from screenshots. Some images have been resized and/or threshed in greyscale.\n- [image data](https://github.com/Kibrael/mwo_data/tree/master/data/images) contains the test image used in the examples. A full set of screenshots is not currently available.\n- [image slicer](https://github.com/Kibrael/mwo_data/blob/master/Python/lib/mwo_image_slicer.py) converts screenshots to dataframes which can be saved as text. Two methods, horizontal, and a combination of horizontal and vertical slicing are available. The combination of horizontal and vertical slicing yields better results but requires more time and costs more in API calls.\n- [initial dataframes]() contains the initial dataframe output from screenshot conversions.\n- [cleaned dataframes]() contains dataframes that have been cleaned of errors created during the OCR process.\n"
  },
  {
    "path": "smote/common.py",
    "content": "import matplotlib.pyplot as plt\nimport numpy as np\nimport pandas as pd\nfrom sklearn.svm import SVC\n\n\ndef train_SVM(df):\n    # select the feature columns\n    X = df.loc[:, df.columns != 'label']\n    # select the label column\n    y = df.label\n\n    # train an SVM with linear kernel\n    clf = SVC(kernel='linear')\n    clf.fit(X, y)\n\n    return clf\n\n\ndef plot_svm_boundary(clf, df, title):\n    fig, ax = plt.subplots()\n    X0, X1 = df.iloc[:, 0], df.iloc[:, 1]\n\n    x_min, x_max = X0.min() - 1, X0.max() + 1\n    y_min, y_max = X1.min() - 1, X1.max() + 1\n    xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02), np.arange(y_min, y_max, 0.02))\n\n    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])\n    Z = Z.reshape(xx.shape)\n    out = ax.contourf(xx, yy, Z, cmap=plt.cm.coolwarm, alpha=0.8)\n\n    ax.scatter(X0, X1, c=df.label, cmap=plt.cm.coolwarm, s=20, edgecolors='k')\n    ax.set_ylabel('y')\n    ax.set_xlabel('x')\n    ax.set_title(title)\n    plt.show()\n"
  },
  {
    "path": "smote/create_data.py",
    "content": "import matplotlib.pyplot as plt\nimport pandas as pd\n\nfrom sklearn.datasets import make_classification\nfrom imblearn.datasets import make_imbalance\n\n# for reproducibility purposes\nseed = 100\n\n# create balanced dataset\nX1, Y1 = make_classification(n_samples=700, n_features=2, n_redundant=0,\n                             n_informative=2, n_clusters_per_class=1,\n                             class_sep=1.0, flip_y=0.06, random_state=seed)\n\nplt.title(\"Balanced dataset\")\nplt.xlabel('x')\nplt.ylabel('y')\nplt.scatter(X1[:, 0], X1[:, 1], marker='o', c=Y1,\n            s=25, edgecolor='k', cmap=plt.cm.coolwarm)\nplt.show()\ndf = pd.concat([pd.DataFrame(X1), pd.DataFrame(Y1)], axis=1)\ndf.columns = ['feature_1', 'feature_2', 'label']\ndf.to_csv('df_base.csv', index=False, encoding='utf-8')\n\nX_res, y_res = make_imbalance(X1, Y1, sampling_strategy={0: 340, 1: 10}, random_state=seed)\nplt.title(\"Imbalanced dataset\")\nplt.xlabel('x')\nplt.ylabel('y')\nplt.scatter(X_res[:, 0], X_res[:, 1], marker='o', c=y_res,\n            s=25, edgecolor='k', cmap=plt.cm.coolwarm)\nplt.show()\n\ndf = pd.concat([pd.DataFrame(X_res), pd.DataFrame(y_res)], axis=1)\ndf.columns = ['feature_1', 'feature_2', 'label']\ndf.to_csv('df_imbalanced.csv', index=False, encoding='utf-8')\n"
  },
  {
    "path": "smote/create_smoted_df.py",
    "content": "import pandas as pd\nimport matplotlib.pyplot as plt\n\nfrom imblearn.over_sampling import SMOTE\n\n# for reproducibility purposes\nseed = 100\n# SMOTE number of neighbors\nk = 8\n\ndf = pd.read_csv('df_imbalanced.csv', encoding='utf-8', engine='python')\n# make a new df made of all the columns, except the target class\nX = df.loc[:, df.columns != 'label']\ny = df.label\nsm = SMOTE(sampling_strategy='auto', k_neighbors=k, random_state=seed)\nX_res, y_res = sm.fit_resample(X, y)\n\nplt.title(\"Dataset balanced with synthetic or SMOTE'd data ({} neighbors)\".format(k))\nplt.xlabel('x')\nplt.ylabel('y')\nplt.scatter(X_res[:, 0], X_res[:, 1], marker='o', c=y_res,\n            s=25, edgecolor='k', cmap=plt.cm.coolwarm)\nplt.show()\n\ndf = pd.concat([pd.DataFrame(X_res), pd.DataFrame(y_res)], axis=1)\n# rename the columns\ndf.columns = ['feature_1', 'feature_2', 'label']\ndf.to_csv('df_smoted.csv', index=False, encoding='utf-8')\n"
  },
  {
    "path": "smote/df_base.csv",
    "content": "feature_1,feature_2,label\n1.2942917818141306,-0.5337241847084068,0\n-0.912972722116816,1.6576214165181802,1\n0.11734171814533911,-0.0615760580448792,1\n2.137121099154796,-0.21580519768657913,0\n1.5935619763453126,-0.4409025945644771,0\n-1.5504514615824387,0.6399266215315886,1\n0.27258374963094123,-2.254895966698802,0\n-0.44861136007267977,-2.00267908186771,0\n-0.6805258438372258,0.5650359191110801,1\n0.9625266437997575,-1.1372452079079007,0\n1.9995727562323582,0.06976904764576641,0\n1.419400022234339,-1.0437922569600913,0\n2.1250006168052824,-0.4420868248476283,0\n0.7214647934671113,-1.1163728249150342,0\n1.5958775865508148,-1.0048644251926444,0\n0.4487877763566621,-0.9337435097983982,0\n0.5717235691341322,-1.8262272268286943,0\n0.3112219901921034,-1.7674626341622481,0\n-0.8051724932747555,-2.60479865521397,1\n-1.9505301023210293,1.5114180996259066,1\n-0.7462991859818595,1.2875276879068323,1\n-0.06814344491755553,-2.3054271879547095,0\n0.9257588126096669,-1.4619867312475097,0\n-0.9876782221472629,1.726589749734719,1\n0.36814044590447437,0.7122497169071077,1\n0.23679985555637817,1.0590441777324286,1\n1.1958041991807604,-1.2123502702863305,0\n2.175834009315037,-0.029320568084396204,0\n-0.0017487763806181,-1.6177417536834255,0\n-0.5636312015844738,-0.3034060097025426,1\n-0.32450772703581543,0.7831319487224058,0\n-1.9388327865919939,1.6438701067526693,1\n1.670661514172441,-0.744356211362474,0\n-0.7384641460782564,1.3586689611228273,1\n-1.921596913389205,0.5439350582039185,1\n1.2936080427776016,-0.5218822154131395,0\n-1.324810413285315,1.4890314112886966,1\n1.1788500278543772,-1.0935069096755725,0\n-0.07594359503329473,-2.796710850422487,0\n1.2075565464009106,-0.5991163421217505,0\n0.7687910277793344,-1.2268449556548424,0\n0.3261477076528907,-2.141308329990645,0\n0.2878244885037613,1.3142551107925606,1\n-1.2025323047425096,1.2237663513132107,1\n-0.5568811493887658,0.6791313573751347,1\n-0.9282003568408249,0.32589223160839986,1\n-0.8611958141190103,-0.5399857024637866,1\n1.3388855973822196,-0.5225634050970958,0\n0.3004453196699901,0.9144462523127203,1\n0.6226994523575413,-1.1748454756112456,0\n3.966071457004198,1.0546346105255182,0\n-1.62258176782008,1.001007545038944,1\n1.3841174748122578,-0.2802045550866741,1\n1.3040011355610173,-0.8611782711582541,0\n3.4343824212918914,0.9796487943106222,0\n-2.509137562721898,1.130931717878176,1\n-2.1476085573410293,1.758905608096354,1\n1.3543099821280564,-1.365472646123773,0\n1.4113344461797381,-1.5194886689075289,0\n-1.1204382561876363,0.8326035018163409,1\n1.0136376607327007,-1.4608741560629206,0\n0.9516394575705613,1.2890093394565258,0\n-1.4678147653987366,1.9114833468881978,1\n-0.8688137386028831,2.6464246332932317,1\n-0.657599396950638,1.3642607906645572,1\n0.9985811528297952,-1.419867026539162,0\n-1.0500610698351838,-2.4908208493109214,0\n1.605496378601109,-0.7426563219008542,0\n-4.024881575533313,1.8609065914226344,0\n-0.4494204002155361,-0.4269865647902036,1\n-2.193388091036642,1.3963092874053773,1\n-0.6629678330412464,1.404017593899585,1\n-0.8085848010744278,2.011724996138949,1\n1.8647721467197442,0.08744752589884386,0\n-1.1515587401854175,0.998750148859295,1\n-2.041677393188913,-0.5562035043380811,1\n-0.6593634676306821,-0.4672628107921706,1\n-1.7054596244344193,0.9727352986983697,1\n2.0135362197285627,-0.516026071179664,0\n-0.86817735927889,2.041283422963436,1\n0.4654950746824681,-1.074515118988505,0\n1.0969446741758826,-0.5665679262718032,0\n-0.8038059680109412,-0.161091782657508,1\n1.8635657736155287,-0.6260986649566489,0\n0.15415986472570364,-0.15503350824827655,1\n-2.2283667707424124,2.577184899537447,1\n-1.5682458360924496,1.1938091458477516,1\n-1.2839796405560961,0.7950043021771225,1\n0.30281925158286105,-1.5516068320893197,0\n-0.06630808133452071,-2.1423257825731,0\n-1.0914594526466732,1.2200093078895295,1\n0.06846532309580677,-2.0123696862982383,0\n-1.1019728720806783,0.8440451930924993,1\n-2.4304401855494233,1.8427761585047013,1\n-0.1455163810725073,-2.070536923870382,0\n-2.935570308332453,1.2917453813900766,1\n-0.6477736089109012,0.7582493970877134,1\n-1.662162855758965,0.06907662596661357,1\n-0.2477297144329128,-1.5472779864808315,1\n-0.9423070110810533,1.085555139572456,1\n0.11577663106069103,-1.686276531624526,0\n0.5910834338159181,-1.3951139708862619,1\n-1.5754519487998868,1.225414604424748,1\n-0.4151142170484843,1.2767512108331571,1\n0.8011870182290632,-0.8729739114779007,0\n1.7975402278816888,-0.3241610197280269,0\n-0.8227999995921815,-2.1829971891711875,0\n-0.007708898406525888,-1.9428364210835543,0\n-0.4601470890233641,1.1712134922183082,1\n2.087767275657729,-0.21957291016262348,0\n0.48803446508495907,-0.06829108935317696,1\n1.857302729268008,-0.03941589834726955,0\n-0.2356878546771226,-2.2351686517194786,0\n0.020862166711687946,0.9049056686194282,1\n-1.8629997190444305,0.966112289066761,1\n-2.2583331023840865,2.287274588618816,1\n1.534205486882561,-0.5895260487475262,0\n0.4306517379128876,-1.2866372247713858,0\n-2.184386606986097,0.46009878333843235,1\n1.6164401874864303,-0.7491919569600187,0\n1.2654175768684743,-0.7078057686442769,0\n-0.608343294493785,1.0787053590907347,1\n0.4353497649249044,-1.5108152533124657,0\n1.2877559840857793,-1.2012183836830221,0\n1.842241126638732,-0.3030568945792822,0\n-1.4893386817127088,-0.6212526387195647,1\n-2.4622061099890193,1.257078965612396,1\n-0.5808605639656423,0.9246411345856387,1\n-1.8231772944199387,0.8535390611637818,1\n0.46205492948004667,1.9325941152515758,1\n-0.5307093244110603,1.1231294971093724,1\n1.5045709424736964,-0.36537060069366023,0\n-0.19338750524155235,1.3187625578152722,1\n-2.364347315324096,1.4531403541330858,1\n1.7183555113511282,-0.20979054293010313,0\n-1.0982180680180371,0.7186632439841895,1\n1.0905825086825023,-0.35140352098541494,1\n1.470280590102631,-0.5874858927248534,0\n-1.393282126717874,0.7723640842960862,1\n-0.21649587316826557,-2.0126621262364193,0\n0.28126359155149383,-1.7109512359432337,0\n-0.8269115680749362,0.0467821716587552,1\n2.3118355194496694,-0.16997090251773816,0\n-0.33593735129529,0.654383506342699,1\n-1.2791540258189595,1.5848438614553308,1\n0.21978075752172666,-0.8074290438268071,0\n-0.48364128669528517,0.30694592068486704,1\n-1.1257844306840188,0.46342738368876035,1\n0.02750530570054488,-1.6263780252853546,0\n2.6938980472065532,-0.5446054700136436,0\n0.0279343625373194,-1.2172169445951928,0\n-1.5614726400077883,0.917534776736783,1\n1.8371745666817652,-0.3430342492926082,0\n0.9727961713439557,-0.48693833210377413,0\n1.6195385721386488,-0.1764743948131542,0\n-1.5833552899073273,2.294170624926447,1\n0.8245136196386991,-1.0090057198341424,0\n0.6532741779009484,-0.3091476138968099,0\n-0.09580801585642185,0.8054056060288108,1\n-0.45955320318113635,1.1942886613351846,1\n-1.654656390880234,2.8236939610083622,1\n-1.1380035116689382,1.4063625998838019,1\n-0.609979532035672,0.5971052889445256,1\n-0.08085113066125837,0.23132197961758072,1\n2.0810484725568505,0.14752862067079264,0\n1.2893701204081844,-0.9762111911296631,0\n-1.3248330626147469,0.9145382551658698,1\n-0.6501487487759345,-2.6727692269967838,0\n-2.402107677531778,1.7668109915568344,1\n-0.18396977923324476,-1.3123764338999027,1\n-0.9707443993749776,0.5087803253229803,1\n1.3436304641050714,-1.0581677238510057,0\n2.829483123749668,0.8922513469139934,0\n0.965611201710527,-1.1338013404391099,0\n1.3789121637202775,-0.8865963525730571,0\n2.024947305962446,-1.0625540864728482,0\n-0.8788862807765647,0.4156164377280489,1\n0.5369784823413433,-1.6571724078791412,0\n1.8961469986294333,-0.5661385072123185,0\n-2.1025376048687647,1.414537141465409,1\n1.3323755906269665,-0.46393055309206976,0\n2.8204145697945453,0.17849977693130392,0\n-1.515655775852594,1.5884070232954524,1\n1.2449994266832107,-0.7630365192414319,0\n2.2809052792322446,0.552956420998413,0\n-2.329503804549347,1.2967481290384386,1\n-0.0810671189747556,-1.6489987051679837,0\n1.1453533125589712,-0.7316932230012982,0\n0.06709044639193729,-0.20203585446827366,1\n-0.8750755494957493,1.3721317062472371,1\n-1.771297324626266,0.959648577198674,1\n-0.12714227174716575,-2.2186139015504978,0\n1.2498067806755835,-1.1533904168928915,0\n0.6756251115155283,-0.5400269205828021,1\n1.1000958376012597,-0.41042162430163565,0\n0.9008547125170473,-1.0264922138602226,0\n-0.6497858631872517,-1.7340333395450998,0\n-0.11297789130878644,-1.829085053033355,0\n0.6292138008536463,-1.1146791767286666,0\n-0.4517420778134491,1.251184020993982,1\n-0.26563074449726654,-2.533058608455949,0\n1.267167978034559,-1.114981574255851,0\n-1.794775530271198,1.9722830174274217,0\n-1.3546614568301794,2.0858334878689284,1\n0.1358341590732265,-1.9767336475656647,0\n1.7050163742927809,0.41979852227733216,0\n-2.711020223849718,2.1974452707777683,1\n-0.36702794970299113,0.01017338652880706,1\n-0.1929798748071886,0.18664646043713695,1\n-0.028387979436448996,-2.3924123525563075,0\n1.395398584745441,-0.5193517184778738,0\n-1.5877159900224473,1.7115277678199097,1\n-0.16326914035568485,2.8212484160767533,1\n1.769809978548568,-0.5398153674879115,0\n-1.3353315405815913,0.28866713883780215,1\n1.7172122396098657,-0.20708792656367403,0\n0.5935161923724448,-1.5667158747218264,0\n0.8378127373310991,-0.623022197238507,0\n0.16057958133888528,0.5770175123373524,1\n0.8660446400717803,-1.0008842681748589,0\n0.6192505989256464,-1.83730389487453,1\n-0.2287373744716974,0.9189466438101838,1\n-0.2670620056099905,1.3133550085550152,1\n-1.017946574096857,1.9285421487081196,1\n-1.2663366033358312,1.0184682232505613,1\n-1.55218650117884,1.8205053289180784,1\n-2.230678991759845,0.9824055639516767,1\n3.2227382518862857,0.7330406730223069,0\n0.31131759364130307,0.5088488438996444,1\n1.5708746494059258,-0.020115367753735125,1\n-1.861675453139886,1.5884576506271872,1\n-0.8872840571591954,0.971523456397141,1\n0.5916958305058657,-1.0030425468933921,0\n-0.3681829782854088,0.4873409869631511,1\n3.0492289689195347,-0.19370971396682723,0\n0.17066686938376008,0.7063776831976594,1\n3.3636808776104603,1.3544345368296185,0\n1.9718573122039216,-0.6092066017421853,0\n0.7041157723425708,-1.6811198857300718,0\n-0.38694489333818827,-1.652515729971175,0\n-0.7897205457086133,0.010754820734006576,1\n0.4824545502981564,-0.9728220889805556,0\n2.125102443805207,0.15148941035410024,0\n-0.004879967037214272,1.9699902758143368,1\n-0.18900997332414526,-1.698729510327777,0\n-1.96126747856009,3.305688462236784,1\n0.6820066723257772,0.6118391295534515,1\n-1.0080482070433987,1.771304589963432,1\n-0.54773957966252,-1.3169167824123882,1\n-1.7262649433047002,1.5727856652516157,1\n-1.0926330555157757,0.5750488495722255,1\n-1.7009851153011097,1.4455421335883216,1\n-1.0974697384786278,0.3567085717111683,1\n0.13550783188473925,-0.7828831336432294,0\n-0.5748144751627733,-0.030461331411785864,1\n2.281374449735865,-0.06605095624680701,0\n0.04250447093489085,-1.8028046811106127,0\n1.3787190117194217,-0.44096655014181896,0\n-0.41545116318869046,2.2092866441006436,1\n0.3639212280707158,1.9807977086275799,1\n0.2509953388548929,-1.9423497365922389,0\n-0.5038376153936854,-2.429014319040797,0\n2.6634504270979917,-0.2106499856241938,0\n0.17096233120539706,-1.863691456830062,0\n1.1604484302493854,-0.9630918486784845,0\n-0.1470620710159285,-1.8560575974149673,0\n-0.3070260221997205,2.1559428716013826,1\n0.028663287607900267,1.9772315524741881,1\n1.2937480446231127,-0.5598328597263293,0\n-2.321607428090904,0.5047232192370515,1\n-0.28447911751590693,1.5081158801490688,1\n1.6397739821668516,-0.5319926636552961,0\n-1.1349441891603145,1.2676899290762824,1\n-1.3977240721216118,2.3611047368843243,1\n2.199099572944115,0.4696569924568168,0\n0.5681736519510394,-2.1314126092616643,0\n0.08129243339176728,1.9110916762188837,1\n0.6183888490991831,-0.24979684475792552,1\n2.235174409580018,0.30686137880398245,1\n-0.09421687681213398,-0.09897679039064666,1\n1.0699922326700315,-1.2479508618837964,0\n1.56879090845165,-0.8343385735718184,0\n-1.9969150774326851,1.0533256909752813,1\n-0.99272840582734,1.6156481661469428,1\n-1.4413894497046846,0.8639590129336373,1\n1.4367525182397782,-0.9770751395928354,0\n-1.154434474353373,2.5694960227676704,1\n-1.1077218837028942,1.262552072870931,1\n3.3416677160494266,0.8449958074172039,0\n-1.181967816859879,1.0068350084046085,1\n1.3764865502796109,-1.0216190599665724,0\n0.6194765899406693,-0.49413710958195733,0\n-2.265512266830386,0.45605893132235265,1\n0.733967118092937,-1.3050665142145095,0\n-1.2418658588072242,2.202544561484161,1\n1.347863297045506,-0.7166871221251891,0\n2.7305233491718592,0.4695111445756752,0\n0.13062881674773064,-1.9570997174266291,0\n1.3667791339859905,-0.6404218076182986,1\n1.3978626787653456,1.4086845476914618,1\n-1.0344965812292566,0.4826913568408916,1\n-0.9944794769151032,-0.8469261559100458,1\n-1.5648309178391204,1.7881347759733037,1\n0.269902339843884,-0.9918024617396816,0\n2.1398828184689997,-0.03229666580892765,1\n-1.089972996371443,1.0333256677358236,1\n-0.003193831176726225,0.6229157797682345,0\n1.4379974725105606,-0.8436059027743086,0\n-1.4978154624332731,-0.08010853594404255,1\n-2.5137666067679065,2.1202238538983496,1\n-1.1606356556029318,1.475791994754371,1\n1.7035283744528456,-0.5525436231808802,0\n2.3682028925047933,0.3504533903587326,0\n1.2415866922517966,-1.3062727944290797,1\n1.819667973267,-0.5418207375050086,0\n-0.21670643196464512,-0.2734049565152701,1\n-0.02448390915141374,1.0644239198773442,1\n1.4740932021664945,-1.3239781200177019,0\n-1.4501313236276676,0.5394087148812776,1\n1.0065468577171366,-1.2382118733084468,0\n-1.3361470894219178,-0.5432364360148185,1\n2.8227150012614732,0.2332787704800725,1\n-0.7824480835553079,0.4139419182907752,1\n-0.00813702684659634,-2.051846631039716,0\n-1.6090451252135667,-0.03459079192023107,1\n1.4544211697200184,-0.7732275693378345,0\n-0.31129117432713505,1.6274807709457215,1\n0.3074018946226107,0.3807167875398558,1\n1.0157444791716732,-0.7677821107731106,1\n1.7019341004911768,-0.3425717210079501,0\n-2.456295036710907,0.4869224103339832,1\n0.1770824889037823,0.6261759152591116,1\n-0.6670963506176694,3.0835994440582724,1\n-0.24304180468434755,0.13177854029964375,1\n-1.5825613947238737,0.9755523895888077,1\n2.0340220684167636,-0.6579752413210902,0\n1.9172043248572388,-0.20302917018937972,0\n-1.3937170090936455,-2.942371571762754,0\n-2.0582285681117742,-3.6519500544962473,0\n2.6753864913818926,-0.8214556030855155,0\n2.1942962721726444,-0.5745236662200963,0\n-1.3537740870877628,1.5214523984643824,1\n-1.053943837792707,1.3363852870907325,1\n-0.5937747076076196,0.6965839646617329,1\n-1.3811368198579577,2.616697825366967,1\n0.40952597024111814,-1.7232014945497385,0\n0.4104113352306902,-1.6972987088735487,0\n0.07748026126957275,-1.9513044296387552,0\n1.3416195183351356,-0.6924474900221769,0\n-2.7304063132063563,2.1277336237841715,1\n0.8434622848196724,1.3042290830742027,1\n-0.6653113597230391,-2.3502780001437173,0\n-2.218395964890105,0.24714574803729805,1\n-0.7741624463349015,0.6668646316812787,1\n0.4344383936871491,-1.0511916105889831,0\n1.963449749323938,0.26331917360670576,0\n1.240259680392343,-0.8366141564312343,0\n-1.9686838703425782,1.4425122375089812,1\n-1.1903770047466777,1.1781251256279184,1\n-0.34611530444459526,-2.233667476680281,0\n-0.2769262796246226,2.906655947483235,1\n-1.3189754087157075,0.16681370206571766,1\n-0.7817198135886285,0.4044371633032723,1\n1.1510257588639181,-1.0205704770600588,0\n1.1091862916921724,-1.6149395674216378,0\n0.4036648629381442,-1.4519724741063351,0\n0.0316108571179996,0.6197046207915311,1\n-0.968855650807458,-0.3385052164841973,1\n-0.9136687439501859,0.7036072409340515,1\n0.1476710021437011,0.8029344952233161,1\n0.2788307661844547,0.5101840689711706,1\n1.587507051001294,-0.5093852144482307,0\n0.24794034649440744,0.33932071677879216,1\n-2.4868654330341515,1.6565646630156712,1\n-0.5579000334146834,-0.6554753750943831,1\n1.253347642233793,-0.9052395871028421,0\n1.2159235584543537,-0.9346003167504948,0\n1.7768784951055046,-0.3360209157013806,0\n0.8691879068449053,-1.3907535653227343,0\n0.6707823381392669,-1.833673064751146,0\n0.6919172009484098,-1.3365452673847602,0\n-0.894178802639761,1.1640272495928121,1\n1.8650053963878186,1.4826475144196585,1\n0.49742043106142253,-1.0021980650630546,0\n-1.4597203984593752,0.7837985573536566,1\n2.1633916668554205,-0.22198418468262615,0\n0.8525900955588941,0.1421989198255018,1\n0.9969383735608043,-0.9844757665155568,0\n0.1889350696419969,-1.842096703566853,0\n-1.8330889032359985,0.49012806373947715,1\n0.5075755919236363,-1.5744626264109431,0\n0.7737159925242159,-0.26353426056005835,1\n0.6377592102009617,-0.9141722342460896,0\n1.3998283578105335,-0.09928076133273733,1\n0.9848901769467843,-0.6156227363190017,0\n1.4161083025448828,-0.7506196586247008,0\n0.2029680750242978,-1.6790791590744,0\n-2.2756574606972975,-0.4017580002729868,1\n1.1956248567296457,-0.5928969826691093,0\n0.14714489371021244,-1.4160686637084645,0\n-1.8045160427856985,0.8531215249382695,1\n-0.7639906941474321,1.2981604185088864,1\n0.16980841778996747,0.2760177314948432,1\n-0.16274611191935384,0.4630587680653272,0\n2.1750539644289413,-0.2256128666732079,0\n2.696216181610489,0.4882328664057731,0\n1.1573708906293243,-0.8222222871525701,0\n-0.8745184196756184,0.5950127649529349,1\n2.2611104224733505,-0.8626454211293695,0\n-1.7633276864451934,0.5551423509037829,1\n-0.4220817406859968,-0.17565467448529004,1\n-1.7364608962780843,1.5229201066271831,1\n1.4751467848368778,-0.2227819821267356,1\n1.8393128973832882,-0.574943804431004,0\n2.5854378252636763,-0.15891337664710015,0\n-2.336780760700166,0.9160394339676343,1\n0.3522932168703028,0.5073435839340714,1\n1.4535661158683035,-0.8695253009493249,0\n0.9669790349425749,-1.0992386183079672,0\n0.4503270682963416,-1.5281611901802954,0\n0.21228071932876968,-1.4958357859336764,0\n1.1363889487562904,-0.9391785439517278,0\n-1.0848516337990528,2.402873136471488,1\n0.47806139026654804,-1.4785541391195263,0\n-0.2532267488112634,2.4915646306285226,1\n-2.1210276267946186,2.2382344754552443,1\n-2.692377546805737,2.698952654181492,1\n0.7847064985789658,-1.3143798981550003,0\n-0.9106517343707704,2.1082772008591695,1\n-1.3084738382110421,0.4631247612887276,1\n-1.7224970978932042,0.30070224783140787,1\n-0.22530720163673346,1.8419069063547269,1\n0.31777103421517794,-1.500441513746705,1\n-1.4758010090476632,-0.431999836625399,1\n2.6791923193593012,0.4073976407297355,0\n-0.7596427932109945,1.6271479693715487,1\n2.1350551981212433,0.1489787932454194,0\n0.475759159442814,-1.9891050381687188,0\n-0.899714268763806,-3.2033046767984272,1\n0.7413573653953694,-1.715765585279593,0\n0.028400672213239497,1.1183212677588823,1\n-1.2210040294581808,1.5865618609386538,0\n-0.32700255116918564,1.926139283575773,1\n-0.9002349330066344,1.4950515450046091,1\n-1.4725665686718208,2.196136547200439,1\n0.0023190253320442,-1.6992543639077584,0\n0.06346601428820053,-1.2969355882544191,0\n1.2729613196318403,-0.8061083971491095,0\n-0.7870839631563373,-2.089240702144415,0\n0.7636689344755133,-0.8679996046971272,0\n0.26728711188756427,-1.9731733640648828,0\n2.1310101322231256,-0.7674191533527639,0\n-0.649739232619122,-2.037369606890298,0\n0.2969468819411154,1.8375590744059576,1\n-0.5624629119305837,2.293842717537747,1\n-1.1840373558235768,-0.12172479790043877,1\n0.8477442729650762,-0.9455346029012528,0\n1.3205319553380617,-0.5626912722085387,0\n-0.9134241526824903,2.022675294323072,1\n1.5307196485238976,-0.6631451134032991,0\n1.7602471231500587,0.17335291578843903,0\n-2.245640849493694,1.8171985554778303,1\n-0.3432172689161882,1.8726602487738178,1\n-0.4334863259249002,-1.8988540200486892,0\n1.6481092484826645,-0.23368489153255745,0\n-0.43971559655489434,-1.2933786918917662,1\n-1.891964489389904,0.11149267807524699,1\n1.473375454869629,0.08438414616832124,1\n-1.3439650676557953,0.770423637581457,1\n0.16846059335470276,-1.371765219040044,0\n0.20246688881051522,-1.5550773995969638,0\n-1.0842365246795602,0.8924656939297484,1\n1.5280839059697475,-0.5937202817132765,0\n-0.5952226288570597,2.3807666763997446,1\n-0.5851697560085403,-2.3672337572696334,0\n2.0641692203942448,0.28096128015036714,0\n1.8765338495527928,-0.7995389938358315,0\n1.0259550999621174,0.3466208553965252,1\n0.043362026478234394,-1.3966596245762422,0\n-0.9884456896799307,0.9234390113913311,1\n-0.8267348695790236,3.9693180979645666,1\n-1.3381768369241622,0.15859492153054433,1\n-1.8919740332730322,1.7442401725027952,1\n-1.2045385956394248,0.408588422132075,1\n-1.519312843826342,-0.6259325484724778,1\n2.6006131843018707,0.3731932498506709,0\n-1.4099322623147934,0.5989913331858179,1\n0.6124563596298749,-1.0669066393291813,0\n3.5670119486079117,1.0313399536444878,0\n0.023275821168913136,-1.558084488670331,0\n-2.003793248553139,1.573759090459825,1\n-0.683534181104638,-2.3067901423057577,0\n-3.4408383918669347,1.0499020814831481,1\n-0.18029936295740523,-1.7186321292210849,0\n0.3809489730664908,1.37305291853481,1\n2.4993763117316345,0.4733150528812744,0\n-0.8900478793547713,-3.1578228987248416,0\n-0.35897358525374834,0.8633222860334551,1\n-1.6576943100076895,0.8942483427516803,1\n-0.09101339521452623,-2.229144068573836,0\n-0.41670680695323736,0.5292521549669279,1\n1.79709525433866,-0.9359120494360098,0\n2.0007816529518183,-0.17914614030775577,0\n0.688220299715036,-0.9918364485374648,0\n0.868880142559961,0.14032342744482362,1\n0.9028110675398595,-1.1521015928257445,0\n0.49740290324070013,-1.3853566353049271,0\n-0.818965381923211,-1.9358058582249804,0\n-0.38773966723545483,1.4927015152009018,1\n-0.427329102500827,-0.775383079962991,1\n2.215731800887835,-0.17248539126072948,0\n0.47174805932112596,-1.3697402007772497,0\n1.4302593969723802,-0.4918047517644094,0\n0.11480604489343127,-1.8951766081144423,0\n-0.1035927812045383,0.9018307190115273,1\n-2.105082682138887,2.20735612304839,1\n-0.3818831251016851,0.6663683216233395,1\n1.425388421727126,-0.19079349715043437,1\n0.1431128883218047,1.0138844982731143,1\n-0.7769820089902516,1.9177518586841595,1\n0.7716960759023448,0.2512069666994635,1\n1.6237864306873977,-0.2947444289786363,0\n-0.9959364928108212,-0.012390195986267338,1\n0.0647155940012275,-1.4884945451731122,0\n-2.651914998099972,1.7240752779714688,1\n0.12271592323744807,-1.8758014597763673,0\n-1.3161194386060577,-2.764341707051959,0\n-1.2917716119872507,2.4949721668988536,1\n-1.3740586380271427,1.0184550611655019,1\n-0.38646776275743555,-1.8588202065843693,0\n-0.6114186186441255,1.320410247830584,1\n0.2085740049665723,1.2144716425718753,1\n-2.4453074888722006,1.8031564519455832,1\n0.8904913626879825,-0.4009959645221365,0\n1.5777908913325738,-1.1959841640053435,0\n-0.4485956328977009,1.163599898492288,0\n-2.334247176286071,-0.05877486292588885,1\n2.5395342871294515,-0.15105466916358512,0\n0.5094886304911337,-1.0253032937784892,0\n-1.3229886042193202,-0.530265374721149,1\n1.5339338403447556,-0.897661936990697,0\n-2.066032776113542,0.05391926312505113,1\n-0.3152465381227332,-2.1244212076546334,0\n-1.2090063819110632,-3.0882813580368826,0\n0.8127949855344938,-0.7204831395244709,0\n0.7418163611920107,-1.379938253951535,0\n0.2800294984694556,-1.7794307880261044,0\n0.9015089020634592,-0.28219442257711025,1\n-2.0362475745481277,0.7333151886688949,1\n-0.3236995138765424,1.0920445570218096,0\n-0.9066564995512387,0.3818444875930881,1\n0.7402068966344815,-1.2555787926354631,0\n0.06798114389078425,1.6567006018020458,1\n3.4607946089302466,1.0601553971108846,0\n-0.7098864852978435,2.7386315096912277,1\n-0.7481937814060389,0.7998584561481914,1\n-0.11062809772729665,-2.6793712960067912,0\n2.588598910305861,0.4109481334370777,0\n-1.110131044456016,-0.199818037814667,1\n-0.0851359833362717,-1.9610411819898683,0\n-3.1433899515395862,1.172727468761183,1\n0.7675238791266072,-1.0307528147804452,0\n1.4846357432513972,-0.5925112419254476,0\n-0.8879486701200161,1.2836729289798539,1\n-0.1779567647973197,-1.8829301931033053,0\n-0.43238577128544553,-0.2486445263305339,1\n2.1828968696126276,-0.5052000961901955,0\n0.2185743154458235,0.1992917445785607,1\n0.19307580423315596,0.22427913310579872,1\n-0.868151048497418,1.7478611875311163,1\n1.2768208521054552,-0.3537379091884827,0\n-0.7758261200727699,0.32091954096318787,1\n-0.7565295145943544,1.79742146025221,1\n1.6012727796214794,-0.23507602267669603,0\n2.4250123692236323,0.006374873285156957,0\n-0.8294647585308828,0.7019243241891668,1\n1.1795723611899256,-1.3020245761525215,0\n1.825681507099465,-0.15303760673272893,0\n1.6217629304654932,-0.7832673910214609,0\n1.2902444479464386,-0.8723949645647273,0\n-0.17672397447643196,-1.772828123434493,0\n-0.5691361623320528,0.9836952109892753,0\n1.101087065836144,-0.9046485291079269,0\n0.8355586471300673,-1.3382401313843413,0\n0.1413912991572006,-1.8360606339557792,0\n-3.052690129216491,0.5139224737827588,1\n1.3222613111595027,-0.7316026405650973,0\n0.2545805323852315,1.4213108877145428,1\n-1.8493908773459444,0.13802488680106195,1\n-1.5740214829829526,0.5746843223160271,1\n1.9651484520801972,-0.4837510425984982,0\n-1.4039058875029145,2.2206992464682873,1\n-0.6590348227492236,1.0221749673726108,1\n0.857672799091587,-1.601687574784854,0\n1.5185907430156143,-1.0531184837693754,0\n2.02398308630164,0.4083193599441215,0\n-0.28127252101400346,0.03935964874432274,1\n-0.007127031834552211,-1.5814944632076706,0\n-0.8935912226805374,1.6885803591340416,1\n-1.5199559728518968,3.2675264623797884,1\n2.43743403287949,0.6941094768402953,0\n-0.17010308474903169,-1.2635031278567799,0\n0.2591758943575547,-1.5409666259154409,0\n-2.849635012663596,2.0247836381415434,1\n1.6516148637713068,-0.28562237922669564,0\n2.7678439296648794,1.1081717258680253,0\n-0.08771550758451108,-2.299663930748192,0\n-2.7795866650848833,0.5256280311953885,0\n-1.6308532050817528,-0.6709759493825536,1\n-2.4541853310964385,2.1965609513036135,1\n-0.5825401327083404,-2.4217066317097355,0\n1.8921362325637308,-0.5736800781361031,0\n2.3482271901154084,-0.3685202795466723,0\n1.2514165851532768,-0.8464881622845836,0\n0.29979715817899955,-1.8168498768118164,1\n1.8202277028854796,-0.40919896863710314,0\n-1.8295069758322478,2.0575711477667546,1\n0.43809560088708577,-0.34155301437399777,1\n-0.6229399825592773,1.2046525936718055,1\n0.6461011402161034,-1.5066782020388905,0\n1.1894319173258308,-1.6265409074848745,0\n1.7035128616261623,-0.44213550430144266,0\n-1.251660329246763,1.2563963397041351,1\n2.18862388336207,0.3238830740027958,0\n1.6592286310765954,-0.6718135955104536,0\n0.10521660776391784,0.2445532100302703,1\n-0.7085644396281194,2.2130257271278913,1\n-1.6743356061563262,2.508051434739665,1\n-1.052197835764334,0.5340200764876323,1\n-2.1440884554134745,1.5780504409174958,1\n-0.6693789104717047,0.6741823248411639,1\n1.09056489140318,-1.0577353892374777,0\n-1.9185635413907118,0.2701699816687618,1\n-1.8692285341496042,1.1970725125068564,1\n-2.2459768897522987,1.7446094091013076,1\n-0.8875068783824829,-1.9831809281411021,0\n-2.4364784369609622,0.5629874420632135,1\n1.2532798873472042,-1.001668426561132,0\n-1.8697314297045977,1.9537666335665174,1\n0.36417641265318346,-0.9420876552065842,0\n2.0324366768377313,-0.01329855330426255,0\n-2.8107650302135023,2.900932955194624,1\n-1.3225983180495708,0.4612006748656484,1\n-1.5220735860144097,1.752886152104234,1\n-0.4542979283794628,-2.0272587086731266,0\n1.0772014058273278,-1.4521755561576566,0\n-0.47762469762849236,-1.9580998047427527,0\n1.4311853099601197,-0.13633269248387636,0\n1.5656135237983626,-0.4282755976602861,1\n-1.4977686118009876,-0.3270188975505366,1\n0.9198075982868171,-0.8771978246535496,0\n-1.272297017776561,2.7329108068276025,1\n-1.1496040082940875,0.2671598526794654,1\n0.16741777995371998,-1.4237270581631711,0\n1.3973873218306683,-0.7708261834420633,0\n1.5760182999485548,-0.5508421087966362,0\n0.7867117984092922,-0.8376405479981235,0\n0.5971427557137339,1.2801100936643737,1\n2.2802673714026644,0.6439410565036912,0\n0.41056909999246427,0.9264983961461051,1\n-1.1271950986695398,1.6539163115681168,1\n0.8717846042242368,-0.32334229447500595,1\n-0.6907629383298526,1.5991442535263434,1\n0.025483962314019948,-1.8847440091797956,0\n-1.4404696783241138,1.952571006767836,1\n2.734795361245567,0.7035542751456509,0\n1.55682234626777,-0.9292938285973245,0\n0.7458369661685182,-1.6949511020469168,0\n-0.9506976787474808,2.1401746283586887,1\n1.1619360062525992,-1.020991299173028,1\n-2.3572911312198785,1.4759699244627114,1\n-1.9478564711112418,1.9067859912447371,1\n-0.6867144639496774,-0.15905997043802178,1\n-0.6679399697981732,2.1839206894278043,1\n-0.024791534052721054,2.79045767096982,0\n1.526916823907749,-0.6702012199334606,0\n-0.11307240586280487,0.38521193383491814,1\n0.6529472465545866,-1.3898420665318634,0\n0.17732088788495604,-1.4474654113024048,0\n0.7024345601089111,-1.699213253563307,0\n-0.7202506500258223,1.0629852942129643,1\n-0.13668681677888572,-1.9334941768861191,0\n0.43607028968441963,-0.9089460415905484,0\n-1.449900702184731,1.492831214417342,1\n-0.4711534225200791,0.902248849768318,1\n0.30973563685527705,-0.9490700377220297,0\n-0.8264581014918042,-0.35673703523956823,1\n0.3512476463741827,0.3465198794317409,1\n-1.3912712877788347,-2.247281555001944,0\n-1.434945905205172,1.5119798774401214,1\n-1.7916040601288756,3.3167825690437174,1\n-1.45662179033785,1.5115460827104406,1\n1.1027549294929668,-0.5688304355967198,0\n1.7672244497816134,-0.48671439522766435,0\n-1.6982448628851026,1.459887279377554,1\n0.42833462014292945,-1.2133616097212978,0\n0.7475471264521663,-1.3718810592749069,0\n0.6316609338176757,-1.1505836821863369,0\n2.391692961846047,0.7111207921957983,0\n-0.1833618394324521,1.444127825120543,1\n"
  },
  {
    "path": "smote/df_imbalanced.csv",
    "content": "feature_1,feature_2,label\n2.696216181610489,0.4882328664057731,0\n0.6377592102009617,-0.9141722342460896,0\n1.419400022234339,-1.0437922569600913,0\n-0.06630808133452071,-2.1423257825731,0\n2.199099572944115,0.4696569924568168,0\n0.14714489371021244,-1.4160686637084645,0\n1.3764865502796109,-1.0216190599665724,0\n0.8011870182290632,-0.8729739114779007,0\n-0.2356878546771226,-2.2351686517194786,0\n0.13550783188473925,-0.7828831336432294,0\n2.137121099154796,-0.21580519768657913,0\n0.5094886304911337,-1.0253032937784892,0\n-0.6653113597230391,-2.3502780001437173,0\n-2.0582285681117742,-3.6519500544962473,0\n2.6006131843018707,0.3731932498506709,0\n0.7475471264521663,-1.3718810592749069,0\n2.4250123692236323,0.006374873285156957,0\n2.5395342871294515,-0.15105466916358512,0\n1.8961469986294333,-0.5661385072123185,0\n0.7847064985789658,-1.3143798981550003,0\n2.3118355194496694,-0.16997090251773816,0\n0.9727961713439557,-0.48693833210377413,0\n1.0969446741758826,-0.5665679262718032,0\n1.2498067806755835,-1.1533904168928915,0\n0.21228071932876968,-1.4958357859336764,0\n0.6532741779009484,-0.3091476138968099,0\n0.688220299715036,-0.9918364485374648,0\n1.4544211697200184,-0.7732275693378345,0\n-0.0851359833362717,-1.9610411819898683,0\n0.1889350696419969,-1.842096703566853,0\n-0.17672397447643196,-1.772828123434493,0\n-0.17010308474903169,-1.2635031278567799,0\n1.3973873218306683,-0.7708261834420633,0\n0.9625266437997575,-1.1372452079079007,0\n1.819667973267,-0.5418207375050086,0\n2.2611104224733505,-0.8626454211293695,0\n-0.38694489333818827,-1.652515729971175,0\n1.1000958376012597,-0.41042162430163565,0\n1.3388855973822196,-0.5225634050970958,0\n-0.0017487763806181,-1.6177417536834255,0\n0.5075755919236363,-1.5744626264109431,0\n-0.5825401327083404,-2.4217066317097355,0\n1.4379974725105606,-0.8436059027743086,0\n2.4993763117316345,0.4733150528812744,0\n1.6592286310765954,-0.6718135955104536,0\n0.7458369661685182,-1.6949511020469168,0\n0.965611201710527,-1.1338013404391099,0\n1.9995727562323582,0.06976904764576641,0\n1.1091862916921724,-1.6149395674216378,0\n1.1510257588639181,-1.0205704770600588,0\n1.5045709424736964,-0.36537060069366023,0\n-2.7795866650848833,0.5256280311953885,0\n0.27258374963094123,-2.254895966698802,0\n1.2654175768684743,-0.7078057686442769,0\n1.2937480446231127,-0.5598328597263293,0\n1.963449749323938,0.26331917360670576,0\n1.2936080427776016,-0.5218822154131395,0\n1.2893701204081844,-0.9762111911296631,0\n0.7636689344755133,-0.8679996046971272,0\n-0.3152465381227332,-2.1244212076546334,0\n1.8765338495527928,-0.7995389938358315,0\n1.6516148637713068,-0.28562237922669564,0\n1.7035283744528456,-0.5525436231808802,0\n-1.2210040294581808,1.5865618609386538,0\n1.5339338403447556,-0.897661936990697,0\n3.4343824212918914,0.9796487943106222,0\n1.253347642233793,-0.9052395871028421,0\n0.9028110675398595,-1.1521015928257445,0\n0.06846532309580677,-2.0123696862982383,0\n1.9718573122039216,-0.6092066017421853,0\n-0.5851697560085403,-2.3672337572696334,0\n1.1894319173258308,-1.6265409074848745,0\n-0.07594359503329473,-2.796710850422487,0\n0.49740290324070013,-1.3853566353049271,0\n0.9257588126096669,-1.4619867312475097,0\n1.8202277028854796,-0.40919896863710314,0\n1.9172043248572388,-0.20302917018937972,0\n-1.3161194386060577,-2.764341707051959,0\n2.5854378252636763,-0.15891337664710015,0\n1.7672244497816134,-0.48671439522766435,0\n0.9848901769467843,-0.6156227363190017,0\n1.5760182999485548,-0.5508421087966362,0\n0.9198075982868171,-0.8771978246535496,0\n1.267167978034559,-1.114981574255851,0\n0.3261477076528907,-2.141308329990645,0\n-0.024791534052721054,2.79045767096982,0\n-0.1779567647973197,-1.8829301931033053,0\n-4.024881575533313,1.8609065914226344,0\n2.6753864913818926,-0.8214556030855155,0\n2.6791923193593012,0.4073976407297355,0\n1.4740932021664945,-1.3239781200177019,0\n0.9008547125170473,-1.0264922138602226,0\n1.5958775865508148,-1.0048644251926444,0\n-1.3937170090936455,-2.942371571762754,0\n0.8127949855344938,-0.7204831395244709,0\n1.7172122396098657,-0.20708792656367403,0\n2.087767275657729,-0.21957291016262348,0\n1.1604484302493854,-0.9630918486784845,0\n1.7183555113511282,-0.20979054293010313,0\n1.2514165851532768,-0.8464881622845836,0\n2.281374449735865,-0.06605095624680701,0\n1.2729613196318403,-0.8061083971491095,0\n0.36417641265318346,-0.9420876552065842,0\n-0.32450772703581543,0.7831319487224058,0\n0.7418163611920107,-1.379938253951535,0\n2.0135362197285627,-0.516026071179664,0\n1.79709525433866,-0.9359120494360098,0\n0.6461011402161034,-1.5066782020388905,0\n1.6164401874864303,-0.7491919569600187,0\n-1.794775530271198,1.9722830174274217,0\n0.26728711188756427,-1.9731733640648828,0\n1.526916823907749,-0.6702012199334606,0\n0.7024345601089111,-1.699213253563307,0\n0.4104113352306902,-1.6972987088735487,0\n0.4503270682963416,-1.5281611901802954,0\n0.2509953388548929,-1.9423497365922389,0\n0.13062881674773064,-1.9570997174266291,0\n1.2902444479464386,-0.8723949645647273,0\n1.8647721467197442,0.08744752589884386,0\n1.8921362325637308,-0.5736800781361031,0\n1.3543099821280564,-1.365472646123773,0\n0.49742043106142253,-1.0021980650630546,0\n-0.1455163810725073,-2.070536923870382,0\n1.3222613111595027,-0.7316026405650973,0\n2.0340220684167636,-0.6579752413210902,0\n-0.18900997332414526,-1.698729510327777,0\n1.6481092484826645,-0.23368489153255745,0\n2.7678439296648794,1.1081717258680253,0\n1.587507051001294,-0.5093852144482307,0\n0.4353497649249044,-1.5108152533124657,0\n0.02750530570054488,-1.6263780252853546,0\n1.5307196485238976,-0.6631451134032991,0\n1.5185907430156143,-1.0531184837693754,0\n0.04250447093489085,-1.8028046811106127,0\n0.9669790349425749,-1.0992386183079672,0\n0.043362026478234394,-1.3966596245762422,0\n1.3789121637202775,-0.8865963525730571,0\n-0.8227999995921815,-2.1829971891711875,0\n1.1573708906293243,-0.8222222871525701,0\n2.1942962721726444,-0.5745236662200963,0\n1.6012727796214794,-0.23507602267669603,0\n3.966071457004198,1.0546346105255182,0\n1.0772014058273278,-1.4521755561576566,0\n1.56879090845165,-0.8343385735718184,0\n0.2800294984694556,-1.7794307880261044,0\n1.825681507099465,-0.15303760673272893,0\n0.5935161923724448,-1.5667158747218264,0\n-0.003193831176726225,0.6229157797682345,0\n1.55682234626777,-0.9292938285973245,0\n2.02398308630164,0.4083193599441215,0\n1.101087065836144,-0.9046485291079269,0\n-0.8900478793547713,-3.1578228987248416,0\n2.2802673714026644,0.6439410565036912,0\n1.2877559840857793,-1.2012183836830221,0\n-0.683534181104638,-2.3067901423057577,0\n-0.6497858631872517,-1.7340333395450998,0\n-0.4542979283794628,-2.0272587086731266,0\n0.8378127373310991,-0.623022197238507,0\n-1.0500610698351838,-2.4908208493109214,0\n0.1413912991572006,-1.8360606339557792,0\n0.16741777995371998,-1.4237270581631711,0\n2.829483123749668,0.8922513469139934,0\n0.0647155940012275,-1.4884945451731122,0\n1.6217629304654932,-0.7832673910214609,0\n1.7602471231500587,0.17335291578843903,0\n0.4654950746824681,-1.074515118988505,0\n-0.818965381923211,-1.9358058582249804,0\n0.5369784823413433,-1.6571724078791412,0\n-0.649739232619122,-2.037369606890298,0\n1.857302729268008,-0.03941589834726955,0\n1.1788500278543772,-1.0935069096755725,0\n0.8904913626879825,-0.4009959645221365,0\n2.1828968696126276,-0.5052000961901955,0\n0.6292138008536463,-1.1146791767286666,0\n0.4487877763566621,-0.9337435097983982,0\n1.5777908913325738,-1.1959841640053435,0\n1.395398584745441,-0.5193517184778738,0\n0.6529472465545866,-1.3898420665318634,0\n0.7687910277793344,-1.2268449556548424,0\n3.3636808776104603,1.3544345368296185,0\n-0.6501487487759345,-2.6727692269967838,0\n0.7867117984092922,-0.8376405479981235,0\n2.0641692203942448,0.28096128015036714,0\n1.4161083025448828,-0.7506196586247008,0\n1.3436304641050714,-1.0581677238510057,0\n0.17732088788495604,-1.4474654113024048,0\n-0.00813702684659634,-2.051846631039716,0\n3.4607946089302466,1.0601553971108846,0\n1.6237864306873977,-0.2947444289786363,0\n2.3482271901154084,-0.3685202795466723,0\n1.8371745666817652,-0.3430342492926082,0\n1.347863297045506,-0.7166871221251891,0\n2.6634504270979917,-0.2106499856241938,0\n0.8660446400717803,-1.0008842681748589,0\n2.18862388336207,0.3238830740027958,0\n1.09056489140318,-1.0577353892374777,0\n-0.47762469762849236,-1.9580998047427527,0\n0.6226994523575413,-1.1748454756112456,0\n-0.38646776275743555,-1.8588202065843693,0\n1.2075565464009106,-0.5991163421217505,0\n1.3416195183351356,-0.6924474900221769,0\n0.269902339843884,-0.9918024617396816,0\n1.4113344461797381,-1.5194886689075289,0\n0.5916958305058657,-1.0030425468933921,0\n0.43607028968441963,-0.9089460415905484,0\n-0.5038376153936854,-2.429014319040797,0\n0.8245136196386991,-1.0090057198341424,0\n1.5280839059697475,-0.5937202817132765,0\n1.1363889487562904,-0.9391785439517278,0\n1.4846357432513972,-0.5925112419254476,0\n-0.16274611191935384,0.4630587680653272,0\n1.0136376607327007,-1.4608741560629206,0\n2.8204145697945453,0.17849977693130392,0\n1.2159235584543537,-0.9346003167504948,0\n-0.1470620710159285,-1.8560575974149673,0\n0.733967118092937,-1.3050665142145095,0\n1.4302593969723802,-0.4918047517644094,0\n0.6707823381392669,-1.833673064751146,0\n0.0279343625373194,-1.2172169445951928,0\n1.9651484520801972,-0.4837510425984982,0\n1.3787190117194217,-0.44096655014181896,0\n1.534205486882561,-0.5895260487475262,0\n1.8635657736155287,-0.6260986649566489,0\n2.2809052792322446,0.552956420998413,0\n0.7402068966344815,-1.2555787926354631,0\n2.734795361245567,0.7035542751456509,0\n2.7305233491718592,0.4695111445756752,0\n1.4367525182397782,-0.9770751395928354,0\n1.7019341004911768,-0.3425717210079501,0\n1.8393128973832882,-0.574943804431004,0\n-0.7870839631563373,-2.089240702144415,0\n2.391692961846047,0.7111207921957983,0\n1.0699922326700315,-1.2479508618837964,0\n1.670661514172441,-0.744356211362474,0\n1.3205319553380617,-0.5626912722085387,0\n2.1310101322231256,-0.7674191533527639,0\n-0.21649587316826557,-2.0126621262364193,0\n0.6124563596298749,-1.0669066393291813,0\n1.769809978548568,-0.5398153674879115,0\n2.1350551981212433,0.1489787932454194,0\n0.025483962314019948,-1.8847440091797956,0\n0.5717235691341322,-1.8262272268286943,0\n1.1958041991807604,-1.2123502702863305,0\n0.9516394575705613,1.2890093394565258,0\n-0.34611530444459526,-2.233667476680281,0\n1.3323755906269665,-0.46393055309206976,0\n0.20246688881051522,-1.5550773995969638,0\n0.30281925158286105,-1.5516068320893197,0\n-0.007127031834552211,-1.5814944632076706,0\n-1.2090063819110632,-3.0882813580368826,0\n2.3682028925047933,0.3504533903587326,0\n-0.09101339521452623,-2.229144068573836,0\n-1.3912712877788347,-2.247281555001944,0\n0.4824545502981564,-0.9728220889805556,0\n2.43743403287949,0.6941094768402953,0\n1.7975402278816888,-0.3241610197280269,0\n0.8477442729650762,-0.9455346029012528,0\n-0.028387979436448996,-2.3924123525563075,0\n0.9969383735608043,-0.9844757665155568,0\n3.0492289689195347,-0.19370971396682723,0\n2.125102443805207,0.15148941035410024,0\n0.40952597024111814,-1.7232014945497385,0\n0.7214647934671113,-1.1163728249150342,0\n0.11480604489343127,-1.8951766081144423,0\n2.1750539644289413,-0.2256128666732079,0\n0.7675238791266072,-1.0307528147804452,0\n2.0324366768377313,-0.01329855330426255,0\n2.215731800887835,-0.17248539126072948,0\n0.12271592323744807,-1.8758014597763673,0\n-0.26563074449726654,-2.533058608455949,0\n1.6195385721386488,-0.1764743948131542,0\n0.7041157723425708,-1.6811198857300718,0\n3.5670119486079117,1.0313399536444878,0\n3.2227382518862857,0.7330406730223069,0\n-0.12714227174716575,-2.2186139015504978,0\n0.4344383936871491,-1.0511916105889831,0\n0.30973563685527705,-0.9490700377220297,0\n1.1453533125589712,-0.7316932230012982,0\n0.0023190253320442,-1.6992543639077584,0\n1.605496378601109,-0.7426563219008542,0\n-0.4485956328977009,1.163599898492288,0\n0.9985811528297952,-1.419867026539162,0\n1.7768784951055046,-0.3360209157013806,0\n0.4036648629381442,-1.4519724741063351,0\n-0.5691361623320528,0.9836952109892753,0\n0.06346601428820053,-1.2969355882544191,0\n0.47806139026654804,-1.4785541391195263,0\n0.7413573653953694,-1.715765585279593,0\n-0.13668681677888572,-1.9334941768861191,0\n0.21978075752172666,-0.8074290438268071,0\n0.17096233120539706,-1.863691456830062,0\n2.1633916668554205,-0.22198418468262615,0\n0.2591758943575547,-1.5409666259154409,0\n1.2942917818141306,-0.5337241847084068,0\n1.7035128616261623,-0.44213550430144266,0\n0.28126359155149383,-1.7109512359432337,0\n0.42833462014292945,-1.2133616097212978,0\n2.175834009315037,-0.029320568084396204,0\n1.3040011355610173,-0.8611782711582541,0\n1.7050163742927809,0.41979852227733216,0\n0.3112219901921034,-1.7674626341622481,0\n2.6938980472065532,-0.5446054700136436,0\n-0.11062809772729665,-2.6793712960067912,0\n1.4535661158683035,-0.8695253009493249,0\n0.2029680750242978,-1.6790791590744,0\n2.588598910305861,0.4109481334370777,0\n1.240259680392343,-0.8366141564312343,0\n0.857672799091587,-1.601687574784854,0\n0.07748026126957275,-1.9513044296387552,0\n-0.08771550758451108,-2.299663930748192,0\n0.023275821168913136,-1.558084488670331,0\n1.1795723611899256,-1.3020245761525215,0\n0.8691879068449053,-1.3907535653227343,0\n1.842241126638732,-0.3030568945792822,0\n0.1358341590732265,-1.9767336475656647,0\n1.5935619763453126,-0.4409025945644771,0\n0.47174805932112596,-1.3697402007772497,0\n0.6919172009484098,-1.3365452673847602,0\n-0.3236995138765424,1.0920445570218096,0\n1.2532798873472042,-1.001668426561132,0\n1.1956248567296457,-0.5928969826691093,0\n0.11577663106069103,-1.686276531624526,0\n1.6397739821668516,-0.5319926636552961,0\n1.2449994266832107,-0.7630365192414319,0\n-0.44861136007267977,-2.00267908186771,0\n-0.11297789130878644,-1.829085053033355,0\n0.475759159442814,-1.9891050381687188,0\n2.0007816529518183,-0.17914614030775577,0\n3.3416677160494266,0.8449958074172039,0\n1.0065468577171366,-1.2382118733084468,0\n2.024947305962446,-1.0625540864728482,0\n-0.0810671189747556,-1.6489987051679837,0\n0.5681736519510394,-2.1314126092616643,0\n0.4306517379128876,-1.2866372247713858,0\n-0.8875068783824829,-1.9831809281411021,0\n0.16846059335470276,-1.371765219040044,0\n0.6194765899406693,-0.49413710958195733,0\n0.6316609338176757,-1.1505836821863369,0\n-0.18029936295740523,-1.7186321292210849,0\n0.8355586471300673,-1.3382401313843413,0\n1.5656135237983626,-0.4282755976602861,1\n0.028400672213239497,1.1183212677588823,1\n-1.662162855758965,0.06907662596661357,1\n-0.9106517343707704,2.1082772008591695,1\n0.36814044590447437,0.7122497169071077,1\n-0.5636312015844738,-0.3034060097025426,1\n-1.154434474353373,2.5694960227676704,1\n-0.6670963506176694,3.0835994440582724,1\n0.19307580423315596,0.22427913310579872,1\n-2.1476085573410293,1.758905608096354,1\n"
  },
  {
    "path": "smote/df_smoted.csv",
    "content": "feature_1,feature_2,label\n2.6962161816104895,0.4882328664057731,0\n0.6377592102009617,-0.9141722342460896,0\n1.419400022234339,-1.0437922569600913,0\n-0.06630808133452071,-2.1423257825731,0\n2.199099572944115,0.4696569924568168,0\n0.14714489371021244,-1.4160686637084643,0\n1.3764865502796109,-1.0216190599665724,0\n0.8011870182290632,-0.8729739114779007,0\n-0.2356878546771226,-2.235168651719478,0\n0.13550783188473925,-0.7828831336432294,0\n2.137121099154796,-0.21580519768657916,0\n0.5094886304911337,-1.0253032937784892,0\n-0.6653113597230391,-2.3502780001437173,0\n-2.0582285681117742,-3.6519500544962473,0\n2.6006131843018707,0.3731932498506709,0\n0.7475471264521663,-1.3718810592749069,0\n2.4250123692236323,0.006374873285156957,0\n2.5395342871294515,-0.15105466916358512,0\n1.8961469986294333,-0.5661385072123185,0\n0.7847064985789658,-1.3143798981550003,0\n2.3118355194496694,-0.16997090251773814,0\n0.9727961713439556,-0.4869383321037741,0\n1.0969446741758826,-0.5665679262718032,0\n1.2498067806755837,-1.1533904168928917,0\n0.21228071932876968,-1.4958357859336764,0\n0.6532741779009484,-0.3091476138968099,0\n0.688220299715036,-0.9918364485374648,0\n1.4544211697200184,-0.7732275693378345,0\n-0.0851359833362717,-1.9610411819898683,0\n0.1889350696419969,-1.8420967035668532,0\n-0.17672397447643196,-1.7728281234344931,0\n-0.17010308474903169,-1.26350312785678,0\n1.3973873218306685,-0.7708261834420633,0\n0.9625266437997576,-1.1372452079079007,0\n1.819667973267,-0.5418207375050086,0\n2.2611104224733505,-0.8626454211293695,0\n-0.38694489333818827,-1.6525157299711752,0\n1.1000958376012595,-0.4104216243016357,0\n1.3388855973822196,-0.5225634050970958,0\n-0.0017487763806181,-1.6177417536834255,0\n0.5075755919236363,-1.5744626264109431,0\n-0.5825401327083404,-2.4217066317097355,0\n1.4379974725105606,-0.8436059027743086,0\n2.4993763117316345,0.4733150528812744,0\n1.6592286310765954,-0.6718135955104536,0\n0.7458369661685182,-1.6949511020469168,0\n0.965611201710527,-1.13380134043911,0\n1.9995727562323584,0.06976904764576641,0\n1.1091862916921724,-1.6149395674216378,0\n1.151025758863918,-1.0205704770600588,0\n1.5045709424736964,-0.3653706006936602,0\n-2.7795866650848837,0.5256280311953885,0\n0.27258374963094123,-2.2548959666988018,0\n1.2654175768684743,-0.7078057686442769,0\n1.2937480446231129,-0.5598328597263293,0\n1.9634497493239382,0.26331917360670576,0\n1.2936080427776016,-0.5218822154131395,0\n1.2893701204081844,-0.9762111911296631,0\n0.7636689344755133,-0.8679996046971272,0\n-0.3152465381227332,-2.1244212076546334,0\n1.8765338495527928,-0.7995389938358315,0\n1.6516148637713068,-0.28562237922669564,0\n1.7035283744528456,-0.5525436231808802,0\n-1.2210040294581808,1.5865618609386538,0\n1.5339338403447556,-0.8976619369906971,0\n3.4343824212918914,0.9796487943106222,0\n1.253347642233793,-0.905239587102842,0\n0.9028110675398596,-1.1521015928257443,0\n0.06846532309580677,-2.0123696862982383,0\n1.9718573122039216,-0.6092066017421853,0\n-0.5851697560085403,-2.3672337572696334,0\n1.1894319173258308,-1.6265409074848745,0\n-0.07594359503329473,-2.7967108504224867,0\n0.4974029032407001,-1.3853566353049271,0\n0.9257588126096667,-1.4619867312475097,0\n1.82022770288548,-0.4091989686371032,0\n1.9172043248572388,-0.2030291701893797,0\n-1.3161194386060575,-2.764341707051959,0\n2.5854378252636763,-0.15891337664710015,0\n1.7672244497816134,-0.4867143952276644,0\n0.9848901769467844,-0.6156227363190017,0\n1.5760182999485548,-0.5508421087966362,0\n0.9198075982868172,-0.8771978246535496,0\n1.267167978034559,-1.1149815742558509,0\n0.3261477076528907,-2.141308329990645,0\n-0.024791534052721054,2.79045767096982,0\n-0.1779567647973197,-1.8829301931033051,0\n-4.024881575533313,1.8609065914226344,0\n2.675386491381893,-0.8214556030855155,0\n2.679192319359301,0.4073976407297355,0\n1.4740932021664943,-1.323978120017702,0\n0.9008547125170472,-1.0264922138602226,0\n1.5958775865508148,-1.0048644251926444,0\n-1.3937170090936457,-2.9423715717627537,0\n0.8127949855344938,-0.7204831395244709,0\n1.7172122396098657,-0.20708792656367406,0\n2.087767275657729,-0.21957291016262348,0\n1.1604484302493854,-0.9630918486784844,0\n1.7183555113511282,-0.20979054293010316,0\n1.2514165851532768,-0.8464881622845836,0\n2.2813744497358655,-0.06605095624680701,0\n1.2729613196318403,-0.8061083971491095,0\n0.36417641265318346,-0.9420876552065842,0\n-0.32450772703581543,0.7831319487224058,0\n0.7418163611920107,-1.379938253951535,0\n2.0135362197285627,-0.516026071179664,0\n1.79709525433866,-0.9359120494360098,0\n0.6461011402161034,-1.5066782020388905,0\n1.6164401874864305,-0.7491919569600187,0\n-1.794775530271198,1.9722830174274215,0\n0.2672871118875643,-1.9731733640648828,0\n1.526916823907749,-0.6702012199334606,0\n0.7024345601089111,-1.6992132535633069,0\n0.4104113352306902,-1.6972987088735487,0\n0.4503270682963416,-1.5281611901802954,0\n0.2509953388548929,-1.9423497365922389,0\n0.13062881674773066,-1.9570997174266287,0\n1.2902444479464386,-0.8723949645647273,0\n1.864772146719744,0.08744752589884386,0\n1.8921362325637308,-0.5736800781361031,0\n1.3543099821280564,-1.365472646123773,0\n0.4974204310614225,-1.0021980650630546,0\n-0.1455163810725073,-2.0705369238703817,0\n1.3222613111595027,-0.7316026405650973,0\n2.034022068416764,-0.6579752413210902,0\n-0.18900997332414526,-1.6987295103277769,0\n1.6481092484826645,-0.23368489153255745,0\n2.76784392966488,1.1081717258680253,0\n1.5875070510012939,-0.5093852144482307,0\n0.4353497649249044,-1.5108152533124657,0\n0.02750530570054488,-1.6263780252853546,0\n1.5307196485238976,-0.6631451134032991,0\n1.5185907430156145,-1.0531184837693754,0\n0.04250447093489085,-1.8028046811106129,0\n0.9669790349425748,-1.0992386183079672,0\n0.0433620264782344,-1.3966596245762422,0\n1.3789121637202777,-0.8865963525730571,0\n-0.8227999995921815,-2.1829971891711875,0\n1.1573708906293243,-0.8222222871525701,0\n2.1942962721726444,-0.5745236662200963,0\n1.6012727796214794,-0.23507602267669606,0\n3.9660714570041984,1.0546346105255182,0\n1.0772014058273278,-1.4521755561576566,0\n1.5687909084516498,-0.8343385735718184,0\n0.2800294984694556,-1.7794307880261044,0\n1.8256815070994652,-0.15303760673272893,0\n0.5935161923724448,-1.5667158747218264,0\n-0.003193831176726225,0.6229157797682345,0\n1.55682234626777,-0.9292938285973243,0\n2.02398308630164,0.4083193599441215,0\n1.101087065836144,-0.9046485291079268,0\n-0.8900478793547713,-3.1578228987248416,0\n2.2802673714026644,0.6439410565036912,0\n1.2877559840857793,-1.201218383683022,0\n-0.6835341811046379,-2.3067901423057577,0\n-0.6497858631872517,-1.7340333395450998,0\n-0.4542979283794628,-2.027258708673126,0\n0.8378127373310991,-0.623022197238507,0\n-1.0500610698351838,-2.4908208493109214,0\n0.1413912991572006,-1.8360606339557792,0\n0.16741777995371998,-1.4237270581631711,0\n2.829483123749668,0.8922513469139934,0\n0.0647155940012275,-1.4884945451731122,0\n1.6217629304654932,-0.7832673910214609,0\n1.7602471231500587,0.17335291578843906,0\n0.4654950746824681,-1.074515118988505,0\n-0.8189653819232109,-1.9358058582249804,0\n0.5369784823413433,-1.6571724078791412,0\n-0.649739232619122,-2.037369606890298,0\n1.8573027292680082,-0.03941589834726955,0\n1.1788500278543772,-1.0935069096755723,0\n0.8904913626879825,-0.4009959645221365,0\n2.182896869612628,-0.5052000961901955,0\n0.6292138008536463,-1.1146791767286666,0\n0.4487877763566621,-0.9337435097983982,0\n1.5777908913325738,-1.1959841640053437,0\n1.3953985847454409,-0.5193517184778738,0\n0.6529472465545866,-1.3898420665318634,0\n0.7687910277793344,-1.2268449556548424,0\n3.3636808776104603,1.3544345368296185,0\n-0.6501487487759345,-2.672769226996784,0\n0.7867117984092922,-0.8376405479981235,0\n2.0641692203942448,0.28096128015036714,0\n1.4161083025448828,-0.7506196586247008,0\n1.3436304641050714,-1.0581677238510057,0\n0.17732088788495606,-1.4474654113024048,0\n-0.00813702684659634,-2.051846631039716,0\n3.4607946089302466,1.0601553971108846,0\n1.6237864306873977,-0.2947444289786363,0\n2.3482271901154084,-0.3685202795466723,0\n1.8371745666817647,-0.3430342492926082,0\n1.347863297045506,-0.7166871221251891,0\n2.663450427097992,-0.2106499856241938,0\n0.8660446400717803,-1.0008842681748589,0\n2.18862388336207,0.3238830740027958,0\n1.09056489140318,-1.0577353892374777,0\n-0.4776246976284924,-1.9580998047427527,0\n0.6226994523575413,-1.1748454756112456,0\n-0.3864677627574356,-1.8588202065843693,0\n1.2075565464009106,-0.5991163421217505,0\n1.3416195183351356,-0.6924474900221769,0\n0.26990233984388395,-0.9918024617396816,0\n1.411334446179738,-1.5194886689075289,0\n0.5916958305058657,-1.003042546893392,0\n0.4360702896844196,-0.9089460415905484,0\n-0.5038376153936854,-2.429014319040797,0\n0.8245136196386991,-1.0090057198341424,0\n1.5280839059697475,-0.5937202817132765,0\n1.1363889487562904,-0.9391785439517278,0\n1.4846357432513972,-0.5925112419254476,0\n-0.16274611191935384,0.4630587680653272,0\n1.013637660732701,-1.4608741560629206,0\n2.8204145697945453,0.17849977693130392,0\n1.2159235584543535,-0.9346003167504948,0\n-0.1470620710159285,-1.8560575974149676,0\n0.733967118092937,-1.3050665142145097,0\n1.4302593969723802,-0.4918047517644094,0\n0.6707823381392669,-1.833673064751146,0\n0.0279343625373194,-1.2172169445951928,0\n1.9651484520801967,-0.4837510425984982,0\n1.3787190117194217,-0.44096655014181896,0\n1.5342054868825612,-0.5895260487475262,0\n1.8635657736155289,-0.6260986649566489,0\n2.2809052792322446,0.5529564209984129,0\n0.7402068966344815,-1.2555787926354631,0\n2.7347953612455664,0.7035542751456509,0\n2.7305233491718592,0.4695111445756752,0\n1.4367525182397782,-0.9770751395928354,0\n1.7019341004911768,-0.3425717210079501,0\n1.839312897383288,-0.574943804431004,0\n-0.7870839631563373,-2.0892407021444153,0\n2.3916929618460467,0.7111207921957983,0\n1.0699922326700315,-1.2479508618837964,0\n1.670661514172441,-0.7443562113624741,0\n1.3205319553380617,-0.5626912722085387,0\n2.1310101322231256,-0.7674191533527639,0\n-0.2164958731682656,-2.0126621262364197,0\n0.6124563596298749,-1.0669066393291813,0\n1.7698099785485681,-0.5398153674879115,0\n2.135055198121244,0.1489787932454194,0\n0.025483962314019948,-1.884744009179796,0\n0.5717235691341322,-1.8262272268286943,0\n1.1958041991807604,-1.2123502702863305,0\n0.9516394575705612,1.2890093394565258,0\n-0.3461153044445953,-2.2336674766802807,0\n1.3323755906269663,-0.4639305530920698,0\n0.2024668888105152,-1.5550773995969638,0\n0.30281925158286105,-1.5516068320893197,0\n-0.007127031834552211,-1.5814944632076706,0\n-1.2090063819110632,-3.088281358036882,0\n2.3682028925047933,0.3504533903587326,0\n-0.09101339521452624,-2.2291440685738357,0\n-1.391271287778835,-2.2472815550019436,0\n0.4824545502981564,-0.9728220889805556,0\n2.4374340328794903,0.6941094768402953,0\n1.7975402278816888,-0.3241610197280269,0\n0.8477442729650762,-0.9455346029012528,0\n-0.028387979436449,-2.3924123525563075,0\n0.9969383735608044,-0.9844757665155568,0\n3.0492289689195347,-0.19370971396682726,0\n2.125102443805207,0.15148941035410024,0\n0.4095259702411181,-1.7232014945497385,0\n0.7214647934671113,-1.1163728249150342,0\n0.11480604489343127,-1.8951766081144423,0\n2.1750539644289413,-0.2256128666732079,0\n0.7675238791266072,-1.0307528147804452,0\n2.0324366768377318,-0.01329855330426255,0\n2.215731800887835,-0.17248539126072948,0\n0.12271592323744808,-1.8758014597763677,0\n-0.2656307444972665,-2.533058608455949,0\n1.6195385721386488,-0.1764743948131542,0\n0.7041157723425708,-1.6811198857300718,0\n3.567011948607912,1.0313399536444878,0\n3.2227382518862857,0.7330406730223069,0\n-0.12714227174716575,-2.2186139015504978,0\n0.4344383936871491,-1.0511916105889831,0\n0.30973563685527705,-0.9490700377220296,0\n1.1453533125589712,-0.7316932230012982,0\n0.0023190253320442,-1.6992543639077584,0\n1.6054963786011092,-0.7426563219008542,0\n-0.4485956328977009,1.1635998984922882,0\n0.9985811528297952,-1.4198670265391617,0\n1.7768784951055046,-0.3360209157013806,0\n0.4036648629381442,-1.4519724741063351,0\n-0.5691361623320528,0.9836952109892751,0\n0.06346601428820052,-1.2969355882544191,0\n0.478061390266548,-1.4785541391195265,0\n0.7413573653953694,-1.7157655852795928,0\n-0.13668681677888572,-1.9334941768861191,0\n0.21978075752172666,-0.8074290438268071,0\n0.17096233120539706,-1.8636914568300618,0\n2.1633916668554205,-0.22198418468262612,0\n0.2591758943575547,-1.5409666259154409,0\n1.2942917818141306,-0.5337241847084068,0\n1.7035128616261623,-0.44213550430144266,0\n0.28126359155149383,-1.7109512359432335,0\n0.4283346201429295,-1.2133616097212978,0\n2.175834009315037,-0.029320568084396207,0\n1.3040011355610173,-0.8611782711582541,0\n1.7050163742927809,0.41979852227733216,0\n0.3112219901921034,-1.767462634162248,0\n2.693898047206553,-0.5446054700136436,0\n-0.11062809772729663,-2.6793712960067912,0\n1.4535661158683035,-0.8695253009493249,0\n0.2029680750242978,-1.6790791590743999,0\n2.588598910305861,0.4109481334370777,0\n1.240259680392343,-0.8366141564312343,0\n0.8576727990915871,-1.601687574784854,0\n0.07748026126957275,-1.9513044296387552,0\n-0.08771550758451108,-2.2996639307481916,0\n0.02327582116891314,-1.558084488670331,0\n1.1795723611899256,-1.3020245761525215,0\n0.8691879068449053,-1.3907535653227343,0\n1.842241126638732,-0.3030568945792822,0\n0.1358341590732265,-1.9767336475656647,0\n1.5935619763453126,-0.4409025945644771,0\n0.471748059321126,-1.3697402007772497,0\n0.6919172009484098,-1.3365452673847602,0\n-0.3236995138765424,1.0920445570218096,0\n1.2532798873472042,-1.001668426561132,0\n1.1956248567296457,-0.5928969826691093,0\n0.11577663106069105,-1.6862765316245258,0\n1.6397739821668516,-0.5319926636552961,0\n1.2449994266832107,-0.7630365192414319,0\n-0.44861136007267977,-2.00267908186771,0\n-0.11297789130878645,-1.829085053033355,0\n0.475759159442814,-1.9891050381687188,0\n2.0007816529518183,-0.17914614030775575,0\n3.3416677160494266,0.8449958074172039,0\n1.0065468577171366,-1.2382118733084468,0\n2.024947305962446,-1.0625540864728482,0\n-0.0810671189747556,-1.6489987051679835,0\n0.5681736519510394,-2.1314126092616643,0\n0.4306517379128876,-1.2866372247713858,0\n-0.8875068783824829,-1.983180928141102,0\n0.16846059335470276,-1.371765219040044,0\n0.6194765899406693,-0.4941371095819573,0\n0.6316609338176757,-1.1505836821863369,0\n-0.18029936295740526,-1.7186321292210849,0\n0.8355586471300673,-1.3382401313843413,0\n1.5656135237983626,-0.4282755976602861,1\n0.028400672213239494,1.1183212677588823,1\n-1.662162855758965,0.06907662596661357,1\n-0.9106517343707704,2.108277200859169,1\n0.3681404459044744,0.7122497169071077,1\n-0.5636312015844738,-0.3034060097025426,1\n-1.154434474353373,2.5694960227676704,1\n-0.6670963506176694,3.0835994440582724,1\n0.193075804233156,0.22427913310579872,1\n-2.1476085573410293,1.758905608096354,1\n0.2855310050772441,0.810988064164024,1\n-1.0485992571879525,2.369263659389733,1\n0.39631748864931116,0.12765058821113223,1\n0.07509225650751361,0.3016328673065576,1\n-1.0979366086173257,2.462606260691061,1\n-0.904344284071608,2.1016278405012043,1\n0.07787228103323418,1.066320619917082,1\n-1.4685779788464857,1.0224276673625772,1\n0.07226911014461465,0.14003530143486648,1\n-0.5191161831576591,2.6654492808116457,1\n-0.49231387101731033,-0.22566823415178783,1\n-0.9324678278091229,2.1495516278961313,1\n0.2950095665838245,0.850084842399031,1\n0.1550878297888597,1.2002755142820547,1\n-1.7544203306180215,2.1107122449801587,1\n-0.7263995752091668,-0.24821561752684534,1\n0.12518196486298855,0.5928833803637075,1\n1.330334842611185,-0.41447767597244356,1\n-0.42704960996749375,1.5984602950546716,1\n1.2090916232860005,-0.3733408874633456,1\n-0.6533359635312469,0.320013782081636,1\n1.2473664336373655,-0.1251632610936742,1\n-1.0480562983771993,0.45022054878340123,1\n1.5291661724702634,-0.4226596041412967,1\n-0.3607725555460966,2.2180149058456173,1\n1.422145734808588,-0.36006575316327294,1\n1.3806639619052206,-0.1373646477729032,1\n-0.7591087821581661,2.986533559916832,1\n-0.8143076455428315,0.9155595893964241,1\n0.1681439585286299,0.35963727905718607,1\n-0.6378010391292617,2.986218148137329,1\n-0.5246358352276256,2.6810462587968527,1\n-1.0759430941656636,2.187815595345818,1\n-1.4805560351382203,1.3215649407313614,1\n0.06552590337517494,-0.34030293729402583,1\n-0.821089432551902,0.5910870491492445,1\n-0.6563958239745722,2.733310071869238,1\n-1.415489692605045,1.2838725373411668,1\n-0.32122457512587077,1.4868987673087366,1\n-0.9192540481155407,2.8175928899338083,1\n-0.6185012352273451,1.6095934617766097,1\n-1.1332994887988805,2.5295102012152837,1\n-0.9889059148690342,1.7645794678107376,1\n0.15701281683429077,1.195866071418076,1\n-0.18251980759181058,1.383948500318712,1\n1.092251364211341,-0.4005152669111791,1\n-0.027619257078592474,0.20581658833058095,1\n0.24608427350328604,0.3720335479848652,1\n-0.7403836097760979,3.006287145193691,1\n-0.3196570436122222,-0.03746772819647892,1\n-1.6175634813551185,0.28871599403945325,1\n-1.693106868048793,0.17679225434753754,1\n-1.672187091036969,0.10397083399287436,1\n-1.6780970474889239,2.1421028098589217,1\n-0.049421108829733024,1.0700213456187113,1\n-0.8513756640426571,2.007096431098333,1\n-1.971773205734709,1.146825467600758,1\n-1.1915029160321355,2.3869443790597225,1\n-1.646264635897367,0.07040661311855256,1\n-1.9286433093636364,1.9376166056917359,1\n-1.5096575767002467,0.8201222082862651,1\n-1.8230819805521679,1.623889096908098,1\n1.1927030002268357,-0.2509802688396368,1\n-0.985925622395829,0.48878182009071414,1\n-0.8177708011776115,2.4802206936140254,1\n-0.92263460549322,1.3982917282389824,1\n0.5621595402981114,0.5813040346421361,1\n-0.12258754442812053,0.7736619678728824,1\n1.0797983728970881,0.060505242795395486,1\n-0.40235979366069574,0.6146654866358385,1\n-0.7911254000971197,1.982271662780243,1\n-0.1672543797398186,1.9386438887284363,1\n0.9999003116961138,0.1408910468036525,1\n-1.1308987967423207,2.524968270305119,1\n-0.1067297570067598,1.2914993278036195,1\n-0.5434154562570387,-0.2548591698476868,1\n0.2805603738276543,0.807858831156952,1\n-0.6865677603205549,1.8787376434126093,1\n-1.1108580340452674,1.0791792737263608,1\n-0.08105140719405024,1.2601767178645475,1\n0.11946771440716963,0.4411898660546518,1\n-1.5582197650742047,1.5853984255124454,1\n0.0726409790756119,1.0654433552831744,1\n-1.6465269073678508,2.207250289091698,1\n-0.19599956273071095,0.09732219477863513,1\n-1.5857844567414843,0.44521874721502025,1\n0.439047646097412,0.10733510544394764,1\n-0.8814668028817885,1.2421347600345662,1\n-0.8566655191073572,0.569006827035957,1\n-1.4555932427751925,1.086373838433656,1\n-1.2280370990357212,0.10539400513196016,1\n-1.6555341103110144,0.08915820273050068,1\n-1.5072293990268577,2.2815584001660443,1\n0.0807733029549375,0.21488431499843183,1\n0.6717784697572164,0.4230516889411231,1\n-1.4326655885771142,0.7643314104808709,1\n0.14920838488279112,0.46244090505433344,1\n-1.0022006332225046,2.281480911993233,1\n-1.125679576253884,1.5248062630292942,1\n-0.736868337158797,2.804196174965545,1\n-0.921693122327506,2.1644312463665956,1\n0.6334398031088708,0.5990753634589703,1\n-1.0634392633655418,0.2587442993744113,1\n-1.1219976643280745,2.6765747917071607,1\n0.08719055251817287,1.3558033997581638,1\n-0.6717111066284855,1.9772613678129614,1\n0.09796741150801036,0.3866235721581648,1\n0.018274207588824004,0.10238227635775801,1\n-1.0685928868365804,2.407090120413484,1\n-0.9242539661209109,1.4501961129400924,1\n-2.1117367712859574,1.6340364754228802,1\n-0.7427676920259675,0.9415360775218673,1\n-0.7464646370002382,0.9672286786288742,1\n0.6784272404140086,0.4167191112950674,1\n-0.7847124718874454,-0.2284432774529941,1\n-0.4021604042646115,1.6465600223205081,1\n0.9478770480627354,-0.1345810391342379,1\n-1.564543070004786,0.10000127613539518,1\n-0.3614296413015382,1.5292832428952232,1\n0.057860111406567286,1.0831100823551676,1\n-1.8777809153013565,1.9791285317481386,1\n-0.647758984347498,1.6595347207207352,1\n-0.3945521378796771,1.6372257341576588,1\n-1.0441488531324503,0.12077742582767584,1\n-0.018488756421834562,-0.3353758963455617,1\n-0.8640257128847392,2.2949920053789707,1\n0.9047959895896792,-0.11409872516044878,1\n-2.0663874473323185,1.7818460600529293,1\n-0.14265386739585262,0.8085855452920454,1\n-0.12775823424685118,0.0005474190982486249,1\n-1.517486242772043,0.020020664838619223,1\n-0.27711522068619154,1.4593165083608872,1\n-0.038824052074763804,1.200796685472286,1\n0.21410349852359262,0.5443453723839851,1\n0.7811861797506703,-0.055330091679764826,1\n0.1891166396519668,0.78673104284049,1\n-0.1654091685351491,0.8481890402777748,1\n-1.668027424834012,1.1344991179076254,1\n0.925159584067003,0.18172052213787715,1\n-0.42222360124131725,2.391658207040532,1\n0.10498843665353152,1.02678028642296,1\n-0.07358529679469195,0.5723168748302423,1\n-0.4996246099148751,-0.2587713925968733,1\n-0.9384625262501354,2.160893151717128,1\n-1.6532060562253619,2.201274095662939,1\n0.1473466161444149,0.9532851716013429,1\n0.4300052912613088,1.3579458253358836,1\n0.6952147068562441,-0.37723104635304827,1\n-0.6177209198570596,1.4672594993458792,1\n-0.4256147903449541,-0.31149998415152785,1\n-1.8043713654350917,0.5641022495802008,1\n-2.08285082577204,1.5334849456708233,1\n-1.207167353279196,2.30980143380208,1\n-0.19273084335905333,0.8828284155759192,1\n1.05105978622292,-0.18363789415542914,1\n-0.05443588313004222,1.1735664019002703,1\n-1.4615719332082444,0.13262116316253392,1\n-1.791511788515174,0.519338261133327,1\n-0.5886947931659924,1.768867832528056,1\n-1.2369959203640686,0.3329555760616906,1\n-0.6830389324837415,3.01975706673778,1\n-0.4856789583521581,-0.24904647518517803,1\n0.5566219971993202,0.5868753820257355,1\n-0.27242345452087763,0.39591106380668595,1\n-0.008605848727387233,1.171807177523354,1\n-1.4149685450024747,1.2864390426258543,1\n-0.6790636969159913,0.25790816328232014,1\n-0.8043229178623146,2.5340730023548224,1\n-0.6161989873114789,1.9091556927459759,1\n-1.0710645512931087,2.411766325828496,1\n-1.470943755459484,1.01077688330504,1\n-1.7652520350970304,0.4279284654652576,1\n0.17116693987931272,0.3432251306858457,1\n-0.13607146673867976,0.1626454035746414,1\n0.29808208607785147,-0.3539411980185594,1\n-1.4364986051350699,-0.007440072054126348,1\n-0.9318825144161967,2.296455619059672,1\n-1.1205660864675453,2.510551229130342,1\n-0.9943874452321573,1.7912345329518944,1\n0.32927433046089183,0.6698846236702323,1\n0.18382385630383102,0.25503377039672737,1\n-0.6962039177311345,0.3750795740896549,1\n1.3165361684916734,-0.41366845252756373,1\n-0.9359886085340008,2.2689987687176134,1\n-1.3946886749230427,-0.021616698593142483,1\n-0.38224222324219387,1.2255668979586463,1\n-1.498125941069462,0.876912268609922,1\n-0.6939023268283218,0.3300640432496318,1\n-1.017641956107819,2.3106947470267625,1\n0.14701071085064144,0.4743723555342828,1\n-0.7306430964671637,3.016562621240719,1\n-1.5952923226758602,0.39839518313006117,1\n0.27357009046118025,0.609165529561054,1\n1.04671276396985,0.09379282493119812,1\n-0.2690073061738048,0.40411472902108236,1\n-0.922704696659498,2.8139527269017814,1\n-1.1009890419131032,1.591803211429898,1\n0.33678324730415277,0.7464816364801301,1\n1.5053285253043407,-0.39961390013407005,1\n-1.585669068811208,1.917622299332638,1\n-0.11017303413982105,1.2956994585494677,1\n-0.15706932751526087,1.285608930267617,1\n-1.055821844710658,2.067274708509265,1\n-0.6565676892830575,0.3424732563790296,1\n-0.5814711589361063,0.1594833560592908,1\n-1.1465401994549194,1.1025736265154815,1\n-0.26099847230051687,1.7336790761892216,1\n0.3479573106638675,0.734283173119003,1\n-0.31732235310245893,-0.03492285382463822,1\n-0.6910862827723281,0.6717732263116909,1\n-0.9319768590477597,2.1486227514969003,1\n0.32200116402304557,0.5836422945235238,1\n-0.0446072899606661,1.215721958232365,1\n-0.5469767180609592,-0.2917921043878838,1\n-1.2119849554120867,2.2860760990358773,1\n-0.48141680573869816,2.558921486630749,1\n-0.20756343986828368,1.4144968778809361,1\n-0.4936390547648794,0.4392494293635941,1\n1.2306898028658109,-0.2690405869025847,1\n-0.47624293404539486,2.544301586340687,1\n-0.8338085596403579,-0.21179611021138062,1\n0.2984629707110439,-0.35396353500342503,1\n-1.4756434109010539,0.18483952092387984,1\n-1.926692926565455,1.6938713740092148,1\n-0.14124010386446717,-0.008854082724518542,1\n-1.043205309363871,0.45323130475051543,1\n0.0353178396946045,1.0807670899972728,1\n-1.3772479908043795,0.09291156554380078,1\n-0.6497628866316199,1.6911618459782893,1\n1.38019685689921,-0.3401217193200609,1\n-0.5611799671695472,1.7398615011961467,1\n0.05038400624846026,0.998970964853016,1\n-0.32060150959887745,-0.31765848953164366,1\n-1.5213132122912125,1.5745336922900288,1\n-0.6303157447714234,2.9993484978680263,1\n-0.15105142760330864,1.2790393298256206,1\n1.188944928148743,-0.06952008451211555,1\n-2.134539241889063,1.762596963745138,1\n-1.6220972004089873,0.09394328936037802,1\n-0.8217781292821769,-0.060414132768239204,1\n-0.47059423988187815,2.633484814976906,1\n-2.088621470773728,1.553572471706493,1\n-2.123050996120799,1.7428048965999858,1\n-0.4571565773896916,1.7189521309277151,1\n1.3525277592743734,-0.4157791798936589,1\n-0.6894588605666745,0.672783282426686,1\n0.2715254278514127,0.8277281308417525,1\n1.086162695376645,0.05410206890360203,1\n-1.727683492884001,0.2971529508380882,1\n-1.6534866655678402,0.09536087246683565,1\n0.0028207858215373305,1.1906028028734503,1\n0.13261129402809327,0.9937642623902843,1\n-0.537697079905557,-0.28532100375369296,1\n-0.8431402116282067,0.060509974700742264,1\n-1.0141369336376962,1.8872704691013436,1\n-0.8870431865083281,1.9442052422103782,1\n-0.746700693817758,2.764822312623528,1\n-0.6367308729846699,0.20461364203949572,1\n-0.5392282746718148,1.716719865993086,1\n-0.658044084324835,1.963995954508921,1\n-0.13733645930792815,1.8701128505240034,1\n-2.145833765760309,1.752727586042463,1\n0.5704335499310347,0.5729795157900254,1\n-0.7305317794864313,0.6472914630503296,1\n0.16618661487833086,0.6482734284274808,1\n1.4843606897194284,-0.3465267504766827,1\n-2.068192771412951,1.4824604850629768,1\n-0.21259082930109824,1.7992951943933548,1\n-0.025065472649569227,0.9899256864795339,1\n-1.0112296563541419,2.2985631525655377,1\n0.3648825393860746,0.8950529874549547,1\n-2.0639730723002736,1.4677717776890502,1\n-0.43653888563430576,1.2551924702866275,1\n-1.7391818133079409,2.124346965354764,1\n-1.8424805464682683,2.0079393324935495,1\n0.2934658984775469,0.17655000334316995,1\n-0.9891524537195099,2.3667178955730908,1\n-0.610216859393068,1.5954525189094393,1\n-0.8466277941679958,2.0407826936092963,1\n-0.3890022744713268,1.2373321412888656,1\n-1.4337090293751014,1.1941474309159896,1\n0.2578734755932886,0.9648311077924181,1\n-0.969118542144897,2.3421390632602828,1\n-0.6337079542585603,0.1836053106877007,1\n-0.48316683476005867,2.6622840419113767,1\n-1.7973064165977868,2.0448087165132938,1\n-1.5180769468684008,0.9392661420831239,1\n-0.2606210810941419,2.152512930599228,1\n-0.7046520510522736,1.7566478432907653,1\n0.25220015421921965,0.5858717341553639,1\n-1.6522915146545194,0.06572951881844837,1\n-1.090916056932081,2.2606246963552636,1\n0.3229717443611353,0.821951967725177,1\n-1.048635765622811,1.4353845718478782,1\n-0.1809283260285346,1.360787832557727,1\n-0.01813666203061201,0.07699137236560108,1\n0.36485226027570783,0.7030843146556993,1\n-0.6212154429497245,0.09678629874230393,1\n-0.3536592625330503,2.1979147486037345,1\n0.15236817530859,0.44528600289827536,1\n-0.23599824075888481,0.9542226473039266,1\n0.31669091354229706,0.1655079800628062,1\n-1.1935092683385826,1.1333680291260277,1\n-1.7234850433100333,1.4808368586387113,1\n-0.7754047815971928,0.619441130160252,1\n-2.0798132028978733,1.819565755125107,1\n-0.8150030210417422,2.927569530548047,1\n0.16399435727369027,1.1798739099418967,1\n-0.27572692638094437,1.4976431203651983,1\n-0.24948144048925341,0.5165953152327897,1\n-0.25860644919279197,0.9401909110412536,1\n-0.7872590892351267,1.9781957695178387,1\n-1.0108269269806942,1.8364551285752793,1\n1.4366422508590402,-0.36695792814214767,1\n-2.0039489963837003,1.7994814541527653,1\n1.288523285268502,-0.16436283227381648,1\n-0.7659306445323986,1.9502885753122272,1\n-0.12543081465816242,1.307051177350449,1\n0.07992387499688136,1.056738525673999,1\n-1.4373992911978997,1.9595002755088489,1\n-0.8212568961561384,2.2023001905024824,1\n0.9508627753232702,0.19022793594292386,1\n0.22165755755886007,0.8721616566369426,1\n1.293106441870763,-0.1687280294728205,1\n-0.7511767165828502,0.9999761449674558,1\n-0.8903902498528155,0.5480756449507719,1\n0.35492160207211887,0.7283741443810821,1\n-1.3468131919559134,-0.037849991472564126,1\n-0.03286974265820408,0.8790865816915391,1\n-1.9413548470064614,1.927241938505484,1\n"
  },
  {
    "path": "smote/readme.md",
    "content": "### Code examples for \"Handling Imbalanced Datasets with Smote\" by Juan De Dios Santos\n----- \n- Please use the requirements.txt to install packages necessary to run these examples.\n- Functions have been placed in a separate module to make these examples easier to execute.\n"
  },
  {
    "path": "smote/requirements.txt",
    "content": "imblearn\nimbalanced-learn==0.4.3\nmatplotlib==3.0.3\nnumpy==1.16.1\npandas==0.24.1\nscikit-learn==0.20.3\n"
  },
  {
    "path": "smote/training_base.py",
    "content": "import pandas as pd\n\nfrom common import plot_svm_boundary, train_SVM\n\ndf = pd.read_csv('df_base.csv', encoding='utf-8', engine='python')\nclf = train_SVM(df)\nplot_svm_boundary(clf, df, \"Decision Boundary of SVM trained with a balanced dataset\")\n"
  },
  {
    "path": "smote/training_imbalanced.py",
    "content": "import pandas as pd\n\nfrom common import plot_svm_boundary, train_SVM\n\ndf = pd.read_csv('df_imbalanced.csv', encoding='utf-8', engine='python')\nclf = train_SVM(df)\nplot_svm_boundary(clf, df, \"Decision Boundary of SVM trained with an imbalanced dataset\")\n"
  },
  {
    "path": "smote/training_smoted.py",
    "content": "import pandas as pd\n\nfrom common import plot_svm_boundary, train_SVM\n\ndf = pd.read_csv('df_smoted.csv', encoding='utf-8', engine='python')\nclf = train_SVM(df)\nplot_svm_boundary(clf, df, \"Decision Boundary of SVM trained with a synthetic dataset\")\n"
  },
  {
    "path": "statistical-modeling/examples.py",
    "content": "\"\"\"\nSummary Statistics with Numpy\n\"\"\"\n\nimport numpy as np\n\n# Define a python list\na_list = [2, 4, -1, 5.5, 3.5, -2, 5, 4, 6.5, 7.5]\n\n# Convert the list into numpy array\nan_array = np.array(a_list)\n\n# Compute and print various statistics\nprint('Mean:', an_array.mean())\nprint('Median:', np.median(an_array))\nprint('Range (Max - min):', np.ptp(an_array))\nprint('Standard deviation:', an_array.std())\nprint('80th percentile:', np.percentile(an_array, 80))\nprint('0.2-quantile:', np.quantile(an_array, 0.2))\n\n\"\"\"\nVisualization with Matplotlib and Seaborn\n\"\"\"\n\nimport matplotlib.pyplot as plt\n\nplt.plot(an_array)\nplt.show()\n\nplt.figure(figsize=(9, 5))\nplt.title('A basic plot', fontsize=18)\nplt.plot(an_array, color='blue', linestyle='--',\n         linewidth=4, marker='o', markersize=20)\nplt.xlabel('X-axis points', fontsize=14)\nplt.ylabel('Y-axis points', fontsize=14)\nplt.xticks(fontsize=14)\nplt.yticks(fontsize=14)\nplt.grid(True)\nplt.show()\n\n\"\"\"\nStatsmodels\n\"\"\"\n\nimport numpy as np\nimport statsmodels.api as sm\n\n# Input variables\nnobs = 100\nX = np.random.random((nobs, 2))\nX = sm.add_constant(X)\n\n# Regression coefficients\nbeta = [1, .1, .5]\n\n# Random errors\ne = np.random.random(nobs)\n\n# Output y\ny = np.dot(X, beta) + e\n\n# Fit the regression model\nreg_model = sm.OLS(y, X).fit()\n\n# Print the summary\nprint(reg_model.summary())\n"
  },
  {
    "path": "statistical-modeling/readme.md",
    "content": "## Examples for Statistical Modeling\n"
  },
  {
    "path": "what-is-django-part-1/config/__init__.py",
    "content": ""
  },
  {
    "path": "what-is-django-part-1/config/settings.py",
    "content": "\"\"\"\nDjango settings for config project.\n\nGenerated by 'django-admin startproject' using Django 2.1.7.\n\nFor more information on this file, see\nhttps://docs.djangoproject.com/en/2.1/topics/settings/\n\nFor the full list of settings and their values, see\nhttps://docs.djangoproject.com/en/2.1/ref/settings/\n\"\"\"\n\nimport os\n\n# Build paths inside the project like this: os.path.join(BASE_DIR, ...)\nBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\n\n\n# Quick-start development settings - unsuitable for production\n# See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/\n\n# SECURITY WARNING: keep the secret key used in production secret!\nSECRET_KEY = '72vw-e2$=)1-c(gq7d#*gp5nz**u53m%)f^nspi2dxzi9316x$'\n\n# SECURITY WARNING: don't run with debug turned on in production!\nDEBUG = True\n\nALLOWED_HOSTS = []\n\n\n# Application definition\n\nINSTALLED_APPS = [\n    'django.contrib.admin',\n    'django.contrib.auth',\n    'django.contrib.contenttypes',\n    'django.contrib.sessions',\n    'django.contrib.messages',\n    'django.contrib.staticfiles',\n\n    # our apps\n    'scenes',\n]\n\nMIDDLEWARE = [\n    'django.middleware.security.SecurityMiddleware',\n    'django.contrib.sessions.middleware.SessionMiddleware',\n    'django.middleware.common.CommonMiddleware',\n    'django.middleware.csrf.CsrfViewMiddleware',\n    'django.contrib.auth.middleware.AuthenticationMiddleware',\n    'django.contrib.messages.middleware.MessageMiddleware',\n    'django.middleware.clickjacking.XFrameOptionsMiddleware',\n]\n\nROOT_URLCONF = 'config.urls'\n\nTEMPLATES = [\n    {\n        'BACKEND': 'django.template.backends.django.DjangoTemplates',\n        'DIRS': [],\n        'APP_DIRS': True,\n        'OPTIONS': {\n            'context_processors': [\n                'django.template.context_processors.debug',\n                'django.template.context_processors.request',\n                'django.contrib.auth.context_processors.auth',\n                'django.contrib.messages.context_processors.messages',\n            ],\n        },\n    },\n]\n\nWSGI_APPLICATION = 'config.wsgi.application'\n\n\n# Database\n# https://docs.djangoproject.com/en/2.1/ref/settings/#databases\n\nDATABASES = {\n    'default': {\n        'ENGINE': 'django.db.backends.sqlite3',\n        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),\n    }\n}\n\n\n# Password validation\n# https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators\n\nAUTH_PASSWORD_VALIDATORS = [\n    {\n        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',\n    },\n    {\n        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',\n    },\n    {\n        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',\n    },\n    {\n        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',\n    },\n]\n\n\n# Internationalization\n# https://docs.djangoproject.com/en/2.1/topics/i18n/\n\nLANGUAGE_CODE = 'en-us'\n\nTIME_ZONE = 'UTC'\n\nUSE_I18N = True\n\nUSE_L10N = True\n\nUSE_TZ = True\n\n\n# Static files (CSS, JavaScript, Images)\n# https://docs.djangoproject.com/en/2.1/howto/static-files/\n\nSTATIC_URL = '/static/'  # The url at which our files are served from our web server to the browser\n"
  },
  {
    "path": "what-is-django-part-1/config/urls.py",
    "content": "\"\"\"config URL Configuration\n\nThe `urlpatterns` list routes URLs to views. For more information please see:\n    https://docs.djangoproject.com/en/2.1/topics/http/urls/\nExamples:\nFunction views\n    1. Add an import:  from my_app import views\n    2. Add a URL to urlpatterns:  path('', views.home, name='home')\nClass-based views\n    1. Add an import:  from other_app.views import Home\n    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')\nIncluding another URLconf\n    1. Import the include() function: from django.urls import include, path\n    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))\n\"\"\"\nfrom django.contrib import admin\nfrom django.urls import path, include\n\nfrom scenes.urls import scene_patterns\n\nurlpatterns = [\n    path('admin/', admin.site.urls),\n    path('scenes/', include((scene_patterns, 'scenes')))\n]\n"
  },
  {
    "path": "what-is-django-part-1/config/wsgi.py",
    "content": "\"\"\"\nWSGI config for config project.\n\nIt exposes the WSGI callable as a module-level variable named ``application``.\n\nFor more information on this file, see\nhttps://docs.djangoproject.com/en/2.1/howto/deployment/wsgi/\n\"\"\"\n\nimport os\n\nfrom django.core.wsgi import get_wsgi_application\n\nos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')\n\napplication = get_wsgi_application()\n"
  },
  {
    "path": "what-is-django-part-1/scenes/__init__.py",
    "content": ""
  },
  {
    "path": "what-is-django-part-1/scenes/admin.py",
    "content": "from django.contrib import admin\n\n# Register your models here.\n"
  },
  {
    "path": "what-is-django-part-1/scenes/apps.py",
    "content": "from django.apps import AppConfig\n\n\nclass ScenesConfig(AppConfig):\n    name = 'scenes'\n"
  },
  {
    "path": "what-is-django-part-1/scenes/constants.py",
    "content": "SCENES = (\n    'Players present the Worlds Worst applicants for a job.',\n    'Players act out a talk show with one as host, two guests and one audience member.',\n    'Players perform a scene speaking in (or inventing) euphemisms.',\n)\n"
  },
  {
    "path": "what-is-django-part-1/scenes/migrations/__init__.py",
    "content": ""
  },
  {
    "path": "what-is-django-part-1/scenes/models.py",
    "content": "from django.db import models\n\n# Create your models here.\n"
  },
  {
    "path": "what-is-django-part-1/scenes/templates/scenes/scene.html",
    "content": "{{ scenes|random }}\n"
  },
  {
    "path": "what-is-django-part-1/scenes/tests.py",
    "content": "from django.test import TestCase\n\n# Create your tests here.\n"
  },
  {
    "path": "what-is-django-part-1/scenes/urls.py",
    "content": "from django.urls import path\n\nfrom .views import SceneView\n\n\nscene_patterns = [\n    path('scene', SceneView.as_view()),\n]\n"
  },
  {
    "path": "what-is-django-part-1/scenes/views.py",
    "content": "from django.views.generic import TemplateView\n\nfrom .constants import SCENES\n\n\nclass SceneView(TemplateView):\n    template_name = 'scenes/scene.html'\n\n    def get_context_data(self, **kwargs):\n        context = super(SceneView, self).get_context_data(**kwargs)\n        context['scenes'] = SCENES\n        return context\n"
  },
  {
    "path": "what-is-django-part-2/common/__init__.py",
    "content": ""
  },
  {
    "path": "what-is-django-part-2/common/admin.py",
    "content": "from django.contrib import admin\n\n# Register your models here.\n"
  },
  {
    "path": "what-is-django-part-2/common/apps.py",
    "content": "from django.apps import AppConfig\n\n\nclass CommonConfig(AppConfig):\n    name = 'common'\n"
  },
  {
    "path": "what-is-django-part-2/common/migrations/__init__.py",
    "content": ""
  },
  {
    "path": "what-is-django-part-2/common/models.py",
    "content": "from django.db import models\n\n# Create your models here.\n"
  },
  {
    "path": "what-is-django-part-2/common/templates/common/__base.html",
    "content": "{% load static %}\n\n<!doctype html>\n<!--[if lt IE 7]>      <html class=\"no-js lt-ie9 lt-ie8 lt-ie7\" lang=\"\"> <![endif]-->\n<!--[if IE 7]>         <html class=\"no-js lt-ie9 lt-ie8\" lang=\"\"> <![endif]-->\n<!--[if IE 8]>         <html class=\"no-js lt-ie9\" lang=\"\"> <![endif]-->\n<!--[if gt IE 8]><!-->\n<html class=\"no-js\" lang=\"\"> <!--<![endif]-->\n    <head>\n        <meta charset=\"utf-8\">\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\n        <title></title>\n        <meta name=\"description\" content=\"\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\n        <link rel=\"stylesheet\" href=\"{% static 'css/bootstrap.min.css' %}\">\n        <style>\n            body {\n                padding-top: 50px;\n                padding-bottom: 20px;\n            }\n        </style>\n        <link rel=\"stylesheet\" href={% static 'css/bootstrap-theme.min.css' %}>\n        <link rel=\"stylesheet\" href={% static 'css/main.css' %}>\n\n        <script src={% static 'js/vendor/modernizr-2.8.3-respond-1.4.2.min.js' %}></script>\n    </head>\n    <body>\n        <!--[if lt IE 8]>\n                    <p class=\"browserupgrade\">You are using an <strong>outdated</strong> browser. Please <a href=\"http://browsehappy.com/\">upgrade your browser</a> to improve your experience.</p>\n                <![endif]-->\n\n        <!-- Main jumbotron for a primary marketing message or call to action -->\n        <div class=\"container\">\n            <div class=\"jumbotron\">\n                {% block content %}\n                    {# nothing to see here, inherit from your other templates to put content in this block #}\n                {% endblock content %}\n            </div>\n        </div>\n\n        <footer>\n        </footer>\n\n        </div> <!-- /container -->\n        <script src=\"//ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js\"></script>\n        <script>window.jQuery || document.write('<script src={% static 'js/vendor/jquery-1.11.2.min.js' %} ><\\/script>')</script>\n\n        <script src={% static 'js/vendor/bootstrap.min.js' %}></script>\n\n        <script src={% static 'js/main.js' %}></script>\n\n        <!-- Google Analytics: change UA-XXXXX-X to be your site's ID. -->\n        <script>\n            (function (b, o, i, l, e, r) {\n                b.GoogleAnalyticsObject = l;\n                b[l] || (b[l] =\n                    function () {\n                        (b[l].q = b[l].q || []).push(arguments)\n                    });\n                b[l].l = +new Date;\n                e = o.createElement(i);\n                r = o.getElementsByTagName(i)[0];\n                e.src = '//www.google-analytics.com/analytics.js';\n                r.parentNode.insertBefore(e, r)\n            }(window, document, 'script', 'ga'));\n            ga('create', 'UA-XXXXX-X', 'auto');\n            ga('send', 'pageview');\n        </script>\n    </body>\n</html>\n"
  },
  {
    "path": "what-is-django-part-2/common/tests.py",
    "content": "from django.test import TestCase\n\n# Create your tests here.\n"
  },
  {
    "path": "what-is-django-part-2/common/views.py",
    "content": "from django.shortcuts import render\n\n# Create your views here.\n"
  },
  {
    "path": "what-is-django-part-2/config/__init__.py",
    "content": ""
  },
  {
    "path": "what-is-django-part-2/config/settings.py",
    "content": "\"\"\"\nDjango settings for config project.\n\nGenerated by 'django-admin startproject' using Django 2.1.7.\n\nFor more information on this file, see\nhttps://docs.djangoproject.com/en/2.1/topics/settings/\n\nFor the full list of settings and their values, see\nhttps://docs.djangoproject.com/en/2.1/ref/settings/\n\"\"\"\n\nimport os\n\n# Build paths inside the project like this: os.path.join(BASE_DIR, ...)\nBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\n\n\n# Quick-start development settings - unsuitable for production\n# See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/\n\n# SECURITY WARNING: keep the secret key used in production secret!\nSECRET_KEY = '72vw-e2$=)1-c(gq7d#*gp5nz**u53m%)f^nspi2dxzi9316x$'\n\n# SECURITY WARNING: don't run with debug turned on in production!\nDEBUG = True\n\nALLOWED_HOSTS = []\n\n\n# Application definition\n\nINSTALLED_APPS = [\n    'django.contrib.admin',\n    'django.contrib.auth',\n    'django.contrib.contenttypes',\n    'django.contrib.sessions',\n    'django.contrib.messages',\n    'django.contrib.staticfiles',\n\n    # our apps\n    'common',\n    'scenes',\n]\n\nMIDDLEWARE = [\n    'django.middleware.security.SecurityMiddleware',\n    'django.contrib.sessions.middleware.SessionMiddleware',\n    'django.middleware.common.CommonMiddleware',\n    'django.middleware.csrf.CsrfViewMiddleware',\n    'django.contrib.auth.middleware.AuthenticationMiddleware',\n    'django.contrib.messages.middleware.MessageMiddleware',\n    'django.middleware.clickjacking.XFrameOptionsMiddleware',\n]\n\nROOT_URLCONF = 'config.urls'\n\nTEMPLATES = [\n    {\n        'BACKEND': 'django.template.backends.django.DjangoTemplates',\n        'DIRS': [],\n        'APP_DIRS': True,\n        'OPTIONS': {\n            'context_processors': [\n                'django.template.context_processors.debug',\n                'django.template.context_processors.request',\n                'django.contrib.auth.context_processors.auth',\n                'django.contrib.messages.context_processors.messages',\n            ],\n        },\n    },\n]\n\nWSGI_APPLICATION = 'config.wsgi.application'\n\n\n# Database\n# https://docs.djangoproject.com/en/2.1/ref/settings/#databases\n\nDATABASES = {\n    'default': {\n        'ENGINE': 'django.db.backends.sqlite3',\n        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),\n    }\n}\n\n\n# Password validation\n# https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators\n\nAUTH_PASSWORD_VALIDATORS = [\n    {\n        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',\n    },\n    {\n        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',\n    },\n    {\n        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',\n    },\n    {\n        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',\n    },\n]\n\n\n# Internationalization\n# https://docs.djangoproject.com/en/2.1/topics/i18n/\n\nLANGUAGE_CODE = 'en-us'\n\nTIME_ZONE = 'UTC'\n\nUSE_I18N = True\n\nUSE_L10N = True\n\nUSE_TZ = True\n\n\n# Static files (CSS, JavaScript, Images)\n# https://docs.djangoproject.com/en/2.1/howto/static-files/\n\nSTATICFILES_DIRS = ['static']  # Where we put our static files to be collected by collectstatic call\nSTATIC_ROOT = 'staticfiles'  # Where the system puts our files after collection\nSTATIC_URL = '/static/'  # The url at which our files are served from our web server to the browser\n"
  },
  {
    "path": "what-is-django-part-2/config/urls.py",
    "content": "\"\"\"config URL Configuration\n\nThe `urlpatterns` list routes URLs to views. For more information please see:\n    https://docs.djangoproject.com/en/2.1/topics/http/urls/\nExamples:\nFunction views\n    1. Add an import:  from my_app import views\n    2. Add a URL to urlpatterns:  path('', views.home, name='home')\nClass-based views\n    1. Add an import:  from other_app.views import Home\n    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')\nIncluding another URLconf\n    1. Import the include() function: from django.urls import include, path\n    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))\n\"\"\"\nfrom django.contrib import admin\nfrom django.urls import path, include\n\nfrom scenes.urls import scene_patterns\n\nurlpatterns = [\n    path('admin/', admin.site.urls),\n    path('scenes/', include((scene_patterns, 'scenes')))\n]\n"
  },
  {
    "path": "what-is-django-part-2/config/wsgi.py",
    "content": "\"\"\"\nWSGI config for config project.\n\nIt exposes the WSGI callable as a module-level variable named ``application``.\n\nFor more information on this file, see\nhttps://docs.djangoproject.com/en/2.1/howto/deployment/wsgi/\n\"\"\"\n\nimport os\n\nfrom django.core.wsgi import get_wsgi_application\n\nos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')\n\napplication = get_wsgi_application()\n"
  },
  {
    "path": "what-is-django-part-2/scenes/__init__.py",
    "content": ""
  },
  {
    "path": "what-is-django-part-2/scenes/admin.py",
    "content": "from django.contrib import admin\n\n# Register your models here.\n"
  },
  {
    "path": "what-is-django-part-2/scenes/apps.py",
    "content": "from django.apps import AppConfig\n\n\nclass ScenesConfig(AppConfig):\n    name = 'scenes'\n"
  },
  {
    "path": "what-is-django-part-2/scenes/constants.py",
    "content": "SCENES = (\n    'Players present the Worlds Worst applicants for a job.',\n    'Players act out a talk show with one as host, two guests and one audience member.',\n    'Players perform a scene speaking in (or inventing) euphemisms.',\n)\n"
  },
  {
    "path": "what-is-django-part-2/scenes/migrations/__init__.py",
    "content": ""
  },
  {
    "path": "what-is-django-part-2/scenes/models.py",
    "content": "from django.db import models\n\n# Create your models here.\n"
  },
  {
    "path": "what-is-django-part-2/scenes/templates/scenes/scene.html",
    "content": "{% extends 'common/__base.html' %}\n\n{% block content %}\n    <div class=\"text-center\">\n        <h2>\n            {{ scenes|random }}\n        </h2>\n    </div>\n{% endblock content %}\n"
  },
  {
    "path": "what-is-django-part-2/scenes/tests.py",
    "content": "from django.test import TestCase\n\n# Create your tests here.\n"
  },
  {
    "path": "what-is-django-part-2/scenes/urls.py",
    "content": "from django.urls import path\n\nfrom .views import SceneView\n\n\nscene_patterns = [\n    path('scene', SceneView.as_view()),\n]\n"
  },
  {
    "path": "what-is-django-part-2/scenes/views.py",
    "content": "from django.views.generic import TemplateView\n\nfrom .constants import SCENES\n\n\nclass SceneView(TemplateView):\n    template_name = 'scenes/scene.html'\n\n    def get_context_data(self, **kwargs):\n        context = super(SceneView, self).get_context_data(**kwargs)\n        context['scenes'] = SCENES\n        return context\n"
  },
  {
    "path": "what-is-django-part-2/static/404.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <title>Page Not Found</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <style>\n\n        * {\n            line-height: 1.2;\n            margin: 0;\n        }\n\n        html {\n            color: #888;\n            display: table;\n            font-family: sans-serif;\n            height: 100%;\n            text-align: center;\n            width: 100%;\n        }\n\n        body {\n            display: table-cell;\n            vertical-align: middle;\n            margin: 2em auto;\n        }\n\n        h1 {\n            color: #555;\n            font-size: 2em;\n            font-weight: 400;\n        }\n\n        p {\n            margin: 0 auto;\n            width: 280px;\n        }\n\n        @media only screen and (max-width: 280px) {\n\n            body, p {\n                width: 95%;\n            }\n\n            h1 {\n                font-size: 1.5em;\n                margin: 0 0 0.3em;\n            }\n\n        }\n\n    </style>\n</head>\n<body>\n    <h1>Page Not Found</h1>\n    <p>Sorry, but the page you were trying to view does not exist.</p>\n</body>\n</html>\n<!-- IE needs 512+ bytes: http://blogs.msdn.com/b/ieinternals/archive/2010/08/19/http-error-pages-in-internet-explorer.aspx -->\n"
  },
  {
    "path": "what-is-django-part-2/static/css/bootstrap-theme.css",
    "content": "/*!\n * Bootstrap v3.3.1 (http://getbootstrap.com)\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n  text-shadow: none;\n}\n.btn:active,\n.btn.active {\n  background-image: none;\n}\n.btn-default {\n  text-shadow: 0 1px 0 #fff;\n  background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n  background-image:      -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));\n  background-image:         linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #dbdbdb;\n  border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n  background-color: #e0e0e0;\n  background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n  background-color: #e0e0e0;\n  border-color: #dbdbdb;\n}\n.btn-default:disabled,\n.btn-default[disabled] {\n  background-color: #e0e0e0;\n  background-image: none;\n}\n.btn-primary {\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n  background-image:      -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));\n  background-image:         linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n  background-color: #265a88;\n  background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n  background-color: #265a88;\n  border-color: #245580;\n}\n.btn-primary:disabled,\n.btn-primary[disabled] {\n  background-color: #265a88;\n  background-image: none;\n}\n.btn-success {\n  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n  background-image:      -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));\n  background-image:         linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n  background-color: #419641;\n  background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n  background-color: #419641;\n  border-color: #3e8f3e;\n}\n.btn-success:disabled,\n.btn-success[disabled] {\n  background-color: #419641;\n  background-image: none;\n}\n.btn-info {\n  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n  background-image:      -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));\n  background-image:         linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n  background-color: #2aabd2;\n  background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n  background-color: #2aabd2;\n  border-color: #28a4c9;\n}\n.btn-info:disabled,\n.btn-info[disabled] {\n  background-color: #2aabd2;\n  background-image: none;\n}\n.btn-warning {\n  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n  background-image:      -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));\n  background-image:         linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n  background-color: #eb9316;\n  background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n  background-color: #eb9316;\n  border-color: #e38d13;\n}\n.btn-warning:disabled,\n.btn-warning[disabled] {\n  background-color: #eb9316;\n  background-image: none;\n}\n.btn-danger {\n  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n  background-image:      -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));\n  background-image:         linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n  background-color: #c12e2a;\n  background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n  background-color: #c12e2a;\n  border-color: #b92c28;\n}\n.btn-danger:disabled,\n.btn-danger[disabled] {\n  background-color: #c12e2a;\n  background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);\n          box-shadow: 0 1px 2px rgba(0, 0, 0, .075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  background-color: #e8e8e8;\n  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image:      -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));\n  background-image:         linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n  background-repeat: repeat-x;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  background-color: #2e6da4;\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n  background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n  background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n  background-repeat: repeat-x;\n}\n.navbar-default {\n  background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);\n  background-image:      -o-linear-gradient(top, #fff 0%, #f8f8f8 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));\n  background-image:         linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n  background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n  background-image:      -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));\n  background-image:         linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n  background-repeat: repeat-x;\n  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n  text-shadow: 0 1px 0 rgba(255, 255, 255, .25);\n}\n.navbar-inverse {\n  background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);\n  background-image:      -o-linear-gradient(top, #3c3c3c 0%, #222 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));\n  background-image:         linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n  background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n  background-image:      -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));\n  background-image:         linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n  background-repeat: repeat-x;\n  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);\n          box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  border-radius: 0;\n}\n@media (max-width: 767px) {\n  .navbar .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #fff;\n    background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n    background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n    background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n    background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n    background-repeat: repeat-x;\n  }\n}\n.alert {\n  text-shadow: 0 1px 0 rgba(255, 255, 255, .2);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);\n}\n.alert-success {\n  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n  background-image:      -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));\n  background-image:         linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #b2dba1;\n}\n.alert-info {\n  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n  background-image:      -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));\n  background-image:         linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #9acfea;\n}\n.alert-warning {\n  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n  background-image:      -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));\n  background-image:         linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #f5e79e;\n}\n.alert-danger {\n  background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n  background-image:      -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));\n  background-image:         linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #dca7a7;\n}\n.progress {\n  background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n  background-image:      -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));\n  background-image:         linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar {\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n  background-image:      -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));\n  background-image:         linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar-success {\n  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n  background-image:      -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));\n  background-image:         linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar-info {\n  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n  background-image:      -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));\n  background-image:         linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar-warning {\n  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n  background-image:      -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));\n  background-image:         linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar-danger {\n  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n  background-image:      -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));\n  background-image:         linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n  background-repeat: repeat-x;\n}\n.progress-bar-striped {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.list-group {\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);\n          box-shadow: 0 1px 2px rgba(0, 0, 0, .075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  text-shadow: 0 -1px 0 #286090;\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n  background-image:      -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a));\n  background-image:         linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n  text-shadow: none;\n}\n.panel {\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);\n          box-shadow: 0 1px 2px rgba(0, 0, 0, .05);\n}\n.panel-default > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image:      -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));\n  background-image:         linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n  background-repeat: repeat-x;\n}\n.panel-primary > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n  background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n  background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n  background-repeat: repeat-x;\n}\n.panel-success > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n  background-image:      -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));\n  background-image:         linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n  background-repeat: repeat-x;\n}\n.panel-info > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n  background-image:      -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));\n  background-image:         linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n  background-repeat: repeat-x;\n}\n.panel-warning > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n  background-image:      -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));\n  background-image:         linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n  background-repeat: repeat-x;\n}\n.panel-danger > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n  background-image:      -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));\n  background-image:         linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n  background-repeat: repeat-x;\n}\n.well {\n  background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n  background-image:      -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n  background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));\n  background-image:         linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n  background-repeat: repeat-x;\n  border-color: #dcdcdc;\n  -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);\n          box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */\n"
  },
  {
    "path": "what-is-django-part-2/static/css/bootstrap.css",
    "content": "/*!\n * Bootstrap v3.3.1 (http://getbootstrap.com)\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\nhtml {\n  font-family: sans-serif;\n  -webkit-text-size-adjust: 100%;\n      -ms-text-size-adjust: 100%;\n}\nbody {\n  margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block;\n  vertical-align: baseline;\n}\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n[hidden],\ntemplate {\n  display: none;\n}\na {\n  background-color: transparent;\n}\na:active,\na:hover {\n  outline: 0;\n}\nabbr[title] {\n  border-bottom: 1px dotted;\n}\nb,\nstrong {\n  font-weight: bold;\n}\ndfn {\n  font-style: italic;\n}\nh1 {\n  margin: .67em 0;\n  font-size: 2em;\n}\nmark {\n  color: #000;\n  background: #ff0;\n}\nsmall {\n  font-size: 80%;\n}\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\nsup {\n  top: -.5em;\n}\nsub {\n  bottom: -.25em;\n}\nimg {\n  border: 0;\n}\nsvg:not(:root) {\n  overflow: hidden;\n}\nfigure {\n  margin: 1em 40px;\n}\nhr {\n  height: 0;\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n}\npre {\n  overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  margin: 0;\n  font: inherit;\n  color: inherit;\n}\nbutton {\n  overflow: visible;\n}\nbutton,\nselect {\n  text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button;\n  cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\ninput {\n  line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n  padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\nfieldset {\n  padding: .35em .625em .75em;\n  margin: 0 2px;\n  border: 1px solid #c0c0c0;\n}\nlegend {\n  padding: 0;\n  border: 0;\n}\ntextarea {\n  overflow: auto;\n}\noptgroup {\n  font-weight: bold;\n}\ntable {\n  border-spacing: 0;\n  border-collapse: collapse;\n}\ntd,\nth {\n  padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n  *,\n  *:before,\n  *:after {\n    color: #000 !important;\n    text-shadow: none !important;\n    background: transparent !important;\n    -webkit-box-shadow: none !important;\n            box-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  a[href^=\"#\"]:after,\n  a[href^=\"javascript:\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  select {\n    background: #fff !important;\n  }\n  .navbar {\n    display: none;\n  }\n  .btn > .caret,\n  .dropup > .btn > .caret {\n    border-top-color: #000 !important;\n  }\n  .label {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n@font-face {\n  font-family: 'Glyphicons Halflings';\n\n  src: url('../fonts/glyphicons-halflings-regular.eot');\n  src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n  content: \"\\2a\";\n}\n.glyphicon-plus:before {\n  content: \"\\2b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n  content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n  content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n  content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n  content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n  content: \"\\270f\";\n}\n.glyphicon-glass:before {\n  content: \"\\e001\";\n}\n.glyphicon-music:before {\n  content: \"\\e002\";\n}\n.glyphicon-search:before {\n  content: \"\\e003\";\n}\n.glyphicon-heart:before {\n  content: \"\\e005\";\n}\n.glyphicon-star:before {\n  content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n  content: \"\\e007\";\n}\n.glyphicon-user:before {\n  content: \"\\e008\";\n}\n.glyphicon-film:before {\n  content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n  content: \"\\e010\";\n}\n.glyphicon-th:before {\n  content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n  content: \"\\e012\";\n}\n.glyphicon-ok:before {\n  content: \"\\e013\";\n}\n.glyphicon-remove:before {\n  content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n  content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n  content: \"\\e016\";\n}\n.glyphicon-off:before {\n  content: \"\\e017\";\n}\n.glyphicon-signal:before {\n  content: \"\\e018\";\n}\n.glyphicon-cog:before {\n  content: \"\\e019\";\n}\n.glyphicon-trash:before {\n  content: \"\\e020\";\n}\n.glyphicon-home:before {\n  content: \"\\e021\";\n}\n.glyphicon-file:before {\n  content: \"\\e022\";\n}\n.glyphicon-time:before {\n  content: \"\\e023\";\n}\n.glyphicon-road:before {\n  content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n  content: \"\\e025\";\n}\n.glyphicon-download:before {\n  content: \"\\e026\";\n}\n.glyphicon-upload:before {\n  content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n  content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n  content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n  content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n  content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n  content: \"\\e032\";\n}\n.glyphicon-lock:before {\n  content: \"\\e033\";\n}\n.glyphicon-flag:before {\n  content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n  content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n  content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n  content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n  content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n  content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n  content: \"\\e040\";\n}\n.glyphicon-tag:before {\n  content: \"\\e041\";\n}\n.glyphicon-tags:before {\n  content: \"\\e042\";\n}\n.glyphicon-book:before {\n  content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n  content: \"\\e044\";\n}\n.glyphicon-print:before {\n  content: \"\\e045\";\n}\n.glyphicon-camera:before {\n  content: \"\\e046\";\n}\n.glyphicon-font:before {\n  content: \"\\e047\";\n}\n.glyphicon-bold:before {\n  content: \"\\e048\";\n}\n.glyphicon-italic:before {\n  content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n  content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n  content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n  content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n  content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n  content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n  content: \"\\e055\";\n}\n.glyphicon-list:before {\n  content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n  content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n  content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n  content: \"\\e059\";\n}\n.glyphicon-picture:before {\n  content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n  content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n  content: \"\\e063\";\n}\n.glyphicon-tint:before {\n  content: \"\\e064\";\n}\n.glyphicon-edit:before {\n  content: \"\\e065\";\n}\n.glyphicon-share:before {\n  content: \"\\e066\";\n}\n.glyphicon-check:before {\n  content: \"\\e067\";\n}\n.glyphicon-move:before {\n  content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n  content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n  content: \"\\e070\";\n}\n.glyphicon-backward:before {\n  content: \"\\e071\";\n}\n.glyphicon-play:before {\n  content: \"\\e072\";\n}\n.glyphicon-pause:before {\n  content: \"\\e073\";\n}\n.glyphicon-stop:before {\n  content: \"\\e074\";\n}\n.glyphicon-forward:before {\n  content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n  content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n  content: \"\\e077\";\n}\n.glyphicon-eject:before {\n  content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n  content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n  content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n  content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n  content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n  content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n  content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n  content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n  content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n  content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n  content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n  content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n  content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n  content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n  content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n  content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n  content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n  content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n  content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n  content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\";\n}\n.glyphicon-gift:before {\n  content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n  content: \"\\e103\";\n}\n.glyphicon-fire:before {\n  content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n  content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n  content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n  content: \"\\e107\";\n}\n.glyphicon-plane:before {\n  content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n  content: \"\\e109\";\n}\n.glyphicon-random:before {\n  content: \"\\e110\";\n}\n.glyphicon-comment:before {\n  content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n  content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n  content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n  content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n  content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n  content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n  content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n  content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n  content: \"\\e122\";\n}\n.glyphicon-bell:before {\n  content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n  content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n  content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n  content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n  content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n  content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\";\n}\n.glyphicon-globe:before {\n  content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n  content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n  content: \"\\e137\";\n}\n.glyphicon-filter:before {\n  content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n  content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n  content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n  content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n  content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n  content: \"\\e143\";\n}\n.glyphicon-link:before {\n  content: \"\\e144\";\n}\n.glyphicon-phone:before {\n  content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n  content: \"\\e146\";\n}\n.glyphicon-usd:before {\n  content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n  content: \"\\e149\";\n}\n.glyphicon-sort:before {\n  content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n  content: \"\\e157\";\n}\n.glyphicon-expand:before {\n  content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n  content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n  content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n  content: \"\\e161\";\n}\n.glyphicon-flash:before {\n  content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n  content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n  content: \"\\e164\";\n}\n.glyphicon-record:before {\n  content: \"\\e165\";\n}\n.glyphicon-save:before {\n  content: \"\\e166\";\n}\n.glyphicon-open:before {\n  content: \"\\e167\";\n}\n.glyphicon-saved:before {\n  content: \"\\e168\";\n}\n.glyphicon-import:before {\n  content: \"\\e169\";\n}\n.glyphicon-export:before {\n  content: \"\\e170\";\n}\n.glyphicon-send:before {\n  content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n  content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n  content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n  content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n  content: \"\\e179\";\n}\n.glyphicon-header:before {\n  content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n  content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n  content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n  content: \"\\e183\";\n}\n.glyphicon-tower:before {\n  content: \"\\e184\";\n}\n.glyphicon-stats:before {\n  content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n  content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n  content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n  content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n  content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n  content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\";\n}\n* {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\nhtml {\n  font-size: 10px;\n\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #333;\n  background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\na {\n  color: #337ab7;\n  text-decoration: none;\n}\na:hover,\na:focus {\n  color: #23527c;\n  text-decoration: underline;\n}\na:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\nfigure {\n  margin: 0;\n}\nimg {\n  vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  max-width: 100%;\n  height: auto;\n}\n.img-rounded {\n  border-radius: 6px;\n}\n.img-thumbnail {\n  display: inline-block;\n  max-width: 100%;\n  height: auto;\n  padding: 4px;\n  line-height: 1.42857143;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: all .2s ease-in-out;\n       -o-transition: all .2s ease-in-out;\n          transition: all .2s ease-in-out;\n}\n.img-circle {\n  border-radius: 50%;\n}\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eee;\n}\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  margin: 0;\n  overflow: visible;\n  clip: auto;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: inherit;\n  font-weight: 500;\n  line-height: 1.1;\n  color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n  font-weight: normal;\n  line-height: 1;\n  color: #777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n  font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n  font-size: 75%;\n}\nh1,\n.h1 {\n  font-size: 36px;\n}\nh2,\n.h2 {\n  font-size: 30px;\n}\nh3,\n.h3 {\n  font-size: 24px;\n}\nh4,\n.h4 {\n  font-size: 18px;\n}\nh5,\n.h5 {\n  font-size: 14px;\n}\nh6,\n.h6 {\n  font-size: 12px;\n}\np {\n  margin: 0 0 10px;\n}\n.lead {\n  margin-bottom: 20px;\n  font-size: 16px;\n  font-weight: 300;\n  line-height: 1.4;\n}\n@media (min-width: 768px) {\n  .lead {\n    font-size: 21px;\n  }\n}\nsmall,\n.small {\n  font-size: 85%;\n}\nmark,\n.mark {\n  padding: .2em;\n  background-color: #fcf8e3;\n}\n.text-left {\n  text-align: left;\n}\n.text-right {\n  text-align: right;\n}\n.text-center {\n  text-align: center;\n}\n.text-justify {\n  text-align: justify;\n}\n.text-nowrap {\n  white-space: nowrap;\n}\n.text-lowercase {\n  text-transform: lowercase;\n}\n.text-uppercase {\n  text-transform: uppercase;\n}\n.text-capitalize {\n  text-transform: capitalize;\n}\n.text-muted {\n  color: #777;\n}\n.text-primary {\n  color: #337ab7;\n}\na.text-primary:hover {\n  color: #286090;\n}\n.text-success {\n  color: #3c763d;\n}\na.text-success:hover {\n  color: #2b542c;\n}\n.text-info {\n  color: #31708f;\n}\na.text-info:hover {\n  color: #245269;\n}\n.text-warning {\n  color: #8a6d3b;\n}\na.text-warning:hover {\n  color: #66512c;\n}\n.text-danger {\n  color: #a94442;\n}\na.text-danger:hover {\n  color: #843534;\n}\n.bg-primary {\n  color: #fff;\n  background-color: #337ab7;\n}\na.bg-primary:hover {\n  background-color: #286090;\n}\n.bg-success {\n  background-color: #dff0d8;\n}\na.bg-success:hover {\n  background-color: #c1e2b3;\n}\n.bg-info {\n  background-color: #d9edf7;\n}\na.bg-info:hover {\n  background-color: #afd9ee;\n}\n.bg-warning {\n  background-color: #fcf8e3;\n}\na.bg-warning:hover {\n  background-color: #f7ecb5;\n}\n.bg-danger {\n  background-color: #f2dede;\n}\na.bg-danger:hover {\n  background-color: #e4b9b9;\n}\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eee;\n}\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n  margin-bottom: 0;\n}\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n.list-inline {\n  padding-left: 0;\n  margin-left: -5px;\n  list-style: none;\n}\n.list-inline > li {\n  display: inline-block;\n  padding-right: 5px;\n  padding-left: 5px;\n}\ndl {\n  margin-top: 0;\n  margin-bottom: 20px;\n}\ndt,\ndd {\n  line-height: 1.42857143;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    overflow: hidden;\n    clear: left;\n    text-align: right;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n}\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #777;\n}\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  font-size: 17.5px;\n  border-left: 5px solid #eee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n  margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n  display: block;\n  font-size: 80%;\n  line-height: 1.42857143;\n  color: #777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n  content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  text-align: right;\n  border-right: 5px solid #eee;\n  border-left: 0;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n  content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n  content: '\\00A0 \\2014';\n}\naddress {\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #fff;\n  background-color: #333;\n  border-radius: 3px;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n}\nkbd kbd {\n  padding: 0;\n  font-size: 100%;\n  font-weight: bold;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.42857143;\n  color: #333;\n  word-break: break-all;\n  word-wrap: break-word;\n  background-color: #f5f5f5;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n}\npre code {\n  padding: 0;\n  font-size: inherit;\n  color: inherit;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border-radius: 0;\n}\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n.container {\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n@media (min-width: 768px) {\n  .container {\n    width: 750px;\n  }\n}\n@media (min-width: 992px) {\n  .container {\n    width: 970px;\n  }\n}\n@media (min-width: 1200px) {\n  .container {\n    width: 1170px;\n  }\n}\n.container-fluid {\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n.row {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n  float: left;\n}\n.col-xs-12 {\n  width: 100%;\n}\n.col-xs-11 {\n  width: 91.66666667%;\n}\n.col-xs-10 {\n  width: 83.33333333%;\n}\n.col-xs-9 {\n  width: 75%;\n}\n.col-xs-8 {\n  width: 66.66666667%;\n}\n.col-xs-7 {\n  width: 58.33333333%;\n}\n.col-xs-6 {\n  width: 50%;\n}\n.col-xs-5 {\n  width: 41.66666667%;\n}\n.col-xs-4 {\n  width: 33.33333333%;\n}\n.col-xs-3 {\n  width: 25%;\n}\n.col-xs-2 {\n  width: 16.66666667%;\n}\n.col-xs-1 {\n  width: 8.33333333%;\n}\n.col-xs-pull-12 {\n  right: 100%;\n}\n.col-xs-pull-11 {\n  right: 91.66666667%;\n}\n.col-xs-pull-10 {\n  right: 83.33333333%;\n}\n.col-xs-pull-9 {\n  right: 75%;\n}\n.col-xs-pull-8 {\n  right: 66.66666667%;\n}\n.col-xs-pull-7 {\n  right: 58.33333333%;\n}\n.col-xs-pull-6 {\n  right: 50%;\n}\n.col-xs-pull-5 {\n  right: 41.66666667%;\n}\n.col-xs-pull-4 {\n  right: 33.33333333%;\n}\n.col-xs-pull-3 {\n  right: 25%;\n}\n.col-xs-pull-2 {\n  right: 16.66666667%;\n}\n.col-xs-pull-1 {\n  right: 8.33333333%;\n}\n.col-xs-pull-0 {\n  right: auto;\n}\n.col-xs-push-12 {\n  left: 100%;\n}\n.col-xs-push-11 {\n  left: 91.66666667%;\n}\n.col-xs-push-10 {\n  left: 83.33333333%;\n}\n.col-xs-push-9 {\n  left: 75%;\n}\n.col-xs-push-8 {\n  left: 66.66666667%;\n}\n.col-xs-push-7 {\n  left: 58.33333333%;\n}\n.col-xs-push-6 {\n  left: 50%;\n}\n.col-xs-push-5 {\n  left: 41.66666667%;\n}\n.col-xs-push-4 {\n  left: 33.33333333%;\n}\n.col-xs-push-3 {\n  left: 25%;\n}\n.col-xs-push-2 {\n  left: 16.66666667%;\n}\n.col-xs-push-1 {\n  left: 8.33333333%;\n}\n.col-xs-push-0 {\n  left: auto;\n}\n.col-xs-offset-12 {\n  margin-left: 100%;\n}\n.col-xs-offset-11 {\n  margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n  margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n  margin-left: 75%;\n}\n.col-xs-offset-8 {\n  margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n  margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n  margin-left: 50%;\n}\n.col-xs-offset-5 {\n  margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n  margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n  margin-left: 25%;\n}\n.col-xs-offset-2 {\n  margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n  margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n    float: left;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-11 {\n    width: 91.66666667%;\n  }\n  .col-sm-10 {\n    width: 83.33333333%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-8 {\n    width: 66.66666667%;\n  }\n  .col-sm-7 {\n    width: 58.33333333%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-5 {\n    width: 41.66666667%;\n  }\n  .col-sm-4 {\n    width: 33.33333333%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-2 {\n    width: 16.66666667%;\n  }\n  .col-sm-1 {\n    width: 8.33333333%;\n  }\n  .col-sm-pull-12 {\n    right: 100%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-sm-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-sm-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-sm-pull-0 {\n    right: auto;\n  }\n  .col-sm-push-12 {\n    left: 100%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666667%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666667%;\n  }\n  .col-sm-push-7 {\n    left: 58.33333333%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666667%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-2 {\n    left: 16.66666667%;\n  }\n  .col-sm-push-1 {\n    left: 8.33333333%;\n  }\n  .col-sm-push-0 {\n    left: auto;\n  }\n  .col-sm-offset-12 {\n    margin-left: 100%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-sm-offset-0 {\n    margin-left: 0;\n  }\n}\n@media (min-width: 992px) {\n  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n    float: left;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-11 {\n    width: 91.66666667%;\n  }\n  .col-md-10 {\n    width: 83.33333333%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-8 {\n    width: 66.66666667%;\n  }\n  .col-md-7 {\n    width: 58.33333333%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-5 {\n    width: 41.66666667%;\n  }\n  .col-md-4 {\n    width: 33.33333333%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-2 {\n    width: 16.66666667%;\n  }\n  .col-md-1 {\n    width: 8.33333333%;\n  }\n  .col-md-pull-12 {\n    right: 100%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-md-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-md-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-md-pull-0 {\n    right: auto;\n  }\n  .col-md-push-12 {\n    left: 100%;\n  }\n  .col-md-push-11 {\n    left: 91.66666667%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-8 {\n    left: 66.66666667%;\n  }\n  .col-md-push-7 {\n    left: 58.33333333%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-5 {\n    left: 41.66666667%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-2 {\n    left: 16.66666667%;\n  }\n  .col-md-push-1 {\n    left: 8.33333333%;\n  }\n  .col-md-push-0 {\n    left: auto;\n  }\n  .col-md-offset-12 {\n    margin-left: 100%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0;\n  }\n}\n@media (min-width: 1200px) {\n  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n    float: left;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-11 {\n    width: 91.66666667%;\n  }\n  .col-lg-10 {\n    width: 83.33333333%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-8 {\n    width: 66.66666667%;\n  }\n  .col-lg-7 {\n    width: 58.33333333%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-5 {\n    width: 41.66666667%;\n  }\n  .col-lg-4 {\n    width: 33.33333333%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-2 {\n    width: 16.66666667%;\n  }\n  .col-lg-1 {\n    width: 8.33333333%;\n  }\n  .col-lg-pull-12 {\n    right: 100%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-lg-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-lg-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-lg-pull-0 {\n    right: auto;\n  }\n  .col-lg-push-12 {\n    left: 100%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666667%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666667%;\n  }\n  .col-lg-push-7 {\n    left: 58.33333333%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666667%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-2 {\n    left: 16.66666667%;\n  }\n  .col-lg-push-1 {\n    left: 8.33333333%;\n  }\n  .col-lg-push-0 {\n    left: auto;\n  }\n  .col-lg-offset-12 {\n    margin-left: 100%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0;\n  }\n}\ntable {\n  background-color: transparent;\n}\ncaption {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  color: #777;\n  text-align: left;\n}\nth {\n  text-align: left;\n}\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n  padding: 8px;\n  line-height: 1.42857143;\n  vertical-align: top;\n  border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n  border-top: 0;\n}\n.table > tbody + tbody {\n  border-top: 2px solid #ddd;\n}\n.table .table {\n  background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n  padding: 5px;\n}\n.table-bordered {\n  border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n  border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-child(odd) {\n  background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n  background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n  position: static;\n  display: table-column;\n  float: none;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  position: static;\n  display: table-cell;\n  float: none;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n  background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n  background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n  background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n  background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n  background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n  background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n  background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n  background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n  background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n  background-color: #ebcccc;\n}\n.table-responsive {\n  min-height: .01%;\n  overflow-x: auto;\n}\n@media screen and (max-width: 767px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-y: hidden;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid #ddd;\n  }\n  .table-responsive > .table {\n    margin-bottom: 0;\n  }\n  .table-responsive > .table > thead > tr > th,\n  .table-responsive > .table > tbody > tr > th,\n  .table-responsive > .table > tfoot > tr > th,\n  .table-responsive > .table > thead > tr > td,\n  .table-responsive > .table > tbody > tr > td,\n  .table-responsive > .table > tfoot > tr > td {\n    white-space: nowrap;\n  }\n  .table-responsive > .table-bordered {\n    border: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:first-child,\n  .table-responsive > .table-bordered > tbody > tr > th:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n  .table-responsive > .table-bordered > thead > tr > td:first-child,\n  .table-responsive > .table-bordered > tbody > tr > td:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:last-child,\n  .table-responsive > .table-bordered > tbody > tr > th:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n  .table-responsive > .table-bordered > thead > tr > td:last-child,\n  .table-responsive > .table-bordered > tbody > tr > td:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0;\n  }\n  .table-responsive > .table-bordered > tbody > tr:last-child > th,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n  .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n    border-bottom: 0;\n  }\n}\nfieldset {\n  min-width: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n  display: inline-block;\n  max-width: 100%;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  line-height: normal;\n}\ninput[type=\"file\"] {\n  display: block;\n}\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\nselect[multiple],\nselect[size] {\n  height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\noutput {\n  display: block;\n  padding-top: 7px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555;\n}\n.form-control {\n  display: block;\n  width: 100%;\n  height: 34px;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555;\n  background-color: #fff;\n  background-image: none;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n  -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;\n       -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n          transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);\n          box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);\n}\n.form-control::-moz-placeholder {\n  color: #999;\n  opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n  color: #999;\n}\n.form-control::-webkit-input-placeholder {\n  color: #999;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n  background-color: #eee;\n  opacity: 1;\n}\ntextarea.form-control {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n  input[type=\"date\"],\n  input[type=\"time\"],\n  input[type=\"datetime-local\"],\n  input[type=\"month\"] {\n    line-height: 34px;\n  }\n  input[type=\"date\"].input-sm,\n  input[type=\"time\"].input-sm,\n  input[type=\"datetime-local\"].input-sm,\n  input[type=\"month\"].input-sm {\n    line-height: 30px;\n  }\n  input[type=\"date\"].input-lg,\n  input[type=\"time\"].input-lg,\n  input[type=\"datetime-local\"].input-lg,\n  input[type=\"month\"].input-lg {\n    line-height: 46px;\n  }\n}\n.form-group {\n  margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n  min-height: 20px;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  position: absolute;\n  margin-top: 4px \\9;\n  margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  vertical-align: middle;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n  cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n  cursor: not-allowed;\n}\n.form-control-static {\n  padding-top: 7px;\n  padding-bottom: 7px;\n  margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n  padding-right: 0;\n  padding-left: 0;\n}\n.input-sm,\n.form-group-sm .form-control {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-sm,\nselect.form-group-sm .form-control {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-sm,\ntextarea.form-group-sm .form-control,\nselect[multiple].input-sm,\nselect[multiple].form-group-sm .form-control {\n  height: auto;\n}\n.input-lg,\n.form-group-lg .form-control {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\nselect.input-lg,\nselect.form-group-lg .form-control {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-lg,\ntextarea.form-group-lg .form-control,\nselect[multiple].input-lg,\nselect[multiple].form-group-lg .form-control {\n  height: auto;\n}\n.has-feedback {\n  position: relative;\n}\n.has-feedback .form-control {\n  padding-right: 42.5px;\n}\n.form-control-feedback {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 2;\n  display: block;\n  width: 34px;\n  height: 34px;\n  line-height: 34px;\n  text-align: center;\n  pointer-events: none;\n}\n.input-lg + .form-control-feedback {\n  width: 46px;\n  height: 46px;\n  line-height: 46px;\n}\n.input-sm + .form-control-feedback {\n  width: 30px;\n  height: 30px;\n  line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n  color: #3c763d;\n}\n.has-success .form-control {\n  border-color: #3c763d;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-success .form-control:focus {\n  border-color: #2b542c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #3c763d;\n}\n.has-success .form-control-feedback {\n  color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n  color: #8a6d3b;\n}\n.has-warning .form-control {\n  border-color: #8a6d3b;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-warning .form-control:focus {\n  border-color: #66512c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #8a6d3b;\n}\n.has-warning .form-control-feedback {\n  color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n  color: #a94442;\n}\n.has-error .form-control {\n  border-color: #a94442;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-error .form-control:focus {\n  border-color: #843534;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #a94442;\n}\n.has-error .form-control-feedback {\n  color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n  top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n  top: 0;\n}\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .form-inline .form-control-static {\n    display: inline-block;\n  }\n  .form-inline .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .form-inline .input-group .input-group-addon,\n  .form-inline .input-group .input-group-btn,\n  .form-inline .input-group .form-control {\n    width: auto;\n  }\n  .form-inline .input-group > .form-control {\n    width: 100%;\n  }\n  .form-inline .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio label,\n  .form-inline .checkbox label {\n    padding-left: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .form-inline .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  padding-top: 7px;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n  min-height: 27px;\n}\n.form-horizontal .form-group {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    padding-top: 7px;\n    margin-bottom: 0;\n    text-align: right;\n  }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n  right: 15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-lg .control-label {\n    padding-top: 14.3px;\n  }\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-sm .control-label {\n    padding-top: 6px;\n  }\n}\n.btn {\n  display: inline-block;\n  padding: 6px 12px;\n  margin-bottom: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.42857143;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  -ms-touch-action: manipulation;\n      touch-action: manipulation;\n  cursor: pointer;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n  color: #333;\n  text-decoration: none;\n}\n.btn:active,\n.btn.active {\n  background-image: none;\n  outline: 0;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  pointer-events: none;\n  cursor: not-allowed;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n          box-shadow: none;\n  opacity: .65;\n}\n.btn-default {\n  color: #333;\n  background-color: #fff;\n  border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus,\n.btn-default.focus,\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  color: #333;\n  background-color: #e6e6e6;\n  border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  background-image: none;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n  background-color: #fff;\n  border-color: #ccc;\n}\n.btn-default .badge {\n  color: #fff;\n  background-color: #333;\n}\n.btn-primary {\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #2e6da4;\n}\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary.focus,\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  color: #fff;\n  background-color: #286090;\n  border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  background-image: none;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n  background-color: #337ab7;\n  border-color: #2e6da4;\n}\n.btn-primary .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.btn-success {\n  color: #fff;\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success:hover,\n.btn-success:focus,\n.btn-success.focus,\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  color: #fff;\n  background-color: #449d44;\n  border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  background-image: none;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success .badge {\n  color: #5cb85c;\n  background-color: #fff;\n}\n.btn-info {\n  color: #fff;\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.btn-info:hover,\n.btn-info:focus,\n.btn-info.focus,\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  color: #fff;\n  background-color: #31b0d5;\n  border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  background-image: none;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.btn-info .badge {\n  color: #5bc0de;\n  background-color: #fff;\n}\n.btn-warning {\n  color: #fff;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning.focus,\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  color: #fff;\n  background-color: #ec971f;\n  border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  background-image: none;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning .badge {\n  color: #f0ad4e;\n  background-color: #fff;\n}\n.btn-danger {\n  color: #fff;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger.focus,\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  color: #fff;\n  background-color: #c9302c;\n  border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  background-image: none;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger .badge {\n  color: #d9534f;\n  background-color: #fff;\n}\n.btn-link {\n  font-weight: normal;\n  color: #337ab7;\n  border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n  border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n  color: #23527c;\n  text-decoration: underline;\n  background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #777;\n  text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-block {\n  display: block;\n  width: 100%;\n}\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity .15s linear;\n       -o-transition: opacity .15s linear;\n          transition: opacity .15s linear;\n}\n.fade.in {\n  opacity: 1;\n}\n.collapse {\n  display: none;\n  visibility: hidden;\n}\n.collapse.in {\n  display: block;\n  visibility: visible;\n}\ntr.collapse.in {\n  display: table-row;\n}\ntbody.collapse.in {\n  display: table-row-group;\n}\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition-timing-function: ease;\n       -o-transition-timing-function: ease;\n          transition-timing-function: ease;\n  -webkit-transition-duration: .35s;\n       -o-transition-duration: .35s;\n          transition-duration: .35s;\n  -webkit-transition-property: height, visibility;\n       -o-transition-property: height, visibility;\n          transition-property: height, visibility;\n}\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px solid;\n  border-right: 4px solid transparent;\n  border-left: 4px solid transparent;\n}\n.dropdown {\n  position: relative;\n}\n.dropdown-toggle:focus {\n  outline: 0;\n}\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  font-size: 14px;\n  text-align: left;\n  list-style: none;\n  background-color: #fff;\n  -webkit-background-clip: padding-box;\n          background-clip: padding-box;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, .15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n          box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n}\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu .divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.42857143;\n  color: #333;\n  white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  color: #262626;\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #fff;\n  text-decoration: none;\n  background-color: #337ab7;\n  outline: 0;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.open > .dropdown-menu {\n  display: block;\n}\n.open > a {\n  outline: 0;\n}\n.dropdown-menu-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu-left {\n  right: auto;\n  left: 0;\n}\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.42857143;\n  color: #777;\n  white-space: nowrap;\n}\n.dropdown-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 990;\n}\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  content: \"\";\n  border-top: 0;\n  border-bottom: 4px solid;\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 1px;\n}\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    right: 0;\n    left: auto;\n  }\n  .navbar-right .dropdown-menu-left {\n    right: auto;\n    left: 0;\n  }\n}\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n  z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n  margin-left: -1px;\n}\n.btn-toolbar {\n  margin-left: -5px;\n}\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n  float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n  margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child > .btn:last-child,\n.btn-group > .btn-group:first-child > .dropdown-toggle {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n  padding-right: 8px;\n  padding-left: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-right: 12px;\n  padding-left: 12px;\n}\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n.btn .caret {\n  margin-left: 0;\n}\n.btn-lg .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n  border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n  display: block;\n  float: none;\n  width: 100%;\n  max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n  float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n  border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n  display: table-cell;\n  float: none;\n  width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n  width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n  left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none;\n}\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n  float: none;\n  padding-right: 0;\n  padding-left: 0;\n}\n.input-group .form-control {\n  position: relative;\n  z-index: 2;\n  float: left;\n  width: 100%;\n  margin-bottom: 0;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n.input-group-addon {\n  padding: 6px 12px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1;\n  color: #555;\n  text-align: center;\n  background-color: #eee;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n}\n.input-group-addon.input-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  border-radius: 3px;\n}\n.input-group-addon.input-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n.input-group-btn {\n  position: relative;\n  font-size: 0;\n  white-space: nowrap;\n}\n.input-group-btn > .btn {\n  position: relative;\n}\n.input-group-btn > .btn + .btn {\n  margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n  margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n  margin-left: -1px;\n}\n.nav {\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n.nav > li {\n  position: relative;\n  display: block;\n}\n.nav > li > a {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eee;\n}\n.nav > li.disabled > a {\n  color: #777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #777;\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eee;\n  border-color: #337ab7;\n}\n.nav .nav-divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.nav > li > a > img {\n  max-width: none;\n}\n.nav-tabs {\n  border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n  float: left;\n  margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n  margin-right: 2px;\n  line-height: 1.42857143;\n  border: 1px solid transparent;\n  border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n  border-color: #eee #eee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n  color: #555;\n  cursor: default;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-bottom-color: transparent;\n}\n.nav-tabs.nav-justified {\n  width: 100%;\n  border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n  float: none;\n}\n.nav-tabs.nav-justified > li > a {\n  margin-bottom: 5px;\n  text-align: center;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-tabs.nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs.nav-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n  border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li > a {\n    border-bottom: 1px solid #ddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs.nav-justified > .active > a,\n  .nav-tabs.nav-justified > .active > a:hover,\n  .nav-tabs.nav-justified > .active > a:focus {\n    border-bottom-color: #fff;\n  }\n}\n.nav-pills > li {\n  float: left;\n}\n.nav-pills > li > a {\n  border-radius: 4px;\n}\n.nav-pills > li + li {\n  margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n  color: #fff;\n  background-color: #337ab7;\n}\n.nav-stacked > li {\n  float: none;\n}\n.nav-stacked > li + li {\n  margin-top: 2px;\n  margin-left: 0;\n}\n.nav-justified {\n  width: 100%;\n}\n.nav-justified > li {\n  float: none;\n}\n.nav-justified > li > a {\n  margin-bottom: 5px;\n  text-align: center;\n}\n.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs-justified {\n  border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n  border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs-justified > li > a {\n    border-bottom: 1px solid #ddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs-justified > .active > a,\n  .nav-tabs-justified > .active > a:hover,\n  .nav-tabs-justified > .active > a:focus {\n    border-bottom-color: #fff;\n  }\n}\n.tab-content > .tab-pane {\n  display: none;\n  visibility: hidden;\n}\n.tab-content > .active {\n  display: block;\n  visibility: visible;\n}\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.navbar {\n  position: relative;\n  min-height: 50px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 4px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n.navbar-collapse {\n  padding-right: 15px;\n  padding-left: 15px;\n  overflow-x: visible;\n  -webkit-overflow-scrolling: touch;\n  border-top: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);\n}\n.navbar-collapse.in {\n  overflow-y: auto;\n}\n@media (min-width: 768px) {\n  .navbar-collapse {\n    width: auto;\n    border-top: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n  .navbar-collapse.collapse {\n    display: block !important;\n    height: auto !important;\n    padding-bottom: 0;\n    overflow: visible !important;\n    visibility: visible !important;\n  }\n  .navbar-collapse.in {\n    overflow-y: visible;\n  }\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-static-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n  max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    max-height: 200px;\n  }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container-fluid > .navbar-header,\n  .container > .navbar-collapse,\n  .container-fluid > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n.navbar-static-top {\n  z-index: 1000;\n  border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n  .navbar-static-top {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n@media (min-width: 768px) {\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n  border-width: 1px 0 0;\n}\n.navbar-brand {\n  float: left;\n  height: 50px;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n.navbar-brand > img {\n  display: block;\n}\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand,\n  .navbar > .container-fluid .navbar-brand {\n    margin-left: -15px;\n  }\n}\n.navbar-toggle {\n  position: relative;\n  float: right;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-right: 15px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.navbar-toggle:focus {\n  outline: 0;\n}\n.navbar-toggle .icon-bar {\n  display: block;\n  width: 22px;\n  height: 2px;\n  border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n@media (min-width: 768px) {\n  .navbar-toggle {\n    display: none;\n  }\n}\n.navbar-nav {\n  margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 20px;\n}\n@media (max-width: 767px) {\n  .navbar-nav .open .dropdown-menu {\n    position: static;\n    float: none;\n    width: auto;\n    margin-top: 0;\n    background-color: transparent;\n    border: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n  .navbar-nav .open .dropdown-menu > li > a,\n  .navbar-nav .open .dropdown-menu .dropdown-header {\n    padding: 5px 15px 5px 25px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a {\n    line-height: 20px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-nav .open .dropdown-menu > li > a:focus {\n    background-image: none;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-nav {\n    float: left;\n    margin: 0;\n  }\n  .navbar-nav > li {\n    float: left;\n  }\n  .navbar-nav > li > a {\n    padding-top: 15px;\n    padding-bottom: 15px;\n  }\n}\n.navbar-form {\n  padding: 10px 15px;\n  margin-top: 8px;\n  margin-right: -15px;\n  margin-bottom: 8px;\n  margin-left: -15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);\n}\n@media (min-width: 768px) {\n  .navbar-form .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control-static {\n    display: inline-block;\n  }\n  .navbar-form .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .navbar-form .input-group .input-group-addon,\n  .navbar-form .input-group .input-group-btn,\n  .navbar-form .input-group .form-control {\n    width: auto;\n  }\n  .navbar-form .input-group > .form-control {\n    width: 100%;\n  }\n  .navbar-form .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio label,\n  .navbar-form .checkbox label {\n    padding-left: 0;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .navbar-form .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n  .navbar-form .form-group:last-child {\n    margin-bottom: 0;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    padding-top: 0;\n    padding-bottom: 0;\n    margin-right: 0;\n    margin-left: 0;\n    border: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n}\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  border-top-left-radius: 4px;\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n  margin-top: 14px;\n  margin-bottom: 14px;\n}\n.navbar-text {\n  margin-top: 15px;\n  margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n  .navbar-text {\n    float: left;\n    margin-right: 15px;\n    margin-left: 15px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n    margin-right: -15px;\n  }\n  .navbar-right ~ .navbar-right {\n    margin-right: 0;\n  }\n}\n.navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n  color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #5e5e5e;\n  background-color: transparent;\n}\n.navbar-default .navbar-text {\n  color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n  color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n  color: #333;\n  background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n  color: #555;\n  background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n  color: #ccc;\n  background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n  border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n  color: #555;\n  background-color: #e7e7e7;\n}\n@media (max-width: 767px) {\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #777;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #333;\n    background-color: transparent;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #555;\n    background-color: #e7e7e7;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #ccc;\n    background-color: transparent;\n  }\n}\n.navbar-default .navbar-link {\n  color: #777;\n}\n.navbar-default .navbar-link:hover {\n  color: #333;\n}\n.navbar-default .btn-link {\n  color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n  color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n  color: #ccc;\n}\n.navbar-inverse {\n  background-color: #222;\n  border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #fff;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #fff;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n  color: #fff;\n  background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n  color: #444;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n  border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n  color: #fff;\n  background-color: #080808;\n}\n@media (max-width: 767px) {\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n    border-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n    color: #9d9d9d;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #fff;\n    background-color: transparent;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #fff;\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #444;\n    background-color: transparent;\n  }\n}\n.navbar-inverse .navbar-link {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n  color: #fff;\n}\n.navbar-inverse .btn-link {\n  color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n  color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n  color: #444;\n}\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n}\n.breadcrumb > li {\n  display: inline-block;\n}\n.breadcrumb > li + li:before {\n  padding: 0 5px;\n  color: #ccc;\n  content: \"/\\00a0\";\n}\n.breadcrumb > .active {\n  color: #777;\n}\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px;\n}\n.pagination > li {\n  display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n  position: relative;\n  float: left;\n  padding: 6px 12px;\n  margin-left: -1px;\n  line-height: 1.42857143;\n  color: #337ab7;\n  text-decoration: none;\n  background-color: #fff;\n  border: 1px solid #ddd;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n  margin-left: 0;\n  border-top-left-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n  color: #23527c;\n  background-color: #eee;\n  border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n  z-index: 2;\n  color: #fff;\n  cursor: default;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n  color: #777;\n  cursor: not-allowed;\n  background-color: #fff;\n  border-color: #ddd;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n  border-top-left-radius: 6px;\n  border-bottom-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-top-right-radius: 6px;\n  border-bottom-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n  border-top-left-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-top-right-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  text-align: center;\n  list-style: none;\n}\n.pager li {\n  display: inline;\n}\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #eee;\n}\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #777;\n  cursor: not-allowed;\n  background-color: #fff;\n}\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n  color: #fff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.label:empty {\n  display: none;\n}\n.btn .label {\n  position: relative;\n  top: -1px;\n}\n.label-default {\n  background-color: #777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #5e5e5e;\n}\n.label-primary {\n  background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #286090;\n}\n.label-success {\n  background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #449d44;\n}\n.label-info {\n  background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #31b0d5;\n}\n.label-warning {\n  background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #ec971f;\n}\n.label-danger {\n  background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #c9302c;\n}\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  line-height: 1;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  background-color: #777;\n  border-radius: 10px;\n}\n.badge:empty {\n  display: none;\n}\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n.btn-xs .badge {\n  top: 0;\n  padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n  color: #fff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.list-group-item > .badge {\n  float: right;\n}\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n.jumbotron {\n  padding: 30px 15px;\n  margin-bottom: 30px;\n  color: inherit;\n  background-color: #eee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n  color: inherit;\n}\n.jumbotron p {\n  margin-bottom: 15px;\n  font-size: 21px;\n  font-weight: 200;\n}\n.jumbotron > hr {\n  border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n  border-radius: 6px;\n}\n.jumbotron .container {\n  max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding: 48px 0;\n  }\n  .container .jumbotron,\n  .container-fluid .jumbotron {\n    padding-right: 60px;\n    padding-left: 60px;\n  }\n  .jumbotron h1,\n  .jumbotron .h1 {\n    font-size: 63px;\n  }\n}\n.thumbnail {\n  display: block;\n  padding: 4px;\n  margin-bottom: 20px;\n  line-height: 1.42857143;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: border .2s ease-in-out;\n       -o-transition: border .2s ease-in-out;\n          transition: border .2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n  margin-right: auto;\n  margin-left: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #337ab7;\n}\n.thumbnail .caption {\n  padding: 9px;\n  color: #333;\n}\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n.alert .alert-link {\n  font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n  margin-bottom: 0;\n}\n.alert > p + p {\n  margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n  padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n.alert-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n  color: #2b542c;\n}\n.alert-info {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n  color: #245269;\n}\n.alert-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.alert-warning hr {\n  border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n  color: #66512c;\n}\n.alert-danger {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.alert-danger hr {\n  border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n  color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@-o-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n.progress {\n  height: 20px;\n  margin-bottom: 20px;\n  overflow: hidden;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);\n          box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);\n}\n.progress-bar {\n  float: left;\n  width: 0;\n  height: 100%;\n  font-size: 12px;\n  line-height: 20px;\n  color: #fff;\n  text-align: center;\n  background-color: #337ab7;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);\n          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);\n  -webkit-transition: width .6s ease;\n       -o-transition: width .6s ease;\n          transition: width .6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  -webkit-background-size: 40px 40px;\n          background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n       -o-animation: progress-bar-stripes 2s linear infinite;\n          animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n  background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n  background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n  background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n  background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.media {\n  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n.media-right,\n.media > .pull-right {\n  padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n  padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n  display: table-cell;\n  vertical-align: top;\n}\n.media-middle {\n  vertical-align: middle;\n}\n.media-bottom {\n  vertical-align: bottom;\n}\n.media-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n.list-group {\n  padding-left: 0;\n  margin-bottom: 20px;\n}\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n  border-top-left-radius: 4px;\n  border-top-right-radius: 4px;\n}\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\na.list-group-item {\n  color: #555;\n}\na.list-group-item .list-group-item-heading {\n  color: #333;\n}\na.list-group-item:hover,\na.list-group-item:focus {\n  color: #555;\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n  color: #777;\n  cursor: not-allowed;\n  background-color: #eee;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n  color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n  color: #777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  z-index: 2;\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n  color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n  color: #c7ddef;\n}\n.list-group-item-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n}\na.list-group-item-success {\n  color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-success:hover,\na.list-group-item-success:focus {\n  color: #3c763d;\n  background-color: #d0e9c6;\n}\na.list-group-item-success.active,\na.list-group-item-success.active:hover,\na.list-group-item-success.active:focus {\n  color: #fff;\n  background-color: #3c763d;\n  border-color: #3c763d;\n}\n.list-group-item-info {\n  color: #31708f;\n  background-color: #d9edf7;\n}\na.list-group-item-info {\n  color: #31708f;\n}\na.list-group-item-info .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-info:hover,\na.list-group-item-info:focus {\n  color: #31708f;\n  background-color: #c4e3f3;\n}\na.list-group-item-info.active,\na.list-group-item-info.active:hover,\na.list-group-item-info.active:focus {\n  color: #fff;\n  background-color: #31708f;\n  border-color: #31708f;\n}\n.list-group-item-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n}\na.list-group-item-warning {\n  color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-warning:hover,\na.list-group-item-warning:focus {\n  color: #8a6d3b;\n  background-color: #faf2cc;\n}\na.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus {\n  color: #fff;\n  background-color: #8a6d3b;\n  border-color: #8a6d3b;\n}\n.list-group-item-danger {\n  color: #a94442;\n  background-color: #f2dede;\n}\na.list-group-item-danger {\n  color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-danger:hover,\na.list-group-item-danger:focus {\n  color: #a94442;\n  background-color: #ebcccc;\n}\na.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus {\n  color: #fff;\n  background-color: #a94442;\n  border-color: #a94442;\n}\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n.panel {\n  margin-bottom: 20px;\n  background-color: #fff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05);\n          box-shadow: 0 1px 1px rgba(0, 0, 0, .05);\n}\n.panel-body {\n  padding: 15px;\n}\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n  color: inherit;\n}\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n  color: inherit;\n}\n.panel-title > a {\n  color: inherit;\n}\n.panel-footer {\n  padding: 10px 15px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #ddd;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n  margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n  border-width: 1px 0;\n  border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n  border-top: 0;\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n  border-bottom: 0;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n.list-group + .panel-footer {\n  border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n  margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n  padding-right: 15px;\n  padding-left: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n  border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n  border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n  border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n  border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n  border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n  border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n  border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n  border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n  border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n  border-bottom: 0;\n}\n.panel > .table-responsive {\n  margin-bottom: 0;\n  border: 0;\n}\n.panel-group {\n  margin-bottom: 20px;\n}\n.panel-group .panel {\n  margin-bottom: 0;\n  border-radius: 4px;\n}\n.panel-group .panel + .panel {\n  margin-top: 5px;\n}\n.panel-group .panel-heading {\n  border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n  border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n  border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #ddd;\n}\n.panel-default {\n  border-color: #ddd;\n}\n.panel-default > .panel-heading {\n  color: #333;\n  background-color: #f5f5f5;\n  border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n  color: #f5f5f5;\n  background-color: #333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ddd;\n}\n.panel-primary {\n  border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #337ab7;\n}\n.panel-success {\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n  color: #dff0d8;\n  background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n.panel-info {\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n  color: #d9edf7;\n  background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #bce8f1;\n}\n.panel-warning {\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n  color: #fcf8e3;\n  background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #faebcc;\n}\n.panel-danger {\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n  color: #f2dede;\n  background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n  position: relative;\n  display: block;\n  height: 0;\n  padding: 0;\n  overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  border: 0;\n}\n.embed-responsive.embed-responsive-16by9 {\n  padding-bottom: 56.25%;\n}\n.embed-responsive.embed-responsive-4by3 {\n  padding-bottom: 75%;\n}\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);\n}\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, .15);\n}\n.well-lg {\n  padding: 24px;\n  border-radius: 6px;\n}\n.well-sm {\n  padding: 9px;\n  border-radius: 3px;\n}\n.close {\n  float: right;\n  font-size: 21px;\n  font-weight: bold;\n  line-height: 1;\n  color: #000;\n  text-shadow: 0 1px 0 #fff;\n  filter: alpha(opacity=20);\n  opacity: .2;\n}\n.close:hover,\n.close:focus {\n  color: #000;\n  text-decoration: none;\n  cursor: pointer;\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\nbutton.close {\n  -webkit-appearance: none;\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n}\n.modal-open {\n  overflow: hidden;\n}\n.modal {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  display: none;\n  overflow: hidden;\n  -webkit-overflow-scrolling: touch;\n  outline: 0;\n}\n.modal.fade .modal-dialog {\n  -webkit-transition: -webkit-transform .3s ease-out;\n       -o-transition:      -o-transform .3s ease-out;\n          transition:         transform .3s ease-out;\n  -webkit-transform: translate(0, -25%);\n      -ms-transform: translate(0, -25%);\n       -o-transform: translate(0, -25%);\n          transform: translate(0, -25%);\n}\n.modal.in .modal-dialog {\n  -webkit-transform: translate(0, 0);\n      -ms-transform: translate(0, 0);\n       -o-transform: translate(0, 0);\n          transform: translate(0, 0);\n}\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px;\n}\n.modal-content {\n  position: relative;\n  background-color: #fff;\n  -webkit-background-clip: padding-box;\n          background-clip: padding-box;\n  border: 1px solid #999;\n  border: 1px solid rgba(0, 0, 0, .2);\n  border-radius: 6px;\n  outline: 0;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);\n          box-shadow: 0 3px 9px rgba(0, 0, 0, .5);\n}\n.modal-backdrop {\n  position: absolute;\n  top: 0;\n  right: 0;\n  left: 0;\n  background-color: #000;\n}\n.modal-backdrop.fade {\n  filter: alpha(opacity=0);\n  opacity: 0;\n}\n.modal-backdrop.in {\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\n.modal-header {\n  min-height: 16.42857143px;\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n  margin-top: -2px;\n}\n.modal-title {\n  margin: 0;\n  line-height: 1.42857143;\n}\n.modal-body {\n  position: relative;\n  padding: 15px;\n}\n.modal-footer {\n  padding: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n  margin-bottom: 0;\n  margin-left: 5px;\n}\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n@media (min-width: 768px) {\n  .modal-dialog {\n    width: 600px;\n    margin: 30px auto;\n  }\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);\n            box-shadow: 0 5px 15px rgba(0, 0, 0, .5);\n  }\n  .modal-sm {\n    width: 300px;\n  }\n}\n@media (min-width: 992px) {\n  .modal-lg {\n    width: 900px;\n  }\n}\n.tooltip {\n  position: absolute;\n  z-index: 1070;\n  display: block;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 12px;\n  font-weight: normal;\n  line-height: 1.4;\n  visibility: visible;\n  filter: alpha(opacity=0);\n  opacity: 0;\n}\n.tooltip.in {\n  filter: alpha(opacity=90);\n  opacity: .9;\n}\n.tooltip.top {\n  padding: 5px 0;\n  margin-top: -3px;\n}\n.tooltip.right {\n  padding: 0 5px;\n  margin-left: 3px;\n}\n.tooltip.bottom {\n  padding: 5px 0;\n  margin-top: 3px;\n}\n.tooltip.left {\n  padding: 0 5px;\n  margin-left: -3px;\n}\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #fff;\n  text-align: center;\n  text-decoration: none;\n  background-color: #000;\n  border-radius: 4px;\n}\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n  right: 5px;\n  bottom: 0;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-width: 5px 5px 5px 0;\n  border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-width: 5px 0 5px 5px;\n  border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1060;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.42857143;\n  text-align: left;\n  white-space: normal;\n  background-color: #fff;\n  -webkit-background-clip: padding-box;\n          background-clip: padding-box;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, .2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);\n          box-shadow: 0 5px 10px rgba(0, 0, 0, .2);\n}\n.popover.top {\n  margin-top: -10px;\n}\n.popover.right {\n  margin-left: 10px;\n}\n.popover.bottom {\n  margin-top: 10px;\n}\n.popover.left {\n  margin-left: -10px;\n}\n.popover-title {\n  padding: 8px 14px;\n  margin: 0;\n  font-size: 14px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-radius: 5px 5px 0 0;\n}\n.popover-content {\n  padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.popover > .arrow {\n  border-width: 11px;\n}\n.popover > .arrow:after {\n  content: \"\";\n  border-width: 10px;\n}\n.popover.top > .arrow {\n  bottom: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-color: #999;\n  border-top-color: rgba(0, 0, 0, .25);\n  border-bottom-width: 0;\n}\n.popover.top > .arrow:after {\n  bottom: 1px;\n  margin-left: -10px;\n  content: \" \";\n  border-top-color: #fff;\n  border-bottom-width: 0;\n}\n.popover.right > .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-right-color: #999;\n  border-right-color: rgba(0, 0, 0, .25);\n  border-left-width: 0;\n}\n.popover.right > .arrow:after {\n  bottom: -10px;\n  left: 1px;\n  content: \" \";\n  border-right-color: #fff;\n  border-left-width: 0;\n}\n.popover.bottom > .arrow {\n  top: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-width: 0;\n  border-bottom-color: #999;\n  border-bottom-color: rgba(0, 0, 0, .25);\n}\n.popover.bottom > .arrow:after {\n  top: 1px;\n  margin-left: -10px;\n  content: \" \";\n  border-top-width: 0;\n  border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-right-width: 0;\n  border-left-color: #999;\n  border-left-color: rgba(0, 0, 0, .25);\n}\n.popover.left > .arrow:after {\n  right: 1px;\n  bottom: -10px;\n  content: \" \";\n  border-right-width: 0;\n  border-left-color: #fff;\n}\n.carousel {\n  position: relative;\n}\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n.carousel-inner > .item {\n  position: relative;\n  display: none;\n  -webkit-transition: .6s ease-in-out left;\n       -o-transition: .6s ease-in-out left;\n          transition: .6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n  .carousel-inner > .item {\n    -webkit-transition: -webkit-transform .6s ease-in-out;\n         -o-transition:      -o-transform .6s ease-in-out;\n            transition:         transform .6s ease-in-out;\n\n    -webkit-backface-visibility: hidden;\n            backface-visibility: hidden;\n    -webkit-perspective: 1000;\n            perspective: 1000;\n  }\n  .carousel-inner > .item.next,\n  .carousel-inner > .item.active.right {\n    left: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n            transform: translate3d(100%, 0, 0);\n  }\n  .carousel-inner > .item.prev,\n  .carousel-inner > .item.active.left {\n    left: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n            transform: translate3d(-100%, 0, 0);\n  }\n  .carousel-inner > .item.next.left,\n  .carousel-inner > .item.prev.right,\n  .carousel-inner > .item.active {\n    left: 0;\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0);\n  }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n.carousel-inner > .active {\n  left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.carousel-inner > .next {\n  left: 100%;\n}\n.carousel-inner > .prev {\n  left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n.carousel-inner > .active.left {\n  left: -100%;\n}\n.carousel-inner > .active.right {\n  left: 100%;\n}\n.carousel-control {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 15%;\n  font-size: 20px;\n  color: #fff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n  filter: alpha(opacity=50);\n  opacity: .5;\n}\n.carousel-control.left {\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n  background-image:      -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001)));\n  background-image:         linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n  background-repeat: repeat-x;\n}\n.carousel-control.right {\n  right: 0;\n  left: auto;\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n  background-image:      -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5)));\n  background-image:         linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n  background-repeat: repeat-x;\n}\n.carousel-control:hover,\n.carousel-control:focus {\n  color: #fff;\n  text-decoration: none;\n  filter: alpha(opacity=90);\n  outline: 0;\n  opacity: .9;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n  position: absolute;\n  top: 50%;\n  z-index: 5;\n  display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n  left: 50%;\n  margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n  right: 50%;\n  margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  font-family: serif;\n}\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  padding-left: 0;\n  margin-left: -30%;\n  text-align: center;\n  list-style: none;\n}\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  cursor: pointer;\n  background-color: #000 \\9;\n  background-color: rgba(0, 0, 0, 0);\n  border: 1px solid #fff;\n  border-radius: 10px;\n}\n.carousel-indicators .active {\n  width: 12px;\n  height: 12px;\n  margin: 0;\n  background-color: #fff;\n}\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #fff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n}\n.carousel-caption .btn {\n  text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -15px;\n    font-size: 30px;\n  }\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .icon-prev {\n    margin-left: -15px;\n  }\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-next {\n    margin-right: -15px;\n  }\n  .carousel-caption {\n    right: 20%;\n    left: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-footer:after {\n  clear: both;\n}\n.center-block {\n  display: block;\n  margin-right: auto;\n  margin-left: auto;\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n.affix {\n  position: fixed;\n}\n@-ms-viewport {\n  width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n  display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n  display: none !important;\n}\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important;\n  }\n  table.visible-xs {\n    display: table;\n  }\n  tr.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-block {\n    display: block !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline {\n    display: inline !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm {\n    display: block !important;\n  }\n  table.visible-sm {\n    display: table;\n  }\n  tr.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-block {\n    display: block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important;\n  }\n  table.visible-md {\n    display: table;\n  }\n  tr.visible-md {\n    display: table-row !important;\n  }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-block {\n    display: block !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important;\n  }\n  table.visible-lg {\n    display: table;\n  }\n  tr.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-block {\n    display: block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (max-width: 767px) {\n  .hidden-xs {\n    display: none !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm {\n    display: none !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .hidden-lg {\n    display: none !important;\n  }\n}\n.visible-print {\n  display: none !important;\n}\n@media print {\n  .visible-print {\n    display: block !important;\n  }\n  table.visible-print {\n    display: table;\n  }\n  tr.visible-print {\n    display: table-row !important;\n  }\n  th.visible-print,\n  td.visible-print {\n    display: table-cell !important;\n  }\n}\n.visible-print-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-block {\n    display: block !important;\n  }\n}\n.visible-print-inline {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline {\n    display: inline !important;\n  }\n}\n.visible-print-inline-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline-block {\n    display: inline-block !important;\n  }\n}\n@media print {\n  .hidden-print {\n    display: none !important;\n  }\n}\n/*# sourceMappingURL=bootstrap.css.map */\n"
  },
  {
    "path": "what-is-django-part-2/static/css/main.css",
    "content": "\n\n/* ==========================================================================\n   Author's custom styles\n   ========================================================================== */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "what-is-django-part-2/static/humans.txt",
    "content": "# humanstxt.org/\n# The humans responsible & technology colophon\n\n# TEAM\n\n    <name> -- <role> -- <twitter>\n\n# THANKS\n\n    <name>\n\n# TECHNOLOGY COLOPHON\n\n    HTML5, CSS3\n    jQuery, Modernizr\n"
  },
  {
    "path": "what-is-django-part-2/static/js/main.js",
    "content": "\n"
  },
  {
    "path": "what-is-django-part-2/static/js/vendor/bootstrap.js",
    "content": "/*!\n * Bootstrap v3.3.1 (http://getbootstrap.com)\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\nif (typeof jQuery === 'undefined') {\n  throw new Error('Bootstrap\\'s JavaScript requires jQuery')\n}\n\n+function ($) {\n  var version = $.fn.jquery.split(' ')[0].split('.')\n  if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1)) {\n    throw new Error('Bootstrap\\'s JavaScript requires jQuery version 1.9.1 or higher')\n  }\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: transition.js v3.3.1\n * http://getbootstrap.com/javascript/#transitions\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)\n  // ============================================================\n\n  function transitionEnd() {\n    var el = document.createElement('bootstrap')\n\n    var transEndEventNames = {\n      WebkitTransition : 'webkitTransitionEnd',\n      MozTransition    : 'transitionend',\n      OTransition      : 'oTransitionEnd otransitionend',\n      transition       : 'transitionend'\n    }\n\n    for (var name in transEndEventNames) {\n      if (el.style[name] !== undefined) {\n        return { end: transEndEventNames[name] }\n      }\n    }\n\n    return false // explicit for ie8 (  ._.)\n  }\n\n  // http://blog.alexmaccaw.com/css-transitions\n  $.fn.emulateTransitionEnd = function (duration) {\n    var called = false\n    var $el = this\n    $(this).one('bsTransitionEnd', function () { called = true })\n    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }\n    setTimeout(callback, duration)\n    return this\n  }\n\n  $(function () {\n    $.support.transition = transitionEnd()\n\n    if (!$.support.transition) return\n\n    $.event.special.bsTransitionEnd = {\n      bindType: $.support.transition.end,\n      delegateType: $.support.transition.end,\n      handle: function (e) {\n        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)\n      }\n    }\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: alert.js v3.3.1\n * http://getbootstrap.com/javascript/#alerts\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // ALERT CLASS DEFINITION\n  // ======================\n\n  var dismiss = '[data-dismiss=\"alert\"]'\n  var Alert   = function (el) {\n    $(el).on('click', dismiss, this.close)\n  }\n\n  Alert.VERSION = '3.3.1'\n\n  Alert.TRANSITION_DURATION = 150\n\n  Alert.prototype.close = function (e) {\n    var $this    = $(this)\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = $(selector)\n\n    if (e) e.preventDefault()\n\n    if (!$parent.length) {\n      $parent = $this.closest('.alert')\n    }\n\n    $parent.trigger(e = $.Event('close.bs.alert'))\n\n    if (e.isDefaultPrevented()) return\n\n    $parent.removeClass('in')\n\n    function removeElement() {\n      // detach from parent, fire event then clean up data\n      $parent.detach().trigger('closed.bs.alert').remove()\n    }\n\n    $.support.transition && $parent.hasClass('fade') ?\n      $parent\n        .one('bsTransitionEnd', removeElement)\n        .emulateTransitionEnd(Alert.TRANSITION_DURATION) :\n      removeElement()\n  }\n\n\n  // ALERT PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.alert')\n\n      if (!data) $this.data('bs.alert', (data = new Alert(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  var old = $.fn.alert\n\n  $.fn.alert             = Plugin\n  $.fn.alert.Constructor = Alert\n\n\n  // ALERT NO CONFLICT\n  // =================\n\n  $.fn.alert.noConflict = function () {\n    $.fn.alert = old\n    return this\n  }\n\n\n  // ALERT DATA-API\n  // ==============\n\n  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: button.js v3.3.1\n * http://getbootstrap.com/javascript/#buttons\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // BUTTON PUBLIC CLASS DEFINITION\n  // ==============================\n\n  var Button = function (element, options) {\n    this.$element  = $(element)\n    this.options   = $.extend({}, Button.DEFAULTS, options)\n    this.isLoading = false\n  }\n\n  Button.VERSION  = '3.3.1'\n\n  Button.DEFAULTS = {\n    loadingText: 'loading...'\n  }\n\n  Button.prototype.setState = function (state) {\n    var d    = 'disabled'\n    var $el  = this.$element\n    var val  = $el.is('input') ? 'val' : 'html'\n    var data = $el.data()\n\n    state = state + 'Text'\n\n    if (data.resetText == null) $el.data('resetText', $el[val]())\n\n    // push to event loop to allow forms to submit\n    setTimeout($.proxy(function () {\n      $el[val](data[state] == null ? this.options[state] : data[state])\n\n      if (state == 'loadingText') {\n        this.isLoading = true\n        $el.addClass(d).attr(d, d)\n      } else if (this.isLoading) {\n        this.isLoading = false\n        $el.removeClass(d).removeAttr(d)\n      }\n    }, this), 0)\n  }\n\n  Button.prototype.toggle = function () {\n    var changed = true\n    var $parent = this.$element.closest('[data-toggle=\"buttons\"]')\n\n    if ($parent.length) {\n      var $input = this.$element.find('input')\n      if ($input.prop('type') == 'radio') {\n        if ($input.prop('checked') && this.$element.hasClass('active')) changed = false\n        else $parent.find('.active').removeClass('active')\n      }\n      if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')\n    } else {\n      this.$element.attr('aria-pressed', !this.$element.hasClass('active'))\n    }\n\n    if (changed) this.$element.toggleClass('active')\n  }\n\n\n  // BUTTON PLUGIN DEFINITION\n  // ========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.button')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.button', (data = new Button(this, options)))\n\n      if (option == 'toggle') data.toggle()\n      else if (option) data.setState(option)\n    })\n  }\n\n  var old = $.fn.button\n\n  $.fn.button             = Plugin\n  $.fn.button.Constructor = Button\n\n\n  // BUTTON NO CONFLICT\n  // ==================\n\n  $.fn.button.noConflict = function () {\n    $.fn.button = old\n    return this\n  }\n\n\n  // BUTTON DATA-API\n  // ===============\n\n  $(document)\n    .on('click.bs.button.data-api', '[data-toggle^=\"button\"]', function (e) {\n      var $btn = $(e.target)\n      if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')\n      Plugin.call($btn, 'toggle')\n      e.preventDefault()\n    })\n    .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^=\"button\"]', function (e) {\n      $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))\n    })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: carousel.js v3.3.1\n * http://getbootstrap.com/javascript/#carousel\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // CAROUSEL CLASS DEFINITION\n  // =========================\n\n  var Carousel = function (element, options) {\n    this.$element    = $(element)\n    this.$indicators = this.$element.find('.carousel-indicators')\n    this.options     = options\n    this.paused      =\n    this.sliding     =\n    this.interval    =\n    this.$active     =\n    this.$items      = null\n\n    this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))\n\n    this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element\n      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))\n      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))\n  }\n\n  Carousel.VERSION  = '3.3.1'\n\n  Carousel.TRANSITION_DURATION = 600\n\n  Carousel.DEFAULTS = {\n    interval: 5000,\n    pause: 'hover',\n    wrap: true,\n    keyboard: true\n  }\n\n  Carousel.prototype.keydown = function (e) {\n    if (/input|textarea/i.test(e.target.tagName)) return\n    switch (e.which) {\n      case 37: this.prev(); break\n      case 39: this.next(); break\n      default: return\n    }\n\n    e.preventDefault()\n  }\n\n  Carousel.prototype.cycle = function (e) {\n    e || (this.paused = false)\n\n    this.interval && clearInterval(this.interval)\n\n    this.options.interval\n      && !this.paused\n      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))\n\n    return this\n  }\n\n  Carousel.prototype.getItemIndex = function (item) {\n    this.$items = item.parent().children('.item')\n    return this.$items.index(item || this.$active)\n  }\n\n  Carousel.prototype.getItemForDirection = function (direction, active) {\n    var delta = direction == 'prev' ? -1 : 1\n    var activeIndex = this.getItemIndex(active)\n    var itemIndex = (activeIndex + delta) % this.$items.length\n    return this.$items.eq(itemIndex)\n  }\n\n  Carousel.prototype.to = function (pos) {\n    var that        = this\n    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))\n\n    if (pos > (this.$items.length - 1) || pos < 0) return\n\n    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, \"slid\"\n    if (activeIndex == pos) return this.pause().cycle()\n\n    return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))\n  }\n\n  Carousel.prototype.pause = function (e) {\n    e || (this.paused = true)\n\n    if (this.$element.find('.next, .prev').length && $.support.transition) {\n      this.$element.trigger($.support.transition.end)\n      this.cycle(true)\n    }\n\n    this.interval = clearInterval(this.interval)\n\n    return this\n  }\n\n  Carousel.prototype.next = function () {\n    if (this.sliding) return\n    return this.slide('next')\n  }\n\n  Carousel.prototype.prev = function () {\n    if (this.sliding) return\n    return this.slide('prev')\n  }\n\n  Carousel.prototype.slide = function (type, next) {\n    var $active   = this.$element.find('.item.active')\n    var $next     = next || this.getItemForDirection(type, $active)\n    var isCycling = this.interval\n    var direction = type == 'next' ? 'left' : 'right'\n    var fallback  = type == 'next' ? 'first' : 'last'\n    var that      = this\n\n    if (!$next.length) {\n      if (!this.options.wrap) return\n      $next = this.$element.find('.item')[fallback]()\n    }\n\n    if ($next.hasClass('active')) return (this.sliding = false)\n\n    var relatedTarget = $next[0]\n    var slideEvent = $.Event('slide.bs.carousel', {\n      relatedTarget: relatedTarget,\n      direction: direction\n    })\n    this.$element.trigger(slideEvent)\n    if (slideEvent.isDefaultPrevented()) return\n\n    this.sliding = true\n\n    isCycling && this.pause()\n\n    if (this.$indicators.length) {\n      this.$indicators.find('.active').removeClass('active')\n      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])\n      $nextIndicator && $nextIndicator.addClass('active')\n    }\n\n    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, \"slid\"\n    if ($.support.transition && this.$element.hasClass('slide')) {\n      $next.addClass(type)\n      $next[0].offsetWidth // force reflow\n      $active.addClass(direction)\n      $next.addClass(direction)\n      $active\n        .one('bsTransitionEnd', function () {\n          $next.removeClass([type, direction].join(' ')).addClass('active')\n          $active.removeClass(['active', direction].join(' '))\n          that.sliding = false\n          setTimeout(function () {\n            that.$element.trigger(slidEvent)\n          }, 0)\n        })\n        .emulateTransitionEnd(Carousel.TRANSITION_DURATION)\n    } else {\n      $active.removeClass('active')\n      $next.addClass('active')\n      this.sliding = false\n      this.$element.trigger(slidEvent)\n    }\n\n    isCycling && this.cycle()\n\n    return this\n  }\n\n\n  // CAROUSEL PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.carousel')\n      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)\n      var action  = typeof option == 'string' ? option : options.slide\n\n      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))\n      if (typeof option == 'number') data.to(option)\n      else if (action) data[action]()\n      else if (options.interval) data.pause().cycle()\n    })\n  }\n\n  var old = $.fn.carousel\n\n  $.fn.carousel             = Plugin\n  $.fn.carousel.Constructor = Carousel\n\n\n  // CAROUSEL NO CONFLICT\n  // ====================\n\n  $.fn.carousel.noConflict = function () {\n    $.fn.carousel = old\n    return this\n  }\n\n\n  // CAROUSEL DATA-API\n  // =================\n\n  var clickHandler = function (e) {\n    var href\n    var $this   = $(this)\n    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) // strip for ie7\n    if (!$target.hasClass('carousel')) return\n    var options = $.extend({}, $target.data(), $this.data())\n    var slideIndex = $this.attr('data-slide-to')\n    if (slideIndex) options.interval = false\n\n    Plugin.call($target, options)\n\n    if (slideIndex) {\n      $target.data('bs.carousel').to(slideIndex)\n    }\n\n    e.preventDefault()\n  }\n\n  $(document)\n    .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)\n    .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)\n\n  $(window).on('load', function () {\n    $('[data-ride=\"carousel\"]').each(function () {\n      var $carousel = $(this)\n      Plugin.call($carousel, $carousel.data())\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: collapse.js v3.3.1\n * http://getbootstrap.com/javascript/#collapse\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // COLLAPSE PUBLIC CLASS DEFINITION\n  // ================================\n\n  var Collapse = function (element, options) {\n    this.$element      = $(element)\n    this.options       = $.extend({}, Collapse.DEFAULTS, options)\n    this.$trigger      = $(this.options.trigger).filter('[href=\"#' + element.id + '\"], [data-target=\"#' + element.id + '\"]')\n    this.transitioning = null\n\n    if (this.options.parent) {\n      this.$parent = this.getParent()\n    } else {\n      this.addAriaAndCollapsedClass(this.$element, this.$trigger)\n    }\n\n    if (this.options.toggle) this.toggle()\n  }\n\n  Collapse.VERSION  = '3.3.1'\n\n  Collapse.TRANSITION_DURATION = 350\n\n  Collapse.DEFAULTS = {\n    toggle: true,\n    trigger: '[data-toggle=\"collapse\"]'\n  }\n\n  Collapse.prototype.dimension = function () {\n    var hasWidth = this.$element.hasClass('width')\n    return hasWidth ? 'width' : 'height'\n  }\n\n  Collapse.prototype.show = function () {\n    if (this.transitioning || this.$element.hasClass('in')) return\n\n    var activesData\n    var actives = this.$parent && this.$parent.find('> .panel').children('.in, .collapsing')\n\n    if (actives && actives.length) {\n      activesData = actives.data('bs.collapse')\n      if (activesData && activesData.transitioning) return\n    }\n\n    var startEvent = $.Event('show.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    if (actives && actives.length) {\n      Plugin.call(actives, 'hide')\n      activesData || actives.data('bs.collapse', null)\n    }\n\n    var dimension = this.dimension()\n\n    this.$element\n      .removeClass('collapse')\n      .addClass('collapsing')[dimension](0)\n      .attr('aria-expanded', true)\n\n    this.$trigger\n      .removeClass('collapsed')\n      .attr('aria-expanded', true)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.$element\n        .removeClass('collapsing')\n        .addClass('collapse in')[dimension]('')\n      this.transitioning = 0\n      this.$element\n        .trigger('shown.bs.collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    var scrollSize = $.camelCase(['scroll', dimension].join('-'))\n\n    this.$element\n      .one('bsTransitionEnd', $.proxy(complete, this))\n      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])\n  }\n\n  Collapse.prototype.hide = function () {\n    if (this.transitioning || !this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('hide.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var dimension = this.dimension()\n\n    this.$element[dimension](this.$element[dimension]())[0].offsetHeight\n\n    this.$element\n      .addClass('collapsing')\n      .removeClass('collapse in')\n      .attr('aria-expanded', false)\n\n    this.$trigger\n      .addClass('collapsed')\n      .attr('aria-expanded', false)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.transitioning = 0\n      this.$element\n        .removeClass('collapsing')\n        .addClass('collapse')\n        .trigger('hidden.bs.collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    this.$element\n      [dimension](0)\n      .one('bsTransitionEnd', $.proxy(complete, this))\n      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)\n  }\n\n  Collapse.prototype.toggle = function () {\n    this[this.$element.hasClass('in') ? 'hide' : 'show']()\n  }\n\n  Collapse.prototype.getParent = function () {\n    return $(this.options.parent)\n      .find('[data-toggle=\"collapse\"][data-parent=\"' + this.options.parent + '\"]')\n      .each($.proxy(function (i, element) {\n        var $element = $(element)\n        this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)\n      }, this))\n      .end()\n  }\n\n  Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {\n    var isOpen = $element.hasClass('in')\n\n    $element.attr('aria-expanded', isOpen)\n    $trigger\n      .toggleClass('collapsed', !isOpen)\n      .attr('aria-expanded', isOpen)\n  }\n\n  function getTargetFromTrigger($trigger) {\n    var href\n    var target = $trigger.attr('data-target')\n      || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '') // strip for ie7\n\n    return $(target)\n  }\n\n\n  // COLLAPSE PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.collapse')\n      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data && options.toggle && option == 'show') options.toggle = false\n      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.collapse\n\n  $.fn.collapse             = Plugin\n  $.fn.collapse.Constructor = Collapse\n\n\n  // COLLAPSE NO CONFLICT\n  // ====================\n\n  $.fn.collapse.noConflict = function () {\n    $.fn.collapse = old\n    return this\n  }\n\n\n  // COLLAPSE DATA-API\n  // =================\n\n  $(document).on('click.bs.collapse.data-api', '[data-toggle=\"collapse\"]', function (e) {\n    var $this   = $(this)\n\n    if (!$this.attr('data-target')) e.preventDefault()\n\n    var $target = getTargetFromTrigger($this)\n    var data    = $target.data('bs.collapse')\n    var option  = data ? 'toggle' : $.extend({}, $this.data(), { trigger: this })\n\n    Plugin.call($target, option)\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: dropdown.js v3.3.1\n * http://getbootstrap.com/javascript/#dropdowns\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // DROPDOWN CLASS DEFINITION\n  // =========================\n\n  var backdrop = '.dropdown-backdrop'\n  var toggle   = '[data-toggle=\"dropdown\"]'\n  var Dropdown = function (element) {\n    $(element).on('click.bs.dropdown', this.toggle)\n  }\n\n  Dropdown.VERSION = '3.3.1'\n\n  Dropdown.prototype.toggle = function (e) {\n    var $this = $(this)\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    clearMenus()\n\n    if (!isActive) {\n      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {\n        // if mobile we use a backdrop because click events don't delegate\n        $('<div class=\"dropdown-backdrop\"/>').insertAfter($(this)).on('click', clearMenus)\n      }\n\n      var relatedTarget = { relatedTarget: this }\n      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))\n\n      if (e.isDefaultPrevented()) return\n\n      $this\n        .trigger('focus')\n        .attr('aria-expanded', 'true')\n\n      $parent\n        .toggleClass('open')\n        .trigger('shown.bs.dropdown', relatedTarget)\n    }\n\n    return false\n  }\n\n  Dropdown.prototype.keydown = function (e) {\n    if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return\n\n    var $this = $(this)\n\n    e.preventDefault()\n    e.stopPropagation()\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    if ((!isActive && e.which != 27) || (isActive && e.which == 27)) {\n      if (e.which == 27) $parent.find(toggle).trigger('focus')\n      return $this.trigger('click')\n    }\n\n    var desc = ' li:not(.divider):visible a'\n    var $items = $parent.find('[role=\"menu\"]' + desc + ', [role=\"listbox\"]' + desc)\n\n    if (!$items.length) return\n\n    var index = $items.index(e.target)\n\n    if (e.which == 38 && index > 0)                 index--                        // up\n    if (e.which == 40 && index < $items.length - 1) index++                        // down\n    if (!~index)                                      index = 0\n\n    $items.eq(index).trigger('focus')\n  }\n\n  function clearMenus(e) {\n    if (e && e.which === 3) return\n    $(backdrop).remove()\n    $(toggle).each(function () {\n      var $this         = $(this)\n      var $parent       = getParent($this)\n      var relatedTarget = { relatedTarget: this }\n\n      if (!$parent.hasClass('open')) return\n\n      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))\n\n      if (e.isDefaultPrevented()) return\n\n      $this.attr('aria-expanded', 'false')\n      $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)\n    })\n  }\n\n  function getParent($this) {\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = selector && $(selector)\n\n    return $parent && $parent.length ? $parent : $this.parent()\n  }\n\n\n  // DROPDOWN PLUGIN DEFINITION\n  // ==========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.dropdown')\n\n      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  var old = $.fn.dropdown\n\n  $.fn.dropdown             = Plugin\n  $.fn.dropdown.Constructor = Dropdown\n\n\n  // DROPDOWN NO CONFLICT\n  // ====================\n\n  $.fn.dropdown.noConflict = function () {\n    $.fn.dropdown = old\n    return this\n  }\n\n\n  // APPLY TO STANDARD DROPDOWN ELEMENTS\n  // ===================================\n\n  $(document)\n    .on('click.bs.dropdown.data-api', clearMenus)\n    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })\n    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)\n    .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)\n    .on('keydown.bs.dropdown.data-api', '[role=\"menu\"]', Dropdown.prototype.keydown)\n    .on('keydown.bs.dropdown.data-api', '[role=\"listbox\"]', Dropdown.prototype.keydown)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: modal.js v3.3.1\n * http://getbootstrap.com/javascript/#modals\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // MODAL CLASS DEFINITION\n  // ======================\n\n  var Modal = function (element, options) {\n    this.options        = options\n    this.$body          = $(document.body)\n    this.$element       = $(element)\n    this.$backdrop      =\n    this.isShown        = null\n    this.scrollbarWidth = 0\n\n    if (this.options.remote) {\n      this.$element\n        .find('.modal-content')\n        .load(this.options.remote, $.proxy(function () {\n          this.$element.trigger('loaded.bs.modal')\n        }, this))\n    }\n  }\n\n  Modal.VERSION  = '3.3.1'\n\n  Modal.TRANSITION_DURATION = 300\n  Modal.BACKDROP_TRANSITION_DURATION = 150\n\n  Modal.DEFAULTS = {\n    backdrop: true,\n    keyboard: true,\n    show: true\n  }\n\n  Modal.prototype.toggle = function (_relatedTarget) {\n    return this.isShown ? this.hide() : this.show(_relatedTarget)\n  }\n\n  Modal.prototype.show = function (_relatedTarget) {\n    var that = this\n    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })\n\n    this.$element.trigger(e)\n\n    if (this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = true\n\n    this.checkScrollbar()\n    this.setScrollbar()\n    this.$body.addClass('modal-open')\n\n    this.escape()\n    this.resize()\n\n    this.$element.on('click.dismiss.bs.modal', '[data-dismiss=\"modal\"]', $.proxy(this.hide, this))\n\n    this.backdrop(function () {\n      var transition = $.support.transition && that.$element.hasClass('fade')\n\n      if (!that.$element.parent().length) {\n        that.$element.appendTo(that.$body) // don't move modals dom position\n      }\n\n      that.$element\n        .show()\n        .scrollTop(0)\n\n      if (that.options.backdrop) that.adjustBackdrop()\n      that.adjustDialog()\n\n      if (transition) {\n        that.$element[0].offsetWidth // force reflow\n      }\n\n      that.$element\n        .addClass('in')\n        .attr('aria-hidden', false)\n\n      that.enforceFocus()\n\n      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })\n\n      transition ?\n        that.$element.find('.modal-dialog') // wait for modal to slide in\n          .one('bsTransitionEnd', function () {\n            that.$element.trigger('focus').trigger(e)\n          })\n          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :\n        that.$element.trigger('focus').trigger(e)\n    })\n  }\n\n  Modal.prototype.hide = function (e) {\n    if (e) e.preventDefault()\n\n    e = $.Event('hide.bs.modal')\n\n    this.$element.trigger(e)\n\n    if (!this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = false\n\n    this.escape()\n    this.resize()\n\n    $(document).off('focusin.bs.modal')\n\n    this.$element\n      .removeClass('in')\n      .attr('aria-hidden', true)\n      .off('click.dismiss.bs.modal')\n\n    $.support.transition && this.$element.hasClass('fade') ?\n      this.$element\n        .one('bsTransitionEnd', $.proxy(this.hideModal, this))\n        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :\n      this.hideModal()\n  }\n\n  Modal.prototype.enforceFocus = function () {\n    $(document)\n      .off('focusin.bs.modal') // guard against infinite focus loop\n      .on('focusin.bs.modal', $.proxy(function (e) {\n        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {\n          this.$element.trigger('focus')\n        }\n      }, this))\n  }\n\n  Modal.prototype.escape = function () {\n    if (this.isShown && this.options.keyboard) {\n      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {\n        e.which == 27 && this.hide()\n      }, this))\n    } else if (!this.isShown) {\n      this.$element.off('keydown.dismiss.bs.modal')\n    }\n  }\n\n  Modal.prototype.resize = function () {\n    if (this.isShown) {\n      $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))\n    } else {\n      $(window).off('resize.bs.modal')\n    }\n  }\n\n  Modal.prototype.hideModal = function () {\n    var that = this\n    this.$element.hide()\n    this.backdrop(function () {\n      that.$body.removeClass('modal-open')\n      that.resetAdjustments()\n      that.resetScrollbar()\n      that.$element.trigger('hidden.bs.modal')\n    })\n  }\n\n  Modal.prototype.removeBackdrop = function () {\n    this.$backdrop && this.$backdrop.remove()\n    this.$backdrop = null\n  }\n\n  Modal.prototype.backdrop = function (callback) {\n    var that = this\n    var animate = this.$element.hasClass('fade') ? 'fade' : ''\n\n    if (this.isShown && this.options.backdrop) {\n      var doAnimate = $.support.transition && animate\n\n      this.$backdrop = $('<div class=\"modal-backdrop ' + animate + '\" />')\n        .prependTo(this.$element)\n        .on('click.dismiss.bs.modal', $.proxy(function (e) {\n          if (e.target !== e.currentTarget) return\n          this.options.backdrop == 'static'\n            ? this.$element[0].focus.call(this.$element[0])\n            : this.hide.call(this)\n        }, this))\n\n      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\n      this.$backdrop.addClass('in')\n\n      if (!callback) return\n\n      doAnimate ?\n        this.$backdrop\n          .one('bsTransitionEnd', callback)\n          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :\n        callback()\n\n    } else if (!this.isShown && this.$backdrop) {\n      this.$backdrop.removeClass('in')\n\n      var callbackRemove = function () {\n        that.removeBackdrop()\n        callback && callback()\n      }\n      $.support.transition && this.$element.hasClass('fade') ?\n        this.$backdrop\n          .one('bsTransitionEnd', callbackRemove)\n          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :\n        callbackRemove()\n\n    } else if (callback) {\n      callback()\n    }\n  }\n\n  // these following methods are used to handle overflowing modals\n\n  Modal.prototype.handleUpdate = function () {\n    if (this.options.backdrop) this.adjustBackdrop()\n    this.adjustDialog()\n  }\n\n  Modal.prototype.adjustBackdrop = function () {\n    this.$backdrop\n      .css('height', 0)\n      .css('height', this.$element[0].scrollHeight)\n  }\n\n  Modal.prototype.adjustDialog = function () {\n    var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight\n\n    this.$element.css({\n      paddingLeft:  !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',\n      paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''\n    })\n  }\n\n  Modal.prototype.resetAdjustments = function () {\n    this.$element.css({\n      paddingLeft: '',\n      paddingRight: ''\n    })\n  }\n\n  Modal.prototype.checkScrollbar = function () {\n    this.bodyIsOverflowing = document.body.scrollHeight > document.documentElement.clientHeight\n    this.scrollbarWidth = this.measureScrollbar()\n  }\n\n  Modal.prototype.setScrollbar = function () {\n    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)\n    if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)\n  }\n\n  Modal.prototype.resetScrollbar = function () {\n    this.$body.css('padding-right', '')\n  }\n\n  Modal.prototype.measureScrollbar = function () { // thx walsh\n    var scrollDiv = document.createElement('div')\n    scrollDiv.className = 'modal-scrollbar-measure'\n    this.$body.append(scrollDiv)\n    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth\n    this.$body[0].removeChild(scrollDiv)\n    return scrollbarWidth\n  }\n\n\n  // MODAL PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option, _relatedTarget) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.modal')\n      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))\n      if (typeof option == 'string') data[option](_relatedTarget)\n      else if (options.show) data.show(_relatedTarget)\n    })\n  }\n\n  var old = $.fn.modal\n\n  $.fn.modal             = Plugin\n  $.fn.modal.Constructor = Modal\n\n\n  // MODAL NO CONFLICT\n  // =================\n\n  $.fn.modal.noConflict = function () {\n    $.fn.modal = old\n    return this\n  }\n\n\n  // MODAL DATA-API\n  // ==============\n\n  $(document).on('click.bs.modal.data-api', '[data-toggle=\"modal\"]', function (e) {\n    var $this   = $(this)\n    var href    = $this.attr('href')\n    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\\s]+$)/, ''))) // strip for ie7\n    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())\n\n    if ($this.is('a')) e.preventDefault()\n\n    $target.one('show.bs.modal', function (showEvent) {\n      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown\n      $target.one('hidden.bs.modal', function () {\n        $this.is(':visible') && $this.trigger('focus')\n      })\n    })\n    Plugin.call($target, option, this)\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: tooltip.js v3.3.1\n * http://getbootstrap.com/javascript/#tooltip\n * Inspired by the original jQuery.tipsy by Jason Frame\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // TOOLTIP PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Tooltip = function (element, options) {\n    this.type       =\n    this.options    =\n    this.enabled    =\n    this.timeout    =\n    this.hoverState =\n    this.$element   = null\n\n    this.init('tooltip', element, options)\n  }\n\n  Tooltip.VERSION  = '3.3.1'\n\n  Tooltip.TRANSITION_DURATION = 150\n\n  Tooltip.DEFAULTS = {\n    animation: true,\n    placement: 'top',\n    selector: false,\n    template: '<div class=\"tooltip\" role=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>',\n    trigger: 'hover focus',\n    title: '',\n    delay: 0,\n    html: false,\n    container: false,\n    viewport: {\n      selector: 'body',\n      padding: 0\n    }\n  }\n\n  Tooltip.prototype.init = function (type, element, options) {\n    this.enabled   = true\n    this.type      = type\n    this.$element  = $(element)\n    this.options   = this.getOptions(options)\n    this.$viewport = this.options.viewport && $(this.options.viewport.selector || this.options.viewport)\n\n    var triggers = this.options.trigger.split(' ')\n\n    for (var i = triggers.length; i--;) {\n      var trigger = triggers[i]\n\n      if (trigger == 'click') {\n        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))\n      } else if (trigger != 'manual') {\n        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'\n        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'\n\n        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))\n        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))\n      }\n    }\n\n    this.options.selector ?\n      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :\n      this.fixTitle()\n  }\n\n  Tooltip.prototype.getDefaults = function () {\n    return Tooltip.DEFAULTS\n  }\n\n  Tooltip.prototype.getOptions = function (options) {\n    options = $.extend({}, this.getDefaults(), this.$element.data(), options)\n\n    if (options.delay && typeof options.delay == 'number') {\n      options.delay = {\n        show: options.delay,\n        hide: options.delay\n      }\n    }\n\n    return options\n  }\n\n  Tooltip.prototype.getDelegateOptions = function () {\n    var options  = {}\n    var defaults = this.getDefaults()\n\n    this._options && $.each(this._options, function (key, value) {\n      if (defaults[key] != value) options[key] = value\n    })\n\n    return options\n  }\n\n  Tooltip.prototype.enter = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget).data('bs.' + this.type)\n\n    if (self && self.$tip && self.$tip.is(':visible')) {\n      self.hoverState = 'in'\n      return\n    }\n\n    if (!self) {\n      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())\n      $(obj.currentTarget).data('bs.' + this.type, self)\n    }\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'in'\n\n    if (!self.options.delay || !self.options.delay.show) return self.show()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'in') self.show()\n    }, self.options.delay.show)\n  }\n\n  Tooltip.prototype.leave = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget).data('bs.' + this.type)\n\n    if (!self) {\n      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())\n      $(obj.currentTarget).data('bs.' + this.type, self)\n    }\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'out'\n\n    if (!self.options.delay || !self.options.delay.hide) return self.hide()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'out') self.hide()\n    }, self.options.delay.hide)\n  }\n\n  Tooltip.prototype.show = function () {\n    var e = $.Event('show.bs.' + this.type)\n\n    if (this.hasContent() && this.enabled) {\n      this.$element.trigger(e)\n\n      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])\n      if (e.isDefaultPrevented() || !inDom) return\n      var that = this\n\n      var $tip = this.tip()\n\n      var tipId = this.getUID(this.type)\n\n      this.setContent()\n      $tip.attr('id', tipId)\n      this.$element.attr('aria-describedby', tipId)\n\n      if (this.options.animation) $tip.addClass('fade')\n\n      var placement = typeof this.options.placement == 'function' ?\n        this.options.placement.call(this, $tip[0], this.$element[0]) :\n        this.options.placement\n\n      var autoToken = /\\s?auto?\\s?/i\n      var autoPlace = autoToken.test(placement)\n      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'\n\n      $tip\n        .detach()\n        .css({ top: 0, left: 0, display: 'block' })\n        .addClass(placement)\n        .data('bs.' + this.type, this)\n\n      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)\n\n      var pos          = this.getPosition()\n      var actualWidth  = $tip[0].offsetWidth\n      var actualHeight = $tip[0].offsetHeight\n\n      if (autoPlace) {\n        var orgPlacement = placement\n        var $container   = this.options.container ? $(this.options.container) : this.$element.parent()\n        var containerDim = this.getPosition($container)\n\n        placement = placement == 'bottom' && pos.bottom + actualHeight > containerDim.bottom ? 'top'    :\n                    placement == 'top'    && pos.top    - actualHeight < containerDim.top    ? 'bottom' :\n                    placement == 'right'  && pos.right  + actualWidth  > containerDim.width  ? 'left'   :\n                    placement == 'left'   && pos.left   - actualWidth  < containerDim.left   ? 'right'  :\n                    placement\n\n        $tip\n          .removeClass(orgPlacement)\n          .addClass(placement)\n      }\n\n      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)\n\n      this.applyPlacement(calculatedOffset, placement)\n\n      var complete = function () {\n        var prevHoverState = that.hoverState\n        that.$element.trigger('shown.bs.' + that.type)\n        that.hoverState = null\n\n        if (prevHoverState == 'out') that.leave(that)\n      }\n\n      $.support.transition && this.$tip.hasClass('fade') ?\n        $tip\n          .one('bsTransitionEnd', complete)\n          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :\n        complete()\n    }\n  }\n\n  Tooltip.prototype.applyPlacement = function (offset, placement) {\n    var $tip   = this.tip()\n    var width  = $tip[0].offsetWidth\n    var height = $tip[0].offsetHeight\n\n    // manually read margins because getBoundingClientRect includes difference\n    var marginTop = parseInt($tip.css('margin-top'), 10)\n    var marginLeft = parseInt($tip.css('margin-left'), 10)\n\n    // we must check for NaN for ie 8/9\n    if (isNaN(marginTop))  marginTop  = 0\n    if (isNaN(marginLeft)) marginLeft = 0\n\n    offset.top  = offset.top  + marginTop\n    offset.left = offset.left + marginLeft\n\n    // $.fn.offset doesn't round pixel values\n    // so we use setOffset directly with our own function B-0\n    $.offset.setOffset($tip[0], $.extend({\n      using: function (props) {\n        $tip.css({\n          top: Math.round(props.top),\n          left: Math.round(props.left)\n        })\n      }\n    }, offset), 0)\n\n    $tip.addClass('in')\n\n    // check to see if placing tip in new offset caused the tip to resize itself\n    var actualWidth  = $tip[0].offsetWidth\n    var actualHeight = $tip[0].offsetHeight\n\n    if (placement == 'top' && actualHeight != height) {\n      offset.top = offset.top + height - actualHeight\n    }\n\n    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)\n\n    if (delta.left) offset.left += delta.left\n    else offset.top += delta.top\n\n    var isVertical          = /top|bottom/.test(placement)\n    var arrowDelta          = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight\n    var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'\n\n    $tip.offset(offset)\n    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)\n  }\n\n  Tooltip.prototype.replaceArrow = function (delta, dimension, isHorizontal) {\n    this.arrow()\n      .css(isHorizontal ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')\n      .css(isHorizontal ? 'top' : 'left', '')\n  }\n\n  Tooltip.prototype.setContent = function () {\n    var $tip  = this.tip()\n    var title = this.getTitle()\n\n    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)\n    $tip.removeClass('fade in top bottom left right')\n  }\n\n  Tooltip.prototype.hide = function (callback) {\n    var that = this\n    var $tip = this.tip()\n    var e    = $.Event('hide.bs.' + this.type)\n\n    function complete() {\n      if (that.hoverState != 'in') $tip.detach()\n      that.$element\n        .removeAttr('aria-describedby')\n        .trigger('hidden.bs.' + that.type)\n      callback && callback()\n    }\n\n    this.$element.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    $tip.removeClass('in')\n\n    $.support.transition && this.$tip.hasClass('fade') ?\n      $tip\n        .one('bsTransitionEnd', complete)\n        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :\n      complete()\n\n    this.hoverState = null\n\n    return this\n  }\n\n  Tooltip.prototype.fixTitle = function () {\n    var $e = this.$element\n    if ($e.attr('title') || typeof ($e.attr('data-original-title')) != 'string') {\n      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')\n    }\n  }\n\n  Tooltip.prototype.hasContent = function () {\n    return this.getTitle()\n  }\n\n  Tooltip.prototype.getPosition = function ($element) {\n    $element   = $element || this.$element\n\n    var el     = $element[0]\n    var isBody = el.tagName == 'BODY'\n\n    var elRect    = el.getBoundingClientRect()\n    if (elRect.width == null) {\n      // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093\n      elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })\n    }\n    var elOffset  = isBody ? { top: 0, left: 0 } : $element.offset()\n    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }\n    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null\n\n    return $.extend({}, elRect, scroll, outerDims, elOffset)\n  }\n\n  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {\n    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2  } :\n           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2  } :\n           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :\n        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width   }\n\n  }\n\n  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {\n    var delta = { top: 0, left: 0 }\n    if (!this.$viewport) return delta\n\n    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0\n    var viewportDimensions = this.getPosition(this.$viewport)\n\n    if (/right|left/.test(placement)) {\n      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll\n      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight\n      if (topEdgeOffset < viewportDimensions.top) { // top overflow\n        delta.top = viewportDimensions.top - topEdgeOffset\n      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow\n        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset\n      }\n    } else {\n      var leftEdgeOffset  = pos.left - viewportPadding\n      var rightEdgeOffset = pos.left + viewportPadding + actualWidth\n      if (leftEdgeOffset < viewportDimensions.left) { // left overflow\n        delta.left = viewportDimensions.left - leftEdgeOffset\n      } else if (rightEdgeOffset > viewportDimensions.width) { // right overflow\n        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset\n      }\n    }\n\n    return delta\n  }\n\n  Tooltip.prototype.getTitle = function () {\n    var title\n    var $e = this.$element\n    var o  = this.options\n\n    title = $e.attr('data-original-title')\n      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)\n\n    return title\n  }\n\n  Tooltip.prototype.getUID = function (prefix) {\n    do prefix += ~~(Math.random() * 1000000)\n    while (document.getElementById(prefix))\n    return prefix\n  }\n\n  Tooltip.prototype.tip = function () {\n    return (this.$tip = this.$tip || $(this.options.template))\n  }\n\n  Tooltip.prototype.arrow = function () {\n    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))\n  }\n\n  Tooltip.prototype.enable = function () {\n    this.enabled = true\n  }\n\n  Tooltip.prototype.disable = function () {\n    this.enabled = false\n  }\n\n  Tooltip.prototype.toggleEnabled = function () {\n    this.enabled = !this.enabled\n  }\n\n  Tooltip.prototype.toggle = function (e) {\n    var self = this\n    if (e) {\n      self = $(e.currentTarget).data('bs.' + this.type)\n      if (!self) {\n        self = new this.constructor(e.currentTarget, this.getDelegateOptions())\n        $(e.currentTarget).data('bs.' + this.type, self)\n      }\n    }\n\n    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)\n  }\n\n  Tooltip.prototype.destroy = function () {\n    var that = this\n    clearTimeout(this.timeout)\n    this.hide(function () {\n      that.$element.off('.' + that.type).removeData('bs.' + that.type)\n    })\n  }\n\n\n  // TOOLTIP PLUGIN DEFINITION\n  // =========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this    = $(this)\n      var data     = $this.data('bs.tooltip')\n      var options  = typeof option == 'object' && option\n      var selector = options && options.selector\n\n      if (!data && option == 'destroy') return\n      if (selector) {\n        if (!data) $this.data('bs.tooltip', (data = {}))\n        if (!data[selector]) data[selector] = new Tooltip(this, options)\n      } else {\n        if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))\n      }\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.tooltip\n\n  $.fn.tooltip             = Plugin\n  $.fn.tooltip.Constructor = Tooltip\n\n\n  // TOOLTIP NO CONFLICT\n  // ===================\n\n  $.fn.tooltip.noConflict = function () {\n    $.fn.tooltip = old\n    return this\n  }\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: popover.js v3.3.1\n * http://getbootstrap.com/javascript/#popovers\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // POPOVER PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Popover = function (element, options) {\n    this.init('popover', element, options)\n  }\n\n  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')\n\n  Popover.VERSION  = '3.3.1'\n\n  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {\n    placement: 'right',\n    trigger: 'click',\n    content: '',\n    template: '<div class=\"popover\" role=\"tooltip\"><div class=\"arrow\"></div><h3 class=\"popover-title\"></h3><div class=\"popover-content\"></div></div>'\n  })\n\n\n  // NOTE: POPOVER EXTENDS tooltip.js\n  // ================================\n\n  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)\n\n  Popover.prototype.constructor = Popover\n\n  Popover.prototype.getDefaults = function () {\n    return Popover.DEFAULTS\n  }\n\n  Popover.prototype.setContent = function () {\n    var $tip    = this.tip()\n    var title   = this.getTitle()\n    var content = this.getContent()\n\n    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)\n    $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events\n      this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'\n    ](content)\n\n    $tip.removeClass('fade top bottom left right in')\n\n    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do\n    // this manually by checking the contents.\n    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()\n  }\n\n  Popover.prototype.hasContent = function () {\n    return this.getTitle() || this.getContent()\n  }\n\n  Popover.prototype.getContent = function () {\n    var $e = this.$element\n    var o  = this.options\n\n    return $e.attr('data-content')\n      || (typeof o.content == 'function' ?\n            o.content.call($e[0]) :\n            o.content)\n  }\n\n  Popover.prototype.arrow = function () {\n    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))\n  }\n\n  Popover.prototype.tip = function () {\n    if (!this.$tip) this.$tip = $(this.options.template)\n    return this.$tip\n  }\n\n\n  // POPOVER PLUGIN DEFINITION\n  // =========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this    = $(this)\n      var data     = $this.data('bs.popover')\n      var options  = typeof option == 'object' && option\n      var selector = options && options.selector\n\n      if (!data && option == 'destroy') return\n      if (selector) {\n        if (!data) $this.data('bs.popover', (data = {}))\n        if (!data[selector]) data[selector] = new Popover(this, options)\n      } else {\n        if (!data) $this.data('bs.popover', (data = new Popover(this, options)))\n      }\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.popover\n\n  $.fn.popover             = Plugin\n  $.fn.popover.Constructor = Popover\n\n\n  // POPOVER NO CONFLICT\n  // ===================\n\n  $.fn.popover.noConflict = function () {\n    $.fn.popover = old\n    return this\n  }\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: scrollspy.js v3.3.1\n * http://getbootstrap.com/javascript/#scrollspy\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // SCROLLSPY CLASS DEFINITION\n  // ==========================\n\n  function ScrollSpy(element, options) {\n    var process  = $.proxy(this.process, this)\n\n    this.$body          = $('body')\n    this.$scrollElement = $(element).is('body') ? $(window) : $(element)\n    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)\n    this.selector       = (this.options.target || '') + ' .nav li > a'\n    this.offsets        = []\n    this.targets        = []\n    this.activeTarget   = null\n    this.scrollHeight   = 0\n\n    this.$scrollElement.on('scroll.bs.scrollspy', process)\n    this.refresh()\n    this.process()\n  }\n\n  ScrollSpy.VERSION  = '3.3.1'\n\n  ScrollSpy.DEFAULTS = {\n    offset: 10\n  }\n\n  ScrollSpy.prototype.getScrollHeight = function () {\n    return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)\n  }\n\n  ScrollSpy.prototype.refresh = function () {\n    var offsetMethod = 'offset'\n    var offsetBase   = 0\n\n    if (!$.isWindow(this.$scrollElement[0])) {\n      offsetMethod = 'position'\n      offsetBase   = this.$scrollElement.scrollTop()\n    }\n\n    this.offsets = []\n    this.targets = []\n    this.scrollHeight = this.getScrollHeight()\n\n    var self     = this\n\n    this.$body\n      .find(this.selector)\n      .map(function () {\n        var $el   = $(this)\n        var href  = $el.data('target') || $el.attr('href')\n        var $href = /^#./.test(href) && $(href)\n\n        return ($href\n          && $href.length\n          && $href.is(':visible')\n          && [[$href[offsetMethod]().top + offsetBase, href]]) || null\n      })\n      .sort(function (a, b) { return a[0] - b[0] })\n      .each(function () {\n        self.offsets.push(this[0])\n        self.targets.push(this[1])\n      })\n  }\n\n  ScrollSpy.prototype.process = function () {\n    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset\n    var scrollHeight = this.getScrollHeight()\n    var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()\n    var offsets      = this.offsets\n    var targets      = this.targets\n    var activeTarget = this.activeTarget\n    var i\n\n    if (this.scrollHeight != scrollHeight) {\n      this.refresh()\n    }\n\n    if (scrollTop >= maxScroll) {\n      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)\n    }\n\n    if (activeTarget && scrollTop < offsets[0]) {\n      this.activeTarget = null\n      return this.clear()\n    }\n\n    for (i = offsets.length; i--;) {\n      activeTarget != targets[i]\n        && scrollTop >= offsets[i]\n        && (!offsets[i + 1] || scrollTop <= offsets[i + 1])\n        && this.activate(targets[i])\n    }\n  }\n\n  ScrollSpy.prototype.activate = function (target) {\n    this.activeTarget = target\n\n    this.clear()\n\n    var selector = this.selector +\n        '[data-target=\"' + target + '\"],' +\n        this.selector + '[href=\"' + target + '\"]'\n\n    var active = $(selector)\n      .parents('li')\n      .addClass('active')\n\n    if (active.parent('.dropdown-menu').length) {\n      active = active\n        .closest('li.dropdown')\n        .addClass('active')\n    }\n\n    active.trigger('activate.bs.scrollspy')\n  }\n\n  ScrollSpy.prototype.clear = function () {\n    $(this.selector)\n      .parentsUntil(this.options.target, '.active')\n      .removeClass('active')\n  }\n\n\n  // SCROLLSPY PLUGIN DEFINITION\n  // ===========================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.scrollspy')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.scrollspy\n\n  $.fn.scrollspy             = Plugin\n  $.fn.scrollspy.Constructor = ScrollSpy\n\n\n  // SCROLLSPY NO CONFLICT\n  // =====================\n\n  $.fn.scrollspy.noConflict = function () {\n    $.fn.scrollspy = old\n    return this\n  }\n\n\n  // SCROLLSPY DATA-API\n  // ==================\n\n  $(window).on('load.bs.scrollspy.data-api', function () {\n    $('[data-spy=\"scroll\"]').each(function () {\n      var $spy = $(this)\n      Plugin.call($spy, $spy.data())\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: tab.js v3.3.1\n * http://getbootstrap.com/javascript/#tabs\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // TAB CLASS DEFINITION\n  // ====================\n\n  var Tab = function (element) {\n    this.element = $(element)\n  }\n\n  Tab.VERSION = '3.3.1'\n\n  Tab.TRANSITION_DURATION = 150\n\n  Tab.prototype.show = function () {\n    var $this    = this.element\n    var $ul      = $this.closest('ul:not(.dropdown-menu)')\n    var selector = $this.data('target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    if ($this.parent('li').hasClass('active')) return\n\n    var $previous = $ul.find('.active:last a')\n    var hideEvent = $.Event('hide.bs.tab', {\n      relatedTarget: $this[0]\n    })\n    var showEvent = $.Event('show.bs.tab', {\n      relatedTarget: $previous[0]\n    })\n\n    $previous.trigger(hideEvent)\n    $this.trigger(showEvent)\n\n    if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return\n\n    var $target = $(selector)\n\n    this.activate($this.closest('li'), $ul)\n    this.activate($target, $target.parent(), function () {\n      $previous.trigger({\n        type: 'hidden.bs.tab',\n        relatedTarget: $this[0]\n      })\n      $this.trigger({\n        type: 'shown.bs.tab',\n        relatedTarget: $previous[0]\n      })\n    })\n  }\n\n  Tab.prototype.activate = function (element, container, callback) {\n    var $active    = container.find('> .active')\n    var transition = callback\n      && $.support.transition\n      && (($active.length && $active.hasClass('fade')) || !!container.find('> .fade').length)\n\n    function next() {\n      $active\n        .removeClass('active')\n        .find('> .dropdown-menu > .active')\n          .removeClass('active')\n        .end()\n        .find('[data-toggle=\"tab\"]')\n          .attr('aria-expanded', false)\n\n      element\n        .addClass('active')\n        .find('[data-toggle=\"tab\"]')\n          .attr('aria-expanded', true)\n\n      if (transition) {\n        element[0].offsetWidth // reflow for transition\n        element.addClass('in')\n      } else {\n        element.removeClass('fade')\n      }\n\n      if (element.parent('.dropdown-menu')) {\n        element\n          .closest('li.dropdown')\n            .addClass('active')\n          .end()\n          .find('[data-toggle=\"tab\"]')\n            .attr('aria-expanded', true)\n      }\n\n      callback && callback()\n    }\n\n    $active.length && transition ?\n      $active\n        .one('bsTransitionEnd', next)\n        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :\n      next()\n\n    $active.removeClass('in')\n  }\n\n\n  // TAB PLUGIN DEFINITION\n  // =====================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.tab')\n\n      if (!data) $this.data('bs.tab', (data = new Tab(this)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.tab\n\n  $.fn.tab             = Plugin\n  $.fn.tab.Constructor = Tab\n\n\n  // TAB NO CONFLICT\n  // ===============\n\n  $.fn.tab.noConflict = function () {\n    $.fn.tab = old\n    return this\n  }\n\n\n  // TAB DATA-API\n  // ============\n\n  var clickHandler = function (e) {\n    e.preventDefault()\n    Plugin.call($(this), 'show')\n  }\n\n  $(document)\n    .on('click.bs.tab.data-api', '[data-toggle=\"tab\"]', clickHandler)\n    .on('click.bs.tab.data-api', '[data-toggle=\"pill\"]', clickHandler)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: affix.js v3.3.1\n * http://getbootstrap.com/javascript/#affix\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // AFFIX CLASS DEFINITION\n  // ======================\n\n  var Affix = function (element, options) {\n    this.options = $.extend({}, Affix.DEFAULTS, options)\n\n    this.$target = $(this.options.target)\n      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))\n      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))\n\n    this.$element     = $(element)\n    this.affixed      =\n    this.unpin        =\n    this.pinnedOffset = null\n\n    this.checkPosition()\n  }\n\n  Affix.VERSION  = '3.3.1'\n\n  Affix.RESET    = 'affix affix-top affix-bottom'\n\n  Affix.DEFAULTS = {\n    offset: 0,\n    target: window\n  }\n\n  Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {\n    var scrollTop    = this.$target.scrollTop()\n    var position     = this.$element.offset()\n    var targetHeight = this.$target.height()\n\n    if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false\n\n    if (this.affixed == 'bottom') {\n      if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'\n      return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'\n    }\n\n    var initializing   = this.affixed == null\n    var colliderTop    = initializing ? scrollTop : position.top\n    var colliderHeight = initializing ? targetHeight : height\n\n    if (offsetTop != null && colliderTop <= offsetTop) return 'top'\n    if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'\n\n    return false\n  }\n\n  Affix.prototype.getPinnedOffset = function () {\n    if (this.pinnedOffset) return this.pinnedOffset\n    this.$element.removeClass(Affix.RESET).addClass('affix')\n    var scrollTop = this.$target.scrollTop()\n    var position  = this.$element.offset()\n    return (this.pinnedOffset = position.top - scrollTop)\n  }\n\n  Affix.prototype.checkPositionWithEventLoop = function () {\n    setTimeout($.proxy(this.checkPosition, this), 1)\n  }\n\n  Affix.prototype.checkPosition = function () {\n    if (!this.$element.is(':visible')) return\n\n    var height       = this.$element.height()\n    var offset       = this.options.offset\n    var offsetTop    = offset.top\n    var offsetBottom = offset.bottom\n    var scrollHeight = $('body').height()\n\n    if (typeof offset != 'object')         offsetBottom = offsetTop = offset\n    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)\n    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)\n\n    var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)\n\n    if (this.affixed != affix) {\n      if (this.unpin != null) this.$element.css('top', '')\n\n      var affixType = 'affix' + (affix ? '-' + affix : '')\n      var e         = $.Event(affixType + '.bs.affix')\n\n      this.$element.trigger(e)\n\n      if (e.isDefaultPrevented()) return\n\n      this.affixed = affix\n      this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null\n\n      this.$element\n        .removeClass(Affix.RESET)\n        .addClass(affixType)\n        .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')\n    }\n\n    if (affix == 'bottom') {\n      this.$element.offset({\n        top: scrollHeight - height - offsetBottom\n      })\n    }\n  }\n\n\n  // AFFIX PLUGIN DEFINITION\n  // =======================\n\n  function Plugin(option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.affix')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  var old = $.fn.affix\n\n  $.fn.affix             = Plugin\n  $.fn.affix.Constructor = Affix\n\n\n  // AFFIX NO CONFLICT\n  // =================\n\n  $.fn.affix.noConflict = function () {\n    $.fn.affix = old\n    return this\n  }\n\n\n  // AFFIX DATA-API\n  // ==============\n\n  $(window).on('load', function () {\n    $('[data-spy=\"affix\"]').each(function () {\n      var $spy = $(this)\n      var data = $spy.data()\n\n      data.offset = data.offset || {}\n\n      if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom\n      if (data.offsetTop    != null) data.offset.top    = data.offsetTop\n\n      Plugin.call($spy, data)\n    })\n  })\n\n}(jQuery);\n"
  },
  {
    "path": "what-is-django-part-2/static/js/vendor/npm.js",
    "content": "// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.\nrequire('../../js/transition.js')\nrequire('../../js/alert.js')\nrequire('../../js/button.js')\nrequire('../../js/carousel.js')\nrequire('../../js/collapse.js')\nrequire('../../js/dropdown.js')\nrequire('../../js/modal.js')\nrequire('../../js/tooltip.js')\nrequire('../../js/popover.js')\nrequire('../../js/scrollspy.js')\nrequire('../../js/tab.js')\nrequire('../../js/affix.js')"
  },
  {
    "path": "what-is-django-part-2/static/robots.txt",
    "content": "# www.robotstxt.org/\n\n# Allow crawling of all content\nUser-agent: *\nDisallow:\n"
  }
]