-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathMain.lua
More file actions
98 lines (95 loc) · 113 KB
/
Main.lua
File metadata and controls
98 lines (95 loc) · 113 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
--[[
⣿⣿⣿⣿⣿ SIGMA SPY ⣿⣿⣿⣿⣿
⣿⣿⣯⡉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉
⠉⠻⣿⣿⣦⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠈⠻⣿⣿⣷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠙⢿⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⣉⣿⣿⣿⠆⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⣠⣾⣿⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⢀⣴⣿⣿⡿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⣀⣴⣿⣿⠟⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⣿⣿⣟⣁⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
@author depso (depthso)
@repo https://github.com/depthso
@license MIT
@description Sigma Remote Spy for Roblox
This file is COMPILED, check /src folder for the source
Build scripts are available in /build
]]
local a,b={UseWorkspace=false,NoActors=false,FolderName='Sigma Spy',RepoUrl=
[[https://raw.githubusercontent.com/0xfinder/Sigma-Spy/refs/heads/main]],
ParserUrl=
[[https://raw.githubusercontent.com/depthso/Roblox-parser/refs/heads/main/dist/Main.luau]]
},{...}local c=b[1]if typeof(c)=='table'then for d,e in c do a[d]=e end end
local d=setmetatable({},{__index=function(d,e)local f=game:GetService(e)return
cloneref(f)end})local e=(function()local e,f={UseWorkspace=false,Folder=
'Sigma spy',RepoUrl=nil,FolderStructure={['Sigma Spy']={'assets'}}}function e:
Init(g)local h,i=self.FolderStructure,g.Services f=i.HttpService self:
CheckFolders(h)end function e:PushConfig(g)for h,i in next,g do self[h]=i end
end function e:UrlFetch(g)local h={Url=g:gsub(' ','%%20'),Method='GET'}local i,j
=pcall(request,h)if not i then warn'[!] HTTP request error! Check console (F9)'
warn('> Url:',g)error(j)return''end local k,l=j.Body,j.StatusCode if l==404 then
warn'[!] The file requested has moved or been deleted.'warn(' >',g)return''end
return k,j end function e:MakePath(g)local h=self.Folder return`{h}/{g}`end
function e:LoadCustomasset(g)if not getcustomasset then return end if not g then
return end local h=readfile(g)if#h<=0 then return end local i,j=pcall(
getcustomasset,g)if not i then return end if not j or#j<=0 then return end
return j end function e:GetFile(g,h)local i,j,k,l=self.RepoUrl,self.UseWorkspace
,self:MakePath(g),''if j then l=readfile(k)else l=self:UrlFetch(`{i}/{g}`)end if
h then self:FileCheck(k,function()return l end)return self:LoadCustomasset(k)end
return l end function e:GetTemplate(g)return self:GetFile(`templates/{g}.lua`)
end function e:FileCheck(g,h)if isfile(g)then return end local i=h()writefile(g,
i)end function e:FolderCheck(g)if isfolder(g)then return end makefolder(g)end
function e:CheckPath(g,h)return g and`{g}/{h}`or h end function e:CheckFolders(g
,h)for i,j in next,g do if typeof(j)=='table'then local k=self:CheckPath(h,i)
self:FolderCheck(k)self:CheckFolders(j,k)continue end local k=self:CheckPath(h,j
)self:FolderCheck(k)end end function e:TemplateCheck(g,h)self:FileCheck(g,
function()return self:GetTemplate(h)end)end function e:GetAsset(g,h)return self:
GetFile(`assets/{g}`,h)end function e:GetModule(g,h)local i=`{g}.lua`if h then
self:TemplateCheck(i,h)local j=readfile(i)local k=loadstring(j)if k then return
j end return self:GetTemplate(h)end return self:GetFile(i)end function e:
LoadLibraries(g,...)local h={}for i,j in next,g do local k=typeof(j)=='table'and
j[1]=='base64'j=k and j[2]or j if typeof(j)~='string'and not k then h[i]=j
continue end if k then j=crypt.base64decode(j)g[i]=j end local l,m=loadstring(j,
i)assert(l,`Failed to load {i}: {m}`)h[i]=l(...)end return h end function e:
LoadModules(g,h)for i,j in next,g do local k=j.Init if not k then continue end j
:Init(h)end end function e:CreateFont(g,h)if not h then return end local i=`assets/{
g}.json`local j,k=self:MakePath(i),{name=g,faces={{name='Regular',weight=400,
style='Normal',assetId=h}}}local l=f:JSONEncode(k)writefile(j,l)return j end
function e:CompileModule(g)local h='local Libraries = {'for i,j in g do if
typeof(j)~='string'then continue end h..=`\t{i} = (function()\n{j}\nend)(),\n`
end h..='}'return h end function e:MakeActorScript(g,h)local i=e:CompileModule(g
)i..='\r\n\tlocal ExtraData = {\r\n\t\tIsActor = true\r\n\t}\r\n\t'i..=`Libraries.Hook:BeginService(Libraries, ExtraData, {
h})`return i end return e end)()e:PushConfig(a)e:Init{Services=d}local f=e.
FolderName local g,h={Config=e:GetModule(`{f}/Config`,'Config'),ReturnSpoofs=e:
GetModule(`{f}/Return spoofs`,'Return Spoofs'),Configuration=a,Files=e,Process={
'base64',
[[dHlwZSB0YWJsZSA9IHsNCiAgICBbYW55XTogYW55DQp9DQoNCnR5cGUgUmVtb3RlRGF0YSA9IHsNCglSZW1vdGU6IEluc3RhbmNlLA0KICAgIE5vQmFja3RyYWNlOiBib29sZWFuPywNCglJc1JlY2VpdmU6IGJvb2xlYW4/LA0KCUFyZ3M6IHRhYmxlLA0KICAgIElkOiBzdHJpbmcsDQoJTWV0aG9kOiBzdHJpbmcsDQogICAgVHJhbnNmZXJUeXBlOiBzdHJpbmcsDQoJVmFsdWVSZXBsYWNlbWVudHM6IHRhYmxlLA0KICAgIFJldHVyblZhbHVlczogdGFibGUsDQogICAgT3JpZ2luYWxGdW5jOiAoSW5zdGFuY2UsIC4uLmFueSkgLT4gLi4uYW55DQp9DQoNCi0tLy8gTW9kdWxlDQpsb2NhbCBQcm9jZXNzID0gew0KICAgIC0tLy8gUmVtb3RlIGNsYXNzZXMNCiAgICBSZW1vdGVDbGFzc0RhdGEgPSB7DQogICAgICAgIFsiUmVtb3RlRXZlbnQiXSA9IHsNCiAgICAgICAgICAgIFNlbmQgPSB7DQogICAgICAgICAgICAgICAgIkZpcmVTZXJ2ZXIiLA0KICAgICAgICAgICAgICAgICJmaXJlU2VydmVyIiwNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBSZWNlaXZlID0gew0KICAgICAgICAgICAgICAgICJPbkNsaWVudEV2ZW50IiwNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgWyJSZW1vdGVGdW5jdGlvbiJdID0gew0KICAgICAgICAgICAgSXNSZW1vdGVGdW5jdGlvbiA9IHRydWUsDQogICAgICAgICAgICBTZW5kID0gew0KICAgICAgICAgICAgICAgICJJbnZva2VTZXJ2ZXIiLA0KICAgICAgICAgICAgICAgICJpbnZva2VTZXJ2ZXIiLA0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIFJlY2VpdmUgPSB7DQogICAgICAgICAgICAgICAgIk9uQ2xpZW50SW52b2tlIiwNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgWyJVbnJlbGlhYmxlUmVtb3RlRXZlbnQiXSA9IHsNCiAgICAgICAgICAgIFNlbmQgPSB7DQogICAgICAgICAgICAgICAgIkZpcmVTZXJ2ZXIiLA0KICAgICAgICAgICAgICAgICJmaXJlU2VydmVyIiwNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBSZWNlaXZlID0gew0KICAgICAgICAgICAgICAgICJPbkNsaWVudEV2ZW50IiwNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgWyJCaW5kYWJsZUV2ZW50Il0gPSB7DQogICAgICAgICAgICBOb1JlY2l2ZUhvb2sgPSB0cnVlLA0KICAgICAgICAgICAgU2VuZCA9IHsNCiAgICAgICAgICAgICAgICAiRmlyZSIsDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgUmVjZWl2ZSA9IHsNCiAgICAgICAgICAgICAgICAiRXZlbnQiLA0KICAgICAgICAgICAgfQ0KICAgICAgICB9LA0KICAgICAgICBbIkJpbmRhYmxlRnVuY3Rpb24iXSA9IHsNCiAgICAgICAgICAgIElzUmVtb3RlRnVuY3Rpb24gPSB0cnVlLA0KICAgICAgICAgICAgTm9SZWNpdmVIb29rID0gdHJ1ZSwNCiAgICAgICAgICAgIFNlbmQgPSB7DQogICAgICAgICAgICAgICAgIkludm9rZSIsDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgUmVjZWl2ZSA9IHsNCiAgICAgICAgICAgICAgICAiT25JbnZva2UiLA0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfSwNCiAgICBSZW1vdGVPcHRpb25zID0ge30sDQogICAgTG9vcGluZ1JlbW90ZXMgPSB7fSwNCiAgICBDb25maWdPdmVyd3JpdGVzID0gew0KICAgICAgICBbeyJzaXJodXJ0IiwgInBvdGFzc2l1bSIsICJ3YXZlIn1dID0gew0KICAgICAgICAgICAgRm9yY2VVc2VDdXN0b21Db21tID0gdHJ1ZQ0KICAgICAgICB9DQogICAgfQ0KfQ0KDQotLS8vIE1vZHVsZXMNCmxvY2FsIEhvb2sNCmxvY2FsIENvbW11bmljYXRpb24NCmxvY2FsIFJldHVyblNwb29mcw0KbG9jYWwgVWkNCmxvY2FsIENvbmZpZw0KDQotLS8vIFNlcnZpY2VzDQpsb2NhbCBIdHRwU2VydmljZTogSHR0cFNlcnZpY2UNCg0KLS0vLyBDb21tdW5pY2F0aW9uIGNoYW5uZWwNCmxvY2FsIENoYW5uZWwNCmxvY2FsIFdyYXBwZWRDaGFubmVsID0gZmFsc2UNCg0KbG9jYWwgU2lnbWFFTlYgPSBnZXRmZW52KDEpDQoNCmZ1bmN0aW9uIFByb2Nlc3M6TWVyZ2UoQmFzZTogdGFibGUsIE5ldzogdGFibGUpDQogICAgaWYgbm90IE5ldyB0aGVuIHJldHVybiBlbmQNCglmb3IgS2V5LCBWYWx1ZSBpbiBuZXh0LCBOZXcgZG8NCgkJQmFzZVtLZXldID0gVmFsdWUNCgllbmQNCmVuZA0KDQpmdW5jdGlvbiBQcm9jZXNzOkluaXQoRGF0YSkNCiAgICBsb2NhbCBNb2R1bGVzID0gRGF0YS5Nb2R1bGVzDQogICAgbG9jYWwgU2VydmljZXMgPSBEYXRhLlNlcnZpY2VzDQoNCiAgICAtLS8vIFNlcnZpY2VzDQogICAgSHR0cFNlcnZpY2UgPSBTZXJ2aWNlcy5IdHRwU2VydmljZQ0KDQogICAgLS0vLyBNb2R1bGVzDQogICAgQ29uZmlnID0gTW9kdWxlcy5Db25maWcNCiAgICBVaSA9IE1vZHVsZXMuVWkNCiAgICBIb29rID0gTW9kdWxlcy5Ib29rDQogICAgQ29tbXVuaWNhdGlvbiA9IE1vZHVsZXMuQ29tbXVuaWNhdGlvbg0KICAgIFJldHVyblNwb29mcyA9IE1vZHVsZXMuUmV0dXJuU3Bvb2ZzDQplbmQNCg0KLS0vLyBDb21tdW5pY2F0aW9uDQpmdW5jdGlvbiBQcm9jZXNzOlNldENoYW5uZWwoTmV3Q2hhbm5lbDogQmluZGFibGVFdmVudCwgSXNXcmFwcGVkOiBib29sZWFuKQ0KICAgIENoYW5uZWwgPSBOZXdDaGFubmVsDQogICAgV3JhcHBlZENoYW5uZWwgPSBJc1dyYXBwZWQNCmVuZA0KDQpmdW5jdGlvbiBQcm9jZXNzOkdldENvbmZpZ092ZXJ3cml0ZXMoTmFtZTogc3RyaW5nKQ0KICAgIGxvY2FsIENvbmZpZ092ZXJ3cml0ZXMgPSBzZWxmLkNvbmZpZ092ZXJ3cml0ZXMNCg0KICAgIGZvciBMaXN0LCBPdmVyd3JpdGVzIGluIG5leHQsIENvbmZpZ092ZXJ3cml0ZXMgZG8NCiAgICAgICAgaWYgbm90IHRhYmxlLmZpbmQoTGlzdCwgTmFtZSkgdGhlbiBjb250aW51ZSBlbmQNCiAgICAgICAgcmV0dXJuIE92ZXJ3cml0ZXMNCiAgICBlbmQNCiAgICByZXR1cm4NCmVuZA0KDQpmdW5jdGlvbiBQcm9jZXNzOkNoZWNrQ29uZmlnKENvbmZpZzogdGFibGUpDQogICAgbG9jYWwgTmFtZSA9IGlkZW50aWZ5ZXhlY3V0b3IoKTpsb3dlcigpDQoNCiAgICAtLS8vIEZvcmNlIGNvbmZpZ3VyYXRpb24gb3ZlcndyaXRlcyBmb3Igc3BlY2lmaWMgZXhlY3V0b3JzDQogICAgbG9jYWwgT3ZlcndyaXRlcyA9IHNlbGY6R2V0Q29uZmlnT3ZlcndyaXRlcyhOYW1lKQ0KICAgIGlmIG5vdCBPdmVyd3JpdGVzIHRoZW4gcmV0dXJuIGVuZA0KDQogICAgc2VsZjpNZXJnZShDb25maWcsIE92ZXJ3cml0ZXMpDQplbmQNCg0KZnVuY3Rpb24gUHJvY2VzczpDbGVhbkNFcnJvcihFcnJvcjogc3RyaW5nKTogc3RyaW5nDQogICAgRXJyb3IgPSBFcnJvcjpnc3ViKCI6JWQrOiAiLCAiIikNCiAgICBFcnJvciA9IEVycm9yOmdzdWIoIiwgZ290ICVhKyIsICIiKQ0KICAgIEVycm9yID0gRXJyb3I6Z3N1YigiaW52YWxpZCBhcmd1bWVudCIsICJtaXNzaW5nIGFyZ3VtZW50IikNCiAgICByZXR1cm4gRXJyb3INCmVuZA0KDQpmdW5jdGlvbiBQcm9jZXNzOkNvdW50TWF0Y2hlcyhTdHJpbmc6IHN0cmluZywgTWF0Y2g6IHN0cmluZyk6IG51bWJlcg0KCWxvY2FsIENvdW50ID0gMA0KCWZvciBfIGluIFN0cmluZzpnbWF0Y2goTWF0Y2gpIGRvDQoJCUNvdW50ICs9MSANCgllbmQNCg0KCXJldHVybiBDb3VudA0KZW5kDQoNCmZ1bmN0aW9uIFByb2Nlc3M6Q2hlY2tWYWx1ZShWYWx1ZSwgSWdub3JlOiB0YWJsZT8sIENhY2hlOiB0YWJsZT8pDQogICAgbG9jYWwgVHlwZSA9IHR5cGVvZihWYWx1ZSkNCiAgICBDb21tdW5pY2F0aW9uOldhaXRDaGVjaygpDQogICAgDQogICAgaWYgVHlwZSA9PSAidGFibGUiIHRoZW4NCiAgICAgICAgVmFsdWUgPSBzZWxmOkRlZXBDbG9uZVRhYmxlKFZhbHVlLCBJZ25vcmUsIENhY2hlKQ0KICAgIGVsc2VpZiBUeXBlID09ICJJbnN0YW5jZSIgdGhlbg0KICAgICAgICBWYWx1ZSA9IGNsb25lcmVmKFZhbHVlKQ0KICAgIGVuZA0KICAgIA0KICAgIHJldHVybiBWYWx1ZQ0KZW5kDQoNCmZ1bmN0aW9uIFByb2Nlc3M6RGVlcENsb25lVGFibGUoVGFibGUsIElnbm9yZTogdGFibGU/LCBWaXNpdGVkOiB0YWJsZT8pOiB0YWJsZQ0KICAgIGlmIHR5cGVvZihUYWJsZSkgfj0gInRhYmxlIiB0aGVuIHJldHVybiBUYWJsZSBlbmQNCiAgICBsb2NhbCBDYWNoZSA9IFZpc2l0ZWQgb3Ige30NCg0KICAgIC0tLy8gQ2hlY2sgZm9yIGNhY2hlZA0KICAgIGlmIENhY2hlW1RhYmxlXSB0aGVuDQogICAgICAgIHJldHVybiBDYWNoZVtUYWJsZV0NCiAgICBlbmQNCg0KICAgIGxvY2FsIE5ldyA9IHt9DQogICAgQ2FjaGVbVGFibGVdID0gTmV3DQoNCiAgICBmb3IgS2V5LCBWYWx1ZSBpbiBuZXh0LCBUYWJsZSBkbw0KICAgICAgICAtLS8vIENoZWNrIGlmIHRoZSB2YWx1ZSBpcyBpZ25vcmVkDQogICAgICAgIGlmIElnbm9yZSBhbmQgdGFibGUuZmluZChJZ25vcmUsIFZhbHVlKSB0aGVuIGNvbnRpbnVlIGVuZA0KICAgICAgICANCiAgICAgICAgS2V5ID0gc2VsZjpDaGVja1ZhbHVlKEtleSwgSWdub3JlLCBDYWNoZSkNCiAgICAgICAgTmV3W0tleV0gPSBzZWxmOkNoZWNrVmFsdWUoVmFsdWUsIElnbm9yZSwgQ2FjaGUpDQogICAgZW5kDQoNCiAgICAtLS8vIE1hc3RlciBjbGVhcg0KICAgIGlmIG5vdCBWaXNpdGVkIHRoZW4NCiAgICAgICAgdGFibGUuY2xlYXIoQ2FjaGUpDQogICAgZW5kDQogICAgDQogICAgcmV0dXJuIE5ldw0KZW5kDQoNCmZ1bmN0aW9uIFByb2Nlc3M6VW5wYWNrKFRhYmxlOiB0YWJsZSkNCiAgICBpZiBub3QgVGFibGUgdGhlbiByZXR1cm4gVGFibGUgZW5kDQoJbG9jYWwgTGVuZ3RoID0gdGFibGUubWF4bihUYWJsZSkNCglyZXR1cm4gdW5wYWNrKFRhYmxlLCAxLCBMZW5ndGgpDQplbmQNCg0KZnVuY3Rpb24gUHJvY2VzczpQdXNoQ29uZmlnKE92ZXJ3cml0ZXMpDQogICAgc2VsZjpNZXJnZShzZWxmLCBPdmVyd3JpdGVzKQ0KZW5kDQoNCmZ1bmN0aW9uIFByb2Nlc3M6RnVuY0V4aXN0cyhOYW1lOiBzdHJpbmcpDQoJcmV0dXJuIFNpZ21hRU5WW05hbWVdDQplbmQNCg0KZnVuY3Rpb24gUHJvY2VzczpDaGVja0V4ZWN1dG9yKCk6IGJvb2xlYW4NCiAgICBsb2NhbCBCbGFja2xpc3RlZCA9IHsNCiAgICAgICAgInhlbm8iLA0KICAgICAgICAic29sYXJhIiwNCiAgICAgICAgImpqc3Bsb2l0Ig0KICAgIH0NCg0KICAgIGxvY2FsIE5hbWUgPSBpZGVudGlmeWV4ZWN1dG9yKCk6bG93ZXIoKQ0KICAgIGxvY2FsIElzQmxhY2tsaXN0ZWQgPSB0YWJsZS5maW5kKEJsYWNrbGlzdGVkLCBOYW1lKQ0KDQogICAgLS0vLyBTb21lIGV4ZWN1dG9ycyBoYXZlIGJyb2tlbiBmdW5jdGlvbmFsaXR5DQogICAgaWYgSXNCbGFja2xpc3RlZCB0aGVuDQogICAgICAgIFVpOlNob3dVbnN1cHBvcnRlZEV4ZWN1dG9yKE5hbWUpDQogICAgICAgIHJldHVybiBmYWxzZQ0KICAgIGVuZA0KDQogICAgcmV0dXJuIHRydWUNCmVuZA0KDQpmdW5jdGlvbiBQcm9jZXNzOkNoZWNrRnVuY3Rpb25zKCk6IGJvb2xlYW4NCiAgICBsb2NhbCBDb3JlRnVuY3Rpb25zID0gew0KICAgICAgICAiaG9va21ldGFtZXRob2QiLA0KICAgICAgICAiaG9va2Z1bmN0aW9uIiwNCiAgICAgICAgImdldHJhd21ldGF0YWJsZSIsDQogICAgICAgICJzZXRyZWFkb25seSINCiAgICB9DQoNCiAgICAtLS8vIENoZWNrIGlmIHRoZSBmdW5jdGlvbnMgZXhpc3QgaW4gdGhlIEVOVg0KICAgIGZvciBfLCBOYW1lIGluIENvcmVGdW5jdGlvbnMgZG8NCiAgICAgICAgbG9jYWwgRnVuYyA9IHNlbGY6RnVuY0V4aXN0cyhOYW1lKQ0KICAgICAgICBpZiBGdW5jIHRoZW4gY29udGludWUgZW5kDQoNCiAgICAgICAgLS0vLyBGdW5jdGlvbiBtaXNzaW5nIQ0KICAgICAgICBVaTpTaG93VW5zdXBwb3J0ZWQoTmFtZSkNCiAgICAgICAgcmV0dXJuIGZhbHNlDQogICAgZW5kDQoNCiAgICByZXR1cm4gdHJ1ZQ0KZW5kDQoNCmZ1bmN0aW9uIFByb2Nlc3M6Q2hlY2tJc1N1cHBvcnRlZCgpOiBib29sZWFuDQogICAgLS0vLyBDaGVjayBpZiB0aGUgZXhlY3V0b3IgaXMgYmxhY2tsaXN0ZWQNCiAgICBsb2NhbCBFeGVjdXRvclN1cHBvcnRlZCA9IHNlbGY6Q2hlY2tFeGVjdXRvcigpDQogICAgaWYgbm90IEV4ZWN1dG9yU3VwcG9ydGVkIHRoZW4NCiAgICAgICAgcmV0dXJuIGZhbHNlDQogICAgZW5kDQoNCiAgICAtLS8vIENoZWNrIGlmIHRoZSBjb3JlIGZ1bmN0aW9ucyBleGlzdA0KICAgIGxvY2FsIEZ1bmN0aW9uc1N1cHBvcnRlZCA9IHNlbGY6Q2hlY2tGdW5jdGlvbnMoKQ0KICAgIGlmIG5vdCBGdW5jdGlvbnNTdXBwb3J0ZWQgdGhlbg0KICAgICAgICByZXR1cm4gZmFsc2UNCiAgICBlbmQNCg0KICAgIHJldHVybiB0cnVlDQplbmQNCg0KZnVuY3Rpb24gUHJvY2VzczpHZXRDbGFzc0RhdGEoUmVtb3RlOiBJbnN0YW5jZSk6IHRhYmxlPw0KICAgIGxvY2FsIFJlbW90ZUNsYXNzRGF0YSA9IHNlbGYuUmVtb3RlQ2xhc3NEYXRhDQogICAgbG9jYWwgQ2xhc3NOYW1lID0gSG9vazpJbmRleChSZW1vdGUsICJDbGFzc05hbWUiKQ0KDQogICAgcmV0dXJuIFJlbW90ZUNsYXNzRGF0YVtDbGFzc05hbWVdDQplbmQNCg0KZnVuY3Rpb24gUHJvY2VzczpJc1Byb3RlY3RlZFJlbW90ZShSZW1vdGU6IEluc3RhbmNlKTogYm9vbGVhbg0KICAgIGxvY2FsIElzRGVidWcgPSBSZW1vdGUgPT0gQ29tbXVuaWNhdGlvbi5EZWJ1Z0lkUmVtb3RlDQogICAgbG9jYWwgSXNDaGFubmVsID0gUmVtb3RlID09IChXcmFwcGVkQ2hhbm5lbCBhbmQgQ2hhbm5lbC5DaGFubmVsIG9yIENoYW5uZWwpDQoNCiAgICByZXR1cm4gSXNEZWJ1ZyBvciBJc0NoYW5uZWwNCmVuZA0KDQpmdW5jdGlvbiBQcm9jZXNzOlJlbW90ZUFsbG93ZWQoUmVtb3RlOiBJbnN0YW5jZSwgVHJhbnNmZXJUeXBlOiBzdHJpbmcsIE1ldGhvZDogc3RyaW5nPyk6IGJvb2xlYW4/DQogICAgaWYgdHlwZW9mKFJlbW90ZSkgfj0gJ0luc3RhbmNlJyB0aGVuIHJldHVybiBlbmQNCiAgICANCiAgICAtLS8vIENoZWNrIGlmIHRoZSBSZW1vdGUgaXMgcHJvdGVjdGVkDQogICAgaWYgc2VsZjpJc1Byb3RlY3RlZFJlbW90ZShSZW1vdGUpIHRoZW4gcmV0dXJuIGVuZA0KDQogICAgLS0vLyBGZXRjaCBjbGFzcyB0YWJsZQ0KCWxvY2FsIENsYXNzRGF0YSA9IHNlbGY6R2V0Q2xhc3NEYXRhKFJlbW90ZSkNCglpZiBub3QgQ2xhc3NEYXRhIHRoZW4gcmV0dXJuIGVuZA0KDQogICAgLS0vLyBDaGVjayBpZiB0aGUgdHJhbnNmZXIgdHlwZSBoYXMgZGF0YQ0KCWxvY2FsIEFsbG93ZWQgPSBDbGFzc0RhdGFbVHJhbnNmZXJUeXBlXQ0KCWlmIG5vdCBBbGxvd2VkIHRoZW4gcmV0dXJuIGVuZA0KDQogICAgLS0vLyBDaGVjayBpZiB0aGUgbWV0aG9kIGlzIGFsbG93ZWQNCglpZiBNZXRob2QgdGhlbg0KCQlyZXR1cm4gdGFibGUuZmluZChBbGxvd2VkLCBNZXRob2QpIH49IG5pbA0KCWVuZA0KDQoJcmV0dXJuIHRydWUNCmVuZA0KDQpmdW5jdGlvbiBQcm9jZXNzOlNldEV4dHJhRGF0YShEYXRhOiB0YWJsZSkNCiAgICBpZiBub3QgRGF0YSB0aGVuIHJldHVybiBlbmQNCiAgICBzZWxmLkV4dHJhRGF0YSA9IERhdGENCmVuZA0KDQpmdW5jdGlvbiBQcm9jZXNzOkdldFJlbW90ZVNwb29mKFJlbW90ZTogSW5zdGFuY2UsIE1ldGhvZDogc3RyaW5nLCAuLi4pOiB0YWJsZT8NCiAgICBsb2NhbCBTcG9vZiA9IFJldHVyblNwb29mc1tSZW1vdGVdDQoNCiAgICBpZiBub3QgU3Bvb2YgdGhlbiByZXR1cm4gZW5kDQogICAgaWYgU3Bvb2YuTWV0aG9kIH49IE1ldGhvZCB0aGVuIHJldHVybiBlbmQNCg0KICAgIGxvY2FsIFJldHVyblZhbHVlcyA9IFNwb29mLlJldHVybg0KDQogICAgLS0vLyBDYWxsIHRoZSBSZXR1cm5WYWx1ZXMgZnVuY3Rpb24gdHlwZQ0KICAgIGlmIHR5cGVvZihSZXR1cm5WYWx1ZXMpID09ICJmdW5jdGlvbiIgdGhlbg0KICAgICAgICBSZXR1cm5WYWx1ZXMgPSBSZXR1cm5WYWx1ZXMoLi4uKQ0KICAgIGVuZA0KDQoJcmV0dXJuIFJldHVyblZhbHVlcw0KZW5kDQoNCmZ1bmN0aW9uIFByb2Nlc3M6U2V0TmV3UmV0dXJuU3Bvb2ZzKE5ld1JldHVyblNwb29mczogdGFibGUpDQogICAgUmV0dXJuU3Bvb2ZzID0gTmV3UmV0dXJuU3Bvb2ZzDQplbmQNCg0KZnVuY3Rpb24gUHJvY2VzczpGaW5kQ2FsbGluZ0xDbG9zdXJlKE9mZnNldDogbnVtYmVyKQ0KICAgIGxvY2FsIEdldGZlbnYgPSBIb29rOkdldE9yaWdpbmFsRnVuYyhnZXRmZW52KQ0KICAgIE9mZnNldCArPSAxDQoNCiAgICB3aGlsZSB0cnVlIGRvDQogICAgICAgIE9mZnNldCArPSAxDQoNCiAgICAgICAgLS0vLyBDaGVjayBpZiB0aGUgc3RhY2sgbGV2ZWwgaXMgdmFsaWQNCiAgICAgICAgbG9jYWwgSXNWYWxpZCA9IGRlYnVnLmluZm8oT2Zmc2V0LCAibCIpIH49IC0xDQogICAgICAgIGlmIG5vdCBJc1ZhbGlkIHRoZW4gY29udGludWUgZW5kDQoNCiAgICAgICAgLS0vLyBDaGVjayBpZiB0aGUgZnVuY3Rpb24gaXMgdmFsaWQNCiAgICAgICAgbG9jYWwgRnVuY3Rpb24gPSBkZWJ1Zy5pbmZvKE9mZnNldCwgImYiKQ0KICAgICAgICBpZiBub3QgRnVuY3Rpb24gdGhlbiByZXR1cm4gZW5kDQogICAgICAgIGlmIEdldGZlbnYoRnVuY3Rpb24pID09IFNpZ21hRU5WIHRoZW4gY29udGludWUgZW5kDQoNCiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uDQogICAgZW5kDQplbmQNCg0KZnVuY3Rpb24gUHJvY2VzczpEZWNvbXBpbGUoU2NyaXB0OiBMb2NhbFNjcmlwdCB8IE1vZHVsZVNjcmlwdCk6IHN0cmluZw0KICAgIGxvY2FsIEtvbnN0YW50QVBJID0gImh0dHA6Ly9hcGkucGx1c2dpYW50NS5jb20va29uc3RhbnQvZGVjb21waWxlIg0KICAgIGxvY2FsIEZvcmNlS29uc3RhbnQgPSBDb25maWcuRm9yY2VLb25zdGFudERlY29tcGlsZXINCg0KICAgIC0tLy8gVXNlIGJ1aWx0LWluIGRlY29tcGlsZXIgaWYgdGhlIGV4ZWN1dG9yIHN1cHBvcnRzIGl0DQogICAgaWYgZGVjb21waWxlIGFuZCBub3QgRm9yY2VLb25zdGFudCB0aGVuIA0KICAgICAgICByZXR1cm4gZGVjb21waWxlKFNjcmlwdCkNCiAgICBlbmQNCg0KICAgIC0tLy8gZ2V0c2NyaXB0Ynl0ZWNvZGUNCiAgICBsb2NhbCBTdWNjZXNzLCBCeXRlY29kZSA9IHBjYWxsKGdldHNjcmlwdGJ5dGVjb2RlLCBTY3JpcHQpDQogICAgaWYgbm90IFN1Y2Nlc3MgdGhlbg0KICAgICAgICBsb2NhbCBFcnJvciA9IGAtLUZhaWxlZCB0byBnZXQgc2NyaXB0IGJ5dGVjb2RlLCBlcnJvcjpcbmANCiAgICAgICAgRXJyb3IgLi49IGBcbi0tW1tcbntCeXRlY29kZX1cbl1dYA0KICAgICAgICByZXR1cm4gRXJyb3IsIHRydWUNCiAgICBlbmQNCiAgICANCiAgICAtLS8vIFNlbmQgUE9TVCByZXF1ZXN0IHRvIHRoZSBBUEkNCiAgICBsb2NhbCBSZXNwb25jZSA9IHJlcXVlc3Qoew0KICAgICAgICBVcmwgPSBLb25zdGFudEFQSSwNCiAgICAgICAgQm9keSA9IEJ5dGVjb2RlLA0KICAgICAgICBNZXRob2QgPSAiUE9TVCIsDQogICAgICAgIEhlYWRlcnMgPSB7DQogICAgICAgICAgICBbIkNvbnRlbnQtVHlwZSJdID0gInRleHQvcGxhaW4iDQogICAgICAgIH0sDQogICAgfSkNCg0KICAgIC0tLy8gRXJyb3IgY2hlY2sNCiAgICBpZiBSZXNwb25jZS5TdGF0dXNDb2RlIH49IDIwMCB0aGVuDQogICAgICAgIGxvY2FsIEVycm9yID0gYC0tW0tPTlNUQU5UXSBFcnJvciBvY2N1cmVkIHdoaWxlIHJlcXVlc3RpbmcgdGhlIEFQSSwgZXJyb3I6XG5gDQogICAgICAgIEVycm9yIC4uPSBgXG4tLVtbXG57UmVzcG9uY2UuQm9keX1cbl1dYA0KICAgICAgICByZXR1cm4gRXJyb3IsIHRydWUNCiAgICBlbmQNCg0KICAgIHJldHVybiBSZXNwb25jZS5Cb2R5DQplbmQNCg0KZnVuY3Rpb24gUHJvY2VzczpHZXRTY3JpcHRGcm9tRnVuYyhGdW5jOiAoLi4uYW55KSAtPiAuLi5hbnkpDQogICAgaWYgbm90IEZ1bmMgdGhlbiByZXR1cm4gZW5kDQoNCiAgICBsb2NhbCBTdWNjZXNzLCBFTlYgPSBwY2FsbChnZXRmZW52LCBGdW5jKQ0KICAgIGlmIG5vdCBTdWNjZXNzIHRoZW4gcmV0dXJuIGVuZA0KICAgIA0KICAgIC0tLy8gQmxhY2tsaXN0IHNpZ21hIHNweQ0KICAgIGlmIHNlbGY6SXNTaWdtYVNweUVOVihFTlYpIHRoZW4gcmV0dXJuIGVuZA0KDQogICAgcmV0dXJuIHJhd2dldChFTlYsICJzY3JpcHQiKQ0KZW5kDQoNCmZ1bmN0aW9uIFByb2Nlc3M6Q29ubmVjdGlvbklzVmFsaWQoQ29ubmVjdGlvbjogdGFibGUpOiBib29sZWFuDQogICAgbG9jYWwgVmFsdWVSZXBsYWNlbWVudHMgPSB7DQoJCVsiU2NyaXB0Il0gPSBmdW5jdGlvbihDb25uZWN0aW9uOiB0YWJsZSk6IFNjcmlwdD8NCgkJCWxvY2FsIEZ1bmN0aW9uID0gQ29ubmVjdGlvbi5GdW5jdGlvbg0KCQkJaWYgbm90IEZ1bmN0aW9uIHRoZW4gcmV0dXJuIGVuZA0KDQoJCQlyZXR1cm4gc2VsZjpHZXRTY3JpcHRGcm9tRnVuYyhGdW5jdGlvbikNCgkJZW5kDQoJfQ0KDQogICAgLS0vLyBDaGVjayBpZiB0aGVzZSBwcm9wZXJ0aWVzIGFyZSB2YWxpZA0KICAgIGxvY2FsIFRvQ2hlY2sgPSB7DQogICAgICAgICJTY3JpcHQiDQogICAgfQ0KICAgIGZvciBfLCBQcm9wZXJ0eSBpbiBUb0NoZWNrIGRvDQogICAgICAgIGxvY2FsIFJlcGxhY2VtZW50ID0gVmFsdWVSZXBsYWNlbWVudHNbUHJvcGVydHldDQogICAgICAgIGxvY2FsIFZhbHVlDQoNCiAgICAgICAgLS0vLyBDaGVjayBpZiB0aGVyZSdzIGEgZnVuY3Rpb24gZm9yIGEgcHJvcGVydHkNCiAgICAgICAgaWYgUmVwbGFjZW1lbnQgdGhlbg0KICAgICAgICAgICAgVmFsdWUgPSBSZXBsYWNlbWVudChDb25uZWN0aW9uKQ0KICAgICAgICBlbmQNCg0KICAgICAgICAtLS8vIENoZWNrIGlmIHRoZSBwcm9wZXJ0eSBoYXMgYSB2YWx1ZQ0KICAgICAgICBpZiBWYWx1ZSA9PSBuaWwgdGhlbiANCiAgICAgICAgICAgIHJldHVybiBmYWxzZSANCiAgICAgICAgZW5kDQogICAgZW5kDQoNCiAgICByZXR1cm4gdHJ1ZQ0KZW5kDQoNCmZ1bmN0aW9uIFByb2Nlc3M6RmlsdGVyQ29ubmVjdGlvbnMoU2lnbmFsOiBSQlhTY3JpcHRTaWduYWwpOiB0YWJsZQ0KICAgIGxvY2FsIFByb2Nlc3NlZCA9IHt9DQoNCiAgICAtLS8vIEZpbHRlciBlYWNoIGNvbm5lY3Rpb24NCiAgICBmb3IgXywgQ29ubmVjdGlvbiBpbiBnZXRjb25uZWN0aW9ucyhTaWduYWwpIGRvDQogICAgICAgIGlmIG5vdCBzZWxmOkNvbm5lY3Rpb25Jc1ZhbGlkKENvbm5lY3Rpb24pIHRoZW4gY29udGludWUgZW5kDQogICAgICAgIHRhYmxlLmluc2VydChQcm9jZXNzZWQsIENvbm5lY3Rpb24pDQogICAgZW5kDQoNCiAgICByZXR1cm4gUHJvY2Vzc2VkDQplbmQNCg0KZnVuY3Rpb24gUHJvY2VzczpJc1NpZ21hU3B5RU5WKEVudjogdGFibGUpOiBib29sZWFuDQogICAgcmV0dXJuIEVudiA9PSBTaWdtYUVOVg0KZW5kDQoNCmZ1bmN0aW9uIFByb2Nlc3M6R2V0UmVtb3RlRGF0YShJZDogc3RyaW5nKQ0KICAgIGxvY2FsIFJlbW90ZU9wdGlvbnMgPSBzZWxmLlJlbW90ZU9wdGlvbnMNCg0KICAgIC0tLy8gQ2hlY2sgZm9yIGV4aXN0aW5nIHJlbW90ZSBkYXRhDQoJbG9jYWwgRXhpc3RpbmcgPSBSZW1vdGVPcHRpb25zW0lkXQ0KCWlmIEV4aXN0aW5nIHRoZW4gcmV0dXJuIEV4aXN0aW5nIGVuZA0KCQ0KICAgIC0tLy8gQmFzZSByZW1vdGUgZGF0YQ0KCWxvY2FsIERhdGEgPSB7DQoJCUV4Y2x1ZGVkID0gZmFsc2UsDQoJCUJsb2NrZWQgPSBmYWxzZQ0KCX0NCg0KCVJlbW90ZU9wdGlvbnNbSWRdID0gRGF0YQ0KCXJldHVybiBEYXRhDQplbmQNCg0KZnVuY3Rpb24gUHJvY2VzczpDYWxsRGlzY29yZFJQQyhCb2R5OiB0YWJsZSkNCiAgICByZXF1ZXN0KHsNCiAgICAgICAgVXJsID0gImh0dHA6Ly8xMjcuMC4wLjE6NjQ2My9ycGM/dj0xIiwNCiAgICAgICAgTWV0aG9kID0gIlBPU1QiLA0KICAgICAgICBIZWFkZXJzID0gew0KICAgICAgICAgICAgWyJDb250ZW50LVR5cGUiXSA9ICJhcHBsaWNhdGlvbi9qc29uIiwNCiAgICAgICAgICAgIFsiT3JpZ2luIl0gPSAiaHR0cHM6Ly9kaXNjb3JkLmNvbS8iDQogICAgICAgIH0sDQogICAgICAgIEJvZHkgPSBIdHRwU2VydmljZTpKU09ORW5jb2RlKEJvZHkpDQogICAgfSkNCmVuZA0KDQpmdW5jdGlvbiBQcm9jZXNzOlByb21wdERpc2NvcmRJbnZpdGUoSW52aXRlQ29kZTogc3RyaW5nKQ0KICAgIHNlbGY6Q2FsbERpc2NvcmRSUEMoew0KICAgICAgICBjbWQgPSAiSU5WSVRFX0JST1dTRVIiLA0KICAgICAgICBub25jZSA9IEh0dHBTZXJ2aWNlOkdlbmVyYXRlR1VJRChmYWxzZSksDQogICAgICAgIGFyZ3MgPSB7DQogICAgICAgICAgICBjb2RlID0gSW52aXRlQ29kZQ0KICAgICAgICB9DQogICAgfSkNCmVuZA0KDQpsb2NhbCBQcm9jZXNzQ2FsbGJhY2sgPSBuZXdjY2xvc3VyZShmdW5jdGlvbihEYXRhOiBSZW1vdGVEYXRhLCBSZW1vdGUsIC4uLik6IHRhYmxlPw0KICAgIC0tLy8gVW5wYWNrIERhdGENCiAgICBsb2NhbCBPcmlnaW5hbEZ1bmMgPSBEYXRhLk9yaWdpbmFsRnVuYw0KICAgIGxvY2FsIElkID0gRGF0YS5JZA0KICAgIGxvY2FsIE1ldGhvZCA9IERhdGEuTWV0aG9kDQoNCiAgICAtLS8vIENoZWNrIGlmIHRoZSBSZW1vdGUgaXMgQmxvY2tlZA0KICAgIGxvY2FsIFJlbW90ZURhdGEgPSBQcm9jZXNzOkdldFJlbW90ZURhdGEoSWQpDQogICAgaWYgUmVtb3RlRGF0YS5CbG9ja2VkIHRoZW4gcmV0dXJuIHt9IGVuZA0KDQogICAgLS0vLyBDaGVjayBmb3IgYSBzcG9vZg0KICAgIGxvY2FsIFNwb29mID0gUHJvY2VzczpHZXRSZW1vdGVTcG9vZihSZW1vdGUsIE1ldGhvZCwgT3JpZ2luYWxGdW5jLCAuLi4pDQogICAgaWYgU3Bvb2YgdGhlbiByZXR1cm4gU3Bvb2YgZW5kDQoNCiAgICAtLS8vIENoZWNrIGlmIHRoZSBvcmlnbmFsIGZ1bmN0aW9uIHdhcyBwYXNzZWQNCiAgICBpZiBub3QgT3JpZ2luYWxGdW5jIHRoZW4gcmV0dXJuIGVuZA0KDQogICAgLS0vLyBJbnZva2Ugb3JpZ25hbCBmdW5jdGlvbg0KICAgIHJldHVybiB7DQogICAgICAgIE9yaWdpbmFsRnVuYyhSZW1vdGUsIC4uLikNCiAgICB9DQplbmQpDQoNCmZ1bmN0aW9uIFByb2Nlc3M6UHJvY2Vzc1JlbW90ZShEYXRhOiBSZW1vdGVEYXRhLCBSZW1vdGUsIC4uLik6IHRhYmxlPw0KICAgIC0tLy8gVW5wYWNrIERhdGENCglsb2NhbCBNZXRob2QgPSBEYXRhLk1ldGhvZA0KICAgIGxvY2FsIFRyYW5zZmVyVHlwZSA9IERhdGEuVHJhbnNmZXJUeXBlDQogICAgbG9jYWwgSXNSZWNlaXZlID0gRGF0YS5Jc1JlY2VpdmUNCg0KCS0tLy8gQ2hlY2sgaWYgdGhlIHRyYW5zZmVydHlwZSBtZXRob2QgaXMgYWxsb3dlZA0KCWlmIFRyYW5zZmVyVHlwZSBhbmQgbm90IHNlbGY6UmVtb3RlQWxsb3dlZChSZW1vdGUsIFRyYW5zZmVyVHlwZSwgTWV0aG9kKSB0aGVuIHJldHVybiBlbmQNCg0KICAgIC0tLy8gRmV0Y2ggZGV0YWlscw0KICAgIGxvY2FsIElkID0gQ29tbXVuaWNhdGlvbjpHZXREZWJ1Z0lkKFJlbW90ZSkNCiAgICBsb2NhbCBDbGFzc0RhdGEgPSBzZWxmOkdldENsYXNzRGF0YShSZW1vdGUpDQogICAgbG9jYWwgVGltZXN0YW1wID0gdGljaygpDQoNCiAgICBsb2NhbCBDYWxsaW5nRnVuY3Rpb24NCiAgICBsb2NhbCBTb3VyY2VTY3JpcHQNCg0KICAgIC0tLy8gQWRkIGV4dHJhIGRhdGEgaW50byB0aGUgbG9nIGlmIG5lZWRlZA0KICAgIGxvY2FsIEV4dHJhRGF0YSA9IHNlbGYuRXh0cmFEYXRhDQogICAgaWYgRXh0cmFEYXRhIHRoZW4NCiAgICAgICAgc2VsZjpNZXJnZShEYXRhLCBFeHRyYURhdGEpDQogICAgZW5kDQoNCiAgICAtLS8vIEdldCBjYWxsZXIgaW5mb3JtYXRpb24NCiAgICBpZiBub3QgSXNSZWNlaXZlIHRoZW4NCiAgICAgICAgQ2FsbGluZ0Z1bmN0aW9uID0gc2VsZjpGaW5kQ2FsbGluZ0xDbG9zdXJlKDYpDQogICAgICAgIFNvdXJjZVNjcmlwdCA9IENhbGxpbmdGdW5jdGlvbiBhbmQgc2VsZjpHZXRTY3JpcHRGcm9tRnVuYyhDYWxsaW5nRnVuY3Rpb24pIG9yIG5pbA0KICAgIGVuZA0KDQogICAgLS0vLyBBZGQgdG8gcXVldWUNCiAgICBzZWxmOk1lcmdlKERhdGEsIHsNCiAgICAgICAgUmVtb3RlID0gY2xvbmVyZWYoUmVtb3RlKSwNCgkJQ2FsbGluZ1NjcmlwdCA9IGdldGNhbGxpbmdzY3JpcHQoKSwNCiAgICAgICAgQ2FsbGluZ0Z1bmN0aW9uID0gQ2FsbGluZ0Z1bmN0aW9uLA0KICAgICAgICBTb3VyY2VTY3JpcHQgPSBTb3VyY2VTY3JpcHQsDQogICAgICAgIElkID0gSWQsDQoJCUNsYXNzRGF0YSA9IENsYXNzRGF0YSwNCiAgICAgICAgVGltZXN0YW1wID0gVGltZXN0YW1wLA0KICAgICAgICBBcmdzID0gey4uLn0NCiAgICB9KQ0KDQogICAgLS0vLyBJbnZva2UgdGhlIFJlbW90ZSBhbmQgbG9nIHJldHVybiB2YWx1ZXMNCiAgICBsb2NhbCBSZXR1cm5WYWx1ZXMgPSBQcm9jZXNzQ2FsbGJhY2soRGF0YSwgUmVtb3RlLCAuLi4pDQogICAgRGF0YS5SZXR1cm5WYWx1ZXMgPSBSZXR1cm5WYWx1ZXMNCg0KICAgIC0tLy8gUXVldWUgbG9nDQogICAgQ29tbXVuaWNhdGlvbjpRdWV1ZUxvZyhEYXRhKQ0KDQogICAgcmV0dXJuIFJldHVyblZhbHVlcw0KZW5kDQoNCmZ1bmN0aW9uIFByb2Nlc3M6U2V0QWxsUmVtb3RlRGF0YShLZXk6IHN0cmluZywgVmFsdWUpDQogICAgbG9jYWwgUmVtb3RlT3B0aW9ucyA9IHNlbGYuUmVtb3RlT3B0aW9ucw0KCWZvciBSZW1vdGVJRCwgRGF0YSBpbiBuZXh0LCBSZW1vdGVPcHRpb25zIGRvDQoJCURhdGFbS2V5XSA9IFZhbHVlDQoJZW5kDQplbmQNCg0KLS0vLyBUaGUgY29tbXVuaWNhdGlvbiBjcmVhdGVzIGEgZGlmZmVyZW50IHRhYmxlIGFkZHJlc3MNCi0tLy8gUmVjaXZlZCB0YWJsZXMgd2lsbCBub3QgYmUgdGhlIHNhbWUNCmZ1bmN0aW9uIFByb2Nlc3M6U2V0UmVtb3RlRGF0YShJZDogc3RyaW5nLCBSZW1vdGVEYXRhOiB0YWJsZSkNCiAgICBsb2NhbCBSZW1vdGVPcHRpb25zID0gc2VsZi5SZW1vdGVPcHRpb25zDQogICAgUmVtb3RlT3B0aW9uc1tJZF0gPSBSZW1vdGVEYXRhDQplbmQNCg0KZnVuY3Rpb24gUHJvY2VzczpVcGRhdGVSZW1vdGVEYXRhKElkOiBzdHJpbmcsIFJlbW90ZURhdGE6IHRhYmxlKQ0KICAgIENvbW11bmljYXRpb246Q29tbXVuaWNhdGUoIlJlbW90ZURhdGEiLCBJZCwgUmVtb3RlRGF0YSkNCmVuZA0KDQpmdW5jdGlvbiBQcm9jZXNzOlVwZGF0ZUFsbFJlbW90ZURhdGEoS2V5OiBzdHJpbmcsIFZhbHVlKQ0KICAgIENvbW11bmljYXRpb246Q29tbXVuaWNhdGUoIkFsbFJlbW90ZURhdGEiLCBLZXksIFZhbHVlKQ0KZW5kDQoNCnJldHVybiBQcm9jZXNz]]
},Hook={'base64',
[[LS1bWw0KDQoJVGFraW5nIG15IG1ldGhvZHMg8J+SlvCfkpYNCglJIGxvdmUgYSBwYXN0ZXIgYW5kIGEgc2tpZCwgcHV0cyBkaXNndXN0IGluIG15IGZhY2UNCg0KXV0NCg0KbG9jYWwgSG9vayA9IHsNCglPcmlnaW5hbE5hbWVjYWxsID0gbmlsLA0KCU9yaWdpbmFsSW5kZXggPSBuaWwsDQoJUHJldmlvdXNGdW5jdGlvbnMgPSB7fSwNCglEZWZhdWx0Q29uZmlnID0gew0KCQlGdW5jdGlvblBhdGNoZXMgPSB0cnVlDQoJfQ0KfQ0KDQp0eXBlIHRhYmxlID0gew0KCVthbnldOiBhbnkNCn0NCg0KdHlwZSBNZXRhRnVuYyA9IChJbnN0YW5jZSwgLi4uYW55KSAtPiAuLi5hbnkNCnR5cGUgVW5rRnVuYyA9ICguLi5hbnkpIC0+IC4uLmFueQ0KDQotLS8vIE1vZHVsZXMNCmxvY2FsIE1vZHVsZXMNCmxvY2FsIFByb2Nlc3MNCmxvY2FsIENvbmZpZ3VyYXRpb24NCmxvY2FsIENvbmZpZw0KbG9jYWwgQ29tbXVuaWNhdGlvbg0KDQpsb2NhbCBFeGVFTlYgPSBnZXRmZW52KDEpDQoNCmZ1bmN0aW9uIEhvb2s6SW5pdChEYXRhKQ0KICAgIE1vZHVsZXMgPSBEYXRhLk1vZHVsZXMNCg0KCVByb2Nlc3MgPSBNb2R1bGVzLlByb2Nlc3MNCglDb21tdW5pY2F0aW9uID0gTW9kdWxlcy5Db21tdW5pY2F0aW9uIG9yIENvbW11bmljYXRpb24NCglDb25maWcgPSBNb2R1bGVzLkNvbmZpZyBvciBDb25maWcNCglDb25maWd1cmF0aW9uID0gTW9kdWxlcy5Db25maWd1cmF0aW9uIG9yIENvbmZpZ3VyYXRpb24NCmVuZA0KDQotLS8vIFRoZSBjYWxsYmFjayBpcyBleHBlY3RlZCB0byByZXR1cm4gYSBuaWwgdmFsdWUgc29tZXRpbWVzIHdoaWNoIHNob3VsZCBiZSBpbmdvcmVkDQpsb2NhbCBIb29rTWlkZGxlID0gbmV3Y2Nsb3N1cmUoZnVuY3Rpb24oT3JpZ2luYWxGdW5jLCBDYWxsYmFjaywgQWx3YXlzVGFibGU6IGJvb2xlYW4/LCAuLi4pDQoJLS0vLyBJbnZva2UgY2FsbGJhY2sgYW5kIGNoZWNrIGZvciBhIHJlcG9uY2Ugb3RoZXJ3aXNlIGlnbm9yZWQNCglsb2NhbCBSZXR1cm5WYWx1ZXMgPSBDYWxsYmFjayguLi4pDQoJaWYgUmV0dXJuVmFsdWVzIHRoZW4NCgkJLS0vLyBVbnBhY2sNCgkJaWYgbm90IEFsd2F5c1RhYmxlIHRoZW4NCgkJCXJldHVybiBQcm9jZXNzOlVucGFjayhSZXR1cm5WYWx1ZXMpDQoJCWVuZA0KDQoJCS0tLy8gUmV0dXJuIHBhY2tlZCByZXNwb25jZQ0KCQlyZXR1cm4gUmV0dXJuVmFsdWVzDQoJZW5kDQoNCgktLS8vIFJldHVybiBwYWNrZWQgcmVzcG9uY2UNCglpZiBBbHdheXNUYWJsZSB0aGVuDQoJCXJldHVybiB7T3JpZ2luYWxGdW5jKC4uLil9DQoJZW5kDQoNCgktLS8vIFVucGFja2VkDQoJcmV0dXJuIE9yaWdpbmFsRnVuYyguLi4pDQplbmQpDQoNCmxvY2FsIGZ1bmN0aW9uIE1lcmdlKEJhc2U6IHRhYmxlLCBOZXc6IHRhYmxlKQ0KCWZvciBLZXksIFZhbHVlIGluIG5leHQsIE5ldyBkbw0KCQlCYXNlW0tleV0gPSBWYWx1ZQ0KCWVuZA0KZW5kDQoNCmZ1bmN0aW9uIEhvb2s6SW5kZXgoT2JqZWN0OiBJbnN0YW5jZSwgS2V5OiBzdHJpbmcpDQoJcmV0dXJuIE9iamVjdFtLZXldDQplbmQNCg0KZnVuY3Rpb24gSG9vazpQdXNoQ29uZmlnKE92ZXJ3cml0ZXMpDQogICAgTWVyZ2Uoc2VsZiwgT3ZlcndyaXRlcykNCmVuZA0KDQotLS8vIGdldHJhd21ldGF0YWJsZQ0KZnVuY3Rpb24gSG9vazpSZXBsYWNlTWV0YU1ldGhvZChPYmplY3Q6IEluc3RhbmNlLCBDYWxsOiBzdHJpbmcsIENhbGxiYWNrOiBNZXRhRnVuYyk6IE1ldGFGdW5jDQoJbG9jYWwgTWV0YXRhYmxlID0gZ2V0cmF3bWV0YXRhYmxlKE9iamVjdCkNCglsb2NhbCBPcmlnaW5hbEZ1bmMgPSBjbG9uZWZ1bmN0aW9uKE1ldGF0YWJsZVtDYWxsXSkNCgkNCgktLS8vIFJlcGxhY2UgZnVuY3Rpb24NCglzZXRyZWFkb25seShNZXRhdGFibGUsIGZhbHNlKQ0KCU1ldGF0YWJsZVtDYWxsXSA9IG5ld2NjbG9zdXJlKGZ1bmN0aW9uKC4uLikNCgkJcmV0dXJuIEhvb2tNaWRkbGUoT3JpZ2luYWxGdW5jLCBDYWxsYmFjaywgZmFsc2UsIC4uLikNCgllbmQpDQoJc2V0cmVhZG9ubHkoTWV0YXRhYmxlLCB0cnVlKQ0KDQoJcmV0dXJuIE9yaWdpbmFsRnVuYw0KZW5kDQoNCi0tLy8gaG9va2Z1bmN0aW9uDQpmdW5jdGlvbiBIb29rOkhvb2tGdW5jdGlvbihGdW5jOiBVbmtGdW5jLCBDYWxsYmFjazogVW5rRnVuYykNCglsb2NhbCBPcmlnaW5hbEZ1bmMNCglsb2NhbCBXcmFwcGVkQ2FsbGJhY2sgPSBuZXdjY2xvc3VyZShDYWxsYmFjaykNCglPcmlnaW5hbEZ1bmMgPSBjbG9uZWZ1bmN0aW9uKGhvb2tmdW5jdGlvbihGdW5jLCBmdW5jdGlvbiguLi4pDQoJCXJldHVybiBIb29rTWlkZGxlKE9yaWdpbmFsRnVuYywgV3JhcHBlZENhbGxiYWNrLCBmYWxzZSwgLi4uKQ0KCWVuZCkpDQoJcmV0dXJuIE9yaWdpbmFsRnVuYw0KZW5kDQoNCi0tLy8gaG9va21ldGFtZXRob2QNCmZ1bmN0aW9uIEhvb2s6SG9va01ldGFDYWxsKE9iamVjdDogSW5zdGFuY2UsIENhbGw6IHN0cmluZywgQ2FsbGJhY2s6IE1ldGFGdW5jKTogTWV0YUZ1bmMNCglsb2NhbCBNZXRhdGFibGUgPSBnZXRyYXdtZXRhdGFibGUoT2JqZWN0KQ0KCWxvY2FsIFVuaG9va2VkDQoJDQoJVW5ob29rZWQgPSBzZWxmOkhvb2tGdW5jdGlvbihNZXRhdGFibGVbQ2FsbF0sIGZ1bmN0aW9uKC4uLikNCgkJcmV0dXJuIEhvb2tNaWRkbGUoVW5ob29rZWQsIENhbGxiYWNrLCB0cnVlLCAuLi4pDQoJZW5kKQ0KCXJldHVybiBVbmhvb2tlZA0KZW5kDQoNCmZ1bmN0aW9uIEhvb2s6SG9va01ldGFNZXRob2QoT2JqZWN0OiBJbnN0YW5jZSwgQ2FsbDogc3RyaW5nLCBDYWxsYmFjazogTWV0YUZ1bmMpOiBNZXRhRnVuYw0KCWxvY2FsIEZ1bmMgPSBuZXdjY2xvc3VyZShDYWxsYmFjaykNCgkNCgktLS8vIEdldHJhd21ldGF0YWJsZQ0KCWlmIENvbmZpZy5SZXBsYWNlTWV0YUNhbGxGdW5jIHRoZW4NCgkJcmV0dXJuIHNlbGY6UmVwbGFjZU1ldGFNZXRob2QoT2JqZWN0LCBDYWxsLCBGdW5jKQ0KCWVuZA0KCQ0KCS0tLy8gSG9va21ldGFtZXRob2QNCglyZXR1cm4gc2VsZjpIb29rTWV0YUNhbGwoT2JqZWN0LCBDYWxsLCBGdW5jKQ0KZW5kDQoNCi0tLy8gVGhpcyBpbmNsdWRlcyBhIGZldyBwYXRjaGVzIGZvciBleGVjdXRvciBmdW5jdGlvbnMgdGhhdCByZXN1bHQgaW4gZGV0ZWN0aW9uDQotLS8vIFRoaXMgaXNuJ3QgYnVsbGV0cHJvb2Ygc2luY2Ugc29tZSBmdW5jdGlvbnMgbGlrZSBob29rZnVuY3Rpb24gSSBjYW4ndCBwYXRjaA0KLS0vLyBCeSB0aGUgd2F5LCB0aGFua3MgZm9yIGNvcHlpbmcgdGhpcyBndXlzISBTdXBlciBhcHByZWNpYXRlIHRoZSBjb3B5Y2F0DQpmdW5jdGlvbiBIb29rOlBhdGNoRnVuY3Rpb25zKCkNCgktLS8vIENoZWNrIGlmIHRoaXMgZnVuY3Rpb24gaXMgZGlzYWJsZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24NCglpZiBDb25maWcuTm9GdW5jdGlvblBhdGNoaW5nIHRoZW4gcmV0dXJuIGVuZA0KDQoJbG9jYWwgUGF0Y2hlcyA9IHsNCgkJLS0vLyBFcnJvciBkZXRlY3Rpb24gcGF0Y2gNCgkJLS0vLyBob29rZnVuY3Rpb24gbWF5IHN0aWxsIGJlIGRldGVjdGVkIGRlcGVuZGluZyBvbiB0aGUgZXhlY3V0b3INCgkJW3BjYWxsXSA9ICBmdW5jdGlvbihPbGRGdW5jLCBGdW5jLCAuLi4pDQoJCQlsb2NhbCBSZXNwb25jZSA9IHtPbGRGdW5jKEZ1bmMsIC4uLil9DQoJCQlsb2NhbCBTdWNjZXNzLCBFcnJvciA9IFJlc3BvbmNlWzFdLCBSZXNwb25jZVsyXQ0KCQkJbG9jYWwgSXNDID0gaXNjY2xvc3VyZShGdW5jKQ0KDQoJCQktLS8vIFBhdGNoIGMtY2xvc3VyZSBlcnJvciBkZXRlY3Rpb24NCgkJCWlmIFN1Y2Nlc3MgPT0gZmFsc2UgYW5kIElzQyB0aGVuDQoJCQkJbG9jYWwgTmV3RXJyb3IgPSBQcm9jZXNzOkNsZWFuQ0Vycm9yKEVycm9yKQ0KCQkJCVJlc3BvbmNlWzJdID0gTmV3RXJyb3INCgkJCWVuZA0KDQoJCQktLS8vIFN0YWNrLW92ZXJmbG93IGRldGVjdGlvbiBwYXRjaA0KCQkJaWYgU3VjY2VzcyA9PSBmYWxzZSBhbmQgbm90IElzQyBhbmQgRXJyb3I6ZmluZCgiQyBzdGFjayBvdmVyZmxvdyIpIHRoZW4NCgkJCQlsb2NhbCBUcmFjZXRhYmxlID0gRXJyb3I6c3BsaXQoIjoiKQ0KCQkJCWxvY2FsIENhbGxlciwgTGluZSA9IFRyYWNldGFibGVbMV0sIFRyYWNldGFibGVbMl0NCgkJCQlsb2NhbCBDb3VudCA9IFByb2Nlc3M6Q291bnRNYXRjaGVzKEVycm9yLCBDYWxsZXIpDQoNCgkJCQlpZiBDb3VudCA9PSAxOTYgdGhlbg0KCQkJCQlDb21tdW5pY2F0aW9uOkNvbnNvbGVQcmludChgQyBzdGFjayBvdmVyZmxvdyBwYXRjaGVkLCBjb3VudCB3YXMge0NvdW50fWApDQoJCQkJCVJlc3BvbmNlWzJdID0gRXJyb3I6Z3N1Yihge0NhbGxlcn06e0xpbmV9OiBgLCBDYWxsZXIsIDEpDQoJCQkJZW5kDQoJCQllbmQNCg0KCQkJcmV0dXJuIFJlc3BvbmNlDQoJCWVuZCwNCgkJW2dldGZlbnZdID0gZnVuY3Rpb24oT2xkRnVuYywgTGV2ZWw6IG51bWJlciwgLi4uKQ0KCQkJTGV2ZWwgPSBMZXZlbCBvciAxDQoNCgkJCS0tLy8gUHJldmVudCBjYXRwdXJlIG9mIGV4ZWN1dG9yJ3MgZW52DQoJCQlpZiB0eXBlKExldmVsKSA9PSAibnVtYmVyIiB0aGVuDQoJCQkJTGV2ZWwgKz0gMg0KCQkJZW5kDQoNCgkJCWxvY2FsIFJlc3BvbmNlID0ge09sZEZ1bmMoTGV2ZWwsIC4uLil9DQoJCQlsb2NhbCBFTlYgPSBSZXNwb25jZVsxXQ0KDQoJCQktLS8vIF9fdG9zdHJpbmcgRU5WIGRldGVjdGlvbiBwYXRjaA0KCQkJaWYgbm90IGNoZWNrY2FsbGVyKCkgYW5kIEVOViA9PSBFeGVFTlYgdGhlbg0KCQkJCUNvbW11bmljYXRpb246Q29uc29sZVByaW50KCJFTlYgZXNjYXBlIHBhdGNoZWQiKQ0KCQkJCXJldHVybiBPbGRGdW5jKDk5OTk5OSwgLi4uKQ0KCQkJZW5kDQoNCgkJCXJldHVybiBSZXNwb25jZQ0KCQllbmQNCgl9DQoNCgktLS8vIEhvb2sgZWFjaCBmdW5jdGlvbg0KCWZvciBGdW5jLCBDYWxsQmFjayBpbiBQYXRjaGVzIGRvDQoJCWxvY2FsIFdyYXBwZWQgPSBuZXdjY2xvc3VyZShDYWxsQmFjaykNCgkJbG9jYWwgT2xkRnVuYzsgT2xkRnVuYyA9IHNlbGY6SG9va0Z1bmN0aW9uKEZ1bmMsIGZ1bmN0aW9uKC4uLikNCgkJCXJldHVybiBXcmFwcGVkKE9sZEZ1bmMsIC4uLikNCgkJZW5kKQ0KDQoJCS0tLy8gQ2FjaGUgcHJldmlvdXMgZnVuY3Rpb24NCgkJc2VsZi5QcmV2aW91c0Z1bmN0aW9uc1tGdW5jXSA9IE9sZEZ1bmMNCgllbmQNCmVuZA0KDQpmdW5jdGlvbiBIb29rOkdldE9yaWdpbmFsRnVuYyhGdW5jKQ0KCXJldHVybiBzZWxmLlByZXZpb3VzRnVuY3Rpb25zW0Z1bmNdIG9yIEZ1bmMNCmVuZA0KDQpmdW5jdGlvbiBIb29rOlJ1bk9uQWN0b3JzKENvZGU6IHN0cmluZywgQ2hhbm5lbElkOiBudW1iZXIpDQoJaWYgbm90IGdldGFjdG9ycyBvciBub3QgcnVuX29uX2FjdG9yIHRoZW4gcmV0dXJuIGVuZA0KCQ0KCWxvY2FsIEFjdG9ycyA9IGdldGFjdG9ycygpDQoJaWYgbm90IEFjdG9ycyB0aGVuIHJldHVybiBlbmQNCgkNCglmb3IgXywgQWN0b3IgaW4gQWN0b3JzIGRvIA0KCQlwY2FsbChydW5fb25fYWN0b3IsIEFjdG9yLCBDb2RlLCBDaGFubmVsSWQpDQoJZW5kDQplbmQNCg0KbG9jYWwgZnVuY3Rpb24gUHJvY2Vzc1JlbW90ZShPcmlnaW5hbEZ1bmMsIE1ldGFNZXRob2Q6IHN0cmluZywgc2VsZiwgTWV0aG9kOiBzdHJpbmcsIC4uLikNCglyZXR1cm4gUHJvY2VzczpQcm9jZXNzUmVtb3RlKHsNCgkJTWV0aG9kID0gTWV0aG9kLA0KCQlPcmlnaW5hbEZ1bmMgPSBPcmlnaW5hbEZ1bmMsDQoJCU1ldGFNZXRob2QgPSBNZXRhTWV0aG9kLA0KCQlUcmFuc2ZlclR5cGUgPSAiU2VuZCIsDQoJCUlzRXhwbG9pdCA9IGNoZWNrY2FsbGVyKCkNCgl9LCBzZWxmLCAuLi4pDQplbmQNCg0KZnVuY3Rpb24gSG9vazpIb29rUmVtb3RlVHlwZUluZGV4KENsYXNzTmFtZTogc3RyaW5nLCBGdW5jTmFtZTogc3RyaW5nKQ0KCWxvY2FsIFJlbW90ZSA9IEluc3RhbmNlLm5ldyhDbGFzc05hbWUpDQoJbG9jYWwgRnVuYyA9IFJlbW90ZVtGdW5jTmFtZV0NCglsb2NhbCBPcmlnaW5hbEZ1bmMNCg0KCS0tLy8gUmVtb3RlcyB3aWxsIHNoYXJlIHRoZSBzYW1lIGZ1bmN0aW9ucw0KCS0tLy8gCUZvciBleGFtcGxlIEZpcmVTZXJ2ZXIgd2lsbCBiZSBpZGVudGljYWwNCgktLS8vIEFkZGlvbmFsbHksIHRoaXMgaXMgZm9yIF9faW5kZXggY2FsbHMuDQoJLS0vLyAJQSBfX25hbWVjYWxsIGhvb2sgd2lsbCBub3QgZGV0ZWN0IHRoaXMNCglPcmlnaW5hbEZ1bmMgPSBzZWxmOkhvb2tGdW5jdGlvbihGdW5jLCBmdW5jdGlvbihzZWxmLCAuLi4pDQoJCS0tLy8gQ2hlY2sgaWYgdGhlIE9iamVjdCBpcyBhbGxvd2VkIA0KCQlpZiBub3QgUHJvY2VzczpSZW1vdGVBbGxvd2VkKHNlbGYsICJTZW5kIiwgRnVuY05hbWUpIHRoZW4gcmV0dXJuIGVuZA0KDQoJCS0tLy8gUHJvY2VzcyB0aGUgcmVtb3RlIGRhdGENCgkJcmV0dXJuIFByb2Nlc3NSZW1vdGUoT3JpZ2luYWxGdW5jLCAiX19pbmRleCIsIHNlbGYsIEZ1bmNOYW1lLCAuLi4pDQoJZW5kKQ0KZW5kDQoNCmZ1bmN0aW9uIEhvb2s6SG9va1JlbW90ZUluZGV4ZXMoKQ0KCWxvY2FsIFJlbW90ZUNsYXNzRGF0YSA9IFByb2Nlc3MuUmVtb3RlQ2xhc3NEYXRhDQoJZm9yIENsYXNzTmFtZSwgRGF0YSBpbiBSZW1vdGVDbGFzc0RhdGEgZG8NCgkJbG9jYWwgRnVuY05hbWUgPSBEYXRhLlNlbmRbMV0NCgkJc2VsZjpIb29rUmVtb3RlVHlwZUluZGV4KENsYXNzTmFtZSwgRnVuY05hbWUpDQoJZW5kDQplbmQNCg0KZnVuY3Rpb24gSG9vazpCZWdpbkhvb2tzKCkNCgktLS8vIEhvb2sgUmVtb3RlIGZ1bmN0aW9ucw0KCXNlbGY6SG9va1JlbW90ZUluZGV4ZXMoKQ0KDQoJLS0vLyBOYW1lY2FsbCBob29rDQoJbG9jYWwgT3JpZ2luYWxOYW1lQ2FsbA0KCU9yaWdpbmFsTmFtZUNhbGwgPSBzZWxmOkhvb2tNZXRhTWV0aG9kKGdhbWUsICJfX25hbWVjYWxsIiwgZnVuY3Rpb24oc2VsZiwgLi4uKQ0KCQlsb2NhbCBNZXRob2QgPSBnZXRuYW1lY2FsbG1ldGhvZCgpDQoJCXJldHVybiBQcm9jZXNzUmVtb3RlKE9yaWdpbmFsTmFtZUNhbGwsICJfX25hbWVjYWxsIiwgc2VsZiwgTWV0aG9kLCAuLi4pDQoJZW5kKQ0KDQoJTWVyZ2Uoc2VsZiwgew0KCQlPcmlnaW5hbE5hbWVjYWxsID0gT3JpZ2luYWxOYW1lQ2FsbCwNCgkJLS1PcmlnaW5hbEluZGV4ID0gT2kNCgl9KQ0KZW5kDQoNCmZ1bmN0aW9uIEhvb2s6SG9va0NsaWVudEludm9rZShSZW1vdGUsIE1ldGhvZCwgQ2FsbGJhY2spDQoJbG9jYWwgU3VjY2VzcywgRnVuY3Rpb24gPSBwY2FsbChmdW5jdGlvbigpDQoJCXJldHVybiBnZXRjYWxsYmFja3ZhbHVlKFJlbW90ZSwgTWV0aG9kKQ0KCWVuZCkNCg0KCS0tLy8gU29tZSBleGVjdXRvcnMgbGlrZSBQb3Rhc3NpdW0gd2lsbCB0aHJvdyBhIGVycm9yIGlmIHRoZSBDYWxsYmFjayB2YWx1ZSBpcyBuaWwNCglpZiBub3QgU3VjY2VzcyB0aGVuIHJldHVybiBlbmQNCglpZiBub3QgRnVuY3Rpb24gdGhlbiByZXR1cm4gZW5kDQoJDQoJLS0vLyBUZXN0IGhvb2tmdW5jdGlvbg0KCWxvY2FsIEhvb2tTdWNjZXNzID0gcGNhbGwoZnVuY3Rpb24oKQ0KCQlzZWxmOkhvb2tGdW5jdGlvbihGdW5jdGlvbiwgQ2FsbGJhY2spDQoJZW5kKQ0KCWlmIEhvb2tTdWNjZXNzIHRoZW4gcmV0dXJuIGVuZA0KDQoJLS0vLyBSZXBsYWNlIGNhbGxiYWNrIGZ1bmN0aW9uIG90aGVyd2lzZQ0KCVJlbW90ZVtNZXRob2RdID0gZnVuY3Rpb24oLi4uKQ0KCQlyZXR1cm4gSG9va01pZGRsZShGdW5jdGlvbiwgQ2FsbGJhY2ssIGZhbHNlLCAuLi4pDQoJZW5kDQplbmQNCg0KZnVuY3Rpb24gSG9vazpNdWx0aUNvbm5lY3QoUmVtb3RlcykNCglmb3IgXywgUmVtb3RlIGluIG5leHQsIFJlbW90ZXMgZG8NCgkJc2VsZjpDb25uZWN0Q2xpZW50UmVjaXZlKFJlbW90ZSkNCgllbmQNCmVuZA0KDQpmdW5jdGlvbiBIb29rOkNvbm5lY3RDbGllbnRSZWNpdmUoUmVtb3RlKQ0KCS0tLy8gQ2hlY2sgaWYgdGhlIFJlbW90ZSBjbGFzcyBpcyBhbGxvd2VkIGZvciByZWNlaXZpbmcNCglsb2NhbCBBbGxvd2VkID0gUHJvY2VzczpSZW1vdGVBbGxvd2VkKFJlbW90ZSwgIlJlY2VpdmUiKQ0KCWlmIG5vdCBBbGxvd2VkIHRoZW4gcmV0dXJuIGVuZA0KDQoJLS0vLyBDaGVjayBpZiB0aGUgT2JqZWN0IGhhcyBSZW1vdGUgY2xhc3MgZGF0YQ0KICAgIGxvY2FsIENsYXNzRGF0YSA9IFByb2Nlc3M6R2V0Q2xhc3NEYXRhKFJlbW90ZSkNCiAgICBsb2NhbCBJc1JlbW90ZUZ1bmN0aW9uID0gQ2xhc3NEYXRhLklzUmVtb3RlRnVuY3Rpb24NCglsb2NhbCBOb1JlY2l2ZUhvb2sgPSBDbGFzc0RhdGEuTm9SZWNpdmVIb29rDQogICAgbG9jYWwgTWV0aG9kID0gQ2xhc3NEYXRhLlJlY2VpdmVbMV0NCg0KCS0tLy8gQ2hlY2sgaWYgdGhlIFJlY2l2ZSBzaG91bGQgYmUgaG9va2VkDQoJaWYgTm9SZWNpdmVIb29rIHRoZW4gcmV0dXJuIGVuZA0KDQoJLS0vLyBOZXcgY2FsbGJhY2sgZnVuY3Rpb24NCglsb2NhbCBmdW5jdGlvbiBDYWxsYmFjayguLi4pDQogICAgICAgIHJldHVybiBQcm9jZXNzOlByb2Nlc3NSZW1vdGUoew0KICAgICAgICAgICAgTWV0aG9kID0gTWV0aG9kLA0KICAgICAgICAgICAgSXNSZWNlaXZlID0gdHJ1ZSwNCiAgICAgICAgICAgIE1ldGFNZXRob2QgPSAiQ29ubmVjdCIsDQoJCQlJc0V4cGxvaXQgPSBjaGVja2NhbGxlcigpDQogICAgICAgIH0sIFJlbW90ZSwgLi4uKQ0KCWVuZA0KDQoJLS0vLyBDb25uZWN0IHJlbW90ZQ0KCWlmIG5vdCBJc1JlbW90ZUZ1bmN0aW9uIHRoZW4NCiAgIAkJUmVtb3RlW01ldGhvZF06Q29ubmVjdChDYWxsYmFjaykNCgllbHNlIC0tIFJlbW90ZSBmdW5jdGlvbnMNCgkJc2VsZjpIb29rQ2xpZW50SW52b2tlKFJlbW90ZSwgTWV0aG9kLCBDYWxsYmFjaykNCgllbmQNCmVuZA0KDQpmdW5jdGlvbiBIb29rOkJlZ2luU2VydmljZShMaWJyYXJpZXMsIEV4dHJhRGF0YSwgQ2hhbm5lbElkLCAuLi4pDQoJLS0vLyBMaWJyYXJlaXMNCglsb2NhbCBSZXR1cm5TcG9vZnMgPSBMaWJyYXJpZXMuUmV0dXJuU3Bvb2ZzDQoJbG9jYWwgUHJvY2Vzc0xpYiA9IExpYnJhcmllcy5Qcm9jZXNzDQoJbG9jYWwgQ29tbXVuaWNhdGlvbiA9IExpYnJhcmllcy5Db21tdW5pY2F0aW9uDQoJbG9jYWwgR2VuZXJhdGlvbiA9IExpYnJhcmllcy5HZW5lcmF0aW9uDQoJbG9jYWwgQ29uZmlnID0gTGlicmFyaWVzLkNvbmZpZw0KDQoJLS0vLyBDaGVjayBmb3IgY29uZmlndXJhdGlvbiBvdmVyd3JpdGVzDQoJUHJvY2Vzc0xpYjpDaGVja0NvbmZpZyhDb25maWcpDQoNCgktLS8vIEluaXQgZGF0YQ0KCWxvY2FsIEluaXREYXRhID0gew0KCQlNb2R1bGVzID0gew0KCQkJUmV0dXJuU3Bvb2ZzID0gUmV0dXJuU3Bvb2ZzLA0KCQkJR2VuZXJhdGlvbiA9IEdlbmVyYXRpb24sDQoJCQlDb21tdW5pY2F0aW9uID0gQ29tbXVuaWNhdGlvbiwNCgkJCVByb2Nlc3MgPSBQcm9jZXNzTGliLA0KCQkJQ29uZmlnID0gQ29uZmlnLA0KCQkJSG9vayA9IHNlbGYNCgkJfSwNCgkJU2VydmljZXMgPSBzZXRtZXRhdGFibGUoe30sIHsNCgkJCV9faW5kZXggPSBmdW5jdGlvbihzZWxmLCBOYW1lOiBzdHJpbmcpOiBJbnN0YW5jZQ0KCQkJCWxvY2FsIFNlcnZpY2UgPSBnYW1lOkdldFNlcnZpY2UoTmFtZSkNCgkJCQlyZXR1cm4gY2xvbmVyZWYoU2VydmljZSkNCgkJCWVuZCwNCgkJfSkNCgl9DQoNCgktLS8vIEluaXQgbGlicmFyaWVzDQoJQ29tbXVuaWNhdGlvbjpJbml0KEluaXREYXRhKQ0KCVByb2Nlc3NMaWI6SW5pdChJbml0RGF0YSkNCg0KCS0tLy8gQ29tbXVuaWNhdGlvbiBjb25maWd1cmF0aW9uDQoJbG9jYWwgQ2hhbm5lbCwgSXNXcmFwcGVkID0gQ29tbXVuaWNhdGlvbjpHZXRDb21tQ2hhbm5lbChDaGFubmVsSWQpDQoJQ29tbXVuaWNhdGlvbjpTZXRDaGFubmVsKENoYW5uZWwpDQoJQ29tbXVuaWNhdGlvbjpBZGRUeXBlQ2FsbGJhY2tzKHsNCgkJWyJSZW1vdGVEYXRhIl0gPSBmdW5jdGlvbihJZDogc3RyaW5nLCBSZW1vdGVEYXRhKQ0KCQkJUHJvY2Vzc0xpYjpTZXRSZW1vdGVEYXRhKElkLCBSZW1vdGVEYXRhKQ0KCQllbmQsDQoJCVsiQWxsUmVtb3RlRGF0YSJdID0gZnVuY3Rpb24oS2V5OiBzdHJpbmcsIFZhbHVlKQ0KCQkJUHJvY2Vzc0xpYjpTZXRBbGxSZW1vdGVEYXRhKEtleSwgVmFsdWUpDQoJCWVuZCwNCgkJWyJVcGRhdGVTcG9vZnMiXSA9IGZ1bmN0aW9uKENvbnRlbnQ6IHN0cmluZykNCgkJCWxvY2FsIFNwb29mcyA9IGxvYWRzdHJpbmcoQ29udGVudCkoKQ0KCQkJUHJvY2Vzc0xpYjpTZXROZXdSZXR1cm5TcG9vZnMoU3Bvb2ZzKQ0KCQllbmQsDQoJCVsiQmVnaW5Ib29rcyJdID0gZnVuY3Rpb24oQ29uZmlnKQ0KCQkJaWYgQ29uZmlnLlBhdGNoRnVuY3Rpb25zIHRoZW4NCgkJCQlzZWxmOlBhdGNoRnVuY3Rpb25zKCkNCgkJCWVuZA0KCQkJc2VsZjpCZWdpbkhvb2tzKCkNCgkJCUNvbW11bmljYXRpb246Q29uc29sZVByaW50KCJIb29rcyBsb2FkZWQiKQ0KCQllbmQNCgl9KQ0KCQ0KCS0tLy8gUHJvY2VzcyBjb25maWd1cmF0aW9uDQoJUHJvY2Vzc0xpYjpTZXRDaGFubmVsKENoYW5uZWwsIElzV3JhcHBlZCkNCglQcm9jZXNzTGliOlNldEV4dHJhRGF0YShFeHRyYURhdGEpDQoNCgktLS8vIEhvb2sgY29uZmlndXJhdGlvbg0KCXNlbGY6SW5pdChJbml0RGF0YSkNCg0KCWlmIEV4dHJhRGF0YSBhbmQgRXh0cmFEYXRhLklzQWN0b3IgdGhlbg0KCQlDb21tdW5pY2F0aW9uOkNvbnNvbGVQcmludCgiQWN0b3IgY29ubmVjdGVkISIpDQoJZW5kDQplbmQNCg0KZnVuY3Rpb24gSG9vazpMb2FkTWV0YUhvb2tzKEFjdG9yQ29kZTogc3RyaW5nLCBDaGFubmVsSWQ6IG51bWJlcikNCgktLS8vIEhvb2sgYWN0b3JzDQoJaWYgbm90IENvbmZpZ3VyYXRpb24uTm9BY3RvcnMgdGhlbg0KCQlzZWxmOlJ1bk9uQWN0b3JzKEFjdG9yQ29kZSwgQ2hhbm5lbElkKQ0KCWVuZA0KDQoJLS0vLyBIb29rIGN1cnJlbnQgdGhyZWFkDQoJc2VsZjpCZWdpblNlcnZpY2UoTW9kdWxlcywgbmlsLCBDaGFubmVsSWQpIA0KZW5kDQoNCmZ1bmN0aW9uIEhvb2s6TG9hZFJlY2VpdmVIb29rcygpDQoJbG9jYWwgTm9SZWNlaXZlSG9va2luZyA9IENvbmZpZy5Ob1JlY2VpdmVIb29raW5nDQoJbG9jYWwgQmxhY2tMaXN0ZWRTZXJ2aWNlcyA9IENvbmZpZy5CbGFja0xpc3RlZFNlcnZpY2VzDQoNCglpZiBOb1JlY2VpdmVIb29raW5nIHRoZW4gcmV0dXJuIGVuZA0KDQoJLS0vLyBSZW1vdGUgYWRkZWQNCglnYW1lLkRlc2NlbmRhbnRBZGRlZDpDb25uZWN0KGZ1bmN0aW9uKFJlbW90ZSkgLS0gVE9ETw0KCQlzZWxmOkNvbm5lY3RDbGllbnRSZWNpdmUoUmVtb3RlKQ0KCWVuZCkNCg0KCS0tLy8gQ29sbGVjdCByZW1vdGVzIHdpdGggbmlsIHBhcmVudHMNCglzZWxmOk11bHRpQ29ubmVjdChnZXRuaWxpbnN0YW5jZXMoKSkNCg0KCS0tLy8gU2VhcmNoIGZvciByZW1vdGVzDQoJZm9yIF8sIFNlcnZpY2UgaW4gbmV4dCwgZ2FtZTpHZXRDaGlsZHJlbigpIGRvDQoJCWlmIHRhYmxlLmZpbmQoQmxhY2tMaXN0ZWRTZXJ2aWNlcywgU2VydmljZS5DbGFzc05hbWUpIHRoZW4gY29udGludWUgZW5kDQoJCXNlbGY6TXVsdGlDb25uZWN0KFNlcnZpY2U6R2V0RGVzY2VuZGFudHMoKSkNCgllbmQNCmVuZA0KDQpmdW5jdGlvbiBIb29rOkxvYWRIb29rcyhBY3RvckNvZGU6IHN0cmluZywgQ2hhbm5lbElkOiBudW1iZXIpDQoJc2VsZjpMb2FkTWV0YUhvb2tzKEFjdG9yQ29kZSwgQ2hhbm5lbElkKQ0KCXNlbGY6TG9hZFJlY2VpdmVIb29rcygpDQplbmQNCg0KcmV0dXJuIEhvb2sNCg==]]
},Flags={'base64',
[[dHlwZSBGbGFnVmFsdWUgPSBib29sZWFufG51bWJlcnxhbnkNCnR5cGUgRmxhZyA9IHsNCiAgICBWYWx1ZTogRmxhZ1ZhbHVlLA0KICAgIExhYmVsOiBzdHJpbmcsDQogICAgQ2F0ZWdvcnk6IHN0cmluZw0KfQ0KdHlwZSBGbGFncyA9IHsNCiAgICBbc3RyaW5nXTogRmxhZw0KfQ0KdHlwZSB0YWJsZSA9IHsNCiAgICBbYW55XTogYW55DQp9DQoNCmxvY2FsIE1vZHVsZSA9IHsNCiAgICBGbGFncyA9IHsNCiAgICAgICAgLS0gUHJldmVudFJlbmFtaW5nID0gew0KICAgICAgICAtLSAgICAgVmFsdWUgPSBmYWxzZSwNCiAgICAgICAgLS0gICAgIExhYmVsID0gIk5vIHJlbmFtaW5nIiwNCiAgICAgICAgLS0gfSwNCiAgICAgICAgLS0gUHJldmVudFBhcmVudGluZyA9IHsNCiAgICAgICAgLS0gICAgIFZhbHVlID0gZmFsc2UsDQogICAgICAgIC0tICAgICBMYWJlbCA9ICJObyBwYXJlbnRpbmciLA0KICAgICAgICAtLSB9LA0KICAgICAgICBOb0NvbW1lbnRzID0gew0KICAgICAgICAgICAgVmFsdWUgPSBmYWxzZSwNCiAgICAgICAgICAgIExhYmVsID0gIk5vIGNvbW1lbnRzIiwNCiAgICAgICAgfSwNCiAgICAgICAgU2VsZWN0TmV3ZXN0ID0gew0KICAgICAgICAgICAgVmFsdWUgPSBmYWxzZSwNCiAgICAgICAgICAgIExhYmVsID0gIkF1dG8gc2VsZWN0IG5ld2VzdCIsDQogICAgICAgIH0sDQogICAgICAgIERlY29tcGlsZVBvcG91dCA9IHsgLS0gTG92cmUgU0hVU0gNCiAgICAgICAgICAgIFZhbHVlID0gZmFsc2UsDQogICAgICAgICAgICBMYWJlbCA9ICJQb3Atb3V0IGRlY29tcGlsZXMiLA0KICAgICAgICB9LA0KICAgICAgICBJZ25vcmVOaWwgPSB7DQogICAgICAgICAgICBWYWx1ZSA9IHRydWUsDQogICAgICAgICAgICBMYWJlbCA9ICJJZ25vcmUgbmlsIHBhcmVudHMiLA0KICAgICAgICB9LA0KICAgICAgICBMb2dFeHBsb2l0ID0gew0KICAgICAgICAgICAgVmFsdWUgPSB0cnVlLA0KICAgICAgICAgICAgTGFiZWwgPSAiTG9nIGV4cGxvaXQgY2FsbHMiLA0KICAgICAgICB9LA0KICAgICAgICBMb2dSZWNpdmVzID0gew0KICAgICAgICAgICAgVmFsdWUgPSB0cnVlLA0KICAgICAgICAgICAgTGFiZWwgPSAiTG9nIHJlY2VpdmVzIiwNCiAgICAgICAgfSwNCiAgICAgICAgUGF1c2VkID0gew0KICAgICAgICAgICAgVmFsdWUgPSBmYWxzZSwNCiAgICAgICAgICAgIExhYmVsID0gIlBhdXNlZCIsDQogICAgICAgICAgICBLZXliaW5kID0gRW51bS5LZXlDb2RlLlENCiAgICAgICAgfSwNCiAgICAgICAgS2V5YmluZHNFbmFibGVkID0gew0KICAgICAgICAgICAgVmFsdWUgPSB0cnVlLA0KICAgICAgICAgICAgTGFiZWwgPSAiS2V5YmluZHMgRW5hYmxlZCINCiAgICAgICAgfSwNCiAgICAgICAgRmluZFN0cmluZ0Zvck5hbWUgPSB7DQogICAgICAgICAgICBWYWx1ZSA9IHRydWUsDQogICAgICAgICAgICBMYWJlbCA9ICJGaW5kIGFyZyBmb3IgbmFtZSINCiAgICAgICAgfSwNCiAgICAgICAgVWlWaXNpYmxlID0gew0KICAgICAgICAgICAgVmFsdWUgPSB0cnVlLA0KICAgICAgICAgICAgTGFiZWwgPSAiVUkgVmlzaWJsZSIsDQogICAgICAgICAgICBLZXliaW5kID0gRW51bS5LZXlDb2RlLlANCiAgICAgICAgfSwNCiAgICAgICAgTm9UcmVlTm9kZXMgPSB7DQogICAgICAgICAgICBWYWx1ZSA9IGZhbHNlLA0KICAgICAgICAgICAgTGFiZWwgPSAiTm8gZ3JvdXBpbmciDQogICAgICAgIH0sDQogICAgICAgIFRhYmxlQXJncyA9IHsNCiAgICAgICAgICAgIFZhbHVlID0gZmFsc2UsDQogICAgICAgICAgICBMYWJlbCA9ICJUYWJsZSBhcmdzIg0KICAgICAgICB9LA0KICAgICAgICBOb1ZhcmlhYmxlcyA9IHsNCiAgICAgICAgICAgIFZhbHVlID0gZmFsc2UsDQogICAgICAgICAgICBMYWJlbCA9ICJObyBjb21wcmVzc2lvbiINCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KZnVuY3Rpb24gTW9kdWxlOkdldEZsYWdWYWx1ZShOYW1lOiBzdHJpbmcpOiBGbGFnVmFsdWUNCiAgICBsb2NhbCBGbGFnID0gc2VsZjpHZXRGbGFnKE5hbWUpDQogICAgcmV0dXJuIEZsYWcuVmFsdWUNCmVuZA0KDQpmdW5jdGlvbiBNb2R1bGU6U2V0RmxhZ1ZhbHVlKE5hbWU6IHN0cmluZywgVmFsdWU6IEZsYWdWYWx1ZSkNCiAgICBsb2NhbCBGbGFnID0gc2VsZjpHZXRGbGFnKE5hbWUpDQogICAgRmxhZy5WYWx1ZSA9IFZhbHVlDQplbmQNCg0KZnVuY3Rpb24gTW9kdWxlOlNldEZsYWdDYWxsYmFjayhOYW1lOiBzdHJpbmcsIENhbGxiYWNrOiAoLi4uYW55KSAtPiAuLi5hbnkpDQogICAgbG9jYWwgRmxhZyA9IHNlbGY6R2V0RmxhZyhOYW1lKQ0KICAgIEZsYWcuQ2FsbGJhY2sgPSBDYWxsYmFjaw0KZW5kDQoNCmZ1bmN0aW9uIE1vZHVsZTpTZXRGbGFnQ2FsbGJhY2tzKERpY3Q6IHt9KQ0KICAgIGZvciBOYW1lLCBDYWxsYmFjazogKC4uLmFueSkgLT4gLi4uYW55IGluIG5leHQsIERpY3QgZG8gDQogICAgICAgIHNlbGY6U2V0RmxhZ0NhbGxiYWNrKE5hbWUsIENhbGxiYWNrKQ0KICAgIGVuZA0KZW5kDQoNCmZ1bmN0aW9uIE1vZHVsZTpHZXRGbGFnKE5hbWU6IHN0cmluZyk6IEZsYWcNCiAgICBsb2NhbCBBbGxGbGFncyA9IHNlbGY6R2V0RmxhZ3MoKQ0KICAgIGxvY2FsIEZsYWcgPSBBbGxGbGFnc1tOYW1lXQ0KICAgIGFzc2VydChGbGFnLCAiRmxhZyBkb2VzIG5vdCBleGlzdCEiKQ0KICAgIHJldHVybiBGbGFnDQplbmQNCg0KZnVuY3Rpb24gTW9kdWxlOkFkZEZsYWcoTmFtZTogc3RyaW5nLCBGbGFnOiBGbGFnKQ0KICAgIGxvY2FsIEFsbEZsYWdzID0gc2VsZjpHZXRGbGFncygpDQogICAgQWxsRmxhZ3NbTmFtZV0gPSBGbGFnDQplbmQNCg0KZnVuY3Rpb24gTW9kdWxlOkdldEZsYWdzKCk6IEZsYWdzDQogICAgcmV0dXJuIHNlbGYuRmxhZ3MNCmVuZA0KDQpyZXR1cm4gTW9kdWxl]]
},Ui={'base64',
[[bG9jYWwgVWkgPSB7DQoJRGVmYXVsdEVkaXRvckNvbnRlbnQgPSBbPVstLVtbDQoJU2lnbWEgU3B5LCB3cml0dGVuIGJ5IGRlcHNvDQoJSG9va3MgcmV3cml0dGVuIGFuZCBtYW55IG1vcmUgZml4ZXMhDQoNCglEaXNjb3JkOiBodHRwczovL2Rpc2NvcmQuZ2cvYmtVa20ydlNidg0KXV1dPV0sDQoJTG9nTGltaXQgPSAxMDAsDQogICAgU2Vhc29uTGFiZWxzID0geyANCiAgICAgICAgSmFudWFyeSA9ICLim4QgJXMg4puEIiwgDQogICAgICAgIEZlYnJ1YXJ5ID0gIvCfjKjvuI8gJXMg8J+PgiIsIA0KICAgICAgICBNYXJjaCA9ICLwn4y5ICVz8J+MuiAiLCANCiAgICAgICAgQXByaWwgPSAi8J+QoyAlcyDinJ3vuI8iLCANCiAgICAgICAgTWF5ID0gIvCfkJ0gJXMg8J+MniIsIA0KICAgICAgICBKdW5lID0gIvCfjLIgJXMg8J+llSIsIA0KICAgICAgICBKdWx5ID0gIvCfjIogJXMg8J+MhSIsIA0KICAgICAgICBBdWd1c3QgPSAi4piA77iPICVzIPCfjJ4iLCANCiAgICAgICAgU2VwdGVtYmVyID0gIvCfjYEgJXMg8J+NgSIsIA0KICAgICAgICBPY3RvYmVyID0gIvCfjoMgJXMg8J+OgyIsIA0KICAgICAgICBOb3ZlbWJlciA9ICLwn42CICVzIPCfjYIiLCANCiAgICAgICAgRGVjZW1iZXIgPSAi8J+OhCAlcyDwn46BIg0KICAgIH0sDQoJU2NhbGVzID0gew0KCQlbIk1vYmlsZSJdID0gVURpbTIuZnJvbU9mZnNldCg0ODAsIDI4MCksDQoJCVsiRGVza3RvcCJdID0gVURpbTIuZnJvbU9mZnNldCg2MDAsIDQwMCksDQoJfSwNCiAgICBCYXNlQ29uZmlnID0gew0KICAgICAgICBUaGVtZSA9ICJTaWdtYVNweSIsDQogICAgICAgIE5vU2Nyb2xsID0gdHJ1ZSwNCiAgICB9LA0KCU9wdGlvblR5cGVzID0gew0KCQlib29sZWFuID0gIkNoZWNrYm94IiwNCgl9LA0KCURpc3BsYXlSZW1vdGVJbmZvID0gew0KCQkiTWV0YU1ldGhvZCIsDQoJCSJNZXRob2QiLA0KCQkiUmVtb3RlIiwNCgkJIkNhbGxpbmdTY3JpcHQiLA0KCQkiSXNBY3RvciIsDQoJCSJJZCINCgl9LA0KDQogICAgV2luZG93ID0gbmlsLA0KICAgIFJhbmRvbVNlZWQgPSBSYW5kb20ubmV3KHRpY2soKSksDQoJTG9ncyA9IHNldG1ldGF0YWJsZSh7fSwge19fbW9kZSA9ICJrIn0pLA0KCUxvZ1F1ZXVlID0gc2V0bWV0YXRhYmxlKHt9LCB7X19tb2RlID0gInYifSksDQp9IA0KDQp0eXBlIHRhYmxlID0gew0KCVthbnldOiBhbnkNCn0NCg0KdHlwZSBMb2cgPSB7DQoJUmVtb3RlOiBJbnN0YW5jZSwNCglNZXRob2Q6IHN0cmluZywNCglBcmdzOiB0YWJsZSwNCglJc1JlY2VpdmU6IGJvb2xlYW4/LA0KCU1ldGFNZXRob2Q6IHN0cmluZz8sDQoJT3JpZ25hbEZ1bmM6ICgoLi4uYW55KSAtPiAuLi5hbnkpPywNCglDYWxsaW5nU2NyaXB0OiBJbnN0YW5jZT8sDQoJQ2FsbGluZ0Z1bmN0aW9uOiAoKC4uLmFueSkgLT4gLi4uYW55KT8sDQoJQ2xhc3NEYXRhOiB0YWJsZT8sDQoJUmV0dXJuVmFsdWVzOiB0YWJsZT8sDQoJUmVtb3RlRGF0YTogdGFibGU/LA0KCUlkOiBzdHJpbmcsDQoJU2VsZWN0YWJsZTogdGFibGUsDQoJSGVhZGVyRGF0YTogdGFibGUsDQoJVmFsdWVTd2FwczogdGFibGUsDQoJVGltZXN0YW1wOiBudW1iZXIsDQoJSXNFeHBsb2l0OiBib29sZWFuDQp9DQoNCi0tLy8gQ29tcGF0aWJpbGl0eQ0KbG9jYWwgU2V0Q2xpcGJvYXJkID0gc2V0Y2xpcGJvYXJkIG9yIHRvY2xpcGJvYXJkIG9yIHNldF9jbGlwYm9hcmQNCg0KLS0vLyBMaWJyYXJpZXMNCmxvY2FsIFJlR3VpID0gbG9hZHN0cmluZyhnYW1lOkh0dHBHZXQoJ2h0dHBzOi8vZ2l0aHViLmNvbS9kZXB0aHNvL0RlYXItUmVHdWkvcmF3L3JlZnMvaGVhZHMvbWFpbi9SZUd1aS5sdWEnKSwgIlJlR3VpIikoKQ0KDQotLS8vIE1vZHVsZXMNCmxvY2FsIEZsYWdzDQpsb2NhbCBHZW5lcmF0aW9uDQpsb2NhbCBQcm9jZXNzDQpsb2NhbCBIb29rIA0KbG9jYWwgQ29uZmlnDQpsb2NhbCBDb21tdW5pY2F0aW9uDQpsb2NhbCBGaWxlcw0KDQpsb2NhbCBBY3RpdmVEYXRhID0gbmlsDQpsb2NhbCBSZW1vdGVzQ291bnQgPSAwDQoNCmxvY2FsIFRleHRGb250ID0gRm9udC5mcm9tRW51bShFbnVtLkZvbnQuQ29kZSkNCmxvY2FsIEZvbnRTdWNjZXNzID0gZmFsc2UNCmxvY2FsIENvbW1DaGFubmVsDQoNCmZ1bmN0aW9uIFVpOkluaXQoRGF0YSkNCiAgICBsb2NhbCBNb2R1bGVzID0gRGF0YS5Nb2R1bGVzDQoNCgktLS8vIE1vZHVsZXMNCglGbGFncyA9IE1vZHVsZXMuRmxhZ3MNCglHZW5lcmF0aW9uID0gTW9kdWxlcy5HZW5lcmF0aW9uDQoJUHJvY2VzcyA9IE1vZHVsZXMuUHJvY2Vzcw0KCUhvb2sgPSBNb2R1bGVzLkhvb2sNCglDb25maWcgPSBNb2R1bGVzLkNvbmZpZw0KCUNvbW11bmljYXRpb24gPSBNb2R1bGVzLkNvbW11bmljYXRpb24NCglGaWxlcyA9IE1vZHVsZXMuRmlsZXMNCg0KCS0tLy8gUmVHdWkNCglzZWxmOkxvYWRGb250KCkNCglzZWxmOkxvYWRSZUd1aSgpDQoJc2VsZjpDaGVja1NjYWxlKCkNCmVuZA0KDQpmdW5jdGlvbiBVaTpTZXRDb21tQ2hhbm5lbChOZXdDb21tQ2hhbm5lbDogQmluZGFibGVFdmVudCkNCglDb21tQ2hhbm5lbCA9IE5ld0NvbW1DaGFubmVsDQplbmQNCg0KZnVuY3Rpb24gVWk6Q2hlY2tTY2FsZSgpDQoJbG9jYWwgQmFzZUNvbmZpZyA9IHNlbGYuQmFzZUNvbmZpZw0KCWxvY2FsIFNjYWxlcyA9IHNlbGYuU2NhbGVzDQoNCglsb2NhbCBJc01vYmlsZSA9IFJlR3VpOklzTW9iaWxlRGV2aWNlKCkNCglsb2NhbCBEZXZpY2UgPSBJc01vYmlsZSBhbmQgIk1vYmlsZSIgb3IgIkRlc2t0b3AiDQoNCglCYXNlQ29uZmlnLlNpemUgPSBTY2FsZXNbRGV2aWNlXQ0KZW5kDQoNCmZ1bmN0aW9uIFVpOlNldENsaXBib2FyZChDb250ZW50OiBzdHJpbmcpDQoJU2V0Q2xpcGJvYXJkKENvbnRlbnQpDQplbmQNCg0KZnVuY3Rpb24gVWk6VHVyblNlYXNvbmFsKFRleHQ6IHN0cmluZyk6IHN0cmluZw0KICAgIGxvY2FsIFNlYXNvbkxhYmVscyA9IHNlbGYuU2Vhc29uTGFiZWxzDQogICAgbG9jYWwgTW9udGggPSBvcy5kYXRlKCIlQiIpDQogICAgbG9jYWwgQmFzZSA9IFNlYXNvbkxhYmVsc1tNb250aF0NCg0KICAgIHJldHVybiBCYXNlOmZvcm1hdChUZXh0KQ0KZW5kDQoNCmZ1bmN0aW9uIFVpOkxvYWRGb250KCkNCglsb2NhbCBGb250RmlsZSA9IHNlbGYuRm9udEpzb25GaWxlDQoNCgktLS8vIEdldCBGb250RmFjZSBBc3NldElkDQoJbG9jYWwgQXNzZXRJZCA9IEZpbGVzOkxvYWRDdXN0b21hc3NldChGb250RmlsZSkNCglpZiBub3QgQXNzZXRJZCB0aGVuIHJldHVybiBlbmQNCg0KCS0tLy8gQ3JlYXRlIGN1c3RvbSBGb250RmFjZQ0KCWxvY2FsIE5ld0ZvbnQgPSBGb250Lm5ldyhBc3NldElkKQ0KCVRleHRGb250ID0gTmV3Rm9udA0KCUZvbnRTdWNjZXNzID0gdHJ1ZQ0KZW5kDQoNCmZ1bmN0aW9uIFVpOlNldEZvbnRGaWxlKEZvbnRGaWxlOiBzdHJpbmcpDQoJc2VsZi5Gb250SnNvbkZpbGUgPSBGb250RmlsZQ0KZW5kDQoNCmZ1bmN0aW9uIFVpOkZvbnRXYXNTdWNjZXNzZnVsKCkNCglpZiBGb250U3VjY2VzcyB0aGVuIHJldHVybiBlbmQNCg0KCS0tLy8gRXJyb3IgbWVzc2FnZQ0KCXNlbGY6U2hvd01vZGFsKHsNCgkJIlVuZm9ydHVuYXRlbHkgeW91ciBleGVjdXRvciB3YXMgdW5hYmxlIHRvIGRvd25sb2FkIHRoZSBmb250IGFuZCB0aGVyZWZvcmUgc3dpdGNoZWQgdG8gdGhlIERhcmsgdGhlbWUiLA0KCQkiXG5JZiB5b3Ugd291bGQgbGlrZSB0byB1c2UgdGhlIEltR3VpIHRoZW1lLCBcbnBsZWFzZSBkb3dubG9hZCB0aGUgZm9udCAoYXNzZXRzL1Byb2dneUNsZWFuLnR0ZikiLA0KCQkiYW5kIHB1dCBwdXQgaXQgaW4geW91ciB3b3Jrc3BhY2UgZm9sZGVyXG4oU2lnbWEgU3B5L2Fzc2V0cykiDQoJfSkNCmVuZA0KDQpmdW5jdGlvbiBVaTpMb2FkUmVHdWkoKQ0KCWxvY2FsIFRoZW1lQ29uZmlnID0gQ29uZmlnLlRoZW1lQ29uZmlnDQoJVGhlbWVDb25maWcuVGV4dEZvbnQgPSBUZXh0Rm9udA0KDQoJLS0vLyBSZUd1aQ0KCVJlR3VpOkRlZmluZVRoZW1lKCJTaWdtYVNweSIsIFRoZW1lQ29uZmlnKQ0KZW5kDQoNCnR5cGUgQ3JlYXRlQnV0dG9ucyA9IHsNCglCYXNlOiB0YWJsZT8sDQoJQnV0dG9uczogdGFibGUsDQoJTm9UYWJsZTogYm9vbGVhbj8NCn0NCmZ1bmN0aW9uIFVpOkNyZWF0ZUJ1dHRvbnMoUGFyZW50LCBEYXRhOiBDcmVhdGVCdXR0b25zKQ0KCWxvY2FsIEJhc2UgPSBEYXRhLkJhc2Ugb3Ige30NCglsb2NhbCBCdXR0b25zID0gRGF0YS5CdXR0b25zDQoJbG9jYWwgTm9UYWJsZSA9IERhdGEuTm9UYWJsZQ0KDQoJLS0vLyBDcmVhdGUgdGFibGUgbGF5b3V0DQoJaWYgbm90IE5vVGFibGUgdGhlbg0KCQlQYXJlbnQgPSBQYXJlbnQ6VGFibGUoew0KCQkJTWF4Q29sdW1ucyA9IDMNCgkJfSk6TmV4dFJvdygpDQoJZW5kDQoNCgktLS8vIENyZWF0ZSBidXR0b25zDQoJZm9yIF8sIEJ1dHRvbiBpbiBuZXh0LCBCdXR0b25zIGRvDQoJCWxvY2FsIENvbnRhaW5lciA9IFBhcmVudA0KCQlpZiBub3QgTm9UYWJsZSB0aGVuDQoJCQlDb250YWluZXIgPSBQYXJlbnQ6TmV4dENvbHVtbigpDQoJCWVuZA0KDQoJCVJlR3VpOkNoZWNrQ29uZmlnKEJ1dHRvbiwgQmFzZSkNCgkJQ29udGFpbmVyOkJ1dHRvbihCdXR0b24pDQoJZW5kDQplbmQNCg0KZnVuY3Rpb24gVWk6Q3JlYXRlV2luZG93KFdpbmRvd0NvbmZpZykNCiAgICBsb2NhbCBCYXNlQ29uZmlnID0gc2VsZi5CYXNlQ29uZmlnDQoJbG9jYWwgQ29uZmlnID0gUHJvY2VzczpEZWVwQ2xvbmVUYWJsZShCYXNlQ29uZmlnKQ0KCVByb2Nlc3M6TWVyZ2UoQ29uZmlnLCBXaW5kb3dDb25maWcpDQoNCgktLS8vIENyZWF0ZSBXaW5kb3cNCglsb2NhbCBXaW5kb3cgPSBSZUd1aTpXaW5kb3coQ29uZmlnKQ0KDQoJLS0vLyBTd2l0Y2ggdG8gRGFya1RoZW1lIGluc3RlYWQgb2YgdGhlIEltR3VpIHRoZW1lIGlmIHRoZSBmb250IGNhbm5vdCBiZSBsb2FkZWQNCglpZiBub3QgRm9udFN1Y2Nlc3MgdGhlbiANCgkJV2luZG93OlNldFRoZW1lKCJEYXJrVGhlbWUiKQ0KCWVuZA0KCQ0KCS0tLy8gQ3JlYXRlIFdpbmRvdw0KCXJldHVybiBXaW5kb3cNCmVuZA0KDQp0eXBlIEFza0NvbmZpZyA9IHsNCglUaXRsZTogc3RyaW5nLA0KCUNvbnRlbnQ6IHRhYmxlLA0KCU9wdGlvbnM6IHRhYmxlDQp9DQpmdW5jdGlvbiBVaTpBc2tVc2VyKENvbmZpZzogQXNrQ29uZmlnKTogc3RyaW5nDQoJbG9jYWwgV2luZG93ID0gc2VsZi5XaW5kb3cNCglsb2NhbCBBbnN3ZXJlZCA9IGZhbHNlDQoNCgktLS8vIENyZWF0ZSBtb2RhbA0KCWxvY2FsIE1vZGFsV2luZG93ID0gV2luZG93OlBvcHVwTW9kYWwoew0KCQlUaXRsZSA9IENvbmZpZy5UaXRsZQ0KCX0pDQoJTW9kYWxXaW5kb3c6TGFiZWwoew0KCQlUZXh0ID0gdGFibGUuY29uY2F0KENvbmZpZy5Db250ZW50LCAiXG4iKSwNCgkJVGV4dFdyYXBwZWQgPSB0cnVlDQoJfSkNCglNb2RhbFdpbmRvdzpTZXBhcmF0b3IoKQ0KDQoJLS0vLyBBbnN3ZXJzDQoJbG9jYWwgUm93ID0gTW9kYWxXaW5kb3c6Um93KHsNCgkJRXhwYW5kZWQgPSB0cnVlDQoJfSkNCglmb3IgXywgQW5zd2VyIGluIG5leHQsIENvbmZpZy5PcHRpb25zIGRvDQoJCVJvdzpCdXR0b24oew0KCQkJVGV4dCA9IEFuc3dlciwNCgkJCUNhbGxiYWNrID0gZnVuY3Rpb24oKQ0KCQkJCUFuc3dlcmVkID0gQW5zd2VyDQoJCQkJTW9kYWxXaW5kb3c6Q2xvc2VQb3B1cCgpDQoJCQllbmQsDQoJCX0pDQoJZW5kDQoNCglyZXBlYXQgd2FpdCgpIHVudGlsIEFuc3dlcmVkDQoJcmV0dXJuIEFuc3dlcmVkDQplbmQNCg0KZnVuY3Rpb24gVWk6Q3JlYXRlTWFpbldpbmRvdygpDQoJbG9jYWwgV2luZG93ID0gc2VsZjpDcmVhdGVXaW5kb3coKQ0KCXNlbGYuV2luZG93ID0gV2luZG93DQoNCgktLS8vIENoZWNrIGlmIHRoZSBmb250IHdhcyBzdWNjZXNzZnVsbHkgZG93bmxvYWRlZA0KCXNlbGY6Rm9udFdhc1N1Y2Nlc3NmdWwoKQ0KCXNlbGY6QXVyYUNvdW50ZXJTZXJ2aWNlKCkNCg0KCS0tLy8gVWlWaXNpYmxlIGZsYWcgY2FsbGJhY2sNCglGbGFnczpTZXRGbGFnQ2FsbGJhY2soIlVpVmlzaWJsZSIsIGZ1bmN0aW9uKHNlbGYsIFZpc2libGUpDQoJCVdpbmRvdzpTZXRWaXNpYmxlKFZpc2libGUpDQoJZW5kKQ0KDQoJcmV0dXJuIFdpbmRvdw0KZW5kDQoNCmZ1bmN0aW9uIFVpOlNob3dNb2RhbChMaW5lczogdGFibGUpDQoJbG9jYWwgV2luZG93ID0gc2VsZi5XaW5kb3cNCglsb2NhbCBNZXNzYWdlID0gdGFibGUuY29uY2F0KExpbmVzLCAiXG4iKQ0KDQoJLS0vLyBNb2RhbCBXaW5kb3cNCglsb2NhbCBNb2RhbFdpbmRvdyA9IFdpbmRvdzpQb3B1cE1vZGFsKHsNCgkJVGl0bGUgPSAiU2lnbWEgU3B5Ig0KCX0pDQoJTW9kYWxXaW5kb3c6TGFiZWwoew0KCQlUZXh0ID0gTWVzc2FnZSwNCgkJUmljaFRleHQgPSB0cnVlLA0KCQlUZXh0V3JhcHBlZCA9IHRydWUNCgl9KQ0KCU1vZGFsV2luZG93OkJ1dHRvbih7DQoJCVRleHQgPSAiT2theSIsDQoJCUNhbGxiYWNrID0gZnVuY3Rpb24oKQ0KCQkJTW9kYWxXaW5kb3c6Q2xvc2VQb3B1cCgpDQoJCWVuZCwNCgl9KQ0KZW5kDQoNCmZ1bmN0aW9uIFVpOlNob3dVbnN1cHBvcnRlZEV4ZWN1dG9yKE5hbWU6IHN0cmluZykNCglVaTpTaG93TW9kYWwoew0KCQkiVW5mb3J0dW5hdGVseSBTaWdtYSBTcHkgaXMgbm90IHN1cHBvcnRlZCBvbiB5b3VyIGV4ZWN1dG9yIiwNCgkJIlRoZSBiZXN0IGZyZWUgb3B0aW9uIGlzIFN3aWZ0IChkaXNjb3JkLmdnL2dldHN3aWZ0Z2cpIiwNCgkJYFxuWW91ciBleGVjdXRvcjoge05hbWV9YA0KCX0pDQplbmQNCg0KZnVuY3Rpb24gVWk6U2hvd1Vuc3VwcG9ydGVkKEZ1bmNOYW1lOiBzdHJpbmcpDQoJVWk6U2hvd01vZGFsKHsNCgkJIlVuZm9ydHVuYXRlbHkgU2lnbWEgU3B5IGlzIG5vdCBzdXBwb3J0ZWQgb24geW91ciBleGVjdXRvciIsDQoJCWBcbk1pc3NpbmcgZnVuY3Rpb246IHtGdW5jTmFtZX1gDQoJfSkNCmVuZA0KDQpmdW5jdGlvbiBVaTpDcmVhdGVPcHRpb25zRm9yRGljdChQYXJlbnQsIERpY3Q6IHRhYmxlLCBDYWxsYmFjaykNCglsb2NhbCBPcHRpb25zID0ge30NCg0KCS0tLy8gRGljdG9uYXJ5IHdyYXANCglmb3IgS2V5LCBWYWx1ZSBpbiBuZXh0LCBEaWN0IGRvDQoJCU9wdGlvbnNbS2V5XSA9IHsNCgkJCVZhbHVlID0gVmFsdWUsDQoJCQlMYWJlbCA9IEtleSwNCgkJCUNhbGxiYWNrID0gZnVuY3Rpb24oXywgVmFsdWUpDQoJCQkJRGljdFtLZXldID0gVmFsdWUNCg0KCQkJCS0tLy8gSW52b2tlIGNhbGxiYWNrDQoJCQkJaWYgbm90IENhbGxiYWNrIHRoZW4gcmV0dXJuIGVuZA0KCQkJCUNhbGxiYWNrKCkNCgkJCWVuZA0KCQl9DQoJZW5kDQoNCgktLS8vIENyZWF0ZSBlbGVtZW50cw0KCXNlbGY6Q3JlYXRlRWxlbWVudHMoUGFyZW50LCBPcHRpb25zKQ0KZW5kDQoNCmZ1bmN0aW9uIFVpOkNoZWNrS2V5YmluZExheW91dChDb250YWluZXIsIEtleUNvZGU6IEVudW0uS2V5Q29kZSwgQ2FsbGJhY2spDQoJaWYgbm90IEtleUNvZGUgdGhlbiByZXR1cm4gQ29udGFpbmVyIGVuZA0KDQoJLS0vLyBDcmVhdGUgUm93IGxheW91dA0KCUNvbnRhaW5lciA9IENvbnRhaW5lcjpSb3coew0KCQlIb3Jpem9udGFsRmxleCA9IEVudW0uVUlGbGV4QWxpZ25tZW50LlNwYWNlQmV0d2Vlbg0KCX0pDQoNCgktLS8vIEFkZCBLZXliaW5kIGVsZW1lbnQNCglDb250YWluZXI6S2V5YmluZCh7DQoJCUxhYmVsID0gIiIsDQoJCVZhbHVlID0gS2V5Q29kZSwNCgkJTGF5b3V0T3JkZXIgPSAyLA0KCQlJZ25vcmVHYW1lUHJvY2Vzc2VkID0gZmFsc2UsDQoJCUNhbGxiYWNrID0gZnVuY3Rpb24oKQ0KCQkJLS0vLyBDaGVjayBpZiBrZXliaW5kcyBhcmUgZW5hYmxlZA0KCQkJbG9jYWwgRW5hYmxlZCA9IEZsYWdzOkdldEZsYWdWYWx1ZSgiS2V5YmluZHNFbmFibGVkIikNCgkJCWlmIG5vdCBFbmFibGVkIHRoZW4gcmV0dXJuIGVuZA0KDQoJCQktLS8vIEludm9rZSBjYWxsYmFjaw0KCQkJQ2FsbGJhY2soKQ0KCQllbmQsDQoJfSkNCg0KCXJldHVybiBDb250YWluZXINCmVuZA0KDQpmdW5jdGlvbiBVaTpDcmVhdGVFbGVtZW50cyhQYXJlbnQsIE9wdGlvbnMpDQoJbG9jYWwgT3B0aW9uVHlwZXMgPSBzZWxmLk9wdGlvblR5cGVzDQoJDQoJLS0vLyBDcmVhdGUgdGFibGUgbGF5b3V0DQoJbG9jYWwgVGFibGUgPSBQYXJlbnQ6VGFibGUoew0KCQlNYXhDb2x1bW5zID0gMw0KCX0pOk5leHRSb3coKQ0KDQoJZm9yIE5hbWUsIERhdGEgaW4gT3B0aW9ucyBkbw0KCQlsb2NhbCBWYWx1ZSA9IERhdGEuVmFsdWUNCgkJbG9jYWwgVHlwZSA9IHR5cGVvZihWYWx1ZSkNCg0KCQktLS8vIEFkZCBtaXNzaW5nIHZhbHVlcyBpbnRvIG9wdGlvbnMgdGFibGUNCgkJUmVHdWk6Q2hlY2tDb25maWcoRGF0YSwgew0KCQkJQ2xhc3MgPSBPcHRpb25UeXBlc1tUeXBlXSwNCgkJCUxhYmVsID0gTmFtZSwNCgkJfSkNCgkJDQoJCS0tLy8gQ2hlY2sgaWYgYSBlbGVtZW50IHR5cGUgZXhpc3RzIGZvciB2YWx1ZSB0eXBlDQoJCWxvY2FsIENsYXNzID0gRGF0YS5DbGFzcw0KCQlhc3NlcnQoQ2xhc3MsIGBObyB7VHlwZX0gdHlwZSBleGlzdHMgZm9yIG9wdGlvbmApDQoNCgkJbG9jYWwgQ29udGFpbmVyID0gVGFibGU6TmV4dENvbHVtbigpDQoJCWxvY2FsIENoZWNrYm94ID0gbmlsDQoNCgkJLS0vLyBDaGVjayBmb3IgYSBrZXliaW5kIGxheW91dA0KCQlsb2NhbCBLZXliaW5kID0gRGF0YS5LZXliaW5kDQoJCUNvbnRhaW5lciA9IHNlbGY6Q2hlY2tLZXliaW5kTGF5b3V0KENvbnRhaW5lciwgS2V5YmluZCwgZnVuY3Rpb24oKQ0KCQkJQ2hlY2tib3g6VG9nZ2xlKCkNCgkJZW5kKQ0KCQkNCgkJLS0vLyBDcmVhdGUgY29sdW1uIGFuZCBlbGVtZW50DQoJCUNoZWNrYm94ID0gQ29udGFpbmVyW0NsYXNzXShDb250YWluZXIsIERhdGEpDQoJZW5kDQplbmQNCg0KLS0vLyBCb2lpaWkgd2hhdCBkaWQgeW91IHNheSBhYm91dCBTaWdtYSBTcHkg8J+SgPCfkoANCmZ1bmN0aW9uIFVpOkRpc3BsYXlBdXJhKCkNCiAgICBsb2NhbCBXaW5kb3cgPSBzZWxmLldpbmRvdw0KICAgIGxvY2FsIFJhbmQgPSBzZWxmLlJhbmRvbVNlZWQNCg0KCS0tLy8gQXVyYSAoYm9paWlpaSkNCiAgICBsb2NhbCBBVVJBID0gUmFuZDpOZXh0SW50ZWdlcigxLCA5OTk5OTk5KQ0KICAgIGxvY2FsIEFVUkFERUxBWSA9IFJhbmQ6TmV4dEludGVnZXIoMSwgNSkNCg0KCS0tLy8gVGl0bGUNCglsb2NhbCBUaXRsZSA9IGBTaWdtYSBTcHkgfCBBVVJBOiB7QVVSQX1gDQoJbG9jYWwgU2Vhc29uYWwgPSBzZWxmOlR1cm5TZWFzb25hbChUaXRsZSkNCiAgICBXaW5kb3c6U2V0VGl0bGUoU2Vhc29uYWwpDQoNCiAgICB3YWl0KEFVUkFERUxBWSkNCmVuZA0KDQpmdW5jdGlvbiBVaTpBdXJhQ291bnRlclNlcnZpY2UoKQ0KICAgIHRhc2suc3Bhd24oZnVuY3Rpb24oKQ0KICAgICAgICB3aGlsZSB0cnVlIGRvDQogICAgICAgICAgICBzZWxmOkRpc3BsYXlBdXJhKCkNCiAgICAgICAgZW5kDQogICAgZW5kKQ0KZW5kDQoNCmZ1bmN0aW9uIFVpOkNyZWF0ZVdpbmRvd0NvbnRlbnQoV2luZG93KQ0KICAgIC0tLy8gV2luZG93IGdyb3VwDQogICAgbG9jYWwgTGF5b3V0ID0gV2luZG93Okxpc3Qoew0KICAgICAgICBVaVBhZGRpbmcgPSAyLA0KICAgICAgICBIb3Jpem9udGFsRmxleCA9IEVudW0uVUlGbGV4QWxpZ25tZW50LkZpbGwsDQogICAgICAgIFZlcnRpY2FsRmxleCA9IEVudW0uVUlGbGV4QWxpZ25tZW50LkZpbGwsDQogICAgICAgIEZpbGxEaXJlY3Rpb24gPSBFbnVtLkZpbGxEaXJlY3Rpb24uVmVydGljYWwsDQogICAgICAgIEZpbGwgPSB0cnVlDQogICAgfSkNCg0KCS0tLy8gUmVtb3RlcyBsaXN0DQogICAgc2VsZi5SZW1vdGVzTGlzdCA9IExheW91dDpDYW52YXMoew0KICAgICAgICBTY3JvbGwgPSB0cnVlLA0KICAgICAgICBVaVBhZGRpbmcgPSA1LA0KICAgICAgICBBdXRvbWF0aWNTaXplID0gRW51bS5BdXRvbWF0aWNTaXplLk5vbmUsDQogICAgICAgIEZsZXhNb2RlID0gRW51bS5VSUZsZXhNb2RlLk5vbmUsDQogICAgICAgIFNpemUgPSBVRGltMi5uZXcoMCwgMTMwLCAxLCAwKQ0KICAgIH0pDQoNCgktLS8vIFRhYiBib3gNCglsb2NhbCBJbmZvU2VsZWN0b3IgPSBMYXlvdXQ6VGFiU2VsZWN0b3Ioew0KICAgICAgICBOb0FuaW1hdGlvbiA9IHRydWUsDQogICAgICAgIFNpemUgPSBVRGltMi5uZXcoMSwgLTEzMCwgMC40LCAwKSwNCiAgICB9KQ0KDQoJc2VsZi5JbmZvU2VsZWN0b3IgPSBJbmZvU2VsZWN0b3INCglzZWxmLkNhbnZhc0xheW91dCA9IExheW91dA0KDQoJLS0vLyBNYWtlIHRhYnMNCglzZWxmOk1ha2VFZGl0b3JUYWIoSW5mb1NlbGVjdG9yKQ0KCXNlbGY6TWFrZU9wdGlvbnNUYWIoSW5mb1NlbGVjdG9yKQ0KCQ0KCWlmIENvbmZpZy5EZWJ1ZyB0aGVuDQoJCXNlbGY6Q29uc29sZVRhYihJbmZvU2VsZWN0b3IpDQoJZW5kDQplbmQNCg0KZnVuY3Rpb24gVWk6Q29uc29sZVRhYihJbmZvU2VsZWN0b3IpDQoJbG9jYWwgVGFiID0gSW5mb1NlbGVjdG9yOkNyZWF0ZVRhYih7DQoJCU5hbWUgPSAiQ29uc29sZSINCgl9KQ0KDQoJbG9jYWwgQ29uc29sZQ0KCWxvY2FsIEJ1dHRvbnNSb3cgPSBUYWI6Um93KCkNCg0KCUJ1dHRvbnNSb3c6QnV0dG9uKHsNCgkJVGV4dCA9ICJDbGVhciIsDQoJCUNhbGxiYWNrID0gZnVuY3Rpb24oKQ0KCQkJQ29uc29sZTpDbGVhcigpDQoJCWVuZA0KCX0pDQoJQnV0dG9uc1JvdzpCdXR0b24oew0KCQlUZXh0ID0gIkNvcHkiLA0KCQlDYWxsYmFjayA9IGZ1bmN0aW9uKCkNCgkJCXRvY2xpcGJvYXJkKENvbnNvbGU6R2V0VmFsdWUoKSkNCgkJZW5kDQoJfSkNCglCdXR0b25zUm93OkJ1dHRvbih7DQoJCVRleHQgPSAiUGF1c2UiLA0KCQlDYWxsYmFjayA9IGZ1bmN0aW9uKHNlbGYpDQoJCQlsb2NhbCBFbmFibGVkID0gbm90IENvbnNvbGUuRW5hYmxlZA0KCQkJbG9jYWwgVGV4dCA9IEVuYWJsZWQgYW5kICJQYXVzZSIgb3IgIlBhdXNlZCINCgkJCXNlbGYuVGV4dCA9IFRleHQNCg0KCQkJLS0vLyBVcGRhdGUgY29uc29sZQ0KCQkJQ29uc29sZS5FbmFibGVkID0gRW5hYmxlZA0KCQllbmQsDQoJfSkNCglCdXR0b25zUm93OkV4cGFuZCgpDQoNCgktLS8vIENyZWF0ZSBjb25zb2xlDQoJQ29uc29sZSA9IFRhYjpDb25zb2xlKHsNCgkJVGV4dCA9ICItLSBDcmVhdGVkIGJ5IGRlcHNvIiwNCgkJUmVhZE9ubHkgPSB0cnVlLA0KCQlCb3JkZXIgPSBmYWxzZSwNCgkJRmlsbCA9IHRydWUsDQoJCUVuYWJsZWQgPSB0cnVlLA0KCQlBdXRvU2Nyb2xsID0gdHJ1ZSwNCgkJUmljaFRleHQgPSB0cnVlLA0KCQlNYXhMaW5lcyA9IDUwDQoJfSkNCg0KCXNlbGYuQ29uc29sZSA9IENvbnNvbGUNCmVuZA0KDQpmdW5jdGlvbiBVaTpDb25zb2xlTG9nKC4uLjogc3RyaW5nPykNCglsb2NhbCBDb25zb2xlID0gc2VsZi5Db25zb2xlDQoJaWYgbm90IENvbnNvbGUgdGhlbiByZXR1cm4gZW5kDQoNCglDb25zb2xlOkFwcGVuZFRleHQoLi4uKQ0KZW5kDQoNCmZ1bmN0aW9uIFVpOk1ha2VPcHRpb25zVGFiKEluZm9TZWxlY3RvcikNCglsb2NhbCBUYWIgPSBJbmZvU2VsZWN0b3I6Q3JlYXRlVGFiKHsNCgkJTmFtZSA9ICJPcHRpb25zIg0KCX0pDQoNCgktLS8vIEFkZCBnbG9iYWwgb3B0aW9ucw0KCVRhYjpTZXBhcmF0b3Ioe1RleHQ9IkxvZ3MifSkNCglzZWxmOkNyZWF0ZUJ1dHRvbnMoVGFiLCB7DQoJCUJhc2UgPSB7DQoJCQlTaXplID0gVURpbTIubmV3KDEsIDAsIDAsIDIwKSwNCgkJCUF1dG9tYXRpY1NpemUgPSBFbnVtLkF1dG9tYXRpY1NpemUuWSwNCgkJfSwNCgkJQnV0dG9ucyA9IHsNCgkJCXsNCgkJCQlUZXh0ID0gIkNsZWFyIGxvZ3MiLA0KCQkJCUNhbGxiYWNrID0gZnVuY3Rpb24oKQ0KCQkJCQlsb2NhbCBUYWIgPSBBY3RpdmVEYXRhIGFuZCBBY3RpdmVEYXRhLlRhYiBvciBuaWwNCg0KCQkJCQktLS8vIFJlbW92ZSB0aGUgUmVtb3RlIHRhYg0KCQkJCQlpZiBUYWIgdGhlbg0KCQkJCQkJSW5mb1NlbGVjdG9yOlJlbW92ZVRhYihUYWIpDQoJCQkJCWVuZA0KDQoJCQkJCS0tLy8gQ2xlYXIgYWxsIGxvZyBlbGVtZW50cw0KCQkJCQlBY3RpdmVEYXRhID0gbmlsDQoJCQkJCXNlbGY6Q2xlYXJMb2dzKCkNCgkJCQllbmQsDQoJCQl9LA0KCQkJew0KCQkJCVRleHQgPSAiQ2xlYXIgYmxvY2tzIiwNCgkJCQlDYWxsYmFjayA9IGZ1bmN0aW9uKCkNCgkJCQkJUHJvY2VzczpVcGRhdGVBbGxSZW1vdGVEYXRhKCJCbG9ja2VkIiwgZmFsc2UpDQoJCQkJZW5kLA0KCQkJfSwNCgkJCXsNCgkJCQlUZXh0ID0gIkNsZWFyIGV4Y2x1ZGVzIiwNCgkJCQlDYWxsYmFjayA9IGZ1bmN0aW9uKCkNCgkJCQkJUHJvY2VzczpVcGRhdGVBbGxSZW1vdGVEYXRhKCJFeGNsdWRlZCIsIGZhbHNlKQ0KCQkJCWVuZCwNCgkJCX0sDQoJCQl7DQoJCQkJVGV4dCA9ICJKb2luIERpc2NvcmQiLA0KCQkJCUNhbGxiYWNrID0gZnVuY3Rpb24oKQ0KCQkJCQlQcm9jZXNzOlByb21wdERpc2NvcmRJbnZpdGUoInM5bmdtVURXZ2IiKQ0KCQkJCQlzZWxmOlNldENsaXBib2FyZCgiaHR0cHM6Ly9kaXNjb3JkLmdnL3M5bmdtVURXZ2IiKQ0KCQkJCWVuZCwNCgkJCX0sDQoJCQl7DQoJCQkJVGV4dCA9ICJDb3B5IEdpdGh1YiIsDQoJCQkJQ2FsbGJhY2sgPSBmdW5jdGlvbigpDQoJCQkJCXNlbGY6U2V0Q2xpcGJvYXJkKCJodHRwczovL2dpdGh1Yi5jb20vZGVwdGhzby9TaWdtYS1TcHkiKQ0KCQkJCWVuZCwNCgkJCX0sDQoJCQl7DQoJCQkJVGV4dCA9ICJFZGl0IFNwb29mcyIsDQoJCQkJQ2FsbGJhY2sgPSBmdW5jdGlvbigpDQoJCQkJCXNlbGY6RWRpdEZpbGUoIlJldHVybiBzcG9vZnMubHVhIiwgdHJ1ZSwgZnVuY3Rpb24oV2luZG93LCBDb250ZW50OiBzdHJpbmcpDQoJCQkJCQlXaW5kb3c6Q2xvc2UoKQ0KCQkJCQkJQ29tbUNoYW5uZWw6RmlyZSgiVXBkYXRlU3Bvb2ZzIiwgQ29udGVudCkNCgkJCQkJZW5kKQ0KCQkJCWVuZCwNCgkJCX0NCgkJfQ0KCX0pDQoNCgktLS8vIEZsYWcgb3B0aW9ucw0KCVRhYjpTZXBhcmF0b3Ioe1RleHQ9IlNldHRpbmdzIn0pDQoJc2VsZjpDcmVhdGVFbGVtZW50cyhUYWIsIEZsYWdzOkdldEZsYWdzKCkpDQoNCglzZWxmOkFkZERldGFpbHNTZWN0aW9uKFRhYikNCmVuZA0KDQpmdW5jdGlvbiBVaTpBZGREZXRhaWxzU2VjdGlvbihPcHRpb25zVGFiKQ0KCU9wdGlvbnNUYWI6U2VwYXJhdG9yKHtUZXh0PSJJbmZvcm1hdGlvbiJ9KQ0KCU9wdGlvbnNUYWI6QnVsbGV0VGV4dCh7DQoJCVJvd3MgPSB7DQoJCQkiU2lnbWEgc3B5IC0gV3JpdHRlbiBieSBkZXBzbyEiLA0KCQkJIkxpYnJhcmllczogUm9ibG94LVBhcnNlciwgRGVhci1SZUd1aSIsDQoJCQkiVGhhbmsgeW91IHN5bi5sdWEgZm9yIHN1Z2dlc3RpbmcgSSBtYWtlIHRoaXMiDQoJCX0NCgl9KQ0KZW5kDQoNCmxvY2FsIGZ1bmN0aW9uIE1ha2VBY3RpdmVEYXRhQ2FsbGJhY2soTmFtZTogc3RyaW5nKQ0KCXJldHVybiBmdW5jdGlvbiguLi4pDQoJCWlmIG5vdCBBY3RpdmVEYXRhIHRoZW4gcmV0dXJuIGVuZA0KCQlyZXR1cm4gQWN0aXZlRGF0YVtOYW1lXShBY3RpdmVEYXRhLCAuLi4pDQoJZW5kDQplbmQNCg0KZnVuY3Rpb24gVWk6TWFrZUVkaXRvclRhYihJbmZvU2VsZWN0b3IpDQoJbG9jYWwgRGVmYXVsdCA9IHNlbGYuRGVmYXVsdEVkaXRvckNvbnRlbnQNCglsb2NhbCBTeW50YXhDb2xvcnMgPSBDb25maWcuU3ludGF4Q29sb3JzDQoNCgktLS8vIENyZWF0ZSB0YWINCglsb2NhbCBFZGl0b3JUYWIgPSBJbmZvU2VsZWN0b3I6Q3JlYXRlVGFiKHsNCgkJTmFtZSA9ICJFZGl0b3IiDQoJfSkNCg0KCS0tLy8gSURFDQoJbG9jYWwgQ29kZUVkaXRvciA9IEVkaXRvclRhYjpDb2RlRWRpdG9yKHsNCgkJRmlsbCA9IHRydWUsDQoJCUVkaXRhYmxlID0gdHJ1ZSwNCgkJRm9udFNpemUgPSAxMywNCgkJQ29sb3JzID0gU3ludGF4Q29sb3JzLA0KCQlGb250RmFjZSA9IFRleHRGb250LA0KCQlUZXh0ID0gRGVmYXVsdA0KCX0pDQoNCgktLS8vIEJ1dHRvbnMNCglsb2NhbCBCdXR0b25zUm93ID0gRWRpdG9yVGFiOlJvdygpDQoJc2VsZjpDcmVhdGVCdXR0b25zKEJ1dHRvbnNSb3csIHsNCgkJTm9UYWJsZSA9IHRydWUsDQoJCUJ1dHRvbnMgPSB7DQoJCQl7DQoJCQkJVGV4dCA9ICJDb3B5IiwNCgkJCQlDYWxsYmFjayA9IGZ1bmN0aW9uKCkNCgkJCQkJbG9jYWwgU2NyaXB0ID0gQ29kZUVkaXRvcjpHZXRUZXh0KCkNCgkJCQkJc2VsZjpTZXRDbGlwYm9hcmQoU2NyaXB0KQ0KCQkJCWVuZA0KCQkJfSwNCgkJCXsNCgkJCQlUZXh0ID0gIlJ1biIsDQoJCQkJQ2FsbGJhY2sgPSBmdW5jdGlvbigpDQoJCQkJCWxvY2FsIFNjcmlwdCA9IENvZGVFZGl0b3I6R2V0VGV4dCgpDQoJCQkJCWxvY2FsIEZ1bmMsIEVycm9yID0gbG9hZHN0cmluZyhTY3JpcHQsICJTaWdtYVNweS1VU0VSU0NSSVBUIikNCg0KCQkJCQktLS8vIFN5bnRheCBjaGVjaw0KCQkJCQlpZiBub3QgRnVuYyB0aGVuDQoJCQkJCQlzZWxmOlNob3dNb2RhbCh7IkVycm9yIHJ1bm5pbmcgc2NyaXB0IVxuIiwgRXJyb3J9KQ0KCQkJCQkJcmV0dXJuDQoJCQkJCWVuZA0KDQoJCQkJCUZ1bmMoKQ0KCQkJCWVuZA0KCQkJfSwNCgkJCXsNCgkJCQlUZXh0ID0gIkdldCByZXR1cm4iLA0KCQkJCUNhbGxiYWNrID0gTWFrZUFjdGl2ZURhdGFDYWxsYmFjaygiR2V0UmV0dXJuIikNCgkJCX0sDQoJCQl7DQoJCQkJVGV4dCA9ICJTY3JpcHQiLA0KCQkJCUNhbGxiYWNrID0gTWFrZUFjdGl2ZURhdGFDYWxsYmFjaygiU2NyaXB0T3B0aW9ucyIpDQoJCQl9LA0KCQkJew0KCQkJCVRleHQgPSAiQnVpbGQiLA0KCQkJCUNhbGxiYWNrID0gTWFrZUFjdGl2ZURhdGFDYWxsYmFjaygiQnVpbGRTY3JpcHQiKQ0KCQkJfSwNCgkJCXsNCgkJCQlUZXh0ID0gIlBvcC1vdXQiLA0KCQkJCUNhbGxiYWNrID0gZnVuY3Rpb24oKQ0KCQkJCQlsb2NhbCBTY3JpcHQgPSBDb2RlRWRpdG9yOkdldFRleHQoKQ0KCQkJCQlsb2NhbCBUaWxlID0gQWN0aXZlRGF0YSBhbmQgQWN0aXZlRGF0YS5UYXNrIG9yICJTaWdtYSBTcHkiDQoJCQkJCXNlbGY6TWFrZUVkaXRvclBvcG91dFdpbmRvdyhTY3JpcHQsIHsNCgkJCQkJCVRpdGxlID0gVGlsZQ0KCQkJCQl9KQ0KCQkJCWVuZA0KCQkJfSwNCgkJfQ0KCX0pDQoJDQoJc2VsZi5Db2RlRWRpdG9yID0gQ29kZUVkaXRvcg0KZW5kDQoNCmZ1bmN0aW9uIFVpOlNob3VsZEZvY3VzKFRhYik6IGJvb2xlYW4NCglsb2NhbCBJbmZvU2VsZWN0b3IgPSBzZWxmLkluZm9TZWxlY3Rvcg0KCWxvY2FsIEFjdGl2ZVRhYiA9IEluZm9TZWxlY3Rvci5BY3RpdmVUYWINCg0KCS0tLy8gSWYgdGhlcmUgaXMgYW4gZW1wdHkgdGFiDQoJaWYgbm90IEFjdGl2ZVRhYiB0aGVuDQoJCXJldHVybiB0cnVlDQoJZW5kDQoNCglyZXR1cm4gSW5mb1NlbGVjdG9yOkNvbXBhcmVUYWJzKEFjdGl2ZVRhYiwgVGFiKQ0KZW5kDQoNCmZ1bmN0aW9uIFVpOk1ha2VFZGl0b3JQb3BvdXRXaW5kb3coQ29udGVudDogc3RyaW5nLCBXaW5kb3dDb25maWc6IHRhYmxlKQ0KCWxvY2FsIFdpbmRvdyA9IHNlbGY6Q3JlYXRlV2luZG93KFdpbmRvd0NvbmZpZykNCglsb2NhbCBCdXR0b25zID0gV2luZG93Q29uZmlnLkJ1dHRvbnMgb3Ige30NCglsb2NhbCBDb2xvcnMgPSBDb25maWcuU3ludGF4Q29sb3JzDQoNCglsb2NhbCBDb2RlRWRpdG9yID0gV2luZG93OkNvZGVFZGl0b3Ioew0KCQlUZXh0ID0gQ29udGVudCwNCgkJRWRpdGFibGUgPSB0cnVlLA0KCQlGaWxsID0gdHJ1ZSwNCgkJRm9udFNpemUgPSAxMywNCgkJQ29sb3JzID0gQ29sb3JzLA0KCQlGb250RmFjZSA9IFRleHRGb250DQoJfSkNCg0KCS0tLy8gRGVmYXVsdCBidXR0b25zDQoJdGFibGUuaW5zZXJ0KEJ1dHRvbnMsIHsNCgkJVGV4dCA9ICJDb3B5IiwNCgkJQ2FsbGJhY2sgPSBmdW5jdGlvbigpDQoJCQlsb2NhbCBTY3JpcHQgPSBDb2RlRWRpdG9yOkdldFRleHQoKQ0KCQkJc2VsZjpTZXRDbGlwYm9hcmQoU2NyaXB0KQ0KCQllbmQNCgl9KQ0KDQoJLS0vLyBCdXR0b25zDQoJbG9jYWwgQnV0dG9uc1JvdyA9IFdpbmRvdzpSb3coKQ0KCXNlbGY6Q3JlYXRlQnV0dG9ucyhCdXR0b25zUm93LCB7DQoJCU5vVGFibGUgPSB0cnVlLA0KCQlCdXR0b25zID0gQnV0dG9ucw0KCX0pDQoNCglXaW5kb3c6Q2VudGVyKCkNCglyZXR1cm4gQ29kZUVkaXRvciwgV2luZG93DQplbmQNCg0KZnVuY3Rpb24gVWk6RWRpdEZpbGUoRmlsZVBhdGg6IHN0cmluZywgSW5Gb2xkZXI6IGJvb2xlYW4sIE9uU2F2ZUZ1bmM6ICgodGFibGUsIHN0cmluZykgLT4gbmlsKT8pDQoJbG9jYWwgRm9sZGVyID0gRmlsZXMuRm9sZGVyTmFtZQ0KCWxvY2FsIENvZGVFZGl0b3IsIFdpbmRvdw0KDQoJLS0vLyBSZWxhdGl2ZSB0byBTaWdtYSBTcHkgZm9sZGVyDQoJaWYgSW5Gb2xkZXIgdGhlbg0KCQlGaWxlUGF0aCA9IGB7Rm9sZGVyfS97RmlsZVBhdGh9YA0KCWVuZA0KDQoJLS0vLyBHZXQgZmlsZSBjb250ZW50DQoJbG9jYWwgQ29udGVudCA9IHJlYWRmaWxlKEZpbGVQYXRoKQ0KCUNvbnRlbnQgPSBDb250ZW50OmdzdWIoIlxyXG4iLCAiXG4iKQ0KCQ0KCWxvY2FsIEJ1dHRvbnMgPSB7DQoJCXsNCgkJCVRleHQgPSAiU2F2ZSIsDQoJCQlDYWxsYmFjayA9IGZ1bmN0aW9uKCkNCgkJCQlsb2NhbCBTY3JpcHQgPSBDb2RlRWRpdG9yOkdldFRleHQoKQ0KCQkJCWxvY2FsIFN1Y2Nlc3MsIEVycm9yID0gbG9hZHN0cmluZyhTY3JpcHQsICJTaWdtYVNweS1FZGl0b3IiKQ0KDQoJCQkJLS0vLyBTeW50YXggY2hlY2sNCgkJCQlpZiBub3QgU3VjY2VzcyB0aGVuDQoJCQkJCXNlbGY6U2hvd01vZGFsKHsiRXJyb3Igc2F2aW5nIGZpbGUhXG4iLCBFcnJvcn0pDQoJCQkJCXJldHVybg0KCQkJCWVuZA0KCQkJCQ0KCQkJCS0tLy8gU2F2ZSBjb250ZW50cw0KCQkJCXdyaXRlZmlsZShGaWxlUGF0aCwgU2NyaXB0KQ0KDQoJCQkJLS0vLyBJbnZva2Ugb24gc2F2ZSBmdW5jdGlvbg0KCQkJCWlmIE9uU2F2ZUZ1bmMgdGhlbg0KCQkJCQlPblNhdmVGdW5jKFdpbmRvdywgU2NyaXB0KQ0KCQkJCWVuZA0KCQkJZW5kDQoJCX0NCgl9DQoNCgktLS8vIENyZWF0ZSBFZGl0b3IgV2luZG93DQoJQ29kZUVkaXRvciwgV2luZG93ID0gc2VsZjpNYWtlRWRpdG9yUG9wb3V0V2luZG93KENvbnRlbnQsIHsNCgkJVGl0bGUgPSBgRWRpdGluZzoge0ZpbGVQYXRofWAsDQoJCUJ1dHRvbnMgPSBCdXR0b25zDQoJfSkNCmVuZA0KDQp0eXBlIE1lbnVPcHRpb25zID0gew0KCVtzdHJpbmddOiAoR3VpQnV0dG9uLCAuLi5hbnkpIC0+IG5pbA0KfQ0KZnVuY3Rpb24gVWk6TWFrZUJ1dHRvbk1lbnUoQnV0dG9uOiBJbnN0YW5jZSwgVW5wYWNrOiB0YWJsZSwgT3B0aW9uczogTWVudU9wdGlvbnMpDQoJbG9jYWwgV2luZG93ID0gc2VsZi5XaW5kb3cNCglsb2NhbCBQb3B1cCA9IFdpbmRvdzpQb3B1cENhbnZhcyh7DQoJCVJlbGF0aXZlVG8gPSBCdXR0b24sDQoJCU1heFNpemVYID0gNTAwLA0KCX0pDQoNCgktLS8vIENyZWF0ZSBTZWxlY3RhYmxlcyBmb3Igc3RyaW5nLCBmdW5jdGlvbg0KCWZvciBOYW1lLCBGdW5jIGluIE9wdGlvbnMgZG8NCgkJIFBvcHVwOlNlbGVjdGFibGUoew0KCQkJVGV4dCA9IE5hbWUsDQoJCQlDYWxsYmFjayA9IGZ1bmN0aW9uKCkNCgkJCQlGdW5jKFByb2Nlc3M6VW5wYWNrKFVucGFjaykpDQoJCQllbmQsDQoJCX0pDQoJZW5kDQplbmQNCg0KZnVuY3Rpb24gVWk6UmVtb3ZlUHJldmlvdXNUYWIoVGl0bGU6IHN0cmluZyk6IGJvb2xlYW4NCgktLS8vIE5vIHByZXZpb3VzIHRhYnMNCglpZiBub3QgQWN0aXZlRGF0YSB0aGVuIA0KCQlyZXR1cm4gZmFsc2UgDQoJZW5kDQoNCgktLS8vIFRhYlNlbGVjdG9yDQoJbG9jYWwgSW5mb1NlbGVjdG9yID0gc2VsZi5JbmZvU2VsZWN0b3INCg0KCS0tLy8gUHJldmlvdXMgZWxlbWVudHMNCglsb2NhbCBQcmV2aW91c1RhYiA9IEFjdGl2ZURhdGEuVGFiDQoJbG9jYWwgUHJldmlvdXNTZWxlY3RhYmxlID0gQWN0aXZlRGF0YS5TZWxlY3RhYmxlDQoNCgktLS8vIFJlbW92ZSBwcmV2aW91cyB0YWIgYW5kIHNldCBzZWxlY3RhYmxlIGZvY3VzDQoJbG9jYWwgVGFiRm9jdXNlZCA9IHNlbGY6U2hvdWxkRm9jdXMoUHJldmlvdXNUYWIpDQoJSW5mb1NlbGVjdG9yOlJlbW92ZVRhYihQcmV2aW91c1RhYikNCglQcmV2aW91c1NlbGVjdGFibGU6U2V0U2VsZWN0ZWQoZmFsc2UpDQoNCgktLS8vIENyZWF0ZSBuZXcgdGFiDQoJcmV0dXJuIFRhYkZvY3VzZWQNCmVuZA0KDQpmdW5jdGlvbiBVaTpNYWtlVGFibGVIZWFkZXJzKFRhYmxlLCBSb3dzOiB0YWJsZSkNCglsb2NhbCBIZWFkZXJSb3cgPSBUYWJsZTpIZWFkZXJSb3coKQ0KCWZvciBfLCBDYXRhZ29yeSBpbiBSb3dzIGRvDQoJCWxvY2FsIENvbHVtbiA9IEhlYWRlclJvdzpOZXh0Q29sdW1uKCkNCgkJQ29sdW1uOkxhYmVsKHtUZXh0PUNhdGFnb3J5fSkNCgllbmQNCmVuZA0KDQpmdW5jdGlvbiBVaTpEZWNvbXBpbGUoRWRpdG9yOiB0YWJsZSwgU2NyaXB0OiBTY3JpcHQpDQoJbG9jYWwgSGVhZGVyID0gIi0tQk9PSUlJSSBUSElTIElTIFNPIFRVRkYgRkxJUFBZIFNLSUJJREkgQVVSQSAoU0lHTUEgU1BZKSINCglFZGl0b3I6U2V0VGV4dCgiLS1EZWNvbXBpbGluZy4uLiArOTk5OTk5OSBBVVJBIChtYW5nbyBwaG9uaykiKQ0KDQoJLS0vLyBEZWNvbXBpbGUgc2NyaXB0DQoJbG9jYWwgRGVjb21waWxlZCwgSXNFcnJvciA9IFByb2Nlc3M6RGVjb21waWxlKFNjcmlwdCkNCg0KCS0tLy8gQWRkIGhlYWRlciBmb3Igc3VjY2Vzc2Z1bCBkZWNvbXBpbGF0aW9ucw0KCWlmIG5vdCBJc0Vycm9yIHRoZW4NCgkJRGVjb21waWxlZCA9IGB7SGVhZGVyfVxue0RlY29tcGlsZWR9YA0KCWVuZA0KDQoJRWRpdG9yOlNldFRleHQoRGVjb21waWxlZCkNCmVuZA0KDQp0eXBlIERpc3BsYXlUYWJsZUNvbmZpZyA9IHsNCglSb3dzOiB0YWJsZSwNCglGbGFnczogdGFibGU/LA0KCVRvRGlzcGxheTogdGFibGUsDQoJVGFibGU6IHRhYmxlDQp9DQpmdW5jdGlvbiBVaTpEaXNwbGF5VGFibGUoUGFyZW50LCBDb25maWc6IERpc3BsYXlUYWJsZUNvbmZpZyk6IHRhYmxlDQoJLS0vLyBDb25maWd1cmF0aW9uDQoJbG9jYWwgUm93cyA9IENvbmZpZy5Sb3dzDQoJbG9jYWwgRmxhZ3MgPSBDb25maWcuRmxhZ3MNCglsb2NhbCBEYXRhVGFibGUgPSBDb25maWcuVGFibGUNCglsb2NhbCBUb0Rpc3BsYXkgPSBDb25maWcuVG9EaXNwbGF5DQoNCglGbGFncy5NYXhDb2x1bW5zID0gI1Jvd3MNCg0KCS0tLy8gQ3JlYXRlIHRhYmxlDQoJbG9jYWwgVGFibGUgPSBQYXJlbnQ6VGFibGUoRmxhZ3MpDQoNCgktLS8vIFRhYmxlIGhlYWRlcnMNCglzZWxmOk1ha2VUYWJsZUhlYWRlcnMoVGFibGUsIFJvd3MpDQoNCgktLS8vIFRhYmxlIGxheW91dA0KCWZvciBSb3dJbmRleCwgTmFtZSBpbiBUb0Rpc3BsYXkgZG8NCgkJbG9jYWwgUm93ID0gVGFibGU6Um93KCkNCgkJDQoJCS0tLy8gQ3JlYXRlIENvbHVtbnMNCgkJZm9yIENvdW50LCBDYXRhZ29yeSBpbiBSb3dzIGRvDQoJCQlsb2NhbCBDb2x1bW4gPSBSb3c6TmV4dENvbHVtbigpDQoJCQkNCgkJCS0tLy8gVmFsdWUgdGV4dA0KCQkJbG9jYWwgVmFsdWUgPSBDYXRhZ29yeSA9PSAiTmFtZSIgYW5kIE5hbWUgb3IgRGF0YVRhYmxlW05hbWVdDQoJCQlpZiBub3QgVmFsdWUgdGhlbiBjb250aW51ZSBlbmQNCg0KCQkJLS0vLyBDcmVhdGUgZmlsdGVyZWQgbGFiZWwNCgkJCWxvY2FsIFN0cmluZyA9IHNlbGY6RmlsdGVyTmFtZShge1ZhbHVlfWAsIDE1MCkNCgkJCUNvbHVtbjpMYWJlbCh7VGV4dD1TdHJpbmd9KQ0KCQllbmQNCgllbmQNCg0KCXJldHVybiBUYWJsZQ0KZW5kDQoNCmZ1bmN0aW9uIFVpOlNldEZvY3VzZWRSZW1vdGUoRGF0YSkNCgktLS8vIFVucGFjayByZW1vdGUgZGF0YQ0KCWxvY2FsIFJlbW90ZSA9IERhdGEuUmVtb3RlDQoJbG9jYWwgTWV0aG9kID0gRGF0YS5NZXRob2QNCglsb2NhbCBJc1JlY2VpdmUgPSBEYXRhLklzUmVjZWl2ZQ0KCWxvY2FsIFNjcmlwdCA9IERhdGEuQ2FsbGluZ1NjcmlwdA0KCWxvY2FsIENsYXNzRGF0YSA9IERhdGEuQ2xhc3NEYXRhDQoJbG9jYWwgSGVhZGVyRGF0YSA9IERhdGEuSGVhZGVyRGF0YQ0KCWxvY2FsIFZhbHVlU3dhcHMgPSBEYXRhLlZhbHVlU3dhcHMNCglsb2NhbCBBcmdzID0gRGF0YS5BcmdzDQoJbG9jYWwgSWQgPSBEYXRhLklkDQoNCgktLS8vIEZsYWdzDQoJbG9jYWwgVGFibGVBcmdzID0gRmxhZ3M6R2V0RmxhZ1ZhbHVlKCJUYWJsZUFyZ3MiKQ0KCWxvY2FsIE5vVmFyaWFibGVzID0gRmxhZ3M6R2V0RmxhZ1ZhbHVlKCJOb1ZhcmlhYmxlcyIpDQoNCgktLS8vIFVucGFjayBpbmZvDQoJbG9jYWwgUmVtb3RlRGF0YSA9IFByb2Nlc3M6R2V0UmVtb3RlRGF0YShJZCkNCglsb2NhbCBJc1JlbW90ZUZ1bmN0aW9uID0gQ2xhc3NEYXRhLklzUmVtb3RlRnVuY3Rpb24NCglsb2NhbCBSZW1vdGVOYW1lID0gc2VsZjpGaWx0ZXJOYW1lKGB7UmVtb3RlfWAsIDUwKQ0KDQoJLS0vLyBVSSBkYXRhDQoJbG9jYWwgQ29kZUVkaXRvciA9IHNlbGYuQ29kZUVkaXRvcg0KCWxvY2FsIFRvRGlzcGxheSA9IHNlbGYuRGlzcGxheVJlbW90ZUluZm8NCglsb2NhbCBJbmZvU2VsZWN0b3IgPSBzZWxmLkluZm9TZWxlY3Rvcg0KDQoJbG9jYWwgVGFiRm9jdXNlZCA9IHNlbGY6UmVtb3ZlUHJldmlvdXNUYWIoKQ0KCWxvY2FsIFRhYiA9IEluZm9TZWxlY3RvcjpDcmVhdGVUYWIoew0KCQlOYW1lID0gc2VsZjpGaWx0ZXJOYW1lKGBSZW1vdGU6IHtSZW1vdGVOYW1lfWAsIDUwKSwNCgkJRm9jdXNlZCA9IFRhYkZvY3VzZWQNCgl9KQ0KDQoJLS0vLyBDcmVhdGUgbmV3IHBhcnNlcg0KCWxvY2FsIE1vZHVsZSA9IEdlbmVyYXRpb246TmV3UGFyc2VyKHsNCgkJTm9WYXJpYWJsZXMgPSBOb1ZhcmlhYmxlcw0KCX0pDQoJbG9jYWwgUGFyc2VyID0gTW9kdWxlLlBhcnNlcg0KCWxvY2FsIEZvcm1hdHRlciA9IE1vZHVsZS5Gb3JtYXR0ZXINCglGb3JtYXR0ZXI6U2V0VmFsdWVTd2FwcyhWYWx1ZVN3YXBzKQ0KDQoJLS0vLyBTZXQgdGhpcyBsb2cgdG8gYmUgc2VsZWN0ZWQNCglBY3RpdmVEYXRhID0gRGF0YQ0KCURhdGEuVGFiID0gVGFiDQoJRGF0YS5TZWxlY3RhYmxlOlNldFNlbGVjdGVkKHRydWUpDQoNCglsb2NhbCBmdW5jdGlvbiBTZXRJREVUZXh0KENvbnRlbnQ6IHN0cmluZywgVGFzazogc3RyaW5nPykNCgkJRGF0YS5UYXNrID0gVGFzayBvciAiU2lnbWEgU3B5Ig0KCQlDb2RlRWRpdG9yOlNldFRleHQoQ29udGVudCkNCgllbmQNCglsb2NhbCBmdW5jdGlvbiBEYXRhQ29ubmVjdGlvbihOYW1lLCAuLi4pDQoJCWxvY2FsIEFyZ3MgPSB7Li4ufQ0KCQlyZXR1cm4gZnVuY3Rpb24oKQ0KCQkJcmV0dXJuIERhdGFbTmFtZV0oRGF0YSwgUHJvY2VzczpVbnBhY2soQXJncykpDQoJCWVuZA0KCWVuZA0KCWxvY2FsIGZ1bmN0aW9uIFNjcmlwdENoZWNrKFNjcmlwdCwgTm9NaXNzaW5nQ2hlY2s6IGJvb2xlYW4pOiBib29sZWFuPw0KCQktLS8vIFJlamVjdCBjbGllbnQgZXZlbnRzDQoJCWlmIElzUmVjZWl2ZSB0aGVuIA0KCQkJVWk6U2hvd01vZGFsKHsNCgkJCQkiUmVjaWV2ZXMgZG8gbm90IGhhdmUgYSBzY3JpcHQgYmVjYXVzZSBpdCdzIGEgQ29ubmVjdGlvbiINCgkJCX0pDQoJCQlyZXR1cm4gDQoJCWVuZA0KDQoJCS0tLy8gQ2hlY2sgaWYgc2NyaXB0IGV4aXN0cw0KCQlpZiBub3QgU2NyaXB0IGFuZCBub3QgTm9NaXNzaW5nQ2hlY2sgdGhlbiANCgkJCVVpOlNob3dNb2RhbCh7IlRoZSBTY3JpcHQgaGFzIGJlZW4gZGVzdHJveWVkIGJ5IHRoZSBnYW1lICgtOTk5OTk5OSBBVVJBKSJ9KQ0KCQkJcmV0dXJuDQoJCWVuZA0KDQoJCXJldHVybiB0cnVlDQoJZW5kDQoNCgktLS8vIEZ1bmN0aW9ucw0KCWZ1bmN0aW9uIERhdGE6U2NyaXB0T3B0aW9ucyhCdXR0b246IEd1aUJ1dHRvbikNCgkJVWk6TWFrZUJ1dHRvbk1lbnUoQnV0dG9uLCB7c2VsZn0sIHsNCgkJCVsiQ2FsbGVyIEluZm8iXSA9IERhdGFDb25uZWN0aW9uKCJHZW5lcmF0ZUluZm8iKSwNCgkJCVsiRGVjb21waWxlIl0gPSBEYXRhQ29ubmVjdGlvbigiRGVjb21waWxlIiwgIlNvdXJjZVNjcmlwdCIpLA0KCQkJWyJEZWNvbXBpbGUgQ2FsbGluZyJdID0gRGF0YUNvbm5lY3Rpb24oIkRlY29tcGlsZSIsICJDYWxsaW5nU2NyaXB0IiksDQoJCQlbIlJlcGVhdCBDYWxsIl0gPSBEYXRhQ29ubmVjdGlvbigiUmVwZWF0Q2FsbCIpLA0KCQkJWyJTYXZlIEJ5dGVjb2RlIl0gPSBEYXRhQ29ubmVjdGlvbigiU2F2ZUJ5dGVjb2RlIiksDQoJCX0pDQoJZW5kDQoJZnVuY3Rpb24gRGF0YTpCdWlsZFNjcmlwdChCdXR0b246IEd1aUJ1dHRvbikNCgkJVWk6TWFrZUJ1dHRvbk1lbnUoQnV0dG9uLCB7c2VsZn0sIHsNCgkJCVsiU2F2ZSJdID0gRGF0YUNvbm5lY3Rpb24oIlNhdmVTY3JpcHQiKSwNCgkJCVsiQ2FsbCBSZW1vdGUiXSA9IERhdGFDb25uZWN0aW9uKCJNYWtlU2NyaXB0IiwgIlJlbW90ZSIpLA0KCQkJWyJCbG9jayBSZW1vdGUiXSA9IERhdGFDb25uZWN0aW9uKCJNYWtlU2NyaXB0IiwgIkJsb2NrIiksDQoJCQlbIlJlcGVhdCBGb3IiXSA9IERhdGFDb25uZWN0aW9uKCJNYWtlU2NyaXB0IiwgIlJlcGVhdCIpLA0KCQkJWyJTcGFtIFJlbW90ZSJdID0gRGF0YUNvbm5lY3Rpb24oIk1ha2VTY3JpcHQiLCAiU3BhbSIpDQoJCX0pDQoJZW5kDQoJZnVuY3Rpb24gRGF0YTpTYXZlU2NyaXB0KCkNCgkJbG9jYWwgRmlsZVBhdGggPSBHZW5lcmF0aW9uOlRpbWVTdGFtcEZpbGUoc2VsZi5UYXNrKQ0KCQl3cml0ZWZpbGUoRmlsZVBhdGgsIENvZGVFZGl0b3I6R2V0VGV4dCgpKQ0KDQoJCVVpOlNob3dNb2RhbCh7IlNhdmVkIHNjcmlwdCB0byIsIEZpbGVQYXRofSkNCgllbmQNCglmdW5jdGlvbiBEYXRhOlNhdmVCeXRlY29kZSgpDQoJCS0tLy8gUHJvYmxlbSBjaGVjaw0KCQlpZiBub3QgU2NyaXB0Q2hlY2soU2NyaXB0LCB0cnVlKSB0aGVuIHJldHVybiBlbmQNCg0KCQktLS8vIGdldHNjcmlwdGJ5dGVjb2RlDQogICAgCWxvY2FsIFN1Y2Nlc3MsIEJ5dGVjb2RlID0gcGNhbGwoZ2V0c2NyaXB0Ynl0ZWNvZGUsIFNjcmlwdCkNCgkJaWYgbm90IFN1Y2Nlc3MgdGhlbg0KCQkJVWk6U2hvd01vZGFsKHsiRmFpbGVkIHRvIGdldCBTY3JpcHRlIGJ5dGVjb2RlICgtOTk5OTk5OSBBVVJBKSJ9KQ0KCQkJcmV0dXJuDQoJCWVuZA0KDQoJCS0tLy8gU2F2ZSBmaWxlDQoJCWxvY2FsIFBhdGhCYXNlID0gYHtTY3JpcHR9ICVzLnR4dGANCgkJbG9jYWwgRmlsZVBhdGggPSBHZW5lcmF0aW9uOlRpbWVTdGFtcEZpbGUoUGF0aEJhc2UpDQoJCXdyaXRlZmlsZShGaWxlUGF0aCwgQnl0ZWNvZGUpDQoNCgkJVWk6U2hvd01vZGFsKHsiU2F2ZWQgYnl0ZWNvZGUgdG8iLCBGaWxlUGF0aH0pDQoJZW5kDQoJZnVuY3Rpb24gRGF0YTpNYWtlU2NyaXB0KFNjcmlwdFR5cGU6IHN0cmluZykNCgkJbG9jYWwgU2NyaXB0ID0gR2VuZXJhdGlvbjpSZW1vdGVTY3JpcHQoTW9kdWxlLCBzZWxmLCBTY3JpcHRUeXBlKQ0KCQlTZXRJREVUZXh0KFNjcmlwdCwgYEVkaXRpbmc6IHtSZW1vdGVOYW1lfS5sdWFgKQ0KCWVuZA0KCWZ1bmN0aW9uIERhdGE6UmVwZWF0Q2FsbCgpDQoJCWxvY2FsIFNpZ25hbCA9IEhvb2s6SW5kZXgoUmVtb3RlLCBNZXRob2QpDQoNCgkJaWYgSXNSZWNlaXZlIHRoZW4NCgkJCWZpcmVzaWduYWwoU2lnbmFsLCBQcm9jZXNzOlVucGFjayhBcmdzKSkNCgkJZWxzZQ0KCQkJU2lnbmFsKFJlbW90ZSwgUHJvY2VzczpVbnBhY2soQXJncykpDQoJCWVuZA0KCWVuZA0KCWZ1bmN0aW9uIERhdGE6R2V0UmV0dXJuKCkNCgkJbG9jYWwgUmV0dXJuVmFsdWVzID0gc2VsZi5SZXR1cm5WYWx1ZXMNCg0KCQktLS8vIEVycm9yIG1lc3NhZ2VzDQoJCWlmIG5vdCBJc1JlbW90ZUZ1bmN0aW9uIHRoZW4NCgkJCVVpOlNob3dNb2RhbCh7IlRoZSBSZW1vdGUgaXMgbm90IGEgUmVtb3RlIEZ1bmN0aW9uICgtOTk5OTk5OSBBVVJBKSJ9KQ0KCQkJcmV0dXJuDQoJCWVuZA0KCQlpZiBub3QgUmV0dXJuVmFsdWVzIHRoZW4NCgkJCVVpOlNob3dNb2RhbCh7Ik5vIHJldHVybiB2YWx1ZXMgKC05OTk5OTk5IEFVUkEpIn0pDQoJCQlyZXR1cm4NCgkJZW5kDQoNCgkJLS0vLyBHZW5lcmF0ZSBzY3JpcHQNCgkJbG9jYWwgU2NyaXB0ID0gR2VuZXJhdGlvbjpUYWJsZVNjcmlwdChNb2R1bGUsIFJldHVyblZhbHVlcykNCgkJU2V0SURFVGV4dChTY3JpcHQsIGBSZXR1cm4gVmFsdWVzIGZvcjoge1JlbW90ZU5hbWV9YCkNCgllbmQNCglmdW5jdGlvbiBEYXRhOkdlbmVyYXRlSW5mbygpDQoJCS0tLy8gUHJvYmxlbSBjaGVjaw0KCQlpZiBub3QgU2NyaXB0Q2hlY2sobmlsLCB0cnVlKSB0aGVuIHJldHVybiBlbmQNCg0KCQktLS8vIEdlbmVyYXRlIHNjcmlwdA0KCQlsb2NhbCBTY3JpcHQgPSBHZW5lcmF0aW9uOkFkdmFuY2VkSW5mbyhNb2R1bGUsIHNlbGYpDQoJCVNldElERVRleHQoU2NyaXB0LCBgQWR2YW5jZWQgSW5mbyBmb3I6IHtSZW1vdGVOYW1lfWApDQoJZW5kDQoJZnVuY3Rpb24gRGF0YTpEZWNvbXBpbGUoV2hpY2hTY3JpcHQ6IHN0cmluZykNCgkJbG9jYWwgRGVjb21waWxlUG9wb3V0ID0gRmxhZ3M6R2V0RmxhZ1ZhbHVlKCJEZWNvbXBpbGVQb3BvdXQiKQ0KCQlsb2NhbCBUb0RlY29tcGlsZSA9IERhdGFbV2hpY2hTY3JpcHRdDQoJCWxvY2FsIEVkaXRvciA9IENvZGVFZGl0b3INCg0KCQktLS8vIFByb2JsZW0gY2hlY2sNCgkJaWYgbm90IFNjcmlwdENoZWNrKFRvRGVjb21waWxlLCB0cnVlKSB0aGVuIHJldHVybiBlbmQNCgkJbG9jYWwgVGFzayA9IFVpOkZpbHRlck5hbWUoYFZpZXdpbmc6IHtUb0RlY29tcGlsZX0ubHVhYCwgMjAwKQ0KCQkNCgkJLS0vLyBBdXRvbWF0aWNhbGx5IFBvcC1vdXQgdGhlIGVkaXRvciBmb3IgZGVjb21waWxpbmcgaWYgZW5hYmxlZA0KCQlpZiBEZWNvbXBpbGVQb3BvdXQgdGhlbg0KCQkJRWRpdG9yID0gVWk6TWFrZUVkaXRvclBvcG91dFdpbmRvdygiIiwgew0KCQkJCVRpdGxlID0gVGFzaw0KCQkJfSkNCgkJZW5kDQoNCgkJVWk6RGVjb21waWxlKEVkaXRvciwgVG9EZWNvbXBpbGUpDQoJZW5kDQoJDQoJLS0vLyBSZW1vdGVPcHRpb25zDQoJc2VsZjpDcmVhdGVPcHRpb25zRm9yRGljdChUYWIsIFJlbW90ZURhdGEsIGZ1bmN0aW9uKCkNCgkJUHJvY2VzczpVcGRhdGVSZW1vdGVEYXRhKElkLCBSZW1vdGVEYXRhKQ0KCWVuZCkNCg0KCS0tLy8gSW5zdGFuY2Ugb3B0aW9ucw0KCXNlbGY6Q3JlYXRlQnV0dG9ucyhUYWIsIHsNCgkJQmFzZSA9IHsNCgkJCVNpemUgPSBVRGltMi5uZXcoMSwgMCwgMCwgMjApLA0KCQkJQXV0b21hdGljU2l6ZSA9IEVudW0uQXV0b21hdGljU2l6ZS5ZLA0KCQl9LA0KCQlCdXR0b25zID0gew0KCQkJew0KCQkJCVRleHQgPSAiQ29weSBzY3JpcHQgcGF0aCIsDQoJCQkJQ2FsbGJhY2sgPSBmdW5jdGlvbigpDQoJCQkJCVNldENsaXBib2FyZChQYXJzZXI6TWFrZVBhdGhTdHJpbmcoew0KCQkJCQkJT2JqZWN0ID0gU2NyaXB0LA0KCQkJCQkJTm9WYXJpYWJsZXMgPSB0cnVlDQoJCQkJCX0pKQ0KCQkJCWVuZCwNCgkJCX0sDQoJCQl7DQoJCQkJVGV4dCA9ICJDb3B5IHJlbW90ZSBwYXRoIiwNCgkJCQlDYWxsYmFjayA9IGZ1bmN0aW9uKCkNCgkJCQkJU2V0Q2xpcGJvYXJkKFBhcnNlcjpNYWtlUGF0aFN0cmluZyh7DQoJCQkJCQlPYmplY3QgPSBSZW1vdGUsDQoJCQkJCQlOb1ZhcmlhYmxlcyA9IHRydWUNCgkJCQkJfSkpDQoJCQkJZW5kLA0KCQkJfSwNCgkJCXsNCgkJCQlUZXh0ID0gIlJlbW92ZSBsb2ciLA0KCQkJCUNhbGxiYWNrID0gZnVuY3Rpb24oKQ0KCQkJCQlJbmZvU2VsZWN0b3I6UmVtb3ZlVGFiKFRhYikNCgkJCQkJRGF0YS5TZWxlY3RhYmxlOlJlbW92ZSgpDQoJCQkJCUhlYWRlckRhdGE6UmVtb3ZlKCkNCgkJCQkJQWN0aXZlRGF0YSA9IG5pbA0KCQkJCWVuZCwNCgkJCX0sDQoJCQl7DQoJCQkJVGV4dCA9ICJEdW1wIGxvZ3MiLA0KCQkJCUNhbGxiYWNrID0gZnVuY3Rpb24oKQ0KCQkJCQlsb2NhbCBMb2dzID0gSGVhZGVyRGF0YS5FbnRyaWVzDQoJCQkJCWxvY2FsIEZpbGVQYXRoID0gR2VuZXJhdGlvbjpEdW1wTG9ncyhMb2dzKQ0KCQkJCQlzZWxmOlNob3dNb2RhbCh7IlNhdmVkIGR1bXAgdG8iLCBGaWxlUGF0aH0pDQoJCQkJZW5kLA0KCQkJfSwNCgkJCXsNCgkJCQlUZXh0ID0gIlZpZXcgQ29ubmVjdGlvbnMiLA0KCQkJCUNhbGxiYWNrID0gZnVuY3Rpb24oKQ0KCQkJCQlsb2NhbCBNZXRob2QgPSBDbGFzc0RhdGEuUmVjZWl2ZVsxXQ0KCQkJCQlsb2NhbCBTaWduYWwgPSBSZW1vdGVbTWV0aG9kXQ0KCQkJCQlzZWxmOlZpZXdDb25uZWN0aW9ucyhSZW1vdGVOYW1lLCBTaWduYWwpDQoJCQkJZW5kLA0KCQkJfQ0KCQl9DQoJfSkNCg0KCS0tLy8gUmVtb3RlIGluZm9ybWF0aW9uIHRhYmxlDQoJc2VsZjpEaXNwbGF5VGFibGUoVGFiLCB7DQoJCVJvd3MgPSB7Ik5hbWUiLCAiVmFsdWUifSwNCgkJVGFibGUgPSBEYXRhLA0KCQlUb0Rpc3BsYXkgPSBUb0Rpc3BsYXksDQoJCUZsYWdzID0gew0KCQkJQm9yZGVyID0gdHJ1ZSwNCgkJCVJvd0JhY2tncm91bmQgPSB0cnVlLA0KCQkJTWF4Q29sdW1ucyA9IDINCgkJfQ0KCX0pDQoJDQoJLS0vLyBBcmd1bWVudHMgdGFibGUgc2NyaXB0DQoJaWYgVGFibGVBcmdzIHRoZW4NCgkJbG9jYWwgUGFyc2VkID0gR2VuZXJhdGlvbjpUYWJsZVNjcmlwdChNb2R1bGUsIEFyZ3MpDQoJCVNldElERVRleHQoUGFyc2VkLCBgQXJndW1lbnRzIGZvciB7UmVtb3RlTmFtZX1gKQ0KCQlyZXR1cm4NCgllbmQNCg0KCS0tLy8gUmVtb3RlIGNhbGwgc2NyaXB0DQoJRGF0YTpNYWtlU2NyaXB0KCJSZW1vdGUiKQ0KZW5kDQoNCmZ1bmN0aW9uIFVpOlZpZXdDb25uZWN0aW9ucyhSZW1vdGVOYW1lOiBzdHJpbmcsIFNpZ25hbDogUkJYU2NyaXB0Q29ubmVjdGlvbikNCglsb2NhbCBXaW5kb3cgPSBzZWxmOkNyZWF0ZVdpbmRvdyh7DQoJCVRpdGxlID0gYENvbm5lY3Rpb25zIGZvcjoge1JlbW90ZU5hbWV9YCwNCgkJU2l6ZSA9IFVEaW0yLmZyb21PZmZzZXQoNDUwLCAyNTApDQoJfSkNCg0KCWxvY2FsIFRvRGlzcGxheSA9IHsNCgkJIkVuYWJsZWQiLA0KCQkiTHVhQ29ubmVjdGlvbiIsDQoJCSJTY3JpcHQiDQoJfQ0KDQoJLS0vLyBHZXQgRmlsdGVyZWQgY29ubmVjdGlvbnMNCglsb2NhbCBDb25uZWN0aW9ucyA9IFByb2Nlc3M6RmlsdGVyQ29ubmVjdGlvbnMoU2lnbmFsLCBUb0Rpc3BsYXkpDQoNCgktLS8vIFRhYmxlDQoJbG9jYWwgVGFibGUgPSBXaW5kb3c6VGFibGUoew0KCQlCb3JkZXIgPSB0cnVlLA0KCQlSb3dCYWNrZ3JvdW5kID0gdHJ1ZSwNCgkJTWF4Q29sdW1ucyA9IDMNCgl9KQ0KDQoJbG9jYWwgQnV0dG9uc0ZvclZhbHVlcyA9IHsNCgkJWyJTY3JpcHQiXSA9IGZ1bmN0aW9uKFJvdywgVmFsdWUpDQoJCQlSb3c6QnV0dG9uKHsNCgkJCQlUZXh0ID0gIkRlY29tcGlsZSIsDQoJCQkJQ2FsbGJhY2sgPSBmdW5jdGlvbigpDQoJCQkJCWxvY2FsIFRhc2sgPSBzZWxmOkZpbHRlck5hbWUoYFZpZXdpbmc6IHtWYWx1ZX0ubHVhYCwgMjAwKQ0KCQkJCQlsb2NhbCBFZGl0b3IgPSBzZWxmOk1ha2VFZGl0b3JQb3BvdXRXaW5kb3cobmlsLCB7DQoJCQkJCQlUaXRsZSA9IFRhc2sNCgkJCQkJfSkNCgkJCQkJc2VsZjpEZWNvbXBpbGUoRWRpdG9yLCBWYWx1ZSkNCgkJCQllbmQNCgkJCX0pDQoJCWVuZCwNCgkJWyJFbmFibGVkIl0gPSBmdW5jdGlvbihSb3csIEVuYWJsZWQsIENvbm5lY3Rpb24pDQoJCQlSb3c6QnV0dG9uKHsNCgkJCQlUZXh0ID0gRW5hYmxlZCBhbmQgIkRpc2FibGUiIG9yICJFbmFibGUiLA0KCQkJCUNhbGxiYWNrID0gZnVuY3Rpb24oc2VsZikNCgkJCQkJRW5hYmxlZCA9IG5vdCBFbmFibGVkDQoJCQkJCXNlbGYuVGV4dCA9IEVuYWJsZWQgYW5kICJEaXNhYmxlIiBvciAiRW5hYmxlIg0KDQoJCQkJCS0tLy8gRW5hYmxlIG9yIGRpc2FibGUgdGhlIGNvbm5lY3Rpb24NCgkJCQkJaWYgRW5hYmxlZCB0aGVuDQoJCQkJCQlDb25uZWN0aW9uOkVuYWJsZSgpDQoJCQkJCWVsc2UNCgkJCQkJCUNvbm5lY3Rpb246RGlzYWJsZSgpDQoJCQkJCWVuZA0KCQkJCWVuZA0KCQkJfSkNCgkJZW5kDQoJfQ0KDQoJLS0vLyBNYWtlIGhlYWRlcnMgb24gdGhlIHRhYmxlDQoJc2VsZjpNYWtlVGFibGVIZWFkZXJzKFRhYmxlLCBUb0Rpc3BsYXkpDQoNCglmb3IgXywgQ29ubmVjdGlvbiBpbiBDb25uZWN0aW9ucyBkbw0KCQlsb2NhbCBSb3cgPSBUYWJsZTpSb3coKQ0KDQoJCWZvciBfLCBQcm9wZXJ0eSBpbiBUb0Rpc3BsYXkgZG8NCgkJCWxvY2FsIENvbHVtbiA9IFJvdzpOZXh0Q29sdW1uKCkNCgkJCWxvY2FsIENvbHVtblJvdyA9IENvbHVtbjpSb3coKQ0KDQoJCQlsb2NhbCBWYWx1ZSA9IENvbm5lY3Rpb25bUHJvcGVydHldDQoJCQlsb2NhbCBDYWxsYmFjayA9IEJ1dHRvbnNGb3JWYWx1ZXNbUHJvcGVydHldDQoNCgkJCS0tLy8gVmFsdWUgbGFiZWwNCgkJCUNvbHVtblJvdzpMYWJlbCh7VGV4dD1ge1ZhbHVlfWB9KQ0KDQoJCQktLS8vIEFkZCBidXR0b25zDQoJCQlpZiBDYWxsYmFjayB0aGVuDQoJCQkJQ2FsbGJhY2soQ29sdW1uUm93LCBWYWx1ZSwgQ29ubmVjdGlvbikNCgkJCWVuZA0KCQllbmQNCgllbmQNCg0KCS0tLy8gQ2VudGVyIFdpbmRvdw0KCVdpbmRvdzpDZW50ZXIoKQ0KZW5kDQoNCmZ1bmN0aW9uIFVpOkdldFJlbW90ZUhlYWRlcihEYXRhOiBMb2cpDQoJbG9jYWwgTG9nTGltaXQgPSBzZWxmLkxvZ0xpbWl0DQoJbG9jYWwgTG9ncyA9IHNlbGYuTG9ncw0KCWxvY2FsIFJlbW90ZXNMaXN0ID0gc2VsZi5SZW1vdGVzTGlzdA0KDQoJLS0vLyBSZW1vdGUgaW5mbw0KCWxvY2FsIElkID0gRGF0YS5JZA0KCWxvY2FsIFJlbW90ZSA9IERhdGEuUmVtb3RlDQoJbG9jYWwgUmVtb3RlTmFtZSA9IHNlbGY6RmlsdGVyTmFtZShge1JlbW90ZX1gLCAzMCkNCg0KCS0tLy8gTm9UcmVlTm9kZXMNCglsb2NhbCBOb1RyZWVOb2RlcyA9IEZsYWdzOkdldEZsYWdWYWx1ZSgiTm9UcmVlTm9kZXMiKQ0KDQoJLS0vLyBDaGVjayBmb3IgZXhpc3RpbmcgVHJlZU5vZGUNCglsb2NhbCBFeGlzdGluZyA9IExvZ3NbSWRdDQoJaWYgRXhpc3RpbmcgdGhlbiByZXR1cm4gRXhpc3RpbmcgZW5kDQoNCgktLS8vIEhlYWRlciBkYXRhDQoJbG9jYWwgSGVhZGVyRGF0YSA9IHsJDQoJCUxvZ0NvdW50ID0gMCwNCgkJRGF0YSA9IERhdGEsDQoJCUVudHJpZXMgPSB7fQ0KCX0NCg0KCS0tLy8gSW5jcmVtZW50IHRyZWVub2RlIGNvdW50DQoJUmVtb3Rlc0NvdW50ICs9IDENCg0KCS0tLy8gQ3JlYXRlIG5ldyB0cmVlbm9kZSBlbGVtZW50DQoJaWYgbm90IE5vVHJlZU5vZGVzIHRoZW4NCgkJSGVhZGVyRGF0YS5UcmVlTm9kZSA9IFJlbW90ZXNMaXN0OlRyZWVOb2RlKHsNCgkJCUxheW91dE9yZGVyID0gLTEgKiBSZW1vdGVzQ291bnQsDQoJCQlUaXRsZSA9IFJlbW90ZU5hbWUNCgkJfSkNCgllbmQNCg0KCWZ1bmN0aW9uIEhlYWRlckRhdGE6Q2hlY2tMaW1pdCgpDQoJCWxvY2FsIEVudHJpZXMgPSBzZWxmLkVudHJpZXMNCgkJaWYgI0VudHJpZXMgPCBMb2dMaW1pdCB0aGVuIHJldHVybiBlbmQNCgkJCQ0KCQktLS8vIEdldCBhbmQgcmVtb3ZlIGxhc3QgZWxlbWVudA0KCQlsb2NhbCBMb2cgPSB0YWJsZS5yZW1vdmUoRW50cmllcywgMSkNCgkJTG9nLlNlbGVjdGFibGU6UmVtb3ZlKCkNCgllbmQNCg0KCWZ1bmN0aW9uIEhlYWRlckRhdGE6TG9nQWRkZWQoRGF0YSkNCgkJLS0vLyBJbmNyZW1lbnQgbG9nIGNvdW50DQoJCXNlbGYuTG9nQ291bnQgKz0gMQ0KCQlzZWxmOkNoZWNrTGltaXQoKQ0KDQoJCS0tLy8gQWRkIGVudHJ5DQoJCWxvY2FsIEVudHJpZXMgPSBzZWxmLkVudHJpZXMNCgkJdGFibGUuaW5zZXJ0KEVudHJpZXMsIERhdGEpDQoJCQ0KCQlyZXR1cm4gc2VsZg0KCWVuZA0KDQoJZnVuY3Rpb24gSGVhZGVyRGF0YTpSZW1vdmUoKQ0KCQktLS8vIFJlbW92ZSBUcmVlTm9kZQ0KCQlsb2NhbCBUcmVlTm9kZSA9IHNlbGYuVHJlZU5vZGUNCgkJaWYgVHJlZU5vZGUgdGhlbg0KCQkJVHJlZU5vZGU6UmVtb3ZlKCkNCgkJZW5kDQoNCgkJLS0vLyBDbGVhciB0YWJsZXMgZnJvbSBtZW1vcnkNCgkJTG9nc1tJZF0gPSBuaWwNCgkJdGFibGUuY2xlYXIoSGVhZGVyRGF0YSkNCgllbmQNCg0KCUxvZ3NbSWRdID0gSGVhZGVyRGF0YQ0KCXJldHVybiBIZWFkZXJEYXRhDQplbmQNCg0KZnVuY3Rpb24gVWk6Q2xlYXJMb2dzKCkNCglsb2NhbCBMb2dzID0gc2VsZi5Mb2dzDQoJbG9jYWwgUmVtb3Rlc0xpc3QgPSBzZWxmLlJlbW90ZXNMaXN0DQoNCgktLS8vIENsZWFyIGFsbCBlbGVtZW50cw0KCVJlbW90ZXNDb3VudCA9IDANCglSZW1vdGVzTGlzdDpDbGVhckNoaWxkRWxlbWVudHMoKQ0KDQoJLS0vLyBDbGVhciBsb2dzIGZyb20gbWVtb3J5DQoJdGFibGUuY2xlYXIoTG9ncykNCmVuZA0KDQpmdW5jdGlvbiBVaTpRdWV1ZUxvZyhEYXRhKQ0KCWxvY2FsIExvZ1F1ZXVlID0gc2VsZi5Mb2dRdWV1ZQ0KCVByb2Nlc3M6TWVyZ2UoRGF0YSwgew0KCQlBcmdzID0gUHJvY2VzczpEZWVwQ2xvbmVUYWJsZShEYXRhLkFyZ3MpLA0KCX0pDQoNCglpZiBEYXRhLlJldHVyblZhbHVlcyB0aGVuDQogICAgICAgIERhdGEuUmV0dXJuVmFsdWVzID0gUHJvY2VzczpEZWVwQ2xvbmVUYWJsZShEYXRhLlJldHVyblZhbHVlcykNCiAgICBlbmQNCgkNCiAgICB0YWJsZS5pbnNlcnQoTG9nUXVldWUsIERhdGEpDQplbmQNCg0KZnVuY3Rpb24gVWk6UHJvY2Vzc0xvZ1F1ZXVlKCkNCglsb2NhbCBRdWV1ZSA9IHNlbGYuTG9nUXVldWUNCiAgICBpZiAjUXVldWUgPD0gMCB0aGVuIHJldHVybiBlbmQNCg0KCS0tLy8gQ3JlYXRlIGEgbG9nIGVsZW1lbnQgZm9yIGVhY2ggaW4gdGhlIFF1ZXVlDQogICAgZm9yIEluZGV4LCBEYXRhIGluIG5leHQsIFF1ZXVlIGRvDQogICAgICAgIHNlbGY6Q3JlYXRlTG9nKERhdGEpDQogICAgICAgIHRhYmxlLnJlbW92ZShRdWV1ZSwgSW5kZXgpDQogICAgZW5kDQplbmQNCg0KZnVuY3Rpb24gVWk6QmVnaW5Mb2dTZXJ2aWNlKCkNCgljb3JvdXRpbmUud3JhcChmdW5jdGlvbigpDQoJCXdoaWxlIHRydWUgZG8NCgkJCXNlbGY6UHJvY2Vzc0xvZ1F1ZXVlKCkNCgkJCXRhc2sud2FpdCgpDQoJCWVuZA0KCWVuZCkoKQ0KZW5kDQoNCmZ1bmN0aW9uIFVpOkZpbHRlck5hbWUoTmFtZTogc3RyaW5nLCBDaGFyYWN0ZXJMaW1pdDogbnVtYmVyPyk6IHN0cmluZw0KCWxvY2FsIFRyaW1tZWQgPSBOYW1lOnN1YigxLCBDaGFyYWN0ZXJMaW1pdCBvciAyMCkNCglsb2NhbCBGaWx0cmVkID0gVHJpbW1lZDpnc3ViKCJbXG5ccl0iLCAiIikNCglGaWx0cmVkID0gR2VuZXJhdGlvbjpNYWtlUHJpbnRhYmxlKEZpbHRyZWQpDQoNCglyZXR1cm4gRmlsdHJlZA0KZW5kDQoNCmZ1bmN0aW9uIFVpOkNyZWF0ZUxvZyhEYXRhOiBMb2cpDQoJLS0vLyBVbnBhY2sgbG9nIGRhdGENCiAgICBsb2NhbCBSZW1vdGUgPSBEYXRhLlJlbW90ZQ0KCWxvY2FsIE1ldGhvZCA9IERhdGEuTWV0aG9kDQogICAgbG9jYWwgQXJncyA9IERhdGEuQXJncw0KICAgIGxvY2FsIElzUmVjZWl2ZSA9IERhdGEuSXNSZWNlaXZlDQoJbG9jYWwgSWQgPSBEYXRhLklkDQoJbG9jYWwgVGltZXN0YW1wID0gRGF0YS5UaW1lc3RhbXANCglsb2NhbCBJc0V4cGxvaXQgPSBEYXRhLklzRXhwbG9pdA0KCQ0KCWxvY2FsIElzTmlsUGFyZW50ID0gSG9vazpJbmRleChSZW1vdGUsICJQYXJlbnQiKSA9PSBuaWwNCglsb2NhbCBSZW1vdGVEYXRhID0gUHJvY2VzczpHZXRSZW1vdGVEYXRhKElkKQ0KDQoJLS0vLyBQYXVzZWQNCglsb2NhbCBQYXVzZWQgPSBGbGFnczpHZXRGbGFnVmFsdWUoIlBhdXNlZCIpDQoJaWYgUGF1c2VkIHRoZW4gcmV0dXJuIGVuZA0KDQoJLS0vLyBDaGVjayBjYWxsZXIgKElnbm9yZSBleHBsb2l0IGNhbGxzKQ0KCWxvY2FsIExvZ0V4cGxvaXQgPSBGbGFnczpHZXRGbGFnVmFsdWUoIkxvZ0V4cGxvaXQiKQ0KCWlmIG5vdCBMb2dFeHBsb2l0IGFuZCBJc0V4cGxvaXQgdGhlbiByZXR1cm4gZW5kDQoNCgktLS8vIElnbm9yZU5pbA0KCWxvY2FsIElnbm9yZU5pbCA9IEZsYWdzOkdldEZsYWdWYWx1ZSgiSWdub3JlTmlsIikNCglpZiBJZ25vcmVOaWwgYW5kIElzTmlsUGFyZW50IHRoZW4gcmV0dXJuIGVuZA0KDQogICAgLS0vLyBMb2dSZWNpdmVzIGNoZWNrDQoJbG9jYWwgTG9nUmVjaXZlcyA9IEZsYWdzOkdldEZsYWdWYWx1ZSgiTG9nUmVjaXZlcyIpDQoJaWYgbm90IExvZ1JlY2l2ZXMgYW5kIElzUmVjZWl2ZSB0aGVuIHJldHVybiBlbmQNCg0KCWxvY2FsIFNlbGVjdE5ld2VzdCA9IEZsYWdzOkdldEZsYWdWYWx1ZSgiU2VsZWN0TmV3ZXN0IikNCglsb2NhbCBOb1RyZWVOb2RlcyA9IEZsYWdzOkdldEZsYWdWYWx1ZSgiTm9UcmVlTm9kZXMiKQ0KDQogICAgLS0vLyBFeGNsdWRlZCBjaGVjaw0KICAgIGlmIFJlbW90ZURhdGEuRXhjbHVkZWQgdGhlbiByZXR1cm4gZW5kDQoNCgktLS8vIERlc2VyaWFsaXplIGFyZ3VtZW50cw0KCUFyZ3MgPSBDb21tdW5pY2F0aW9uOkRlc2VyaWFsaXplVGFibGUoQXJncykNCg0KCS0tLy8gRGVlcCBjbG9uZSBkYXRhDQoJbG9jYWwgQ2xvbmVkQXJncyA9IFByb2Nlc3M6RGVlcENsb25lVGFibGUoQXJncykNCglEYXRhLkFyZ3MgPSBDbG9uZWRBcmdzDQoJRGF0YS5WYWx1ZVN3YXBzID0gR2VuZXJhdGlvbjpNYWtlVmFsdWVTd2Fwc1RhYmxlKFRpbWVzdGFtcCkNCg0KCS0tLy8gR2VuZXJhdGUgbG9nIHRpdGxlDQoJbG9jYWwgQ29sb3IgPSBDb25maWcuTWV0aG9kQ29sb3JzW01ldGhvZDpsb3dlcigpXQ0KCWxvY2FsIFRleHQgPSBOb1RyZWVOb2RlcyBhbmQgYHtSZW1vdGV9IHwge01ldGhvZH1gIG9yIE1ldGhvZA0KDQoJLS0vLyBGaW5kU3RyaW5nRm9yTmFtZSBjaGVjaw0KCWxvY2FsIEZpbmRTdHJpbmcgPSBGbGFnczpHZXRGbGFnVmFsdWUoIkZpbmRTdHJpbmdGb3JOYW1lIikNCglpZiBGaW5kU3RyaW5nIHRoZW4NCgkJZm9yIF8sIEFyZyBpbiBuZXh0LCBDbG9uZWRBcmdzIGRvDQoJCQlpZiB0eXBlb2YoQXJnKSA9PSAic3RyaW5nIiB0aGVuDQoJCQkJbG9jYWwgRmlsdHJlZCA9IHNlbGY6RmlsdGVyTmFtZShBcmcpDQoJCQkJVGV4dCA9IGB7RmlsdHJlZH0gfCB7VGV4dH1gDQoJCQkJYnJlYWsNCgkJCWVuZA0KCQllbmQNCgllbmQNCg0KCS0tLy8gRmV0Y2ggSGVhZGVyRGF0YSBieSB0aGUgUmVtb3RlSUQgdXNlZCBmb3Igc3RhY2tpbmcNCglsb2NhbCBIZWFkZXIgPSBzZWxmOkdldFJlbW90ZUhlYWRlcihEYXRhKQ0KCWxvY2FsIFJlbW90ZXNMaXN0ID0gc2VsZi5SZW1vdGVzTGlzdA0KDQoJbG9jYWwgTG9nQ291bnQgPSBIZWFkZXIuTG9nQ291bnQNCglsb2NhbCBUcmVlTm9kZSA9IEhlYWRlci5UcmVlTm9kZSANCglsb2NhbCBQYXJlbnQgPSBUcmVlTm9kZSBvciBSZW1vdGVzTGlzdA0KDQoJLS0vLyBJbmNyZWFzZSBsb2cgY291bnQgLSBUcmVlTm9kZXMgYXJlIGluIEdldFJlbW90ZUhlYWRlciBmdW5jdGlvbg0KCWlmIE5vVHJlZU5vZGVzIHRoZW4NCgkJUmVtb3Rlc0NvdW50ICs9IDENCgkJTG9nQ291bnQgPSBSZW1vdGVzQ291bnQNCgllbmQNCg0KICAgIC0tLy8gQ3JlYXRlIGZvY3VzIGJ1dHRvbg0KCURhdGEuSGVhZGVyRGF0YSA9IEhlYWRlcg0KCURhdGEuU2VsZWN0YWJsZSA9IFBhcmVudDpTZWxlY3RhYmxlKHsNCgkJVGV4dCA9IFRleHQsDQogICAgICAgIExheW91dE9yZGVyID0gLTEgKiBMb2dDb3VudCwNCgkJVGV4dENvbG9yMyA9IENvbG9yLA0KCQlUZXh0WEFsaWdubWVudCA9IEVudW0uVGV4dFhBbGlnbm1lbnQuTGVmdCwNCgkJQ2FsbGJhY2sgPSBmdW5jdGlvbigpDQoJCQlzZWxmOlNldEZvY3VzZWRSZW1vdGUoRGF0YSkNCgkJZW5kLA0KICAgIH0pDQoNCglIZWFkZXI6TG9nQWRkZWQoRGF0YSkNCg0KCS0tLy8gQXV0byBzZWxlY3QgY2hlY2sNCglsb2NhbCBHcm91cFNlbGVjdGVkID0gQWN0aXZlRGF0YSBhbmQgQWN0aXZlRGF0YS5IZWFkZXJEYXRhID09IEhlYWRlcg0KCWlmIFNlbGVjdE5ld2VzdCBhbmQgR3JvdXBTZWxlY3RlZCB0aGVuDQoJCXNlbGY6U2V0Rm9jdXNlZFJlbW90ZShEYXRhKQ0KCWVuZA0KZW5kDQoNCnJldHVybiBVaQ==]]
},Generation={'base64',
[[dHlwZSB0YWJsZSA9IHsNCglbYW55XTogYW55DQp9DQoNCnR5cGUgUmVtb3RlRGF0YSA9IHsNCglSZW1vdGU6IEluc3RhbmNlLA0KCUlzUmVjZWl2ZTogYm9vbGVhbj8sDQoJTWV0YU1ldGhvZDogc3RyaW5nLA0KCUFyZ3M6IHRhYmxlLA0KCU1ldGhvZDogc3RyaW5nLA0KICAgIFRyYW5zZmVyVHlwZTogc3RyaW5nLA0KCVZhbHVlUmVwbGFjZW1lbnRzOiB0YWJsZSwNCglOb1ZhcmlhYmxlczogYm9vbGVhbj8NCn0NCg0KLS0vLyBNb2R1bGUNCmxvY2FsIEdlbmVyYXRpb24gPSB7DQoJRHVtcEJhc2VOYW1lID0gIlNpZ21hU3B5LUR1bXAgJXMubHVhIiwgLS0gIi0tIEdlbmVyYXRlZCB3aXRoIHNpZ21hIHNweSBCT0lJSUlJSUlJSSAoKzk5OTk5OTkgQVVSQSlcbiINCglIZWFkZXIgPSAiLS0gR2VuZXJhdGVkIHdpdGggU2lnbWEgU3B5IEdpdGh1YjogaHR0cHM6Ly9naXRodWIuY29tL2RlcHRoc28vU2lnbWEtU3B5XG4iLA0KCVNjcmlwdFRlbXBsYXRlcyA9IHsNCgkJWyJSZW1vdGUiXSA9IHsNCgkJCXsiJVJlbW90ZUNhbGwlIn0NCgkJfSwNCgkJWyJTcGFtIl0gPSB7DQoJCQl7IndoaWxlIHdhaXQoKSBkbyJ9LA0KCQkJeyIlUmVtb3RlQ2FsbCUiLCAyfSwNCgkJCXsiZW5kIn0NCgkJfSwNCgkJWyJSZXBlYXQiXSA9IHsNCgkJCXsiZm9yIEluZGV4ID0gMSwgMTAgZG8ifSwNCgkJCXsiJVJlbW90ZUNhbGwlIiwgMn0sDQoJCQl7ImVuZCJ9DQoJCX0sDQoJCVsiQmxvY2siXSA9IHsNCgkJCVsiX19pbmRleCJdID0gew0KCQkJCXsibG9jYWwgT2xkOyBPbGQgPSBob29rZnVuY3Rpb24oJVNpZ25hbCUsIGZ1bmN0aW9uKHNlbGYsIC4uLikifSwNCgkJCQl7ImlmIHNlbGYgPT0gJVJlbW90ZSUgdGhlbiIsIDJ9LA0KCQkJCXsicmV0dXJuIiwgM30sDQoJCQkJeyJlbmQiLCAyfSwNCgkJCQl7InJldHVybiBPbGQoc2VsZiwgLi4uKSIsIDJ9LA0KCQkJCXsiZW5kKSJ9DQoJCQl9LA0KCQkJWyJfX25hbWVjYWxsIl0gPSB7DQoJCQkJeyJsb2NhbCBPbGQ7IE9sZCA9IGhvb2ttZXRhbWV0aG9kKGdhbWUsIFwiX19uYW1lY2FsbFwiLCBmdW5jdGlvbihzZWxmLCAuLi4pIn0sDQoJCQkJeyJsb2NhbCBNZXRob2QgPSBnZXRuYW1lY2FsbG1ldGhvZCgpIiwgMn0sDQoJCQkJeyJpZiBzZWxmID09ICVSZW1vdGUlIGFuZCBNZXRob2QgPT0gXCIlTWV0aG9kJVwiIHRoZW4iLCAyfSwNCgkJCQl7InJldHVybiIsIDN9LA0KCQkJCXsiZW5kIiwgMn0sDQoJCQkJeyJyZXR1cm4gT2xkKHNlbGYsIC4uLikiLCAyfSwNCgkJCQl7ImVuZCkifQ0KCQkJfSwNCgkJCVsiQ29ubmVjdCJdID0gew0KCQkJCXsiZm9yIF8sIENvbm5lY3Rpb24gaW4gZ2V0Y29ubmVjdGlvbnMoJVNpZ25hbCUpIGRvIn0sDQoJCQkJeyJDb25uZWN0aW9uOkRpc2FibGUoKSIsIDJ9LA0KCQkJCXsiZW5kIn0NCgkJCX0NCgkJfQ0KCX0NCn0NCg0KLS0vLyBNb2R1bGVzDQpsb2NhbCBDb25maWcNCmxvY2FsIEhvb2sNCmxvY2FsIFBhcnNlck1vZHVsZQ0KbG9jYWwgRmxhZ3MNCmxvY2FsIFRoaXNTY3JpcHQgPSBzY3JpcHQNCg0KbG9jYWwgZnVuY3Rpb24gTWVyZ2UoQmFzZTogdGFibGUsIE5ldzogdGFibGU/KQ0KCWlmIG5vdCBOZXcgdGhlbiByZXR1cm4gZW5kDQoJZm9yIEtleSwgVmFsdWUgaW4gbmV4dCwgTmV3IGRvDQoJCUJhc2VbS2V5XSA9IFZhbHVlDQoJZW5kDQplbmQNCg0KZnVuY3Rpb24gR2VuZXJhdGlvbjpJbml0KERhdGE6IHRhYmxlKQ0KICAgIGxvY2FsIE1vZHVsZXMgPSBEYXRhLk1vZHVsZXMNCglsb2NhbCBDb25maWd1cmF0aW9uID0gTW9kdWxlcy5Db25maWd1cmF0aW9uDQoNCgktLS8vIE1vZHVsZXMNCglDb25maWcgPSBNb2R1bGVzLkNvbmZpZw0KCUhvb2sgPSBNb2R1bGVzLkhvb2sNCglGbGFncyA9IE1vZHVsZXMuRmxhZ3MNCgkNCgktLS8vIEltcG9ydCBwYXJzZXINCglsb2NhbCBQYXJzZXJVcmwgPSBDb25maWd1cmF0aW9uLlBhcnNlclVybA0KCXNlbGY6TG9hZFBhcnNlcihQYXJzZXJVcmwpDQplbmQNCg0KZnVuY3Rpb24gR2VuZXJhdGlvbjpNYWtlUHJpbnRhYmxlKFN0cmluZzogc3RyaW5nKTogc3RyaW5nDQoJbG9jYWwgRm9ybWF0dGVyID0gUGFyc2VyTW9kdWxlLk1vZHVsZXMuRm9ybWF0dGVyDQoJcmV0dXJuIEZvcm1hdHRlcjpNYWtlUHJpbnRhYmxlKFN0cmluZykNCmVuZA0KDQpmdW5jdGlvbiBHZW5lcmF0aW9uOlRpbWVTdGFtcEZpbGUoRmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZw0KCWxvY2FsIFRpbWVTdGFtcCA9IG9zLmRhdGUoIiVZLSVtLSVkXyVILSVNLSVTIikNCglsb2NhbCBGb3JtYXR0ZWQgPSBGaWxlUGF0aDpmb3JtYXQoVGltZVN0YW1wKQ0KCXJldHVybiBGb3JtYXR0ZWQNCmVuZA0KDQpmdW5jdGlvbiBHZW5lcmF0aW9uOldyaXRlRHVtcChDb250ZW50OiBzdHJpbmcpOiBzdHJpbmcNCglsb2NhbCBEdW1wQmFzZU5hbWUgPSBzZWxmLkR1bXBCYXNlTmFtZQ0KCWxvY2FsIEZpbGVQYXRoID0gc2VsZjpUaW1lU3RhbXBGaWxlKER1bXBCYXNlTmFtZSkNCg0KCS0tLy8gV3JpdGUgdG8gZmlsZQ0KCXdyaXRlZmlsZShGaWxlUGF0aCwgQ29udGVudCkNCg0KCXJldHVybiBGaWxlUGF0aA0KZW5kDQoNCmZ1bmN0aW9uIEdlbmVyYXRpb246TG9hZFBhcnNlcihNb2R1bGVVcmw6IHN0cmluZykNCglQYXJzZXJNb2R1bGUgPSBsb2Fkc3RyaW5nKGdhbWU6SHR0cEdldChNb2R1bGVVcmwpLCAiUGFyc2VyIikoKQ0KZW5kDQoNCmZ1bmN0aW9uIEdlbmVyYXRpb246TWFrZVZhbHVlU3dhcHNUYWJsZSgpOiB0YWJsZQ0KCWxvY2FsIEZvcm1hdHRlciA9IFBhcnNlck1vZHVsZS5Nb2R1bGVzLkZvcm1hdHRlcg0KCXJldHVybiBGb3JtYXR0ZXI6TWFrZVJlcGxhY2VtZW50cygpDQplbmQNCg0KZnVuY3Rpb24gR2VuZXJhdGlvbjpTZXRTd2Fwc0NhbGxiYWNrKENhbGxiYWNrOiAoSW50ZXJmYWNlOiB0YWJsZSkgLT4gKCkpDQoJc2VsZi5Td2Fwc0NhbGxiYWNrID0gQ2FsbGJhY2sNCmVuZA0KDQpmdW5jdGlvbiBHZW5lcmF0aW9uOkdldEJhc2UoTW9kdWxlKTogKHN0cmluZywgYm9vbGVhbikNCglsb2NhbCBOb0NvbW1lbnRzID0gRmxhZ3M6R2V0RmxhZ1ZhbHVlKCJOb0NvbW1lbnRzIikNCglsb2NhbCBIZWFkZXIgPSBzZWxmLkhlYWRlcg0KDQoJbG9jYWwgQ29kZSA9IE5vQ29tbWVudHMgYW5kICIiIG9yIEhlYWRlcg0KDQoJLS0vLyBHZW5lcmF0ZSB2YXJpYWJsZXMgY29kZQ0KCWxvY2FsIFZhcmlhYmxlcyA9IE1vZHVsZS5QYXJzZXI6TWFrZVZhcmlhYmxlQ29kZSh7DQoJCSJTZXJ2aWNlcyIsICJSZW1vdGUiLCAiVmFyaWFibGVzIg0KCX0sIE5vQ29tbWVudHMpDQoNCglsb2NhbCBOb1ZhcmlhYmxlcyA9IFZhcmlhYmxlcyA9PSAiIg0KCUNvZGUgLi49IFZhcmlhYmxlcw0KDQoJcmV0dXJuIENvZGUsIE5vVmFyaWFibGVzDQplbmQNCg0KZnVuY3Rpb24gR2VuZXJhdGlvbjpHZXRTd2FwcygpDQoJbG9jYWwgRnVuYyA9IHNlbGYuU3dhcHNDYWxsYmFjaw0KCWxvY2FsIFN3YXBzID0ge30NCg0KCWxvY2FsIEludGVyZmFjZSA9IHt9DQoJZnVuY3Rpb24gSW50ZXJmYWNlOkFkZFN3YXAoT2JqZWN0OiBJbnN0YW5jZSwgRGF0YTogdGFibGUpDQoJCWlmIG5vdCBPYmplY3QgdGhlbiByZXR1cm4gZW5kDQoJCVN3YXBzW09iamVjdF0gPSBEYXRhDQoJZW5kDQoNCgktLS8vIEludm9rZSBHZXRTd2FwcyBmdW5jdGlvbg0KCUZ1bmMoSW50ZXJmYWNlKQ0KDQoJcmV0dXJuIFN3YXBzDQplbmQNCg0KZnVuY3Rpb24gR2VuZXJhdGlvbjpQaWNrVmFyaWFibGVOYW1lKCk6IHN0cmluZw0KCWxvY2FsIE5hbWVzID0gQ29uZmlnLlZhcmlhYmxlTmFtZXMNCglyZXR1cm4gTmFtZXNbbWF0aC5yYW5kb20oMSwgI05hbWVzKV0NCmVuZA0KDQpmdW5jdGlvbiBHZW5lcmF0aW9uOk5ld1BhcnNlcihFeHRyYTogdGFibGU/KQ0KCWxvY2FsIFZhcmlhYmxlTmFtZSA9IHNlbGY6UGlja1ZhcmlhYmxlTmFtZSgpDQoJbG9jYWwgU3dhcHMgPSBzZWxmOkdldFN3YXBzKCkNCg0KCWxvY2FsIENvbmZpZ3VyYXRpb24gPSB7DQoJCVZhcmlhYmxlQmFzZSA9IFZhcmlhYmxlTmFtZSwNCgkJU3dhcHMgPSBTd2FwcywNCgkJSW5kZXhGdW5jID0gZnVuY3Rpb24oLi4uKQ0KCQkJcmV0dXJuIEhvb2s6SW5kZXgoLi4uKQ0KCQllbmQsDQoJfQ0KDQoJLS0vLyBNZXJnZSBleHRyYSBjb25maWd1cmF0aW9uDQoJTWVyZ2UoQ29uZmlndXJhdGlvbiwgRXh0cmEpDQoNCgktLS8vIENyZWF0ZSBuZXcgcGFyc2VyIGluc3RhbmNlDQoJcmV0dXJuIFBhcnNlck1vZHVsZTpOZXcoQ29uZmlndXJhdGlvbikNCmVuZA0KDQpmdW5jdGlvbiBHZW5lcmF0aW9uOkluZGVudChJbmRlbnRTdHJpbmc6IHN0cmluZywgTGluZTogc3RyaW5nKQ0KCXJldHVybiBge0luZGVudFN0cmluZ317TGluZX1gDQplbmQNCg0KdHlwZSBDYWxsSW5mbyA9IHsNCglBcmd1bWVudHM6IHRhYmxlLA0KCUluZGVudDogbnVtYmVyLA0KCVJlbW90ZVZhcmlhYmxlOiBzdHJpbmcsDQoJTW9kdWxlOiB0YWJsZQ0KfQ0KZnVuY3Rpb24gR2VuZXJhdGlvbjpDYWxsUmVtb3RlU2NyaXB0KERhdGEsIEluZm86IENhbGxJbmZvKTogc3RyaW5nDQoJbG9jYWwgSXNSZWNlaXZlID0gRGF0YS5Jc1JlY2VpdmUNCglsb2NhbCBNZXRob2QgPSBEYXRhLk1ldGhvZA0KCWxvY2FsIEFyZ3MgPSBEYXRhLkFyZ3MNCg0KCWxvY2FsIFJlbW90ZVZhcmlhYmxlID0gSW5mby5SZW1vdGVWYXJpYWJsZQ0KCWxvY2FsIEluZGVudCA9IEluZm8uSW5kZW50IG9yIDANCglsb2NhbCBNb2R1bGUgPSBJbmZvLk1vZHVsZQ0KDQoJbG9jYWwgVmFyaWFibGVzID0gTW9kdWxlLlZhcmlhYmxlcw0KCWxvY2FsIFBhcnNlciA9IE1vZHVsZS5QYXJzZXINCglsb2NhbCBOb1ZhcmlhYmxlcyA9IERhdGEuTm9WYXJpYWJsZXMNCg0KCWxvY2FsIEluZGVudFN0cmluZyA9IHNlbGY6TWFrZUluZGVudChJbmRlbnQpDQoNCgktLS8vIFBhcnNlIGFyZ3VtZW50cw0KCWxvY2FsIFBhcnNlZEFyZ3MsIEl0ZW1zQ291bnQsIElzQXJyYXkgPSBQYXJzZXI6UGFyc2VUYWJsZUludG9TdHJpbmcoew0KCQlOb0JyYWNrZXRzID0gdHJ1ZSwNCgkJTm9WYXJpYWJsZXMgPSBOb1ZhcmlhYmxlcywNCgkJVGFibGUgPSBBcmdzLA0KCQlJbmRlbnQgPSBJbmRlbnQNCgl9KQ0KDQoJLS0vLyBDcmVhdGUgdGFibGUgdmFyaWFibGUgaWYgbm90IGFuIGFycmF5DQoJaWYgbm90IElzQXJyYXkgb3IgTm9WYXJpYWJsZXMgdGhlbg0KCQlQYXJzZWRBcmdzID0gVmFyaWFibGVzOk1ha2VWYXJpYWJsZSh7DQoJCQlWYWx1ZSA9ICgieyVzfSIpOmZvcm1hdChQYXJzZWRBcmdzKSwNCgkJCUNvbW1lbnQgPSBub3QgSXNBcnJheSBhbmQgIkFyZ3VtZW50cyBhcmVuJ3Qgb3JkZXJlZCIgb3IgbmlsLA0KCQkJTmFtZSA9ICJSZW1vdGVBcmdzIiwNCgkJCUNsYXNzID0gIlJlbW90ZSINCgkJfSkNCgllbmQNCg0KCS0tLy8gV3JhcCBpbiBhIHVucGFjayBpZiB0aGUgdGFibGUgaXMgYSBkaWN0DQoJaWYgSXRlbXNDb3VudCA+IDAgYW5kIG5vdCBJc0FycmF5IHRoZW4NCgkJUGFyc2VkQXJncyA9IGB1bnBhY2soe1BhcnNlZEFyZ3N9LCAxLCB0YWJsZS5tYXhuKHtQYXJzZWRBcmdzfSkpYA0KCWVuZA0KDQoJLS0vLyBGaXJlc2lnbmFsIHNjcmlwdCBmb3IgY2xpZW50IHJlY2lldmVzDQoJaWYgSXNSZWNlaXZlIHRoZW4NCgkJbG9jYWwgU2Vjb25kID0gSXRlbXNDb3VudCA8PSAwIGFuZCAiIiBvciBgLCB7UGFyc2VkQXJnc31gDQoJCWxvY2FsIFNpZ25hbCA9IGB7UmVtb3RlVmFyaWFibGV9LntNZXRob2R9YA0KDQoJCWxvY2FsIENvZGUgPSBgLS0gVGhpcyBkYXRhIHdhcyByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXJgDQoJCVBhcnNlZEFyZ3MgPSBzZWxmOkluZGVudChJbmRlbnRTdHJpbmcsIENvZGUpDQoJCUNvZGUgLi49IGBcbntJbmRlbnRTdHJpbmd9ZmlyZXNpZ25hbCh7U2lnbmFsfXtTZWNvbmR9KWANCgkJDQoJCXJldHVybiBDb2RlDQoJZW5kDQoJDQoJLS0vLyBSZW1vdGUgaW52b2tlIHNjcmlwdA0KCXJldHVybiBge1JlbW90ZVZhcmlhYmxlfTp7TWV0aG9kfSh7UGFyc2VkQXJnc30pYA0KZW5kDQoNCi0tLy8gVmFyaWFibGVzOiAlVmFyaWFibGVOYW1lJQ0KZnVuY3Rpb24gR2VuZXJhdGlvbjpBcHBseVZhcmlhYmxlcyhTdHJpbmc6IHN0cmluZywgVmFyaWFibGVzOiB0YWJsZSwgLi4uKTogc3RyaW5nDQoJZm9yIFZhcmlhYmxlLCBWYWx1ZSBpbiBWYXJpYWJsZXMgZG8NCgkJLS0vLyBJbnZva2UgdmFsdWUgZnVuY3Rpb24NCgkJaWYgdHlwZW9mKFZhbHVlKSA9PSAiZnVuY3Rpb24iIHRoZW4NCgkJCVZhbHVlID0gVmFsdWUoLi4uKQ0KCQllbmQNCg0KCQlTdHJpbmcgPSBTdHJpbmc6Z3N1YihgJSV7VmFyaWFibGV9JSVgLCBmdW5jdGlvbigpDQoJCQlyZXR1cm4gVmFsdWUNCgkJZW5kKQ0KCWVuZA0KCXJldHVybiBTdHJpbmcNCmVuZA0KDQpmdW5jdGlvbiBHZW5lcmF0aW9uOk1ha2VJbmRlbnQoSW5kZW50OiBudW1iZXIpDQoJcmV0dXJuIHN0cmluZy5yZXAoIgkiLCBJbmRlbnQpDQplbmQNCg0KdHlwZSBTY3JpcHREYXRhID0gew0KCVZhcmlhYmxlczogdGFibGUsDQoJTWV0YU1ldGhvZDogc3RyaW5nDQp9DQpmdW5jdGlvbiBHZW5lcmF0aW9uOk1ha2VDYWxsQ29kZShTY3JpcHRUeXBlOiBzdHJpbmcsIERhdGE6IFNjcmlwdERhdGEpOiBzdHJpbmcNCglsb2NhbCBTY3JpcHRUZW1wbGF0ZXMgPSBzZWxmLlNjcmlwdFRlbXBsYXRlcw0KCWxvY2FsIFRlbXBsYXRlID0gU2NyaXB0VGVtcGxhdGVzW1NjcmlwdFR5cGVdDQoNCglhc3NlcnQoVGVtcGxhdGUsIGB7U2NyaXB0VHlwZX0gaXMgbm90IGEgdmFsaWQgc2NyaXB0IHR5cGUhYCkNCg0KCWxvY2FsIFZhcmlhYmxlcyA9IERhdGEuVmFyaWFibGVzDQoJbG9jYWwgTWV0YU1ldGhvZCA9IERhdGEuTWV0YU1ldGhvZA0KCWxvY2FsIE1ldGFNZXRob2RzID0geyJfX2luZGV4IiwgIl9fbmFtZWNhbGwiLCAiQ29ubmVjdCJ9DQoNCglsb2NhbCBmdW5jdGlvbiBDb21waWxlKFRlbXBsYXRlOiB0YWJsZSk6IHN0cmluZw0KCQlsb2NhbCBPdXQgPSAiIg0KDQoJCWZvciBLZXksIFZhbHVlIGluIG5leHQsIFRlbXBsYXRlIGRvDQoJCQktLS8vIE1ldGFNZXRob2QgY2hlY2sNCgkJCWxvY2FsIElzTWV0YVR5cGVPbmx5ID0gdGFibGUuZmluZChNZXRhTWV0aG9kcywgS2V5KQ0KCQkJaWYgSXNNZXRhVHlwZU9ubHkgdGhlbg0KCQkJCWlmIEtleSA9PSBNZXRhTWV0aG9kIHRoZW4NCgkJCQkJbG9jYWwgTGluZSA9IENvbXBpbGUoVmFsdWUpDQoJCQkJCU91dCAuLj0gTGluZQ0KCQkJCWVuZA0KCQkJCWNvbnRpbnVlDQoJCQllbmQNCg0KCQkJLS0vLyBJbmZvcm1hdGlvbg0KCQkJbG9jYWwgQ29udGVudCwgSW5kZW50ID0gVmFsdWVbMV0sIFZhbHVlWzJdIG9yIDANCgkJCUluZGVudCA9IG1hdGguY2xhbXAoSW5kZW50LTEsIDAsIDk5OTkpDQoNCgkJCS0tLy8gTWFrZSBsaW5lDQoJCQlsb2NhbCBMaW5lID0gc2VsZjpBcHBseVZhcmlhYmxlcyhDb250ZW50LCBWYXJpYWJsZXMsIEluZGVudCkNCgkJCWxvY2FsIEluZGVudFN0cmluZyA9IHNlbGY6TWFrZUluZGVudChJbmRlbnQpDQoNCgkJCS0tLy8gQXBwZW5kIHRvIGNvZGUNCgkJCU91dCAuLj0gYHtJbmRlbnRTdHJpbmd9e0xpbmV9XG5gDQoJCWVuZA0KDQoJCXJldHVybiBPdXQNCgllbmQNCgkNCglyZXR1cm4gQ29tcGlsZShUZW1wbGF0ZSkNCmVuZA0KDQpmdW5jdGlvbiBHZW5lcmF0aW9uOlJlbW90ZVNjcmlwdChNb2R1bGUsIERhdGE6IFJlbW90ZURhdGEsIFNjcmlwdFR5cGU6IHN0cmluZyk6IHN0cmluZw0KCS0tLy8gVW5wYWNrIGRhdGENCglsb2NhbCBSZW1vdGUgPSBEYXRhLlJlbW90ZQ0KCWxvY2FsIEFyZ3MgPSBEYXRhLkFyZ3MNCglsb2NhbCBNZXRob2QgPSBEYXRhLk1ldGhvZA0KCWxvY2FsIE1ldGFNZXRob2QgPSBEYXRhLk1ldGFNZXRob2QNCg0KCS0tLy8gUmVtb3RlIGluZm8NCglsb2NhbCBDbGFzc05hbWUgPSBIb29rOkluZGV4KFJlbW90ZSwgIkNsYXNzTmFtZSIpDQoJbG9jYWwgSXNOaWxQYXJlbnQgPSBIb29rOkluZGV4KFJlbW90ZSwgIlBhcmVudCIpID09IG5pbA0KCQ0KCWxvY2FsIFZhcmlhYmxlcyA9IE1vZHVsZS5WYXJpYWJsZXMNCglsb2NhbCBGb3JtYXR0ZXIgPSBNb2R1bGUuRm9ybWF0dGVyDQoJDQoJLS0vLyBQcmUtcmVuZGVyIHZhcmlhYmxlcw0KCVZhcmlhYmxlczpQcmVyZW5kZXJWYXJpYWJsZXMoQXJncywgeyJJbnN0YW5jZSJ9KQ0KDQoJLS0vLyBDcmVhdGUgcmVtb3RlIHZhcmlhYmxlDQoJbG9jYWwgUmVtb3RlVmFyaWFibGUgPSBWYXJpYWJsZXM6TWFrZVZhcmlhYmxlKHsNCgkJVmFsdWUgPSBGb3JtYXR0ZXI6Rm9ybWF0KFJlbW90ZSwgew0KCQkJTm9WYXJpYWJsZXMgPSB0cnVlDQoJCX0pLA0KCQlDb21tZW50ID0gYHtDbGFzc05hbWV9IHtJc05pbFBhcmVudCBhbmQgInwgUmVtb3RlIHBhcmVudCBpcyBuaWwiIG9yICIifWAsDQoJCU5hbWUgPSBGb3JtYXR0ZXI6TWFrZU5hbWUoUmVtb3RlKSwNCgkJTG9va3VwID0gUmVtb3RlLA0KCQlDbGFzcyA9ICJSZW1vdGUiDQoJfSkNCg0KCS0tLy8gR2VuZXJhdGUgY2FsbCBzY3JpcHQNCglsb2NhbCBDYWxsQ29kZSA9IHNlbGY6TWFrZUNhbGxDb2RlKFNjcmlwdFR5cGUsIHsNCgkJVmFyaWFibGVzID0gew0KCQkJWyJSZW1vdGVDYWxsIl0gPSBmdW5jdGlvbihJbmRlbnQ6IG51bWJlcikNCgkJCQlyZXR1cm4gc2VsZjpDYWxsUmVtb3RlU2NyaXB0KERhdGEsIHsNCgkJCQkJUmVtb3RlVmFyaWFibGUgPSBSZW1vdGVWYXJpYWJsZSwNCgkJCQkJSW5kZW50ID0gSW5kZW50LA0KCQkJCQlNb2R1bGUgPSBNb2R1bGUNCgkJCQl9KQ0KCQkJZW5kLA0KCQkJWyJSZW1vdGUiXSA9IFJlbW90ZVZhcmlhYmxlLA0KCQkJWyJNZXRob2QiXSA9IE1ldGhvZCwNCgkJCVsiU2lnbmFsIl0gPSBge1JlbW90ZVZhcmlhYmxlfS57TWV0aG9kfWANCgkJfSwNCgkJTWV0YU1ldGhvZCA9IE1ldGFNZXRob2QNCgl9KQ0KCQ0KCS0tLy8gTWFrZSBjb2RlDQoJbG9jYWwgQ29kZSA9IHNlbGY6R2V0QmFzZShNb2R1bGUpDQoJcmV0dXJuIGB7Q29kZX1cbntDYWxsQ29kZX1gDQplbmQNCg0KZnVuY3Rpb24gR2VuZXJhdGlvbjpDb25uZWN0aW9uc1RhYmxlKFNpZ25hbDogUkJYU2NyaXB0U2lnbmFsKTogdGFibGUNCglsb2NhbCBDb25uZWN0aW9ucyA9IGdldGNvbm5lY3Rpb25zKFNpZ25hbCkNCglsb2NhbCBEYXRhQXJyYXkgPSB7fQ0KDQoJZm9yIF8sIENvbm5lY3Rpb24gaW4gbmV4dCwgQ29ubmVjdGlvbnMgZG8NCgkJbG9jYWwgRnVuY3Rpb24gPSBDb25uZWN0aW9uLkZ1bmN0aW9uDQoJCWxvY2FsIFNjcmlwdCA9IHJhd2dldChnZXRmZW52KEZ1bmN0aW9uKSwgInNjcmlwdCIpDQoNCgkJLS0vLyBTa2lwIGlmIHNlbGYNCgkJaWYgU2NyaXB0ID09IFRoaXNTY3JpcHQgdGhlbiBjb250aW51ZSBlbmQNCg0KCQktLS8vIENvbm5lY3Rpb24gZGF0YQ0KCQlsb2NhbCBEYXRhID0gew0KCQkJRnVuY3Rpb24gPSBGdW5jdGlvbiwNCgkJCVN0YXRlID0gQ29ubmVjdGlvbi5TdGF0ZSwNCgkJCVNjcmlwdCA9IFNjcmlwdA0KCQl9DQoNCgkJdGFibGUuaW5zZXJ0KERhdGFBcnJheSwgRGF0YSkNCgllbmQNCg0KCXJldHVybiBEYXRhQXJyYXkNCmVuZA0KDQpmdW5jdGlvbiBHZW5lcmF0aW9uOlRhYmxlU2NyaXB0KE1vZHVsZSwgVGFibGU6IHRhYmxlKTogc3RyaW5nDQoJLS0vLyBQcmUtcmVuZGVyIHZhcmlhYmxlcw0KCU1vZHVsZS5WYXJpYWJsZXM6UHJlcmVuZGVyVmFyaWFibGVzKFRhYmxlLCB7Ikluc3RhbmNlIn0pDQoNCgktLS8vIFBhcnNlIGFyZ3VtZW50cw0KCWxvY2FsIFBhcnNlZFRhYmxlID0gTW9kdWxlLlBhcnNlcjpQYXJzZVRhYmxlSW50b1N0cmluZyh7DQoJCVRhYmxlID0gVGFibGUNCgl9KQ0KDQoJLS0vLyBHZW5lcmF0ZSBzY3JpcHQNCglsb2NhbCBDb2RlLCBOb1ZhcmlhYmxlcyA9IHNlbGY6R2V0QmFzZShNb2R1bGUpDQoJbG9jYWwgU2VwZXJhdG9yID0gTm9WYXJpYWJsZXMgYW5kICIiIG9yICJcbiINCglDb2RlIC4uPSBge1NlcGVyYXRvcn1yZXR1cm4ge1BhcnNlZFRhYmxlfWANCg0KCXJldHVybiBDb2RlDQplbmQNCg0KZnVuY3Rpb24gR2VuZXJhdGlvbjpNYWtlVHlwZXNUYWJsZShUYWJsZTogdGFibGUpOiB0YWJsZQ0KCWxvY2FsIFR5cGVzID0ge30NCg0KCWZvciBLZXksIFZhbHVlIGluIG5leHQsIFRhYmxlIGRvDQoJCWxvY2FsIFR5cGUgPSB0eXBlb2YoVmFsdWUpDQoJCWlmIFR5cGUgPT0gInRhYmxlIiB0aGVuDQoJCQlUeXBlID0gc2VsZjpNYWtlVHlwZXNUYWJsZShWYWx1ZSkNCgkJZW5kDQoNCgkJVHlwZXNbS2V5XSA9IFR5cGUNCgllbmQNCg0KCXJldHVybiBUeXBlcw0KZW5kDQoNCmZ1bmN0aW9uIEdlbmVyYXRpb246Q29ubmVjdGlvbkluZm8oUmVtb3RlOiBJbnN0YW5jZSwgQ2xhc3NEYXRhOiB0YWJsZSk6IHRhYmxlPw0KCWxvY2FsIFJlY2VpdmVNZXRob2RzID0gQ2xhc3NEYXRhLlJlY2VpdmUNCglpZiBub3QgUmVjZWl2ZU1ldGhvZHMgdGhlbiByZXR1cm4gZW5kDQoNCglsb2NhbCBDb25uZWN0aW9ucyA9IHt9DQoJZm9yIF8sIE1ldGhvZDogc3RyaW5nIGluIG5leHQsIFJlY2VpdmVNZXRob2RzIGRvDQoJCXBjYWxsKGZ1bmN0aW9uKCkgLS0gVE9ETzogR0VUQ0FMTEJBQ0tWQUxVRQ0KCQkJbG9jYWwgU2lnbmFsID0gSG9vazpJbmRleChSZW1vdGUsIE1ldGhvZCkNCgkJCUNvbm5lY3Rpb25zW01ldGhvZF0gPSBzZWxmOkNvbm5lY3Rpb25zVGFibGUoU2lnbmFsKQ0KCQllbmQpDQoJZW5kDQoNCglyZXR1cm4gQ29ubmVjdGlvbnMNCmVuZA0KDQpmdW5jdGlvbiBHZW5lcmF0aW9uOkFkdmFuY2VkSW5mbyhNb2R1bGUsIERhdGE6IHRhYmxlKTogc3RyaW5nDQoJLS0vLyBVbnBhY2sgcmVtb3RlIGRhdGENCglsb2NhbCBGdW5jdGlvbiA9IERhdGEuQ2FsbGluZ0Z1bmN0aW9uDQoJbG9jYWwgQ2xhc3NEYXRhID0gRGF0YS5DbGFzc0RhdGENCglsb2NhbCBSZW1vdGUgPSBEYXRhLlJlbW90ZQ0KCWxvY2FsIEFyZ3MgPSBEYXRhLkFyZ3MNCgkNCgktLS8vIEFkdmFuY2VkIGluZm8gdGFibGUgYmFzZQ0KCWxvY2FsIEZ1bmN0aW9uSW5mbyA9IHsNCgkJWyJDYWxsZXIiXSA9IHsNCgkJCVsiU291cmNlU2NyaXB0Il0gPSBEYXRhLlNvdXJjZVNjcmlwdCwNCgkJCVsiQ2FsbGluZ1NjcmlwdCJdID0gRGF0YS5DYWxsaW5nU2NyaXB0LA0KCQkJWyJDYWxsaW5nRnVuY3Rpb24iXSA9IEZ1bmN0aW9uDQoJCX0sDQoJCVsiUmVtb3RlIl0gPSB7DQoJCQlbIlJlbW90ZSJdID0gUmVtb3RlLA0KCQkJWyJSZW1vdGVJRCJdID0gRGF0YS5JZCwNCgkJCVsiTWV0aG9kIl0gPSBEYXRhLk1ldGhvZCwNCgkJCVsiQ29ubmVjdGlvbnMiXSA9IHNlbGY6Q29ubmVjdGlvbkluZm8oUmVtb3RlLCBDbGFzc0RhdGEpDQoJCX0sDQoJCVsiQXJndW1lbnRzIl0gPSB7DQoJCQlbIkxlbmd0aCJdID0gI0FyZ3MsDQoJCQlbIlR5cGVzIl0gPSBzZWxmOk1ha2VUeXBlc1RhYmxlKEFyZ3MpLA0KCQl9LA0KCQlbIk1ldGFNZXRob2QiXSA9IERhdGEuTWV0YU1ldGhvZCwNCgkJWyJJc0FjdG9yIl0gPSBEYXRhLklzQWN0b3IsDQoJfQ0KDQoJLS0vLyBTb21lIGNsb3N1cmVzIG1heSBub3QgYmUgbHVhDQoJaWYgRnVuY3Rpb24gYW5kIGlzbGNsb3N1cmUoRnVuY3Rpb24pIHRoZW4NCgkJRnVuY3Rpb25JbmZvWyJVcFZhbHVlcyJdID0gZGVidWcuZ2V0dXB2YWx1ZXMoRnVuY3Rpb24pDQoJCUZ1bmN0aW9uSW5mb1siQ29uc3RhbnRzIl0gPSBkZWJ1Zy5nZXRjb25zdGFudHMoRnVuY3Rpb24pDQoJZW5kDQoNCgktLS8vIEdlbmVyYXRlIHNjcmlwdA0KCXJldHVybiBzZWxmOlRhYmxlU2NyaXB0KE1vZHVsZSwgRnVuY3Rpb25JbmZvKQ0KZW5kDQoNCmZ1bmN0aW9uIEdlbmVyYXRpb246RHVtcExvZ3MoTG9nczogdGFibGUpOiBzdHJpbmcNCglsb2NhbCBCYXNlRGF0YQ0KCWxvY2FsIFBhcnNlZCA9IHsNCgkJUmVtb3RlID0gbmlsLA0KCQlDYWxscyA9IHt9DQoJfQ0KDQoJLS0vLyBDcmVhdGUgbmV3IHBhcnNlciBpbnN0YW5jZQ0KCWxvY2FsIE1vZHVsZSA9IEdlbmVyYXRpb246TmV3UGFyc2VyKCkNCg0KCWZvciBfLCBEYXRhIGluIExvZ3MgZG8NCgkJbG9jYWwgQ2FsbHMgPSBQYXJzZWQuQ2FsbHMNCgkJbG9jYWwgVGFibGUgPSB7DQoJCQlBcmdzID0gRGF0YS5BcmdzLA0KCQkJVGltZXN0YW1wID0gRGF0YS5UaW1lc3RhbXAsDQoJCQlSZXR1cm5WYWx1ZXMgPSBEYXRhLlJldHVyblZhbHVlcywNCgkJCU1ldGhvZCA9IERhdGEuTWV0aG9kLA0KCQkJTWV0YU1ldGhvZCA9IERhdGEuTWV0YU1ldGhvZCwNCgkJCUNhbGxpbmdTY3JpcHQgPSBEYXRhLkNhbGxpbmdTY3JpcHQsDQoJCX0NCg0KCQktLS8vIEFwcGVuZA0KCQl0YWJsZS5pbnNlcnQoQ2FsbHMsIFRhYmxlKQ0KDQoJCS0tLy8gU2V0IEJhc2VEYXRhDQoJCWlmIG5vdCBCYXNlRGF0YSB0aGVuDQoJCQlCYXNlRGF0YSA9IERhdGENCgkJZW5kDQoJZW5kDQoNCgktLS8vIEJhc2VkYXRhIG1lcmdlDQoJUGFyc2VkLlJlbW90ZSA9IEJhc2VEYXRhLlJlbW90ZQ0KDQoJLS0vLyBDb21waWxlIGFuZCBzYXZlDQoJbG9jYWwgT3V0cHV0ID0gc2VsZjpUYWJsZVNjcmlwdChNb2R1bGUsIFBhcnNlZCkNCglsb2NhbCBGaWxlUGF0aCA9IHNlbGY6V3JpdGVEdW1wKE91dHB1dCkNCgkNCglyZXR1cm4gRmlsZVBhdGgNCmVuZA0KDQpyZXR1cm4gR2VuZXJhdGlvbg0K]]
},Communication={'base64',
[[dHlwZSB0YWJsZSA9IHsNCiAgICBbYW55XTogYW55DQp9DQoNCi0tLy8gTW9kdWxlDQpsb2NhbCBNb2R1bGUgPSB7DQogICAgQ29tbUNhbGxiYWNrcyA9IHt9DQp9DQoNCmxvY2FsIENvbW1XcmFwcGVyID0ge30NCkNvbW1XcmFwcGVyLl9faW5kZXggPSBDb21tV3JhcHBlcg0KDQotLS8vIFNlcmlhbGl6ZXIgY2FjaGUNCmxvY2FsIFNlcmlhbGl6ZUNhY2hlID0gc2V0bWV0YXRhYmxlKHt9LCB7X19tb2RlID0gImsifSkNCmxvY2FsIERlc2VyaWFsaXplQ2FjaGUgPSBzZXRtZXRhdGFibGUoe30sIHtfX21vZGUgPSAiayJ9KQ0KDQotLS8vIFNlcnZpY2VzDQpsb2NhbCBDb3JlR3VpDQoNCi0tLy8gTW9kdWxlcw0KbG9jYWwgSG9vaw0KbG9jYWwgQ2hhbm5lbA0KbG9jYWwgQ29uZmlnDQpsb2NhbCBQcm9jZXNzDQoNCmZ1bmN0aW9uIE1vZHVsZTpJbml0KERhdGEpDQogICAgbG9jYWwgTW9kdWxlcyA9IERhdGEuTW9kdWxlcw0KICAgIGxvY2FsIFNlcnZpY2VzID0gRGF0YS5TZXJ2aWNlcw0KDQogICAgSG9vayA9IE1vZHVsZXMuSG9vaw0KICAgIFByb2Nlc3MgPSBNb2R1bGVzLlByb2Nlc3MNCiAgICBDb25maWcgPSBNb2R1bGVzLkNvbmZpZyBvciBDb25maWcNCiAgICBDb3JlR3VpID0gU2VydmljZXMuQ29yZUd1aQ0KZW5kDQoNCmZ1bmN0aW9uIENvbW1XcmFwcGVyOkZpcmUoLi4uKQ0KICAgIGxvY2FsIFF1ZXVlID0gc2VsZi5RdWV1ZQ0KICAgIHRhYmxlLmluc2VydChRdWV1ZSwgey4uLn0pDQplbmQNCg0KZnVuY3Rpb24gQ29tbVdyYXBwZXI6UHJvY2Vzc0FyZ3VtZW50cyhBcmd1bWVudHMpIA0KICAgIGxvY2FsIENoYW5uZWwgPSBzZWxmLkNoYW5uZWwNCiAgICBDaGFubmVsOkZpcmUoUHJvY2VzczpVbnBhY2soQXJndW1lbnRzKSkNCmVuZA0KDQpmdW5jdGlvbiBDb21tV3JhcHBlcjpQcm9jZXNzUXVldWUoKQ0KICAgIGxvY2FsIFF1ZXVlID0gc2VsZi5RdWV1ZQ0KDQogICAgZm9yIEluZGV4ID0gMSwgI1F1ZXVlIGRvDQogICAgICAgIGxvY2FsIEFyZ3VtZW50cyA9IHRhYmxlLnJlbW92ZShRdWV1ZSkNCiAgICAgICAgcGNhbGwoZnVuY3Rpb24oKQ0KICAgICAgICAgICAgc2VsZjpQcm9jZXNzQXJndW1lbnRzKEFyZ3VtZW50cykgDQogICAgICAgIGVuZCkNCiAgICBlbmQNCmVuZA0KDQpmdW5jdGlvbiBDb21tV3JhcHBlcjpCZWdpblF1ZXVlU2VydmljZSgpDQogICAgY29yb3V0aW5lLndyYXAoZnVuY3Rpb24oKQ0KICAgICAgICB3aGlsZSB3YWl0KCkgZG8NCiAgICAgICAgICAgIHNlbGY6UHJvY2Vzc1F1ZXVlKCkNCiAgICAgICAgZW5kDQogICAgZW5kKSgpDQplbmQNCg0KZnVuY3Rpb24gTW9kdWxlOk5ld0NvbW1XcmFwKENoYW5uZWw6IEJpbmRhYmxlRXZlbnQpDQogICAgbG9jYWwgQmFzZSA9IHsNCiAgICAgICAgUXVldWUgPSBzZXRtZXRhdGFibGUoe30sIHtfX21vZGUgPSAidiJ9KSwNCiAgICAgICAgQ2hhbm5lbCA9IENoYW5uZWwsDQogICAgICAgIEV2ZW50ID0gQ2hhbm5lbC5FdmVudA0KICAgIH0NCg0KICAgIC0tLy8gQ3JlYXRlIG5ldyB3cmFwcGVyIGNsYXNzDQogICAgbG9jYWwgV3JhcHBlZCA9IHNldG1ldGF0YWJsZShCYXNlLCBDb21tV3JhcHBlcikNCiAgICBXcmFwcGVkOkJlZ2luUXVldWVTZXJ2aWNlKCkNCg0KICAgIHJldHVybiBXcmFwcGVkDQplbmQNCg0KZnVuY3Rpb24gTW9kdWxlOk1ha2VEZWJ1Z0lkSGFuZGxlcigpOiBCaW5kYWJsZUZ1bmN0aW9uDQogICAgLS0vLyBVc2luZyBCaW5kYWJsZUZ1bmN0aW9uIGFzIGl0IGRvZXMgbm90IHJlcXVpcmUgYSB0aHJlYWQgcGVybWlzc2lvbiBjaGFuZ2UNCiAgICBsb2NhbCBSZW1vdGUgPSBJbnN0YW5jZS5uZXcoIkJpbmRhYmxlRnVuY3Rpb24iKQ0KICAgIGZ1bmN0aW9uIFJlbW90ZS5Pbkludm9rZShPYmplY3Q6IEluc3RhbmNlKTogc3RyaW5nDQogICAgICAgIHJldHVybiBPYmplY3Q6R2V0RGVidWdJZCgpDQogICAgZW5kDQoNCiAgICBzZWxmLkRlYnVnSWRSZW1vdGUgPSBSZW1vdGUNCiAgICBzZWxmLkRlYnVnSWRJbnZva2UgPSBSZW1vdGUuSW52b2tlDQoNCiAgICByZXR1cm4gUmVtb3RlDQplbmQNCg0KZnVuY3Rpb24gTW9kdWxlOkdldERlYnVnSWQoT2JqZWN0OiBJbnN0YW5jZSk6IHN0cmluZw0KICAgIGxvY2FsIEludm9rZSA9IHNlbGYuRGVidWdJZEludm9rZQ0KICAgIGxvY2FsIFJlbW90ZSA9IHNlbGYuRGVidWdJZFJlbW90ZQ0KCXJldHVybiBJbnZva2UoUmVtb3RlLCBPYmplY3QpDQplbmQNCg0KZnVuY3Rpb24gTW9kdWxlOkdldEhpZGRlblBhcmVudCgpOiBJbnN0YW5jZQ0KICAgIC0tLy8gVXNlIGdldGh1aSBpZiBpdCBleGlzdHMNCiAgICBpZiBnZXRodWkgdGhlbiByZXR1cm4gZ2V0aHVpKCkgZW5kDQogICAgcmV0dXJuIENvcmVHdWkNCmVuZA0KDQpmdW5jdGlvbiBNb2R1bGU6Q3JlYXRlQ29tbUNoYW5uZWwoKTogKG51bWJlciwgQmluZGFibGVFdmVudCkNCiAgICAtLS8vIFVzZSBuYXRpdmUgaWYgaXQgZXhpc3RzDQogICAgbG9jYWwgRm9yY2UgPSBDb25maWcuRm9yY2VVc2VDdXN0b21Db21tDQogICAgaWYgY3JlYXRlX2NvbW1fY2hhbm5lbCBhbmQgbm90IEZvcmNlIHRoZW4NCiAgICAgICAgcmV0dXJuIGNyZWF0ZV9jb21tX2NoYW5uZWwoKQ0KICAgIGVuZA0KDQogICAgbG9jYWwgUGFyZW50ID0gc2VsZjpHZXRIaWRkZW5QYXJlbnQoKQ0KICAgIGxvY2FsIENoYW5uZWxJZCA9IG1hdGgucmFuZG9tKDEsIDEwMDAwMDAwKQ0KDQogICAgLS0vLyBCaW5kYWJsZUV2ZW50DQogICAgbG9jYWwgQ2hhbm5lbCA9IEluc3RhbmNlLm5ldygiQmluZGFibGVFdmVudCIsIFBhcmVudCkNCiAgICBDaGFubmVsLk5hbWUgPSBDaGFubmVsSWQNCg0KICAgIHJldHVybiBDaGFubmVsSWQsIENoYW5uZWwNCmVuZA0KDQpmdW5jdGlvbiBNb2R1bGU6R2V0Q29tbUNoYW5uZWwoQ2hhbm5lbElkOiBudW1iZXIpOiBCaW5kYWJsZUV2ZW50Pw0KICAgIC0tLy8gVXNlIG5hdGl2ZSBpZiBpdCBleGlzdHMNCiAgICBsb2NhbCBGb3JjZSA9IENvbmZpZy5Gb3JjZVVzZUN1c3RvbUNvbW0NCiAgICBpZiBnZXRfY29tbV9jaGFubmVsIGFuZCBub3QgRm9yY2UgdGhlbg0KICAgICAgICBsb2NhbCBDaGFubmVsID0gZ2V0X2NvbW1fY2hhbm5lbChDaGFubmVsSWQpDQogICAgICAgIHJldHVybiBDaGFubmVsLCBmYWxzZQ0KICAgIGVuZA0KDQogICAgbG9jYWwgUGFyZW50ID0gc2VsZjpHZXRIaWRkZW5QYXJlbnQoKQ0KICAgIGxvY2FsIENoYW5uZWwgPSBQYXJlbnQ6RmluZEZpcnN0Q2hpbGQoQ2hhbm5lbElkKQ0KDQogICAgLS0vLyBXcmFwIHRoZSBjaGFubmVsIChQcmV2ZW50cyB0aHJlYWQgcGVybWlzc2lvbiBlcnJvcnMpDQogICAgbG9jYWwgV3JhcHBlZCA9IHNlbGY6TmV3Q29tbVdyYXAoQ2hhbm5lbCkNCiAgICByZXR1cm4gV3JhcHBlZCwgdHJ1ZQ0KZW5kDQoNCmZ1bmN0aW9uIE1vZHVsZTpDaGVja1ZhbHVlKFZhbHVlLCBJbmJvdW5kOiBib29sZWFuPykNCiAgICAgLS0vLyBObyBzZXJpYWxpemluZyAgbmVlZGVkDQogICAgaWYgdHlwZW9mKFZhbHVlKSB+PSAidGFibGUiIHRoZW4gDQogICAgICAgIHJldHVybiBWYWx1ZSANCiAgICBlbmQNCiAgIA0KICAgIC0tLy8gRGVzZXJpYWxpemUNCiAgICBpZiBJbmJvdW5kIHRoZW4NCiAgICAgICAgcmV0dXJuIHNlbGY6RGVzZXJpYWxpemVUYWJsZShWYWx1ZSkNCiAgICBlbmQNCg0KICAgIC0tLy8gU2VyaWFsaXplDQogICAgcmV0dXJuIHNlbGY6U2VyaWFsaXplVGFibGUoVmFsdWUpDQplbmQNCg0KbG9jYWwgVGljayA9IDANCmZ1bmN0aW9uIE1vZHVsZTpXYWl0Q2hlY2soKQ0KICAgIFRpY2sgKz0gMQ0KICAgIGlmIFRpY2sgPiA0MCB0aGVuDQogICAgICAgIFRpY2sgPSAwIC0tIEkgY291bGQgdXNlIG1vZHVsdXMgaGVyZSBidXQgdGhlIGludGVyZ2VyIHdpbGwgYmUgbWFzc2l2ZQ0KICAgICAgICB3YWl0KCkNCiAgICBlbmQNCmVuZA0KDQpmdW5jdGlvbiBNb2R1bGU6TWFrZVBhY2tldChJbmRleCwgVmFsdWUpOiB0YWJsZQ0KICAgIHNlbGY6V2FpdENoZWNrKCkNCiAgICByZXR1cm4gew0KICAgICAgICBJbmRleCA9IHNlbGY6Q2hlY2tWYWx1ZShJbmRleCksIA0KICAgICAgICBWYWx1ZSA9IHNlbGY6Q2hlY2tWYWx1ZShWYWx1ZSkNCiAgICB9DQplbmQNCg0KZnVuY3Rpb24gTW9kdWxlOlJlYWRQYWNrZXQoUGFja2V0OiB0YWJsZSk6IChhbnksIGFueSkNCiAgICBpZiB0eXBlb2YoUGFja2V0KSB+PSAidGFibGUiIHRoZW4gcmV0dXJuIFBhY2tldCBlbmQNCiAgICANCiAgICBsb2NhbCBLZXkgPSBzZWxmOkNoZWNrVmFsdWUoUGFja2V0LkluZGV4LCB0cnVlKQ0KICAgIGxvY2FsIFZhbHVlID0gc2VsZjpDaGVja1ZhbHVlKFBhY2tldC5WYWx1ZSwgdHJ1ZSkNCiAgICBzZWxmOldhaXRDaGVjaygpDQoNCiAgICByZXR1cm4gS2V5LCBWYWx1ZQ0KZW5kDQoNCmZ1bmN0aW9uIE1vZHVsZTpTZXJpYWxpemVUYWJsZShUYWJsZTogdGFibGUpOiB0YWJsZQ0KICAgIC0tLy8gQ2hlY2sgY2FjaGUgZm9yIGV4aXN0aW5nDQogICAgbG9jYWwgQ2FjaGVkID0gU2VyaWFsaXplQ2FjaGVbVGFibGVdDQogICAgaWYgQ2FjaGVkIHRoZW4gcmV0dXJuIENhY2hlZCBlbmQNCg0KICAgIGxvY2FsIFNlcmlhbGl6ZWQgPSB7fQ0KICAgIFNlcmlhbGl6ZUNhY2hlW1RhYmxlXSA9IFNlcmlhbGl6ZWQNCg0KICAgIGZvciBJbmRleCwgVmFsdWUgaW4gbmV4dCwgVGFibGUgZG8NCiAgICAgICAgbG9jYWwgUGFja2V0ID0gc2VsZjpNYWtlUGFja2V0KEluZGV4LCBWYWx1ZSkNCiAgICAgICAgdGFibGUuaW5zZXJ0KFNlcmlhbGl6ZWQsIFBhY2tldCkNCiAgICBlbmQNCg0KICAgIHJldHVybiBTZXJpYWxpemVkDQplbmQNCg0KZnVuY3Rpb24gTW9kdWxlOkRlc2VyaWFsaXplVGFibGUoU2VyaWFsaXplZDogdGFibGUpOiB0YWJsZQ0KICAgIC0tLy8gQ2hlY2sgZm9yIGNhY2hlZA0KICAgIGxvY2FsIENhY2hlZCA9IERlc2VyaWFsaXplQ2FjaGVbU2VyaWFsaXplZF0NCiAgICBpZiBDYWNoZWQgdGhlbiByZXR1cm4gQ2FjaGVkIGVuZA0KDQogICAgbG9jYWwgVGFibGUgPSB7fQ0KICAgIERlc2VyaWFsaXplQ2FjaGVbU2VyaWFsaXplZF0gPSBUYWJsZQ0KICAgIA0KICAgIGZvciBfLCBQYWNrZXQgaW4gbmV4dCwgU2VyaWFsaXplZCBkbw0KICAgICAgICBsb2NhbCBJbmRleCwgVmFsdWUgPSBzZWxmOlJlYWRQYWNrZXQoUGFja2V0KQ0KICAgICAgICBpZiBJbmRleCA9PSBuaWwgdGhlbiBjb250aW51ZSBlbmQNCg0KICAgICAgICBUYWJsZVtJbmRleF0gPSBWYWx1ZQ0KICAgIGVuZA0KDQogICAgcmV0dXJuIFRhYmxlDQplbmQNCg0KZnVuY3Rpb24gTW9kdWxlOlNldENoYW5uZWwoTmV3Q2hhbm5lbDogbnVtYmVyKQ0KICAgIENoYW5uZWwgPSBOZXdDaGFubmVsDQplbmQNCg0KZnVuY3Rpb24gTW9kdWxlOkNvbnNvbGVQcmludCguLi4pDQogICAgc2VsZjpDb21tdW5pY2F0ZSgiUHJpbnQiLCAuLi4pDQplbmQNCg0KZnVuY3Rpb24gTW9kdWxlOlF1ZXVlTG9nKERhdGEpDQogICAgc3Bhd24oZnVuY3Rpb24oKQ0KICAgICAgICBsb2NhbCBTZXJpYWxpemVkQXJncyA9IHNlbGY6U2VyaWFsaXplVGFibGUoRGF0YS5BcmdzKQ0KICAgICAgICBEYXRhLkFyZ3MgPSBTZXJpYWxpemVkQXJncw0KDQogICAgICAgIHNlbGY6Q29tbXVuaWNhdGUoIlF1ZXVlTG9nIiwgRGF0YSkNCiAgICBlbmQpDQplbmQNCg0KZnVuY3Rpb24gTW9kdWxlOkFkZENvbW1DYWxsYmFjayhUeXBlOiBzdHJpbmcsIENhbGxiYWNrOiAoLi4uYW55KSAtPiAuLi5hbnkpDQogICAgbG9jYWwgQ29tbUNhbGxiYWNrcyA9IHNlbGYuQ29tbUNhbGxiYWNrcw0KICAgIENvbW1DYWxsYmFja3NbVHlwZV0gPSBDYWxsYmFjaw0KZW5kDQoNCmZ1bmN0aW9uIE1vZHVsZTpHZXRDb21tQ2FsbGJhY2soVHlwZTogc3RyaW5nKTogKC4uLmFueSkgLT4gLi4uYW55DQogICAgbG9jYWwgQ29tbUNhbGxiYWNrcyA9IHNlbGYuQ29tbUNhbGxiYWNrcw0KICAgIHJldHVybiBDb21tQ2FsbGJhY2tzW1R5cGVdDQplbmQNCg0KZnVuY3Rpb24gTW9kdWxlOkNoYW5uZWxJbmRleChDaGFubmVsLCBQcm9wZXJ0eTogc3RyaW5nKQ0KICAgIGlmIHR5cGVvZihDaGFubmVsKSA9PSAiSW5zdGFuY2UiIHRoZW4NCiAgICAgICAgcmV0dXJuIEhvb2s6SW5kZXgoQ2hhbm5lbCwgUHJvcGVydHkpDQogICAgZW5kDQoNCiAgICAtLS8vIFNvbWUgZXhlY3V0b3JzIHJldHVybiBhIFVzZXJEYXRhIHR5cGUNCiAgICByZXR1cm4gQ2hhbm5lbFtQcm9wZXJ0eV0NCmVuZA0KDQpmdW5jdGlvbiBNb2R1bGU6Q29tbXVuaWNhdGUoLi4uKQ0KICAgIGxvY2FsIEZpcmUgPSBzZWxmOkNoYW5uZWxJbmRleChDaGFubmVsLCAiRmlyZSIpDQogICAgRmlyZShDaGFubmVsLCAuLi4pDQplbmQNCg0KZnVuY3Rpb24gTW9kdWxlOkFkZENvbm5lY3Rpb24oQ2FsbGJhY2spOiBSQlhTY3JpcHRDb25uZWN0aW9uDQogICAgbG9jYWwgRXZlbnQgPSBzZWxmOkNoYW5uZWxJbmRleChDaGFubmVsLCAiRXZlbnQiKQ0KICAgIHJldHVybiBFdmVudDpDb25uZWN0KENhbGxiYWNrKQ0KZW5kDQoNCmZ1bmN0aW9uIE1vZHVsZTpBZGRUeXBlQ2FsbGJhY2soVHlwZTogc3RyaW5nLCBDYWxsYmFjayk6IFJCWFNjcmlwdENvbm5lY3Rpb24NCiAgICBsb2NhbCBFdmVudCA9IHNlbGY6Q2hhbm5lbEluZGV4KENoYW5uZWwsICJFdmVudCIpDQogICAgcmV0dXJuIEV2ZW50OkNvbm5lY3QoZnVuY3Rpb24oUmVjaXZlZFR5cGU6IHN0cmluZywgLi4uKQ0KICAgICAgICBpZiBSZWNpdmVkVHlwZSB+PSBUeXBlIHRoZW4gcmV0dXJuIGVuZA0KICAgICAgICBDYWxsYmFjayguLi4pDQogICAgZW5kKQ0KZW5kDQoNCmZ1bmN0aW9uIE1vZHVsZTpBZGRUeXBlQ2FsbGJhY2tzKFR5cGVzOiB0YWJsZSkNCiAgICBmb3IgVHlwZTogc3RyaW5nLCBDYWxsYmFjayBpbiBuZXh0LCBUeXBlcyBkbw0KICAgICAgICBzZWxmOkFkZFR5cGVDYWxsYmFjayhUeXBlLCBDYWxsYmFjaykNCiAgICBlbmQNCmVuZA0KDQpmdW5jdGlvbiBNb2R1bGU6Q3JlYXRlQ2hhbm5lbCgpOiBudW1iZXINCiAgICBsb2NhbCBDaGFubmVsSUQsIEV2ZW50ID0gc2VsZjpDcmVhdGVDb21tQ2hhbm5lbCgpDQoNCiAgICAtLS8vIENvbm5lY3QgR2V0Q29tbUNhbGxiYWNrIGZ1bmN0aW9uDQogICAgRXZlbnQuRXZlbnQ6Q29ubmVjdChmdW5jdGlvbihUeXBlOiBzdHJpbmcsIC4uLikNCiAgICAgICAgbG9jYWwgQ2FsbGJhY2sgPSBzZWxmOkdldENvbW1DYWxsYmFjayhUeXBlKQ0KICAgICAgICBpZiBDYWxsYmFjayB0aGVuDQogICAgICAgICAgICBDYWxsYmFjayguLi4pDQogICAgICAgIGVuZA0KICAgIGVuZCkNCg0KICAgIHJldHVybiBDaGFubmVsSUQsIEV2ZW50DQplbmQNCg0KTW9kdWxlOk1ha2VEZWJ1Z0lkSGFuZGxlcigpDQoNCnJldHVybiBNb2R1bGU=]]
}},d.Players local i=e:LoadLibraries(g)local j,k,l,m,n,o,p=i.Process,i.Hook,i.Ui
,i.Generation,i.Communication,i.Config,e:GetAsset('ProggyClean.ttf',true)local q
=e:CreateFont('ProggyClean',p)l:SetFontFile(q)j:CheckConfig(o)e:LoadModules(i,{
Modules=i,Services=d})local r,s=l:CreateMainWindow(),j:CheckIsSupported()if not
s then r:Close()return end local t,u=n:CreateChannel()n:AddCommCallback(
'QueueLog',function(...)l:QueueLog(...)end)n:AddCommCallback('Print',function(
...)l:ConsoleLog(...)end)local v=h.LocalPlayer m:SetSwapsCallback(function(w)w:
AddSwap(v,{String='LocalPlayer'})w:AddSwap(v.Character,{String='Character',
NextParent=v})end)l:CreateWindowContent(r)l:SetCommChannel(u)l:BeginLogService()
local w=e:MakeActorScript(g,t)k:LoadHooks(w,t)local x=l:AskUser{Title=
'Enable function patches?',Content={
[[On some executors, function patches can prevent common detections that executor has]]
,
[[By enabling this, it MAY trigger hook detections in some games, this is why you are asked.]]
,"If it doesn't work, rejoin and press 'No'",'',
'(This does not affect game functionality)'},Options={'Yes','No'}}=='Yes'u:Fire(
'BeginHooks',{PatchFunctions=x})