#!/usr/bin/env python # Copyright (c) 2018, DIANA-HEP # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # * Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. # # * Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # * Neither the name of the copyright holder nor the names of its # contributors may be used to endorse or promote products derived from # this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import argparse import errno import getpass import json import os import re import socket import sys import threading import time import webbrowser if sys.version_info[0] <= 2: import SimpleHTTPServer import SocketServer from urllib2 import urlopen from urlparse import urlparse class BrokenPipeError(Exception): pass else: import http.server as SimpleHTTPServer import socketserver as SocketServer from urllib.request import urlopen from urllib.parse import urlparse unicode = str __version__ = "1.0.14" version = __version__ version_info = tuple(re.split(r"[-\.]", __version__)) class Canvas(object): """A general Vega canvas that can be viewed anywhere on the internet. Args: title (string or None): title for this canvas, can be changed, used as a file name for saved graphics. initial (string, dict, or None; URL or JSON): first Vega graphic to display, defaults to "plot goes here". host (string): host name to bind to, default is "0.0.0.0" for any address. port (integer): port to bind to, default is 0 for any open port. verbose (boolean): if True (default), print messages when web browsers connect or disconnect. vega (string or None): Vega version to request from cdn.jsdelivr.net or None to use an standalone copy. vegalite (string or None): Vega-Lite version to request from cdn.jsdelivr.net or None to use an standalone copy. vegaembed (string or None): Vega-Embed version to request from cdn.jsdelivr.net or None to use an standalone copy. Attributes: connection (dict): web browser URL and possibly terminal command (for TunnelCanvas). title (string): current title. spec (string or dict; URL or JSON): current Vega graphic. httpd (socketserver.ThreadingTCPServer): web server object. ip (string): IP address of server as seen from outside ("localhost" for LocalCanvas and TunnelCanvas). host (string): actual host used by web server. port (string): actual port used by web server. thread (threading.Thread): thread in which the web server is running. connected (list of strings): currently connected web browser clients. closed (boolean): True if the server has shut down, False otherwise. """ def __init__(self, title=None, initial=None, host="0.0.0.0", port=0, verbose=True, vega="5.4.0", vegalite="3.3.0", vegaembed="4.2.0"): self._lock = threading.Lock() if title is None: self._title = "VegaScope" else: self._title = title if initial is None: self.spec = Canvas._default else: self.spec = initial self._action = None self._actionevent = threading.Event() canvas = self if vega == "": vega = None if vegalite == "": vegalite = None if vegaembed == "": vegaembed = None class FakeFile(object): @property def closed(self): return True def close(self): pass def flush(self): pass class HTTPHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): def do_HEAD(self): pass def do_GET(self): if self.path == "/": self.send_response(200) self.send_header("Content-type", "text/html") self.end_headers() vegalibs = """ """.format("vega.min.js" if vega is None else "https://cdn.jsdelivr.net/npm/vega@" + vega, "vega-lite.min.js" if vegalite is None else "https://cdn.jsdelivr.net/npm/vega-lite@" + vegalite, "vega-embed.min.js" if vegaembed is None else "https://cdn.jsdelivr.net/npm/vega-embed@" + vegaembed) page = canvas._template.replace("VEGAVIEW", "#vegaview").replace("VEGALIBS", vegalibs).replace("TITLE", canvas._title).replace("SPEC", canvas._spec).encode("utf-8") self.wfile.write(page) elif self.path == "/update": self.send_response(200) self.send_header("Content-type", "text/event-stream") self.end_headers() client = self.client_address[0] canvas._connected.add(client) if canvas.verbose: sys.stdout.write("{0} connected\n".format(client)) sys.stdout.flush() title = canvas._title spec = canvas._spec try: while not self.wfile.closed: time.sleep(0.1) with canvas._lock: if canvas._spec is None: break elif spec != canvas._spec or title != canvas._title or canvas._action is not None: spec = canvas._spec title = canvas._title self.wfile.write(b"data: " + json.dumps({"title": title, "spec": json.loads(spec), "action": canvas._action}).encode("utf-8") + b"\n\n") canvas._action = None canvas._actionevent.set() else: self.wfile.write(":\n\n".encode("utf-8")) self.wfile.flush() except socket.error as err: if isinstance(err, BrokenPipeError) or err[0] == errno.EPIPE: self.wfile = FakeFile() else: raise finally: canvas._connected.discard(client) if canvas.verbose: sys.stdout.write("{0} disconnected\n".format(client)) sys.stdout.flush() elif self.path == "/vega.min.js": self.send_response(200) self.send_header("Content-type", "application/javascript") self.end_headers() self.wfile.write(canvas._vega) elif self.path == "/vega-lite.min.js": self.send_response(200) self.send_header("Content-type", "application/javascript") self.end_headers() self.wfile.write(canvas._vegalite) elif self.path == "/vega-embed.min.js": self.send_response(200) self.send_header("Content-type", "application/javascript") self.end_headers() self.wfile.write(canvas._vegaembed) def log_request(self, code="-", size="-"): pass def log_error(self, format, *args): pass def log_message(self, format, *args): pass self._httpd = SocketServer.ThreadingTCPServer((host, port), HTTPHandler) self._httpd.daemon_threads = True self._host, self._port = self._httpd.server_address self._thread = threading.Thread(name=self._title, target=self._httpd.serve_forever) self._thread.daemon = True self._thread.start() self.verbose = verbose self._connected = set() self._launch() def _launch(self): if self.verbose: self.how() @property def title(self): return self._title @title.setter def title(self, value): self._specify(value, None, None) @property def spec(self): return self._spec @spec.setter def spec(self, value): self._specify(None, value, None) def __call__(self, spec): """Update the Vega graphic to spec (string or dict; URL or JSON). """ self._specify(None, spec, None) def png(self, spec, title=None): """Update the Vega graphic to spec, optionally set a title, and make connected web clients save the image as PNG. Note that pop-up blockers won't let remote servers save files on your computer without your permission. You will probably have to respond to the pop-up blocker's notice to enable pop-ups and try again (once per host/port combination). This method blocks until the PNG request has been sent, so it can be called in a loop to make lots of files. Args: spec (string or dict; URL or JSON): new Vega graphic. title (string or None): new title. """ self._specify(title, spec, "png") self._actionevent.wait() def svg(self, spec, title=None): """Update the Vega graphic to spec, optionally set a title, and make connected web clients save the image as SVG. Note that pop-up blockers won't let remote servers save files on your computer without your permission. You will probably have to respond to the pop-up blocker's notice to enable pop-ups and try again (once per host/port combination). This method blocks until the SVG request has been sent, so it can be called in a loop to make lots of files. SVG files can be converted into clean, rescalable PDFs. Args: spec (string or dict; URL or JSON): new Vega graphic. title (string or None): new title. """ self._specify(title, spec, "svg") self._actionevent.wait() def _specify(self, title, spec, action): with self._lock: if title is not None: if isinstance(title, (unicode, str)): self._title = title else: raise TypeError("title must be a string") if spec is not None: if isinstance(spec, bytes): spec = spec.decode("utf-8") if isinstance(spec, (unicode, str)): p = urlparse(spec) if p.scheme != "": self._spec = json.dumps(spec) # spec is a URL; wrap it with quotes for JSON else: self._spec = json.dumps(json.loads(spec), allow_nan=False) # not a URL; ensure that it's JSON and a one-liner else: # PdVega if spec.__class__.__module__.startswith("pdvega") and hasattr(spec, "spec"): spec = spec.spec # Altair elif hasattr(spec, "to_json") and callable(spec.to_json): spec = json.loads(spec.to_json()) self._spec = json.dumps(spec, allow_nan=False) # spec is an object; encode it as JSON if action is not None: self._action = action @property def httpd(self): return self._httpd @property def host(self): return self._host @property def port(self): return self._port @property def thread(self): return self._thread @property def connected(self): return sorted(self._connected) def close(self): """Shut down the web server, disconnecting all client browsers. """ self._spec = None if hasattr(self, "_httpd"): self._httpd.shutdown() self._httpd.server_close() @property def closed(self): return self._spec is None def __del__(self): if not self.closed: self.close() def __enter__(self, *args, **kwds): return self def __exit__(self, *args, **kwds): if not self.closed: self.close() @property def connection(self): return {"browser": "http://{ip}:{port}".format(ip=self.ip, port=self._port)} def how(self): """Print instructions for connecting to the web server. Called automatically by the constructor unless verbose=False. """ connection = self.connection if "terminal" in connection: sys.stdout.write("Type into terminal: " + connection["terminal"] + "\n") sys.stdout.write("Point web browser at: " + connection["browser"] + "\n") sys.stdout.flush() @property def ip(self): return urlopen("https://v4.ident.me").read().decode("ascii").strip() class LocalCanvas(Canvas): """A Vega canvas that can only be viewed by the machine on which it is running. """ __doc__ += "\n".join(Canvas.__doc__.split("\n")[1:]) def __init__(self, title=None, initial=None, port=0, verbose=True, newtab=True, vega="5.4.0", vegalite="3.3.0", vegaembed="4.2.0"): self._newtab = newtab super(LocalCanvas, self).__init__(title=title, initial=initial, host="localhost", port=port, verbose=verbose, vega=vega, vegalite=vegalite, vegaembed=vegaembed) def _launch(self): if self.verbose and not self._newtab: self.how() if self._newtab: webbrowser.open_new_tab(self.connection["browser"]) @property def ip(self): return "localhost" class TunnelCanvas(Canvas): """A Vega canvas that can only be viewed by the machine on which it is running or through an ssh tunnel. """ __doc__ += "\n".join(Canvas.__doc__.split("\n")[1:]) def __init__(self, title=None, initial=None, port=0, verbose=True, vega="5.4.0", vegalite="3.3.0", vegaembed="4.2.0"): super(TunnelCanvas, self).__init__(title=title, initial=initial, host="localhost", port=port, verbose=verbose, vega=vega, vegalite=vegalite, vegaembed=vegaembed) @property def connection(self): return {"terminal": "ssh -L {port}:localhost:{port} {user}@{ip}".format(port=self._port, user=getpass.getuser(), ip=self.ip), "browser": "http://localhost:{port}".format(port=self._port)} # This is the global canvas instance used by entrypoint-based renderers _entrypoint_renderer_canvas = None def _vegalite_renderer_entry_point(spec, embed_options=None): import altair global _entrypoint_renderer_canvas if embed_options is not None: import warnings warnings.warn("embed_options is not yet supported & will be ignored") if _entrypoint_renderer_canvas is None: _entrypoint_renderer_canvas = LocalCanvas(vega=altair.v3.VEGA_VERSION, vegalite=altair.v3.VEGALITE_VERSION, vegaembed=altair.v3.VEGAEMBED_VERSION) _entrypoint_renderer_canvas(spec) browser = _entrypoint_renderer_canvas.connection['browser'] return {'text/plain': 'Rendered at {0}'.format(browser)} Canvas._default = { "$schema": "https://vega.github.io/schema/vega-lite/v2.json", "data": {"values": [{"x": "plot goes here"}]}, "mark": "text", "encoding": {"text": {"field": "x"}}, "config": {"text": {"baseline": "middle", "align": "center"}} } Canvas._template = u"""
VEGALIBSn||null==n)&&null!=t?1:(n=n instanceof Date?+n:n,(t=t instanceof Date?+t:t)!==t&&n==n?-1:n!=n&&t==t?1:0)}),n?i.slice(0,n):i}(i,t.limit||0,e);return{key:t.key,groupby:t.groupby,ops:s.map(function(){return u}),fields:s.map(function(t){return function(t,e,r,i){return n(function(n){return e(n)===t?r(n):NaN},i,t+"")}(t,i,a,o)}),as:s.map(function(t){return t+""}),modified:t.modified.bind(t)}}(t,e),e)},et(Ia,ga).transform=function(t,n){var e=this,a=t.subflow,u=t.field;return(t.modified("field")||u&&n.modified(r(u)))&&i("PreFacet does not support field modification."),this._targets.active=0,n.visit(n.MOD,function(t){var r=e.subflow(Et(t),a,n,t);u?u(t).forEach(function(t){r.mod(t)}):r.mod(t)}),n.visit(n.ADD,function(t){var r=e.subflow(Et(t),a,n,t);u?u(t).forEach(function(t){r.add(Dt(t))}):r.add(t)}),n.visit(n.REM,function(t){var r=e.subflow(Et(t),a,n,t);u?u(t).forEach(function(t){r.rem(t)}):r.rem(t)}),n},Wa.Definition={type:"Project",metadata:{generates:!0,changes:!0},params:[{name:"fields",type:"field",array:!0},{name:"as",type:"string",null:!0,array:!0}]},et(Wa,$r).transform=function(t,n){var e,r,i=t.fields,a=_a(t.fields,t.as||[]),u=i?function(t,n){return function(t,n,e,r){for(var i=0,a=e.length;i=s&&(e=u[i],l[Et(e)]&&r.rem.push(e),u[i]=n),++o}if(e.rem.length&&(e.visit(e.REM,function(t){var n=Et(t);l[n]&&(l[n]=-1,r.rem.push(t)),--o}),u=u.filter(function(t){return-1!==l[Et(t)]})),(e.rem.length||i)&&u.lengtha){for(var f=0,h=u.length-a;f >>1;l[g] >1,y.y=o[1]*(c()+.5)>>1,YM(s,y,v,g),y.hasText&&h(f,y,d)&&(m.push(y),d?VM(d,y):d=[{x:y.x+y.x0,y:y.y+y.y0},{x:y.x+y.x1,y:y.y+y.y1}],y.x-=o[0]>>1,y.y-=o[1]>>1)}return m},f.words=function(t){return arguments.length?(l=t,f):l},f.size=function(t){return arguments.length?(o=[+t[0],+t[1]],f):o},f.font=function(t){return arguments.length?(n=ZM(t),f):n},f.fontStyle=function(t){return arguments.length?(r=ZM(t),f):r},f.fontWeight=function(t){return arguments.length?(i=ZM(t),f):i},f.rotate=function(t){return arguments.length?(a=ZM(t),f):a},f.text=function(n){return arguments.length?(t=ZM(n),f):t},f.spiral=function(t){return arguments.length?(s=JM[t]||t,f):s},f.fontSize=function(t){return arguments.length?(e=ZM(t),f):e},f.padding=function(t){return arguments.length?(u=ZM(t),f):u},f.random=function(t){return arguments.length?(c=t,f):c},f}function YM(t,n,e,r){if(!n.sprite){var i=t.context,a=t.ratio;i.clearRect(0,0,(IM<<5)/a,WM/a);var u,o,s,l,c,f=0,h=0,d=0,p=e.length;for(--r;++r >5<<5,s=~~Math.max(Math.abs(y+x),Math.abs(y-x))}else u=u+31>>5<<5;if(s>d&&(d=s),f+u>=IM<<5&&(f=0,h+=d,d=0),h+s>=WM)break;i.translate((f+(u>>1))/a,(h+(s>>1))/a),n.rotate&&i.rotate(n.rotate*$M),i.fillText(n.text,0,0),n.padding&&(i.lineWidth=2*n.padding,i.strokeText(n.text,0,0)),i.restore(),n.width=u,n.height=s,n.xoff=f,n.yoff=h,n.x1=u>>1,n.y1=s>>1,n.x0=-n.x1,n.y0=-n.y1,n.hasText=!0,f+=u}for(var b=i.getImageData(0,0,(IM<<5)/a,WM/a).data,w=[];--r>=0;)if((n=e[r]).hasText){for(o=(u=n.width)>>5,s=n.y1-n.y0,l=0;ld;if(o||(o=s=fo()),h>>1),n(r.slice(0,i))=0&&hMy&&(My=a):l^(o*ky<(s=(s+360)%360-180)&&sh&&(h=o),m=c*c*g,(d=Math.max(h/m,m/f))>p){c-=o;break}p=d}v.push(u={value:c,dice:s=0;--i)o.push(e=n.children[i]=new wA(r[i],i)),e.parent=n;return(u.parent=new wA(null,0)).children=[u],u}(i);if(s.eachAfter(a),s.parent.m=-s.z,s.eachBefore(u),r)i.eachBefore(o);else{var l=i,c=i,f=i;i.eachBefore(function(t){t.x=e-1){var c=o[n];return c.x0=i,c.y0=a,c.x1=u,void(c.y1=s)}for(var f=l[n],h=r/2+f,d=n+1,p=e-1;d>5),E=b[(h+c)*(IM<<5)+(f+l)<<2]?1<<31-l%32:0;w[k]|=E,A|=E}A?M=c:(n.y0++,s--,c--,h++)}n.y1=n.y0+M,n.sprite=w.slice(0,(n.y1-n.y0)*o)}}}function GM(t,n,e){e>>=5;for(var r,i=t.sprite,a=t.width>>5,u=t.x-(a<<4),o=127&u,s=32-o,l=t.y1-t.y0,c=(t.y+t.y0)*e+(u>>5),f=0;fm)for(i=m,a=Math.min(p,v);iv)for(i=Math.max(p,v),a=g;id)for(i=d,a=Math.min(f,p);ip)for(i=Math.max(f,p),a=h;i",jk[oE]="Identifier",jk[sE]="Keyword",jk[lE]="Null",jk[cE]="Numeric",jk[fE]="Punctuator",jk[hE]="String",jk[9]="RegularExpression";var dE="ArrayExpression",pE="BinaryExpression",gE="CallExpression",mE="ConditionalExpression",vE="Identifier",yE="Literal",xE="LogicalExpression",_E="MemberExpression",bE="ObjectExpression",wE="Property",AE="UnaryExpression",ME="Unexpected token %0",kE="Unexpected number",EE="Unexpected string",CE="Unexpected identifier",DE="Unexpected reserved word",FE="Unexpected end of input",SE="Invalid regular expression",BE="Invalid regular expression: missing /",OE="Octal literals are not allowed in strict mode.",zE="Duplicate data property in object literal not allowed in strict mode",NE="ILLEGAL",TE="Disabled.",RE=new RegExp("[\\\\xAA\\\\xB5\\\\xBA\\\\xC0-\\\\xD6\\\\xD8-\\\\xF6\\\\xF8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0370-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0620-\\\\u064A\\\\u066E\\\\u066F\\\\u0671-\\\\u06D3\\\\u06D5\\\\u06E5\\\\u06E6\\\\u06EE\\\\u06EF\\\\u06FA-\\\\u06FC\\\\u06FF\\\\u0710\\\\u0712-\\\\u072F\\\\u074D-\\\\u07A5\\\\u07B1\\\\u07CA-\\\\u07EA\\\\u07F4\\\\u07F5\\\\u07FA\\\\u0800-\\\\u0815\\\\u081A\\\\u0824\\\\u0828\\\\u0840-\\\\u0858\\\\u08A0-\\\\u08B2\\\\u0904-\\\\u0939\\\\u093D\\\\u0950\\\\u0958-\\\\u0961\\\\u0971-\\\\u0980\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BD\\\\u09CE\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E1\\\\u09F0\\\\u09F1\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A72-\\\\u0A74\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABD\\\\u0AD0\\\\u0AE0\\\\u0AE1\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3D\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B61\\\\u0B71\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BD0\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D\\\\u0C58\\\\u0C59\\\\u0C60\\\\u0C61\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBD\\\\u0CDE\\\\u0CE0\\\\u0CE1\\\\u0CF1\\\\u0CF2\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D\\\\u0D4E\\\\u0D60\\\\u0D61\\\\u0D7A-\\\\u0D7F\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0E01-\\\\u0E30\\\\u0E32\\\\u0E33\\\\u0E40-\\\\u0E46\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB0\\\\u0EB2\\\\u0EB3\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F40-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F88-\\\\u0F8C\\\\u1000-\\\\u102A\\\\u103F\\\\u1050-\\\\u1055\\\\u105A-\\\\u105D\\\\u1061\\\\u1065\\\\u1066\\\\u106E-\\\\u1070\\\\u1075-\\\\u1081\\\\u108E\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16EE-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1711\\\\u1720-\\\\u1731\\\\u1740-\\\\u1751\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1780-\\\\u17B3\\\\u17D7\\\\u17DC\\\\u1820-\\\\u1877\\\\u1880-\\\\u18A8\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1950-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19C1-\\\\u19C7\\\\u1A00-\\\\u1A16\\\\u1A20-\\\\u1A54\\\\u1AA7\\\\u1B05-\\\\u1B33\\\\u1B45-\\\\u1B4B\\\\u1B83-\\\\u1BA0\\\\u1BAE\\\\u1BAF\\\\u1BBA-\\\\u1BE5\\\\u1C00-\\\\u1C23\\\\u1C4D-\\\\u1C4F\\\\u1C5A-\\\\u1C7D\\\\u1CE9-\\\\u1CEC\\\\u1CEE-\\\\u1CF1\\\\u1CF5\\\\u1CF6\\\\u1D00-\\\\u1DBF\\\\u1E00-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2160-\\\\u2188\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CEE\\\\u2CF2\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D80-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2E2F\\\\u3005-\\\\u3007\\\\u3021-\\\\u3029\\\\u3031-\\\\u3035\\\\u3038-\\\\u303C\\\\u3041-\\\\u3096\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FCC\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA61F\\\\uA62A\\\\uA62B\\\\uA640-\\\\uA66E\\\\uA67F-\\\\uA69D\\\\uA6A0-\\\\uA6EF\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA78E\\\\uA790-\\\\uA7AD\\\\uA7B0\\\\uA7B1\\\\uA7F7-\\\\uA801\\\\uA803-\\\\uA805\\\\uA807-\\\\uA80A\\\\uA80C-\\\\uA822\\\\uA840-\\\\uA873\\\\uA882-\\\\uA8B3\\\\uA8F2-\\\\uA8F7\\\\uA8FB\\\\uA90A-\\\\uA925\\\\uA930-\\\\uA946\\\\uA960-\\\\uA97C\\\\uA984-\\\\uA9B2\\\\uA9CF\\\\uA9E0-\\\\uA9E4\\\\uA9E6-\\\\uA9EF\\\\uA9FA-\\\\uA9FE\\\\uAA00-\\\\uAA28\\\\uAA40-\\\\uAA42\\\\uAA44-\\\\uAA4B\\\\uAA60-\\\\uAA76\\\\uAA7A\\\\uAA7E-\\\\uAAAF\\\\uAAB1\\\\uAAB5\\\\uAAB6\\\\uAAB9-\\\\uAABD\\\\uAAC0\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEA\\\\uAAF2-\\\\uAAF4\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB5F\\\\uAB64\\\\uAB65\\\\uABC0-\\\\uABE2\\\\uAC00-\\\\uD7A3\\\\uD7B0-\\\\uD7C6\\\\uD7CB-\\\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D\\\\uFB1F-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF21-\\\\uFF3A\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC]"),PE=new RegExp("[\\\\xAA\\\\xB5\\\\xBA\\\\xC0-\\\\xD6\\\\xD8-\\\\xF6\\\\xF8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0300-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u0483-\\\\u0487\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u0591-\\\\u05BD\\\\u05BF\\\\u05C1\\\\u05C2\\\\u05C4\\\\u05C5\\\\u05C7\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0610-\\\\u061A\\\\u0620-\\\\u0669\\\\u066E-\\\\u06D3\\\\u06D5-\\\\u06DC\\\\u06DF-\\\\u06E8\\\\u06EA-\\\\u06FC\\\\u06FF\\\\u0710-\\\\u074A\\\\u074D-\\\\u07B1\\\\u07C0-\\\\u07F5\\\\u07FA\\\\u0800-\\\\u082D\\\\u0840-\\\\u085B\\\\u08A0-\\\\u08B2\\\\u08E4-\\\\u0963\\\\u0966-\\\\u096F\\\\u0971-\\\\u0983\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BC-\\\\u09C4\\\\u09C7\\\\u09C8\\\\u09CB-\\\\u09CE\\\\u09D7\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E3\\\\u09E6-\\\\u09F1\\\\u0A01-\\\\u0A03\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A3C\\\\u0A3E-\\\\u0A42\\\\u0A47\\\\u0A48\\\\u0A4B-\\\\u0A4D\\\\u0A51\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A66-\\\\u0A75\\\\u0A81-\\\\u0A83\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABC-\\\\u0AC5\\\\u0AC7-\\\\u0AC9\\\\u0ACB-\\\\u0ACD\\\\u0AD0\\\\u0AE0-\\\\u0AE3\\\\u0AE6-\\\\u0AEF\\\\u0B01-\\\\u0B03\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3C-\\\\u0B44\\\\u0B47\\\\u0B48\\\\u0B4B-\\\\u0B4D\\\\u0B56\\\\u0B57\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B63\\\\u0B66-\\\\u0B6F\\\\u0B71\\\\u0B82\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BBE-\\\\u0BC2\\\\u0BC6-\\\\u0BC8\\\\u0BCA-\\\\u0BCD\\\\u0BD0\\\\u0BD7\\\\u0BE6-\\\\u0BEF\\\\u0C00-\\\\u0C03\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D-\\\\u0C44\\\\u0C46-\\\\u0C48\\\\u0C4A-\\\\u0C4D\\\\u0C55\\\\u0C56\\\\u0C58\\\\u0C59\\\\u0C60-\\\\u0C63\\\\u0C66-\\\\u0C6F\\\\u0C81-\\\\u0C83\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBC-\\\\u0CC4\\\\u0CC6-\\\\u0CC8\\\\u0CCA-\\\\u0CCD\\\\u0CD5\\\\u0CD6\\\\u0CDE\\\\u0CE0-\\\\u0CE3\\\\u0CE6-\\\\u0CEF\\\\u0CF1\\\\u0CF2\\\\u0D01-\\\\u0D03\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D-\\\\u0D44\\\\u0D46-\\\\u0D48\\\\u0D4A-\\\\u0D4E\\\\u0D57\\\\u0D60-\\\\u0D63\\\\u0D66-\\\\u0D6F\\\\u0D7A-\\\\u0D7F\\\\u0D82\\\\u0D83\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0DCA\\\\u0DCF-\\\\u0DD4\\\\u0DD6\\\\u0DD8-\\\\u0DDF\\\\u0DE6-\\\\u0DEF\\\\u0DF2\\\\u0DF3\\\\u0E01-\\\\u0E3A\\\\u0E40-\\\\u0E4E\\\\u0E50-\\\\u0E59\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB9\\\\u0EBB-\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EC8-\\\\u0ECD\\\\u0ED0-\\\\u0ED9\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F18\\\\u0F19\\\\u0F20-\\\\u0F29\\\\u0F35\\\\u0F37\\\\u0F39\\\\u0F3E-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F71-\\\\u0F84\\\\u0F86-\\\\u0F97\\\\u0F99-\\\\u0FBC\\\\u0FC6\\\\u1000-\\\\u1049\\\\u1050-\\\\u109D\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u135D-\\\\u135F\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16EE-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1714\\\\u1720-\\\\u1734\\\\u1740-\\\\u1753\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1772\\\\u1773\\\\u1780-\\\\u17D3\\\\u17D7\\\\u17DC\\\\u17DD\\\\u17E0-\\\\u17E9\\\\u180B-\\\\u180D\\\\u1810-\\\\u1819\\\\u1820-\\\\u1877\\\\u1880-\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1920-\\\\u192B\\\\u1930-\\\\u193B\\\\u1946-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19B0-\\\\u19C9\\\\u19D0-\\\\u19D9\\\\u1A00-\\\\u1A1B\\\\u1A20-\\\\u1A5E\\\\u1A60-\\\\u1A7C\\\\u1A7F-\\\\u1A89\\\\u1A90-\\\\u1A99\\\\u1AA7\\\\u1AB0-\\\\u1ABD\\\\u1B00-\\\\u1B4B\\\\u1B50-\\\\u1B59\\\\u1B6B-\\\\u1B73\\\\u1B80-\\\\u1BF3\\\\u1C00-\\\\u1C37\\\\u1C40-\\\\u1C49\\\\u1C4D-\\\\u1C7D\\\\u1CD0-\\\\u1CD2\\\\u1CD4-\\\\u1CF6\\\\u1CF8\\\\u1CF9\\\\u1D00-\\\\u1DF5\\\\u1DFC-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u200C\\\\u200D\\\\u203F\\\\u2040\\\\u2054\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u20D0-\\\\u20DC\\\\u20E1\\\\u20E5-\\\\u20F0\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2160-\\\\u2188\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D7F-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2DE0-\\\\u2DFF\\\\u2E2F\\\\u3005-\\\\u3007\\\\u3021-\\\\u302F\\\\u3031-\\\\u3035\\\\u3038-\\\\u303C\\\\u3041-\\\\u3096\\\\u3099\\\\u309A\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FCC\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA62B\\\\uA640-\\\\uA66F\\\\uA674-\\\\uA67D\\\\uA67F-\\\\uA69D\\\\uA69F-\\\\uA6F1\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA78E\\\\uA790-\\\\uA7AD\\\\uA7B0\\\\uA7B1\\\\uA7F7-\\\\uA827\\\\uA840-\\\\uA873\\\\uA880-\\\\uA8C4\\\\uA8D0-\\\\uA8D9\\\\uA8E0-\\\\uA8F7\\\\uA8FB\\\\uA900-\\\\uA92D\\\\uA930-\\\\uA953\\\\uA960-\\\\uA97C\\\\uA980-\\\\uA9C0\\\\uA9CF-\\\\uA9D9\\\\uA9E0-\\\\uA9FE\\\\uAA00-\\\\uAA36\\\\uAA40-\\\\uAA4D\\\\uAA50-\\\\uAA59\\\\uAA60-\\\\uAA76\\\\uAA7A-\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEF\\\\uAAF2-\\\\uAAF6\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB5F\\\\uAB64\\\\uAB65\\\\uABC0-\\\\uABEA\\\\uABEC\\\\uABED\\\\uABF0-\\\\uABF9\\\\uAC00-\\\\uD7A3\\\\uD7B0-\\\\uD7C6\\\\uD7CB-\\\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE00-\\\\uFE0F\\\\uFE20-\\\\uFE2D\\\\uFE33\\\\uFE34\\\\uFE4D-\\\\uFE4F\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF10-\\\\uFF19\\\\uFF21-\\\\uFF3A\\\\uFF3F\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC]");function LE(t,n){if(!t)throw new Error("ASSERT: "+n)}function qE(t){return t>=48&&t<=57}function UE(t){return"0123456789abcdefABCDEF".indexOf(t)>=0}function jE(t){return"01234567".indexOf(t)>=0}function $E(t){return 32===t||9===t||11===t||12===t||160===t||t>=5760&&[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279].indexOf(t)>=0}function IE(t){return 10===t||13===t||8232===t||8233===t}function WE(t){return 36===t||95===t||t>=65&&t<=90||t>=97&&t<=122||92===t||t>=128&&RE.test(String.fromCharCode(t))}function HE(t){return 36===t||95===t||t>=65&&t<=90||t>=97&&t<=122||t>=48&&t<=57||92===t||t>=128&&PE.test(String.fromCharCode(t))}var YE={if:1,in:1,do:1,var:1,for:1,new:1,try:1,let:1,this:1,else:1,case:1,void:1,with:1,enum:1,while:1,break:1,catch:1,throw:1,const:1,yield:1,class:1,super:1,return:1,typeof:1,delete:1,switch:1,export:1,import:1,public:1,static:1,default:1,finally:1,extends:1,package:1,private:1,function:1,continue:1,debugger:1,interface:1,protected:1,instanceof:1,implements:1};function GE(){for(var t;Ik