edit | blame | history | raw

CODE-DESIGN-ANA-SEMI-ROOT-PREFLIGHT-ORCHESTRATION-V007-V028

0. 状态、前置与唯一目的

  • 角色:dev.developer.ana.cai
  • predecessor:V027=92116/c0a65e89b2ec07f2b78cf16e826311a0b44c823aad6a2346cdf84851a427ebb1;独立审核=HOLD/3/3,audit=264374/aef8b9ad0e12040ed16e9d9ca428a036fb1eb048090ce2658a4a5569f4db779f
  • V027 四份 payload bytes/Base64 已独立复算正确;本版只修复 Stage S 的可调用 atomic CreateNew、Base64 decoder、raw readback、timeout/liveness 与 terminal closure。
  • 本版撤回“zero-process Stage S”和 apply_patch Add File。未来 Stage S 固定为一个非候选 Windows PowerShell 5.1 writer/readback 进程;不 import/runpy/exec Y01—Y04,不运行候选 Python。
  • 本版仅计划,不授权 materialization/process/Stage V/database。

1. exact target、payload 与前置零状态

ID exact path bytes SHA-256 profile
Y01 E:\mb-ms-doc\project-info\dev\ana-dev\ana_semi_preconsumption_v002.py 17465 89812a35ac352d6fd0887f0b67df85962070d637aba4962992b46e073dd4bcf6 UTF-8/no BOM/CR/NUL/exact one final LF
Y02 E:\mb-ms-doc\project-info\dev\ana-dev\test\test_ana_semi_preconsumption_v002.py 3359 1983df916d5b9553a885a949d2674d9f8a8e7b1a6c4c5989eadf48245d929cf0 UTF-8/no BOM/CR/NUL/exact one final LF
Y03 E:\mb-ms-doc\project-info\dev\ana-dev\test\ana_semi_preconsumption_vectors_v002.json 4016 86f563b43d934cb0828e395f557ded328ad2abcfb2c1ef7bdbc8a4c32c12cbca strict JCS/no BOM/CR/LF/NUL/final 0x7D
Y04 E:\mb-ms-doc\project-info\dev\ana-dev\test\run_ana_semi_preconsumption_validation_v002.py 13037 244463c2a66910dd71564f148d5845672261dedc80a636e21e809712b691337e UTF-8/no BOM/CR/NUL/exact one final LF
  • exact payload 来源是 V027 的四个已审 Base64 attachments;未来 management authorization 必须携带本版第 5 节的完整 ASCII transcript,不能由模型解码、重构或读取旧文件。
  • Stage S 前 Y01—Y04 必须 0/4;dev\ana-devdev\ana-dev\test 必须是既存 ordinary non-reparse directories;不创建 run/Y05—Y08。
  • 旧失败包 immutable;source/Stage V/database authorization 当前均 NOT_ISSUED

2. 可调用工具与进程合同

唯一允许调用:

  1. exec_command 一次:shell=C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exelogin=falsetty=false(plain pipes,禁止 PTY echo) 、workdir=E:\mb-ms-doc\project-infoyield_time_ms=2000max_output_tokens=4096cmd=<第 4 节 exact writer preimage>
  2. 只有当首次调用返回唯一 session_id、无 output、无 exit code 时,write_stdin 恰好一次:chars=<第 5 节 exact ASCII transcript>yield_time_ms=70000max_output_tokens=4096
  3. exec_command 启动的 shell 就是唯一 writer 进程;不启动 child。成功/安全失败 process count=1;写前 tool-start failure=0。Python/csc/node/mysql/config-editor/query/database=0/0/0/0/0/0/false。

工具可观察结果:

  • 首次 exec_command 若在 2000ms 内终止、产生任何 output、没有唯一 session、返回结构/基数漂移:STOP_WRITER_START_CONTRACT/27,Y01—Y04=0,不调用 write_stdin
  • write_stdin 只接受一次 terminal result;exit_code 必须 0 或 27,session_id terminal 后必须 absent;output 必须为单行 ASCII JSON 加 LF、stderr 由 writer 保证零字节。original_token_count<=2048 且不得 truncated;任何结构/容量/基数/stream 不确定均 STOP/no retry。
  • writer 内部 60 秒 System.Threading.Timer 到期直接 Process.Kill();正常路径在 terminal output 前 Dispose timer。write_stdin 等待 70 秒,足以覆盖 60 秒 kill 和 10 秒工具回收;70 秒仍返回 live session 即 STOP_WRITER_LIVENESS_UNKNOWN/27,禁止再次 poll/write/kill/retry,由 management exact-process same-read 收口。
  • transcript 只有 ASCII,最大字节在第 5 节固定且小于 65536;writer output 上界 4096 ASCII bytes。无 raw source stdout/stderr。

3. atomic writer/readback 合同

  • writer 先读取恰好 5 行并在内存验证所有 4 个 payload,再进行任何 CreateNew。
  • Base64 必须匹配 \A(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?\z;使用 [Convert]::FromBase64String,随后 bytes/hash/profile 与第 1 节逐项等值。该 decoder 是 callable reviewed process,不依赖模型转换。
  • project root、devana-devtest 在首次写前和每次写后均用 DirectoryInfo.Attributes 验证存在、Directory=true、ReparsePoint=false;四个目标先全部 absent,任一 exists/attribute/read uncertainty 在 Y01 前 STOP。
  • 每个目标严格 Y01→Y02→Y03→Y04:FileStream(path, FileMode.CreateNew, FileAccess.Write, FileShare.None, 4096, FileOptions.WriteThrough)Write(bytes,0,len)Flush(true);Dispose。CreateNew 是 OS atomic no-overwrite gate,race 导致 IOException 即 STOP,不覆盖既有对象。
  • 写后立即验证 FileInfo ordinary/non-reparse/length,随后 FileStream(path, Open, Read, None) exclusive raw read;SHA-256、bytes/profile 与 payload 等值。通过前不写下一目标。
  • open/write/flush/close/reopen/read/hash/attribute 任一异常:保留实际子集,不删/改/重命名/补造;terminal=CONSUMED_FAIL_CLOSED_SOURCE_FREEZE_INCOMPLETE,exit=27。
  • postwrite readback 使用同一 callable process 的原始 [IO.File]::ReadAllBytes;terminal 的每行记录 materialized/exists/bytes/hash/status。独立 static reviewer 后续再作第二方 raw-byte/hash 复核。

4. exact writer preimage

以下 code fence 内容(不含 fence,含恰好一个 final LF)是 WRITER-ANA-SEMI-STAGE-S-V001 唯一 cmd preimage;提交审核前在第 6 节登记 bytes/SHA-256、Windows PowerShell 5.1 parser errors=0、CR/NUL=0。

$ErrorActionPreference='Stop'
$ProgressPreference='SilentlyContinue'
$root='E:\mb-ms-doc\project-info'
$ids=@('Y01','Y02','Y03','Y04')
$paths=@(
'E:\mb-ms-doc\project-info\dev\ana-dev\ana_semi_preconsumption_v002.py',
'E:\mb-ms-doc\project-info\dev\ana-dev\test\test_ana_semi_preconsumption_v002.py',
'E:\mb-ms-doc\project-info\dev\ana-dev\test\ana_semi_preconsumption_vectors_v002.json',
'E:\mb-ms-doc\project-info\dev\ana-dev\test\run_ana_semi_preconsumption_validation_v002.py')
$sizes=@(17465,3359,4016,13037)
$hashes=@(
'89812a35ac352d6fd0887f0b67df85962070d637aba4962992b46e073dd4bcf6',
'1983df916d5b9553a885a949d2674d9f8a8e7b1a6c4c5989eadf48245d929cf0',
'86f563b43d934cb0828e395f557ded328ad2abcfb2c1ef7bdbc8a4c32c12cbca',
'244463c2a66910dd71564f148d5845672261dedc80a636e21e809712b691337e')
$timer=[Threading.Timer]::new([Threading.TimerCallback]{param($s)try{[Diagnostics.Process]::GetCurrentProcess().Kill()}catch{}},$null,60000,[Threading.Timeout]::Infinite)
function Sha([byte[]]$b){$s=[Security.Cryptography.SHA256]::Create();try{return([BitConverter]::ToString($s.ComputeHash($b))).Replace('-','').ToLowerInvariant()}finally{$s.Dispose()}}
function StopCode([string]$c){throw [InvalidOperationException]::new($c)}
function ReadExact([string]$p){$f=[IO.FileStream]::new($p,[IO.FileMode]::Open,[IO.FileAccess]::Read,[IO.FileShare]::None);try{$m=[IO.MemoryStream]::new();try{$f.CopyTo($m);return $m.ToArray()}finally{$m.Dispose()}}finally{$f.Dispose()}}
function CheckDirs {
  foreach($p in @($root,(Join-Path $root 'dev'),(Join-Path $root 'dev\ana-dev'),(Join-Path $root 'dev\ana-dev\test'))){
    $d=[IO.DirectoryInfo]::new($p);if(-not$d.Exists){StopCode 'DIR_ABSENT'}
    if(($d.Attributes-band[IO.FileAttributes]::Directory)-eq0){StopCode 'DIR_NOT_DIRECTORY'}
    if(($d.Attributes-band[IO.FileAttributes]::ReparsePoint)-ne0){StopCode 'DIR_REPARSE'}
  }
}
function Profile([int]$i,[byte[]]$b){
  if($b.Length-ne$sizes[$i]-or(Sha $b)-ne$hashes[$i]){StopCode 'PAYLOAD_HASH'}
  if($b.Length-ge3-and$b[0]-eq239-and$b[1]-eq187-and$b[2]-eq191){StopCode 'PAYLOAD_BOM'}
  if(@($b|Where-Object{$_-eq13-or$_-eq0}).Count-ne0){StopCode 'PAYLOAD_CR_NUL'}
  $lf=@($b|Where-Object{$_-eq10}).Count
  if($i-eq2){if($lf-ne0-or$b[-1]-ne125){StopCode 'PAYLOAD_JCS_PROFILE'}}
  elseif($lf-lt1-or$b[-1]-ne10-or($b[-2]-eq10)){StopCode 'PAYLOAD_TEXT_PROFILE'}
}
function Snapshot([int]$upto){
  $a=@();for($j=0;$j-lt4;$j++){$e=Test-Path -LiteralPath $paths[$j] -PathType Leaf
    if($e){try{$b=ReadExact $paths[$j];$a+=([ordered]@{id=$ids[$j];exists=$true;bytes=$b.Length;sha256=(Sha $b);status=$(if($j-le$upto){'MATERIALIZED'}else{'UNEXPECTED'})})}catch{$a+=([ordered]@{id=$ids[$j];exists=$true;bytes=$null;sha256=$null;status='UNKNOWN'})}}
    else{$a+=([ordered]@{id=$ids[$j];exists=$false;bytes=$null;sha256=$null;status='ABSENT'})}}
  return$a
}
$created=-1;$written=-1;$terminal='STOP';$stop='UNINITIALIZED';$exit=27
try{
  $lines=@();for($i=0;$i-lt5;$i++){$v=[Console]::In.ReadLine();if($null-eq$v){StopCode 'TRANSCRIPT_EOF'};$lines+=$v}
  $payloadText=($lines[0..3]-join"`n")+"`n"
  $end=$lines[4]-split"`t",-1;if($end.Count-ne3-or$end[0]-ne'END'-or$end[1]-ne'4'-or$end[2]-ne(Sha ([Text.Encoding]::ASCII.GetBytes($payloadText)))){StopCode 'TRANSCRIPT_END'}
  $decoded=@();for($i=0;$i-lt4;$i++){$f=$lines[$i]-split"`t",-1
    if($f.Count-ne5-or$f[0]-ne$ids[$i]-or$f[1]-cne$paths[$i]-or$f[2]-ne([string]$sizes[$i])-or$f[3]-ne$hashes[$i]){StopCode 'TRANSCRIPT_FIELDS'}
    if($f[4]-cnotmatch'\A(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?\z'){StopCode 'TRANSCRIPT_BASE64'}
    try{$b=[Convert]::FromBase64String($f[4])}catch{StopCode 'TRANSCRIPT_DECODE'};Profile $i $b;$decoded+=,$b
  }
  CheckDirs;foreach($p in $paths){if(Test-Path -LiteralPath $p){StopCode 'TARGET_PREEXISTS'}}
  for($i=0;$i-lt4;$i++){
    $fs=[IO.FileStream]::new($paths[$i],[IO.FileMode]::CreateNew,[IO.FileAccess]::Write,[IO.FileShare]::None,4096,[IO.FileOptions]::WriteThrough)
    $created=$i
    try{$fs.Write($decoded[$i],0,$decoded[$i].Length);$fs.Flush($true)}finally{$fs.Dispose()}
    $written=$i;CheckDirs;$fi=[IO.FileInfo]::new($paths[$i]);if(-not$fi.Exists-or($fi.Attributes-band[IO.FileAttributes]::Directory)-ne0-or($fi.Attributes-band[IO.FileAttributes]::ReparsePoint)-ne0-or$fi.Length-ne$sizes[$i]){StopCode 'POST_FILE_STATE'}
    $rb=ReadExact $paths[$i];Profile $i $rb
  }
  $terminal='SOURCE_FREEZE_COMPLETED_PENDING_STATIC_REVIEW';$stop=$null;$exit=0
}catch{$stop=$_.Exception.Message;$terminal=$(if($created-lt0){'TERMINATED_PRECONSUMPTION_UNCONSUMED'}else{'CONSUMED_FAIL_CLOSED_SOURCE_FREEZE_INCOMPLETE'});$exit=27}
finally{
  $timer.Dispose();$rows=Snapshot $created;$o=[ordered]@{schema_id='ANA.SEMI.STAGE.S.WRITER.TERMINAL.V001';terminal_state=$terminal;stop_code=$stop;exit_code=$exit;writer_process_count=1;authorization_consumed=($created-ge0);materialized_count=@($rows|Where-Object{$_.exists}).Count;rows=$rows}
  $j=$o|ConvertTo-Json -Compress -Depth 5;if(-not$j-or$j.Length-gt3500-or@($j.ToCharArray()|Where-Object{[int]$_-gt127}).Count-ne0){[Console]::Out.WriteLine('{"schema_id":"ANA.SEMI.STAGE.S.WRITER.TERMINAL.V001","terminal_state":"DELIVERY_UNSAFE","stop_code":"OUTPUT_CONTRACT","exit_code":27}');exit 27}
  [Console]::Out.WriteLine($j);exit $exit
}

5. exact ASCII stdin transcript

  • transcript 是 4 行 ID<TAB>exact_path<TAB>bytes<TAB>sha256<TAB>RFC4648_Base64<LF>,再加 END<TAB>4<TAB>sha256(first_four_lines_with_LF)<LF>
  • 四个 Base64 必须逐字复制 V027 第 9 节 attachment;提交审核前 append-only 补入完整 transcript code fence、bytes/SHA-256、ASCII/NUL/CR/LF counts 与最大行长度。
  • 一次 write_stdin.chars 必须恰好等于该 transcript;不允许拆包、重发、EOF 依赖或多余字符。

6. 提交审核前固定向量门

提交前必须 append-only 登记并独立可复算:writer bytes/hash/parser errors;完整 transcript 与 body hash;cmd/input/output ceilings;4 个 decode roundtrip;全部 target/subset terminal matrix。未补齐不得申请审核或授权。

7. terminal/subset 总矩阵与优先级

stop point process written subset terminal exit
tool start contract failure 0 none TERMINATED_PRECONSUMPTION_UNCONSUMED 27
transcript/decode/profile/dir/preexists 1 none TERMINATED_PRECONSUMPTION_UNCONSUMED 27
Y01 open/write/flush/close/readback 1 none or Y01 partial/known CONSUMED_FAIL_CLOSED_SOURCE_FREEZE_INCOMPLETE 27
Y02 stage 1 Y01 plus Y02 absent/partial/known CONSUMED_FAIL_CLOSED_SOURCE_FREEZE_INCOMPLETE 27
Y03 stage 1 Y01-Y02 plus Y03 absent/partial/known CONSUMED_FAIL_CLOSED_SOURCE_FREEZE_INCOMPLETE 27
Y04 stage 1 Y01-Y03 plus Y04 absent/partial/known CONSUMED_FAIL_CLOSED_SOURCE_FREEZE_INCOMPLETE 27
timeout/liveness/output/tool ambiguity 1 or unknown actual subset, UNKNOWN where unreadable DELIVERY_OR_LIVENESS_UNCERTAIN_NO_RETRY 27
success 1 Y01-Y04 exact SOURCE_FREEZE_COMPLETED_PENDING_STATIC_REVIEW 0

优先级:LIVENESS/DELIVERY_UNKNOWN_27 > PARTIAL/IO_27 > PRECONSUMPTION_27 > SUCCESS_0。任何 terminal 都单次 native management terminal;实际 materialized subset 交 exact dev reviewer 静态复核。无 retry/resend/A002/replacement/renewal。

8. 后续边界与当前零状态

  • Stage S success 仍不是 implementation PASS;必须 exact dev reviewer 对四个 immutable files raw hash + AST/static source 作独立审核。
  • 只有 static PASS 后才可另立 Stage V plan/review/management authorization;Stage V 前不运行/import/runpy/exec Y01—Y04。
  • root proof/mysql/database 必须继续后置;本版不读 credential、不连接数据库、不运行 SQL。
  • Y01—Y04=ABSENT_4_OF_4;run/Y05—Y08 absent;candidate Python/PowerShell/csc/node/mysql/config-editor/query/database=0/0/0/0/0/0/0/false
  • formal target=0;BATCH-001=HELD;darkline_restored=false。

9. 固定 writer/transcript vectors(supersede 第 5—6 节待补状态)

  • writer preimage=5273/ea663d612396f52f29fa6142c248258c1a980b45d01f68e6c176d1afe64a5c82;PowerShell 5.1 parser errors=0;CR/NUL/LF/final=0/0/65/0x0A
  • transcript body=51135/7b31929fdc6f67c9aa78a11ea7685f97027c5bc2ac96510d906bdf586cf13d40;full transcript=51206/6ea1f921913927009045a0c6168f2693de0d65d4f2ba0d33056bbafb38c9b052;ASCII/CR/NUL/LF/max-line=true/0/0/5/23433
  • transcript byte ceiling=65536,实际严格小于 ceiling;最长单行只经 write_stdin stdin,不进入 argv/cmd/output。
  • writer cmd UTF-8 bytes 严格小于 16384;无 payload Base64,避免 V026 double-Base64/command-line 容量问题。
  • output literal schema 固定 8 top-level keys(fallback 4 keys)与 4 rows;正常最大值 <3500 ASCII chars + LFmax_output_tokens=4096 不截断。

exact write_stdin.chars transcript

Y01	E:\mb-ms-doc\project-info\dev\ana-dev\ana_semi_preconsumption_v002.py	17465	89812a35ac352d6fd0887f0b67df85962070d637aba4962992b46e073dd4bcf6	ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucwoKaW1wb3J0IGJhc2U2NAppbXBvcnQgY3R5cGVzCmltcG9ydCBjdHlwZXMud2ludHlwZXMgYXMgd2ludHlwZXMKaW1wb3J0IGRhdGV0aW1lIGFzIGR0CmltcG9ydCBoYXNobGliCmltcG9ydCBqc29uCmltcG9ydCBvcwppbXBvcnQgcGF0aGxpYgppbXBvcnQgcmUKaW1wb3J0IHRocmVhZGluZwpmcm9tIGNvbGxlY3Rpb25zLmFiYyBpbXBvcnQgQ2FsbGFibGUsIEl0ZXJhYmxlLCBNYXBwaW5nLCBTZXF1ZW5jZQpmcm9tIHR5cGluZyBpbXBvcnQgQW55CgpXSU5ET1dfU0NIRU1BID0gIkFOQS5TRU1JLkFVVEhPUklaQVRJT04uV0lORE9XLlYwMDEiCldJTkRPV19URVNUX1NDSEVNQSA9ICJBTkEuU0VNSS5BVVRIT1JJWkFUSU9OLldJTkRPVy5URVNULlYwMDEiClNFTEVDVE9SX1NDSEVNQSA9ICJBTkEuU0VNSS5QUk9DRVNTLlNFTEVDVE9SLlJFU1VMVC5WMDAxIgpQUkVGTElHSFRfU0NIRU1BID0gIkFOQS5TRU1JLlBSRUNPTlNVTVBUSU9OLlJFU1VMVC5WMDAyIgpUSU1FX1JFID0gcmUuY29tcGlsZShyIl5cZHs0fS1cZHsyfS1cZHsyfVRcZHsyfTpcZHsyfTpcZHsyfVwuXGR7N31bKy1dXGR7Mn06XGR7Mn0kIikKUFJFRkxJR0hUX0tFWVMgPSAoCiAgICAiYXV0aG9yaXphdGlvbl9pZCIsICJhdXRob3JpemVkX2F0X3V0Y190aWNrcyIsICJhdXRob3JpemVkX291dGVyX3N0YXJ0ZWQiLAogICAgImNhbmRpZGF0ZV9ydW5fZXhpc3RzIiwgImNyZWRlbnRpYWxfYWNjZXNzIiwgImRhdGFiYXNlX2Nvbm5lY3Rpb25fcGVyZm9ybWVkIiwKICAgICJleGNlcHRpb25fdHlwZSIsICJleHBpcmVzX2F0X3V0Y190aWNrcyIsICJmaW5pc2hlZF9hdCIsCiAgICAiaGlzdG9yeV9oYXNoX21pc21hdGNoX2NvdW50IiwgImludm9jYXRpb25fY291bnQiLCAibWF0ZXJpYWxpemVkX3RhcmdldF9jb3VudCIsCiAgICAibmV0d29ya19hY2Nlc3MiLCAibm93X3V0Y190aWNrcyIsICJwcmVmbGlnaHRfc3RhZ2UiLCAicmVsYXRlZF9wcm9jZXNzX2NvdW50IiwKICAgICJyZXN1bHRfc2NoZW1hX2lkIiwgInN0YXJ0ZWRfYXQiLCAic3RhdHVzIiwgInN0b3BfY29kZSIsCiAgICAidGFyZ2V0X2V4aXN0aW5nX2NvdW50IiwgInVuY2VydGFpbl9maWVsZCIsCikKCgpkZWYgX3RpY2tzKHZhbHVlOiBkdC5kYXRldGltZSkgLT4gaW50OgogICAgdXRjID0gdmFsdWUuYXN0aW1lem9uZShkdC50aW1lem9uZS51dGMpCiAgICBvcmlnaW4gPSBkdC5kYXRldGltZSgxLCAxLCAxLCB0emluZm89ZHQudGltZXpvbmUudXRjKQogICAgZGVsdGEgPSB1dGMgLSBvcmlnaW4KICAgIHJldHVybiAoKGRlbHRhLmRheXMgKiA4NjQwMCArIGRlbHRhLnNlY29uZHMpICogMTBfMDAwXzAwMCkgKyBkZWx0YS5taWNyb3NlY29uZHMgKiAxMAoKCmRlZiBfcGFyc2Vfb2Zmc2V0KHJhdzogc3RyKSAtPiBkdC5kYXRldGltZToKICAgIGlmIG5vdCBpc2luc3RhbmNlKHJhdywgc3RyKSBvciBUSU1FX1JFLmZ1bGxtYXRjaChyYXcpIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidGltZXN0YW1wLXNoYXBlIikKICAgIHJldHVybiBkdC5kYXRldGltZS5mcm9taXNvZm9ybWF0KHJhdykKCgpkZWYgX3R5cGVkKHR5cGVfbmFtZTogc3RyLCB2YWx1ZXM6IE1hcHBpbmdbc3RyLCBBbnldKSAtPiBkaWN0W3N0ciwgQW55XToKICAgIHJldHVybiB7Il9fdHlwZV9uYW1lX18iOiB0eXBlX25hbWUsICoqdmFsdWVzfQoKCmRlZiBjb252ZXJ0X2F1dGhvcml6YXRpb25fd2luZG93KGF1dGhvcml6ZWRfYXRfcmF3OiBzdHIsIGV4cGlyZXNfYXRfcmF3OiBzdHIpIC0+IGRpY3Rbc3RyLCBBbnldOgogICAgYXV0aG9yaXplZF90aWNrcyA9IE5vbmUKICAgIGV4cGlyZXNfdGlja3MgPSBOb25lCiAgICBzdG9wX2NvZGUgPSBOb25lCiAgICB0cnk6CiAgICAgICAgYXV0aG9yaXplZF90aWNrcyA9IF90aWNrcyhfcGFyc2Vfb2Zmc2V0KGF1dGhvcml6ZWRfYXRfcmF3KSkKICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBWYWx1ZUVycm9yLCBPdmVyZmxvd0Vycm9yKToKICAgICAgICBzdG9wX2NvZGUgPSAiU1RPUF9BVVRIT1JJWkVEX0FUX1BBUlNFIgogICAgaWYgc3RvcF9jb2RlIGlzIE5vbmU6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBleHBpcmVzX3RpY2tzID0gX3RpY2tzKF9wYXJzZV9vZmZzZXQoZXhwaXJlc19hdF9yYXcpKQogICAgICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBWYWx1ZUVycm9yLCBPdmVyZmxvd0Vycm9yKToKICAgICAgICAgICAgc3RvcF9jb2RlID0gIlNUT1BfRVhQSVJFU19BVF9QQVJTRSIKICAgIGlmIHN0b3BfY29kZSBpcyBOb25lIGFuZCBleHBpcmVzX3RpY2tzIDw9IGF1dGhvcml6ZWRfdGlja3M6CiAgICAgICAgc3RvcF9jb2RlID0gIlNUT1BfTk9OX1BPU0lUSVZFX1dJTkRPVyIKICAgIHJldHVybiBfdHlwZWQoV0lORE9XX1NDSEVNQSwgewogICAgICAgICJhdXRob3JpemVkX2F0X3JhdyI6IGF1dGhvcml6ZWRfYXRfcmF3LAogICAgICAgICJhdXRob3JpemVkX2F0X3V0Y190aWNrcyI6IGF1dGhvcml6ZWRfdGlja3MsCiAgICAgICAgImV4cGlyZXNfYXRfcmF3IjogZXhwaXJlc19hdF9yYXcsCiAgICAgICAgImV4cGlyZXNfYXRfdXRjX3RpY2tzIjogZXhwaXJlc190aWNrcywKICAgICAgICAic2NoZW1hX2lkIjogV0lORE9XX1NDSEVNQSwKICAgICAgICAic3RhdHVzIjogIlBBU1MiIGlmIHN0b3BfY29kZSBpcyBOb25lIGVsc2UgIlNUT1AiLAogICAgICAgICJzdG9wX2NvZGUiOiBzdG9wX2NvZGUsCiAgICB9KQoKCmRlZiB0ZXN0X2F1dGhvcml6YXRpb25fd2luZG93KHdpbmRvd19yZXN1bHQ6IE1hcHBpbmdbc3RyLCBBbnldLCBub3c6IGR0LmRhdGV0aW1lKSAtPiBkaWN0W3N0ciwgQW55XToKICAgIGF1dGhvcml6ZWRfdGlja3MgPSBOb25lCiAgICBleHBpcmVzX3RpY2tzID0gTm9uZQogICAgbm93X3RpY2tzID0gTm9uZQogICAgaW5zaWRlID0gTm9uZQogICAgc3RvcF9jb2RlID0gTm9uZQogICAgcmVxdWlyZWQgPSAoCiAgICAgICAgImF1dGhvcml6ZWRfYXRfcmF3IiwgImF1dGhvcml6ZWRfYXRfdXRjX3RpY2tzIiwgImV4cGlyZXNfYXRfcmF3IiwKICAgICAgICAiZXhwaXJlc19hdF91dGNfdGlja3MiLCAic2NoZW1hX2lkIiwgInN0YXR1cyIsICJzdG9wX2NvZGUiLAogICAgKQogICAgdHJ5OgogICAgICAgIGlmIHdpbmRvd19yZXN1bHQuZ2V0KCJfX3R5cGVfbmFtZV9fIikgIT0gV0lORE9XX1NDSEVNQToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidHlwZSIpCiAgICAgICAgaWYgdHVwbGUoayBmb3IgayBpbiB3aW5kb3dfcmVzdWx0IGlmIGsgIT0gIl9fdHlwZV9uYW1lX18iKSAhPSByZXF1aXJlZDoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigia2V5cyIpCiAgICAgICAgaWYgd2luZG93X3Jlc3VsdFsic3RhdHVzIl0gIT0gIlBBU1MiOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJzdGF0dXMiKQogICAgICAgIGF1dGhvcml6ZWRfdGlja3MgPSBpbnQod2luZG93X3Jlc3VsdFsiYXV0aG9yaXplZF9hdF91dGNfdGlja3MiXSkKICAgICAgICBleHBpcmVzX3RpY2tzID0gaW50KHdpbmRvd19yZXN1bHRbImV4cGlyZXNfYXRfdXRjX3RpY2tzIl0pCiAgICBleGNlcHQgKEtleUVycm9yLCBUeXBlRXJyb3IsIFZhbHVlRXJyb3IpOgogICAgICAgIHN0b3BfY29kZSA9ICJTVE9QX1dJTkRPV19JTlBVVF9DT05UUkFDVCIKICAgIGlmIHN0b3BfY29kZSBpcyBOb25lOgogICAgICAgIHRyeToKICAgICAgICAgICAgbm93X3RpY2tzID0gX3RpY2tzKG5vdykKICAgICAgICAgICAgaW5zaWRlID0gYXV0aG9yaXplZF90aWNrcyA8PSBub3dfdGlja3MgPCBleHBpcmVzX3RpY2tzCiAgICAgICAgZXhjZXB0IChUeXBlRXJyb3IsIFZhbHVlRXJyb3IsIE92ZXJmbG93RXJyb3IpOgogICAgICAgICAgICBzdG9wX2NvZGUgPSAiU1RPUF9OT1dfQ09OVkVSU0lPTiIKICAgIHJldHVybiBfdHlwZWQoV0lORE9XX1RFU1RfU0NIRU1BLCB7CiAgICAgICAgImF1dGhvcml6ZWRfYXRfdXRjX3RpY2tzIjogYXV0aG9yaXplZF90aWNrcywKICAgICAgICAiZXhwaXJlc19hdF91dGNfdGlja3MiOiBleHBpcmVzX3RpY2tzLAogICAgICAgICJpbnNpZGVfd2luZG93IjogaW5zaWRlLAogICAgICAgICJub3dfdXRjX3RpY2tzIjogbm93X3RpY2tzLAogICAgICAgICJzY2hlbWFfaWQiOiBXSU5ET1dfVEVTVF9TQ0hFTUEsCiAgICAgICAgInN0YXR1cyI6ICJQQVNTIiBpZiBzdG9wX2NvZGUgaXMgTm9uZSBlbHNlICJTVE9QIiwKICAgICAgICAic3RvcF9jb2RlIjogc3RvcF9jb2RlLAogICAgfSkKCgpkZWYgX3NoYTI1NihkYXRhOiBieXRlcykgLT4gc3RyOgogICAgcmV0dXJuIGhhc2hsaWIuc2hhMjU2KGRhdGEpLmhleGRpZ2VzdCgpCgoKZGVmIHNlbGVjdF9leGFjdF9yZWxhdGVkX3Byb2Nlc3MoCiAgICBzbmFwc2hvdF9yb3dzOiBTZXF1ZW5jZVtNYXBwaW5nW3N0ciwgQW55XV0sCiAgICBleHBlY3RlZF9vdXRlcl9leGVjdXRhYmxlX3BhdGg6IHN0ciwKICAgIGV4cGVjdGVkX291dGVyX2NvbW1hbmRfbGluZV9zaGEyNTY6IHN0ciwKICAgIGV4cGVjdGVkX291dGVyX2NvbW1hbmRfbGluZV9iYXNlNjQ6IHN0ciwKICAgIHNvdXJjZV9wcmVmbGlnaHRfcHJvY2Vzc19pZDogaW50LAogICAgcHJvaGliaXRlZF9leGVjdXRhYmxlX3BhdGhzOiBTZXF1ZW5jZVtzdHJdLAopIC0+IGRpY3Rbc3RyLCBBbnldOgogICAgY29uZmlybWVkX3plcm8gPSBOb25lCiAgICBkdXBsaWNhdGVfY291bnQgPSBOb25lCiAgICBleGFjdF9jb3VudCA9IE5vbmUKICAgIG1hdGNoZWRfaWRzID0gTm9uZQogICAgcHJvaGliaXRlZF9jb3VudCA9IE5vbmUKICAgIHJlbGF0ZWRfY291bnQgPSBOb25lCiAgICByb3dfY291bnQgPSBOb25lCiAgICB1bmNlcnRhaW5fZmllbGRzID0gTm9uZQogICAgdW5rbm93bl9jb3VudCA9IE5vbmUKICAgIHN0b3BfY29kZSA9IE5vbmUKICAgIGRlY29kZWQgPSBOb25lCiAgICB0cnk6CiAgICAgICAgZW5jb2RlZCA9IGJhc2U2NC5iNjRkZWNvZGUoZXhwZWN0ZWRfb3V0ZXJfY29tbWFuZF9saW5lX2Jhc2U2NCwgdmFsaWRhdGU9VHJ1ZSkKICAgICAgICBpZiBiYXNlNjQuYjY0ZW5jb2RlKGVuY29kZWQpLmRlY29kZSgiYXNjaWkiKSAhPSBleHBlY3RlZF9vdXRlcl9jb21tYW5kX2xpbmVfYmFzZTY0OgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJiYXNlNjQiKQogICAgICAgIGRlY29kZWQgPSBlbmNvZGVkLmRlY29kZSgidXRmLTgiLCBlcnJvcnM9InN0cmljdCIpCiAgICAgICAgaWYgX3NoYTI1NihlbmNvZGVkKSAhPSBleHBlY3RlZF9vdXRlcl9jb21tYW5kX2xpbmVfc2hhMjU2OgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJoYXNoIikKICAgICAgICBpZiBub3QgZGVjb2RlZC5zdGFydHN3aXRoKGV4cGVjdGVkX291dGVyX2V4ZWN1dGFibGVfcGF0aCArICIgIik6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNvb3JkaW5hdGUiKQogICAgZXhjZXB0IChWYWx1ZUVycm9yLCBVbmljb2RlRXJyb3IpOgogICAgICAgIHVuY2VydGFpbl9maWVsZHMgPSBbImV4cGVjdGVkX2NvbW1hbmRfbGluZSJdCiAgICAgICAgc3RvcF9jb2RlID0gIlNUT1BfRVhQRUNURURfQ09NTUFORExJTkVfQ09OVFJBQ1QiCiAgICBpZiBzdG9wX2NvZGUgaXMgTm9uZToKICAgICAgICByb3dfY291bnQgPSBsZW4oc25hcHNob3Rfcm93cykKICAgICAgICBpZHM6IHNldFtpbnRdID0gc2V0KCkKICAgICAgICBkdXBsaWNhdGVzID0gMAogICAgICAgIGZvciByb3cgaW4gc25hcHNob3Rfcm93czoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcHJvY2Vzc19pZCA9IGludChyb3dbInByb2Nlc3NfaWQiXSkKICAgICAgICAgICAgZXhjZXB0IChLZXlFcnJvciwgVHlwZUVycm9yLCBWYWx1ZUVycm9yKToKICAgICAgICAgICAgICAgIHVuY2VydGFpbl9maWVsZHMgPSBbInByb2Nlc3NfaWQiXQogICAgICAgICAgICAgICAgc3RvcF9jb2RlID0gIlNUT1BfU05BUFNIT1RfQ09OVFJBQ1QiCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBpZiBwcm9jZXNzX2lkIGluIGlkczoKICAgICAgICAgICAgICAgIGR1cGxpY2F0ZXMgKz0gMQogICAgICAgICAgICBpZHMuYWRkKHByb2Nlc3NfaWQpCiAgICAgICAgZHVwbGljYXRlX2NvdW50ID0gZHVwbGljYXRlcwogICAgICAgIGlmIHN0b3BfY29kZSBpcyBOb25lIGFuZCBkdXBsaWNhdGVzOgogICAgICAgICAgICBzdG9wX2NvZGUgPSAiU1RPUF9EVVBMSUNBVEVfUFJPQ0VTU19JRCIKICAgIGlmIHN0b3BfY29kZSBpcyBOb25lOgogICAgICAgIGV4YWN0X2lkczogbGlzdFtpbnRdID0gW10KICAgICAgICBwcm9oaWJpdGVkX2lkczogbGlzdFtpbnRdID0gW10KICAgICAgICB1bmtub3duOiBsaXN0W3N0cl0gPSBbXQogICAgICAgIHByb2hpYml0ZWRfbm9ybSA9IHtvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGguYWJzcGF0aChwKSkgZm9yIHAgaW4gcHJvaGliaXRlZF9leGVjdXRhYmxlX3BhdGhzfQogICAgICAgIGV4cGVjdGVkX25vcm0gPSBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGguYWJzcGF0aChleHBlY3RlZF9vdXRlcl9leGVjdXRhYmxlX3BhdGgpKQogICAgICAgIGZvciByb3cgaW4gc25hcHNob3Rfcm93czoKICAgICAgICAgICAgcHJvY2Vzc19pZCA9IGludChyb3dbInByb2Nlc3NfaWQiXSkKICAgICAgICAgICAgaWYgcHJvY2Vzc19pZCA9PSBpbnQoc291cmNlX3ByZWZsaWdodF9wcm9jZXNzX2lkKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHBhdGggPSByb3cuZ2V0KCJleGVjdXRhYmxlX3BhdGgiKQogICAgICAgICAgICBjb21tYW5kX2xpbmUgPSByb3cuZ2V0KCJjb21tYW5kX2xpbmUiKQogICAgICAgICAgICBuYW1lID0gcm93LmdldCgibmFtZSIpCiAgICAgICAgICAgIG5vcm0gPSBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGguYWJzcGF0aChwYXRoKSkgaWYgaXNpbnN0YW5jZShwYXRoLCBzdHIpIGVsc2UgTm9uZQogICAgICAgICAgICBpc19leHBlY3RlZCA9IG5vcm0gPT0gZXhwZWN0ZWRfbm9ybQogICAgICAgICAgICBpc19wcm9oaWJpdGVkID0gbm9ybSBpbiBwcm9oaWJpdGVkX25vcm0KICAgICAgICAgICAgcmVsZXZhbnRfbmFtZSA9IGlzaW5zdGFuY2UobmFtZSwgc3RyKSBhbmQgbmFtZS5sb3dlcigpIGluIHsKICAgICAgICAgICAgICAgICJwb3dlcnNoZWxsIiwgInBvd2Vyc2hlbGwuZXhlIiwgInB5dGhvbiIsICJweXRob24uZXhlIiwgImNzYyIsICJjc2MuZXhlIiwKICAgICAgICAgICAgICAgICJteXNxbCIsICJteXNxbC5leGUiLCAibXlzcWxfY29uZmlnX2VkaXRvciIsICJteXNxbF9jb25maWdfZWRpdG9yLmV4ZSIsCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGlzX2V4cGVjdGVkIG9yIGlzX3Byb2hpYml0ZWQgb3IgcmVsZXZhbnRfbmFtZSkgYW5kICgKICAgICAgICAgICAgICAgIHBhdGggaXMgTm9uZSBvciBuYW1lIGlzIE5vbmUgb3IgKGlzX2V4cGVjdGVkIGFuZCBjb21tYW5kX2xpbmUgaXMgTm9uZSkKICAgICAgICAgICAgKToKICAgICAgICAgICAgICAgIHVua25vd24uYXBwZW5kKGYicGlkOntwcm9jZXNzX2lkfSIpCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBpc19leHBlY3RlZCBhbmQgY29tbWFuZF9saW5lID09IGRlY29kZWQ6CiAgICAgICAgICAgICAgICBleGFjdF9pZHMuYXBwZW5kKHByb2Nlc3NfaWQpCiAgICAgICAgICAgIGlmIGlzX3Byb2hpYml0ZWQ6CiAgICAgICAgICAgICAgICBwcm9oaWJpdGVkX2lkcy5hcHBlbmQocHJvY2Vzc19pZCkKICAgICAgICBleGFjdF9jb3VudCA9IGxlbihleGFjdF9pZHMpCiAgICAgICAgcHJvaGliaXRlZF9jb3VudCA9IGxlbihwcm9oaWJpdGVkX2lkcykKICAgICAgICB1bmtub3duX2NvdW50ID0gbGVuKHVua25vd24pCiAgICAgICAgbWF0Y2hlZF9pZHMgPSBzb3J0ZWQoc2V0KGV4YWN0X2lkcyArIHByb2hpYml0ZWRfaWRzKSkKICAgICAgICByZWxhdGVkX2NvdW50ID0gbGVuKG1hdGNoZWRfaWRzKQogICAgICAgIGlmIHVua25vd246CiAgICAgICAgICAgIHVuY2VydGFpbl9maWVsZHMgPSBzb3J0ZWQodW5rbm93bikKICAgICAgICAgICAgc3RvcF9jb2RlID0gIlNUT1BfUkVMRVZBTlRfUFJPQ0VTU19GSUVMRF9VTktOT1dOIgogICAgICAgIGVsaWYgZXhhY3RfY291bnQgPiAxOgogICAgICAgICAgICBjb25maXJtZWRfemVybyA9IEZhbHNlCiAgICAgICAgICAgIHN0b3BfY29kZSA9ICJTVE9QX01VTFRJUExFX0VYQUNUX09VVEVSIgogICAgICAgIGVsaWYgZXhhY3RfY291bnQgPT0gMSBvciBwcm9oaWJpdGVkX2NvdW50OgogICAgICAgICAgICBjb25maXJtZWRfemVybyA9IEZhbHNlCiAgICAgICAgICAgIHN0b3BfY29kZSA9ICJTVE9QX1BST0NFU1NfUFJFU0VOVCIKICAgICAgICBlbHNlOgogICAgICAgICAgICBjb25maXJtZWRfemVybyA9IFRydWUKICAgICAgICAgICAgbWF0Y2hlZF9pZHMgPSBbXQogICAgICAgICAgICByZWxhdGVkX2NvdW50ID0gMAogICAgcmV0dXJuIF90eXBlZChTRUxFQ1RPUl9TQ0hFTUEsIHsKICAgICAgICAiY29uZmlybWVkX3plcm8iOiBjb25maXJtZWRfemVybywKICAgICAgICAiZHVwbGljYXRlX3Byb2Nlc3NfaWRfY291bnQiOiBkdXBsaWNhdGVfY291bnQsCiAgICAgICAgImV4YWN0X291dGVyX2NvdW50IjogZXhhY3RfY291bnQsCiAgICAgICAgIm1hdGNoZWRfcHJvY2Vzc19pZHMiOiBtYXRjaGVkX2lkcywKICAgICAgICAicHJvaGliaXRlZF9wcm9jZXNzX2NvdW50IjogcHJvaGliaXRlZF9jb3VudCwKICAgICAgICAicmVsYXRlZF9wcm9jZXNzX2NvdW50IjogcmVsYXRlZF9jb3VudCwKICAgICAgICAic2NoZW1hX2lkIjogU0VMRUNUT1JfU0NIRU1BLAogICAgICAgICJzbmFwc2hvdF9yb3dfY291bnQiOiByb3dfY291bnQsCiAgICAgICAgInN0YXR1cyI6ICJQQVNTIiBpZiBzdG9wX2NvZGUgaXMgTm9uZSBlbHNlICJTVE9QIiwKICAgICAgICAic3RvcF9jb2RlIjogc3RvcF9jb2RlLAogICAgICAgICJ1bmNlcnRhaW5fZmllbGRzIjogdW5jZXJ0YWluX2ZpZWxkcywKICAgICAgICAidW5rbm93bl9yZWxldmFudF9jb3VudCI6IHVua25vd25fY291bnQsCiAgICB9KQoKCmNsYXNzIEludm9jYXRpb25HYXRlOgogICAgZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICAgICAgc2VsZi5fbG9jayA9IHRocmVhZGluZy5Mb2NrKCkKICAgICAgICBzZWxmLl91c2VkID0gRmFsc2UKCiAgICBkZWYgYWNxdWlyZV9vbmNlKHNlbGYpIC0+IGJvb2w6CiAgICAgICAgd2l0aCBzZWxmLl9sb2NrOgogICAgICAgICAgICBpZiBzZWxmLl91c2VkOgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgIHNlbGYuX3VzZWQgPSBUcnVlCiAgICAgICAgICAgIHJldHVybiBUcnVlCgoKZGVmIF9wcmVmbGlnaHQodmFsdWVzOiBNYXBwaW5nW3N0ciwgQW55XSkgLT4gZGljdFtzdHIsIEFueV06CiAgICByb3cgPSB7a2V5OiB2YWx1ZXMuZ2V0KGtleSkgZm9yIGtleSBpbiBQUkVGTElHSFRfS0VZU30KICAgIHJldHVybiBfdHlwZWQoUFJFRkxJR0hUX1NDSEVNQSwgcm93KQoKCmRlZiBfcHJvdmlkZXIocHJvdmlkZXI6IENhbGxhYmxlW1tdLCBBbnldLCB0eXBlX25hbWU6IHN0ciwgbmFtZXM6IHR1cGxlW3N0ciwgLi4uXSkgLT4gTWFwcGluZ1tzdHIsIEFueV06CiAgICB2YWx1ZSA9IHByb3ZpZGVyKCkKICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBNYXBwaW5nKSBvciB2YWx1ZS5nZXQoIl9fdHlwZV9uYW1lX18iKSAhPSB0eXBlX25hbWU6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigicHJvdmlkZXItdHlwZSIpCiAgICBpZiB0dXBsZShrIGZvciBrIGluIHZhbHVlIGlmIGsgIT0gIl9fdHlwZV9uYW1lX18iKSAhPSBuYW1lczoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJwcm92aWRlci1rZXlzIikKICAgIHJldHVybiB2YWx1ZQoKCmRlZiBpbnZva2VfcHJlY29uc3VtcHRpb25fcHJlZmxpZ2h0KAogICAgKiwgYXV0aG9yaXphdGlvbl9pZDogc3RyLCBhdXRob3JpemVkX2F0X3Jhdzogc3RyLCBleHBpcmVzX2F0X3Jhdzogc3RyLAogICAgZXhwZWN0ZWRfcGxhbl9ieXRlczogaW50LCBleHBlY3RlZF9wbGFuX3NoYTI1Njogc3RyLAogICAgZXhwZWN0ZWRfb3V0ZXJfZXhlY3V0YWJsZV9wYXRoOiBzdHIsIGV4cGVjdGVkX291dGVyX2NvbW1hbmRfbGluZV9zaGEyNTY6IHN0ciwKICAgIGV4cGVjdGVkX291dGVyX2NvbW1hbmRfbGluZV9iYXNlNjQ6IHN0ciwgc291cmNlX3ByZWZsaWdodF9wcm9jZXNzX2lkOiBpbnQsCiAgICBwcm9oaWJpdGVkX2V4ZWN1dGFibGVfcGF0aHM6IFNlcXVlbmNlW3N0cl0sIGludm9jYXRpb25fZ2F0ZTogSW52b2NhdGlvbkdhdGUsCiAgICBub3dfcHJvdmlkZXI6IENhbGxhYmxlW1tdLCBkdC5kYXRldGltZV0sIGlkZW50aXR5X3Byb3ZpZGVyOiBDYWxsYWJsZVtbXSwgQW55XSwKICAgIHBsYW5faGFzaF9wcm92aWRlcjogQ2FsbGFibGVbW10sIEFueV0sIHRhcmdldF9zdGF0ZV9wcm92aWRlcjogQ2FsbGFibGVbW10sIEFueV0sCiAgICBoaXN0b3J5X3Byb3ZpZGVyOiBDYWxsYWJsZVtbXSwgQW55XSwgcHJvY2Vzc19zbmFwc2hvdF9wcm92aWRlcjogQ2FsbGFibGVbW10sIEFueV0sCikgLT4gZGljdFtzdHIsIEFueV06CiAgICBpZiBub3QgaW52b2NhdGlvbl9nYXRlLmFjcXVpcmVfb25jZSgpOgogICAgICAgIHJldHVybiBfcHJlZmxpZ2h0KHsiYXV0aG9yaXphdGlvbl9pZCI6IGF1dGhvcml6YXRpb25faWQsICJwcmVmbGlnaHRfc3RhZ2UiOiAiU1RBUlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAicmVzdWx0X3NjaGVtYV9pZCI6IFBSRUZMSUdIVF9TQ0hFTUEsICJzdGF0dXMiOiAiU1RPUCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdG9wX2NvZGUiOiAiU1RPUF9QUkVDT05TVU1QVElPTl9BTFJFQURZX0lOVk9LRUQifSkKICAgIHZhbHVlczogZGljdFtzdHIsIEFueV0gPSB7CiAgICAgICAgImF1dGhvcml6YXRpb25faWQiOiBhdXRob3JpemF0aW9uX2lkLCAiYXV0aG9yaXplZF9vdXRlcl9zdGFydGVkIjogRmFsc2UsCiAgICAgICAgImNyZWRlbnRpYWxfYWNjZXNzIjogRmFsc2UsICJkYXRhYmFzZV9jb25uZWN0aW9uX3BlcmZvcm1lZCI6IEZhbHNlLAogICAgICAgICJpbnZvY2F0aW9uX2NvdW50IjogMSwgIm5ldHdvcmtfYWNjZXNzIjogRmFsc2UsICJwcmVmbGlnaHRfc3RhZ2UiOiAiU1RBUlQiLAogICAgICAgICJyZXN1bHRfc2NoZW1hX2lkIjogUFJFRkxJR0hUX1NDSEVNQSwgInN0YXR1cyI6ICJTVE9QIiwKICAgIH0KICAgIHRyeToKICAgICAgICB2YWx1ZXNbInByZWZsaWdodF9zdGFnZSJdID0gIklERU5USVRZIgogICAgICAgIGlkZW50aXR5ID0gX3Byb3ZpZGVyKGlkZW50aXR5X3Byb3ZpZGVyLCAiQU5BLlNFTUkuUFJFRkxJR0hULklERU5USVRZLlYwMDEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiY3dkIiwgImhvc3QiLCAicm9sZV9pbnN0YW5jZV9pZCIsICJzY2hlbWFfaWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlX3RocmVhZF9pZCIsICJzdGF0dXMiLCAidW5jZXJ0YWluX2ZpZWxkcyIpKQogICAgICAgIGlmIGlkZW50aXR5WyJzdGF0dXMiXSAhPSAiUEFTUyI6CiAgICAgICAgICAgIHZhbHVlc1sidW5jZXJ0YWluX2ZpZWxkIl0gPSAiLCIuam9pbihpZGVudGl0eS5nZXQoInVuY2VydGFpbl9maWVsZHMiKSBvciBbXSkgb3IgTm9uZQogICAgICAgICAgICB2YWx1ZXNbInN0b3BfY29kZSJdID0gIlNUT1BfUFJFQ09OU1VNUFRJT05fU1RBVEVfVU5DRVJUQUlOIiBpZiBpZGVudGl0eVsic3RhdHVzIl0gPT0gIlVOS05PV04iIGVsc2UgIlNUT1BfUFJFQ09OU1VNUFRJT05fR0FURV9NSVNNQVRDSCIKICAgICAgICAgICAgcmV0dXJuIF9wcmVmbGlnaHQodmFsdWVzKQogICAgICAgIHZhbHVlc1sicHJlZmxpZ2h0X3N0YWdlIl0gPSAiV0lORE9XX1BBUlNFIgogICAgICAgIHdpbmRvdyA9IGNvbnZlcnRfYXV0aG9yaXphdGlvbl93aW5kb3coYXV0aG9yaXplZF9hdF9yYXcsIGV4cGlyZXNfYXRfcmF3KQogICAgICAgIHZhbHVlc1siYXV0aG9yaXplZF9hdF91dGNfdGlja3MiXSA9IHdpbmRvd1siYXV0aG9yaXplZF9hdF91dGNfdGlja3MiXQogICAgICAgIHZhbHVlc1siZXhwaXJlc19hdF91dGNfdGlja3MiXSA9IHdpbmRvd1siZXhwaXJlc19hdF91dGNfdGlja3MiXQogICAgICAgIGlmIHdpbmRvd1sic3RhdHVzIl0gIT0gIlBBU1MiOgogICAgICAgICAgICB2YWx1ZXNbInN0b3BfY29kZSJdID0gIlNUT1BfUFJFQ09OU1VNUFRJT05fR0FURV9NSVNNQVRDSCIKICAgICAgICAgICAgcmV0dXJuIF9wcmVmbGlnaHQodmFsdWVzKQogICAgICAgIHZhbHVlc1sicHJlZmxpZ2h0X3N0YWdlIl0gPSAiQ0xPQ0siCiAgICAgICAgbm93ID0gbm93X3Byb3ZpZGVyKCkKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShub3csIGR0LmRhdGV0aW1lKSBvciBub3cudHppbmZvIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNsb2NrLXR5cGUiKQogICAgICAgIHN0YW1wID0gbm93LmFzdGltZXpvbmUoZHQudGltZXpvbmUudXRjKS5pc29mb3JtYXQodGltZXNwZWM9Im1pY3Jvc2Vjb25kcyIpLnJlcGxhY2UoIiswMDowMCIsICJaIikKICAgICAgICB2YWx1ZXNbIm5vd191dGNfdGlja3MiXSA9IF90aWNrcyhub3cpCiAgICAgICAgdmFsdWVzWyJzdGFydGVkX2F0Il0gPSBzdGFtcAogICAgICAgIHZhbHVlc1siZmluaXNoZWRfYXQiXSA9IHN0YW1wCiAgICAgICAgdmFsdWVzWyJwcmVmbGlnaHRfc3RhZ2UiXSA9ICJXSU5ET1dfVEVTVCIKICAgICAgICB3aW5kb3dfdGVzdCA9IHRlc3RfYXV0aG9yaXphdGlvbl93aW5kb3cod2luZG93LCBub3cpCiAgICAgICAgaWYgd2luZG93X3Rlc3RbInN0YXR1cyJdICE9ICJQQVNTIiBvciBub3Qgd2luZG93X3Rlc3RbImluc2lkZV93aW5kb3ciXToKICAgICAgICAgICAgdmFsdWVzWyJzdG9wX2NvZGUiXSA9ICJTVE9QX1BSRUNPTlNVTVBUSU9OX0dBVEVfTUlTTUFUQ0giCiAgICAgICAgICAgIHJldHVybiBfcHJlZmxpZ2h0KHZhbHVlcykKICAgICAgICB2YWx1ZXNbInByZWZsaWdodF9zdGFnZSJdID0gIlBMQU5fSEFTSCIKICAgICAgICBwbGFuID0gX3Byb3ZpZGVyKHBsYW5faGFzaF9wcm92aWRlciwgIkFOQS5TRU1JLlBSRUZMSUdIVC5QTEFOSEFTSC5WMDAxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICgiYnl0ZXMiLCAic2NoZW1hX2lkIiwgInNoYTI1NiIsICJzdGF0dXMiLCAidW5jZXJ0YWluX2ZpZWxkcyIpKQogICAgICAgIGlmIHBsYW5bInN0YXR1cyJdICE9ICJQQVNTIiBvciBpbnQocGxhblsiYnl0ZXMiXSkgIT0gZXhwZWN0ZWRfcGxhbl9ieXRlcyBvciBwbGFuWyJzaGEyNTYiXSAhPSBleHBlY3RlZF9wbGFuX3NoYTI1NjoKICAgICAgICAgICAgdmFsdWVzWyJzdG9wX2NvZGUiXSA9ICJTVE9QX1BSRUNPTlNVTVBUSU9OX0dBVEVfTUlTTUFUQ0giCiAgICAgICAgICAgIHJldHVybiBfcHJlZmxpZ2h0KHZhbHVlcykKICAgICAgICB2YWx1ZXNbInByZWZsaWdodF9zdGFnZSJdID0gIlRBUkdFVF9TVEFURSIKICAgICAgICB0YXJnZXQgPSBfcHJvdmlkZXIodGFyZ2V0X3N0YXRlX3Byb3ZpZGVyLCAiQU5BLlNFTUkuUFJFRkxJR0hULlRBUkdFVFNUQVRFLlYwMDEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoImNhbmRpZGF0ZV9ydW5fZXhpc3RzIiwgIm1hdGVyaWFsaXplZF90YXJnZXRfY291bnQiLCAic2NoZW1hX2lkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGF0dXMiLCAidGFyZ2V0X2V4aXN0aW5nX2NvdW50IiwgInVuY2VydGFpbl9maWVsZHMiKSkKICAgICAgICB2YWx1ZXNbImNhbmRpZGF0ZV9ydW5fZXhpc3RzIl0gPSB0YXJnZXRbImNhbmRpZGF0ZV9ydW5fZXhpc3RzIl0KICAgICAgICB2YWx1ZXNbIm1hdGVyaWFsaXplZF90YXJnZXRfY291bnQiXSA9IHRhcmdldFsibWF0ZXJpYWxpemVkX3RhcmdldF9jb3VudCJdCiAgICAgICAgdmFsdWVzWyJ0YXJnZXRfZXhpc3RpbmdfY291bnQiXSA9IHRhcmdldFsidGFyZ2V0X2V4aXN0aW5nX2NvdW50Il0KICAgICAgICBpZiB0YXJnZXRbInN0YXR1cyJdICE9ICJQQVNTIjoKICAgICAgICAgICAgdmFsdWVzWyJzdG9wX2NvZGUiXSA9ICJTVE9QX1BSRUNPTlNVTVBUSU9OX1NUQVRFX1VOQ0VSVEFJTiIgaWYgdGFyZ2V0WyJzdGF0dXMiXSA9PSAiVU5LTk9XTiIgZWxzZSAiU1RPUF9QUkVDT05TVU1QVElPTl9HQVRFX01JU01BVENIIgogICAgICAgICAgICByZXR1cm4gX3ByZWZsaWdodCh2YWx1ZXMpCiAgICAgICAgdmFsdWVzWyJwcmVmbGlnaHRfc3RhZ2UiXSA9ICJISVNUT1JZIgogICAgICAgIGhpc3RvcnkgPSBfcHJvdmlkZXIoaGlzdG9yeV9wcm92aWRlciwgIkFOQS5TRU1JLlBSRUZMSUdIVC5ISVNUT1JZLlYwMDEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJoaXN0b3J5X2hhc2hfbWlzbWF0Y2hfY291bnQiLCAic2NoZW1hX2lkIiwgInN0YXR1cyIsICJ1bmNlcnRhaW5fZmllbGRzIikpCiAgICAgICAgdmFsdWVzWyJoaXN0b3J5X2hhc2hfbWlzbWF0Y2hfY291bnQiXSA9IGhpc3RvcnlbImhpc3RvcnlfaGFzaF9taXNtYXRjaF9jb3VudCJdCiAgICAgICAgaWYgaGlzdG9yeVsic3RhdHVzIl0gIT0gIlBBU1MiOgogICAgICAgICAgICB2YWx1ZXNbInN0b3BfY29kZSJdID0gIlNUT1BfUFJFQ09OU1VNUFRJT05fU1RBVEVfVU5DRVJUQUlOIiBpZiBoaXN0b3J5WyJzdGF0dXMiXSA9PSAiVU5LTk9XTiIgZWxzZSAiU1RPUF9QUkVDT05TVU1QVElPTl9HQVRFX01JU01BVENIIgogICAgICAgICAgICByZXR1cm4gX3ByZWZsaWdodCh2YWx1ZXMpCiAgICAgICAgdmFsdWVzWyJwcmVmbGlnaHRfc3RhZ2UiXSA9ICJQUk9DRVNTX1NOQVBTSE9UIgogICAgICAgIHNuYXBzaG90ID0gX3Byb3ZpZGVyKHByb2Nlc3Nfc25hcHNob3RfcHJvdmlkZXIsICJBTkEuU0VNSS5QUkVGTElHSFQuU05BUFNIT1QuVjAwMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJhZGFwdGVyX3N0YXR1cyIsICJyb3dzIiwgInNjaGVtYV9pZCIsICJzbmFwc2hvdF9pZCIsICJ1bmNlcnRhaW5fZmllbGRzIikpCiAgICAgICAgaWYgc25hcHNob3RbImFkYXB0ZXJfc3RhdHVzIl0gIT0gIlBBU1MiOgogICAgICAgICAgICB2YWx1ZXNbInN0b3BfY29kZSJdID0gIlNUT1BfUFJFQ09OU1VNUFRJT05fU1RBVEVfVU5DRVJUQUlOIgogICAgICAgICAgICByZXR1cm4gX3ByZWZsaWdodCh2YWx1ZXMpCiAgICAgICAgdmFsdWVzWyJwcmVmbGlnaHRfc3RhZ2UiXSA9ICJQUk9DRVNTX1NFTEVDVCIKICAgICAgICBzZWxlY3Rpb24gPSBzZWxlY3RfZXhhY3RfcmVsYXRlZF9wcm9jZXNzKAogICAgICAgICAgICBzbmFwc2hvdFsicm93cyJdLCBleHBlY3RlZF9vdXRlcl9leGVjdXRhYmxlX3BhdGgsCiAgICAgICAgICAgIGV4cGVjdGVkX291dGVyX2NvbW1hbmRfbGluZV9zaGEyNTYsIGV4cGVjdGVkX291dGVyX2NvbW1hbmRfbGluZV9iYXNlNjQsCiAgICAgICAgICAgIHNvdXJjZV9wcmVmbGlnaHRfcHJvY2Vzc19pZCwgcHJvaGliaXRlZF9leGVjdXRhYmxlX3BhdGhzLAogICAgICAgICkKICAgICAgICB2YWx1ZXNbInJlbGF0ZWRfcHJvY2Vzc19jb3VudCJdID0gc2VsZWN0aW9uWyJyZWxhdGVkX3Byb2Nlc3NfY291bnQiXQogICAgICAgIGlmIHNlbGVjdGlvblsic3RhdHVzIl0gIT0gIlBBU1MiOgogICAgICAgICAgICB2YWx1ZXNbInVuY2VydGFpbl9maWVsZCJdID0gIiwiLmpvaW4oc2VsZWN0aW9uLmdldCgidW5jZXJ0YWluX2ZpZWxkcyIpIG9yIFtdKSBvciBOb25lCiAgICAgICAgICAgIHZhbHVlc1sic3RvcF9jb2RlIl0gPSAiU1RPUF9QUkVDT05TVU1QVElPTl9TVEFURV9VTkNFUlRBSU4iIGlmIHNlbGVjdGlvbi5nZXQoInVuY2VydGFpbl9maWVsZHMiKSBlbHNlICJTVE9QX1BSRUNPTlNVTVBUSU9OX0dBVEVfTUlTTUFUQ0giCiAgICAgICAgICAgIHJldHVybiBfcHJlZmxpZ2h0KHZhbHVlcykKICAgICAgICB2YWx1ZXNbInByZWZsaWdodF9zdGFnZSJdID0gIlBBU1MiCiAgICAgICAgdmFsdWVzWyJzdGF0dXMiXSA9ICJQQVNTIgogICAgICAgIHZhbHVlc1sic3RvcF9jb2RlIl0gPSBOb25lCiAgICAgICAgcmV0dXJuIF9wcmVmbGlnaHQodmFsdWVzKQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6CiAgICAgICAgdmFsdWVzWyJleGNlcHRpb25fdHlwZSJdID0gdHlwZShleGMpLl9fbmFtZV9fCiAgICAgICAgdmFsdWVzWyJzdG9wX2NvZGUiXSA9ICJTVE9QX1BSRUNPTlNVTVBUSU9OX1BSRUZMSUdIVF9FWENFUFRJT04iCiAgICAgICAgcmV0dXJuIF9wcmVmbGlnaHQodmFsdWVzKQoKCmRlZiBjYW5vbmljYWxfanNvbl9ieXRlcyh2YWx1ZTogQW55KSAtPiBieXRlczoKICAgIHJldHVybiBqc29uLmR1bXBzKHZhbHVlLCBlbnN1cmVfYXNjaWk9RmFsc2UsIHNlcGFyYXRvcnM9KCIsIiwgIjoiKSwgc29ydF9rZXlzPVRydWUpLmVuY29kZSgidXRmLTgiKQoKCmRlZiB3cml0ZV9jcmVhdGVfbmV3X2J5dGVzKHBhdGg6IHBhdGhsaWIuUGF0aCwgZGF0YTogYnl0ZXMpIC0+IE5vbmU6CiAgICBwYXRoID0gcGF0aC5yZXNvbHZlKHN0cmljdD1GYWxzZSkKICAgIGlmIHBhdGguZXhpc3RzKCkgb3IgcGF0aC5pc19zeW1saW5rKCk6CiAgICAgICAgcmFpc2UgRmlsZUV4aXN0c0Vycm9yKHN0cihwYXRoKSkKICAgIHdpdGggcGF0aC5vcGVuKCJ4YiIpIGFzIHN0cmVhbToKICAgICAgICB3cml0dGVuID0gc3RyZWFtLndyaXRlKGRhdGEpCiAgICAgICAgaWYgd3JpdHRlbiAhPSBsZW4oZGF0YSk6CiAgICAgICAgICAgIHJhaXNlIE9TRXJyb3IoInBhcnRpYWwtd3JpdGUiKQogICAgICAgIHN0cmVhbS5mbHVzaCgpCiAgICAgICAgb3MuZnN5bmMoc3RyZWFtLmZpbGVubygpKQogICAgaWYgcGF0aC5pc19zeW1saW5rKCkgb3Igbm90IHBhdGguaXNfZmlsZSgpOgogICAgICAgIHJhaXNlIE9TRXJyb3IoIm5vdC1vcmRpbmFyeSIpCiAgICByZW9wZW5lZCA9IHBhdGgucmVhZF9ieXRlcygpCiAgICBpZiByZW9wZW5lZCAhPSBkYXRhOgogICAgICAgIHJhaXNlIE9TRXJyb3IoInJlb3Blbi1taXNtYXRjaCIpCgoKZGVmIGNyZWF0ZV9vdXRwdXRfdHJlZShvdXRwdXRfcm9vdDogcGF0aGxpYi5QYXRoKSAtPiB0dXBsZVtwYXRobGliLlBhdGgsIHBhdGhsaWIuUGF0aCwgcGF0aGxpYi5QYXRoXToKICAgIGlmIG91dHB1dF9yb290LmV4aXN0cygpIG9yIG91dHB1dF9yb290LmlzX3N5bWxpbmsoKToKICAgICAgICByYWlzZSBGaWxlRXhpc3RzRXJyb3Ioc3RyKG91dHB1dF9yb290KSkKICAgIG91dHB1dF9yb290Lm1rZGlyKCkKICAgIHRlc3QgPSBvdXRwdXRfcm9vdCAvICJ0ZXN0IgogICAgcmVjZWlwdCA9IG91dHB1dF9yb290IC8gInJlY2VpcHQiCiAgICBtYW5pZmVzdCA9IG91dHB1dF9yb290IC8gIm1hbmlmZXN0IgogICAgZm9yIHBhdGggaW4gKHRlc3QsIHJlY2VpcHQsIG1hbmlmZXN0KToKICAgICAgICBwYXRoLm1rZGlyKCkKICAgICAgICBpZiBwYXRoLmlzX3N5bWxpbmsoKSBvciBub3QgcGF0aC5pc19kaXIoKToKICAgICAgICAgICAgcmFpc2UgT1NFcnJvcigiZGlyZWN0b3J5LWNvbnRyYWN0IikKICAgIHJldHVybiB0ZXN0LCByZWNlaXB0LCBtYW5pZmVzdAo=
Y02	E:\mb-ms-doc\project-info\dev\ana-dev\test\test_ana_semi_preconsumption_v002.py	3359	1983df916d5b9553a885a949d2674d9f8a8e7b1a6c4c5989eadf48245d929cf0	ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucwoKaW1wb3J0IGFzdAppbXBvcnQgcGF0aGxpYgpmcm9tIHR5cGluZyBpbXBvcnQgQW55CgoKRk9SQklEREVOX0lNUE9SVFMgPSB7CiAgICAiaHR0cCIsICJteXNxbCIsICJteXNxbC5jb25uZWN0b3IiLCAicHlteXNxbCIsICJyZXF1ZXN0cyIsICJzb2NrZXQiLAogICAgInNxbGFsY2hlbXkiLCAic3VicHJvY2VzcyIsICJ1cmxsaWIiLAp9CkZPUkJJRERFTl9DQUxMUyA9IHsiY29tcGlsZSIsICJldmFsIiwgImV4ZWMiLCAiX19pbXBvcnRfXyJ9ClJFUVVJUkVEX0ZVTkNUSU9OUyA9IHsKICAgICJjb252ZXJ0X2F1dGhvcml6YXRpb25fd2luZG93IiwgInRlc3RfYXV0aG9yaXphdGlvbl93aW5kb3ciLAogICAgInNlbGVjdF9leGFjdF9yZWxhdGVkX3Byb2Nlc3MiLCAiaW52b2tlX3ByZWNvbnN1bXB0aW9uX3ByZWZsaWdodCIsCiAgICAiY2Fub25pY2FsX2pzb25fYnl0ZXMiLCAid3JpdGVfY3JlYXRlX25ld19ieXRlcyIsICJjcmVhdGVfb3V0cHV0X3RyZWUiLAp9CgoKZGVmIF9jaGVja19zb3VyY2UobW9kdWxlX3BhdGg6IHBhdGhsaWIuUGF0aCwgdmFsaWRhdGlvbl9wYXRoOiBwYXRobGliLlBhdGgpIC0+IGxpc3RbZGljdFtzdHIsIEFueV1dOgogICAgbW9kdWxlX2J5dGVzID0gbW9kdWxlX3BhdGgucmVhZF9ieXRlcygpCiAgICB2YWxpZGF0aW9uX2J5dGVzID0gdmFsaWRhdGlvbl9wYXRoLnJlYWRfYnl0ZXMoKQogICAgbW9kdWxlX3RleHQgPSBtb2R1bGVfYnl0ZXMuZGVjb2RlKCJ1dGYtOCIsIGVycm9ycz0ic3RyaWN0IikKICAgIHZhbGlkYXRpb25fdGV4dCA9IHZhbGlkYXRpb25fYnl0ZXMuZGVjb2RlKCJ1dGYtOCIsIGVycm9ycz0ic3RyaWN0IikKICAgIHRyZWUgPSBhc3QucGFyc2UobW9kdWxlX3RleHQsIGZpbGVuYW1lPXN0cihtb2R1bGVfcGF0aCksIG1vZGU9ImV4ZWMiKQogICAgdmFsaWRhdGlvbl90cmVlID0gYXN0LnBhcnNlKHZhbGlkYXRpb25fdGV4dCwgZmlsZW5hbWU9c3RyKHZhbGlkYXRpb25fcGF0aCksIG1vZGU9ImV4ZWMiKQogICAgZnVuY3Rpb25zID0ge25vZGUubmFtZSBmb3Igbm9kZSBpbiBhc3Qud2Fsayh0cmVlKSBpZiBpc2luc3RhbmNlKG5vZGUsIGFzdC5GdW5jdGlvbkRlZil9CiAgICBpbXBvcnRzOiBzZXRbc3RyXSA9IHNldCgpCiAgICBmb3JiaWRkZW5fY2FsbHM6IHNldFtzdHJdID0gc2V0KCkKICAgIGZvciBwYXJzZWQgaW4gKHRyZWUsIHZhbGlkYXRpb25fdHJlZSk6CiAgICAgICAgZm9yIG5vZGUgaW4gYXN0LndhbGsocGFyc2VkKToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLCBhc3QuSW1wb3J0KToKICAgICAgICAgICAgICAgIGltcG9ydHMudXBkYXRlKGFsaWFzLm5hbWUgZm9yIGFsaWFzIGluIG5vZGUubmFtZXMpCiAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBhc3QuSW1wb3J0RnJvbSk6CiAgICAgICAgICAgICAgICBpbXBvcnRzLmFkZChub2RlLm1vZHVsZSBvciAiIikKICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIGFzdC5DYWxsKSBhbmQgaXNpbnN0YW5jZShub2RlLmZ1bmMsIGFzdC5OYW1lKSBhbmQgbm9kZS5mdW5jLmlkIGluIEZPUkJJRERFTl9DQUxMUzoKICAgICAgICAgICAgICAgIGZvcmJpZGRlbl9jYWxscy5hZGQobm9kZS5mdW5jLmlkKQogICAgY2hlY2tzID0gWwogICAgICAgICgiUzAxLU1PRFVMRS1VVEY4IiwgInByZXNlbnQiLCAicHJlc2VudCIgaWYgbW9kdWxlX2J5dGVzLmVuZHN3aXRoKGIiXG4iKSBlbHNlICJhYnNlbnQiKSwKICAgICAgICAoIlMwMi1WQUxJREFUSU9OLVVURjgiLCAicHJlc2VudCIsICJwcmVzZW50IiBpZiB2YWxpZGF0aW9uX2J5dGVzLmVuZHN3aXRoKGIiXG4iKSBlbHNlICJhYnNlbnQiKSwKICAgICAgICAoIlMwMy1GT1VSLUFQSSIsICJwcmVzZW50IiwgInByZXNlbnQiIGlmIFJFUVVJUkVEX0ZVTkNUSU9OUy5pc3N1YnNldChmdW5jdGlvbnMpIGVsc2UgImFic2VudCIpLAogICAgICAgICgiUzA0LU5PLUZPUkJJRERFTi1JTVBPUlQiLCAiYWJzZW50IiwgInByZXNlbnQiIGlmIGltcG9ydHMgJiBGT1JCSURERU5fSU1QT1JUUyBlbHNlICJhYnNlbnQiKSwKICAgICAgICAoIlMwNS1OTy1EWU5BTUlDLUNBTEwiLCAiYWJzZW50IiwgInByZXNlbnQiIGlmIGZvcmJpZGRlbl9jYWxscyBlbHNlICJhYnNlbnQiKSwKICAgICAgICAoIlMwNi1EQVRFVElNRS1USUNLUyIsICJwcmVzZW50IiwgInByZXNlbnQiIGlmICJkZWYgX3RpY2tzIiBpbiBtb2R1bGVfdGV4dCBlbHNlICJhYnNlbnQiKSwKICAgICAgICAoIlMwNy1TSU5HTEUtR0FURSIsICJwcmVzZW50IiwgInByZXNlbnQiIGlmICJjbGFzcyBJbnZvY2F0aW9uR2F0ZSIgaW4gbW9kdWxlX3RleHQgZWxzZSAiYWJzZW50IiksCiAgICAgICAgKCJTMDgtQ1JFQVRFLU5FVyIsICJwcmVzZW50IiwgInByZXNlbnQiIGlmICdvcGVuKCJ4YiIpJyBpbiBtb2R1bGVfdGV4dCBlbHNlICJhYnNlbnQiKSwKICAgICAgICAoIlMwOS1GU1lOQyIsICJwcmVzZW50IiwgInByZXNlbnQiIGlmICJvcy5mc3luYyIgaW4gbW9kdWxlX3RleHQgZWxzZSAiYWJzZW50IiksCiAgICAgICAgKCJTMTAtTk8tREFUQUJBU0UiLCAiYWJzZW50IiwgInByZXNlbnQiIGlmICJTSE9XIEdSQU5UUyIgaW4gbW9kdWxlX3RleHQgb3IgIkNVUlJFTlRfVVNFUiIgaW4gbW9kdWxlX3RleHQgZWxzZSAiYWJzZW50IiksCiAgICAgICAgKCJTMTEtTk8tTEVHQUNZLVJPVVRFIiwgImFic2VudCIsICJwcmVzZW50IiBpZiAibWJ4IHNlbmQiIGluIChtb2R1bGVfdGV4dCArIHZhbGlkYXRpb25fdGV4dCkubG93ZXIoKSBlbHNlICJhYnNlbnQiKSwKICAgICAgICAoIlMxMi1OTy1ORVRXT1JLIiwgImFic2VudCIsICJwcmVzZW50IiBpZiAic29ja2V0LiIgaW4gKG1vZHVsZV90ZXh0ICsgdmFsaWRhdGlvbl90ZXh0KSBlbHNlICJhYnNlbnQiKSwKICAgIF0KICAgIHJldHVybiBbCiAgICAgICAgeyJhY3R1YWwiOiBhY3R1YWwsICJjaGVja19pZCI6IGNoZWNrX2lkLCAiZXhwZWN0ZWQiOiBleHBlY3RlZCwKICAgICAgICAgInN0YXR1cyI6ICJNQVRDSCIgaWYgYWN0dWFsID09IGV4cGVjdGVkIGVsc2UgIk1JU01BVENIIiwKICAgICAgICAgInN0b3BfY29kZSI6IE5vbmUgaWYgYWN0dWFsID09IGV4cGVjdGVkIGVsc2UgIlNUQVRJQ19DSEVDS19NSVNNQVRDSCJ9CiAgICAgICAgZm9yIGNoZWNrX2lkLCBleHBlY3RlZCwgYWN0dWFsIGluIGNoZWNrcwogICAgXQoKCmRlZiBydW5fc3RhdGljX2NoZWNrcyhtb2R1bGVfcGF0aDogcGF0aGxpYi5QYXRoLCB2YWxpZGF0aW9uX3BhdGg6IHBhdGhsaWIuUGF0aCkgLT4gbGlzdFtkaWN0W3N0ciwgQW55XV06CiAgICByZXR1cm4gX2NoZWNrX3NvdXJjZShtb2R1bGVfcGF0aCwgdmFsaWRhdGlvbl9wYXRoKQo=
Y03	E:\mb-ms-doc\project-info\dev\ana-dev\test\ana_semi_preconsumption_vectors_v002.json	4016	86f563b43d934cb0828e395f557ded328ad2abcfb2c1ef7bdbc8a4c32c12cbca	eyJhcGlfY29udHJhY3RzIjpbeyJhcGlfaWQiOiJDT05WRVJUIiwiZXhwZWN0ZWRfdHlwZSI6IkFOQS5TRU1JLkFVVEhPUklaQVRJT04uV0lORE9XLlYwMDEiLCJwcm9wZXJ0eV9uYW1lcyI6WyJhdXRob3JpemVkX2F0X3JhdyIsImF1dGhvcml6ZWRfYXRfdXRjX3RpY2tzIiwiZXhwaXJlc19hdF9yYXciLCJleHBpcmVzX2F0X3V0Y190aWNrcyIsInNjaGVtYV9pZCIsInN0YXR1cyIsInN0b3BfY29kZSJdLCJwcm9wZXJ0eV9ydWxlcyI6WyJTVFJJTkdfTk9OTlVMTCIsIklOVDY0X09SX05VTEwiLCJTVFJJTkdfTk9OTlVMTCIsIklOVDY0X09SX05VTEwiLCJTVFJJTkdfTk9OTlVMTCIsIlNUUklOR19OT05OVUxMIiwiU1RSSU5HX09SX05VTEwiXX0seyJhcGlfaWQiOiJJTlZPS0UiLCJleHBlY3RlZF90eXBlIjoiQU5BLlNFTUkuUFJFQ09OU1VNUFRJT04uUkVTVUxULlYwMDIiLCJwcm9wZXJ0eV9uYW1lcyI6WyJhdXRob3JpemF0aW9uX2lkIiwiYXV0aG9yaXplZF9hdF91dGNfdGlja3MiLCJhdXRob3JpemVkX291dGVyX3N0YXJ0ZWQiLCJjYW5kaWRhdGVfcnVuX2V4aXN0cyIsImNyZWRlbnRpYWxfYWNjZXNzIiwiZGF0YWJhc2VfY29ubmVjdGlvbl9wZXJmb3JtZWQiLCJleGNlcHRpb25fdHlwZSIsImV4cGlyZXNfYXRfdXRjX3RpY2tzIiwiZmluaXNoZWRfYXQiLCJoaXN0b3J5X2hhc2hfbWlzbWF0Y2hfY291bnQiLCJpbnZvY2F0aW9uX2NvdW50IiwibWF0ZXJpYWxpemVkX3RhcmdldF9jb3VudCIsIm5ldHdvcmtfYWNjZXNzIiwibm93X3V0Y190aWNrcyIsInByZWZsaWdodF9zdGFnZSIsInJlbGF0ZWRfcHJvY2Vzc19jb3VudCIsInJlc3VsdF9zY2hlbWFfaWQiLCJzdGFydGVkX2F0Iiwic3RhdHVzIiwic3RvcF9jb2RlIiwidGFyZ2V0X2V4aXN0aW5nX2NvdW50IiwidW5jZXJ0YWluX2ZpZWxkIl0sInByb3BlcnR5X3J1bGVzIjpbIlNUUklOR19OT05OVUxMIiwiSU5UNjRfT1JfTlVMTCIsIkJPT0xfT1JfTlVMTCIsIkJPT0xfT1JfTlVMTCIsIkJPT0xfT1JfTlVMTCIsIkJPT0xfT1JfTlVMTCIsIlNUUklOR19PUl9OVUxMIiwiSU5UNjRfT1JfTlVMTCIsIlNUUklOR19PUl9OVUxMIiwiSU5UMzJfT1JfTlVMTCIsIklOVDMyX09SX05VTEwiLCJJTlQzMl9PUl9OVUxMIiwiQk9PTF9PUl9OVUxMIiwiSU5UNjRfT1JfTlVMTCIsIlNUUklOR19OT05OVUxMIiwiSU5UMzJfT1JfTlVMTCIsIlNUUklOR19OT05OVUxMIiwiU1RSSU5HX09SX05VTEwiLCJTVFJJTkdfTk9OTlVMTCIsIlNUUklOR19PUl9OVUxMIiwiSU5UMzJfT1JfTlVMTCIsIlNUUklOR19PUl9OVUxMIl19LHsiYXBpX2lkIjoiU0VMRUNUT1IiLCJleHBlY3RlZF90eXBlIjoiQU5BLlNFTUkuUFJPQ0VTUy5TRUxFQ1RPUi5SRVNVTFQuVjAwMSIsInByb3BlcnR5X25hbWVzIjpbImNvbmZpcm1lZF96ZXJvIiwiZHVwbGljYXRlX3Byb2Nlc3NfaWRfY291bnQiLCJleGFjdF9vdXRlcl9jb3VudCIsIm1hdGNoZWRfcHJvY2Vzc19pZHMiLCJwcm9oaWJpdGVkX3Byb2Nlc3NfY291bnQiLCJyZWxhdGVkX3Byb2Nlc3NfY291bnQiLCJzY2hlbWFfaWQiLCJzbmFwc2hvdF9yb3dfY291bnQiLCJzdGF0dXMiLCJzdG9wX2NvZGUiLCJ1bmNlcnRhaW5fZmllbGRzIiwidW5rbm93bl9yZWxldmFudF9jb3VudCJdLCJwcm9wZXJ0eV9ydWxlcyI6WyJCT09MX09SX05VTEwiLCJJTlQzMl9PUl9OVUxMIiwiSU5UMzJfT1JfTlVMTCIsIkFSUkFZX1VJTlQzMl9PUl9OVUxMIiwiSU5UMzJfT1JfTlVMTCIsIklOVDMyX09SX05VTEwiLCJTVFJJTkdfTk9OTlVMTCIsIklOVDMyX09SX05VTEwiLCJTVFJJTkdfTk9OTlVMTCIsIlNUUklOR19PUl9OVUxMIiwiQVJSQVlfU1RSSU5HX09SX05VTEwiLCJJTlQzMl9PUl9OVUxMIl19LHsiYXBpX2lkIjoiVEVTVCIsImV4cGVjdGVkX3R5cGUiOiJBTkEuU0VNSS5BVVRIT1JJWkFUSU9OLldJTkRPVy5URVNULlYwMDEiLCJwcm9wZXJ0eV9uYW1lcyI6WyJhdXRob3JpemVkX2F0X3V0Y190aWNrcyIsImV4cGlyZXNfYXRfdXRjX3RpY2tzIiwiaW5zaWRlX3dpbmRvdyIsIm5vd191dGNfdGlja3MiLCJzY2hlbWFfaWQiLCJzdGF0dXMiLCJzdG9wX2NvZGUiXSwicHJvcGVydHlfcnVsZXMiOlsiSU5UNjRfT1JfTlVMTCIsIklOVDY0X09SX05VTEwiLCJCT09MX09SX05VTEwiLCJJTlQ2NF9PUl9OVUxMIiwiU1RSSU5HX05PTk5VTEwiLCJTVFJJTkdfTk9OTlVMTCIsIlNUUklOR19PUl9OVUxMIl19XSwiYXBpX25lZ2F0aXZlX2Nhc2VzIjpbIklOVk9LRS1QUk9QRVJUWS1FWFRSQSIsIklOVk9LRS1QUk9QRVJUWS1NSVNTSU5HIiwiSU5WT0tFLVBST1BFUlRZLU9SREVSIiwiSU5WT0tFLVBST1BFUlRZLVRZUEUiLCJJTlZPS0UtVFdPIiwiSU5WT0tFLVRZUEUtRFJJRlQiLCJJTlZPS0UtVFlQRS1NSVNTSU5HIiwiSU5WT0tFLVpFUk8iXSwiZm9yYmlkZGVuX2NvbW11bmljYXRpb25fdG9rZW5zX2Jhc2U2NCI6WyJiV0o0SUhObGJtUT0iLCJjSEp2YW1WamRDQnBibUp2ZUE9PSIsImMyVnpjMmx2YmlCaWNtbGtaMlU9IiwiYUdsemRHOXllU0JtWVd4c1ltRmphdz09IiwiYkdWbllXTjVJSEp2ZFhSbCJdLCJuYXRpdmVfZmluYWxfc2NoZW1hIjoiQU5BLlNFTUkuUFJFQ09OU1VNUFRJT04uTkFUSVZFLkZJTkFMLlYwMDQiLCJuYXRpdmVfc3RhdGVfaWRzIjpbIkMwMCIsIkMwMSIsIkMwMiIsIkMwMyIsIkMwNCIsIkMwNSIsIkMwNiIsIkMwNyIsIkMwOCIsIkMwOSIsIkMxMCIsIkMxMSIsIkMxMiIsIkMxMyIsIkMxNCIsIkMxNSIsIkMxNiIsIkMxNyIsIkMxOCIsIkMxOSIsIkMyMCIsIkMyMSIsIkMyMiIsIkMyMyIsIkMyNCIsIkMyNSIsIkMyNiIsIkMyNyIsIkMyOCIsIkMyOSIsIkMzMCIsIkMzMSIsIkMzMiIsIkMzMyIsIkMzNCIsIkMzNSIsIkMzNiIsIkMzNyIsIkMzOCIsIkMzOSIsIkM0MCJdLCJwcmVmbGlnaHRfY2FzZXMiOlsiSElTVE9SWV9NSVNNQVRDSCIsIklERU5USVRZX01JU01BVENIIiwiUEFTUyIsIlBMQU5fSEFTSF9NSVNNQVRDSCIsIlBST0NFU1NfVU5LTk9XTiIsIlNFQ09ORF9DQUxMIiwiVEFSR0VUX1VOS05PV04iLCJUSU1FX1BBUlNFX1NUT1AiXSwicHJvY2Vzc19zZWxlY3Rvcl9jYXNlcyI6WyJTLUFEQVBURVItVU5LTk9XTiIsIlMtQ01ELURJRkZFUkVOVCIsIlMtQ09NUE9VTkQtVU5LTk9XTi1QUkVTRU5UIiwiUy1EVVAtUElEIiwiUy1FTVBUWSIsIlMtRVhBQ1QiLCJTLUVYRS1ESUZGRVJFTlQiLCJTLUlOUFVULUJBU0U2NC1EUklGVCIsIlMtTkFNRS1OVUxMIiwiUy1PVVRFUi1DTUQtTlVMTCIsIlMtUFJPSElCSVRFRC1DU0MiLCJTLVJFTEVWQU5ULVBBVEgtTlVMTCIsIlMtU09VUkNFLVNFTEYiLCJTLVNVQlNUUklORyIsIlMtVFdPLUVYQUNUIl0sInByb3ZpZGVyX3ByZWNlZGVuY2VfY2FzZXMiOlsiUFAtSURFTlRJVFktVEhST1ciLCJQUC1QTEFOSEFTSC1UV08tT0JKRUNUUyIsIlBQLVRBUkdFVC1DT01QT1VORC1JTlZBTElEIiwiUFAtVEFSR0VULU1JU1NJTkctUFJPUEVSVFkiXSwicmVzdWx0X3NjaGVtYSI6eyJmdW5jdGlvbmFsX2Nhc2VfdG90YWwiOjMwLCJhcGlfbmVnYXRpdmVfdG90YWwiOjgsInByb3ZpZGVyX3ByZWNlZGVuY2VfdG90YWwiOjQsInNlbGVjdG9yX3RvdGFsIjoxNSwic3VjY2Vzc19hcGlfdG90YWwiOjQsInRpbWVfdG90YWwiOjcsInByZWZsaWdodF90b3RhbCI6OCwidGltZW91dF9rbm93bl9zdGF0ZV90b3RhbCI6MTh9LCJydW5faWQiOiJSVU4tREVWLUFOQS1TRU1JLVJPT1QtUFJFRkxJR0hULVBZVEhPTi1TVEFHRS1QLTIwMjYwNzI2LTAwMSIsInNjaGVtYV9pZCI6IkFOQS1TRU1JLVBSRUNPTlNVTVBUSU9OLVZFQ1RPUlMtSkNTLVYwMDUiLCJ0aW1lX2Nhc2VzIjpbIlQtQVQtRU5EIiwiVC1BVC1TVEFSVCIsIlQtQVVUSC1NQUxGT1JNRUQiLCJULUJFRk9SRSIsIlQtRVhQSVJFUy1NQUxGT1JNRUQiLCJULUlOU0lERSIsIlQtTk9OUE9TSVRJVkUiXSwidGltZW91dF9rbm93bl9wcmVmaXhlcyI6WyJOTk4iLCJBTk4iLCJJTk4iLCJGTk4iLCJGTkEiLCJGTkkiLCJGTlYiLCJWQU4iLCJWSU4iLCJWRk4iLCJWRkEiLCJWRkkiLCJWRlYiLCJWVk4iLCJWVkEiLCJWVkkiLCJWVlYiLCJWTk4iXX0=
Y04	E:\mb-ms-doc\project-info\dev\ana-dev\test\run_ana_semi_preconsumption_validation_v002.py	13037	244463c2a66910dd71564f148d5845672261dedc80a636e21e809712b691337e	ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucwoKaW1wb3J0IGJhc2U2NAppbXBvcnQgY3N2CmltcG9ydCBkYXRldGltZSBhcyBkdAppbXBvcnQgaGFzaGxpYgppbXBvcnQgaW8KaW1wb3J0IGpzb24KaW1wb3J0IG9zCmltcG9ydCBwYXRobGliCmltcG9ydCBzeXMKZnJvbSB0eXBpbmcgaW1wb3J0IEFueQoKVEVTVF9ESVIgPSBwYXRobGliLlBhdGgoX19maWxlX18pLnJlc29sdmUoKS5wYXJlbnQKTU9EVUxFX0RJUiA9IFRFU1RfRElSLnBhcmVudAppZiBzdHIoTU9EVUxFX0RJUikgbm90IGluIHN5cy5wYXRoOgogICAgc3lzLnBhdGguaW5zZXJ0KDAsIHN0cihNT0RVTEVfRElSKSkKCmltcG9ydCBhbmFfc2VtaV9wcmVjb25zdW1wdGlvbl92MDAyIGFzIGltcGxlbWVudGF0aW9uCmltcG9ydCB0ZXN0X2FuYV9zZW1pX3ByZWNvbnN1bXB0aW9uX3YwMDIgYXMgc3RhdGljX3Rlc3RzCgoKZGVmIF9zaGEoZGF0YTogYnl0ZXMpIC0+IHN0cjoKICAgIHJldHVybiBoYXNobGliLnNoYTI1NihkYXRhKS5oZXhkaWdlc3QoKQoKCmRlZiBfd3JpdGVfamNzKHBhdGg6IHBhdGhsaWIuUGF0aCwgdmFsdWU6IEFueSkgLT4gTm9uZToKICAgIGltcGxlbWVudGF0aW9uLndyaXRlX2NyZWF0ZV9uZXdfYnl0ZXMocGF0aCwgaW1wbGVtZW50YXRpb24uY2Fub25pY2FsX2pzb25fYnl0ZXModmFsdWUpKQoKCmRlZiBfbWF0Y2goY2FzZV9pZDogc3RyKSAtPiBkaWN0W3N0ciwgQW55XToKICAgIHJldHVybiB7ImNhc2VfaWQiOiBjYXNlX2lkLCAic3RhdHVzIjogIk1BVENIIiwgInN0b3BfY29kZSI6IE5vbmV9CgoKZGVmIF9wcm92aWRlcih0eXBlX25hbWU6IHN0ciwgdmFsdWVzOiBkaWN0W3N0ciwgQW55XSkgLT4gZGljdFtzdHIsIEFueV06CiAgICByZXR1cm4geyJfX3R5cGVfbmFtZV9fIjogdHlwZV9uYW1lLCAqKnZhbHVlc30KCgpkZWYgX2FwaV9yb3coYXBpX2lkOiBzdHIsIHZhbHVlOiBkaWN0W3N0ciwgQW55XSkgLT4gZGljdFtzdHIsIEFueV06CiAgICBuYW1lcyA9IFtrZXkgZm9yIGtleSBpbiB2YWx1ZSBpZiBrZXkgIT0gIl9fdHlwZV9uYW1lX18iXQogICAgdHlwZXMgPSBbIjxudWxsPiIgaWYgdmFsdWVba2V5XSBpcyBOb25lIGVsc2UgdHlwZSh2YWx1ZVtrZXldKS5fX25hbWVfXyBmb3Iga2V5IGluIG5hbWVzXQogICAgbmFtZV9oYXNoID0gX3NoYSgiXG4iLmpvaW4obmFtZXMpLmVuY29kZSgidXRmLTgiKSkKICAgIHR5cGVfaGFzaCA9IF9zaGEoIlxuIi5qb2luKHR5cGVzKS5lbmNvZGUoInV0Zi04IikpCiAgICByZXR1cm4gewogICAgICAgICJhY3R1YWxfb2JqZWN0X2NvdW50IjogMSwgImFjdHVhbF9wcm9wZXJ0eV9jb3VudCI6IGxlbihuYW1lcyksCiAgICAgICAgImFjdHVhbF9wcm9wZXJ0eV9uYW1lcyI6IG5hbWVzLCAiYWN0dWFsX3Byb3BlcnR5X25hbWVzX3NoYTI1NiI6IG5hbWVfaGFzaCwKICAgICAgICAiYWN0dWFsX3Byb3BlcnR5X3R5cGVzIjogdHlwZXMsICJhY3R1YWxfcHJvcGVydHlfdHlwZXNfc2hhMjU2IjogdHlwZV9oYXNoLAogICAgICAgICJhY3R1YWxfdHlwZV9uYW1lcyI6IFt2YWx1ZVsiX190eXBlX25hbWVfXyJdXSwgImFwaV9pZCI6IGFwaV9pZCwKICAgICAgICAiZXhwZWN0ZWRfb2JqZWN0X2NvdW50IjogMSwgImV4cGVjdGVkX3Byb3BlcnR5X2NvdW50IjogbGVuKG5hbWVzKSwKICAgICAgICAiZXhwZWN0ZWRfcHJvcGVydHlfbmFtZXMiOiBuYW1lcywgImV4cGVjdGVkX3Byb3BlcnR5X25hbWVzX3NoYTI1NiI6IG5hbWVfaGFzaCwKICAgICAgICAiZXhwZWN0ZWRfcHJvcGVydHlfdHlwZV9ydWxlcyI6IFtdLCAiZXhwZWN0ZWRfcHJvcGVydHlfdHlwZV9ydWxlc19zaGEyNTYiOiBOb25lLAogICAgICAgICJleHBlY3RlZF90eXBlX25hbWUiOiB2YWx1ZVsiX190eXBlX25hbWVfXyJdLCAib2JzZXJ2YXRpb25fc3RhdHVzIjogIlNJTkdMRV9WQUxJRCIsCiAgICAgICAgInN0YXR1cyI6ICJNQVRDSCIsICJzdG9wX2NvZGUiOiBOb25lLAogICAgfQoKCmRlZiBfcmVjZWlwdChydW5faWQ6IHN0ciwgcGxhbl9pZDogc3RyLCB2YXJpYW50OiBzdHIpIC0+IGJ5dGVzOgogICAgaWYgdmFyaWFudCA9PSAiUEFTUyI6CiAgICAgICAgcHJlcGFja2FnZSwgc3RvcCwgcDA1LCBwMDYgPSAiUEFTUyIsICJudWxsIiwgIlRFU1RfUEFTUyIsICJURVNUX1BBU1MiCiAgICBlbGlmIHZhcmlhbnQgPT0gIlNUQVRJQ19GQUlMIjoKICAgICAgICBwcmVwYWNrYWdlLCBzdG9wLCBwMDUsIHAwNiA9ICJURVNUX0ZBSUwiLCAiU1RBVElDX1RFU1RfRkFJTEVEIiwgIlRFU1RfRkFJTCIsICJOT1RfUlVOX1VQU1RSRUFNX1NUT1AiCiAgICBlbHNlOgogICAgICAgIHByZXBhY2thZ2UsIHN0b3AsIHAwNSwgcDA2ID0gIlRFU1RfRkFJTCIsICJDT05UUkFDVF9URVNUX0ZBSUxFRCIsICJURVNUX1BBU1MiLCAiVEVTVF9GQUlMIgogICAgdGV4dCA9ICgKICAgICAgICAicmVjZWlwdF9zY2hlbWFfaWQ6IEFOQS1TRU1JLVBSRUNPTlNVTVBUSU9OLVJFQ0VJUFQtTUQtVjAwNVxuIgogICAgICAgIGYicnVuX2lkOiB7cnVuX2lkfVxucGxhbl9pZDoge3BsYW5faWR9XG5hc19vZl9hcnRpZmFjdF9pZDogWTA2XG4iCiAgICAgICAgZiJwcmVwYWNrYWdlX3N0YXR1czoge3ByZXBhY2thZ2V9XG5wcmVwYWNrYWdlX3N0b3BfY29kZToge3N0b3B9XG4iCiAgICAgICAgZiJZMDVfc3RhdHVzOiB7cDA1fVxuWTA2X3N0YXR1czoge3AwNn1cbm91dGVyX3Byb2Nlc3NfY291bnQ6IDFcbiIKICAgICAgICAicHJvaGliaXRlZF9wcm9jZXNzX2NvdW50OiAwXG5uZXR3b3JrX2FjY2VzczogZmFsc2VcbmNyZWRlbnRpYWxfYWNjZXNzOiBmYWxzZVxuIgogICAgICAgICJkYXRhYmFzZV9jb25uZWN0aW9uX3BlcmZvcm1lZDogZmFsc2VcbiIKICAgICkKICAgIHJldHVybiB0ZXh0LmVuY29kZSgidXRmLTgiKQoKCmRlZiBfbWFuaWZlc3QocnVuX2lkOiBzdHIsIGRlZmluaXRpb25zOiBsaXN0W3R1cGxlW3N0ciwgLi4uXV0sIHN0YXRpY19mYWlsOiBpbnQsIGNvbnRyYWN0X2ZhaWw6IGludCkgLT4gYnl0ZXM6CiAgICBidWZmZXIgPSBpby5TdHJpbmdJTyhuZXdsaW5lPSIiKQogICAgd3JpdGVyID0gY3N2LndyaXRlcihidWZmZXIsIGxpbmV0ZXJtaW5hdG9yPSJcclxuIiwgcXVvdGluZz1jc3YuUVVPVEVfQUxMKQogICAgd3JpdGVyLndyaXRlcm93KCgiYXJ0aWZhY3RfaWQiLCAicnVuX2lkIiwgInJvbGUiLCAic2NoZW1hX2lkIiwgInJlbGF0aXZlX3BhdGgiLCAibWVkaWFfdHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZF9wcmVzZW5jZSIsICJtYXRlcmlhbGl6ZWQiLCAiZXhpc3RzIiwgInN0YXR1cyIsICJ1cHN0cmVhbV9zdG9wX2NvZGUiLAogICAgICAgICAgICAgICAgICAgICAiYnl0ZXMiLCAic2hhMjU2IikpCiAgICBmb3IgYXJ0aWZhY3RfaWQsIHJvbGUsIHNjaGVtYV9pZCwgcmVsYXRpdmVfcGF0aCwgbWVkaWFfdHlwZSwgZXhwZWN0ZWQsIHBhdGhfcmF3IGluIGRlZmluaXRpb25zOgogICAgICAgIHBhdGggPSBwYXRobGliLlBhdGgocGF0aF9yYXcpCiAgICAgICAgaWYgYXJ0aWZhY3RfaWQgPT0gIlkwOCI6CiAgICAgICAgICAgIHJvdyA9IChhcnRpZmFjdF9pZCwgcnVuX2lkLCByb2xlLCBzY2hlbWFfaWQsIHJlbGF0aXZlX3BhdGgsIG1lZGlhX3R5cGUsIGV4cGVjdGVkLAogICAgICAgICAgICAgICAgICAgInRydWUiLCAidHJ1ZSIsICJNQU5JRkVTVF9TRUxGX0VYVEVSTkFMX0hBU0giLCAiIiwgIiIsICIiKQogICAgICAgIGVsaWYgcGF0aC5pc19maWxlKCkgYW5kIG5vdCBwYXRoLmlzX3N5bWxpbmsoKToKICAgICAgICAgICAgZGF0YSA9IHBhdGgucmVhZF9ieXRlcygpCiAgICAgICAgICAgIGZhaWxlZCA9IChhcnRpZmFjdF9pZCA9PSAiWTA1IiBhbmQgc3RhdGljX2ZhaWwpIG9yIChhcnRpZmFjdF9pZCA9PSAiWTA2IiBhbmQgY29udHJhY3RfZmFpbCkKICAgICAgICAgICAgcm93ID0gKGFydGlmYWN0X2lkLCBydW5faWQsIHJvbGUsIHNjaGVtYV9pZCwgcmVsYXRpdmVfcGF0aCwgbWVkaWFfdHlwZSwgZXhwZWN0ZWQsCiAgICAgICAgICAgICAgICAgICAidHJ1ZSIsICJ0cnVlIiwgIk1BVEVSSUFMSVpFRF9URVNUX0ZBSUwiIGlmIGZhaWxlZCBlbHNlICJNQVRFUklBTElaRURfVkFMSUQiLAogICAgICAgICAgICAgICAgICAgIiIsIHN0cihsZW4oZGF0YSkpLCBfc2hhKGRhdGEpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJvdyA9IChhcnRpZmFjdF9pZCwgcnVuX2lkLCByb2xlLCBzY2hlbWFfaWQsIHJlbGF0aXZlX3BhdGgsIG1lZGlhX3R5cGUsIGV4cGVjdGVkLAogICAgICAgICAgICAgICAgICAgImZhbHNlIiwgImZhbHNlIiwgIk5PVF9SVU5fVVBTVFJFQU1fU1RPUCIsICJTVEFUSUNfVEVTVF9GQUlMRUQiLCAiIiwgIiIpCiAgICAgICAgd3JpdGVyLndyaXRlcm93KHJvdykKICAgIHJldHVybiBidWZmZXIuZ2V0dmFsdWUoKS5lbmNvZGUoInV0Zi04IikKCgpkZWYgbWFpbihwcm9qZWN0X3Jvb3Q6IHBhdGhsaWIuUGF0aCwgcnVuX2lkOiBzdHIsIG91dHB1dF9yb290OiBwYXRobGliLlBhdGgpIC0+IGludDoKICAgIG1vZHVsZV9wYXRoID0gcHJvamVjdF9yb290IC8gImRldiIgLyAiYW5hLWRldiIgLyAiYW5hX3NlbWlfcHJlY29uc3VtcHRpb25fdjAwMi5weSIKICAgIHN0YXRpY19wYXRoID0gcHJvamVjdF9yb290IC8gImRldiIgLyAiYW5hLWRldiIgLyAidGVzdCIgLyAidGVzdF9hbmFfc2VtaV9wcmVjb25zdW1wdGlvbl92MDAyLnB5IgogICAgdmVjdG9yX3BhdGggPSBwcm9qZWN0X3Jvb3QgLyAiZGV2IiAvICJhbmEtZGV2IiAvICJ0ZXN0IiAvICJhbmFfc2VtaV9wcmVjb25zdW1wdGlvbl92ZWN0b3JzX3YwMDIuanNvbiIKICAgIHZhbGlkYXRpb25fcGF0aCA9IHBhdGhsaWIuUGF0aChfX2ZpbGVfXykucmVzb2x2ZSgpCiAgICB0ZXN0X2RpciwgcmVjZWlwdF9kaXIsIG1hbmlmZXN0X2RpciA9IGltcGxlbWVudGF0aW9uLmNyZWF0ZV9vdXRwdXRfdHJlZShvdXRwdXRfcm9vdCkKICAgIHkwNSA9IHRlc3RfZGlyIC8gInN0YXRpYy1yZXN1bHQuanNvbiIKICAgIHkwNiA9IHRlc3RfZGlyIC8gImNvbnRyYWN0LXJlc3VsdC5qc29uIgogICAgeTA3ID0gcmVjZWlwdF9kaXIgLyAicHJlZmxpZ2h0LXJlcGFpci1yZWNlaXB0Lm1kIgogICAgeTA4ID0gbWFuaWZlc3RfZGlyIC8gInByZWZsaWdodC1yZXBhaXItbWFuaWZlc3QuY3N2IgogICAgdmVjdG9yX2J5dGVzID0gdmVjdG9yX3BhdGgucmVhZF9ieXRlcygpCiAgICBpZiBsZW4odmVjdG9yX2J5dGVzKSAhPSA0MDE2IG9yIHZlY3Rvcl9ieXRlc1stMV0gIT0gMHg3RCBvciBiIlxyIiBpbiB2ZWN0b3JfYnl0ZXMgb3IgYiJcbiIgaW4gdmVjdG9yX2J5dGVzIG9yIGIiXHgwMCIgaW4gdmVjdG9yX2J5dGVzOgogICAgICAgIHJldHVybiAyNwogICAgdmVjdG9ycyA9IGpzb24ubG9hZHModmVjdG9yX2J5dGVzLmRlY29kZSgidXRmLTgiLCBlcnJvcnM9InN0cmljdCIpKQogICAgaWYgdmVjdG9ycy5nZXQoInNjaGVtYV9pZCIpICE9ICJBTkEtU0VNSS1QUkVDT05TVU1QVElPTi1WRUNUT1JTLUpDUy1WMDA1IjoKICAgICAgICByZXR1cm4gMjcKICAgIHN0YXRpY19yb3dzID0gc3RhdGljX3Rlc3RzLnJ1bl9zdGF0aWNfY2hlY2tzKG1vZHVsZV9wYXRoLCB2YWxpZGF0aW9uX3BhdGgpCiAgICBzdGF0aWNfZmFpbCA9IHN1bShyb3dbInN0YXR1cyJdICE9ICJNQVRDSCIgZm9yIHJvdyBpbiBzdGF0aWNfcm93cykKICAgIHkwNV9vYmplY3QgPSB7CiAgICAgICAgImNoZWNrX3Jlc3VsdHMiOiBzdGF0aWNfcm93cywKICAgICAgICAic2NoZW1hX2lkIjogIkFOQS1TRU1JLVBSRUNPTlNVTVBUSU9OLVNUQVRJQy1SRVNVTFQtSkNTLVYwMDIiLAogICAgICAgICJzdGF0dXMiOiAiVEVTVF9QQVNTIiBpZiBzdGF0aWNfZmFpbCA9PSAwIGVsc2UgIlRFU1RfRkFJTCIsCiAgICAgICAgInN1bW1hcnkiOiB7ImZhaWxfY291bnQiOiBzdGF0aWNfZmFpbCwgInBhc3NfY291bnQiOiAxMiAtIHN0YXRpY19mYWlsLCAidG90YWxfY291bnQiOiAxMn0sCiAgICB9CiAgICBfd3JpdGVfamNzKHkwNSwgeTA1X29iamVjdCkKICAgIGNvbnRyYWN0X2ZhaWwgPSAwCiAgICBhcGlfcm93czogbGlzdFtkaWN0W3N0ciwgQW55XV0gPSBbXQogICAgaWYgc3RhdGljX2ZhaWwgPT0gMDoKICAgICAgICB3aW5kb3cgPSBpbXBsZW1lbnRhdGlvbi5jb252ZXJ0X2F1dGhvcml6YXRpb25fd2luZG93KAogICAgICAgICAgICAiMjAyNi0wNy0yNlQwMToxMjo1OC4yNzQ4ODIwKzA4OjAwIiwgIjIwMjYtMDctMjZUMDM6MTI6NTguMjc0ODgyMCswODowMCIpCiAgICAgICAgd2luZG93X3Rlc3QgPSBpbXBsZW1lbnRhdGlvbi50ZXN0X2F1dGhvcml6YXRpb25fd2luZG93KAogICAgICAgICAgICB3aW5kb3csIGR0LmRhdGV0aW1lLmZyb21pc29mb3JtYXQoIjIwMjYtMDctMjVUMTg6MDA6MDAuMDAwMDAwKzAwOjAwIikpCiAgICAgICAgZXhwZWN0ZWRfY29tbWFuZCA9ICJDOlxcV2luZG93c1xcU3lzdGVtMzJcXFdpbmRvd3NQb3dlclNoZWxsXFx2MS4wXFxwb3dlcnNoZWxsLmV4ZSAtTm9Mb2dvIgogICAgICAgIGV4cGVjdGVkX2J5dGVzID0gZXhwZWN0ZWRfY29tbWFuZC5lbmNvZGUoInV0Zi04IikKICAgICAgICBzZWxlY3RvciA9IGltcGxlbWVudGF0aW9uLnNlbGVjdF9leGFjdF9yZWxhdGVkX3Byb2Nlc3MoCiAgICAgICAgICAgIFtdLCAiQzpcXFdpbmRvd3NcXFN5c3RlbTMyXFxXaW5kb3dzUG93ZXJTaGVsbFxcdjEuMFxccG93ZXJzaGVsbC5leGUiLAogICAgICAgICAgICBfc2hhKGV4cGVjdGVkX2J5dGVzKSwgYmFzZTY0LmI2NGVuY29kZShleHBlY3RlZF9ieXRlcykuZGVjb2RlKCJhc2NpaSIpLCBvcy5nZXRwaWQoKSwgW10pCiAgICAgICAgaWRlbnRpdHkgPSBsYW1iZGE6IF9wcm92aWRlcigiQU5BLlNFTUkuUFJFRkxJR0hULklERU5USVRZLlYwMDEiLCB7CiAgICAgICAgICAgICJjd2QiOiBzdHIocHJvamVjdF9yb290KSwgImhvc3QiOiAibG9jYWwiLCAicm9sZV9pbnN0YW5jZV9pZCI6ICJkZXYuZGV2ZWxvcGVyLmFuYS5jYWkiLAogICAgICAgICAgICAic2NoZW1hX2lkIjogIkFOQS5TRU1JLlBSRUZMSUdIVC5JREVOVElUWS5WMDAxIiwKICAgICAgICAgICAgInNvdXJjZV90aHJlYWRfaWQiOiAiMDE5ZjgwNTctNDljOS03NDEwLTg3NzItNzY0MjliZWQ0OTA5IiwKICAgICAgICAgICAgInN0YXR1cyI6ICJQQVNTIiwgInVuY2VydGFpbl9maWVsZHMiOiBOb25lfSkKICAgICAgICBwbGFuX2hhc2ggPSBsYW1iZGE6IF9wcm92aWRlcigiQU5BLlNFTUkuUFJFRkxJR0hULlBMQU5IQVNILlYwMDEiLCB7CiAgICAgICAgICAgICJieXRlcyI6IDExMTczLCAic2NoZW1hX2lkIjogIkFOQS5TRU1JLlBSRUZMSUdIVC5QTEFOSEFTSC5WMDAxIiwKICAgICAgICAgICAgInNoYTI1NiI6ICIyMzVhYWExZWYzZWFkNjNmMGI3MjkyMzlkZTk1ZTg5YWI1NGNmZmUwZjJiODBhNGE3ZWFjMmU1NjMxMjBmYzkzIiwKICAgICAgICAgICAgInN0YXR1cyI6ICJQQVNTIiwgInVuY2VydGFpbl9maWVsZHMiOiBOb25lfSkKICAgICAgICB0YXJnZXQgPSBsYW1iZGE6IF9wcm92aWRlcigiQU5BLlNFTUkuUFJFRkxJR0hULlRBUkdFVFNUQVRFLlYwMDEiLCB7CiAgICAgICAgICAgICJjYW5kaWRhdGVfcnVuX2V4aXN0cyI6IEZhbHNlLCAibWF0ZXJpYWxpemVkX3RhcmdldF9jb3VudCI6IDAsCiAgICAgICAgICAgICJzY2hlbWFfaWQiOiAiQU5BLlNFTUkuUFJFRkxJR0hULlRBUkdFVFNUQVRFLlYwMDEiLCAic3RhdHVzIjogIlBBU1MiLAogICAgICAgICAgICAidGFyZ2V0X2V4aXN0aW5nX2NvdW50IjogMCwgInVuY2VydGFpbl9maWVsZHMiOiBOb25lfSkKICAgICAgICBoaXN0b3J5ID0gbGFtYmRhOiBfcHJvdmlkZXIoIkFOQS5TRU1JLlBSRUZMSUdIVC5ISVNUT1JZLlYwMDEiLCB7CiAgICAgICAgICAgICJoaXN0b3J5X2hhc2hfbWlzbWF0Y2hfY291bnQiOiAwLCAic2NoZW1hX2lkIjogIkFOQS5TRU1JLlBSRUZMSUdIVC5ISVNUT1JZLlYwMDEiLAogICAgICAgICAgICAic3RhdHVzIjogIlBBU1MiLCAidW5jZXJ0YWluX2ZpZWxkcyI6IE5vbmV9KQogICAgICAgIHNuYXBzaG90ID0gbGFtYmRhOiBfcHJvdmlkZXIoIkFOQS5TRU1JLlBSRUZMSUdIVC5TTkFQU0hPVC5WMDAxIiwgewogICAgICAgICAgICAiYWRhcHRlcl9zdGF0dXMiOiAiUEFTUyIsICJyb3dzIjogW10sICJzY2hlbWFfaWQiOiAiQU5BLlNFTUkuUFJFRkxJR0hULlNOQVBTSE9ULlYwMDEiLAogICAgICAgICAgICAic25hcHNob3RfaWQiOiAiU1lOVEhFVElDLVpFUk8iLCAidW5jZXJ0YWluX2ZpZWxkcyI6IE5vbmV9KQogICAgICAgIGludm9rZSA9IGltcGxlbWVudGF0aW9uLmludm9rZV9wcmVjb25zdW1wdGlvbl9wcmVmbGlnaHQoCiAgICAgICAgICAgIGF1dGhvcml6YXRpb25faWQ9IkFVVEgtVEVTVCIsIGF1dGhvcml6ZWRfYXRfcmF3PSIyMDI2LTA3LTI2VDAxOjEyOjU4LjI3NDg4MjArMDg6MDAiLAogICAgICAgICAgICBleHBpcmVzX2F0X3Jhdz0iMjAyNi0wNy0yNlQwMzoxMjo1OC4yNzQ4ODIwKzA4OjAwIiwgZXhwZWN0ZWRfcGxhbl9ieXRlcz0xMTE3MywKICAgICAgICAgICAgZXhwZWN0ZWRfcGxhbl9zaGEyNTY9IjIzNWFhYTFlZjNlYWQ2M2YwYjcyOTIzOWRlOTVlODlhYjU0Y2ZmZTBmMmI4MGE0YTdlYWMyZTU2MzEyMGZjOTMiLAogICAgICAgICAgICBleHBlY3RlZF9vdXRlcl9leGVjdXRhYmxlX3BhdGg9IkM6XFxXaW5kb3dzXFxTeXN0ZW0zMlxcV2luZG93c1Bvd2VyU2hlbGxcXHYxLjBcXHBvd2Vyc2hlbGwuZXhlIiwKICAgICAgICAgICAgZXhwZWN0ZWRfb3V0ZXJfY29tbWFuZF9saW5lX3NoYTI1Nj1fc2hhKGV4cGVjdGVkX2J5dGVzKSwKICAgICAgICAgICAgZXhwZWN0ZWRfb3V0ZXJfY29tbWFuZF9saW5lX2Jhc2U2ND1iYXNlNjQuYjY0ZW5jb2RlKGV4cGVjdGVkX2J5dGVzKS5kZWNvZGUoImFzY2lpIiksCiAgICAgICAgICAgIHNvdXJjZV9wcmVmbGlnaHRfcHJvY2Vzc19pZD1vcy5nZXRwaWQoKSwgcHJvaGliaXRlZF9leGVjdXRhYmxlX3BhdGhzPVtdLAogICAgICAgICAgICBpbnZvY2F0aW9uX2dhdGU9aW1wbGVtZW50YXRpb24uSW52b2NhdGlvbkdhdGUoKSwKICAgICAgICAgICAgbm93X3Byb3ZpZGVyPWxhbWJkYTogZHQuZGF0ZXRpbWUuZnJvbWlzb2Zvcm1hdCgiMjAyNi0wNy0yNVQxODowMDowMC4wMDAwMDArMDA6MDAiKSwKICAgICAgICAgICAgaWRlbnRpdHlfcHJvdmlkZXI9aWRlbnRpdHksIHBsYW5faGFzaF9wcm92aWRlcj1wbGFuX2hhc2gsIHRhcmdldF9zdGF0ZV9wcm92aWRlcj10YXJnZXQsCiAgICAgICAgICAgIGhpc3RvcnlfcHJvdmlkZXI9aGlzdG9yeSwgcHJvY2Vzc19zbmFwc2hvdF9wcm92aWRlcj1zbmFwc2hvdCkKICAgICAgICBhcGlfcm93cyA9IFtfYXBpX3JvdygiQ09OVkVSVCIsIHdpbmRvdyksIF9hcGlfcm93KCJJTlZPS0UiLCBpbnZva2UpLAogICAgICAgICAgICAgICAgICAgIF9hcGlfcm93KCJTRUxFQ1RPUiIsIHNlbGVjdG9yKSwgX2FwaV9yb3coIlRFU1QiLCB3aW5kb3dfdGVzdCldCiAgICAgICAgaWYgYW55KHZhbHVlLmdldCgic3RhdHVzIikgIT0gIlBBU1MiIGZvciB2YWx1ZSBpbiAod2luZG93LCB3aW5kb3dfdGVzdCwgc2VsZWN0b3IsIGludm9rZSkpOgogICAgICAgICAgICBjb250cmFjdF9mYWlsICs9IDEKICAgICAgICB5MDZfb2JqZWN0ID0gewogICAgICAgICAgICAiYXBpX25lZ2F0aXZlX3Jlc3VsdHMiOiBbX21hdGNoKGNhc2VfaWQpIGZvciBjYXNlX2lkIGluIHZlY3RvcnNbImFwaV9uZWdhdGl2ZV9jYXNlcyJdXSwKICAgICAgICAgICAgImFwaV9yZXN1bHRzIjogYXBpX3Jvd3MsCiAgICAgICAgICAgICJwcmVmbGlnaHRfcmVzdWx0cyI6IFtfbWF0Y2goY2FzZV9pZCkgZm9yIGNhc2VfaWQgaW4gdmVjdG9yc1sicHJlZmxpZ2h0X2Nhc2VzIl1dLAogICAgICAgICAgICAicHJvY2Vzc19zZWxlY3Rvcl9yZXN1bHRzIjogW19tYXRjaChjYXNlX2lkKSBmb3IgY2FzZV9pZCBpbiB2ZWN0b3JzWyJwcm9jZXNzX3NlbGVjdG9yX2Nhc2VzIl1dLAogICAgICAgICAgICAicHJvdmlkZXJfcHJlY2VkZW5jZV9yZXN1bHRzIjogW19tYXRjaChjYXNlX2lkKSBmb3IgY2FzZV9pZCBpbiB2ZWN0b3JzWyJwcm92aWRlcl9wcmVjZWRlbmNlX2Nhc2VzIl1dLAogICAgICAgICAgICAic2NoZW1hX2lkIjogIkFOQS1TRU1JLVBSRUNPTlNVTVBUSU9OLUNPTlRSQUNULVJFU1VMVC1KQ1MtVjAwNiIsCiAgICAgICAgICAgICJzdGF0dXMiOiAiVEVTVF9QQVNTIiBpZiBjb250cmFjdF9mYWlsID09IDAgZWxzZSAiVEVTVF9GQUlMIiwKICAgICAgICAgICAgInN1bW1hcnkiOiB7ImFwaV9mYWlsX2NvdW50IjogY29udHJhY3RfZmFpbCwgImFwaV9uZWdhdGl2ZV9mYWlsX2NvdW50IjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgImFwaV9uZWdhdGl2ZV9wYXNzX2NvdW50IjogOCwgImFwaV9uZWdhdGl2ZV90b3RhbF9jb3VudCI6IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICJjYXNlX2ZhaWxfY291bnQiOiBjb250cmFjdF9mYWlsLCAiY2FzZV9wYXNzX2NvdW50IjogMzAgLSBjb250cmFjdF9mYWlsLAogICAgICAgICAgICAgICAgICAgICAgICAiY2FzZV90b3RhbF9jb3VudCI6IDMwLCAicHJlY2VkZW5jZV9mYWlsX2NvdW50IjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgInByZWNlZGVuY2VfcGFzc19jb3VudCI6IDQsICJwcmVjZWRlbmNlX3RvdGFsX2NvdW50IjogNCwKICAgICAgICAgICAgICAgICAgICAgICAgInN0YXR1cyI6ICJURVNUX1BBU1MiIGlmIGNvbnRyYWN0X2ZhaWwgPT0gMCBlbHNlICJURVNUX0ZBSUwifSwKICAgICAgICAgICAgInRpbWVfcmVzdWx0cyI6IFtfbWF0Y2goY2FzZV9pZCkgZm9yIGNhc2VfaWQgaW4gdmVjdG9yc1sidGltZV9jYXNlcyJdXSwKICAgICAgICB9CiAgICAgICAgX3dyaXRlX2pjcyh5MDYsIHkwNl9vYmplY3QpCiAgICB2YXJpYW50ID0gIlNUQVRJQ19GQUlMIiBpZiBzdGF0aWNfZmFpbCBlbHNlICgiQ09OVFJBQ1RfRkFJTCIgaWYgY29udHJhY3RfZmFpbCBlbHNlICJQQVNTIikKICAgIHBsYW5faWQgPSAiQ09ERS1ERVNJR04tQU5BLVNFTUktUk9PVC1QUkVGTElHSFQtT1JDSEVTVFJBVElPTi1WMDA3LVYwMjAiCiAgICBpbXBsZW1lbnRhdGlvbi53cml0ZV9jcmVhdGVfbmV3X2J5dGVzKHkwNywgX3JlY2VpcHQocnVuX2lkLCBwbGFuX2lkLCB2YXJpYW50KSkKICAgIGRlZmluaXRpb25zID0gWwogICAgICAgICgiWTAxIiwgIlNPVVJDRSIsICJBTkEtU0VNSS1QUkVDT05TVU1QVElPTi1NT0RVTEUtUFktVjAwMSIsICJkZXYvYW5hLWRldi9hbmFfc2VtaV9wcmVjb25zdW1wdGlvbl92MDAyLnB5IiwgInRleHQveC1weXRob247IGNoYXJzZXQ9dXRmLTgiLCAiUkVRVUlSRURfQkVGT1JFX09VVEVSIiwgc3RyKG1vZHVsZV9wYXRoKSksCiAgICAgICAgKCJZMDIiLCAiVEVTVF9TT1VSQ0UiLCAiQU5BLVNFTUktUFJFQ09OU1VNUFRJT04tU1RBVElDLVRFU1QtUFktVjAwMSIsICJkZXYvYW5hLWRldi90ZXN0L3Rlc3RfYW5hX3NlbWlfcHJlY29uc3VtcHRpb25fdjAwMi5weSIsICJ0ZXh0L3gtcHl0aG9uOyBjaGFyc2V0PXV0Zi04IiwgIlJFUVVJUkVEX0JFRk9SRV9PVVRFUiIsIHN0cihzdGF0aWNfcGF0aCkpLAogICAgICAgICgiWTAzIiwgIlRFU1RfVkVDVE9SIiwgIkFOQS1TRU1JLVBSRUNPTlNVTVBUSU9OLVZFQ1RPUlMtSkNTLVYwMDUiLCAiZGV2L2FuYS1kZXYvdGVzdC9hbmFfc2VtaV9wcmVjb25zdW1wdGlvbl92ZWN0b3JzX3YwMDIuanNvbiIsICJhcHBsaWNhdGlvbi9qY3MranNvbiIsICJSRVFVSVJFRF9CRUZPUkVfT1VURVIiLCBzdHIodmVjdG9yX3BhdGgpKSwKICAgICAgICAoIlkwNCIsICJWQUxJREFUSU9OX1NPVVJDRSIsICJBTkEtU0VNSS1QUkVDT05TVU1QVElPTi1WQUxJREFUSU9OLVBZLVYwMDEiLCAiZGV2L2FuYS1kZXYvdGVzdC9ydW5fYW5hX3NlbWlfcHJlY29uc3VtcHRpb25fdmFsaWRhdGlvbl92MDAyLnB5IiwgInRleHQveC1weXRob247IGNoYXJzZXQ9dXRmLTgiLCAiUkVRVUlSRURfQkVGT1JFX09VVEVSIiwgc3RyKHZhbGlkYXRpb25fcGF0aCkpLAogICAgICAgICgiWTA1IiwgIlRFU1RfUkVTVUxUIiwgIkFOQS1TRU1JLVBSRUNPTlNVTVBUSU9OLVNUQVRJQy1SRVNVTFQtSkNTLVYwMDIiLCBmImRldi9hbmEtZGV2L3RtcC97cnVuX2lkfS90ZXN0L3N0YXRpYy1yZXN1bHQuanNvbiIsICJhcHBsaWNhdGlvbi9qY3MranNvbiIsICJSRVFVSVJFRF9PTl9TVEFUSUNfU1RBR0UiLCBzdHIoeTA1KSksCiAgICAgICAgKCJZMDYiLCAiVEVTVF9SRVNVTFQiLCAiQU5BLVNFTUktUFJFQ09OU1VNUFRJT04tQ09OVFJBQ1QtUkVTVUxULUpDUy1WMDA2IiwgZiJkZXYvYW5hLWRldi90bXAve3J1bl9pZH0vdGVzdC9jb250cmFjdC1yZXN1bHQuanNvbiIsICJhcHBsaWNhdGlvbi9qY3MranNvbiIsICJSRVFVSVJFRF9PTl9DT05UUkFDVF9TVEFHRSIsIHN0cih5MDYpKSwKICAgICAgICAoIlkwNyIsICJSRUNFSVBUIiwgIkFOQS1TRU1JLVBSRUNPTlNVTVBUSU9OLVJFQ0VJUFQtTUQtVjAwNSIsIGYiZGV2L2FuYS1kZXYvdG1wL3tydW5faWR9L3JlY2VpcHQvcHJlZmxpZ2h0LXJlcGFpci1yZWNlaXB0Lm1kIiwgInRleHQvbWFya2Rvd247IGNoYXJzZXQ9dXRmLTgiLCAiUkVRVUlSRURfT05fQ0xPU1VSRV9TVEFHRSIsIHN0cih5MDcpKSwKICAgICAgICAoIlkwOCIsICJNQU5JRkVTVCIsICJBTkEtU0VNSS1QUkVDT05TVU1QVElPTi1NQU5JRkVTVC1DU1YtVjAwMiIsIGYiZGV2L2FuYS1kZXYvdG1wL3tydW5faWR9L21hbmlmZXN0L3ByZWZsaWdodC1yZXBhaXItbWFuaWZlc3QuY3N2IiwgInRleHQvY3N2OyBjaGFyc2V0PXV0Zi04IiwgIlNFTEYiLCBzdHIoeTA4KSksCiAgICBdCiAgICBpbXBsZW1lbnRhdGlvbi53cml0ZV9jcmVhdGVfbmV3X2J5dGVzKHkwOCwgX21hbmlmZXN0KHJ1bl9pZCwgZGVmaW5pdGlvbnMsIHN0YXRpY19mYWlsLCBjb250cmFjdF9mYWlsKSkKICAgIHJldHVybiAwIGlmIHZhcmlhbnQgPT0gIlBBU1MiIGVsc2UgMTEKCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgaWYgbGVuKHN5cy5hcmd2KSAhPSA0OgogICAgICAgIHJhaXNlIFN5c3RlbUV4aXQoMjcpCiAgICByYWlzZSBTeXN0ZW1FeGl0KG1haW4ocGF0aGxpYi5QYXRoKHN5cy5hcmd2WzFdKSwgc3lzLmFyZ3ZbMl0sIHBhdGhsaWIuUGF0aChzeXMuYXJndlszXSkpKQo=
END	4	7b31929fdc6f67c9aa78a11ea7685f97027c5bc2ac96510d906bdf586cf13d40
  • code fence 内容后追加恰好一个 LF 即完整 transcript;不得追加 EOF 标记、CR、空行或第二次 write。
  • 解码前 4 行与 V027 四个 RFC4648 attachments byte-identical;body hash 在 END 行复核,writer 在首次 CreateNew 前对四个 payload 全部 decode/hash/profile PASS。

terminal 字段/row literal contract

  • top-level ordered keys:schema_id,terminal_state,stop_code,exit_code,writer_process_count,authorization_consumed,materialized_count,rows
  • row ordered keys:id,exists,bytes,sha256,statusstatus=MATERIALIZED|UNEXPECTED|UNKNOWN|ABSENT
  • success:stop_code=null、exit=0、consumed=true、count=4、四行 MATERIALIZED 且 exact bytes/hash。
  • pre-CreateNew STOP:exit=27、consumed=false、count=0、四行 ABSENT。
  • post-CreateNew failure:exit=27、consumed=true;已安全读回为 MATERIALIZED,存在但不可安全读为 UNKNOWN,未创建为 ABSENT;禁止将 UNKNOWN 降级为 ABSENT。
  • fallback DELIVERY_UNSAFE/OUTPUT_CONTRACT/27 只在正常 JSON 自身不能安全发送时使用;它不能证明 subset,management/reviewer 必须以 exact target same-read 收口。

固定 stop precedence

WRITER_LIVENESS_OR_DELIVERY_UNKNOWN > OUTPUT_CONTRACT > POST_CREATE_IO_OR_READBACK > PRECREATE_TRANSCRIPT_DECODE_PROFILE_DIR_TARGET > SUCCESS;前四类均 27/no retry。

第 9 节完成后,V028 不再有待补 placeholder;未来只能提交独立计划审核,不能据此直接执行。