00001
00006 #include "system.h"
00007
00008 #include <rpmcli.h>
00009 #include <rpmbuild.h>
00010 #include <rpmgi.h>
00011
00012 #include "debug.h"
00013
00014
00015 struct rpmQVKArguments_s rpmQVKArgs;
00016
00017
00018 int specedit = 0;
00019
00020 #define POPT_QUERYFORMAT -1000
00021 #define POPT_WHATREQUIRES -1001
00022 #define POPT_WHATPROVIDES -1002
00023 #define POPT_QUERYBYNUMBER -1003
00024 #define POPT_TRIGGEREDBY -1004
00025 #define POPT_DUMP -1005
00026 #define POPT_SPECFILE -1006
00027 #define POPT_QUERYBYPKGID -1007
00028 #define POPT_QUERYBYHDRID -1008
00029 #define POPT_QUERYBYFILEID -1009
00030 #define POPT_QUERYBYTID -1010
00031 #define POPT_HDLIST -1011
00032 #define POPT_FTSWALK -1012
00033
00034
00035 #define POPT_TRUST -1037
00036 #define POPT_WHATNEEDS -1038
00037 #define POPT_SPECSRPM -1039
00038
00039
00040 static void rpmQVSourceArgCallback( poptContext con,
00041 enum poptCallbackReason reason,
00042 const struct poptOption * opt, const char * arg,
00043 const void * data)
00044
00045
00046 {
00047 QVA_t qva = &rpmQVKArgs;
00048
00049 switch (opt->val) {
00050 case 'q':
00051 case 'Q':
00052 case 'V':
00053 case 'A':
00054 case 'D':
00055 case 'I':
00056 case 'K':
00057 case 'R':
00058 if (qva->qva_mode == '\0' || strchr("qQ ", qva->qva_mode)) {
00059 qva->qva_mode = opt->val;
00060 qva->qva_char = ' ';
00061 }
00062 break;
00063 case 'a': qva->qva_source |= RPMQV_ALL; qva->qva_sourceCount++; break;
00064 case 'f': qva->qva_source |= RPMQV_PATH; qva->qva_sourceCount++; break;
00065 case 'g': qva->qva_source |= RPMQV_GROUP; qva->qva_sourceCount++; break;
00066 case 'p': qva->qva_source |= RPMQV_RPM; qva->qva_sourceCount++; break;
00067 case POPT_WHATNEEDS: qva->qva_source |= RPMQV_WHATNEEDS;
00068 qva->qva_sourceCount++; break;
00069 case POPT_WHATPROVIDES: qva->qva_source |= RPMQV_WHATPROVIDES;
00070 qva->qva_sourceCount++; break;
00071 case POPT_WHATREQUIRES: qva->qva_source |= RPMQV_WHATREQUIRES;
00072 qva->qva_sourceCount++; break;
00073 case POPT_TRIGGEREDBY: qva->qva_source |= RPMQV_TRIGGEREDBY;
00074 qva->qva_sourceCount++; break;
00075 case POPT_QUERYBYPKGID: qva->qva_source |= RPMQV_PKGID;
00076 qva->qva_sourceCount++; break;
00077 case POPT_QUERYBYHDRID: qva->qva_source |= RPMQV_HDRID;
00078 qva->qva_sourceCount++; break;
00079 case POPT_QUERYBYFILEID: qva->qva_source |= RPMQV_FILEID;
00080 qva->qva_sourceCount++; break;
00081 case POPT_QUERYBYTID: qva->qva_source |= RPMQV_TID;
00082 qva->qva_sourceCount++; break;
00083 case POPT_HDLIST: qva->qva_source |= RPMQV_HDLIST;
00084 qva->qva_sourceCount++; break;
00085 case POPT_FTSWALK:qva->qva_source |= RPMQV_FTSWALK;
00086 qva->qva_sourceCount++; break;
00087
00088
00089 case POPT_SPECFILE:
00090 qva->qva_source |= RPMQV_SPECFILE;
00091 qva->qva_sourceCount++;
00092 break;
00093
00094 case POPT_SPECSRPM:
00095 qva->qva_source |= RPMQV_SPECSRPM;
00096 qva->qva_sourceCount++;
00097 break;
00098 case POPT_QUERYBYNUMBER:
00099 qva->qva_source |= RPMQV_DBOFFSET;
00100 qva->qva_sourceCount++;
00101 break;
00102 }
00103 }
00104
00108
00109 struct poptOption rpmQVSourcePoptTable[] = {
00110
00111 { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA,
00112 rpmQVSourceArgCallback, 0, NULL, NULL },
00113
00114 { "all", 'a', 0, 0, 'a',
00115 N_("query/verify all packages"), NULL },
00116 { "checksig", 'K', POPT_ARGFLAG_DOC_HIDDEN, NULL, 'K',
00117 N_("rpm checksig mode"), NULL },
00118 { "file", 'f', 0, 0, 'f',
00119 N_("query/verify package(s) owning file"), "FILE" },
00120 { "group", 'g', 0, 0, 'g',
00121 N_("query/verify package(s) in group"), "GROUP" },
00122 { "package", 'p', 0, 0, 'p',
00123 N_("query/verify a package file"), NULL },
00124
00125 { "ftswalk", 'W', 0, 0, POPT_FTSWALK,
00126 N_("query/verify package(s) from TOP file tree walk"), "TOP" },
00127 { "hdlist", 'H', POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_HDLIST,
00128 N_("query/verify package(s) from system HDLIST"), "HDLIST" },
00129
00130 { "pkgid", '\0', 0, 0, POPT_QUERYBYPKGID,
00131 N_("query/verify package(s) with package identifier"), "MD5" },
00132 { "hdrid", '\0', 0, 0, POPT_QUERYBYHDRID,
00133 N_("query/verify package(s) with header identifier"), "SHA1" },
00134 { "fileid", '\0', 0, 0, POPT_QUERYBYFILEID,
00135 N_("query/verify package(s) with file identifier"), "MD5" },
00136
00137 { "query", 'q', POPT_ARGFLAG_DOC_HIDDEN, NULL, 'q',
00138 N_("rpm query mode"), NULL },
00139 { "querybynumber", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_QUERYBYNUMBER,
00140 N_("query/verify a header instance"), "HDRNUM" },
00141 { "specfile", '\0', 0, 0, POPT_SPECFILE,
00142 N_("query a spec file"), N_("<spec>") },
00143 { "specsrpm", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_SPECSRPM,
00144 N_("query source metadata from spec file parse"), N_("<spec>") },
00145 { "tid", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_QUERYBYTID,
00146 N_("query/verify package(s) from install transaction"), "TID" },
00147 { "triggeredby", '\0', 0, 0, POPT_TRIGGEREDBY,
00148 N_("query the package(s) triggered by the package"), "PACKAGE" },
00149 { "verify", 'V', POPT_ARGFLAG_DOC_HIDDEN, NULL, 'V',
00150 N_("rpm verify mode"), NULL },
00151 { "whatrequires", '\0', 0, 0, POPT_WHATREQUIRES,
00152 N_("query/verify the package(s) which require a dependency"), "CAPABILITY" },
00153 { "whatneeds", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_WHATNEEDS,
00154 N_("query/verify the package(s) which require any contained provide"),
00155 "CAPABILITY" },
00156
00157 { "whatprovides", '\0', 0, 0, POPT_WHATPROVIDES,
00158 N_("query/verify the package(s) which provide a dependency"), "CAPABILITY" },
00159
00160 { "transaction", 'T', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN, &giFlags, (RPMGI_TSADD|RPMGI_TSORDER),
00161 N_("create transaction set"), NULL},
00162 { "noorder", '\0', POPT_BIT_CLR|POPT_ARGFLAG_DOC_HIDDEN, &giFlags, RPMGI_TSORDER,
00163 N_("do not order transaction set"), NULL},
00164 { "noglob", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN, &giFlags, RPMGI_NOGLOB,
00165 N_("do not glob arguments"), NULL},
00166 { "nomanifest", '\0', POPT_BIT_SET, &giFlags, RPMGI_NOMANIFEST,
00167 N_("do not process non-package files as manifests"), NULL},
00168 { "noheader", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN, &giFlags, RPMGI_NOHEADER,
00169 N_("do not read headers"), NULL},
00170
00171
00172 POPT_TABLEEND
00173 };
00174
00175
00176
00177 static void queryArgCallback(poptContext con,
00178 enum poptCallbackReason reason,
00179 const struct poptOption * opt, const char * arg,
00180 const void * data)
00181
00182
00183 {
00184 QVA_t qva = &rpmQVKArgs;
00185
00186 switch (opt->val) {
00187 case 'c': qva->qva_flags |= QUERY_FOR_CONFIG | QUERY_FOR_LIST; break;
00188 case 'd': qva->qva_flags |= QUERY_FOR_DOCS | QUERY_FOR_LIST; break;
00189 case 'l': qva->qva_flags |= QUERY_FOR_LIST; break;
00190 case 's': qva->qva_flags |= QUERY_FOR_STATE | QUERY_FOR_LIST;
00191 break;
00192 case POPT_DUMP: qva->qva_flags |= QUERY_FOR_DUMPFILES | QUERY_FOR_LIST;
00193 break;
00194
00195 case POPT_QUERYFORMAT:
00196 if (arg) {
00197 char * qf = (char *)qva->qva_queryFormat;
00198
00199 if (qf) {
00200 int len = strlen(qf) + strlen(arg) + 1;
00201 qf = xrealloc(qf, len);
00202
00203 strcat(qf, arg);
00204
00205 } else {
00206 qf = xmalloc(strlen(arg) + 1);
00207 strcpy(qf, arg);
00208 }
00209
00210 qva->qva_queryFormat = qf;
00211 }
00212 break;
00213
00214 case 'i':
00215 if (qva->qva_mode == 'q') {
00216
00217 const char * infoCommand[] = { "--info", NULL };
00218
00219 (void) poptStuffArgs(con, infoCommand);
00220 }
00221 break;
00222
00223 case RPMCLI_POPT_NODIGEST:
00224 qva->qva_flags |= VERIFY_DIGEST;
00225 break;
00226
00227 case RPMCLI_POPT_NOSIGNATURE:
00228 qva->qva_flags |= VERIFY_SIGNATURE;
00229 break;
00230
00231 case RPMCLI_POPT_NOHDRCHK:
00232 qva->qva_flags |= VERIFY_HDRCHK;
00233 break;
00234
00235 case RPMCLI_POPT_NODEPS:
00236 qva->qva_flags |= VERIFY_DEPS;
00237 break;
00238
00239 case RPMCLI_POPT_NOFDIGESTS:
00240 qva->qva_flags |= VERIFY_FDIGEST;
00241 break;
00242
00243 case RPMCLI_POPT_NOCONTEXTS:
00244 qva->qva_flags |= VERIFY_CONTEXTS;
00245 break;
00246
00247 #ifdef NOTYET
00248 case RPMCLI_POPT_FORCE:
00249 ia->probFilter |=
00250 ( RPMPROB_FILTER_REPLACEPKG
00251 | RPMPROB_FILTER_REPLACEOLDFILES
00252 | RPMPROB_FILTER_REPLACENEWFILES
00253 | RPMPROB_FILTER_OLDPACKAGE );
00254 break;
00255 #endif
00256
00257 case RPMCLI_POPT_NOSCRIPTS:
00258 qva->qva_flags |= VERIFY_SCRIPT;
00259 break;
00260
00261
00262 case POPT_TRUST:
00263 { char * end = NULL;
00264 long trust = (int) strtol(arg, &end, 0);
00265
00266
00267 qva->trust = trust;
00268 } break;
00269 }
00270 }
00271
00275
00276 struct poptOption rpmQueryPoptTable[] = {
00277
00278 { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA | POPT_CBFLAG_CONTINUE,
00279 queryArgCallback, 0, NULL, NULL },
00280
00281 { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmQVSourcePoptTable, 0,
00282 NULL, NULL },
00283 { "configfiles", 'c', 0, 0, 'c',
00284 N_("list all configuration files"), NULL },
00285 { "docfiles", 'd', 0, 0, 'd',
00286 N_("list all documentation files"), NULL },
00287 { "dump", '\0', 0, 0, POPT_DUMP,
00288 N_("dump basic file information"), NULL },
00289 { NULL, 'i', POPT_ARGFLAG_DOC_HIDDEN, 0, 'i',
00290 NULL, NULL },
00291 { "list", 'l', 0, 0, 'l',
00292 N_("list files in package"), NULL },
00293
00294 { "aid", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00295 &rpmQVKArgs.depFlags, RPMDEPS_FLAG_ADDINDEPS,
00296 N_("add suggested packages to transaction"), NULL },
00297
00298
00299 { "noconfig", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00300 &rpmQVKArgs.qva_fflags, RPMFILE_CONFIG,
00301 N_("skip %%config files"), NULL },
00302 { "nodoc", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00303 &rpmQVKArgs.qva_fflags, RPMFILE_DOC,
00304 N_("skip %%doc files"), NULL },
00305 { "noghost", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00306 &rpmQVKArgs.qva_fflags, RPMFILE_GHOST,
00307 N_("skip %%ghost files"), NULL },
00308 #ifdef NOTEVER
00309 { "nolicense", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00310 &rpmQVKArgs.qva_fflags, RPMFILE_LICENSE,
00311 N_("skip %%license files"), NULL },
00312 { "noreadme", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00313 &rpmQVKArgs.qva_fflags, RPMFILE_README,
00314 N_("skip %%readme files"), NULL },
00315 #endif
00316
00317 { "qf", '\0', POPT_ARG_STRING | POPT_ARGFLAG_DOC_HIDDEN, 0,
00318 POPT_QUERYFORMAT, NULL, NULL },
00319 { "queryformat", '\0', POPT_ARG_STRING, 0, POPT_QUERYFORMAT,
00320 N_("use the following query format"), N_("QUERYFORMAT") },
00321 { "specedit", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &specedit, -1,
00322 N_("substitute i18n sections into spec file"), NULL },
00323 { "state", 's', 0, 0, 's',
00324 N_("display the states of the listed files"), NULL },
00325 { "target", '\0', POPT_ARG_STRING|POPT_ARGFLAG_DOC_HIDDEN, 0, RPMCLI_POPT_TARGETPLATFORM,
00326 N_("specify target platform"), N_("CPU-VENDOR-OS") },
00327 POPT_TABLEEND
00328 };
00329
00333 struct poptOption rpmVerifyPoptTable[] = {
00334
00335 { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA | POPT_CBFLAG_CONTINUE,
00336 queryArgCallback, 0, NULL, NULL },
00337
00338 { NULL, '\0', POPT_ARG_INCLUDE_TABLE, rpmQVSourcePoptTable, 0,
00339 NULL, NULL },
00340
00341 { "aid", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00342 &rpmQVKArgs.depFlags, RPMDEPS_FLAG_ADDINDEPS,
00343 N_("add suggested packages to transaction"), NULL },
00344
00345
00346 { "noconfig", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00347 &rpmQVKArgs.qva_fflags, RPMFILE_CONFIG,
00348 N_("skip %%config files"), NULL },
00349 { "nodoc", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00350 &rpmQVKArgs.qva_fflags, RPMFILE_DOC,
00351 N_("skip %%doc files"), NULL },
00352
00353
00355 #ifdef DYING
00356 { "nomd5", '\0', POPT_BIT_SET, &rpmQVKArgs.qva_flags, VERIFY_FDIGEST,
00357 N_("don't verify file digests"), NULL },
00358 #else
00359 { "nomd5", '\0', POPT_ARGFLAG_DOC_HIDDEN, NULL, RPMCLI_POPT_NOFDIGESTS,
00360 N_("don't verify file digests"), NULL },
00361 { "nofdigests", '\0', 0, NULL, RPMCLI_POPT_NOFDIGESTS,
00362 N_("don't verify file digests"), NULL },
00363 #endif
00364 { "nosize", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00365 &rpmQVKArgs.qva_flags, VERIFY_SIZE,
00366 N_("don't verify size of files"), NULL },
00367 { "nolinkto", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00368 &rpmQVKArgs.qva_flags, VERIFY_LINKTO,
00369 N_("don't verify symlink path of files"), NULL },
00370 { "nouser", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00371 &rpmQVKArgs.qva_flags, VERIFY_USER,
00372 N_("don't verify owner of files"), NULL },
00373 { "nogroup", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00374 &rpmQVKArgs.qva_flags, VERIFY_GROUP,
00375 N_("don't verify group of files"), NULL },
00376 { "nomtime", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00377 &rpmQVKArgs.qva_flags, VERIFY_MTIME,
00378 N_("don't verify modification time of files"), NULL },
00379 { "nomode", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00380 &rpmQVKArgs.qva_flags, VERIFY_MODE,
00381 N_("don't verify mode of files"), NULL },
00382 { "nordev", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00383 &rpmQVKArgs.qva_flags, VERIFY_RDEV,
00384 N_("don't verify mode of files"), NULL },
00385
00386 { "nocontexts", '\0', POPT_ARGFLAG_DOC_HIDDEN, NULL, RPMCLI_POPT_NOCONTEXTS,
00387 N_("don't verify file security contexts"), NULL },
00388 { "nofiles", '\0', POPT_BIT_SET, &rpmQVKArgs.qva_flags, VERIFY_FILES,
00389 N_("don't verify files in package"), NULL},
00390 #ifdef DYING
00391 { "nodeps", '\0', POPT_BIT_SET, &rpmQVKArgs.qva_flags, VERIFY_DEPS,
00392 N_("don't verify package dependencies"), NULL },
00393 #else
00394 { "nodeps", '\0', 0, NULL, RPMCLI_POPT_NODEPS,
00395 N_("don't verify package dependencies"), NULL },
00396 #endif
00397
00398 #ifdef DYING
00399 { "noscript", '\0', POPT_BIT_SET,&rpmQVKArgs.qva_flags, VERIFY_SCRIPT,
00400 N_("don't execute verify script(s)"), NULL },
00401
00402 { "noscripts", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00403 &rpmQVKArgs.qva_flags, VERIFY_SCRIPT,
00404 N_("don't execute verify script(s)"), NULL },
00405 #else
00406 { "noscript", '\0', 0, NULL, RPMCLI_POPT_NOSCRIPTS,
00407 N_("don't execute verify script(s)"), NULL },
00408
00409 { "noscripts", '\0', POPT_ARGFLAG_DOC_HIDDEN, NULL, RPMCLI_POPT_NOSCRIPTS,
00410 N_("don't execute verify script(s)"), NULL },
00411 #endif
00412
00413 #ifdef DYING
00414 { "nodigest", '\0', POPT_BIT_SET, &rpmQVKArgs.qva_flags, VERIFY_DIGEST,
00415 N_("don't verify package digest(s)"), NULL },
00416 { "nohdrchk", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00417 &rpmQVKArgs.qva_flags, VERIFY_HDRCHK,
00418 N_("don't verify database header(s) when retrieved"), NULL },
00419 { "nosignature", '\0', POPT_BIT_SET,
00420 &rpmQVKArgs.qva_flags, VERIFY_SIGNATURE,
00421 N_("don't verify package signature(s)"), NULL },
00422 #else
00423 { "nodigest", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, RPMCLI_POPT_NODIGEST,
00424 N_("don't verify package digest(s)"), NULL },
00425 { "nohdrchk", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, RPMCLI_POPT_NOHDRCHK,
00426 N_("don't verify database header(s) when retrieved"), NULL },
00427 { "nosignature", '\0', POPT_ARGFLAG_DOC_HIDDEN, 0, RPMCLI_POPT_NOSIGNATURE,
00428 N_("don't verify package signature(s)"), NULL },
00429 #endif
00430
00431 POPT_TABLEEND
00432 };
00433
00437
00438 struct poptOption rpmSignPoptTable[] = {
00439
00440 { NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA | POPT_CBFLAG_CONTINUE,
00441 rpmQVSourceArgCallback, 0, NULL, NULL },
00442
00443 { "addsign", '\0', 0, NULL, 'A',
00444 N_("sign package(s) (identical to --resign)"), NULL },
00445 { "checksig", 'K', 0, NULL, 'K',
00446 N_("verify package signature(s)"), NULL },
00447 { "delsign", '\0', 0, NULL, 'D',
00448 N_("delete package signatures"), NULL },
00449 { "import", '\0', 0, NULL, 'I',
00450 N_("import an armored public key"), NULL },
00451 { "resign", '\0', 0, NULL, 'R',
00452 N_("sign package(s) (identical to --addsign)"), NULL },
00453 { "sign", '\0', POPT_ARGFLAG_DOC_HIDDEN, &rpmQVKArgs.sign, 0,
00454 N_("generate signature"), NULL },
00455
00456 { "trust", '\0', POPT_ARG_STRING|POPT_ARGFLAG_DOC_HIDDEN, 0, POPT_TRUST,
00457 N_("specify trust metric"), "TRUST" },
00458 { "trusted", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN,
00459 &rpmQVKArgs.trust, 1,
00460 N_("set ultimate trust when importing pubkey(s)"), NULL },
00461 { "untrusted", '\0', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN,
00462 &rpmQVKArgs.trust, -1,
00463 N_("unset ultimate trust when importing pubkey(s)"), NULL },
00464
00465 { "nodigest", '\0', POPT_BIT_SET, &rpmQVKArgs.qva_flags, VERIFY_DIGEST,
00466 N_("don't verify package digest(s)"), NULL },
00467 { "nohdrchk", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN,
00468 &rpmQVKArgs.qva_flags, VERIFY_HDRCHK,
00469 N_("don't verify database header(s) when retrieved"), NULL },
00470 { "nosignature", '\0', POPT_BIT_SET, &rpmQVKArgs.qva_flags, VERIFY_SIGNATURE,
00471 N_("don't verify package signature(s)"), NULL },
00472
00473 POPT_TABLEEND
00474 };