Start moving to ytdl-org
[youtube-dl] / youtube_dl / compat.py
1 # coding: utf-8
2 from __future__ import unicode_literals
3
4 import base64
5 import binascii
6 import collections
7 import ctypes
8 import email
9 import getpass
10 import io
11 import itertools
12 import optparse
13 import os
14 import platform
15 import re
16 import shlex
17 import shutil
18 import socket
19 import struct
20 import subprocess
21 import sys
22 import xml.etree.ElementTree
23
24
25 try:
26     import urllib.request as compat_urllib_request
27 except ImportError:  # Python 2
28     import urllib2 as compat_urllib_request
29
30 try:
31     import urllib.error as compat_urllib_error
32 except ImportError:  # Python 2
33     import urllib2 as compat_urllib_error
34
35 try:
36     import urllib.parse as compat_urllib_parse
37 except ImportError:  # Python 2
38     import urllib as compat_urllib_parse
39
40 try:
41     from urllib.parse import urlparse as compat_urllib_parse_urlparse
42 except ImportError:  # Python 2
43     from urlparse import urlparse as compat_urllib_parse_urlparse
44
45 try:
46     import urllib.parse as compat_urlparse
47 except ImportError:  # Python 2
48     import urlparse as compat_urlparse
49
50 try:
51     import urllib.response as compat_urllib_response
52 except ImportError:  # Python 2
53     import urllib as compat_urllib_response
54
55 try:
56     import http.cookiejar as compat_cookiejar
57 except ImportError:  # Python 2
58     import cookielib as compat_cookiejar
59
60 try:
61     import http.cookies as compat_cookies
62 except ImportError:  # Python 2
63     import Cookie as compat_cookies
64
65 try:
66     import html.entities as compat_html_entities
67 except ImportError:  # Python 2
68     import htmlentitydefs as compat_html_entities
69
70 try:  # Python >= 3.3
71     compat_html_entities_html5 = compat_html_entities.html5
72 except AttributeError:
73     # Copied from CPython 3.5.1 html/entities.py
74     compat_html_entities_html5 = {
75         'Aacute': '\xc1',
76         'aacute': '\xe1',
77         'Aacute;': '\xc1',
78         'aacute;': '\xe1',
79         'Abreve;': '\u0102',
80         'abreve;': '\u0103',
81         'ac;': '\u223e',
82         'acd;': '\u223f',
83         'acE;': '\u223e\u0333',
84         'Acirc': '\xc2',
85         'acirc': '\xe2',
86         'Acirc;': '\xc2',
87         'acirc;': '\xe2',
88         'acute': '\xb4',
89         'acute;': '\xb4',
90         'Acy;': '\u0410',
91         'acy;': '\u0430',
92         'AElig': '\xc6',
93         'aelig': '\xe6',
94         'AElig;': '\xc6',
95         'aelig;': '\xe6',
96         'af;': '\u2061',
97         'Afr;': '\U0001d504',
98         'afr;': '\U0001d51e',
99         'Agrave': '\xc0',
100         'agrave': '\xe0',
101         'Agrave;': '\xc0',
102         'agrave;': '\xe0',
103         'alefsym;': '\u2135',
104         'aleph;': '\u2135',
105         'Alpha;': '\u0391',
106         'alpha;': '\u03b1',
107         'Amacr;': '\u0100',
108         'amacr;': '\u0101',
109         'amalg;': '\u2a3f',
110         'AMP': '&',
111         'amp': '&',
112         'AMP;': '&',
113         'amp;': '&',
114         'And;': '\u2a53',
115         'and;': '\u2227',
116         'andand;': '\u2a55',
117         'andd;': '\u2a5c',
118         'andslope;': '\u2a58',
119         'andv;': '\u2a5a',
120         'ang;': '\u2220',
121         'ange;': '\u29a4',
122         'angle;': '\u2220',
123         'angmsd;': '\u2221',
124         'angmsdaa;': '\u29a8',
125         'angmsdab;': '\u29a9',
126         'angmsdac;': '\u29aa',
127         'angmsdad;': '\u29ab',
128         'angmsdae;': '\u29ac',
129         'angmsdaf;': '\u29ad',
130         'angmsdag;': '\u29ae',
131         'angmsdah;': '\u29af',
132         'angrt;': '\u221f',
133         'angrtvb;': '\u22be',
134         'angrtvbd;': '\u299d',
135         'angsph;': '\u2222',
136         'angst;': '\xc5',
137         'angzarr;': '\u237c',
138         'Aogon;': '\u0104',
139         'aogon;': '\u0105',
140         'Aopf;': '\U0001d538',
141         'aopf;': '\U0001d552',
142         'ap;': '\u2248',
143         'apacir;': '\u2a6f',
144         'apE;': '\u2a70',
145         'ape;': '\u224a',
146         'apid;': '\u224b',
147         'apos;': "'",
148         'ApplyFunction;': '\u2061',
149         'approx;': '\u2248',
150         'approxeq;': '\u224a',
151         'Aring': '\xc5',
152         'aring': '\xe5',
153         'Aring;': '\xc5',
154         'aring;': '\xe5',
155         'Ascr;': '\U0001d49c',
156         'ascr;': '\U0001d4b6',
157         'Assign;': '\u2254',
158         'ast;': '*',
159         'asymp;': '\u2248',
160         'asympeq;': '\u224d',
161         'Atilde': '\xc3',
162         'atilde': '\xe3',
163         'Atilde;': '\xc3',
164         'atilde;': '\xe3',
165         'Auml': '\xc4',
166         'auml': '\xe4',
167         'Auml;': '\xc4',
168         'auml;': '\xe4',
169         'awconint;': '\u2233',
170         'awint;': '\u2a11',
171         'backcong;': '\u224c',
172         'backepsilon;': '\u03f6',
173         'backprime;': '\u2035',
174         'backsim;': '\u223d',
175         'backsimeq;': '\u22cd',
176         'Backslash;': '\u2216',
177         'Barv;': '\u2ae7',
178         'barvee;': '\u22bd',
179         'Barwed;': '\u2306',
180         'barwed;': '\u2305',
181         'barwedge;': '\u2305',
182         'bbrk;': '\u23b5',
183         'bbrktbrk;': '\u23b6',
184         'bcong;': '\u224c',
185         'Bcy;': '\u0411',
186         'bcy;': '\u0431',
187         'bdquo;': '\u201e',
188         'becaus;': '\u2235',
189         'Because;': '\u2235',
190         'because;': '\u2235',
191         'bemptyv;': '\u29b0',
192         'bepsi;': '\u03f6',
193         'bernou;': '\u212c',
194         'Bernoullis;': '\u212c',
195         'Beta;': '\u0392',
196         'beta;': '\u03b2',
197         'beth;': '\u2136',
198         'between;': '\u226c',
199         'Bfr;': '\U0001d505',
200         'bfr;': '\U0001d51f',
201         'bigcap;': '\u22c2',
202         'bigcirc;': '\u25ef',
203         'bigcup;': '\u22c3',
204         'bigodot;': '\u2a00',
205         'bigoplus;': '\u2a01',
206         'bigotimes;': '\u2a02',
207         'bigsqcup;': '\u2a06',
208         'bigstar;': '\u2605',
209         'bigtriangledown;': '\u25bd',
210         'bigtriangleup;': '\u25b3',
211         'biguplus;': '\u2a04',
212         'bigvee;': '\u22c1',
213         'bigwedge;': '\u22c0',
214         'bkarow;': '\u290d',
215         'blacklozenge;': '\u29eb',
216         'blacksquare;': '\u25aa',
217         'blacktriangle;': '\u25b4',
218         'blacktriangledown;': '\u25be',
219         'blacktriangleleft;': '\u25c2',
220         'blacktriangleright;': '\u25b8',
221         'blank;': '\u2423',
222         'blk12;': '\u2592',
223         'blk14;': '\u2591',
224         'blk34;': '\u2593',
225         'block;': '\u2588',
226         'bne;': '=\u20e5',
227         'bnequiv;': '\u2261\u20e5',
228         'bNot;': '\u2aed',
229         'bnot;': '\u2310',
230         'Bopf;': '\U0001d539',
231         'bopf;': '\U0001d553',
232         'bot;': '\u22a5',
233         'bottom;': '\u22a5',
234         'bowtie;': '\u22c8',
235         'boxbox;': '\u29c9',
236         'boxDL;': '\u2557',
237         'boxDl;': '\u2556',
238         'boxdL;': '\u2555',
239         'boxdl;': '\u2510',
240         'boxDR;': '\u2554',
241         'boxDr;': '\u2553',
242         'boxdR;': '\u2552',
243         'boxdr;': '\u250c',
244         'boxH;': '\u2550',
245         'boxh;': '\u2500',
246         'boxHD;': '\u2566',
247         'boxHd;': '\u2564',
248         'boxhD;': '\u2565',
249         'boxhd;': '\u252c',
250         'boxHU;': '\u2569',
251         'boxHu;': '\u2567',
252         'boxhU;': '\u2568',
253         'boxhu;': '\u2534',
254         'boxminus;': '\u229f',
255         'boxplus;': '\u229e',
256         'boxtimes;': '\u22a0',
257         'boxUL;': '\u255d',
258         'boxUl;': '\u255c',
259         'boxuL;': '\u255b',
260         'boxul;': '\u2518',
261         'boxUR;': '\u255a',
262         'boxUr;': '\u2559',
263         'boxuR;': '\u2558',
264         'boxur;': '\u2514',
265         'boxV;': '\u2551',
266         'boxv;': '\u2502',
267         'boxVH;': '\u256c',
268         'boxVh;': '\u256b',
269         'boxvH;': '\u256a',
270         'boxvh;': '\u253c',
271         'boxVL;': '\u2563',
272         'boxVl;': '\u2562',
273         'boxvL;': '\u2561',
274         'boxvl;': '\u2524',
275         'boxVR;': '\u2560',
276         'boxVr;': '\u255f',
277         'boxvR;': '\u255e',
278         'boxvr;': '\u251c',
279         'bprime;': '\u2035',
280         'Breve;': '\u02d8',
281         'breve;': '\u02d8',
282         'brvbar': '\xa6',
283         'brvbar;': '\xa6',
284         'Bscr;': '\u212c',
285         'bscr;': '\U0001d4b7',
286         'bsemi;': '\u204f',
287         'bsim;': '\u223d',
288         'bsime;': '\u22cd',
289         'bsol;': '\\',
290         'bsolb;': '\u29c5',
291         'bsolhsub;': '\u27c8',
292         'bull;': '\u2022',
293         'bullet;': '\u2022',
294         'bump;': '\u224e',
295         'bumpE;': '\u2aae',
296         'bumpe;': '\u224f',
297         'Bumpeq;': '\u224e',
298         'bumpeq;': '\u224f',
299         'Cacute;': '\u0106',
300         'cacute;': '\u0107',
301         'Cap;': '\u22d2',
302         'cap;': '\u2229',
303         'capand;': '\u2a44',
304         'capbrcup;': '\u2a49',
305         'capcap;': '\u2a4b',
306         'capcup;': '\u2a47',
307         'capdot;': '\u2a40',
308         'CapitalDifferentialD;': '\u2145',
309         'caps;': '\u2229\ufe00',
310         'caret;': '\u2041',
311         'caron;': '\u02c7',
312         'Cayleys;': '\u212d',
313         'ccaps;': '\u2a4d',
314         'Ccaron;': '\u010c',
315         'ccaron;': '\u010d',
316         'Ccedil': '\xc7',
317         'ccedil': '\xe7',
318         'Ccedil;': '\xc7',
319         'ccedil;': '\xe7',
320         'Ccirc;': '\u0108',
321         'ccirc;': '\u0109',
322         'Cconint;': '\u2230',
323         'ccups;': '\u2a4c',
324         'ccupssm;': '\u2a50',
325         'Cdot;': '\u010a',
326         'cdot;': '\u010b',
327         'cedil': '\xb8',
328         'cedil;': '\xb8',
329         'Cedilla;': '\xb8',
330         'cemptyv;': '\u29b2',
331         'cent': '\xa2',
332         'cent;': '\xa2',
333         'CenterDot;': '\xb7',
334         'centerdot;': '\xb7',
335         'Cfr;': '\u212d',
336         'cfr;': '\U0001d520',
337         'CHcy;': '\u0427',
338         'chcy;': '\u0447',
339         'check;': '\u2713',
340         'checkmark;': '\u2713',
341         'Chi;': '\u03a7',
342         'chi;': '\u03c7',
343         'cir;': '\u25cb',
344         'circ;': '\u02c6',
345         'circeq;': '\u2257',
346         'circlearrowleft;': '\u21ba',
347         'circlearrowright;': '\u21bb',
348         'circledast;': '\u229b',
349         'circledcirc;': '\u229a',
350         'circleddash;': '\u229d',
351         'CircleDot;': '\u2299',
352         'circledR;': '\xae',
353         'circledS;': '\u24c8',
354         'CircleMinus;': '\u2296',
355         'CirclePlus;': '\u2295',
356         'CircleTimes;': '\u2297',
357         'cirE;': '\u29c3',
358         'cire;': '\u2257',
359         'cirfnint;': '\u2a10',
360         'cirmid;': '\u2aef',
361         'cirscir;': '\u29c2',
362         'ClockwiseContourIntegral;': '\u2232',
363         'CloseCurlyDoubleQuote;': '\u201d',
364         'CloseCurlyQuote;': '\u2019',
365         'clubs;': '\u2663',
366         'clubsuit;': '\u2663',
367         'Colon;': '\u2237',
368         'colon;': ':',
369         'Colone;': '\u2a74',
370         'colone;': '\u2254',
371         'coloneq;': '\u2254',
372         'comma;': ',',
373         'commat;': '@',
374         'comp;': '\u2201',
375         'compfn;': '\u2218',
376         'complement;': '\u2201',
377         'complexes;': '\u2102',
378         'cong;': '\u2245',
379         'congdot;': '\u2a6d',
380         'Congruent;': '\u2261',
381         'Conint;': '\u222f',
382         'conint;': '\u222e',
383         'ContourIntegral;': '\u222e',
384         'Copf;': '\u2102',
385         'copf;': '\U0001d554',
386         'coprod;': '\u2210',
387         'Coproduct;': '\u2210',
388         'COPY': '\xa9',
389         'copy': '\xa9',
390         'COPY;': '\xa9',
391         'copy;': '\xa9',
392         'copysr;': '\u2117',
393         'CounterClockwiseContourIntegral;': '\u2233',
394         'crarr;': '\u21b5',
395         'Cross;': '\u2a2f',
396         'cross;': '\u2717',
397         'Cscr;': '\U0001d49e',
398         'cscr;': '\U0001d4b8',
399         'csub;': '\u2acf',
400         'csube;': '\u2ad1',
401         'csup;': '\u2ad0',
402         'csupe;': '\u2ad2',
403         'ctdot;': '\u22ef',
404         'cudarrl;': '\u2938',
405         'cudarrr;': '\u2935',
406         'cuepr;': '\u22de',
407         'cuesc;': '\u22df',
408         'cularr;': '\u21b6',
409         'cularrp;': '\u293d',
410         'Cup;': '\u22d3',
411         'cup;': '\u222a',
412         'cupbrcap;': '\u2a48',
413         'CupCap;': '\u224d',
414         'cupcap;': '\u2a46',
415         'cupcup;': '\u2a4a',
416         'cupdot;': '\u228d',
417         'cupor;': '\u2a45',
418         'cups;': '\u222a\ufe00',
419         'curarr;': '\u21b7',
420         'curarrm;': '\u293c',
421         'curlyeqprec;': '\u22de',
422         'curlyeqsucc;': '\u22df',
423         'curlyvee;': '\u22ce',
424         'curlywedge;': '\u22cf',
425         'curren': '\xa4',
426         'curren;': '\xa4',
427         'curvearrowleft;': '\u21b6',
428         'curvearrowright;': '\u21b7',
429         'cuvee;': '\u22ce',
430         'cuwed;': '\u22cf',
431         'cwconint;': '\u2232',
432         'cwint;': '\u2231',
433         'cylcty;': '\u232d',
434         'Dagger;': '\u2021',
435         'dagger;': '\u2020',
436         'daleth;': '\u2138',
437         'Darr;': '\u21a1',
438         'dArr;': '\u21d3',
439         'darr;': '\u2193',
440         'dash;': '\u2010',
441         'Dashv;': '\u2ae4',
442         'dashv;': '\u22a3',
443         'dbkarow;': '\u290f',
444         'dblac;': '\u02dd',
445         'Dcaron;': '\u010e',
446         'dcaron;': '\u010f',
447         'Dcy;': '\u0414',
448         'dcy;': '\u0434',
449         'DD;': '\u2145',
450         'dd;': '\u2146',
451         'ddagger;': '\u2021',
452         'ddarr;': '\u21ca',
453         'DDotrahd;': '\u2911',
454         'ddotseq;': '\u2a77',
455         'deg': '\xb0',
456         'deg;': '\xb0',
457         'Del;': '\u2207',
458         'Delta;': '\u0394',
459         'delta;': '\u03b4',
460         'demptyv;': '\u29b1',
461         'dfisht;': '\u297f',
462         'Dfr;': '\U0001d507',
463         'dfr;': '\U0001d521',
464         'dHar;': '\u2965',
465         'dharl;': '\u21c3',
466         'dharr;': '\u21c2',
467         'DiacriticalAcute;': '\xb4',
468         'DiacriticalDot;': '\u02d9',
469         'DiacriticalDoubleAcute;': '\u02dd',
470         'DiacriticalGrave;': '`',
471         'DiacriticalTilde;': '\u02dc',
472         'diam;': '\u22c4',
473         'Diamond;': '\u22c4',
474         'diamond;': '\u22c4',
475         'diamondsuit;': '\u2666',
476         'diams;': '\u2666',
477         'die;': '\xa8',
478         'DifferentialD;': '\u2146',
479         'digamma;': '\u03dd',
480         'disin;': '\u22f2',
481         'div;': '\xf7',
482         'divide': '\xf7',
483         'divide;': '\xf7',
484         'divideontimes;': '\u22c7',
485         'divonx;': '\u22c7',
486         'DJcy;': '\u0402',
487         'djcy;': '\u0452',
488         'dlcorn;': '\u231e',
489         'dlcrop;': '\u230d',
490         'dollar;': '$',
491         'Dopf;': '\U0001d53b',
492         'dopf;': '\U0001d555',
493         'Dot;': '\xa8',
494         'dot;': '\u02d9',
495         'DotDot;': '\u20dc',
496         'doteq;': '\u2250',
497         'doteqdot;': '\u2251',
498         'DotEqual;': '\u2250',
499         'dotminus;': '\u2238',
500         'dotplus;': '\u2214',
501         'dotsquare;': '\u22a1',
502         'doublebarwedge;': '\u2306',
503         'DoubleContourIntegral;': '\u222f',
504         'DoubleDot;': '\xa8',
505         'DoubleDownArrow;': '\u21d3',
506         'DoubleLeftArrow;': '\u21d0',
507         'DoubleLeftRightArrow;': '\u21d4',
508         'DoubleLeftTee;': '\u2ae4',
509         'DoubleLongLeftArrow;': '\u27f8',
510         'DoubleLongLeftRightArrow;': '\u27fa',
511         'DoubleLongRightArrow;': '\u27f9',
512         'DoubleRightArrow;': '\u21d2',
513         'DoubleRightTee;': '\u22a8',
514         'DoubleUpArrow;': '\u21d1',
515         'DoubleUpDownArrow;': '\u21d5',
516         'DoubleVerticalBar;': '\u2225',
517         'DownArrow;': '\u2193',
518         'Downarrow;': '\u21d3',
519         'downarrow;': '\u2193',
520         'DownArrowBar;': '\u2913',
521         'DownArrowUpArrow;': '\u21f5',
522         'DownBreve;': '\u0311',
523         'downdownarrows;': '\u21ca',
524         'downharpoonleft;': '\u21c3',
525         'downharpoonright;': '\u21c2',
526         'DownLeftRightVector;': '\u2950',
527         'DownLeftTeeVector;': '\u295e',
528         'DownLeftVector;': '\u21bd',
529         'DownLeftVectorBar;': '\u2956',
530         'DownRightTeeVector;': '\u295f',
531         'DownRightVector;': '\u21c1',
532         'DownRightVectorBar;': '\u2957',
533         'DownTee;': '\u22a4',
534         'DownTeeArrow;': '\u21a7',
535         'drbkarow;': '\u2910',
536         'drcorn;': '\u231f',
537         'drcrop;': '\u230c',
538         'Dscr;': '\U0001d49f',
539         'dscr;': '\U0001d4b9',
540         'DScy;': '\u0405',
541         'dscy;': '\u0455',
542         'dsol;': '\u29f6',
543         'Dstrok;': '\u0110',
544         'dstrok;': '\u0111',
545         'dtdot;': '\u22f1',
546         'dtri;': '\u25bf',
547         'dtrif;': '\u25be',
548         'duarr;': '\u21f5',
549         'duhar;': '\u296f',
550         'dwangle;': '\u29a6',
551         'DZcy;': '\u040f',
552         'dzcy;': '\u045f',
553         'dzigrarr;': '\u27ff',
554         'Eacute': '\xc9',
555         'eacute': '\xe9',
556         'Eacute;': '\xc9',
557         'eacute;': '\xe9',
558         'easter;': '\u2a6e',
559         'Ecaron;': '\u011a',
560         'ecaron;': '\u011b',
561         'ecir;': '\u2256',
562         'Ecirc': '\xca',
563         'ecirc': '\xea',
564         'Ecirc;': '\xca',
565         'ecirc;': '\xea',
566         'ecolon;': '\u2255',
567         'Ecy;': '\u042d',
568         'ecy;': '\u044d',
569         'eDDot;': '\u2a77',
570         'Edot;': '\u0116',
571         'eDot;': '\u2251',
572         'edot;': '\u0117',
573         'ee;': '\u2147',
574         'efDot;': '\u2252',
575         'Efr;': '\U0001d508',
576         'efr;': '\U0001d522',
577         'eg;': '\u2a9a',
578         'Egrave': '\xc8',
579         'egrave': '\xe8',
580         'Egrave;': '\xc8',
581         'egrave;': '\xe8',
582         'egs;': '\u2a96',
583         'egsdot;': '\u2a98',
584         'el;': '\u2a99',
585         'Element;': '\u2208',
586         'elinters;': '\u23e7',
587         'ell;': '\u2113',
588         'els;': '\u2a95',
589         'elsdot;': '\u2a97',
590         'Emacr;': '\u0112',
591         'emacr;': '\u0113',
592         'empty;': '\u2205',
593         'emptyset;': '\u2205',
594         'EmptySmallSquare;': '\u25fb',
595         'emptyv;': '\u2205',
596         'EmptyVerySmallSquare;': '\u25ab',
597         'emsp13;': '\u2004',
598         'emsp14;': '\u2005',
599         'emsp;': '\u2003',
600         'ENG;': '\u014a',
601         'eng;': '\u014b',
602         'ensp;': '\u2002',
603         'Eogon;': '\u0118',
604         'eogon;': '\u0119',
605         'Eopf;': '\U0001d53c',
606         'eopf;': '\U0001d556',
607         'epar;': '\u22d5',
608         'eparsl;': '\u29e3',
609         'eplus;': '\u2a71',
610         'epsi;': '\u03b5',
611         'Epsilon;': '\u0395',
612         'epsilon;': '\u03b5',
613         'epsiv;': '\u03f5',
614         'eqcirc;': '\u2256',
615         'eqcolon;': '\u2255',
616         'eqsim;': '\u2242',
617         'eqslantgtr;': '\u2a96',
618         'eqslantless;': '\u2a95',
619         'Equal;': '\u2a75',
620         'equals;': '=',
621         'EqualTilde;': '\u2242',
622         'equest;': '\u225f',
623         'Equilibrium;': '\u21cc',
624         'equiv;': '\u2261',
625         'equivDD;': '\u2a78',
626         'eqvparsl;': '\u29e5',
627         'erarr;': '\u2971',
628         'erDot;': '\u2253',
629         'Escr;': '\u2130',
630         'escr;': '\u212f',
631         'esdot;': '\u2250',
632         'Esim;': '\u2a73',
633         'esim;': '\u2242',
634         'Eta;': '\u0397',
635         'eta;': '\u03b7',
636         'ETH': '\xd0',
637         'eth': '\xf0',
638         'ETH;': '\xd0',
639         'eth;': '\xf0',
640         'Euml': '\xcb',
641         'euml': '\xeb',
642         'Euml;': '\xcb',
643         'euml;': '\xeb',
644         'euro;': '\u20ac',
645         'excl;': '!',
646         'exist;': '\u2203',
647         'Exists;': '\u2203',
648         'expectation;': '\u2130',
649         'ExponentialE;': '\u2147',
650         'exponentiale;': '\u2147',
651         'fallingdotseq;': '\u2252',
652         'Fcy;': '\u0424',
653         'fcy;': '\u0444',
654         'female;': '\u2640',
655         'ffilig;': '\ufb03',
656         'fflig;': '\ufb00',
657         'ffllig;': '\ufb04',
658         'Ffr;': '\U0001d509',
659         'ffr;': '\U0001d523',
660         'filig;': '\ufb01',
661         'FilledSmallSquare;': '\u25fc',
662         'FilledVerySmallSquare;': '\u25aa',
663         'fjlig;': 'fj',
664         'flat;': '\u266d',
665         'fllig;': '\ufb02',
666         'fltns;': '\u25b1',
667         'fnof;': '\u0192',
668         'Fopf;': '\U0001d53d',
669         'fopf;': '\U0001d557',
670         'ForAll;': '\u2200',
671         'forall;': '\u2200',
672         'fork;': '\u22d4',
673         'forkv;': '\u2ad9',
674         'Fouriertrf;': '\u2131',
675         'fpartint;': '\u2a0d',
676         'frac12': '\xbd',
677         'frac12;': '\xbd',
678         'frac13;': '\u2153',
679         'frac14': '\xbc',
680         'frac14;': '\xbc',
681         'frac15;': '\u2155',
682         'frac16;': '\u2159',
683         'frac18;': '\u215b',
684         'frac23;': '\u2154',
685         'frac25;': '\u2156',
686         'frac34': '\xbe',
687         'frac34;': '\xbe',
688         'frac35;': '\u2157',
689         'frac38;': '\u215c',
690         'frac45;': '\u2158',
691         'frac56;': '\u215a',
692         'frac58;': '\u215d',
693         'frac78;': '\u215e',
694         'frasl;': '\u2044',
695         'frown;': '\u2322',
696         'Fscr;': '\u2131',
697         'fscr;': '\U0001d4bb',
698         'gacute;': '\u01f5',
699         'Gamma;': '\u0393',
700         'gamma;': '\u03b3',
701         'Gammad;': '\u03dc',
702         'gammad;': '\u03dd',
703         'gap;': '\u2a86',
704         'Gbreve;': '\u011e',
705         'gbreve;': '\u011f',
706         'Gcedil;': '\u0122',
707         'Gcirc;': '\u011c',
708         'gcirc;': '\u011d',
709         'Gcy;': '\u0413',
710         'gcy;': '\u0433',
711         'Gdot;': '\u0120',
712         'gdot;': '\u0121',
713         'gE;': '\u2267',
714         'ge;': '\u2265',
715         'gEl;': '\u2a8c',
716         'gel;': '\u22db',
717         'geq;': '\u2265',
718         'geqq;': '\u2267',
719         'geqslant;': '\u2a7e',
720         'ges;': '\u2a7e',
721         'gescc;': '\u2aa9',
722         'gesdot;': '\u2a80',
723         'gesdoto;': '\u2a82',
724         'gesdotol;': '\u2a84',
725         'gesl;': '\u22db\ufe00',
726         'gesles;': '\u2a94',
727         'Gfr;': '\U0001d50a',
728         'gfr;': '\U0001d524',
729         'Gg;': '\u22d9',
730         'gg;': '\u226b',
731         'ggg;': '\u22d9',
732         'gimel;': '\u2137',
733         'GJcy;': '\u0403',
734         'gjcy;': '\u0453',
735         'gl;': '\u2277',
736         'gla;': '\u2aa5',
737         'glE;': '\u2a92',
738         'glj;': '\u2aa4',
739         'gnap;': '\u2a8a',
740         'gnapprox;': '\u2a8a',
741         'gnE;': '\u2269',
742         'gne;': '\u2a88',
743         'gneq;': '\u2a88',
744         'gneqq;': '\u2269',
745         'gnsim;': '\u22e7',
746         'Gopf;': '\U0001d53e',
747         'gopf;': '\U0001d558',
748         'grave;': '`',
749         'GreaterEqual;': '\u2265',
750         'GreaterEqualLess;': '\u22db',
751         'GreaterFullEqual;': '\u2267',
752         'GreaterGreater;': '\u2aa2',
753         'GreaterLess;': '\u2277',
754         'GreaterSlantEqual;': '\u2a7e',
755         'GreaterTilde;': '\u2273',
756         'Gscr;': '\U0001d4a2',
757         'gscr;': '\u210a',
758         'gsim;': '\u2273',
759         'gsime;': '\u2a8e',
760         'gsiml;': '\u2a90',
761         'GT': '>',
762         'gt': '>',
763         'GT;': '>',
764         'Gt;': '\u226b',
765         'gt;': '>',
766         'gtcc;': '\u2aa7',
767         'gtcir;': '\u2a7a',
768         'gtdot;': '\u22d7',
769         'gtlPar;': '\u2995',
770         'gtquest;': '\u2a7c',
771         'gtrapprox;': '\u2a86',
772         'gtrarr;': '\u2978',
773         'gtrdot;': '\u22d7',
774         'gtreqless;': '\u22db',
775         'gtreqqless;': '\u2a8c',
776         'gtrless;': '\u2277',
777         'gtrsim;': '\u2273',
778         'gvertneqq;': '\u2269\ufe00',
779         'gvnE;': '\u2269\ufe00',
780         'Hacek;': '\u02c7',
781         'hairsp;': '\u200a',
782         'half;': '\xbd',
783         'hamilt;': '\u210b',
784         'HARDcy;': '\u042a',
785         'hardcy;': '\u044a',
786         'hArr;': '\u21d4',
787         'harr;': '\u2194',
788         'harrcir;': '\u2948',
789         'harrw;': '\u21ad',
790         'Hat;': '^',
791         'hbar;': '\u210f',
792         'Hcirc;': '\u0124',
793         'hcirc;': '\u0125',
794         'hearts;': '\u2665',
795         'heartsuit;': '\u2665',
796         'hellip;': '\u2026',
797         'hercon;': '\u22b9',
798         'Hfr;': '\u210c',
799         'hfr;': '\U0001d525',
800         'HilbertSpace;': '\u210b',
801         'hksearow;': '\u2925',
802         'hkswarow;': '\u2926',
803         'hoarr;': '\u21ff',
804         'homtht;': '\u223b',
805         'hookleftarrow;': '\u21a9',
806         'hookrightarrow;': '\u21aa',
807         'Hopf;': '\u210d',
808         'hopf;': '\U0001d559',
809         'horbar;': '\u2015',
810         'HorizontalLine;': '\u2500',
811         'Hscr;': '\u210b',
812         'hscr;': '\U0001d4bd',
813         'hslash;': '\u210f',
814         'Hstrok;': '\u0126',
815         'hstrok;': '\u0127',
816         'HumpDownHump;': '\u224e',
817         'HumpEqual;': '\u224f',
818         'hybull;': '\u2043',
819         'hyphen;': '\u2010',
820         'Iacute': '\xcd',
821         'iacute': '\xed',
822         'Iacute;': '\xcd',
823         'iacute;': '\xed',
824         'ic;': '\u2063',
825         'Icirc': '\xce',
826         'icirc': '\xee',
827         'Icirc;': '\xce',
828         'icirc;': '\xee',
829         'Icy;': '\u0418',
830         'icy;': '\u0438',
831         'Idot;': '\u0130',
832         'IEcy;': '\u0415',
833         'iecy;': '\u0435',
834         'iexcl': '\xa1',
835         'iexcl;': '\xa1',
836         'iff;': '\u21d4',
837         'Ifr;': '\u2111',
838         'ifr;': '\U0001d526',
839         'Igrave': '\xcc',
840         'igrave': '\xec',
841         'Igrave;': '\xcc',
842         'igrave;': '\xec',
843         'ii;': '\u2148',
844         'iiiint;': '\u2a0c',
845         'iiint;': '\u222d',
846         'iinfin;': '\u29dc',
847         'iiota;': '\u2129',
848         'IJlig;': '\u0132',
849         'ijlig;': '\u0133',
850         'Im;': '\u2111',
851         'Imacr;': '\u012a',
852         'imacr;': '\u012b',
853         'image;': '\u2111',
854         'ImaginaryI;': '\u2148',
855         'imagline;': '\u2110',
856         'imagpart;': '\u2111',
857         'imath;': '\u0131',
858         'imof;': '\u22b7',
859         'imped;': '\u01b5',
860         'Implies;': '\u21d2',
861         'in;': '\u2208',
862         'incare;': '\u2105',
863         'infin;': '\u221e',
864         'infintie;': '\u29dd',
865         'inodot;': '\u0131',
866         'Int;': '\u222c',
867         'int;': '\u222b',
868         'intcal;': '\u22ba',
869         'integers;': '\u2124',
870         'Integral;': '\u222b',
871         'intercal;': '\u22ba',
872         'Intersection;': '\u22c2',
873         'intlarhk;': '\u2a17',
874         'intprod;': '\u2a3c',
875         'InvisibleComma;': '\u2063',
876         'InvisibleTimes;': '\u2062',
877         'IOcy;': '\u0401',
878         'iocy;': '\u0451',
879         'Iogon;': '\u012e',
880         'iogon;': '\u012f',
881         'Iopf;': '\U0001d540',
882         'iopf;': '\U0001d55a',
883         'Iota;': '\u0399',
884         'iota;': '\u03b9',
885         'iprod;': '\u2a3c',
886         'iquest': '\xbf',
887         'iquest;': '\xbf',
888         'Iscr;': '\u2110',
889         'iscr;': '\U0001d4be',
890         'isin;': '\u2208',
891         'isindot;': '\u22f5',
892         'isinE;': '\u22f9',
893         'isins;': '\u22f4',
894         'isinsv;': '\u22f3',
895         'isinv;': '\u2208',
896         'it;': '\u2062',
897         'Itilde;': '\u0128',
898         'itilde;': '\u0129',
899         'Iukcy;': '\u0406',
900         'iukcy;': '\u0456',
901         'Iuml': '\xcf',
902         'iuml': '\xef',
903         'Iuml;': '\xcf',
904         'iuml;': '\xef',
905         'Jcirc;': '\u0134',
906         'jcirc;': '\u0135',
907         'Jcy;': '\u0419',
908         'jcy;': '\u0439',
909         'Jfr;': '\U0001d50d',
910         'jfr;': '\U0001d527',
911         'jmath;': '\u0237',
912         'Jopf;': '\U0001d541',
913         'jopf;': '\U0001d55b',
914         'Jscr;': '\U0001d4a5',
915         'jscr;': '\U0001d4bf',
916         'Jsercy;': '\u0408',
917         'jsercy;': '\u0458',
918         'Jukcy;': '\u0404',
919         'jukcy;': '\u0454',
920         'Kappa;': '\u039a',
921         'kappa;': '\u03ba',
922         'kappav;': '\u03f0',
923         'Kcedil;': '\u0136',
924         'kcedil;': '\u0137',
925         'Kcy;': '\u041a',
926         'kcy;': '\u043a',
927         'Kfr;': '\U0001d50e',
928         'kfr;': '\U0001d528',
929         'kgreen;': '\u0138',
930         'KHcy;': '\u0425',
931         'khcy;': '\u0445',
932         'KJcy;': '\u040c',
933         'kjcy;': '\u045c',
934         'Kopf;': '\U0001d542',
935         'kopf;': '\U0001d55c',
936         'Kscr;': '\U0001d4a6',
937         'kscr;': '\U0001d4c0',
938         'lAarr;': '\u21da',
939         'Lacute;': '\u0139',
940         'lacute;': '\u013a',
941         'laemptyv;': '\u29b4',
942         'lagran;': '\u2112',
943         'Lambda;': '\u039b',
944         'lambda;': '\u03bb',
945         'Lang;': '\u27ea',
946         'lang;': '\u27e8',
947         'langd;': '\u2991',
948         'langle;': '\u27e8',
949         'lap;': '\u2a85',
950         'Laplacetrf;': '\u2112',
951         'laquo': '\xab',
952         'laquo;': '\xab',
953         'Larr;': '\u219e',
954         'lArr;': '\u21d0',
955         'larr;': '\u2190',
956         'larrb;': '\u21e4',
957         'larrbfs;': '\u291f',
958         'larrfs;': '\u291d',
959         'larrhk;': '\u21a9',
960         'larrlp;': '\u21ab',
961         'larrpl;': '\u2939',
962         'larrsim;': '\u2973',
963         'larrtl;': '\u21a2',
964         'lat;': '\u2aab',
965         'lAtail;': '\u291b',
966         'latail;': '\u2919',
967         'late;': '\u2aad',
968         'lates;': '\u2aad\ufe00',
969         'lBarr;': '\u290e',
970         'lbarr;': '\u290c',
971         'lbbrk;': '\u2772',
972         'lbrace;': '{',
973         'lbrack;': '[',
974         'lbrke;': '\u298b',
975         'lbrksld;': '\u298f',
976         'lbrkslu;': '\u298d',
977         'Lcaron;': '\u013d',
978         'lcaron;': '\u013e',
979         'Lcedil;': '\u013b',
980         'lcedil;': '\u013c',
981         'lceil;': '\u2308',
982         'lcub;': '{',
983         'Lcy;': '\u041b',
984         'lcy;': '\u043b',
985         'ldca;': '\u2936',
986         'ldquo;': '\u201c',
987         'ldquor;': '\u201e',
988         'ldrdhar;': '\u2967',
989         'ldrushar;': '\u294b',
990         'ldsh;': '\u21b2',
991         'lE;': '\u2266',
992         'le;': '\u2264',
993         'LeftAngleBracket;': '\u27e8',
994         'LeftArrow;': '\u2190',
995         'Leftarrow;': '\u21d0',
996         'leftarrow;': '\u2190',
997         'LeftArrowBar;': '\u21e4',
998         'LeftArrowRightArrow;': '\u21c6',
999         'leftarrowtail;': '\u21a2',
1000         'LeftCeiling;': '\u2308',
1001         'LeftDoubleBracket;': '\u27e6',
1002         'LeftDownTeeVector;': '\u2961',
1003         'LeftDownVector;': '\u21c3',
1004         'LeftDownVectorBar;': '\u2959',
1005         'LeftFloor;': '\u230a',
1006         'leftharpoondown;': '\u21bd',
1007         'leftharpoonup;': '\u21bc',
1008         'leftleftarrows;': '\u21c7',
1009         'LeftRightArrow;': '\u2194',
1010         'Leftrightarrow;': '\u21d4',
1011         'leftrightarrow;': '\u2194',
1012         'leftrightarrows;': '\u21c6',
1013         'leftrightharpoons;': '\u21cb',
1014         'leftrightsquigarrow;': '\u21ad',
1015         'LeftRightVector;': '\u294e',
1016         'LeftTee;': '\u22a3',
1017         'LeftTeeArrow;': '\u21a4',
1018         'LeftTeeVector;': '\u295a',
1019         'leftthreetimes;': '\u22cb',
1020         'LeftTriangle;': '\u22b2',
1021         'LeftTriangleBar;': '\u29cf',
1022         'LeftTriangleEqual;': '\u22b4',
1023         'LeftUpDownVector;': '\u2951',
1024         'LeftUpTeeVector;': '\u2960',
1025         'LeftUpVector;': '\u21bf',
1026         'LeftUpVectorBar;': '\u2958',
1027         'LeftVector;': '\u21bc',
1028         'LeftVectorBar;': '\u2952',
1029         'lEg;': '\u2a8b',
1030         'leg;': '\u22da',
1031         'leq;': '\u2264',
1032         'leqq;': '\u2266',
1033         'leqslant;': '\u2a7d',
1034         'les;': '\u2a7d',
1035         'lescc;': '\u2aa8',
1036         'lesdot;': '\u2a7f',
1037         'lesdoto;': '\u2a81',
1038         'lesdotor;': '\u2a83',
1039         'lesg;': '\u22da\ufe00',
1040         'lesges;': '\u2a93',
1041         'lessapprox;': '\u2a85',
1042         'lessdot;': '\u22d6',
1043         'lesseqgtr;': '\u22da',
1044         'lesseqqgtr;': '\u2a8b',
1045         'LessEqualGreater;': '\u22da',
1046         'LessFullEqual;': '\u2266',
1047         'LessGreater;': '\u2276',
1048         'lessgtr;': '\u2276',
1049         'LessLess;': '\u2aa1',
1050         'lesssim;': '\u2272',
1051         'LessSlantEqual;': '\u2a7d',
1052         'LessTilde;': '\u2272',
1053         'lfisht;': '\u297c',
1054         'lfloor;': '\u230a',
1055         'Lfr;': '\U0001d50f',
1056         'lfr;': '\U0001d529',
1057         'lg;': '\u2276',
1058         'lgE;': '\u2a91',
1059         'lHar;': '\u2962',
1060         'lhard;': '\u21bd',
1061         'lharu;': '\u21bc',
1062         'lharul;': '\u296a',
1063         'lhblk;': '\u2584',
1064         'LJcy;': '\u0409',
1065         'ljcy;': '\u0459',
1066         'Ll;': '\u22d8',
1067         'll;': '\u226a',
1068         'llarr;': '\u21c7',
1069         'llcorner;': '\u231e',
1070         'Lleftarrow;': '\u21da',
1071         'llhard;': '\u296b',
1072         'lltri;': '\u25fa',
1073         'Lmidot;': '\u013f',
1074         'lmidot;': '\u0140',
1075         'lmoust;': '\u23b0',
1076         'lmoustache;': '\u23b0',
1077         'lnap;': '\u2a89',
1078         'lnapprox;': '\u2a89',
1079         'lnE;': '\u2268',
1080         'lne;': '\u2a87',
1081         'lneq;': '\u2a87',
1082         'lneqq;': '\u2268',
1083         'lnsim;': '\u22e6',
1084         'loang;': '\u27ec',
1085         'loarr;': '\u21fd',
1086         'lobrk;': '\u27e6',
1087         'LongLeftArrow;': '\u27f5',
1088         'Longleftarrow;': '\u27f8',
1089         'longleftarrow;': '\u27f5',
1090         'LongLeftRightArrow;': '\u27f7',
1091         'Longleftrightarrow;': '\u27fa',
1092         'longleftrightarrow;': '\u27f7',
1093         'longmapsto;': '\u27fc',
1094         'LongRightArrow;': '\u27f6',
1095         'Longrightarrow;': '\u27f9',
1096         'longrightarrow;': '\u27f6',
1097         'looparrowleft;': '\u21ab',
1098         'looparrowright;': '\u21ac',
1099         'lopar;': '\u2985',
1100         'Lopf;': '\U0001d543',
1101         'lopf;': '\U0001d55d',
1102         'loplus;': '\u2a2d',
1103         'lotimes;': '\u2a34',
1104         'lowast;': '\u2217',
1105         'lowbar;': '_',
1106         'LowerLeftArrow;': '\u2199',
1107         'LowerRightArrow;': '\u2198',
1108         'loz;': '\u25ca',
1109         'lozenge;': '\u25ca',
1110         'lozf;': '\u29eb',
1111         'lpar;': '(',
1112         'lparlt;': '\u2993',
1113         'lrarr;': '\u21c6',
1114         'lrcorner;': '\u231f',
1115         'lrhar;': '\u21cb',
1116         'lrhard;': '\u296d',
1117         'lrm;': '\u200e',
1118         'lrtri;': '\u22bf',
1119         'lsaquo;': '\u2039',
1120         'Lscr;': '\u2112',
1121         'lscr;': '\U0001d4c1',
1122         'Lsh;': '\u21b0',
1123         'lsh;': '\u21b0',
1124         'lsim;': '\u2272',
1125         'lsime;': '\u2a8d',
1126         'lsimg;': '\u2a8f',
1127         'lsqb;': '[',
1128         'lsquo;': '\u2018',
1129         'lsquor;': '\u201a',
1130         'Lstrok;': '\u0141',
1131         'lstrok;': '\u0142',
1132         'LT': '<',
1133         'lt': '<',
1134         'LT;': '<',
1135         'Lt;': '\u226a',
1136         'lt;': '<',
1137         'ltcc;': '\u2aa6',
1138         'ltcir;': '\u2a79',
1139         'ltdot;': '\u22d6',
1140         'lthree;': '\u22cb',
1141         'ltimes;': '\u22c9',
1142         'ltlarr;': '\u2976',
1143         'ltquest;': '\u2a7b',
1144         'ltri;': '\u25c3',
1145         'ltrie;': '\u22b4',
1146         'ltrif;': '\u25c2',
1147         'ltrPar;': '\u2996',
1148         'lurdshar;': '\u294a',
1149         'luruhar;': '\u2966',
1150         'lvertneqq;': '\u2268\ufe00',
1151         'lvnE;': '\u2268\ufe00',
1152         'macr': '\xaf',
1153         'macr;': '\xaf',
1154         'male;': '\u2642',
1155         'malt;': '\u2720',
1156         'maltese;': '\u2720',
1157         'Map;': '\u2905',
1158         'map;': '\u21a6',
1159         'mapsto;': '\u21a6',
1160         'mapstodown;': '\u21a7',
1161         'mapstoleft;': '\u21a4',
1162         'mapstoup;': '\u21a5',
1163         'marker;': '\u25ae',
1164         'mcomma;': '\u2a29',
1165         'Mcy;': '\u041c',
1166         'mcy;': '\u043c',
1167         'mdash;': '\u2014',
1168         'mDDot;': '\u223a',
1169         'measuredangle;': '\u2221',
1170         'MediumSpace;': '\u205f',
1171         'Mellintrf;': '\u2133',
1172         'Mfr;': '\U0001d510',
1173         'mfr;': '\U0001d52a',
1174         'mho;': '\u2127',
1175         'micro': '\xb5',
1176         'micro;': '\xb5',
1177         'mid;': '\u2223',
1178         'midast;': '*',
1179         'midcir;': '\u2af0',
1180         'middot': '\xb7',
1181         'middot;': '\xb7',
1182         'minus;': '\u2212',
1183         'minusb;': '\u229f',
1184         'minusd;': '\u2238',
1185         'minusdu;': '\u2a2a',
1186         'MinusPlus;': '\u2213',
1187         'mlcp;': '\u2adb',
1188         'mldr;': '\u2026',
1189         'mnplus;': '\u2213',
1190         'models;': '\u22a7',
1191         'Mopf;': '\U0001d544',
1192         'mopf;': '\U0001d55e',
1193         'mp;': '\u2213',
1194         'Mscr;': '\u2133',
1195         'mscr;': '\U0001d4c2',
1196         'mstpos;': '\u223e',
1197         'Mu;': '\u039c',
1198         'mu;': '\u03bc',
1199         'multimap;': '\u22b8',
1200         'mumap;': '\u22b8',
1201         'nabla;': '\u2207',
1202         'Nacute;': '\u0143',
1203         'nacute;': '\u0144',
1204         'nang;': '\u2220\u20d2',
1205         'nap;': '\u2249',
1206         'napE;': '\u2a70\u0338',
1207         'napid;': '\u224b\u0338',
1208         'napos;': '\u0149',
1209         'napprox;': '\u2249',
1210         'natur;': '\u266e',
1211         'natural;': '\u266e',
1212         'naturals;': '\u2115',
1213         'nbsp': '\xa0',
1214         'nbsp;': '\xa0',
1215         'nbump;': '\u224e\u0338',
1216         'nbumpe;': '\u224f\u0338',
1217         'ncap;': '\u2a43',
1218         'Ncaron;': '\u0147',
1219         'ncaron;': '\u0148',
1220         'Ncedil;': '\u0145',
1221         'ncedil;': '\u0146',
1222         'ncong;': '\u2247',
1223         'ncongdot;': '\u2a6d\u0338',
1224         'ncup;': '\u2a42',
1225         'Ncy;': '\u041d',
1226         'ncy;': '\u043d',
1227         'ndash;': '\u2013',
1228         'ne;': '\u2260',
1229         'nearhk;': '\u2924',
1230         'neArr;': '\u21d7',
1231         'nearr;': '\u2197',
1232         'nearrow;': '\u2197',
1233         'nedot;': '\u2250\u0338',
1234         'NegativeMediumSpace;': '\u200b',
1235         'NegativeThickSpace;': '\u200b',
1236         'NegativeThinSpace;': '\u200b',
1237         'NegativeVeryThinSpace;': '\u200b',
1238         'nequiv;': '\u2262',
1239         'nesear;': '\u2928',
1240         'nesim;': '\u2242\u0338',
1241         'NestedGreaterGreater;': '\u226b',
1242         'NestedLessLess;': '\u226a',
1243         'NewLine;': '\n',
1244         'nexist;': '\u2204',
1245         'nexists;': '\u2204',
1246         'Nfr;': '\U0001d511',
1247         'nfr;': '\U0001d52b',
1248         'ngE;': '\u2267\u0338',
1249         'nge;': '\u2271',
1250         'ngeq;': '\u2271',
1251         'ngeqq;': '\u2267\u0338',
1252         'ngeqslant;': '\u2a7e\u0338',
1253         'nges;': '\u2a7e\u0338',
1254         'nGg;': '\u22d9\u0338',
1255         'ngsim;': '\u2275',
1256         'nGt;': '\u226b\u20d2',
1257         'ngt;': '\u226f',
1258         'ngtr;': '\u226f',
1259         'nGtv;': '\u226b\u0338',
1260         'nhArr;': '\u21ce',
1261         'nharr;': '\u21ae',
1262         'nhpar;': '\u2af2',
1263         'ni;': '\u220b',
1264         'nis;': '\u22fc',
1265         'nisd;': '\u22fa',
1266         'niv;': '\u220b',
1267         'NJcy;': '\u040a',
1268         'njcy;': '\u045a',
1269         'nlArr;': '\u21cd',
1270         'nlarr;': '\u219a',
1271         'nldr;': '\u2025',
1272         'nlE;': '\u2266\u0338',
1273         'nle;': '\u2270',
1274         'nLeftarrow;': '\u21cd',
1275         'nleftarrow;': '\u219a',
1276         'nLeftrightarrow;': '\u21ce',
1277         'nleftrightarrow;': '\u21ae',
1278         'nleq;': '\u2270',
1279         'nleqq;': '\u2266\u0338',
1280         'nleqslant;': '\u2a7d\u0338',
1281         'nles;': '\u2a7d\u0338',
1282         'nless;': '\u226e',
1283         'nLl;': '\u22d8\u0338',
1284         'nlsim;': '\u2274',
1285         'nLt;': '\u226a\u20d2',
1286         'nlt;': '\u226e',
1287         'nltri;': '\u22ea',
1288         'nltrie;': '\u22ec',
1289         'nLtv;': '\u226a\u0338',
1290         'nmid;': '\u2224',
1291         'NoBreak;': '\u2060',
1292         'NonBreakingSpace;': '\xa0',
1293         'Nopf;': '\u2115',
1294         'nopf;': '\U0001d55f',
1295         'not': '\xac',
1296         'Not;': '\u2aec',
1297         'not;': '\xac',
1298         'NotCongruent;': '\u2262',
1299         'NotCupCap;': '\u226d',
1300         'NotDoubleVerticalBar;': '\u2226',
1301         'NotElement;': '\u2209',
1302         'NotEqual;': '\u2260',
1303         'NotEqualTilde;': '\u2242\u0338',
1304         'NotExists;': '\u2204',
1305         'NotGreater;': '\u226f',
1306         'NotGreaterEqual;': '\u2271',
1307         'NotGreaterFullEqual;': '\u2267\u0338',
1308         'NotGreaterGreater;': '\u226b\u0338',
1309         'NotGreaterLess;': '\u2279',
1310         'NotGreaterSlantEqual;': '\u2a7e\u0338',
1311         'NotGreaterTilde;': '\u2275',
1312         'NotHumpDownHump;': '\u224e\u0338',
1313         'NotHumpEqual;': '\u224f\u0338',
1314         'notin;': '\u2209',
1315         'notindot;': '\u22f5\u0338',
1316         'notinE;': '\u22f9\u0338',
1317         'notinva;': '\u2209',
1318         'notinvb;': '\u22f7',
1319         'notinvc;': '\u22f6',
1320         'NotLeftTriangle;': '\u22ea',
1321         'NotLeftTriangleBar;': '\u29cf\u0338',
1322         'NotLeftTriangleEqual;': '\u22ec',
1323         'NotLess;': '\u226e',
1324         'NotLessEqual;': '\u2270',
1325         'NotLessGreater;': '\u2278',
1326         'NotLessLess;': '\u226a\u0338',
1327         'NotLessSlantEqual;': '\u2a7d\u0338',
1328         'NotLessTilde;': '\u2274',
1329         'NotNestedGreaterGreater;': '\u2aa2\u0338',
1330         'NotNestedLessLess;': '\u2aa1\u0338',
1331         'notni;': '\u220c',
1332         'notniva;': '\u220c',
1333         'notnivb;': '\u22fe',
1334         'notnivc;': '\u22fd',
1335         'NotPrecedes;': '\u2280',
1336         'NotPrecedesEqual;': '\u2aaf\u0338',
1337         'NotPrecedesSlantEqual;': '\u22e0',
1338         'NotReverseElement;': '\u220c',
1339         'NotRightTriangle;': '\u22eb',
1340         'NotRightTriangleBar;': '\u29d0\u0338',
1341         'NotRightTriangleEqual;': '\u22ed',
1342         'NotSquareSubset;': '\u228f\u0338',
1343         'NotSquareSubsetEqual;': '\u22e2',
1344         'NotSquareSuperset;': '\u2290\u0338',
1345         'NotSquareSupersetEqual;': '\u22e3',
1346         'NotSubset;': '\u2282\u20d2',
1347         'NotSubsetEqual;': '\u2288',
1348         'NotSucceeds;': '\u2281',
1349         'NotSucceedsEqual;': '\u2ab0\u0338',
1350         'NotSucceedsSlantEqual;': '\u22e1',
1351         'NotSucceedsTilde;': '\u227f\u0338',
1352         'NotSuperset;': '\u2283\u20d2',
1353         'NotSupersetEqual;': '\u2289',
1354         'NotTilde;': '\u2241',
1355         'NotTildeEqual;': '\u2244',
1356         'NotTildeFullEqual;': '\u2247',
1357         'NotTildeTilde;': '\u2249',
1358         'NotVerticalBar;': '\u2224',
1359         'npar;': '\u2226',
1360         'nparallel;': '\u2226',
1361         'nparsl;': '\u2afd\u20e5',
1362         'npart;': '\u2202\u0338',
1363         'npolint;': '\u2a14',
1364         'npr;': '\u2280',
1365         'nprcue;': '\u22e0',
1366         'npre;': '\u2aaf\u0338',
1367         'nprec;': '\u2280',
1368         'npreceq;': '\u2aaf\u0338',
1369         'nrArr;': '\u21cf',
1370         'nrarr;': '\u219b',
1371         'nrarrc;': '\u2933\u0338',
1372         'nrarrw;': '\u219d\u0338',
1373         'nRightarrow;': '\u21cf',
1374         'nrightarrow;': '\u219b',
1375         'nrtri;': '\u22eb',
1376         'nrtrie;': '\u22ed',
1377         'nsc;': '\u2281',
1378         'nsccue;': '\u22e1',
1379         'nsce;': '\u2ab0\u0338',
1380         'Nscr;': '\U0001d4a9',
1381         'nscr;': '\U0001d4c3',
1382         'nshortmid;': '\u2224',
1383         'nshortparallel;': '\u2226',
1384         'nsim;': '\u2241',
1385         'nsime;': '\u2244',
1386         'nsimeq;': '\u2244',
1387         'nsmid;': '\u2224',
1388         'nspar;': '\u2226',
1389         'nsqsube;': '\u22e2',
1390         'nsqsupe;': '\u22e3',
1391         'nsub;': '\u2284',
1392         'nsubE;': '\u2ac5\u0338',
1393         'nsube;': '\u2288',
1394         'nsubset;': '\u2282\u20d2',
1395         'nsubseteq;': '\u2288',
1396         'nsubseteqq;': '\u2ac5\u0338',
1397         'nsucc;': '\u2281',
1398         'nsucceq;': '\u2ab0\u0338',
1399         'nsup;': '\u2285',
1400         'nsupE;': '\u2ac6\u0338',
1401         'nsupe;': '\u2289',
1402         'nsupset;': '\u2283\u20d2',
1403         'nsupseteq;': '\u2289',
1404         'nsupseteqq;': '\u2ac6\u0338',
1405         'ntgl;': '\u2279',
1406         'Ntilde': '\xd1',
1407         'ntilde': '\xf1',
1408         'Ntilde;': '\xd1',
1409         'ntilde;': '\xf1',
1410         'ntlg;': '\u2278',
1411         'ntriangleleft;': '\u22ea',
1412         'ntrianglelefteq;': '\u22ec',
1413         'ntriangleright;': '\u22eb',
1414         'ntrianglerighteq;': '\u22ed',
1415         'Nu;': '\u039d',
1416         'nu;': '\u03bd',
1417         'num;': '#',
1418         'numero;': '\u2116',
1419         'numsp;': '\u2007',
1420         'nvap;': '\u224d\u20d2',
1421         'nVDash;': '\u22af',
1422         'nVdash;': '\u22ae',
1423         'nvDash;': '\u22ad',
1424         'nvdash;': '\u22ac',
1425         'nvge;': '\u2265\u20d2',
1426         'nvgt;': '>\u20d2',
1427         'nvHarr;': '\u2904',
1428         'nvinfin;': '\u29de',
1429         'nvlArr;': '\u2902',
1430         'nvle;': '\u2264\u20d2',
1431         'nvlt;': '<\u20d2',
1432         'nvltrie;': '\u22b4\u20d2',
1433         'nvrArr;': '\u2903',
1434         'nvrtrie;': '\u22b5\u20d2',
1435         'nvsim;': '\u223c\u20d2',
1436         'nwarhk;': '\u2923',
1437         'nwArr;': '\u21d6',
1438         'nwarr;': '\u2196',
1439         'nwarrow;': '\u2196',
1440         'nwnear;': '\u2927',
1441         'Oacute': '\xd3',
1442         'oacute': '\xf3',
1443         'Oacute;': '\xd3',
1444         'oacute;': '\xf3',
1445         'oast;': '\u229b',
1446         'ocir;': '\u229a',
1447         'Ocirc': '\xd4',
1448         'ocirc': '\xf4',
1449         'Ocirc;': '\xd4',
1450         'ocirc;': '\xf4',
1451         'Ocy;': '\u041e',
1452         'ocy;': '\u043e',
1453         'odash;': '\u229d',
1454         'Odblac;': '\u0150',
1455         'odblac;': '\u0151',
1456         'odiv;': '\u2a38',
1457         'odot;': '\u2299',
1458         'odsold;': '\u29bc',
1459         'OElig;': '\u0152',
1460         'oelig;': '\u0153',
1461         'ofcir;': '\u29bf',
1462         'Ofr;': '\U0001d512',
1463         'ofr;': '\U0001d52c',
1464         'ogon;': '\u02db',
1465         'Ograve': '\xd2',
1466         'ograve': '\xf2',
1467         'Ograve;': '\xd2',
1468         'ograve;': '\xf2',
1469         'ogt;': '\u29c1',
1470         'ohbar;': '\u29b5',
1471         'ohm;': '\u03a9',
1472         'oint;': '\u222e',
1473         'olarr;': '\u21ba',
1474         'olcir;': '\u29be',
1475         'olcross;': '\u29bb',
1476         'oline;': '\u203e',
1477         'olt;': '\u29c0',
1478         'Omacr;': '\u014c',
1479         'omacr;': '\u014d',
1480         'Omega;': '\u03a9',
1481         'omega;': '\u03c9',
1482         'Omicron;': '\u039f',
1483         'omicron;': '\u03bf',
1484         'omid;': '\u29b6',
1485         'ominus;': '\u2296',
1486         'Oopf;': '\U0001d546',
1487         'oopf;': '\U0001d560',
1488         'opar;': '\u29b7',
1489         'OpenCurlyDoubleQuote;': '\u201c',
1490         'OpenCurlyQuote;': '\u2018',
1491         'operp;': '\u29b9',
1492         'oplus;': '\u2295',
1493         'Or;': '\u2a54',
1494         'or;': '\u2228',
1495         'orarr;': '\u21bb',
1496         'ord;': '\u2a5d',
1497         'order;': '\u2134',
1498         'orderof;': '\u2134',
1499         'ordf': '\xaa',
1500         'ordf;': '\xaa',
1501         'ordm': '\xba',
1502         'ordm;': '\xba',
1503         'origof;': '\u22b6',
1504         'oror;': '\u2a56',
1505         'orslope;': '\u2a57',
1506         'orv;': '\u2a5b',
1507         'oS;': '\u24c8',
1508         'Oscr;': '\U0001d4aa',
1509         'oscr;': '\u2134',
1510         'Oslash': '\xd8',
1511         'oslash': '\xf8',
1512         'Oslash;': '\xd8',
1513         'oslash;': '\xf8',
1514         'osol;': '\u2298',
1515         'Otilde': '\xd5',
1516         'otilde': '\xf5',
1517         'Otilde;': '\xd5',
1518         'otilde;': '\xf5',
1519         'Otimes;': '\u2a37',
1520         'otimes;': '\u2297',
1521         'otimesas;': '\u2a36',
1522         'Ouml': '\xd6',
1523         'ouml': '\xf6',
1524         'Ouml;': '\xd6',
1525         'ouml;': '\xf6',
1526         'ovbar;': '\u233d',
1527         'OverBar;': '\u203e',
1528         'OverBrace;': '\u23de',
1529         'OverBracket;': '\u23b4',
1530         'OverParenthesis;': '\u23dc',
1531         'par;': '\u2225',
1532         'para': '\xb6',
1533         'para;': '\xb6',
1534         'parallel;': '\u2225',
1535         'parsim;': '\u2af3',
1536         'parsl;': '\u2afd',
1537         'part;': '\u2202',
1538         'PartialD;': '\u2202',
1539         'Pcy;': '\u041f',
1540         'pcy;': '\u043f',
1541         'percnt;': '%',
1542         'period;': '.',
1543         'permil;': '\u2030',
1544         'perp;': '\u22a5',
1545         'pertenk;': '\u2031',
1546         'Pfr;': '\U0001d513',
1547         'pfr;': '\U0001d52d',
1548         'Phi;': '\u03a6',
1549         'phi;': '\u03c6',
1550         'phiv;': '\u03d5',
1551         'phmmat;': '\u2133',
1552         'phone;': '\u260e',
1553         'Pi;': '\u03a0',
1554         'pi;': '\u03c0',
1555         'pitchfork;': '\u22d4',
1556         'piv;': '\u03d6',
1557         'planck;': '\u210f',
1558         'planckh;': '\u210e',
1559         'plankv;': '\u210f',
1560         'plus;': '+',
1561         'plusacir;': '\u2a23',
1562         'plusb;': '\u229e',
1563         'pluscir;': '\u2a22',
1564         'plusdo;': '\u2214',
1565         'plusdu;': '\u2a25',
1566         'pluse;': '\u2a72',
1567         'PlusMinus;': '\xb1',
1568         'plusmn': '\xb1',
1569         'plusmn;': '\xb1',
1570         'plussim;': '\u2a26',
1571         'plustwo;': '\u2a27',
1572         'pm;': '\xb1',
1573         'Poincareplane;': '\u210c',
1574         'pointint;': '\u2a15',
1575         'Popf;': '\u2119',
1576         'popf;': '\U0001d561',
1577         'pound': '\xa3',
1578         'pound;': '\xa3',
1579         'Pr;': '\u2abb',
1580         'pr;': '\u227a',
1581         'prap;': '\u2ab7',
1582         'prcue;': '\u227c',
1583         'prE;': '\u2ab3',
1584         'pre;': '\u2aaf',
1585         'prec;': '\u227a',
1586         'precapprox;': '\u2ab7',
1587         'preccurlyeq;': '\u227c',
1588         'Precedes;': '\u227a',
1589         'PrecedesEqual;': '\u2aaf',
1590         'PrecedesSlantEqual;': '\u227c',
1591         'PrecedesTilde;': '\u227e',
1592         'preceq;': '\u2aaf',
1593         'precnapprox;': '\u2ab9',
1594         'precneqq;': '\u2ab5',
1595         'precnsim;': '\u22e8',
1596         'precsim;': '\u227e',
1597         'Prime;': '\u2033',
1598         'prime;': '\u2032',
1599         'primes;': '\u2119',
1600         'prnap;': '\u2ab9',
1601         'prnE;': '\u2ab5',
1602         'prnsim;': '\u22e8',
1603         'prod;': '\u220f',
1604         'Product;': '\u220f',
1605         'profalar;': '\u232e',
1606         'profline;': '\u2312',
1607         'profsurf;': '\u2313',
1608         'prop;': '\u221d',
1609         'Proportion;': '\u2237',
1610         'Proportional;': '\u221d',
1611         'propto;': '\u221d',
1612         'prsim;': '\u227e',
1613         'prurel;': '\u22b0',
1614         'Pscr;': '\U0001d4ab',
1615         'pscr;': '\U0001d4c5',
1616         'Psi;': '\u03a8',
1617         'psi;': '\u03c8',
1618         'puncsp;': '\u2008',
1619         'Qfr;': '\U0001d514',
1620         'qfr;': '\U0001d52e',
1621         'qint;': '\u2a0c',
1622         'Qopf;': '\u211a',
1623         'qopf;': '\U0001d562',
1624         'qprime;': '\u2057',
1625         'Qscr;': '\U0001d4ac',
1626         'qscr;': '\U0001d4c6',
1627         'quaternions;': '\u210d',
1628         'quatint;': '\u2a16',
1629         'quest;': '?',
1630         'questeq;': '\u225f',
1631         'QUOT': '"',
1632         'quot': '"',
1633         'QUOT;': '"',
1634         'quot;': '"',
1635         'rAarr;': '\u21db',
1636         'race;': '\u223d\u0331',
1637         'Racute;': '\u0154',
1638         'racute;': '\u0155',
1639         'radic;': '\u221a',
1640         'raemptyv;': '\u29b3',
1641         'Rang;': '\u27eb',
1642         'rang;': '\u27e9',
1643         'rangd;': '\u2992',
1644         'range;': '\u29a5',
1645         'rangle;': '\u27e9',
1646         'raquo': '\xbb',
1647         'raquo;': '\xbb',
1648         'Rarr;': '\u21a0',
1649         'rArr;': '\u21d2',
1650         'rarr;': '\u2192',
1651         'rarrap;': '\u2975',
1652         'rarrb;': '\u21e5',
1653         'rarrbfs;': '\u2920',
1654         'rarrc;': '\u2933',
1655         'rarrfs;': '\u291e',
1656         'rarrhk;': '\u21aa',
1657         'rarrlp;': '\u21ac',
1658         'rarrpl;': '\u2945',
1659         'rarrsim;': '\u2974',
1660         'Rarrtl;': '\u2916',
1661         'rarrtl;': '\u21a3',
1662         'rarrw;': '\u219d',
1663         'rAtail;': '\u291c',
1664         'ratail;': '\u291a',
1665         'ratio;': '\u2236',
1666         'rationals;': '\u211a',
1667         'RBarr;': '\u2910',
1668         'rBarr;': '\u290f',
1669         'rbarr;': '\u290d',
1670         'rbbrk;': '\u2773',
1671         'rbrace;': '}',
1672         'rbrack;': ']',
1673         'rbrke;': '\u298c',
1674         'rbrksld;': '\u298e',
1675         'rbrkslu;': '\u2990',
1676         'Rcaron;': '\u0158',
1677         'rcaron;': '\u0159',
1678         'Rcedil;': '\u0156',
1679         'rcedil;': '\u0157',
1680         'rceil;': '\u2309',
1681         'rcub;': '}',
1682         'Rcy;': '\u0420',
1683         'rcy;': '\u0440',
1684         'rdca;': '\u2937',
1685         'rdldhar;': '\u2969',
1686         'rdquo;': '\u201d',
1687         'rdquor;': '\u201d',
1688         'rdsh;': '\u21b3',
1689         'Re;': '\u211c',
1690         'real;': '\u211c',
1691         'realine;': '\u211b',
1692         'realpart;': '\u211c',
1693         'reals;': '\u211d',
1694         'rect;': '\u25ad',
1695         'REG': '\xae',
1696         'reg': '\xae',
1697         'REG;': '\xae',
1698         'reg;': '\xae',
1699         'ReverseElement;': '\u220b',
1700         'ReverseEquilibrium;': '\u21cb',
1701         'ReverseUpEquilibrium;': '\u296f',
1702         'rfisht;': '\u297d',
1703         'rfloor;': '\u230b',
1704         'Rfr;': '\u211c',
1705         'rfr;': '\U0001d52f',
1706         'rHar;': '\u2964',
1707         'rhard;': '\u21c1',
1708         'rharu;': '\u21c0',
1709         'rharul;': '\u296c',
1710         'Rho;': '\u03a1',
1711         'rho;': '\u03c1',
1712         'rhov;': '\u03f1',
1713         'RightAngleBracket;': '\u27e9',
1714         'RightArrow;': '\u2192',
1715         'Rightarrow;': '\u21d2',
1716         'rightarrow;': '\u2192',
1717         'RightArrowBar;': '\u21e5',
1718         'RightArrowLeftArrow;': '\u21c4',
1719         'rightarrowtail;': '\u21a3',
1720         'RightCeiling;': '\u2309',
1721         'RightDoubleBracket;': '\u27e7',
1722         'RightDownTeeVector;': '\u295d',
1723         'RightDownVector;': '\u21c2',
1724         'RightDownVectorBar;': '\u2955',
1725         'RightFloor;': '\u230b',
1726         'rightharpoondown;': '\u21c1',
1727         'rightharpoonup;': '\u21c0',
1728         'rightleftarrows;': '\u21c4',
1729         'rightleftharpoons;': '\u21cc',
1730         'rightrightarrows;': '\u21c9',
1731         'rightsquigarrow;': '\u219d',
1732         'RightTee;': '\u22a2',
1733         'RightTeeArrow;': '\u21a6',
1734         'RightTeeVector;': '\u295b',
1735         'rightthreetimes;': '\u22cc',
1736         'RightTriangle;': '\u22b3',
1737         'RightTriangleBar;': '\u29d0',
1738         'RightTriangleEqual;': '\u22b5',
1739         'RightUpDownVector;': '\u294f',
1740         'RightUpTeeVector;': '\u295c',
1741         'RightUpVector;': '\u21be',
1742         'RightUpVectorBar;': '\u2954',
1743         'RightVector;': '\u21c0',
1744         'RightVectorBar;': '\u2953',
1745         'ring;': '\u02da',
1746         'risingdotseq;': '\u2253',
1747         'rlarr;': '\u21c4',
1748         'rlhar;': '\u21cc',
1749         'rlm;': '\u200f',
1750         'rmoust;': '\u23b1',
1751         'rmoustache;': '\u23b1',
1752         'rnmid;': '\u2aee',
1753         'roang;': '\u27ed',
1754         'roarr;': '\u21fe',
1755         'robrk;': '\u27e7',
1756         'ropar;': '\u2986',
1757         'Ropf;': '\u211d',
1758         'ropf;': '\U0001d563',
1759         'roplus;': '\u2a2e',
1760         'rotimes;': '\u2a35',
1761         'RoundImplies;': '\u2970',
1762         'rpar;': ')',
1763         'rpargt;': '\u2994',
1764         'rppolint;': '\u2a12',
1765         'rrarr;': '\u21c9',
1766         'Rrightarrow;': '\u21db',
1767         'rsaquo;': '\u203a',
1768         'Rscr;': '\u211b',
1769         'rscr;': '\U0001d4c7',
1770         'Rsh;': '\u21b1',
1771         'rsh;': '\u21b1',
1772         'rsqb;': ']',
1773         'rsquo;': '\u2019',
1774         'rsquor;': '\u2019',
1775         'rthree;': '\u22cc',
1776         'rtimes;': '\u22ca',
1777         'rtri;': '\u25b9',
1778         'rtrie;': '\u22b5',
1779         'rtrif;': '\u25b8',
1780         'rtriltri;': '\u29ce',
1781         'RuleDelayed;': '\u29f4',
1782         'ruluhar;': '\u2968',
1783         'rx;': '\u211e',
1784         'Sacute;': '\u015a',
1785         'sacute;': '\u015b',
1786         'sbquo;': '\u201a',
1787         'Sc;': '\u2abc',
1788         'sc;': '\u227b',
1789         'scap;': '\u2ab8',
1790         'Scaron;': '\u0160',
1791         'scaron;': '\u0161',
1792         'sccue;': '\u227d',
1793         'scE;': '\u2ab4',
1794         'sce;': '\u2ab0',
1795         'Scedil;': '\u015e',
1796         'scedil;': '\u015f',
1797         'Scirc;': '\u015c',
1798         'scirc;': '\u015d',
1799         'scnap;': '\u2aba',
1800         'scnE;': '\u2ab6',
1801         'scnsim;': '\u22e9',
1802         'scpolint;': '\u2a13',
1803         'scsim;': '\u227f',
1804         'Scy;': '\u0421',
1805         'scy;': '\u0441',
1806         'sdot;': '\u22c5',
1807         'sdotb;': '\u22a1',
1808         'sdote;': '\u2a66',
1809         'searhk;': '\u2925',
1810         'seArr;': '\u21d8',
1811         'searr;': '\u2198',
1812         'searrow;': '\u2198',
1813         'sect': '\xa7',
1814         'sect;': '\xa7',
1815         'semi;': ';',
1816         'seswar;': '\u2929',
1817         'setminus;': '\u2216',
1818         'setmn;': '\u2216',
1819         'sext;': '\u2736',
1820         'Sfr;': '\U0001d516',
1821         'sfr;': '\U0001d530',
1822         'sfrown;': '\u2322',
1823         'sharp;': '\u266f',
1824         'SHCHcy;': '\u0429',
1825         'shchcy;': '\u0449',
1826         'SHcy;': '\u0428',
1827         'shcy;': '\u0448',
1828         'ShortDownArrow;': '\u2193',
1829         'ShortLeftArrow;': '\u2190',
1830         'shortmid;': '\u2223',
1831         'shortparallel;': '\u2225',
1832         'ShortRightArrow;': '\u2192',
1833         'ShortUpArrow;': '\u2191',
1834         'shy': '\xad',
1835         'shy;': '\xad',
1836         'Sigma;': '\u03a3',
1837         'sigma;': '\u03c3',
1838         'sigmaf;': '\u03c2',
1839         'sigmav;': '\u03c2',
1840         'sim;': '\u223c',
1841         'simdot;': '\u2a6a',
1842         'sime;': '\u2243',
1843         'simeq;': '\u2243',
1844         'simg;': '\u2a9e',
1845         'simgE;': '\u2aa0',
1846         'siml;': '\u2a9d',
1847         'simlE;': '\u2a9f',
1848         'simne;': '\u2246',
1849         'simplus;': '\u2a24',
1850         'simrarr;': '\u2972',
1851         'slarr;': '\u2190',
1852         'SmallCircle;': '\u2218',
1853         'smallsetminus;': '\u2216',
1854         'smashp;': '\u2a33',
1855         'smeparsl;': '\u29e4',
1856         'smid;': '\u2223',
1857         'smile;': '\u2323',
1858         'smt;': '\u2aaa',
1859         'smte;': '\u2aac',
1860         'smtes;': '\u2aac\ufe00',
1861         'SOFTcy;': '\u042c',
1862         'softcy;': '\u044c',
1863         'sol;': '/',
1864         'solb;': '\u29c4',
1865         'solbar;': '\u233f',
1866         'Sopf;': '\U0001d54a',
1867         'sopf;': '\U0001d564',
1868         'spades;': '\u2660',
1869         'spadesuit;': '\u2660',
1870         'spar;': '\u2225',
1871         'sqcap;': '\u2293',
1872         'sqcaps;': '\u2293\ufe00',
1873         'sqcup;': '\u2294',
1874         'sqcups;': '\u2294\ufe00',
1875         'Sqrt;': '\u221a',
1876         'sqsub;': '\u228f',
1877         'sqsube;': '\u2291',
1878         'sqsubset;': '\u228f',
1879         'sqsubseteq;': '\u2291',
1880         'sqsup;': '\u2290',
1881         'sqsupe;': '\u2292',
1882         'sqsupset;': '\u2290',
1883         'sqsupseteq;': '\u2292',
1884         'squ;': '\u25a1',
1885         'Square;': '\u25a1',
1886         'square;': '\u25a1',
1887         'SquareIntersection;': '\u2293',
1888         'SquareSubset;': '\u228f',
1889         'SquareSubsetEqual;': '\u2291',
1890         'SquareSuperset;': '\u2290',
1891         'SquareSupersetEqual;': '\u2292',
1892         'SquareUnion;': '\u2294',
1893         'squarf;': '\u25aa',
1894         'squf;': '\u25aa',
1895         'srarr;': '\u2192',
1896         'Sscr;': '\U0001d4ae',
1897         'sscr;': '\U0001d4c8',
1898         'ssetmn;': '\u2216',
1899         'ssmile;': '\u2323',
1900         'sstarf;': '\u22c6',
1901         'Star;': '\u22c6',
1902         'star;': '\u2606',
1903         'starf;': '\u2605',
1904         'straightepsilon;': '\u03f5',
1905         'straightphi;': '\u03d5',
1906         'strns;': '\xaf',
1907         'Sub;': '\u22d0',
1908         'sub;': '\u2282',
1909         'subdot;': '\u2abd',
1910         'subE;': '\u2ac5',
1911         'sube;': '\u2286',
1912         'subedot;': '\u2ac3',
1913         'submult;': '\u2ac1',
1914         'subnE;': '\u2acb',
1915         'subne;': '\u228a',
1916         'subplus;': '\u2abf',
1917         'subrarr;': '\u2979',
1918         'Subset;': '\u22d0',
1919         'subset;': '\u2282',
1920         'subseteq;': '\u2286',
1921         'subseteqq;': '\u2ac5',
1922         'SubsetEqual;': '\u2286',
1923         'subsetneq;': '\u228a',
1924         'subsetneqq;': '\u2acb',
1925         'subsim;': '\u2ac7',
1926         'subsub;': '\u2ad5',
1927         'subsup;': '\u2ad3',
1928         'succ;': '\u227b',
1929         'succapprox;': '\u2ab8',
1930         'succcurlyeq;': '\u227d',
1931         'Succeeds;': '\u227b',
1932         'SucceedsEqual;': '\u2ab0',
1933         'SucceedsSlantEqual;': '\u227d',
1934         'SucceedsTilde;': '\u227f',
1935         'succeq;': '\u2ab0',
1936         'succnapprox;': '\u2aba',
1937         'succneqq;': '\u2ab6',
1938         'succnsim;': '\u22e9',
1939         'succsim;': '\u227f',
1940         'SuchThat;': '\u220b',
1941         'Sum;': '\u2211',
1942         'sum;': '\u2211',
1943         'sung;': '\u266a',
1944         'sup1': '\xb9',
1945         'sup1;': '\xb9',
1946         'sup2': '\xb2',
1947         'sup2;': '\xb2',
1948         'sup3': '\xb3',
1949         'sup3;': '\xb3',
1950         'Sup;': '\u22d1',
1951         'sup;': '\u2283',
1952         'supdot;': '\u2abe',
1953         'supdsub;': '\u2ad8',
1954         'supE;': '\u2ac6',
1955         'supe;': '\u2287',
1956         'supedot;': '\u2ac4',
1957         'Superset;': '\u2283',
1958         'SupersetEqual;': '\u2287',
1959         'suphsol;': '\u27c9',
1960         'suphsub;': '\u2ad7',
1961         'suplarr;': '\u297b',
1962         'supmult;': '\u2ac2',
1963         'supnE;': '\u2acc',
1964         'supne;': '\u228b',
1965         'supplus;': '\u2ac0',
1966         'Supset;': '\u22d1',
1967         'supset;': '\u2283',
1968         'supseteq;': '\u2287',
1969         'supseteqq;': '\u2ac6',
1970         'supsetneq;': '\u228b',
1971         'supsetneqq;': '\u2acc',
1972         'supsim;': '\u2ac8',
1973         'supsub;': '\u2ad4',
1974         'supsup;': '\u2ad6',
1975         'swarhk;': '\u2926',
1976         'swArr;': '\u21d9',
1977         'swarr;': '\u2199',
1978         'swarrow;': '\u2199',
1979         'swnwar;': '\u292a',
1980         'szlig': '\xdf',
1981         'szlig;': '\xdf',
1982         'Tab;': '\t',
1983         'target;': '\u2316',
1984         'Tau;': '\u03a4',
1985         'tau;': '\u03c4',
1986         'tbrk;': '\u23b4',
1987         'Tcaron;': '\u0164',
1988         'tcaron;': '\u0165',
1989         'Tcedil;': '\u0162',
1990         'tcedil;': '\u0163',
1991         'Tcy;': '\u0422',
1992         'tcy;': '\u0442',
1993         'tdot;': '\u20db',
1994         'telrec;': '\u2315',
1995         'Tfr;': '\U0001d517',
1996         'tfr;': '\U0001d531',
1997         'there4;': '\u2234',
1998         'Therefore;': '\u2234',
1999         'therefore;': '\u2234',
2000         'Theta;': '\u0398',
2001         'theta;': '\u03b8',
2002         'thetasym;': '\u03d1',
2003         'thetav;': '\u03d1',
2004         'thickapprox;': '\u2248',
2005         'thicksim;': '\u223c',
2006         'ThickSpace;': '\u205f\u200a',
2007         'thinsp;': '\u2009',
2008         'ThinSpace;': '\u2009',
2009         'thkap;': '\u2248',
2010         'thksim;': '\u223c',
2011         'THORN': '\xde',
2012         'thorn': '\xfe',
2013         'THORN;': '\xde',
2014         'thorn;': '\xfe',
2015         'Tilde;': '\u223c',
2016         'tilde;': '\u02dc',
2017         'TildeEqual;': '\u2243',
2018         'TildeFullEqual;': '\u2245',
2019         'TildeTilde;': '\u2248',
2020         'times': '\xd7',
2021         'times;': '\xd7',
2022         'timesb;': '\u22a0',
2023         'timesbar;': '\u2a31',
2024         'timesd;': '\u2a30',
2025         'tint;': '\u222d',
2026         'toea;': '\u2928',
2027         'top;': '\u22a4',
2028         'topbot;': '\u2336',
2029         'topcir;': '\u2af1',
2030         'Topf;': '\U0001d54b',
2031         'topf;': '\U0001d565',
2032         'topfork;': '\u2ada',
2033         'tosa;': '\u2929',
2034         'tprime;': '\u2034',
2035         'TRADE;': '\u2122',
2036         'trade;': '\u2122',
2037         'triangle;': '\u25b5',
2038         'triangledown;': '\u25bf',
2039         'triangleleft;': '\u25c3',
2040         'trianglelefteq;': '\u22b4',
2041         'triangleq;': '\u225c',
2042         'triangleright;': '\u25b9',
2043         'trianglerighteq;': '\u22b5',
2044         'tridot;': '\u25ec',
2045         'trie;': '\u225c',
2046         'triminus;': '\u2a3a',
2047         'TripleDot;': '\u20db',
2048         'triplus;': '\u2a39',
2049         'trisb;': '\u29cd',
2050         'tritime;': '\u2a3b',
2051         'trpezium;': '\u23e2',
2052         'Tscr;': '\U0001d4af',
2053         'tscr;': '\U0001d4c9',
2054         'TScy;': '\u0426',
2055         'tscy;': '\u0446',
2056         'TSHcy;': '\u040b',
2057         'tshcy;': '\u045b',
2058         'Tstrok;': '\u0166',
2059         'tstrok;': '\u0167',
2060         'twixt;': '\u226c',
2061         'twoheadleftarrow;': '\u219e',
2062         'twoheadrightarrow;': '\u21a0',
2063         'Uacute': '\xda',
2064         'uacute': '\xfa',
2065         'Uacute;': '\xda',
2066         'uacute;': '\xfa',
2067         'Uarr;': '\u219f',
2068         'uArr;': '\u21d1',
2069         'uarr;': '\u2191',
2070         'Uarrocir;': '\u2949',
2071         'Ubrcy;': '\u040e',
2072         'ubrcy;': '\u045e',
2073         'Ubreve;': '\u016c',
2074         'ubreve;': '\u016d',
2075         'Ucirc': '\xdb',
2076         'ucirc': '\xfb',
2077         'Ucirc;': '\xdb',
2078         'ucirc;': '\xfb',
2079         'Ucy;': '\u0423',
2080         'ucy;': '\u0443',
2081         'udarr;': '\u21c5',
2082         'Udblac;': '\u0170',
2083         'udblac;': '\u0171',
2084         'udhar;': '\u296e',
2085         'ufisht;': '\u297e',
2086         'Ufr;': '\U0001d518',
2087         'ufr;': '\U0001d532',
2088         'Ugrave': '\xd9',
2089         'ugrave': '\xf9',
2090         'Ugrave;': '\xd9',
2091         'ugrave;': '\xf9',
2092         'uHar;': '\u2963',
2093         'uharl;': '\u21bf',
2094         'uharr;': '\u21be',
2095         'uhblk;': '\u2580',
2096         'ulcorn;': '\u231c',
2097         'ulcorner;': '\u231c',
2098         'ulcrop;': '\u230f',
2099         'ultri;': '\u25f8',
2100         'Umacr;': '\u016a',
2101         'umacr;': '\u016b',
2102         'uml': '\xa8',
2103         'uml;': '\xa8',
2104         'UnderBar;': '_',
2105         'UnderBrace;': '\u23df',
2106         'UnderBracket;': '\u23b5',
2107         'UnderParenthesis;': '\u23dd',
2108         'Union;': '\u22c3',
2109         'UnionPlus;': '\u228e',
2110         'Uogon;': '\u0172',
2111         'uogon;': '\u0173',
2112         'Uopf;': '\U0001d54c',
2113         'uopf;': '\U0001d566',
2114         'UpArrow;': '\u2191',
2115         'Uparrow;': '\u21d1',
2116         'uparrow;': '\u2191',
2117         'UpArrowBar;': '\u2912',
2118         'UpArrowDownArrow;': '\u21c5',
2119         'UpDownArrow;': '\u2195',
2120         'Updownarrow;': '\u21d5',
2121         'updownarrow;': '\u2195',
2122         'UpEquilibrium;': '\u296e',
2123         'upharpoonleft;': '\u21bf',
2124         'upharpoonright;': '\u21be',
2125         'uplus;': '\u228e',
2126         'UpperLeftArrow;': '\u2196',
2127         'UpperRightArrow;': '\u2197',
2128         'Upsi;': '\u03d2',
2129         'upsi;': '\u03c5',
2130         'upsih;': '\u03d2',
2131         'Upsilon;': '\u03a5',
2132         'upsilon;': '\u03c5',
2133         'UpTee;': '\u22a5',
2134         'UpTeeArrow;': '\u21a5',
2135         'upuparrows;': '\u21c8',
2136         'urcorn;': '\u231d',
2137         'urcorner;': '\u231d',
2138         'urcrop;': '\u230e',
2139         'Uring;': '\u016e',
2140         'uring;': '\u016f',
2141         'urtri;': '\u25f9',
2142         'Uscr;': '\U0001d4b0',
2143         'uscr;': '\U0001d4ca',
2144         'utdot;': '\u22f0',
2145         'Utilde;': '\u0168',
2146         'utilde;': '\u0169',
2147         'utri;': '\u25b5',
2148         'utrif;': '\u25b4',
2149         'uuarr;': '\u21c8',
2150         'Uuml': '\xdc',
2151         'uuml': '\xfc',
2152         'Uuml;': '\xdc',
2153         'uuml;': '\xfc',
2154         'uwangle;': '\u29a7',
2155         'vangrt;': '\u299c',
2156         'varepsilon;': '\u03f5',
2157         'varkappa;': '\u03f0',
2158         'varnothing;': '\u2205',
2159         'varphi;': '\u03d5',
2160         'varpi;': '\u03d6',
2161         'varpropto;': '\u221d',
2162         'vArr;': '\u21d5',
2163         'varr;': '\u2195',
2164         'varrho;': '\u03f1',
2165         'varsigma;': '\u03c2',
2166         'varsubsetneq;': '\u228a\ufe00',
2167         'varsubsetneqq;': '\u2acb\ufe00',
2168         'varsupsetneq;': '\u228b\ufe00',
2169         'varsupsetneqq;': '\u2acc\ufe00',
2170         'vartheta;': '\u03d1',
2171         'vartriangleleft;': '\u22b2',
2172         'vartriangleright;': '\u22b3',
2173         'Vbar;': '\u2aeb',
2174         'vBar;': '\u2ae8',
2175         'vBarv;': '\u2ae9',
2176         'Vcy;': '\u0412',
2177         'vcy;': '\u0432',
2178         'VDash;': '\u22ab',
2179         'Vdash;': '\u22a9',
2180         'vDash;': '\u22a8',
2181         'vdash;': '\u22a2',
2182         'Vdashl;': '\u2ae6',
2183         'Vee;': '\u22c1',
2184         'vee;': '\u2228',
2185         'veebar;': '\u22bb',
2186         'veeeq;': '\u225a',
2187         'vellip;': '\u22ee',
2188         'Verbar;': '\u2016',
2189         'verbar;': '|',
2190         'Vert;': '\u2016',
2191         'vert;': '|',
2192         'VerticalBar;': '\u2223',
2193         'VerticalLine;': '|',
2194         'VerticalSeparator;': '\u2758',
2195         'VerticalTilde;': '\u2240',
2196         'VeryThinSpace;': '\u200a',
2197         'Vfr;': '\U0001d519',
2198         'vfr;': '\U0001d533',
2199         'vltri;': '\u22b2',
2200         'vnsub;': '\u2282\u20d2',
2201         'vnsup;': '\u2283\u20d2',
2202         'Vopf;': '\U0001d54d',
2203         'vopf;': '\U0001d567',
2204         'vprop;': '\u221d',
2205         'vrtri;': '\u22b3',
2206         'Vscr;': '\U0001d4b1',
2207         'vscr;': '\U0001d4cb',
2208         'vsubnE;': '\u2acb\ufe00',
2209         'vsubne;': '\u228a\ufe00',
2210         'vsupnE;': '\u2acc\ufe00',
2211         'vsupne;': '\u228b\ufe00',
2212         'Vvdash;': '\u22aa',
2213         'vzigzag;': '\u299a',
2214         'Wcirc;': '\u0174',
2215         'wcirc;': '\u0175',
2216         'wedbar;': '\u2a5f',
2217         'Wedge;': '\u22c0',
2218         'wedge;': '\u2227',
2219         'wedgeq;': '\u2259',
2220         'weierp;': '\u2118',
2221         'Wfr;': '\U0001d51a',
2222         'wfr;': '\U0001d534',
2223         'Wopf;': '\U0001d54e',
2224         'wopf;': '\U0001d568',
2225         'wp;': '\u2118',
2226         'wr;': '\u2240',
2227         'wreath;': '\u2240',
2228         'Wscr;': '\U0001d4b2',
2229         'wscr;': '\U0001d4cc',
2230         'xcap;': '\u22c2',
2231         'xcirc;': '\u25ef',
2232         'xcup;': '\u22c3',
2233         'xdtri;': '\u25bd',
2234         'Xfr;': '\U0001d51b',
2235         'xfr;': '\U0001d535',
2236         'xhArr;': '\u27fa',
2237         'xharr;': '\u27f7',
2238         'Xi;': '\u039e',
2239         'xi;': '\u03be',
2240         'xlArr;': '\u27f8',
2241         'xlarr;': '\u27f5',
2242         'xmap;': '\u27fc',
2243         'xnis;': '\u22fb',
2244         'xodot;': '\u2a00',
2245         'Xopf;': '\U0001d54f',
2246         'xopf;': '\U0001d569',
2247         'xoplus;': '\u2a01',
2248         'xotime;': '\u2a02',
2249         'xrArr;': '\u27f9',
2250         'xrarr;': '\u27f6',
2251         'Xscr;': '\U0001d4b3',
2252         'xscr;': '\U0001d4cd',
2253         'xsqcup;': '\u2a06',
2254         'xuplus;': '\u2a04',
2255         'xutri;': '\u25b3',
2256         'xvee;': '\u22c1',
2257         'xwedge;': '\u22c0',
2258         'Yacute': '\xdd',
2259         'yacute': '\xfd',
2260         'Yacute;': '\xdd',
2261         'yacute;': '\xfd',
2262         'YAcy;': '\u042f',
2263         'yacy;': '\u044f',
2264         'Ycirc;': '\u0176',
2265         'ycirc;': '\u0177',
2266         'Ycy;': '\u042b',
2267         'ycy;': '\u044b',
2268         'yen': '\xa5',
2269         'yen;': '\xa5',
2270         'Yfr;': '\U0001d51c',
2271         'yfr;': '\U0001d536',
2272         'YIcy;': '\u0407',
2273         'yicy;': '\u0457',
2274         'Yopf;': '\U0001d550',
2275         'yopf;': '\U0001d56a',
2276         'Yscr;': '\U0001d4b4',
2277         'yscr;': '\U0001d4ce',
2278         'YUcy;': '\u042e',
2279         'yucy;': '\u044e',
2280         'yuml': '\xff',
2281         'Yuml;': '\u0178',
2282         'yuml;': '\xff',
2283         'Zacute;': '\u0179',
2284         'zacute;': '\u017a',
2285         'Zcaron;': '\u017d',
2286         'zcaron;': '\u017e',
2287         'Zcy;': '\u0417',
2288         'zcy;': '\u0437',
2289         'Zdot;': '\u017b',
2290         'zdot;': '\u017c',
2291         'zeetrf;': '\u2128',
2292         'ZeroWidthSpace;': '\u200b',
2293         'Zeta;': '\u0396',
2294         'zeta;': '\u03b6',
2295         'Zfr;': '\u2128',
2296         'zfr;': '\U0001d537',
2297         'ZHcy;': '\u0416',
2298         'zhcy;': '\u0436',
2299         'zigrarr;': '\u21dd',
2300         'Zopf;': '\u2124',
2301         'zopf;': '\U0001d56b',
2302         'Zscr;': '\U0001d4b5',
2303         'zscr;': '\U0001d4cf',
2304         'zwj;': '\u200d',
2305         'zwnj;': '\u200c',
2306     }
2307
2308 try:
2309     import http.client as compat_http_client
2310 except ImportError:  # Python 2
2311     import httplib as compat_http_client
2312
2313 try:
2314     from urllib.error import HTTPError as compat_HTTPError
2315 except ImportError:  # Python 2
2316     from urllib2 import HTTPError as compat_HTTPError
2317
2318 try:
2319     from urllib.request import urlretrieve as compat_urlretrieve
2320 except ImportError:  # Python 2
2321     from urllib import urlretrieve as compat_urlretrieve
2322
2323 try:
2324     from html.parser import HTMLParser as compat_HTMLParser
2325 except ImportError:  # Python 2
2326     from HTMLParser import HTMLParser as compat_HTMLParser
2327
2328 try:  # Python 2
2329     from HTMLParser import HTMLParseError as compat_HTMLParseError
2330 except ImportError:  # Python <3.4
2331     try:
2332         from html.parser import HTMLParseError as compat_HTMLParseError
2333     except ImportError:  # Python >3.4
2334
2335         # HTMLParseError has been deprecated in Python 3.3 and removed in
2336         # Python 3.5. Introducing dummy exception for Python >3.5 for compatible
2337         # and uniform cross-version exceptiong handling
2338         class compat_HTMLParseError(Exception):
2339             pass
2340
2341 try:
2342     from subprocess import DEVNULL
2343     compat_subprocess_get_DEVNULL = lambda: DEVNULL
2344 except ImportError:
2345     compat_subprocess_get_DEVNULL = lambda: open(os.path.devnull, 'w')
2346
2347 try:
2348     import http.server as compat_http_server
2349 except ImportError:
2350     import BaseHTTPServer as compat_http_server
2351
2352 try:
2353     compat_str = unicode  # Python 2
2354 except NameError:
2355     compat_str = str
2356
2357 try:
2358     from urllib.parse import unquote_to_bytes as compat_urllib_parse_unquote_to_bytes
2359     from urllib.parse import unquote as compat_urllib_parse_unquote
2360     from urllib.parse import unquote_plus as compat_urllib_parse_unquote_plus
2361 except ImportError:  # Python 2
2362     _asciire = (compat_urllib_parse._asciire if hasattr(compat_urllib_parse, '_asciire')
2363                 else re.compile(r'([\x00-\x7f]+)'))
2364
2365     # HACK: The following are the correct unquote_to_bytes, unquote and unquote_plus
2366     # implementations from cpython 3.4.3's stdlib. Python 2's version
2367     # is apparently broken (see https://github.com/ytdl-org/youtube-dl/pull/6244)
2368
2369     def compat_urllib_parse_unquote_to_bytes(string):
2370         """unquote_to_bytes('abc%20def') -> b'abc def'."""
2371         # Note: strings are encoded as UTF-8. This is only an issue if it contains
2372         # unescaped non-ASCII characters, which URIs should not.
2373         if not string:
2374             # Is it a string-like object?
2375             string.split
2376             return b''
2377         if isinstance(string, compat_str):
2378             string = string.encode('utf-8')
2379         bits = string.split(b'%')
2380         if len(bits) == 1:
2381             return string
2382         res = [bits[0]]
2383         append = res.append
2384         for item in bits[1:]:
2385             try:
2386                 append(compat_urllib_parse._hextochr[item[:2]])
2387                 append(item[2:])
2388             except KeyError:
2389                 append(b'%')
2390                 append(item)
2391         return b''.join(res)
2392
2393     def compat_urllib_parse_unquote(string, encoding='utf-8', errors='replace'):
2394         """Replace %xx escapes by their single-character equivalent. The optional
2395         encoding and errors parameters specify how to decode percent-encoded
2396         sequences into Unicode characters, as accepted by the bytes.decode()
2397         method.
2398         By default, percent-encoded sequences are decoded with UTF-8, and invalid
2399         sequences are replaced by a placeholder character.
2400
2401         unquote('abc%20def') -> 'abc def'.
2402         """
2403         if '%' not in string:
2404             string.split
2405             return string
2406         if encoding is None:
2407             encoding = 'utf-8'
2408         if errors is None:
2409             errors = 'replace'
2410         bits = _asciire.split(string)
2411         res = [bits[0]]
2412         append = res.append
2413         for i in range(1, len(bits), 2):
2414             append(compat_urllib_parse_unquote_to_bytes(bits[i]).decode(encoding, errors))
2415             append(bits[i + 1])
2416         return ''.join(res)
2417
2418     def compat_urllib_parse_unquote_plus(string, encoding='utf-8', errors='replace'):
2419         """Like unquote(), but also replace plus signs by spaces, as required for
2420         unquoting HTML form values.
2421
2422         unquote_plus('%7e/abc+def') -> '~/abc def'
2423         """
2424         string = string.replace('+', ' ')
2425         return compat_urllib_parse_unquote(string, encoding, errors)
2426
2427 try:
2428     from urllib.parse import urlencode as compat_urllib_parse_urlencode
2429 except ImportError:  # Python 2
2430     # Python 2 will choke in urlencode on mixture of byte and unicode strings.
2431     # Possible solutions are to either port it from python 3 with all
2432     # the friends or manually ensure input query contains only byte strings.
2433     # We will stick with latter thus recursively encoding the whole query.
2434     def compat_urllib_parse_urlencode(query, doseq=0, encoding='utf-8'):
2435         def encode_elem(e):
2436             if isinstance(e, dict):
2437                 e = encode_dict(e)
2438             elif isinstance(e, (list, tuple,)):
2439                 list_e = encode_list(e)
2440                 e = tuple(list_e) if isinstance(e, tuple) else list_e
2441             elif isinstance(e, compat_str):
2442                 e = e.encode(encoding)
2443             return e
2444
2445         def encode_dict(d):
2446             return dict((encode_elem(k), encode_elem(v)) for k, v in d.items())
2447
2448         def encode_list(l):
2449             return [encode_elem(e) for e in l]
2450
2451         return compat_urllib_parse.urlencode(encode_elem(query), doseq=doseq)
2452
2453 try:
2454     from urllib.request import DataHandler as compat_urllib_request_DataHandler
2455 except ImportError:  # Python < 3.4
2456     # Ported from CPython 98774:1733b3bd46db, Lib/urllib/request.py
2457     class compat_urllib_request_DataHandler(compat_urllib_request.BaseHandler):
2458         def data_open(self, req):
2459             # data URLs as specified in RFC 2397.
2460             #
2461             # ignores POSTed data
2462             #
2463             # syntax:
2464             # dataurl   := "data:" [ mediatype ] [ ";base64" ] "," data
2465             # mediatype := [ type "/" subtype ] *( ";" parameter )
2466             # data      := *urlchar
2467             # parameter := attribute "=" value
2468             url = req.get_full_url()
2469
2470             scheme, data = url.split(':', 1)
2471             mediatype, data = data.split(',', 1)
2472
2473             # even base64 encoded data URLs might be quoted so unquote in any case:
2474             data = compat_urllib_parse_unquote_to_bytes(data)
2475             if mediatype.endswith(';base64'):
2476                 data = binascii.a2b_base64(data)
2477                 mediatype = mediatype[:-7]
2478
2479             if not mediatype:
2480                 mediatype = 'text/plain;charset=US-ASCII'
2481
2482             headers = email.message_from_string(
2483                 'Content-type: %s\nContent-length: %d\n' % (mediatype, len(data)))
2484
2485             return compat_urllib_response.addinfourl(io.BytesIO(data), headers, url)
2486
2487 try:
2488     compat_basestring = basestring  # Python 2
2489 except NameError:
2490     compat_basestring = str
2491
2492 try:
2493     compat_chr = unichr  # Python 2
2494 except NameError:
2495     compat_chr = chr
2496
2497 try:
2498     from xml.etree.ElementTree import ParseError as compat_xml_parse_error
2499 except ImportError:  # Python 2.6
2500     from xml.parsers.expat import ExpatError as compat_xml_parse_error
2501
2502
2503 etree = xml.etree.ElementTree
2504
2505
2506 class _TreeBuilder(etree.TreeBuilder):
2507     def doctype(self, name, pubid, system):
2508         pass
2509
2510
2511 try:
2512     # xml.etree.ElementTree.Element is a method in Python <=2.6 and
2513     # the following will crash with:
2514     #  TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types
2515     isinstance(None, xml.etree.ElementTree.Element)
2516     from xml.etree.ElementTree import Element as compat_etree_Element
2517 except TypeError:  # Python <=2.6
2518     from xml.etree.ElementTree import _ElementInterface as compat_etree_Element
2519
2520 if sys.version_info[0] >= 3:
2521     def compat_etree_fromstring(text):
2522         return etree.XML(text, parser=etree.XMLParser(target=_TreeBuilder()))
2523 else:
2524     # python 2.x tries to encode unicode strings with ascii (see the
2525     # XMLParser._fixtext method)
2526     try:
2527         _etree_iter = etree.Element.iter
2528     except AttributeError:  # Python <=2.6
2529         def _etree_iter(root):
2530             for el in root.findall('*'):
2531                 yield el
2532                 for sub in _etree_iter(el):
2533                     yield sub
2534
2535     # on 2.6 XML doesn't have a parser argument, function copied from CPython
2536     # 2.7 source
2537     def _XML(text, parser=None):
2538         if not parser:
2539             parser = etree.XMLParser(target=_TreeBuilder())
2540         parser.feed(text)
2541         return parser.close()
2542
2543     def _element_factory(*args, **kwargs):
2544         el = etree.Element(*args, **kwargs)
2545         for k, v in el.items():
2546             if isinstance(v, bytes):
2547                 el.set(k, v.decode('utf-8'))
2548         return el
2549
2550     def compat_etree_fromstring(text):
2551         doc = _XML(text, parser=etree.XMLParser(target=_TreeBuilder(element_factory=_element_factory)))
2552         for el in _etree_iter(doc):
2553             if el.text is not None and isinstance(el.text, bytes):
2554                 el.text = el.text.decode('utf-8')
2555         return doc
2556
2557 if hasattr(etree, 'register_namespace'):
2558     compat_etree_register_namespace = etree.register_namespace
2559 else:
2560     def compat_etree_register_namespace(prefix, uri):
2561         """Register a namespace prefix.
2562         The registry is global, and any existing mapping for either the
2563         given prefix or the namespace URI will be removed.
2564         *prefix* is the namespace prefix, *uri* is a namespace uri. Tags and
2565         attributes in this namespace will be serialized with prefix if possible.
2566         ValueError is raised if prefix is reserved or is invalid.
2567         """
2568         if re.match(r"ns\d+$", prefix):
2569             raise ValueError("Prefix format reserved for internal use")
2570         for k, v in list(etree._namespace_map.items()):
2571             if k == uri or v == prefix:
2572                 del etree._namespace_map[k]
2573         etree._namespace_map[uri] = prefix
2574
2575 if sys.version_info < (2, 7):
2576     # Here comes the crazy part: In 2.6, if the xpath is a unicode,
2577     # .//node does not match if a node is a direct child of . !
2578     def compat_xpath(xpath):
2579         if isinstance(xpath, compat_str):
2580             xpath = xpath.encode('ascii')
2581         return xpath
2582 else:
2583     compat_xpath = lambda xpath: xpath
2584
2585 try:
2586     from urllib.parse import parse_qs as compat_parse_qs
2587 except ImportError:  # Python 2
2588     # HACK: The following is the correct parse_qs implementation from cpython 3's stdlib.
2589     # Python 2's version is apparently totally broken
2590
2591     def _parse_qsl(qs, keep_blank_values=False, strict_parsing=False,
2592                    encoding='utf-8', errors='replace'):
2593         qs, _coerce_result = qs, compat_str
2594         pairs = [s2 for s1 in qs.split('&') for s2 in s1.split(';')]
2595         r = []
2596         for name_value in pairs:
2597             if not name_value and not strict_parsing:
2598                 continue
2599             nv = name_value.split('=', 1)
2600             if len(nv) != 2:
2601                 if strict_parsing:
2602                     raise ValueError('bad query field: %r' % (name_value,))
2603                 # Handle case of a control-name with no equal sign
2604                 if keep_blank_values:
2605                     nv.append('')
2606                 else:
2607                     continue
2608             if len(nv[1]) or keep_blank_values:
2609                 name = nv[0].replace('+', ' ')
2610                 name = compat_urllib_parse_unquote(
2611                     name, encoding=encoding, errors=errors)
2612                 name = _coerce_result(name)
2613                 value = nv[1].replace('+', ' ')
2614                 value = compat_urllib_parse_unquote(
2615                     value, encoding=encoding, errors=errors)
2616                 value = _coerce_result(value)
2617                 r.append((name, value))
2618         return r
2619
2620     def compat_parse_qs(qs, keep_blank_values=False, strict_parsing=False,
2621                         encoding='utf-8', errors='replace'):
2622         parsed_result = {}
2623         pairs = _parse_qsl(qs, keep_blank_values, strict_parsing,
2624                            encoding=encoding, errors=errors)
2625         for name, value in pairs:
2626             if name in parsed_result:
2627                 parsed_result[name].append(value)
2628             else:
2629                 parsed_result[name] = [value]
2630         return parsed_result
2631
2632
2633 compat_os_name = os._name if os.name == 'java' else os.name
2634
2635
2636 if compat_os_name == 'nt':
2637     def compat_shlex_quote(s):
2638         return s if re.match(r'^[-_\w./]+$', s) else '"%s"' % s.replace('"', '\\"')
2639 else:
2640     try:
2641         from shlex import quote as compat_shlex_quote
2642     except ImportError:  # Python < 3.3
2643         def compat_shlex_quote(s):
2644             if re.match(r'^[-_\w./]+$', s):
2645                 return s
2646             else:
2647                 return "'" + s.replace("'", "'\"'\"'") + "'"
2648
2649
2650 try:
2651     args = shlex.split('中文')
2652     assert (isinstance(args, list) and
2653             isinstance(args[0], compat_str) and
2654             args[0] == '中文')
2655     compat_shlex_split = shlex.split
2656 except (AssertionError, UnicodeEncodeError):
2657     # Working around shlex issue with unicode strings on some python 2
2658     # versions (see http://bugs.python.org/issue1548891)
2659     def compat_shlex_split(s, comments=False, posix=True):
2660         if isinstance(s, compat_str):
2661             s = s.encode('utf-8')
2662         return list(map(lambda s: s.decode('utf-8'), shlex.split(s, comments, posix)))
2663
2664
2665 def compat_ord(c):
2666     if type(c) is int:
2667         return c
2668     else:
2669         return ord(c)
2670
2671
2672 if sys.version_info >= (3, 0):
2673     compat_getenv = os.getenv
2674     compat_expanduser = os.path.expanduser
2675
2676     def compat_setenv(key, value, env=os.environ):
2677         env[key] = value
2678 else:
2679     # Environment variables should be decoded with filesystem encoding.
2680     # Otherwise it will fail if any non-ASCII characters present (see #3854 #3217 #2918)
2681
2682     def compat_getenv(key, default=None):
2683         from .utils import get_filesystem_encoding
2684         env = os.getenv(key, default)
2685         if env:
2686             env = env.decode(get_filesystem_encoding())
2687         return env
2688
2689     def compat_setenv(key, value, env=os.environ):
2690         def encode(v):
2691             from .utils import get_filesystem_encoding
2692             return v.encode(get_filesystem_encoding()) if isinstance(v, compat_str) else v
2693         env[encode(key)] = encode(value)
2694
2695     # HACK: The default implementations of os.path.expanduser from cpython do not decode
2696     # environment variables with filesystem encoding. We will work around this by
2697     # providing adjusted implementations.
2698     # The following are os.path.expanduser implementations from cpython 2.7.8 stdlib
2699     # for different platforms with correct environment variables decoding.
2700
2701     if compat_os_name == 'posix':
2702         def compat_expanduser(path):
2703             """Expand ~ and ~user constructions.  If user or $HOME is unknown,
2704             do nothing."""
2705             if not path.startswith('~'):
2706                 return path
2707             i = path.find('/', 1)
2708             if i < 0:
2709                 i = len(path)
2710             if i == 1:
2711                 if 'HOME' not in os.environ:
2712                     import pwd
2713                     userhome = pwd.getpwuid(os.getuid()).pw_dir
2714                 else:
2715                     userhome = compat_getenv('HOME')
2716             else:
2717                 import pwd
2718                 try:
2719                     pwent = pwd.getpwnam(path[1:i])
2720                 except KeyError:
2721                     return path
2722                 userhome = pwent.pw_dir
2723             userhome = userhome.rstrip('/')
2724             return (userhome + path[i:]) or '/'
2725     elif compat_os_name in ('nt', 'ce'):
2726         def compat_expanduser(path):
2727             """Expand ~ and ~user constructs.
2728
2729             If user or $HOME is unknown, do nothing."""
2730             if path[:1] != '~':
2731                 return path
2732             i, n = 1, len(path)
2733             while i < n and path[i] not in '/\\':
2734                 i = i + 1
2735
2736             if 'HOME' in os.environ:
2737                 userhome = compat_getenv('HOME')
2738             elif 'USERPROFILE' in os.environ:
2739                 userhome = compat_getenv('USERPROFILE')
2740             elif 'HOMEPATH' not in os.environ:
2741                 return path
2742             else:
2743                 try:
2744                     drive = compat_getenv('HOMEDRIVE')
2745                 except KeyError:
2746                     drive = ''
2747                 userhome = os.path.join(drive, compat_getenv('HOMEPATH'))
2748
2749             if i != 1:  # ~user
2750                 userhome = os.path.join(os.path.dirname(userhome), path[1:i])
2751
2752             return userhome + path[i:]
2753     else:
2754         compat_expanduser = os.path.expanduser
2755
2756
2757 if sys.version_info < (3, 0):
2758     def compat_print(s):
2759         from .utils import preferredencoding
2760         print(s.encode(preferredencoding(), 'xmlcharrefreplace'))
2761 else:
2762     def compat_print(s):
2763         assert isinstance(s, compat_str)
2764         print(s)
2765
2766
2767 if sys.version_info < (3, 0) and sys.platform == 'win32':
2768     def compat_getpass(prompt, *args, **kwargs):
2769         if isinstance(prompt, compat_str):
2770             from .utils import preferredencoding
2771             prompt = prompt.encode(preferredencoding())
2772         return getpass.getpass(prompt, *args, **kwargs)
2773 else:
2774     compat_getpass = getpass.getpass
2775
2776 try:
2777     compat_input = raw_input
2778 except NameError:  # Python 3
2779     compat_input = input
2780
2781 # Python < 2.6.5 require kwargs to be bytes
2782 try:
2783     def _testfunc(x):
2784         pass
2785     _testfunc(**{'x': 0})
2786 except TypeError:
2787     def compat_kwargs(kwargs):
2788         return dict((bytes(k), v) for k, v in kwargs.items())
2789 else:
2790     compat_kwargs = lambda kwargs: kwargs
2791
2792
2793 try:
2794     compat_numeric_types = (int, float, long, complex)
2795 except NameError:  # Python 3
2796     compat_numeric_types = (int, float, complex)
2797
2798
2799 try:
2800     compat_integer_types = (int, long)
2801 except NameError:  # Python 3
2802     compat_integer_types = (int, )
2803
2804
2805 if sys.version_info < (2, 7):
2806     def compat_socket_create_connection(address, timeout, source_address=None):
2807         host, port = address
2808         err = None
2809         for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM):
2810             af, socktype, proto, canonname, sa = res
2811             sock = None
2812             try:
2813                 sock = socket.socket(af, socktype, proto)
2814                 sock.settimeout(timeout)
2815                 if source_address:
2816                     sock.bind(source_address)
2817                 sock.connect(sa)
2818                 return sock
2819             except socket.error as _:
2820                 err = _
2821                 if sock is not None:
2822                     sock.close()
2823         if err is not None:
2824             raise err
2825         else:
2826             raise socket.error('getaddrinfo returns an empty list')
2827 else:
2828     compat_socket_create_connection = socket.create_connection
2829
2830
2831 # Fix https://github.com/ytdl-org/youtube-dl/issues/4223
2832 # See http://bugs.python.org/issue9161 for what is broken
2833 def workaround_optparse_bug9161():
2834     op = optparse.OptionParser()
2835     og = optparse.OptionGroup(op, 'foo')
2836     try:
2837         og.add_option('-t')
2838     except TypeError:
2839         real_add_option = optparse.OptionGroup.add_option
2840
2841         def _compat_add_option(self, *args, **kwargs):
2842             enc = lambda v: (
2843                 v.encode('ascii', 'replace') if isinstance(v, compat_str)
2844                 else v)
2845             bargs = [enc(a) for a in args]
2846             bkwargs = dict(
2847                 (k, enc(v)) for k, v in kwargs.items())
2848             return real_add_option(self, *bargs, **bkwargs)
2849         optparse.OptionGroup.add_option = _compat_add_option
2850
2851
2852 if hasattr(shutil, 'get_terminal_size'):  # Python >= 3.3
2853     compat_get_terminal_size = shutil.get_terminal_size
2854 else:
2855     _terminal_size = collections.namedtuple('terminal_size', ['columns', 'lines'])
2856
2857     def compat_get_terminal_size(fallback=(80, 24)):
2858         columns = compat_getenv('COLUMNS')
2859         if columns:
2860             columns = int(columns)
2861         else:
2862             columns = None
2863         lines = compat_getenv('LINES')
2864         if lines:
2865             lines = int(lines)
2866         else:
2867             lines = None
2868
2869         if columns is None or lines is None or columns <= 0 or lines <= 0:
2870             try:
2871                 sp = subprocess.Popen(
2872                     ['stty', 'size'],
2873                     stdout=subprocess.PIPE, stderr=subprocess.PIPE)
2874                 out, err = sp.communicate()
2875                 _lines, _columns = map(int, out.split())
2876             except Exception:
2877                 _columns, _lines = _terminal_size(*fallback)
2878
2879             if columns is None or columns <= 0:
2880                 columns = _columns
2881             if lines is None or lines <= 0:
2882                 lines = _lines
2883         return _terminal_size(columns, lines)
2884
2885 try:
2886     itertools.count(start=0, step=1)
2887     compat_itertools_count = itertools.count
2888 except TypeError:  # Python 2.6
2889     def compat_itertools_count(start=0, step=1):
2890         n = start
2891         while True:
2892             yield n
2893             n += step
2894
2895 if sys.version_info >= (3, 0):
2896     from tokenize import tokenize as compat_tokenize_tokenize
2897 else:
2898     from tokenize import generate_tokens as compat_tokenize_tokenize
2899
2900
2901 try:
2902     struct.pack('!I', 0)
2903 except TypeError:
2904     # In Python 2.6 and 2.7.x < 2.7.7, struct requires a bytes argument
2905     # See https://bugs.python.org/issue19099
2906     def compat_struct_pack(spec, *args):
2907         if isinstance(spec, compat_str):
2908             spec = spec.encode('ascii')
2909         return struct.pack(spec, *args)
2910
2911     def compat_struct_unpack(spec, *args):
2912         if isinstance(spec, compat_str):
2913             spec = spec.encode('ascii')
2914         return struct.unpack(spec, *args)
2915
2916     class compat_Struct(struct.Struct):
2917         def __init__(self, fmt):
2918             if isinstance(fmt, compat_str):
2919                 fmt = fmt.encode('ascii')
2920             super(compat_Struct, self).__init__(fmt)
2921 else:
2922     compat_struct_pack = struct.pack
2923     compat_struct_unpack = struct.unpack
2924     if platform.python_implementation() == 'IronPython' and sys.version_info < (2, 7, 8):
2925         class compat_Struct(struct.Struct):
2926             def unpack(self, string):
2927                 if not isinstance(string, buffer):  # noqa: F821
2928                     string = buffer(string)  # noqa: F821
2929                 return super(compat_Struct, self).unpack(string)
2930     else:
2931         compat_Struct = struct.Struct
2932
2933
2934 try:
2935     from future_builtins import zip as compat_zip
2936 except ImportError:  # not 2.6+ or is 3.x
2937     try:
2938         from itertools import izip as compat_zip  # < 2.5 or 3.x
2939     except ImportError:
2940         compat_zip = zip
2941
2942
2943 if sys.version_info < (3, 3):
2944     def compat_b64decode(s, *args, **kwargs):
2945         if isinstance(s, compat_str):
2946             s = s.encode('ascii')
2947         return base64.b64decode(s, *args, **kwargs)
2948 else:
2949     compat_b64decode = base64.b64decode
2950
2951
2952 if platform.python_implementation() == 'PyPy' and sys.pypy_version_info < (5, 4, 0):
2953     # PyPy2 prior to version 5.4.0 expects byte strings as Windows function
2954     # names, see the original PyPy issue [1] and the youtube-dl one [2].
2955     # 1. https://bitbucket.org/pypy/pypy/issues/2360/windows-ctypescdll-typeerror-function-name
2956     # 2. https://github.com/ytdl-org/youtube-dl/pull/4392
2957     def compat_ctypes_WINFUNCTYPE(*args, **kwargs):
2958         real = ctypes.WINFUNCTYPE(*args, **kwargs)
2959
2960         def resf(tpl, *args, **kwargs):
2961             funcname, dll = tpl
2962             return real((str(funcname), dll), *args, **kwargs)
2963
2964         return resf
2965 else:
2966     def compat_ctypes_WINFUNCTYPE(*args, **kwargs):
2967         return ctypes.WINFUNCTYPE(*args, **kwargs)
2968
2969
2970 __all__ = [
2971     'compat_HTMLParseError',
2972     'compat_HTMLParser',
2973     'compat_HTTPError',
2974     'compat_Struct',
2975     'compat_b64decode',
2976     'compat_basestring',
2977     'compat_chr',
2978     'compat_cookiejar',
2979     'compat_cookies',
2980     'compat_ctypes_WINFUNCTYPE',
2981     'compat_etree_Element',
2982     'compat_etree_fromstring',
2983     'compat_etree_register_namespace',
2984     'compat_expanduser',
2985     'compat_get_terminal_size',
2986     'compat_getenv',
2987     'compat_getpass',
2988     'compat_html_entities',
2989     'compat_html_entities_html5',
2990     'compat_http_client',
2991     'compat_http_server',
2992     'compat_input',
2993     'compat_integer_types',
2994     'compat_itertools_count',
2995     'compat_kwargs',
2996     'compat_numeric_types',
2997     'compat_ord',
2998     'compat_os_name',
2999     'compat_parse_qs',
3000     'compat_print',
3001     'compat_setenv',
3002     'compat_shlex_quote',
3003     'compat_shlex_split',
3004     'compat_socket_create_connection',
3005     'compat_str',
3006     'compat_struct_pack',
3007     'compat_struct_unpack',
3008     'compat_subprocess_get_DEVNULL',
3009     'compat_tokenize_tokenize',
3010     'compat_urllib_error',
3011     'compat_urllib_parse',
3012     'compat_urllib_parse_unquote',
3013     'compat_urllib_parse_unquote_plus',
3014     'compat_urllib_parse_unquote_to_bytes',
3015     'compat_urllib_parse_urlencode',
3016     'compat_urllib_parse_urlparse',
3017     'compat_urllib_request',
3018     'compat_urllib_request_DataHandler',
3019     'compat_urllib_response',
3020     'compat_urlparse',
3021     'compat_urlretrieve',
3022     'compat_xml_parse_error',
3023     'compat_xpath',
3024     'compat_zip',
3025     'workaround_optparse_bug9161',
3026 ]