waitress-core 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Gemfile +4 -0
- data/LICENSE +21 -0
- data/Rakefile +4 -0
- data/bin/waitress +22 -0
- data/ext/Thanks.md +1 -0
- data/ext/waitress_http11/ext_help.h +15 -0
- data/ext/waitress_http11/extconf.rb +6 -0
- data/ext/waitress_http11/http11.c +532 -0
- data/ext/waitress_http11/http11_parser.c +1216 -0
- data/ext/waitress_http11/http11_parser.h +49 -0
- data/ext/waitress_http11/http11_parser.java.rl +171 -0
- data/ext/waitress_http11/http11_parser.rl +165 -0
- data/ext/waitress_http11/http11_parser_common.rl +55 -0
- data/ext/waitress_http11/http11_wrb_parser.h +83 -0
- data/lib/waitress.rb +98 -0
- data/lib/waitress/chef.rb +110 -0
- data/lib/waitress/configure.rb +116 -0
- data/lib/waitress/handlers/dirhandler.rb +39 -0
- data/lib/waitress/handlers/handler.rb +57 -0
- data/lib/waitress/handlers/handler404.rb +25 -0
- data/lib/waitress/handlers/libhandler.rb +58 -0
- data/lib/waitress/kernel.rb +182 -0
- data/lib/waitress/parse/query.rb +60 -0
- data/lib/waitress/request.rb +45 -0
- data/lib/waitress/resources/default_config.rb +52 -0
- data/lib/waitress/resources/http/404.html +18 -0
- data/lib/waitress/resources/http/css/hack.css +37 -0
- data/lib/waitress/resources/http/css/waitress.css +57 -0
- data/lib/waitress/resources/http/fonts/eot/latin/hack-bold-latin-webfont.eot +0 -0
- data/lib/waitress/resources/http/fonts/eot/latin/hack-bolditalic-latin-webfont.eot +0 -0
- data/lib/waitress/resources/http/fonts/eot/latin/hack-italic-latin-webfont.eot +0 -0
- data/lib/waitress/resources/http/fonts/eot/latin/hack-regular-latin-webfont.eot +0 -0
- data/lib/waitress/resources/http/fonts/svg/latin/hack-bold-latin-webfont.svg +241 -0
- data/lib/waitress/resources/http/fonts/svg/latin/hack-bolditalic-latin-webfont.svg +241 -0
- data/lib/waitress/resources/http/fonts/svg/latin/hack-italic-latin-webfont.svg +241 -0
- data/lib/waitress/resources/http/fonts/svg/latin/hack-regular-latin-webfont.svg +241 -0
- data/lib/waitress/resources/http/fonts/web-ttf/latin/hack-bold-latin-webfont.ttf +0 -0
- data/lib/waitress/resources/http/fonts/web-ttf/latin/hack-bolditalic-latin-webfont.ttf +0 -0
- data/lib/waitress/resources/http/fonts/web-ttf/latin/hack-italic-latin-webfont.ttf +0 -0
- data/lib/waitress/resources/http/fonts/web-ttf/latin/hack-regular-latin-webfont.ttf +0 -0
- data/lib/waitress/resources/http/fonts/woff/latin/hack-bold-latin-webfont.woff +0 -0
- data/lib/waitress/resources/http/fonts/woff/latin/hack-bolditalic-latin-webfont.woff +0 -0
- data/lib/waitress/resources/http/fonts/woff/latin/hack-italic-latin-webfont.woff +0 -0
- data/lib/waitress/resources/http/fonts/woff/latin/hack-regular-latin-webfont.woff +0 -0
- data/lib/waitress/resources/http/fonts/woff2/latin/hack-bold-latin-webfont.woff2 +0 -0
- data/lib/waitress/resources/http/fonts/woff2/latin/hack-bolditalic-latin-webfont.woff2 +0 -0
- data/lib/waitress/resources/http/fonts/woff2/latin/hack-italic-latin-webfont.woff2 +0 -0
- data/lib/waitress/resources/http/fonts/woff2/latin/hack-regular-latin-webfont.woff2 +0 -0
- data/lib/waitress/resources/http/img/404.png +0 -0
- data/lib/waitress/resources/http/index.html +15 -0
- data/lib/waitress/response.rb +104 -0
- data/lib/waitress/server.rb +115 -0
- data/lib/waitress/util.rb +713 -0
- data/lib/waitress/version.rb +3 -0
- data/lib/waitress/vhost.rb +217 -0
- data/lib/waitress_http11.so +0 -0
- data/waitress-core.gemspec +27 -0
- metadata +187 -0
| Binary file | 
| Binary file | 
| Binary file | 
| Binary file | 
| Binary file | 
| Binary file | 
| Binary file | 
| Binary file | 
| @@ -0,0 +1,15 @@ | |
| 1 | 
            +
            <html>
         | 
| 2 | 
            +
              <head>
         | 
| 3 | 
            +
                <title> Welcome to Waitress </title>
         | 
| 4 | 
            +
                <link rel="stylesheet" href="css/hack.css">
         | 
| 5 | 
            +
                <link rel="stylesheet" href="css/waitress.css">
         | 
| 6 | 
            +
              </head>
         | 
| 7 | 
            +
              <body>
         | 
| 8 | 
            +
                <div id="maincontainer">
         | 
| 9 | 
            +
                  <div class="titlecontainer">
         | 
| 10 | 
            +
                    <h1> Waitress </h1>
         | 
| 11 | 
            +
                    <h2> Please take a seat and let me take your order </h2>
         | 
| 12 | 
            +
                  </div>
         | 
| 13 | 
            +
                </div>
         | 
| 14 | 
            +
              </body>
         | 
| 15 | 
            +
            </html>
         | 
| @@ -0,0 +1,104 @@ | |
| 1 | 
            +
            module Waitress
         | 
| 2 | 
            +
              # The response class is used to cook responses to be served to the client.
         | 
| 3 | 
            +
              # This class contains things like response headers, status codes and the response
         | 
| 4 | 
            +
              # body itself
         | 
| 5 | 
            +
              class Response
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                def initialize
         | 
| 8 | 
            +
                  @headers = {}
         | 
| 9 | 
            +
                  status 200
         | 
| 10 | 
            +
                  default_headers
         | 
| 11 | 
            +
                  @isdone = false
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                # Returns true if the response has already been sent to the client
         | 
| 15 | 
            +
                def done?
         | 
| 16 | 
            +
                  @isdone
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                # Mark the response as done (already sent to the client)
         | 
| 20 | 
            +
                def done state=true
         | 
| 21 | 
            +
                  @isdone = state
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                # Apply the default headers to this response
         | 
| 25 | 
            +
                def default_headers
         | 
| 26 | 
            +
                  header "Server", "Waitress #{Waitress::VERSION} (#{RUBY_PLATFORM})"
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                # Apply the given Status code to the response, such as 200, 404, 500 or
         | 
| 30 | 
            +
                # any other code listed in the HTTP protocol specification
         | 
| 31 | 
            +
                def status status_code
         | 
| 32 | 
            +
                  @status = status_code
         | 
| 33 | 
            +
                  @status_msg = Waitress::Util.status @status
         | 
| 34 | 
            +
                  header "Status", "#{@status} #{@status_msg}"
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                # Set the mimetype (Content-Type header) of this response to the one matching
         | 
| 38 | 
            +
                # the given file extension as matched by the +Waitress::Util+ class
         | 
| 39 | 
            +
                # +filext+:: The file extension to match, e.g. .html, .css, .js
         | 
| 40 | 
            +
                def mime filext
         | 
| 41 | 
            +
                  m = Waitress::Util.mime filext
         | 
| 42 | 
            +
                  header "Content-Type", m
         | 
| 43 | 
            +
                end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                # Set the mimetype (Content-Type header) of this response to the one given.
         | 
| 46 | 
            +
                # +type+:: The mime type to use, e.g. application/json, text/html,
         | 
| 47 | 
            +
                # application/scon
         | 
| 48 | 
            +
                def mime_raw type
         | 
| 49 | 
            +
                  header "Content-Type", type
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                # Set a header for the response. This header will be encoded to the http
         | 
| 53 | 
            +
                # response
         | 
| 54 | 
            +
                # Params:
         | 
| 55 | 
            +
                # +header+:: The name of the header. e.g. "Content-Type"
         | 
| 56 | 
            +
                # +data+:: The data to be encoded into the header. e.g. "text/html"
         | 
| 57 | 
            +
                def header header, data
         | 
| 58 | 
            +
                  @headers[header] = data
         | 
| 59 | 
            +
                end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                # Set the Body IO object for the response. This IO object will be read from
         | 
| 62 | 
            +
                # when the webpage is served, so usually this is a File reference or a StringIO
         | 
| 63 | 
            +
                # +io+:: The io object to use. Not required if you just want to get the IO object
         | 
| 64 | 
            +
                def body_io io=:get
         | 
| 65 | 
            +
                  @io = io unless io == :get
         | 
| 66 | 
            +
                  @io
         | 
| 67 | 
            +
                end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                # Append something to the Body IO. If the Body IO is a StringIO, this will usually be
         | 
| 70 | 
            +
                # a String. This is mostly used for the 'echo' function
         | 
| 71 | 
            +
                def append obj
         | 
| 72 | 
            +
                  @io.write obj
         | 
| 73 | 
            +
                end
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                # Set the body to be a String. This will replace the BodyIO with a StringIO
         | 
| 76 | 
            +
                # containing the string
         | 
| 77 | 
            +
                # +str+:: The new string to replace the BodyIO with
         | 
| 78 | 
            +
                def body str
         | 
| 79 | 
            +
                  body_io StringIO.new(str)
         | 
| 80 | 
            +
                end
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                # Serve the response to the given socket. This will write the Headers, Response
         | 
| 83 | 
            +
                # Code and Body.
         | 
| 84 | 
            +
                def serve sock
         | 
| 85 | 
            +
                  unless done?
         | 
| 86 | 
            +
                    sock.write "HTTP/1.1 #{@status} #{@status_msg}\r\n"
         | 
| 87 | 
            +
                    @headers.each do |k, v|
         | 
| 88 | 
            +
                      sock.write "#{k}: #{v}\r\n"
         | 
| 89 | 
            +
                    end
         | 
| 90 | 
            +
                    sock.write "\r\n"
         | 
| 91 | 
            +
                    unless @io.nil?
         | 
| 92 | 
            +
                      @io.pos = 0
         | 
| 93 | 
            +
                      until @io.eof?
         | 
| 94 | 
            +
                        s = @io.read(4096)
         | 
| 95 | 
            +
                        sock.write s
         | 
| 96 | 
            +
                      end
         | 
| 97 | 
            +
                    end
         | 
| 98 | 
            +
                    done
         | 
| 99 | 
            +
                    sock.close
         | 
| 100 | 
            +
                  end
         | 
| 101 | 
            +
                end
         | 
| 102 | 
            +
             | 
| 103 | 
            +
              end
         | 
| 104 | 
            +
            end
         | 
| @@ -0,0 +1,115 @@ | |
| 1 | 
            +
            require 'socket'
         | 
| 2 | 
            +
            require 'thread'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module Waitress
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              # The Waitress HTTPServer. This class is responsible for handling traffic from
         | 
| 7 | 
            +
              # clients and delegating it to the correct Virtual Host to further handle.
         | 
| 8 | 
            +
              # New threads and Processes are spawned for each connection to the server
         | 
| 9 | 
            +
              class HttpServer < Array
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                class HttpParams < Hash
         | 
| 12 | 
            +
                  attr_accessor :http_body
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                # Create a new Server instance with the given ports. If no ports are given,
         | 
| 16 | 
            +
                # port 80 will be used as a default
         | 
| 17 | 
            +
                def initialize(*ports)
         | 
| 18 | 
            +
                  ports << 80 if ports.length == 0
         | 
| 19 | 
            +
                  @ports = ports
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                # Set or Get the ports for this server. If arguments are provided, the ports
         | 
| 23 | 
            +
                # for this server will be replaced with the ones listed. If no arguments are provided,
         | 
| 24 | 
            +
                # this method simply returns the ports
         | 
| 25 | 
            +
                def ports *ports
         | 
| 26 | 
            +
                  @ports = *ports unless ports.length == 0
         | 
| 27 | 
            +
                  @ports
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                # Start the server. If arguments are provided, it will run with the ports
         | 
| 31 | 
            +
                # declared in the arguments, otherwise, it will use the ports it already has
         | 
| 32 | 
            +
                # set (or 80 for the default)
         | 
| 33 | 
            +
                def run *ports
         | 
| 34 | 
            +
                  @ports = ports unless ports.length == 0
         | 
| 35 | 
            +
                  @threads = @ports.map { |x| Thread.new { launch_port x } }
         | 
| 36 | 
            +
                  self.each do |vhost|
         | 
| 37 | 
            +
                    vhost.on_server_start self
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
                  self
         | 
| 40 | 
            +
                end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                # Join the server, blocking the current thread in order to keep the server alive.
         | 
| 43 | 
            +
                def join
         | 
| 44 | 
            +
                  @threads.each { |x| x.join }
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                # Handle a client based on an IO stream, if you plan to serve on a non-socket
         | 
| 48 | 
            +
                # connection
         | 
| 49 | 
            +
                def read_io io
         | 
| 50 | 
            +
                  handle_client io
         | 
| 51 | 
            +
                end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
              :private
         | 
| 54 | 
            +
                def launch_port port
         | 
| 55 | 
            +
                  @server = TCPServer.new port
         | 
| 56 | 
            +
                  while true
         | 
| 57 | 
            +
                    client = @server.accept
         | 
| 58 | 
            +
                    go do
         | 
| 59 | 
            +
                      begin
         | 
| 60 | 
            +
                        handle_client client
         | 
| 61 | 
            +
                      rescue => e
         | 
| 62 | 
            +
                        puts "Server Error: #{e} (Fix This!)"
         | 
| 63 | 
            +
                        puts e.backtrace
         | 
| 64 | 
            +
                      end
         | 
| 65 | 
            +
                    end
         | 
| 66 | 
            +
                  end
         | 
| 67 | 
            +
                end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                def handle_client client_socket
         | 
| 70 | 
            +
                  begin
         | 
| 71 | 
            +
                    data = client_socket.readpartial(8196)
         | 
| 72 | 
            +
                  rescue
         | 
| 73 | 
            +
                    client_socket.close unless client_socket.closed?
         | 
| 74 | 
            +
                    return
         | 
| 75 | 
            +
                  end
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                  gofork do
         | 
| 78 | 
            +
                    parser = Waitress::HttpParser.new
         | 
| 79 | 
            +
                    params = HttpParams.new
         | 
| 80 | 
            +
                    parser.execute(params, data, 0)
         | 
| 81 | 
            +
                    build_request params, client_socket
         | 
| 82 | 
            +
                  end.wait
         | 
| 83 | 
            +
                  client_socket.close
         | 
| 84 | 
            +
                end
         | 
| 85 | 
            +
             | 
| 86 | 
            +
                def build_request headers, client_socket
         | 
| 87 | 
            +
                  request_headers = {}
         | 
| 88 | 
            +
                  headers.each do |k,v|
         | 
| 89 | 
            +
                    if k.start_with? "HTTP_HEAD_"
         | 
| 90 | 
            +
                      request_headers[k.sub(/HTTP_HEAD_/, "")] = v
         | 
| 91 | 
            +
                    end
         | 
| 92 | 
            +
                  end
         | 
| 93 | 
            +
                  request = Waitress::Request.new(
         | 
| 94 | 
            +
                    headers["REQUEST_METHOD"], headers["REQUEST_PATH"], headers["REQUEST_URI"],
         | 
| 95 | 
            +
                    headers["QUERY_STRING"], headers["HTTP_VERSION"], headers.http_body, request_headers
         | 
| 96 | 
            +
                  )
         | 
| 97 | 
            +
                  handle_request request, client_socket
         | 
| 98 | 
            +
                end
         | 
| 99 | 
            +
             | 
| 100 | 
            +
                def handle_request request, client
         | 
| 101 | 
            +
                  match, pri = self[0], nil
         | 
| 102 | 
            +
                  self.each do |vhost|
         | 
| 103 | 
            +
                    if (request.headers['Host'].to_s =~ vhost.domain) != nil
         | 
| 104 | 
            +
                      match = vhost if pri.nil? || vhost.priority > pri
         | 
| 105 | 
            +
                    end
         | 
| 106 | 
            +
                  end
         | 
| 107 | 
            +
             | 
| 108 | 
            +
                  if match.nil?
         | 
| 109 | 
            +
                    # Subdomain not found (or default)
         | 
| 110 | 
            +
                  else
         | 
| 111 | 
            +
                    match.handle_request request, client
         | 
| 112 | 
            +
                  end
         | 
| 113 | 
            +
                end
         | 
| 114 | 
            +
              end
         | 
| 115 | 
            +
            end
         | 
| @@ -0,0 +1,713 @@ | |
| 1 | 
            +
            module Waitress
         | 
| 2 | 
            +
              # A small utility class responsible for determining Mime Types, Status responses
         | 
| 3 | 
            +
              # and host details such as Operating System
         | 
| 4 | 
            +
              class Util
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                # Match a file extension to a valid Mime Type to be used in Content-Type
         | 
| 7 | 
            +
                # headers
         | 
| 8 | 
            +
                # +ext+:: The file extension to map
         | 
| 9 | 
            +
                # +default+:: The default value to use if a match is not found. Defaults to
         | 
| 10 | 
            +
                # application/octet-stream
         | 
| 11 | 
            +
                def self.mime ext, default='application/octet-stream'
         | 
| 12 | 
            +
                  MIME_TYPES.fetch(ext.to_s.downcase, default)
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                # Get the status message for a status code. This matches codes used by the
         | 
| 16 | 
            +
                # HTTP protocol to their message, e.g. 200 -> OK, 404 -> Not Found, etc
         | 
| 17 | 
            +
                # +code+:: The Status Code to match.
         | 
| 18 | 
            +
                def self.status code
         | 
| 19 | 
            +
                  STATUS[code]
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                # Get the host Operating System of the system.
         | 
| 23 | 
            +
                def self.os
         | 
| 24 | 
            +
                  RbConfig::CONFIG['host_os']
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                STATUS = {
         | 
| 28 | 
            +
                  100 => "Continue",
         | 
| 29 | 
            +
                  101 => "Switching Protocols",
         | 
| 30 | 
            +
                  102 => "Processing",
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  200 => "OK",
         | 
| 33 | 
            +
                  201 => "Created",
         | 
| 34 | 
            +
                  202 => "Accepted",
         | 
| 35 | 
            +
                  203 => "Non-Authoritative Information",
         | 
| 36 | 
            +
                  204 => "No Content",
         | 
| 37 | 
            +
                  205 => "Reset Content",
         | 
| 38 | 
            +
                  206 => "Partial Content",
         | 
| 39 | 
            +
                  207 => "Multi-Status",
         | 
| 40 | 
            +
                  208 => "Already Reported",
         | 
| 41 | 
            +
                  226 => "IM Used",
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                  300 => "Multiple Choices",
         | 
| 44 | 
            +
                  301 => "Moved Permanently",
         | 
| 45 | 
            +
                  302 => "Found",
         | 
| 46 | 
            +
                  303 => "See Other",
         | 
| 47 | 
            +
                  304 => "Not Modified",
         | 
| 48 | 
            +
                  305 => "Use Proxy",
         | 
| 49 | 
            +
                  307 => "Temporary Redirect",
         | 
| 50 | 
            +
                  308 => "Permanent Redirect",
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                  400 => "Bad Request",
         | 
| 53 | 
            +
                  401 => "Unauthorized",
         | 
| 54 | 
            +
                  403 => "Forbidden",
         | 
| 55 | 
            +
                  404 => "Not Found",
         | 
| 56 | 
            +
                  405 => "Method Not Allowed",
         | 
| 57 | 
            +
                  406 => "Not Acceptable",
         | 
| 58 | 
            +
                  407 => "Proxy Authentication Required",
         | 
| 59 | 
            +
                  408 => "Request Timeout",
         | 
| 60 | 
            +
                  409 => "Conflict",
         | 
| 61 | 
            +
                  410 => "Gone",
         | 
| 62 | 
            +
                  411 => "Length Required",
         | 
| 63 | 
            +
                  412 => "Precondition Failed",
         | 
| 64 | 
            +
                  413 => "Payload Too Large",
         | 
| 65 | 
            +
                  414 => "Request-URI Too Long",
         | 
| 66 | 
            +
                  415 => "Unsupported Media Type",
         | 
| 67 | 
            +
                  416 => "Requested Range Not Satifiable",
         | 
| 68 | 
            +
                  417 => "Expectation Failed",
         | 
| 69 | 
            +
                  418 => "I'm a teapot",
         | 
| 70 | 
            +
                  426 => "Update Required",
         | 
| 71 | 
            +
                  429 => "Too Many Requests",
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                  500 => "Internal Server Error",
         | 
| 74 | 
            +
                  501 => "Not Implemented",
         | 
| 75 | 
            +
                  502 => "Bad Gateway",
         | 
| 76 | 
            +
                  503 => "Service Unavailable",
         | 
| 77 | 
            +
                  504 => "Gateway Timeout",
         | 
| 78 | 
            +
                  505 => "HTTP Version Not Supported",
         | 
| 79 | 
            +
                  520 => "Unknown Error"
         | 
| 80 | 
            +
                }
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                # Taken from Rack::Mime
         | 
| 83 | 
            +
                MIME_TYPES = {
         | 
| 84 | 
            +
                  ".123"       => "application/vnd.lotus-1-2-3",
         | 
| 85 | 
            +
                  ".3dml"      => "text/vnd.in3d.3dml",
         | 
| 86 | 
            +
                  ".3g2"       => "video/3gpp2",
         | 
| 87 | 
            +
                  ".3gp"       => "video/3gpp",
         | 
| 88 | 
            +
                  ".a"         => "application/octet-stream",
         | 
| 89 | 
            +
                  ".acc"       => "application/vnd.americandynamics.acc",
         | 
| 90 | 
            +
                  ".ace"       => "application/x-ace-compressed",
         | 
| 91 | 
            +
                  ".acu"       => "application/vnd.acucobol",
         | 
| 92 | 
            +
                  ".aep"       => "application/vnd.audiograph",
         | 
| 93 | 
            +
                  ".afp"       => "application/vnd.ibm.modcap",
         | 
| 94 | 
            +
                  ".ai"        => "application/postscript",
         | 
| 95 | 
            +
                  ".aif"       => "audio/x-aiff",
         | 
| 96 | 
            +
                  ".aiff"      => "audio/x-aiff",
         | 
| 97 | 
            +
                  ".ami"       => "application/vnd.amiga.ami",
         | 
| 98 | 
            +
                  ".appcache"  => "text/cache-manifest",
         | 
| 99 | 
            +
                  ".apr"       => "application/vnd.lotus-approach",
         | 
| 100 | 
            +
                  ".asc"       => "application/pgp-signature",
         | 
| 101 | 
            +
                  ".asf"       => "video/x-ms-asf",
         | 
| 102 | 
            +
                  ".asm"       => "text/x-asm",
         | 
| 103 | 
            +
                  ".aso"       => "application/vnd.accpac.simply.aso",
         | 
| 104 | 
            +
                  ".asx"       => "video/x-ms-asf",
         | 
| 105 | 
            +
                  ".atc"       => "application/vnd.acucorp",
         | 
| 106 | 
            +
                  ".atom"      => "application/atom+xml",
         | 
| 107 | 
            +
                  ".atomcat"   => "application/atomcat+xml",
         | 
| 108 | 
            +
                  ".atomsvc"   => "application/atomsvc+xml",
         | 
| 109 | 
            +
                  ".atx"       => "application/vnd.antix.game-component",
         | 
| 110 | 
            +
                  ".au"        => "audio/basic",
         | 
| 111 | 
            +
                  ".avi"       => "video/x-msvideo",
         | 
| 112 | 
            +
                  ".bat"       => "application/x-msdownload",
         | 
| 113 | 
            +
                  ".bcpio"     => "application/x-bcpio",
         | 
| 114 | 
            +
                  ".bdm"       => "application/vnd.syncml.dm+wbxml",
         | 
| 115 | 
            +
                  ".bh2"       => "application/vnd.fujitsu.oasysprs",
         | 
| 116 | 
            +
                  ".bin"       => "application/octet-stream",
         | 
| 117 | 
            +
                  ".bmi"       => "application/vnd.bmi",
         | 
| 118 | 
            +
                  ".bmp"       => "image/bmp",
         | 
| 119 | 
            +
                  ".box"       => "application/vnd.previewsystems.box",
         | 
| 120 | 
            +
                  ".btif"      => "image/prs.btif",
         | 
| 121 | 
            +
                  ".bz"        => "application/x-bzip",
         | 
| 122 | 
            +
                  ".bz2"       => "application/x-bzip2",
         | 
| 123 | 
            +
                  ".c"         => "text/x-c",
         | 
| 124 | 
            +
                  ".c4g"       => "application/vnd.clonk.c4group",
         | 
| 125 | 
            +
                  ".cab"       => "application/vnd.ms-cab-compressed",
         | 
| 126 | 
            +
                  ".cc"        => "text/x-c",
         | 
| 127 | 
            +
                  ".ccxml"     => "application/ccxml+xml",
         | 
| 128 | 
            +
                  ".cdbcmsg"   => "application/vnd.contact.cmsg",
         | 
| 129 | 
            +
                  ".cdkey"     => "application/vnd.mediastation.cdkey",
         | 
| 130 | 
            +
                  ".cdx"       => "chemical/x-cdx",
         | 
| 131 | 
            +
                  ".cdxml"     => "application/vnd.chemdraw+xml",
         | 
| 132 | 
            +
                  ".cdy"       => "application/vnd.cinderella",
         | 
| 133 | 
            +
                  ".cer"       => "application/pkix-cert",
         | 
| 134 | 
            +
                  ".cgm"       => "image/cgm",
         | 
| 135 | 
            +
                  ".chat"      => "application/x-chat",
         | 
| 136 | 
            +
                  ".chm"       => "application/vnd.ms-htmlhelp",
         | 
| 137 | 
            +
                  ".chrt"      => "application/vnd.kde.kchart",
         | 
| 138 | 
            +
                  ".cif"       => "chemical/x-cif",
         | 
| 139 | 
            +
                  ".cii"       => "application/vnd.anser-web-certificate-issue-initiation",
         | 
| 140 | 
            +
                  ".cil"       => "application/vnd.ms-artgalry",
         | 
| 141 | 
            +
                  ".cla"       => "application/vnd.claymore",
         | 
| 142 | 
            +
                  ".class"     => "application/octet-stream",
         | 
| 143 | 
            +
                  ".clkk"      => "application/vnd.crick.clicker.keyboard",
         | 
| 144 | 
            +
                  ".clkp"      => "application/vnd.crick.clicker.palette",
         | 
| 145 | 
            +
                  ".clkt"      => "application/vnd.crick.clicker.template",
         | 
| 146 | 
            +
                  ".clkw"      => "application/vnd.crick.clicker.wordbank",
         | 
| 147 | 
            +
                  ".clkx"      => "application/vnd.crick.clicker",
         | 
| 148 | 
            +
                  ".clp"       => "application/x-msclip",
         | 
| 149 | 
            +
                  ".cmc"       => "application/vnd.cosmocaller",
         | 
| 150 | 
            +
                  ".cmdf"      => "chemical/x-cmdf",
         | 
| 151 | 
            +
                  ".cml"       => "chemical/x-cml",
         | 
| 152 | 
            +
                  ".cmp"       => "application/vnd.yellowriver-custom-menu",
         | 
| 153 | 
            +
                  ".cmx"       => "image/x-cmx",
         | 
| 154 | 
            +
                  ".com"       => "application/x-msdownload",
         | 
| 155 | 
            +
                  ".conf"      => "text/plain",
         | 
| 156 | 
            +
                  ".cpio"      => "application/x-cpio",
         | 
| 157 | 
            +
                  ".cpp"       => "text/x-c",
         | 
| 158 | 
            +
                  ".cpt"       => "application/mac-compactpro",
         | 
| 159 | 
            +
                  ".crd"       => "application/x-mscardfile",
         | 
| 160 | 
            +
                  ".crl"       => "application/pkix-crl",
         | 
| 161 | 
            +
                  ".crt"       => "application/x-x509-ca-cert",
         | 
| 162 | 
            +
                  ".csh"       => "application/x-csh",
         | 
| 163 | 
            +
                  ".csml"      => "chemical/x-csml",
         | 
| 164 | 
            +
                  ".csp"       => "application/vnd.commonspace",
         | 
| 165 | 
            +
                  ".css"       => "text/css",
         | 
| 166 | 
            +
                  ".csv"       => "text/csv",
         | 
| 167 | 
            +
                  ".curl"      => "application/vnd.curl",
         | 
| 168 | 
            +
                  ".cww"       => "application/prs.cww",
         | 
| 169 | 
            +
                  ".cxx"       => "text/x-c",
         | 
| 170 | 
            +
                  ".daf"       => "application/vnd.mobius.daf",
         | 
| 171 | 
            +
                  ".davmount"  => "application/davmount+xml",
         | 
| 172 | 
            +
                  ".dcr"       => "application/x-director",
         | 
| 173 | 
            +
                  ".dd2"       => "application/vnd.oma.dd2+xml",
         | 
| 174 | 
            +
                  ".ddd"       => "application/vnd.fujixerox.ddd",
         | 
| 175 | 
            +
                  ".deb"       => "application/x-debian-package",
         | 
| 176 | 
            +
                  ".der"       => "application/x-x509-ca-cert",
         | 
| 177 | 
            +
                  ".dfac"      => "application/vnd.dreamfactory",
         | 
| 178 | 
            +
                  ".diff"      => "text/x-diff",
         | 
| 179 | 
            +
                  ".dis"       => "application/vnd.mobius.dis",
         | 
| 180 | 
            +
                  ".djv"       => "image/vnd.djvu",
         | 
| 181 | 
            +
                  ".djvu"      => "image/vnd.djvu",
         | 
| 182 | 
            +
                  ".dll"       => "application/x-msdownload",
         | 
| 183 | 
            +
                  ".dmg"       => "application/octet-stream",
         | 
| 184 | 
            +
                  ".dna"       => "application/vnd.dna",
         | 
| 185 | 
            +
                  ".doc"       => "application/msword",
         | 
| 186 | 
            +
                  ".docm"      => "application/vnd.ms-word.document.macroEnabled.12",
         | 
| 187 | 
            +
                  ".docx"      => "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
         | 
| 188 | 
            +
                  ".dot"       => "application/msword",
         | 
| 189 | 
            +
                  ".dotm"      => "application/vnd.ms-word.template.macroEnabled.12",
         | 
| 190 | 
            +
                  ".dotx"      => "application/vnd.openxmlformats-officedocument.wordprocessingml.template",
         | 
| 191 | 
            +
                  ".dp"        => "application/vnd.osgi.dp",
         | 
| 192 | 
            +
                  ".dpg"       => "application/vnd.dpgraph",
         | 
| 193 | 
            +
                  ".dsc"       => "text/prs.lines.tag",
         | 
| 194 | 
            +
                  ".dtd"       => "application/xml-dtd",
         | 
| 195 | 
            +
                  ".dts"       => "audio/vnd.dts",
         | 
| 196 | 
            +
                  ".dtshd"     => "audio/vnd.dts.hd",
         | 
| 197 | 
            +
                  ".dv"        => "video/x-dv",
         | 
| 198 | 
            +
                  ".dvi"       => "application/x-dvi",
         | 
| 199 | 
            +
                  ".dwf"       => "model/vnd.dwf",
         | 
| 200 | 
            +
                  ".dwg"       => "image/vnd.dwg",
         | 
| 201 | 
            +
                  ".dxf"       => "image/vnd.dxf",
         | 
| 202 | 
            +
                  ".dxp"       => "application/vnd.spotfire.dxp",
         | 
| 203 | 
            +
                  ".ear"       => "application/java-archive",
         | 
| 204 | 
            +
                  ".ecelp4800" => "audio/vnd.nuera.ecelp4800",
         | 
| 205 | 
            +
                  ".ecelp7470" => "audio/vnd.nuera.ecelp7470",
         | 
| 206 | 
            +
                  ".ecelp9600" => "audio/vnd.nuera.ecelp9600",
         | 
| 207 | 
            +
                  ".ecma"      => "application/ecmascript",
         | 
| 208 | 
            +
                  ".edm"       => "application/vnd.novadigm.edm",
         | 
| 209 | 
            +
                  ".edx"       => "application/vnd.novadigm.edx",
         | 
| 210 | 
            +
                  ".efif"      => "application/vnd.picsel",
         | 
| 211 | 
            +
                  ".ei6"       => "application/vnd.pg.osasli",
         | 
| 212 | 
            +
                  ".eml"       => "message/rfc822",
         | 
| 213 | 
            +
                  ".eol"       => "audio/vnd.digital-winds",
         | 
| 214 | 
            +
                  ".eot"       => "application/vnd.ms-fontobject",
         | 
| 215 | 
            +
                  ".eps"       => "application/postscript",
         | 
| 216 | 
            +
                  ".es3"       => "application/vnd.eszigno3+xml",
         | 
| 217 | 
            +
                  ".esf"       => "application/vnd.epson.esf",
         | 
| 218 | 
            +
                  ".etx"       => "text/x-setext",
         | 
| 219 | 
            +
                  ".exe"       => "application/x-msdownload",
         | 
| 220 | 
            +
                  ".ext"       => "application/vnd.novadigm.ext",
         | 
| 221 | 
            +
                  ".ez"        => "application/andrew-inset",
         | 
| 222 | 
            +
                  ".ez2"       => "application/vnd.ezpix-album",
         | 
| 223 | 
            +
                  ".ez3"       => "application/vnd.ezpix-package",
         | 
| 224 | 
            +
                  ".f"         => "text/x-fortran",
         | 
| 225 | 
            +
                  ".f77"       => "text/x-fortran",
         | 
| 226 | 
            +
                  ".f90"       => "text/x-fortran",
         | 
| 227 | 
            +
                  ".fbs"       => "image/vnd.fastbidsheet",
         | 
| 228 | 
            +
                  ".fdf"       => "application/vnd.fdf",
         | 
| 229 | 
            +
                  ".fe_launch" => "application/vnd.denovo.fcselayout-link",
         | 
| 230 | 
            +
                  ".fg5"       => "application/vnd.fujitsu.oasysgp",
         | 
| 231 | 
            +
                  ".fli"       => "video/x-fli",
         | 
| 232 | 
            +
                  ".flo"       => "application/vnd.micrografx.flo",
         | 
| 233 | 
            +
                  ".flv"       => "video/x-flv",
         | 
| 234 | 
            +
                  ".flw"       => "application/vnd.kde.kivio",
         | 
| 235 | 
            +
                  ".flx"       => "text/vnd.fmi.flexstor",
         | 
| 236 | 
            +
                  ".fly"       => "text/vnd.fly",
         | 
| 237 | 
            +
                  ".fm"        => "application/vnd.framemaker",
         | 
| 238 | 
            +
                  ".fnc"       => "application/vnd.frogans.fnc",
         | 
| 239 | 
            +
                  ".for"       => "text/x-fortran",
         | 
| 240 | 
            +
                  ".fpx"       => "image/vnd.fpx",
         | 
| 241 | 
            +
                  ".fsc"       => "application/vnd.fsc.weblaunch",
         | 
| 242 | 
            +
                  ".fst"       => "image/vnd.fst",
         | 
| 243 | 
            +
                  ".ftc"       => "application/vnd.fluxtime.clip",
         | 
| 244 | 
            +
                  ".fti"       => "application/vnd.anser-web-funds-transfer-initiation",
         | 
| 245 | 
            +
                  ".fvt"       => "video/vnd.fvt",
         | 
| 246 | 
            +
                  ".fzs"       => "application/vnd.fuzzysheet",
         | 
| 247 | 
            +
                  ".g3"        => "image/g3fax",
         | 
| 248 | 
            +
                  ".gac"       => "application/vnd.groove-account",
         | 
| 249 | 
            +
                  ".gdl"       => "model/vnd.gdl",
         | 
| 250 | 
            +
                  ".gem"       => "application/octet-stream",
         | 
| 251 | 
            +
                  ".gemspec"   => "text/x-script.ruby",
         | 
| 252 | 
            +
                  ".ghf"       => "application/vnd.groove-help",
         | 
| 253 | 
            +
                  ".gif"       => "image/gif",
         | 
| 254 | 
            +
                  ".gim"       => "application/vnd.groove-identity-message",
         | 
| 255 | 
            +
                  ".gmx"       => "application/vnd.gmx",
         | 
| 256 | 
            +
                  ".gph"       => "application/vnd.flographit",
         | 
| 257 | 
            +
                  ".gqf"       => "application/vnd.grafeq",
         | 
| 258 | 
            +
                  ".gram"      => "application/srgs",
         | 
| 259 | 
            +
                  ".grv"       => "application/vnd.groove-injector",
         | 
| 260 | 
            +
                  ".grxml"     => "application/srgs+xml",
         | 
| 261 | 
            +
                  ".gtar"      => "application/x-gtar",
         | 
| 262 | 
            +
                  ".gtm"       => "application/vnd.groove-tool-message",
         | 
| 263 | 
            +
                  ".gtw"       => "model/vnd.gtw",
         | 
| 264 | 
            +
                  ".gv"        => "text/vnd.graphviz",
         | 
| 265 | 
            +
                  ".gz"        => "application/x-gzip",
         | 
| 266 | 
            +
                  ".h"         => "text/x-c",
         | 
| 267 | 
            +
                  ".h261"      => "video/h261",
         | 
| 268 | 
            +
                  ".h263"      => "video/h263",
         | 
| 269 | 
            +
                  ".h264"      => "video/h264",
         | 
| 270 | 
            +
                  ".hbci"      => "application/vnd.hbci",
         | 
| 271 | 
            +
                  ".hdf"       => "application/x-hdf",
         | 
| 272 | 
            +
                  ".hh"        => "text/x-c",
         | 
| 273 | 
            +
                  ".hlp"       => "application/winhlp",
         | 
| 274 | 
            +
                  ".hpgl"      => "application/vnd.hp-hpgl",
         | 
| 275 | 
            +
                  ".hpid"      => "application/vnd.hp-hpid",
         | 
| 276 | 
            +
                  ".hps"       => "application/vnd.hp-hps",
         | 
| 277 | 
            +
                  ".hqx"       => "application/mac-binhex40",
         | 
| 278 | 
            +
                  ".htc"       => "text/x-component",
         | 
| 279 | 
            +
                  ".htke"      => "application/vnd.kenameaapp",
         | 
| 280 | 
            +
                  ".htm"       => "text/html",
         | 
| 281 | 
            +
                  ".html"      => "text/html",
         | 
| 282 | 
            +
                  ".hvd"       => "application/vnd.yamaha.hv-dic",
         | 
| 283 | 
            +
                  ".hvp"       => "application/vnd.yamaha.hv-voice",
         | 
| 284 | 
            +
                  ".hvs"       => "application/vnd.yamaha.hv-script",
         | 
| 285 | 
            +
                  ".icc"       => "application/vnd.iccprofile",
         | 
| 286 | 
            +
                  ".ice"       => "x-conference/x-cooltalk",
         | 
| 287 | 
            +
                  ".ico"       => "image/vnd.microsoft.icon",
         | 
| 288 | 
            +
                  ".ics"       => "text/calendar",
         | 
| 289 | 
            +
                  ".ief"       => "image/ief",
         | 
| 290 | 
            +
                  ".ifb"       => "text/calendar",
         | 
| 291 | 
            +
                  ".ifm"       => "application/vnd.shana.informed.formdata",
         | 
| 292 | 
            +
                  ".igl"       => "application/vnd.igloader",
         | 
| 293 | 
            +
                  ".igs"       => "model/iges",
         | 
| 294 | 
            +
                  ".igx"       => "application/vnd.micrografx.igx",
         | 
| 295 | 
            +
                  ".iif"       => "application/vnd.shana.informed.interchange",
         | 
| 296 | 
            +
                  ".imp"       => "application/vnd.accpac.simply.imp",
         | 
| 297 | 
            +
                  ".ims"       => "application/vnd.ms-ims",
         | 
| 298 | 
            +
                  ".ipk"       => "application/vnd.shana.informed.package",
         | 
| 299 | 
            +
                  ".irm"       => "application/vnd.ibm.rights-management",
         | 
| 300 | 
            +
                  ".irp"       => "application/vnd.irepository.package+xml",
         | 
| 301 | 
            +
                  ".iso"       => "application/octet-stream",
         | 
| 302 | 
            +
                  ".itp"       => "application/vnd.shana.informed.formtemplate",
         | 
| 303 | 
            +
                  ".ivp"       => "application/vnd.immervision-ivp",
         | 
| 304 | 
            +
                  ".ivu"       => "application/vnd.immervision-ivu",
         | 
| 305 | 
            +
                  ".jad"       => "text/vnd.sun.j2me.app-descriptor",
         | 
| 306 | 
            +
                  ".jam"       => "application/vnd.jam",
         | 
| 307 | 
            +
                  ".jar"       => "application/java-archive",
         | 
| 308 | 
            +
                  ".java"      => "text/x-java-source",
         | 
| 309 | 
            +
                  ".jisp"      => "application/vnd.jisp",
         | 
| 310 | 
            +
                  ".jlt"       => "application/vnd.hp-jlyt",
         | 
| 311 | 
            +
                  ".jnlp"      => "application/x-java-jnlp-file",
         | 
| 312 | 
            +
                  ".joda"      => "application/vnd.joost.joda-archive",
         | 
| 313 | 
            +
                  ".jp2"       => "image/jp2",
         | 
| 314 | 
            +
                  ".jpeg"      => "image/jpeg",
         | 
| 315 | 
            +
                  ".jpg"       => "image/jpeg",
         | 
| 316 | 
            +
                  ".jpgv"      => "video/jpeg",
         | 
| 317 | 
            +
                  ".jpm"       => "video/jpm",
         | 
| 318 | 
            +
                  ".js"        => "application/javascript",
         | 
| 319 | 
            +
                  ".json"      => "application/json",
         | 
| 320 | 
            +
                  ".karbon"    => "application/vnd.kde.karbon",
         | 
| 321 | 
            +
                  ".kfo"       => "application/vnd.kde.kformula",
         | 
| 322 | 
            +
                  ".kia"       => "application/vnd.kidspiration",
         | 
| 323 | 
            +
                  ".kml"       => "application/vnd.google-earth.kml+xml",
         | 
| 324 | 
            +
                  ".kmz"       => "application/vnd.google-earth.kmz",
         | 
| 325 | 
            +
                  ".kne"       => "application/vnd.kinar",
         | 
| 326 | 
            +
                  ".kon"       => "application/vnd.kde.kontour",
         | 
| 327 | 
            +
                  ".kpr"       => "application/vnd.kde.kpresenter",
         | 
| 328 | 
            +
                  ".ksp"       => "application/vnd.kde.kspread",
         | 
| 329 | 
            +
                  ".ktz"       => "application/vnd.kahootz",
         | 
| 330 | 
            +
                  ".kwd"       => "application/vnd.kde.kword",
         | 
| 331 | 
            +
                  ".latex"     => "application/x-latex",
         | 
| 332 | 
            +
                  ".lbd"       => "application/vnd.llamagraphics.life-balance.desktop",
         | 
| 333 | 
            +
                  ".lbe"       => "application/vnd.llamagraphics.life-balance.exchange+xml",
         | 
| 334 | 
            +
                  ".les"       => "application/vnd.hhe.lesson-player",
         | 
| 335 | 
            +
                  ".link66"    => "application/vnd.route66.link66+xml",
         | 
| 336 | 
            +
                  ".log"       => "text/plain",
         | 
| 337 | 
            +
                  ".lostxml"   => "application/lost+xml",
         | 
| 338 | 
            +
                  ".lrm"       => "application/vnd.ms-lrm",
         | 
| 339 | 
            +
                  ".ltf"       => "application/vnd.frogans.ltf",
         | 
| 340 | 
            +
                  ".lvp"       => "audio/vnd.lucent.voice",
         | 
| 341 | 
            +
                  ".lwp"       => "application/vnd.lotus-wordpro",
         | 
| 342 | 
            +
                  ".m3u"       => "audio/x-mpegurl",
         | 
| 343 | 
            +
                  ".m4a"       => "audio/mp4a-latm",
         | 
| 344 | 
            +
                  ".m4v"       => "video/mp4",
         | 
| 345 | 
            +
                  ".ma"        => "application/mathematica",
         | 
| 346 | 
            +
                  ".mag"       => "application/vnd.ecowin.chart",
         | 
| 347 | 
            +
                  ".man"       => "text/troff",
         | 
| 348 | 
            +
                  ".manifest"  => "text/cache-manifest",
         | 
| 349 | 
            +
                  ".mathml"    => "application/mathml+xml",
         | 
| 350 | 
            +
                  ".mbk"       => "application/vnd.mobius.mbk",
         | 
| 351 | 
            +
                  ".mbox"      => "application/mbox",
         | 
| 352 | 
            +
                  ".mc1"       => "application/vnd.medcalcdata",
         | 
| 353 | 
            +
                  ".mcd"       => "application/vnd.mcd",
         | 
| 354 | 
            +
                  ".mdb"       => "application/x-msaccess",
         | 
| 355 | 
            +
                  ".mdi"       => "image/vnd.ms-modi",
         | 
| 356 | 
            +
                  ".mdoc"      => "text/troff",
         | 
| 357 | 
            +
                  ".me"        => "text/troff",
         | 
| 358 | 
            +
                  ".mfm"       => "application/vnd.mfmp",
         | 
| 359 | 
            +
                  ".mgz"       => "application/vnd.proteus.magazine",
         | 
| 360 | 
            +
                  ".mid"       => "audio/midi",
         | 
| 361 | 
            +
                  ".midi"      => "audio/midi",
         | 
| 362 | 
            +
                  ".mif"       => "application/vnd.mif",
         | 
| 363 | 
            +
                  ".mime"      => "message/rfc822",
         | 
| 364 | 
            +
                  ".mj2"       => "video/mj2",
         | 
| 365 | 
            +
                  ".mlp"       => "application/vnd.dolby.mlp",
         | 
| 366 | 
            +
                  ".mmd"       => "application/vnd.chipnuts.karaoke-mmd",
         | 
| 367 | 
            +
                  ".mmf"       => "application/vnd.smaf",
         | 
| 368 | 
            +
                  ".mml"       => "application/mathml+xml",
         | 
| 369 | 
            +
                  ".mmr"       => "image/vnd.fujixerox.edmics-mmr",
         | 
| 370 | 
            +
                  ".mng"       => "video/x-mng",
         | 
| 371 | 
            +
                  ".mny"       => "application/x-msmoney",
         | 
| 372 | 
            +
                  ".mov"       => "video/quicktime",
         | 
| 373 | 
            +
                  ".movie"     => "video/x-sgi-movie",
         | 
| 374 | 
            +
                  ".mp3"       => "audio/mpeg",
         | 
| 375 | 
            +
                  ".mp4"       => "video/mp4",
         | 
| 376 | 
            +
                  ".mp4a"      => "audio/mp4",
         | 
| 377 | 
            +
                  ".mp4s"      => "application/mp4",
         | 
| 378 | 
            +
                  ".mp4v"      => "video/mp4",
         | 
| 379 | 
            +
                  ".mpc"       => "application/vnd.mophun.certificate",
         | 
| 380 | 
            +
                  ".mpeg"      => "video/mpeg",
         | 
| 381 | 
            +
                  ".mpg"       => "video/mpeg",
         | 
| 382 | 
            +
                  ".mpga"      => "audio/mpeg",
         | 
| 383 | 
            +
                  ".mpkg"      => "application/vnd.apple.installer+xml",
         | 
| 384 | 
            +
                  ".mpm"       => "application/vnd.blueice.multipass",
         | 
| 385 | 
            +
                  ".mpn"       => "application/vnd.mophun.application",
         | 
| 386 | 
            +
                  ".mpp"       => "application/vnd.ms-project",
         | 
| 387 | 
            +
                  ".mpy"       => "application/vnd.ibm.minipay",
         | 
| 388 | 
            +
                  ".mqy"       => "application/vnd.mobius.mqy",
         | 
| 389 | 
            +
                  ".mrc"       => "application/marc",
         | 
| 390 | 
            +
                  ".ms"        => "text/troff",
         | 
| 391 | 
            +
                  ".mscml"     => "application/mediaservercontrol+xml",
         | 
| 392 | 
            +
                  ".mseq"      => "application/vnd.mseq",
         | 
| 393 | 
            +
                  ".msf"       => "application/vnd.epson.msf",
         | 
| 394 | 
            +
                  ".msh"       => "model/mesh",
         | 
| 395 | 
            +
                  ".msi"       => "application/x-msdownload",
         | 
| 396 | 
            +
                  ".msl"       => "application/vnd.mobius.msl",
         | 
| 397 | 
            +
                  ".msty"      => "application/vnd.muvee.style",
         | 
| 398 | 
            +
                  ".mts"       => "model/vnd.mts",
         | 
| 399 | 
            +
                  ".mus"       => "application/vnd.musician",
         | 
| 400 | 
            +
                  ".mvb"       => "application/x-msmediaview",
         | 
| 401 | 
            +
                  ".mwf"       => "application/vnd.mfer",
         | 
| 402 | 
            +
                  ".mxf"       => "application/mxf",
         | 
| 403 | 
            +
                  ".mxl"       => "application/vnd.recordare.musicxml",
         | 
| 404 | 
            +
                  ".mxml"      => "application/xv+xml",
         | 
| 405 | 
            +
                  ".mxs"       => "application/vnd.triscape.mxs",
         | 
| 406 | 
            +
                  ".mxu"       => "video/vnd.mpegurl",
         | 
| 407 | 
            +
                  ".n"         => "application/vnd.nokia.n-gage.symbian.install",
         | 
| 408 | 
            +
                  ".nc"        => "application/x-netcdf",
         | 
| 409 | 
            +
                  ".ngdat"     => "application/vnd.nokia.n-gage.data",
         | 
| 410 | 
            +
                  ".nlu"       => "application/vnd.neurolanguage.nlu",
         | 
| 411 | 
            +
                  ".nml"       => "application/vnd.enliven",
         | 
| 412 | 
            +
                  ".nnd"       => "application/vnd.noblenet-directory",
         | 
| 413 | 
            +
                  ".nns"       => "application/vnd.noblenet-sealer",
         | 
| 414 | 
            +
                  ".nnw"       => "application/vnd.noblenet-web",
         | 
| 415 | 
            +
                  ".npx"       => "image/vnd.net-fpx",
         | 
| 416 | 
            +
                  ".nsf"       => "application/vnd.lotus-notes",
         | 
| 417 | 
            +
                  ".oa2"       => "application/vnd.fujitsu.oasys2",
         | 
| 418 | 
            +
                  ".oa3"       => "application/vnd.fujitsu.oasys3",
         | 
| 419 | 
            +
                  ".oas"       => "application/vnd.fujitsu.oasys",
         | 
| 420 | 
            +
                  ".obd"       => "application/x-msbinder",
         | 
| 421 | 
            +
                  ".oda"       => "application/oda",
         | 
| 422 | 
            +
                  ".odc"       => "application/vnd.oasis.opendocument.chart",
         | 
| 423 | 
            +
                  ".odf"       => "application/vnd.oasis.opendocument.formula",
         | 
| 424 | 
            +
                  ".odg"       => "application/vnd.oasis.opendocument.graphics",
         | 
| 425 | 
            +
                  ".odi"       => "application/vnd.oasis.opendocument.image",
         | 
| 426 | 
            +
                  ".odp"       => "application/vnd.oasis.opendocument.presentation",
         | 
| 427 | 
            +
                  ".ods"       => "application/vnd.oasis.opendocument.spreadsheet",
         | 
| 428 | 
            +
                  ".odt"       => "application/vnd.oasis.opendocument.text",
         | 
| 429 | 
            +
                  ".oga"       => "audio/ogg",
         | 
| 430 | 
            +
                  ".ogg"       => "application/ogg",
         | 
| 431 | 
            +
                  ".ogv"       => "video/ogg",
         | 
| 432 | 
            +
                  ".ogx"       => "application/ogg",
         | 
| 433 | 
            +
                  ".org"       => "application/vnd.lotus-organizer",
         | 
| 434 | 
            +
                  ".otc"       => "application/vnd.oasis.opendocument.chart-template",
         | 
| 435 | 
            +
                  ".otf"       => "application/vnd.oasis.opendocument.formula-template",
         | 
| 436 | 
            +
                  ".otg"       => "application/vnd.oasis.opendocument.graphics-template",
         | 
| 437 | 
            +
                  ".oth"       => "application/vnd.oasis.opendocument.text-web",
         | 
| 438 | 
            +
                  ".oti"       => "application/vnd.oasis.opendocument.image-template",
         | 
| 439 | 
            +
                  ".otm"       => "application/vnd.oasis.opendocument.text-master",
         | 
| 440 | 
            +
                  ".ots"       => "application/vnd.oasis.opendocument.spreadsheet-template",
         | 
| 441 | 
            +
                  ".ott"       => "application/vnd.oasis.opendocument.text-template",
         | 
| 442 | 
            +
                  ".oxt"       => "application/vnd.openofficeorg.extension",
         | 
| 443 | 
            +
                  ".p"         => "text/x-pascal",
         | 
| 444 | 
            +
                  ".p10"       => "application/pkcs10",
         | 
| 445 | 
            +
                  ".p12"       => "application/x-pkcs12",
         | 
| 446 | 
            +
                  ".p7b"       => "application/x-pkcs7-certificates",
         | 
| 447 | 
            +
                  ".p7m"       => "application/pkcs7-mime",
         | 
| 448 | 
            +
                  ".p7r"       => "application/x-pkcs7-certreqresp",
         | 
| 449 | 
            +
                  ".p7s"       => "application/pkcs7-signature",
         | 
| 450 | 
            +
                  ".pas"       => "text/x-pascal",
         | 
| 451 | 
            +
                  ".pbd"       => "application/vnd.powerbuilder6",
         | 
| 452 | 
            +
                  ".pbm"       => "image/x-portable-bitmap",
         | 
| 453 | 
            +
                  ".pcl"       => "application/vnd.hp-pcl",
         | 
| 454 | 
            +
                  ".pclxl"     => "application/vnd.hp-pclxl",
         | 
| 455 | 
            +
                  ".pcx"       => "image/x-pcx",
         | 
| 456 | 
            +
                  ".pdb"       => "chemical/x-pdb",
         | 
| 457 | 
            +
                  ".pdf"       => "application/pdf",
         | 
| 458 | 
            +
                  ".pem"       => "application/x-x509-ca-cert",
         | 
| 459 | 
            +
                  ".pfr"       => "application/font-tdpfr",
         | 
| 460 | 
            +
                  ".pgm"       => "image/x-portable-graymap",
         | 
| 461 | 
            +
                  ".pgn"       => "application/x-chess-pgn",
         | 
| 462 | 
            +
                  ".pgp"       => "application/pgp-encrypted",
         | 
| 463 | 
            +
                  ".pic"       => "image/x-pict",
         | 
| 464 | 
            +
                  ".pict"      => "image/pict",
         | 
| 465 | 
            +
                  ".pkg"       => "application/octet-stream",
         | 
| 466 | 
            +
                  ".pki"       => "application/pkixcmp",
         | 
| 467 | 
            +
                  ".pkipath"   => "application/pkix-pkipath",
         | 
| 468 | 
            +
                  ".pl"        => "text/x-script.perl",
         | 
| 469 | 
            +
                  ".plb"       => "application/vnd.3gpp.pic-bw-large",
         | 
| 470 | 
            +
                  ".plc"       => "application/vnd.mobius.plc",
         | 
| 471 | 
            +
                  ".plf"       => "application/vnd.pocketlearn",
         | 
| 472 | 
            +
                  ".pls"       => "application/pls+xml",
         | 
| 473 | 
            +
                  ".pm"        => "text/x-script.perl-module",
         | 
| 474 | 
            +
                  ".pml"       => "application/vnd.ctc-posml",
         | 
| 475 | 
            +
                  ".png"       => "image/png",
         | 
| 476 | 
            +
                  ".pnm"       => "image/x-portable-anymap",
         | 
| 477 | 
            +
                  ".pntg"      => "image/x-macpaint",
         | 
| 478 | 
            +
                  ".portpkg"   => "application/vnd.macports.portpkg",
         | 
| 479 | 
            +
                  ".pot"       => "application/vnd.ms-powerpoint",
         | 
| 480 | 
            +
                  ".potm"      => "application/vnd.ms-powerpoint.template.macroEnabled.12",
         | 
| 481 | 
            +
                  ".potx"      => "application/vnd.openxmlformats-officedocument.presentationml.template",
         | 
| 482 | 
            +
                  ".ppa"       => "application/vnd.ms-powerpoint",
         | 
| 483 | 
            +
                  ".ppam"      => "application/vnd.ms-powerpoint.addin.macroEnabled.12",
         | 
| 484 | 
            +
                  ".ppd"       => "application/vnd.cups-ppd",
         | 
| 485 | 
            +
                  ".ppm"       => "image/x-portable-pixmap",
         | 
| 486 | 
            +
                  ".pps"       => "application/vnd.ms-powerpoint",
         | 
| 487 | 
            +
                  ".ppsm"      => "application/vnd.ms-powerpoint.slideshow.macroEnabled.12",
         | 
| 488 | 
            +
                  ".ppsx"      => "application/vnd.openxmlformats-officedocument.presentationml.slideshow",
         | 
| 489 | 
            +
                  ".ppt"       => "application/vnd.ms-powerpoint",
         | 
| 490 | 
            +
                  ".pptm"      => "application/vnd.ms-powerpoint.presentation.macroEnabled.12",
         | 
| 491 | 
            +
                  ".pptx"      => "application/vnd.openxmlformats-officedocument.presentationml.presentation",
         | 
| 492 | 
            +
                  ".prc"       => "application/vnd.palm",
         | 
| 493 | 
            +
                  ".pre"       => "application/vnd.lotus-freelance",
         | 
| 494 | 
            +
                  ".prf"       => "application/pics-rules",
         | 
| 495 | 
            +
                  ".ps"        => "application/postscript",
         | 
| 496 | 
            +
                  ".psb"       => "application/vnd.3gpp.pic-bw-small",
         | 
| 497 | 
            +
                  ".psd"       => "image/vnd.adobe.photoshop",
         | 
| 498 | 
            +
                  ".ptid"      => "application/vnd.pvi.ptid1",
         | 
| 499 | 
            +
                  ".pub"       => "application/x-mspublisher",
         | 
| 500 | 
            +
                  ".pvb"       => "application/vnd.3gpp.pic-bw-var",
         | 
| 501 | 
            +
                  ".pwn"       => "application/vnd.3m.post-it-notes",
         | 
| 502 | 
            +
                  ".py"        => "text/x-script.python",
         | 
| 503 | 
            +
                  ".pya"       => "audio/vnd.ms-playready.media.pya",
         | 
| 504 | 
            +
                  ".pyv"       => "video/vnd.ms-playready.media.pyv",
         | 
| 505 | 
            +
                  ".qam"       => "application/vnd.epson.quickanime",
         | 
| 506 | 
            +
                  ".qbo"       => "application/vnd.intu.qbo",
         | 
| 507 | 
            +
                  ".qfx"       => "application/vnd.intu.qfx",
         | 
| 508 | 
            +
                  ".qps"       => "application/vnd.publishare-delta-tree",
         | 
| 509 | 
            +
                  ".qt"        => "video/quicktime",
         | 
| 510 | 
            +
                  ".qtif"      => "image/x-quicktime",
         | 
| 511 | 
            +
                  ".qxd"       => "application/vnd.quark.quarkxpress",
         | 
| 512 | 
            +
                  ".ra"        => "audio/x-pn-realaudio",
         | 
| 513 | 
            +
                  ".rake"      => "text/x-script.ruby",
         | 
| 514 | 
            +
                  ".ram"       => "audio/x-pn-realaudio",
         | 
| 515 | 
            +
                  ".rar"       => "application/x-rar-compressed",
         | 
| 516 | 
            +
                  ".ras"       => "image/x-cmu-raster",
         | 
| 517 | 
            +
                  ".rb"        => "text/x-script.ruby",
         | 
| 518 | 
            +
                  ".rcprofile" => "application/vnd.ipunplugged.rcprofile",
         | 
| 519 | 
            +
                  ".rdf"       => "application/rdf+xml",
         | 
| 520 | 
            +
                  ".rdz"       => "application/vnd.data-vision.rdz",
         | 
| 521 | 
            +
                  ".rep"       => "application/vnd.businessobjects",
         | 
| 522 | 
            +
                  ".rgb"       => "image/x-rgb",
         | 
| 523 | 
            +
                  ".rif"       => "application/reginfo+xml",
         | 
| 524 | 
            +
                  ".rl"        => "application/resource-lists+xml",
         | 
| 525 | 
            +
                  ".rlc"       => "image/vnd.fujixerox.edmics-rlc",
         | 
| 526 | 
            +
                  ".rld"       => "application/resource-lists-diff+xml",
         | 
| 527 | 
            +
                  ".rm"        => "application/vnd.rn-realmedia",
         | 
| 528 | 
            +
                  ".rmp"       => "audio/x-pn-realaudio-plugin",
         | 
| 529 | 
            +
                  ".rms"       => "application/vnd.jcp.javame.midlet-rms",
         | 
| 530 | 
            +
                  ".rnc"       => "application/relax-ng-compact-syntax",
         | 
| 531 | 
            +
                  ".roff"      => "text/troff",
         | 
| 532 | 
            +
                  ".rpm"       => "application/x-redhat-package-manager",
         | 
| 533 | 
            +
                  ".rpss"      => "application/vnd.nokia.radio-presets",
         | 
| 534 | 
            +
                  ".rpst"      => "application/vnd.nokia.radio-preset",
         | 
| 535 | 
            +
                  ".rq"        => "application/sparql-query",
         | 
| 536 | 
            +
                  ".rs"        => "application/rls-services+xml",
         | 
| 537 | 
            +
                  ".rsd"       => "application/rsd+xml",
         | 
| 538 | 
            +
                  ".rss"       => "application/rss+xml",
         | 
| 539 | 
            +
                  ".rtf"       => "application/rtf",
         | 
| 540 | 
            +
                  ".rtx"       => "text/richtext",
         | 
| 541 | 
            +
                  ".ru"        => "text/x-script.ruby",
         | 
| 542 | 
            +
                  ".s"         => "text/x-asm",
         | 
| 543 | 
            +
                  ".saf"       => "application/vnd.yamaha.smaf-audio",
         | 
| 544 | 
            +
                  ".sbml"      => "application/sbml+xml",
         | 
| 545 | 
            +
                  ".sc"        => "application/vnd.ibm.secure-container",
         | 
| 546 | 
            +
                  ".scd"       => "application/x-msschedule",
         | 
| 547 | 
            +
                  ".scm"       => "application/vnd.lotus-screencam",
         | 
| 548 | 
            +
                  ".scon"      => "application/scon",
         | 
| 549 | 
            +
                  ".scq"       => "application/scvp-cv-request",
         | 
| 550 | 
            +
                  ".scs"       => "application/scvp-cv-response",
         | 
| 551 | 
            +
                  ".sdkm"      => "application/vnd.solent.sdkm+xml",
         | 
| 552 | 
            +
                  ".sdp"       => "application/sdp",
         | 
| 553 | 
            +
                  ".see"       => "application/vnd.seemail",
         | 
| 554 | 
            +
                  ".sema"      => "application/vnd.sema",
         | 
| 555 | 
            +
                  ".semd"      => "application/vnd.semd",
         | 
| 556 | 
            +
                  ".semf"      => "application/vnd.semf",
         | 
| 557 | 
            +
                  ".setpay"    => "application/set-payment-initiation",
         | 
| 558 | 
            +
                  ".setreg"    => "application/set-registration-initiation",
         | 
| 559 | 
            +
                  ".sfd"       => "application/vnd.hydrostatix.sof-data",
         | 
| 560 | 
            +
                  ".sfs"       => "application/vnd.spotfire.sfs",
         | 
| 561 | 
            +
                  ".sgm"       => "text/sgml",
         | 
| 562 | 
            +
                  ".sgml"      => "text/sgml",
         | 
| 563 | 
            +
                  ".sh"        => "application/x-sh",
         | 
| 564 | 
            +
                  ".shar"      => "application/x-shar",
         | 
| 565 | 
            +
                  ".shf"       => "application/shf+xml",
         | 
| 566 | 
            +
                  ".sig"       => "application/pgp-signature",
         | 
| 567 | 
            +
                  ".sit"       => "application/x-stuffit",
         | 
| 568 | 
            +
                  ".sitx"      => "application/x-stuffitx",
         | 
| 569 | 
            +
                  ".skp"       => "application/vnd.koan",
         | 
| 570 | 
            +
                  ".slt"       => "application/vnd.epson.salt",
         | 
| 571 | 
            +
                  ".smi"       => "application/smil+xml",
         | 
| 572 | 
            +
                  ".snd"       => "audio/basic",
         | 
| 573 | 
            +
                  ".so"        => "application/octet-stream",
         | 
| 574 | 
            +
                  ".spf"       => "application/vnd.yamaha.smaf-phrase",
         | 
| 575 | 
            +
                  ".spl"       => "application/x-futuresplash",
         | 
| 576 | 
            +
                  ".spot"      => "text/vnd.in3d.spot",
         | 
| 577 | 
            +
                  ".spp"       => "application/scvp-vp-response",
         | 
| 578 | 
            +
                  ".spq"       => "application/scvp-vp-request",
         | 
| 579 | 
            +
                  ".src"       => "application/x-wais-source",
         | 
| 580 | 
            +
                  ".srx"       => "application/sparql-results+xml",
         | 
| 581 | 
            +
                  ".sse"       => "application/vnd.kodak-descriptor",
         | 
| 582 | 
            +
                  ".ssf"       => "application/vnd.epson.ssf",
         | 
| 583 | 
            +
                  ".ssml"      => "application/ssml+xml",
         | 
| 584 | 
            +
                  ".stf"       => "application/vnd.wt.stf",
         | 
| 585 | 
            +
                  ".stk"       => "application/hyperstudio",
         | 
| 586 | 
            +
                  ".str"       => "application/vnd.pg.format",
         | 
| 587 | 
            +
                  ".sus"       => "application/vnd.sus-calendar",
         | 
| 588 | 
            +
                  ".sv4cpio"   => "application/x-sv4cpio",
         | 
| 589 | 
            +
                  ".sv4crc"    => "application/x-sv4crc",
         | 
| 590 | 
            +
                  ".svd"       => "application/vnd.svd",
         | 
| 591 | 
            +
                  ".svg"       => "image/svg+xml",
         | 
| 592 | 
            +
                  ".svgz"      => "image/svg+xml",
         | 
| 593 | 
            +
                  ".swf"       => "application/x-shockwave-flash",
         | 
| 594 | 
            +
                  ".swi"       => "application/vnd.arastra.swi",
         | 
| 595 | 
            +
                  ".t"         => "text/troff",
         | 
| 596 | 
            +
                  ".tao"       => "application/vnd.tao.intent-module-archive",
         | 
| 597 | 
            +
                  ".tar"       => "application/x-tar",
         | 
| 598 | 
            +
                  ".tbz"       => "application/x-bzip-compressed-tar",
         | 
| 599 | 
            +
                  ".tcap"      => "application/vnd.3gpp2.tcap",
         | 
| 600 | 
            +
                  ".tcl"       => "application/x-tcl",
         | 
| 601 | 
            +
                  ".tex"       => "application/x-tex",
         | 
| 602 | 
            +
                  ".texi"      => "application/x-texinfo",
         | 
| 603 | 
            +
                  ".texinfo"   => "application/x-texinfo",
         | 
| 604 | 
            +
                  ".text"      => "text/plain",
         | 
| 605 | 
            +
                  ".tif"       => "image/tiff",
         | 
| 606 | 
            +
                  ".tiff"      => "image/tiff",
         | 
| 607 | 
            +
                  ".tmo"       => "application/vnd.tmobile-livetv",
         | 
| 608 | 
            +
                  ".torrent"   => "application/x-bittorrent",
         | 
| 609 | 
            +
                  ".tpl"       => "application/vnd.groove-tool-template",
         | 
| 610 | 
            +
                  ".tpt"       => "application/vnd.trid.tpt",
         | 
| 611 | 
            +
                  ".tr"        => "text/troff",
         | 
| 612 | 
            +
                  ".tra"       => "application/vnd.trueapp",
         | 
| 613 | 
            +
                  ".trm"       => "application/x-msterminal",
         | 
| 614 | 
            +
                  ".tsv"       => "text/tab-separated-values",
         | 
| 615 | 
            +
                  ".ttf"       => "application/octet-stream",
         | 
| 616 | 
            +
                  ".twd"       => "application/vnd.simtech-mindmapper",
         | 
| 617 | 
            +
                  ".txd"       => "application/vnd.genomatix.tuxedo",
         | 
| 618 | 
            +
                  ".txf"       => "application/vnd.mobius.txf",
         | 
| 619 | 
            +
                  ".txt"       => "text/plain",
         | 
| 620 | 
            +
                  ".ufd"       => "application/vnd.ufdl",
         | 
| 621 | 
            +
                  ".umj"       => "application/vnd.umajin",
         | 
| 622 | 
            +
                  ".unityweb"  => "application/vnd.unity",
         | 
| 623 | 
            +
                  ".uoml"      => "application/vnd.uoml+xml",
         | 
| 624 | 
            +
                  ".uri"       => "text/uri-list",
         | 
| 625 | 
            +
                  ".ustar"     => "application/x-ustar",
         | 
| 626 | 
            +
                  ".utz"       => "application/vnd.uiq.theme",
         | 
| 627 | 
            +
                  ".uu"        => "text/x-uuencode",
         | 
| 628 | 
            +
                  ".vcd"       => "application/x-cdlink",
         | 
| 629 | 
            +
                  ".vcf"       => "text/x-vcard",
         | 
| 630 | 
            +
                  ".vcg"       => "application/vnd.groove-vcard",
         | 
| 631 | 
            +
                  ".vcs"       => "text/x-vcalendar",
         | 
| 632 | 
            +
                  ".vcx"       => "application/vnd.vcx",
         | 
| 633 | 
            +
                  ".vis"       => "application/vnd.visionary",
         | 
| 634 | 
            +
                  ".viv"       => "video/vnd.vivo",
         | 
| 635 | 
            +
                  ".vrml"      => "model/vrml",
         | 
| 636 | 
            +
                  ".vsd"       => "application/vnd.visio",
         | 
| 637 | 
            +
                  ".vsf"       => "application/vnd.vsf",
         | 
| 638 | 
            +
                  ".vtu"       => "model/vnd.vtu",
         | 
| 639 | 
            +
                  ".vxml"      => "application/voicexml+xml",
         | 
| 640 | 
            +
                  ".war"       => "application/java-archive",
         | 
| 641 | 
            +
                  ".wav"       => "audio/x-wav",
         | 
| 642 | 
            +
                  ".wax"       => "audio/x-ms-wax",
         | 
| 643 | 
            +
                  ".wbmp"      => "image/vnd.wap.wbmp",
         | 
| 644 | 
            +
                  ".wbs"       => "application/vnd.criticaltools.wbs+xml",
         | 
| 645 | 
            +
                  ".wbxml"     => "application/vnd.wap.wbxml",
         | 
| 646 | 
            +
                  ".webm"      => "video/webm",
         | 
| 647 | 
            +
                  ".wm"        => "video/x-ms-wm",
         | 
| 648 | 
            +
                  ".wma"       => "audio/x-ms-wma",
         | 
| 649 | 
            +
                  ".wmd"       => "application/x-ms-wmd",
         | 
| 650 | 
            +
                  ".wmf"       => "application/x-msmetafile",
         | 
| 651 | 
            +
                  ".wml"       => "text/vnd.wap.wml",
         | 
| 652 | 
            +
                  ".wmlc"      => "application/vnd.wap.wmlc",
         | 
| 653 | 
            +
                  ".wmls"      => "text/vnd.wap.wmlscript",
         | 
| 654 | 
            +
                  ".wmlsc"     => "application/vnd.wap.wmlscriptc",
         | 
| 655 | 
            +
                  ".wmv"       => "video/x-ms-wmv",
         | 
| 656 | 
            +
                  ".wmx"       => "video/x-ms-wmx",
         | 
| 657 | 
            +
                  ".wmz"       => "application/x-ms-wmz",
         | 
| 658 | 
            +
                  ".woff"      => "application/font-woff",
         | 
| 659 | 
            +
                  ".woff2"     => "application/font-woff2",
         | 
| 660 | 
            +
                  ".wpd"       => "application/vnd.wordperfect",
         | 
| 661 | 
            +
                  ".wpl"       => "application/vnd.ms-wpl",
         | 
| 662 | 
            +
                  ".wps"       => "application/vnd.ms-works",
         | 
| 663 | 
            +
                  ".wqd"       => "application/vnd.wqd",
         | 
| 664 | 
            +
                  ".wri"       => "application/x-mswrite",
         | 
| 665 | 
            +
                  ".wrl"       => "model/vrml",
         | 
| 666 | 
            +
                  ".wsdl"      => "application/wsdl+xml",
         | 
| 667 | 
            +
                  ".wspolicy"  => "application/wspolicy+xml",
         | 
| 668 | 
            +
                  ".wtb"       => "application/vnd.webturbo",
         | 
| 669 | 
            +
                  ".wvx"       => "video/x-ms-wvx",
         | 
| 670 | 
            +
                  ".x3d"       => "application/vnd.hzn-3d-crossword",
         | 
| 671 | 
            +
                  ".xar"       => "application/vnd.xara",
         | 
| 672 | 
            +
                  ".xbd"       => "application/vnd.fujixerox.docuworks.binder",
         | 
| 673 | 
            +
                  ".xbm"       => "image/x-xbitmap",
         | 
| 674 | 
            +
                  ".xdm"       => "application/vnd.syncml.dm+xml",
         | 
| 675 | 
            +
                  ".xdp"       => "application/vnd.adobe.xdp+xml",
         | 
| 676 | 
            +
                  ".xdw"       => "application/vnd.fujixerox.docuworks",
         | 
| 677 | 
            +
                  ".xenc"      => "application/xenc+xml",
         | 
| 678 | 
            +
                  ".xer"       => "application/patch-ops-error+xml",
         | 
| 679 | 
            +
                  ".xfdf"      => "application/vnd.adobe.xfdf",
         | 
| 680 | 
            +
                  ".xfdl"      => "application/vnd.xfdl",
         | 
| 681 | 
            +
                  ".xhtml"     => "application/xhtml+xml",
         | 
| 682 | 
            +
                  ".xif"       => "image/vnd.xiff",
         | 
| 683 | 
            +
                  ".xla"       => "application/vnd.ms-excel",
         | 
| 684 | 
            +
                  ".xlam"      => "application/vnd.ms-excel.addin.macroEnabled.12",
         | 
| 685 | 
            +
                  ".xls"       => "application/vnd.ms-excel",
         | 
| 686 | 
            +
                  ".xlsb"      => "application/vnd.ms-excel.sheet.binary.macroEnabled.12",
         | 
| 687 | 
            +
                  ".xlsx"      => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
         | 
| 688 | 
            +
                  ".xlsm"      => "application/vnd.ms-excel.sheet.macroEnabled.12",
         | 
| 689 | 
            +
                  ".xlt"       => "application/vnd.ms-excel",
         | 
| 690 | 
            +
                  ".xltx"      => "application/vnd.openxmlformats-officedocument.spreadsheetml.template",
         | 
| 691 | 
            +
                  ".xml"       => "application/xml",
         | 
| 692 | 
            +
                  ".xo"        => "application/vnd.olpc-sugar",
         | 
| 693 | 
            +
                  ".xop"       => "application/xop+xml",
         | 
| 694 | 
            +
                  ".xpm"       => "image/x-xpixmap",
         | 
| 695 | 
            +
                  ".xpr"       => "application/vnd.is-xpr",
         | 
| 696 | 
            +
                  ".xps"       => "application/vnd.ms-xpsdocument",
         | 
| 697 | 
            +
                  ".xpw"       => "application/vnd.intercon.formnet",
         | 
| 698 | 
            +
                  ".xsl"       => "application/xml",
         | 
| 699 | 
            +
                  ".xslt"      => "application/xslt+xml",
         | 
| 700 | 
            +
                  ".xsm"       => "application/vnd.syncml+xml",
         | 
| 701 | 
            +
                  ".xspf"      => "application/xspf+xml",
         | 
| 702 | 
            +
                  ".xul"       => "application/vnd.mozilla.xul+xml",
         | 
| 703 | 
            +
                  ".xwd"       => "image/x-xwindowdump",
         | 
| 704 | 
            +
                  ".xyz"       => "chemical/x-xyz",
         | 
| 705 | 
            +
                  ".yaml"      => "text/yaml",
         | 
| 706 | 
            +
                  ".yml"       => "text/yaml",
         | 
| 707 | 
            +
                  ".zaz"       => "application/vnd.zzazz.deck+xml",
         | 
| 708 | 
            +
                  ".zip"       => "application/zip",
         | 
| 709 | 
            +
                  ".zmm"       => "application/vnd.handheld-entertainment+xml",
         | 
| 710 | 
            +
                }
         | 
| 711 | 
            +
             | 
| 712 | 
            +
              end
         | 
| 713 | 
            +
            end
         |