﻿<?xml version="1.0" encoding="utf-8"?><Root><Survey VersionNumber="2" VersionName="1.31.0"><SurveyID>3f9c21ff-1cd6-4955-be7e-6bc6e67177f9</SurveyID><OrgId>dc898d62-8e61-4e32-b3aa-ad72d9740914</OrgId><SurveyName>GPS-Force Capture</SurveyName><Description>[no description]</Description><Sealed>False</Sealed><Creator>Dooblo</Creator><TimeCreated>635366906954100000</TimeCreated><TimeModified>635553779299089267</TimeModified><TimeSealed>3155378903999970000</TimeSealed><Randomed>True</Randomed><HalfRandomed>False</HalfRandomed><NextQuestionID>4</NextQuestionID><ReadOnly>False</ReadOnly><Deleted>0</Deleted><ULAssembly /><ULClassName>SurveyToGo.UserLogic.Creator.SurveyLogicTempl</ULClassName><ULSource>&lt;?xml version="1.0" encoding="utf-16"?&gt;
&lt;UserLogicContents xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
  &lt;Items&gt;
    &lt;HData&gt;
      &lt;HTp&gt;ehtQuestion&lt;/HTp&gt;
      &lt;STp&gt;estLast&lt;/STp&gt;
      &lt;CTp&gt;echtLast&lt;/CTp&gt;
      &lt;QTp&gt;eqhtValidationRule&lt;/QTp&gt;
      &lt;Key&gt;1&lt;/Key&gt;
      &lt;Name&gt;HandleQuestionValidate_1&lt;/Name&gt;
      &lt;Behv&gt;ecsbDefault&lt;/Behv&gt;
      &lt;QDep /&gt;
      &lt;CDep /&gt;
    &lt;/HData&gt;
    &lt;HData&gt;
      &lt;HTp&gt;ehtQuestion&lt;/HTp&gt;
      &lt;STp&gt;estLast&lt;/STp&gt;
      &lt;CTp&gt;echtLast&lt;/CTp&gt;
      &lt;QTp&gt;eqhtStart&lt;/QTp&gt;
      &lt;Key&gt;2&lt;/Key&gt;
      &lt;Name&gt;QuestionStart_2&lt;/Name&gt;
      &lt;Behv&gt;ecsbDefault&lt;/Behv&gt;
      &lt;QDep /&gt;
      &lt;CDep /&gt;
    &lt;/HData&gt;
    &lt;HData&gt;
      &lt;HTp&gt;ehtQuestion&lt;/HTp&gt;
      &lt;STp&gt;estLast&lt;/STp&gt;
      &lt;CTp&gt;echtLast&lt;/CTp&gt;
      &lt;QTp&gt;eqhtStart&lt;/QTp&gt;
      &lt;Key&gt;1&lt;/Key&gt;
      &lt;Name&gt;QuestionStart_1&lt;/Name&gt;
      &lt;Behv&gt;ecsbDefault&lt;/Behv&gt;
      &lt;QDep /&gt;
      &lt;CDep /&gt;
    &lt;/HData&gt;
  &lt;/Items&gt;
  &lt;Source&gt;	function StartSurvey()
	{
		/*_@_SS_START_@*/

		/*_@_SS_END_@*/
	}

	/*_@_USERCODE_START_@*/
function DanielSumNumericGrid(inQ)
{
	var retVal=0;
	var numOfTopics=GetTopicCount(inQ);
	var i;
	
	for(i=1; i&amp;lt;=numOfTopics; i++)
	{
		if (IsTopicVisible(inQ,i)) {
			retVal+=AnswerChoice(inQ,i);
		}
	}
	Prompt("Kuku")
	return retVal;
}

//Ipsos Brazil

/*	Nome da Função:	IsRange
	Programador:	Clayton
	Data:			00/00/0000
	Descrição:		Checar se existe um valor de-para
	Tipo Quest:		Single e Mult
	Exemplo:		IsRange(QRef(5), 18, 24);
*/
	function IsRange(inQIdx, inBegin, inEnd) {
		var retVal = false;
		for (var j = inBegin; j &amp;lt;= inEnd; j++) {
			if (Contains(inQIdx, j)) {
				retVal = true; break; }
		}
		return retVal;
	}

/*	Nome da Função:	IsRangeIter
	Programador:	Clayton
	Data:			00/00/0000
	Descrição:		Checar se existe um valor de-para em um Iter
	Tipo Quest:		Single e Mult Iter
	Exemplo:		IsRange(QRef(5), 18, 24);
*/
	function IsRangeIter(inQIdx, inIter, inBegin, inEnd) {
		var retVal = false;
		for (var j = inBegin; j &amp;lt;= inEnd; j++) {
			if (ContainsIter(inQIdx, j, inIter)) {
				retVal = true; break; }
		}
		return retVal;
	}


/*	Nome da Função:	IsRangeChoice
	Programador:	Clayton
	Data:			00/00/0000
	Descrição:		Checar se existe um valor de-para em questões Topics
	Tipo Quest:		Topics
	Exemplo:		IsRangeChoice(QRef(5), 1, 1,5);
*/
	function IsRangeChoice(inQIdx, inAnsIdx, inBegin, inEnd) {
		var retVal = false;
		for (var j = inBegin; j &amp;lt;=inEnd; j++) {
			if (AnswerChoice(inQIdx, inAnsIdx) == j) {
				retVal = true; break; }
		}
		return retVal;
	}

/*	Nome da Função:	checkMail
	Programador:	Internet (desconhecido)
	Data:			00/00/0000
	Descrição:		Checar se o email é válido
	Tipo Quest:		Strings
	Exemplo:		checkMail(Answer(100)); // checkMail(SelectedAnswerText(100));
*/
	function checkMail(mail) {
		var er = new RegExp(/^[A-Za-z0-9_\-\.]+@[A-Za-z0-9_\-\.]{2,}\.[A-Za-z0-9]{2,}(\.[A-Za-z0-9])?/);
		if (typeof(mail) == "string"){
			if (er.test(mail)) { return true; }
		} else if (typeof(mail) == "object"){
			if (er.test(mail.value)){ 
				return true; 
			}
		} else {
			return false;
			}
	}

/*	Nome da Função:	IsRight
	Programador:	Internet (desconhecido)
	Data:			00/00/0000
	Descrição:		Buscar valor À Direita
	Tipo Quest:		Strings
	Exemplo:		IsRight(Answer(100)); // IsRight(SelectedAnswerText(100));
*/
	function IsRight(str, n) {
		str = str.ToString();
		if (n &amp;lt;= 0)
			{ return ""; }
		else if (n &amp;gt; String(str).length)
			{ return str;}
		else {
			var iLen = String(str).length;
			return String(str).substring(iLen, iLen - n);
			}
	}

/*	Nome da Função:	IsLeft
	Programador:	Internet (desconhecido)
	Data:			00/00/0000
	Descrição:		Buscar valor À Esquerda
	Tipo Quest:		Strings
	Exemplo:		IsLeft(Answer(100)); // IsLeft(SelectedAnswerText(100));
*/
	function IsLeft(str, n) {
		str = str.ToString();
		if (n &amp;lt;= 0)
		    return "";
		else if (n &amp;gt; String(str).length)
		    return str;
		else
		    return String(str).substring(0,n);
	}

/*	Nome da Função:	BuscaCep (Inativa)
	Programador:	Clayton
	Data:			00/00/0000
	Descrição:		Buscar Cep (Projeto Leroy)
	Tipo Quest:		Strings
	Exemplo:		BuscaCep(QRef(10), QRef(11), QRef(5));
*/
	function BuscaCep(inQidxCep, inQidxRua, inQidxCidade) {
		var retVal = false;
		var arrBaseCep = new Array();
		
			for (var i = 0; i &amp;lt; arrBaseCep.length; i++) {
				if (Answer(inQidxCep) == arrBaseCep[i].substr(0,8)) {	
					retVal = true;
					break; }
			}
		
			if (retVal) {
				SetAnswer(inQidxRua, arrBaseCep[i - 1].substr(9,102)); }
	}

/*	Nome da Função:	DBLIsValidPhone
	Programador:	Ron Tal
	Data:			00/00/0000
	Descrição:		Checar Telefone Válido (8 dígitos)
	Tipo Quest:		Numérica
	Exemplo:		DBLIsValidPhone(Answer(QRef(20));
	OBS:			Adaptado (9 dígitos SP) - 14/08/2012
*/
	function DBLIsValidPhone(inAns) {
		return !check_regex("^[0-9]{8}",inAns) || inAns.Length!=8;
	}
	function DBLIsValidPhoneSP(inAns) {
		return !check_regex("^[0-9]{9}",inAns) || inAns.Length!=9;
	}
		function check_regex(check_expression, check_string) {
			var re  =  new RegExp(check_expression);
			var result = re.test(check_string);
			return result;
		}

/*	Nome da Função:	IsContainsTo
	Programador:	Clayton
	Data:			00/00/0000
	Descrição:		Busca um valor entre várias Questões
	Tipo Quest:		Single e Mult
	Exemplo:		IsContainsTo(QRef(108), QRef(111), 2);
*/
	function IsContainsTo(inQIdxBegin, inQIdxEnd, inAnswer) {
		var retVal = false;
		for (var j = inQIdxBegin; j &amp;lt;= inQIdxEnd; j++) {
			if (Contains(j, inAnswer)) {
				retVal = true; }
		}
		return retVal;
	}

/*	Nome da Função:	IsContainsRangeTo
	Programador:	Clayton
	Data:			00/00/0000
	Descrição:		Busca um ou mais valores entre várias Questões
	Tipo Quest:		Single e Mult
	Exemplo:		IsContainsRangeTo(QRef(108), QRef(111), 2,10);
*/
	function IsContainsRangeTo(inQIdxBegin, inQIdxEnd,  inBegin, inEnd) {
		var retVal = false;
			for (var j = inQIdxBegin; j &amp;lt;= inQIdxEnd; j++) {		
				for (var k = inBegin; k &amp;lt;= inEnd; k++) {
					if (Contains(j, k)) {
						retVal = true; }
				}
			}
		return retVal;
	}

/*	Nome da Função:	IsSelectedAnswerRankingIdx
	Programador:	Clayton
	Data:			00/00/0000
	Descrição:		Busca Index da Resposta Selecionada p/ Ranking
	Tipo Quest:		Ranking
	Exemplo:		IsSelectedAnswerRankingIdx(QRef(108), 1);
*/
	function IsSelectedAnswerRankingIdx(inQidx, inRank) {
		for (var i = 1; i &amp;lt;= GetAnswerCount(inQidx); i++) {
			if (ContainsSpecificRate(inQidx, inRank, i)) {
				break; }
		}
		return i;
	}

/*	Nome da Função:	IsSomaAnswer
	Programador:	Clayton
	Data:			00/00/0000
	Descrição:		Soma uma sequência de Questões
	Tipo Quest:		Numéricas Single e Multi
	Exemplo:		IsSomaAnswers(QRef(90), QRef(100));
*/
//Função Soma Answer
	function IsSomaAnswer(inBegin, inEnd) {
		var intSoma = 0;
			for (var j = inBegin; j &amp;lt;=inEnd; j++)
				{ intSoma += Answer(j); }
		
		return intSoma;
	}

/*	Nome da Função:	IsSomaTopic
	Programador:	Clayton
	Data:			00/00/0000
	Descrição:		Soma uma sequência de Questões
	Tipo Quest:		Numéricas Topics
	Exemplo:		IsSomaTopics(QRef(90), QRef(100));
*/
	function IsSomaTopic(inBegin, inEnd) {
		var intSoma = 0;
			for (var j = inBegin; j &amp;lt;= inEnd; j++)
				if (IsTopicVisible(CurrQues, j)) {
					intSoma += AnswerChoice(CurrQues, j); }
		
		return intSoma;
	}
	function IsSomaTopics(inQidx, inBegin, inEnd) {
		var intSoma = 0;
			for (var j = inBegin; j &amp;lt;= inEnd; j++)
				if (IsTopicVisible(inQidx, j)) {
					intSoma += AnswerChoice(inQidx, j); }
		
		return intSoma;
	}


/*	Nome da Função:	IsSearchOthers
	Programador:	Clayton
	Data:			00/00/0000
	Descrição:		Busca Outras na Lista Fixa
	Tipo Quest:		Single e Multi
	Exemplo:		IsSearchOthers(AddtionalText(CurrQues), QRef(CurrQues)); /
					IsSearchOthers(SelectedAnswerText(CurrQues+1), QRef(CurrQues));
					Msg 'Verificar Outros vs Lista de Marcas.'
	OBS: 			Alterado dia 21/08 - inclusão do RegExp
*/
	function IsSearchOthers(inQidxOther, inQidxList) {
		var retVal = false;
		if (inQidxOther != '') {
			var arrList = new Array();
			
			for (var j=1;j&amp;lt;=GetAnswerCount(inQidxList);j++) {
				arrList[j-1] = IsTrim(IsUpper(GetAnswerOriginalText(inQidxList, j)));
			}
			
			var reList = new RegExp(arrList);
			var reAnswer = new RegExp(IsTrim(IsUpper(inQidxOther)));
			
			if (reAnswer.test(reList)) {
				Prompt("A resposta (ou alguma variante) digitada em outros '"+inQidxOther+"' está na lista de marcas. Verifique");
				retVal = true;
			}
		}
		return retVal;
	}

/*	Nome da Função:	IsTrim
	Programador:	Internet (desconhecido)
	Data:			00/00/0000
	Descrição:		Remove espaços
	Tipo Quest:		Strings
	Exemplo:		IsTrim(Answer(CurrQues)); / IsTrim(SelectedAnswerText(CurrQues));
*/
	function IsTrim(str) {
		str = str.ToString();
		return str.replace(/^\s+|\s+$/g,"");
	}

/*	Nome da Função:	IsLTrim
	Programador:	Internet (desconhecido)
	Data:			00/00/0000
	Descrição:		Remove espaços à Esquerda
	Tipo Quest:		Strings
	Exemplo:		IsLTrim(Answer(CurrQues)); / IsLTrim(SelectedAnswerText(CurrQues));
*/
	function IsLTrim(str) {
		str = str.ToString();
		return str.replace(/^\s+/,"");
	}
	 
/*	Nome da Função:	IsRTrim
	Programador:	Internet (desconhecido)
	Data:			00/00/0000
	Descrição:		Remove espaços à Direita
	Tipo Quest:		Strings
	Exemplo:		IsRTrim(Answer(CurrQues)); / IsRTrim(SelectedAnswerText(CurrQues));
*/
	function IsRTrim(str) {
		str = str.ToString();
		return str.replace(/\s+$/,"");
	}

/*	Nome da Função:	IsUpper
	Programador:	Internet (desconhecido)
	Data:			00/00/0000
	Descrição:		Letras em Maiúscula
	Tipo Quest:		Strings
	Exemplo:		IsUpper(Answer(CurrQues)); / IsUpper(SelectedAnswerText(CurrQues));
*/
	function IsUpper(str) {
		str = str.ToString();
		return str.toUpperCase();
	}
		
/*	Nome da Função:	IsUpper
	Programador:	Internet (desconhecido)
	Data:			00/00/0000
	Descrição:		Letras em Minúscula
	Tipo Quest:		Strings
	Exemplo:		IsLower(Answer(CurrQues)); / IsLower(SelectedAnswerText(CurrQues));
*/
	function IsLower(str) {
		str = str.ToString();
		return str.toLowerCase();
	}

/*	Nome da Função:	IsCheckAbertas
	Programador:	Clayton
	Data:			11/07/2012
	Descrição:		Checagem Abertas
	Tipo Quest:		Single
	Exemplo:		IsCheckAbertas([QRef(175), QRef(177), ...]);
*/
	function IsCheckAbertas(inQids)  {
		var retErro = '';
		var numOfQues = inQids.length;
			for (var j = 0; j &amp;lt; numOfQues; j++) {
				if (Answered(inQids[j]) &amp;amp;&amp;amp; NotAnswered(inQids[j] + 1))
					{ retErro += ('Questão : ' + VarName(inQids[j] + 1) + ' - Falta Resposta \n'); }
				if (NotAnswered(inQids[j]) &amp;amp;&amp;amp; Answered(inQids[j] + 1))
					{ retErro += ('Questão : ' + VarName(inQids[j] + 1) + ' - Sobra Resposta \n'); }
			}
			if (retErro != '') { ExtRefNum = 'Abertas - Erro'; }
				else { ExtRefNum = 'Abertas - Ok'; }
		return retErro;	
	}

/*	Nome da Função:	IsEncerre
	Programador:	Wilson Ruiz/Clayton Araujo
	Data:			16/08/2012
	Descrição:		Essa função verifica se uma questão foi respondida como encerre, se sim ela seta as váriáveis de filtro e ocorrência e vai para o encerramento da entrevista.
	Tipo Quest:		Simgle/Multiple/Topic
	Exemplo:		IsEncerre((Contains(CurrQues, 1)), QRef(42), QRef(44)) (Encerra se na questão atual a resposta for código 1)
*/
function IsEncerre(InFunction, InMsg, InOcor, InEncer){
	SetAnswer(InEncer, 2);
	if (InFunction) {
		Prompt("Se "+InMsg+". Agradeça e encerre.");
		SetAnswer(InOcor, VarName(CurrQues) + " = "+InMsg+".");
		SetAnswer(InEncer, 1);
	}
	return InFunction;
}

/*	Nome da Função:	IsArrend
	Programador:	Internet (desconhecido)
	Data:			24/09/2012
	Descrição:		Arredonda um número para o inteiro mais próximo, tanto para baixo quanto para cima. Por exemplo, o número 3.3 arredondado será 3, mas o número 3.8 arredondado será 4.
	Tipo Quest:		Numérica
	Exemplo:		
*/
function IsArrend(InValue, InDecimals){
	var retVal = Math.round(InValue * Math.pow(10, InDecimals)) / Math.pow(10, InDecimals);
	return retVal;
}

/*	Nome da Função:	IsArrendDown
	Programador:	Internet (desconhecido)
	Data:			24/09/2012
	Descrição:		Arredonda um número para o inteiro mais baixo
	Tipo Quest:		Numérica
	Exemplo:		
*/
function IsArrendDown(InValue, InDecimals){
	var retVal = Math.floor(InValue * Math.pow(10, InDecimals)) / Math.pow(10, InDecimals);
	return retVal;
}
/*	Nome da Função:	IsAnyOneOfVars
	Programador:	Clayton
	Data:			13/11/2012
	Descrição:		Busca 1 ou Mais valores entre 1 ou mais Variáveis
					Se Deseja saber onde o valor foi localizado, digite adicione true no final da função, senão, digite false;
	Tipo Quest:		Vars
	Exemplo:		IsAnyOneOfVars([1], [v1, v2], false) / IsAnyOneOfVars([1,2,3], [v1], false) / IsAnyOneOfVars([1,2,3], [v1,v2,v3], false)
*/
function IsAnyOneOfVars(inValues, inVars, inGetVar) {
	var retVal = false;
	var retVar = 0;
	var numOfValues = inValues.length;
	var numOfVars = inVars.length;
	
	for (var i=0; i&amp;lt;numOfValues; i++)
	{
		for (var j=0; j&amp;lt;numOfVars; j++)
		{
			if (inVars[j] == inValues[i])
			{
			retVal = true;
			retVar = j+1;
			break;
			}
		}
	}
	if (inGetVar)
	{
		return retVar;
	}
	else
	{	
		return retVal;
	}
}
/*	Nome da Função:	IsRangeOneOfVars
	Programador:	Clayton
	Data:			20/11/2012
	Descrição:		Busca valores de x a x entre 1 ou mais Variáveis
					Se Deseja saber onde o valor foi localizado, digite adicione true no final da função, senão, digite false;
	Tipo Quest:		Vars
	Exemplo:		IsRangeOneOfVars(1,10, [v1, v2], false) / IsRangeOneOfVars(1,3, [v1], false) / IsRangeOneOfVars(1,200, [v1,v2,v3], false)
*/
function IsRangeOneOfVars(inValueBegin, inValueEnd, inVars, inGetVar) {
	var retVal = false;
	var retVar = 0;
	var numOfVars = inVars.length;
	
	for (var i=inValueBegin; i&amp;lt;=inValueEnd; i++)
	{
		for (var j=0; j&amp;lt;numOfVars; j++)
		{
			if (inVars[j] == i)
			{
			retVal = true;
			retVar = j+1;
			break;
			}
		}
	}
	if (inGetVar)
	{
		return retVar;
	}
	else
	{	
		return retVal;
	}
}

/*	Nome da Função:	IsRangeCount
	Programador:	Clayton
	Data:			00/00/0000
	Descrição:		Checar se existe um valor de-para e retorna a quantidade
	Tipo Quest:		Single e Mult
	Exemplo:		IsRange(QRef(5), 18, 24);
*/
	function IsRangeCount(inQIdx, inBegin, inEnd) {
		var retVal = 0;
		for (var j = inBegin; j &amp;lt;= inEnd; j++) {
			if (Contains(inQIdx, j)) {
				retVal += 1; }
		}
		return retVal;
	}

/*	Nome da Função:	IsRangeChoiceCount
	Programador:	Clayton
	Data:			00/00/0000
	Descrição:		Checar se existe um valor de-para em questões Topics e retorna a quantidade
	Tipo Quest:		Topics
	Exemplo:		IsRangeChoice(QRef(5), 1, 1,5);
*/
	function IsRangeChoiceCount(inQIdx, inAnsIdx, inBegin, inEnd) {
		var retVal = 0;
		for (var j = inBegin; j &amp;lt;=inEnd; j++) {
			if (AnswerChoice(inQIdx, inAnsIdx) == j) {
				retVal += 1; }
		}
		return retVal;
	}

/*	Nome da Função:	IsContainsOneOfTopics
	Programador:	Clayton
	Data:			19/11/2012
	Descrição:		Checar se existe um/ou valor(es) em questões Topics
	Tipo Quest:		Topics
	Exemplo:		IsContainsOneOfTopics(QRef(5), 1, [1,2,5,4]);
*/
	function IsContainsOneOfTopics(inQTarget,inTopic,inAnswers)
	{
		var retVal = false;
		var numOfAnswers = inAnswers.length;
		for (var i=0;i&amp;lt;numOfAnswers;i++) {
			if (AnswerChoice(inQTarget,inTopic) == inAnswers[i]) {
				retVal = true;
				break;
			}
		}
		return retVal;
	}

/*	Nome da Função:	IsSetAnswersRangeVisible
	Programador:	Clayton
	Data:			
	Descrição:		Exibir/Ocultar respostas de X a X
	Tipo Quest:		Single e Multi
	Exemplo:		IsSetAnswersRangeVisible(CurrQues, true, true, 1, 10);
*/
function IsSetAnswersRangeVisible(inQIdx, inShow, inReset, inAnsBegin, inAnsEnd){
	var inAnswers = new Array();
	var i = 0;
	
	for (var j = inAnsBegin; j&amp;lt;=inAnsEnd; j++)
	{
		inAnswers[i] = j;
		i++;
	}
		
	SetAnswerVisible(inQIdx, inShow, inReset, inAnswers);

}
/*	Nome da Função:	IsSetTopicsRangeVisible
	Programador:	Clayton
	Data:			
	Descrição:		Exibir/Ocultar respostas de X a X
	Tipo Quest:		Topics
	Exemplo:		IsSetTopicsRangeVisible(CurrQues, true, true, 1, 10);
*/
function IsSetTopicsRangeVisible(inQIdx, inShow, inReset, inTopBegin, inTopEnd){
	var inTopics = new Array();
	var i = 0;
	
	for (var j = inTopBegin; j&amp;lt;=inTopEnd; j++)
	{
		inTopics[i] = j;
		i++;
	}
		
	SetTopicVisible(inQIdx, inShow, inReset, inTopics);
}
/*	Nome da Função:	IsGetIndexAnswers
	Programador:	Clayton
	Data:			17/12/2012
	Descrição:		Retornar os índices dos itens da lista em Matriz
	Tipo Quest:		RU/RM
	Exemplo:		IsGetIndexAnswers(QRef(1));
*/
function IsGetIndexAnswers(inQIdx){
	var inAnswers = new Array();
	var i = 0;
	
	for (var j=1;j&amp;lt;=GetAnswerCount(inQIdx);j++)
	{
		inAnswers[i] = j;
		i++;
	}
		
	return inAnswers;
}
/*	Nome da Função:	IsGetIndexAnswersExclude
	Programador:	Clayton
	Data:			17/12/2012
	Descrição:		Retornar os índices dos itens da lista em Matriz
	Tipo Quest:		RU/RM
	Exemplo:		IsGetIndexAnswersExclude(QRef(1), [1,2,3]);
*/
function IsGetIndexAnswersExclude(inQIdx, AnsExclude){
	var inAnswers = new Array();
	var i = 0;
	
	for (var j=1;j&amp;lt;=GetAnswerCount(inQIdx);j++)
	{
		if (!IsAnyOneOfVars([j], AnsExclude, false))
		{
			inAnswers[i] = j;
			i++;
		}
	}
		
	return inAnswers;
}
/*	Nome da Função:	IsGetIndexTopics
	Programador:	Clayton
	Data:			17/12/2012
	Descrição:		Retornar os índices dos itens da lista em Matriz
	Tipo Quest:		Topic
	Exemplo:		IsGetIndexTopics(QRef(1));
*/
function IsGetIndexTopics(inQIdx){
	var inTopics = new Array();
	var i = 0;
	
	for (var j=1;j&amp;lt;=GetTopicCount(inQIdx);j++)
	{
		inTopics[i] = j;
		i++;
	}
		
	return inTopics;
}

/*	Nome da Função:	IsGetNumOfTopicsWithValuesRange
	Programador:	Clayton
	Data:			04/01/2013
	Descrição:		Facilitando o uso da da função GetNumOfTopicsWithValues, para colocar um range nos valores
	Tipo Quest:		Topics
	Exemplo:		IsGetNumOfTopicsWithValuesRange(CurrQues, 20,97);
*/
function IsGetNumOfTopicsWithValuesRange(inQIdx, inBegin, inEnd) {
	var retVal = false;
		for (var j=inBegin;j&amp;lt;=inEnd;j++)
		{
			if (GetNumOfTopicsWithValues(inQIdx, j) &amp;gt; 0) { retVal = true; break;}
		}
	return retVal;
}

/*	Nome da Função:	IsDataNasc
	Programador:	Clayton
	Data:			16/01/2013
	Descrição:		Retorna a idade baseada na Data de Nascimento
	Tipo Quest:		Date
	Exemplo:		IsDataNasc(QRef(1));
*/
function IsDataNasc(inQIdxDataNasc)
{
	var retVal = 0;
	retVal = (Now.Year-Answer(inQIdxDataNasc).Year);
	if ((Answer(inQIdxDataNasc).Month &amp;gt; Now.Month) || (Answer(inQIdxDataNasc).Month == Now.Month &amp;amp;&amp;amp; Answer(inQIdxDataNasc).Day &amp;gt; Now.Day))
	{
		retVal = retVal-1;
	}
	return retVal;
}

/*	Nome da Função:	IsDataNascIter
	Programador:	Clayton
	Data:			16/01/2013
	Descrição:		Retorna a idade baseada na Data de Nascimento
	Tipo Quest:		Date Iter
	Exemplo:		IsDataNascIter(QRef(1), IterationIdex);
*/
function IsDataNascIter(inQIdxDataNasc, inIter)
{
	var retVal = 0;
	retVal = (Now.Year-Answer(inQIdxDataNasc).Year);
	if ((AnswerIter(inQIdxDataNasc, inIter).Month &amp;gt; Now.Month) || (AnswerIter(inQIdxDataNasc, inIter).Month == Now.Month &amp;amp;&amp;amp; AnswerIter(inQIdxDataNasc, inIter).Day &amp;gt; Now.Day))
	{
		retVal = retVal-1;
	}
	return retVal;
}

/*	Nome da Função:	IpsChekTrim
	Programador:	Wilson
	Data:			18-01-2013
	Descrição:		Essa função verifica se os valores digitados em uma questão aberta ou semi-aberta
					são apenas espaços, apenas números ou ambas as situações e retorna erro.
	Tipo Quest:		Aberta e Addictional Text
	Exemplo:		IpsChekTrim(true,true,false) | IpsChekTrim(false,false,true)&amp;amp;&amp;amp;Contains(CurrQues,1)
	Descrição do comando: IpsTrimTeste( ; nome da função
							true,		; aceita true/false. Se for true retorna erro caso a questão estiver apenas com espaços, se for false não aplica a checagem de espaços.
							true,		; aceita true/false. Se for true retorna erro caso a questão estiver apenas com números, se for false não aplica a checagem de números.
							false)		; aceita true/false. Faz a checagem de números e espaços para o Addictional Text. se estiver com false não checa o Addictional.
	Observação: Quando usar essa função para questões Addictional precisa vincular ao código fechado de outros.
*/
function IpsChekTrim(chkTxt,chkNum,chkAdd){
	var retVal = false;
	if (chkTxt){
		var txt = Answer(CurrQues).ToString()
		txt = txt.replace(/\s/g,'')
		if (txt == ''){
			retVal = true;
			return retVal;
		}
	}
	if (chkNum){
		var num = Answer(CurrQues).ToString()
		num = num.replace(/1|2|3|4|5|6|7|8|9|0|\s/g,'')
		if (num == ''){
			retVal = true;
			return retVal;
		}
	}
	if (chkAdd){
		var add = AdditionalText(CurrQues).ToString()
		add = add.replace(/1|2|3|4|5|6|7|8|9|0|\s/g,'')
		if (add == ''){
			retVal = true;
			return retVal;
		}
	}
}

/*	Nome da Função:	IpsChekTrimIterIter
	Programador:	Wilson
	Data:			28-02-2013
	Descrição:		Essa função verifica se os valores digitados em uma questão aberta ou semi-aberta
					são apenas espaços, apenas números ou ambas as situações e retorna erro.
	Tipo Quest:		Aberta e Addictional Text
	Exemplo:		IpsChekTrimIter(true,true,false) | IpsChekTrimIter(false,false,true)&amp;amp;&amp;amp;Contains(CurrQues,1)
	Descrição do comando: IpsTrimTeste( ; nome da função
							true,		; aceita true/false. Se for true retorna erro caso a questão estiver apenas com espaços, se for false não aplica a checagem de espaços.
							true,		; aceita true/false. Se for true retorna erro caso a questão estiver apenas com números, se for false não aplica a checagem de números.
							false)		; aceita true/false. Faz a checagem de números e espaços para o Addictional Text. se estiver com false não checa o Addictional.
	Observação: Quando usar essa função para questões Addictional precisa vincular ao código fechado de outros.
		    Texto padrão da mensagem(sugestão): ATENÇÃO: Não aceitar apenas números ou em branco!
*/
function IpsChekTrimIter(chkTxt,chkNum,chkAdd){
	var retVal = false;
	if (chkTxt){
		var txt = AnswerIter(CurrQues,IterationIndex).ToString()
		txt = txt.replace(/\s/g,'')
		if (txt == ''){
			retVal = true;
			return retVal;
		}
	}
	if (chkNum){
		var num = AnswerIter(CurrQues,IterationIndex).ToString()
		num = num.replace(/1|2|3|4|5|6|7|8|9|0|\s/g,'')
		if (num == ''){
			retVal = true;
			return retVal;
		}
	}
	if (chkAdd){
		var add = AdditionalTextIter(CurrQues,IterationIndex).ToString()
		add = add.replace(/1|2|3|4|5|6|7|8|9|0|\s/g,'')
		if (add == ''){
			retVal = true;
			return retVal;
		}
	}
}

/*	Nome da Função:	IsFilterAnswersByCods
	Programador:	Clayton
	Data:			28/02/13
	Descrição:		Filtrar pór código
	Tipo Quest:		Single e Multiple
	Exemplo:		IsFilterAnswersByCods(CurrQues, true, true, [10,11,13,9996,998,999]);
*/
function IsFilterAnswersByCods(inQIdx, inShow, inReset, inCods)
{
	var numOfCods = inCods.length;
	var inAnswers = new Array();

	for (var i=0;i&amp;lt;numOfCods;i++)
	{
		inAnswers[i] = GetAnswerChoiceIdxByCode(inQIdx,inCods[i]);
	}

	SetAnswerVisible(inQIdx, inShow, inReset, inAnswers);

}

/*	Nome da Função:	IsFilterTopicsByCods
	Programador:	Clayton
	Data:			28/02/13
	Descrição:		Filtrar pór código
	Tipo Quest:		Grid
	Exemplo:		IsFilterTopicsByCods(CurrQues, true, true, [10,11,13,9996,998,999]);
*/
function IsFilterTopicsByCods(inQIdx, inShow, inReset, inCods)
{
	var numOfCods = inCods.length;
	var inTopics = new Array();

	for (var i=0;i&amp;lt;numOfCods;i++)
	{
		inTopics[i] = GetAnswerChoiceIdxByCode(inQIdx,inCods[i]);
	}

	SetTopicVisible(inQIdx, inShow, inReset, inTopics);

}

/*	Nome da Função:	IsFilterAnswersMarcasByCid
	Programador:	Clayton
	Data:			28/02/13
	Descrição:		Filtra as marcas do AddLists por cidade(neste Add List contém todas as marcas de cigarro)
	Tipo Quest:		Single e Multiple
	Exemplo:		IsFilterAnswersMarcasByCid(CurrQues, true, true, Answer(1));
	
	**Cidades GCS:
		Bauru					1
		São José do Rio Preto	2
		Belo Horizonte			3
		Recife					4
		Porto Alegre			5
		Curitiba				6
		Ribeirão Preto			7
		São Paulo				8
		Rio de Janeiro			9 **
*/
function IsFilterAnswersMarcasByCid(inQIdx, inShow, inReset, inCodCid)
{
	var inAnswers = new Array();
	var i = 0;
	var tblTable = GetTableFromStore("LISTA_DE_MARCAS_GCS","","cid_"+inCodCid+"=1","marca");
	for (var j=0; j&amp;lt;tblTable.RowCount; j++)
	{
		var rowRow = tblTable[j];
		if (rowRow["status_cod"]==1)
		{
			inAnswers[i] = rowRow["marca_cod"].ToInt();
			i++;
		}
	}
	
	IsFilterAnswersByCods(inQIdx, inShow, inReset, inAnswers);
}

/*	Nome da Função:	IsSetAnswerCodeLabel
	Programador:	Clayton
	Data:			05/03/13
	Descrição:		
	Tipo Quest:		Single e Multipe
	Exemplo:		IsSetAnswerCodeLabel(CurrQues, [42,43]);
*/
function IsSetAnswerCodeLabel(inQIdx, inIgnore)
{
	for (var j=1;j&amp;lt;=GetAnswerCount(inQIdx);j++)
	{
		SetAnswerText(inQIdx, j, AnswerCode(inQIdx, j)+'-'+GetAnswerOriginalText(inQIdx, j));
	}
	if (inIgnore!='undefined')
	{
		for (var j=0;j&amp;lt;inIgnore.length;j++)
		{
			SetAnswerText(inQIdx, inIgnore[j], GetAnswerOriginalText(inQIdx, inIgnore[j]));
		}
	}
}

/*	Nome da Função:	IsSetTopicCodeLabel
	Programador:	Clayton
	Data:			17/05/13
	Descrição:		
	Tipo Quest:		Topic
	Exemplo:		IsSetTopicCodeLabel(CurrQues, [42,43]);
*/
function IsSetTopicCodeLabel(inQIdx, inIgnore)
{
	for (var j=1;j&amp;lt;=GetTopicCount(inQIdx);j++)
	{
		SetTopicText(inQIdx, j, AnswerCode(inQIdx, j)+'-'+GetTopicOriginalText(inQIdx, j));
	}
	if (inIgnore!='undefined')
	{
		for (var j=0;j&amp;lt;inIgnore.length;j++)
		{
			SetTopicText(inQIdx, inIgnore[j], GetTopicOriginalText(inQIdx, inIgnore[j]));
		}
	}
}

/*	Nome da Função:	IsSortAnswersByCod
	Programador:	Clayton
	Data:			06/03/2013
	Descrição:		Ordenar Lista por Index
	Tipo Quest:		
	Exemplo:		
*/
function IsSortAnswersByCod(inQIdx)
{
	var inAnswersCod = new Array();
	var inAnswersIdx = new Array();
	for (var i=1;i&amp;lt;=GetAnswerCount(inQIdx);i++)
	{
		inAnswersCod[i-1] = AnswerCode(inQIdx, i);
		//Prompt("cod "+inAnswersCod[i-1]);
	}
	var inAnswersCod = inAnswersCod.sort(IsCrescente);
	for (var i=1;i&amp;lt;=GetAnswerCount(inQIdx);i++)
	{
		inAnswersIdx[i-1] = GetAnswerChoiceIdxByCode(inQIdx, inAnswersCod[i-1]);
		//Prompt("idx "+inAnswersIdx[i-1]);
	}	
	RandomizeAnswers(inQIdx, inAnswersIdx);
	/* Crescente */
		function IsCrescente(index1, index2)
		{
			return index1 - index2;
		}
	/* Decrescente */
		function IsDecrescente(index1, index2)
		{
			return index2 - index1;
		}
}

/*	Nome da Função:	IsRangeAll
	Programador:	Clayton
	Data:			09/04/2013
	Descrição:		Checar se existe todos os valores de-para
	Tipo Quest:		Single e Mult
	Exemplo:		IsRangeAll(QRef(5), 18, 24);
*/
	function IsRangeAll(inQIdx, inBegin, inEnd) {
		var intVal = 0;
		for (var j=inBegin;j&amp;lt;=inEnd;j++) { if (Contains(inQIdx, j)) { intVal++} }
		if (intVal==inEnd) { return true; }
		else { return false; }
	}

/*	Nome da Função:	IsContainsByOriginalText
	Programador:	Clayton
	Data:			15/04/2013
	Descrição:		Buscar Resposta por Original Text
	Tipo Quest:		Single e Mult
	Exemplo:		IsContainsByOriginalText(QRef(5), 'Outros');
*/
function IsContainsByOriginalText(inQues, inText)
{
	var retVal = false;
	for (var j=1;j&amp;lt;=GetAnswerCount(inQues);j++)
	{
		if (Contains(inQues, j) &amp;amp;&amp;amp; GetAnswerOriginalText(inQues, j)==inText) { retVal = true; break; }
	}
	return retVal;
}

/* 
	Nome da Função:	IsSetAnswersByCod
	Programador:	Clayton
	Data:			29/04/13
	Descrição:		
	Tipo Quest:		Single e Multipe
	Exemplo:		IsSetAnswersByCod(QRef(1), CurrQues);
*/
function IsSetAnswersByCod(inQIdx, inQIdxTarget)
{
	if (NumOfSelectedChoices(inQIdxTarget)&amp;gt;0)
	{
		var numOfAnswers = GetAnswers(inQIdxTarget);
		var codOfAnswers = new Array();
		
		for (var j=0; j&amp;lt;numOfAnswers.length; j++)
		{
			codOfAnswers[j] = GetAnswerChoiceIdxByCode(inQIdx, AnswerCode(inQIdxTarget, numOfAnswers[j]));
		}
		SetAnswer(inQIdx, codOfAnswers);
	}
	else
	{
		SetAnswer(inQIdx, GetAnswerChoiceIdxByCode(inQIdx, SelectedAnswerCode(inQIdxTarget)));
	}
}

/*	Nome da Função:	IsRangeVar
	Programador:	Clayton
	Data:			23/05/2013
	Descrição:		Checar se existe um valor de-para
	Tipo Quest:		Variável de Usuário
	Exemplo:		IsRangeVar(Var, 8,10);
*/
	function IsRangeVar(inVar, inBegin, inEnd) {
		var retVal = false;
		if (inVar&amp;gt;=inBegin &amp;amp;&amp;amp; inVar&amp;lt;=inEnd) { retVal = true; }
		return retVal;
	}

/*	Nome da Função:	IsContainsNumOfValues
	Programador:	Clayton
	Data:			27/05/2013
	Descrição:		Retorna o total de valores que a questão possui
	Tipo Quest:		Multiple
	Exemplo:		IsContainsNumOfValues(CurrQues, [1,2,3,4]);
*/
	function IsContainsNumOfValues(inQIdx, inAnswers) {
		var retVal = 0;
		for (var j=0;j&amp;lt;inAnswers.length;j++)
		{
			if (Contains(inQIdx, inAnswers[j])) { retVal++; }
		}
		return retVal;
	}

/*	Nome da Função:	IsContainsTopicsValues
	Programador:	Clayton
	Data:			27/05/2013
	Descrição:		Checa se há valores nos Tópics
	Tipo Quest:		Single Topic
	Exemplo:		IsContainsTopicsValues(CurrQues, [1,2,3,9], [1], false, false);
					false, false = Qlqer um dos Tópicos, Qlqer um dos Valores
					true, false = Todos os Tópicos, Qlqer um dos Valores
					true, true = Todos os Tópicos, Todos os Valores
*/
	function IsContainsTopicsValues(inQIdx, inTopics, inAnswers, inAllTopics, inAllAnswers) {
		var retVal = false;
		var intValTopic = 0;
		var intValAnswer = 0;
		
		for (var tpc=0;tpc&amp;lt;inTopics.length;tpc++)
		{
			if (!inAllTopics &amp;amp;&amp;amp; !inAllAnswers)
			{
				for (var ans=0;ans&amp;lt;inAnswers.length;ans++)
				{
					if (AnswerChoice(inQIdx, inTopics[tpc])==inAnswers[ans]) { retVal=true; break; }
				}
			}
			if (inAllTopics)
			{
				if (IsContainsOneOfTopics(inQIdx, inTopics[tpc], inAnswers)) { intValTopic++; }
			}
			if (inAllAnswers)
			{
				for (var ans=0;ans&amp;lt;inAnswers.length;ans++)
				{
					if (AnswerChoice(inQIdx, inTopics[tpc])==inAnswers[ans]) { intValAnswer++; }
				}
			}
		}
		if (inAllTopics &amp;amp;&amp;amp; intValTopic==inTopics.length) { retVal=true; }
		if (inAllAnswers &amp;amp;&amp;amp; intValAnswer==inAnswers.length) { retVal=true; }
		if ((inAllAnswers &amp;amp;&amp;amp; intValAnswer==inAnswers.length) &amp;amp;&amp;amp; (inAllTopics &amp;amp;&amp;amp; intValTopic==inTopics.length)) { retVal=true; }

		return retVal;
	}

/*	Nome da Função:	IsGetTopicsTextWithValues
	Programador:	Clayton
	Data:			04/06/2013
	Descrição:		Exibe o Texto dos Topics que Tem um determinado valor
	Tipo Quest:		Single Grid
	Exemplo:		IsGetTopicsTextWithValues(QRef(1), [1,2,3,4], [QRef(1),QRef(2)], [4,5]);
					Se não tiver Outros, coloque 0 IsGetTopicsTextWithValues(QRef(1), [1,2,3,4], [0], [0]);
*/
	function IsGetTopicsTextWithValues(inQIdx, inAnswers, inOuts, inAnswersOuts) {
		var retVal = "";
		var txtOut = "";
		var ans = 0;
		for (var tpc=1;tpc&amp;lt;=GetTopicCount(inQIdx);tpc++)
		{
				if (IsContainsOneOfTopics(inQIdx, tpc, inAnswers))
				{
					if (tpc==inAnswersOuts[ans])
					{
						txtOut = AdditionalText(inOuts[ans]) + Answer(inOuts[ans]);
						retVal += txtOut+", ";
						ans++;
					}
					else
					{
						retVal += GetTopicOriginalText(inQIdx, tpc)+", ";
					}
				}
		}
		return retVal.substring(0, retVal.length-2);
	}

/*	Nome da Função:	IsGetIdxTopicsWithValues
	Programador:	Clayton
	Data:			06/06/2013
	Descrição:		Exibe os IDXs dos Topics que Tem um determinado valor
	Tipo Quest:		Single Grid
	Exemplo:		IsGetIdxTopicsWithValues(QRef(1), [1,2,3,4]);
*/
	function IsGetIdxTopicsWithValues(inQIdx, inAnswers) {
		var retVal = new Array();
		var i = 0;
		for (var tpc=1;tpc&amp;lt;=GetTopicCount(inQIdx);tpc++)
		{
			if (IsContainsOneOfTopics(inQIdx, tpc, inAnswers))
			{
				retVal[i] = tpc; i++;
			}
		}
		return retVal;
	}

/*	Nome da Função:	IsRandomAnswersWithExclusive
	Programador:	Clayton
	Data:			06/03/2013
	Descrição:		Retorna as opções e rodízio e fixa determinados índices no fim da lista
	Tipo Quest:		Single
	Exemplo:		IsRandomAnswersWithExclusive(CurrQues, [10,11], false);
					inSet = true somente se for para setar a ordem do rodízio, se for para exibição deixe false;
*/
function IsRandomAnswersWithExclusive(inQIdx, inExcludeRandom, inSet)
{
		var retVal = new Array();
		var inAnswersIdx = new Array();
		var j = 0;
		for (var i=1;i&amp;lt;=GetAnswerCount(inQIdx);i++)
		{
			if (!InArray(i, inExcludeRandom))
			{
				inAnswersIdx[j] = i; j++;
			}
		}
		inAnswersIdx = RandomizeArray(inAnswersIdx);
		
		j = 0;
		for (var i=0;i&amp;lt;GetAnswerCount(inQIdx);i++)
		{	
			if (i&amp;lt;inAnswersIdx.length) { retVal[i] = inAnswersIdx[i]; }
			else { retVal[i] = inExcludeRandom[j]; j++; }
		}
		
		if (!inSet)
			{ RandomizeAnswers(inQIdx, retVal); }
		else if (inSet)
			{ return retVal; }
}

/*	Nome da Função:	IsRangeTopics
	Programador:	Clayton
	Data:			17/05/2013
	Descrição:		Retorna a soma dos valores em questões Topics
	Tipo Quest:		Topics
	Exemplo:		IsRangeTopics(QRef(5), 1,5)&amp;gt;0;
*/
	function IsRangeTopics(inQIdx, inTpcIn, inTpcEnd) {
		var retVal = 0;
		for (var j = inTpcIn; j &amp;lt;=inTpcEnd; j++) {
			if (AnswerChoice(inQIdx, j)&amp;gt;= 0) {
				retVal += AnswerChoice(inQIdx, j); }
		}
		return retVal;
	}

/*	Nome da Função:	IsSortAnswersWithExclusive
	Programador:	Clayton
	Data:			06/03/2013
	Descrição:		Retorna as opções em ordem de indice e fixa determinados índices no fim da lista
	Tipo Quest:		Single
	Exemplo:		IsSortAnswersWithExclusive(CurrQues, [10,11]);
*/
function IsSortAnswersWithExclusive(inQIdx, inExcludeRandom)
{
		var retVal = new Array();
		var inAnswersIdx = new Array();
		var j = 0;
		for (var i=1;i&amp;lt;=GetAnswerCount(inQIdx);i++)
		{
			if (!InArray(i, inExcludeRandom))
			{
				inAnswersIdx[j] = i; j++;
			}
		}
	
		j = 0;
		for (var i=0;i&amp;lt;GetAnswerCount(inQIdx);i++)
		{	
			if (i&amp;lt;inAnswersIdx.length) { retVal[i] = inAnswersIdx[i]; }
			else { retVal[i] = inExcludeRandom[j]; j++; }
		}
		
		RandomizeAnswers(inQIdx, retVal);
}

/*	Nome da Função:	
	Programador:	
	Data:			
	Descrição:		
	Tipo Quest:		
	Exemplo:		
*/


function dblColorFromRGB(red, green, blue){
	return (255&amp;lt;&amp;lt;24)+ (red&amp;lt;&amp;lt;16) + (green&amp;lt;&amp;lt;8) + blue;
}


function dblDistanceFromGPSFence (fenceLat, fenceLon)
{
	var pi = Math.PI;
	var fenceLatInRad=fenceLat* pi / 180;
	var fenceLonInRad=fenceLon* pi / 180;
	var targetLatInRad = GetGPSLocation().Latitude * pi / 180;
	var targetLonInRad = GetGPSLocation().Longitude * pi / 180;
	var dist = Math.acos(Math.sin(targetLatInRad) * Math.sin(fenceLatInRad) + Math.cos(targetLatInRad) * Math.cos(fenceLatInRad) * Math.cos(targetLonInRad - fenceLonInRad)) * 6371;
	var retVal;
      
	retVal=dist;
	return retVal;
}

function dblIsInGPSFence (fenceLat, fenceLon, distInKM)
{
	var dist = dblDistanceFromGPSFence(fenceLat, fenceLon);
	var retVal = false;
	
	if(dist&amp;lt;distInKM){
	    retVal=true;}
	else{
	    retVal=false;
	}
	return retVal;
}

function dblSumNumericGrid(inQ)
{
	var retVal=0;
	var numOfTopics=GetTopicCount(inQ);
	var i;
	
	for(i=1; i&amp;lt;=numOfTopics; i++)
	{
		if (IsTopicVisible(inQ,i)) {
			retVal+=AnswerChoice(inQ,i);
		}
	}
	
	return retVal;
}

function dblContainsOneOf(inQTarget,inAnswers)
{
	var retVal = false;
	var numOfAnswers = inAnswers.length;
	var i;
	for (i=0;i&amp;lt; numOfAnswers;i++) {
		if (Contains(inQTarget,inAnswers[i])) {
			retVal = true;
			break;
		}
	}
	return retVal;
}


//function dblContainsAll(inQTarget,inAnswers)
//{
//	var retVal = true;
//	var numOfAnswers = arguments.length-1;
//	var i;
//	for (i=0;i&amp;lt; numOfAnswers;i++) {
//		retVal = retVal &amp;amp;&amp;amp; Contains(inQTarget,arguments[i+1]);
//	}
//	return retVal;
//}

function dblContainsAllOf(inQTarget,inAnswers)
{
	var retVal = true;
	var numOfAnswers = inAnswers.length;
	var i;
	for (i=0;i&amp;lt; numOfAnswers;i++) {
		retVal = retVal &amp;amp;&amp;amp; Contains(inQTarget,inAnswers[i]);
	}
	return retVal;
}

function dblNumOfTopicsContains(inQ, inValueToCheck)
{
	var retVal = 0;
	var i=0;
	for (i=1; i&amp;lt;=GetTopicCount(inQ);i++){
		if (IsTopicVisible(inQ,i) &amp;amp;&amp;amp; AnswerChoice(inQ,i) == inValueToCheck) {
			retVal++;
		}
	}
	
	return retVal;
}

function dblNumOfIterContains(inQ, inValueToCheck)
{
	var retVal = 0;
	var i=0;
	for (i=1; i&amp;lt;IterationIndex;i++){
		if (ContainsIter(inQ,inValueToCheck,i)) {
			retVal++;
		}
	}
	
	return retVal;
}


function dblSetSpecificTopic(inQ, inTopicIndex, inValue)
{
	var curTopics = GetTopicCount(inQ);
	var newAnswers=new Array();
	var newArIdx=0;
	var i;
	for (i=0;i&amp;lt; curTopics;i++) {
		var actualTopic = i+1;
		if (actualTopic == inTopicIndex) {
			newAnswers[i] = inValue;
		}
		else {
			newAnswers[i] = AnswerChoice(inQ,actualTopic);
		}
	}
	SetAnswer(inQ,newAnswers);
}


function dblSetSpecificAnswer(inQ, inAnswerIdx, inChecked)
{
	var curAnswers = GetAnswers(inQ);
	var newAnswers=new Array();
	var newArIdx=0;
	var i;
	for (i=0;i&amp;lt; curAnswers.length;i++) {
		if (curAnswers[i] != inAnswerIdx) {
			newAnswers[newArIdx] = curAnswers[i];
			newArIdx++;
		}
	}
	if (inChecked) {
		newAnswers[newArIdx] = inAnswerIdx;
	}
	if (newAnswers.length &amp;gt; 0) {
	
		SetAnswer(inQ,newAnswers);
	}
	else {
		ClearAnswer(inQ);
	}
}

function dblSetAnswersByAnswers(inQTarget,inQids)
{
	var numOfQues = inQids.length;
	var numOfAnswers = GetAnswerCount(inQids[0]);
	var i;
	for (i=1;i&amp;lt;= numOfAnswers;i++) {
		var contained = false;
		var j;
		for (j=0; j&amp;lt;numOfQues;j++) {
			contained = Contains(inQids[j],i);
			if (contained) {
				break;
			}
		}
		if (contained) {
			dblSetSpecificAnswer(inQTarget, i,true);
		}
	}
}

function dblSetAnswersByAnswersEx (inQTarget,inQids,inExcludeHiddenTargetAnswers)
{
	var numOfQues = inQids.length;
	var numOfAnswers = GetAnswerCount(inQids[0]);
	var i;
	// go over all answers and for each check if it exists in the source questions
	for (i=1;i&amp;lt;= numOfAnswers;i++) {
		var contained = false;
		var j;
		// go over all source questions and check if the answer is checked
		for (j=0; j&amp;lt;numOfQues;j++) {
			contained = Contains(inQids[j],i);
			if (contained) {
				break;
			}
		}
		// in case it was contained check if need to add to target question
		if (contained) {
			var addAnswer = true;
			if ((inExcludeHiddenTargetAnswers) &amp;amp;&amp;amp; !IsAnswerVisible(inQTarget,i)) {
				addAnswer = false;
			}
			if (addAnswer) {
				dblSetSpecificAnswer(inQTarget, i,true);
			}
		}
	}
}


function dblSumOfTopics (inQuesIdx)
{
      var retVal = 0;
      var i;
      var numOfTopics = GetTopicCount(inQuesIdx);
      for (i=0;i&amp;lt;numOfTopics;i++) {
            var currTopic = i+1;
            if (IsTopicVisible (inQuesIdx, currTopic)) {
                  var currValue = AnswerChoice(inQuesIdx, currTopic);
                  if (currValue != -99999) {
	                  retVal += currValue;
                  }
            }
      }


      return retVal;
}

function dblFormatNumberToCurrency(num) {
	var retVal = "";
	var num = num.toString().replace(/\$|\,/g,'');
	if(isNaN(num))
	num = "0";
	var sign = (num == (num = Math.abs(num)));
	num = Math.floor(num*100+0.50000000001);
	var cents = num%100;
	num = Math.floor(num/100).toString();
	var addZero = "";
	if(cents&amp;lt;10) {
		addZero = "0";
	}
	for (var i = 0; i &amp;lt; Math.floor((num.length-(1+i))/3); i++) {
		num = num.substring(0,num.length-(4*i+3))+','+num.substring(num.length-(4*i+3));
	}
	retVal = (((sign)?'':'-') + '$' + num + '.' +addZero+ cents)
	return retVal;
}

function dblToFloat(inNumber)
{
	var retVal = parseFloat(inNumber.toString().replace(",", "."));
	return retVal;
}


function dblSetAnswerVisible(inQTarget,inValue,inReset,inAnswers)
{
	var retVal = false;
	var numOfAnswers = inAnswers.length;
	var i;
	if (inReset) {
		SetAnswerVisible(CurrQues,true);
	}
	for (i=0;i&amp;lt; numOfAnswers;i++) {
		SetAnswerVisible(inQTarget, inAnswers[i], inValue);
	}
	return retVal;
}


function dblContainsByText(inQIdx, inText)
{
	var retVal = false;
	var i=0;
	for (i=0; i&amp;lt;GetAnswerCount(inQIdx); i++){
		var idx = i+1;
		var text = AnswerText(inQIdx,idx);
		if (text == inText) {
			if (Contains(inQIdx,idx)) {
				retVal = true;
				break;
			}
		}
	}
	return retVal;
}


function dblFilterAnswersByAnswersByText (inTargetQ, inShow,inSourceQ)
{
	SetAnswerVisible(inTargetQ,!inShow);	
	var i =0;
	for (i=0; i&amp;lt;GetAnswerCount(inTargetQ);i++){
		var idx = i+1;
		var text = AnswerText(inTargetQ,idx);
		if (dblContainsByText(inSourceQ,text)) {
			SetAnswerVisible(inTargetQ,idx,inShow);	
		}
	}
	
	return true;
}

function dblFilterTopicsByAnswersByText (inTargetQ, inShow, inSourceQ)
{
	SetTopicVisible(inTargetQ,!inShow);	
	var i=0;
	for (i=0; i&amp;lt;GetTopicCount(inTargetQ); i++){
		var idx = i+1;
		var text = GetTopicOriginalText(inTargetQ,idx);
		if (dblContainsByText(inSourceQ,text)) {
			SetTopicVisible(inTargetQ,idx,inShow);	
		}
	}
	
	return true;
}

function dblGetSubjectStoreRow(inStoreName,inIDColumnName,inID)
{
	var retVal = null;
	try {
		var table = GetTableFromStore(inStoreName,"","@@"+inIDColumnName+"='"+inID+"'","");
		if (table != null &amp;amp;&amp;amp; table.RowCount &amp;gt;0) {
			var row = table[0];
			retVal = row;
		}
	}
	catch(err)
	{
		retVal = null;	
	}

	return retVal;
}

function dblIsRegEx (pattern,value) {
	var pattern = new RegExp(pattern);
	return pattern.test(value);
}

function dblDateToSQLDate(inDate)
{
	var retVal = "";
	retVal = inDate.Year+"-"+inDate.Month+"-"+inDate.Day;	
	return retVal;
}

function dblOrderArray(inOrderArray, inDataArray)
{
	var retVal = CreateRandomArray(inOrderArray.length);
	var i = 0;
	for (i = 0; i &amp;lt; inOrderArray.length; i++) {
		retVal[i] = inDataArray[inOrderArray[i]-1];
	}
	return retVal;
} 

function dblRespondentID ()
{
	var retVal = "".concat("D", SID, "-", DeviceIndex);
	return retVal;
}

function OnGPSUpdated(inLocation)
{
    if ((SubjectGPSLocation==null || !SubjectGPSLocation.IsValid) &amp;amp;&amp;amp; inLocation!=null &amp;amp;&amp;amp; inLocation.IsValid)
    {
        SubjectGPSLocation = inLocation;
    }
}
function myLocationDataValid ()
{
    var retVal = false;
    retVal = SubjectGPSLocation.IsValid;
    if (!retVal) {
        SubjectGPSLocation = GetGPSLocation();
        retVal = SubjectGPSLocation.IsValid;
        if (!retVal) {
            OpenGPS();
        }
    }
    return retVal;
}

function GPSValid ()
{
    var retVal = false;
    retVal = SubjectGPSLocation.IsValid;
    if (!retVal) {
        SubjectGPSLocation = GetGPSLocation();
        retVal = SubjectGPSLocation.IsValid;
        if (!retVal) {
            OpenGPS();
        }
    }
    return retVal;
}

	/*_@_USERCODE_END_@*/

	//_@_AddHandler_@{ Begin Add Handlers
	//_@_AddHandler_@} End Add Handlers

	//_@_HandlerZone_@{
		
		function QuestionStart_1()
		{
SetTextFormat(CurrQues,myLocationDataValid());
		}
		
		
		function QuestionStart_2()
		{
SetTextFormat(CurrQues,SubjectGPSLocation.Longitude,SubjectGPSLocation.Latitude);
		}
		
		
		function HandleQuestionValidate_1(ioValid)
		{
			/*_@_CC_@{1}_@_CC_@*/
			ioValid.outMessage = "";
			ioValid.outID = -1;
			ioValid.retVal = true;
			if (1 &amp;lt; 0) {{
			}}
			if (!myLocationDataValid()) {
				ioValid.retVal = false;
				ioValid.outMessage = "The GPS location was not recorded. You can't finish the survye like this, please step outside of the building and make sure you are under a clear sky and retry";
				ioValid.outID = 1;
				return;
			}
			
		}
		
	//_@_HandlerZone_@}


    function JSDBLInitAllScript()
    {
    }var eJumpQuestionResult = {ejqrNext:0, ejqrSubmit:1,ejqrCancel:2,ejqrFilter:3,ejqrNone:4,ejqrIndex:5,ejqrChapter:6};
var ePlatform = {None:0, Web:1, PC:2, PDA:4, MobileWeb:8, SmartPhone:16, Android:32, AllWindows:31, AllJSEnabled: 34, All:63};
var eAttachmentSource = {easDefault:0};
var eAskButtons = {OKCancel:0, YesNoCancel:1, YesNo:2};
var eAskResult = {None:0, OK:1, Yes:2, No:3, Cancel:4};
var eQuotaFilledResult = {Default:0,Filter:1,Cancel:2,Nothing:3};
var eExtraLabel = { MatrixLower:0, MatrixMiddle:1, MatrixUpper:2, MatrixIrrelevant:3, ScaleLower:4, ScaleMiddle:5, ScaleUpper:6, CountersTotal:7,CountersRemaining:8, NumericGridTotal:9, NumericGridRemaining:10 }; 
&lt;/Source&gt;
&lt;/UserLogicContents&gt;</ULSource><RestrictSPSS>False</RestrictSPSS><ExtraText1 /><ExtraBool1>False</ExtraBool1><ExtraBool2>False</ExtraBool2><ExtraInt1>-1</ExtraInt1><ExtraInt2>0</ExtraInt2><STGVersion>1.32.0.0</STGVersion><ULAssemblyData>AAEAAAD/////AQAAAAAAAAAMAgAAAEdVc2VyTG9naWNDcmVhdG9yLCBWZXJzaW9uPTEuMC4xLjMsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAKVN1cnZleVRvR28uVXNlckxvZ2ljLkNyZWF0b3IuQXNzZW1ibHlEYXRhEAAAAAZtVGFibGUNbVN1cnZleUNvbnN0cw9tU3VydmV5U25pcHBldHMNbUNoYXB0ZXJUYWJsZQ1tTGFzdEJ1Y2tldElEEW1MYXN0TWV0YUJ1Y2tldElED21TdXJ2ZXlJbml0Q29kZRBtU3VydmV5QmxvY2tDb2RlEW1MYXN0TGlzdFNvdXJjZUlEE21MYXN0Q3VzdG9tQWN0aW9uSUQHbUZsYXZvcg5tVXNlR2xvYmFsQ29kZQttVXNlT3JnQ29kZQ5tU3RyaWN0SlNDaGVjaxdtTGFzdEF0dGFjaG1lbnRTb3VyY2VJRA5tU3VydmV5TmF2Q29kZQMDAwMAAAEBAAAEAAAAAAEeU3lzdGVtLkNvbGxlY3Rpb25zLkhhc2h0YWJsZVtdHFN5c3RlbS5Db2xsZWN0aW9ucy5IYXNodGFibGUeU3lzdGVtLkNvbGxlY3Rpb25zLkhhc2h0YWJsZVtdHlN5c3RlbS5Db2xsZWN0aW9ucy5IYXNodGFibGVbXQgICAgkU3VydmV5VG9Hby5Vc2VyTG9naWMuQ3JlYXRvci5lRmxhdm9yAgAAAAEBAQgCAAAACQMAAAAJBAAAAAkFAAAACQYAAAABAAAAAgAAAAYHAAAAAAYIAAAAqgZmdW5jdGlvbiBPbkdQU1VwZGF0ZWQoaW5Mb2NhdGlvbikNCnsNCiAgICBpZiAoKFN1YmplY3RHUFNMb2NhdGlvbj09bnVsbCB8fCAhU3ViamVjdEdQU0xvY2F0aW9uLklzVmFsaWQpICYmIGluTG9jYXRpb24hPW51bGwgJiYgaW5Mb2NhdGlvbi5Jc1ZhbGlkKQ0KICAgIHsNCiAgICAgICAgU3ViamVjdEdQU0xvY2F0aW9uID0gaW5Mb2NhdGlvbjsNCiAgICB9DQp9DQpmdW5jdGlvbiBteUxvY2F0aW9uRGF0YVZhbGlkICgpDQp7DQogICAgdmFyIHJldFZhbCA9IGZhbHNlOw0KICAgIHJldFZhbCA9IFN1YmplY3RHUFNMb2NhdGlvbi5Jc1ZhbGlkOw0KICAgIGlmICghcmV0VmFsKSB7DQogICAgICAgIFN1YmplY3RHUFNMb2NhdGlvbiA9IEdldEdQU0xvY2F0aW9uKCk7DQogICAgICAgIHJldFZhbCA9IFN1YmplY3RHUFNMb2NhdGlvbi5Jc1ZhbGlkOw0KICAgICAgICBpZiAoIXJldFZhbCkgew0KICAgICAgICAgICAgT3BlbkdQUygpOw0KICAgICAgICB9DQogICAgfQ0KICAgIHJldHVybiByZXRWYWw7DQp9DQoNCmZ1bmN0aW9uIEdQU1ZhbGlkICgpDQp7DQogICAgdmFyIHJldFZhbCA9IGZhbHNlOw0KICAgIHJldFZhbCA9IFN1YmplY3RHUFNMb2NhdGlvbi5Jc1ZhbGlkOw0KICAgIGlmICghcmV0VmFsKSB7DQogICAgICAgIFN1YmplY3RHUFNMb2NhdGlvbiA9IEdldEdQU0xvY2F0aW9uKCk7DQogICAgICAgIHJldFZhbCA9IFN1YmplY3RHUFNMb2NhdGlvbi5Jc1ZhbGlkOw0KICAgICAgICBpZiAoIXJldFZhbCkgew0KICAgICAgICAgICAgT3BlbkdQUygpOw0KICAgICAgICB9DQogICAgfQ0KICAgIHJldHVybiByZXRWYWw7DQp9DQoBAAAAAQAAAAX3////JFN1cnZleVRvR28uVXNlckxvZ2ljLkNyZWF0b3IuZUZsYXZvcgEAAAAHdmFsdWVfXwAIAgAAAAIAAAABAQEBAAAACQcAAAAHAwAAAAABAAAABgAAAAMcU3lzdGVtLkNvbGxlY3Rpb25zLkhhc2h0YWJsZQkLAAAACQwAAAAJDQAAAAkOAAAACQ8AAAAJEAAAAAQEAAAAHFN5c3RlbS5Db2xsZWN0aW9ucy5IYXNodGFibGUHAAAACkxvYWRGYWN0b3IHVmVyc2lvbghDb21wYXJlchBIYXNoQ29kZVByb3ZpZGVyCEhhc2hTaXplBEtleXMGVmFsdWVzAAADAwAFBQsIHFN5c3RlbS5Db2xsZWN0aW9ucy5JQ29tcGFyZXIkU3lzdGVtLkNvbGxlY3Rpb25zLklIYXNoQ29kZVByb3ZpZGVyCOxROD8AAAAACgoLAAAACREAAAAJEgAAAAcFAAAAAAEAAAAFAAAAAxxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlCRMAAAAJFAAAAAkVAAAACRYAAAAJFwAAAAcGAAAAAAEAAAAIAAAAAxxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlCRgAAAAJGQAAAAkaAAAACRsAAAAJHAAAAAkdAAAACR4AAAAJHwAAAAELAAAABAAAAOxROD8AAAAACgoLAAAACSAAAAAJIQAAAAEMAAAABAAAAOxROD8AAAAACgoLAAAACSIAAAAJIwAAAAENAAAABAAAAOxROD8HAAAACgoLAAAACSQAAAAJJQAAAAEOAAAABAAAAOxROD8AAAAACgoLAAAACSYAAAAJJwAAAAEPAAAABAAAAOxROD8HAAAACgoLAAAACSgAAAAJKQAAAAEQAAAABAAAAOxROD8AAAAACgoLAAAACSoAAAAJKwAAABARAAAAAAAAABASAAAAAAAAAAETAAAABAAAAOxROD8AAAAACgoLAAAACSwAAAAJLQAAAAEUAAAABAAAAOxROD8AAAAACgoLAAAACS4AAAAJLwAAAAEVAAAABAAAAOxROD8AAAAACgoLAAAACTAAAAAJMQAAAAEWAAAABAAAAOxROD8AAAAACgoLAAAACTIAAAAJMwAAAAEXAAAABAAAAOxROD8AAAAACgoLAAAACTQAAAAJNQAAAAEYAAAABAAAAOxROD8AAAAACgoLAAAACTYAAAAJNwAAAAEZAAAABAAAAOxROD8AAAAACgoLAAAACTgAAAAJOQAAAAEaAAAABAAAAOxROD8AAAAACgoLAAAACToAAAAJOwAAAAEbAAAABAAAAOxROD8AAAAACgoLAAAACTwAAAAJPQAAAAEcAAAABAAAAOxROD8AAAAACgoLAAAACT4AAAAJPwAAAAEdAAAABAAAAOxROD8AAAAACgoLAAAACUAAAAAJQQAAAAEeAAAABAAAAOxROD8AAAAACgoLAAAACUIAAAAJQwAAAAEfAAAABAAAAOxROD8AAAAACgoLAAAACUQAAAAJRQAAABAgAAAAAAAAABAhAAAAAAAAABAiAAAAAAAAABAjAAAAAAAAABAkAAAAAQAAAAgIAQAAABAlAAAAAQAAAAlGAAAAECYAAAAAAAAAECcAAAAAAAAAECgAAAACAAAACAgCAAAACAgBAAAAECkAAAACAAAACUcAAAAJSAAAABAqAAAAAAAAABArAAAAAAAAABAsAAAAAAAAABAtAAAAAAAAABAuAAAAAAAAABAvAAAAAAAAABAwAAAAAAAAABAxAAAAAAAAABAyAAAAAAAAABAzAAAAAAAAABA0AAAAAAAAABA1AAAAAAAAABA2AAAAAAAAABA3AAAAAAAAABA4AAAAAAAAABA5AAAAAAAAABA6AAAAAAAAABA7AAAAAAAAABA8AAAAAAAAABA9AAAAAAAAABA+AAAAAAAAABA/AAAAAAAAABBAAAAAAAAAABBBAAAAAAAAABBCAAAAAAAAABBDAAAAAAAAABBEAAAAAAAAABBFAAAAAAAAAAVGAAAAMVN1cnZleVRvR28uVXNlckxvZ2ljLkNyZWF0b3IuUXVlc3Rpb25WYWxpZGF0ZUluZm8FAAAAGVF1ZXN0aW9uSW5mbyttUXVlc3Rpb25JZHgWUXVlc3Rpb25JbmZvK21IYXNFcnJvciJRdWVzdGlvbkluZm8rbVF1ZXN0aW9uRGVwZW5kZW5jaWVzIVF1ZXN0aW9uSW5mbyttQ2hhcHRlckRlcGVuZGVuY2llcwx2YWxpZGF0ZUluZm8AAAMDBAgBHFN5c3RlbS5Db2xsZWN0aW9ucy5BcnJheUxpc3QcU3lzdGVtLkNvbGxlY3Rpb25zLkFycmF5TGlzdClTdXJ2ZXlUb0dvLlVzZXJMb2dpYy5DcmVhdG9yLlZhbGlkYXRlSW5mbwIAAAACAAAAAQAAAAAJSQAAAAlKAAAACUsAAAAFRwAAACtTdXJ2ZXlUb0dvLlVzZXJMb2dpYy5DcmVhdG9yLlF1ZXN0aW9uQWN0aW9uBQAAABlRdWVzdGlvbkluZm8rbVF1ZXN0aW9uSWR4FlF1ZXN0aW9uSW5mbyttSGFzRXJyb3IiUXVlc3Rpb25JbmZvK21RdWVzdGlvbkRlcGVuZGVuY2llcyFRdWVzdGlvbkluZm8rbUNoYXB0ZXJEZXBlbmRlbmNpZXMGQWN0aW9uAAADAwEIARxTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0HFN5c3RlbS5Db2xsZWN0aW9ucy5BcnJheUxpc3QCAAAAAgAAAAAJTAAAAAlNAAAABk4AAABRU2V0VGV4dEZvcm1hdChDdXJyUXVlcyxTdWJqZWN0R1BTTG9jYXRpb24uTG9uZ2l0dWRlLFN1YmplY3RHUFNMb2NhdGlvbi5MYXRpdHVkZSk7AUgAAABHAAAAAQAAAAAJTwAAAAlQAAAABlEAAAAuU2V0VGV4dEZvcm1hdChDdXJyUXVlcyxteUxvY2F0aW9uRGF0YVZhbGlkKCkpOwRJAAAAHFN5c3RlbS5Db2xsZWN0aW9ucy5BcnJheUxpc3QDAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgUAAAgICVIAAAAAAAAAAAAAAAFKAAAASQAAAAlSAAAAAAAAAAAAAAAFSwAAAClTdXJ2ZXlUb0dvLlVzZXJMb2dpYy5DcmVhdG9yLlZhbGlkYXRlSW5mbwIAAAAKY29uZGl0aW9ucwZuZXh0SUQEAD1TdXJ2ZXlUb0dvLlVzZXJMb2dpYy5DcmVhdG9yLlZhbGlkYXRlSW5mbytWYWxpZGF0ZUNvbmRpdGlvbltdAgAAAAgCAAAACVMAAAACAAAAAUwAAABJAAAACVQAAAAAAAAAAAAAAAFNAAAASQAAAAlUAAAAAAAAAAAAAAABTwAAAEkAAAAJUgAAAAAAAAAAAAAAAVAAAABJAAAACVIAAAAAAAAAAAAAABBSAAAAAAAAAAdTAAAAAAEAAAABAAAABDtTdXJ2ZXlUb0dvLlVzZXJMb2dpYy5DcmVhdG9yLlZhbGlkYXRlSW5mbytWYWxpZGF0ZUNvbmRpdGlvbgIAAAAJVgAAABBUAAAAAAAAAAVWAAAAO1N1cnZleVRvR28uVXNlckxvZ2ljLkNyZWF0b3IuVmFsaWRhdGVJbmZvK1ZhbGlkYXRlQ29uZGl0aW9uAwAAAAljb25kaXRpb24DbXNnAklEBAEAJlN1cnZleVRvR28uVXNlckxvZ2ljLkNyZWF0b3IuQ29uZGl0aW9uAgAAAAgCAAAACVcAAAAGWAAAAJ8BVGhlIEdQUyBsb2NhdGlvbiB3YXMgbm90IHJlY29yZGVkLiBZb3UgY2FuJ3QgZmluaXNoIHRoZSBzdXJ2eWUgbGlrZSB0aGlzLCBwbGVhc2Ugc3RlcCBvdXRzaWRlIG9mIHRoZSBidWlsZGluZyBhbmQgbWFrZSBzdXJlIHlvdSBhcmUgdW5kZXIgYSBjbGVhciBza3kgYW5kIHJldHJ5AQAAAAVXAAAAJlN1cnZleVRvR28uVXNlckxvZ2ljLkNyZWF0b3IuQ29uZGl0aW9uAQAAAAVtVGV4dAECAAAABlkAAAAWIW15TG9jYXRpb25EYXRhVmFsaWQoKQs=</ULAssemblyData><NumOfQuestionsInPage>-1</NumOfQuestionsInPage><Version>5</Version><NextChapterID>1</NextChapterID><DefaultChapterDesc /><Flags>272629772</Flags><NextAnswerID>1</NextAnswerID><ClientData /><DefaultFont /><Comment /><ExternalSystem>-1</ExternalSystem><NextScoreID>1</NextScoreID><LocationStoreID>3862</LocationStoreID><NextScaleID>1</NextScaleID><Mode>0</Mode><DefTextPanelHeight>-1</DefTextPanelHeight><DefAnswerPanelHeight>-1</DefAnswerPanelHeight><SurveyFlags2>65536</SurveyFlags2><NumOfQuestionsPDA>-1</NumOfQuestionsPDA><NumOfQuestionsPC>-1</NumOfQuestionsPC><NumOfQuestionsSmartPhone>-1</NumOfQuestionsSmartPhone><NextLangID>0</NextLangID><QuestionCounterResetText /><QuestionNumericResetText /><QuestionStopperResetText /><QuestionFormSurveyCanceled /><QuestionFormSurveyFiltered /><QuestionFormCanotExit /><QuestionFormSureToCancelNoSave /><QuestionFormSureToCancel /><QuestionFormSaved /><PromptOnSubmitText /><PromptOnCancelText /><PromptOnFilterText /><StartWithLangID>-1</StartWithLangID><ReportFlags>0</ReportFlags><SurveyFlags3>0</SurveyFlags3><ClientTypes>54</ClientTypes></Survey><SQs><ElemStr>H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Iv7Hv/cffPx7vFuU6WVeN0W1/Oyj3fHOR2m+nFazYnnx2Ufr9nz74KPf4+jx659o8M/R459Y501LTc+eHu0+vuv99fj1ur7Mr89mR/fOH073ds/Pt3ens0+39x/ev789yR/k259Opp/mnz7YffDg/OHju7b547PZu6Odx3fx4/Gb/F179GZeNCn9L0tn68XiOv1F2kvaFIt1mbWEWtrO87RhEI/v8kuPX2XLi/yLYgm87O/6afbu6L75lH6XT1+3+co25j8eH5dldfWsrLL26FlWNvnju94nduxvrle5P3r++/Gr4mLeHpfFxdK8633y+GneTOtihebvPT7/3cfPq6u85hHTb4/vuj8ff7Va6a/fpo4f33V/Pz59Ny3Xs3xmMLN/P349r+qWpu8XrX//nR0ak/lbSPFiXZYBJfiDx18UTUNI/mRWrvOjbXor+ODxT2Z1kU3K/EW2yI9+4ven74NPHv8+eXPCDAYiuj8ev6j0t73Hd+3vj+lnfrxsXuerrM7a8trg0/scszqrFm6U9m/9hloTsZrwa/Ohtvm8rtYrHpP/N01fmbcEaQezIb8SUds6A31307veX3v2rydVVe4evanXTHH7gftyz82H/US+PVu2u4yF+8t+sQcs3B+Pz+qaULrMlu1JVQIDIPBFViy/3ZJo0+9nTdDEdNr9mKa8fVVd0a+VI1Lw2ePTJfW6nOav1mUuwyxa8/t31ovV2fK8YrTtH9RkRRyFybeUsB+wuH/7zRfP8T5x3tXraUZMsl402jb8jHj/opg+K7OLBiTw/nr8Kl/O8pr4Rf4mBup8ItSDxBoKPSmWT7M2Ozo+/uyzx3fNX4+f1XmOJs+LRdHyWMJPHlOz/E2xyJ9V9YK0Ajgi/ISY5Txbl+3rt8XqST7PLouqFsbpf/yYBvamWhXT5mz5MrtgtdL96PGXpAzq16t8SmJkZOr3f/34bu/zxyfzbNXmNckv9ef+IBlaLPIlD/tk3bTVwqiu58Xy7dHhITXuf/z4uG2z6RwvNnjzuzn0GSDrb49fT6uaZRpfPy+a9nW1rqf2r6dFsyqza/Mnawf8QQP88pxYar1YNjpg9/djHvvLnOAsWwyf+ut+RKhMTsqC/nrNihFAw/lmGel+9Fhk/WW2zMtvyxAwv/1PHzPPEeHwtfndG6B+E3xACICv3xStiIP8eUYYvGMj4/35mIZybthQvmABE7Xj/f341ZtnrMB/8e9bt+e7v+/5pJgVze+bLZvi953l5+c7v/j3Pa+WbTsp6Zed3/d8WZS/7/l0ntVN3u6kb7J5tcgOf8kv+Y2T3/eyyK/eFsvZ/u+7nu7+vqQxZ79v2db08/ctyfrt7tx78PtOGESz+yB9P/sEaL9xQp0Q7oouy3WXzN3PZKKZuvK9+7MzmfeOdnf29rvzeY8ETRjMES/4gPTe8bQtLo3isX8+fkGoyKzTxN0jBvT/5m8ZGREj/8/HZwviPx5JXa1YC3U+eXy2bNp6PQW9WGr8vx2i/U+VEax28/9UJfqyagp2AnaMFrWfaIvn+fKinbvv9e8OPff7wrHvK1cWHv9PHzeVLO/vx189t6Ktv5JhQjPvL/PN03zqfYO/PDUTSFfkY2GZZuCFwS9V7ofeG/5W+vt2nhGlaMh5ppzc+1R7IEv5epVNcw+s/UibdL/XL8nZeMu8/7rNAm0Q+dw1Pl3OIk3tp+SnzWZlbjSNU1fWcBTn1181+e+VX1t7v7nRAAx8J07HaojIA189ho+ycVY3NuDXN8/u5haM8gnJUL4J8cEGHcG63xes+0dkQX6iFzvtfYOx064fO303a9LPX75Op2T713U+S9fLtijTZXX1KP3FO78kJeZIq3NPfY9F3VsdP8+g+C+zsphl/MF0nk/fpm2VLrK3/FLOb6OTsppKm4JcvfSK3jTd/hwFZQ+/flD2jRJuPB7/EMO2vWjYJkbva0dtez+K2n4Utf0oavtGo7a9H0Vt/x+K2pgd/78TtW0yYL/vL975fX9JKpHaexmyr+8BSGf/Xw8Od///HBz+KDj8UXD4o+Dw/33B4b1vMDjc84NDNg9VVZOLTs5Pk9K487TOyR+goOLRb5w8r5YXHO3Qr1lLv+3Sb79PtSalvoQhSZvsPC+v0/NiWTTzn/s1uIdfP9zbTIrUUiI1hEg30OGHG+7d+9kI9+79KNz7+Rfu/Sjc+1kN9+79KNz7/1C4d+//W+HeZgMmcZdYMQ7+9AMYs9/3F++av29j2/+/HsLt/CiE+1EI96MQ7kch3M9qCEf/NEf/D9wK5cxQKQAA</ElemStr></SQs><SANs><ElemStr>H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Iv7Hv/cffPx7vFuU6WVeN0W1/Oyj3fHOR2m+nFazYnnx2Ufr9nz74KPf4+jx6+MXDf979Ph42Vzl9dnTo53Hd+3vj39inTctgaDfdx/f9f56fDZ7h6b48fhN/q49yh7f5Z+PX8+ruqUm2fL339nZxf8f3zWfOYDyuv/n45/M6iKblPmLbJEfHf/+u78/vRh89viEBwBU9LfHr9f1ZX5NkO+dP5zu7Z6fb+9OZ59u7z+8f397kj/Itz+dTD/NP32w++DB+UPCwzR//DQv8zafAQnz6+PvrBers+V5dbRNPdg/Hp++a+sMY9tN7+pfT6qq3D16lpVN/viu94l8e7ZsdwHY/aGYf7U8mefTt9Jt9yNtY/60g7TfA4Vvv/niObB4VmYXDaDIL4+/bOd5/XqVT4lgTKvXQr/e59TLYpEvWwD5bl5czFtA0d8ev55WdY4P5JfHZ83raVbmZqTmz8ev8hVNKBACnFf5ZZFfub/w3dlylr9jQvp/P36Z1+dhw5OqrGqvofz9+GnRrMrs2n0bfECIHU/b4jI/elOvGTH98/GXdXFRLLOSEaWJxqvdzx6/rPMmJ06Y+a16Hz4+W2QXObB9WVcrpnbnE2lxNsNovnr+k1m5zr1faebxjveX+eZpPvW+wV+PX2XLWbX4vK7WKyGG97dSys65/ydNFcQ3lOHd28vwri/Dk0EZ3vu6Mrw3IMN7P5LhW8nw3o9k+OenDO/dXob3fBmeDsrwva8rw/cGZPjej2T4VjJ870cy/PNFhu+yS/3/AFaCkpiCCwAA</ElemStr></SANs><STos><ElemStr>H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Iv7Hv/cffPx7vFuU6WVeN0W1/Oyj3fHOR2m+nFazYnnx2Ufr9nz74KPf4+jx6zdVk949+n8AZjUmjDEAAAA=</ElemStr></STos><SCs><ElemStr>H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Iv7Hv/cffPx7vFuU6WVeN0W1/Oyj3fHOR2m+nFazYnnx2Ufr9nz74KPf4+jx65MG/xw9Pnt6tPP4Lv37+EW2yI++90VWLNOTebZq8/r7j+/yh49fr+vL/Joa3Tt/ON3bPT/f3p3OPt3ef3j//vYkf5BvfzqZfpp/+mD3wYPzh4/v2uaPn+Zl3uYzdGF+ffwyq/NlS99u7z6+a/94/Ly6KKbPyuyiQWvvr8ev8uUsr+WP+4/v+n9SB820LlYtDfbozbxoUvpfO8/TuqradCrDSKvzNCtL/vwXrfMGjZu7zXqyrQ3orSV/2zDio984+Y2T36dap9NsmS4JTp0vqsucWhBwfWWUZssZQ3UQLbTFumnTSZ6ugWjw2tgHvaBJOb9Oi7ZJV3W1yuu2yJt0a0kkH6UzN7BR2ubv2jRvp+M7oKMb8eM3+OLu0ePTd22dPamqcvfoWVY2+eO73ifu272jN/Xa/3JPvzxbtrs8H+4v+8Ue5sP98fhs9o6b4icj8O03XzwHEifVYkGTiV+/mxcX8xYv6m+PX0+rOgc34etX+aqq25OszS+q+rrHdJ2vtfmboi357S+yd2fUMGMSAJPgg8fPi6Z9Xa3raX4246+DDxjjl9kyL78tmKFF97PHr948w2dHv/j3rdvz3d/3fFLMiub3zZZNwf9MVxe7e/fv/76z/Px8B/+W2fJid+feg1/8+55Xy7adlPTLzu97vizK3/ecpr5u8nYnfZPNq0V2+Et+yW+c/L6XRX71tljO9n/f9XT3911l9ez3Lduafv6+E36z2X2AT3/jhBoTQRSdx6+I66rF53W1XjHi/t+Pz5rjaVtc5jrJ9s+AYM2b6vQdyNmjnPuGJPiE/2mO/h8b5awyUgQAAA==</ElemStr></SCs><SBNs><ElemStr>H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Iv7Hv/cffPx7vFuU6WVeN0W1/Oyj3fHOR2m+nFazYnnx2Ufr9nz74KPf4+jx6ycvmvTu0f8DVNIIpTEAAAA=</ElemStr></SBNs><SATs><ElemStr>H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Iv7Hv/cffPx7vFuU6WVeN0W1/Oyj3fHOR2m+nFazYnnx2Ufr9nz74KPf4+jx6+M3TXr36P8B2S/MCTEAAAA=</ElemStr></SATs><SSCOs><ElemStr>H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Iv7Hv/cffPx7vFuU6WVeN0W1/Oyj3fHOR2m+nFazYnnx2Ufr9nz74KPf4+jx69cnXzbp3aP/B1t6G+cyAAAA</ElemStr></SSCOs><SPs><ElemStr>H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Iv7Hv/cffPx7vFuU6WVeN0W1/Oyj3fHOR2m+nFazYnnx2Ufr9nz74KPf4+jx65dNevfo/wF1B76WMAAAAA==</ElemStr></SPs><RGs><ElemStr>H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Iv7Hv/cffPx7vFuU6WVeN0W1/Oyj3fHOR2m+nFazYnnx2Ufr9nz74KPf4+jxq8+b9O7R/wNCnyKPMAAAAA==</ElemStr></RGs><CSs><ElemStr>H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Iv7Hv/cffPx7vFuU6WVeN0W1/Oyj3fHOR2m+nFazYnnx2Ufr9nz74KPf4+jxyesmvXv0/wA+f8jSMAAAAA==</ElemStr></CSs><SSCs><ElemStr>H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Iv7Hv/cffPx7vFuU6WVeN0W1/Oyj3fHOR2m+nFazYnnx2Ufr9nz74KPf4+jx69cnTXr36P8B28cSlTEAAAA=</ElemStr></SSCs><QAs><ElemStr>H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Iv7Hv/cffPx7vFuU6WVeN0W1/Oyj3fHOR2m+nFazYnnx2Ufr9nz74KPf4+jxTxw36d2j/wdMGPaGMAAAAA==</ElemStr></QAs><SLs><ElemStr>H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Iv7Hv/cffPx7vFuU6WVeN0W1/Oyj3fHOR2m+nFazYnnx2Ufr9nz74KPf4+jx6+dNevfo/wH2fa4zMAAAAA==</ElemStr></SLs><STes><ElemStr>H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Iv7Hv/cffPx7vFuU6WVeN0W1/Oyj3fHOR2m+nFazYnnx2Ufr9nz74KPf4+jx6zd5k949+n8Axy2WxjEAAAA=</ElemStr></STes><SMBs><ElemStr>H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Iv7Hv/cffPx7vFuU6WVeN0W1/Oyj3fHOR2m+nFazYnnx2Ufr9nz74KPf4+jx6y+eNPwv/bOuL/Prs6dH984fTvd2z8+3d6ezT7f3H96/vz3JH+Tbn06mn+afPth98OD84eO7tvnjJ+vp27yl33Ye37W/66cvskWe3j16/DQ/z9Zl+xPrqs3QLvj78ZvrVY5P+efjn1jnTUtYE5Tt3cd3vT8fv8zqfNnqF/aPx18tT+Y5dTc7XjZXNOQnhBd6vSsD+2ZGtxsf3dGL/Cp9Pc/z1nzPn95mxPfeZ8Q7tx/wXZ7V/wfV/v2CBQIAAA==</ElemStr></SMBs></Root>