PO file generation by comparing IDT files added

This commit is contained in:
Simon Rozman 2016-09-13 21:17:33 +02:00
parent d80b9f29e7
commit 43c963a508
3 changed files with 555 additions and 151 deletions

293
IDT.js Normal file
View File

@ -0,0 +1,293 @@
/*
Copyright 1991-2015 Amebis
This file is part of MSIBuild.
MSIBuild is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
MSIBuild is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with MSIBuild. If not, see <http://www.gnu.org/licenses/>.
*/
/*@cc_on @*/
/*@if (! @__IDT_JS__) @*/
/*@set @__IDT_JS__ = true @*/
function CodePageToId(codepage)
{
switch (codepage) {
case 932 : return "shift-jis";
case 936 : return "gb2312";
case 949 : return "euc-kr";
case 950 : return "big5";
case 874 :
case 1250:
case 1251:
case 1252:
case 1253:
case 1254:
case 1255:
case 1256:
case 1257:
case 1258: return "windows-" + codepage;
}
}
function IDT(path)
{
// Open IDT file.
var
dat = new ActiveXObject("ADODB.Stream");
dat.Open();
try {
// IDT is text file, uses CRLF line breaks and Windows 1252 header.
dat.Type = adTypeText;
dat.LineSeparator = adCRLF;
dat.Charset = "windows-1252";
// Load file.
dat.LoadFromFile(path);
// Parse column names.
this.columns = dat.ReadText(adReadLine).split("\t");
// Parse column types.
this.types = dat.ReadText(adReadLine).split("\t");
// Parse meta info
var line = dat.ReadText(adReadLine).split("\t"), i = 0;
this.codepage = parseInt(line[i], 10);
if (isNaN(this.codepage)) this.codepage = 1252; else i++;
this.table = line[i++];
this.key = line.slice(i);
for (var i in this.key) {
for (var j in this.columns) {
if (this.key[i] == this.columns[j]) {
this.key[i] = j;
break;
}
}
}
// Rewind and reconfigure code page.
dat.Position = 0;
dat.Charset = CodePageToId(this.codepage);
// Skip header.
dat.ReadText(adReadLine);
dat.ReadText(adReadLine);
dat.ReadText(adReadLine);
// Parse data and build associative array.
this.data = new Array();
while (!dat.EOS) {
line = dat.ReadText(adReadLine).split("\t");
var key = new Array();
for (var i in this.key)
key.push(line[this.key[i]]);
this.data[key] = line;
}
} finally {
dat.Close();
}
}
/*@end @*/
// SIG // Begin signature block
// SIG // MIIXmAYJKoZIhvcNAQcCoIIXiTCCF4UCAQExCzAJBgUr
// SIG // DgMCGgUAMGcGCisGAQQBgjcCAQSgWTBXMDIGCisGAQQB
// SIG // gjcCAR4wJAIBAQQQEODJBs441BGiowAQS9NQkAIBAAIB
// SIG // AAIBAAIBAAIBADAhMAkGBSsOAwIaBQAEFFXDaT+CYy7L
// SIG // VxwKY0RTIDJ0FrkuoIISyDCCA+4wggNXoAMCAQICEH6T
// SIG // 6/t8xk5Z6kuad9QG/DswDQYJKoZIhvcNAQEFBQAwgYsx
// SIG // CzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENh
// SIG // cGUxFDASBgNVBAcTC0R1cmJhbnZpbGxlMQ8wDQYDVQQK
// SIG // EwZUaGF3dGUxHTAbBgNVBAsTFFRoYXd0ZSBDZXJ0aWZp
// SIG // Y2F0aW9uMR8wHQYDVQQDExZUaGF3dGUgVGltZXN0YW1w
// SIG // aW5nIENBMB4XDTEyMTIyMTAwMDAwMFoXDTIwMTIzMDIz
// SIG // NTk1OVowXjELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5
// SIG // bWFudGVjIENvcnBvcmF0aW9uMTAwLgYDVQQDEydTeW1h
// SIG // bnRlYyBUaW1lIFN0YW1waW5nIFNlcnZpY2VzIENBIC0g
// SIG // RzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
// SIG // AQCxrLNJVEuXHBIK2CV5kSJXKm/cuCbEQ3Nrwr8uUFr7
// SIG // FMJ2jkMBJUO0oeJF9Oi3e8N0zCLXtJQAAvdN7b+0t0Qk
// SIG // a81fRTvRRM5DEnMXgotptCvLmR6schsmTXEfsTHd+1Fh
// SIG // AlOmqvVJLAV4RaUvic7nmef+jOJXPz3GktxK+Hsz5HkK
// SIG // +/B1iEGc/8UDUZmq12yfk2mHZSmDhcJgFMTIyTsU2sCB
// SIG // 8B8NdN6SIqvK9/t0fCfm90obf6fDni2uiuqm5qonFn1h
// SIG // 95hxEbziUKFL5V365Q6nLJ+qZSDT2JboyHylTkhE/xni
// SIG // RAeSC9dohIBdanhkRc1gRn5UwRN8xXnxycFxAgMBAAGj
// SIG // gfowgfcwHQYDVR0OBBYEFF+a9W5czMx0mtTdfe8/2+xM
// SIG // gC7dMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcwAYYW
// SIG // aHR0cDovL29jc3AudGhhd3RlLmNvbTASBgNVHRMBAf8E
// SIG // CDAGAQH/AgEAMD8GA1UdHwQ4MDYwNKAyoDCGLmh0dHA6
// SIG // Ly9jcmwudGhhd3RlLmNvbS9UaGF3dGVUaW1lc3RhbXBp
// SIG // bmdDQS5jcmwwEwYDVR0lBAwwCgYIKwYBBQUHAwgwDgYD
// SIG // VR0PAQH/BAQDAgEGMCgGA1UdEQQhMB+kHTAbMRkwFwYD
// SIG // VQQDExBUaW1lU3RhbXAtMjA0OC0xMA0GCSqGSIb3DQEB
// SIG // BQUAA4GBAAMJm495739ZMKrvaLX64wkdu0+CBl03X6ZS
// SIG // nxaN6hySCURu9W3rWHww6PlpjSNzCxJvR6muORH4KrGb
// SIG // sBrDjutZlgCtzgxNstAxpghcKnr84nodV0yoZRjpeUBi
// SIG // JZZux8c3aoMhCI5B6t3ZVz8dd0mHKhYGXqY4aiISo1EZ
// SIG // g362MIIEozCCA4ugAwIBAgIQDs/0OMj+vzVuBNhqmBsa
// SIG // UDANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQGEwJVUzEd
// SIG // MBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xMDAu
// SIG // BgNVBAMTJ1N5bWFudGVjIFRpbWUgU3RhbXBpbmcgU2Vy
// SIG // dmljZXMgQ0EgLSBHMjAeFw0xMjEwMTgwMDAwMDBaFw0y
// SIG // MDEyMjkyMzU5NTlaMGIxCzAJBgNVBAYTAlVTMR0wGwYD
// SIG // VQQKExRTeW1hbnRlYyBDb3Jwb3JhdGlvbjE0MDIGA1UE
// SIG // AxMrU3ltYW50ZWMgVGltZSBTdGFtcGluZyBTZXJ2aWNl
// SIG // cyBTaWduZXIgLSBHNDCCASIwDQYJKoZIhvcNAQEBBQAD
// SIG // ggEPADCCAQoCggEBAKJjCzlEuLsjp0RJuw7/ofBhClOT
// SIG // sJjbrSwPSsVu/4Y8U1UPFc4EPyv9qZaW2b5heQtbyUyG
// SIG // duXgQ0sile7CK0PBn9hotI5AT+6FOLkRxSPyZFjwFTJv
// SIG // TlehroikAtcqHs1L4d1j1ReJMluwXplaqJ0oUA4X7pbb
// SIG // YTtFUR3PElYLkkf8q672Zj1HrHBy55LnX80QucSDZJQZ
// SIG // vSWA4ejSIqXQugJ6oXeTW2XD7hd0vEGGKtwITIySjJEt
// SIG // nndEH2jWqHR32w5bMotWizO92WPISZ06xcXqMwvS8aMb
// SIG // 9Iu+2bNXizveBKd6IrIkri7HcMW+ToMmCPsLvalPmQjh
// SIG // EChyqs0CAwEAAaOCAVcwggFTMAwGA1UdEwEB/wQCMAAw
// SIG // FgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwDgYDVR0PAQH/
// SIG // BAQDAgeAMHMGCCsGAQUFBwEBBGcwZTAqBggrBgEFBQcw
// SIG // AYYeaHR0cDovL3RzLW9jc3Aud3Muc3ltYW50ZWMuY29t
// SIG // MDcGCCsGAQUFBzAChitodHRwOi8vdHMtYWlhLndzLnN5
// SIG // bWFudGVjLmNvbS90c3MtY2EtZzIuY2VyMDwGA1UdHwQ1
// SIG // MDMwMaAvoC2GK2h0dHA6Ly90cy1jcmwud3Muc3ltYW50
// SIG // ZWMuY29tL3Rzcy1jYS1nMi5jcmwwKAYDVR0RBCEwH6Qd
// SIG // MBsxGTAXBgNVBAMTEFRpbWVTdGFtcC0yMDQ4LTIwHQYD
// SIG // VR0OBBYEFEbGaaMOShQe1UzaUmMXP142vA3mMB8GA1Ud
// SIG // IwQYMBaAFF+a9W5czMx0mtTdfe8/2+xMgC7dMA0GCSqG
// SIG // SIb3DQEBBQUAA4IBAQB4O7SRKgBM8I9iMDd4o4QnB28Y
// SIG // st4l3KDUlAOqhk4ln5pAAxzdzuN5yyFoBtq2MrRtv/Qs
// SIG // JmMz5ElkbQ3mw2cO9wWkNWx8iRbG6bLfsundIMZxD82V
// SIG // dNy2XN69Nx9DeOZ4tc0oBCCjqvFLxIgpkQ6A0RH83Vx2
// SIG // bk9eDkVGQW4NsOo4mrE62glxEPwcebSAe6xp9P2ctgwW
// SIG // K/F/Wwk9m1viFsoTgW0ALjgNqCmPLOGy9FqpAa8VnCwv
// SIG // SRvbIrvD/niUUcOGsYKIXfA9tFGheTMrLnu53CAJE3Hr
// SIG // ahlbz+ilMFcsiUk/uc9/yb8+ImhjU5q9aXSsxR08f5Lg
// SIG // w7wc2AR1MIIEzjCCA7agAwIBAgIQMHo2eqo+aIGm+U8I
// SIG // yzs5ZDANBgkqhkiG9w0BAQsFADB/MQswCQYDVQQGEwJV
// SIG // UzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24x
// SIG // HzAdBgNVBAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsx
// SIG // MDAuBgNVBAMTJ1N5bWFudGVjIENsYXNzIDMgU0hBMjU2
// SIG // IENvZGUgU2lnbmluZyBDQTAeFw0xNTEwMDkwMDAwMDBa
// SIG // Fw0xODExMDcyMzU5NTlaMGExCzAJBgNVBAYTAlNJMREw
// SIG // DwYDVQQIEwhTbG92ZW5pYTEPMA0GA1UEBxMGS2Ftbmlr
// SIG // MRYwFAYDVQQKFA1BbWViaXMgZC5vLm8uMRYwFAYDVQQD
// SIG // FA1BbWViaXMgZC5vLm8uMIIBIjANBgkqhkiG9w0BAQEF
// SIG // AAOCAQ8AMIIBCgKCAQEAl/LoF3DHaSrIaG1pgBmBwDyl
// SIG // Yt7sRvIuoEdGr/yMhV9RfUIft+xsTPVQOAirvgG+KUbc
// SIG // E3KMnGH+VuK7Y+vYzRp3dYTLinSQz1NKYAELyTdVzmmY
// SIG // mU3LX764yk3ABtSZsZwPoiCy+TXE9ZsCkugB2c7Qp9N/
// SIG // O9EjjQDRwZlUa3nLoY96Y3qNPwkCn04ppYiqPeIXTRz8
// SIG // XBLs4Nl/bD9wymEuNSV75vzobJ7BUYQwRU7lmNL2SwRY
// SIG // ENaf0DpdiyFLBsNafHjGYiXQHgNxZUBpj7OoRDNBvMQY
// SIG // L+LM8OrjhGIK1uGL5CqBD/p81ebeFsAZVxg9hrgnkPVQ
// SIG // w77U0LZw8wIDAQABo4IBYjCCAV4wCQYDVR0TBAIwADAO
// SIG // BgNVHQ8BAf8EBAMCB4AwKwYDVR0fBCQwIjAgoB6gHIYa
// SIG // aHR0cDovL3N2LnN5bWNiLmNvbS9zdi5jcmwwZgYDVR0g
// SIG // BF8wXTBbBgtghkgBhvhFAQcXAzBMMCMGCCsGAQUFBwIB
// SIG // FhdodHRwczovL2Quc3ltY2IuY29tL2NwczAlBggrBgEF
// SIG // BQcCAjAZDBdodHRwczovL2Quc3ltY2IuY29tL3JwYTAT
// SIG // BgNVHSUEDDAKBggrBgEFBQcDAzBXBggrBgEFBQcBAQRL
// SIG // MEkwHwYIKwYBBQUHMAGGE2h0dHA6Ly9zdi5zeW1jZC5j
// SIG // b20wJgYIKwYBBQUHMAKGGmh0dHA6Ly9zdi5zeW1jYi5j
// SIG // b20vc3YuY3J0MB8GA1UdIwQYMBaAFJY7U/B5M5evfYPv
// SIG // LivMyreGHnJmMB0GA1UdDgQWBBT3B72WgJotdMR/DD09
// SIG // J93UkAqfzDANBgkqhkiG9w0BAQsFAAOCAQEAinEvQC+1
// SIG // yttKEsqAjt2YufpYlul3OQH17YKbUy4AAiKiAsUXWfTu
// SIG // XRVdkT6CrEYcHyOLaHfe36jVHw8vLIiR2cyEcB3vweyr
// SIG // JnNpt+Za4I/XZMoG/vvCJmSltOj8C/7PRKWklGgynPNe
// SIG // HI8+0d1vLzRtK77hFeV7CIMIfnpoYThJKTSLxdr0kn+j
// SIG // M8otfdLN2aDonnxe0Mf+2rkrX8AFIIHPpIXZj2X2VEmk
// SIG // ZdyFINgI+KlJVQY/RY9BFMM2htLAIkNcDP1QVzFajhGH
// SIG // yj+C+UtZQf5PceGYtJHNeq3cm6omjnEfyzi8/NwYFlkW
// SIG // hvzJEH3woPqKgUramNFFLD0W5zCCBVkwggRBoAMCAQIC
// SIG // ED141/l2SWCyYX308B7KhiowDQYJKoZIhvcNAQELBQAw
// SIG // gcoxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2ln
// SIG // biwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3Qg
// SIG // TmV0d29yazE6MDgGA1UECxMxKGMpIDIwMDYgVmVyaVNp
// SIG // Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
// SIG // eTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMyBQdWJs
// SIG // aWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
// SIG // eSAtIEc1MB4XDTEzMTIxMDAwMDAwMFoXDTIzMTIwOTIz
// SIG // NTk1OVowfzELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5
// SIG // bWFudGVjIENvcnBvcmF0aW9uMR8wHQYDVQQLExZTeW1h
// SIG // bnRlYyBUcnVzdCBOZXR3b3JrMTAwLgYDVQQDEydTeW1h
// SIG // bnRlYyBDbGFzcyAzIFNIQTI1NiBDb2RlIFNpZ25pbmcg
// SIG // Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
// SIG // AQCXgx4AFq8ssdIIxNdok1FgHnH24ke021hNI2JqtL9a
// SIG // G1H3ow0Yd2i72DarLyFQ2p7z518nTgvCl8gJcJOp2lwN
// SIG // TqQNkaC07BTOkXJULs6j20TpUhs/QTzKSuSqwOg5q1PM
// SIG // IdDMz3+b5sLMWGqCFe49Ns8cxZcHJI7xe74xLT1u3LWZ
// SIG // Qp9LYZVfHHDuF33bi+VhiXjHaBuvEXgamK7EVUdT2bMy
// SIG // 1qEORkDFl5KK0VOnmVuFNVfT6pNiYSAKxzB3JBFNYoO2
// SIG // untogjHuZcrf+dWNsjXcjCtvanJcYISc8gyUXsBWUgBI
// SIG // zNP4pX3eL9cT5DiohNVGuBOGwhud6lo43ZvbAgMBAAGj
// SIG // ggGDMIIBfzAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUH
// SIG // MAGGE2h0dHA6Ly9zMi5zeW1jYi5jb20wEgYDVR0TAQH/
// SIG // BAgwBgEB/wIBADBsBgNVHSAEZTBjMGEGC2CGSAGG+EUB
// SIG // BxcDMFIwJgYIKwYBBQUHAgEWGmh0dHA6Ly93d3cuc3lt
// SIG // YXV0aC5jb20vY3BzMCgGCCsGAQUFBwICMBwaGmh0dHA6
// SIG // Ly93d3cuc3ltYXV0aC5jb20vcnBhMDAGA1UdHwQpMCcw
// SIG // JaAjoCGGH2h0dHA6Ly9zMS5zeW1jYi5jb20vcGNhMy1n
// SIG // NS5jcmwwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUF
// SIG // BwMDMA4GA1UdDwEB/wQEAwIBBjApBgNVHREEIjAgpB4w
// SIG // HDEaMBgGA1UEAxMRU3ltYW50ZWNQS0ktMS01NjcwHQYD
// SIG // VR0OBBYEFJY7U/B5M5evfYPvLivMyreGHnJmMB8GA1Ud
// SIG // IwQYMBaAFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
// SIG // SIb3DQEBCwUAA4IBAQAThRoeaak396C9pK9+HWFT/p2M
// SIG // XgymdR54FyPd/ewaA1U5+3GVx2Vap44w0kRaYdtwb9oh
// SIG // BcIuc7pJ8dGT/l3JzV4D4ImeP3Qe1/c4i6nWz7s1LzNY
// SIG // qJJW0chNO4LmeYQW/CiwsUfzHaI+7ofZpn+kVqU/rYQu
// SIG // Kd58vKiqoz0EAeq6k6IOUCIpF0yH5DoRX9akJYmbBWsv
// SIG // tMkBTCd7C6wZBSKgYBU/2sn7TUyP+3Jnd/0nlMe6NQ6I
// SIG // Sf6N/SivShK9DbOXBd5EDBX6NisD3MFQAfGhEV0U5eK9
// SIG // J0tUviuEXg+mw3QFCu+Xw4kisR93873NQ9TxTKk/tYuE
// SIG // r2Ty0BQhMYIEPDCCBDgCAQEwgZMwfzELMAkGA1UEBhMC
// SIG // VVMxHTAbBgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9u
// SIG // MR8wHQYDVQQLExZTeW1hbnRlYyBUcnVzdCBOZXR3b3Jr
// SIG // MTAwLgYDVQQDEydTeW1hbnRlYyBDbGFzcyAzIFNIQTI1
// SIG // NiBDb2RlIFNpZ25pbmcgQ0ECEDB6NnqqPmiBpvlPCMs7
// SIG // OWQwCQYFKw4DAhoFAKBwMBAGCisGAQQBgjcCAQwxAjAA
// SIG // MBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisG
// SIG // AQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMCMGCSqGSIb3
// SIG // DQEJBDEWBBQXmtsxJWhfv7ln+YB/i37hDAHatDANBgkq
// SIG // hkiG9w0BAQEFAASCAQAK7WYp6JeF6stD/8MCWcCCU1sk
// SIG // DRktVYt3YaE5PV41iAmNojUY3Pm/zxIfMSgOi3hmldZO
// SIG // svFKK6o3ie7YroDJzqv49XeSsij0qHAfdA8kZSm0Ietz
// SIG // C70aeQvUfsX/jlGaEsk6xyS8rAtBcyTFzFy/NEslf1PO
// SIG // 2HtoSLGua/8ZHY/rwCJ9dSFW1Q1bddQw8uwOCtYi/B0O
// SIG // gb2ZoA9y/eMEpHWbpzgc3tSALa3WrUBy2NkicM9xDARY
// SIG // S52dsYGM6bIZ9/HU5Lb5QhDcyW+s7NZTyJQtr03p42U0
// SIG // 5WWVnq+Zsca/cFaFysaFxwjWKQ3URYadic7V6VJmeuoC
// SIG // Q6rZPsinoYICCzCCAgcGCSqGSIb3DQEJBjGCAfgwggH0
// SIG // AgEBMHIwXjELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5
// SIG // bWFudGVjIENvcnBvcmF0aW9uMTAwLgYDVQQDEydTeW1h
// SIG // bnRlYyBUaW1lIFN0YW1waW5nIFNlcnZpY2VzIENBIC0g
// SIG // RzICEA7P9DjI/r81bgTYapgbGlAwCQYFKw4DAhoFAKBd
// SIG // MBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZI
// SIG // hvcNAQkFMQ8XDTE2MDkxMzE5MTYzMFowIwYJKoZIhvcN
// SIG // AQkEMRYEFKJrjxHhMcRHIHE0xSovNF/6HrbgMA0GCSqG
// SIG // SIb3DQEBAQUABIIBAAJUluyL0fGvb3NTfCyOnxE3OMya
// SIG // lkBBfy6IG0Z6Cu+YLj5xUan6OWJnGbhfRhKN8sfhI2Ls
// SIG // X7M36nwX4Ze3qj9qVUsC0o5eDnKSK6Wevkkof1qYeR93
// SIG // dEg/lawYd9tMeWCNamtt+mGv8azAi+deZDK4l765UsKj
// SIG // KUrHN4NTgTX/p9eIHhZPlP+8vAKCqIkNQrKLCTkj5pLK
// SIG // swhkiGZYOtD5JrECIdjFZQM3+y8z49bMIxzDWhi21bb7
// SIG // B+sWrwaDsNgkZU5pydrycqsWGtqO2Lr0BboMDdXOHMMR
// SIG // Qw0YDHS6OBU3oW8Q++FPkWOHbSw0IS0QMheLFrpmfQu/
// SIG // FD7Lt/g=
// SIG // End signature block

143
MSI.wsf
View File

@ -455,13 +455,110 @@
WScript.Quit(0);
]]></script>
</job>
<job id="IDT2PO">
<runtime>
<description>Extract strings to translate by comparing two IDT files.</description>
<unnamed name="&lt;source.idt&gt;" helpstring="Original IDT file" required="true"/>
<unnamed name="&lt;destination.idt&gt;" helpstring="Translated IDT file" required="true"/>
<unnamed name="&lt;output.po&gt;" helpstring="Output PO file" required="true"/>
<named name="L" helpstring="Language identifier" type="string" required="false"/>
</runtime>
<reference object="ADODB.Stream"/>
<reference object="Scripting.FileSystemObject"/>
<script language="JScript" src="IDT.js"/>
<script language="JScript" src="String.js"/>
<script language="JScript"><![CDATA[
if (WScript.Arguments.Unnamed.Length < 3) {
WScript.Arguments.ShowUsage();
WScript.Quit(1);
}
var
fso = WScript.CreateObject("Scripting.FileSystemObject"),
po_path = WScript.Arguments.Unnamed(2);
try {
var
idt_src = new IDT(WScript.Arguments.Unnamed(0)),
idt_dst = new IDT(WScript.Arguments.Unnamed(1));
if (idt_src.columns.toString() != idt_dst.columns.toString() ||
idt_src.types .toString() != idt_dst.types .toString() ||
idt_src.table != idt_dst.table ||
idt_src.key .toString() != idt_dst.key .toString())
throw new Error("IDT files are not compatible.");
var trans = new Array();
for (var key in idt_src.data) {
if (key in idt_dst.data) {
// We found a record in both IDT files.
for (var col in idt_src.types) {
if (idt_src.types[col].charAt(0).toUpperCase() == "L" && idt_src.data[key][col] != "")
trans[idt_src.data[key][col]] = idt_dst.data[key][col];
}
}
}
// Add header.
trans[""] =
"MIME-Version: 1.0\n" +
"Content-Type: text/plain; charset=UTF-8\n" +
"Content-Transfer-Encoding: 8bit\n" +
(WScript.Arguments.Named.Exists("L") ? "Language: "+ WScript.Arguments.Named("L") +"\n" : "");
var
po_dat_tmp = WScript.CreateObject("ADODB.Stream");
// Open PO file in memory.
po_dat_tmp.Open();
try {
// PO is text file, uses Unix line breaks and UTF-8 encoding.
po_dat_tmp.Type = adTypeText;
po_dat_tmp.LineSeparator = adLF;
po_dat_tmp.Charset = "utf-8";
for (var rec in trans) {
po_dat_tmp.WriteText("msgid \"" + _PO( rec ) + "\"", adWriteLine);
po_dat_tmp.WriteText("msgstr \"" + _PO(trans[rec]) + "\"", adWriteLine);
po_dat_tmp.WriteText("", adWriteLine);
}
// Write to file without UTF-8 BOM.
var
po_dat = WScript.CreateObject("ADODB.Stream")
po_dat.Type = adTypeBinary;
po_dat.Mode = adModeReadWrite;
po_dat.Open();
try {
// Skip BOM (first three bytes) and copy the rest.
po_dat_tmp.Position = 3;
po_dat_tmp.CopyTo(po_dat);
po_dat.SaveToFile(po_path, adSaveCreateOverWrite);
} finally {
po_dat.Close();
}
} finally {
po_dat_tmp.Close();
}
} catch (err) {
// In case of error, delete output file.
if (fso.FileExists(po_path))
fso.DeleteFile(po_path);
throw err;
}
WScript.Quit(0);
]]></script>
</job>
<signature>
** SIG ** MIIXmAYJKoZIhvcNAQcCoIIXiTCCF4UCAQExCzAJBgUr
** SIG ** DgMCGgUAMGcGCisGAQQBgjcCAQSgWTBXMDIGCisGAQQB
** SIG ** gjcCAR4wJAIBAQQQcAVhGs441BGiowAQS9NQkAIBAAIB
** SIG ** AAIBAAIBAAIBADAhMAkGBSsOAwIaBQAEFEHEvk2w1IDu
** SIG ** raRVIFiVLN1o6XuBoIISyDCCA+4wggNXoAMCAQICEH6T
** SIG ** AAIBAAIBAAIBADAhMAkGBSsOAwIaBQAEFAgwP2tZH4xo
** SIG ** ShC7TKM0tJUdu1UqoIISyDCCA+4wggNXoAMCAQICEH6T
** SIG ** 6/t8xk5Z6kuad9QG/DswDQYJKoZIhvcNAQEFBQAwgYsx
** SIG ** CzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENh
** SIG ** cGUxFDASBgNVBAcTC0R1cmJhbnZpbGxlMQ8wDQYDVQQK
@ -615,31 +712,31 @@
** SIG ** OWQwCQYFKw4DAhoFAKBwMBAGCisGAQQBgjcCAQwxAjAA
** SIG ** MBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisG
** SIG ** AQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMCMGCSqGSIb3
** SIG ** DQEJBDEWBBR6dTC/boD4AfXjRZuTKr/1zNmntzANBgkq
** SIG ** hkiG9w0BAQEFAASCAQBVo/5CV3pBnv4oB8K/31oUjG1k
** SIG ** 4oE2t6uXQQeMFe1oVWCcph6cS7RmxOoqyk5bV8flKUT1
** SIG ** 9Sna5fDh2xi3PG/HGZ4Ua4bWs210Qno8G9K/vh/PZeC0
** SIG ** /wqsYYWRKc6hyaQ3oc2whaalNNXGg+fQg/aNxHmuwgIY
** SIG ** Cljrdlr6bXThz7bOY6/NDddlqP1Pwnc3nihjPORnyf92
** SIG ** 2lpLjQKZvGDSTfpy9BKb5ZHwAtZyDI3enUXrKtOYjh4e
** SIG ** T+jbSX98K5L6dP/7BNqt4HsLXINTB2EjOQtRPCn5botw
** SIG ** 9cTczoWFiy8CQBve8GizZHKVkuH1bdc2uT+EvhjQEr3z
** SIG ** FXb8CWovoYICCzCCAgcGCSqGSIb3DQEJBjGCAfgwggH0
** SIG ** DQEJBDEWBBSA+wRcubRz2w/cM3NPYnJus3GLKjANBgkq
** SIG ** hkiG9w0BAQEFAASCAQAHLsbtqbG4i6jTLaWMvnfUW2hg
** SIG ** pmfoMPYyEhXrKuhLe9etau8QnHER4pKBpcmaUHZyXgTc
** SIG ** 4NFDhbmLOXE3dysr3N51tmhZ5tIdpuBQnyr5tvmb1UOO
** SIG ** ODbAZs7O9f2AuS+t7R0pu4gNz2ATiFjrAW3MhV7sDz29
** SIG ** sBuFgfffSQvIR3nbi4McC3OOnVT0Qb6tBsYKJjESaubG
** SIG ** 0k2TZWsjei/Xj1B6cK0FszjnTKkrJXFyEKYFGhrUDxQJ
** SIG ** 7lRSGuo5a6jSy7FTFiJ/u7bCCL3xCDbZolN5Sreq04rt
** SIG ** WXQur23Eu193PeCFmaVCXcvXAoT6BxJxPLS78H3Cx1MM
** SIG ** 2vsos20poYICCzCCAgcGCSqGSIb3DQEJBjGCAfgwggH0
** SIG ** AgEBMHIwXjELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5
** SIG ** bWFudGVjIENvcnBvcmF0aW9uMTAwLgYDVQQDEydTeW1h
** SIG ** bnRlYyBUaW1lIFN0YW1waW5nIFNlcnZpY2VzIENBIC0g
** SIG ** RzICEA7P9DjI/r81bgTYapgbGlAwCQYFKw4DAhoFAKBd
** SIG ** MBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZI
** SIG ** hvcNAQkFMQ8XDTE2MDkxMDA3MjMzNFowIwYJKoZIhvcN
** SIG ** AQkEMRYEFPXD/Zju3XrJ5FHNdYlywwjm6bxiMA0GCSqG
** SIG ** SIb3DQEBAQUABIIBAJIsJ9KLVyoPNgRe4QK0z/ssrOlc
** SIG ** NPZYckBVcPIvDp9J3jemLzqAXKLRvNgifYQRy8TQVRG5
** SIG ** hjOtVrmHSqYJFJgih/2gVLjfuJ6P4Z7ya+UL1tdNTrfY
** SIG ** eBSAeUP5t59GsX9nnyxrvOFuC1gUOlvMmfCywWmLI8N1
** SIG ** eyGamCkEmho4yDW/AHHUNPc6Ou2XiPMdy9EFvZ+aSv9p
** SIG ** ChD89Y9Tpm//1wEezp5FvkW7yqhp8sHKsDlQ9Ugi3wq0
** SIG ** NMnswUVNekGnA4INP+C8PoExozoftlhMQCNkFf2gnmz+
** SIG ** AuyM/w5rUzTReuw1dgaSadktExzlZqVQMdSmkrKXEZZj
** SIG ** HIABnZo=
** SIG ** hvcNAQkFMQ8XDTE2MDkxMzE5MTYzN1owIwYJKoZIhvcN
** SIG ** AQkEMRYEFK/udSxpaclJTaHL1BZhol2ZqgZ+MA0GCSqG
** SIG ** SIb3DQEBAQUABIIBAEuXPMHdYJhLAWTUKp/hr3EG9xk4
** SIG ** ENgON+sdZF3cM/gavxr1vZhgp/yypxEHuiNPBAf6E08j
** SIG ** ZQDq0NUmoXm3cSXTTQhQd8OZjeRvr4BDS7BJhQUUMKBL
** SIG ** BPTVsLGiy7N2k43575LcmE/d6kakPOCDG6uLSRmxZKRl
** SIG ** J6GmmfCrpHYwBoKGcNgCyXV9hNpZ+hXDkyuGbnOxqK0R
** SIG ** ws78DmQOaOiWPGY6AZrxf9+PZXYG4B1nOGdwFz3iTvjM
** SIG ** +LaJrwKEx0IbRcN1sIhXOHs8V46RVgPEczVIv8yF4JGv
** SIG ** NlKcEofnt/ApQUEkgaBQzvuBnzFmfTTg/R1dsF6NtRXx
** SIG ** 8ndDGMk=
</signature>
</package>

270
String.js
View File

@ -41,6 +41,32 @@ function _S(str)
}
var _PO_stat = null;
function _PO(str)
{
if (!_PO_stat) {
_PO_stat = {
"re_bslash": new RegExp("\\\\", "g"),
"re_bs": new RegExp("\b", "g"),
"re_ff": new RegExp("\f", "g"),
"re_lf": new RegExp("\n", "g"),
"re_cr": new RegExp("\r", "g"),
"re_tab": new RegExp("\t", "g"),
"re_quot": new RegExp("\"", "g")
};
}
if (str == null) return null;
switch (typeof(str)) {
case "string": break;
case "undefined": return null;
default: try { str = str.toString(); } catch (err) { return null; }
}
return str.replace(_PO_stat.re_bslash, "\\\\").replace(_PO_stat.re_bs, "\\b").replace(_PO_stat.re_ff, "\\f").replace(_PO_stat.re_lf, "\\n").replace(_PO_stat.re_cr, "\\r").replace(_PO_stat.re_tab, "\\t").replace(_PO_stat.re_quot, "\\\"");
}
var Trim_stat = null;
function Trim(str)
{
@ -80,11 +106,11 @@ function Time2Str(date)
/*@end @*/
// SIG // Begin signature block
// SIG // MIIZKwYJKoZIhvcNAQcCoIIZHDCCGRgCAQExCzAJBgUr
// SIG // MIIXmAYJKoZIhvcNAQcCoIIXiTCCF4UCAQExCzAJBgUr
// SIG // DgMCGgUAMGcGCisGAQQBgjcCAQSgWTBXMDIGCisGAQQB
// SIG // gjcCAR4wJAIBAQQQEODJBs441BGiowAQS9NQkAIBAAIB
// SIG // AAIBAAIBAAIBADAhMAkGBSsOAwIaBQAEFJ7ICj4D+PWb
// SIG // gD7qzuf0PZJVgn78oIIUJTCCA+4wggNXoAMCAQICEH6T
// SIG // AAIBAAIBAAIBADAhMAkGBSsOAwIaBQAEFDxPoB8u1jme
// SIG // KWirJ5YJ3N+8s9wMoIISyDCCA+4wggNXoAMCAQICEH6T
// SIG // 6/t8xk5Z6kuad9QG/DswDQYJKoZIhvcNAQEFBQAwgYsx
// SIG // CzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENh
// SIG // cGUxFDASBgNVBAcTC0R1cmJhbnZpbGxlMQ8wDQYDVQQK
@ -151,129 +177,117 @@ function Time2Str(date)
// SIG // K/F/Wwk9m1viFsoTgW0ALjgNqCmPLOGy9FqpAa8VnCwv
// SIG // SRvbIrvD/niUUcOGsYKIXfA9tFGheTMrLnu53CAJE3Hr
// SIG // ahlbz+ilMFcsiUk/uc9/yb8+ImhjU5q9aXSsxR08f5Lg
// SIG // w7wc2AR1MIIFejCCBGKgAwIBAgIQQIeLZ2eQpZcEKJ6U
// SIG // AwIaGzANBgkqhkiG9w0BAQUFADCBtDELMAkGA1UEBhMC
// SIG // VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYD
// SIG // VQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTswOQYD
// SIG // VQQLEzJUZXJtcyBvZiB1c2UgYXQgaHR0cHM6Ly93d3cu
// SIG // dmVyaXNpZ24uY29tL3JwYSAoYykxMDEuMCwGA1UEAxMl
// SIG // VmVyaVNpZ24gQ2xhc3MgMyBDb2RlIFNpZ25pbmcgMjAx
// SIG // MCBDQTAeFw0xMjA5MjYwMDAwMDBaFw0xNTEwMTEyMzU5
// SIG // NTlaMIG9MQswCQYDVQQGEwJTSTERMA8GA1UECBMIU2xv
// SIG // dmVuaWExDzANBgNVBAcTBkthbW5pazEWMBQGA1UEChQN
// SIG // QW1lYmlzIGQuby5vLjE+MDwGA1UECxM1RGlnaXRhbCBJ
// SIG // RCBDbGFzcyAzIC0gTWljcm9zb2Z0IFNvZnR3YXJlIFZh
// SIG // bGlkYXRpb24gdjIxGjAYBgNVBAsUEXByb2dyYW1za2Eg
// SIG // b3ByZW1hMRYwFAYDVQQDFA1BbWViaXMgZC5vLm8uMIIB
// SIG // IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9QZF
// SIG // QzscW51y/Ermb72+gkWUJ6ExfOS1UHvNAcefWdFm4yVX
// SIG // wqi8TRT+P5czX+UjKbh77d00CxODQK7rdLb8+EgKybFT
// SIG // /bVfT2y8RMtEdG0qI84ZSwh2POazD0PyiHb9XORN2yKH
// SIG // ykqLiO+6cJvZXjfNpGqf/LxkXVJvyxaemN1XTR91ohhc
// SIG // 97bNyGCP0M8PNKRZ6Hr5uKlZyr7QLYoYAkaENYdXHrOc
// SIG // l5CmBAIL56Ngc8vIlLF2lLPmDYf1qWrPpJyXfj7p3iUf
// SIG // AewtEpbC5FfhCaeHwgg41NfxhRWCXEBTewLHQJtpSo2k
// SIG // mwv5Q1ZuWMDUjPeuHZ3F/ofBoJTE4wIDAQABo4IBezCC
// SIG // AXcwCQYDVR0TBAIwADAOBgNVHQ8BAf8EBAMCB4AwQAYD
// SIG // VR0fBDkwNzA1oDOgMYYvaHR0cDovL2NzYzMtMjAxMC1j
// SIG // cmwudmVyaXNpZ24uY29tL0NTQzMtMjAxMC5jcmwwRAYD
// SIG // VR0gBD0wOzA5BgtghkgBhvhFAQcXAzAqMCgGCCsGAQUF
// SIG // BwIBFhxodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcnBh
// SIG // MBMGA1UdJQQMMAoGCCsGAQUFBwMDMHEGCCsGAQUFBwEB
// SIG // BGUwYzAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AudmVy
// SIG // aXNpZ24uY29tMDsGCCsGAQUFBzAChi9odHRwOi8vY3Nj
// SIG // My0yMDEwLWFpYS52ZXJpc2lnbi5jb20vQ1NDMy0yMDEw
// SIG // LmNlcjAfBgNVHSMEGDAWgBTPmanqeyb0S8mOj9fwBSbv
// SIG // 49KnnTARBglghkgBhvhCAQEEBAMCBBAwFgYKKwYBBAGC
// SIG // NwIBGwQIMAYBAQABAf8wDQYJKoZIhvcNAQEFBQADggEB
// SIG // AOMOvRZGpbGuLiIAaqp22r2WAOzxinLpe0O/pJCmBoU0
// SIG // lK/Es/Jyc4Y90QyvvhoSVKoZ2hMQ2Y6N7oSkhHjKo/n8
// SIG // WIQwNvaqZu4JpO9IgH1WkfqJWnpVcaVGPA0uHhuDhPe9
// SIG // gH6Z6I3HC5GL7sc+z4n0kzy1f3AyD+DihQhD0J/i/sgF
// SIG // iEaFmwwlJHMv6b4xmERMff050y15k875cdRpeFvSjHko
// SIG // IUbY2bfPlnvhWd/4eidkT3KY5Lpm4cqUO20166p2Cjxf
// SIG // i9kEGuDPYEYiX94hQmjWwZfIYxdYdD9f+gVcyPpiMspq
// SIG // n5QwKHOenweisG6BwXs4H5q45SLx1oJ9PUQwggYKMIIE
// SIG // 8qADAgECAhBSAOWqJVb8GobtlsnUSzPHMA0GCSqGSIb3
// SIG // DQEBBQUAMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMO
// SIG // VmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWdu
// SIG // IFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA2
// SIG // IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQg
// SIG // dXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNz
// SIG // IDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBB
// SIG // dXRob3JpdHkgLSBHNTAeFw0xMDAyMDgwMDAwMDBaFw0y
// SIG // MDAyMDcyMzU5NTlaMIG0MQswCQYDVQQGEwJVUzEXMBUG
// SIG // A1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
// SIG // cmlTaWduIFRydXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRl
// SIG // cm1zIG9mIHVzZSBhdCBodHRwczovL3d3dy52ZXJpc2ln
// SIG // bi5jb20vcnBhIChjKTEwMS4wLAYDVQQDEyVWZXJpU2ln
// SIG // biBDbGFzcyAzIENvZGUgU2lnbmluZyAyMDEwIENBMIIB
// SIG // IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9SNL
// SIG // XqXXirsy6dRX9+/kxyZ+rRmY/qidfZT2NmsQ13WBMH8E
// SIG // aH/LK3UezR0IjN9plKc3o5x7gOCZ4e43TV/OOxTuhtTQ
// SIG // 9Sc1vCULOKeMY50Xowilq7D7zWpigkzVIdob2fHjhDuK
// SIG // Kk+FW5ABT8mndhB/JwN8vq5+fcHd+QW8G0icaefApDw8
// SIG // QQA+35blxeSUcdZVAccAJkpAPLWhJqkMp22AjpAle8+/
// SIG // PxzrL5b65Yd3xrVWsno7VDBTG99iNP8e0fRakyiF5UwX
// SIG // Tn5b/aSTmX/fze+kde/vFfZH5/gZctguNBqmtKdMfr27
// SIG // Tww9V/Ew1qY2jtaAdtcZLqXNfjQtiQIDAQABo4IB/jCC
// SIG // AfowEgYDVR0TAQH/BAgwBgEB/wIBADBwBgNVHSAEaTBn
// SIG // MGUGC2CGSAGG+EUBBxcDMFYwKAYIKwYBBQUHAgEWHGh0
// SIG // dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9jcHMwKgYIKwYB
// SIG // BQUHAgIwHhocaHR0cHM6Ly93d3cudmVyaXNpZ24uY29t
// SIG // L3JwYTAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwE
// SIG // YTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAHBgUr
// SIG // DgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0
// SIG // cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYw
// SIG // NAYDVR0fBC0wKzApoCegJYYjaHR0cDovL2NybC52ZXJp
// SIG // c2lnbi5jb20vcGNhMy1nNS5jcmwwNAYIKwYBBQUHAQEE
// SIG // KDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC52ZXJp
// SIG // c2lnbi5jb20wHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsG
// SIG // AQUFBwMDMCgGA1UdEQQhMB+kHTAbMRkwFwYDVQQDExBW
// SIG // ZXJpU2lnbk1QS0ktMi04MB0GA1UdDgQWBBTPmanqeyb0
// SIG // S8mOj9fwBSbv49KnnTAfBgNVHSMEGDAWgBR/02Wnwt3s
// SIG // u/AwCfNDOfoCrzMxMzANBgkqhkiG9w0BAQUFAAOCAQEA
// SIG // ViLmNKTEYctIuQGtVqhkD9mMkcS7zAzlrXqgIn/fRzhK
// SIG // LWzRf3EafOxwqbHwT+QPDFP6FV7+dJhJJIWBJhyRFEew
// SIG // TGOMu6E01MZF6A2FJnMD0KmMZG3ccZLmRQVgFVlROfxY
// SIG // FGv+1KTteWsIDEFy5zciBgm+I+k/RJoe6WGdzLGQXPw9
// SIG // 0o2sQj1lNtS0PUAoj5sQzyMmzEsgy5AfXYxMNMo82OU3
// SIG // 1m+lIL006ybZrg3nxZr3obQhkTNvhuhYuyV8dA5Y/nUb
// SIG // Yz/OMXybjxuWnsVTdoRbnK2R+qztk7pdyCFTwoJTY68S
// SIG // DVCHERs9VFKWiiycPZIaCJoFLseTpUiR0zGCBHIwggRu
// SIG // AgEBMIHJMIG0MQswCQYDVQQGEwJVUzEXMBUGA1UEChMO
// SIG // VmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWdu
// SIG // IFRydXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9m
// SIG // IHVzZSBhdCBodHRwczovL3d3dy52ZXJpc2lnbi5jb20v
// SIG // cnBhIChjKTEwMS4wLAYDVQQDEyVWZXJpU2lnbiBDbGFz
// SIG // cyAzIENvZGUgU2lnbmluZyAyMDEwIENBAhBAh4tnZ5Cl
// SIG // lwQonpQDAhobMAkGBSsOAwIaBQCgcDAQBgorBgEEAYI3
// SIG // AgEMMQIwADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIB
// SIG // BDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAj
// SIG // BgkqhkiG9w0BCQQxFgQUZFFRwcAST2XZGHWztrbB0us2
// SIG // t1QwDQYJKoZIhvcNAQEBBQAEggEAUUrCW7R+7inWz89Q
// SIG // WcHUJVAgHIzf47+ifq4NTMEljOdzWZuZlP5gtWnNGFtt
// SIG // 84hDnFcJvaXSKsCBb6kInDrNLYYjLyq0BcKd6TGnfc9b
// SIG // hG3tp6bS/OMPYUmEFvECXcgI/EPhlc6wS7you3lKy02E
// SIG // f5wASOFdumCJTKUl1NgBWxx2eS06hg2JV2eqCNkHGHCK
// SIG // Fw+fZvgGM43woYXW5vA/mYAPrTzze7AoqkiZau6T/ds7
// SIG // XuuSlntVqpNjpV2J1wgU1VibUTtO7Akfpk4Yh/2L4SEf
// SIG // 3FvQc3QoB3LX6rdUjLPuh8XtO5A02IGOewFGW2j6eZ/u
// SIG // +vzopXNT7WeOzyRO/KGCAgswggIHBgkqhkiG9w0BCQYx
// SIG // ggH4MIIB9AIBATByMF4xCzAJBgNVBAYTAlVTMR0wGwYD
// SIG // VQQKExRTeW1hbnRlYyBDb3Jwb3JhdGlvbjEwMC4GA1UE
// SIG // AxMnU3ltYW50ZWMgVGltZSBTdGFtcGluZyBTZXJ2aWNl
// SIG // cyBDQSAtIEcyAhAOz/Q4yP6/NW4E2GqYGxpQMAkGBSsO
// SIG // AwIaBQCgXTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcB
// SIG // MBwGCSqGSIb3DQEJBTEPFw0xNTAyMjUwODA3MjBaMCMG
// SIG // CSqGSIb3DQEJBDEWBBQr/B5JEkzV9O5t5+zkw8kSZS4r
// SIG // jTANBgkqhkiG9w0BAQEFAASCAQANKLXioTyPfB31SCMz
// SIG // YzyIvHPNsUBu9xIypjmL2NYo7y9ttNtc1g+QL1bwN1Vk
// SIG // gLh7QVfgis0RITDHsuGpqrSbBhKSqHFsXvcWAIEliicd
// SIG // ZGw7vC8WjX0G6q8NWL7rlauGVEgoRb0oyEEmUnWwq+uZ
// SIG // RmIfz/rYHTL8cnub2RT0HNFo7YBGHMp0L7c3kuuyzfy1
// SIG // rdACPyRdzZ6QxZ+PuJZ1iA1/J2Nl8aQh6+vJH/oSfalv
// SIG // SEYGtguoT603oVoaRH8OPdw6SG9EUzp4LpV8YQwE3hJM
// SIG // Zr6EXmW5ToWNjrlkKs3bCDuHpX19kiwoJetM9fmEMDXw
// SIG // p70rxAufvXmIpItY
// SIG // w7wc2AR1MIIEzjCCA7agAwIBAgIQMHo2eqo+aIGm+U8I
// SIG // yzs5ZDANBgkqhkiG9w0BAQsFADB/MQswCQYDVQQGEwJV
// SIG // UzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24x
// SIG // HzAdBgNVBAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsx
// SIG // MDAuBgNVBAMTJ1N5bWFudGVjIENsYXNzIDMgU0hBMjU2
// SIG // IENvZGUgU2lnbmluZyBDQTAeFw0xNTEwMDkwMDAwMDBa
// SIG // Fw0xODExMDcyMzU5NTlaMGExCzAJBgNVBAYTAlNJMREw
// SIG // DwYDVQQIEwhTbG92ZW5pYTEPMA0GA1UEBxMGS2Ftbmlr
// SIG // MRYwFAYDVQQKFA1BbWViaXMgZC5vLm8uMRYwFAYDVQQD
// SIG // FA1BbWViaXMgZC5vLm8uMIIBIjANBgkqhkiG9w0BAQEF
// SIG // AAOCAQ8AMIIBCgKCAQEAl/LoF3DHaSrIaG1pgBmBwDyl
// SIG // Yt7sRvIuoEdGr/yMhV9RfUIft+xsTPVQOAirvgG+KUbc
// SIG // E3KMnGH+VuK7Y+vYzRp3dYTLinSQz1NKYAELyTdVzmmY
// SIG // mU3LX764yk3ABtSZsZwPoiCy+TXE9ZsCkugB2c7Qp9N/
// SIG // O9EjjQDRwZlUa3nLoY96Y3qNPwkCn04ppYiqPeIXTRz8
// SIG // XBLs4Nl/bD9wymEuNSV75vzobJ7BUYQwRU7lmNL2SwRY
// SIG // ENaf0DpdiyFLBsNafHjGYiXQHgNxZUBpj7OoRDNBvMQY
// SIG // L+LM8OrjhGIK1uGL5CqBD/p81ebeFsAZVxg9hrgnkPVQ
// SIG // w77U0LZw8wIDAQABo4IBYjCCAV4wCQYDVR0TBAIwADAO
// SIG // BgNVHQ8BAf8EBAMCB4AwKwYDVR0fBCQwIjAgoB6gHIYa
// SIG // aHR0cDovL3N2LnN5bWNiLmNvbS9zdi5jcmwwZgYDVR0g
// SIG // BF8wXTBbBgtghkgBhvhFAQcXAzBMMCMGCCsGAQUFBwIB
// SIG // FhdodHRwczovL2Quc3ltY2IuY29tL2NwczAlBggrBgEF
// SIG // BQcCAjAZDBdodHRwczovL2Quc3ltY2IuY29tL3JwYTAT
// SIG // BgNVHSUEDDAKBggrBgEFBQcDAzBXBggrBgEFBQcBAQRL
// SIG // MEkwHwYIKwYBBQUHMAGGE2h0dHA6Ly9zdi5zeW1jZC5j
// SIG // b20wJgYIKwYBBQUHMAKGGmh0dHA6Ly9zdi5zeW1jYi5j
// SIG // b20vc3YuY3J0MB8GA1UdIwQYMBaAFJY7U/B5M5evfYPv
// SIG // LivMyreGHnJmMB0GA1UdDgQWBBT3B72WgJotdMR/DD09
// SIG // J93UkAqfzDANBgkqhkiG9w0BAQsFAAOCAQEAinEvQC+1
// SIG // yttKEsqAjt2YufpYlul3OQH17YKbUy4AAiKiAsUXWfTu
// SIG // XRVdkT6CrEYcHyOLaHfe36jVHw8vLIiR2cyEcB3vweyr
// SIG // JnNpt+Za4I/XZMoG/vvCJmSltOj8C/7PRKWklGgynPNe
// SIG // HI8+0d1vLzRtK77hFeV7CIMIfnpoYThJKTSLxdr0kn+j
// SIG // M8otfdLN2aDonnxe0Mf+2rkrX8AFIIHPpIXZj2X2VEmk
// SIG // ZdyFINgI+KlJVQY/RY9BFMM2htLAIkNcDP1QVzFajhGH
// SIG // yj+C+UtZQf5PceGYtJHNeq3cm6omjnEfyzi8/NwYFlkW
// SIG // hvzJEH3woPqKgUramNFFLD0W5zCCBVkwggRBoAMCAQIC
// SIG // ED141/l2SWCyYX308B7KhiowDQYJKoZIhvcNAQELBQAw
// SIG // gcoxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2ln
// SIG // biwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3Qg
// SIG // TmV0d29yazE6MDgGA1UECxMxKGMpIDIwMDYgVmVyaVNp
// SIG // Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
// SIG // eTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMyBQdWJs
// SIG // aWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
// SIG // eSAtIEc1MB4XDTEzMTIxMDAwMDAwMFoXDTIzMTIwOTIz
// SIG // NTk1OVowfzELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5
// SIG // bWFudGVjIENvcnBvcmF0aW9uMR8wHQYDVQQLExZTeW1h
// SIG // bnRlYyBUcnVzdCBOZXR3b3JrMTAwLgYDVQQDEydTeW1h
// SIG // bnRlYyBDbGFzcyAzIFNIQTI1NiBDb2RlIFNpZ25pbmcg
// SIG // Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
// SIG // AQCXgx4AFq8ssdIIxNdok1FgHnH24ke021hNI2JqtL9a
// SIG // G1H3ow0Yd2i72DarLyFQ2p7z518nTgvCl8gJcJOp2lwN
// SIG // TqQNkaC07BTOkXJULs6j20TpUhs/QTzKSuSqwOg5q1PM
// SIG // IdDMz3+b5sLMWGqCFe49Ns8cxZcHJI7xe74xLT1u3LWZ
// SIG // Qp9LYZVfHHDuF33bi+VhiXjHaBuvEXgamK7EVUdT2bMy
// SIG // 1qEORkDFl5KK0VOnmVuFNVfT6pNiYSAKxzB3JBFNYoO2
// SIG // untogjHuZcrf+dWNsjXcjCtvanJcYISc8gyUXsBWUgBI
// SIG // zNP4pX3eL9cT5DiohNVGuBOGwhud6lo43ZvbAgMBAAGj
// SIG // ggGDMIIBfzAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUH
// SIG // MAGGE2h0dHA6Ly9zMi5zeW1jYi5jb20wEgYDVR0TAQH/
// SIG // BAgwBgEB/wIBADBsBgNVHSAEZTBjMGEGC2CGSAGG+EUB
// SIG // BxcDMFIwJgYIKwYBBQUHAgEWGmh0dHA6Ly93d3cuc3lt
// SIG // YXV0aC5jb20vY3BzMCgGCCsGAQUFBwICMBwaGmh0dHA6
// SIG // Ly93d3cuc3ltYXV0aC5jb20vcnBhMDAGA1UdHwQpMCcw
// SIG // JaAjoCGGH2h0dHA6Ly9zMS5zeW1jYi5jb20vcGNhMy1n
// SIG // NS5jcmwwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUF
// SIG // BwMDMA4GA1UdDwEB/wQEAwIBBjApBgNVHREEIjAgpB4w
// SIG // HDEaMBgGA1UEAxMRU3ltYW50ZWNQS0ktMS01NjcwHQYD
// SIG // VR0OBBYEFJY7U/B5M5evfYPvLivMyreGHnJmMB8GA1Ud
// SIG // IwQYMBaAFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
// SIG // SIb3DQEBCwUAA4IBAQAThRoeaak396C9pK9+HWFT/p2M
// SIG // XgymdR54FyPd/ewaA1U5+3GVx2Vap44w0kRaYdtwb9oh
// SIG // BcIuc7pJ8dGT/l3JzV4D4ImeP3Qe1/c4i6nWz7s1LzNY
// SIG // qJJW0chNO4LmeYQW/CiwsUfzHaI+7ofZpn+kVqU/rYQu
// SIG // Kd58vKiqoz0EAeq6k6IOUCIpF0yH5DoRX9akJYmbBWsv
// SIG // tMkBTCd7C6wZBSKgYBU/2sn7TUyP+3Jnd/0nlMe6NQ6I
// SIG // Sf6N/SivShK9DbOXBd5EDBX6NisD3MFQAfGhEV0U5eK9
// SIG // J0tUviuEXg+mw3QFCu+Xw4kisR93873NQ9TxTKk/tYuE
// SIG // r2Ty0BQhMYIEPDCCBDgCAQEwgZMwfzELMAkGA1UEBhMC
// SIG // VVMxHTAbBgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9u
// SIG // MR8wHQYDVQQLExZTeW1hbnRlYyBUcnVzdCBOZXR3b3Jr
// SIG // MTAwLgYDVQQDEydTeW1hbnRlYyBDbGFzcyAzIFNIQTI1
// SIG // NiBDb2RlIFNpZ25pbmcgQ0ECEDB6NnqqPmiBpvlPCMs7
// SIG // OWQwCQYFKw4DAhoFAKBwMBAGCisGAQQBgjcCAQwxAjAA
// SIG // MBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisG
// SIG // AQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMCMGCSqGSIb3
// SIG // DQEJBDEWBBSipOV5yboG0OsgwNNLnFzwwncvXTANBgkq
// SIG // hkiG9w0BAQEFAASCAQCTeZ1p4YgRrrg1Grr2eGvnk+Jt
// SIG // +LVBTDo7+J8gb38Vw9ChGPyZMdJSVNyTyIo2yuUC2KE7
// SIG // 5epedbkLZzZtEkxZ8dKT4FoRn9tjKDbT3lAY68KTx6b6
// SIG // VfQ1T9QuNPnirAnEPFGZNeinlkIaP9MRHG6Wsz2WEw0h
// SIG // dYQYAPnptTyTZZJut28Nv/AZlB8YmJYuAHFNzpscebHh
// SIG // aXll4sbzGCoY+WYlLDpiI45qEQ9ygqUu0TpBrfE1woGv
// SIG // GUEhCDJEshaUy5VL7CDnyncyTevi4EuvkBR40H5GBUNa
// SIG // CAuamCX8gvpHJ44HAXYm/YPL51G3YCtD3NMlfIQk4Uuo
// SIG // 9DkcJ7oJoYICCzCCAgcGCSqGSIb3DQEJBjGCAfgwggH0
// SIG // AgEBMHIwXjELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5
// SIG // bWFudGVjIENvcnBvcmF0aW9uMTAwLgYDVQQDEydTeW1h
// SIG // bnRlYyBUaW1lIFN0YW1waW5nIFNlcnZpY2VzIENBIC0g
// SIG // RzICEA7P9DjI/r81bgTYapgbGlAwCQYFKw4DAhoFAKBd
// SIG // MBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZI
// SIG // hvcNAQkFMQ8XDTE2MDkxMzE5MTY0MlowIwYJKoZIhvcN
// SIG // AQkEMRYEFEaKcXeI+Zi7cHwo0XYq+WHJIOIoMA0GCSqG
// SIG // SIb3DQEBAQUABIIBAAlvGR/5ZTGIFuPTB85m5WvJhZqy
// SIG // jMQtiFY98x5DVTv4le9YwEl3BNdsqe3evL1z+Kg9ROIv
// SIG // iHkTVcjx5EfdYkpUbIRiyjLiE5SbHpchXOQmWkGypOSE
// SIG // MVTTl9+W6odMY3o6vMjXfJzImejPq/IqSZNGIo7gP/1Q
// SIG // SaV0GOr05fuxfgklgSzVwHBEKKjUtCoFvbjvTfsPFSo8
// SIG // 3gLp6pqcmuxcYslbfMu3ix32PHtvw0VECcWVjPOmorrI
// SIG // X4mx7QvHXokHXs/T+kG8jXmiAq4KzdU21hdjeBtFZaW6
// SIG // Jt1Es2FKQAFqwsqeSxHfuDNC7s2jmPLpU2dMHQwvD3H/
// SIG // fc8JMgU=
// SIG // End signature block