本文整理汇总了C++中IProperties类的典型用法代码示例。如果您正苦于以下问题:C++ IProperties类的具体用法?C++ IProperties怎么用?C++ IProperties使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了IProperties类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: getTraversalKind
TraversalKind getTraversalKind (int argc, char* argv[])
{
const char* STR_TRAVERSAL_MODE = "-traversal";
TraversalKind result;
// We create a command line parser.
OptionsParser parser ("Traversal");
parser.push_back (new OptionOneParam (STR_TRAVERSAL_MODE, "traversal mode ('unitig' or 'contig'", true));
// We retrieve the traversal kind.
try
{
IProperties* props = parser.parse (argc, argv);
parse (props->getStr(STR_TRAVERSAL_MODE), result);
}
catch (OptionFailure& e)
{
e.displayErrors (std::cout);
exit (EXIT_FAILURE);
}
catch (Exception& e)
{
cout << e.getMessage() << endl;
exit (EXIT_FAILURE);
}
return result;
}
示例2: execute
void execute ()
{
IProperties* args = getInput();
u_int32_t seed1;
u_int32_t seed2;
u_int32_t dummy;
u_int8_t kmerSize1;
u_int8_t kmerSize2;
string inputFilename1 = args->getStr(STR_SIMKA_URI_INPUT_1);
string inputFilename2 = args->getStr(STR_SIMKA_URI_INPUT_2);
SimkaMinCommons::getKmerInfos(inputFilename1, kmerSize1, dummy, seed1, dummy);
SimkaMinCommons::getKmerInfos(inputFilename2, kmerSize2, dummy, seed2, dummy);
//size_t kmerSize = getInput()->getInt (STR_KMER_SIZE);
if(kmerSize1 != kmerSize2){
cerr << "ERROR: can't compare both sketches because of different kmer sizes (" << kmerSize1 << " and " << kmerSize2 << ")" << endl;
exit(1);
}
if(seed1 != seed2){
cerr << "ERROR: can't compare both sketches because of different seeds (" << seed1 << " and " << seed2 << ")" << endl;
exit(1);
}
//cout << seed1 << " " << seed2 << endl;
SimkaMinDistanceAlgorithm* algo = new SimkaMinDistanceAlgorithm(args);
algo->execute();
delete algo;
}
示例3: MakeStringException
StringBuffer& CLogThread::serializeRequest(IEspContext& context,IInterface& logInfo, StringBuffer& returnStr)
{
IRpcSerializable* rpcreq = dynamic_cast<IRpcSerializable*>(&logInfo);
if(rpcreq==NULL)
throw MakeStringException(500,"Issue serializing log information");
// We want to serialize anything here for logging purpose: e.g., internal user fields: CompanyId
// rpcreq->serialize(&context,returnStr, "LogData");
// rpcreq->serialize(NULL,returnStr, "LogData");
//BUG#26047
//logInfo function parameter is instance of the incoming request object of the service.
//instance objects of context and request are dependent upon the protocol binding.
//Request parameters are relevent for HTTP protocol but are not relevent for protocolX.
//Since request parameters pointer is not initilized in processing protocolX request it remains NULL
//and causing this crash.
IProperties* params = context.queryRequestParameters();
if(params!=NULL)
{
bool notInternal = !params->hasProp("internal");
if (notInternal)
params->setProp("internal","1");
rpcreq->serialize(&context,returnStr, "LogData");
if (notInternal)
params->removeProp("internal");
}else{
rpcreq->serialize(NULL,returnStr, "LogData");
}
return returnStr;
}
示例4: add_attr
void CRpcMessage::add_attr(const char * path, const char * name, const char * value, IProperties & attrs)
{
if ((path && *path) || (name && *name))
{
CSoapValue *par=m_params.get();
if(path)
par = par->get_value(path);
if (name)
par = par->get_value(name);
if (par)
{
Owned<IPropertyIterator> piter = attrs.getIterator();
for (piter->first(); piter->isValid(); piter->next())
{
const char *propkey = piter->getPropKey();
par->add_attribute(propkey, attrs.queryProp(propkey));
}
}
}
else
{
Owned<IPropertyIterator> piter = attrs.getIterator();
for (piter->first(); piter->isValid(); piter->next())
{
const char *propkey = piter->getPropKey();
add_attribute(propkey, attrs.queryProp(propkey));
}
}
}
示例5: main
int main (int argc, char* argv[])
{
// We create a command line parser.
OptionsParser parser ("SortingCount");
parser.push_back (new OptionOneParam (STR_URI_INPUT, "sorting count input", true));
try
{
// Shortcuts.
typedef Kmer<>::Count Count;
typedef Kmer<>::Type Type;
// We parse the user options.
IProperties* options = parser.parse (argc, argv);
// We load the object storing the couples [kmer,abundance]
Storage* storage = StorageFactory(STORAGE_HDF5).load (options->getStr(STR_URI_INPUT)); LOCAL (storage);
// We get the group inside the storage object
Group& dskGroup = storage->getGroup("dsk");
// We retrieve the partition holding the couples [kmer,abundance]
Partition<Count>& solidKmers = dskGroup.getPartition<Count> ("solid");
// Now, we read the couples in two ways, computing a checksum in each case.
Type checksum1, checksum2;
// CASE 1: we read the couples [kmer,abundance] with an iterator over the whole partition
Iterator<Count>* it = solidKmers.iterator(); LOCAL (it);
for (it->first(); !it->isDone(); it->next()) { checksum1 = checksum1 + it->item().value; }
// CASE 2: we read the couples [kmer,abundance] with an iterator over each collection of the partition
for (size_t i=0; i<solidKmers.size(); i++)
{
// We get the current collection inside the partition
Collection<Count>& collection = solidKmers [i];
Iterator<Count>* it = collection.iterator(); LOCAL (it);
for (it->first(); !it->isDone(); it->next()) { checksum2 = checksum2 + it->item().value; }
}
// We check that we got the same checksum
cout << "checksum1=" << checksum1 << endl;
cout << "checksum2=" << checksum1 << endl;
}
catch (OptionFailure& e)
{
return e.displayErrors (std::cout);
}
catch (Exception& e)
{
std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
}
return EXIT_SUCCESS;
}
示例6: main
int main (int argc, char* argv[])
{
/** We create a command line parser. */
OptionsParser parser ("BankFilter");
parser.push_back (new OptionOneParam (STR_URI_INPUT, "bank reference", true));
parser.push_back (new OptionOneParam (STR_URI_SEQ_IDS, "file holding indexes of bank", true));
try
{
/** We parse the user options. */
IProperties* options = parser.parse (argc, argv);
/** We read the list of indexes. */
set<size_t> indexes;
FILE* file = fopen (options->getStr(STR_URI_SEQ_IDS).c_str(), "r");
if (file != 0)
{
char buffer[128];
while (fgets (buffer, sizeof(buffer), file)) { indexes.insert (atoi(buffer)); }
fclose (file);
}
cout << "found " << indexes.size() << " indexes" << endl;
/** We open the output bank. */
string outputBankUri = options->getStr(STR_URI_INPUT) + "_" + System::file().getBaseName (options->getStr(STR_URI_SEQ_IDS));
IBank* outputBank = Bank::open (outputBankUri);
LOCAL (outputBank);
/** We loop the input bank. */
IBank* inputBank = Bank::open (options->getStr(STR_URI_INPUT));
LOCAL (inputBank);
/** We use another iterator for filtering out some sequences. */
FilterIterator<Sequence,FilterFunctor> itSeq (inputBank->iterator(), FilterFunctor(indexes));
/** We loop the sequences. */
for (itSeq.first(); !itSeq.isDone(); itSeq.next())
{
outputBank->insert (itSeq.item());
}
/** We flush the output bank. */
outputBank->flush();
}
catch (OptionFailure& e)
{
return e.displayErrors (cout);
}
catch (Exception& e)
{
cerr << "EXCEPTION: " << e.getMessage() << endl;
}
}
示例7: main
int main (int argc, char* argv[])
{
/** We create a command line parser. */
OptionsParser parser ("BankFilter");
parser.push_back (new OptionOneParam (STR_URI_INPUT, "bank input", true));
parser.push_back (new OptionOneParam (STR_FILTER_RATIO, "skip a sequence if 'good letters number / seq.len > X'", false, "0.8"));
try
{
/** We parse the user options. */
IProperties* options = parser.parse (argc, argv);
/** Shortcuts. */
double percentThreshold = options->getDouble(STR_FILTER_RATIO);
/** We open the input bank. */
IBank* inBank = Bank::open (options->getStr(STR_URI_INPUT));
LOCAL (inBank);
/** We create the output inBank. */
IBank* outBank = new BankFasta (options->getStr(STR_URI_INPUT) + "_filtered");
LOCAL (outBank);
/** We iterate the inBank. NOTE: WE USE A LAMBDA EXPRESSION HERE. */
inBank->iterate ([&] (Sequence& s)
{
/** Shortcut. */
char* data = s.getDataBuffer();
size_t nbOK = 0;
for (size_t i=0; i<s.getDataSize(); i++)
{
if (data[i]=='A' || data[i]=='C' || data[i]=='G' || data[i]=='T') { nbOK++; }
}
if ((double)nbOK / (double)s.getDataSize() > percentThreshold) { outBank->insert (s); }
});
/** We flush the output bank. */
outBank->flush();
}
catch (OptionFailure& e)
{
return e.displayErrors (cout);
}
catch (Exception& e)
{
cerr << "EXCEPTION: " << e.getMessage() << endl;
}
}
示例8: main
int main (int argc, char* argv[])
{
/** We create a command line parser. */
OptionsParser parser ("BankStats");
parser.push_back (new OptionOneParam (STR_URI_INPUT, "bank input", true));
try
{
/** We parse the user options. */
IProperties* options = parser.parse (argc, argv);
std::string filename = options->getStr(STR_URI_INPUT);
//! [snippet16_bank]
// We get an instance of IBank from the URI.
IBank* bank = Bank::open (filename);
//! [snippet16_seq]
// We create an iterator on the bank
Iterator<Sequence>* it = bank->iterator();
// We iterate the sequences of the bank
for (it->first(); !it->isDone(); it->next())
{
// We get a shortcut on the current sequence and its data
Sequence& seq = it->item();
Data& data = seq.getData();
// We dump some information about the sequence.
std::cout << "comment " << seq.getComment() << std::endl;
// We dump each nucleotide. NOTE: the output depends on the data encoding
for (size_t i=0; i<data.size(); i++) { std::cout << data[i]; } std::cout << std::endl;
}
//! [snippet16_seq]
// The bank and the iterator have been allocated on the heap, so we have to delete them
delete it;
delete bank;
//! [snippet16_bank]
}
catch (OptionFailure& e)
{
return e.displayErrors (std::cout);
}
catch (Exception& e)
{
std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
}
}
示例9: queueLog
bool CLogThread::queueLog(IEspContext & context,const char* serviceName, const char* request, const char* response)
{
IProperties* pProperties = context.queryRequestParameters();
StringBuffer UserID, UserRealm, UserReference, peer;
if(pProperties != NULL && pProperties->hasProp("userid_"))
UserID.appendf("%s",pProperties->queryProp("userid_"));
else
context.getUserID(UserID);
if(pProperties != NULL && pProperties->hasProp("fqdn_"))
UserRealm.appendf("%s",pProperties->queryProp("fqdn_"));
else
context.getRealm(UserRealm);
Owned<IPropertyTree> pLogTreeInfo = createPTreeFromXMLString(request, ipt_none, ptr_none);
IArrayOf<IEspLogInfo> LogArray;
addLogInfo(LogArray, *pLogTreeInfo.get());
if(pProperties != NULL && pProperties->hasProp("referencecode_"))
{
//lets manually add the reference number....
IClientLogInfo& LogInfoTransaction = addLogInfoElement(LogArray);
LogInfoTransaction.setName("referencenumber");
LogInfoTransaction.setValue(pProperties->queryProp("referencecode_"));
}
LOG_INFO _LogStruct(serviceName,-1,false);
return queueLog(UserID.str(), UserRealm.str() , context.getPeer(peer).str(),_LogStruct, LogArray );
}
示例10: main
int main (int argc, char* argv[])
{
/** We create a command line parser. */
OptionsParser parser ("BankStats");
parser.push_back (new OptionOneParam (STR_URI_INPUT, "bank input", true));
try
{
/** We parse the user options. */
IProperties* options = parser.parse (argc, argv);
// We get information about the bank.
u_int64_t nbSequences=0, dataSize=0, seqMaxSize=0, seqMinSize=~0;
// We declare an input Bank and use it locally
IBank* inputBank = Bank::open (options->getStr(STR_URI_INPUT));
LOCAL (inputBank);
ProgressIterator<Sequence> it (*inputBank, "iterate");
for (it.first(); !it.isDone(); it.next())
{
Data& data = it.item().getData();
nbSequences ++;
if (data.size() > seqMaxSize) { seqMaxSize = data.size(); }
if (data.size() < seqMinSize) { seqMinSize = data.size(); }
dataSize += data.size ();
}
std::cout << "data size : " << dataSize << std::endl;
std::cout << "sequence number : " << nbSequences << std::endl;
std::cout << "sequence max size : " << seqMaxSize << std::endl;
std::cout << "sequence min size : " << seqMinSize << std::endl;
}
catch (OptionFailure& e)
{
return e.displayErrors (std::cout);
}
catch (Exception& e)
{
std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
}
}
示例11: main
int main (int argc, char* argv[])
{
/** We create a command line parser. */
OptionsParser parser ("BankDump");
parser.push_back (new OptionOneParam (STR_URI_INPUT, "bank input", true));
try
{
/** We parse the user options. */
IProperties* options = parser.parse (argc, argv);
/** We dump the bank hierarchy. */
dump (Bank::open (options->getStr(STR_URI_INPUT)));
}
catch (OptionFailure& e)
{
return e.displayErrors (std::cout);
}
catch (Exception& e)
{
std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
}
}
示例12: main
int main (int argc, char* argv[])
{
/** We create a command line parser. */
OptionsParser parser ("bankgen");
const char* OUTPUT_PREFIX = "-out";
const char* SEQ_LEN = "-seq-len";
const char* READ_LEN = "-read-len";
const char* OVERLAP_LEN = "-overlap-len";
const char* COVERAGE = "-coverage";
parser.push_back (new OptionOneParam (OUTPUT_PREFIX, "output prefix", true));
parser.push_back (new OptionOneParam (SEQ_LEN, "sequence length", false, "1000000"));
parser.push_back (new OptionOneParam (READ_LEN, "read length", false, "150" ));
parser.push_back (new OptionOneParam (OVERLAP_LEN, "overlap between two reads", false, "50" ));
parser.push_back (new OptionOneParam (COVERAGE, "coverage", false, "3" ));
try
{
/** We parse the user options. */
IProperties* options = parser.parse (argc, argv);
/** We create the random sequence. */
IBank* randomBank = new BankRandom (1, options->getInt(SEQ_LEN));
LOCAL (randomBank);
/** We create the reads bank. */
IBank* readsBank = new BankSplitter (
randomBank,
options->getInt(READ_LEN),
options->getInt(OVERLAP_LEN),
options->getInt(COVERAGE)
);
LOCAL (readsBank);
/** We save the random bank. */
SaveAsFasta (randomBank, options->getStr(OUTPUT_PREFIX) + "_sequence.fa");
/** We save the reads bank. */
SaveAsFasta (readsBank, options->getStr(OUTPUT_PREFIX) + "_reads.fa");
}
catch (OptionFailure& e)
{
e.getParser().displayErrors (stdout);
e.getParser().displayHelp (stdout);
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
示例13: main
int main (int argc, char* argv[])
{
/** We create a command line parser. */
OptionsParser parser ("GraphStats");
parser.push_back (new OptionOneParam (STR_URI_GRAPH, "graph input", true));
parser.push_back (new OptionOneParam (STR_NB_CORES, "nb cores", false, "0"));
try
{
/** We parse the user options. */
IProperties* options = parser.parse (argc, argv);
// We load the graph
Graph graph = Graph::load (options->getStr(STR_URI_GRAPH));
// We set the number of cores to be used. Use all available cores if set to 0.
size_t nbCores = options->getInt(STR_NB_CORES);
// We get an iterator for branching nodes of the graph.
// We use a progress iterator to get some progress feedback
ProgressGraphIterator<BranchingNode,ProgressTimer> itBranching (graph.iterator<BranchingNode>(), "statistics");
// We define some kind of unique identifier for a couple (indegree,outdegree)
typedef pair<size_t,size_t> InOut_t;
// We want to gather some statistics during the iteration.
// Note the use of ThreadObject: this object will be cloned N times (one object per thread) and each clone will
// be reachable within the iteration block through ThreadObject::operator()
ThreadObject <map <InOut_t, size_t> > topology;
// We dispatch the iteration on several cores. Note the usage of lambda expression here.
IDispatcher::Status status = Dispatcher(nbCores).iterate (itBranching, [&] (const BranchingNode& node)
{
// We retrieve the current instance of map <InOut_t,size_t> for the current running thread.
map <InOut_t,size_t>& localTopology = topology();
// We get branching nodes neighbors for the current branching node.
Graph::Vector<BranchingEdge> successors = graph.successors <BranchingEdge> (node);
Graph::Vector<BranchingEdge> predecessors = graph.predecessors<BranchingEdge> (node);
// We increase the occurrences number for the current couple (in/out) neighbors
localTopology [make_pair(predecessors.size(), successors.size())] ++;
});
// Now, the parallel processing is done. We want now to aggregate the information retrieved
// in each thread in a single map.
// We get each map<InOut_t,size_t> object filled in each thread, and we add its data into the "global" map.
// The global map is reachable through the ThreadObject::operator*. The "topology.foreach" will loop over
// all cloned object used in the threads.
topology.foreach ([&] (const map <InOut_t, size_t>& t)
{
// We update the occurrence of the current couple (in/out)
for_each (t.begin(), t.end(), [&] (const pair<InOut_t, size_t>& p) { (*topology)[p.first] += p.second; });
});
// We sort the statistics by decreasing occurrence numbers. Since map have its own ordering, we need to put all
// the data into a vector and sort it with our own sorting criteria.
vector < pair<InOut_t,size_t> > stats;
for (auto it = topology->begin(); it != topology->end(); it++) { stats.push_back (*it); }
sort (stats.begin(), stats.end(), [=] (const pair<InOut_t,size_t>& a, const pair<InOut_t,size_t>& b) { return a.second > b.second; });
printf ("\nThere are %d branching nodes with the following distribution: \n", itBranching.size());
size_t sum=0;
for (size_t i=0; i<stats.size(); i++)
{
sum += stats[i].second;
printf (" [in=%d out=%d] nb=%7d percent=%5.2f distrib=%5.2f\n",
stats[i].first.first,
stats[i].first.second,
stats[i].second,
100.0*(float)stats[i].second / (float)itBranching.size(),
100.0*(float)sum / (float)itBranching.size()
);
}
printf ("\nDone on %d cores in %.2f sec\n\n", status.nbCores, (float)status.time/1000.0);
}
catch (OptionFailure& e)
{
return e.displayErrors (std::cout);
}
catch (Exception& e)
{
std::cerr << "EXCEPTION: " << e.getMessage() << std::endl;
}
return EXIT_SUCCESS;
}
示例14: xsltFileName
int CFileSpraySoapBindingEx::onGetInstantQuery(IEspContext &context, CHttpRequest* request, CHttpResponse* response, const char *service, const char *method)
{
bool permission = true;
bool bDownloadFile = false;
bool bProcess;
StringBuffer sourceLogicalFile;
StringBuffer methodbuf;
StringBuffer submethod;
StringBuffer xsltFileName(getCFD());
xsltFileName.append("smc_xslt/");
if (stricmp(method, "SprayFixedInput")==0)
{
if (!context.validateFeatureAccess(FILE_SPRAY_URL, SecAccess_Write, false))
permission = false;
bProcess = true;
xsltFileName.append("fs_sprayForm.xslt");
methodbuf.append("SprayFixed");
}
else if(stricmp(method, "SprayVariableInput")==0)
{
if (!context.validateFeatureAccess(FILE_SPRAY_URL, SecAccess_Write, false))
permission = false;
bProcess = true;
xsltFileName.append("fs_sprayForm.xslt");
methodbuf.append("SprayVariable");
request->getParameter("submethod", submethod);
}
else if (stricmp(method, "DesprayInput")==0)
{
if (!context.validateFeatureAccess(FILE_DESPRAY_URL, SecAccess_Write, false))
permission = false;
request->getParameter("sourceLogicalName", sourceLogicalFile);
xsltFileName.append("fs_desprayCopyForm.xslt");
methodbuf.append("Despray");
bProcess = true;
}
else if (stricmp(method, "CopyInput") == 0)
{
if (!context.validateFeatureAccess(FILE_SPRAY_URL, SecAccess_Write, false))
permission = false;
request->getParameter("sourceLogicalName", sourceLogicalFile);
xsltFileName.append("fs_desprayCopyForm.xslt");
methodbuf.append("Copy");
bProcess = true;
}
else if (stricmp(method, "RenameInput") == 0)
{
if (!context.validateFeatureAccess(FILE_SPRAY_URL, SecAccess_Write, false))
permission = false;
request->getParameter("sourceLogicalName", sourceLogicalFile);
xsltFileName.append("fs_renameForm.xslt");
methodbuf.append("Rename");
bProcess = true;
}
else if (stricmp(method, "DownloadFile") == 0)
{
if (!context.validateFeatureAccess(FILE_SPRAY_URL, SecAccess_Full, false))
permission = false;
downloadFile(context, request, response);
bDownloadFile = true;
bProcess = true;
}
else
bProcess = false;
if (bProcess)
{
if (bDownloadFile)
return 0;
StringBuffer xml;
Owned<IProperties> params(createProperties());
if (!permission)
{
params->setProp("@method", methodbuf.str());
xml.append("<Environment><ErrorMessage>Permission denied.</ErrorMessage></Environment>");
}
else
{
if(submethod.length() > 0)
params->setProp("@submethod", submethod.str());
params->setProp("@method", methodbuf.str());
if (*sourceLogicalFile.str())
{
params->setProp("@sourceLogicalName", sourceLogicalFile.str());
Owned<IUserDescriptor> userdesc;
StringBuffer username;
context.getUserID(username);
if(username.length() > 0)
{
const char* passwd = context.queryPassword();
//.........这里部分代码省略.........
示例15: catch
/*********************************************************************
** METHOD :
** PURPOSE :
** INPUT :
** OUTPUT :
** RETURN :
** REMARKS :
*********************************************************************/
IProperties* ToolComposite::run (int argc, char* argv[])
{
vector<IProperties*> inputs;
/** We first parse the options for all tools. */
for (list<Tool*>::iterator it = _tools.begin(); it != _tools.end(); it++)
{
#if 0
/** We get the parameters from the current parser. */
IProperties* input = (*it)->getParser()->parse (argc, argv);
/** We add the input into the vector that gather the tools inputs. */
inputs.push_back (input);
#else
try
{
/** We parse the user parameters. */
(*it)->getParser()->parse (argc, argv);
IProperties* input = (*it)->getParser()->getProperties() ;
/** We add the input into the vector that gather the tools inputs. */
inputs.push_back (input);
}
catch (OptionFailure& e)
{
IProperties* input = (*it)->getParser()->getProperties() ;
/** We add the input into the vector that gather the tools inputs. */
inputs.push_back (input);
// e.getParser().displayErrors (stdout);
// e.getParser().displayHelp (stdout);
// return NULL;
}
#endif
}
IProperties* output = 0;
size_t idx = 0;
for (list<Tool*>::iterator it = _tools.begin(); it != _tools.end(); it++, idx++)
{
/** We get the parameters from the current inputs entry. */
IProperties* input = inputs[idx];
/** We may have to add the output of the previous tool to the input of the current tool.
* WARNING! The output of the previous tool should have a bigger priority than the
* user parameters of the current tool.
*/
IProperties* actualInput = 0;
if (output != 0)
{
actualInput = new Properties();
actualInput->add (1, output); // output of the previous tool
actualInput->add (1, input); // input of the previous tool
}
else
{
actualInput = input;
}
/** We run the tool and get a reference on its output. */
output = (*it)->run (actualInput);
/** We add the current tool info to the global properties. */
_info->add (1, (*it)->getInfo());
}
/** We return the output properties. */
return _output;
}