plezi 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/CHANGELOG.md +450 -0
  4. data/Gemfile +4 -0
  5. data/KNOWN_ISSUES.md +13 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +341 -0
  8. data/Rakefile +2 -0
  9. data/TODO.md +19 -0
  10. data/bin/plezi +301 -0
  11. data/lib/plezi.rb +125 -0
  12. data/lib/plezi/base/cache.rb +77 -0
  13. data/lib/plezi/base/connections.rb +33 -0
  14. data/lib/plezi/base/dsl.rb +177 -0
  15. data/lib/plezi/base/engine.rb +85 -0
  16. data/lib/plezi/base/events.rb +84 -0
  17. data/lib/plezi/base/io_reactor.rb +41 -0
  18. data/lib/plezi/base/logging.rb +62 -0
  19. data/lib/plezi/base/rack_app.rb +89 -0
  20. data/lib/plezi/base/services.rb +57 -0
  21. data/lib/plezi/base/timers.rb +71 -0
  22. data/lib/plezi/handlers/controller_magic.rb +383 -0
  23. data/lib/plezi/handlers/http_echo.rb +27 -0
  24. data/lib/plezi/handlers/http_host.rb +215 -0
  25. data/lib/plezi/handlers/http_router.rb +69 -0
  26. data/lib/plezi/handlers/magic_helpers.rb +43 -0
  27. data/lib/plezi/handlers/route.rb +272 -0
  28. data/lib/plezi/handlers/stubs.rb +143 -0
  29. data/lib/plezi/server/README.md +33 -0
  30. data/lib/plezi/server/helpers/http.rb +169 -0
  31. data/lib/plezi/server/helpers/mime_types.rb +999 -0
  32. data/lib/plezi/server/protocols/http_protocol.rb +318 -0
  33. data/lib/plezi/server/protocols/http_request.rb +133 -0
  34. data/lib/plezi/server/protocols/http_response.rb +294 -0
  35. data/lib/plezi/server/protocols/websocket.rb +208 -0
  36. data/lib/plezi/server/protocols/ws_response.rb +92 -0
  37. data/lib/plezi/server/services/basic_service.rb +224 -0
  38. data/lib/plezi/server/services/no_service.rb +196 -0
  39. data/lib/plezi/server/services/ssl_service.rb +193 -0
  40. data/lib/plezi/version.rb +3 -0
  41. data/plezi.gemspec +26 -0
  42. data/resources/404.erb +68 -0
  43. data/resources/404.haml +64 -0
  44. data/resources/404.html +67 -0
  45. data/resources/404.slim +63 -0
  46. data/resources/500.erb +68 -0
  47. data/resources/500.haml +63 -0
  48. data/resources/500.html +67 -0
  49. data/resources/500.slim +63 -0
  50. data/resources/Gemfile +85 -0
  51. data/resources/anorexic_gray.png +0 -0
  52. data/resources/anorexic_websockets.html +47 -0
  53. data/resources/code.rb +8 -0
  54. data/resources/config.ru +39 -0
  55. data/resources/controller.rb +139 -0
  56. data/resources/db_ac_config.rb +58 -0
  57. data/resources/db_dm_config.rb +51 -0
  58. data/resources/db_sequel_config.rb +42 -0
  59. data/resources/en.yml +204 -0
  60. data/resources/environment.rb +41 -0
  61. data/resources/haml_config.rb +6 -0
  62. data/resources/i18n_config.rb +14 -0
  63. data/resources/rakefile.rb +22 -0
  64. data/resources/redis_config.rb +35 -0
  65. data/resources/routes.rb +26 -0
  66. data/resources/welcome_page.html +72 -0
  67. data/websocket chatroom.md +639 -0
  68. metadata +141 -0
@@ -0,0 +1,143 @@
1
+ module Plezi
2
+
3
+ ####
4
+ # a skeleton for a RESTful controller class
5
+ #
6
+ # you dont have to inherit this or use this, this is stub code.
7
+ #
8
+ # it can also be used for non RESTful requests by utilizing only the
9
+ # index method or adding public methods that aren't RESTful reserved (and don't start with '_').
10
+ #
11
+ # if a method returns false, a 404 error (not found) is assumed. and routes continue to search.
12
+ #
13
+ # otherwise, the method's return value is added to the response body. Normally, the method will return a String object.
14
+ #
15
+ # methods should return the response's body string as their last value, unless
16
+ # they have correctly edited the response (in which case they should return `true`).
17
+ #
18
+ class StubRESTCtrl
19
+
20
+ # every request that routes to this controller will create a new instance
21
+ def initialize
22
+ end
23
+
24
+ # called when request is GET and params\[:id] isn't defined
25
+ def index
26
+ "Hello World!"
27
+ end
28
+
29
+ # called when request is GET and params\[:id] exists
30
+ def show
31
+ "nothing to show for id - #{params[:id]} - with parameters: #{params.to_s}"
32
+ end
33
+
34
+ # called when request is GET and params\[:id] == "new" (used for the "create new object" form).
35
+ def new
36
+ "Should we make something new?"
37
+ end
38
+
39
+ # called when request is POST or PUT and params\[:id] isn't defined params\[:id] == "new"
40
+ def save
41
+ "save called - creating a new object."
42
+ end
43
+
44
+ # called when request is POST or PUT and params\[:id] exists and isn't "new"
45
+ def update
46
+ "update called - updating #{params[:id]}"
47
+ end
48
+
49
+ # called when request is DELETE (or params["_method"] == 'delete') and request.params\[:id] exists
50
+ def delete
51
+ "delete called - deleting object #{params[:id]}"
52
+ end
53
+
54
+ # called before request is called
55
+ #
56
+ # if method returns false (not nil), controller exists
57
+ # and routes continue searching
58
+ def before
59
+ true
60
+ end
61
+ # called after request is completed
62
+ #
63
+ # if method returns false (not nil), the request body is cleared,
64
+ # the controller exists and routes continue searching
65
+ def after
66
+ true
67
+ end
68
+ end
69
+
70
+ ####
71
+ # a skeleton for a WebSocket controller class which uses REST to emulate long XHR pulling
72
+ #
73
+ # you dont have to inherit this or use this, this is example/stub code.
74
+ #
75
+ # WebSockets Controllers and RESTful Controllers can be the same class
76
+ # (the same route can handle both a regular request and a WebSocket request).
77
+ #
78
+ # if the pre_connect method returns false, the WebSockets connection will be refused and the remaining routes will be attempted.
79
+ #
80
+ class StubWSCtrl
81
+
82
+ # every request that routes to this controller will create a new instance
83
+ def initialize
84
+ end
85
+
86
+ # called before the protocol is swithed from HTTP to WebSockets.
87
+ #
88
+ # this allows setting headers, cookies and other data (such as authentication)
89
+ # prior to opening a WebSocket.
90
+ #
91
+ # if the method returns false, the connection will be refused and the remaining routes will be attempted.
92
+ def pre_connect
93
+ true
94
+ end
95
+
96
+ # called immediately after a WebSocket connection has been established.
97
+ def on_connect
98
+ true
99
+ end
100
+
101
+ # called when new data is recieved
102
+ #
103
+ # data is a string that contains binary or UTF8 (message dependent) data.
104
+ def on_message data
105
+ broadcast :_push, data
106
+ end
107
+
108
+ # called when a disconnect packet has been recieved or the connection has been cut
109
+ # (ISN'T called after a disconnect message has been sent).
110
+ def on_disconnect
111
+ end
112
+
113
+ # a demo event method that recieves a broadcast from instance siblings.
114
+ #
115
+ # methods that are protected and methods that start with an underscore are hidden from the router
116
+ # BUT, broadcasted methods must be public (or the broadcast will quietly fail)... so we have to use
117
+ # the _underscore for this method.
118
+ def _push data
119
+ response << data
120
+ end
121
+
122
+ #####
123
+ ## It is possible to use RESTful methods to help emulate long XHR pulling.
124
+ ## a RESTful controller can also be a WebSockets controller (these are not exclusive qualities).
125
+
126
+ # called when request is GET and params\[:id] isn't defined
127
+ def index
128
+ {message: 'index', data: {id: nil, token: nil}}.to_json
129
+ end
130
+
131
+ # called when request is GET and params\[:id] exists (unless params\[:id] == "new").
132
+ def show
133
+ {message: 'read_chat', data: {id: params[:id], token: cookies['example_token'], example_data: 'we missed you.'}}.to_json
134
+ end
135
+ # called when request is POST / PUT and params\[:id] exists
136
+ def update
137
+ # assumes body is JSON - more handling could be done using the params (which hold parsed JSON data).
138
+ broadcast :_push, request[:body]
139
+ {message: 'write_chat', data: {id: params[:id], token: cookies['example_token'], example_data: 'message sent.'}}.to_json
140
+ end
141
+
142
+ end
143
+ end
@@ -0,0 +1,33 @@
1
+ # server object\file structure
2
+
3
+ - services
4
+
5
+ this folder holds the modules and classes regarding the core-services classes (normal TCP/IP service and SSL service should be here).
6
+
7
+ services have one protocol that parses incoming requests and one handler that takes the parsed request and responds to it.
8
+
9
+ both protocols and handlers can be changed mid-stream, allowing a service to switch protocols (such as from HTTP to WebSockets, HTTP/1.1 to SPDY etc') or a handler.
10
+
11
+ - protocols
12
+
13
+ this folder holds the different protocols that could be run over the each socket-service (HTTP / WebSockets etc' should be here).
14
+
15
+ the protocols are devided into two different classes/object types:
16
+
17
+ 1. parsing input.
18
+ 2. formatting output.
19
+
20
+ - handlers
21
+
22
+ this folder holds the classes and modules used to actually handle the requests parsed by the protocol layer.
23
+
24
+ these are the classes and modules the Plezi framework users (developers) connect with when writing their web apps.
25
+
26
+ ## servers, services and protocols ... what?
27
+
28
+ services are the part of the server that recieves and sends data - services run specific protocols that together make up the whole of a server.
29
+
30
+ this division allows the user to change protocols mid-stream when allowed (such as switching from HTTP to WebSockets).
31
+
32
+ this abstraction to the sockets layer allows support for future or custom protocols without any changes to the abstraction layer.
33
+
@@ -0,0 +1,169 @@
1
+ # encoding: UTF-8
2
+
3
+
4
+
5
+ module Plezi
6
+
7
+ # includes general helper methods for HTTP protocol and related (url encoding etc')
8
+ module HTTP
9
+ module_function
10
+ # decode html form data stream
11
+ # def decode_form_data encoded
12
+ # scanner = StringScanner.new encoded.gsub('+', '%20')
13
+ # decoded = ''
14
+ # until scanner.eos? do
15
+ # decoded << scanner.scan(/[^%]+/)
16
+ # if scanner.scan(/\%[0-9a-fA-F][0-9a-fA-F]/)
17
+ # decoded << scanner.matched[1,2].to_i(16).chr
18
+ # elsif !scanner.eos?
19
+ # decoded << scanner.scan(/./)
20
+ # end
21
+ # end
22
+ # decoded
23
+ # end
24
+ # # encode html form data stream
25
+ # def encode_form_data exposed
26
+ # scanner = StringScanner.new exposed
27
+ # encoded = ''
28
+
29
+ # # HTML form encoding
30
+ # until scanner.eos? do
31
+ # encoded << scanner.scan(/[a-zA-Z0-9\*\.\_\-]+/)
32
+ # encoded << "%#{scanner.matched.ord <= 16 ? "0" : ""} #{ scanner.matched.ord.to_s(16) }" if scanner.scan(/./)
33
+ # end
34
+
35
+ # # HTTP encoding
36
+ # # until scanner.eos? do
37
+ # # encoded << scanner.scan(/[^\:\/\?\#\[\]\@\!\$\&\'\(\)\*\+\,\;\=]+/)
38
+ # # encoded << "%#{scanner.matched.ord <= 16 ? "0" : ""} #{ scanner.matched.ord.to_s(16) }" if scanner.scan(/./)
39
+ # # end
40
+ # encoded
41
+ # end
42
+ # # decode HTTP URI data stream
43
+ # def decode_uri encoded
44
+ # scanner = StringScanner.new encoded.gsub('+', '%20') #? is this true here?
45
+ # decoded = ''
46
+ # until scanner.eos? do
47
+ # decoded << scanner.scan(/[^%]+/)
48
+ # if scanner.scan(/\%[0-9a-fA-F][0-9a-fA-F]/)
49
+ # decoded << scanner.matched[1,2].to_i(16).chr
50
+ # elsif !scanner.eos?
51
+ # decoded << scanner.scan(/./)
52
+ # end
53
+ # end
54
+ # decoded
55
+ # end
56
+ # # encode HTTP URI data stream
57
+ # def encode_uri_data exposed
58
+ # scanner = StringScanner.new exposed
59
+ # encoded = ''
60
+ # until scanner.eos? do
61
+ # encoded << scanner.scan(/[^\:\/\?\#\[\]\@\!\$\&\'\(\)\*\+\,\;\=]+/)
62
+ # encoded << "%#{scanner.matched.ord <= 16 ? "0" : ""} #{ scanner.matched.ord.to_s(16) }" if scanner.scan(/.|[\s]/)
63
+ # end
64
+ # encoded
65
+ # end
66
+
67
+ # Based on the WEBRick source code, escapes &, ", > and < in a String object
68
+ def escape(string)
69
+ string.gsub(/&/n, '&amp;')
70
+ .gsub(/\"/n, '&quot;')
71
+ .gsub(/>/n, '&gt;')
72
+ .gsub(/</n, '&lt;')
73
+ end
74
+ def add_param_to_hash param_name, param_value, target_hash
75
+ begin
76
+ a = target_hash
77
+ p = param_name.gsub(']',' ').split(/\[/)
78
+ p.each_index { |i| n = p[i].strip.to_sym; p[i+1] ? [ ( a[n] ||= ( p[i+1] == ' ' ? [] : {} ) ), ( a = a[n]) ] : (a.is_a?(Hash) ? [(a[n]? (a[n].is_a?(String)? (a[n] = [a[n]]) : true) : a[n]=''), (a=a[n])] : [(a << ''), (a = a.last)]) }
79
+ a << param_value
80
+ rescue Exception => e
81
+ Plezi.error e
82
+ Plezi.error "(Silent): paramaters parse error for #{param_name} ... maybe conflicts with a different set?"
83
+ target_hash[param_name] = make_utf8! param_value
84
+ end
85
+ end
86
+
87
+ def decode object, decode_method = :form
88
+ if object.is_a?(Hash)
89
+ object.values.each {|v| decode v, decode_method}
90
+ elsif object.is_a?(Array)
91
+ object.each {|v| decode v, decode_method}
92
+ elsif object.is_a?(String)
93
+ case decode_method
94
+ when :form
95
+ object.gsub!('+', '%20')
96
+ object.gsub!(/\%[0-9a-fA-F][0-9a-fA-F]/) {|m| m[1..2].to_i(16).chr}
97
+ when :uri, :url
98
+ object.gsub!(/\%[0-9a-fA-F][0-9a-fA-F]/) {|m| m[1..2].to_i(16).chr}
99
+ when :html
100
+ object.gsub!(/&amp;/i, '&')
101
+ object.gsub!(/&quot;/i, '"')
102
+ object.gsub!(/&gt;/i, ">")
103
+ object.gsub!(/&lt;/i, "<")
104
+ when :utf8
105
+
106
+ else
107
+
108
+ end
109
+ object.gsub!(/&#([0-9a-fA-F]{2});/) {|m| m.match(/[0-9a-fA-F]{2}/)[0].hex.chr}
110
+ object.gsub!(/&#([0-9]{4});/) {|m| [m.match(/[0-9]+/)[0].to_i].pack 'U'}
111
+ make_utf8! object
112
+ return object
113
+ elsif object.is_a?(Symbol)
114
+ str = object.to_str
115
+ decode str, decode_method
116
+ return str.to_sym
117
+ else
118
+ raise "Plezi Raising Hell (don't misuse us)!"
119
+ end
120
+ end
121
+ def encode object, decode_method = :form
122
+ if object.is_a?(Hash)
123
+ object.values.each {|v| encode v, decode_method}
124
+ elsif object.is_a?(Array)
125
+ object.each {|v| encode v, decode_method}
126
+ elsif object.is_a?(String)
127
+ case decode_method
128
+ when :uri, :url, :form
129
+ object.gsub!(/[^a-zA-Z0-9\*\.\_\-]/) {|m| m.ord <= 16 ? "%0#{m.ord.to_s(16)}" : "%#{m.ord.to_s(16)}"}
130
+ when :html
131
+ object.gsub!('&', "&amp;")
132
+ object.gsub!('"', "&quot;")
133
+ object.gsub!(">", "&gt;")
134
+ object.gsub!("<", "&lt;")
135
+ object.gsub!(/[^\sa-zA-Z\d\&\;]/) {|m| "&#%04d;" % m.unpack('U')[0] }
136
+ # object.gsub!(/[^\s]/) {|m| "&#%04d;" % m.unpack('U')[0] }
137
+ when :utf8
138
+ object.gsub!(/[^\sa-zA-Z\d]/) {|m| "&#%04d;" % m.unpack('U')[0] }
139
+ else
140
+
141
+ end
142
+ return object
143
+ elsif object.is_a?(Symbol)
144
+ str = object.to_str
145
+ encode str, decode_method
146
+ return str.to_sym
147
+ else
148
+ raise "Plezi Raising Hell (don't misuse us)!"
149
+ end
150
+ end
151
+ # extracts parameters from the query
152
+ def extract_data data, target_hash, decode = :form
153
+ data.each do |set|
154
+ list = set.split('=')
155
+ list.each {|s| HTTP.decode s, decode if s}
156
+ add_param_to_hash list.shift, list.join('='), target_hash
157
+ end
158
+ end
159
+
160
+ # re-encodes a string into UTF-8
161
+ def make_utf8!(string, encoding= 'utf-8')
162
+ return false unless string
163
+ string.force_encoding("binary").encode!(encoding, "binary", invalid: :replace, undef: :replace, replace: '') unless string.force_encoding(encoding).valid_encoding?
164
+ string
165
+ end
166
+
167
+
168
+ end
169
+ end
@@ -0,0 +1,999 @@
1
+ module Plezi
2
+ # This module holds the mime dictionary.
3
+ module MimeTypeHelper
4
+ # thank you Apache group (and many more), for compiling mime-type list for me to search through.
5
+ MIME_DICTIONARY = {"123"=>"application/vnd.lotus-1-2-3",
6
+ "3dml"=>"text/vnd.in3d.3dml",
7
+ "3ds"=>"image/x-3ds",
8
+ "3g2"=>"video/3gpp2",
9
+ "3gp"=>"video/3gpp",
10
+ "7z"=>"application/x-7z-compressed",
11
+ "aab"=>"application/x-authorware-bin",
12
+ "aac"=>"audio/x-aac",
13
+ "aam"=>"application/x-authorware-map",
14
+ "aas"=>"application/x-authorware-seg",
15
+ "abw"=>"application/x-abiword",
16
+ "ac"=>"application/pkix-attr-cert",
17
+ "acc"=>"application/vnd.americandynamics.acc",
18
+ "ace"=>"application/x-ace-compressed",
19
+ "acu"=>"application/vnd.acucobol",
20
+ "acutc"=>"application/vnd.acucorp",
21
+ "adp"=>"audio/adpcm",
22
+ "aep"=>"application/vnd.audiograph",
23
+ "afm"=>"application/x-font-type1",
24
+ "afp"=>"application/vnd.ibm.modcap",
25
+ "ahead"=>"application/vnd.ahead.space",
26
+ "ai"=>"application/postscript",
27
+ "aif"=>"audio/x-aiff",
28
+ "aifc"=>"audio/x-aiff",
29
+ "aiff"=>"audio/x-aiff",
30
+ "air"=>"application/vnd.adobe.air-application-installer-package+zip",
31
+ "ait"=>"application/vnd.dvb.ait",
32
+ "ami"=>"application/vnd.amiga.ami",
33
+ "apk"=>"application/vnd.android.package-archive",
34
+ "appcache"=>"text/cache-manifest",
35
+ "application"=>"application/x-ms-application",
36
+ "apr"=>"application/vnd.lotus-approach",
37
+ "arc"=>"application/x-freearc",
38
+ "asc"=>"application/pgp-signature",
39
+ "asf"=>"video/x-ms-asf",
40
+ "asm"=>"text/x-asm",
41
+ "aso"=>"application/vnd.accpac.simply.aso",
42
+ "asx"=>"video/x-ms-asf",
43
+ "atc"=>"application/vnd.acucorp",
44
+ "atom"=>"application/atom+xml",
45
+ "atomcat"=>"application/atomcat+xml",
46
+ "atomsvc"=>"application/atomsvc+xml",
47
+ "atx"=>"application/vnd.antix.game-component",
48
+ "au"=>"audio/basic",
49
+ "avi"=>"video/x-msvideo",
50
+ "aw"=>"application/applixware",
51
+ "azf"=>"application/vnd.airzip.filesecure.azf",
52
+ "azs"=>"application/vnd.airzip.filesecure.azs",
53
+ "azw"=>"application/vnd.amazon.ebook",
54
+ "bat"=>"application/x-msdownload",
55
+ "bcpio"=>"application/x-bcpio",
56
+ "bdf"=>"application/x-font-bdf",
57
+ "bdm"=>"application/vnd.syncml.dm+wbxml",
58
+ "bed"=>"application/vnd.realvnc.bed",
59
+ "bh2"=>"application/vnd.fujitsu.oasysprs",
60
+ "bin"=>"application/octet-stream",
61
+ "blb"=>"application/x-blorb",
62
+ "blorb"=>"application/x-blorb",
63
+ "bmi"=>"application/vnd.bmi",
64
+ "bmp"=>"image/bmp",
65
+ "book"=>"application/vnd.framemaker",
66
+ "box"=>"application/vnd.previewsystems.box",
67
+ "boz"=>"application/x-bzip2",
68
+ "bpk"=>"application/octet-stream",
69
+ "btif"=>"image/prs.btif",
70
+ "bz"=>"application/x-bzip",
71
+ "bz2"=>"application/x-bzip2",
72
+ "c"=>"text/x-c",
73
+ "c11amc"=>"application/vnd.cluetrust.cartomobile-config",
74
+ "c11amz"=>"application/vnd.cluetrust.cartomobile-config-pkg",
75
+ "c4d"=>"application/vnd.clonk.c4group",
76
+ "c4f"=>"application/vnd.clonk.c4group",
77
+ "c4g"=>"application/vnd.clonk.c4group",
78
+ "c4p"=>"application/vnd.clonk.c4group",
79
+ "c4u"=>"application/vnd.clonk.c4group",
80
+ "cab"=>"application/vnd.ms-cab-compressed",
81
+ "caf"=>"audio/x-caf",
82
+ "cap"=>"application/vnd.tcpdump.pcap",
83
+ "car"=>"application/vnd.curl.car",
84
+ "cat"=>"application/vnd.ms-pki.seccat",
85
+ "cb7"=>"application/x-cbr",
86
+ "cba"=>"application/x-cbr",
87
+ "cbr"=>"application/x-cbr",
88
+ "cbt"=>"application/x-cbr",
89
+ "cbz"=>"application/x-cbr",
90
+ "cc"=>"text/x-c",
91
+ "cct"=>"application/x-director",
92
+ "ccxml"=>"application/ccxml+xml",
93
+ "cdbcmsg"=>"application/vnd.contact.cmsg",
94
+ "cdf"=>"application/x-netcdf",
95
+ "cdkey"=>"application/vnd.mediastation.cdkey",
96
+ "cdmia"=>"application/cdmi-capability",
97
+ "cdmic"=>"application/cdmi-container",
98
+ "cdmid"=>"application/cdmi-domain",
99
+ "cdmio"=>"application/cdmi-object",
100
+ "cdmiq"=>"application/cdmi-queue",
101
+ "cdx"=>"chemical/x-cdx",
102
+ "cdxml"=>"application/vnd.chemdraw+xml",
103
+ "cdy"=>"application/vnd.cinderella",
104
+ "cer"=>"application/pkix-cert",
105
+ "cfs"=>"application/x-cfs-compressed",
106
+ "cgm"=>"image/cgm",
107
+ "chat"=>"application/x-chat",
108
+ "chm"=>"application/vnd.ms-htmlhelp",
109
+ "chrt"=>"application/vnd.kde.kchart",
110
+ "cif"=>"chemical/x-cif",
111
+ "cii"=>"application/vnd.anser-web-certificate-issue-initiation",
112
+ "cil"=>"application/vnd.ms-artgalry",
113
+ "cla"=>"application/vnd.claymore",
114
+ "class"=>"application/java-vm",
115
+ "clkk"=>"application/vnd.crick.clicker.keyboard",
116
+ "clkp"=>"application/vnd.crick.clicker.palette",
117
+ "clkt"=>"application/vnd.crick.clicker.template",
118
+ "clkw"=>"application/vnd.crick.clicker.wordbank",
119
+ "clkx"=>"application/vnd.crick.clicker",
120
+ "clp"=>"application/x-msclip",
121
+ "cmc"=>"application/vnd.cosmocaller",
122
+ "cmdf"=>"chemical/x-cmdf",
123
+ "cml"=>"chemical/x-cml",
124
+ "cmp"=>"application/vnd.yellowriver-custom-menu",
125
+ "cmx"=>"image/x-cmx",
126
+ "cod"=>"application/vnd.rim.cod",
127
+ "com"=>"application/x-msdownload",
128
+ "conf"=>"text/plain",
129
+ "cpio"=>"application/x-cpio",
130
+ "cpp"=>"text/x-c",
131
+ "cpt"=>"application/mac-compactpro",
132
+ "crd"=>"application/x-mscardfile",
133
+ "crl"=>"application/pkix-crl",
134
+ "crt"=>"application/x-x509-ca-cert",
135
+ "cryptonote"=>"application/vnd.rig.cryptonote",
136
+ "csh"=>"application/x-csh",
137
+ "csml"=>"chemical/x-csml",
138
+ "csp"=>"application/vnd.commonspace",
139
+ "css"=>"text/css",
140
+ "cst"=>"application/x-director",
141
+ "csv"=>"text/csv",
142
+ "cu"=>"application/cu-seeme",
143
+ "curl"=>"text/vnd.curl",
144
+ "cww"=>"application/prs.cww",
145
+ "cxt"=>"application/x-director",
146
+ "cxx"=>"text/x-c",
147
+ "dae"=>"model/vnd.collada+xml",
148
+ "daf"=>"application/vnd.mobius.daf",
149
+ "dart"=>"application/vnd.dart",
150
+ "dataless"=>"application/vnd.fdsn.seed",
151
+ "davmount"=>"application/davmount+xml",
152
+ "dbk"=>"application/docbook+xml",
153
+ "dcr"=>"application/x-director",
154
+ "dcurl"=>"text/vnd.curl.dcurl",
155
+ "dd2"=>"application/vnd.oma.dd2+xml",
156
+ "ddd"=>"application/vnd.fujixerox.ddd",
157
+ "deb"=>"application/x-debian-package",
158
+ "def"=>"text/plain",
159
+ "deploy"=>"application/octet-stream",
160
+ "der"=>"application/x-x509-ca-cert",
161
+ "dfac"=>"application/vnd.dreamfactory",
162
+ "dgc"=>"application/x-dgc-compressed",
163
+ "dic"=>"text/x-c",
164
+ "dif"=>"video/x-dv",
165
+ "dir"=>"application/x-director",
166
+ "dis"=>"application/vnd.mobius.dis",
167
+ "dist"=>"application/octet-stream",
168
+ "distz"=>"application/octet-stream",
169
+ "djv"=>"image/vnd.djvu",
170
+ "djvu"=>"image/vnd.djvu",
171
+ "dll"=>"application/x-msdownload",
172
+ "dmg"=>"application/x-apple-diskimage",
173
+ "dmp"=>"application/vnd.tcpdump.pcap",
174
+ "dms"=>"application/octet-stream",
175
+ "dna"=>"application/vnd.dna",
176
+ "doc"=>"application/msword",
177
+ "docm"=>"application/vnd.ms-word.document.macroenabled.12",
178
+ "docx"=>"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
179
+ "dot"=>"application/msword",
180
+ "dotm"=>"application/vnd.ms-word.template.macroenabled.12",
181
+ "dotx"=>"application/vnd.openxmlformats-officedocument.wordprocessingml.template",
182
+ "dp"=>"application/vnd.osgi.dp",
183
+ "dpg"=>"application/vnd.dpgraph",
184
+ "dra"=>"audio/vnd.dra",
185
+ "dsc"=>"text/prs.lines.tag",
186
+ "dssc"=>"application/dssc+der",
187
+ "dtb"=>"application/x-dtbook+xml",
188
+ "dtd"=>"application/xml-dtd",
189
+ "dts"=>"audio/vnd.dts",
190
+ "dtshd"=>"audio/vnd.dts.hd",
191
+ "dump"=>"application/octet-stream",
192
+ "dv"=>"video/x-dv",
193
+ "dvb"=>"video/vnd.dvb.file",
194
+ "dvi"=>"application/x-dvi",
195
+ "dwf"=>"model/vnd.dwf",
196
+ "dwg"=>"image/vnd.dwg",
197
+ "dxf"=>"image/vnd.dxf",
198
+ "dxp"=>"application/vnd.spotfire.dxp",
199
+ "dxr"=>"application/x-director",
200
+ "ecelp4800"=>"audio/vnd.nuera.ecelp4800",
201
+ "ecelp7470"=>"audio/vnd.nuera.ecelp7470",
202
+ "ecelp9600"=>"audio/vnd.nuera.ecelp9600",
203
+ "ecma"=>"application/ecmascript",
204
+ "edm"=>"application/vnd.novadigm.edm",
205
+ "edx"=>"application/vnd.novadigm.edx",
206
+ "efif"=>"application/vnd.picsel",
207
+ "ei6"=>"application/vnd.pg.osasli",
208
+ "elc"=>"application/octet-stream",
209
+ "emf"=>"application/x-msmetafile",
210
+ "eml"=>"message/rfc822",
211
+ "emma"=>"application/emma+xml",
212
+ "emz"=>"application/x-msmetafile",
213
+ "eol"=>"audio/vnd.digital-winds",
214
+ "eot"=>"application/vnd.ms-fontobject",
215
+ "eps"=>"application/postscript",
216
+ "epub"=>"application/epub+zip",
217
+ "es3"=>"application/vnd.eszigno3+xml",
218
+ "esa"=>"application/vnd.osgi.subsystem",
219
+ "esf"=>"application/vnd.epson.esf",
220
+ "et3"=>"application/vnd.eszigno3+xml",
221
+ "etx"=>"text/x-setext",
222
+ "eva"=>"application/x-eva",
223
+ "evy"=>"application/x-envoy",
224
+ "exe"=>"application/x-msdownload",
225
+ "exi"=>"application/exi",
226
+ "ext"=>"application/vnd.novadigm.ext",
227
+ "ez"=>"application/andrew-inset",
228
+ "ez2"=>"application/vnd.ezpix-album",
229
+ "ez3"=>"application/vnd.ezpix-package",
230
+ "f"=>"text/x-fortran",
231
+ "f4v"=>"video/x-f4v",
232
+ "f77"=>"text/x-fortran",
233
+ "f90"=>"text/x-fortran",
234
+ "fbs"=>"image/vnd.fastbidsheet",
235
+ "fcdt"=>"application/vnd.adobe.formscentral.fcdt",
236
+ "fcs"=>"application/vnd.isac.fcs",
237
+ "fdf"=>"application/vnd.fdf",
238
+ "fe_launch"=>"application/vnd.denovo.fcselayout-link",
239
+ "fg5"=>"application/vnd.fujitsu.oasysgp",
240
+ "fgd"=>"application/x-director",
241
+ "fh"=>"image/x-freehand",
242
+ "fh4"=>"image/x-freehand",
243
+ "fh5"=>"image/x-freehand",
244
+ "fh7"=>"image/x-freehand",
245
+ "fhc"=>"image/x-freehand",
246
+ "fig"=>"application/x-xfig",
247
+ "flac"=>"audio/x-flac",
248
+ "fli"=>"video/x-fli",
249
+ "flo"=>"application/vnd.micrografx.flo",
250
+ "flv"=>"video/x-flv",
251
+ "flw"=>"application/vnd.kde.kivio",
252
+ "flx"=>"text/vnd.fmi.flexstor",
253
+ "fly"=>"text/vnd.fly",
254
+ "fm"=>"application/vnd.framemaker",
255
+ "fnc"=>"application/vnd.frogans.fnc",
256
+ "for"=>"text/x-fortran",
257
+ "fpx"=>"image/vnd.fpx",
258
+ "frame"=>"application/vnd.framemaker",
259
+ "fsc"=>"application/vnd.fsc.weblaunch",
260
+ "fst"=>"image/vnd.fst",
261
+ "ftc"=>"application/vnd.fluxtime.clip",
262
+ "fti"=>"application/vnd.anser-web-funds-transfer-initiation",
263
+ "fvt"=>"video/vnd.fvt",
264
+ "fxp"=>"application/vnd.adobe.fxp",
265
+ "fxpl"=>"application/vnd.adobe.fxp",
266
+ "fzs"=>"application/vnd.fuzzysheet",
267
+ "g2w"=>"application/vnd.geoplan",
268
+ "g3"=>"image/g3fax",
269
+ "g3w"=>"application/vnd.geospace",
270
+ "gac"=>"application/vnd.groove-account",
271
+ "gam"=>"application/x-tads",
272
+ "gbr"=>"application/rpki-ghostbusters",
273
+ "gca"=>"application/x-gca-compressed",
274
+ "gdl"=>"model/vnd.gdl",
275
+ "geo"=>"application/vnd.dynageo",
276
+ "gex"=>"application/vnd.geometry-explorer",
277
+ "ggb"=>"application/vnd.geogebra.file",
278
+ "ggt"=>"application/vnd.geogebra.tool",
279
+ "ghf"=>"application/vnd.groove-help",
280
+ "gif"=>"image/gif",
281
+ "gim"=>"application/vnd.groove-identity-message",
282
+ "gml"=>"application/gml+xml",
283
+ "gmx"=>"application/vnd.gmx",
284
+ "gnumeric"=>"application/x-gnumeric",
285
+ "gph"=>"application/vnd.flographit",
286
+ "gpx"=>"application/gpx+xml",
287
+ "gqf"=>"application/vnd.grafeq",
288
+ "gqs"=>"application/vnd.grafeq",
289
+ "gram"=>"application/srgs",
290
+ "gramps"=>"application/x-gramps-xml",
291
+ "gre"=>"application/vnd.geometry-explorer",
292
+ "grv"=>"application/vnd.groove-injector",
293
+ "grxml"=>"application/srgs+xml",
294
+ "gsf"=>"application/x-font-ghostscript",
295
+ "gtar"=>"application/x-gtar",
296
+ "gtm"=>"application/vnd.groove-tool-message",
297
+ "gtw"=>"model/vnd.gtw",
298
+ "gv"=>"text/vnd.graphviz",
299
+ "gxf"=>"application/gxf",
300
+ "gxt"=>"application/vnd.geonext",
301
+ "h"=>"text/x-c",
302
+ "h261"=>"video/h261",
303
+ "h263"=>"video/h263",
304
+ "h264"=>"video/h264",
305
+ "hal"=>"application/vnd.hal+xml",
306
+ "hbci"=>"application/vnd.hbci",
307
+ "hdf"=>"application/x-hdf",
308
+ "hh"=>"text/x-c",
309
+ "hlp"=>"application/winhlp",
310
+ "hpgl"=>"application/vnd.hp-hpgl",
311
+ "hpid"=>"application/vnd.hp-hpid",
312
+ "hps"=>"application/vnd.hp-hps",
313
+ "hqx"=>"application/mac-binhex40",
314
+ "htke"=>"application/vnd.kenameaapp",
315
+ "htm"=>"text/html",
316
+ "html"=>"text/html",
317
+ "hvd"=>"application/vnd.yamaha.hv-dic",
318
+ "hvp"=>"application/vnd.yamaha.hv-voice",
319
+ "hvs"=>"application/vnd.yamaha.hv-script",
320
+ "i2g"=>"application/vnd.intergeo",
321
+ "icc"=>"application/vnd.iccprofile",
322
+ "ice"=>"x-conference/x-cooltalk",
323
+ "icm"=>"application/vnd.iccprofile",
324
+ "ico"=>"image/x-icon",
325
+ "ics"=>"text/calendar",
326
+ "ief"=>"image/ief",
327
+ "ifb"=>"text/calendar",
328
+ "ifm"=>"application/vnd.shana.informed.formdata",
329
+ "iges"=>"model/iges",
330
+ "igl"=>"application/vnd.igloader",
331
+ "igm"=>"application/vnd.insors.igm",
332
+ "igs"=>"model/iges",
333
+ "igx"=>"application/vnd.micrografx.igx",
334
+ "iif"=>"application/vnd.shana.informed.interchange",
335
+ "imp"=>"application/vnd.accpac.simply.imp",
336
+ "ims"=>"application/vnd.ms-ims",
337
+ "in"=>"text/plain",
338
+ "ink"=>"application/inkml+xml",
339
+ "inkml"=>"application/inkml+xml",
340
+ "install"=>"application/x-install-instructions",
341
+ "iota"=>"application/vnd.astraea-software.iota",
342
+ "ipfix"=>"application/ipfix",
343
+ "ipk"=>"application/vnd.shana.informed.package",
344
+ "irm"=>"application/vnd.ibm.rights-management",
345
+ "irp"=>"application/vnd.irepository.package+xml",
346
+ "iso"=>"application/x-iso9660-image",
347
+ "itp"=>"application/vnd.shana.informed.formtemplate",
348
+ "ivp"=>"application/vnd.immervision-ivp",
349
+ "ivu"=>"application/vnd.immervision-ivu",
350
+ "jad"=>"text/vnd.sun.j2me.app-descriptor",
351
+ "jam"=>"application/vnd.jam",
352
+ "jar"=>"application/java-archive",
353
+ "java"=>"text/x-java-source",
354
+ "jisp"=>"application/vnd.jisp",
355
+ "jlt"=>"application/vnd.hp-jlyt",
356
+ "jnlp"=>"application/x-java-jnlp-file",
357
+ "joda"=>"application/vnd.joost.joda-archive",
358
+ "jp2"=>"image/jp2",
359
+ "jpe"=>"image/jpeg",
360
+ "jpeg"=>"image/jpeg",
361
+ "jpg"=>"image/jpeg",
362
+ "jpgm"=>"video/jpm",
363
+ "jpgv"=>"video/jpeg",
364
+ "jpm"=>"video/jpm",
365
+ "js"=>"application/javascript",
366
+ "json"=>"application/json",
367
+ "jsonml"=>"application/jsonml+json",
368
+ "kar"=>"audio/midi",
369
+ "karbon"=>"application/vnd.kde.karbon",
370
+ "kfo"=>"application/vnd.kde.kformula",
371
+ "kia"=>"application/vnd.kidspiration",
372
+ "kml"=>"application/vnd.google-earth.kml+xml",
373
+ "kmz"=>"application/vnd.google-earth.kmz",
374
+ "kne"=>"application/vnd.kinar",
375
+ "knp"=>"application/vnd.kinar",
376
+ "kon"=>"application/vnd.kde.kontour",
377
+ "kpr"=>"application/vnd.kde.kpresenter",
378
+ "kpt"=>"application/vnd.kde.kpresenter",
379
+ "kpxx"=>"application/vnd.ds-keypoint",
380
+ "ksp"=>"application/vnd.kde.kspread",
381
+ "ktr"=>"application/vnd.kahootz",
382
+ "ktx"=>"image/ktx",
383
+ "ktz"=>"application/vnd.kahootz",
384
+ "kwd"=>"application/vnd.kde.kword",
385
+ "kwt"=>"application/vnd.kde.kword",
386
+ "lasxml"=>"application/vnd.las.las+xml",
387
+ "latex"=>"application/x-latex",
388
+ "lbd"=>"application/vnd.llamagraphics.life-balance.desktop",
389
+ "lbe"=>"application/vnd.llamagraphics.life-balance.exchange+xml",
390
+ "les"=>"application/vnd.hhe.lesson-player",
391
+ "lha"=>"application/octet-stream",
392
+ "link66"=>"application/vnd.route66.link66+xml",
393
+ "list"=>"text/plain",
394
+ "list3820"=>"application/vnd.ibm.modcap",
395
+ "listafp"=>"application/vnd.ibm.modcap",
396
+ "lnk"=>"application/x-ms-shortcut",
397
+ "log"=>"text/plain",
398
+ "lostxml"=>"application/lost+xml",
399
+ "lrf"=>"application/octet-stream",
400
+ "lrm"=>"application/vnd.ms-lrm",
401
+ "ltf"=>"application/vnd.frogans.ltf",
402
+ "lvp"=>"audio/vnd.lucent.voice",
403
+ "lwp"=>"application/vnd.lotus-wordpro",
404
+ "lzh"=>"application/octet-stream",
405
+ "m13"=>"application/x-msmediaview",
406
+ "m14"=>"application/x-msmediaview",
407
+ "m1v"=>"video/mpeg",
408
+ "m21"=>"application/mp21",
409
+ "m2a"=>"audio/mpeg",
410
+ "m2v"=>"video/mpeg",
411
+ "m3a"=>"audio/mpeg",
412
+ "m3u"=>"audio/x-mpegurl",
413
+ "m3u8"=>"application/vnd.apple.mpegurl",
414
+ "m4a"=>"audio/mp4a-latm",
415
+ "m4b"=>"audio/mp4a-latm",
416
+ "m4p"=>"audio/mp4a-latm",
417
+ "m4u"=>"video/vnd.mpegurl",
418
+ "m4v"=>"video/x-m4v",
419
+ "ma"=>"application/mathematica",
420
+ "mac"=>"image/x-macpaint",
421
+ "mads"=>"application/mads+xml",
422
+ "mag"=>"application/vnd.ecowin.chart",
423
+ "maker"=>"application/vnd.framemaker",
424
+ "man"=>"application/x-troff-man",
425
+ "mar"=>"application/octet-stream",
426
+ "mathml"=>"application/mathml+xml",
427
+ "mb"=>"application/mathematica",
428
+ "mbk"=>"application/vnd.mobius.mbk",
429
+ "mbox"=>"application/mbox",
430
+ "mc1"=>"application/vnd.medcalcdata",
431
+ "mcd"=>"application/vnd.mcd",
432
+ "mcurl"=>"text/vnd.curl.mcurl",
433
+ "mdb"=>"application/x-msaccess",
434
+ "mdi"=>"image/vnd.ms-modi",
435
+ "me"=>"text/troff",
436
+ "mesh"=>"model/mesh",
437
+ "meta4"=>"application/metalink4+xml",
438
+ "metalink"=>"application/metalink+xml",
439
+ "mets"=>"application/mets+xml",
440
+ "mfm"=>"application/vnd.mfmp",
441
+ "mft"=>"application/rpki-manifest",
442
+ "mgp"=>"application/vnd.osgeo.mapguide.package",
443
+ "mgz"=>"application/vnd.proteus.magazine",
444
+ "mid"=>"audio/midi",
445
+ "midi"=>"audio/midi",
446
+ "mie"=>"application/x-mie",
447
+ "mif"=>"application/vnd.mif",
448
+ "mime"=>"message/rfc822",
449
+ "mj2"=>"video/mj2",
450
+ "mjp2"=>"video/mj2",
451
+ "mk3d"=>"video/x-matroska",
452
+ "mka"=>"audio/x-matroska",
453
+ "mks"=>"video/x-matroska",
454
+ "mkv"=>"video/x-matroska",
455
+ "mlp"=>"application/vnd.dolby.mlp",
456
+ "mmd"=>"application/vnd.chipnuts.karaoke-mmd",
457
+ "mmf"=>"application/vnd.smaf",
458
+ "mmr"=>"image/vnd.fujixerox.edmics-mmr",
459
+ "mng"=>"video/x-mng",
460
+ "mny"=>"application/x-msmoney",
461
+ "mobi"=>"application/x-mobipocket-ebook",
462
+ "mods"=>"application/mods+xml",
463
+ "mov"=>"video/quicktime",
464
+ "movie"=>"video/x-sgi-movie",
465
+ "mp2"=>"audio/mpeg",
466
+ "mp21"=>"application/mp21",
467
+ "mp2a"=>"audio/mpeg",
468
+ "mp3"=>"audio/mpeg",
469
+ "mp4"=>"video/mp4",
470
+ "mp4a"=>"audio/mp4",
471
+ "mp4s"=>"application/mp4",
472
+ "mp4v"=>"video/mp4",
473
+ "mpc"=>"application/vnd.mophun.certificate",
474
+ "mpe"=>"video/mpeg",
475
+ "mpeg"=>"video/mpeg",
476
+ "mpg"=>"video/mpeg",
477
+ "mpg4"=>"video/mp4",
478
+ "mpga"=>"audio/mpeg",
479
+ "mpkg"=>"application/vnd.apple.installer+xml",
480
+ "mpm"=>"application/vnd.blueice.multipass",
481
+ "mpn"=>"application/vnd.mophun.application",
482
+ "mpp"=>"application/vnd.ms-project",
483
+ "mpt"=>"application/vnd.ms-project",
484
+ "mpy"=>"application/vnd.ibm.minipay",
485
+ "mqy"=>"application/vnd.mobius.mqy",
486
+ "mrc"=>"application/marc",
487
+ "mrcx"=>"application/marcxml+xml",
488
+ "ms"=>"application/x-troff-ms",
489
+ "mscml"=>"application/mediaservercontrol+xml",
490
+ "mseed"=>"application/vnd.fdsn.mseed",
491
+ "mseq"=>"application/vnd.mseq",
492
+ "msf"=>"application/vnd.epson.msf",
493
+ "msh"=>"model/mesh",
494
+ "msi"=>"application/x-msdownload",
495
+ "msl"=>"application/vnd.mobius.msl",
496
+ "msty"=>"application/vnd.muvee.style",
497
+ "mts"=>"model/vnd.mts",
498
+ "mus"=>"application/vnd.musician",
499
+ "musicxml"=>"application/vnd.recordare.musicxml+xml",
500
+ "mvb"=>"application/x-msmediaview",
501
+ "mwf"=>"application/vnd.mfer",
502
+ "mxf"=>"application/mxf",
503
+ "mxl"=>"application/vnd.recordare.musicxml",
504
+ "mxml"=>"application/xv+xml",
505
+ "mxs"=>"application/vnd.triscape.mxs",
506
+ "mxu"=>"video/vnd.mpegurl",
507
+ "n-gage"=>"application/vnd.nokia.n-gage.symbian.install",
508
+ "n3"=>"text/n3",
509
+ "nb"=>"application/mathematica",
510
+ "nbp"=>"application/vnd.wolfram.player",
511
+ "nc"=>"application/x-netcdf",
512
+ "ncx"=>"application/x-dtbncx+xml",
513
+ "nfo"=>"text/x-nfo",
514
+ "ngdat"=>"application/vnd.nokia.n-gage.data",
515
+ "nitf"=>"application/vnd.nitf",
516
+ "nlu"=>"application/vnd.neurolanguage.nlu",
517
+ "nml"=>"application/vnd.enliven",
518
+ "nnd"=>"application/vnd.noblenet-directory",
519
+ "nns"=>"application/vnd.noblenet-sealer",
520
+ "nnw"=>"application/vnd.noblenet-web",
521
+ "npx"=>"image/vnd.net-fpx",
522
+ "nsc"=>"application/x-conference",
523
+ "nsf"=>"application/vnd.lotus-notes",
524
+ "ntf"=>"application/vnd.nitf",
525
+ "nzb"=>"application/x-nzb",
526
+ "oa2"=>"application/vnd.fujitsu.oasys2",
527
+ "oa3"=>"application/vnd.fujitsu.oasys3",
528
+ "oas"=>"application/vnd.fujitsu.oasys",
529
+ "obd"=>"application/x-msbinder",
530
+ "obj"=>"application/x-tgif",
531
+ "oda"=>"application/oda",
532
+ "odb"=>"application/vnd.oasis.opendocument.database",
533
+ "odc"=>"application/vnd.oasis.opendocument.chart",
534
+ "odf"=>"application/vnd.oasis.opendocument.formula",
535
+ "odft"=>"application/vnd.oasis.opendocument.formula-template",
536
+ "odg"=>"application/vnd.oasis.opendocument.graphics",
537
+ "odi"=>"application/vnd.oasis.opendocument.image",
538
+ "odm"=>"application/vnd.oasis.opendocument.text-master",
539
+ "odp"=>"application/vnd.oasis.opendocument.presentation",
540
+ "ods"=>"application/vnd.oasis.opendocument.spreadsheet",
541
+ "odt"=>"application/vnd.oasis.opendocument.text",
542
+ "oga"=>"audio/ogg",
543
+ "ogg"=>"audio/ogg",
544
+ "ogv"=>"video/ogg",
545
+ "ogx"=>"application/ogg",
546
+ "omdoc"=>"application/omdoc+xml",
547
+ "onepkg"=>"application/onenote",
548
+ "onetmp"=>"application/onenote",
549
+ "onetoc"=>"application/onenote",
550
+ "onetoc2"=>"application/onenote",
551
+ "opf"=>"application/oebps-package+xml",
552
+ "opml"=>"text/x-opml",
553
+ "oprc"=>"application/vnd.palm",
554
+ "org"=>"application/vnd.lotus-organizer",
555
+ "osf"=>"application/vnd.yamaha.openscoreformat",
556
+ "osfpvg"=>"application/vnd.yamaha.openscoreformat.osfpvg+xml",
557
+ "otc"=>"application/vnd.oasis.opendocument.chart-template",
558
+ "otf"=>"application/x-font-otf",
559
+ "otg"=>"application/vnd.oasis.opendocument.graphics-template",
560
+ "oth"=>"application/vnd.oasis.opendocument.text-web",
561
+ "oti"=>"application/vnd.oasis.opendocument.image-template",
562
+ "otp"=>"application/vnd.oasis.opendocument.presentation-template",
563
+ "ots"=>"application/vnd.oasis.opendocument.spreadsheet-template",
564
+ "ott"=>"application/vnd.oasis.opendocument.text-template",
565
+ "oxps"=>"application/oxps",
566
+ "oxt"=>"application/vnd.openofficeorg.extension",
567
+ "p"=>"text/x-pascal",
568
+ "p10"=>"application/pkcs10",
569
+ "p12"=>"application/x-pkcs12",
570
+ "p7b"=>"application/x-pkcs7-certificates",
571
+ "p7c"=>"application/pkcs7-mime",
572
+ "p7m"=>"application/pkcs7-mime",
573
+ "p7r"=>"application/x-pkcs7-certreqresp",
574
+ "p7s"=>"application/pkcs7-signature",
575
+ "p8"=>"application/pkcs8",
576
+ "pas"=>"text/x-pascal",
577
+ "paw"=>"application/vnd.pawaafile",
578
+ "pbd"=>"application/vnd.powerbuilder6",
579
+ "pbm"=>"image/x-portable-bitmap",
580
+ "pcap"=>"application/vnd.tcpdump.pcap",
581
+ "pcf"=>"application/x-font-pcf",
582
+ "pcl"=>"application/vnd.hp-pcl",
583
+ "pclxl"=>"application/vnd.hp-pclxl",
584
+ "pct"=>"image/x-pict",
585
+ "pcurl"=>"application/vnd.curl.pcurl",
586
+ "pcx"=>"image/x-pcx",
587
+ "pdb"=>"application/vnd.palm",
588
+ "pdf"=>"application/pdf",
589
+ "pfa"=>"application/x-font-type1",
590
+ "pfb"=>"application/x-font-type1",
591
+ "pfm"=>"application/x-font-type1",
592
+ "pfr"=>"application/font-tdpfr",
593
+ "pfx"=>"application/x-pkcs12",
594
+ "pgm"=>"image/x-portable-graymap",
595
+ "pgn"=>"application/x-chess-pgn",
596
+ "pgp"=>"application/pgp-encrypted",
597
+ "pic"=>"image/pict",
598
+ "pict"=>"image/pict",
599
+ "pkg"=>"application/octet-stream",
600
+ "pki"=>"application/pkixcmp",
601
+ "pkipath"=>"application/pkix-pkipath",
602
+ "plb"=>"application/vnd.3gpp.pic-bw-large",
603
+ "plc"=>"application/vnd.mobius.plc",
604
+ "plf"=>"application/vnd.pocketlearn",
605
+ "pls"=>"application/pls+xml",
606
+ "pml"=>"application/vnd.ctc-posml",
607
+ "png"=>"image/png",
608
+ "pnm"=>"image/x-portable-anymap",
609
+ "pnt"=>"image/x-macpaint",
610
+ "pntg"=>"image/x-macpaint",
611
+ "portpkg"=>"application/vnd.macports.portpkg",
612
+ "pot"=>"application/vnd.ms-powerpoint",
613
+ "potm"=>"application/vnd.ms-powerpoint.template.macroenabled.12",
614
+ "potx"=>"application/vnd.openxmlformats-officedocument.presentationml.template",
615
+ "ppam"=>"application/vnd.ms-powerpoint.addin.macroenabled.12",
616
+ "ppd"=>"application/vnd.cups-ppd",
617
+ "ppm"=>"image/x-portable-pixmap",
618
+ "pps"=>"application/vnd.ms-powerpoint",
619
+ "ppsm"=>"application/vnd.ms-powerpoint.slideshow.macroenabled.12",
620
+ "ppsx"=>"application/vnd.openxmlformats-officedocument.presentationml.slideshow",
621
+ "ppt"=>"application/vnd.ms-powerpoint",
622
+ "pptm"=>"application/vnd.ms-powerpoint.presentation.macroenabled.12",
623
+ "pptx"=>"application/vnd.openxmlformats-officedocument.presentationml.presentation",
624
+ "pqa"=>"application/vnd.palm",
625
+ "prc"=>"application/x-mobipocket-ebook",
626
+ "pre"=>"application/vnd.lotus-freelance",
627
+ "prf"=>"application/pics-rules",
628
+ "ps"=>"application/postscript",
629
+ "psb"=>"application/vnd.3gpp.pic-bw-small",
630
+ "psd"=>"image/vnd.adobe.photoshop",
631
+ "psf"=>"application/x-font-linux-psf",
632
+ "pskcxml"=>"application/pskc+xml",
633
+ "ptid"=>"application/vnd.pvi.ptid1",
634
+ "pub"=>"application/x-mspublisher",
635
+ "pvb"=>"application/vnd.3gpp.pic-bw-var",
636
+ "pwn"=>"application/vnd.3m.post-it-notes",
637
+ "pya"=>"audio/vnd.ms-playready.media.pya",
638
+ "pyv"=>"video/vnd.ms-playready.media.pyv",
639
+ "qam"=>"application/vnd.epson.quickanime",
640
+ "qbo"=>"application/vnd.intu.qbo",
641
+ "qfx"=>"application/vnd.intu.qfx",
642
+ "qps"=>"application/vnd.publishare-delta-tree",
643
+ "qt"=>"video/quicktime",
644
+ "qti"=>"image/x-quicktime",
645
+ "qtif"=>"image/x-quicktime",
646
+ "qwd"=>"application/vnd.quark.quarkxpress",
647
+ "qwt"=>"application/vnd.quark.quarkxpress",
648
+ "qxb"=>"application/vnd.quark.quarkxpress",
649
+ "qxd"=>"application/vnd.quark.quarkxpress",
650
+ "qxl"=>"application/vnd.quark.quarkxpress",
651
+ "qxt"=>"application/vnd.quark.quarkxpress",
652
+ "ra"=>"audio/x-pn-realaudio",
653
+ "ram"=>"audio/x-pn-realaudio",
654
+ "rar"=>"application/x-rar-compressed",
655
+ "ras"=>"image/x-cmu-raster",
656
+ "rcprofile"=>"application/vnd.ipunplugged.rcprofile",
657
+ "rdf"=>"application/rdf+xml",
658
+ "rdz"=>"application/vnd.data-vision.rdz",
659
+ "rep"=>"application/vnd.businessobjects",
660
+ "res"=>"application/x-dtbresource+xml",
661
+ "rgb"=>"image/x-rgb",
662
+ "rif"=>"application/reginfo+xml",
663
+ "rip"=>"audio/vnd.rip",
664
+ "ris"=>"application/x-research-info-systems",
665
+ "rl"=>"application/resource-lists+xml",
666
+ "rlc"=>"image/vnd.fujixerox.edmics-rlc",
667
+ "rld"=>"application/resource-lists-diff+xml",
668
+ "rm"=>"application/vnd.rn-realmedia",
669
+ "rmi"=>"audio/midi",
670
+ "rmp"=>"audio/x-pn-realaudio-plugin",
671
+ "rms"=>"application/vnd.jcp.javame.midlet-rms",
672
+ "rmvb"=>"application/vnd.rn-realmedia-vbr",
673
+ "rnc"=>"application/relax-ng-compact-syntax",
674
+ "roa"=>"application/rpki-roa",
675
+ "roff"=>"application/x-troff",
676
+ "rp9"=>"application/vnd.cloanto.rp9",
677
+ "rpss"=>"application/vnd.nokia.radio-presets",
678
+ "rpst"=>"application/vnd.nokia.radio-preset",
679
+ "rq"=>"application/sparql-query",
680
+ "rs"=>"application/rls-services+xml",
681
+ "rsd"=>"application/rsd+xml",
682
+ "rss"=>"application/rss+xml",
683
+ "rtf"=>"application/rtf",
684
+ "rtx"=>"text/richtext",
685
+ "s"=>"text/x-asm",
686
+ "s3m"=>"audio/s3m",
687
+ "saf"=>"application/vnd.yamaha.smaf-audio",
688
+ "sbml"=>"application/sbml+xml",
689
+ "sc"=>"application/vnd.ibm.secure-container",
690
+ "scd"=>"application/x-msschedule",
691
+ "scm"=>"application/vnd.lotus-screencam",
692
+ "scq"=>"application/scvp-cv-request",
693
+ "scs"=>"application/scvp-cv-response",
694
+ "scurl"=>"text/vnd.curl.scurl",
695
+ "sda"=>"application/vnd.stardivision.draw",
696
+ "sdc"=>"application/vnd.stardivision.calc",
697
+ "sdd"=>"application/vnd.stardivision.impress",
698
+ "sdkd"=>"application/vnd.solent.sdkm+xml",
699
+ "sdkm"=>"application/vnd.solent.sdkm+xml",
700
+ "sdp"=>"application/sdp",
701
+ "sdw"=>"application/vnd.stardivision.writer",
702
+ "see"=>"application/vnd.seemail",
703
+ "seed"=>"application/vnd.fdsn.seed",
704
+ "sema"=>"application/vnd.sema",
705
+ "semd"=>"application/vnd.semd",
706
+ "semf"=>"application/vnd.semf",
707
+ "ser"=>"application/java-serialized-object",
708
+ "setpay"=>"application/set-payment-initiation",
709
+ "setreg"=>"application/set-registration-initiation",
710
+ "sfd-hdstx"=>"application/vnd.hydrostatix.sof-data",
711
+ "sfs"=>"application/vnd.spotfire.sfs",
712
+ "sfv"=>"text/x-sfv",
713
+ "sgi"=>"image/sgi",
714
+ "sgl"=>"application/vnd.stardivision.writer-global",
715
+ "sgm"=>"text/sgml",
716
+ "sgml"=>"text/sgml",
717
+ "sh"=>"application/x-sh",
718
+ "shar"=>"application/x-shar",
719
+ "shf"=>"application/shf+xml",
720
+ "sid"=>"image/x-mrsid-image",
721
+ "sig"=>"application/pgp-signature",
722
+ "sil"=>"audio/silk",
723
+ "silo"=>"model/mesh",
724
+ "sis"=>"application/vnd.symbian.install",
725
+ "sisx"=>"application/vnd.symbian.install",
726
+ "sit"=>"application/x-stuffit",
727
+ "sitx"=>"application/x-stuffitx",
728
+ "skd"=>"application/x-koan",
729
+ "skm"=>"application/vnd.koan",
730
+ "skp"=>"application/x-koan",
731
+ "skt"=>"application/vnd.koan",
732
+ "sldm"=>"application/vnd.ms-powerpoint.slide.macroenabled.12",
733
+ "sldx"=>"application/vnd.openxmlformats-officedocument.presentationml.slide",
734
+ "slt"=>"application/vnd.epson.salt",
735
+ "sm"=>"application/vnd.stepmania.stepchart",
736
+ "smf"=>"application/vnd.stardivision.math",
737
+ "smi"=>"application/smil",
738
+ "smil"=>"application/smil+xml",
739
+ "smv"=>"video/x-smv",
740
+ "smzip"=>"application/vnd.stepmania.package",
741
+ "snd"=>"audio/basic",
742
+ "snf"=>"application/x-font-snf",
743
+ "so"=>"application/octet-stream",
744
+ "spc"=>"application/x-pkcs7-certificates",
745
+ "spf"=>"application/vnd.yamaha.smaf-phrase",
746
+ "spl"=>"application/x-futuresplash",
747
+ "spot"=>"text/vnd.in3d.spot",
748
+ "spp"=>"application/scvp-vp-response",
749
+ "spq"=>"application/scvp-vp-request",
750
+ "spx"=>"audio/ogg",
751
+ "sql"=>"application/x-sql",
752
+ "src"=>"application/x-wais-source",
753
+ "srt"=>"application/x-subrip",
754
+ "sru"=>"application/sru+xml",
755
+ "srx"=>"application/sparql-results+xml",
756
+ "ssdl"=>"application/ssdl+xml",
757
+ "sse"=>"application/vnd.kodak-descriptor",
758
+ "ssf"=>"application/vnd.epson.ssf",
759
+ "ssml"=>"application/ssml+xml",
760
+ "st"=>"application/vnd.sailingtracker.track",
761
+ "stc"=>"application/vnd.sun.xml.calc.template",
762
+ "std"=>"application/vnd.sun.xml.draw.template",
763
+ "stf"=>"application/vnd.wt.stf",
764
+ "sti"=>"application/vnd.sun.xml.impress.template",
765
+ "stk"=>"application/hyperstudio",
766
+ "stl"=>"application/vnd.ms-pki.stl",
767
+ "str"=>"application/vnd.pg.format",
768
+ "stw"=>"application/vnd.sun.xml.writer.template",
769
+ "sub"=>"text/vnd.dvb.subtitle",
770
+ "sus"=>"application/vnd.sus-calendar",
771
+ "susp"=>"application/vnd.sus-calendar",
772
+ "sv4cpio"=>"application/x-sv4cpio",
773
+ "sv4crc"=>"application/x-sv4crc",
774
+ "svc"=>"application/vnd.dvb.service",
775
+ "svd"=>"application/vnd.svd",
776
+ "svg"=>"image/svg+xml",
777
+ "svgz"=>"image/svg+xml",
778
+ "swf"=>"application/x-shockwave-flash",
779
+ "swi"=>"application/vnd.aristanetworks.swi",
780
+ "sxc"=>"application/vnd.sun.xml.calc",
781
+ "sxd"=>"application/vnd.sun.xml.draw",
782
+ "sxg"=>"application/vnd.sun.xml.writer.global",
783
+ "sxi"=>"application/vnd.sun.xml.impress",
784
+ "sxm"=>"application/vnd.sun.xml.math",
785
+ "sxw"=>"application/vnd.sun.xml.writer",
786
+ "t"=>"text/troff",
787
+ "t3"=>"application/x-t3vm-image",
788
+ "taglet"=>"application/vnd.mynfc",
789
+ "tao"=>"application/vnd.tao.intent-module-archive",
790
+ "tar"=>"application/x-tar",
791
+ "tcap"=>"application/vnd.3gpp2.tcap",
792
+ "tcl"=>"application/x-tcl",
793
+ "teacher"=>"application/vnd.smart.teacher",
794
+ "tei"=>"application/tei+xml",
795
+ "teicorpus"=>"application/tei+xml",
796
+ "tex"=>"application/x-tex",
797
+ "texi"=>"application/x-texinfo",
798
+ "texinfo"=>"application/x-texinfo",
799
+ "text"=>"text/plain",
800
+ "tfi"=>"application/thraud+xml",
801
+ "tfm"=>"application/x-tex-tfm",
802
+ "tga"=>"image/x-tga",
803
+ "thmx"=>"application/vnd.ms-officetheme",
804
+ "tif"=>"image/tiff",
805
+ "tiff"=>"image/tiff",
806
+ "tmo"=>"application/vnd.tmobile-livetv",
807
+ "torrent"=>"application/x-bittorrent",
808
+ "tpl"=>"application/vnd.groove-tool-template",
809
+ "tpt"=>"application/vnd.trid.tpt",
810
+ "tr"=>"text/troff",
811
+ "tra"=>"application/vnd.trueapp",
812
+ "trm"=>"application/x-msterminal",
813
+ "tsd"=>"application/timestamped-data",
814
+ "tsv"=>"text/tab-separated-values",
815
+ "ttc"=>"application/x-font-ttf",
816
+ "ttf"=>"application/x-font-ttf",
817
+ "ttl"=>"text/turtle",
818
+ "twd"=>"application/vnd.simtech-mindmapper",
819
+ "twds"=>"application/vnd.simtech-mindmapper",
820
+ "txd"=>"application/vnd.genomatix.tuxedo",
821
+ "txf"=>"application/vnd.mobius.txf",
822
+ "txt"=>"text/plain",
823
+ "u32"=>"application/x-authorware-bin",
824
+ "udeb"=>"application/x-debian-package",
825
+ "ufd"=>"application/vnd.ufdl",
826
+ "ufdl"=>"application/vnd.ufdl",
827
+ "ulx"=>"application/x-glulx",
828
+ "umj"=>"application/vnd.umajin",
829
+ "unityweb"=>"application/vnd.unity",
830
+ "uoml"=>"application/vnd.uoml+xml",
831
+ "uri"=>"text/uri-list",
832
+ "uris"=>"text/uri-list",
833
+ "urls"=>"text/uri-list",
834
+ "ustar"=>"application/x-ustar",
835
+ "utz"=>"application/vnd.uiq.theme",
836
+ "uu"=>"text/x-uuencode",
837
+ "uva"=>"audio/vnd.dece.audio",
838
+ "uvd"=>"application/vnd.dece.data",
839
+ "uvf"=>"application/vnd.dece.data",
840
+ "uvg"=>"image/vnd.dece.graphic",
841
+ "uvh"=>"video/vnd.dece.hd",
842
+ "uvi"=>"image/vnd.dece.graphic",
843
+ "uvm"=>"video/vnd.dece.mobile",
844
+ "uvp"=>"video/vnd.dece.pd",
845
+ "uvs"=>"video/vnd.dece.sd",
846
+ "uvt"=>"application/vnd.dece.ttml+xml",
847
+ "uvu"=>"video/vnd.uvvu.mp4",
848
+ "uvv"=>"video/vnd.dece.video",
849
+ "uvva"=>"audio/vnd.dece.audio",
850
+ "uvvd"=>"application/vnd.dece.data",
851
+ "uvvf"=>"application/vnd.dece.data",
852
+ "uvvg"=>"image/vnd.dece.graphic",
853
+ "uvvh"=>"video/vnd.dece.hd",
854
+ "uvvi"=>"image/vnd.dece.graphic",
855
+ "uvvm"=>"video/vnd.dece.mobile",
856
+ "uvvp"=>"video/vnd.dece.pd",
857
+ "uvvs"=>"video/vnd.dece.sd",
858
+ "uvvt"=>"application/vnd.dece.ttml+xml",
859
+ "uvvu"=>"video/vnd.uvvu.mp4",
860
+ "uvvv"=>"video/vnd.dece.video",
861
+ "uvvx"=>"application/vnd.dece.unspecified",
862
+ "uvvz"=>"application/vnd.dece.zip",
863
+ "uvx"=>"application/vnd.dece.unspecified",
864
+ "uvz"=>"application/vnd.dece.zip",
865
+ "vcard"=>"text/vcard",
866
+ "vcd"=>"application/x-cdlink",
867
+ "vcf"=>"text/x-vcard",
868
+ "vcg"=>"application/vnd.groove-vcard",
869
+ "vcs"=>"text/x-vcalendar",
870
+ "vcx"=>"application/vnd.vcx",
871
+ "vis"=>"application/vnd.visionary",
872
+ "viv"=>"video/vnd.vivo",
873
+ "vob"=>"video/x-ms-vob",
874
+ "vor"=>"application/vnd.stardivision.writer",
875
+ "vox"=>"application/x-authorware-bin",
876
+ "vrml"=>"model/vrml",
877
+ "vsd"=>"application/vnd.visio",
878
+ "vsf"=>"application/vnd.vsf",
879
+ "vss"=>"application/vnd.visio",
880
+ "vst"=>"application/vnd.visio",
881
+ "vsw"=>"application/vnd.visio",
882
+ "vtu"=>"model/vnd.vtu",
883
+ "vxml"=>"application/voicexml+xml",
884
+ "w3d"=>"application/x-director",
885
+ "wad"=>"application/x-doom",
886
+ "wav"=>"audio/x-wav",
887
+ "wax"=>"audio/x-ms-wax",
888
+ "wbmp"=>"image/vnd.wap.wbmp",
889
+ "wbmxl"=>"application/vnd.wap.wbxml",
890
+ "wbs"=>"application/vnd.criticaltools.wbs+xml",
891
+ "wbxml"=>"application/vnd.wap.wbxml",
892
+ "wcm"=>"application/vnd.ms-works",
893
+ "wdb"=>"application/vnd.ms-works",
894
+ "wdp"=>"image/vnd.ms-photo",
895
+ "weba"=>"audio/webm",
896
+ "webm"=>"video/webm",
897
+ "webp"=>"image/webp",
898
+ "wg"=>"application/vnd.pmi.widget",
899
+ "wgt"=>"application/widget",
900
+ "wks"=>"application/vnd.ms-works",
901
+ "wm"=>"video/x-ms-wm",
902
+ "wma"=>"audio/x-ms-wma",
903
+ "wmd"=>"application/x-ms-wmd",
904
+ "wmf"=>"application/x-msmetafile",
905
+ "wml"=>"text/vnd.wap.wml",
906
+ "wmlc"=>"application/vnd.wap.wmlc",
907
+ "wmls"=>"text/vnd.wap.wmlscript",
908
+ "wmlsc"=>"application/vnd.wap.wmlscriptc",
909
+ "wmv"=>"video/x-ms-wmv",
910
+ "wmx"=>"video/x-ms-wmx",
911
+ "wmz"=>"application/x-ms-wmz",
912
+ "woff"=>"application/font-woff",
913
+ "wpd"=>"application/vnd.wordperfect",
914
+ "wpl"=>"application/vnd.ms-wpl",
915
+ "wps"=>"application/vnd.ms-works",
916
+ "wqd"=>"application/vnd.wqd",
917
+ "wri"=>"application/x-mswrite",
918
+ "wrl"=>"model/vrml",
919
+ "wsdl"=>"application/wsdl+xml",
920
+ "wspolicy"=>"application/wspolicy+xml",
921
+ "wtb"=>"application/vnd.webturbo",
922
+ "wvx"=>"video/x-ms-wvx",
923
+ "x32"=>"application/x-authorware-bin",
924
+ "x3d"=>"model/x3d+xml",
925
+ "x3db"=>"model/x3d+binary",
926
+ "x3dbz"=>"model/x3d+binary",
927
+ "x3dv"=>"model/x3d+vrml",
928
+ "x3dvz"=>"model/x3d+vrml",
929
+ "x3dz"=>"model/x3d+xml",
930
+ "xaml"=>"application/xaml+xml",
931
+ "xap"=>"application/x-silverlight-app",
932
+ "xar"=>"application/vnd.xara",
933
+ "xbap"=>"application/x-ms-xbap",
934
+ "xbd"=>"application/vnd.fujixerox.docuworks.binder",
935
+ "xbm"=>"image/x-xbitmap",
936
+ "xdf"=>"application/xcap-diff+xml",
937
+ "xdm"=>"application/vnd.syncml.dm+xml",
938
+ "xdp"=>"application/vnd.adobe.xdp+xml",
939
+ "xdssc"=>"application/dssc+xml",
940
+ "xdw"=>"application/vnd.fujixerox.docuworks",
941
+ "xenc"=>"application/xenc+xml",
942
+ "xer"=>"application/patch-ops-error+xml",
943
+ "xfdf"=>"application/vnd.adobe.xfdf",
944
+ "xfdl"=>"application/vnd.xfdl",
945
+ "xht"=>"application/xhtml+xml",
946
+ "xhtml"=>"application/xhtml+xml",
947
+ "xhvml"=>"application/xv+xml",
948
+ "xif"=>"image/vnd.xiff",
949
+ "xla"=>"application/vnd.ms-excel",
950
+ "xlam"=>"application/vnd.ms-excel.addin.macroenabled.12",
951
+ "xlc"=>"application/vnd.ms-excel",
952
+ "xlf"=>"application/x-xliff+xml",
953
+ "xlm"=>"application/vnd.ms-excel",
954
+ "xls"=>"application/vnd.ms-excel",
955
+ "xlsb"=>"application/vnd.ms-excel.sheet.binary.macroenabled.12",
956
+ "xlsm"=>"application/vnd.ms-excel.sheet.macroenabled.12",
957
+ "xlsx"=>"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
958
+ "xlt"=>"application/vnd.ms-excel",
959
+ "xltm"=>"application/vnd.ms-excel.template.macroenabled.12",
960
+ "xltx"=>"application/vnd.openxmlformats-officedocument.spreadsheetml.template",
961
+ "xlw"=>"application/vnd.ms-excel",
962
+ "xm"=>"audio/xm",
963
+ "xml"=>"application/xml",
964
+ "xo"=>"application/vnd.olpc-sugar",
965
+ "xop"=>"application/xop+xml",
966
+ "xpi"=>"application/x-xpinstall",
967
+ "xpl"=>"application/xproc+xml",
968
+ "xpm"=>"image/x-xpixmap",
969
+ "xpr"=>"application/vnd.is-xpr",
970
+ "xps"=>"application/vnd.ms-xpsdocument",
971
+ "xpw"=>"application/vnd.intercon.formnet",
972
+ "xpx"=>"application/vnd.intercon.formnet",
973
+ "xsl"=>"application/xml",
974
+ "xslt"=>"application/xslt+xml",
975
+ "xsm"=>"application/vnd.syncml+xml",
976
+ "xspf"=>"application/xspf+xml",
977
+ "xul"=>"application/vnd.mozilla.xul+xml",
978
+ "xvm"=>"application/xv+xml",
979
+ "xvml"=>"application/xv+xml",
980
+ "xwd"=>"image/x-xwindowdump",
981
+ "xyz"=>"chemical/x-xyz",
982
+ "xz"=>"application/x-xz",
983
+ "yang"=>"application/yang",
984
+ "yin"=>"application/yin+xml",
985
+ "z1"=>"application/x-zmachine",
986
+ "z2"=>"application/x-zmachine",
987
+ "z3"=>"application/x-zmachine",
988
+ "z4"=>"application/x-zmachine",
989
+ "z5"=>"application/x-zmachine",
990
+ "z6"=>"application/x-zmachine",
991
+ "z7"=>"application/x-zmachine",
992
+ "z8"=>"application/x-zmachine",
993
+ "zaz"=>"application/vnd.zzazz.deck+xml",
994
+ "zip"=>"application/zip",
995
+ "zir"=>"application/vnd.zul",
996
+ "zirz"=>"application/vnd.zul",
997
+ "zmm"=>"application/vnd.handheld-entertainment+xml"}
998
+ end
999
+ end