/system script
add name=l7 owner=admin policy=\
    ftp,reboot,read,write,policy,test,password,sniff,sensitive source=":put \"\
    These strings are taken from the L7 filter project and are licensed under \
    GPL See: http://www.gnu.org/copyleft/gpl.html\"\r\
    \n/ip firewall layer7-protocol\r\
    \n:if ([:len [find name=edonkey]] > 0) do={ :put \"already have edonkey\" \
    } else={ add name=edonkey regexp=\"^[\\C5\\D4\\E3-\\E5].\\\?.\\\?.\\\?.\\\
    \?([\\01\\02\\05\\14\\15\\16\\18\\19\\1A\\1B\\1C\\20\\21\\32\\33\\34\\35\\\
    36\\38\\40\\41\\42\\43\\46\\47\\48\\49\\4A\\4B\\4C\\4D\\4E\\4F\\50\\51\\52\
    \\53\\54\\55\\56\\57\\58[\\60\\81\\82\\90\\91\\93\\96\\97\\98\\99\\9A\\9B\
    \\9C\\9E\\A0\\A1\\A2\\A3\\A4]|\\59................\\\?[ -~]|\\96....\\\$)\
    \" }\r\
    \n:if ([:len [find name=goboogy]] > 0) do={ :put \"already have goboogy\" \
    } else={ add name=goboogy regexp=\"<peerplat>|^get /getfilebyhash\\\\.cgi\
    \\\\\\\?|^get /queue_register\\\\.cgi\\\\\\\?|^get /getupdowninfo\\\\.cgi\
    \\\\\\\?\" }\r\
    \n:if ([:len [find name=soribada]] > 0) do={ :put \"already have soribada\
    \" } else={ add name=soribada regexp=\"^GETMP3\\0D\\0AFilename|^\\01.\\\?.\
    \\\?.\\\?(\\51\\3A\\\\+|\\51\\32\\3A)|^\\10[\\14-\\16]\\10[\\15-\\17].\\\?\
    .\\\?.\\\?.\\\?\\\$\" }\r\
    \n:if ([:len [find name=rdp]] > 0) do={ :put \"already have rdp\" } else={\
    \_add name=rdp regexp=\"rdpdr.*cliprdr.*rdpsnd\" }\r\
    \n:if ([:len [find name=gnutella]] > 0) do={ :put \"already have gnutella\
    \" } else={ add name=gnutella regexp=\"^(gnd[\\01\\02]\\\?.\\\?.\\\?\\01|g\
    nutella connect/[012]\\\\.[0-9]\\0D\\0A|get /uri-res/n2r\\\\\\\?urn:sha1:|\
    get /.*user-agent: (gtk-gnutella|bearshare|mactella|gnucleus|gnotella|lime\
    wire|imesh)|get /.*content-type: application/x-gnutella-packets|giv [0-9]*\
    :[0-9a-f]*/|queue [0-9a-f]* [1-9][0-9]\\\?[0-9]\\\?\\\\.[1-9][0-9]\\\?[0-9\
    ]\\\?\\\\.[1-9][0-9]\\\?[0-9]\\\?\\\\.[1-9][0-9]\\\?[0-9]\\\?:[1-9][0-9]\\\
    \?[0-9]\\\?[0-9]\\\?|gnutella.*content-type: application/x-gnutella|......\
    .............\\\?lime)\" }\r\
    \n:if ([:len [find name=cvs]] > 0) do={ :put \"already have cvs\" } else={\
    \_add name=cvs regexp=\"^BEGIN (AUTH|VERIFICATION|GSSAPI) REQUEST\\0A\" }\
    \r\
    \n:if ([:len [find name=nbns]] > 0) do={ :put \"already have nbns\" } else\
    ={ add name=nbns regexp=\"\\01\\10\\01|\\\\)\\10\\01\\01|0\\10\\01\" }\r\
    \n:if ([:len [find name=shoutcast]] > 0) do={ :put \"already have shoutcas\
    t\" } else={ add name=shoutcast regexp=\"icy [1-5][0-9][0-9] [\\09-\\0D -~\
    ]*(content-type:audio|icy-)\" }\r\
    \n:if ([:len [find name=dns]] > 0) do={ :put \"already have dns\" } else={\
    \_add name=dns regexp=\"^.\\\?.\\\?.\\\?.\\\?[\\01\\02].\\\?.\\\?.\\\?.\\\
    \?.\\\?.\\\?[\\01-\\\?][a-z0-9][\\01-\\\?a-z]*[\\02-\\06][a-z][a-z][fglmop\
    rstuvz]\\\?[aeop]\\\?(um)\\\?[\\01-\\10\\1C][\\01\\03\\04\\FF]\" }\r\
    \n:if ([:len [find name=quake-halflife]] > 0) do={ :put \"already have qua\
    ke-halflife\" } else={ add name=quake-halflife regexp=\"^\\FF\\FF\\FF\\FFg\
    et(info|challenge)\" }\r\
    \n:if ([:len [find name=poco]] > 0) do={ :put \"already have poco\" } else\
    ={ add name=poco regexp=\"^\\80\\94\\0A\\01....\\1F\\9E\" }\r\
    \n:if ([:len [find name=ciscovpn]] > 0) do={ :put \"already have ciscovpn\
    \" } else={ add name=ciscovpn regexp=\"^\\01\\F4\\01\\F4\" }\r\
    \n:if ([:len [find name=x11]] > 0) do={ :put \"already have x11\" } else={\
    \_add name=x11 regexp=\"^[lb].\\\?\\0B\" }\r\
    \n:if ([:len [find name=xboxlive]] > 0) do={ :put \"already have xboxlive\
    \" } else={ add name=xboxlive regexp=\"^\\58\\80........\\F3|^\\06\\58\\4E\
    \" }\r\
    \n:if ([:len [find name=applejuice]] > 0) do={ :put \"already have appleju\
    ice\" } else={ add name=applejuice regexp=\"^ajprot\\0D\\0A\" }\r\
    \n:if ([:len [find name=zmaap]] > 0) do={ :put \"already have zmaap\" } el\
    se={ add name=zmaap regexp=\"^\\1B\\D7\\3B\\48[\\01\\02]\\01\\\?\\01\" }\r\
    \n:if ([:len [find name=live365]] > 0) do={ :put \"already have live365\" \
    } else={ add name=live365 regexp=\"membername.*session.*player\" }\r\
    \n:if ([:len [find name=rlogin]] > 0) do={ :put \"already have rlogin\" } \
    else={ add name=rlogin regexp=\"^[a-z][a-z0-9][a-z0-9]+/[1-9][0-9]\\\?[0-9\
    ]\\\?[0-9]\\\?00\" }\r\
    \n:if ([:len [find name=http]] > 0) do={ :put \"already have http\" } else\
    ={ add name=http regexp=\"http/(0\\\\.9|1\\\\.0|1\\\\.1) [1-5][0-9][0-9] [\
    \\09-\\0D -~]*(connection:|content-type:|content-length:|date:)|post [\\09\
    -\\0D -~]* http/[01]\\\\.[019]\" }\r\
    \n:if ([:len [find name=sip]] > 0) do={ :put \"already have sip\" } else={\
    \_add name=sip regexp=\"^(invite|register|cancel) sip[\\09-\\0D -~]*sip/[0\
    -2]\\\\.[0-9]\" }\r\
    \n:if ([:len [find name=pop3]] > 0) do={ :put \"already have pop3\" } else\
    ={ add name=pop3 regexp=\"^(\\\\+ok |-err )\" }\r\
    \n:if ([:len [find name=smb]] > 0) do={ :put \"already have smb\" } else={\
    \_add name=smb regexp=\"\\FFsmb[\\72\\25]\" }\r\
    \n:if ([:len [find name=quake1]] > 0) do={ :put \"already have quake1\" } \
    else={ add name=quake1 regexp=\"^\\80\\0C\\01quake\\03\" }\r\
    \n:if ([:len [find name=lpd]] > 0) do={ :put \"already have lpd\" } else={\
    \_add name=lpd regexp=\"^(\\01[!-~]+|\\02[!-~]+\\0A.[\\01\\02\\03][\\01-\\\
    0A -~]*|[\\03\\04][!-~]+[\\09-\\0D]+[a-z][\\09-\\0D -~]*|\\05[!-~]+[\\09-\
    \\0D]+([a-z][!-~]*[\\09-\\0D]+[1-9][0-9]\\\?[0-9]\\\?|root[\\09-\\0D]+[!-~\
    ]+).*)\\0A\\\$\" }\r\
    \n:if ([:len [find name=mute]] > 0) do={ :put \"already have mute\" } else\
    ={ add name=mute regexp=\"^(Public|AES)Key: [0-9a-f]*\\0AEnd(Public|AES)Ke\
    y\\0A\\\$\" }\r\
    \n:if ([:len [find name=ssh]] > 0) do={ :put \"already have ssh\" } else={\
    \_add name=ssh regexp=\"^ssh-[12]\\\\.[0-9]\" }\r\
    \n:if ([:len [find name=jabber]] > 0) do={ :put \"already have jabber\" } \
    else={ add name=jabber regexp=\"<stream:stream[\\09-\\0D ][ -~]*[\\09-\\0D\
    \_]xmlns=['\\\"]jabber\" }\r\
    \n:if ([:len [find name=bittorrent]] > 0) do={ :put \"already have bittorr\
    ent\" } else={ add name=bittorrent regexp=\"^(\\13bittorrent protocol|azve\
    r\\01\\\$|get /scrape\\\\\\\?info_hash=)|d1:ad2:id20:|\\08'7P\\\\)[RP]\" }\
    \r\
    \n:if ([:len [find name=ncp]] > 0) do={ :put \"already have ncp\" } else={\
    \_add name=ncp regexp=\"^(dmdt.*\\01.*(\\\"\\\"|\\11\\11|uu)|tncp.*33)\" }\
    \r\
    \n:if ([:len [find name=tls]] > 0) do={ :put \"already have tls\" } else={\
    \_add name=tls regexp=\"^(.\\\?.\\\?\\16\\03.*\\16\\03|.\\\?.\\\?\\01\\03\
    \\01\\\?.*\\0B)\" }\r\
    \n:if ([:len [find name=directconnect]] > 0) do={ :put \"already have dire\
    ctconnect\" } else={ add name=directconnect regexp=\"^(\\\\\\\$mynick |\\\
    \\\\\$lock |\\\\\\\$key )\" }\r\
    \n:if ([:len [find name=netbios]] > 0) do={ :put \"already have netbios\" \
    } else={ add name=netbios regexp=\"\\81.\\\?.\\\?.[A-P][A-P][A-P][A-P][A-P\
    ][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-\
    P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A-P][A\
    -P][A-P][A-P][A-P][A-P][A-P]\" }\r\
    \n:if ([:len [find name=tftp]] > 0) do={ :put \"already have tftp\" } else\
    ={ add name=tftp regexp=\"^(\\01|\\02)[ -~]*(netascii|octet|mail)\" }\r\
    \n:if ([:len [find name=subspace]] > 0) do={ :put \"already have subspace\
    \" } else={ add name=subspace regexp=\"^\\01....\\11\\10........\\01\\\$\"\
    \_}\r\
    \n:if ([:len [find name=hotline]] > 0) do={ :put \"already have hotline\" \
    } else={ add name=hotline regexp=\"^....................TRTPHOTL\\01\\02\"\
    \_}\r\
    \n:if ([:len [find name=doom3]] > 0) do={ :put \"already have doom3\" } el\
    se={ add name=doom3 regexp=\"^\\FF\\FFchallenge\" }\r\
    \n:if ([:len [find name=ftp]] > 0) do={ :put \"already have ftp\" } else={\
    \_add name=ftp regexp=\"^220[\\09-\\0D -~]*ftp\" }\r\
    \n:if ([:len [find name=kugoo]] > 0) do={ :put \"already have kugoo\" } el\
    se={ add name=kugoo regexp=\"^\\31..\\8E\" }\r\
    \n:if ([:len [find name=tsp]] > 0) do={ :put \"already have tsp\" } else={\
    \_add name=tsp regexp=\"^[\\01-\\13\\16-\\\$]\\01.\\\?.\\\?.\\\?.\\\?.\\\?\
    .\\\?.\\\?.\\\?.\\\?.\\\?[ -~]+\" }\r\
    \n:if ([:len [find name=battlefield1942]] > 0) do={ :put \"already have ba\
    ttlefield1942\" } else={ add name=battlefield1942 regexp=\"^\\01\\11\\10\\\
    \\|\\F8\\02\\10\\40\\06\" }\r\
    \n:if ([:len [find name=ssdp]] > 0) do={ :put \"already have ssdp\" } else\
    ={ add name=ssdp regexp=\"^notify[\\09-\\0D ]\\\\*[\\09-\\0D ]http/1\\\\.1\
    [\\09-\\0D -~]*ssdp:(alive|byebye)|^m-search[\\09-\\0D ]\\\\*[\\09-\\0D ]h\
    ttp/1\\\\.1[\\09-\\0D -~]*ssdp:discover\" }\r\
    \n:if ([:len [find name=imap]] > 0) do={ :put \"already have imap\" } else\
    ={ add name=imap regexp=\"^(\\\\* ok|a[0-9]+ noop)\" }\r\
    \n:if ([:len [find name=ares]] > 0) do={ :put \"already have ares\" } else\
    ={ add name=ares regexp=\"^\\03[]Z].\\\?.\\\?\\05\\\$\" }\r\
    \n:if ([:len [find name=fasttrack]] > 0) do={ :put \"already have fasttrac\
    k\" } else={ add name=fasttrack regexp=\"^get (/.download/[ -~]*|/.superno\
    de[ -~]|/.status[ -~]|/.network[ -~]*|/.files|/.hash=[0-9a-f]*/[ -~]*) htt\
    p/1.1|user-agent: kazaa|x-kazaa(-username|-network|-ip|-supernodeip|-xferi\
    d|-xferuid|tag)|^give [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\\\?[0-9]\\\
    \?[0-9]\\\?\" }\r\
    \n:if ([:len [find name=qq]] > 0) do={ :put \"already have qq\" } else={ a\
    dd name=qq regexp=\"^.\\\?\\02.+\\03\\\$\" }\r\
    \n:if ([:len [find name=100bao]] > 0) do={ :put \"already have 100bao\" } \
    else={ add name=100bao regexp=\"^\\01\\01\\05\\0A\" }\r\
    \n:if ([:len [find name=aim]] > 0) do={ :put \"already have aim\" } else={\
    \_add name=aim regexp=\"^(\\\\*[\\01\\02].*\\03\\0B|\\\\*\\01.\\\?.\\\?.\\\
    \?.\\\?\\01)|flapon|toc_signon.*0x\" }\r\
    \n:if ([:len [find name=unknown]] > 0) do={ :put \"already have unknown\" \
    } else={ add name=unknown regexp=\".\" }\r\
    \n:if ([:len [find name=msn-filetransfer]] > 0) do={ :put \"already have m\
    sn-filetransfer\" } else={ add name=msn-filetransfer regexp=\"^(ver [ -~]*\
    msnftp\\0D\\0Aver msnftp\\0D\\0Ausr|method msnmsgr:)\" }\r\
    \n:if ([:len [find name=yahoo]] > 0) do={ :put \"already have yahoo\" } el\
    se={ add name=yahoo regexp=\"^(ymsg|ypns|yhoo).\\\?.\\\?.\\\?.\\\?.\\\?.\\\
    \?.\\\?[lwt].*\\C0\\80\" }\r\
    \n:if ([:len [find name=validcertssl]] > 0) do={ :put \"already have valid\
    certssl\" } else={ add name=validcertssl regexp=\"^(.\\\?.\\\?\\16\\03.*\\\
    16\\03|.\\\?.\\\?\\01\\03\\01\\\?.*\\0B).*(thawte|equifax secure|rsa data \
    security, inc|verisign, inc|gte cybertrust root|entrust\\\\.net limited)\"\
    \_}\r\
    \n:if ([:len [find name=ntp]] > 0) do={ :put \"already have ntp\" } else={\
    \_add name=ntp regexp=\"^([\\13\\1B\\23\\D3\\DB\\E3]|[\\14\\1C\\\$].......\
    \\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?[\\C6-\\FF])\" }\r\
    \n:if ([:len [find name=gnucleuslan]] > 0) do={ :put \"already have gnucle\
    uslan\" } else={ add name=gnucleuslan regexp=\"gnuclear connect/[\\09-\\0D\
    \_-~]*user-agent: gnucleus [\\09-\\0D -~]*lan:\" }\r\
    \n:if ([:len [find name=vnc]] > 0) do={ :put \"already have vnc\" } else={\
    \_add name=vnc regexp=\"^rfb 00[1-9]\\\\.00[0-9]\\0A\\\$\" }\r\
    \n:if ([:len [find name=bgp]] > 0) do={ :put \"already have bgp\" } else={\
    \_add name=bgp regexp=\"^\\FF\\FF\\FF\\FF\\FF\\FF\\FF\\FF\\FF\\FF\\FF\\FF\
    \\FF\\FF\\FF\\FF..\\\?\\01[\\03\\04]\" }\r\
    \n:if ([:len [find name=tesla]] > 0) do={ :put \"already have tesla\" } el\
    se={ add name=tesla regexp=\"\\03\\9A\\89\\22\\31\\31\\31\\\\.\\30\\30\\20\
    \\42\\65\\74\\61\\20|\\E2\\3C\\69\\1E\\1C\\E9\" }\r\
    \n:if ([:len [find name=openft]] > 0) do={ :put \"already have openft\" } \
    else={ add name=openft regexp=\"x-openftalias: [-)(0-9a-z ~.]\" }\r\
    \n:if ([:len [find name=h323]] > 0) do={ :put \"already have h323\" } else\
    ={ add name=h323 regexp=\"^\\03..\\\?\\08...\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\05\" }\r\
    \n:if ([:len [find name=finger]] > 0) do={ :put \"already have finger\" } \
    else={ add name=finger regexp=\"^[a-z][a-z0-9\\\\-_]+|login: [\\09-\\0D -~\
    ]* name: [\\09-\\0D -~]* Directory:\" }\r\
    \n:if ([:len [find name=ident]] > 0) do={ :put \"already have ident\" } el\
    se={ add name=ident regexp=\"^[1-9][0-9]\\\?[0-9]\\\?[0-9]\\\?[0-9]\\\?[\\\
    09-\\0D]*,[\\09-\\0D]*[1-9][0-9]\\\?[0-9]\\\?[0-9]\\\?[0-9]\\\?(\\0D\\0A|[\
    \\0D\\0A])\\\?\\\$\" }\r\
    \n:if ([:len [find name=gkrellm]] > 0) do={ :put \"already have gkrellm\" \
    } else={ add name=gkrellm regexp=\"^gkrellm [23].[0-9].[0-9]\\0A\\\$\" }\r\
    \n:if ([:len [find name=hddtemp]] > 0) do={ :put \"already have hddtemp\" \
    } else={ add name=hddtemp regexp=\"^\\\\|/dev/[a-z][a-z][a-z]\\\\|[0-9a-z]\
    *\\\\|[0-9][0-9]\\\\|[cfk]\\\\|\" }\r\
    \n:if ([:len [find name=socks]] > 0) do={ :put \"already have socks\" } el\
    se={ add name=socks regexp=\"\\05[\\01-\\08]*\\05[\\01-\\08]\\\?.*\\05[\\0\
    1-\\03][\\01\\03].*\\05[\\01-\\08]\\\?[\\01\\03]\" }\r\
    \n:if ([:len [find name=biff]] > 0) do={ :put \"already have biff\" } else\
    ={ add name=biff regexp=\"^[a-z][a-z0-9]+@[1-9][0-9]+\\\$\" }\r\
    \n:if ([:len [find name=dhcp]] > 0) do={ :put \"already have dhcp\" } else\
    ={ add name=dhcp regexp=\"^[\\01\\02][\\01- ]\\06.*c\\82sc\" }\r\
    \n:if ([:len [find name=smtp]] > 0) do={ :put \"already have smtp\" } else\
    ={ add name=smtp regexp=\"^220[\\09-\\0D -~]* (e\\\?smtp|simple mail)\" }\
    \r\
    \n:if ([:len [find name=ipp]] > 0) do={ :put \"already have ipp\" } else={\
    \_add name=ipp regexp=\"ipp://\" }\r\
    \n:if ([:len [find name=msnmessenger]] > 0) do={ :put \"already have msnme\
    ssenger\" } else={ add name=msnmessenger regexp=\"ver [0-9]+ msnp[1-9][0-9\
    ]\\\? [\\09-\\0D -~]*cvr0\\0D\\0A\\\$|usr 1 [!-~]+ [0-9. ]+\\0D\\0A\\\$|an\
    s 1 [!-~]+ [0-9. ]+\\0D\\0A\\\$\" }\r\
    \n:if ([:len [find name=irc]] > 0) do={ :put \"already have irc\" } else={\
    \_add name=irc regexp=\"^(nick[\\09-\\0D -~]*user[\\09-\\0D -~]*:|user[\\0\
    9-\\0D -~]*:[\\02-\\0D -~]*nick[\\09-\\0D -~]*\\0D\\0A)\" }\r\
    \n:if ([:len [find name=gopher]] > 0) do={ :put \"already have gopher\" } \
    else={ add name=gopher regexp=\"^[\\09-\\0D]*[1-9,+tgi][\\09-\\0D -~]*\\09\
    [\\09-\\0D -~]*\\09[a-z0-9.]*\\\\.[a-z][a-z].\\\?.\\\?\\09[1-9]\" }\r\
    \n:if ([:len [find name=telnet]] > 0) do={ :put \"already have telnet\" } \
    else={ add name=telnet regexp=\"^\\FF[\\FB-\\FE].\\FF[\\FB-\\FE].\\FF[\\FB\
    -\\FE]\" }\r\
    \n:if ([:len [find name=snmp]] > 0) do={ :put \"already have snmp\" } else\
    ={ add name=snmp regexp=\"^\\02\\01\\04.+([\\A0-\\A3]\\02[\\01-\\04].\\\?.\
    \\\?.\\\?.\\\?\\02\\01.\\\?\\02\\01.\\\?\\30|\\A4\\06.+\\40\\04.\\\?.\\\?.\
    \\\?.\\\?\\02\\01.\\\?\\02\\01.\\\?\\43)\" }\r\
    \n:if ([:len [find name=nntp]] > 0) do={ :put \"already have nntp\" } else\
    ={ add name=nntp regexp=\"^(20[01][\\09-\\0D -~]*AUTHINFO USER|20[01][\\09\
    -\\0D -~]*news)\" }\r\
    \n:if ([:len [find name=aimwebcontent]] > 0) do={ :put \"already have aimw\
    ebcontent\" } else={ add name=aimwebcontent regexp=\"user-agent:aim/\" }\r\
    \n:if ([:len [find name=rtsp]] > 0) do={ :put \"already have rtsp\" } else\
    ={ add name=rtsp regexp=\"rtsp/1.0 200 ok\" }\r\
    \n:if ([:len [find name=skypeout]] > 0) do={ :put \"already have skypeout\
    \" } else={ add name=skypeout regexp=\"^(\\01.\\\?.\\\?.\\\?.\\\?.\\\?.\\\
    \?.\\\?.\\\?\\01|\\02.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\02|\\03.\\\
    \?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\03|\\04.\\\?.\\\?.\\\?.\\\?.\\\?.\\\
    \?.\\\?.\\\?\\04|\\05.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\05|\\06.\\\
    \?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\06|\\07.\\\?.\\\?.\\\?.\\\?.\\\?.\\\
    \?.\\\?.\\\?\\07|\\08.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\08|\\09.\\\
    \?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\09|\\0A.\\\?.\\\?.\\\?.\\\?.\\\?.\\\
    \?.\\\?.\\\?\\0A|\\0B.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\0B|\\0C.\\\
    \?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\0C|\\0D.\\\?.\\\?.\\\?.\\\?.\\\?.\\\
    \?.\\\?.\\\?\\0D|\\0E.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\0E|\\0F.\\\
    \?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\0F|\\10.\\\?.\\\?.\\\?.\\\?.\\\?.\\\
    \?.\\\?.\\\?\\10|\\11.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\11|\\12.\\\
    \?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\12|\\13.\\\?.\\\?.\\\?.\\\?.\\\?.\\\
    \?.\\\?.\\\?\\13|\\14.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\14|\\15.\\\
    \?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\15|\\16.\\\?.\\\?.\\\?.\\\?.\\\?.\\\
    \?.\\\?.\\\?\\16|\\17.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\17|\\18.\\\
    \?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\18|\\19.\\\?.\\\?.\\\?.\\\?.\\\?.\\\
    \?.\\\?.\\\?\\19|\\1A.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\1A|\\1B.\\\
    \?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\1B|\\1C.\\\?.\\\?.\\\?.\\\?.\\\?.\\\
    \?.\\\?.\\\?\\1C|\\1D.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\1D|\\1E.\\\
    \?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\1E|\\1F.\\\?.\\\?.\\\?.\\\?.\\\?.\\\
    \?.\\\?.\\\?\\1F|\\20.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\20|\\21.\\\
    \?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\21|\\22.\\\?.\\\?.\\\?.\\\?.\\\?.\\\
    \?.\\\?.\\\?\\22|\\23.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\23|\\\\\\\$\
    .\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\\\\\\$|\\25.\\\?.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?\\25|\\26.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\26|\
    \\27.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\27|\\\\(.\\\?.\\\?.\\\?.\\\?\
    .\\\?.\\\?.\\\?.\\\?\\\\(|\\\\).\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\\
    \\)|\\\\*.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\\\*|\\\\+.\\\?.\\\?.\\\
    \?.\\\?.\\\?.\\\?.\\\?.\\\?\\\\+|\\2C.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\
    \\\?\\2C|\\2D.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\2D|\\\\..\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\\\.|\\2F.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    .\\\?\\2F|\\30.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\30|\\31.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\31|\\32.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\
    \\\?\\32|\\33.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\33|\\34.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\34|\\35.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\
    \\\?\\35|\\36.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\36|\\37.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\37|\\38.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\
    \\\?\\38|\\39.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\39|\\3A.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\3A|\\3B.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\
    \\\?\\3B|\\3C.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\3C|\\3D.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\3D|\\3E.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\
    \\\?\\3E|\\\\\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\\\\\\?|\\40.\\\
    \?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\40|\\41.\\\?.\\\?.\\\?.\\\?.\\\?.\\\
    \?.\\\?.\\\?\\41|\\42.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\42|\\43.\\\
    \?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\43|\\44.\\\?.\\\?.\\\?.\\\?.\\\?.\\\
    \?.\\\?.\\\?\\44|\\45.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\45|\\46.\\\
    \?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\46|\\47.\\\?.\\\?.\\\?.\\\?.\\\?.\\\
    \?.\\\?.\\\?\\47|\\48.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\48|\\49.\\\
    \?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\49|\\4A.\\\?.\\\?.\\\?.\\\?.\\\?.\\\
    \?.\\\?.\\\?\\4A|\\4B.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\4B|\\4C.\\\
    \?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\4C|\\4D.\\\?.\\\?.\\\?.\\\?.\\\?.\\\
    \?.\\\?.\\\?\\4D|\\4E.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\4E|\\4F.\\\
    \?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\4F|\\50.\\\?.\\\?.\\\?.\\\?.\\\?.\\\
    \?.\\\?.\\\?\\50|\\51.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\51|\\52.\\\
    \?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\52|\\53.\\\?.\\\?.\\\?.\\\?.\\\?.\\\
    \?.\\\?.\\\?\\53|\\54.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\54|\\55.\\\
    \?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\55|\\56.\\\?.\\\?.\\\?.\\\?.\\\?.\\\
    \?.\\\?.\\\?\\56|\\57.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\57|\\58.\\\
    \?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\58|\\59.\\\?.\\\?.\\\?.\\\?.\\\?.\\\
    \?.\\\?.\\\?\\59|\\5A.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\5A|\\\\[.\\\
    \?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\\\[|\\\\].\\\?.\\\?.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?\\\\]|\\\\].\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\\\]|\\\
    \\^.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\\\^|\\5F.\\\?.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?\\5F|\\60.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\60|\
    \\61.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\61|\\62.\\\?.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?\\62|\\63.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\63|\
    \\64.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\64|\\65.\\\?.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?\\65|\\66.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\66|\
    \\67.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\67|\\68.\\\?.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?\\68|\\69.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\69|\
    \\6A.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\6A|\\6B.\\\?.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?\\6B|\\6C.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\6C|\
    \\6D.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\6D|\\6E.\\\?.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?\\6E|\\6F.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\6F|\
    \\70.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\70|\\71.\\\?.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?\\71|\\72.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\72|\
    \\73.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\73|\\74.\\\?.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?\\74|\\75.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\75|\
    \\76.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\76|\\77.\\\?.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?\\77|\\78.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\78|\
    \\79.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\79|\\7A.\\\?.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?\\7A|\\\\{.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\\\{\
    |\\\\|.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\\\||\\\\}.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\\\}|\\7E.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\7E|\\7F.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\7F|\\80.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\80|\\81.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\81|\\82.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\82|\\83.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\83|\\84.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\84|\\85.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\85|\\86.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\86|\\87.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\87|\\88.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\88|\\89.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\89|\\8A.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\8A|\\8B.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\8B|\\8C.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\8C|\\8D.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\8D|\\8E.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\8E|\\8F.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\8F|\\90.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\90|\\91.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\91|\\92.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\92|\\93.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\93|\\94.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\94|\\95.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\95|\\96.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\96|\\97.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\97|\\98.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\98|\\99.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\99|\\9A.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\9A|\\9B.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\9B|\\9C.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\9C|\\9D.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\9D|\\9E.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\9E|\\9F.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\9F|\\A0.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\A0|\\A1.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\A1|\\A2.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\A2|\\A3.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\A3|\\A4.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\A4|\\A5.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\A5|\\A6.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\A6|\\A7.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\A7|\\A8.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\A8|\\A9.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\A9|\\AA.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\AA|\\AB.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\AB|\\AC.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\AC|\\AD.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\AD|\\AE.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\AE|\\AF.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\AF|\\B0.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\B0|\\B1.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\B1|\\B2.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\B2|\\B3.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\B3|\\B4.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\B4|\\B5.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\B5|\\B6.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\B6|\\B7.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\B7|\\B8.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\B8|\\B9.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\B9|\\BA.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\BA|\\BB.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\BB|\\BC.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\BC|\\BD.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\BD|\\BE.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\BE|\\BF.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\BF|\\C0.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\C0|\\C1.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\C1|\\C2.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\C2|\\C3.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\C3|\\C4.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\C4|\\C5.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\C5|\\C6.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\C6|\\C7.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\C7|\\C8.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\C8|\\C9.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\C9|\\CA.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\CA|\\CB.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\CB|\\CC.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\CC|\\CD.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\CD|\\CE.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\CE|\\CF.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\CF|\\D0.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\D0|\\D1.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\D1|\\D2.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\D2|\\D3.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\D3|\\D4.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\D4|\\D5.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\D5|\\D6.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\D6|\\D7.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\D7|\\D8.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\D8|\\D9.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\D9|\\DA.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\DA|\\DB.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\DB|\\DC.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\DC|\\DD.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\DD|\\DE.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\DE|\\DF.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\DF|\\E0.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\E0|\\E1.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\E1|\\E2.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\E2|\\E3.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\E3|\\E4.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\E4|\\E5.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\E5|\\E6.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\E6|\\E7.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\E7|\\E8.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\E8|\\E9.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\E9|\\EA.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\EA|\\EB.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\EB|\\EC.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\EC|\\ED.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\ED|\\EE.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\EE|\\EF.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\EF|\\F0.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\F0|\\F1.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\F1|\\F2.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\F2|\\F3.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\F3|\\F4.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\F4|\\F5.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\F5|\\F6.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\F6|\\F7.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\F7|\\F8.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\F8|\\F9.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\F9|\\FA.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\FA|\\FB.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\FB|\\FC.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\FC|\\FD.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\\FD|\\FE.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?\\FE|\\FF.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    \\FF)\" }\r\
    \n:if ([:len [find name=skypetoskype]] > 0) do={ :put \"already have skype\
    toskype\" } else={ add name=skypetoskype regexp=\"^..\\02.............\" }\
    \r\
    \n:if ([:len [find name=counterstrike-source]] > 0) do={ :put \"already ha\
    ve counterstrike-source\" } else={ add name=counterstrike-source regexp=\"\
    ^\\FF\\FF\\FF\\FF.*cstrikeCounter-Strike\" }\r\
    \n:if ([:len [find name=halflife2-deathmatch]] > 0) do={ :put \"already ha\
    ve halflife2-deathmatch\" } else={ add name=halflife2-deathmatch regexp=\"\
    ^\\FF\\FF\\FF\\FF.*hl2mpDeathmatch\" }\r\
    \n:if ([:len [find name=freenet]] > 0) do={ :put \"already have freenet\" \
    } else={ add name=freenet regexp=\"^\\01[\\08\\09][\\03\\04]\" }\r\
    \n:if ([:len [find name=battlefield2]] > 0) do={ :put \"already have battl\
    efield2\" } else={ add name=battlefield2 regexp=\"^(\\11\\20\\01...\\\?\\1\
    1|\\FE\\FD.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?(\\14\\01\\06|\\FF\\FF\\FF))|[]\\0\
    1].\\\?battlefield2\" }\r\
    \n:if ([:len [find name=napster]] > 0) do={ :put \"already have napster\" \
    } else={ add name=napster regexp=\"^(.[\\02\\06][!-~]+ [!-~]+ [0-9][0-9]\\\
    \?[0-9]\\\?[0-9]\\\?[0-9]\\\? \\\"[\\09-\\0D -~]+\\\" ([0-9]|10)|1(send|ge\
    t)[!-~]+ \\\"[\\09-\\0D -~]+\\\")\" }\r\
    \n:if ([:len [find name=soulseek]] > 0) do={ :put \"already have soulseek\
    \" } else={ add name=soulseek regexp=\"^(\\05..\\\?|.\\01.[ -~]+\\01F..\\\
    \?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?)\\\$\" }\r\
    \n:if ([:len [find name=xunlei]] > 0) do={ :put \"already have xunlei\" } \
    else={ add name=xunlei regexp=\"^[()]...\\\?.\\\?.\\\?(reg|get|query)\" }\
    \r\
    \n:if ([:len [find name=ssl]] > 0) do={ :put \"already have ssl\" } else={\
    \_add name=ssl regexp=\"^(.\\\?.\\\?\\16\\03.*\\16\\03|.\\\?.\\\?\\01\\03\
    \\01\\\?.*\\0B)\" }\r\
    \n:if ([:len [find name=citrix]] > 0) do={ :put \"already have citrix\" } \
    else={ add name=citrix regexp=\"\\32\\26\\85\\92\\58\" }\r\
    \n:if ([:len [find name=whois]] > 0) do={ :put \"already have whois\" } el\
    se={ add name=whois regexp=\"^[ !-~]+\\0D\\0A\\\$\" }\r\
    \n:if ([:len [find name=dayofdefeat-source]] > 0) do={ :put \"already have\
    \_dayofdefeat-source\" } else={ add name=dayofdefeat-source regexp=\"^\\FF\
    \\FF\\FF\\FF.*dodDay of Defeat\" }\r\
    \n:if ([:len [find name=teamspeak]] > 0) do={ :put \"already have teamspea\
    k\" } else={ add name=teamspeak regexp=\"^\\F4\\BE\\03.*teamspeak\" }\r\
    \n:if ([:len [find name=worldofwarcraft]] > 0) do={ :put \"already have wo\
    rldofwarcraft\" } else={ add name=worldofwarcraft regexp=\"^\\06\\EC\\01\"\
    \_}\r\
    \n:if ([:len [find name=ventrilo]] > 0) do={ :put \"already have ventrilo\
    \" } else={ add name=ventrilo regexp=\"^..\\\?v\\\\\\\$\\CF\" }\r\
    \n:if ([:len [find name=http-rtsp]] > 0) do={ :put \"already have http-rts\
    p\" } else={ add name=http-rtsp regexp=\"^(get[\\09-\\0D -~]* Accept: appl\
    ication/x-rtsp-tunnelled|http/(0\\\\.9|1\\\\.0|1\\\\.1) [1-5][0-9][0-9] [\
    \\09-\\0D -~]*a=control:rtsp://)\" }\r\
    \n:if ([:len [find name=thecircle]] > 0) do={ :put \"already have thecircl\
    e\" } else={ add name=thecircle regexp=\"^t\\03ni.\\\?[\\01-\\06]\\\?t[\\0\
    1-\\05]s[\\0A\\0B](glob|who are you\\\$|query data)\" }\r\
    \n:if ([:len [find name=uucp]] > 0) do={ :put \"already have uucp\" } else\
    ={ add name=uucp regexp=\"^\\10here=\" }\r\
    \n:if ([:len [find name=pcanywhere]] > 0) do={ :put \"already have pcanywh\
    ere\" } else={ add name=pcanywhere regexp=\"^(nq|st)\\\$\" }\r\
    \n:if ([:len [find name=subversion]] > 0) do={ :put \"already have subvers\
    ion\" } else={ add name=subversion regexp=\"^\\\\( success \\\\( 1 2 \\\\(\
    \" }\r\
    \n:if ([:len [find name=imesh]] > 0) do={ :put \"already have imesh\" } el\
    se={ add name=imesh regexp=\"^(post[\\09-\\0D -~]*<PasswordHash>..........\
    ......................</PasswordHash><ClientVer>|\\34\\80\\\?\\0D\\\?\\FC\
    \\FF\\04|get[\\09-\\0D -~]*Host: imsh\\\\.download-prod\\\\.musicnet\\\\.c\
    om|\\02(\\01|\\02)\\83.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\
    \\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?.\\\?\
    .\\\?.\\\?.\\\?\\02(\\01|\\02)\\83)\" }\r\
    \n:if ([:len [find name=cimd]] > 0) do={ :put \"already have cimd\" } else\
    ={ add name=cimd regexp=\"\\02[0-4][0-9]:[0-9]+.*\\03\\\$\" }\r\
    \n:if ([:len [find name=mohaa]] > 0) do={ :put \"already have mohaa\" } el\
    se={ add name=mohaa regexp=\"^\\FF\\FF\\FF\\FFgetstatus\\0A\" }\r\
    \n:if ([:len [find name=stun]] > 0) do={ :put \"already have stun\" } else\
    ={ add name=stun regexp=\"^[\\01\\02]................\\\?\\\$\" }\r\
    \n:if ([:len [find name=tor]] > 0) do={ :put \"already have tor\" } else={\
    \_add name=tor regexp=\"TOR1.*<identity>\" }\r\
    \n:if ([:len [find name=radmin]] > 0) do={ :put \"already have radmin\" } \
    else={ add name=radmin regexp=\"^\\01\\01(\\08\\08|\\1B\\1B)\\\$\" }\r\
    \n:if ([:len [find name=unset]] > 0) do={ :put \"already have unset\" } el\
    se={ add name=unset regexp=\".\" }\r\
    \n:if ([:len [find name=chikka]] > 0) do={ :put \"already have chikka\" } \
    else={ add name=chikka regexp=\"^CTPv1.[123] Kamusta.*\\0D\\0A\\\$\" }\r\
    \n:if ([:len [find name=replaytv-ivs]] > 0) do={ :put \"already have repla\
    ytv-ivs\" } else={ add name=replaytv-ivs regexp=\"^(get /ivs-IVSGetFileChu\
    nk|http/(0\\\\.9|1\\\\.0|1\\\\.1) [1-5][0-9][0-9] [\\09-\\0D -~]*\\23\\23\
    \\23\\23\\23REPLAY_CHUNK_START\\23\\23\\23\\23\\23)\" }\r\
    \n:if ([:len [find name=armagetron]] > 0) do={ :put \"already have armaget\
    ron\" } else={ add name=armagetron regexp=\"YCLC_E|CYEL\" }"

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐