⌈⌋ branch:  freshcode


Hex Artifact Content

Artifact d6846119988b949e8d34f94e043deb5e5d20c8b6:

  • File tags.php — part of check-in [bba6d0fc18] at 2015-04-15 15:12:23 on branch trunk — Marked state_tag and scope_tags as static. (user: mario size: 23847)

0000: 3c 3f 70 68 70 0a 2f 2a 2a 0a 20 2a 20 41 50 49  <?php./**. * API
0010: 3a 20 66 72 65 73 68 63 6f 64 65 0a 20 2a 20 74  : freshcode. * t
0020: 69 74 6c 65 3a 20 54 61 67 73 20 61 6e 64 20 54  itle: Tags and T
0030: 72 6f 76 65 0a 20 2a 20 64 65 73 63 72 69 70 74  rove. * descript
0040: 69 6f 6e 3a 20 50 72 6f 76 69 64 65 73 20 63 61  ion: Provides ca
0050: 74 65 67 6f 72 69 7a 61 74 69 6f 6e 20 62 61 63  tegorization bac
0060: 6b 65 6e 64 20 66 6f 72 20 74 72 65 65 2d 6d 61  kend for tree-ma
0070: 70 70 65 64 20 74 61 67 73 20 61 6e 64 20 54 72  pped tags and Tr
0080: 6f 76 65 20 67 72 6f 75 70 69 6e 67 2e 0a 20 2a  ove grouping.. *
0090: 20 76 65 72 73 69 6f 6e 3a 20 30 2e 32 0a 20 2a   version: 0.2. *
00a0: 20 74 79 70 65 3a 20 6c 69 62 72 61 72 79 0a 20   type: library. 
00b0: 2a 20 63 61 74 65 67 6f 72 79 3a 20 74 61 78 6f  * category: taxo
00c0: 6e 6f 6d 79 0a 20 2a 20 64 6f 63 3a 20 68 74 74  nomy. * doc: htt
00d0: 70 3a 2f 2f 66 6f 73 73 69 6c 2e 69 6e 63 6c 75  p://fossil.inclu
00e0: 64 65 2d 6f 6e 63 65 2e 6f 72 67 2f 66 72 65 73  de-once.org/fres
00f0: 68 63 6f 64 65 2f 77 69 6b 69 2f 54 72 6f 76 65  hcode/wiki/Trove
0100: 2b 6d 61 70 0a 20 2a 20 6c 69 63 65 6e 73 65 3a  +map. * license:
0110: 20 6d 69 78 65 64 0a 20 2a 0a 20 2a 20 54 68 69   mixed. *. * Thi
0120: 73 20 6d 6f 64 75 6c 65 20 70 72 6f 76 69 64 65  s module provide
0130: 73 20 6d 61 6a 6f 72 20 74 61 67 73 20 69 6e 20  s major tags in 
0140: 61 20 74 72 65 65 2c 20 77 68 69 63 68 20 73 65  a tree, which se
0150: 72 76 65 73 20 61 73 20 62 61 73 65 20 66 6f 72  rves as base for
0160: 20 74 72 6f 76 65 20 63 61 74 65 67 6f 72 69 65   trove categorie
0170: 73 2e 0a 20 2a 20 0a 20 2a 20 20 e2 86 92 20 53  s.. * . *  ... S
0180: 74 69 6c 6c 20 70 65 72 6d 69 74 73 20 66 72 65  till permits fre
0190: 65 2d 66 6f 72 6d 20 74 61 67 73 2e 0a 20 2a 20  e-form tags.. * 
01a0: 20 e2 86 92 20 50 72 6f 76 69 64 65 73 20 66 6f   ... Provides fo
01b0: 72 20 61 6c 69 61 73 69 6e 67 2e 0a 20 2a 20 20  r aliasing.. *  
01c0: e2 86 92 20 4f 6e 6c 79 20 6d 61 6a 6f 72 20 74  ... Only major t
01d0: 6f 70 69 63 20 74 61 67 73 20 65 6e 64 20 75 70  opic tags end up
01e0: 20 69 6e 20 74 72 6f 76 65 20 74 72 65 65 2e 0a   in trove tree..
01f0: 20 2a 20 20 e2 86 92 20 41 6c 6c 6f 77 73 20 74   *  ... Allows t
0200: 6f 20 6d 61 70 20 6c 69 63 65 6e 73 65 73 20 66  o map licenses f
0210: 72 6f 6d 20 61 6e 64 20 74 6f 20 74 61 67 73 2e  rom and to tags.
0220: 0a 20 2a 20 20 e2 86 92 20 48 61 6e 64 6c 65 73  . *  ... Handles
0230: 20 73 6f 6d 65 20 48 54 4d 4c 20 61 6e 64 20 4a   some HTML and J
0240: 53 20 6f 75 74 70 75 74 2e 0a 20 2a 0a 20 2a 20  S output.. *. * 
0250: 0a 20 2a 2f 0a 0a 0a 2f 2a 2a 0a 20 2a 20 46 6f  . */.../**. * Fo
0260: 72 65 6d 6f 73 74 20 62 75 6e 64 6c 65 73 20 73  remost bundles s
0270: 74 61 74 69 63 20 61 72 72 61 79 73 20 66 6f 72  tatic arrays for
0280: 20 74 61 67 73 2e 0a 20 2a 0a 20 2a 20 40 73 74   tags.. *. * @st
0290: 61 74 69 63 0a 20 2a 20 40 64 61 74 61 50 72 6f  atic. * @dataPro
02a0: 76 69 64 65 72 20 6d 61 70 0a 20 2a 0a 20 2a 2f  vider map. *. */
02b0: 0a 63 6c 61 73 73 20 54 61 67 73 20 7b 0a 0a 0a  .class Tags {...
02c0: 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 4c      /**.     * L
02d0: 69 63 65 6e 73 65 20 6d 6f 6e 69 6b 65 72 73 20  icense monikers 
02e0: 61 6e 64 20 66 75 6c 6c 20 6e 61 6d 65 73 2e 0a  and full names..
02f0: 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 2f 0a 20       *.     */. 
0300: 20 20 20 73 74 61 74 69 63 20 70 75 62 6c 69 63     static public
0310: 20 24 6c 69 63 65 6e 73 65 73 20 3d 20 5b 0a 20   $licenses = [. 
0320: 20 20 20 20 20 20 20 22 22 20 3d 3e 20 22 55 6e         "" => "Un
0330: 73 70 65 63 69 66 69 65 64 22 2c 0a 20 20 20 20  specified",.    
0340: 20 20 20 20 22 41 70 61 63 68 65 22 20 3d 3e 20      "Apache" => 
0350: 22 41 70 61 63 68 65 20 4c 69 63 65 6e 73 65 20  "Apache License 
0360: 32 2e 30 22 2c 0a 20 20 20 20 20 20 20 20 22 41  2.0",.        "A
0370: 72 74 69 73 74 69 63 22 20 3d 3e 20 22 41 72 74  rtistic" => "Art
0380: 69 73 74 69 63 20 6c 69 63 65 6e 73 65 20 32 2e  istic license 2.
0390: 30 22 2c 0a 20 20 20 20 20 20 20 20 22 42 53 44  0",.        "BSD
03a0: 4c 22 20 3d 3e 20 22 42 53 44 20 33 2d 43 6c 61  L" => "BSD 3-Cla
03b0: 75 73 65 20 27 4e 65 77 2f 52 65 76 69 73 65 64  use 'New/Revised
03c0: 27 20 4c 69 63 65 6e 73 65 22 2c 0a 20 20 20 20  ' License",.    
03d0: 20 20 20 20 22 42 53 44 4c 2d 32 22 20 3d 3e 20      "BSDL-2" => 
03e0: 22 42 53 44 20 32 2d 43 6c 61 75 73 65 20 27 53  "BSD 2-Clause 'S
03f0: 69 6d 70 6c 69 66 69 65 64 2f 46 72 65 65 42 53  implified/FreeBS
0400: 44 27 20 4c 69 63 65 6e 73 65 22 2c 0a 20 20 20  D' License",.   
0410: 20 20 20 20 20 22 43 44 44 4c 22 20 3d 3e 20 22       "CDDL" => "
0420: 43 6f 6d 6d 6f 6e 20 44 65 76 65 6c 6f 70 6d 65  Common Developme
0430: 6e 74 20 61 6e 64 20 44 69 73 74 72 69 62 75 74  nt and Distribut
0440: 69 6f 6e 20 4c 69 63 65 6e 73 65 20 31 2e 30 22  ion License 1.0"
0450: 2c 0a 20 20 20 20 20 20 20 20 22 4d 49 54 4c 22  ,.        "MITL"
0460: 20 3d 3e 20 22 4d 49 54 20 6c 69 63 65 6e 73 65   => "MIT license
0470: 22 2c 0a 20 20 20 20 20 20 20 20 22 4d 50 4c 22  ",.        "MPL"
0480: 20 3d 3e 20 22 4d 6f 7a 69 6c 6c 61 20 50 75 62   => "Mozilla Pub
0490: 6c 69 63 20 4c 69 63 65 6e 73 65 20 32 2e 30 22  lic License 2.0"
04a0: 2c 0a 20 20 20 20 20 20 20 20 22 50 75 62 6c 69  ,.        "Publi
04b0: 63 20 44 6f 6d 61 69 6e 22 20 3d 3e 20 22 50 75  c Domain" => "Pu
04c0: 62 6c 69 63 20 44 6f 6d 61 69 6e 20 28 6e 6f 20  blic Domain (no 
04d0: 63 6f 70 79 72 69 67 68 74 29 22 2c 0a 20 20 20  copyright)",.   
04e0: 20 20 20 20 20 22 50 79 74 68 6f 6e 22 20 3d 3e       "Python" =>
04f0: 20 22 50 79 74 68 6f 6e 20 4c 69 63 65 6e 73 65   "Python License
0500: 22 2c 0a 20 20 20 20 20 20 20 20 22 50 48 50 4c  ",.        "PHPL
0510: 22 20 3d 3e 20 22 50 48 50 20 4c 69 63 65 6e 73  " => "PHP Licens
0520: 65 20 33 2e 30 22 2c 0a 20 20 20 20 20 20 20 20  e 3.0",.        
0530: 22 47 4e 55 20 47 50 4c 22 20 3d 3e 20 22 47 4e  "GNU GPL" => "GN
0540: 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63  U General Public
0550: 20 4c 69 63 65 6e 73 65 20 32 2e 30 22 2c 0a 20   License 2.0",. 
0560: 20 20 20 20 20 20 20 22 47 4e 55 20 47 50 4c 76         "GNU GPLv
0570: 33 22 20 3d 3e 20 22 47 4e 55 20 47 65 6e 65 72  3" => "GNU Gener
0580: 61 6c 20 50 75 62 6c 69 63 20 4c 69 63 65 6e 73  al Public Licens
0590: 65 20 33 2e 30 22 2c 0a 20 20 20 20 20 20 20 20  e 3.0",.        
05a0: 22 47 4e 55 20 4c 47 50 4c 22 20 3d 3e 20 22 47  "GNU LGPL" => "G
05b0: 4e 55 20 4c 69 62 72 61 72 79 2f 4c 65 73 73 65  NU Library/Lesse
05c0: 72 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63  r General Public
05d0: 20 4c 69 63 65 6e 73 65 20 32 2e 31 22 2c 0a 20   License 2.1",. 
05e0: 20 20 20 20 20 20 20 22 47 4e 55 20 4c 47 50 4c         "GNU LGPL
05f0: 76 33 22 20 3d 3e 20 22 47 4e 55 20 4c 69 62 72  v3" => "GNU Libr
0600: 61 72 79 2f 4c 65 73 73 65 72 20 47 65 6e 65 72  ary/Lesser Gener
0610: 61 6c 20 50 75 62 6c 69 63 20 4c 69 63 65 6e 73  al Public Licens
0620: 65 20 33 2e 30 22 2c 0a 20 20 20 20 20 20 20 20  e 3.0",.        
0630: 22 41 66 66 65 72 6f 20 47 50 4c 22 20 3d 3e 20  "Affero GPL" => 
0640: 22 41 66 66 65 72 6f 20 47 4e 55 20 50 75 62 6c  "Affero GNU Publ
0650: 69 63 20 4c 69 63 65 6e 73 65 20 32 2e 30 22 2c  ic License 2.0",
0660: 0a 20 20 20 20 20 20 20 20 22 41 66 66 65 72 6f  .        "Affero
0670: 20 47 50 4c 76 33 22 20 3d 3e 20 22 47 4e 55 20   GPLv3" => "GNU 
0680: 41 66 66 65 72 6f 20 47 65 6e 65 72 61 6c 20 50  Affero General P
0690: 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 76 33  ublic License v3
06a0: 22 2c 0a 20 20 20 20 20 20 20 20 22 41 46 4c 22  ",.        "AFL"
06b0: 20 3d 3e 20 22 41 63 61 64 65 6d 69 63 20 46 72   => "Academic Fr
06c0: 65 65 20 4c 69 63 65 6e 73 65 20 33 2e 30 22 2c  ee License 3.0",
06d0: 0a 20 20 20 20 20 20 20 20 22 41 50 4c 22 20 3d  .        "APL" =
06e0: 3e 20 22 41 64 61 70 74 69 76 65 20 50 75 62 6c  > "Adaptive Publ
06f0: 69 63 20 4c 69 63 65 6e 73 65 22 2c 0a 20 20 20  ic License",.   
0700: 20 20 20 20 20 22 41 50 53 4c 22 20 3d 3e 20 22       "APSL" => "
0710: 41 70 70 6c 65 20 50 75 62 6c 69 63 20 53 6f 75  Apple Public Sou
0720: 72 63 65 20 4c 69 63 65 6e 73 65 22 2c 0a 20 20  rce License",.  
0730: 20 20 20 20 20 20 22 41 41 4c 22 20 3d 3e 20 22        "AAL" => "
0740: 41 74 74 72 69 62 75 74 69 6f 6e 20 41 73 73 75  Attribution Assu
0750: 72 61 6e 63 65 20 4c 69 63 65 6e 73 65 73 22 2c  rance Licenses",
0760: 0a 20 20 20 20 20 20 20 20 22 42 53 44 4c 2d 34  .        "BSDL-4
0770: 22 20 3d 3e 20 22 42 53 44 20 34 2d 43 6c 61 75  " => "BSD 4-Clau
0780: 73 65 20 27 4f 6c 64 27 20 4c 69 63 65 6e 73 65  se 'Old' License
0790: 22 2c 0a 20 20 20 20 20 20 20 20 22 42 53 4c 22  ",.        "BSL"
07a0: 20 3d 3e 20 22 42 6f 6f 73 74 20 53 6f 66 74 77   => "Boost Softw
07b0: 61 72 65 20 4c 69 63 65 6e 73 65 22 2c 0a 20 20  are License",.  
07c0: 20 20 20 20 20 20 22 43 45 43 49 4c 4c 22 20 3d        "CECILL" =
07d0: 3e 20 22 43 65 43 49 4c 4c 20 4c 69 63 65 6e 73  > "CeCILL Licens
07e0: 65 20 32 2e 31 22 2c 0a 20 20 20 20 20 20 20 20  e 2.1",.        
07f0: 22 43 41 54 4f 53 4c 22 20 3d 3e 20 22 43 6f 6d  "CATOSL" => "Com
0800: 70 75 74 65 72 20 41 73 73 6f 63 69 61 74 65 73  puter Associates
0810: 20 54 72 75 73 74 65 64 20 4f 70 65 6e 20 53 6f   Trusted Open So
0820: 75 72 63 65 20 4c 69 63 65 6e 73 65 20 31 2e 31  urce License 1.1
0830: 22 2c 0a 20 20 20 20 20 20 20 20 22 43 44 44 4c  ",.        "CDDL
0840: 22 20 3d 3e 20 22 43 6f 6d 6d 6f 6e 20 44 65 76  " => "Common Dev
0850: 65 6c 6f 70 6d 65 6e 74 20 61 6e 64 20 44 69 73  elopment and Dis
0860: 74 72 69 62 75 74 69 6f 6e 20 4c 69 63 65 6e 73  tribution Licens
0870: 65 20 31 2e 30 22 2c 0a 20 20 20 20 20 20 20 20  e 1.0",.        
0880: 22 43 50 41 4c 22 20 3d 3e 20 22 43 6f 6d 6d 6f  "CPAL" => "Commo
0890: 6e 20 50 75 62 6c 69 63 20 41 74 74 72 69 62 75  n Public Attribu
08a0: 74 69 6f 6e 20 4c 69 63 65 6e 73 65 20 31 2e 30  tion License 1.0
08b0: 22 2c 0a 20 20 20 20 20 20 20 20 22 43 55 41 22  ",.        "CUA"
08c0: 20 3d 3e 20 22 43 55 41 20 4f 66 66 69 63 65 20   => "CUA Office 
08d0: 50 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 56  Public License V
08e0: 65 72 73 69 6f 6e 20 31 2e 30 22 2c 0a 20 20 20  ersion 1.0",.   
08f0: 20 20 20 20 20 22 45 55 44 61 74 61 67 72 69 64       "EUDatagrid
0900: 22 20 3d 3e 20 22 45 55 20 44 61 74 61 47 72 69  " => "EU DataGri
0910: 64 20 53 6f 66 74 77 61 72 65 20 4c 69 63 65 6e  d Software Licen
0920: 73 65 22 2c 0a 20 20 20 20 20 20 20 20 22 45 50  se",.        "EP
0930: 4c 22 20 3d 3e 20 22 45 63 6c 69 70 73 65 20 50  L" => "Eclipse P
0940: 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 31 2e  ublic License 1.
0950: 30 22 2c 0a 20 20 20 20 20 20 20 20 22 45 43 4c  0",.        "ECL
0960: 22 20 3d 3e 20 22 45 64 75 63 61 74 69 6f 6e 61  " => "Educationa
0970: 6c 20 43 6f 6d 6d 75 6e 69 74 79 20 4c 69 63 65  l Community Lice
0980: 6e 73 65 2c 20 56 65 72 73 69 6f 6e 20 32 2e 30  nse, Version 2.0
0990: 22 2c 0a 20 20 20 20 20 20 20 20 22 45 46 4c 22  ",.        "EFL"
09a0: 20 3d 3e 20 22 45 69 66 66 65 6c 20 46 6f 72 75   => "Eiffel Foru
09b0: 6d 20 4c 69 63 65 6e 73 65 20 56 32 2e 30 22 2c  m License V2.0",
09c0: 0a 20 20 20 20 20 20 20 20 22 45 6e 74 65 73 73  .        "Entess
09d0: 61 22 20 3d 3e 20 22 45 6e 74 65 73 73 61 20 50  a" => "Entessa P
09e0: 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 22 2c 0a  ublic License",.
09f0: 20 20 20 20 20 20 20 20 22 45 55 50 4c 22 20 3d          "EUPL" =
0a00: 3e 20 22 45 75 72 6f 70 65 61 6e 20 55 6e 69 6f  > "European Unio
0a10: 6e 20 50 75 62 6c 69 63 20 4c 69 63 65 6e 73 65  n Public License
0a20: 2c 20 56 65 72 73 69 6f 6e 20 31 2e 31 20 28 45  , Version 1.1 (E
0a30: 55 50 4c 2d 31 2e 31 29 22 2c 0a 20 20 20 20 20  UPL-1.1)",.     
0a40: 20 20 20 22 46 61 69 72 22 20 3d 3e 20 22 46 61     "Fair" => "Fa
0a50: 69 72 20 4c 69 63 65 6e 73 65 22 2c 0a 20 20 20  ir License",.   
0a60: 20 20 20 20 20 22 46 72 61 6d 65 77 6f 72 78 22       "Frameworx"
0a70: 20 3d 3e 20 22 46 72 61 6d 65 77 6f 72 78 20 4c   => "Frameworx L
0a80: 69 63 65 6e 73 65 22 2c 0a 20 20 20 20 20 20 20  icense",.       
0a90: 20 22 48 50 4e 44 22 20 3d 3e 20 22 48 69 73 74   "HPND" => "Hist
0aa0: 6f 72 69 63 61 6c 20 50 65 72 6d 69 73 73 69 6f  orical Permissio
0ab0: 6e 20 4e 6f 74 69 63 65 20 61 6e 64 20 44 69 73  n Notice and Dis
0ac0: 63 6c 61 69 6d 65 72 22 2c 0a 20 20 20 20 20 20  claimer",.      
0ad0: 20 20 22 49 50 4c 22 20 3d 3e 20 22 49 42 4d 20    "IPL" => "IBM 
0ae0: 50 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 31  Public License 1
0af0: 2e 30 22 2c 0a 20 20 20 20 20 20 20 20 22 49 50  .0",.        "IP
0b00: 41 22 20 3d 3e 20 22 49 50 41 20 46 6f 6e 74 20  A" => "IPA Font 
0b10: 4c 69 63 65 6e 73 65 22 2c 0a 20 20 20 20 20 20  License",.      
0b20: 20 20 22 49 53 43 22 20 3d 3e 20 22 49 53 43 20    "ISC" => "ISC 
0b30: 4c 69 63 65 6e 73 65 22 2c 0a 20 20 20 20 20 20  License",.      
0b40: 20 20 22 4c 50 50 4c 22 20 3d 3e 20 22 4c 61 54    "LPPL" => "LaT
0b50: 65 58 20 50 72 6f 6a 65 63 74 20 50 75 62 6c 69  eX Project Publi
0b60: 63 20 4c 69 63 65 6e 73 65 20 31 2e 33 63 22 2c  c License 1.3c",
0b70: 0a 20 20 20 20 20 20 20 20 22 4c 50 4c 22 20 3d  .        "LPL" =
0b80: 3e 20 22 4c 75 63 65 6e 74 20 50 75 62 6c 69 63  > "Lucent Public
0b90: 20 4c 69 63 65 6e 73 65 20 56 65 72 73 69 6f 6e   License Version
0ba0: 20 31 2e 30 32 22 2c 0a 20 20 20 20 20 20 20 20   1.02",.        
0bb0: 22 4d 69 72 4f 53 22 20 3d 3e 20 22 4d 69 72 4f  "MirOS" => "MirO
0bc0: 53 20 4c 69 63 65 6e 63 65 22 2c 0a 20 20 20 20  S Licence",.    
0bd0: 20 20 20 20 22 4d 50 4c 2d 31 22 20 3d 3e 20 22      "MPL-1" => "
0be0: 4d 6f 7a 69 6c 6c 61 20 50 75 62 6c 69 63 20 4c  Mozilla Public L
0bf0: 69 63 65 6e 73 65 20 31 2e 78 20 28 4e 65 74 73  icense 1.x (Nets
0c00: 63 61 70 65 29 22 2c 0a 20 20 20 20 20 20 20 20  cape)",.        
0c10: 22 4d 53 2d 52 4c 22 20 3d 3e 20 22 4d 69 63 72  "MS-RL" => "Micr
0c20: 6f 73 6f 66 74 20 52 65 63 69 70 72 6f 63 61 6c  osoft Reciprocal
0c30: 20 4c 69 63 65 6e 73 65 22 2c 0a 20 20 20 20 20   License",.     
0c40: 20 20 20 22 4d 6f 74 6f 73 6f 74 6f 22 20 3d 3e     "Motosoto" =>
0c50: 20 22 4d 6f 74 6f 73 6f 74 6f 20 4c 69 63 65 6e   "Motosoto Licen
0c60: 73 65 22 2c 0a 20 20 20 20 20 20 20 20 22 4d 75  se",.        "Mu
0c70: 6c 74 69 63 73 22 20 3d 3e 20 22 4d 75 6c 74 69  ltics" => "Multi
0c80: 63 73 20 4c 69 63 65 6e 73 65 22 2c 0a 20 20 20  cs License",.   
0c90: 20 20 20 20 20 22 4e 41 53 41 22 20 3d 3e 20 22       "NASA" => "
0ca0: 4e 41 53 41 20 4f 70 65 6e 20 53 6f 75 72 63 65  NASA Open Source
0cb0: 20 41 67 72 65 65 6d 65 6e 74 20 31 2e 33 22 2c   Agreement 1.3",
0cc0: 0a 20 20 20 20 20 20 20 20 22 4e 54 50 22 20 3d  .        "NTP" =
0cd0: 3e 20 22 4e 54 50 20 4c 69 63 65 6e 73 65 22 2c  > "NTP License",
0ce0: 0a 20 20 20 20 20 20 20 20 22 4e 61 75 6d 65 6e  .        "Naumen
0cf0: 22 20 3d 3e 20 22 4e 61 75 6d 65 6e 20 50 75 62  " => "Naumen Pub
0d00: 6c 69 63 20 4c 69 63 65 6e 73 65 22 2c 0a 20 20  lic License",.  
0d10: 20 20 20 20 20 20 22 4e 47 50 4c 22 20 3d 3e 20        "NGPL" => 
0d20: 22 4e 65 74 68 61 63 6b 20 47 65 6e 65 72 61 6c  "Nethack General
0d30: 20 50 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 22   Public License"
0d40: 2c 0a 20 20 20 20 20 20 20 20 22 4e 6f 6b 69 61  ,.        "Nokia
0d50: 22 20 3d 3e 20 22 4e 6f 6b 69 61 20 4f 70 65 6e  " => "Nokia Open
0d60: 20 53 6f 75 72 63 65 20 4c 69 63 65 6e 73 65 22   Source License"
0d70: 2c 0a 20 20 20 20 20 20 20 20 22 4e 50 4f 53 4c  ,.        "NPOSL
0d80: 22 20 3d 3e 20 22 4e 6f 6e 2d 50 72 6f 66 69 74  " => "Non-Profit
0d90: 20 4f 70 65 6e 20 53 6f 66 74 77 61 72 65 20 4c   Open Software L
0da0: 69 63 65 6e 73 65 20 33 2e 30 22 2c 0a 20 20 20  icense 3.0",.   
0db0: 20 20 20 20 20 22 4f 43 4c 43 22 20 3d 3e 20 22       "OCLC" => "
0dc0: 4f 43 4c 43 20 52 65 73 65 61 72 63 68 20 50 75  OCLC Research Pu
0dd0: 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 32 2e 30  blic License 2.0
0de0: 22 2c 0a 20 20 20 20 20 20 20 20 22 4f 46 4c 22  ",.        "OFL"
0df0: 20 3d 3e 20 22 4f 70 65 6e 20 46 6f 6e 74 20 4c   => "Open Font L
0e00: 69 63 65 6e 73 65 20 31 2e 31 22 2c 0a 20 20 20  icense 1.1",.   
0e10: 20 20 20 20 20 22 4f 47 54 53 4c 22 20 3d 3e 20       "OGTSL" => 
0e20: 22 4f 70 65 6e 20 47 72 6f 75 70 20 54 65 73 74  "Open Group Test
0e30: 20 53 75 69 74 65 20 4c 69 63 65 6e 73 65 22 2c   Suite License",
0e40: 0a 20 20 20 20 20 20 20 20 22 4f 53 4c 22 20 3d  .        "OSL" =
0e50: 3e 20 22 4f 70 65 6e 20 53 6f 66 74 77 61 72 65  > "Open Software
0e60: 20 4c 69 63 65 6e 73 65 20 33 2e 30 22 2c 0a 20   License 3.0",. 
0e70: 20 20 20 20 20 20 20 22 50 6f 73 74 67 72 65 53         "PostgreS
0e80: 51 4c 22 20 3d 3e 20 22 54 68 65 20 50 6f 73 74  QL" => "The Post
0e90: 67 72 65 53 51 4c 20 4c 69 63 65 6e 73 65 22 2c  greSQL License",
0ea0: 0a 20 20 20 20 20 20 20 20 22 43 4e 52 49 22 20  .        "CNRI" 
0eb0: 3d 3e 20 22 43 4e 52 49 20 50 79 74 68 6f 6e 20  => "CNRI Python 
0ec0: 6c 69 63 65 6e 73 65 20 28 43 4e 52 49 2d 50 79  license (CNRI-Py
0ed0: 74 68 6f 6e 29 22 2c 0a 20 20 20 20 20 20 20 20  thon)",.        
0ee0: 22 51 50 4c 22 20 3d 3e 20 22 51 74 20 50 75 62  "QPL" => "Qt Pub
0ef0: 6c 69 63 20 4c 69 63 65 6e 73 65 22 2c 0a 20 20  lic License",.  
0f00: 20 20 20 20 20 20 22 52 50 53 4c 22 20 3d 3e 20        "RPSL" => 
0f10: 22 52 65 61 6c 4e 65 74 77 6f 72 6b 73 20 50 75  "RealNetworks Pu
0f20: 62 6c 69 63 20 53 6f 75 72 63 65 20 4c 69 63 65  blic Source Lice
0f30: 6e 73 65 20 56 31 2e 30 22 2c 0a 20 20 20 20 20  nse V1.0",.     
0f40: 20 20 20 22 52 50 4c 22 20 3d 3e 20 22 52 65 63     "RPL" => "Rec
0f50: 69 70 72 6f 63 61 6c 20 50 75 62 6c 69 63 20 4c  iprocal Public L
0f60: 69 63 65 6e 73 65 20 31 2e 35 22 2c 0a 20 20 20  icense 1.5",.   
0f70: 20 20 20 20 20 22 52 53 43 50 4c 22 20 3d 3e 20       "RSCPL" => 
0f80: 22 52 69 63 6f 68 20 53 6f 75 72 63 65 20 43 6f  "Ricoh Source Co
0f90: 64 65 20 50 75 62 6c 69 63 20 4c 69 63 65 6e 73  de Public Licens
0fa0: 65 22 2c 0a 20 20 20 20 20 20 20 20 22 53 69 6d  e",.        "Sim
0fb0: 50 4c 22 20 3d 3e 20 22 53 69 6d 70 6c 65 20 50  PL" => "Simple P
0fc0: 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 32 2e  ublic License 2.
0fd0: 30 22 2c 0a 20 20 20 20 20 20 20 20 22 53 6c 65  0",.        "Sle
0fe0: 65 70 79 63 61 74 22 20 3d 3e 20 22 53 6c 65 65  epycat" => "Slee
0ff0: 70 79 63 61 74 20 4c 69 63 65 6e 73 65 22 2c 0a  pycat License",.
1000: 20 20 20 20 20 20 20 20 22 53 50 4c 22 20 3d 3e          "SPL" =>
1010: 20 22 53 75 6e 20 50 75 62 6c 69 63 20 4c 69 63   "Sun Public Lic
1020: 65 6e 73 65 20 31 2e 30 22 2c 0a 20 20 20 20 20  ense 1.0",.     
1030: 20 20 20 22 57 61 74 63 6f 6d 22 20 3d 3e 20 22     "Watcom" => "
1040: 53 79 62 61 73 65 20 4f 70 65 6e 20 57 61 74 63  Sybase Open Watc
1050: 6f 6d 20 50 75 62 6c 69 63 20 4c 69 63 65 6e 73  om Public Licens
1060: 65 20 31 2e 30 22 2c 0a 20 20 20 20 20 20 20 20  e 1.0",.        
1070: 22 4e 43 53 41 22 20 3d 3e 20 22 55 6e 69 76 65  "NCSA" => "Unive
1080: 72 73 69 74 79 20 6f 66 20 49 6c 6c 69 6e 6f 69  rsity of Illinoi
1090: 73 2f 4e 43 53 41 20 4f 70 65 6e 20 53 6f 75 72  s/NCSA Open Sour
10a0: 63 65 20 4c 69 63 65 6e 73 65 22 2c 0a 20 20 20  ce License",.   
10b0: 20 20 20 20 20 22 56 53 4c 22 20 3d 3e 20 22 56       "VSL" => "V
10c0: 6f 76 69 64 61 20 53 6f 66 74 77 61 72 65 20 4c  ovida Software L
10d0: 69 63 65 6e 73 65 20 76 2e 20 31 2e 30 22 2c 0a  icense v. 1.0",.
10e0: 20 20 20 20 20 20 20 20 22 57 33 43 22 20 3d 3e          "W3C" =>
10f0: 20 22 57 33 43 20 4c 69 63 65 6e 73 65 22 2c 0a   "W3C License",.
1100: 20 20 20 20 20 20 20 20 22 57 58 77 69 6e 64 6f          "WXwindo
1110: 77 73 22 20 3d 3e 20 22 77 78 57 69 6e 64 6f 77  ws" => "wxWindow
1120: 73 20 4c 69 62 72 61 72 79 20 4c 69 63 65 6e 73  s Library Licens
1130: 65 22 2c 0a 20 20 20 20 20 20 20 20 22 58 6e 65  e",.        "Xne
1140: 74 22 20 3d 3e 20 22 58 2e 4e 65 74 20 4c 69 63  t" => "X.Net Lic
1150: 65 6e 73 65 22 2c 0a 20 20 20 20 20 20 20 20 22  ense",.        "
1160: 5a 50 4c 22 20 3d 3e 20 22 5a 6f 70 65 20 50 75  ZPL" => "Zope Pu
1170: 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 32 2e 30  blic License 2.0
1180: 22 2c 0a 20 20 20 20 20 20 20 20 22 5a 6c 69 62  ",.        "Zlib
1190: 22 20 3d 3e 20 22 7a 6c 69 62 2f 6c 69 62 70 6e  " => "zlib/libpn
11a0: 67 20 6c 69 63 65 6e 73 65 22 2c 0a 20 20 20 20  g license",.    
11b0: 20 20 20 20 22 4f 74 68 65 72 22 20 3d 3e 20 22      "Other" => "
11c0: 4f 74 68 65 72 20 4c 69 63 65 6e 73 65 22 2c 0a  Other License",.
11d0: 20 20 20 20 20 20 20 20 22 4d 69 78 65 64 22 20          "Mixed" 
11e0: 3d 3e 20 22 4d 75 6c 74 69 70 6c 65 20 4c 69 63  => "Multiple Lic
11f0: 65 6e 73 65 73 22 2c 0a 20 20 20 20 5d 3b 20 20  enses",.    ];  
1200: 20 2f 2f 20 74 6f 64 6f 3a 20 44 69 63 75 73 73   // todo: Dicuss
1210: 20 65 6e 74 72 79 20 66 6f 72 20 43 6f 6d 6d 65   entry for Comme
1220: 72 63 69 61 6c 2f 50 72 6f 70 72 69 65 74 61 72  rcial/Proprietar
1230: 79 20 63 6f 64 65 20 61 6e 79 68 6f 77 2e 0a 20  y code anyhow.. 
1240: 20 20 20 20 20 20 20 20 2f 2f 20 68 69 6e 74 3a          // hint:
1250: 20 53 65 70 61 72 61 74 69 6f 6e 20 75 73 75 61   Separation usua
1260: 6c 6c 79 20 77 6f 72 6b 73 20 62 65 74 74 65 72  lly works better
1270: 20 74 68 61 6e 20 70 72 6f 68 69 62 69 74 69 6f   than prohibitio
1280: 6e 2e 0a 20 20 20 20 20 20 20 20 20 2f 2f 20 20  n..         //  
1290: 20 20 20 20 20 28 46 69 6c 74 65 72 69 6e 67 20       (Filtering 
12a0: 69 6e 73 74 65 61 64 20 6f 66 20 63 6c 65 61 6e  instead of clean
12b0: 75 70 73 29 0a 0a 0a 20 20 20 20 2f 2a 2a 0a 20  ups)...    /**. 
12c0: 20 20 20 20 2a 20 54 61 67 20 61 6c 69 61 73 65      * Tag aliase
12d0: 73 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a  s..     *.     *
12e0: 2f 0a 20 20 20 20 73 74 61 74 69 63 20 70 75 62  /.    static pub
12f0: 6c 69 63 20 24 61 6c 69 61 73 20 3d 20 5b 0a 20  lic $alias = [. 
1300: 20 20 20 20 20 20 20 22 65 6d 61 69 6c 22 20 3d         "email" =
1310: 3e 20 22 65 2d 6d 61 69 6c 22 2c 0a 20 20 20 20  > "e-mail",.    
1320: 5d 3b 0a 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20  ];...    /**.   
1330: 20 20 2a 20 54 61 67 20 74 72 65 65 2e 0a 20 20    * Tag tree..  
1340: 20 20 20 2a 0a 20 20 20 20 20 2a 2f 0a 20 20 20     *.     */.   
1350: 20 73 74 61 74 69 63 20 70 75 62 6c 69 63 20 24   static public $
1360: 74 72 65 65 20 3d 0a 20 20 20 20 20 20 20 20 5b  tree =.        [
1370: 0a 20 20 20 20 20 20 20 20 22 54 6f 70 69 63 22  .        "Topic"
1380: 20 3d 3e 20 5b 0a 20 20 20 20 20 20 20 20 20 20   => [.          
1390: 20 20 22 41 64 61 70 74 69 76 65 20 54 65 63 68    "Adaptive Tech
13a0: 6e 6f 6c 6f 67 69 65 73 22 2c 0a 20 20 20 20 20  nologies",.     
13b0: 20 20 20 20 20 20 20 22 41 72 74 69 73 74 69 63         "Artistic
13c0: 20 53 6f 66 74 77 61 72 65 22 2c 0a 20 20 20 20   Software",.    
13d0: 20 20 20 20 20 20 20 20 22 43 6f 6d 6d 75 6e 69          "Communi
13e0: 63 61 74 69 6f 6e 22 2c 0a 20 20 20 20 20 20 20  cation",.       
13f0: 20 20 20 20 20 22 43 6f 6d 6d 75 6e 69 63 61 74       "Communicat
1400: 69 6f 6e 22 20 3d 3e 20 5b 0a 20 20 20 20 20 20  ion" => [.      
1410: 20 20 20 20 20 20 20 20 20 20 22 42 42 53 22 2c            "BBS",
1420: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1430: 20 22 43 68 61 74 22 2c 0a 20 20 20 20 20 20 20   "Chat",.       
1440: 20 20 20 20 20 20 20 20 20 22 43 68 61 74 22 20           "Chat" 
1450: 3d 3e 20 5b 0a 20 20 20 20 20 20 20 20 20 20 20  => [.           
1460: 20 20 20 20 20 20 20 20 20 22 49 43 51 22 2c 0a           "ICQ",.
1470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1480: 20 20 20 20 22 49 6e 74 65 72 6e 65 74 20 52 65      "Internet Re
1490: 6c 61 79 20 43 68 61 74 22 2c 0a 20 20 20 20 20  lay Chat",.     
14a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
14b0: 53 6b 79 70 65 22 2c 0a 20 20 20 20 20 20 20 20  Skype",.        
14c0: 20 20 20 20 20 20 20 20 20 20 20 20 22 55 6e 69              "Uni
14d0: 78 20 54 61 6c 6b 22 2c 0a 20 20 20 20 20 20 20  x Talk",.       
14e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 58 4d               "XM
14f0: 50 50 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  PP".            
1500: 20 20 20 20 5d 2c 0a 20 20 20 20 20 20 20 20 20      ],.         
1510: 20 20 20 20 20 20 20 22 43 6f 6e 66 65 72 65 6e         "Conferen
1520: 63 69 6e 67 22 2c 0a 20 20 20 20 20 20 20 20 20  cing",.         
1530: 20 20 20 20 20 20 20 22 45 6d 61 69 6c 22 2c 0a         "Email",.
1540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1550: 22 45 6d 61 69 6c 22 20 3d 3e 20 5b 0a 20 20 20  "Email" => [.   
1560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1570: 20 22 41 64 64 72 65 73 73 20 42 6f 6f 6b 22 2c   "Address Book",
1580: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1590: 20 20 20 20 20 22 45 6d 61 69 6c 20 43 6c 69 65       "Email Clie
15a0: 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  nt",.           
15b0: 20 20 20 20 20 20 20 20 20 22 45 6d 61 69 6c 20           "Email 
15c0: 46 69 6c 74 65 72 22 2c 0a 20 20 20 20 20 20 20  Filter",.       
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4d 61               "Ma
15e0: 69 6c 69 6e 67 20 4c 69 73 74 20 53 65 72 76 65  iling List Serve
15f0: 72 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r",.            
1600: 20 20 20 20 20 20 20 20 22 4d 61 69 6c 20 54 72          "Mail Tr
1610: 61 6e 73 70 6f 72 74 20 41 67 65 6e 74 22 2c 0a  ansport Agent",.
1620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1630: 20 20 20 20 22 49 4d 41 50 22 2c 0a 20 20 20 20      "IMAP",.    
1640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1650: 22 50 4f 50 33 22 0a 20 20 20 20 20 20 20 20 20  "POP3".         
1660: 20 20 20 20 20 20 20 5d 2c 0a 20 20 20 20 20 20         ],.      
1670: 20 20 20 20 20 20 20 20 20 20 22 46 61 78 22 2c            "Fax",
1680: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1690: 20 22 46 49 44 4f 22 2c 0a 20 20 20 20 20 20 20   "FIDO",.       
16a0: 20 20 20 20 20 20 20 20 20 22 46 69 6c 65 20 53           "File S
16b0: 68 61 72 69 6e 67 22 2c 0a 20 20 20 20 20 20 20  haring",.       
16c0: 20 20 20 20 20 20 20 20 20 22 48 61 6d 20 52 61           "Ham Ra
16d0: 64 69 6f 22 2c 0a 20 20 20 20 20 20 20 20 20 20  dio",.          
16e0: 20 20 20 20 20 20 22 49 6e 74 65 72 6e 65 74 20        "Internet 
16f0: 50 68 6f 6e 65 22 2c 0a 20 20 20 20 20 20 20 20  Phone",.        
1700: 20 20 20 20 20 20 20 20 22 54 65 6c 65 70 68 6f          "Telepho
1710: 6e 79 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ny",.           
1720: 20 20 20 20 20 22 55 73 65 6e 65 74 22 0a 20 20       "Usenet".  
1730: 20 20 20 20 20 20 20 20 20 20 5d 2c 0a 20 20 20            ],.   
1740: 20 20 20 20 20 20 20 20 20 22 44 61 74 61 62 61           "Databa
1750: 73 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  se",.           
1760: 20 22 44 61 74 61 62 61 73 65 22 20 3d 3e 20 5b   "Database" => [
1770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1780: 20 22 44 61 74 61 62 61 73 65 2d 73 65 72 76 65   "Database-serve
1790: 72 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r",.            
17a0: 20 20 20 20 22 46 72 6f 6e 74 2d 45 6e 64 22 0a      "Front-End".
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 5d 2c 0a 20              ],. 
17c0: 20 20 20 20 20 20 20 20 20 20 20 22 44 65 73 6b             "Desk
17d0: 74 6f 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20  top",.          
17e0: 20 20 22 44 65 73 6b 74 6f 70 22 20 3d 3e 20 5b    "Desktop" => [
17f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1800: 20 22 46 69 6c 65 20 4d 61 6e 61 67 65 72 22 2c   "File Manager",
1810: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1820: 20 22 47 6e 6f 6d 65 22 2c 0a 20 20 20 20 20 20   "Gnome",.      
1830: 20 20 20 20 20 20 20 20 20 20 22 47 4e 55 73 74            "GNUst
1840: 65 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ep",.           
1850: 20 20 20 20 20 22 4b 44 45 22 2c 0a 20 20 20 20       "KDE",.    
1860: 20 20 20 20 20 20 20 20 20 20 20 20 22 50 69 63              "Pic
1870: 6f 47 55 49 22 2c 0a 20 20 20 20 20 20 20 20 20  oGUI",.         
1880: 20 20 20 20 20 20 20 22 53 63 72 65 65 6e 20 53         "Screen S
1890: 61 76 65 72 73 22 2c 0a 20 20 20 20 20 20 20 20  avers",.        
18a0: 20 20 20 20 20 20 20 20 22 57 69 6e 64 6f 77 20          "Window 
18b0: 4d 61 6e 61 67 65 72 22 2c 0a 20 20 20 20 20 20  Manager",.      
18c0: 20 20 20 20 20 20 20 20 20 20 22 57 69 6e 64 6f            "Windo
18d0: 77 20 4d 61 6e 61 67 65 72 22 20 3d 3e 20 5b 0a  w Manager" => [.
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f0: 20 20 20 20 22 41 66 74 65 72 73 74 65 70 22 2c      "Afterstep",
1900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1910: 20 20 20 20 20 22 41 70 70 6c 65 74 22 2c 0a 20       "Applet",. 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1930: 20 20 20 22 42 6c 61 63 6b 62 6f 78 22 2c 0a 20     "Blackbox",. 
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1950: 20 20 20 22 43 54 57 4d 22 2c 0a 20 20 20 20 20     "CTWM",.     
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1970: 45 6e 6c 69 67 68 74 65 6e 6d 65 6e 74 22 2c 0a  Enlightenment",.
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 20 20 20 20 22 46 6c 75 78 62 6f 78 22 2c 0a 20      "Fluxbox",. 
19a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b0: 20 20 20 22 46 56 57 4d 22 2c 0a 20 20 20 20 20     "FVWM",.     
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
19d0: 49 63 65 57 4d 22 2c 0a 20 20 20 20 20 20 20 20  IceWM",.        
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 22 4d 65 74              "Met
19f0: 61 43 69 74 79 22 2c 0a 20 20 20 20 20 20 20 20  aCity",.        
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 22 4f 70 65              "Ope
1a10: 6e 62 6f 78 22 2c 0a 20 20 20 20 20 20 20 20 20  nbox",.         
1a20: 20 20 20 20 20 20 20 20 20 20 20 22 4f 72 6f 62             "Orob
1a30: 6f 72 75 73 22 2c 0a 20 20 20 20 20 20 20 20 20  orus",.         
1a40: 20 20 20 20 20 20 20 20 20 20 20 22 53 61 77 66             "Sawf
1a50: 69 73 68 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ish",.          
1a60: 20 20 20 20 20 20 20 20 20 20 22 57 61 69 6d 65            "Waime
1a70: 61 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  a",.            
1a80: 20 20 20 20 20 20 20 20 22 57 69 6e 64 6f 77 20          "Window 
1a90: 4d 61 6b 65 72 22 2c 0a 20 20 20 20 20 20 20 20  Maker",.        
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 22 58 46 43              "XFC
1ab0: 45 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E".             
1ac0: 20 20 20 5d 0a 20 20 20 20 20 20 20 20 20 20 20     ].           
1ad0: 20 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ],.            
1ae0: 22 44 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 22 2c  "Documentation",
1af0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 45 64  .            "Ed
1b00: 75 63 61 74 69 6f 6e 22 2c 0a 20 20 20 20 20 20  ucation",.      
1b10: 20 20 20 20 20 20 22 45 64 75 63 61 74 69 6f 6e        "Education
1b20: 22 20 3d 3e 20 5b 0a 20 20 20 20 20 20 20 20 20  " => [.         
1b30: 20 20 20 20 20 20 20 22 43 6f 6d 70 75 74 65 72         "Computer
1b40: 20 41 69 64 65 64 20 49 6e 73 74 72 75 63 74 69   Aided Instructi
1b50: 6f 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  on",.           
1b60: 20 20 20 20 20 22 54 65 73 74 69 6e 67 22 0a 20       "Testing". 
1b70: 20 20 20 20 20 20 20 20 20 20 20 5d 2c 0a 20 20             ],.  
1b80: 20 20 20 20 20 20 20 20 20 20 22 47 61 6d 65 22            "Game"
1b90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 47  ,.            "G
1ba0: 61 6d 65 22 20 3d 3e 20 5b 0a 20 20 20 20 20 20  ame" => [.      
1bb0: 20 20 20 20 20 20 20 20 20 20 22 41 72 63 61 64            "Arcad
1bc0: 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
1bd0: 20 20 20 20 22 42 6f 61 72 64 20 47 61 6d 65 22      "Board Game"
1be0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1bf0: 20 20 22 46 69 72 73 74 20 50 65 72 73 6f 6e 20    "First Person 
1c00: 53 68 6f 6f 74 65 72 22 2c 0a 20 20 20 20 20 20  Shooter",.      
1c10: 20 20 20 20 20 20 20 20 20 20 22 46 6f 72 74 75            "Fortu
1c20: 6e 65 20 43 6f 6f 6b 69 65 73 22 2c 0a 20 20 20  ne Cookies",.   
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4d 75               "Mu
1c40: 6c 74 69 2d 55 73 65 72 20 44 75 6e 67 65 6f 6e  lti-User Dungeon
1c50: 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
1c60: 20 20 20 20 22 50 75 7a 7a 6c 65 22 2c 0a 20 20      "Puzzle",.  
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52                "R
1c80: 65 61 6c 20 54 69 6d 65 20 53 74 72 61 74 65 67  eal Time Strateg
1c90: 79 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  y",.            
1ca0: 20 20 20 20 22 52 6f 6c 65 2d 50 6c 61 79 69 6e      "Role-Playin
1cb0: 67 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  g",.            
1cc0: 20 20 20 20 22 53 69 64 65 2d 53 63 72 6f 6c 6c      "Side-Scroll
1cd0: 69 6e 67 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ing",.          
1ce0: 20 20 20 20 20 20 22 53 69 6d 75 6c 61 74 69 6f        "Simulatio
1cf0: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1d00: 20 20 20 20 22 54 75 72 6e 20 42 61 73 65 64 20      "Turn Based 
1d10: 53 74 72 61 74 65 67 79 22 0a 20 20 20 20 20 20  Strategy".      
1d20: 20 20 20 20 20 20 5d 2c 0a 20 20 20 20 20 20 20        ],.       
1d30: 20 20 20 20 20 22 48 6f 6d 65 20 41 75 74 6f 6d       "Home Autom
1d40: 61 74 69 6f 6e 22 2c 0a 20 20 20 20 20 20 20 20  ation",.        
1d50: 20 20 20 20 22 49 6e 74 65 72 6e 65 74 22 2c 0a      "Internet",.
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 22 49 6e 74              "Int
1d70: 65 72 6e 65 74 22 20 3d 3e 20 5b 0a 20 20 20 20  ernet" => [.    
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 22 46 54 50              "FTP
1d90: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1da0: 20 20 20 22 46 69 6e 67 65 72 22 2c 0a 20 20 20     "Finger",.   
1db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4c 6f               "Lo
1dc0: 67 20 41 6e 61 6c 79 73 69 73 22 2c 0a 20 20 20  g Analysis",.   
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 44 4e               "DN
1de0: 53 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  S",.            
1df0: 20 20 20 20 22 50 72 6f 78 79 20 53 65 72 76 65      "Proxy Serve
1e00: 72 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r",.            
1e10: 20 20 20 20 22 57 41 50 22 2c 0a 20 20 20 20 20      "WAP",.     
1e20: 20 20 20 20 20 20 20 20 20 20 20 22 57 57 57 22             "WWW"
1e30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e40: 20 20 22 57 57 57 22 20 3d 3e 20 5b 0a 20 20 20    "WWW" => [.   
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e60: 20 22 42 72 6f 77 73 65 72 22 2c 0a 20 20 20 20   "Browser",.    
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e80: 22 44 79 6e 61 6d 69 63 20 43 6f 6e 74 65 6e 74  "Dynamic Content
1e90: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1ea0: 20 20 20 20 20 20 20 22 44 79 6e 61 6d 69 63 20         "Dynamic 
1eb0: 43 6f 6e 74 65 6e 74 22 20 3d 3e 20 5b 0a 20 20  Content" => [.  
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed0: 20 20 20 20 20 20 22 43 47 49 20 4c 69 62 72 61        "CGI Libra
1ee0: 72 79 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ry",.           
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4d 65               "Me
1f00: 73 73 61 67 65 20 42 6f 61 72 64 22 2c 0a 20 20  ssage Board",.  
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f20: 20 20 20 20 20 20 22 4e 65 77 73 2f 44 69 61 72        "News/Diar
1f30: 79 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  y",.            
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 22 50 61 67              "Pag
1f50: 65 20 43 6f 75 6e 74 65 72 22 0a 20 20 20 20 20  e Counter".     
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5d                 ]
1f70: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f80: 20 20 20 20 20 20 22 48 54 54 50 20 53 65 72 76        "HTTP Serv
1f90: 65 72 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  er",.           
1fa0: 20 20 20 20 20 20 20 20 20 22 49 6e 64 65 78 69           "Indexi
1fb0: 6e 67 2f 53 65 61 72 63 68 22 2c 0a 20 20 20 20  ng/Search",.    
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd0: 22 53 65 73 73 69 6f 6e 22 2c 0a 20 20 20 20 20  "Session",.     
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1ff0: 53 69 74 65 20 4d 61 6e 61 67 65 6d 65 6e 74 22  Site Management"
2000: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2010: 20 20 20 20 20 20 22 53 69 74 65 20 4d 61 6e 61        "Site Mana
2020: 67 65 6d 65 6e 74 22 20 3d 3e 20 5b 0a 20 20 20  gement" => [.   
2030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2040: 20 20 20 20 20 22 4c 69 6e 6b 20 43 68 65 63 6b       "Link Check
2050: 69 6e 67 22 0a 20 20 20 20 20 20 20 20 20 20 20  ing".           
2060: 20 20 20 20 20 20 20 20 20 5d 2c 0a 20 20 20 20           ],.    
2070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2080: 22 57 53 47 49 22 0a 20 20 20 20 20 20 20 20 20  "WSGI".         
2090: 20 20 20 20 20 20 20 5d 0a 20 20 20 20 20 20 20         ].       
20a0: 20 20 20 20 20 5d 2c 0a 20 20 20 20 20 20 20 20       ],.        
20b0: 20 20 20 20 22 4d 75 6c 74 69 6d 65 64 69 61 22      "Multimedia"
20c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 4d  ,.            "M
20d0: 75 6c 74 69 6d 65 64 69 61 22 20 3d 3e 20 5b 0a  ultimedia" => [.
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f0: 22 47 72 61 70 68 69 63 73 22 2c 0a 20 20 20 20  "Graphics",.    
2100: 20 20 20 20 20 20 20 20 20 20 20 20 22 47 72 61              "Gra
2110: 70 68 69 63 73 22 20 3d 3e 20 5b 0a 20 20 20 20  phics" => [.    
2120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2130: 22 33 44 20 4d 6f 64 65 6c 69 6e 67 22 2c 0a 20  "3D Modeling",. 
2140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2150: 20 20 20 22 33 44 20 52 65 6e 64 65 72 69 6e 67     "3D Rendering
2160: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2170: 20 20 20 20 20 20 20 22 43 61 70 74 75 72 65 22         "Capture"
2180: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2190: 20 20 20 20 20 20 22 43 61 70 74 75 72 65 22 20        "Capture" 
21a0: 3d 3e 20 5b 0a 20 20 20 20 20 20 20 20 20 20 20  => [.           
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 44 69               "Di
21c0: 67 69 74 61 6c 20 43 61 6d 65 72 61 22 2c 0a 20  gital Camera",. 
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 20 20 20 20 20 20 22 53 63 61 6e 6e 65 72 22         "Scanner"
21f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2200: 20 20 20 20 20 20 20 20 20 20 22 53 63 72 65 65            "Scree
2210: 6e 20 43 61 70 74 75 72 65 22 0a 20 20 20 20 20  n Capture".     
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5d                 ]
2230: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2240: 20 20 20 20 20 20 22 45 64 69 74 6f 72 22 2c 0a        "Editor",.
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2260: 20 20 20 20 22 45 64 69 74 6f 72 22 20 3d 3e 20      "Editor" => 
2270: 5b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  [.              
2280: 20 20 20 20 20 20 20 20 20 20 22 52 61 73 74 65            "Raste
2290: 72 2d 42 61 73 65 64 22 2c 0a 20 20 20 20 20 20  r-Based",.      
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b0: 20 20 22 56 65 63 74 6f 72 2d 42 61 73 65 64 22    "Vector-Based"
22c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22d0: 20 20 20 20 20 5d 2c 0a 20 20 20 20 20 20 20 20       ],.        
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 22 47 72 61              "Gra
22f0: 70 68 69 63 73 20 43 6f 6e 76 65 72 73 69 6f 6e  phics Conversion
2300: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2310: 20 20 20 20 20 20 20 22 50 72 65 73 65 6e 74 61         "Presenta
2320: 74 69 6f 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  tion",.         
2330: 20 20 20 20 20 20 20 20 20 20 20 22 56 69 65 77             "View
2340: 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  er".            
2350: 20 20 20 20 5d 2c 0a 20 20 20 20 20 20 20 20 20      ],.         
2360: 20 20 20 20 20 20 20 22 41 75 64 69 6f 22 2c 0a         "Audio",.
2370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2380: 22 41 75 64 69 6f 22 20 3d 3e 20 5b 0a 20 20 20  "Audio" => [.   
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a0: 20 22 41 6e 61 6c 79 73 69 73 22 2c 0a 20 20 20   "Analysis",.   
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c0: 20 22 52 65 63 6f 72 64 69 6e 67 22 2c 0a 20 20   "Recording",.  
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e0: 20 20 22 43 44 20 41 75 64 69 6f 22 2c 0a 20 20    "CD Audio",.  
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2400: 20 20 22 43 44 20 41 75 64 69 6f 22 20 3d 3e 20    "CD Audio" => 
2410: 5b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  [.              
2420: 20 20 20 20 20 20 20 20 20 20 22 43 44 20 50 6c            "CD Pl
2430: 61 79 69 6e 67 22 2c 0a 20 20 20 20 20 20 20 20  aying",.        
2440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2450: 22 43 44 20 52 69 70 70 69 6e 67 22 2c 0a 20 20  "CD Ripping",.  
2460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2470: 20 20 20 20 20 20 22 43 44 20 57 72 69 74 69 6e        "CD Writin
2480: 67 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g".             
2490: 20 20 20 20 20 20 20 5d 2c 0a 20 20 20 20 20 20         ],.      
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 43                "C
24b0: 6f 6e 76 65 72 73 69 6f 6e 22 2c 0a 20 20 20 20  onversion",.    
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d0: 22 45 64 69 74 6f 72 73 22 2c 0a 20 20 20 20 20  "Editors",.     
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
24f0: 4d 49 44 49 22 2c 0a 20 20 20 20 20 20 20 20 20  MIDI",.         
2500: 20 20 20 20 20 20 20 20 20 20 20 22 4d 69 78 65             "Mixe
2510: 72 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rs",.           
2520: 20 20 20 20 20 20 20 20 20 22 50 6c 61 79 65 72           "Player
2530: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2540: 20 20 20 20 20 20 20 22 50 6c 61 79 65 72 22 20         "Player" 
2550: 3d 3e 20 5b 0a 20 20 20 20 20 20 20 20 20 20 20  => [.           
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4d 50               "MP
2570: 33 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  3".             
2580: 20 20 20 20 20 20 20 5d 2c 0a 20 20 20 20 20 20         ],.      
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
25a0: 6f 75 6e 64 20 53 79 6e 74 68 65 73 69 73 22 2c  ound Synthesis",
25b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25c0: 20 20 20 20 20 22 53 70 65 65 63 68 22 0a 20 20       "Speech".  
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5d 2c                ],
25e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25f0: 20 22 56 69 64 65 6f 22 2c 0a 20 20 20 20 20 20   "Video",.      
2600: 20 20 20 20 20 20 20 20 20 20 22 56 69 64 65 6f            "Video
2610: 22 20 3d 3e 20 5b 0a 20 20 20 20 20 20 20 20 20  " => [.         
2620: 20 20 20 20 20 20 20 20 20 20 20 22 43 61 70 74             "Capt
2630: 75 72 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ure",.          
2640: 20 20 20 20 20 20 20 20 20 20 22 43 6f 6e 76 65            "Conve
2650: 72 73 69 6f 6e 22 2c 0a 20 20 20 20 20 20 20 20  rsion",.        
2660: 20 20 20 20 20 20 20 20 20 20 20 20 22 44 69 73              "Dis
2670: 70 6c 61 79 22 2c 0a 20 20 20 20 20 20 20 20 20  play",.         
2680: 20 20 20 20 20 20 20 20 20 20 20 22 4e 6f 6e 2d             "Non-
2690: 4c 69 6e 65 61 72 20 45 64 69 74 6f 72 22 0a 20  Linear Editor". 
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5d                 ]
26b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5d 2c 0a  .            ],.
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 22 4f 66 66              "Off
26d0: 69 63 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ice",.          
26e0: 20 20 22 4f 66 66 69 63 65 22 20 3d 3e 20 5b 0a    "Office" => [.
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2700: 22 46 69 6e 61 6e 63 69 61 6c 22 2c 0a 20 20 20  "Financial",.   
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 46 69               "Fi
2720: 6e 61 6e 63 69 61 6c 22 20 3d 3e 20 5b 0a 20 20  nancial" => [.  
2730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2740: 20 20 22 41 63 63 6f 75 6e 74 69 6e 67 22 2c 0a    "Accounting",.
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2760: 20 20 20 20 22 49 6e 76 65 73 74 6d 65 6e 74 22      "Investment"
2770: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2780: 20 20 20 20 20 20 22 50 6f 69 6e 74 2d 4f 66 2d        "Point-Of-
2790: 53 61 6c 65 22 2c 0a 20 20 20 20 20 20 20 20 20  Sale",.         
27a0: 20 20 20 20 20 20 20 20 20 20 20 22 53 70 72 65             "Spre
27b0: 61 64 73 68 65 65 74 22 0a 20 20 20 20 20 20 20  adsheet".       
27c0: 20 20 20 20 20 20 20 20 20 5d 2c 0a 20 20 20 20           ],.    
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 22 47 72 6f              "Gro
27e0: 75 70 77 61 72 65 22 2c 0a 20 20 20 20 20 20 20  upware",.       
27f0: 20 20 20 20 20 20 20 20 20 22 4e 65 77 73 2f 44           "News/D
2800: 69 61 72 79 22 2c 0a 20 20 20 20 20 20 20 20 20  iary",.         
2810: 20 20 20 20 20 20 20 22 4f 66 66 69 63 65 20 53         "Office S
2820: 75 69 74 65 22 2c 0a 20 20 20 20 20 20 20 20 20  uite",.         
2830: 20 20 20 20 20 20 20 22 53 63 68 65 64 75 6c 69         "Scheduli
2840: 6e 67 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  ng".            
2850: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  ],.            "
2860: 50 72 69 6e 74 69 6e 67 22 2c 0a 20 20 20 20 20  Printing",.     
2870: 20 20 20 20 20 20 20 22 52 65 6c 69 67 69 6f 6e         "Religion
2880: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  ",.            "
2890: 53 63 69 65 6e 74 69 66 69 63 22 2c 0a 20 20 20  Scientific",.   
28a0: 20 20 20 20 20 20 20 20 20 22 53 63 69 65 6e 74           "Scient
28b0: 69 66 69 63 22 20 3d 3e 20 5b 0a 20 20 20 20 20  ific" => [.     
28c0: 20 20 20 20 20 20 20 20 20 20 20 22 41 72 74 69             "Arti
28d0: 66 69 63 69 61 6c 20 49 6e 74 65 6c 6c 69 67 65  ficial Intellige
28e0: 6e 63 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20  nce",.          
28f0: 20 20 20 20 20 20 22 41 72 74 69 66 69 63 69 61        "Artificia
2900: 6c 20 4c 69 66 65 22 2c 0a 20 20 20 20 20 20 20  l Life",.       
2910: 20 20 20 20 20 20 20 20 20 22 41 73 74 72 6f 6e           "Astron
2920: 6f 6d 79 22 2c 0a 20 20 20 20 20 20 20 20 20 20  omy",.          
2930: 20 20 20 20 20 20 22 41 74 6d 6f 73 70 68 65 72        "Atmospher
2940: 69 63 20 53 63 69 65 6e 63 65 22 2c 0a 20 20 20  ic Science",.   
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 42 69               "Bi
2960: 6f 2d 49 6e 66 6f 72 6d 61 74 69 63 73 22 2c 0a  o-Informatics",.
2970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2980: 22 43 68 65 6d 69 73 74 72 79 22 2c 0a 20 20 20  "Chemistry",.   
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 45 6c               "El
29a0: 65 63 74 72 6f 6e 69 63 20 44 65 73 69 67 6e 20  ectronic Design 
29b0: 41 75 74 6f 6d 61 74 69 6f 6e 22 2c 0a 20 20 20  Automation",.   
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 47 49               "GI
29d0: 53 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  S",.            
29e0: 20 20 20 20 22 48 75 6d 61 6e 20 4d 61 63 68 69      "Human Machi
29f0: 6e 65 20 49 6e 74 65 72 66 61 63 65 73 22 2c 0a  ne Interfaces",.
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a10: 22 49 6d 61 67 65 20 52 65 63 6f 67 6e 69 74 69  "Image Recogniti
2a20: 6f 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  on",.           
2a30: 20 20 20 20 20 22 49 6e 66 6f 72 6d 61 74 69 6f       "Informatio
2a40: 6e 20 41 6e 61 6c 79 73 69 73 22 2c 0a 20 20 20  n Analysis",.   
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49 6e               "In
2a60: 74 65 72 66 61 63 65 20 45 6e 67 69 6e 65 22 2c  terface Engine",
2a70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a80: 20 22 4d 61 74 68 65 6d 61 74 69 63 73 22 2c 0a   "Mathematics",.
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa0: 22 4d 65 64 69 63 61 6c 20 53 63 69 65 6e 63 65  "Medical Science
2ab0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2ac0: 20 20 20 22 50 68 79 73 69 63 73 22 2c 0a 20 20     "Physics",.  
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 56                "V
2ae0: 69 73 75 61 6c 69 7a 61 74 69 6f 6e 22 0a 20 20  isualization".  
2af0: 20 20 20 20 20 20 20 20 20 20 5d 2c 0a 20 20 20            ],.   
2b00: 20 20 20 20 20 20 20 20 20 22 53 65 63 75 72 69           "Securi
2b10: 74 79 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ty",.           
2b20: 20 22 53 65 63 75 72 69 74 79 22 20 3d 3e 20 5b   "Security" => [
2b30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b40: 20 22 43 72 79 70 74 6f 67 72 61 70 68 79 22 0a   "Cryptography".
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 5d 2c 0a 20              ],. 
2b60: 20 20 20 20 20 20 20 20 20 20 20 22 53 6f 63 69             "Soci
2b70: 6f 6c 6f 67 79 22 2c 0a 20 20 20 20 20 20 20 20  ology",.        
2b80: 20 20 20 20 22 53 6f 63 69 6f 6c 6f 67 79 22 20      "Sociology" 
2b90: 3d 3e 20 5b 0a 20 20 20 20 20 20 20 20 20 20 20  => [.           
2ba0: 20 20 20 20 20 22 47 65 6e 65 61 6c 6f 67 79 22       "Genealogy"
2bb0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2bc0: 20 20 22 48 69 73 74 6f 72 79 22 0a 20 20 20 20    "History".    
2bd0: 20 20 20 20 20 20 20 20 5d 2c 0a 20 20 20 20 20          ],.     
2be0: 20 20 20 20 20 20 20 22 53 6f 66 74 77 61 72 65         "Software
2bf0: 20 44 65 76 65 6c 6f 70 6d 65 6e 74 22 2c 0a 20   Development",. 
2c00: 20 20 20 20 20 20 20 20 20 20 20 22 53 6f 66 74             "Soft
2c10: 77 61 72 65 20 44 65 76 65 6c 6f 70 6d 65 6e 74  ware Development
2c20: 22 20 3d 3e 20 5b 0a 20 20 20 20 20 20 20 20 20  " => [.         
2c30: 20 20 20 20 20 20 20 22 41 73 73 65 6d 62 6c 65         "Assemble
2c40: 72 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r",.            
2c50: 20 20 20 20 22 42 75 67 20 54 72 61 63 6b 69 6e      "Bug Trackin
2c60: 67 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  g",.            
2c70: 20 20 20 20 22 42 75 69 6c 64 20 54 6f 6f 6c 22      "Build Tool"
2c80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2c90: 20 20 22 43 6f 64 65 20 47 65 6e 65 72 61 74 6f    "Code Generato
2ca0: 72 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r",.            
2cb0: 20 20 20 20 22 43 6f 6d 70 69 6c 65 72 22 2c 0a      "Compiler",.
2cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd0: 22 44 65 62 75 67 67 65 72 22 2c 0a 20 20 20 20  "Debugger",.    
2ce0: 20 20 20 20 20 20 20 20 20 20 20 20 22 44 69 73              "Dis
2cf0: 61 73 73 65 6d 62 6c 65 72 22 2c 0a 20 20 20 20  assembler",.    
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 22 44 6f 63              "Doc
2d10: 75 6d 65 6e 74 61 74 69 6f 6e 22 2c 0a 20 20 20  umentation",.   
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 45 6d               "Em
2d30: 62 65 64 64 65 64 20 53 79 73 74 65 6d 73 22 2c  bedded Systems",
2d40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d50: 20 22 49 6e 74 65 72 6e 61 74 69 6f 6e 61 6c 69   "Internationali
2d60: 7a 61 74 69 6f 6e 22 2c 0a 20 20 20 20 20 20 20  zation",.       
2d70: 20 20 20 20 20 20 20 20 20 22 49 6e 74 65 72 70           "Interp
2d80: 72 65 74 65 72 22 2c 0a 20 20 20 20 20 20 20 20  reter",.        
2d90: 20 20 20 20 20 20 20 20 22 4c 69 62 72 61 72 79          "Library
2da0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2db0: 20 20 20 22 4c 69 62 72 61 72 79 22 20 3d 3e 20     "Library" => 
2dc0: 5b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  [.              
2dd0: 20 20 20 20 20 20 22 41 70 70 6c 69 63 61 74 69        "Applicati
2de0: 6f 6e 20 46 72 61 6d 65 77 6f 72 6b 22 2c 0a 20  on Framework",. 
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e00: 20 20 20 22 4a 61 76 61 20 4c 69 62 72 61 72 79     "Java Library
2e10: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2e20: 20 20 20 20 20 20 20 22 50 65 72 6c 20 4d 6f 64         "Perl Mod
2e30: 75 6c 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ule",.          
2e40: 20 20 20 20 20 20 20 20 20 20 22 50 48 50 20 43            "PHP C
2e50: 6c 61 73 73 22 2c 0a 20 20 20 20 20 20 20 20 20  lass",.         
2e60: 20 20 20 20 20 20 20 20 20 20 20 22 50 69 6b 65             "Pike
2e70: 20 4d 6f 64 75 6c 65 22 2c 0a 20 20 20 20 20 20   Module",.      
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 70                "p
2e90: 79 67 61 6d 65 22 2c 0a 20 20 20 20 20 20 20 20  ygame",.        
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 22 50 79 74              "Pyt
2eb0: 68 6f 6e 20 4d 6f 64 75 6c 65 22 2c 0a 20 20 20  hon Module",.   
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed0: 20 22 52 75 62 79 20 4d 6f 64 75 6c 65 73 22 2c   "Ruby Modules",
2ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ef0: 20 20 20 20 20 22 54 63 6c 20 45 78 74 65 6e 73       "Tcl Extens
2f00: 69 6f 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  ion".           
2f10: 20 20 20 20 20 5d 2c 0a 20 20 20 20 20 20 20 20       ],.        
2f20: 20 20 20 20 20 20 20 20 22 4c 6f 63 61 6c 69 7a          "Localiz
2f30: 61 74 69 6f 6e 22 2c 0a 20 20 20 20 20 20 20 20  ation",.        
2f40: 20 20 20 20 20 20 20 20 22 4f 62 6a 65 63 74 20          "Object 
2f50: 42 72 6f 6b 65 72 69 6e 67 22 2c 0a 20 20 20 20  Brokering",.    
2f60: 20 20 20 20 20 20 20 20 20 20 20 20 22 4f 62 6a              "Obj
2f70: 65 63 74 20 42 72 6f 6b 65 72 69 6e 67 22 20 3d  ect Brokering" =
2f80: 3e 20 5b 0a 20 20 20 20 20 20 20 20 20 20 20 20  > [.            
2f90: 20 20 20 20 20 20 20 20 22 43 4f 52 42 41 22 2c          "CORBA",
2fa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2fb0: 20 20 20 20 20 22 44 2d 42 75 73 22 2c 0a 20 20       "D-Bus",.  
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd0: 20 20 22 53 4f 41 50 22 0a 20 20 20 20 20 20 20    "SOAP".       
2fe0: 20 20 20 20 20 20 20 20 20 5d 2c 0a 20 20 20 20           ],.    
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 22 50 72 65              "Pre
3000: 2d 70 72 6f 63 65 73 73 6f 72 22 2c 0a 20 20 20  -processor",.   
3010: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 51 75               "Qu
3020: 61 6c 69 74 79 20 41 73 73 75 72 61 6e 63 65 22  ality Assurance"
3030: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3040: 20 20 22 54 65 73 74 69 6e 67 22 2c 0a 20 20 20    "Testing",.   
3050: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 54 65               "Te
3060: 73 74 69 6e 67 22 20 3d 3e 20 5b 0a 20 20 20 20  sting" => [.    
3070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3080: 22 54 72 61 66 66 69 63 20 47 65 6e 65 72 61 74  "Traffic Generat
3090: 69 6f 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  ion".           
30a0: 20 20 20 20 20 5d 2c 0a 20 20 20 20 20 20 20 20       ],.        
30b0: 20 20 20 20 20 20 20 20 22 55 73 65 72 20 49 6e          "User In
30c0: 74 65 72 66 61 63 65 73 22 2c 0a 20 20 20 20 20  terfaces",.     
30d0: 20 20 20 20 20 20 20 20 20 20 20 22 56 65 72 73             "Vers
30e0: 69 6f 6e 20 43 6f 6e 74 72 6f 6c 22 2c 0a 20 20  ion Control",.  
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 57                "W
3100: 69 64 67 65 74 20 53 65 74 22 0a 20 20 20 20 20  idget Set".     
3110: 20 20 20 20 20 20 20 5d 2c 0a 20 20 20 20 20 20         ],.      
3120: 20 20 20 20 20 20 22 53 79 73 74 65 6d 22 2c 0a        "System",.
3130: 20 20 20 20 20 20 20 20 20 20 20 20 22 53 79 73              "Sys
3140: 74 65 6d 22 20 3d 3e 20 5b 0a 20 20 20 20 20 20  tem" => [.      
3150: 20 20 20 20 20 20 20 20 20 20 22 41 72 63 68 69            "Archi
3160: 76 69 6e 67 22 2c 0a 20 20 20 20 20 20 20 20 20  ving",.         
3170: 20 20 20 20 20 20 20 22 41 72 63 68 69 76 69 6e         "Archivin
3180: 67 22 20 3d 3e 20 5b 0a 20 20 20 20 20 20 20 20  g" => [.        
3190: 20 20 20 20 20 20 20 20 20 20 20 20 22 42 61 63              "Bac
31a0: 6b 75 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20  kup",.          
31b0: 20 20 20 20 20 20 20 20 20 20 22 43 6f 6d 70 72            "Compr
31c0: 65 73 73 69 6f 6e 22 2c 0a 20 20 20 20 20 20 20  ession",.       
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4d 69               "Mi
31e0: 72 72 6f 72 69 6e 67 22 2c 0a 20 20 20 20 20 20  rroring",.      
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 50                "P
3200: 61 63 6b 61 67 69 6e 67 22 0a 20 20 20 20 20 20  ackaging".      
3210: 20 20 20 20 20 20 20 20 20 20 5d 2c 0a 20 20 20            ],.   
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 42 65               "Be
3230: 6e 63 68 6d 61 72 6b 22 2c 0a 20 20 20 20 20 20  nchmark",.      
3240: 20 20 20 20 20 20 20 20 20 20 22 42 6f 6f 74 22            "Boot"
3250: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3260: 20 20 22 42 6f 6f 74 22 20 3d 3e 20 5b 0a 20 20    "Boot" => [.  
3270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3280: 20 20 22 49 6e 69 74 22 0a 20 20 20 20 20 20 20    "Init".       
3290: 20 20 20 20 20 20 20 20 20 5d 2c 0a 20 20 20 20           ],.    
32a0: 20 20 20 20 20 20 20 20 20 20 20 20 22 43 6c 75              "Clu
32b0: 73 74 65 72 69 6e 67 22 2c 0a 20 20 20 20 20 20  stering",.      
32c0: 20 20 20 20 20 20 20 20 20 20 22 43 6f 6e 73 6f            "Conso
32d0: 6c 65 20 46 6f 6e 74 22 2c 0a 20 20 20 20 20 20  le Font",.      
32e0: 20 20 20 20 20 20 20 20 20 20 22 44 69 73 74 72            "Distr
32f0: 69 62 75 74 65 64 20 43 6f 6d 70 75 74 69 6e 67  ibuted Computing
3300: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
3310: 20 20 20 22 45 6d 75 6c 61 74 6f 72 22 2c 0a 20     "Emulator",. 
3320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
3330: 46 69 6c 65 73 79 73 74 65 6d 22 2c 0a 20 20 20  Filesystem",.   
3340: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 48 61               "Ha
3350: 72 64 77 61 72 65 22 2c 0a 20 20 20 20 20 20 20  rdware",.       
3360: 20 20 20 20 20 20 20 20 20 22 48 61 72 64 77 61           "Hardwa
3370: 72 65 22 20 3d 3e 20 5b 0a 20 20 20 20 20 20 20  re" => [.       
3380: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 48 61               "Ha
3390: 72 64 77 61 72 65 20 44 72 69 76 65 72 22 2c 0a  rdware Driver",.
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b0: 20 20 20 20 22 4d 61 69 6e 66 72 61 6d 65 73 22      "Mainframes"
33c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
33d0: 20 20 20 20 20 20 22 53 79 6d 6d 65 74 72 69 63        "Symmetric
33e0: 20 4d 75 6c 74 69 2d 70 72 6f 63 65 73 73 69 6e   Multi-processin
33f0: 67 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g".             
3400: 20 20 20 5d 2c 0a 20 20 20 20 20 20 20 20 20 20     ],.          
3410: 20 20 20 20 20 20 22 49 6e 73 74 61 6c 6c 61 74        "Installat
3420: 69 6f 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ion",.          
3430: 20 20 20 20 20 20 22 4c 6f 67 67 69 6e 67 22 2c        "Logging",
3440: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3450: 20 22 4d 6f 6e 69 74 6f 72 69 6e 67 22 2c 0a 20   "Monitoring",. 
3460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
3470: 4e 65 74 77 6f 72 6b 69 6e 67 22 2c 0a 20 20 20  Networking",.   
3480: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4e 65               "Ne
3490: 74 77 6f 72 6b 69 6e 67 22 20 3d 3e 20 5b 0a 20  tworking" => [. 
34a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b0: 20 20 20 22 46 69 72 65 77 61 6c 6c 73 22 2c 0a     "Firewalls",.
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d0: 20 20 20 20 22 4d 6f 6e 69 74 6f 72 69 6e 67 22      "Monitoring"
34e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
34f0: 20 20 20 20 20 20 22 4d 6f 6e 69 74 6f 72 69 6e        "Monitorin
3500: 67 22 20 3d 3e 20 5b 0a 20 20 20 20 20 20 20 20  g" => [.        
3510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3520: 22 48 61 72 64 77 61 72 65 20 57 61 74 63 68 64  "Hardware Watchd
3530: 6f 67 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  og".            
3540: 20 20 20 20 20 20 20 20 5d 2c 0a 20 20 20 20 20          ],.     
3550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
3560: 54 69 6d 65 20 53 79 6e 63 68 72 6f 6e 69 7a 61  Time Synchroniza
3570: 74 69 6f 6e 22 0a 20 20 20 20 20 20 20 20 20 20  tion".          
3580: 20 20 20 20 20 20 5d 2c 0a 20 20 20 20 20 20 20        ],.       
3590: 20 20 20 20 20 20 20 20 20 22 4f 70 65 72 61 74           "Operat
35a0: 69 6e 67 20 53 79 73 74 65 6d 22 2c 0a 20 20 20  ing System",.   
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4b 65               "Ke
35c0: 72 6e 65 6c 22 2c 0a 20 20 20 20 20 20 20 20 20  rnel",.         
35d0: 20 20 20 20 20 20 20 22 50 6f 77 65 72 20 28 55         "Power (U
35e0: 50 53 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  PS)",.          
35f0: 20 20 20 20 20 20 22 52 65 63 6f 76 65 72 79 20        "Recovery 
3600: 54 6f 6f 6c 22 2c 0a 20 20 20 20 20 20 20 20 20  Tool",.         
3610: 20 20 20 20 20 20 20 22 53 68 65 6c 6c 73 22 2c         "Shells",
3620: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3630: 20 22 53 6f 66 74 77 61 72 65 20 44 69 73 74 72   "Software Distr
3640: 69 62 75 74 69 6f 6e 22 2c 0a 20 20 20 20 20 20  ibution",.      
3650: 20 20 20 20 20 20 20 20 20 20 22 53 79 73 74 65            "Syste
3660: 6d 73 20 41 64 6d 69 6e 69 73 74 72 61 74 69 6f  ms Administratio
3670: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
3680: 20 20 20 20 22 53 79 73 74 65 6d 73 20 41 64 6d      "Systems Adm
3690: 69 6e 69 73 74 72 61 74 69 6f 6e 22 20 3d 3e 20  inistration" => 
36a0: 5b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  [.              
36b0: 20 20 20 20 20 20 22 41 75 74 68 65 6e 74 69 63        "Authentic
36c0: 61 74 69 6f 6e 2f 44 69 72 65 63 74 6f 72 79 22  ation/Directory"
36d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
36e0: 20 20 20 20 20 20 22 41 75 74 68 65 6e 74 69 63        "Authentic
36f0: 61 74 69 6f 6e 2f 44 69 72 65 63 74 6f 72 79 22  ation/Directory"
3700: 20 3d 3e 20 5b 0a 20 20 20 20 20 20 20 20 20 20   => [.          
3710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4c                "L
3720: 44 41 50 22 2c 0a 20 20 20 20 20 20 20 20 20 20  DAP",.          
3730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4e                "N
3740: 49 53 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  IS".            
3750: 20 20 20 20 20 20 20 20 5d 0a 20 20 20 20 20 20          ].      
3760: 20 20 20 20 20 20 20 20 20 20 5d 0a 20 20 20 20            ].    
3770: 20 20 20 20 20 20 20 20 5d 2c 0a 20 20 20 20 20          ],.     
3780: 20 20 20 20 20 20 20 22 53 68 65 6c 6c 22 2c 0a         "Shell",.
3790: 20 20 20 20 20 20 20 20 20 20 20 20 22 54 65 72              "Ter
37a0: 6d 69 6e 61 6c 22 2c 0a 20 20 20 20 20 20 20 20  minal",.        
37b0: 20 20 20 20 22 54 65 72 6d 69 6e 61 6c 22 20 3d      "Terminal" =
37c0: 3e 20 5b 0a 20 20 20 20 20 20 20 20 20 20 20 20  > [.            
37d0: 20 20 20 20 22 53 65 72 69 61 6c 22 2c 0a 20 20      "Serial",.  
37e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 54                "T
37f0: 65 6c 6e 65 74 22 2c 0a 20 20 20 20 20 20 20 20  elnet",.        
3800: 20 20 20 20 20 20 20 20 22 54 65 72 6d 69 6e 61          "Termina
3810: 6c 20 45 6d 75 6c 61 74 6f 72 22 0a 20 20 20 20  l Emulator".    
3820: 20 20 20 20 20 20 20 20 5d 2c 0a 20 20 20 20 20          ],.     
3830: 20 20 20 20 20 20 20 22 54 65 78 74 20 45 64 69         "Text Edi
3840: 74 6f 72 22 2c 0a 20 20 20 20 20 20 20 20 20 20  tor",.          
3850: 20 20 22 54 65 78 74 20 45 64 69 74 6f 72 22 20    "Text Editor" 
3860: 3d 3e 20 5b 0a 20 20 20 20 20 20 20 20 20 20 20  => [.           
3870: 20 20 20 20 20 22 44 6f 63 75 6d 65 6e 74 61 74       "Documentat
3880: 69 6f 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ion",.          
3890: 20 20 20 20 20 20 22 45 6d 61 63 73 22 2c 0a 20        "Emacs",. 
38a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
38b0: 49 44 45 22 2c 0a 20 20 20 20 20 20 20 20 20 20  IDE",.          
38c0: 20 20 20 20 20 20 22 54 65 78 74 20 50 72 6f 63        "Text Proc
38d0: 65 73 73 69 6e 67 22 2c 0a 20 20 20 20 20 20 20  essing",.       
38e0: 20 20 20 20 20 20 20 20 20 22 57 6f 72 64 20 50           "Word P
38f0: 72 6f 63 65 73 73 6f 72 22 0a 20 20 20 20 20 20  rocessor".      
3900: 20 20 20 20 20 20 5d 2c 0a 20 20 20 20 20 20 20        ],.       
3910: 20 20 20 20 20 22 54 65 78 74 20 50 72 6f 63 65       "Text Proce
3920: 73 73 69 6e 67 22 2c 0a 20 20 20 20 20 20 20 20  ssing",.        
3930: 20 20 20 20 22 54 65 78 74 20 50 72 6f 63 65 73      "Text Proces
3940: 73 69 6e 67 22 20 3d 3e 20 5b 0a 20 20 20 20 20  sing" => [.     
3950: 20 20 20 20 20 20 20 20 20 20 20 22 46 69 6c 74             "Filt
3960: 65 72 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  er",.           
3970: 20 20 20 20 20 22 46 6f 6e 74 22 2c 0a 20 20 20       "Font",.   
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 47 65               "Ge
3990: 6e 65 72 61 6c 22 2c 0a 20 20 20 20 20 20 20 20  neral",.        
39a0: 20 20 20 20 20 20 20 20 22 49 6e 64 65 78 69 6e          "Indexin
39b0: 67 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  g",.            
39c0: 20 20 20 20 22 4c 69 6e 67 75 69 73 74 69 63 22      "Linguistic"
39d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
39e0: 20 20 22 4d 61 72 6b 75 70 22 2c 0a 20 20 20 20    "Markup",.    
39f0: 20 20 20 20 20 20 20 20 20 20 20 20 22 4d 61 72              "Mar
3a00: 6b 75 70 22 20 3d 3e 20 5b 0a 20 20 20 20 20 20  kup" => [.      
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 44                "D
3a20: 6f 63 42 6f 6f 6b 22 2c 0a 20 20 20 20 20 20 20  ocBook",.       
3a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 48 54               "HT
3a40: 4d 4c 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ML",.           
3a50: 20 20 20 20 20 20 20 20 20 22 4c 61 54 65 58 22           "LaTeX"
3a60: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3a70: 20 20 20 20 20 20 22 4d 61 72 6b 64 6f 77 6e 22        "Markdown"
3a80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3a90: 20 20 20 20 20 20 22 52 65 53 74 72 75 63 74 75        "ReStructu
3aa0: 72 65 64 54 65 78 74 22 2c 0a 20 20 20 20 20 20  redText",.      
3ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
3ac0: 47 4d 4c 22 2c 0a 20 20 20 20 20 20 20 20 20 20  GML",.          
3ad0: 20 20 20 20 20 20 20 20 20 20 22 56 52 4d 4c 22            "VRML"
3ae0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3af0: 20 20 20 20 20 20 22 57 69 6b 69 22 2c 0a 20 20        "Wiki",.  
3b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b10: 20 20 22 58 4d 4c 22 0a 20 20 20 20 20 20 20 20    "XML".        
3b20: 20 20 20 20 20 20 20 20 5d 0a 20 20 20 20 20 20          ].      
3b30: 20 20 20 20 20 20 5d 2c 0a 20 20 20 20 20 20 20        ],.       
3b40: 20 20 20 20 20 22 55 74 69 6c 69 74 69 65 73 22       "Utilities"
3b50: 0a 20 20 20 20 20 20 20 20 5d 2c 0a 20 20 20 20  .        ],.    
3b60: 20 20 20 20 22 50 72 6f 67 72 61 6d 6d 69 6e 67      "Programming
3b70: 20 4c 61 6e 67 75 61 67 65 22 20 3d 3e 20 5b 0a   Language" => [.
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 22 41 64 61              "Ada
3b90: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  ",.            "
3ba0: 41 50 4c 22 2c 0a 20 20 20 20 20 20 20 20 20 20  APL",.          
3bb0: 20 20 22 41 53 50 22 2c 0a 20 20 20 20 20 20 20    "ASP",.       
3bc0: 20 20 20 20 20 22 41 73 73 65 6d 62 6c 79 22 2c       "Assembly",
3bd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 41 77  .            "Aw
3be0: 6b 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  k",.            
3bf0: 22 42 61 73 68 22 2c 0a 20 20 20 20 20 20 20 20  "Bash",.        
3c00: 20 20 20 20 22 42 61 73 69 63 22 2c 0a 20 20 20      "Basic",.   
3c10: 20 20 20 20 20 20 20 20 20 22 43 22 2c 0a 20 20           "C",.  
3c20: 20 20 20 20 20 20 20 20 20 20 22 43 23 22 2c 0a            "C#",.
3c30: 20 20 20 20 20 20 20 20 20 20 20 20 22 43 2b 2b              "C++
3c40: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  ",.            "
3c50: 43 6c 6f 6a 75 72 65 22 2c 0a 20 20 20 20 20 20  Clojure",.      
3c60: 20 20 20 20 20 20 22 43 6f 6c 64 20 46 75 73 69        "Cold Fusi
3c70: 6f 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  on",.           
3c80: 20 22 43 79 74 68 6f 6e 22 2c 0a 20 20 20 20 20   "Cython",.     
3c90: 20 20 20 20 20 20 20 22 44 22 2c 0a 20 20 20 20         "D",.    
3ca0: 20 20 20 20 20 20 20 20 22 44 65 6c 70 68 69 22          "Delphi"
3cb0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 44  ,.            "D
3cc0: 79 6c 61 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  ylan",.         
3cd0: 20 20 20 22 45 69 66 66 65 6c 22 2c 0a 20 20 20     "Eiffel",.   
3ce0: 20 20 20 20 20 20 20 20 20 22 45 6d 61 63 73 2d           "Emacs-
3cf0: 4c 69 73 70 22 2c 0a 20 20 20 20 20 20 20 20 20  Lisp",.         
3d00: 20 20 20 22 45 72 6c 61 6e 67 22 2c 0a 20 20 20     "Erlang",.   
3d10: 20 20 20 20 20 20 20 20 20 22 45 75 6c 65 72 22           "Euler"
3d20: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 46  ,.            "F
3d30: 6f 72 74 68 22 2c 0a 20 20 20 20 20 20 20 20 20  orth",.         
3d40: 20 20 20 22 46 6f 72 74 72 61 6e 22 2c 0a 20 20     "Fortran",.  
3d50: 20 20 20 20 20 20 20 20 20 20 22 47 6f 22 2c 0a            "Go",.
3d60: 20 20 20 20 20 20 20 20 20 20 20 20 22 47 72 6f              "Gro
3d70: 6f 76 79 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ovy",.          
3d80: 20 20 22 48 61 73 6b 65 6c 6c 22 2c 0a 20 20 20    "Haskell",.   
3d90: 20 20 20 20 20 20 20 20 20 22 48 61 78 65 22 2c           "Haxe",
3da0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 4a 61  .            "Ja
3db0: 76 61 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  va",.           
3dc0: 20 22 4a 61 76 61 53 63 72 69 70 74 22 2c 0a 20   "JavaScript",. 
3dd0: 20 20 20 20 20 20 20 20 20 20 20 22 4c 75 61 22             "Lua"
3de0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 4c  ,.            "L
3df0: 69 73 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20  isp",.          
3e00: 20 20 22 4c 6f 67 6f 22 2c 0a 20 20 20 20 20 20    "Logo",.      
3e10: 20 20 20 20 20 20 22 4d 61 74 6c 61 62 22 2c 0a        "Matlab",.
3e20: 20 20 20 20 20 20 20 20 20 20 20 20 22 4d 4c 22              "ML"
3e30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 4d  ,.            "M
3e40: 6f 64 75 6c 61 22 2c 0a 20 20 20 20 20 20 20 20  odula",.        
3e50: 20 20 20 20 22 4f 62 65 72 6f 6e 22 2c 0a 20 20      "Oberon",.  
3e60: 20 20 20 20 20 20 20 20 20 20 22 4f 62 6a 65 63            "Objec
3e70: 74 69 76 65 20 43 22 2c 0a 20 20 20 20 20 20 20  tive C",.       
3e80: 20 20 20 20 20 22 4f 62 6a 65 63 74 20 50 61 73       "Object Pas
3e90: 63 61 6c 22 2c 0a 20 20 20 20 20 20 20 20 20 20  cal",.          
3ea0: 20 20 22 4f 43 61 6d 6c 22 2c 0a 20 20 20 20 20    "OCaml",.     
3eb0: 20 20 20 20 20 20 20 22 50 61 72 72 6f 74 22 2c         "Parrot",
3ec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 50 61  .            "Pa
3ed0: 73 63 61 6c 22 2c 0a 20 20 20 20 20 20 20 20 20  scal",.         
3ee0: 20 20 20 22 50 65 72 6c 22 2c 0a 20 20 20 20 20     "Perl",.     
3ef0: 20 20 20 20 20 20 20 22 50 48 50 22 2c 0a 20 20         "PHP",.  
3f00: 20 20 20 20 20 20 20 20 20 20 22 50 48 50 22 20            "PHP" 
3f10: 3d 3e 20 5b 0a 20 20 20 20 20 20 20 20 20 20 20  => [.           
3f20: 20 20 20 20 20 22 48 48 56 4d 22 2c 0a 20 20 20       "HHVM",.   
3f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 51 75               "Qu
3f40: 65 72 63 75 73 22 0a 20 20 20 20 20 20 20 20 20  ercus".         
3f50: 20 20 20 5d 2c 0a 20 20 20 20 20 20 20 20 20 20     ],.          
3f60: 20 20 22 50 69 6b 65 22 2c 0a 20 20 20 20 20 20    "Pike",.      
3f70: 20 20 20 20 20 20 22 50 4c 2f 53 51 4c 22 2c 0a        "PL/SQL",.
3f80: 20 20 20 20 20 20 20 20 20 20 20 20 22 50 52 4f              "PRO
3f90: 47 52 45 53 53 22 2c 0a 20 20 20 20 20 20 20 20  GRESS",.        
3fa0: 20 20 20 20 22 50 72 6f 6c 6f 67 22 2c 0a 20 20      "Prolog",.  
3fb0: 20 20 20 20 20 20 20 20 20 20 22 50 79 74 68 6f            "Pytho
3fc0: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
3fd0: 22 50 79 74 68 6f 6e 22 20 3d 3e 20 5b 0a 20 20  "Python" => [.  
3fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 43                "C
3ff0: 50 79 74 68 6f 6e 22 2c 0a 20 20 20 20 20 20 20  Python",.       
4000: 20 20 20 20 20 20 20 20 20 22 49 72 6f 6e 50 79           "IronPy
4010: 74 68 6f 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  thon",.         
4020: 20 20 20 20 20 20 20 22 4a 79 74 68 6f 6e 22 2c         "Jython",
4030: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4040: 20 22 50 79 50 79 22 2c 0a 20 20 20 20 20 20 20   "PyPy",.       
4050: 20 20 20 20 20 20 20 20 20 22 53 74 61 63 6b 6c           "Stackl
4060: 65 73 73 22 0a 20 20 20 20 20 20 20 20 20 20 20  ess".           
4070: 20 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ],.            
4080: 22 52 45 42 4f 4c 22 2c 0a 20 20 20 20 20 20 20  "REBOL",.       
4090: 20 20 20 20 20 22 52 22 2c 0a 20 20 20 20 20 20       "R",.      
40a0: 20 20 20 20 20 20 22 52 65 67 65 78 22 2c 0a 20        "Regex",. 
40b0: 20 20 20 20 20 20 20 20 20 20 20 22 52 65 78 78             "Rexx
40c0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  ",.            "
40d0: 52 75 62 79 22 2c 0a 20 20 20 20 20 20 20 20 20  Ruby",.         
40e0: 20 20 20 22 53 63 61 6c 61 22 2c 0a 20 20 20 20     "Scala",.    
40f0: 20 20 20 20 20 20 20 20 22 53 63 68 65 6d 65 22          "Scheme"
4100: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 53  ,.            "S
4110: 69 6d 75 6c 61 22 2c 0a 20 20 20 20 20 20 20 20  imula",.        
4120: 20 20 20 20 22 53 6d 61 6c 6c 74 61 6c 6b 22 2c      "Smalltalk",
4130: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 53 51  .            "SQ
4140: 4c 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  L",.            
4150: 22 54 63 6c 22 2c 0a 20 20 20 20 20 20 20 20 20  "Tcl",.         
4160: 20 20 20 22 55 6e 69 78 20 53 68 65 6c 6c 22 2c     "Unix Shell",
4170: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 56 61  .            "Va
4180: 6c 61 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  la",.           
4190: 20 22 59 41 43 43 22 2c 0a 20 20 20 20 20 20 20   "YACC",.       
41a0: 20 20 20 20 20 22 5a 6f 70 65 22 0a 20 20 20 20       "Zope".    
41b0: 20 20 20 20 5d 2c 0a 20 20 20 20 20 20 20 20 22      ],.        "
41c0: 45 6e 76 69 72 6f 6e 6d 65 6e 74 22 20 3d 3e 20  Environment" => 
41d0: 5b 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43  [.            "C
41e0: 6f 6e 73 6f 6c 65 22 2c 0a 20 20 20 20 20 20 20  onsole",.       
41f0: 20 20 20 20 20 22 43 6f 6e 73 6f 6c 65 22 20 3d       "Console" =
4200: 3e 20 5b 0a 20 20 20 20 20 20 20 20 20 20 20 20  > [.            
4210: 20 20 20 20 22 43 75 72 73 65 73 22 2c 0a 20 20      "Curses",.  
4220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 46                "F
4230: 72 61 6d 65 62 75 66 66 65 72 22 2c 0a 20 20 20  ramebuffer",.   
4240: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4e 65               "Ne
4250: 77 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  wt",.           
4260: 20 20 20 20 20 22 73 76 67 61 6c 69 62 22 0a 20       "svgalib". 
4270: 20 20 20 20 20 20 20 20 20 20 20 5d 2c 0a 20 20             ],.  
4280: 20 20 20 20 20 20 20 20 20 20 22 4d 6f 62 69 6c            "Mobil
4290: 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
42a0: 22 4d 61 63 4f 53 20 58 22 2c 0a 20 20 20 20 20  "MacOS X",.     
42b0: 20 20 20 20 20 20 20 22 4d 61 63 4f 53 20 58 22         "MacOS X"
42c0: 20 3d 3e 20 5b 0a 20 20 20 20 20 20 20 20 20 20   => [.          
42d0: 20 20 20 20 20 20 22 41 71 75 61 22 2c 0a 20 20        "Aqua",.  
42e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 43                "C
42f0: 61 72 62 6f 6e 22 2c 0a 20 20 20 20 20 20 20 20  arbon",.        
4300: 20 20 20 20 20 20 20 20 22 43 6f 63 6f 61 22 0a          "Cocoa".
4310: 20 20 20 20 20 20 20 20 20 20 20 20 5d 2c 0a 20              ],. 
4320: 20 20 20 20 20 20 20 20 20 20 20 22 44 61 65 6d             "Daem
4330: 6f 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  on",.           
4340: 20 22 4f 70 65 6e 53 74 61 63 6b 22 2c 0a 20 20   "OpenStack",.  
4350: 20 20 20 20 20 20 20 20 20 20 22 50 6c 75 67 69            "Plugi
4360: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
4370: 22 57 65 62 20 45 6e 76 69 72 6f 6e 6d 65 6e 74  "Web Environment
4380: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  ",.            "
4390: 57 65 62 20 45 6e 76 69 72 6f 6e 6d 65 6e 74 22  Web Environment"
43a0: 20 3d 3e 20 5b 0a 20 20 20 20 20 20 20 20 20 20   => [.          
43b0: 20 20 20 20 20 20 22 42 75 66 66 65 74 22 2c 0a        "Buffet",.
43c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43d0: 22 4d 6f 7a 69 6c 6c 61 22 2c 0a 20 20 20 20 20  "Mozilla",.     
43e0: 20 20 20 20 20 20 20 20 20 20 20 22 54 6f 73 63             "Tosc
43f0: 61 57 69 64 67 65 74 73 22 0a 20 20 20 20 20 20  aWidgets".      
4400: 20 20 20 20 20 20 5d 2c 0a 20 20 20 20 20 20 20        ],.       
4410: 20 20 20 20 20 22 57 69 6e 33 32 22 2c 0a 20 20       "Win32",.  
4420: 20 20 20 20 20 20 20 20 20 20 22 58 31 31 22 2c            "X11",
4430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 58 31  .            "X1
4440: 31 22 20 3d 3e 20 5b 0a 20 20 20 20 20 20 20 20  1" => [.        
4450: 20 20 20 20 20 20 20 20 22 47 6e 6f 6d 65 22 2c          "Gnome",
4460: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4470: 20 22 47 54 4b 22 2c 0a 20 20 20 20 20 20 20 20   "GTK",.        
4480: 20 20 20 20 20 20 20 20 22 4b 44 45 22 2c 0a 20          "KDE",. 
4490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
44a0: 51 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Qt",.           
44b0: 20 20 20 20 20 22 54 6b 22 0a 20 20 20 20 20 20       "Tk".      
44c0: 20 20 20 20 20 20 5d 2c 0a 20 20 20 20 20 20 20        ],.       
44d0: 20 20 20 20 20 22 57 61 79 6c 61 6e 64 22 0a 20       "Wayland". 
44e0: 20 20 20 20 20 20 20 5d 2c 0a 20 20 20 20 20 20         ],.      
44f0: 20 20 22 46 72 61 6d 65 77 6f 72 6b 22 20 3d 3e    "Framework" =>
4500: 20 5b 0a 20 20 20 20 20 20 20 20 20 20 20 20 22   [.            "
4510: 43 2b 2b 22 20 3d 3e 20 5b 0a 20 20 20 20 20 20  C++" => [.      
4520: 20 20 20 20 20 20 20 20 20 20 22 42 6f 6f 73 74            "Boost
4530: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 5d 2c  ".            ],
4540: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 47 72  .            "Gr
4550: 6f 6f 76 79 22 20 3d 3e 20 5b 0a 20 20 20 20 20  oovy" => [.     
4560: 20 20 20 20 20 20 20 20 20 20 20 22 47 72 61 69             "Grai
4570: 6c 73 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  ls".            
4580: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  ],.            "
4590: 4a 61 76 61 22 20 3d 3e 20 5b 0a 20 20 20 20 20  Java" => [.     
45a0: 20 20 20 20 20 20 20 20 20 20 20 22 48 69 62 65             "Hibe
45b0: 72 6e 61 74 65 22 2c 0a 20 20 20 20 20 20 20 20  rnate",.        
45c0: 20 20 20 20 20 20 20 20 22 53 70 72 69 6e 67 22          "Spring"
45d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
45e0: 20 20 22 53 69 6e 61 74 72 61 22 2c 0a 20 20 20    "Sinatra",.   
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53 74               "St
4600: 72 75 74 73 22 2c 0a 20 20 20 20 20 20 20 20 20  ruts",.         
4610: 20 20 20 20 20 20 20 22 4f 70 65 6e 58 61 76 61         "OpenXava
4620: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 5d 2c  ".            ],
4630: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 4a 61  .            "Ja
4640: 76 61 53 63 72 69 70 74 22 20 3d 3e 20 5b 0a 20  vaScript" => [. 
4650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
4660: 41 6e 67 75 6c 61 72 4a 53 22 2c 0a 20 20 20 20  AngularJS",.    
4670: 20 20 20 20 20 20 20 20 20 20 20 20 22 65 78 74              "ext
4680: 4a 53 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  JS",.           
4690: 20 20 20 20 20 22 6a 51 75 65 72 79 22 2c 0a 20       "jQuery",. 
46a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
46b0: 4d 6f 6f 54 6f 6f 6c 73 22 2c 0a 20 20 20 20 20  MooTools",.     
46c0: 20 20 20 20 20 20 20 20 20 20 20 22 50 72 6f 74             "Prot
46d0: 6f 74 79 70 65 22 2c 0a 20 20 20 20 20 20 20 20  otype",.        
46e0: 20 20 20 20 20 20 20 20 22 71 6f 6f 78 64 6f 6f          "qooxdoo
46f0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 5d 2c  ".            ],
4700: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 50 65  .            "Pe
4710: 72 6c 22 20 3d 3e 20 5b 0a 20 20 20 20 20 20 20  rl" => [.       
4720: 20 20 20 20 20 20 20 20 20 22 4d 61 73 6f 6e 22           "Mason"
4730: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4740: 20 20 22 43 61 74 61 6c 79 73 74 22 0a 20 20 20    "Catalyst".   
4750: 20 20 20 20 20 20 20 20 20 5d 2c 0a 20 20 20 20           ],.    
4760: 20 20 20 20 20 20 20 20 22 50 79 74 68 6f 6e 22          "Python"
4770: 20 3d 3e 20 5b 0a 20 20 20 20 20 20 20 20 20 20   => [.          
4780: 20 20 20 20 20 20 22 42 46 47 22 2c 0a 20 20 20        "BFG",.   
4790: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 42 6f               "Bo
47a0: 62 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  b",.            
47b0: 20 20 20 20 22 42 6f 74 74 6c 65 22 2c 0a 20 20      "Bottle",.  
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 42                "B
47d0: 75 69 6c 64 6f 75 74 22 2c 0a 20 20 20 20 20 20  uildout",.      
47e0: 20 20 20 20 20 20 20 20 20 20 22 43 68 61 6e 64            "Chand
47f0: 6c 65 72 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ler",.          
4800: 20 20 20 20 20 20 22 43 68 65 72 72 79 50 79 22        "CherryPy"
4810: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4820: 20 20 22 43 75 62 69 63 57 65 62 22 2c 0a 20 20    "CubicWeb",.  
4830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 44                "D
4840: 6a 61 6e 67 6f 22 2c 0a 20 20 20 20 20 20 20 20  jango",.        
4850: 20 20 20 20 20 20 20 20 22 46 6c 61 73 6b 22 2c          "Flask",
4860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4870: 20 22 49 44 4c 45 22 2c 0a 20 20 20 20 20 20 20   "IDLE",.       
4880: 20 20 20 20 20 20 20 20 20 22 49 50 79 74 68 6f           "IPytho
4890: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
48a0: 20 20 20 20 22 4f 70 70 73 22 2c 0a 20 20 20 20      "Opps",.    
48b0: 20 20 20 20 20 20 20 20 20 20 20 20 22 50 61 73              "Pas
48c0: 74 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  te",.           
48d0: 20 20 20 20 20 22 50 6c 6f 6e 65 22 2c 0a 20 20       "Plone",.  
48e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 70                "p
48f0: 79 32 77 65 62 22 2c 0a 20 20 20 20 20 20 20 20  y2web",.        
4900: 20 20 20 20 20 20 20 20 22 50 79 6c 6f 6e 73 22          "Pylons"
4910: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4920: 20 20 22 50 79 72 61 6d 69 64 22 2c 0a 20 20 20    "Pyramid",.   
4930: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52 65               "Re
4940: 76 69 65 77 20 42 6f 61 72 64 22 2c 0a 20 20 20  view Board",.   
4950: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53 65               "Se
4960: 74 75 70 74 6f 6f 6c 73 20 50 6c 75 67 69 6e 22  tuptools Plugin"
4970: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4980: 20 20 22 54 72 61 63 22 2c 0a 20 20 20 20 20 20    "Trac",.      
4990: 20 20 20 20 20 20 20 20 20 20 22 54 72 79 74 6f            "Tryto
49a0: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
49b0: 20 20 20 20 22 54 75 72 62 6f 47 65 61 72 73 22      "TurboGears"
49c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
49d0: 20 20 22 54 77 69 73 74 65 64 22 2c 0a 20 20 20    "Twisted",.   
49e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5a 4f               "ZO
49f0: 44 42 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  DB",.           
4a00: 20 20 20 20 20 22 5a 6f 70 65 32 22 2c 0a 20 20       "Zope2",.  
4a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5a                "Z
4a20: 6f 70 65 33 22 0a 20 20 20 20 20 20 20 20 20 20  ope3".          
4a30: 20 20 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20    ],.           
4a40: 20 22 50 48 50 22 20 3d 3e 20 5b 0a 20 20 20 20   "PHP" => [.    
4a50: 20 20 20 20 20 20 20 20 20 20 20 20 22 43 61 6b              "Cak
4a60: 65 50 48 50 22 2c 0a 20 20 20 20 20 20 20 20 20  ePHP",.         
4a70: 20 20 20 20 20 20 20 22 4c 61 72 61 76 65 6c 22         "Laravel"
4a80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4a90: 20 20 22 53 79 6d 66 6f 6e 79 22 2c 0a 20 20 20    "Symfony",.   
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 59 69               "Yi
4ab0: 69 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  i",.            
4ac0: 20 20 20 20 22 5a 65 6e 64 20 46 72 61 6d 65 77      "Zend Framew
4ad0: 6f 72 6b 22 0a 20 20 20 20 20 20 20 20 20 20 20  ork".           
4ae0: 20 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ],.            
4af0: 22 52 75 62 79 22 20 3d 3e 20 5b 0a 20 20 20 20  "Ruby" => [.    
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 22 52 61 69              "Rai
4b10: 6c 73 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  ls".            
4b20: 5d 0a 20 20 20 20 20 20 20 20 5d 2c 0a 20 20 20  ].        ],.   
4b30: 20 20 20 20 20 22 4f 70 65 72 61 74 69 6e 67 20       "Operating 
4b40: 53 79 73 74 65 6d 22 20 3d 3e 20 5b 0a 20 20 20  System" => [.   
4b50: 20 20 20 20 20 20 20 20 20 22 42 65 4f 53 22 2c           "BeOS",
4b60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 44 61  .            "Da
4b70: 72 77 69 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  rwin",.         
4b80: 20 20 20 22 4d 61 63 4f 53 22 2c 0a 20 20 20 20     "MacOS",.    
4b90: 20 20 20 20 20 20 20 20 22 4d 53 2d 44 4f 53 22          "MS-DOS"
4ba0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 57  ,.            "W
4bb0: 69 6e 64 6f 77 73 22 2c 0a 20 20 20 20 20 20 20  indows",.       
4bc0: 20 20 20 20 20 22 4f 53 32 22 2c 0a 20 20 20 20       "OS2",.    
4bd0: 20 20 20 20 20 20 20 20 22 43 72 6f 73 73 2d 70          "Cross-p
4be0: 6c 61 74 74 66 6f 72 6d 22 2c 0a 20 20 20 20 20  lattform",.     
4bf0: 20 20 20 20 20 20 20 22 50 61 6c 6d 4f 53 22 2c         "PalmOS",
4c00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 50 44  .            "PD
4c10: 41 20 53 79 73 74 65 6d 73 22 2c 0a 20 20 20 20  A Systems",.    
4c20: 20 20 20 20 20 20 20 20 22 50 4f 53 49 58 22 2c          "POSIX",
4c30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 41 49  .            "AI
4c40: 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  X",.            
4c50: 22 42 53 44 22 2c 0a 20 20 20 20 20 20 20 20 20  "BSD",.         
4c60: 20 20 20 22 42 53 44 22 20 3d 3e 20 5b 0a 20 20     "BSD" => [.  
4c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 46                "F
4c80: 72 65 65 42 53 44 22 2c 0a 20 20 20 20 20 20 20  reeBSD",.       
4c90: 20 20 20 20 20 20 20 20 20 22 4e 65 74 42 53 44           "NetBSD
4ca0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
4cb0: 20 20 20 22 4f 70 65 6e 42 53 44 22 0a 20 20 20     "OpenBSD".   
4cc0: 20 20 20 20 20 20 20 20 20 5d 2c 0a 20 20 20 20           ],.    
4cd0: 20 20 20 20 20 20 20 20 22 48 75 72 64 22 2c 0a          "Hurd",.
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 22 48 50 2d              "HP-
4cf0: 55 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  UX",.           
4d00: 20 22 49 52 49 58 22 2c 0a 20 20 20 20 20 20 20   "IRIX",.       
4d10: 20 20 20 20 20 22 4c 69 6e 75 78 22 2c 0a 20 20       "Linux",.  
4d20: 20 20 20 20 20 20 20 20 20 20 22 53 43 4f 22 2c            "SCO",
4d30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 53 6f  .            "So
4d40: 6c 61 72 69 73 22 2c 0a 20 20 20 20 20 20 20 20  laris",.        
4d50: 20 20 20 20 22 51 4e 58 22 2c 0a 20 20 20 20 20      "QNX",.     
4d60: 20 20 20 20 20 20 20 22 55 6e 69 78 22 0a 20 20         "Unix".  
4d70: 20 20 20 20 20 20 5d 2c 0a 20 20 20 20 20 20 20        ],.       
4d80: 20 22 41 75 64 69 65 6e 63 65 22 20 3d 3e 20 5b   "Audience" => [
4d90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43 75  .            "Cu
4da0: 73 74 6f 6d 65 72 20 53 65 72 76 69 63 65 22 2c  stomer Service",
4db0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 44 65  .            "De
4dc0: 76 65 6c 6f 70 65 72 73 22 2c 0a 20 20 20 20 20  velopers",.     
4dd0: 20 20 20 20 20 20 20 22 45 64 75 63 61 74 69 6f         "Educatio
4de0: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
4df0: 22 45 6e 64 20 55 73 65 72 73 22 2c 0a 20 20 20  "End Users",.   
4e00: 20 20 20 20 20 20 20 20 20 22 46 69 6e 61 6e 63           "Financ
4e10: 69 61 6c 20 61 6e 64 20 49 6e 73 75 72 61 6e 63  ial and Insuranc
4e20: 65 20 49 6e 64 75 73 74 72 79 22 2c 0a 20 20 20  e Industry",.   
4e30: 20 20 20 20 20 20 20 20 20 22 48 65 61 6c 74 68           "Health
4e40: 63 61 72 65 20 49 6e 64 75 73 74 72 79 22 2c 0a  care Industry",.
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 22 49 6e 66              "Inf
4e60: 6f 72 6d 61 74 69 6f 6e 20 54 65 63 68 6e 6f 6c  ormation Technol
4e70: 6f 67 79 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ogy",.          
4e80: 20 20 22 4c 65 67 61 6c 20 49 6e 64 75 73 74 72    "Legal Industr
4e90: 79 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  y",.            
4ea0: 22 4d 61 6e 75 66 61 63 74 75 72 69 6e 67 22 2c  "Manufacturing",
4eb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 52 65  .            "Re
4ec0: 6c 69 67 69 6f 6e 22 2c 0a 20 20 20 20 20 20 20  ligion",.       
4ed0: 20 20 20 20 20 22 53 63 69 65 6e 63 65 2f 52 65       "Science/Re
4ee0: 73 65 61 72 63 68 22 2c 0a 20 20 20 20 20 20 20  search",.       
4ef0: 20 20 20 20 20 22 53 79 73 74 65 6d 20 41 64 6d       "System Adm
4f00: 69 6e 69 73 74 72 61 74 6f 72 73 22 2c 0a 20 20  inistrators",.  
4f10: 20 20 20 20 20 20 20 20 20 20 22 54 65 6c 65 63            "Telec
4f20: 6f 6d 6d 75 6e 69 63 61 74 69 6f 6e 73 20 49 6e  ommunications In
4f30: 64 75 73 74 72 79 22 0a 20 20 20 20 20 20 20 20  dustry".        
4f40: 5d 2c 0a 20 20 20 20 5d 3b 0a 0a 0a 20 20 20 20  ],.    ];...    
4f50: 2f 2a 2a 0a 20 20 20 20 20 2a 20 54 72 79 20 74  /**.     * Try t
4f60: 6f 20 6d 61 70 20 53 50 44 58 2e 6f 72 67 20 6e  o map SPDX.org n
4f70: 61 6d 65 73 20 6f 6e 74 6f 20 6f 75 72 20 6c 69  ames onto our li
4f80: 63 65 6e 73 65 20 74 61 67 73 2c 0a 20 20 20 20  cense tags,.    
4f90: 20 2a 20 6f 72 20 66 69 6e 64 20 65 6e 74 72 79   * or find entry
4fa0: 20 69 6e 20 6c 6f 6e 67 20 64 65 73 63 72 69 70   in long descrip
4fb0: 74 69 6f 6e 3b 0a 20 20 20 20 20 2a 0a 20 20 20  tion;.     *.   
4fc0: 20 20 2a 2f 0a 20 20 20 20 66 75 6e 63 74 69 6f    */.    functio
4fd0: 6e 20 6d 61 70 5f 6c 69 63 65 6e 73 65 28 24 69  n map_license($i
4fe0: 64 29 20 7b 0a 0a 20 20 20 20 20 20 20 20 2f 2f  d) {..        //
4ff0: 20 65 78 61 63 74 20 66 69 6e 64 0a 20 20 20 20   exact find.    
5000: 20 20 20 20 69 66 20 28 69 73 73 65 74 28 74 61      if (isset(ta
5010: 67 73 3a 3a 24 6c 69 63 65 6e 73 65 73 5b 24 69  gs::$licenses[$i
5020: 64 5d 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  d])) {.         
5030: 20 20 20 72 65 74 75 72 6e 20 24 69 64 3b 0a 20     return $id;. 
5040: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5050: 20 0a 20 20 20 20 20 20 20 20 2f 2f 20 65 78 74   .        // ext
5060: 72 61 63 74 20 6d 6f 6e 69 6b 65 72 20 61 6e 64  ract moniker and
5070: 20 6f 70 74 69 6f 6e 61 6c 20 76 65 72 73 69 6f   optional versio
5080: 6e 20 6f 72 20 6e 75 6d 62 65 72 0a 20 20 20 20  n or number.    
5090: 20 20 20 20 69 66 20 28 70 72 65 67 5f 6d 61 74      if (preg_mat
50a0: 63 68 5f 61 6c 6c 28 22 2f 5c 62 5b 5c 64 2e 5d  ch_all("/\b[\d.]
50b0: 2b 5c 62 7c 5c 62 28 3f 21 47 4e 55 29 5c 77 2b  +\b|\b(?!GNU)\w+
50c0: 5c 62 2f 22 2c 20 22 24 69 64 20 78 79 44 75 6d  \b/", "$id xyDum
50d0: 6d 79 22 2c 20 24 70 29 29 20 7b 0a 0a 20 20 20  my", $p)) {..   
50e0: 20 20 20 20 20 20 20 20 20 6c 69 73 74 28 24 6e           list($n
50f0: 61 6d 65 2c 20 24 76 65 72 29 20 3d 20 40 61 72  ame, $ver) = @ar
5100: 72 61 79 28 24 70 5b 30 5d 5b 30 5d 2c 20 24 70  ray($p[0][0], $p
5110: 5b 30 5d 5b 31 5d 29 3b 0a 0a 20 20 20 20 20 20  [0][1]);..      
5120: 20 20 20 20 20 20 2f 2f 20 63 6c 6f 73 65 20 6f        // close o
5130: 72 20 61 70 70 72 6f 78 69 6d 61 74 65 64 20 6c  r approximated l
5140: 69 63 65 6e 73 65 20 64 65 73 63 72 69 70 74 69  icense descripti
5150: 6f 6e 20 6d 61 74 63 68 0a 20 20 20 20 20 20 20  on match.       
5160: 20 20 20 20 20 69 66 20 28 24 6d 61 74 63 68 20       if ($match 
5170: 3d 20 70 72 65 67 5f 67 72 65 70 28 22 2f 24 6e  = preg_grep("/$n
5180: 61 6d 65 2e 2b 3f 24 76 65 72 2f 69 22 2c 20 74  ame.+?$ver/i", t
5190: 61 67 73 3a 3a 24 6c 69 63 65 6e 73 65 73 29 0a  ags::$licenses).
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 6f 72 20 20              or  
51b0: 24 6d 61 74 63 68 20 3d 20 70 72 65 67 5f 67 72  $match = preg_gr
51c0: 65 70 28 22 2f 24 6e 61 6d 65 2f 69 22 2c 20 74  ep("/$name/i", t
51d0: 61 67 73 3a 3a 24 6c 69 63 65 6e 73 65 73 29 29  ags::$licenses))
51e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0a 20  .            {. 
51f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
5200: 65 74 75 72 6e 20 6b 65 79 28 24 6d 61 74 63 68  eturn key($match
5210: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
5220: 0a 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20  .            .  
5230: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 6f 72 20            // or 
5240: 6a 75 73 74 20 61 62 62 72 65 76 69 61 74 69 6f  just abbreviatio
5250: 6e 20 6b 65 79 73 0a 20 20 20 20 20 20 20 20 20  n keys.         
5260: 20 20 20 69 66 20 28 24 6d 61 74 63 68 20 3d 20     if ($match = 
5270: 70 72 65 67 5f 67 72 65 70 28 22 2f 7b 24 6e 61  preg_grep("/{$na
5280: 6d 65 7d 5b 4c 76 2d 5d 2a 7b 24 76 65 72 5b 30  me}[Lv-]*{$ver[0
5290: 5d 7d 2f 69 22 2c 20 61 72 72 61 79 5f 6b 65 79  ]}/i", array_key
52a0: 73 28 74 61 67 73 3a 3a 24 6c 69 63 65 6e 73 65  s(tags::$license
52b0: 73 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  s)).            
52c0: 6f 72 20 20 24 6d 61 74 63 68 20 3d 20 70 72 65  or  $match = pre
52d0: 67 5f 67 72 65 70 28 22 2f 24 6e 61 6d 65 2f 69  g_grep("/$name/i
52e0: 22 2c 20 61 72 72 61 79 5f 6b 65 79 73 28 74 61  ", array_keys(ta
52f0: 67 73 3a 3a 24 6c 69 63 65 6e 73 65 73 29 29 29  gs::$licenses)))
5300: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0a 20  .            {. 
5310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
5320: 65 74 75 72 6e 20 72 65 73 65 74 28 24 6d 61 74  eturn reset($mat
5330: 63 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ch);.           
5340: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
5350: 20 7d 0a 0a 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20   }....    /**.  
5360: 20 20 20 2a 20 47 75 65 73 73 20 6c 65 61 76 65     * Guess leave
5370: 73 20 66 72 6f 6d 20 73 74 61 6e 64 61 72 64 20  s from standard 
5380: 54 72 6f 76 65 20 63 61 74 65 67 6f 72 69 65 73  Trove categories
5390: 0a 20 20 20 20 20 2a 20 28 44 6f 65 73 20 6e 6f  .     * (Does no
53a0: 74 20 75 74 69 6c 69 7a 65 20 73 65 6c 66 3a 3a  t utilize self::
53b0: 24 74 72 65 65 20 79 65 74 21 29 0a 20 20 20 20  $tree yet!).    
53c0: 20 2a 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 66   *.     */.    f
53d0: 75 6e 63 74 69 6f 6e 20 74 72 6f 76 65 5f 74 6f  unction trove_to
53e0: 5f 74 61 67 73 28 24 61 72 72 61 79 2c 20 24 74  _tags($array, $t
53f0: 61 67 73 3d 61 72 72 61 79 28 29 29 20 7b 0a 20  ags=array()) {. 
5400: 20 20 20 20 20 20 20 70 72 65 67 5f 6d 61 74 63         preg_matc
5410: 68 5f 61 6c 6c 28 22 7e 5e 54 6f 70 69 63 20 3a  h_all("~^Topic :
5420: 3a 20 2e 2b 20 3a 3a 20 28 5c 77 5b 5c 77 5c 73  : .+ :: (\w[\w\s
5430: 2f 2d 5d 2b 29 24 7e 6d 22 2c 20 69 6d 70 6c 6f  /-]+)$~m", implo
5440: 64 65 28 22 5c 6e 22 2c 20 28 61 72 72 61 79 29  de("\n", (array)
5450: 24 61 72 72 61 79 29 2c 20 24 75 75 29 3b 0a 20  $array), $uu);. 
5460: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 28         foreach (
5470: 24 75 75 5b 31 5d 20 61 73 20 24 74 72 6f 76 65  $uu[1] as $trove
5480: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
5490: 24 74 61 67 73 5b 5d 20 3d 0a 20 20 20 20 20 20  $tags[] =.      
54a0: 20 20 20 20 20 20 20 20 20 20 73 74 72 74 6f 6c            strtol
54b0: 6f 77 65 72 28 0a 20 20 20 20 20 20 20 20 20 20  ower(.          
54c0: 20 20 20 20 20 20 20 20 20 20 73 74 72 74 72 28            strtr(
54d0: 24 74 72 6f 76 65 2c 20 22 20 2f 2e 22 2c 20 22  $trove, " /.", "
54e0: 2d 2d 5f 22 29 0a 20 20 20 20 20 20 20 20 20 20  --_").          
54f0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
5500: 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   }.        retur
5510: 6e 20 69 6d 70 6c 6f 64 65 28 22 2c 20 22 2c 20  n implode(", ", 
5520: 24 74 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 0a  $tags);.    }...
5530: 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20  .    /**.     * 
5540: 48 54 4d 4c 20 6f 75 74 70 75 74 20 6c 69 73 74  HTML output list
5550: 20 6f 66 20 54 72 6f 76 65 20 74 61 67 73 2e 0a   of Trove tags..
5560: 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 49 73       *.     * Is
5570: 20 75 73 65 64 20 69 6e 20 70 61 67 65 5f 73 75   used in page_su
5580: 62 6d 69 74 20 77 69 74 68 69 6e 20 74 68 65 20  bmit within the 
5590: 3c 64 69 76 20 63 6c 61 73 73 3d 73 65 6c 65 63  <div class=selec
55a0: 74 20 69 64 3d 74 72 6f 76 65 5f 74 61 67 73 3e  t id=trove_tags>
55b0: 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 48  .     *.     * H
55c0: 65 72 65 20 65 76 65 72 79 74 68 69 6e 67 20 6a  ere everything j
55d0: 75 73 74 20 77 72 61 70 70 65 64 20 69 6e 20 3c  ust wrapped in <
55e0: 73 70 61 6e 3e 73 2c 20 62 65 63 61 75 73 65 20  span>s, because 
55f0: 3c 73 65 6c 65 63 74 3e 20 6f 70 74 67 72 6f 75  <select> optgrou
5600: 70 73 0a 20 20 20 20 20 2a 20 63 61 6e 27 74 20  ps.     * can't 
5610: 62 65 20 6e 65 73 74 65 64 2c 20 61 6e 64 20 3c  be nested, and <
5620: 75 6c 3e 20 62 72 65 61 6b 73 20 6f 75 74 20 6f  ul> breaks out o
5630: 66 20 69 6e 6c 69 6e 65 20 66 6c 6f 77 20 74 65  f inline flow te
5640: 78 74 20 44 4f 4d 0a 20 20 20 20 20 2a 20 73 74  xt DOM.     * st
5650: 72 75 63 74 75 72 65 2e 0a 20 20 20 20 20 2a 0a  ructure..     *.
5660: 20 20 20 20 20 2a 2f 0a 20 20 20 20 66 75 6e 63       */.    func
5670: 74 69 6f 6e 20 74 72 6f 76 65 5f 73 65 6c 65 63  tion trove_selec
5680: 74 28 24 74 72 6f 76 65 2c 20 24 6c 65 76 65 6c  t($trove, $level
5690: 3d 30 2c 20 24 68 74 6d 6c 3d 22 22 29 20 7b 0a  =0, $html="") {.
56a0: 0a 20 20 20 20 20 20 20 20 2f 2f 20 6c 6f 6f 70  .        // loop
56b0: 20 74 68 72 6f 75 67 68 20 6f 6e 65 20 6c 65 76   through one lev
56c0: 65 6c 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61  el.        forea
56d0: 63 68 20 28 24 74 72 6f 76 65 20 61 73 20 24 6b  ch ($trove as $k
56e0: 65 79 3d 3e 24 76 61 6c 75 65 29 20 7b 0a 20 20  ey=>$value) {.  
56f0: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20        .         
5700: 20 20 20 2f 2f 20 6e 6f 72 6d 61 6c 69 7a 65 20     // normalize 
5710: 74 69 74 6c 65 20 69 6e 74 6f 20 74 61 67 2d 6b  title into tag-k
5720: 65 79 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  ey.            $
5730: 74 61 67 20 3d 20 69 73 5f 6e 75 6d 65 72 69 63  tag = is_numeric
5740: 28 24 6b 65 79 29 20 3f 20 24 76 61 6c 75 65 20  ($key) ? $value 
5750: 3a 20 24 6b 65 79 3b 0a 20 20 20 20 20 20 20 20  : $key;.        
5760: 20 20 20 20 24 74 61 67 20 3d 20 73 74 72 74 72      $tag = strtr
5770: 28 73 74 72 74 6f 6c 6f 77 65 72 28 24 74 61 67  (strtolower($tag
5780: 29 2c 20 22 20 2f 2e 3a 2d 22 2c 20 22 2d 2d 2d  ), " /.:-", "---
5790: 2d 2d 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  --");.          
57a0: 20 20 24 73 74 79 6c 65 20 3d 20 22 73 74 79 6c    $style = "styl
57b0: 65 3d 27 6d 61 72 67 69 6e 2d 6c 65 66 74 3a 20  e='margin-left: 
57c0: 7b 24 6c 65 76 65 6c 7d 70 78 3b 27 22 3b 0a 20  {$level}px;'";. 
57d0: 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
57e0: 20 20 20 20 2f 2f 20 64 65 73 63 65 6e 64 20 69      // descend i
57f0: 6e 74 6f 20 67 72 6f 75 70 73 0a 20 20 20 20 20  nto groups.     
5800: 20 20 20 20 20 20 20 69 66 20 28 69 73 5f 61 72         if (is_ar
5810: 72 61 79 28 24 76 61 6c 75 65 29 29 20 7b 0a 20  ray($value)) {. 
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
5830: 68 74 6d 6c 20 2e 3d 20 22 3c 73 70 61 6e 20 63  html .= "<span c
5840: 6c 61 73 73 3d 6f 70 74 67 72 6f 75 70 20 64 61  lass=optgroup da
5850: 74 61 2d 74 61 67 3d 24 74 61 67 3e 3c 62 20 63  ta-tag=$tag><b c
5860: 6c 61 73 73 3d 6f 70 74 69 6f 6e 20 64 61 74 61  lass=option data
5870: 2d 74 61 67 3d 24 74 61 67 3e 24 6b 65 79 3c 2f  -tag=$tag>$key</
5880: 62 3e 22 3b 0a 20 20 20 20 20 20 20 20 20 20 20  b>";.           
5890: 20 20 20 20 20 24 68 74 6d 6c 20 2e 3d 20 73 65       $html .= se
58a0: 6c 66 3a 3a 74 72 6f 76 65 5f 73 65 6c 65 63 74  lf::trove_select
58b0: 28 24 76 61 6c 75 65 2c 20 24 6c 65 76 65 6c 20  ($value, $level 
58c0: 2b 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20 20  + 10);.         
58d0: 20 20 20 20 20 20 20 24 68 74 6d 6c 20 2e 3d 20         $html .= 
58e0: 22 3c 2f 73 70 61 6e 3e 22 3b 0a 20 20 20 20 20  "</span>";.     
58f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5900: 20 20 20 20 20 2f 2f 20 73 6b 69 70 20 69 66 20       // skip if 
5910: 65 6e 74 72 79 20 72 65 70 65 61 74 65 64 20 61  entry repeated a
5920: 73 20 73 75 62 67 72 6f 75 70 0a 20 20 20 20 20  s subgroup.     
5930: 20 20 20 20 20 20 20 65 6c 73 65 69 66 20 28 69         elseif (i
5940: 73 73 65 74 28 24 74 72 6f 76 65 5b 24 76 61 6c  sset($trove[$val
5950: 75 65 5d 29 29 20 7b 0a 20 20 20 20 20 20 20 20  ue])) {.        
5960: 20 20 20 20 20 20 20 20 23 2e 2e 0a 20 20 20 20          #...    
5970: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5980: 20 20 20 20 20 20 2f 2f 20 73 69 6e 67 6c 65 20        // single 
5990: 74 61 67 20 65 6e 74 72 79 0a 20 20 20 20 20 20  tag entry.      
59a0: 20 20 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20        else {.   
59b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 24 68 74               $ht
59c0: 6d 6c 20 2e 3d 20 22 3c 73 70 61 6e 20 64 61 74  ml .= "<span dat
59d0: 61 2d 74 61 67 3d 24 74 61 67 20 63 6c 61 73 73  a-tag=$tag class
59e0: 3d 6f 70 74 69 6f 6e 3e 24 76 61 6c 75 65 3c 2f  =option>$value</
59f0: 73 70 61 6e 3e 22 3b 0a 20 20 20 20 20 20 20 20  span>";.        
5a00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
5a10: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
5a20: 20 72 65 74 75 72 6e 20 24 68 74 6d 6c 3b 0a 20   return $html;. 
5a30: 20 20 20 7d 0a 0a 0a 0a 20 20 20 20 2f 2a 2a 0a     }....    /**.
5a40: 20 20 20 20 20 2a 20 52 65 74 75 72 6e 73 20 6a       * Returns j
5a50: 75 73 74 20 6c 65 61 76 65 73 20 66 72 6f 6d 20  ust leaves from 
5a60: 74 72 6f 76 65 20 24 74 72 65 65 2e 0a 20 20 20  trove $tree..   
5a70: 20 20 2a 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20    *.     */.    
5a80: 66 75 6e 63 74 69 6f 6e 20 6c 65 61 76 65 73 28  function leaves(
5a90: 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ) {.        retu
5aa0: 72 6e 20 69 74 65 72 61 74 6f 72 5f 74 6f 5f 61  rn iterator_to_a
5ab0: 72 72 61 79 28 6e 65 77 20 52 65 63 75 72 73 69  rray(new Recursi
5ac0: 76 65 49 74 65 72 61 74 6f 72 49 74 65 72 61 74  veIteratorIterat
5ad0: 6f 72 28 6e 65 77 20 52 65 63 75 72 73 69 76 65  or(new Recursive
5ae0: 41 72 72 61 79 49 74 65 72 61 74 6f 72 28 73 65  ArrayIterator(se
5af0: 6c 66 3a 3a 24 74 72 65 65 29 29 29 3b 0a 20 20  lf::$tree)));.  
5b00: 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20    }...    /**.  
5b10: 20 20 20 2a 20 45 78 74 72 61 63 74 20 74 79 70     * Extract typ
5b20: 69 63 61 6c 20 72 65 6c 65 61 73 65 20 74 61 67  ical release tag
5b30: 73 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a  s..     *.     *
5b40: 2f 0a 20 20 20 20 73 74 61 74 69 63 20 66 75 6e  /.    static fun
5b50: 63 74 69 6f 6e 20 73 63 6f 70 65 5f 74 61 67 73  ction scope_tags
5b60: 28 24 73 29 20 7b 0a 20 20 20 20 20 20 20 20 70  ($s) {.        p
5b70: 72 65 67 5f 6d 61 74 63 68 5f 61 6c 6c 28 22 2f  reg_match_all("/
5b80: 6d 61 6a 6f 72 7c 6d 69 6e 6f 72 7c 62 75 67 66  major|minor|bugf
5b90: 69 78 7c 66 65 61 74 75 72 65 7c 73 65 63 75 72  ix|feature|secur
5ba0: 69 74 79 7c 64 6f 63 75 6d 65 6e 74 61 74 69 6f  ity|documentatio
5bb0: 6e 7c 68 69 64 64 65 6e 7c 63 6c 65 61 6e 75 70  n|hidden|cleanup
5bc0: 2f 69 22 2c 20 73 74 72 74 6f 6c 6f 77 65 72 28  /i", strtolower(
5bd0: 24 73 29 2c 20 24 75 75 29 3b 0a 20 20 20 20 20  $s), $uu);.     
5be0: 20 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 28 22     return join("
5bf0: 20 22 2c 20 61 72 72 61 79 5f 75 6e 69 71 75 65   ", array_unique
5c00: 28 24 75 75 5b 30 5d 29 29 3b 0a 20 20 20 20 7d  ($uu[0]));.    }
5c10: 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a  ..    /**.     *
5c20: 20 45 78 74 72 61 63 74 20 74 79 70 69 63 61 6c   Extract typical
5c30: 20 72 65 6c 65 61 73 65 20 74 61 67 73 2e 0a 20   release tags.. 
5c40: 20 20 20 20 2a 0a 20 20 20 20 20 2a 2f 0a 20 20      *.     */.  
5c50: 20 20 73 74 61 74 69 63 20 66 75 6e 63 74 69 6f    static functio
5c60: 6e 20 73 74 61 74 65 5f 74 61 67 28 24 73 29 20  n state_tag($s) 
5c70: 7b 0a 20 20 20 20 20 20 20 20 70 72 65 67 5f 6d  {.        preg_m
5c80: 61 74 63 68 5f 61 6c 6c 28 22 2f 69 6e 69 74 69  atch_all("/initi
5c90: 61 6c 7c 61 6c 70 68 61 7c 62 65 74 61 7c 64 65  al|alpha|beta|de
5ca0: 76 65 6c 6f 70 6d 65 6e 74 7c 70 72 65 72 65 6c  velopment|prerel
5cb0: 65 61 73 65 7c 73 74 61 62 6c 65 7c 6d 61 74 75  ease|stable|matu
5cc0: 72 65 7c 68 69 73 74 6f 72 69 63 2f 69 22 2c 20  re|historic/i", 
5cd0: 73 74 72 74 6f 6c 6f 77 65 72 28 24 73 29 2c 20  strtolower($s), 
5ce0: 24 75 75 29 3b 0a 20 20 20 20 20 20 20 20 72 65  $uu);.        re
5cf0: 74 75 72 6e 20 69 73 73 65 74 28 24 75 75 5b 30  turn isset($uu[0
5d00: 5d 5b 30 5d 29 20 3f 20 24 75 75 5b 30 5d 5b 30  ][0]) ? $uu[0][0
5d10: 5d 20 3a 20 22 22 3b 0a 20 20 20 20 7d 0a 0a 7d  ] : "";.    }..}
5d20: 0a 0a 0a 0a 0a 3f 3e                             .....?>