| {{# def.definitions }} | 
| {{# def.errors }} | 
| {{# def.setupKeyword }} | 
| {{# def.setupNextLevel }} | 
|   | 
|   | 
| {{## def.validateAdditional: | 
|   {{ /* additionalProperties is schema */ | 
|     $it.schema = $aProperties; | 
|     $it.schemaPath = it.schemaPath + '.additionalProperties'; | 
|     $it.errSchemaPath = it.errSchemaPath + '/additionalProperties'; | 
|     $it.errorPath = it.opts._errorDataPathProperty | 
|                     ? it.errorPath | 
|                     : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); | 
|     var $passData = $data + '[' + $key + ']'; | 
|     $it.dataPathArr[$dataNxt] = $key; | 
|   }} | 
|   | 
|   {{# def.generateSubschemaCode }} | 
|   {{# def.optimizeValidate }} | 
| #}} | 
|   | 
|   | 
| {{ | 
|   var $key = 'key' + $lvl | 
|     , $idx = 'idx' + $lvl | 
|     , $dataNxt = $it.dataLevel = it.dataLevel + 1 | 
|     , $nextData = 'data' + $dataNxt | 
|     , $dataProperties = 'dataProperties' + $lvl; | 
|   | 
|   var $schemaKeys = Object.keys($schema || {}).filter(notProto) | 
|     , $pProperties = it.schema.patternProperties || {} | 
|     , $pPropertyKeys = Object.keys($pProperties).filter(notProto) | 
|     , $aProperties = it.schema.additionalProperties | 
|     , $someProperties = $schemaKeys.length || $pPropertyKeys.length | 
|     , $noAdditional = $aProperties === false | 
|     , $additionalIsSchema = typeof $aProperties == 'object' | 
|                               && Object.keys($aProperties).length | 
|     , $removeAdditional = it.opts.removeAdditional | 
|     , $checkAdditional = $noAdditional || $additionalIsSchema || $removeAdditional | 
|     , $ownProperties = it.opts.ownProperties | 
|     , $currentBaseId = it.baseId; | 
|   | 
|   var $required = it.schema.required; | 
|   if ($required && !(it.opts.$data && $required.$data) && $required.length < it.opts.loopRequired) { | 
|     var $requiredHash = it.util.toHash($required); | 
|   } | 
|   | 
|   function notProto(p) { return p !== '__proto__'; } | 
| }} | 
|   | 
|   | 
| var {{=$errs}} = errors; | 
| var {{=$nextValid}} = true; | 
| {{? $ownProperties }} | 
|   var {{=$dataProperties}} = undefined; | 
| {{?}} | 
|   | 
| {{? $checkAdditional }} | 
|   {{# def.iterateProperties }} | 
|     {{? $someProperties }} | 
|       var isAdditional{{=$lvl}} = !(false | 
|         {{? $schemaKeys.length }} | 
|           {{? $schemaKeys.length > 8 }} | 
|             || validate.schema{{=$schemaPath}}.hasOwnProperty({{=$key}}) | 
|           {{??}} | 
|             {{~ $schemaKeys:$propertyKey }} | 
|               || {{=$key}} == {{= it.util.toQuotedString($propertyKey) }} | 
|             {{~}} | 
|           {{?}} | 
|         {{?}} | 
|         {{? $pPropertyKeys.length }} | 
|           {{~ $pPropertyKeys:$pProperty:$i }} | 
|             || {{= it.usePattern($pProperty) }}.test({{=$key}}) | 
|           {{~}} | 
|         {{?}} | 
|       ); | 
|   | 
|       if (isAdditional{{=$lvl}}) { | 
|     {{?}} | 
|     {{? $removeAdditional == 'all' }} | 
|       delete {{=$data}}[{{=$key}}]; | 
|     {{??}} | 
|       {{ | 
|         var $currentErrorPath = it.errorPath; | 
|         var $additionalProperty = '\' + ' + $key + ' + \''; | 
|         if (it.opts._errorDataPathProperty) { | 
|           it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); | 
|         } | 
|       }} | 
|       {{? $noAdditional }} | 
|         {{? $removeAdditional }} | 
|           delete {{=$data}}[{{=$key}}]; | 
|         {{??}} | 
|           {{=$nextValid}} = false; | 
|           {{ | 
|             var $currErrSchemaPath = $errSchemaPath; | 
|             $errSchemaPath = it.errSchemaPath + '/additionalProperties'; | 
|           }} | 
|           {{# def.error:'additionalProperties' }} | 
|           {{ $errSchemaPath = $currErrSchemaPath; }} | 
|           {{? $breakOnError }} break; {{?}} | 
|         {{?}} | 
|       {{?? $additionalIsSchema }} | 
|         {{? $removeAdditional == 'failing' }} | 
|           var {{=$errs}} = errors; | 
|           {{# def.setCompositeRule }} | 
|   | 
|           {{# def.validateAdditional }} | 
|   | 
|           if (!{{=$nextValid}}) { | 
|             errors = {{=$errs}}; | 
|             if (validate.errors !== null) { | 
|               if (errors) validate.errors.length = errors; | 
|               else validate.errors = null; | 
|             } | 
|             delete {{=$data}}[{{=$key}}]; | 
|           } | 
|   | 
|           {{# def.resetCompositeRule }} | 
|         {{??}} | 
|           {{# def.validateAdditional }} | 
|           {{? $breakOnError }} if (!{{=$nextValid}}) break; {{?}} | 
|         {{?}} | 
|       {{?}} | 
|       {{ it.errorPath = $currentErrorPath; }} | 
|     {{?}} | 
|     {{? $someProperties }} | 
|       } | 
|     {{?}} | 
|   } | 
|   | 
|   {{# def.ifResultValid }} | 
| {{?}} | 
|   | 
| {{ var $useDefaults = it.opts.useDefaults && !it.compositeRule; }} | 
|   | 
| {{? $schemaKeys.length }} | 
|   {{~ $schemaKeys:$propertyKey }} | 
|     {{ var $sch = $schema[$propertyKey]; }} | 
|   | 
|     {{? {{# def.nonEmptySchema:$sch}} }} | 
|       {{ | 
|         var $prop = it.util.getProperty($propertyKey) | 
|           , $passData = $data + $prop | 
|           , $hasDefault = $useDefaults && $sch.default !== undefined; | 
|         $it.schema = $sch; | 
|         $it.schemaPath = $schemaPath + $prop; | 
|         $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($propertyKey); | 
|         $it.errorPath = it.util.getPath(it.errorPath, $propertyKey, it.opts.jsonPointers); | 
|         $it.dataPathArr[$dataNxt] = it.util.toQuotedString($propertyKey); | 
|       }} | 
|   | 
|       {{# def.generateSubschemaCode }} | 
|   | 
|       {{? {{# def.willOptimize }} }} | 
|         {{ | 
|           $code = {{# def._optimizeValidate }}; | 
|           var $useData = $passData; | 
|         }} | 
|       {{??}} | 
|         {{ var $useData = $nextData; }} | 
|         var {{=$nextData}} = {{=$passData}}; | 
|       {{?}} | 
|   | 
|       {{? $hasDefault }} | 
|         {{= $code }} | 
|       {{??}} | 
|         {{? $requiredHash && $requiredHash[$propertyKey] }} | 
|           if ({{# def.noPropertyInData }}) { | 
|             {{=$nextValid}} = false; | 
|             {{ | 
|               var $currentErrorPath = it.errorPath | 
|                 , $currErrSchemaPath = $errSchemaPath | 
|                 , $missingProperty = it.util.escapeQuotes($propertyKey); | 
|               if (it.opts._errorDataPathProperty) { | 
|                 it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers); | 
|               } | 
|               $errSchemaPath = it.errSchemaPath + '/required'; | 
|             }} | 
|             {{# def.error:'required' }} | 
|             {{ $errSchemaPath = $currErrSchemaPath; }} | 
|             {{ it.errorPath = $currentErrorPath; }} | 
|           } else { | 
|         {{??}} | 
|           {{? $breakOnError }} | 
|             if ({{# def.noPropertyInData }}) { | 
|               {{=$nextValid}} = true; | 
|             } else { | 
|           {{??}} | 
|             if ({{=$useData}} !== undefined | 
|               {{? $ownProperties }} | 
|                 && {{# def.isOwnProperty }} | 
|               {{?}} | 
|             ) { | 
|           {{?}} | 
|         {{?}} | 
|   | 
|           {{= $code }} | 
|         } | 
|       {{?}}  {{ /* $hasDefault */ }} | 
|     {{?}} {{ /* def.nonEmptySchema */ }} | 
|   | 
|     {{# def.ifResultValid }} | 
|   {{~}} | 
| {{?}} | 
|   | 
| {{? $pPropertyKeys.length }} | 
|   {{~ $pPropertyKeys:$pProperty }} | 
|     {{ var $sch = $pProperties[$pProperty]; }} | 
|   | 
|     {{? {{# def.nonEmptySchema:$sch}} }} | 
|       {{ | 
|         $it.schema = $sch; | 
|         $it.schemaPath = it.schemaPath + '.patternProperties' + it.util.getProperty($pProperty); | 
|         $it.errSchemaPath = it.errSchemaPath + '/patternProperties/' | 
|                                              + it.util.escapeFragment($pProperty); | 
|       }} | 
|   | 
|       {{# def.iterateProperties }} | 
|         if ({{= it.usePattern($pProperty) }}.test({{=$key}})) { | 
|           {{ | 
|             $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers); | 
|             var $passData = $data + '[' + $key + ']'; | 
|             $it.dataPathArr[$dataNxt] = $key; | 
|           }} | 
|   | 
|           {{# def.generateSubschemaCode }} | 
|           {{# def.optimizeValidate }} | 
|   | 
|           {{? $breakOnError }} if (!{{=$nextValid}}) break; {{?}} | 
|         } | 
|         {{? $breakOnError }} else {{=$nextValid}} = true; {{?}} | 
|       } | 
|   | 
|       {{# def.ifResultValid }} | 
|     {{?}} {{ /* def.nonEmptySchema */ }} | 
|   {{~}} | 
| {{?}} | 
|   | 
|   | 
| {{? $breakOnError }} | 
|   {{= $closingBraces }} | 
|   if ({{=$errs}} == errors) { | 
| {{?}} |