Commits

Wang Dingwei committed d87bfc3

refactored

Comments (0)

Files changed (31)

 *~
 *.swp
 *.db
+*.csv
 dist
 TESTDIR
 OIE_LISTS
-0e8f787ab8a5212f2de0d8e92767558aef7f5c66 9.0a1
-8289066f965a27df5feb359878dc0dd65eda14ec 9.0a2
-0d643d93f4569e088c4c5952222442362e714958 9.0a3
-aea1077fa587642c2d8a7f4069f044f81e69b4ec 9.0b1
-22a43e75fe4cfcd222e369075908632151732ce6 9.0b2
-8e9018635a30f9c269ca105e27e8b19c4dca43a7 9.0b3
-76aad19f1925e1649be6e36a31aa61ff9fc0e658 9.0b4
-6ef17ca4ee23f399b2292d0d676292cd5b321729 10.0a1
 371571dea3bb7c56f0b6b67ccbe68d31df123ea9 12.0
 fe203ccfcfaac06d94f05b0fcdc04fec40fa0910 12.1
 85dbd8438d22066e19e9605ebdc644463cf5b2d6 13.0

Gear.ico

Binary file removed.
+[DJ1]
+model=N4020, N4030, M4030
+exclude_mod=CTB,BTB,PLT,PLB,PLP
+exclude_srv=
+
+[DG15]
+model=N5010, M5010
+exclude_mod=CTB,BTB,PLT,PLB,PLP
+exclude_srv=
+
+[DJ2]
+model=N5020, N5030, M5030
+exclude_mod=CTB,BTB,PLT,PLB,PLP
+exclude_srv=
+
+[DR13]
+model=VostroV130
+exclude_mod=CTB,BTB,PLT,PLB,PLP
+exclude_srv=
+
+[DN]
+model=3350,3550
+exclude_mod=CTB,BTB,PLT,PLB,PLP
+exclude_srv=
+
+[DQ15]
+model=N5110 
+exclude_mod=CTB,BTB,PLT,PLB,PLP
+exclude_srv=J471G
+
+[Enrico14AMD]
+model=M4040 
+exclude_mod=CTB,BTB,PLT,PLB,PLP
+exclude_srv=
+
+[Enrico14HR]
+model=N4050 
+exclude_mod=CTB,BTB,PLT,PLB,PLP
+exclude_srv=
+
+[Enrico15AMD]
+model=M5040 
+exclude_mod=CTB,BTB,PLT,PLB,PLP
+exclude_srv=
+
+[Enrico15AR]
+model=N5040 
+exclude_mod=CTB,BTB,PLT,PLB,PLP
+exclude_srv=
+
+[Caruso14HR]
+model=V1450 
+exclude_mod=CTB,BTB,PLT,PLB,PLP
+exclude_srv=
+
+[Caruso14AR]
+model=V1440 
+exclude_mod=CTB,BTB,PLT,PLB,PLP
+exclude_srv=
+
+[Caruso15HR]
+model=1550 
+exclude_mod=CTB,BTB,PLT,PLB,PLP
+exclude_srv=
+
+[Caruso15AR]
+model=1540 
+exclude_mod=CTB,BTB,PLT,PLB,PLP
+exclude_srv=
+
+[Enrico15HR]
+model=N5050 
+exclude_mod=CTB,BTB,PLT,PLB,PLP
+exclude_srv=
+
+[DN15AMD]
+model=3555 
+exclude_mod=CTB,BTB,PLT,PLB,PLP
+exclude_srv=
+
+[DQ15AMD]
+model=M5110 
+exclude_mod=CTB,BTB,PLT,PLB,PLP
+exclude_srv=
+
+[NORAH]
+model=N311z 
+exclude_mod=CTB,BTB,PLT,PLB,PLP
+exclude_srv=M8192
+
+[JONES]
+model=V131 
+exclude_mod=CTB,BTB,PLT,PLB,PLP
+exclude_srv=

OIE_LISTS/OS Mapping table.csv

-SRV,OS Edtition,Language,Capsule,Wistron Image Name 20110423
-M9D2X,W7SE_32,English,DEL_WIM_W000068_XIENG01,
-V71XV,W7SE_32,French,"DEL_WIM_W000068_XIENG01,LPENG7600,LPFRN7600",
-VYGKH,W7SE_32,Hebrew,"DEL_WIM_W000068_XIENG01,LPENG7600,LPHEB7600",
-62KFF,W7SE_32,Turkish,"DEL_WIM_W000068_XIENG01,LPENG7600,LPTRK7600",
-PPCYW,W7SE_32,Spanish,"DEL_WIM_W000068_XIENG01,LPENG7600,LPSPA7600",
-R4WM4,W7SE_32,Russian,"DEL_WIM_W000068_XIENG01,LPENG7600,DELOLP76000RUSWN732001",,,
-0253F,W7HB_32,Arabic,"DEL_WIM_W000068_XIENG01,LPENG7600,DELOLP76000ARAWN732001",
-PCY2D,W7HB_32,Brazilian,"DEL_WIM_W000068_XIENG01,LPENG7600,DELOLP76000BRZWN732001",
-D94P2,W7HB_32,Chinese_Simplified,"DEL_WIM_W000068_XIENG01,LPENG7600,DELOLP76000CHSWN732001",
-51K3T,W7HB_32,Chinese_Traditional,"DEL_WIM_W000068_XIENG01,LPENG7600,DELOLP76000CHTWN732001",
-XXXXX,W7HB_32,Chinese_Traditional_HK,"DEL_WIM_W000068_XIENG01,LPENG7600,DEL_WLP_W000026_XICHK01",
-C57C2,W7HB_32,Dutch,"DEL_WIM_W000068_XIENG01,LPENG7600,DELOLP76000DUTWN732001",
-68N7K,W7HB_32,English,DEL_WIM_W000068_XIENG01,
-0MV9V,W7HB_32,French,"DEL_WIM_W000068_XIENG01,LPENG7600,LPFRN7600",
-2K8P1,W7HB_32,Russian,"DEL_WIM_W000068_XIENG01,LPENG7600,DELOLP76000RUSWN732001",
-FWH47,W7HB_32,Spanish,"DEL_WIM_W000068_XIENG01,LPENG7600,LPSPA7600",
-4JR3C,W7HB_32,Thai,"DEL_WIM_W000068_XIENG01,LPENG7600,DELOLP76000THAWN732001"
-VXF92,W7HB_32,Turkish,"DEL_WIM_W000068_XIENG01,LPENG7600,LPTRK7600"
-RHMR7,W7HP_32,Chinese_Traditional_HK,"DEL_WIM_W000068_XIENG01,LPENG7600,DEL_WLP_W000026_XICHK01"
-5YWDT,W7Pro_32,English,DEL_WIM_W000068_XIENG01
-296HR,W7Pro_32,Arabic,"DEL_WIM_W000068_XIENG01,LPENG7600,DELOLP76000ARAWN732001"
-KPFJN,W7Pro_32,Brazilian,"DEL_WIM_W000068_XIENG01,LPENG7600,DELOLP76000BRZWN732001"
-VT6PY,W7Pro_32,Croatian,"DEL_WIM_W000068_XIENG01,LPENG7600,DELOLP76000CROWN732001"
-HGJNX,W7Pro_32,Czech,"DEL_WIM_W000068_XIENG01,LPENG7600,DELOLP76000CZEWN732001"
-PHPC0,W7Pro_32,Danish,"DEL_WIM_W000068_XIENG01,LPENG7600,DELOLP76000DANWN732001"
-96M5K,W7Pro_32,Dutch,"DEL_WIM_W000068_XIENG01,LPENG7600,DELOLP76000DUTWN732001"
-0W8RM,W7Pro_32,Finnish,"DEL_WIM_W000068_XIENG01,LPENG7600,DELOLP76000FINWN732001"
-6KFFP,W7Pro_32,French,"DEL_WIM_W000068_XIENG01,LPENG7600,LPFRN7600"
-XF7W5,W7Pro_32,German,"DEL_WIM_W000068_XIENG01,LPENG7600,DELOLP76000GERWN732001"
-21TKM,W7Pro_32,Greek,"DEL_WIM_W000068_XIENG01,LPENG7600,DELOLP76000GREWN732001"
-ND8H6,W7Pro_32,Hebrew,"DEL_WIM_W000068_XIENG01,LPENG7600,LPHEB7600"
-X8WNH,W7Pro_32,Hungarian,"DEL_WIM_W000068_XIENG01,LPENG7600,DELOLP76000HUNWN732001"
-DFY3D,W7Pro_32,Italian,"DEL_WIM_W000068_XIENG01,LPENG7600,DELOLP76000ITNWN732001"
-53V8X,W7Pro_32,Japanese,"DEL_WIM_W000068_XIENG01,LPENG7600,DELOLP76000JPNWN732001"
-3XD6G,W7Pro_32,Korean,"DEL_WIM_W000068_XIENG01,LPENG7600,DELOLP76000KORWN732001"
-R0WDR,W7Pro_32,Norwegian,"DEL_WIM_W000068_XIENG01,LPENG7600,DELOLP76000NORWN732001"
-N3HXN,W7Pro_32,Polish,"DEL_WIM_W000068_XIENG01,LPENG7600,DELOLP76000POLWN732001"
-YW38C,W7Pro_32,Portuguese,"DEL_WIM_W000068_XIENG01,LPENG7600,DELOLP76000PORWN732001"
-PCJFC,W7Pro_32,Romanian,"DEL_WIM_W000068_XIENG01,LPENG7600,DELOLP76000ROMWN732001"
-79HXF,W7Pro_32,Russian,"DEL_WIM_W000068_XIENG01,LPENG7600,DELOLP76000RUSWN732001"
-Y3VPF,W7Pro_32,Slovak,"DEL_WIM_W000068_XIENG01,LPENG7600,DELOLP76000SVKWN732001"
-771M9,W7Pro_32,Slovenian,"DEL_WIM_W000068_XIENG01,LPENG7600,DELOLP76000SLOWN732001"
-4025V,W7Pro_32,Spanish,"DEL_WIM_W000068_XIENG01,LPENG7600,LPSPA7600"
-Y4YVV,W7Pro_32,Chinese_Simplified,"DEL_WIM_W000068_XIENG01,LPENG7600,DELOLP76000CHSWN732001"
-MVN05,W7Pro_32,Chinese_Traditional,"DEL_WIM_W000068_XIENG01,LPENG7600,DELOLP76000CHTWN732001"
-CRFYG,W7Pro_32,Chinese_Traditional_HK,"DEL_WIM_W000068_XIENG01,LPENG7600,DEL_WLP_W000026_XICHK01"
-88T2D,W7Pro_32,Thai,"DEL_WIM_W000068_XIENG01,LPENG7600,DELOLP76000THAWN732001"
-FJJ3X,W7Pro_32,Turkish,"DEL_WIM_W000068_XIENG01,LPENG7600,LPTRK7600"
-13NV1,W7Pro_32,Swedish,"DEL_WIM_W000068_XIENG01,LPENG7600,DELOLP76000SWEWN732001"
-N305J,W7Ult_32,Chinese_Traditional_HK,"DEL_WIM_W000068_XIENG01,LPENG7600,DEL_WLP_W000026_XICHK01"
-DMH9P,W7HB_64,Arabic,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPARA7600X64A1"
-7NM2C,W7HB_64,Brazilian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPBPOR7600X64A1"
-WV2TH,W7HB_64,Bulgarian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPBLUG7600X64"
-16RC5,W7HB_64,Croatian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPCRO7600X64A1"
-4VGFC,W7HB_64,Czech,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPCZE7600X64A1"
-39808,W7HB_64,Danish,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPDAN7600X64A1"
-F108X,W7HB_64,Dutch,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPDUT7600X64A1"
-GH36N,W7HB_64,English,DEL_WIM_W000068_XJENG01
-G28XN,W7HB_64,Finnish,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPFIN7600X64A1"
-NP5NK,W7HB_64,French,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPFRN7600X64A1"
-H7GVK,W7HB_64,German,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPGER7600X64A1"
-34G55,W7HB_64,Greek,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPGRE7600X64A2"
-F26PW,W7HB_64,Hebrew,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPHEB7600X64A2"
-V73HJ,W7HB_64,Hungarian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPHUN7600X64A1"
-RX8YM,W7HB_64,Portuguese,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPPOR7600X64A1"
-4TND1,W7HB_64,Italian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPITN7600X64A1"
-C4GNH,W7HB_64,Japanese,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPJPN7600X64"
-79J5W,W7HB_64,Korean,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPKOR7600X64A1"
-XVWJG,W7HB_64,Norwegian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPNOR7600X64A1"
-TKGDV,W7HB_64,Polish,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPPOL7600X64A1"
-97XTY,W7HB_64,Romanian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPROM7600X64A1"
-HW21M,W7HB_64,Russian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPRUS7600X64A1"
-R0W0M,W7HB_64,Chinese_Simplified,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPCHS7600X64A1"
-Y5KGM,W7HB_64,Slovak,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPSVK7600X64A1"
-76VR9,W7HB_64,Slovenian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,DELOLP76000SLOWN764001"
-KJ95W,W7HB_64,Spanish,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPSPA7600X64A1"
-3TFHX,W7HB_64,Serbian_Latin,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPSPA7600X64A1"
-2YCPG,W7HB_64,Swedish,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPSWE7600X64A1"
-JMNKN,W7HB_64,Chinese_Traditional,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPCHT7600X64A1"
-8VHDT,W7HB_64,Chinese_Traditional_HK,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPCHK7600X64A1"
-0KY4Y,W7HB_64,Thai,"DEL_WIM_W000068_XJENG01,LPENG7600X64,DELOLP76000THAWN764001"
-F15YN,W7HB_64,Turkish,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPTRK7600X64A1"
-5KGKD,W7HP_64,Arabic,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPARA7600X64A1"
-37P7K,W7HP_64,Brazilian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPBPOR7600X64A1"
-2XYM3,W7HP_64,Bulgarian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPBLUG7600X64"
-849WX,W7HP_64,Croatian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPCRO7600X64A1"
-X54X1,W7HP_64,Czech,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPCZE7600X64A1"
-C1VW7,W7HP_64,Danish,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPDAN7600X64A1"
-JWFHP,W7HP_64,Dutch,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPDUT7600X64A1"
-MMJKH,W7HP_64,English,DEL_WIM_W000068_XJENG01
-4PCT0,W7HP_64,Finnish,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPFIN7600X64A1"
-14DF5,W7HP_64,French,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPFRN7600X64A1"
-3J0DF,W7HP_64,German,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPGER7600X64A1"
-P0F1M,W7HP_64,Greek,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPGRE7600X64A2"
-D5MTJ,W7HP_64,Hebrew,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPHEB7600X64A2"
-HKM13,W7HP_64,Hungarian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPHUN7600X64A1"
-FJ6JF,W7HP_64,Portuguese,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPPOR7600X64A1"
-KXVTK,W7HP_64,Italian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPITN7600X64A1"
-RWGN6,W7HP_64,Japanese,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPJPN7600X64"
-4VFTD,W7HP_64,Korean,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPKOR7600X64A1"
-WYJPW,W7HP_64,Norwegian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPNOR7600X64A1"
-C05N9,W7HP_64,Polish,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPPOL7600X64A1"
-3K9HV,W7HP_64,Romanian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPROM7600X64A1"
-MH4XF,W7HP_64,Russian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPRUS7600X64A1"
-VCF09,W7HP_64,Chinese_Simplified,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPCHS7600X64A1"
-H42KY,W7HP_64,Slovak,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPSVK7600X64A1"
-45DMK,W7HP_64,Slovenian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,DELOLP76000SLOWN764001"
-XDXC2,W7HP_64,Spanish,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPSPA7600X64A1"
-WG7DM,W7HP_64,Serbian_Latin,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPSPA7600X64A1"
-2DNFY,W7HP_64,Swedish,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPSWE7600X64A1"
-ND2NK,W7HP_64,Chinese_Traditional,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPCHT7600X64A1"
-2C2D8,W7HP_64,Chinese_Traditional_HK,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPCHK7600X64A1"
-XKC0F,W7HP_64,Thai,"DEL_WIM_W000068_XJENG01,LPENG7600X64,DELOLP76000THAWN764001"
-HTMK0,W7HP_64,Turkish,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPTRK7600X64A1"
-6FR0N,W7HP_64,English,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPFRN7600X64A1"
-969N3,W7HP_64,English,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPDAN7600X64A1,LPFIN7600X64A1,LPNOR7600X64A1,LPSWE7600X64A1"
-67P26,W7HP_64,English,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPFRN7600X64A1,LPITN7600X64A1,LPGER7600X64A1"
-MPPDV,W7HP_64,English,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPFRN7600X64A1,LPDUT7600X64A1"
-60N7M,W7HP_64,English,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPCZE7600X64A1,LPHUN7600X64A1,LPSVK7600X64A1,LPPOL7600X64A1"
-46HMJ,W7Pro_64,Arabic,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPARA7600X64A1"
-CVWJV,W7Pro_64,Brazilian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPBPOR7600X64A1"
-4FRDD,W7Pro_64,Bulgarian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPBLUG7600X64"
-N685Y,W7Pro_64,Croatian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPCRO7600X64A1"
-4CTNP,W7Pro_64,Czech,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPCZE7600X64A1"
-3NMTH,W7Pro_64,Danish,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPDAN7600X64A1"
-V1V64,W7Pro_64,Dutch,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPDUT7600X64A1"
-7G98V,W7Pro_64,English,DEL_WIM_W000068_XJENG01
-RRF23,W7Pro_64,Finnish,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPFIN7600X64A1"
-488H0,W7Pro_64,French,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPFRN7600X64A1"
-VWY3P,W7Pro_64,German,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPGER7600X64A1"
-VWF80,W7Pro_64,Greek,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPGRE7600X64A2"
-HM73F,W7Pro_64,Hebrew,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPHEB7600X64A2"
-R12M8,W7Pro_64,Hungarian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPHUN7600X64A1"
-FG7P9,W7Pro_64,Portuguese,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPPOR7600X64A1"
-MYRY9,W7Pro_64,Italian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPITN7600X64A1"
-DV4FG,W7Pro_64,Japanese,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPJPN7600X64"
-YVRHM,W7Pro_64,Korean,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPKOR7600X64A1"
-05RX4,W7Pro_64,Norwegian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPNOR7600X64A1"
-G27J3,W7Pro_64,Polish,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPPOL7600X64A1"
-FGPXK,W7Pro_64,Romanian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPROM7600X64A1"
-9T7X4,W7Pro_64,Russian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPRUS7600X64A1"
-T33YG,W7Pro_64,Chinese_Simplified,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPCHS7600X64A1"
-RP65J,W7Pro_64,Slovak,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPSVK7600X64A1"
-THGGX,W7Pro_64,Slovenian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,DELOLP76000SLOWN764001"
-3HH84,W7Pro_64,Spanish,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPSPA7600X64A1"
-CCGJ0,W7Pro_64,Serbian_Latin,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPSPA7600X64A1"
-M5H9J,W7Pro_64,Swedish,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPSWE7600X64A1"
-5635H,W7Pro_64,Chinese_Traditional,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPCHT7600X64A1"
-JVKT2,W7Pro_64,Chinese_Traditional_HK,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPCHK7600X64A1"
-4YGW9,W7Pro_64,Thai,"DEL_WIM_W000068_XJENG01,LPENG7600X64,DELOLP76000THAWN764001"
-DYFX1,W7Pro_64,Turkish,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPTRK7600X64A1"
-RCNGN,W7Pro_64,English,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPFRN7600X64A1"
-7WK0K,W7Pro_64,English,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPDAN7600X64A1,LPFIN7600X64A1,LPNOR7600X64A1,LPSWE7600X64A1"
-R3GPN,W7Pro_64,English,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPFRN7600X64A1,LPITN7600X64A1,LPGER7600X64A1"
-WMMJ1,W7Pro_64,English,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPFRN7600X64A1,LPDUT7600X64A1"
-JYH2M,W7Pro_64,English,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPCZE7600X64A1,LPHUN7600X64A1,LPSVK7600X64A1,LPPOL7600X64A1"
-NDFGM,W7Ult_64,Arabic,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPARA7600X64A1"
-N3YVK,W7Ult_64,Brazilian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPBPOR7600X64A1"
-YF7DM,W7Ult_64,Bulgarian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPBLUG7600X64"
-T1VNV,W7Ult_64,Croatian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPCRO7600X64A1"
-TJXG7,W7Ult_64,Czech,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPCZE7600X64A1"
-9PFNW,W7Ult_64,Danish,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPDAN7600X64A1"
-NY9XF,W7Ult_64,Dutch,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPDUT7600X64A1"
-J8WR2,W7Ult_64,English,DEL_WIM_W000068_XJENG01
-60TTM,W7Ult_64,Finnish,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPFIN7600X64A1"
-4PTPX,W7Ult_64,French,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPFRN7600X64A1"
-9XT77,W7Ult_64,German,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPGER7600X64A1"
-70GYH,W7Ult_64,Greek,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPGRE7600X64A2"
-5V7FW,W7Ult_64,Hebrew,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPHEB7600X64A2"
-R5P08,W7Ult_64,Hungarian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPHUN7600X64A1"
-PRJ8G,W7Ult_64,Portuguese,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPPOR7600X64A1"
-515VY,W7Ult_64,Italian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPITN7600X64A1"
-PHG3R,W7Ult_64,Japanese,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPJPN7600X64"
-P40GY,W7Ult_64,Korean,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPKOR7600X64A1"
-0F1D6,W7Ult_64,Norwegian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPNOR7600X64A1"
-387V5,W7Ult_64,Polish,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPPOL7600X64A1"
-0FMT9,W7Ult_64,Romanian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPROM7600X64A1"
-29XG4,W7Ult_64,Russian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPRUS7600X64A1"
-5GM8N,W7Ult_64,Chinese_Simplified,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPCHS7600X64A1"
-P4DKH,W7Ult_64,Slovak,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPSVK7600X64A1"
-3PFP2,W7Ult_64,Slovenian,"DEL_WIM_W000068_XJENG01,LPENG7600X64,DELOLP76000SLOWN764001"
-K9DD5,W7Ult_64,Spanish,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPSPA7600X64A1"
-JF1V6,W7Ult_64,Serbian_Latin,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPSPA7600X64A1"
-GMG1R,W7Ult_64,Swedish,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPSWE7600X64A1"
-WCY35,W7Ult_64,Chinese_Traditional,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPCHT7600X64A1"
-5R0CP,W7Ult_64,Chinese_Traditional_HK,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPCHK7600X64A1"
-2X2CP,W7Ult_64,Thai,"DEL_WIM_W000068_XJENG01,LPENG7600X64,DELOLP76000THAWN764001"
-PP2GJ,W7Ult_64,Turkish,"DEL_WIM_W000068_XJENG01,LPENG7600X64,LPTRK7600X64A1"
-1VVJG,XTRA-LANG@V,AR-SA,"DELOLP76000ARAWN732001,LPARA7600X64A1,DEL_WLP_W000047_XIARA01,DEL_WLP_W000047_XJARA01"
-1037M,XTRA-LANG@V,PT-BR,"DELOLP76000BRZWN732001,LPBPOR7600X64A1,DEL_WLP_W000047_XIBRZ01,DEL_WLP_W000047_XJBRZ01"
-4DM4V,XTRA-LANG@V,bg-BG,",,DEL_WLP_W000047_XIBUL01,DEL_WLP_W000047_XJBUL01"
-F315J,XTRA-LANG@V,hr-HR,",,DEL_WLP_W000047_XICRO01,DEL_WLP_W000047_XJCRO01"
-D421J,XTRA-LANG@V,CS-CZ,"DELOLP76000CZEWN732001,LPCZE7600X64A1,DEL_WLP_W000047_XICZE01,DEL_WLP_W000047_XJCZE01"
-F127J,XTRA-LANG@V,DA-DK,"DELOLP76000DANWN732001,LPDAN7600X64A1,DEL_WLP_W000047_XIDAN01,DEL_WLP_W000047_XJDAN01"
-D588J,XTRA-LANG@V,NL-NL,"DELOLP76000DUTWN732001,LPDUT7600X64A1,DEL_WLP_W000047_XIDUT01,DEL_WLP_W000047_XJDUT01"
-G174J,XTRA-LANG@V,EN-US,"LPENG7600,LPENG7600X64,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XJENG01"
-C582J,XTRA-LANG@V,FI-FI,"DELOLP76000FINWN732001,LPFIN7600X64A1,DEL_WLP_W000047_XIFIN01,DEL_WLP_W000047_XJFIN01"
-G424J,XTRA-LANG@V,FR-FR,"LPFRN7600,LPFRN7600X64A1,DEL_WLP_W000047_XIFRN01,DEL_WLP_W000047_XJFRN01"
-H141J,XTRA-LANG@V,DE-DE,"DELOLP76000GERWN732001,LPGER7600X64A1,DEL_WLP_W000047_XIGER01,DEL_WLP_W000047_XJGER01"
-G425J,XTRA-LANG@V,EL-GR,"DELOLP76000GREWN732001,LPGRE7600X64A2,DEL_WLP_W000047_XIGRE01,DEL_WLP_W000047_XJGRE01"
-4P0WN,XTRA-LANG@V,HE-IL,"LPHEB7600,LPHEB7600X64A2,DEL_WLP_W000047_XIHEB01,DEL_WLP_W000047_XJHEB01"
-G177J,XTRA-LANG@V,HU-HU,"DELOLP76000HUNWN732001,LPHUN7600X64A1,DEL_WLP_W000047_XIHUN01,DEL_WLP_W000047_XJHUN01"
-H145J,XTRA-LANG@V,PT-PT,"DELOLP76000PORWN732001,LPPOR7600X64A1,DEL_WLP_W000047_XIPOR01,DEL_WLP_W000047_XJPOR01"
-F314J,XTRA-LANG@V,IT-IT,"DELOLP76000ITNWN732001,LPITN7600X64A1,DEL_WLP_W000047_XIITN01,DEL_WLP_W000047_XJITN01"
-V8TVD,XTRA-LANG@V,JA-JP,"DELOLP76000JPNWN732001,LPJPN7600X64,DEL_WLP_W000047_XIJPN01,DEL_WLP_W000047_XJJPN01"
-V5R8J,XTRA-LANG@V,KO-KR,"DELOLP76000KORWN732001,LPKOR7600X64A1,DEL_WLP_W000047_XIKOR01,DEL_WLP_W000047_XJKOR01"
-D422J,XTRA-LANG@V,NB-NO,"DELOLP76000NORWN732001,LPNOR7600X64A1,DEL_WLP_W000047_XINOR01,DEL_WLP_W000047_XJNOR01"
-C583J,XTRA-LANG@V,PL-PL,"DELOLP76000POLWN732001,LPPOL7600X64A1,DEL_WLP_W000047_XIPOL01,DEL_WLP_W000047_XJPOL01"
-H146J,XTRA-LANG@V,RO-RO,"DELOLP76000ROMWN732001,LPROM7600X64A1,DEL_WLP_W000047_XIROM01,DEL_WLP_W000047_XJROM01"
-NP24W,XTRA-LANG@V,RU-RU,"DELOLP76000RUSWN732001,LPRUS7600X64A1,DEL_WLP_W000047_XIRUS01,DEL_WLP_W000047_XJRUS01"
-3X0CG,XTRA-LANG@V,ZH-CN,"DELOLP76000CHSWN732001,LPCHS7600X64A1,DEL_WLP_W000047_XICHS01,DEL_WLP_W000047_XJCHS01"
-C860J,XTRA-LANG@V,SK-SK,"DELOLP76000SVKWN732001,LPSVK7600X64A1,DEL_WLP_W000047_XISVK01,DEL_WLP_W000047_XJSVK01"
-C860J,XTRA-LANG@V,SL-SI,"DELOLP76000SLOWN732001,DELOLP76000SLOWN764001,DEL_WLP_W000047_XISLO01,DEL_WLP_W000047_XJSLO01"
-C858J,XTRA-LANG@V,ES-ES,"LPSPA7600,LPSPA7600X64A1,DEL_WLP_W000047_XISPA01,DEL_WLP_W000047_XJSPA01"
-TF985,XTRA-LANG@V,sr-Latn-CS,
-G178J,XTRA-LANG@V,SV-SE,"DELOLP76000SWEWN732001,LPSWE7600X64A1,DEL_WLP_W000047_XISWE01,DEL_WLP_W000047_XJSWE01"
-YV0P4,XTRA-LANG@V,ZH-TW,"DELOLP76000CHTWN732001,LPCHT7600X64A1,DEL_WLP_W000047_XICHT01,DEL_WLP_W000047_XJCHT01"
-5DJH1,XTRA-LANG@V,ZH-HK,"DEL_WLP_W000026_XICHK01,LPCHK7600X64A1,DEL_WLP_W000047_XICHK01,DEL_WLP_W000047_XJCHK01"
-FHP2Y,XTRA-LANG@V,TH-TH,"DELOLP76000THAWN732001,DELOLP76000THAWN764001,DEL_WLP_W000047_XITHA01,DEL_WLP_W000047_XJTHA01"
-D589J,XTRA-LANG@V,TR-TR,"LPTRK7600,LPTRK7600X64A1,DEL_WLP_W000047_XITRK01,DEL_WLP_W000047_XJTRK01"
-25X8N,W7SE_SP1_32,Arabic,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIARA01"
-10T2X,W7SE_SP1_32,Brazilian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIBRZ01"
-HWYTN,W7SE_SP1_32,Bulgarian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIBUL01"
-VV9FV,W7SE_SP1_32,Croatian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XICRO01"
-V9WHK,W7SE_SP1_32,Czech,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XICZE01"
-VFXF8,W7SE_SP1_32,Danish,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIDAN01"
-J8XYM,W7SE_SP1_32,Dutch,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIDUT01"
-TGKK1,W7SE_SP1_32,English,DEL_WIM_W000047_XIENG01
-15FM5,W7SE_SP1_32,Finnish,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIFIN01"
-9PCC9,W7SE_SP1_32,French,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIFRN01"
-TRJ3X,W7SE_SP1_32,German,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIGER01"
-V5465,W7SE_SP1_32,Greek,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIGRE01"
-TD90G,W7SE_SP1_32,Hebrew,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIHEB01"
-VKTYK,W7SE_SP1_32,Hungarian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIHUN01"
-M7F6F,W7SE_SP1_32,Portuguese,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIIPOR01"
-DCTCF,W7SE_SP1_32,Italian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIITL01"
-V4PG4,W7SE_SP1_32,Japanese,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIJPN01"
-NFW5X,W7SE_SP1_32,Korean,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIKOR01"
-M1KV7,W7SE_SP1_32,Norwegian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XINOR01"
-CDG31,W7SE_SP1_32,Polish,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIPOL01"
-3DXT3,W7SE_SP1_32,Romanian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIROM01"
-T021W,W7SE_SP1_32,Russian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIRUS01"
-NHK4P,W7SE_SP1_32,Chinese_Simplified,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XICHS01"
-67HXT,W7SE_SP1_32,Slovak,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XISVK01"
-34G9K,W7SE_SP1_32,Slovenian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XISLO01"
-2KJ5Y,W7SE_SP1_32,Spanish,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XISPA01"
-K9R3H,W7SE_SP1_32,Serbian (Latin Serbia),"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XISEL01"
-0KPP3,W7SE_SP1_32,Swedish,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XISWE01"
-KVF68,W7SE_SP1_32,Chinese_Traditional,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XICHT01"
-7G4CN,W7SE_SP1_32,Chinese_Traditional_HK,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XICHK01"
-W4F16,W7SE_SP1_32,Thai,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XITHA01"
-M3K1M,W7SE_SP1_32,Turkish,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XITRK01"
-2JRVR,W7HB_SP1_32,Arabic,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIARA01"
-C04DD,W7HB_SP1_32,Brazilian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIBRZ01"
-2P3K8,W7HB_SP1_32,Dutch,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIDUT01"
-DFXC4,W7HB_SP1_32,English,DEL_WIM_W000047_XIENG01
-74JJ1,W7HB_SP1_32,French,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIFRN01"
-4TYR1,W7HB_SP1_32,Russian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIRUS01"
-CK9T9,W7HB_SP1_32,Chinese_Simplified,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XICHS01"
-4N5NH,W7HB_SP1_32,Spanish,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XISPA01"
-3TYXH,W7HB_SP1_32,Serbian (Latin Serbia),"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XISEL01"
-N7NV3,W7HB_SP1_32,Chinese_Traditional,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XICHT01"
-YC4F7,W7HB_SP1_32,Thai,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XITHA01"
-XKD86,W7HB_SP1_32,Turkish,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XITRK01"
-FX4PV,W7HP_SP1_32,Arabic,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIARA01"
-FJ8WJ,W7HP_SP1_32,Brazilian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIBRZ01"
-585NN,W7HP_SP1_32,Bulgarian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIBUL01"
-DXNH4,W7HP_SP1_32,Croatian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XICRO01"
-8TK64,W7HP_SP1_32,Czech,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XICZE01"
-1JXX1,W7HP_SP1_32,Danish,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIDAN01"
-4C6G3,W7HP_SP1_32,Dutch,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIDUT01"
-73MHN,W7HP_SP1_32,English,DEL_WIM_W000047_XIENG01
-K94DV,W7HP_SP1_32,Finnish,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIFIN01"
-Y7PNY,W7HP_SP1_32,French,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIFRN01"
-8W6V0,W7HP_SP1_32,German,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIGER01"
-6D4KV,W7HP_SP1_32,Greek,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIGRE01"
-R66HX,W7HP_SP1_32,Hebrew,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIHEB01"
-FPM27,W7HP_SP1_32,Hungarian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIHUN01"
-XYW84,W7HP_SP1_32,Portuguese,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIIPOR01"
-CPYTK,W7HP_SP1_32,Italian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIITL01"
-NDHHN,W7HP_SP1_32,Japanese,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIJPN01"
-1JM6W,W7HP_SP1_32,Korean,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIKOR01"
-W7DJG,W7HP_SP1_32,Norwegian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XINOR01"
-FX93X,W7HP_SP1_32,Polish,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIPOL01"
-M32MD,W7HP_SP1_32,Romanian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIROM01"
-XMT33,W7HP_SP1_32,Russian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIRUS01"
-FRKTG,W7HP_SP1_32,Chinese_Simplified,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XICHS01"
-NPW05,W7HP_SP1_32,slovak,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XISVK01"
-4VHGR,W7HP_SP1_32,Slovenian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XISLO01"
-D6R14,W7HP_SP1_32,Spanish,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XISPA01"
-N9TYX,W7HP_SP1_32,Serbian (Latin Serbia),"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XISEL01"
-0MF5D,W7HP_SP1_32,Swedish,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XISWE01"
-4WHNG,W7HP_SP1_32,Chinese_Traditional,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XICHT01"
-HNK2P,W7HP_SP1_32,Chinese_Traditional_HK,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XICHK01"
-64XY8,W7HP_SP1_32,Thai,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XITHA01"
-8J7F3,W7HP_SP1_32,Turkish,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XITRK01"
-K8FF6,W7Pro_SP1_32,Arabic,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIARA01"
-VRNMK,W7Pro_SP1_32,Brazilian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIBRZ01"
-Y3JR5,W7Pro_SP1_32,Bulgarian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIBUL01"
-7FKXN,W7Pro_SP1_32,Croatian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XICRO01"
-CT0XM,W7Pro_SP1_32,Czech,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XICZE01"
-P1H4M,W7Pro_SP1_32,Danish,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIDAN01"
-9PWH6,W7Pro_SP1_32,Dutch,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIDUT01"
-GW3X3,W7Pro_SP1_32,English,DEL_WIM_W000047_XIENG01
-WXJ4P,W7Pro_SP1_32,Finnish,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIFIN01"
-WV3C1,W7Pro_SP1_32,French,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIFRN01"
-CMKK8,W7Pro_SP1_32,German,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIGER01"
-Y1WTW,W7Pro_SP1_32,Greek,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIGRE01"
-6TG55,W7Pro_SP1_32,Hebrew,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIHEB01"
-M8GDJ,W7Pro_SP1_32,Hungarian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIHUN01"
-NPNX0,W7Pro_SP1_32,Portuguese,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIIPOR01"
-7W9P1,W7Pro_SP1_32,Italian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIITL01"
-3FR8D,W7Pro_SP1_32,Japanese,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIJPN01"
-MG43V,W7Pro_SP1_32,Korean,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIKOR01"
-TKDPH,W7Pro_SP1_32,Norwegian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XINOR01"
-68RKM,W7Pro_SP1_32,Polish,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIPOL01"
-M9D3D,W7Pro_SP1_32,Romanian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIROM01"
-TTK3G,W7Pro_SP1_32,Russian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIRUS01"
-5VTRC,W7Pro_SP1_32,Chinese_Simplified,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XICHS01"
-T2P6K,W7Pro_SP1_32,slovak,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XISVK01"
-KTFFM,W7Pro_SP1_32,Slovenian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XISLO01"
-JDYDT,W7Pro_SP1_32,Spanish,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XISPA01"
-RJK4J,W7Pro_SP1_32,Serbian (Latin Serbia),"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XISEL01"
-3KC04,W7Pro_SP1_32,Swedish,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XISWE01"
-YTVVM,W7Pro_SP1_32,Chinese_Traditional,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XICHT01"
-GTGMH,W7Pro_SP1_32,Chinese_Traditional_HK,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XICHK01"
-FHH6P,W7Pro_SP1_32,Thai,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XITHA01"
-4T6Y9,W7Pro_SP1_32,Turkish,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XITRK01"
-C6HH1,W7Ult_SP1_32,Arabic,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIARA01"
-R04F2,W7Ult_SP1_32,Brazilian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIBRZ01"
-1KK01,W7Ult_SP1_32,Bulgarian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIBUL01"
-VHWGV,W7Ult_SP1_32,Croatian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XICRO01"
-NN8KK,W7Ult_SP1_32,Czech,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XICZE01"
-JKT3T,W7Ult_SP1_32,Danish,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIDAN01"
-4RRN3,W7Ult_SP1_32,Dutch,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIDUT01"
-P11P2,W7Ult_SP1_32,English,DEL_WIM_W000047_XIENG01
-NN71W,W7Ult_SP1_32,Finnish,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIFIN01"
-KDMHR,W7Ult_SP1_32,French,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIFRN01"
-6VM96,W7Ult_SP1_32,German,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIGER01"
-13YF5,W7Ult_SP1_32,Greek,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIGRE01"
-CK17J,W7Ult_SP1_32,Hebrew,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIHEB01"
-C9D88,W7Ult_SP1_32,Hungarian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIHUN01"
-P8JJ1,W7Ult_SP1_32,Portuguese,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIIPOR01"
-KPHCG,W7Ult_SP1_32,Italian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIITL01"
-Y8WTT,W7Ult_SP1_32,Japanese,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIJPN01"
-R0F2J,W7Ult_SP1_32,Korean,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIKOR01"
-TYM0W,W7Ult_SP1_32,Norwegian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XINOR01"
-GRHK4,W7Ult_SP1_32,Polish,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIPOL01"
-8JWXM,W7Ult_SP1_32,Romanian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIROM01"
-G12P5,W7Ult_SP1_32,Russian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XIRUS01"
-XH9HT,W7Ult_SP1_32,Chinese_Simplified,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XICHS01"
-6KX2N,W7Ult_SP1_32,slovak,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XISVK01"
-1R51X,W7Ult_SP1_32,Slovenian,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XISLO01"
-66F4F,W7Ult_SP1_32,Spanish,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XISPA01"
-WC70P,W7Ult_SP1_32,Serbian (Latin Serbia),"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XISEL01"
-NJ1VG,W7Ult_SP1_32,Swedish,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XISWE01"
-6NTY6,W7Ult_SP1_32,Chinese_Traditional,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XICHT01"
-N8NCF,W7Ult_SP1_32,Chinese_Traditional_HK,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XICHK01"
-1M4R4,W7Ult_SP1_32,Thai,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XITHA01"
-1JDK7,W7Ult_SP1_32,Turkish,"DEL_WIM_W000047_XIENG01,DEL_WLP_W000047_XIENG01,DEL_WLP_W000047_XITRK01"
-CCVCT,W7HB_SP1_64,Arabic,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJARA01"
-D5JG1,W7HB_SP1_64,Brazilian,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJBRZ01"
-GH96W,W7HB_SP1_64,Dutch,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJDUT01"
-X1F34,W7HB_SP1_64,English,DEL_WIM_W000047_XJENG01
-CFN22,W7HB_SP1_64,French,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJFRN01"
-X0JC2,W7HB_SP1_64,Russian,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJRUS01"
-TR5XX,W7HB_SP1_64,Chinese_Simplified,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJCHS01"
-WGR8J,W7HB_SP1_64,Spanish,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJSPA01"
-TR3J6,W7HB_SP1_64,Serbian (Latin Serbia),"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJSEL01"
-V4RK9,W7HB_SP1_64,Chinese_Traditional,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJCHT01"
-8FP4R,W7HB_SP1_64,Thai,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJTHA01"
-CTRPJ,W7HB_SP1_64,Turkish,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJTRK01"
-0MXY9,W7HP_SP1_64,Arabic,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJARA01"
-K8N84,W7HP_SP1_64,Brazilian,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJBRZ01"
-G4KWH,W7HP_SP1_64,Bulgarian,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJBUL01"
-5CKG0,W7HP_SP1_64,Croatian,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJCRO01"
-MYW37,W7HP_SP1_64,Czech,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJCZE01"
-V5N5K,W7HP_SP1_64,Danish,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJDAN01"
-62D24,W7HP_SP1_64,Dutch,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJDUT01"
-V3MC3,W7HP_SP1_64,English,DEL_WIM_W000047_XJENG01
-FGTHK,W7HP_SP1_64,Finnish,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJFIN01"
-7KVP7,W7HP_SP1_64,French,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJFRN01"
-H6PCR,W7HP_SP1_64,German,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJGER01"
-V17Y3,W7HP_SP1_64,Greek,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJGRE01"
-R3J8F,W7HP_SP1_64,Hebrew,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJHEB01"
-276G8,W7HP_SP1_64,Hungarian,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJHUN01"
-CD8P8,W7HP_SP1_64,Portuguese,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJPOR01"
-P13YJ,W7HP_SP1_64,Italian,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJITN01"
-XD3YP,W7HP_SP1_64,Japanese,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJJPN01"
-GHPYV,W7HP_SP1_64,Korean,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJKOR01"
-HHX7X,W7HP_SP1_64,Norwegian,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJNOR01"
-2VJ9J,W7HP_SP1_64,Polish,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJPOL01"
-8HHXG,W7HP_SP1_64,Romanian,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJROM01"
-DM22N,W7HP_SP1_64,Russian,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJRUS01"
-RF3FK,W7HP_SP1_64,Chinese_Simplified,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJCHS01"
-GX0MX,W7HP_SP1_64,Slovak,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJSVK01"
-62RT7,W7HP_SP1_64,Slovenian,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJSLO01"
-24H3Y,W7HP_SP1_64,Spanish,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJSPA01"
-0HNGH,W7HP_SP1_64,Serbian (Latin Serbia),"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJSEL01"
-VT6G7,W7HP_SP1_64,Swedish,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJSWE01"
-CJT98,W7HP_SP1_64,Chinese_Traditional,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJCHT01"
-HHKNR,W7HP_SP1_64,Chinese_Traditional_HK,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJCHK01"
-G2XFT,W7HP_SP1_64,Thai,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJTHA01"
-JVF80,W7HP_SP1_64,Turkish,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJTRK01"
-K7XDJ,W7Pro_SP1_64,Arabic,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJARA01"
-N766T,W7Pro_SP1_64,Brazilian,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJBRZ01"
-H46GM,W7Pro_SP1_64,Bulgarian,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJBUL01"
-1KC70,W7Pro_SP1_64,Croatian,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJCRO01"
-8HMGF,W7Pro_SP1_64,Czech,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJCZE01"
-93N9D,W7Pro_SP1_64,Danish,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJDAN01"
-P6FTT,W7Pro_SP1_64,Dutch,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJDUT01"
-K0G3P,W7Pro_SP1_64,English,DEL_WIM_W000047_XJENG01
-8FPHR,W7Pro_SP1_64,Finnish,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJFIN01"
-C71X4,W7Pro_SP1_64,French,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJFRN01"
-8JJJV,W7Pro_SP1_64,German,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJGER01"
-5TDKH,W7Pro_SP1_64,Greek,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJGRE01"
-VJYT1,W7Pro_SP1_64,Hebrew,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJHEB01"
-NPJRT,W7Pro_SP1_64,Hungarian,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJHUN01"
-K8RTK,W7Pro_SP1_64,Portuguese,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJPOR01"
-0YHR3,W7Pro_SP1_64,Italian,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJITN01"
-NVT7K,W7Pro_SP1_64,Japanese,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJJPN01"
-HHD1M,W7Pro_SP1_64,Korean,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJKOR01"
-Y13H4,W7Pro_SP1_64,Norwegian,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJNOR01"
-46P0Y,W7Pro_SP1_64,Polish,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJPOL01"
-V8KH7,W7Pro_SP1_64,Romanian,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJROM01"
-J5Y5J,W7Pro_SP1_64,Russian,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJRUS01"
-R4T9T,W7Pro_SP1_64,Chinese_Simplified,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJCHS01"
-4MFR2,W7Pro_SP1_64,Slovak,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJSVK01"
-G7W70,W7Pro_SP1_64,Slovenian,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJSLO01"
-N9MWW,W7Pro_SP1_64,Spanish,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJSPA01"
-9F18C,W7Pro_SP1_64,Serbian (Latin Serbia),"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJSEL01"
-Y39M5,W7Pro_SP1_64,Swedish,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJSWE01"
-34D54,W7Pro_SP1_64,Chinese_Traditional,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJCHT01"
-4N376,W7Pro_SP1_64,Chinese_Traditional_HK,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJCHK01"
-55DW6,W7Pro_SP1_64,Thai,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJTHA01"
-997CW,W7Pro_SP1_64,Turkish,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJTRK01"
-GPC9F,W7Ult_SP1_64,Arabic,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJARA01"
-0TKMF,W7Ult_SP1_64,Brazilian,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJBRZ01"
-R4V41,W7Ult_SP1_64,Bulgarian,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJBUL01"
-FXFGF,W7Ult_SP1_64,Croatian,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJCRO01"
-K37ND,W7Ult_SP1_64,Czech,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJCZE01"
-P8MT9,W7Ult_SP1_64,Danish,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJDAN01"
-CK8GD,W7Ult_SP1_64,Dutch,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJDUT01"
-2RF06,W7Ult_SP1_64,English,DEL_WIM_W000047_XJENG01
-FRR9M,W7Ult_SP1_64,Finnish,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJFIN01"
-T9P9G,W7Ult_SP1_64,French,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJFRN01"
-CN3RH,W7Ult_SP1_64,German,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJGER01"
-30NKJ,W7Ult_SP1_64,Greek,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJGRE01"
-16NY1,W7Ult_SP1_64,Hebrew,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJHEB01"
-YYRGC,W7Ult_SP1_64,Hungarian,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJHUN01"
-WGH58,W7Ult_SP1_64,Portuguese,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJPOR01"
-1NPRF,W7Ult_SP1_64,Italian,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJITN01"
-WH2NH,W7Ult_SP1_64,Japanese,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJJPN01"
-3CW2F,W7Ult_SP1_64,Korean,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJKOR01"
-NXGJ6,W7Ult_SP1_64,Norwegian,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJNOR01"
-9CT6J,W7Ult_SP1_64,Polish,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJPOL01"
-4NMP7,W7Ult_SP1_64,Romanian,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJROM01"
-8MX0P,W7Ult_SP1_64,Russian,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJRUS01"
-T6PN5,W7Ult_SP1_64,Chinese_Simplified,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJCHS01"
-5TJ05,W7Ult_SP1_64,Slovak,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJSVK01"
-VF9KH,W7Ult_SP1_64,Slovenian,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJSLO01"
-GKDWD,W7Ult_SP1_64,Spanish,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJSPA01"
-T37FT,W7Ult_SP1_64,Serbian (Latin Serbia),"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJSEL01"
-WCKK8,W7Ult_SP1_64,Swedish,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJSWE01"
-GX1J4,W7Ult_SP1_64,Chinese_Traditional,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJCHT01"
-KWCKW,W7Ult_SP1_64,Chinese_Traditional_HK,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJCHK01"
-4VXXX,W7Ult_SP1_64,Thai,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJTHA01"
-F0M5G,W7Ult_SP1_64,Turkish,"DEL_WIM_W000047_XJENG01,DEL_WLP_W000047_XJENG01,DEL_WLP_W000047_XJTRK01"
-W2KPP,VHB_SP2_32,Norwegian,"DEL_WIM_W000059_XDENG01,LP32BIT6000XMLv7,LPENG6002X86A1,LPNOR6002X86A1"

config.py

-# -*- coding: utf-8 -*-
-
-"All configuration objects."
-
-import os
-import logging
-import logging.handlers
-from ConfigParser import ConfigParser
-from time import sleep
-
-from wistron import ruleparser
-from wistron.sdrparser2 import SDR
-from wistron.oietables import AppTable, OsTable, WhiteList
-
-VERSION = '14.0'
-CONFIG_FILE = 'settings.ini'
-LOGDIR = 'LOGS'
-LOG = 'LOGS\\orderfilter.log'
-RLOG = 'LOGS\\report.log'
-RULEFILE = 'RULES.TXT'
-UNKNOWN = 'LOGS\\unknown.csv'
-BACKUP_DIR = 'OrderBackup'
-
-def get_logger():
-    "Normal log handler"
-    logger = logging.getLogger('filter')
-    logger.setLevel(logging.DEBUG)
-    formatter = logging.Formatter("%(asctime)s - %(message)s",
-                                  datefmt='%Y-%m-%d %H:%M:%S')
-    
-    ch1 = logging.StreamHandler()
-    ch1.setLevel(logging.INFO)
-    ch1.setFormatter(formatter)
-    
-    logpath = os.path.split(LOG)[0]
-    if not os.path.exists(logpath):
-        os.makedirs(logpath)
-        
-    ch2 = logging.FileHandler(LOG)
-    ch2.setLevel(logging.INFO)
-    ch2.setFormatter(formatter)
-    
-    logger.addHandler(ch1)
-    logger.addHandler(ch2)
-    return logger
-
-logger = get_logger()
-
-
-class MatchObj(object):
-    def __init__(self, name, message=""):
-        self.name = name
-        self.message = message
-
-class ReportConfig(object):
-    "Config object for reporting to webserver or email."
-    def __init__(self, cfgobj):
-        # Report fail if 'toweb' is set but can't connect to server.
-        self.toweb = cfgobj.getboolean('REPORT', 'toweb')
-        if self.toweb:
-            soapserver = cfgobj.get('REPORT', 'soapserver')
-            import suds
-            try:
-                self.soapclient = suds.client.Client(soapserver)
-            except Exception, e:
-                logger.error("Unable to connect to web server")
-                raise
-            
-        self.mailserver = cfgobj.get('REPORT', 'mailserver')
-        self.sender = cfgobj.get('REPORT', 'sender')
-        self.receiver = cfgobj.get('REPORT', 'receiver')
-        
-        self.dburi = cfgobj.get('REPORT', 'dburi')
-
-class ODMRule(object):
-    "Container class for storing a rule and comparing it with SDR"
-    def __init__(self, setting):
-        self.app_table = AppTable(setting.app_table)
-        self.os_table = OsTable(setting.os_table)
-        self.whitelist = WhiteList(setting.whitelist)
-        self.models = setting.models
-        self.name = setting.failpath
-        self.exclude = setting.exclude
-        self.exclude_pn = setting.exclude_pn
-        self.actions = []
-        
-    def match(self, order):
-        "Returns a match object if matched, else None."
-        if (order.model not in self.models or    # Not ODM model
-            order.ostype2 == 'UBX' or    # Ubuntu
-            order.ostype2 == 'NOS' or    # NOS/FreeDOS
-            (order.shipmode != '' and order.shipmode in self.exclude)):
-            return None
-        sdr = SDR(order.sdrlines)
-        
-        # compare with OS mapping table
-        if not self.os_table.matches(sdr):
-            e = "Unsupported OS type."
-            logger.info(e)
-            return MatchObj(self.name, e)
-        
-        # compare with app table
-        unknown = self.app_table.missed_srvs(sdr)
-        if not unknown:
-            return None
-
-        # compare with whitelist
-        unknown = self.whitelist.missed_srvs(unknown)
-
-        # Check for excluded SRV
-        for u in unknown.copy():
-            if u.pn in self.exclude_pn:
-                unknown.remove(u)
-
-        # Return match result, or None
-        if unknown:
-            e = "Unknown parts: %s" % ','.join([u.pn for u in unknown])
-            logger.info(e)
-            return MatchObj(self.name, e)
-        else:
-            return None
-
-
-class Config(object):
-    "Global configuration object. All configs will eventually be here."
-    def __init__(self, cfgfile):
-        self.cfgfile = cfgfile
-        self.rules = []
-        self.load()
-        
-    def init_dirs(self):
-        "Initiate required directories. Create them if not exist."
-        for path in self.srcdirs + [self.passdir, self.sdrdir, self.faildir]:
-            if not os.path.exists(path):
-                os.makedirs(path)
-            elif not os.path.isdir(path):
-                os.remove(path)
-                os.makedirs(path)
-                
-    def is_changed(self):
-        "Checks if the config files are changed."
-        cfg_mtime = os.path.getmtime(self.cfgfile)
-        rule_mtime = os.path.getmtime(self.rulefile)
-        if cfg_mtime != self.cfg_mtime or rule_mtime != self.rule_mtime:
-            self.cfg_mtime = cfg_mtime
-            self.rule_mtime = rule_mtime
-            return True
-        else:
-            return False
-        
-    def load(self):
-        "Load all configuartions. "
-        self.cfg = ConfigParser()
-        self.cfg.read(self.cfgfile)
-        self.srcdirs = [s.strip() for s in 
-                self.cfg.get('PATHS', 'input').split(',')]
-        self.passdir = self.cfg.get('PATHS', 'passed')
-        self.sdrdir = self.cfg.get('PATHS', 'passed_sdr')
-        self.faildir = self.cfg.get('PATHS', 'filtered')
-        self.datefmt = self.cfg.get('PATHS', 'datefmt')
-        if self.datefmt.upper() == 'NONE':
-            self.datefmt = None
-        self.rulefile = self.cfg.get('PATHS', 'rulefile')
-        self.cfg_mtime = os.path.getmtime(self.cfgfile)
-        self.rule_mtime = os.path.getmtime(self.rulefile)
-        self.report_cfg = ReportConfig(self.cfg)
-        while True:
-            try:
-                self.rules = self.get_rules()
-                break
-            except Exception, e:
-                print "Error in rule file"
-                while True:
-                    sleep(5)
-                    if self.is_changed():
-                        break
-
-    def odm_config(self):
-        "Enable or Disable status of the ODM check."
-        try:
-            check_odm = self.cfg.get('EXTENSIONS', 'odm_filter')
-        except Exception:
-            check_odm = ''
-        if check_odm.upper() != 'ENABLED':
-            return []
-        configs = []
-        class OIESetting:
-            pass
-        for sect in self.cfg.sections():
-            if sect.startswith('ODM_'):
-                rule = OIESetting()
-                rule.os_table = self.cfg.get(sect, 'os_table')
-                rule.app_table = self.cfg.get(sect, 'app_table')
-                rule.whitelist = self.cfg.get(sect, 'whitelist')
-                rule.models = set([m.strip() for m in
-                        self.cfg.get(sect, 'model').split(',')])
-                rule.exclude = set([m.strip() for m in 
-                        self.cfg.get(sect,'exclude_mod').split(',')])
-                rule.exclude_pn = set([m.strip() for m in 
-                        self.cfg.get(sect, 'exclude_pn').split(',')])
-                rule.failpath = sect
-                configs.append(rule)
-        return configs
-    
-    def get_rules(self):
-        "Read rules from all available places."
-        rules = []
-
-        # OIE rules
-        for cfg in self.odm_config():
-            try:
-                rules.append(ODMRule(cfg))
-            except Exception, e:
-                print "OIE Rule Error: %s" % e
-                raise
-
-        # custom rules
-        try:
-            custom_rules = ruleparser.loadrules(self.rulefile)
-        except Exception, e:
-            print "Custom Rule Error: %s" % e
-            raise
-        rules.extend(custom_rules)
-        
-        return rules
-
-
-cfg = Config(CONFIG_FILE)
-

db.py

-import datetime
-
-from sqlalchemy import ForeignKey, create_engine, Table, \
-     Column, Integer, String, DateTime, MetaData
-from sqlalchemy.orm import relationship, backref, sessionmaker
-from sqlalchemy.ext.declarative import declarative_base
-
-from config import cfg
-
-engine = create_engine(cfg.report_cfg.dburi)
-
-Base = declarative_base(bind=engine)
-
-class Rule(Base):
-    __tablename__ = 'rules'
-    id = Column(Integer, primary_key=True)
-    name = Column(String(32))
-    desc = Column(String(256))
-    action = Column(String(256))
-    attname = Column(String(256))
-
-    def __init__(self, name, desc, action="", attname=""):
-        self.name = name
-        self.desc = desc
-        self.action = action
-        self.attname = attname
-
-class Order(Base):
-    __tablename__ = 'orders'
-    po = Column(String(20), primary_key=True)
-    time = Column(DateTime)
-    rule_id= Column(Integer, ForeignKey('rules.id'))
-
-    rule = relationship(Rule, backref=backref('orders', order_by=time))
-
-    def __init__(self, po, rule_id):
-        self.po = po
-        self.time = datetime.datetime.now()
-        self.rule_id = rule_id
-
-Base.metadata.create_all(bind=engine)
-
-Session = sessionmaker(bind=engine)
-session = Session()

doc/src/faq_cn.rst

 #. 规则该如何命名?
 
    使用常识. 最好能从规则名直接看出问题所在, 一般最好包含机种和问题的简短描述.
+   注解也很重要,建议用注解写下规则添加日期和添加人。
 
 #. log文件存放在哪里?
    
-   安装目录下的LOGS文件夹.
+   orderfilter.log,根目录。
 
-#. 我需要怎样确定settings.ini配置的正确性?
+#. 我需要怎样确定配置的正确性?
    
-   通常settings.ini中只有少数内容需要更改. 修改完以后, 你可以找几个OK和NG的
+   通常中只有少数内容需要更改. 修改完以后, 你可以找几个OK和NG的
    order, 将其放入输入文件夹内, 运行orderfilter查看下面几条:
 
    * 过滤结果是否正确.
    * 查看是否有收到过滤fail的邮件.
-   * 从LOGS\report.log中看是否被正常发送给SFCS.
+   * 从orderfilter.log中看是否有异常.
    
    可以建立dummy的rule和xml文件专门做这样的验证. 
 
 #. 修改规则后是否需要重启orderfilter?
    
    不需要, 修改过会被实时自动重新加载, 不过错误的配置可能会导致运行失败, 修改并
-   保持配置后请确认主界面运行是否有异常.
+   保持配置后请确认主界面运行是否有异常. 另外 OIE table 修改后需要重啟。
 
 #. NG的order跑哪里去了?
    
-   安装目录下的OrderBackup文件夹下, 以规则名称命名的文件夹. 如果文件夹以
-   _MODIFIED结尾, 则是NG的且被修改过的XML存放目录.
+   安装目录下的OrderBackup文件夹下, 以规则名称命名的文件夹. 
 
 #. NG order要怎样处理?
    

doc/src/features_cn.rst

 
 目前支持的功能如下:
 
-* 依据定制的规则过滤和修改GCF XML文件.
-  你可以通过修改 ``rules.txt``, 在其中建立定制的规则, 从而实现对order的过滤,
+* 支持后缀为 XML(GCF), SDR, TXT 的文件. 过滤后按类型放到不同的文件夹.
+* 你可以通过修改 ``rules.txt``, 在其中建立定制的规则, 从而实现对order的过滤,
   并将过滤NG的order放到指定的位置. 
-* 依据白名单实现OIE order的过滤.
+* 依据白名单实现OIE order的过滤.
   OIE的order中的part会被分为3种: 已知需安装的(通过OS和APP Table可以知道), 已知不需安装的(白名单), 未知的. 如果发现未知的part, 系统会自动发送邮件预警. 
 * 过滤NG的结果可以通过邮件发送出来, 并且自动备份NG的order.
   邮件内容包含PO号码, 被哪个规则过滤下来的, 被过滤的GCF

doc/src/installation_cn.rst

 
 如果你收到的是.exe文件, 则无需安装.
 
-如果你收到的是源代码, 运行之前你需要确认你的Python版本为2.6或者2.7, 并且有安装下列模组:
+orderfilter可以直接从源代码包运行,无需安装。建议使用干净的虚拟环境作为运行
+环境。运行前你需要确认你的Python版本为2.6, 并且有安装下列模组:
 
-* wistron => 0.10.0
 * pyparsing => 1.5.x
 * suds => 0.4.x
 * Mako => 0.3.x
-* lxml => 2.2.x
+* lxml => 2.2.x [1]
 * sqlalchemy => 0.6.7
+* psyco => 1.6 [1]
+  
+[1] 需编译后安装。如果没有C编译器的话,可以下载预编译好的二进制包,通常为 .egg
+或者 .exe 格式。
 
-如果想让程序运行更快, 你可以安装下列模组:
+装好上述包以后,还需安装下列辅助包:
 
-* psyco => 1.6 (不支持Python 2.7)
+* wisutil => 0.1.0
+* wistron.order => 0.1.0
+* wistron.preload => 0.1.0
+* wistron.ruleparser => 0.1.0
 
-接下来你要做的就是配置settings.ini和rules.txt, 然后运行 ``orderparser.py``. 
+接下来做好配置, 然后运行 ``run.bat`` 即可. 配置请详见后文。 
+

doc/src/rules_cn.rst

 
 * **Order属性**: 通常比较有用的包括:
 
+  **重要**: OS和LANG目前只支持SDR中的描述格式,例如 ``W7HB64``, ``FR`` 等。
+  类似 ``W74``, ``FRN`` 的描述将不再直接支持,
+
   * ``MODEL``, 也就是机种的名称, 例如 ``VostroV130`` (DR13), ``E5510`` (DF3-15)等.
   * ``OS``, 操作系统的种类. 目前已知的操作系统种类有: ``W74``, ``W72``, ``V64``, ``V32``, ``XP2``, ``UBX``, ``NOS``
   * ``LANG``, 操作系统的语言, 为3个字母的简写, 例如 ``ENG``, ``FRN``, ``SPA``, ``CHS``, ``TUR`` 等.
 修改order
 ---------
 
+**注意: 修改 order 的功能目前在 orderfilter 中未启用。**
+
 Order的内容可以通过规则进行修改. 修改XML可以通过特殊的规则语法实现. 修改后的XML以及其中的SDR中的内容都会发生改变. 修改命令需要紧跟在规则定义的后面.
 
-**注意**: 目前此功能尚不完善, SDR中 ``BP`` 的部分不会被修改. 
+**注意**: 目前此功能尚不完善, SDR中 ``BP`` 的部分不会被修改. BTOA order
+回去解析这一段,因此不适用
 
 **添加PART**: 语法为 ``|+(NEW_PART, DESCRIPTION, [REF_PART])``
 

doc/src/settings_cn.rst

   [PATHS]
   input=TEST\INPUT          ; GCF XML的输入目录, 多个目录可用逗号隔开
   filtered=TEST\Filtered    ; NG XML的存放目录
-  passed=TEST\Passed        ; OK XML的存放目錄
+  passed_gcf=TEST\Passed    ; OK XML的存放目錄
   passed_sdr=TEST\SDR_pass  ; 如果文件为SDR而非XML,过滤OK就会跑到这里来
   datefmt=%Y%m%d            ; 在OK目录下建立以指定日期格式命名的子目录存放XML. 
                             ; 如果设置为None, 将不在OK目录下建立子目录.
   
   [REPORT]
   mailserver=wksmail.wistron.com
-  sender=filter@wistron.com
-  receiver=joel_wang@wistron.com
-  toweb=False               ; 可以为True或者False, 是否将结果传送至Web service
+  receivers=joel_wang@wistron.com
   soapserver=http://172.30.60.155/tester.webservice/WebService.asmx?WSDL
-  dburl=sqlite3:///test.db  ; NG order 将记录到此db, 目前只支持sqlite3.
+  ; soapserver 如果设为空,则不会连接 web service
 
   [EXTENSIONS]
-  filter_odm=enabled    ; 启用或者禁用OIE过滤机制, 可以为enabled或disabled.
+  oie_filter=OIE    ; 值为OIE配置文件夹,如果为空,则不调用OIE规则。
 
-  ; 以下为OIE过滤设置. 每个机种使用一个section. section的名称为ODM_MODEL. 过滤
-  ; NG的order会被放到section名称命名的文件夹内. 需要设置的内容有
-  ; OS Mapping Table, Application Table, White List, 以及该model的市场名称.
-  ; 如果包含多个名称, 则用逗号隔开.
-  ; exclude_mod 为无需检查的 shipmode,通常设置为 pilot 各个 shipmode
-  ; exclude_srv 类似白名单,用来临时忽略检查一些 srv,多个 srv 用逗号隔开。
+OIE的设置放在 OIE 文件夹下,文件名为 ``oie.ini``::
+  
+  ; 以下为OIE过滤设置. 每个机种使用一个section. 
 
-  [ODM_DJ1]
-  os_table=OIE_LISTS\OS Mapping table.csv
-  app_table=OIE_LISTS\Nov_Arsenal_Application_table.csv
-  whitelist=OIE_LISTS\whitelist_arsenal.csv
-  model=N4020, M4010, N4030
-  exclude_mod=CTB,PLB
-  exclude_srv=TX271
+  [NORAH]
+  model=N311z       ;多个名称用逗号隔开
+  exclude_mod=CTB,BTB,PLT,PLB,PLP   ;可忽略的出货模式,多个用逗号隔开
+  exclude_srv=M8192                 ;相当于临时白名单,多个用逗号隔开
+  
+  [JONES]
+  model=V131 
+  exclude_mod=CTB,BTB,PLT,PLB,PLP
+  exclude_srv=
 
-  [ODM_DG15]
-  os_table=OIE_LISTS\OS Mapping table.csv
-  app_table=OIE_LISTS\Nov_Berry_Application_table.csv
-  whitelist=OIE_LISTS\whitelist_berry.csv
-  model=N5010, M5010
-  exclude_mod=CTB,PLB
-  exclude_srv=TX271
+每个 section 在 OIE 文件夹下需要有一个以 section 名字命名的文件夹对应,其中
+包含 3 个文件,Application Table, OS Mapping Table, Whitelist,请注意文件名
+中必须包含 ``Application``, ``Mapping``, 或者 ``Whitelist``. 否则会提示找不
+到文件。另外也要确保文件夹中没有多个包含同一字串的文件。table 的格式必须为
+CSV 格式。
 
+过滤 NG 的 order 会被放到以 OIE_%section% 格式命名的文件夹中。 

operations.py

-# -*- coding: utf-8 -*-
-
-"""The operations for passed and failed xml files."""
-
-import os
-from datetime import date
-
-from wistron.fsutil import movefile
-
-from config import logger
-from db import Order, Rule, session
-from reporter import web_report
-
-def pass_process(cfg, order):
-    """OK XML file will be moved to path specified by cfg.
-    If cfg.datefmt is specified, the OK xml will be moved into a subdir named
-    by today.datefmt."""
-
-    # Prepare for destination directory.
-    if order.type == "GCF":
-        if cfg.datefmt:
-            passdir = os.path.join(cfg.passdir, 
-                                   date.today().strftime(cfg.datefmt))
-            if not os.path.exists(passdir):
-                os.mkdir(passdir)
-        else:
-            passdir = cfg.passdir
-    elif order.type == "SDR":
-        passdir = cfg.sdrdir
-    else:
-        logger.warning("Unknown order type, treated as SDR")
-        passdir = cfg.sdrdir
-    
-    # Move passed order to dest directory
-    try:
-        movefile(order.filepath, passdir)
-        logger.info("%s [OK]" % os.path.split(order.filepath)[1])
-    except EnvironmentError, e:
-        logger.warning("Failed to move %s to %s: %s" % 
-                       (order.filepath, passdir, e))
-        logger.warning(e)
-
-    if order.type == "GCF":
-    # Remove db item if exists.
-        session.query(Order).filter(Order.po==order.po).delete()
-        session.commit()
-        # Report to web service
-        if cfg.report_cfg.toweb:
-            web_report(cfg, order.obj, 'OK')
-
-
-def fail_process(cfg, order, match):
-    """Failed XML will be put into cfg.faildir, in a subdir named by rule_name.
-    order -> the path of the xml file."""
-    ordername = os.path.split(order.filepath)[1]
-    logger.warn("%s [NG] - %s" % (ordername, match.name))
-    
-    if not hasattr(order, 'po'):
-        fname = os.path.splitext(ordername)[0]
-        order.po = fname.rstrip('_GCF')
-
-    # Move into failed directory
-    rule_folder = os.path.join(cfg.faildir, match.name)
-    if not os.path.isdir(rule_folder):
-        os.mkdir(rule_folder)
-    try:
-        movefile(order.filepath, rule_folder)
-    except EnvironmentError, e:
-        logger.warning("Failed to move %s to %s" % 
-                       (order.filepath, match.name))
-        logger.warning(e)
-
-    if order.type == "GCF":
-        # Log into database
-        this_rule = session.query(Rule)\
-                .filter(Rule.name==match.name)\
-                .filter(Rule.desc==match.message).first()
-        if not this_rule:
-            this_rule = session.merge(Rule(match.name, match.message, None))
-            session.commit()
-        
-        session.merge(Order(order.po, this_rule.id))
-        session.commit()
-        
-        # Report to web service
-        if cfg.report_cfg.toweb:
-            web_report(cfg, order.obj, 'NG')
+@echo off
+
+
+title OrderFilter
+call D:\env\o2\Scripts\activate.bat
+python run.py

orderfilter.py

-# -*- coding: utf-8 -*-
-# Author:   Joel Wang <joel_wang@wistron.com>
-
-"""The main program. """
-
-import os
-import sys
-import glob
-from fnmatch import fnmatch
-from time import sleep
-
-from wistron.gcf import GCF, GCFError
-from wistron.sdrparser2 import SDR2, SDRError
-
-from config import cfg, VERSION, MatchObj
-from reporter import report_failed
-from operations import pass_process, fail_process
-
-
-def multiglob(paths, globs=[]):
-    "glob with multiple criterias. "
-    filepaths = []
-    for g in globs:
-        for path in paths:
-            filepaths.extend(glob.glob(os.path.join(path, g)))
-    return filepaths
-
-
-class Invalid:
-    """An adapter class or invalid XML files, used in fail_process()"""
-    def __init__(self, filepath):
-        self.filepath = filepath
-        if fnmatch(filepath, '*.xml'):
-            self.type = 'GCF'
-        elif fnmatch(filepath, '*.txt') or fnmatch(filepath, '*.sdr'):
-            self.type = 'SDR'
-        else:
-            self.type = ''
-
-
-class OrderError(Exception):
-    pass
-
-
-class Order(object):
-    "Adapter for GCF and SDR"
-    def __init__(self, order):
-        if fnmatch(order, '*.xml'):
-            self.type = 'GCF'
-            self.filepath = order
-            try:
-                self.obj = GCF(order)
-            except GCFError, e:
-                raise OrderError(e)
-            self.po = self.obj.po
-        elif fnmatch(order, '*.sdr') or fnmatch(order, "*.txt"):
-            self.type = "SDR"
-            self.filepath = order
-            try:
-                self.obj = SDR2(order)
-            except SDRError, e:
-                raise OrderError(e)
-        else:
-            raise OrderError("Unknown order type")
-    def sdrlines(self):
-        if self.type == 'GCF':
-            return self.obj.sdrlines()
-        elif self.type == 'SDR':
-            return self.obj.sdrlines
-
-
-def main(cfg):
-    print "Order filter (version %s) started." % VERSION
-    globs = ['*.xml', '*.txt', '*.sdr']
-    cfg.init_dirs()
-    while True:
-
-        if cfg.is_changed():
-            cfg.load()
-            print "Rules loaded."
-
-        report_failed(cfg)
-
-        ordernames = multiglob(cfg.srcdirs, globs)
-
-        # Reduce loop intensity and lower CPU usage.
-        sleep(3)
-
-        for orderpath in ordernames:
-            try:
-                order = Order(orderpath)
-            except OrderError, e:
-                fail_process(cfg, Invalid(orderpath), MatchObj('invalid'))
-                continue
-
-            match = None
-            for rule in cfg.rules:
-                try:
-                    match = rule.match(order.obj)
-                except SDRError, e:
-                    fail_process(cfg, Invalid(orderpath), MatchObj('invalid'))
-                    break
-
-                if match:
-                    fail_process(cfg, order, match)
-                    break
-            
-            if not match:
-                pass_process(cfg, order)
-            
-if __name__ == '__main__':
-    try:
-        import psyco
-        psyco.full()
-    except ImportError:
-        print 'Psyco not installed, the program will just run slower'    
-    sys.exit(main(cfg))
+Set WshShell = WScript.CreateObject("WScript.Shell")
+Do
+	WshShell.Run "orderfilter.bat", 1, TRUE
+Loop

orderfilter/__init__.py

+from constants import CONFIG_FILE
+from config import Config
+from orderfilter import main

orderfilter/config.py

+import os
+from time import sleep
+from ConfigParser import ConfigParser
+
+from wistron.ruleparser import loadrules
+
+from oierule import OieRule
+from logger import logger
+
+
+class ConfigError(Exception):
+    pass
+
+
+class Config(object):
+    def __init__(self, ini):
+        self.ini = ini
+        self.mtime = os.path.getmtime(self.ini)
+        self.rulefile = os.path.join(os.path.split(ini)[0], 'rules.txt')
+        self.rulemtime = os.path.getmtime(self.rulefile)
+        self.rules = []
+        self.oieconfig = None
+        self.load()
+
+    def is_changed(self):
+        mtime = os.path.getmtime(self.ini)
+        rulemtime = os.path.getmtime(self.rulefile)
+        if mtime != self.mtime or rulemtime != self.rulemtime:
+            self.mtime = mtime
+            self.rulemtime = rulemtime
+            return True
+        else:
+            if self.oieconfig and self.oiecfg.is_changed():
+                return True
+            else:
+                return False
+
+    def load(self):
+        self.cfg = ConfigParser()
+        self.cfg.read(self.ini)
+        
+        pathcfg = dict(self.cfg.items('PATHS'))
+        self.srcdirs = [s.strip() for s in pathcfg['input'].split(',')]
+        self.gcf_pass = pathcfg['passed_gcf']
+        self.sdr_pass = pathcfg['passed_sdr']
+        self.faildir = pathcfg['filtered']
+        self.datefmt = pathcfg['datefmt']
+        if self.datefmt.upper() == 'NONE':
+            self.datefmt = None
+        self.rulefile = pathcfg['rulefile']
+        
+        rcfg = dict(self.cfg.items('REPORT'))
+        self.report_cfg = ReportConfig(rcfg)
+        
+        oie = self.cfg.get('EXTENSIONS', 'oie_filter')
+        if oie:
+            self.oiecfg = OieConfig(oie)
+        else:
+            self.oiecfg = None
+        
+        while True:
+            try:
+                self.get_rules()
+                break
+            except Exception, e:
+                print "Error in rule file"
+                raise
+                while True:
+                    sleep(5)
+                    if self.is_changed():
+                        break
+
+    def get_rules(self):
+        "Read rules from all available places."
+        self.rules = []
+
+        # OIE rules
+        if self.oiecfg:
+            self.rules.extend(self.oiecfg.rules())
+
+        # custom rules
+        try:
+            custom_rules = loadrules(self.rulefile)
+        except Exception, e:
+            print "Custom Rule Error: %s" % e
+            raise
+        self.rules.extend(custom_rules)
+
+    def init_dirs(self):
+        dirs = [self.gcf_pass, self.sdr_pass, self.faildir]
+        dirs.extend(self.srcdirs)
+        for d in dirs:
+            if not os.path.exists(d):
+                os.makedirs(d)
+
+
+class ReportConfig(object):
+    "Config object for reporting to webserver or email."
+    def __init__(self, items):
+        # Report fail if 'toweb' is set but can't connect to server.
+        self.soapserver = items['soapserver']
+        if self.soapserver:
+            import suds
+            try:
+                self.soapclient = suds.client.Client(self.soapserver)
+            except Exception, e:
+                logger.error("Unable to connect to web server")
+                raise
+            
+        self.mailserver = items['mailserver']
+        self.receivers = items['receivers'].split(',')
+
+
+class OieConfig(object):
+    def __init__(self, rootdir):
+        self.rootdir = rootdir
+        self.ini = os.path.join(rootdir, 'oie.ini')
+        self.mtime = os.path.getmtime(self.ini)
+
+    def is_changed(self):
+        mtime = os.path.getmtime(self.ini)
+        if mtime != self.mtime:
+            self.mtime = mtime
+            return True
+        else:
+            return False
+
+    def rules(self):
+        rules = []
+        if not os.path.exists(self.ini):
+            raise ConfigError("%s not found." % self.ini)
+        self.cfg = ConfigParser()
+        self.cfg.read(self.ini)
+        for sect in self.cfg.sections():
+            subdir = os.path.join(self.rootdir, sect)
+            items = dict(self.cfg.items(sect))
+            rules.append(OieRule(subdir, items))
+        return rules
+

orderfilter/constants.py

+VERSION = '0.15.0'
+
+CONFIG_FILE = 'settings.ini'
+
+LOG = 'orderfilter.log'
+
+RULEFILE = 'RULES.TXT'
+
+BACKUP_DIR = 'OrderBackup'
+
+RESULT_DB = 'sqlite:///filter_result.db'
+
+MAIL_SENDER = 'filter@wistron.com'
+
+GLOBS = ['*.xml', '*.txt', '*.sdr']

orderfilter/db.py

+import datetime
+
+from sqlalchemy import ForeignKey, create_engine, \
+     Column, Integer, String, DateTime
+from sqlalchemy.orm import relationship, backref, sessionmaker
+from sqlalchemy.ext.declarative import declarative_base
+
+from constants import RESULT_DB
+
+Base = declarative_base()
+
+class Rule(Base):
+    __tablename__ = 'rules'
+    id = Column(Integer, primary_key=True)
+    name = Column(String(32))
+    desc = Column(String(256))
+    action = Column(String(256))
+    attname = Column(String(256))
+
+    def __init__(self, name, desc, action="", attname=""):
+        self.name = name
+        self.desc = desc
+        self.action = action
+        self.attname = attname
+
+class Order(Base):
+    __tablename__ = 'orders'
+    po = Column(String(20), primary_key=True)
+    time = Column(DateTime)
+    rule_id = Column(Integer, ForeignKey('rules.id'))
+
+    rule = relationship(Rule, backref=backref('orders', order_by=time))
+
+    def __init__(self, po, rule_id):
+        self.po = po
+        self.time = datetime.datetime.now()
+        self.rule_id = rule_id
+
+
+engine = create_engine(RESULT_DB)
+
+Session = sessionmaker()
+Session.configure(bind=engine)
+
+Base.metadata.create_all(bind=engine)
+
+session = Session()

orderfilter/helpers.py

+from fnmatch import fnmatch
+
+class InvalidOrder:
+    """An adapter class or invalid XML files, used in fail_process()"""
+    def __init__(self, filepath):
+        self.filepath = filepath
+        if fnmatch(filepath, '*.xml'):
+            self.po = os.path.split(filepath)[1].split('_')[0]
+
+
+class MatchObj(object):
+    def __init__(self, name, message=""):
+        self.name = name
+        self.message = message
+

orderfilter/logger.py

+import os
+import logging
+import logging.handlers
+
+from constants import LOG
+
+def get_logger():
+    "Normal log handler"
+    logger = logging.getLogger('filter')
+    logger.setLevel(logging.DEBUG)
+    formatter = logging.Formatter("%(asctime)s - %(message)s",
+                                  datefmt='%Y-%m-%d %H:%M:%S')
+    
+    ch1 = logging.StreamHandler()
+    ch1.setLevel(logging.INFO)
+    ch1.setFormatter(formatter)
+    
+    ch2 = logging.FileHandler(LOG)
+    ch2.setLevel(logging.INFO)
+    ch2.setFormatter(formatter)
+    
+    logger.addHandler(ch1)
+    logger.addHandler(ch2)
+    return logger
+
+logger = get_logger()
+

orderfilter/oierule.py

+import os
+from glob import glob
+
+from wistron.preload import AppTable, OsTable, WhiteList
+from wistron.order import special_os
+
+from helpers import MatchObj
+from logger import logger
+
+class OieConfigError(Exception):
+    pass
+
+
+class OieRule(object):
+    def __init__(self, subdir, items):
+        self.name = 'OIE_' + os.path.split(subdir)[1]
+        self.models = set([m.strip() for m in items['model'].split(',')
+                           if m.strip()])
+        self.exclude_ctomod = set([m.strip() 
+                                    for m in items['exclude_mod'].split(',')
+                                    if m.strip()])
+        self.exclude_srv = set([m.strip() 
+                                    for m in items['exclude_srv'].split(',')
+                                    if m.strip()])
+        self.app_table = AppTable(self._find(subdir, "*Application*.csv"))
+        self.os_table = OsTable(self._find(subdir, "*mapping*.csv"))
+        self.whitelist = WhiteList(self._find(subdir, "*whitelist*.csv"))
+
+    def _find(self, subdir, wild):
+        candidates = glob(os.path.join(subdir, wild))
+        if len(candidates) == 0:
+            raise OieConfigError("%s not exist in %s" % (wild, subdir))
+        elif len(candidates) > 1:
+            raise OieConfigError("More than one %s exist in %s" 
+                                 % (wild, subdir))
+        else:
+            return candidates[0]
+
+    def match(self, sdr):
+        if (sdr.model not in self.models or         # Not OIE model
+            sdr.ostype_desc in special_os or      # Ubuntu or FreeDOS
+            sdr.shipmode in self.exclude_ctomod): # Shipmode not matched
+            return None
+
+        # Compare with OS mapping table
+        if not self.os_table.matches(sdr):
+            e = "Unsupported OS Type."
+            logger.warn(e)
+            return MatchObj(self.name, e)
+
+        # compare with app table
+        unknown = self.app_table.missed_srvs(sdr)
+        if not unknown:
+            return None
+
+        # compare with whitelist
+        unknown = self.whitelist.missed_srvs(unknown)
+
+        # Check for excluded SRV
+        for u in unknown.copy():
+            if u.pn in self.exclude_srv:
+                unknown.remove(u)
+
+        # Return match result, or None
+        if unknown:
+            e = "Unknown parts: %s" % ','.join([u.pn for u in unknown])
+            logger.warn(e)
+            return MatchObj(self.name, e)
+        else:
+            return None

orderfilter/operations.py

+# -*- coding: utf-8 -*-
+
+"""The operations for passed and failed xml files."""
+
+import os
+from datetime import date
+
+from wisutil.fs import movefile
+
+from config import logger
+from db import Order, Rule, session
+from reporter import web_report
+
+def pass_process(cfg, order):
+    """OK XML file will be moved to path specified by cfg.
+    If cfg.datefmt is specified, the OK xml will be moved into a subdir named
+    by today.datefmt."""
+
+    # Prepare for destination directory.
+    if order.po:
+        if cfg.datefmt:
+            passdir = os.path.join(cfg.gcf_pass, 
+                                   date.today().strftime(cfg.datefmt))
+            if not os.path.exists(passdir):
+                os.mkdir(passdir)
+        else:
+            passdir = cfg.gcf_pass
+    else:
+        passdir = cfg.sdr_pass
+    
+    # Move passed order to dest directory
+    try:
+        movefile(order.filepath, passdir)
+        logger.info("%s [OK]" % os.path.split(order.filepath)[1])
+    except EnvironmentError, e:
+        logger.warning("Failed to move %s to %s: %s" % 
+                       (order.filepath, passdir, e))
+        logger.warning(e)
+
+    if order.po:
+    # Remove db item if exists.
+        session.query(Order).filter(Order.po==order.po).delete()
+        session.commit()
+        # Report to web service
+        if cfg.report_cfg.soapserver:
+            web_report(cfg, order, 'OK')
+
+
+def fail_process(cfg, order, match):
+    """Failed XML will be put into cfg.faildir, in a subdir named by rule_name.
+    order -> the path of the xml file."""
+    ordername = os.path.split(order.filepath)[1]
+    msg = "%s [NG] - %s" % (ordername, match.name)
+    logger.warn(msg)
+    
+    # order parsing failed, get po from the file name
+    if not hasattr(order, 'po'):
+        fname = os.path.splitext(ordername)[0]
+        order.po = fname.rstrip('_GCF')
+
+    # Move into failed directory
+    rule_folder = os.path.join(cfg.faildir, match.name)
+    if not os.path.isdir(rule_folder):
+        os.mkdir(rule_folder)
+    try:
+        movefile(order.filepath, rule_folder)
+    except EnvironmentError, e:
+        logger.warning("Failed to move %s to %s" % 
+                       (order.filepath, match.name))
+        logger.warning(e)
+
+    if order.po:
+        # Log into database
+        this_rule = session.query(Rule)\
+                .filter(Rule.name==match.name)\
+                .filter(Rule.desc==match.message).first()
+        if not this_rule:
+            this_rule = session.merge(Rule(match.name, match.message, None))
+            session.commit()
+        
+        session.merge(Order(order.po, this_rule.id))
+        session.commit()
+        
+        # Report to web service
+        if cfg.report_cfg.soapserver:
+            web_report(cfg, order, 'NG')

orderfilter/orderfilter.py

+# -*- coding: utf-8 -*-
+# Author:   Joel Wang <joel_wang@wistron.com>
+
+"""The main program. """
+
+import os
+import sys
+from time import sleep
+
+from wistron.order import SDR, SDRError
+from wisutil.fs import multiglob
+
+from constants import GLOBS, CONFIG_FILE, VERSION
+from config import Config
+from reporter import report_failed
+from operations import pass_process, fail_process
+from helpers import InvalidOrder, MatchObj
+from logger import logger
+
+def main(cfg):
+    logger.info("Order filter (version %s) started." % VERSION)
+    
+    while True:
+
+        if cfg.is_changed():
+            cfg.load()
+            logger.info("Rules loaded.")
+
+        report_failed(cfg)
+
+        ordernames = multiglob(cfg.srcdirs, GLOBS)
+
+        # Reduce loop intensity and lower CPU usage.
+        sleep(1)
+
+        for orderpath in ordernames:
+            try:
+                order = SDR(orderpath)
+            except SDRError, e:
+                fail_process(cfg, Invalid(orderpath), MatchObj('invalid'))
+                continue
+
+            match = None
+            for rule in cfg.rules:
+                try:
+                    match = rule.match(order)
+                except SDRError, e:
+                    fail_process(cfg, Invalid(orderpath), MatchObj('invalid'))
+                    break
+
+                if match:
+                    fail_process(cfg, order, match)
+                    break
+            
+            if not match:
+                pass_process(cfg, order)
+            
+if __name__ == '__main__':
+    try:
+        import psyco
+        psyco.full()
+    except ImportError:
+        print 'Psyco not installed, the program will just run slower'
+
+    cfg = Config(CONFIG_FILE)
+    cfg.init_dirs()
+    sys.exit(main(cfg))

orderfilter/reporter.py

+# -*- coding: utf-8 -*-
+
+"The reporter module. A set of utilities for sending mail and web calls."
+
+import os
+import tempfile
+import sqlite3
+
+from time import sleep
+from collections import defaultdict
+from fnmatch import fnmatch
+from zipfile import ZipFile
+
+from mako.template import Template
+
+from wisutil.fs import moveall
+from wisutil.mail import makemail, sendmail
+
+from logger import logger
+from constants import BACKUP_DIR, MAIL_SENDER
+from db import Order, Rule, session
+
+rule_template = Template("""\
+<html><body>
+    <p>The following PO have been filtered:</p>
+    <table border="1">
+    <th>Rule</th><th>PO</th>
+    % for rule, polist in failed.iteritems():
+        % for po in polist:
+            <tr><td>${rule}</td><td>${po}</td></tr>
+        % endfor
+    % endfor
+    </table>
+    <p>Please check the attachment for filtered XML files.</p>
+</body></html>
+""")
+
+
+weberror_template = Template("""\
+<html><body>
+    <p>Error while updating PO to web service:</p>
+    <code>${error}</code>
+</body></html>
+""")
+
+
+def get_failed(cfg):
+    """Returns a dictionary of POs of failed orders. keys will be failure
+    categories, values will be the PO numbers"""
+    d = defaultdict(list)
+    if len(os.listdir(cfg.faildir)) == 0: return d
+    for root, paths, files in os.walk(cfg.faildir):
+        for f in files:
+            if fnmatch(f, '*.xml'):
+                po = f.split('_')[0]
+                rulename = os.path.split(root)[1]
+                d[rulename].append(po)
+    return d
+
+
+def web_report(cfg, order, result='OK'):
+    "Report to the soap server. result can be 'OK' or 'NG'."
+    rcfg = cfg.report_cfg
+    
+    StageCode = 'TV'
+    PO = order.po
+    TieGroup = order.tiegroup
+    ImageID = order.ostype_desc + '_' + order.oslang_desc
+    SDRCheckSum = order.md5sum()
+    UploadType = result
+    counter = 0
+    
+    while True:
+        counter += 1
+        try:
+            ret = rcfg.soapclient.service.UploadCertifyPO(
+                StageCode, PO, TieGroup, ImageID, SDRCheckSum, UploadType)
+            if ret != 'OK':
+                logger.error("Soap server returned error:")
+                logger.error(ret)
+            else:
+                logger.debug("%s: %s,%s,%s,%s" %
+                             (result, PO, TieGroup, ImageID, SDRCheckSum))
+            break
+        except Exception, e:
+            logger.error(e)
+            if counter >= 3:
+                subject = "Upload PO to web service Fail!"
+                err = weberror_template.render(error=e)
+                msg = makemail(MAIL_SENDER,
+                               subject,
+                               rcfg.receivers,
+                               err)
+                sendmail(rcfg.mailserver,
+                         MAIL_SENDER,
+                         rcfg.receivers,
+                         msg)
+                break
+        sleep(3)
+
+
+def report_failed(cfg):
+    "Report failed XMLs by email."
+    rcfg = cfg.report_cfg
+    failed = get_failed(cfg)
+    if not failed: return
+
+    # Generating mail content
+    subject = 'Filtered XMLs Waiting for Action'
+    message = rule_template.render(failed=failed)
+    zf = tempfile.TemporaryFile(suffix='.zip')
+    z = ZipFile(zf, 'w', compression=8)
+    for root, dirs, files in os.walk(cfg.faildir):
+        for f in files:
+            fdir = os.path.join(root, f)
+            z.write(fdir, fdir.replace(cfg.faildir, '', 1))
+    z.close()
+    zf.seek(0)
+    msg = makemail(MAIL_SENDER,
+                   subject,
+                   rcfg.receivers,
+                   message,
+                   attachment=zf, attas='PO_GCF.zip')
+    
+    sendmail(rcfg.mailserver,
+             MAIL_SENDER,
+             rcfg.receivers,
+             msg)
+    
+    try:
+        moveall(cfg.faildir, BACKUP_DIR)
+    except EnvironmentError, e:
+        logger.warning("Failed to move failed xml into backup folder:")
+        logger.warning(e)
+

reporter.py

-# -*- coding: utf-8 -*-
-
-"The reporter module. A set of utilities for sending mail and web calls."
-
-import os
-import tempfile
-import sqlite3
-
-from collections import defaultdict
-from fnmatch import fnmatch
-from zipfile import ZipFile
-
-from mako.template import Template
-
-from wistron.fsutil import moveall
-from wistron.util import makemail, sendmail
-
-from config import logger, BACKUP_DIR
-from db import Order, Rule, session
-
-rule_template = Template("""\
-<html><body>
-    <p>The following PO have been filtered:</p>
-    <table border="1">
-    <th>Rule</th><th>PO</th>
-    % for rule, polist in failed.iteritems():
-        % for po in polist:
-            <tr><td>${rule}</td><td>${po}</td></tr>
-        % endfor
-    % endfor
-    </table>
-    <p>Please check the attachment for filtered XML files.</p>
-</body></html>
-""")
-
-
-weberror_template = Template("""\
-<html><body>
-    <p>Error while updating PO to web service:</p>
-    <code>${error}</code>
-</body></html>
-""")
-
-
-def get_failed(cfg):
-    """Returns a dictionary of POs of failed orders. keys will be failure
-    categories, values will be the PO numbers"""
-    d = defaultdict(list)
-    if len(os.listdir(cfg.faildir)) == 0: return d
-    for root, paths, files in os.walk(cfg.faildir):
-        for f in files:
-            if fnmatch(f, '*.xml'):
-                po = f.split('_')[0]
-                rulename = os.path.split(root)[1]
-                d[rulename].append(po)
-    return d
-
-
-def web_report(cfg, order, result='OK'):
-    "Report to the soap server. result can be 'OK' or 'NG'."
-    StageCode = 'TV'
-    PO = order.po
-    TieGroup = order.tiegroup
-    ImageID = order.ostype + order.oslang
-    SDRCheckSum = order.md5sum
-    UploadType = result
-    counter = 0
-    
-    while True:
-        counter += 1
-        try:
-            ret = soapclient.service.UploadCertifyPO(
-                StageCode, PO, TieGroup, ImageID, SDRCheckSum, UploadType)
-        except Exception, e:
-            logger.error(e)
-            if counter >= 3:
-                subject = "Upload PO to web service Fail!"
-                err = weberror_template.render(error=e)
-                msg = makemail(cfg.report_cfg.sender,
-                               subject,
-                               cfg.report_cfg.receiver,
-                               err)
-                sendmail(cfg.report_cfg.mailserver,
-                         cfg.report_cfg.sender,
-                         cfg.report_cfg.receiver,
-                         msg)
-                break
-        finally:
-            if ret != 'OK':
-                logger.error("Soap server returned error:")
-                logger.error(ret)
-            else:
-                logger.info("%s: %s,%s,%s,%s" %
-                             (result, PO, TieGroup, ImageID, SDRCheckSum))
-            break
-        sleep(15)
-
-
-def report_failed(cfg):
-    "Report failed XMLs by email."
-    failed = get_failed(cfg)
-    if not failed: return
-
-    # Generating mail content
-    subject = 'Filtered XMLs Waiting for Action'
-    message = rule_template.render(failed=failed)
-    zf = tempfile.TemporaryFile(suffix='.zip')
-    z = ZipFile(zf, 'w', compression=8)
-    for root, dirs, files in os.walk(cfg.faildir):
-        for f in files:
-            fdir = os.path.join(root, f)
-            z.write(fdir, fdir.replace(cfg.faildir, '', 1))
-    z.close()
-    zf.seek(0)
-    msg = makemail(cfg.report_cfg.sender,
-                   subject,
-                   cfg.report_cfg.receiver,
-                   message,
-                   attachment=zf, attas='PO_GCF.zip')
-    
-    sendmail(cfg.report_cfg.mailserver,
-             cfg.report_cfg.sender,
-             cfg.report_cfg.receiver,
-             msg)
-    
-    try:
-        moveall(cfg.faildir, BACKUP_DIR)
-    except EnvironmentError, e:
-        logger.warning("Failed to move failed xml into backup folder:")
-        logger.warning(e)
-
 # ================== Model Definitions ====================
+W72 = ['W7S32', 'W7S32SP1']
+W74 = ['W7HB64', 'W7HP64', 'W7B64', 'W7P64', 'W7U64', 'W7HB64SP1', 'W7HP64SP1', 'W7B64SP1', 'W7P64SP1', 'W7U64SP1']
+UBX = ['UL9.10', 'LNX10.04', 'UBUNTU10.10', 'UBUNTU11.04', 'UBUNTU11.10']
+NOS = ['FREEDOS']
+
 DR1 = '1545'
 DR1A = '1546'
 DR2 = '1750'
 DN13 = '3350'
 DN15 = ['3550', '3555']
 DQ15 = ['N5110','M5110']