{{# def.definitions }}
							 | 
						|
								{{# def.errors }}
							 | 
						|
								{{# def.setupKeyword }}
							 | 
						|
								{{# def.$data }}
							 | 
						|
								
							 | 
						|
								{{
							 | 
						|
								  var $rule = this
							 | 
						|
								    , $definition = 'definition' + $lvl
							 | 
						|
								    , $rDef = $rule.definition
							 | 
						|
								    , $closingBraces = '';
							 | 
						|
								  var $validate = $rDef.validate;
							 | 
						|
								  var $compile, $inline, $macro, $ruleValidate, $validateCode;
							 | 
						|
								}}
							 | 
						|
								
							 | 
						|
								{{? $isData && $rDef.$data }}
							 | 
						|
								  {{
							 | 
						|
								    $validateCode = 'keywordValidate' + $lvl;
							 | 
						|
								    var $validateSchema = $rDef.validateSchema;
							 | 
						|
								  }}
							 | 
						|
								  var {{=$definition}} = RULES.custom['{{=$keyword}}'].definition;
							 | 
						|
								  var {{=$validateCode}} = {{=$definition}}.validate;
							 | 
						|
								{{??}}
							 | 
						|
								  {{
							 | 
						|
								    $ruleValidate = it.useCustomRule($rule, $schema, it.schema, it);
							 | 
						|
								    if (!$ruleValidate) return;
							 | 
						|
								    $schemaValue = 'validate.schema' + $schemaPath;
							 | 
						|
								    $validateCode = $ruleValidate.code;
							 | 
						|
								    $compile = $rDef.compile;
							 | 
						|
								    $inline = $rDef.inline;
							 | 
						|
								    $macro = $rDef.macro;
							 | 
						|
								  }}
							 | 
						|
								{{?}}
							 | 
						|
								
							 | 
						|
								{{
							 | 
						|
								  var $ruleErrs = $validateCode + '.errors'
							 | 
						|
								    , $i = 'i' + $lvl
							 | 
						|
								    , $ruleErr = 'ruleErr' + $lvl
							 | 
						|
								    , $asyncKeyword = $rDef.async;
							 | 
						|
								
							 | 
						|
								  if ($asyncKeyword && !it.async)
							 | 
						|
								    throw new Error('async keyword in sync schema');
							 | 
						|
								}}
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								{{? !($inline || $macro) }}{{=$ruleErrs}} = null;{{?}}
							 | 
						|
								var {{=$errs}} = errors;
							 | 
						|
								var {{=$valid}};
							 | 
						|
								
							 | 
						|
								{{## def.callRuleValidate:
							 | 
						|
								  {{=$validateCode}}.call(
							 | 
						|
								    {{? it.opts.passContext }}this{{??}}self{{?}}
							 | 
						|
								    {{? $compile || $rDef.schema === false }}
							 | 
						|
								      , {{=$data}}
							 | 
						|
								    {{??}}
							 | 
						|
								      , {{=$schemaValue}}
							 | 
						|
								      , {{=$data}}
							 | 
						|
								      , validate.schema{{=it.schemaPath}}
							 | 
						|
								    {{?}}
							 | 
						|
								    , {{# def.dataPath }}
							 | 
						|
								    {{# def.passParentData }}
							 | 
						|
								    , rootData
							 | 
						|
								  )
							 | 
						|
								#}}
							 | 
						|
								
							 | 
						|
								{{## def.extendErrors:_inline:
							 | 
						|
								  for (var {{=$i}}={{=$errs}}; {{=$i}}<errors; {{=$i}}++) {
							 | 
						|
								    var {{=$ruleErr}} = vErrors[{{=$i}}];
							 | 
						|
								    if ({{=$ruleErr}}.dataPath === undefined)
							 | 
						|
								      {{=$ruleErr}}.dataPath = (dataPath || '') + {{= it.errorPath }};
							 | 
						|
								    {{# _inline ? 'if (\{\{=$ruleErr\}\}.schemaPath === undefined) {' : '' }}
							 | 
						|
								      {{=$ruleErr}}.schemaPath = "{{=$errSchemaPath}}";
							 | 
						|
								    {{# _inline ? '}' : '' }}
							 | 
						|
								    {{? it.opts.verbose }}
							 | 
						|
								      {{=$ruleErr}}.schema = {{=$schemaValue}};
							 | 
						|
								      {{=$ruleErr}}.data = {{=$data}};
							 | 
						|
								    {{?}}
							 | 
						|
								  }
							 | 
						|
								#}}
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								{{? $isData && $rDef.$data }}
							 | 
						|
								  {{ $closingBraces += '}'; }}
							 | 
						|
								  if ({{=$schemaValue}} === undefined) {
							 | 
						|
								    {{=$valid}} = true;
							 | 
						|
								  } else {
							 | 
						|
								  {{? $validateSchema }}
							 | 
						|
								    {{ $closingBraces += '}'; }}
							 | 
						|
								    {{=$valid}} = {{=$definition}}.validateSchema({{=$schemaValue}});
							 | 
						|
								    if ({{=$valid}}) {
							 | 
						|
								  {{?}}
							 | 
						|
								{{?}}
							 | 
						|
								
							 | 
						|
								{{? $inline }}
							 | 
						|
								  {{? $rDef.statements }}
							 | 
						|
								    {{= $ruleValidate.validate }}
							 | 
						|
								  {{??}}
							 | 
						|
								    {{=$valid}} = {{= $ruleValidate.validate }};
							 | 
						|
								  {{?}}
							 | 
						|
								{{?? $macro }}
							 | 
						|
								  {{# def.setupNextLevel }}
							 | 
						|
								  {{
							 | 
						|
								    $it.schema = $ruleValidate.validate;
							 | 
						|
								    $it.schemaPath = '';
							 | 
						|
								  }}
							 | 
						|
								  {{# def.setCompositeRule }}
							 | 
						|
								  {{ var $code = it.validate($it).replace(/validate\.schema/g, $validateCode); }}
							 | 
						|
								  {{# def.resetCompositeRule }}
							 | 
						|
								  {{= $code }}
							 | 
						|
								{{??}}
							 | 
						|
								  {{# def.beginDefOut}}
							 | 
						|
								    {{# def.callRuleValidate }}
							 | 
						|
								  {{# def.storeDefOut:def_callRuleValidate }}
							 | 
						|
								
							 | 
						|
								  {{? $rDef.errors === false }}
							 | 
						|
								    {{=$valid}} = {{? $asyncKeyword }}await {{?}}{{= def_callRuleValidate }};
							 | 
						|
								  {{??}}
							 | 
						|
								    {{? $asyncKeyword }}
							 | 
						|
								      {{ $ruleErrs = 'customErrors' + $lvl; }}
							 | 
						|
								      var {{=$ruleErrs}} = null;
							 | 
						|
								      try {
							 | 
						|
								        {{=$valid}} = await {{= def_callRuleValidate }};
							 | 
						|
								      } catch (e) {
							 | 
						|
								        {{=$valid}} = false;
							 | 
						|
								        if (e instanceof ValidationError) {{=$ruleErrs}} = e.errors;
							 | 
						|
								        else throw e;
							 | 
						|
								      }
							 | 
						|
								    {{??}}
							 | 
						|
								      {{=$ruleErrs}} = null;
							 | 
						|
								      {{=$valid}} = {{= def_callRuleValidate }};
							 | 
						|
								    {{?}}
							 | 
						|
								  {{?}}
							 | 
						|
								{{?}}
							 | 
						|
								
							 | 
						|
								{{? $rDef.modifying }}
							 | 
						|
								  if ({{=$parentData}}) {{=$data}} = {{=$parentData}}[{{=$parentDataProperty}}];
							 | 
						|
								{{?}}
							 | 
						|
								
							 | 
						|
								{{= $closingBraces }}
							 | 
						|
								
							 | 
						|
								{{## def.notValidationResult:
							 | 
						|
								  {{? $rDef.valid === undefined }}
							 | 
						|
								    !{{? $macro }}{{=$nextValid}}{{??}}{{=$valid}}{{?}}
							 | 
						|
								  {{??}}
							 | 
						|
								    {{= !$rDef.valid }}
							 | 
						|
								  {{?}}
							 | 
						|
								#}}
							 | 
						|
								
							 | 
						|
								{{? $rDef.valid }}
							 | 
						|
								  {{? $breakOnError }} if (true) { {{?}}
							 | 
						|
								{{??}}
							 | 
						|
								  if ({{# def.notValidationResult }}) {
							 | 
						|
								    {{ $errorKeyword = $rule.keyword; }}
							 | 
						|
								    {{# def.beginDefOut}}
							 | 
						|
								      {{# def.error:'custom' }}
							 | 
						|
								    {{# def.storeDefOut:def_customError }}
							 | 
						|
								
							 | 
						|
								    {{? $inline }}
							 | 
						|
								      {{? $rDef.errors }}
							 | 
						|
								        {{? $rDef.errors != 'full' }}
							 | 
						|
								          {{# def.extendErrors:true }}
							 | 
						|
								        {{?}}
							 | 
						|
								      {{??}}
							 | 
						|
								        {{? $rDef.errors === false}}
							 | 
						|
								          {{= def_customError }}
							 | 
						|
								        {{??}}
							 | 
						|
								          if ({{=$errs}} == errors) {
							 | 
						|
								            {{= def_customError }}
							 | 
						|
								          } else {
							 | 
						|
								            {{# def.extendErrors:true }}
							 | 
						|
								          }
							 | 
						|
								        {{?}}
							 | 
						|
								      {{?}}
							 | 
						|
								    {{?? $macro }}
							 | 
						|
								      {{# def.extraError:'custom' }}
							 | 
						|
								    {{??}}
							 | 
						|
								      {{? $rDef.errors === false}}
							 | 
						|
								        {{= def_customError }}
							 | 
						|
								      {{??}}
							 | 
						|
								        if (Array.isArray({{=$ruleErrs}})) {
							 | 
						|
								          if (vErrors === null) vErrors = {{=$ruleErrs}};
							 | 
						|
								          else vErrors = vErrors.concat({{=$ruleErrs}});
							 | 
						|
								          errors = vErrors.length;
							 | 
						|
								          {{# def.extendErrors:false }}
							 | 
						|
								        } else {
							 | 
						|
								          {{= def_customError }}
							 | 
						|
								        }
							 | 
						|
								      {{?}}
							 | 
						|
								    {{?}}
							 | 
						|
								
							 | 
						|
								  } {{? $breakOnError }} else { {{?}}
							 | 
						|
								{{?}}
							 |