-
Notifications
You must be signed in to change notification settings - Fork 2
/
TestPRD.xml
116 lines (116 loc) · 440 KB
/
TestPRD.xml
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
<?xml version="1.0" encoding="UTF-8"?><driver-configuration config-type="app-config" dn="cn=rbpm,cn=driverset1,o=system" driver-set-dn="cn=driverset1,o=system" name="rbpm">
<children>
<provisioning>
<ds-object ds-object-class="srvprvAppConfig" ds-object-name="AppConfig">
<ds-attribute ds-attr-name="Version">
<ds-value>4.5</ds-value>
</ds-attribute>
<ds-object ds-object-class="nrfAuthTypes" ds-object-name="AuthTypes">
<ds-attributes/>
</ds-object>
<ds-object ds-object-class="nrfUIConfig" ds-object-name="UIConfig">
<ds-attributes/>
<ds-object ds-object-class="nrfNavItems" ds-object-name="NavItems">
<ds-attributes/>
</ds-object>
</ds-object>
<ds-object ds-object-class="srvprvAppDefs" ds-object-name="AppDefs">
<ds-attributes/>
</ds-object>
<ds-object ds-object-class="srvprvDirectoryModel" ds-object-name="DirectoryModel">
<ds-attributes/>
<ds-object ds-object-class="srvprvChoiceDefs" ds-object-name="ChoiceDefs">
<ds-attributes/>
</ds-object>
<ds-object ds-object-class="srvprvEntityDefs" ds-object-name="EntityDefs">
<ds-attributes/>
</ds-object>
<ds-object ds-object-class="srvprvQueryDefs" ds-object-name="QueryDefs">
<ds-attributes/>
</ds-object>
<ds-object ds-object-class="srvprvRelationshipDefs" ds-object-name="RelationshipDefs">
<ds-attributes/>
</ds-object>
</ds-object>
<ds-object ds-object-class="srvprvRequestDefs" ds-object-name="RequestDefs">
<ds-attributes/>
<ds-object ds-object-class="srvprvRequest" ds-object-name="TestPRD">
<ds-attributes>
<ds-attribute ds-attr-name="Description">
<ds-value>Test</ds-value>
</ds-attribute>
<ds-attribute ds-attr-name="srvprvStatus">
<ds-value>Active</ds-value>
</ds-attribute>
<ds-attribute ds-attr-name="srvprvFlowStrategy">
<ds-value>SingleFlow</ds-value>
</ds-attribute>
<ds-attribute ds-attr-name="srvprvGrant">
<ds-value>true</ds-value>
</ds-attribute>
<ds-attribute ds-attr-name="srvprvRevoke">
<ds-value>false</ds-value>
</ds-attribute>
<ds-attribute ds-attr-name="srvprvCategoryKey">
<ds-value>entitlements</ds-value>
</ds-attribute>
<ds-attribute ds-attr-name="srvprvLocalizedNames">
<ds-value>en~TestPRD</ds-value>
</ds-attribute>
<ds-attribute ds-attr-name="srvprvLocalizedDescrs">
<ds-value>en~Test</ds-value>
</ds-attribute>
<ds-attribute ds-attr-name="XMLData">
<ds-value><![CDATA[PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHByb3YtcmVxLWRlZm4gZmxvdy1zdHJhdGVneT0iU2luZ2xlRmxvdyIgZ3JhbnQ9InRydWUiCiAgICBwcm92LWNhdGVnb3J5PSJlbnRpdGxlbWVudHMiIHByb3YtaWQ9ImNuPVRlc3RQUkQiIHJldm9rZT0iZmFsc2UiCiAgICBzdGF0dXM9IkFjdGl2ZSIKICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCiAgICAgICAgeHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb249IiI+PHByb3YtcmVzb3VyY2UtcmVmPk5vbmU8L3Byb3YtcmVzb3VyY2UtcmVmPjx3b3JrZmxvdy1yZWYvPjxkaXNwbGF5LW5hbWUKICAgICAgICB4bWw6bGFuZz0iZW4iPlRlc3RQUkQ8L2Rpc3BsYXktbmFtZT48ZGVzY3JpcHRpb24KICAgICAgICAgICAgeG1sOmxhbmc9ImVuIj5UZXN0PC9kZXNjcmlwdGlvbj48dHJ1c3RlZXMvPjx4bWwtZGF0YT48ZGVzaWduLXBhcmFtcwogICAgICAgICAgICBkaWdpdGFsLXNpZ25hdHVyZS10eXBlPSJub3QtcmVxdWlyZWQiIGdyYW50PSJ0cnVlIgogICAgICAgICAgICBub3RpZnktYWRkcmVzc2VlPSJmYWxzZSIKICAgICAgICAgICAgICAgICAgICBwcm92LWlkPSJUZXN0Ij48Zm9ybS10aXRsZT48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJlbiI+VGVzdDwvZGlzcGxheS1sYWJlbD48ZGVzY3JpcHRpb24KICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJlbiI+VGVzdDwvZGVzY3JpcHRpb24+PC9mb3JtLXRpdGxlPjxwcm92LXJlc291cmNlCiAgICAgICAgICAgICAgICAgICAgbmFtZT0iTm9uZSIvPjx3b3JrZmxvdy8+PGxlZ2FsLWRpc2NsYWltZXJzLz48bGlua3M+PGxpbmsKICAgICAgICAgICAgICAgICAgICBzb3VyY2U9IlN0YXJ0IiB0YXJnZXQ9Im1hcFRlc3RzMSIKICAgICAgICAgICAgICAgICAgICB0eXBlPSJmb3J3YXJkIi8+PGxpbmsgc291cmNlPSJtYXBUZXN0czEiCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PSJtYXBUZXN0czIiIHR5cGU9ImZvcndhcmQiLz48bGluawogICAgICAgICAgICAgICAgICAgIHNvdXJjZT0ibWFwVGVzdHMyIiB0YXJnZXQ9Im1hcFRlc3RzMyIKICAgICAgICAgICAgICAgICAgICB0eXBlPSJmb3J3YXJkIi8+PGxpbmsgc291cmNlPSJtYXBUZXN0czMiCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PSJtYXBUZXN0czQiIHR5cGU9ImZvcndhcmQiLz48bGluawogICAgICAgICAgICAgICAgICAgIHNvdXJjZT0ibWFwVGVzdHM0IiB0YXJnZXQ9Im1hcFRlc3RzNSIKICAgICAgICAgICAgICAgICAgICB0eXBlPSJmb3J3YXJkIi8+PGxpbmsgc291cmNlPSJtYXBUZXN0czUiCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PSJtYXBUZXN0czYiIHR5cGU9ImZvcndhcmQiLz48bGluawogICAgICAgICAgICAgICAgICAgIHNvdXJjZT0ibWFwVGVzdHM2IiB0YXJnZXQ9IkZpbmlzaCIKICAgICAgICB0eXBlPSJmb3J3YXJkIi8+PC9saW5rcz48L2Rlc2lnbi1wYXJhbXM+PHJlc291cmNlLWRhdGEtYmluZGluZy8+PC94bWwtZGF0YT48cHJvY2VzcwogICAgICAgIGRlZmF1bHQtY29tcGxldGVkLWFwcHJvdmFsLXN0YXR1cz0iYXBwcm92ZWQiCiAgICAgICAgaWQ9ImNuPVRlc3RQUkQsY249UmVxdWVzdERlZnMsY249QXBwQ29uZmlnLGNuPXJicG0sY249ZHJpdmVyc2V0MSxvPXN5c3RlbSIKICAgICAgICBzZXRub3RpZnk9ImZhbHNlIiB2ZXJzaW9uPSI0LjUuMCIKICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgogICAgICAgICAgICB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iQXBwcm92YWxQcm9jZXNzNF81XzAueHNkIj48ZGlzcGxheS1uYW1lCiAgICAgICAgICAgIHhtbDpsYW5nPSJlbiI+VGVzdFBSRDwvZGlzcGxheS1uYW1lPjxpbXBvcnQtc2NyaXB0CiAgICAgICAgICAgIGlubGluZT0idHJ1ZSIKICAgICAgICAgICAgdXNlLWluLWZvcm09InRydWUiPjxlY21hLXNjcmlwdD4vKiomI3hkOwogKiBTaW1wbGUgbW9kdWxlIHRvIGFzc2lzdCBvbiB3b3JrZmxvdyBkZXZlbG9wbWVudC4mbHQ7YnIvJmd0OyYjeGQ7CiAqIENyZWF0ZWQgdG8gYmUgaW1wb3J0ZWQgaW4gT3ZlcnZpZXcgJmd0OyBHbG9iYWwgU2NyaXB0cyBhbmQgdXNlZCBvbiBib3RoIGZvcm1zIGFuZCBlbmdpbmUuJmx0O2JyLyZndDsmI3hkOwogKiB2MS4wLjUgYnJlYWtpbmcgY2hhbmdlIC0gQ29tcGFyZSgpIGFuZCBVbmlxdWUoKSByZW5hbWVkIHRvIGNvbXBhcmUoKSBhbmQgdW5pcXVlKCkgYXMgcGVyICMyMCAuJmx0O2JyLyZndDsmI3hkOwogKiBAbmFtZXNwYWNlIFBSRCYjeGQ7CiAqIEB2ZXJzaW9uIDEuMC43JiN4ZDsKICogQGxpY2Vuc2UgTUlUIExpY2Vuc2UmI3hkOwogKi8mI3hkOwp2YXIgUFJEID0gKGZ1bmN0aW9uIElJRkUoIGxvZ3ByZWZpeCwgdmVyYm9zZW1zZyApIHsmI3hkOwogIC8vIEV4cG9ydGVkIHB1YmxpYyBBUEkuIEZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIG5vdCBkZWNsYXJlZCBoZXJlIHdpbGwgcmVtYWluIHByaXZhdGUgdG8gdGhpcyBtb2R1bGUmI3hkOwogIHZhciBQdWJsaWNBUEkgPSB7JiN4ZDsKICAgIHV0aWw6IHsmI3hkOwogICAgICBmb3JtT3JFbmdpbmU6Zm9ybU9yRW5naW5lLCYjeGQ7CiAgICAgIGxvZ2Vycm9yOmxvZ2Vycm9yLCYjeGQ7CiAgICAgIGNvZXJjZVRvU3RyaW5nOmNvZXJjZVRvU3RyaW5nLCYjeGQ7CiAgICAgIEpTT05vYmo6IHsmI3hkOwogICAgICAgIHBhcnNlOkpTT05wYXJzZSwmI3hkOwogICAgICAgIHN0cmluZ2lmeTpKU09Oc3RyaW5naWZ5LCYjeGQ7CiAgICAgICAgZ2V0OkpTT05nZXQsJiN4ZDsKICAgICAgICB0ZXN0OkpTT050ZXN0JiN4ZDsKICAgICAgfSwmI3hkOwogICAgICBjb21wYXJlOmNvbXBhcmUsJiN4ZDsKICAgICAgdW5pcXVlOnVuaXF1ZSwmI3hkOwogICAgICBpbnNwZWN0VHlwZTppbnNwZWN0VHlwZSwmI3hkOwogICAgICBpc1N0cmluZzppc1N0cmluZywmI3hkOwogICAgICBpc051bWJlcjppc051bWJlciwmI3hkOwogICAgICBpc0Jvb2xlYW46aXNCb29sZWFuLCYjeGQ7CiAgICAgIGRlYnVnbXNnOmRlYnVnbXNnLCYjeGQ7CiAgICB9LCYjeGQ7CiAgICBkZWJ1Z21lc3NhZ2VzOmRlYnVnbWVzc2FnZXMsJiN4ZDsKICAgIHNldGxvZ3ByZWZpeDpzZXRsb2dwcmVmaXgsJiN4ZDsKICAgIHZlcnNpb246dmVyc2lvbiwmI3hkOwogICAgSURWZ2V0OklEVmdldCwmI3hkOwogICAgSURWZ2xvYmFsUXVlcnk6SURWZ2xvYmFsUXVlcnkmI3hkOwogIH07JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIFJldHVybiBtb2R1bGUgdmVyc2lvbi4mI3hkOwogICAqJiN4ZDsKICAgKiBAbWVtYmVyb2YgUFJEJiN4ZDsKICAgKiBAc2luY2UgMS4wLjEmI3hkOwogICAqJiN4ZDsKICAgKiBAdHlwZSB7c3RyaW5nfSYjeGQ7CiAgICogQHJldHVybiB7c3RyaW5nfSBNb2R1bGUncyB2ZXJzaW9uIGluIHRoZSBmb3JtYXQgTS5tLnAgKE1ham9yLCBtaW5vciwgcGF0Y2gpJiN4ZDsKICAgKi8mI3hkOwogIGZ1bmN0aW9uIHZlcnNpb24oKSB7JiN4ZDsKICAgIHJldHVybiAnMS4wLjcnOyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgdXNlIGluICBJZGVudGl0eSBNYW5hZ2VyIHdvcmsgZmxvdyBkZXZlbG9wbWVudC4mI3hkOwogICAqIEBuYW1lc3BhY2UgUFJELnV0aWwmI3hkOwogICAqIEBtZW1iZXJvZiBQUkQmI3hkOwogICAqIEBzaW5jZSAxLjAuMCYjeGQ7CiAgICovJiN4ZDsKJiN4ZDsKICAgIC8qKiYjeGQ7CiAgICogUHJveHkgZm9yIHRoZSBhY3R1YWwgSlNPTiBvYmplY3QgdXNlZCBpbiBicm93c2VycyAoSlNPTikgb3Igd29ya2Zsb3cgZW5naW5lIChTY3JpcHRWYXVsdC5KU09OKS4mbHQ7YnIvJmd0OyYjeGQ7CiAgICogV3JhcHMgdGhlIHBhcnNlKCkgYW5kIHN0cmluZ2lmeSgpIGNhbGxzIGluIHRyeS9jYXRjaCBibG9ja3MgdG8gcmVwb3J0IGVycm9ycyB2aWEgbG9nZXJyb3IoKSBpbnN0ZWFkIG9mJiN4ZDsKICAgKiBsZXR0aW5nIHRoZSB3b3JrZmxvdyBlbmdpbmUgYnJlYWsgaXRzIHJlZ3VsYXIgZmxvdyB3aGVuIGFuIGVycm9yIG9jY3Vycy4mI3hkOwogICAqIEBuYW1lc3BhY2UgUFJELnV0aWwuSlNPTm9iaiYjeGQ7CiAgICogQG1lbWJlcm9mIFBSRC51dGlsJiN4ZDsKICAgKiBAc2luY2UgMS4wLjImI3hkOwogICAqLyYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiBGdW5jdGlvbnMgYW5kIG9iamVjdHMgdGhhdCBjYW4gb25seSBiZSBhY2Nlc3NlZCBpbiB3b3JrIGZsb3cgZm9ybXMuJiN4ZDsKICAgKiBAbmFtZXNwYWNlIFBSRC53ZWImI3hkOwogICAqIEBtZW1iZXJvZiBQUkQmI3hkOwogICAqIEBzaW5jZSAxLjAuNCYjeGQ7CiAgICovJiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIFN0b3JhZ2UgZm9yIHRoZSBmcmFtZXdvcmsgb2JqZWN0cywgb25seSB1c2VkIHdoZW4gZnVuY3Rpb25zIGFyZSBjYWxsZWQgZnJvbSBpbnNpZGUgYSBmb3JtLiYjeGQ7CiAgICogTm90IG5lZWRlZCB3aGVuIGNvZGUgaXMgcnVubmluZyBvbiB0aGUgd29ya2Zsb3cgZW5naW5lLiYjeGQ7CiAgICovJiN4ZDsKICB2YXIgSURNQVBQUyA9IHsmI3hkOwogICAgZmllbGQ6bnVsbCwmI3hkOwogICAgZm9ybTpudWxsLCYjeGQ7CiAgICBJRFZhdWx0Om51bGwmI3hkOwogIH07JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIEludGVybmFsIHN0YXRlLCB1c2VkIHRvIGRlZmluZSB3aGF0IGZ1bmN0aW9ucyB0byBleHBvcnQgYXMgd2VsbCBhcyYjeGQ7CiAgICogdGhlIGJlaGF2aW9yIGZvciBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCBpbiBib3RoIGZvcm0gYW5kIGVuZ2luZS4mI3hkOwogICAqLyYjeGQ7CiAgdmFyIHdoZXJlID0gZm9ybU9yRW5naW5lKCk7JiN4ZDsKICB2YXIgSlN0cmluZzsgLy8gSmF2YSBzdHJpbmcsIHVzZWQgb25seSBvbiB0aGUgd29ya2Zsb3cgZW5naW5lLiYjeGQ7CiAgdmFyIEpTT05wdHI7IC8vIEpTT04gaW50ZXJuYWwgcG9pbnRlci4gSWYgd2UgZXZhbHVhdGUgaXQgaW5zaWRlIGEgZnVuY3Rpb24gdGhhdCBmdW5jdGlvbiBjYW4gY2F1c2UgZm9ybSB0byBmYWlsIHRvIGxvYWQuJiN4ZDsKICB2YXIgcHJlZml4OyAvLyBwcmVmaXggdmFyaWFibGUgdXNlZCBieSB0aGUgbG9nZXJyb3IoKSBjYWxscy4mI3hkOwogIHZhciBkZWJ1ZzsgLy8gV2hlbiBzZXQsIGZ1bmN0aW9ucyB3aWxsIHByb3ZpZGUgbW9yZSB2ZXJib3NlIGxvZyBtZXNzYWdlcyYjeGQ7CiAgaWYgKCB3aGVyZSA9PT0gJ2VuZ2luZScgKSB7JiN4ZDsKICAgIEpTdHJpbmcgPSBqYXZhLmxhbmcuU3RyaW5nOyYjeGQ7CiAgICBKU09OcHRyID0gU2NyaXB0VmF1bHQuSlNPTjsmI3hkOwogIH0mI3hkOwogIGlmICggd2hlcmUgPT09ICdmb3JtJyApIHsmI3hkOwogICAgSlNPTnB0ciA9IEpTT047JiN4ZDsKICB9JiN4ZDsKICAvLyBJbml0aWFsaXplcyBkZWJ1ZyBtb2RlIGZyb20gbGlicmFyeSdzIHBhcmFtZXRlci4mI3hkOwogIGRlYnVnbWVzc2FnZXMoIHZlcmJvc2Vtc2cgKTsmI3hkOwogIC8vIEluaXRpYWxpemVzIHRoZSBwcmVmaXggdmFyaWFibGUgdXNlZCBieSB0aGUgbG9nZXJyb3IoKSBjYWxscy4mI3hkOwogIHNldGxvZ3ByZWZpeCggbG9ncHJlZml4ICk7JiN4ZDsKJiN4ZDsKICAvLyBGcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9oNWJwL2h0bWw1LWJvaWxlcnBsYXRlL2Jsb2IvbWFzdGVyL3NyYy9qcy9wbHVnaW5zLmpzICwmI3hkOwogIC8vIGltcGxlbWVudGVkIGFmdGVyIGVycm9ycyBvY2N1cmVkIG9uIGNlcnRhaW4gSUUgYnJvd3NlciB0ZXN0cyBvbiBsb2dlcnJvcigpIGNvbnNvbGUubG9nKCkgY2FsbHMuJiN4ZDsKICBpZiAoIHdoZXJlID09PSAnZm9ybScgKSB7JiN4ZDsKICAgIC8vIEF2b2lkIGBjb25zb2xlYCBlcnJvcnMgaW4gYnJvd3NlcnMgdGhhdCBsYWNrIGEgY29uc29sZS4mI3hkOwogICAgKGZ1bmN0aW9uKCkgeyYjeGQ7CiAgICAgIHZhciBtZXRob2Q7JiN4ZDsKICAgICAgdmFyIG5vb3AgPSBmdW5jdGlvbiAoKSB7fTsmI3hkOwogICAgICB2YXIgbWV0aG9kcyA9IFsmI3hkOwogICAgICAgICdhc3NlcnQnLCAnY2xlYXInLCAnY291bnQnLCAnZGVidWcnLCAnZGlyJywgJ2RpcnhtbCcsICdlcnJvcicsJiN4ZDsKICAgICAgICAnZXhjZXB0aW9uJywgJ2dyb3VwJywgJ2dyb3VwQ29sbGFwc2VkJywgJ2dyb3VwRW5kJywgJ2luZm8nLCAnbG9nJywmI3hkOwogICAgICAgICdtYXJrVGltZWxpbmUnLCAncHJvZmlsZScsICdwcm9maWxlRW5kJywgJ3RhYmxlJywgJ3RpbWUnLCAndGltZUVuZCcsJiN4ZDsKICAgICAgICAndGltZWxpbmUnLCAndGltZWxpbmVFbmQnLCAndGltZVN0YW1wJywgJ3RyYWNlJywgJ3dhcm4nJiN4ZDsKICAgICAgXTsmI3hkOwogICAgICB2YXIgbGVuZ3RoID0gbWV0aG9kcy5sZW5ndGg7JiN4ZDsKICAgICAgdmFyIGNvbnNvbGUgPSAod2luZG93LmNvbnNvbGUgPSB3aW5kb3cuY29uc29sZSB8fCB7fSk7JiN4ZDsKICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7JiN4ZDsKICAgICAgICBtZXRob2QgPSBtZXRob2RzW2xlbmd0aF07JiN4ZDsKICAgICAgICAvLyBPbmx5IHN0dWIgdW5kZWZpbmVkIG1ldGhvZHMuJiN4ZDsKICAgICAgICBpZiAoIWNvbnNvbGVbbWV0aG9kXSkgeyYjeGQ7CiAgICAgICAgICBjb25zb2xlW21ldGhvZF0gPSBub29wOyYjeGQ7CiAgICAgICAgfSYjeGQ7CiAgICAgIH0mI3hkOwogICAgfSgpKTsmI3hkOwogIH0mI3hkOwomI3hkOwogIC8qKiYjeGQ7CiAgICogU2V0IHByZWZpeCBmb3IgdGhlIGxvZyBhY3Rpdml0aWVzIGdlbmVyYXRlZCBieSBsb2dlcnJvcigpIG9uIGJvdGggZW5naW5lIGFuZCBmb3JtLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBHaXZlbiB0aGF0IGZvcm1zIGluc3RhbnRpYXRlIHRoZSBtb2R1bGUgb24gbG9hZCwgc2V0dGluZyB0aGUgdmFsdWUgaW5zaWRlIGEgZm9ybSB3b3VsZCBhZmZlY3Qgb25seSBzYWlkIGZvcm0uJmx0O2JyLyZndDsmI3hkOwogICAqIEdpdmVuIHRoYXQgdGhlIHdvcmtmbG93IGVuZ2luZSBjYW4gcGF1c2UgcHJvY2Vzc2luZyBhdCBwb2ludHMgYW5kIHJlbW92ZSB0aGUgdGhyZWFkIGZyb20gbWVtb3J5LCByZWFkaW5nIHRoZSBzYW1lJiN4ZDsKICAgKiBhZ2FpbiBsYXRlciwgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGFueXdoZXJlIG91dHNpZGUgdGhlIE92ZXJ2aWV3ICZndDsgR2xvYmFsIFNjcmlwdHMgbWlnaHQgY2F1c2UgdGhlIHZhbHVlIHNldCB0byBiZSBsb3N0JiN4ZDsKICAgKiBhZnRlciBzdWNoIHBhdXNlcy4gT25lIGV4YW1wbGUgb2Ygc3VjaCBwYXVzZXMvYmVoYXZpb3IgaXMgd2hlbiBhIHdvcmtmbG93IHJlYWNoZXMgYW4gYXBwcm92YWwgYWN0aXZpdHkuJiN4ZDsKICAgKiYjeGQ7CiAgICogQG1lbWJlcm9mIFBSRCYjeGQ7CiAgICogQHNpbmNlIDEuMC4yJiN4ZDsKICAgKiYjeGQ7CiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciAgU3RyaW5nIHRoYXQgd2lsbCBiZSBhcHBlbmRlZCB0byBhbnkgbG9nZXJyb3IoKSBjYWxsLiYjeGQ7CiAgICovJiN4ZDsKICBmdW5jdGlvbiBzZXRsb2dwcmVmaXgoIHN0ciApIHsmI3hkOwogICAgcHJlZml4ID0gY29lcmNlVG9TdHJpbmcoIHN0ciwgJycgKTsmI3hkOwogIH0mI3hkOwomI3hkOwogIC8qKiYjeGQ7CiAgICogU2V0cyBsaWJyYXJ5IGluIGRlYnVnIG1vZGUuIFRoZSBvdGhlciB3YXkgdG8gZG8gc28gaXMgdG8gcGFzcyB0cnVlIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyIG9uIHRoZSBsaWJyYXJ5IGltcG9ydC4mI3hkOwogICAqJiN4ZDsKICAgKiBAbWVtYmVyb2YgUFJEJiN4ZDsKICAgKiBAc2luY2UgMS4wLjUmI3hkOwogICAqJiN4ZDsKICAgKiBAcGFyYW0ge2Jvb2xlYW59IGJvb2wgIHRydWUgdG8gc2V0IHRoZSBsaWJyYXJ5IHRvIGRlYnVnIG1vZGUsIGZhbHNlIHRvIGRpc2FibGUgZGVidWcgbW9yZS4mI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gZGVidWdtZXNzYWdlcyggYm9vbCApIHsmI3hkOwogICAgaWYgKCBib29sID09PSB0cnVlICkgeyYjeGQ7CiAgICAgIGxvZ2Vycm9yKCAnRGVidWcgbWVzc2FnZXMgZW5hYmxlZC4nICk7JiN4ZDsKICAgICAgZGVidWcgPSB0cnVlOyYjeGQ7CiAgICB9JiN4ZDsKICAgIGlmICggYm9vbCA9PT0gZmFsc2UgKSB7JiN4ZDsKICAgICAgbG9nZXJyb3IoICdEZWJ1ZyBtZXNzYWdlcyBkaXNhYmxlZC4nICk7JiN4ZDsKICAgICAgZGVidWcgPSBmYWxzZTsmI3hkOwogICAgfSYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiBUcnkgdG8gZGV0ZWN0IGlmIHdlIGFyZSBpbiBhIHdlYiBicm93c2VyIG9yIGluIHRoZSBVc2VyIEFwcC9SQlBNL0lETUFQUHMgd29ya2Zsb3cgZW5naW5lLiYjeGQ7CiAgIComI3hkOwogICAqIEBtZW1iZXJvZiBQUkQudXRpbCYjeGQ7CiAgICogQHNpbmNlIDEuMC4wJiN4ZDsKICAgKiYjeGQ7CiAgICogQHR5cGUge3N0cmluZ30mI3hkOwogICAqIEByZXR1cm4ge3N0cmluZ30gJ2Zvcm0nIGlmIGluIGEgQnJvd3NlciwgJ2VuZ2luZScgaWYgb24gdGhlIHdvcmtmbG93IGVuZ2luZS4gJ2RldGVjdGlvbiBmYWlsZWQnIG90aGVyd2lzZS4mI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gZm9ybU9yRW5naW5lKCkgeyYjeGQ7CiAgICB2YXIgcmVzID0gJ0RldGVjdGlvbiBmYWlsZWQnOyYjeGQ7CiAgICBpZiAoIHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnICZhbXA7JmFtcDsmI3hkOwogICAgICAnZG9jdW1lbnQnIGluIHdpbmRvdyAmYW1wOyZhbXA7JiN4ZDsKICAgICAgdHlwZW9mIGphdmEgPT09ICd1bmRlZmluZWQnJiN4ZDsKICAgICkgeyYjeGQ7CiAgICAgIHJlcyA9ICdmb3JtJzsmI3hkOwogICAgfSYjeGQ7CiAgICBpZiAoIHR5cGVvZiBqYXZhID09PSAnb2JqZWN0JyAmYW1wOyZhbXA7JiN4ZDsKICAgICAgICAgICdsYW5nJyBpbiBqYXZhICZhbXA7JmFtcDsmI3hkOwogICAgICAgICAgJ1N0cmluZycgaW4gamF2YS5sYW5nICZhbXA7JmFtcDsmI3hkOwogICAgICB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyYjeGQ7CiAgICApIHsmI3hkOwogICAgICByZXMgPSAnZW5naW5lJzsmI3hkOwogICAgfSYjeGQ7CiAgICByZXR1cm4gcmVzOyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiBPdXRwdXQgZXJyb3IgbWVzc2FnZSBiYXNlZCBvbiB3aGVyZSB0aGUgY29kZSBpcyBydW5uaW5nLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBPdXRwdXQgdG8gdGhlIGNvbnNvbGUubG9nKCkgaWYgaW4gYSBicm93c2VyLCB0byBjYXRhbGluYS5vdXQgaWYgaW4gdGhlIHdvcmtmbG93IGVuZ2luZS4mbHQ7YnIvJmd0OyYjeGQ7CiAgICogUHJlcGVuZHMgdGhlIHZhbHVlIG9mIHRoZSBtb2R1bGUncyBpbnRlcm5hbCAncHJlZml4JyB2YXJpYWJsZS4mI3hkOwogICAqJiN4ZDsKICAgKiBAbWVtYmVyb2YgUFJELnV0aWwmI3hkOwogICAqIEBzaW5jZSAxLjAuMCYjeGQ7CiAgIComI3hkOwogICAqIEBwYXJhbSAge3N0cmluZ30gbXNnICAgIEVycm9yIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLiYjeGQ7CiAgIComI3hkOwogICAqIEB0eXBlIHtib29sZWFufSYjeGQ7CiAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgbWVzc2FnZSB3YXMgcmV0dXJuZWQgc3VjY2Vzc2Z1bGx5LCBmYWxzZSBvdGhlcndpc2UuJiN4ZDsKICAgKi8mI3hkOwogIGZ1bmN0aW9uIGxvZ2Vycm9yKCBtc2cgKSB7JiN4ZDsKICAgIHZhciByZXF1ZXN0SUQsIHByZXBlbmQ7JiN4ZDsKICAgIC8vIENvZXJjaW5nIGxvZyBtZXNzYWdlIHZpYSBTdHJpbmcoKSB0byBhdm9pZCBudWxsIGFuZCB1bmRlZmluZWQgcmVzdWx0cyBiZWluZyBwYXNzZWQgdG8gdGhlIGxvZyBtZWNoYW5pc20uJiN4ZDsKICAgIG1zZyA9IFN0cmluZyggbXNnICk7JiN4ZDsKICAgIC8vIENvZXJjaW5nIGxvZyBwcmVmaXggaW50ZXJuYWwgdmFyaWFibGUgdmlhIFN0cmluZygpIHRvIGF2b2lkIG51bGwgYW5kIHVuZGVmaW5lZCByZXN1bHRzIGJlaW5nIHBhc3NlZCB0byB0aGUgbG9nIG1lY2hhbmlzbS4mI3hkOwogICAgcHJlcGVuZCA9IFN0cmluZyggcHJlZml4ICk7JiN4ZDsKICAgIC8vIFVzaW5nIHRyeS9jYXRjaCBtYWtlcyB0aGUgY2FsbCBzYWZlciwgaXQgYWxzbyBpbXBhY3RzIHBlcmZvcm1hbmNlLiYjeGQ7CiAgICBpZiAoIHdoZXJlID09PSAnZW5naW5lJyApIHsmI3hkOwogICAgICAvLyBwcm9jZXNzLmdldFJlcXVlc3RJZCgpIG1heSBmYWlsIGlmIGNhbGxlZCBkdXJpbmcgR2xvYmFsIFNjcmlwdCBpbml0aWFsaXphdGlvbi4mI3hkOwogICAgICB0cnkgeyYjeGQ7CiAgICAgICAgcmVxdWVzdElEID0gcHJvY2Vzcy5nZXRSZXF1ZXN0SWQoKTsmI3hkOwogICAgICAgIHJlcXVlc3RJRCArPSAnOiAnOyYjeGQ7CiAgICAgIH0gY2F0Y2goZSkge30mI3hkOwogICAgfSYjeGQ7CiAgICB0cnkgeyYjeGQ7CiAgICAgIGlmICggd2hlcmUgPT09ICdmb3JtJyApIHsmI3hkOwogICAgICAgIGNvbnNvbGUubG9nKCBwcmVwZW5kICsgbXNnICk7JiN4ZDsKICAgICAgfSYjeGQ7CiAgICAgIGlmICggd2hlcmUgPT09ICdlbmdpbmUnICkgeyYjeGQ7CiAgICAgICAgamF2YS5sYW5nLlN5c3RlbS5vdXQucHJpbnRsbiggcHJlcGVuZCArIHJlcXVlc3RJRCArIG1zZyApOyYjeGQ7CiAgICAgIH0mI3hkOwogICAgfSBjYXRjaCAoIGUgKSB7JiN4ZDsKICAgICAgLy8gZGlzY2FyZGluZyBlcnJvciwgc2luY2UgdGhpcyBpcyBhbiBlcnJvciBhYm91dCBwcmludGluZyB0aGUgZXJyb3IgbWVzc2FnZS4uLiYjeGQ7CiAgICAgIHJldHVybiBmYWxzZTsmI3hkOwogICAgfSYjeGQ7CiAgICByZXR1cm4gdHJ1ZTsmI3hkOwogIH0mI3hkOwomI3hkOwogIC8qKiYjeGQ7CiAgICogT3V0cHV0IGRlYnVnIG1lc3NhZ2UgdmlhIGxvZ2Vycm9yKCkgb25seSBpZiB0aGUgaW50ZXJuYWwgdmFyaWFibGUgZGVidWcgaXMgc2V0IHRvIHRydWUmI3hkOwogICAqJiN4ZDsKICAgKiBAbWVtYmVyb2YgUFJELnV0aWwmI3hkOwogICAqIEBzaW5jZSAxLjAuMyYjeGQ7CiAgIComI3hkOwogICAqIEBwYXJhbSB7c3RyaW5nfSAgc3RyICAgU3RyaW5nIGlucHV0LiYjeGQ7CiAgICovJiN4ZDsKICBmdW5jdGlvbiBkZWJ1Z21zZyggc3RyICkgeyYjeGQ7CiAgICBpZiAoIGRlYnVnICkgeyYjeGQ7CiAgICAgIGxvZ2Vycm9yKCBzdHIgKTsmI3hkOwogICAgfSYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIGFuIEVDTUEgb2JqZWN0IG9yIGNsYXNzIG9mIGEgSmF2YSBvYmplY3QuJmx0O2JyLyZndDsmI3hkOwogICAqIEZvciBFQ01BIHJlbGllcyBvbiB0eXBlb2YgYW5kIGluc3RhbmNlb2YsIGlmIG5laXRoZXIgd29ya3MgdXNlcyBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nIC4mbHQ7YnIvJmd0OyYjeGQ7CiAgICogRm9yIEphdmEgb2JqZWN0cyBqdXN0IGNhbGxzIGdldENsYXNzKCkuJmx0O2JyLyZndDsmI3hkOwogICAqIFByaW50cyByZXN1bHQgd2hlbiBtb2R1bGUgaXMgcmFuIGluIGRlYnVnIG1vZGUsIHJldHVybnMgcmVzdWx0IGFzIHN0cmluZy4mI3hkOwogICAqJiN4ZDsKICAgKiBAbWVtYmVyb2YgUFJELnV0aWwmI3hkOwogICAqIEBzaW5jZSAxLjAuNSYjeGQ7CiAgIComI3hkOwogICAqIEBwYXJhbSB7YW55fSAgaW5wdXQgICBFQ01BIG9yIEphdmEgaW5wdXQmI3hkOwogICAqJiN4ZDsKICAgKiBAdHlwZSB7c3RyaW5nfSYjeGQ7CiAgICogQHJldHVybiB7c3RyaW5nfSBhbmFseXNpcyByZXN1bHQmI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gaW5zcGVjdFR5cGUoIGlucHV0ICkgeyYjeGQ7CiAgICB2YXIgcmVzID0gJyc7JiN4ZDsKICAgIC8vIFNlZTomI3hkOwogICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9EYXRhX3N0cnVjdHVyZXMmI3hkOwogICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT3BlcmF0b3JzL3R5cGVvZiYjeGQ7CiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9PcGVyYXRvcnMvaW5zdGFuY2VvZiYjeGQ7CiAgICAvLyBFQ01BIG51bGwmI3hkOwogICAgaWYgKCBpbnB1dCA9PT0gbnVsbCApIHsmI3hkOwogICAgICByZXMgPSAnbnVsbCc7JiN4ZDsKICAgIH0mI3hkOwogICAgLy8gRUNNQSB1bmRlZmluZWQmI3hkOwogICAgaWYgKCB0eXBlb2YgaW5wdXQgPT09ICd1bmRlZmluZWQnICkgeyYjeGQ7CiAgICAgIHJlcyA9ICd1bmRlZmluZWQnOyYjeGQ7CiAgICB9JiN4ZDsKICAgIC8vIEVDTUEgc3ltYm9sIChFUzYgb253YXJkcykmI3hkOwogICAgaWYgKCB0eXBlb2YgaW5wdXQgPT09ICdzeW1ib2wnICkgeyYjeGQ7CiAgICAgIHJlcyA9ICdzeW1ib2wnOyYjeGQ7CiAgICB9JiN4ZDsKICAgIC8vIEVDTUEgc3RyaW5nLiB0eXBlb2Ygd29uJ3QgY2FwdHVyZSB0aGUgY2FzZSB3aGVyZSBhIHN0cmluZyB3YXMgY3JlYXRlZCB2aWEgTmV3IFN0cmluZygpLCBzbyBuZWVkIGluc3RhbmNlb2YgdG9vJiN4ZDsKICAgIGlmICggdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyB8fCAoIHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcgJmFtcDsmYW1wOyBpbnB1dCBpbnN0YW5jZW9mIFN0cmluZyApICkgeyYjeGQ7CiAgICAgIHJlcyA9ICdzdHJpbmcnOyYjeGQ7CiAgICB9JiN4ZDsKICAgIC8vIEVDTUEgbnVtYmVyLiB0eXBlb2Ygd29uJ3QgY2FwdHVyZSB0aGUgY2FzZSB3aGVyZSBhIG51bWJlciB3YXMgY3JlYXRlZCB2aWEgTmV3IE51bWJlcigpLCBzbyBuZWVkIGluc3RhbmNlb2YgdG9vJiN4ZDsKICAgIGlmICggdHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJyB8fCAoIHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcgJmFtcDsmYW1wOyBpbnB1dCBpbnN0YW5jZW9mIE51bWJlciApICkgeyYjeGQ7CiAgICAgIHJlcyA9ICdudW1iZXInOyYjeGQ7CiAgICB9JiN4ZDsKICAgIC8vIEVDTUEgYm9vbGVhbi4gdHlwZW9mIHdvbid0IGNhcHR1cmUgdGhlIGNhc2Ugd2hlcmUgYSBzdHJpbmcgd2FzIGNyZWF0ZWQgdmlhIE5ldyBCb29sZWFuKCksIHNvIG5lZWQgaW5zdGFuY2VvZiB0b28mI3hkOwogICAgaWYgKCB0eXBlb2YgaW5wdXQgPT09ICdib29sZWFuJyB8fCAoIHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcgJmFtcDsmYW1wOyBpbnB1dCBpbnN0YW5jZW9mIEJvb2xlYW4gKSApIHsmI3hkOwogICAgICByZXMgPSAnYm9vbGVhbic7JiN4ZDsKICAgIH0mI3hkOwogICAgLy8gRUNNQSBmdW5jdGlvbm4uIFNvbWUgcG9zdHMgcmVwb3J0IHR5cGVvZiBub3QgcmV0dXJuaW5nICdmdW5jdGlvbicgb24gY2VydGFpbiBlbnZpcm9ubWVudHMgc28gY2hlY2tpbmcgdmlhIGluc3RhbmNlb2YgYXMgYSBmYWxsYmFjayYjeGQ7CiAgICBpZiAoIHR5cGVvZiBpbnB1dCA9PT0gJ2Z1bmN0aW9uJyB8fCAoIHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcgJmFtcDsmYW1wOyBpbnB1dCBpbnN0YW5jZW9mIEZ1bmN0aW9uICkgKSB7JiN4ZDsKICAgICAgcmVzID0gJ2Z1bmN0aW9uJzsmI3hkOwogICAgfSYjeGQ7CiAgICBpZiAoIHJlcyA9PT0gJycgJmFtcDsmYW1wOyB0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICkgeyYjeGQ7CiAgICAgIGlmICggaW5wdXQgaW5zdGFuY2VvZiBBcnJheSApIHsgLy8gRUNNQSBBcnJheSYjeGQ7CiAgICAgICAgcmVzID0gJ2FycmF5JzsmI3hkOwogICAgICB9IGVsc2UgaWYgKCBpbnB1dCBpbnN0YW5jZW9mIFJlZ0V4cCApIHsgLy8gRUNNQSByZWd1bGFyIGV4cHJlc3Npb24mI3hkOwogICAgICAgIHJlcyA9ICdyZWdleHAnOyYjeGQ7CiAgICAgIH0gZWxzZSBpZiAoIGlucHV0IGluc3RhbmNlb2YgRGF0ZSApIHsgLy8gRUNNQSBkYXRlIG9iamVjdCYjeGQ7CiAgICAgICAgcmVzID0gJ2RhdGUnOyYjeGQ7CiAgICAgIH0gZWxzZSBpZiAoIGlucHV0IGluc3RhbmNlb2YgRXJyb3IgKSB7IC8vIEVDTUEgZXJyb3Igb2JqZWN0JiN4ZDsKICAgICAgICByZXMgPSAnZXJyb3InOyYjeGQ7CiAgICAgIH0gZWxzZSBpZiAoICdnZXRDbGFzcycgaW4gaW5wdXQgKSB7IC8vIEphdmEgY2xhc3MmI3hkOwogICAgICAgIHJlcyA9IGlucHV0LmdldENsYXNzKCk7JiN4ZDsKICAgICAgfSBlbHNlIHsgLy8gRUNNQSBmYWxsYmFjayB0byBnZXQgdGhlIG9iamVjdCdzIGNvbnN0cnVjdG9yIG5hbWUuIGFkZGluZyAuc2xpY2UoIDgsIC0xICkgd291bGQgcmVtb3ZlIHRoZSBbIG9iamVjdCBdIHBvcnRpb24gb2YgdGhlIHN0cmluZy4mI3hkOwogICAgICAgIHJlcyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCggaW5wdXQgKTsmI3hkOwogICAgICB9JiN4ZDsKICAgIH0mI3hkOwogICAgZGVidWdtc2coIHJlcyApOyYjeGQ7CiAgICByZXR1cm4gcmVzOyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiBDaGVja3MgaWYgdGhlIHByb3ZpZGVkIGlucHV0IGlzIGFuIEVDTUEgU3RyaW5nIChwcmltaXRpdmUgb3Igb2JqZWN0KS4mI3hkOwogICAqJiN4ZDsKICAgKiBAbWVtYmVyb2YgUFJELnV0aWwmI3hkOwogICAqIEBzaW5jZSAxLjAuNSYjeGQ7CiAgIComI3hkOwogICAqIEBwYXJhbSB7YW55fSAgaW5wdXQgICBJbnB1dCB2YWx1ZSB3aG9zZSB0eXBlIHdpbGwgYmUgZXZhbHVhdGVkJiN4ZDsKICAgKiYjeGQ7CiAgICogQHR5cGUge2Jvb2xlYW59JiN4ZDsKICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHN0cmluZywgZmFsc2Ugb3RoZXJ3aXNlJiN4ZDsKICAgKi8mI3hkOwogIGZ1bmN0aW9uIGlzU3RyaW5nKCBpbnB1dCApIHsmI3hkOwogICAgcmV0dXJuICggdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyB8fCAoIHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcgJmFtcDsmYW1wOyBpbnB1dCBpbnN0YW5jZW9mIFN0cmluZyApICk7JiN4ZDsKICB9JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIENoZWNrcyBpZiB0aGUgcHJvdmlkZWQgaW5wdXQgaXMgYW4gRUNNQSBOdW1iZXIgKHByaW1pdGl2ZSBvciBvYmplY3QpLiYjeGQ7CiAgIComI3hkOwogICAqIEBtZW1iZXJvZiBQUkQudXRpbCYjeGQ7CiAgICogQHNpbmNlIDEuMC41JiN4ZDsKICAgKiYjeGQ7CiAgICogQHBhcmFtIHthbnl9ICBpbnB1dCAgIElucHV0IHZhbHVlIHdob3NlIHR5cGUgd2lsbCBiZSBldmFsdWF0ZWQmI3hkOwogICAqJiN4ZDsKICAgKiBAdHlwZSB7Ym9vbGVhbn0mI3hkOwogICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgbnVtYmVyLCBmYWxzZSBvdGhlcndpc2UmI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gaXNOdW1iZXIoIGlucHV0ICkgeyYjeGQ7CiAgICByZXR1cm4gKCB0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInIHx8ICggdHlwZW9mIGlucHV0ID09PSAnb2JqZWN0JyAmYW1wOyZhbXA7IGlucHV0IGluc3RhbmNlb2YgTnVtYmVyICkgKTsmI3hkOwogIH0mI3hkOwomI3hkOwogIC8qKiYjeGQ7CiAgICogQ2hlY2tzIGlmIHRoZSBwcm92aWRlZCBpbnB1dCBpcyBhbiBFQ01BIEJvb2xlYW4gKHByaW1pdGl2ZSBvciBvYmplY3QpLiYjeGQ7CiAgIComI3hkOwogICAqIEBtZW1iZXJvZiBQUkQudXRpbCYjeGQ7CiAgICogQHNpbmNlIDEuMC41JiN4ZDsKICAgKiYjeGQ7CiAgICogQHBhcmFtIHthbnl9ICBpbnB1dCAgIElucHV0IHZhbHVlIHdob3NlIHR5cGUgd2lsbCBiZSBldmFsdWF0ZWQmI3hkOwogICAqJiN4ZDsKICAgKiBAdHlwZSB7Ym9vbGVhbn0mI3hkOwogICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgYm9vbGVhbiwgZmFsc2Ugb3RoZXJ3aXNlJiN4ZDsKICAgKi8mI3hkOwogIGZ1bmN0aW9uIGlzQm9vbGVhbiggaW5wdXQgKSB7JiN4ZDsKICAgIHJldHVybiAoIHR5cGVvZiBpbnB1dCA9PT0gJ2Jvb2xlYW4nIHx8ICggdHlwZW9mIGlucHV0ID09PSAnb2JqZWN0JyAmYW1wOyZhbXA7IGlucHV0IGluc3RhbmNlb2YgQm9vbGVhbiApICk7JiN4ZDsKICB9JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIChFbmdpbmUgb25seSkgQ2hlY2tzIGlmIHRoZSBwcm92aWRlZCBpbnB1dCBpcyBhIEphdmEgVmVjdG9yLiYjeGQ7CiAgIComI3hkOwogICAqIEBtZW1iZXJvZiBQUkQudXRpbCYjeGQ7CiAgICogQHNpbmNlIDEuMC41JiN4ZDsKICAgKiYjeGQ7CiAgICogQHBhcmFtIHthbnl9ICBpbnB1dCAgIElucHV0IHZhbHVlIHdob3NlIHR5cGUgd2lsbCBiZSBldmFsdWF0ZWQmI3hkOwogICAqJiN4ZDsKICAgKiBAdHlwZSB7Ym9vbGVhbn0mI3hkOwogICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgSmF2YSBWZWN0b3IsIGZhbHNlIG90aGVyd2lzZSYjeGQ7CiAgICovJiN4ZDsKICBmdW5jdGlvbiBpc0phdmFWZWN0b3IoIGlucHV0ICkgeyYjeGQ7CiAgICByZXR1cm4gKCBpbnB1dCAhPSBudWxsICZhbXA7JmFtcDsgdHlwZW9mIGlucHV0ID09PSAnb2JqZWN0JyAmYW1wOyZhbXA7ICdnZXRDbGFzcycgaW4gaW5wdXQgJmFtcDsmYW1wOyBpbnB1dC5nZXRDbGFzcygpID09ICdjbGFzcyBqYXZhLnV0aWwuVmVjdG9yJyApOyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgIC8qKiYjeGQ7CiAgICogKEZvcm0gb25seSkgSW5pdGlhbGl6ZXMgcmVmZXJlbmNlcyB0byB0aGUgUkJQTS9JRE1BUFBTIGZyYW1ld29yayBvYmplY3RzIGFuZCBzYXZlIHRoZSBzYW1lIGluIHRoZSBpbnRlcm5hbCBzdG9yYWdlLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBVc2VzIElEVmF1bHQgaW50ZXJuYWxseSBvbiBJRFZnZXQoKSwgSURWZ2xvYmFsUXVlcnkoKSwgR0NWZ2V0KCksIGdldE5hbWVkUGFzc3dvcmQoKS4mbHQ7YnIvJmd0OyYjeGQ7CiAgICogRXhwb3J0cyBmaWVsZCBhcyBQUkQud2ViLmZpZWxkIGFuZCBmb3JtIGFzIFBSRC53ZWIuZm9ybSBmb3IgdXNhZ2UgaW5zaWRlIGdsb2JhbCBzY3JpcHRzLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBSZWZhY3RvcmVkIHRvIGFjY2VwdCAxIHRvIDMgcGFyYW1ldGVycyB3aXRoIHRoZSBmcmFtZXdvcmsgb2JqZWN0cyBpbiBhbnkgb3JkZXIuJmx0O2JyLyZndDsmI3hkOwogICAqIFJldHVybnMgbm90aGluZy4mI3hkOwogICAqJiN4ZDsKICAgKiBAZnVuY3Rpb24gaW5pdCYjeGQ7CiAgICogQG1lbWJlcm9mIFBSRCYjeGQ7CiAgICogQHNpbmNlIDEuMC4wJiN4ZDsKICAgKiYjeGQ7CiAgICogQHBhcmFtIHtvYmplY3R9ICAgb2JqMSAgICAgIE9uZSBvZiB0aGUgdGhyZWUgSURNQVBQUyBmcmFtZXdvcmsgb2JqZWN0JiN4ZDsKICAgKiBAcGFyYW0ge29iamVjdD19ICBbb2JqMl0gICAgT25lIG9mIHRoZSB0aHJlZSBJRE1BUFBTIGZyYW1ld29yayBvYmplY3QmI3hkOwogICAqIEBwYXJhbSB7b2JqZWN0PX0gIFtvYmozXSAgICBPbmUgb2YgdGhlIHRocmVlIElETUFQUFMgZnJhbWV3b3JrIG9iamVjdCYjeGQ7CiAgICovJiN4ZDsKICBmdW5jdGlvbiBmb3JtSW5pdCggb2JqMSwgb2JqMiwgb2JqMyApIHsmI3hkOwogICAgLy8gT25seSBhcHBlbmRzIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCBzbyB0aGF0IHdlIGNhbiBjaGVjayBmb3IgdGhlIGxpbmsncyBleGlzdGVuY2UmI3hkOwogICAgLy8gYmVmb3JlIHVzaW5nIGl0IGluIHRoZSBmdW5jdGlvbnMgdGhhdCByZXF1aXJlIHRoZSBVc2VyIEFwcC9SQlBNL0lETUFQUFMgZnJhbWV3b3JrJiN4ZDsKICAgIHZhciBmbmFtZSwgaSwgaW5wdXQgPSBbXTsmI3hkOwogICAgZm5hbWUgPSAnUFJELmluaXQoKTogJzsmI3hkOwogICAgaWYgKCBvYmoxICE9IG51bGwgKSB7JiN4ZDsKICAgICAgaW5wdXQucHVzaCggb2JqMSApOyYjeGQ7CiAgICB9IGVsc2UgeyYjeGQ7CiAgICAgIGxvZ2Vycm9yKCBmbmFtZSArICdyZXF1aXJlcyBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyLicgKTsmI3hkOwogICAgfSYjeGQ7CiAgICBpZiAoIG9iajIgIT0gbnVsbCApIHsmI3hkOwogICAgICBpbnB1dC5wdXNoKCBvYmoyICk7JiN4ZDsKICAgIH0mI3hkOwogICAgaWYgKCBvYmozICE9IG51bGwgKSB7JiN4ZDsKICAgICAgaW5wdXQucHVzaCggb2JqMyApOyYjeGQ7CiAgICB9JiN4ZDsKICAgIC8vIFBhcnNlIGlucHV0IHBhcmFtZXRlcnMgYW5kIHNldHVwIHRoZSBJRE1BUFBTIGludGVybmFsIHZhcmlhYmxlJiN4ZDsKICAgIGZvciAoIGkgPSAwOyBpICZsdDsgaW5wdXQubGVuZ3RoOyBpKysgKSB7JiN4ZDsKICAgICAgaWYgKCBpc0ZpZWxkKCBpbnB1dFsgaSBdICkgJmFtcDsmYW1wOyBJRE1BUFBTLmZpZWxkID09PSBudWxsICkgeyYjeGQ7CiAgICAgICAgbG9nZXJyb3IoIGZuYW1lICsgJ3NldHRpbmcgdXAgaW50ZXJuYWwgcmVmZXJlbmNlIHRvIGZpZWxkLicgKTsmI3hkOwogICAgICAgIElETUFQUFMuZmllbGQgPSBpbnB1dFsgaSBdOyYjeGQ7CiAgICAgICAgaWYgKCAnd2ViJyBpbiBQdWJsaWNBUEkgKSB7JiN4ZDsKICAgICAgICAgIFB1YmxpY0FQSS53ZWIuZmllbGQgPSBpbnB1dFsgaSBdOyYjeGQ7CiAgICAgICAgfSYjeGQ7CiAgICAgIH0gZWxzZSBpZiAoIGlzRm9ybSggaW5wdXRbIGkgXSApICZhbXA7JmFtcDsgSURNQVBQUy5mb3JtID09PSBudWxsICkgeyYjeGQ7CiAgICAgICAgbG9nZXJyb3IoIGZuYW1lICsgJ3NldHRpbmcgdXAgaW50ZXJuYWwgcmVmZXJlbmNlIHRvIGZvcm0uJyApOyYjeGQ7CiAgICAgICAgSURNQVBQUy5mb3JtID0gaW5wdXRbIGkgXTsmI3hkOwogICAgICAgIGlmICggJ3dlYicgaW4gUHVibGljQVBJICkgeyYjeGQ7CiAgICAgICAgICBQdWJsaWNBUEkud2ViLmZvcm0gPSBpbnB1dFsgaSBdOyYjeGQ7CiAgICAgICAgfSYjeGQ7CiAgICAgIH0gZWxzZSBpZiAoIGlzSURWYXVsdCggaW5wdXRbIGkgXSApICZhbXA7JmFtcDsgSURNQVBQUy5JRFZhdWx0ID09PSBudWxsICkgeyYjeGQ7CiAgICAgICAgbG9nZXJyb3IoIGZuYW1lICsgJ3NldHRpbmcgdXAgaW50ZXJuYWwgcmVmZXJlbmNlIHRvIElEVmF1bHQuJyApOyYjeGQ7CiAgICAgICAgSURNQVBQUy5JRFZhdWx0ID0gaW5wdXRbIGkgXTsmI3hkOwogICAgICAgIGlmICggJ3dlYicgaW4gUHVibGljQVBJICkgeyYjeGQ7CiAgICAgICAgICBQdWJsaWNBUEkud2ViLklEVmF1bHQgPSBpbnB1dFsgaSBdOyYjeGQ7CiAgICAgICAgfSYjeGQ7CiAgICAgIH0gZWxzZSB7JiN4ZDsKICAgICAgICBsb2dlcnJvciggZm5hbWUgKyAnUGFyYW1ldGVyIG9iaicgKyAoaSsxKSArICcgaXMgbm90IG9uZSBvZiB0aGUgMyBleHBlY3RlZCBmcmFtZXdvcmsgb2JqZWN0cywgc2tpcHBpbmcgaXQuJyApOyYjeGQ7CiAgICAgIH0mI3hkOwogICAgfSYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiBJbnNwZWN0cyBpZiB0aGUgb2JqZWN0IHJlY2VpdmVkIGhhcyBhbGwgdGhlIHByb3BldGllcyBpbiB0aGUgYXJyYXkgcmVjZWl2ZWQgYW5kIHRoYXQgdGhleSBhcmUgdHlwZW9mICdmdW5jdGlvbicuJiN4ZDsKICAgKiBAc2luY2UgMS4wLjQmI3hkOwogICAqIEBwcml2YXRlJiN4ZDsKICAgKiBAcGFyYW0ge3N0cmluZ30gICAgb2JqICAgIE9iamVjdCB0byBjaGVjayYjeGQ7CiAgICogQHBhcmFtIHtzdHJpbmdbXX0gIGxpc3QgICBMaXN0IG9mIGZ1bmN0aW9ucyB0byB2YWxpZGF0ZSB0aGF0IHRoZSBvYmplY3QgaGFzIHRoZW0mI3hkOwogICAqIEB0eXBlIHtib29sZWFufSYjeGQ7CiAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgb2JqIGhhcyBhbGwgZnVuY3Rpb25zIGxpc3RlZCwgZmFsc2Ugb3RoZXJ3aXNlLiYjeGQ7CiAgICovJiN4ZDsKICBmdW5jdGlvbiBvYmplY3RIYXNGdW5jdGlvbnMoIG9iaiwgbGlzdCApIHsmI3hkOwogICAgdmFyIGZuYW1lLCBpOyYjeGQ7CiAgICBmbmFtZSA9ICdvYmplY3RIYXNGdW5jdGlvbnMoKTogJzsmI3hkOwogICAgaWYgKCBvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgKCEgKGxpc3QgaW5zdGFuY2VvZiBBcnJheSkgKSB8fCBsaXN0Lmxlbmd0aCA9PT0gMCApIHsmI3hkOwogICAgICBkZWJ1Z21zZyggZm5hbWUgKyAnUGxlYXNlIHJldmlldyB5b3VyIGlucHV0IHBhcmFtZXRlcnMuJyk7JiN4ZDsKICAgICAgcmV0dXJuIGZhbHNlOyYjeGQ7CiAgICB9JiN4ZDsKICAgIGZvciAoIGkgPSAwOyBpICZsdDsgbGlzdC5sZW5ndGg7IGkgKyspIHsmI3hkOwogICAgICBpZiAoICEgb2JqLmhhc093blByb3BlcnR5KCBsaXN0WyBpIF0gKSApIHsmI3hkOwogICAgICAgIHJldHVybiBmYWxzZTsmI3hkOwogICAgICB9IGVsc2UgaWYgKCB0eXBlb2Ygb2JqWyBsaXN0WyBpIF0gXSAhPT0gJ2Z1bmN0aW9uJyApIHsmI3hkOwogICAgICAgIHJldHVybiBmYWxzZTsmI3hkOwogICAgICB9JiN4ZDsKICAgIH0mI3hkOwogICAgcmV0dXJuIHRydWU7JiN4ZDsKICB9JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIEluc3BlY3RzIGlmIHRoZSBwYXJhbWV0ZXIgcHJvdmlkZWQgaXMgdGhlIElETUFQUFMgZnJhbWV3b3JrIG9iamVjdCAnZmllbGQnLiYjeGQ7CiAgICogQHNpbmNlIDEuMC40JiN4ZDsKICAgKiBAcHJpdmF0ZSYjeGQ7CiAgICogQHBhcmFtIHtzdHJpbmd9ICBvYmogICBPYmplY3QgdG8gY2hlY2smI3hkOwogICAqIEB0eXBlIHtib29sZWFufSYjeGQ7CiAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgaW5wdXQgaXMgSURNQVBQUyBmcmFtZXdvcmsgZmllbGQgb2JqZWN0LCBmYWxzZSBvdGhlcndpc2UuJiN4ZDsKICAgKi8mI3hkOwogIGZ1bmN0aW9uIGlzRmllbGQoIG9iaiApIHsmI3hkOwogICAgdmFyIHByb3BlcnRpZXM7JiN4ZDsKICAgIC8vIFByb3BlcnRpZXMgb2J0YWluZWQgZnJvbSBJRE0gNC41IE9iamVjdC5rZXlzKCBmaWVsZCApIGV4ZWN1dGVkIG9uIGEgd2ViIGJyb3dzZXImI3hkOwogICAgcHJvcGVydGllcyA9IFsgJ2dldE5hbWUnLCAnZ2V0TGFiZWwnLCAndmFsaWRhdGUnLCAnZmlyZUV2ZW50JywgJ2hpZGUnLCYjeGQ7CiAgICAgICdzaG93JywgJ2VuYWJsZScsICdkaXNhYmxlJywgJ2dldFZhbHVlJywgJ2dldFZhbHVlcycsICdnZXRBbGxWYWx1ZXMnLCYjeGQ7CiAgICAgICdzZXRWYWx1ZXMnLCAnZm9jdXMnLCAnc2VsZWN0JywgJ2FjdGl2YXRlJywgJ3NldFJlcXVpcmVkJyYjeGQ7CiAgICBdOyYjeGQ7CiAgICByZXR1cm4gb2JqZWN0SGFzRnVuY3Rpb25zKCBvYmosIHByb3BlcnRpZXMgKTsmI3hkOwogIH0mI3hkOwomI3hkOwogIC8qKiYjeGQ7CiAgICogSW5zcGVjdHMgaWYgdGhlIHBhcmFtZXRlciBwcm92aWRlZCBpcyB0aGUgSURNQVBQUyBmcmFtZXdvcmsgb2JqZWN0ICdmb3JtJy4mI3hkOwogICAqIEBzaW5jZSAxLjAuNCYjeGQ7CiAgICogQHByaXZhdGUmI3hkOwogICAqIEBwYXJhbSB7c3RyaW5nfSAgb2JqICAgT2JqZWN0IHRvIGNoZWNrJiN4ZDsKICAgKiBAdHlwZSB7Ym9vbGVhbn0mI3hkOwogICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIGlucHV0IGlzIElETUFQUFMgZnJhbWV3b3JrIGZpZWxkIG9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlLiYjeGQ7CiAgICovJiN4ZDsKICBmdW5jdGlvbiBpc0Zvcm0oIG9iaiApIHsmI3hkOwogICAgdmFyIHByb3BlcnRpZXM7JiN4ZDsKICAgIC8vIFByb3BlcnRpZXMgb2J0YWluZWQgZnJvbSBJRE0gNC41IE9iamVjdC5rZXlzKCBmb3JtICkgZXhlY3V0ZWQgb24gYSB3ZWIgYnJvd3NlciYjeGQ7CiAgICBwcm9wZXJ0aWVzID0gWyAnZ2V0RmllbGQnLCAnYWxlcnQnLCAnc2hvd01zZycsICdzaG93V2FybmluZycsICdzaG93RXJyb3InLCYjeGQ7CiAgICAgICdzaG93RmF0YWwnLCAndmFsaWRhdGUnLCAnc3VibWl0JywgJ2dldExhYmVsJywgJ2hpZGUnLCAnc2hvdycsICdlbmFibGUnLCYjeGQ7CiAgICAgICdkaXNhYmxlJywgJ2dldFZhbHVlJywgJ2dldFZhbHVlcycsICdnZXRBbGxWYWx1ZXMnLCAnc2V0VmFsdWVzJywgJ2ZvY3VzJywmI3hkOwogICAgICAnc2VsZWN0JywgJ2FjdGl2YXRlJywgJ3NldFJlcXVpcmVkJywgJ2ludGVyY2VwdEFjdGlvbicsICdnZXRMb2NhbGUnLCYjeGQ7CiAgICAgICdnZXREZWZhdWx0TG9jYWxlJywgJ2dldFJCTWVzc2FnZScsICdzdHJpbmdUb0RhdGUnLCAnZGF0ZVRvU3RyaW5nJywmI3hkOwogICAgICAnaXNWYWxpZERhdGUnLCAnc2hvd0RlYnVnTXNnJywgJ2FkZEN1c3RvbVZhbGlkYXRpb24nLCAnY2xlYXJNZXNzYWdlcycmI3hkOwogICAgXTsmI3hkOwogICAgcmV0dXJuIG9iamVjdEhhc0Z1bmN0aW9ucyggb2JqLCBwcm9wZXJ0aWVzICk7JiN4ZDsKICB9JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIEluc3BlY3RzIGlmIHRoZSBwYXJhbWV0ZXIgcHJvdmlkZWQgaXMgdGhlIElETUFQUFMgZnJhbWV3b3JrIG9iamVjdCAnSURWYXVsdCcmI3hkOwogICAqIEBzaW5jZSAxLjAuNCYjeGQ7CiAgICogQHByaXZhdGUmI3hkOwogICAqIEBwYXJhbSB7c3RyaW5nfSAgb2JqICAgT2JqZWN0IHRvIGNoZWNrJiN4ZDsKICAgKiBAdHlwZSB7Ym9vbGVhbn0mI3hkOwogICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIGlucHV0IGlzIElETUFQUFMgZnJhbWV3b3JrIGZpZWxkIG9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlLiYjeGQ7CiAgICovJiN4ZDsKICBmdW5jdGlvbiBpc0lEVmF1bHQoIG9iaiApIHsmI3hkOwogICAgdmFyIHByb3BlcnRpZXM7JiN4ZDsKICAgIC8vIFByb3BlcnRpZXMgb2J0YWluZWQgZnJvbSBJRE0gNC41IE9iamVjdC5rZXlzKCBJRHZhdWx0ICkgZXhlY3V0ZWQgb24gYSB3ZWIgYnJvd3NlciYjeGQ7CiAgICBwcm9wZXJ0aWVzID0gWyAnZ2xvYmFsUXVlcnknLCAnY29udGFpbmVycycsICdnZXQnLCAnZ2xvYmFsTGlzdCcsJiN4ZDsKICAgICAgJ2dldEd1aWRGcm9tRG4nLCAnZ2V0RG5Gcm9tR3VpZCcsICdleGVjU2VydmljZScmI3hkOwogICAgXTsmI3hkOwogICAgcmV0dXJuIG9iamVjdEhhc0Z1bmN0aW9ucyggb2JqLCBwcm9wZXJ0aWVzICk7JiN4ZDsKICB9JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIChGb3JtIG9ubHkpIFdoZW4gYWRkZWQgaW4gdGhlIGV2ZW50IHNlY3Rpb24gb2YgYSBmb3JtIGZpZWxkLCBhbGxvdyB1cyB0byBzaG93IGFuZCBoaWRlIHRoYXQgZmllbGQgYnkgdXNpbmcmbHQ7YnIvJmd0OyYjeGQ7CiAgICogZmllbGQuZmlyZUV2ZW50KCBldmVudC1uYW1lLCBhY3Rpb24gKTsmbHQ7YnIvJmd0OyYjeGQ7CiAgICogV2hlcmUgZXZlbnQtbmFtZSBpcyB0aGUgZXZlbnQncyBuYW1lIGFuZCBhY3Rpb24gaXMgZWl0aGVyICdzaG93JyBvciAnaGlkZScmbHQ7YnIvJmd0OyYjeGQ7CiAgICogJmx0O2JyLyZndDsmI3hkOwogICAqIFNpbmNlIHRoZSBmaWVsZCB2aXNpYmlsaXR5IGZ1bmN0aW9ucyBvbmx5IGV4aXN0IGluc2lkZSB0aGUgZmllbGQgY29udGV4dCB3ZSBuZWVkIHRvIHBhc3MgYm90aCBvYmplY3RzIGZyb20gd2hlcmUmI3hkOwogICAqIHRoZSBmdW5jdGlvbiBpcyBiZWluZyBjYWxsZWQgdG8gdXNlIHRoZW0gaW5zaWRlIHRoYXQgc2NvcGUvY29udGV4dC4gSW5zaWRlIHRoZSBldmVudCB3ZSBqdXN0IG5lZWQgdG8gYWRkIHRoZSBsaW5lOiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBJQXRvb2xzLmZpZWxkVmlzaWJpbGl0eSggZXZlbnQsIGZpZWxkICk7Jmx0O2JyLyZndDsmI3hkOwogICAqIHRvIHByb3Blcmx5IHVzZSB0aGlzIGZ1bmN0aW9uLiBObyBuZWVkIHRvIGNoYW5nZSBhbnl0aGluZyBvbiB0aGUgbGluZSBhYm92ZSwgaXQgaXMgYWxyZWFkeSBwYXNzaW5nIHRoZSBldmVudCBhbmQgZmllbGQgb2JqZWN0cyYjeGQ7CiAgICogYXMgc2VlbiBpbiB0aGUgc2NvcGUgb2YgdGhhdCBwYXJ0aWN1bGFyIGZvcm0gZmllbGQuJmx0O2JyLyZndDsmI3hkOwogICAqICZsdDtici8mZ3Q7JiN4ZDsKICAgKiBubyByZXR1cm4gdmFsdWUgcHJvdmlkZWQuJiN4ZDsKICAgKiYjeGQ7CiAgICogQG1lbWJlcm9mIFBSRC53ZWImI3hkOwogICAqIEBzaW5jZSAxLjAuNCYjeGQ7CiAgIComI3hkOwogICAqIEBwYXJhbSB7b2JqZWN0fSAgZXZlbnQgIGV2ZW50IG9iamVjdCBhcyBzZWVuIGJ5IHRoZSBmaWVsZCdzIHNjb3BlJiN4ZDsKICAgKiBAcGFyYW0ge29iamVjdH0gIGZpZWxkICBmaWVsZCAgb2JqZWN0IGFzIHNlZW4gYnkgdGhlIGZpZWxkJ3Mgc2NvcGUmI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gZmllbGRWaXNpYmlsaXR5KCBldmVudCwgZmllbGQgKSB7JiN4ZDsKICAgIHZhciBhY3Rpb24gPSBTdHJpbmcoIGV2ZW50LmdldEN1c3RvbURhdGEoKSApOyYjeGQ7CiAgICBzd2l0Y2ggKCBhY3Rpb24udG9Mb3dlckNhc2UoKSApIHsmI3hkOwogICAgICBjYXNlICdzaG93JzomI3hkOwogICAgICAgIGZpZWxkLnNob3coKTsmI3hkOwogICAgICAgIGJyZWFrOyYjeGQ7CiAgICAgIGNhc2UgJ2hpZGUnOiYjeGQ7CiAgICAgICAgZmllbGQuaGlkZSgpOyYjeGQ7CiAgICAgICAgYnJlYWs7JiN4ZDsKICAgICAgZGVmYXVsdDomI3hkOwogICAgICBsb2dlcnJvciggJ0ZpZWxkOiAnICsgZmllbGQuZ2V0TGFiZWwoKSArICcsIEV2ZW50OiAnICsgZXZlbnQuZ2V0RXZlbnROYW1lKCkgKyAnLCBJbnZhbGlkIG9wdGlvbiByZWNlaXZlZDogJyArIGFjdGlvbiApOyYjeGQ7CiAgICB9JiN4ZDsKICB9JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIFdyYXBwZXIgZm9yIHRoZSBwYXJzZSgpIGNhbGwgb24gdGhlIGhvc3QgZW52aXJvbm1lbnQncyBKU09OIG9iamVjdC4mbHQ7YnIvJmd0OyYjeGQ7CiAgICogU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0pTT04vcGFyc2UmI3hkOwogICAqJiN4ZDsKICAgKiBAZnVuY3Rpb24gcGFyc2UmI3hkOwogICAqIEBtZW1iZXJvZiBQUkQudXRpbC5KU09Ob2JqJiN4ZDsKICAgKiBAc2luY2UgMS4wLjImI3hkOwogICAqJiN4ZDsKICAgKiBAcGFyYW0ge3N0cmluZ30gICAgIHMgICAgICAgICAgU3RyaW5nIHdpdGggdmFsaWQgSlNPTiBzeW50YXgmI3hkOwogICAqIEBwYXJhbSB7ZnVuY3Rpb249fSAgW3Jldml2ZXJdIChPcHRpb25hbCkgSWYgYSBmdW5jdGlvbiwgdGhpcyBwcmVzY3JpYmVzIGhvdyB0aGUgdmFsdWUgb3JpZ2luYWxseSBwcm9kdWNlZCBieSBwYXJzaW5nIGlzIHRyYW5zZm9ybWVkLCBiZWZvcmUgYmVpbmcgcmV0dXJuZWQuJiN4ZDsKICAgKiYjeGQ7CiAgICogQHR5cGUge29iamVjdH0mI3hkOwogICAqIEByZXR1cm4ge29iamVjdH0gRUNNQSBPYmplY3QgZ2VuZXJhdGVkIGZyb20gdGhlIEpTT04gc3RyaW5nLiBPbiBlcnJvciByZXR1cm4gZW1wdHkgb2JqZWN0IGFuZCByZXBvcnQgdGhlIGVycm9yIHZpYSBsb2dlcnJvcigpJiN4ZDsKICAgKi8mI3hkOwogIGZ1bmN0aW9uIEpTT05wYXJzZSggcywgciApIHsmI3hkOwogICAgdmFyIGZuYW1lLCByZXMsIHBvaW50ZXI7JiN4ZDsKICAgIGZuYW1lID0gJ0pTT05vYmoucGFyc2UoKTogJzsmI3hkOwogICAgLy8gU2V0dXAgYSBwb2ludGVyIHRvIHRoZSBKU09OIG9iamVjdCBzaW5jZSBpdHMgbmFtZSBkaWZmZXJzIG9uIGZvcm1zIGFuZCBlbmdpbmUuJiN4ZDsKICAgIHBvaW50ZXIgPSBKU09OcHRyOyYjeGQ7CiAgICB0cnkgeyYjeGQ7CiAgICAgIHJlcyA9IHBvaW50ZXIucGFyc2UoIHMsIHIgKTsmI3hkOwogICAgfSBjYXRjaCggZSApeyYjeGQ7CiAgICAgIGxvZ2Vycm9yKCBmbmFtZSArIGUubWVzc2FnZSApOyYjeGQ7CiAgICB9JiN4ZDsKICAgIGlmICghIHJlcyApIHsmI3hkOwogICAgICBkZWJ1Z21zZyggZm5hbWUgKyAnaW5wdXQgcHJvY2Vzc2luZyByZXN1bHRlZCBpbiBhIG51bGwgdmFsdWUuJyApOyYjeGQ7CiAgICAgIHJldHVybiB7fTsmI3hkOwogICAgfSYjeGQ7CiAgICByZXR1cm4gcmVzOyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiBXcmFwcGVyIGZvciB0aGUgc3RyaW5naWZ5KCkgY2FsbCBvbiB0aGUgaG9zdCBlbnZpcm9ubWVudCdzIEpTT04gb2JqZWN0LiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvSlNPTi9zdHJpbmdpZnkmI3hkOwogICAqJiN4ZDsKICAgKiBAZnVuY3Rpb24gc3RyaW5naWZ5JiN4ZDsKICAgKiBAbWVtYmVyb2YgUFJELnV0aWwuSlNPTm9iaiYjeGQ7CiAgICogQHNpbmNlIDEuMC4yJiN4ZDsKICAgKiYjeGQ7CiAgICogQHBhcmFtIHtvYmplY3R9ICAgICAgICAgICAgICAgICAgICAgICAgbyAgICAgICAgICAgRUNNQSBvYmplY3QgdG8gY29udmVydCB0byBKU09OJiN4ZDsKICAgKiBAcGFyYW0geyhmdW5jdGlvbnxzdHJpbmdbXXxudW1iZXJbXSk9fSBbcmVwbGFjZXJdICAoT3B0aW9uYWwpIEEgZnVuY3Rpb24gdGhhdCBhbHRlcnMgdGhlIGJlaGF2aW9yIG9mIHRoZSBzdHJpbmdpZmljYXRpb24gcHJvY2Vzcywgb3IgYW4gYXJyYXkgb2YgU3RyaW5nIGFuZCBOdW1iZXIgb2JqZWN0cyB0aGF0IHNlcnZlIGFzIGEgd2hpdGVsaXN0IGZvciBzZWxlY3RpbmcvZmlsdGVyaW5nIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSB2YWx1ZSBvYmplY3QgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIEpTT04gc3RyaW5nLiBJZiB0aGlzIHZhbHVlIGlzIG51bGwgb3Igbm90IHByb3ZpZGVkLCBhbGwgcHJvcGVydGllcyBvZiB0aGUgb2JqZWN0IGFyZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIEpTT04gc3RyaW5nJiN4ZDsKICAgKiBAcGFyYW0geyhzdHJpbmd8bnVtYmVyKT19ICAgICAgICAgICAgICBbc3BhY2VdICAgICAoT3B0aW9uYWwpIEEgU3RyaW5nIG9yIE51bWJlciBvYmplY3QgdGhhdCdzIHVzZWQgdG8gaW5zZXJ0IHdoaXRlIHNwYWNlIGludG8gdGhlIG91dHB1dCBKU09OIHN0cmluZyBmb3IgcmVhZGFiaWxpdHkgcHVycG9zZXMuIElmIHRoaXMgaXMgYSBOdW1iZXIsIGl0IGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHNwYWNlIGNoYXJhY3RlcnMgdG8gdXNlIGFzIHdoaXRlIHNwYWNlOyB0aGlzIG51bWJlciBpcyBjYXBwZWQgYXQgMTAgKGlmIGl0IGlzIGdyZWF0ZXIsIHRoZSB2YWx1ZSBpcyBqdXN0IDEwKS4gVmFsdWVzIGxlc3MgdGhhbiAxIGluZGljYXRlIHRoYXQgbm8gc3BhY2Ugc2hvdWxkIGJlIHVzZWQuIElmIHRoaXMgaXMgYSBTdHJpbmcsIHRoZSBzdHJpbmcgKG9yIHRoZSBmaXJzdCAxMCBjaGFyYWN0ZXJzIG9mIHRoZSBzdHJpbmcsIGlmIGl0J3MgbG9uZ2VyIHRoYW4gdGhhdCkgaXMgdXNlZCBhcyB3aGl0ZSBzcGFjZS4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IHByb3ZpZGVkIChvciBpcyBudWxsKSwgbm8gd2hpdGUgc3BhY2UgaXMgdXNlZC4mI3hkOwogICAqJiN4ZDsKICAgKiBAdHlwZSB7c3RyaW5nfSYjeGQ7CiAgICogQHJldHVybiB7c3RyaW5nfSBTZXJpYWxpemVkIEVDTUEgb2JqZWN0IGluIEpTT04gZm9ybWF0LiBPbiBlcnJvciByZXR1cm4gZW1wdHkgc3RyaW5nIGFuZCByZXBvcnQgdGhlIGVycm9yIHZpYSBsb2dlcnJvcigpJiN4ZDsKICAgKi8mI3hkOwogIGZ1bmN0aW9uIEpTT05zdHJpbmdpZnkoIG8sIHIsIHMgKSB7JiN4ZDsKICAgIHZhciBmbmFtZSwgcmVzLCBwb2ludGVyOyYjeGQ7CiAgICBmbmFtZSA9ICdKU09Ob2JqLnN0cmluZ2lmeSgpOiAnOyYjeGQ7CiAgICAvLyBTZXR1cCBhIHBvaW50ZXIgdG8gdGhlIEpTT04gb2JqZWN0IHNpbmNlIGl0cyBuYW1lIGRpZmZlcnMgb24gZm9ybXMgYW5kIGVuZ2luZS4mI3hkOwogICAgcG9pbnRlciA9IEpTT05wdHI7JiN4ZDsKICAgIHRyeSB7JiN4ZDsKICAgICAgcmVzID0gcG9pbnRlci5zdHJpbmdpZnkoIG8sIHIsIHMgKTsmI3hkOwogICAgfSBjYXRjaCggZSApeyYjeGQ7CiAgICAgIGxvZ2Vycm9yKCBmbmFtZSArIGUubWVzc2FnZSApOyYjeGQ7CiAgICB9JiN4ZDsKICAgIGlmICghIHJlcyApIHsmI3hkOwogICAgICBkZWJ1Z21zZyggZm5hbWUgKyAnaW5wdXQgcHJvY2Vzc2luZyByZXN1bHRlZCBpbiBhIG51bGwgdmFsdWUuJyApOyYjeGQ7CiAgICAgIHJldHVybiAnJzsmI3hkOwogICAgfSYjeGQ7CiAgICByZXR1cm4gcmVzOyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICogVmVyaWZ5IGlmIGFuIEVDTUEgb2JqZWN0IGhhcyB0aGUgc2VsZWN0ZWQgbG9jYXRpb24uJmx0O2JyLyZndDsmI3hkOwogKiBOb3RlOiBUbyByZWZlcmVuY2UgcHJvcGVydGllcyB3aXRoIGEgZG90IGluIHRoZWlyIG5hbWUgdXNlIHRoZSBmb3JtYXQgWyJwcm9wZXJ0eS5uYW1lIl0gLiZsdDtici8mZ3Q7JiN4ZDsKIComI3hkOwogKiBQb3J0ZWQgZnJvbSBJRE0gZW5naW5lIHRvIFJCUE0uIElETSBFbmdpbmUgdmVyc2lvbiBhdCBodHRwczovL2dpdGh1Yi5jb20vZmNoaWVyYWQvSURNLUVDTUFsaWIvYmxvYi92MS4wLjIvSlNPTmxpYi1KUy5qcyYjeGQ7CiAqJiN4ZDsKICogQGZ1bmN0aW9uIHRlc3QmI3hkOwogKiBAbWVtYmVyb2YgUFJELnV0aWwuSlNPTm9iaiYjeGQ7CiAqIEBzaW5jZSAxLjAuMyYjeGQ7CiAqJiN4ZDsKICogQHBhcmFtIHsob2JqZWN0fHN0cmluZyl9ICBpbnB1dEpTT04gICAgSW5wdXQgSlNPTiAoRUNNQSBvYmplY3QpLiBJZiBhIHN0cmluZy1zZXJpYWxpemVkIEpTT04gaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBKU09OIG9iamVjdCBpbnRlcm5hbGx5JiN4ZDsKICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICB3aGF0dG90ZXN0ICAgRG90LXNlcGFyYXRlZCBsaXN0IG9mIHByb3BlcnRpZXMgYXMgaWYgeW91IGFyZSBhY2Nlc3NpbmcgdGhlbSB2aWEgRUNNQXNjcmlwdCYjeGQ7CiAqJiN4ZDsKICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgcGF0aCBpcyBmb3VuZCwgZmFsc2Ugb3RoZXJ3aXNlJiN4ZDsKICovJiN4ZDsKZnVuY3Rpb24gSlNPTnRlc3QoIGlucHV0SlNPTiwgd2hhdHRvdGVzdCApIHsmI3hkOwogIHZhciBmbmFtZSwgaSwgaXR2YWwsIGl0b2JqLCBvYmosIGdldEFyciwgcHJvcE5hbWU7JiN4ZDsKICBmbmFtZSA9ICdKU09Ob2JqLnRlc3QoKTogJzsmI3hkOwogIC8vIFJldmlldyBpbnB1dCBkYXRhJiN4ZDsKICBpZiAoIGlzU3RyaW5nKCBpbnB1dEpTT04gKSApIHsmI3hkOwogICAgb2JqID0gSlNPTnBhcnNlKCBpbnB1dEpTT04gKTsmI3hkOwogIH0gZWxzZSBpZiAoIGlucHV0SlNPTiAmYW1wOyZhbXA7IHR5cGVvZiBpbnB1dEpTT04gPT09ICdvYmplY3QnICkgeyYjeGQ7CiAgICBvYmogPSBpbnB1dEpTT047JiN4ZDsKICB9IGVsc2UgeyYjeGQ7CiAgICBsb2dlcnJvciggZm5hbWUgKyAncGFyYW1ldGVyIGlucHV0SlNPTiBuZWVkIHRvIGJlIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgSlNPTiBvYmplY3Qgb3IgdGhlIEpTT04gb2JqZWN0IGl0c2VsZi4nICk7JiN4ZDsKICAgIHJldHVybiBmYWxzZTsmI3hkOwogIH0mI3hkOwogIGlmICggaXNTdHJpbmcoIHdoYXR0b3Rlc3QgKSApIHsmI3hkOwogICAgZ2V0QXJyID0gY2hhckFyclRvUHJvcGVydHlOYW1lcyggc3RyaW5nVG9DaGFyQXJyYXkoIHdoYXR0b3Rlc3QgKSApOyYjeGQ7CiAgfSBlbHNlIHsmI3hkOwogICAgbG9nZXJyb3IoIGZuYW1lICsgJ3BhcmFtZXRlciB3aGF0dG90ZXN0IHNob3VsZCBiZSBhIHN0cmluZyB2YWx1ZS4nICk7JiN4ZDsKICAgIHJldHVybiBmYWxzZTsmI3hkOwogIH0mI3hkOwogIC8vIEl0ZXJhdGVzIHRocm91Z2ggdGhlIG9iamVjdCB1c2luZyBpdG9iaiBhbmQgaXR2YWwgYXMgdGhlIG1pZGRsZSBzdGVwcyB0byBmaW5kIHRoZSBkZXNpcmVkIHJlc3VsdCYjeGQ7CiAgaXRvYmogPSBvYmo7JiN4ZDsKICBmb3IgKCBpID0gMDsgaSAmbHQ7IGdldEFyci5sZW5ndGg7IGkrKyApIHsmI3hkOwogICAgcHJvcE5hbWUgPSBnZXRBcnJbIGkgXTsmI3hkOwogICAgZGVidWdtc2coIGZuYW1lICsgJ1BhcnNpbmc6ICInICsgcHJvcE5hbWUgKyAnIiwgdHlwZTogJyArIHR5cGVvZiBwcm9wTmFtZSApOyYjeGQ7CiAgICBpZiAoIHR5cGVvZiBpdG9iaiA9PT0gJ29iamVjdCcgJmFtcDsmYW1wOyBwcm9wTmFtZSBpbiBpdG9iaiApIHsmI3hkOwogICAgICBpdHZhbCA9IGl0b2JqWyBwcm9wTmFtZSBdOyYjeGQ7CiAgICB9IGVsc2UgeyYjeGQ7CiAgICAgIGRlYnVnbXNnKCBmbmFtZSArICdwYXJzaW5nICcgKyB3aGF0dG90ZXN0ICsgJywgY291bGQgbm90IGZpbmQgcHJvcGVydHkgIicgKyBwcm9wTmFtZSArICciIGluIHRoZSBjdXJyZW50IG9iamVjdCBsb2NhdGlvbi4nICk7JiN4ZDsKICAgICAgcmV0dXJuIGZhbHNlOyYjeGQ7CiAgICB9JiN4ZDsKICAgIGl0b2JqID0gaXR2YWw7JiN4ZDsKICB9JiN4ZDsKICByZXR1cm4gdHJ1ZTsmI3hkOwp9JiN4ZDsKJiN4ZDsKLyoqJiN4ZDsKICogUmV0cmlldmVzIGEgcHJvcGVydHkgb2YgYW4gRUNNQSBvYmplY3QgKG9yIGl0cyBzdWJvcmRpbmF0ZSBvYmplY3QpIGFuZCByZXR1cm5zIGl0IGluIHRoZSBzcGVjaWZpZWQgdHlwZS4mbHQ7YnIvJmd0OyYjeGQ7CiAqIE5vdGU6IFRvIHJlZmVyZW5jZSBwcm9wZXJ0aWVzIHdpdGggYSBkb3QgaW4gdGhlaXIgbmFtZSB1c2UgdGhlIGZvcm1hdCBbInByb3BlcnR5Lm5hbWUiXSAuJmx0O2JyLyZndDsmI3hkOwogKiYjeGQ7CiAqIFBvcnRlZCBmcm9tIElETSBlbmdpbmUgdG8gUkJQTS4gSURNIEVuZ2luZSB2ZXJzaW9uIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9mY2hpZXJhZC9JRE0tRUNNQWxpYi9ibG9iL3YxLjAuMi9KU09ObGliLUpTLmpzJiN4ZDsKIComI3hkOwogKiBAZnVuY3Rpb24gZ2V0JiN4ZDsKICogQG1lbWJlcm9mIFBSRC51dGlsLkpTT05vYmomI3hkOwogKiBAc2luY2UgMS4wLjMmI3hkOwogKiYjeGQ7CiAqIEBwYXJhbSB7KG9iamVjdHxzdHJpbmcpfSAgaW5wdXRKU09OICAgICBJbnB1dCBKU09OIChFQ01BIG9iamVjdCkuIElmIGEgc3RyaW5nLXNlcmlhbGl6ZWQgSlNPTiBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIEpTT04gb2JqZWN0IGludGVybmFsbHkmI3hkOwogKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgIHdoYXR0b2dldCAgICAgRG90LXNlcGFyYXRlZCBsaXN0IG9mIHByb3BlcnRpZXMgYXMgaWYgeW91IGFyZSBhY2Nlc3NpbmcgdGhlbSB2aWEgRUNNQXNjcmlwdCYjeGQ7CiAqIEBwYXJhbSB7c3RyaW5nPX0gICAgICAgICAgW3JldHVybnR5cGVdICAoT3B0aW9uYWwpIERlc2lyZWQgcmV0dXJuIHR5cGUuIFZhbGlkIHZhbHVlcyBhcmU6IHN0cmluZywgbnVtYmVyLCByYXcuIERlZmF1bHRzIHRvIHJhdyBpbiBjYXNlIHdoYXRldmVyIGlzIHByb3ZpZGVkIGlzIG5vdCBvbmUgb2YgdGhlIDMgdmFsaWQgb3B0aW9ucyYjeGQ7CiAqJiN4ZDsKICogQHJldHVybiB7KHN0cmluZ3xudW1iZXJ8Ym9vbGVhbnxvYmplY3QpfSBTZWxlY3RlZCBwcm9wZXJ0eSdzIHZhbHVlIGluIHRoZSBzZWxlY3RlZCBmb3JtYXQuIElmIHBhcnNpbmcgb2YgdGhlIG9iamVjdCBmYWlscyByZXR1cm5zIGFuIGVtcHR5IHN0cmluZyYjeGQ7CiAqLyYjeGQ7CmZ1bmN0aW9uIEpTT05nZXQoIGlucHV0SlNPTiwgd2hhdHRvZ2V0LCByZXR1cm50eXBlICkgeyYjeGQ7CiAgdmFyIGZuYW1lLCBpLCBpdHZhbCwgaXRvYmosIG9iaiwgZ2V0QXJyLCBwcm9wTmFtZSwgcmVzID0gJyc7JiN4ZDsKICBmbmFtZSA9ICdKU09Ob2JqLmdldCgpOiAnOyYjeGQ7CiAgLy8gUmV2aWV3IGlucHV0IGRhdGEmI3hkOwogIGlmICggaXNTdHJpbmcoIGlucHV0SlNPTiApICkgeyYjeGQ7CiAgICBvYmogPSBKU09OcGFyc2UoIGlucHV0SlNPTiApOyYjeGQ7CiAgfSBlbHNlIGlmICggaW5wdXRKU09OICZhbXA7JmFtcDsgdHlwZW9mIGlucHV0SlNPTiA9PT0gJ29iamVjdCcgKSB7JiN4ZDsKICAgIG9iaiA9IGlucHV0SlNPTjsmI3hkOwogIH0gZWxzZSB7JiN4ZDsKICAgIGxvZ2Vycm9yKCBmbmFtZSArICdwYXJhbWV0ZXIgaW5wdXRKU09OIG5lZWQgdG8gYmUgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBKU09OIG9iamVjdCBvciB0aGUgSlNPTiBvYmplY3QgaXRzZWxmLicgKTsmI3hkOwogICAgcmV0dXJuIHJlczsmI3hkOwogIH0mI3hkOwogIGlmICggaXNTdHJpbmcoIHdoYXR0b2dldCApICkgeyYjeGQ7CiAgICBnZXRBcnIgPSBjaGFyQXJyVG9Qcm9wZXJ0eU5hbWVzKCBzdHJpbmdUb0NoYXJBcnJheSggd2hhdHRvZ2V0ICkgKTsmI3hkOwogIH0gZWxzZSB7JiN4ZDsKICAgIGxvZ2Vycm9yKCBmbmFtZSArICdwYXJhbWV0ZXIgd2hhdHRvdGVzdCBzaG91bGQgYmUgYSBzdHJpbmcgdmFsdWUuJyApOyYjeGQ7CiAgICByZXR1cm4gcmVzOyYjeGQ7CiAgfSYjeGQ7CiAgaWYgKCByZXR1cm50eXBlICE9PSAnc3RyaW5nJyAmYW1wOyZhbXA7IHJldHVybnR5cGUgIT09ICdudW1iZXInICZhbXA7JmFtcDsgcmV0dXJudHlwZSAhPT0gJ3JhdycgKSB7JiN4ZDsKICAgICAgcmV0dXJudHlwZSA9ICdyYXcnOyYjeGQ7CiAgfSYjeGQ7CiAgLy8gSXRlcmF0ZXMgdGhyb3VnaCB0aGUgb2JqZWN0IHVzaW5nIGl0b2JqIGFuZCBpdHZhbCBhcyB0aGUgbWlkZGxlIHN0ZXBzIHRvIGZpbmQgdGhlIGRlc2lyZWQgcmVzdWx0JiN4ZDsKICBpdG9iaiA9IG9iajsmI3hkOwogIGZvciAoIGkgPSAwOyBpICZsdDsgZ2V0QXJyLmxlbmd0aDsgaSsrICkgeyYjeGQ7CiAgICBwcm9wTmFtZSA9IGdldEFyclsgaSBdOyYjeGQ7CiAgICBkZWJ1Z21zZyggZm5hbWUgKyAnUGFyc2luZzogIicgKyBwcm9wTmFtZSArICciLCB0eXBlOiAnICsgdHlwZW9mIHByb3BOYW1lICk7JiN4ZDsKICAgIGlmICggdHlwZW9mIGl0b2JqID09PSAnb2JqZWN0JyAmYW1wOyZhbXA7IHByb3BOYW1lIGluIGl0b2JqICkgeyYjeGQ7CiAgICAgIGl0dmFsID0gaXRvYmpbIHByb3BOYW1lIF07JiN4ZDsKICAgIH0gZWxzZSB7JiN4ZDsKICAgICAgbG9nZXJyb3IoIGZuYW1lICsgJ3BhcnNpbmcgJyArIHdoYXR0b2dldCArICcsIGNvdWxkIG5vdCBmaW5kIHByb3BlcnR5ICInICsgcHJvcE5hbWUgKyAnIiBpbiB0aGUgY3VycmVudCBvYmplY3QgbG9jYXRpb24uJyApOyYjeGQ7CiAgICAgIHJldHVybiByZXM7JiN4ZDsKICAgIH0mI3hkOwogICAgaXRvYmogPSBpdHZhbDsmI3hkOwogIH0mI3hkOwogIC8vIEluc3BlY3QgcmV0dXJuZWQgZGF0YSBhbmQgY29lcmNlIGl0IGFzIG5lZWRlZC4gTm8gZGVmYXVsdCBzZXQgc2luY2UgcmVzIGlzIHNldCBhdCB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uJiN4ZDsKICBzd2l0Y2ggKCByZXR1cm50eXBlICkgeyYjeGQ7CiAgICBjYXNlICdzdHJpbmcnOiYjeGQ7CiAgICAgIHJlcyA9IFN0cmluZyggaXR2YWwgKTsmI3hkOwogICAgICBicmVhazsmI3hkOwogICAgY2FzZSAnbnVtYmVyJzomI3hkOwogICAgICByZXMgPSBOdW1iZXIoIGl0dmFsICk7JiN4ZDsKICAgICAgYnJlYWs7JiN4ZDsKICAgIGNhc2UgJ3Jhdyc6JiN4ZDsKICAgICAgcmVzID0gaXR2YWw7JiN4ZDsKICAgICAgYnJlYWs7JiN4ZDsKICB9JiN4ZDsKICByZXR1cm4gcmVzOyYjeGQ7Cn0mI3hkOwomI3hkOwovLyAgaHR0cHM6Ly9naXRodWIuY29tL2ZjaGllcmFkL0lETS1FQ01BbGliL2Jsb2IvdjEuMC4yL0pTT05saWItSlMubWQjSlNPTmdldCYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiBVbmljb2RlLXNhZmUgc3BsaXQgb2YgYSBzdHJpbmcgdG8gYSBjaGFyYWN0ZXIgQXJyYXkuJmx0O2JyLyZndDsmI3hkOwogICAqJiN4ZDsKICAgKiBTaW5jZSBJRE0gNC41L0lETSA0LjYgZG9lcyBub3QgaGF2ZSBhY2Nlc3MgdG8gRVM2IC0gdGhlcmVmb3JlIG5vIHNwcmVhZCAuLi4gb3BlcmF0b3IgLSB0aGlzIGZ1bmN0aW9uIGlzIG5lZWRlZC4mbHQ7YnIvJmd0OyYjeGQ7CiAgICogT25jZSBJRE0gc3VwcG9ydHMgdGhlIHNwcmVhZCBvcGVyYXRvciB1c2UgdGhhdCBpbnN0ZWFkLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiYjeGQ7CiAgICogUG9ydGVkIGZyb20gSURNIGVuZ2luZSB0byBSQlBNLiBJRE0gRW5naW5lIHZlcnNpb24gYXQgaHR0cHM6Ly9naXRodWIuY29tL2ZjaGllcmFkL0lETS1FQ01BbGliL2Jsb2IvdjEuMC4yL0pTT05saWItSlMuanMmI3hkOwogICAqJiN4ZDsKICAgKiBAc2luY2UgMS4wLjMmI3hkOwogICAqIEBwcml2YXRlJiN4ZDsKICAgKiBAcGFyYW0ge3N0cmluZ30gIHN0ciAgIFN0cmluZyBpbnB1dC4gQW55IG90aGVyIGlucHV0IHdpbGwgYmUgY29lcmNlZCB0byBzdHJpbmcgdXNpbmcgU3RyaW5nKCkgYW5kIHByb2JhYmx5IHdvbid0IGJlaGF2ZSBhcyBleHBlY3RlZCYjeGQ7CiAgICogQHR5cGUge3N0cmluZ1tdfSYjeGQ7CiAgICogQHJldHVybiB7c3RyaW5nW119IFVuaWNvZGUtc2FmZSBjaGFyYWN0ZXIgYXJyYXkmI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gc3RyaW5nVG9DaGFyQXJyYXkoIHN0ciApIHsmI3hkOwogICAgdmFyIGNBcnIgPSBbXSwgZm5hbWU7JiN4ZDsKICAgIGZuYW1lID0gJ3N0cmluZ1RvQ2hhckFycmF5KCk6ICc7JiN4ZDsKICAgIHRyeSB7JiN4ZDsKICAgICAgY0FyciA9IFN0cmluZyggc3RyICkuc3BsaXQoIC8oPz0oPzpbXDAtXHRceDBCXGZceDBFLVx1MjAyN1x1MjAyQS1cdUQ3RkZcdUUwMDAtXHVGRkZGXXxbXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl18W1x1RDgwMC1cdURCRkZdKD8hW1x1REMwMC1cdURGRkZdKXwoPzpbXlx1RDgwMC1cdURCRkZdfF4pW1x1REMwMC1cdURGRkZdKSkvICk7JiN4ZDsKICAgIH0gY2F0Y2goIGUgKSB7JiN4ZDsKICAgICAgbG9nZXJyb3IoIGZuYW1lICsgJ0ZhaWxlZCB0byBzcGxpdCB0aGUgaW5wdXQgc3RyaW5nLCBlcnJvcjogJyArIGUubWVzc2FnZSApOyYjeGQ7CiAgICB9JiN4ZDsKICAgIHJldHVybiBjQXJyOyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiBKU09OIHBhdGggcGFyc2VyLiBJdGVyYXRlcyB0aHJvdWdoIGEgY2hhcmFjdGVyIGFycmF5IGFuZCByZXR1cm5zIGFuIGFycmF5IHdpdGggcHJvcGVydHkgbmFtZXMuJmx0O2JyLyZndDsmI3hkOwogICAqIEFycmF5IGluZGV4ZXMgYXJlIHB1cmVseSBudW1lcmljIHByb3BlcnR5IG5hbWVzIGFuZCB3aWxsIGJlIHJldHVybmVkIGFzIG51bWJlcnMsIG5vdCBzdHJpbmdzLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBDaGFyYWN0ZXIgQXJyYXkgc2hvdWxkIGhhdmUgYmVlbiBzcGxpdCBmcm9tIHRoZSBvcmlnaW5hbCBFQ01BIG9iamVjdCBwYXRoIHRoYXQgd2Ugd2FudCB0byBwYXJzZS4mbHQ7YnIvJmd0OyYjeGQ7CiAgIComI3hkOwogICAqIFBvcnRlZCBmcm9tIElETSBlbmdpbmUgdG8gUkJQTS4gSURNIEVuZ2luZSB2ZXJzaW9uIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9mY2hpZXJhZC9JRE0tRUNNQWxpYi9ibG9iL3YxLjAuMi9KU09ObGliLUpTLmpzJiN4ZDsKICAgKiYjeGQ7CiAgICogQHNpbmNlIDEuMC4wJiN4ZDsKICAgKiBAcHJpdmF0ZSYjeGQ7CiAgICogQHBhcmFtIHtzdHJpbmdbXX0gIHN0ciAgIENoYXJhY3RlciBzdHJpbmcuIEFzc3VtZXMgZWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgaXMgYSBzaW5nbGUgVW5pY29kZSBjaGFyYWN0ZXImI3hkOwogICAqIEB0eXBlIHtBcnJheSZsdDsoc3RyaW5nfG51bWJlcikmZ3Q7fSYjeGQ7CiAgICogQHJldHVybiB7QXJyYXkmbHQ7KHN0cmluZ3xudW1iZXIpJmd0O30gcHJvcGVydHkgbmFtZXMgYXJyYXkmI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gY2hhckFyclRvUHJvcGVydHlOYW1lcyggY0FyciApIHsmI3hkOwogICAgdmFyIGksIGZuYW1lLCBjdXJyZW50TmFtZSwgc3F1YXJlbWFyaywgcmVfd2hpdGVzcGFjZSwgcmVfbnVtYmVyLCByZV9xdW90ZXMsIHByb3BlcnR5ID0gW107JiN4ZDsKICAgIGZuYW1lID0gJ2NoYXJBcnJUb1Byb3BlcnR5TmFtZXMoKTogJzsmI3hkOwogICAgaWYgKCAhKCBjQXJyIGluc3RhbmNlb2YgQXJyYXkgKSApIHsmI3hkOwogICAgICBsb2dlcnJvciggZm5hbWUgKyAnSW5wdXQgcGFyYW1ldGVyIGlzIG5vdCBhbiBBcnJheSwgYWJvcnRpbmcuJyApOyYjeGQ7CiAgICAgIHJldHVybiBwcm9wZXJ0eTsmI3hkOwogICAgfSYjeGQ7CiAgICAvLyBTZXR1cCBmb3IgcGFyc2luZy4gRGVsaW1pdGVyIGZvciBwcm9wZXJ0eSBuYW1lcyBhcmUgZWl0aGVyIGRvdCBvciBvcGVuIGFuZCBjbG9zZSBzcXVhcmUgYnJhY2tldHMmI3hkOwogICAgLy8gSWYgdGhlIGNvbnRlbnRzIGluc2lkZSBzcXVhcmUgYnJhY2tldHMgYXJlIHB1cmVseSBudW1lcmljIHRoZW4gYSBudW1iZXIgaXMgcmV0dXJuZWQmI3hkOwogICAgY3VycmVudE5hbWUgPSAnJzsmI3hkOwogICAgcmVfbnVtYmVyID0gL15cZCskLzsmI3hkOwogICAgcmVfcXVvdGVzID0gL14oWyciXSkoLispXDEkLzsmI3hkOwogICAgc3F1YXJlbWFyayA9ICggY0FyclsgMCBdID09PSAnWycgKT8gJ2ZpcnN0JzonZW5kJzsgLy9zcXVhcmVtYXJrIGNhbiBiZSAnZmlyc3QnLCAnc3RhcnQnLCAnZW5kJyYjeGQ7CiAgICAvLyBJdGVyYXRlcyB0aHJvdWdoIHRoZSBjaGFyYWN0ZXIgYXJyYXkgcGFyc2luZyBlbGVtZW50cyBpbnRvIHRoZWlyIG93biBwcm9wZXJ0eSBhcnJheSBlbnRyeSYjeGQ7CiAgICBmb3IgKCBpPTA7IGkgJmx0OyBjQXJyLmxlbmd0aDsgaSsrICkgeyYjeGQ7CiAgICAgIGlmICggc3F1YXJlbWFyayA9PT0gJ2ZpcnN0JyAmYW1wOyZhbXA7IGNBcnJbIGkgXSA9PT0gJ1snICkgeyYjeGQ7CiAgICAgICAgc3F1YXJlbWFyayA9ICdzdGFydCc7JiN4ZDsKICAgICAgICBjb250aW51ZTsmI3hkOwogICAgICB9JiN4ZDsKICAgICAgaWYgKCBzcXVhcmVtYXJrID09PSAnZW5kJyAmYW1wOyZhbXA7IGNBcnJbIGkgXSA9PT0gJ1snICkgeyYjeGQ7CiAgICAgICAgc3F1YXJlbWFyayA9ICdzdGFydCc7JiN4ZDsKICAgICAgICBpZiAoIGN1cnJlbnROYW1lLnRyaW0oKSAhPT0gJycgKSB7IC8vIHByZXZlbnQgZG91YmxlIHB1c2ggb24gY29uc3RydWN0cyBsaWtlIGFyclswXVswXSYjeGQ7CiAgICAgICAgICBwcm9wZXJ0eS5wdXNoKCBjdXJyZW50TmFtZS50cmltKCkgKTsmI3hkOwogICAgICAgIH0mI3hkOwogICAgICAgIGN1cnJlbnROYW1lID0gJyc7JiN4ZDsKICAgICAgICBjb250aW51ZTsmI3hkOwogICAgICB9JiN4ZDsKICAgICAgaWYgKCBzcXVhcmVtYXJrID09PSAnc3RhcnQnICZhbXA7JmFtcDsgY0FyclsgaSBdID09PSAnXScgKSB7JiN4ZDsKICAgICAgICBzcXVhcmVtYXJrID0gJ2VuZCc7JiN4ZDsKICAgICAgICBjdXJyZW50TmFtZSA9IGN1cnJlbnROYW1lLnRyaW0oKTsmI3hkOwogICAgICAgIC8vIElmIHRoZSBwcm9wZXJ0eSBuYW1lIGJldHdlZW4gW10gaXMgYSBwdXJlIG51bWJlciwgY29lcmNlcyB0aGUgc3RyaW5nIHRvIGEgbnVtYmVyJiN4ZDsKICAgICAgICBpZiAoIHJlX251bWJlci50ZXN0KCBjdXJyZW50TmFtZSApICkgeyYjeGQ7CiAgICAgICAgICBjdXJyZW50TmFtZSA9IE51bWJlciggY3VycmVudE5hbWUgKTsmI3hkOwogICAgICAgIH0mI3hkOwogICAgICAgIC8vIFJlbW92ZSBxdW90ZXMgYXJvdW5kIHByb3BlcnR5IG5hbWUgaWYgdGhleSBhcmUgcHJlc2VudCBsaWtlIG9ialsicHJvcGVydHkgbmFtZSJdLCByZXR1cm5pbmcgcHJvcGVydHkgbmFtZSYjeGQ7CiAgICAgICAgaWYgKCByZV9xdW90ZXMudGVzdCggY3VycmVudE5hbWUgKSApIHsmI3hkOwogICAgICAgICAgY3VycmVudE5hbWUgPSByZV9xdW90ZXMuZXhlYyggY3VycmVudE5hbWUgKVsyXTsmI3hkOwogICAgICAgIH0mI3hkOwogICAgICAgIHByb3BlcnR5LnB1c2goIGN1cnJlbnROYW1lICk7JiN4ZDsKICAgICAgICBjdXJyZW50TmFtZSA9ICcnOyYjeGQ7CiAgICAgICAgY29udGludWU7JiN4ZDsKICAgICAgfSYjeGQ7CiAgICAgIC8vIFRyYWRpdGlvbmFsIC4gZGVsaW1pdGVyJiN4ZDsKICAgICAgaWYgKCBzcXVhcmVtYXJrID09PSAnZW5kJyAmYW1wOyZhbXA7IGNBcnJbIGkgXSA9PT0gJy4nICkgeyYjeGQ7CiAgICAgICAgaWYgKCBjdXJyZW50TmFtZS50cmltKCkgIT09ICcnICkgeyAvLyBwcmV2ZW50IGRvdWJsZSBwdXNoIG9uIGNvbnN0cnVjdHMgbGlrZSBhcnJbMF0ubmFtZSYjeGQ7CiAgICAgICAgICBwcm9wZXJ0eS5wdXNoKCBjdXJyZW50TmFtZS50cmltKCkgKTsmI3hkOwogICAgICAgIH0mI3hkOwogICAgICAgIGN1cnJlbnROYW1lID0gJyc7JiN4ZDsKICAgICAgICBjb250aW51ZTsmI3hkOwogICAgICB9JiN4ZDsKICAgICAgY3VycmVudE5hbWUgKz0gY0FyclsgaSBdOyYjeGQ7CiAgICB9JiN4ZDsKICAgIGlmICggY3VycmVudE5hbWUgIT09ICcnICkgeyYjeGQ7CiAgICAgIHByb3BlcnR5LnB1c2goIGN1cnJlbnROYW1lLnRyaW0oKSApOyYjeGQ7CiAgICB9JiN4ZDsKICAgIHJldHVybiBwcm9wZXJ0eTsmI3hkOwogIH0mI3hkOwomI3hkOwogIC8qKiYjeGQ7CiAgICogQ29lcmNlcyB0aGUgcmVzdWx0IHRvIGFuIEVDTUEgc3RyaW5nLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBDb2VyY2lvbiBydWxlcyBmb3IgdGhpcyBmdW5jdGlvbjombHQ7YnIvJmd0OyYjeGQ7CiAgICogSWYgdGhlIGZpcnN0IGlucHV0IHBhcmFtZXRlciBpcyBudWxsIG9yIHVuZGVmaW5lZCByZXR1cm5zIGRlZmF1bHQgdmFsdWUuJmx0O2JyLyZndDsmI3hkOwogICAqIElmIHRoZSBmaXJzdCBpbnB1dCBwYXJhbWV0ZXIgaXMgYW4gQXJyYXkgaXQgcmV0dXJucyB0aGUgYXJyYXkgam9pbmVkIGJ5ICcgJy4mbHQ7YnIvJmd0OyYjeGQ7CiAgICogSWYgdGhlIGZpcnN0IGlucHV0IHBhcmFtZXRlciBpcyBhIFN0cmluZywgTnVtYmVyIG9yIEJvb2xlYW4gaXQgcmV0dXJucyBhIHN0cmluZy4mbHQ7YnIvJmd0OyYjeGQ7CiAgICogSWYgdGhlIGZpcnN0IGlucHV0IHBhcmFtZXRlciBpcyBhbiBvYmplY3Qgb3RoZXIgdGhhbiBhbiBBcnJheSBpdCByZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBJZiB0aGUgc2Vjb25kIGlucHV0IHZhbHVlIGlzIG5vdCBudWxsIHRoZW4gdGhlIGRlZmF1bHQgdmFsdWUgYmVjb21lcyB0aGUgc2Vjb25kIGlucHV0IHZhbHVlLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBJZiB0aGUgY29lcmNpb24gdG8gc3RyaW5nIGZyb20gU3RyaW5nLCBOdW1iZXIsIEJvb2xlYW4gb3IgQXJyYXkgcmVzdWx0ZWQgaW4gZW1wdHkgc3RyaW5nLCByZXR1cm4gZGVmYXVsdCB2YWx1ZS4mI3hkOwogICAqJiN4ZDsKICAgKiBAbWVtYmVyb2YgUFJELnV0aWwmI3hkOwogICAqIEBzaW5jZSAxLjAuMCYjeGQ7CiAgIComI3hkOwogICAqIEBwYXJhbSAge2FueX0gICAgIGlucHV0ICAgICBJbnB1dCBwYXJhbWV0ZXIgdG8gYmUgY29lcmNlZC4mI3hkOwogICAqIEBwYXJhbSAge3N0cmluZ30gIFtkZWZWYWxdICBEZWZhdWx0IHZhbHVlIHRvIGJlIHVzZWQmI3hkOwogICAqJiN4ZDsKICAgKiBAdHlwZSB7c3RyaW5nfSYjeGQ7CiAgICogQHJldHVybiB7c3RyaW5nfSByZXN1bHRpbmcgc3RyaW5nLiYjeGQ7CiAgICovJiN4ZDsKICBmdW5jdGlvbiBjb2VyY2VUb1N0cmluZyggaW5wdXQsIGRlZlZhbCApIHsmI3hkOwogICAgdmFyIHJldCA9ICcnLCBzdHI7JiN4ZDsKICAgIC8qIFRocm91Z2hvdXQgdGhpcyBmdW5jdGlvbiBTdHJpbmcoKSBpcyB1c2VkIHRvIGd1YXJhbnRlZSB0aGF0IHRoZSBzdHJpbmcgZ2VuZXJhdGVkJiN4ZDsKICAgICAqIGlzIGFuIEVDTUEgc3RyaW5nLiBUaGlzIGlzIG9ubHkgYSBjb25jZXJuIG9uIHRoZSB3b3JrZmxvdyBlbmdpbmUgc2luY2UgdGhlIGVuZ2luZSYjeGQ7CiAgICAgKiBhbGxvd3MgYSBtaXggb2YgRUNNQSBhbmQgSmF2YSBjb2RlLiBSZXR1cm5pbmcgYSBKYXZhIHN0cmluZyB3aWxsIGNhdXNlIHRoZSYjeGQ7CiAgICAgKiB0b0pTT04oKSBmdW5jdGlvbiB0byBmYWlsIHdoZW4gdXNpbmcgSlNPTi5zdHJpbmdpZnkoKSwgaGVuY2UgdGhpcyBzYWZldHkuJiN4ZDsKICAgICAqLyYjeGQ7CiAgICBpZiAoIGRlZlZhbCAhPSBudWxsICZhbXA7JmFtcDsgaXNTdHJpbmcoIGRlZlZhbCApICkgeyYjeGQ7CiAgICAgIHJldCA9IFN0cmluZyggZGVmVmFsICk7JiN4ZDsKICAgIH0mI3hkOwogICAgaWYgKCBpbnB1dCA9PT0gbnVsbCB8fCBpbnB1dCA9PT0gdW5kZWZpbmVkICkgeyYjeGQ7CiAgICAgIHJldHVybiByZXQ7JiN4ZDsKICAgIH0mI3hkOwogICAgaWYgKCBpc1N0cmluZyggaW5wdXQgKSB8fCBpc051bWJlciggaW5wdXQgKSB8fCBpc0Jvb2xlYW4oIGlucHV0ICkgKSB7JiN4ZDsKICAgICAgc3RyID0gU3RyaW5nKCBpbnB1dCApOyYjeGQ7CiAgICB9JiN4ZDsKICAgIGlmICggaW5wdXQgaW5zdGFuY2VvZiBBcnJheSApIHsmI3hkOwogICAgICBzdHIgPSBTdHJpbmcoIGlucHV0LmpvaW4oICcgJyApICk7JiN4ZDsKICAgIH0mI3hkOwogICAgaWYgKCBzdHIgIT09ICcnICkgeyYjeGQ7CiAgICAgIHJldCA9IHN0cjsmI3hkOwogICAgfSYjeGQ7CiAgICByZXR1cm4gcmV0OyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiAoRW5naW5lIG9ubHkpIFJldHVybnMgYmFzaWMgSFRUUCBhdXRoIGhlYWRlci4gRm9ybWF0IGlzOiBCYXNpYyBCNjRlbmNvZGVkVVNFUk5BTUU6UEFTU1dPUkQmI3hkOwogICAqJiN4ZDsKICAgKiBAbWVtYmVyb2YgUFJELnV0aWwmI3hkOwogICAqIEBzaW5jZSAxLjAuMyYjeGQ7CiAgIComI3hkOwogICAqIEBwYXJhbSB7c3RyaW5nfSAgdXNlcm5hbWUgIEhUVFAgYXV0aCB1c2VyJ3MgbmFtZS4mI3hkOwogICAqIEBwYXJhbSB7c3RyaW5nfSAgcGFzc3dvcmQgIEhUVFAgYXV0aCB1c2VyJ3MgcGFzc3dvcmQuJiN4ZDsKICAgKiYjeGQ7CiAgICogQHR5cGUge3N0cmluZ30mI3hkOwogICAqIEByZXR1cm4ge3N0cmluZ30gSFRUUCBCYXNpYyAnQXV0aG9yaXphdGlvbicgaGVhZGVyJ3MgdmFsdWUuJiN4ZDsKICAgKi8mI3hkOwogIGZ1bmN0aW9uIGJhc2ljSFRUUGF1dGhIZWFkZXIoIHVzZXJuYW1lLCBwYXNzd29yZCApIHsmI3hkOwogICAgdmFyIGZuYW1lLCByZXMsIGNvbmMsIEJhc2U2NCwgYjY0c3RyOyYjeGQ7CiAgICBmbmFtZSA9ICdiYXNpY0hUVFBhdXRoSGVhZGVyKCk6ICc7JiN4ZDsKICAgIGlmICggdXNlcm5hbWUgPT0gbnVsbCB8fCBwYXNzd29yZCA9PSBudWxsICkgeyYjeGQ7CiAgICAgIGxvZ2Vycm9yKCBmbmFtZSArICd1c2VybmFtZSBhbmQgcGFzc3dvcmQgbXVzdCBiZSBwcm92aWRlZCBhbmQgbm90IG51bGwgbm9yIHVuZGVmaW5lZC4nICk7JiN4ZDsKICAgICAgcmV0dXJuICcnOyYjeGQ7CiAgICB9JiN4ZDsKICAgIHRyeSB7JiN4ZDsKICAgICAgQmFzZTY0ID0gbmV3IFBhY2thZ2VzLm9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5iaW5hcnkuQmFzZTY0KCk7JiN4ZDsKICAgICAgY29uYyA9IEpTdHJpbmcoIHVzZXJuYW1lICsgJzonICsgcGFzc3dvcmQgKS5nZXRCeXRlcyggJ1VURi04JyApOyYjeGQ7CiAgICAgIGI2NHN0ciA9IEpTdHJpbmcoIEJhc2U2NC5lbmNvZGVCYXNlNjQoIGNvbmMgKSwgJ1VURi04JyApOyYjeGQ7CiAgICAgIHJlcyA9ICdCYXNpYyAnICsgYjY0c3RyOyYjeGQ7CiAgICB9IGNhdGNoKCBlICkgeyYjeGQ7CiAgICAgIGxvZ2Vycm9yKCBmbmFtZSArICdGYWlsZWQgdG8gYnVpbGQgQmFzaWMgQXV0aGVudGljYXRpb24gSFRUUCBoZWFkZXIgdmFsdWUuIEVycm9yOiAnICsgZS5tZXNzYWdlICk7JiN4ZDsKICAgIH0mI3hkOwogICAgcmV0dXJuIHJlczsmI3hkOwogIH0mI3hkOwomI3hkOwogIC8qKiYjeGQ7CiAgICogKEVuZ2luZSBvbmx5KSBGdW5jdGlvbiB0byBjb2VyY2UgcHJvdmlkZWQgZmxvd2RhdGEgYW5kIHJldHVybiBpZiB3ZSBhcmUgcGFzdCBtYXggcmV0cmllcyBvciBub3QuJiN4ZDsKICAgKiYjeGQ7CiAgICogQG1lbWJlcm9mIFBSRC51dGlsJiN4ZDsKICAgKiBAc2luY2UgMS4wLjMmI3hkOwogICAqJiN4ZDsKICAgKiBAcGFyYW0ge3N0cmluZ30gIGN1cmNvdW50ZXIgIEN1cnJlbnQgQ291bnRlciYjeGQ7CiAgICogQHBhcmFtIHtzdHJpbmd9ICBtYXhyZXRyaWVzICBNYXhpbXVtIHJldHJpZXMgdmFsdWUmI3hkOwogICAqJiN4ZDsKICAgKiBAdHlwZSB7Ym9vbGVhbn0mI3hkOwogICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgbWF4cmV0cmllcyBpcyBncmVhdGVyIHRoYW4gY3VycmVudCBjb3VudGVyLCBmYWxzZSBvdGhlcndpc2UuJiN4ZDsKICAgKi8mI3hkOwogIGZ1bmN0aW9uIHNob3VsZFJldHJ5KCBjdXJjb3VudGVyLCBtYXhyZXRyaWVzICkgeyYjeGQ7CiAgICB2YXIgcmV0cnkgPSBmYWxzZTsmI3hkOwogICAgY3VyY291bnRlciA9IFN0cmluZyggY3VyY291bnRlciApIHwgMDsmI3hkOwogICAgbWF4cmV0cmllcyA9IFN0cmluZyggbWF4cmV0cmllcyApIHwgMDsmI3hkOwogICAgcmV0cnkgPSAoIGN1cmNvdW50ZXIgJmx0OyBtYXhyZXRyaWVzICkgPyB0cnVlIDogZmFsc2U7JiN4ZDsKICAgIHJldHVybiByZXRyeTsmI3hkOwogIH0mI3hkOwomI3hkOwogIC8qKiYjeGQ7CiAgICogKEVuZ2luZSkgQ29tcGFyZXMgMiB1bmlkaW1lbnNpb25hbCBFQ01BIEFycmF5cyBvciBKYXZhIFZlY3RvcnMgYW5kIHJldHVybnMgYW4gQXJyYXkgb2YgYXJyYXlzIHdpdGggY29tcGFyaXNvbiByZXN1bHRzLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiAoRm9ybSkgQ29tcGFyZXMgMiB1bmlkaW1lbnNpb25hbCBFQ01BIEFycmF5cyBhbmQgcmV0dXJucyBhbiBBcnJheSBvZiBhcnJheXMgd2l0aCBjb21wYXJpc29uIHJlc3VsdHMuJiN4ZDsKICAgKiYjeGQ7CiAgICogQG1lbWJlcm9mIFBSRC51dGlsJiN4ZDsKICAgKiBAc2luY2UgMS4wLjImI3hkOwogICAqJiN4ZDsKICAgKiBAcGFyYW0gIHsoc3RyaW5nW118amF2YS51dGlsLlZlY3Rvcil9IGxpc3QxICAgICAgICBFQ01BIEFycmF5IG9yIEphdmEgVmVjdG9yLiYjeGQ7CiAgICogQHBhcmFtICB7KHN0cmluZ1tdfGphdmEudXRpbC5WZWN0b3IpfSBsaXN0MiAgICAgICAgRUNNQSBBcnJheSBvciBKYXZhIFZlY3Rvci4mI3hkOwogICAqIEBwYXJhbSAge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICAgaWdub3JlY2FzZSAgIENoYW5nZXMgc3RyaW5nIGNvbXBhcmlzb24gdG8gY2FzZSBpbnNlbnNpdGl2ZS4mI3hkOwogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgYWxzbyBjYXVzZXMgdGhlIGNhc2luZyBvZiB0aGUgcmVzdWx0cyB3aWxsIG1hdGNoIHRoZSBjYXNpbmcgb2YgdGhlaXImI3hkOwogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0IHRpbWUgYXBwZWFyaW5nIGluIHRoZSBsaXN0IHByb3ZpZGVkLiYjeGQ7CiAgIComI3hkOwogICAqIEB0eXBlIHtBcnJheS4mbHQ7c3RyaW5nW10mZ3Q7fSYjeGQ7CiAgICogQHJldHVybiB7QXJyYXkuJmx0O3N0cmluZ1tdJmd0O30gRUNNQSBBcnJheSB3aXRoIDMgcGFydHMuIFsgWyBlbGVtZW50cyBvbmx5IHByZXNlbnQgb24gbGlzdDEgXSwgWyBlbGVtZW50cyBvbmx5IHByZXNlbnQgb24gbGlzdDIgXSwgWyBlbGVtZW50cyBwcmVzZW50IG9uIGJvdGhdIF0mI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gY29tcGFyZSggbGlzdDEsIGxpc3QyICxpZ25vcmVjYXNlICkgeyYjeGQ7CiAgICB2YXIgZXhpc3RzMSA9IHt9LCBleGlzdHMyID0ge30sIG9ubHlpbjEgPSBbXSwgb25seWluMiA9IFtdLCBpc2luYm90aCA9IFtdLCByZXMsJiN4ZDsKICAgIGksIGN1cnIsIGNvbXBhcmUsIGZuYW1lLCBkZWR1cDEgPSBbXTsmI3hkOwogICAgZm5hbWUgPSAnVW5pcXVlKCk6ICc7JiN4ZDsKICAgIGlmICggbGlzdDEgIT0gbnVsbCAmYW1wOyZhbXA7IHR5cGVvZiBsaXN0MSA9PT0gJ29iamVjdCcgJmFtcDsmYW1wOyBsaXN0MiAhPSBudWxsICZhbXA7JmFtcDsgdHlwZW9mIGxpc3QyID09PSAnb2JqZWN0JyApIHsmI3hkOwogICAgICAvLyAoRW5naW5lIG9ubHkpIENvbnZlcnQgVmVjdG9yIHRvIEFycmF5IHNvIHdlIGNhbiBwZXJmb3JtIHRoZSBjb21wYXJpc29ucy4mI3hkOwogICAgICBpZiAoIHdoZXJlID09PSAnZW5naW5lJyApIHsmI3hkOwogICAgICAgIGlmICggaXNKYXZhVmVjdG9yKCBsaXN0MSApICkgeyYjeGQ7CiAgICAgICAgICBsaXN0MSA9IEphdmFWZWN0b3JUb0VDTUFBcnJheSggbGlzdDEgKTsmI3hkOwogICAgICAgIH0mI3hkOwogICAgICAgIGlmICggaXNKYXZhVmVjdG9yKCBsaXN0MiApICkgeyYjeGQ7CiAgICAgICAgICBsaXN0MiA9IEphdmFWZWN0b3JUb0VDTUFBcnJheSggbGlzdDIgKTsmI3hkOwogICAgICAgIH0mI3hkOwogICAgICB9JiN4ZDsKICAgICAgLy8gRGVkdXBsaWNhdGUgbGlzdHMsIHRoZW4gY29tcGFyZSB0aGVtJiN4ZDsKICAgICAgaWYgKCBsaXN0MSBpbnN0YW5jZW9mIEFycmF5ICZhbXA7JmFtcDsgbGlzdDIgaW5zdGFuY2VvZiBBcnJheSApIHsmI3hkOwogICAgICAgIC8vIGdlbmVyYXRlIGhhc2htYXAgZm9yIGxpc3QxJiN4ZDsKICAgICAgICBmb3IgKCBpID0gMDsgaSAmbHQ7IGxpc3QxLmxlbmd0aDsgaSsrICkgeyYjeGQ7CiAgICAgICAgICAvLyBVc2luZyBjb21wYXJlIGZvciBjYXNlIHNlbnNpdGl2ZSBhbmQgaW5zZW50aXZlIGNvbXBhcmlzc29uIHdoaWxlIGtlZXBpbmcgY3VyciBhcyB0aGUgY3VycmVudCB2YWx1ZSBjb2VyY2VkIHRvIHN0cmluZyYjeGQ7CiAgICAgICAgICBjdXJyID0gU3RyaW5nKCBsaXN0MVsgaSBdICk7JiN4ZDsKICAgICAgICAgIGlmICggaWdub3JlY2FzZSA9PT0gdHJ1ZSApIHsmI3hkOwogICAgICAgICAgICBjb21wYXJlID0gY3Vyci50b0xvd2VyQ2FzZSgpOyYjeGQ7CiAgICAgICAgICB9IGVsc2UgeyYjeGQ7CiAgICAgICAgICAgIGNvbXBhcmUgPSBjdXJyOyYjeGQ7CiAgICAgICAgICB9JiN4ZDsKICAgICAgICAgIGlmICggISBleGlzdHMxLmhhc093blByb3BlcnR5KCBjb21wYXJlICkgKSB7JiN4ZDsKICAgICAgICAgICAgZGVkdXAxLnB1c2goIGN1cnIgKTsmI3hkOwogICAgICAgICAgICBleGlzdHMxWyBjb21wYXJlIF0gPSB0cnVlOyAvLyBtYXJraW5nIHRoZSBlbnRyeSBhcyBhbHJlYWR5IGV4aXN0aW5nIGZvciBkZWR1cGxpY2F0aW9uIHB1cnBvc2VzJiN4ZDsKICAgICAgICAgIH0mI3hkOwogICAgICAgIH0mI3hkOwogICAgICAgIC8vIEJ1aWxkIG9ubHlpbjIgYW5kIGlzaW5ib3RoIGJ5IGl0ZXJhdGluZyBvbiBsaXN0MiwgZ2VuZXJhdGluZyBpdHMgaGFzaG1hcCB3aGlsZSBjb21wYXJpbmcgd2l0aCBsaXN0MSYjeGQ7CiAgICAgICAgZm9yICggaSA9IDA7IGkgJmx0OyBsaXN0Mi5sZW5ndGg7IGkrKyApIHsmI3hkOwogICAgICAgICAgLy8gVXNpbmcgY29tcGFyZSBmb3IgY2FzZSBzZW5zaXRpdmUgYW5kIGluc2VudGl2ZSBjb21wYXJpc3NvbiB3aGlsZSBrZWVwaW5nIGN1cnIgYXMgdGhlIGN1cnJlbnQgdmFsdWUgY29lcmNlZCB0byBzdHJpbmcmI3hkOwogICAgICAgICAgY3VyciA9IFN0cmluZyggbGlzdDJbIGkgXSApOyYjeGQ7CiAgICAgICAgICBpZiAoIGlnbm9yZWNhc2UgPT09IHRydWUgKSB7JiN4ZDsKICAgICAgICAgICAgY29tcGFyZSA9IGN1cnIudG9Mb3dlckNhc2UoKTsmI3hkOwogICAgICAgICAgfSBlbHNlIHsmI3hkOwogICAgICAgICAgICBjb21wYXJlID0gY3VycjsmI3hkOwogICAgICAgICAgfSYjeGQ7CiAgICAgICAgICBpZiAoICEgZXhpc3RzMi5oYXNPd25Qcm9wZXJ0eSggY29tcGFyZSApICkgeyYjeGQ7CiAgICAgICAgICAgIGV4aXN0czJbIGNvbXBhcmUgXSA9IHRydWU7IC8vIG1hcmtpbmcgdGhlIGVudHJ5IGFzIGFscmVhZHkgZXhpc3RpbmcgZm9yIGRlZHVwbGljYXRpb24gcHVycG9zZXMmI3hkOwogICAgICAgICAgICBpZiAoIGV4aXN0czEuaGFzT3duUHJvcGVydHkoIGNvbXBhcmUgKSApIHsmI3hkOwogICAgICAgICAgICAgIGlzaW5ib3RoLnB1c2goIGN1cnIgKTsmI3hkOwogICAgICAgICAgICB9IGVsc2UgeyYjeGQ7CiAgICAgICAgICAgICAgb25seWluMi5wdXNoKCBjdXJyICk7JiN4ZDsKICAgICAgICAgICAgfSYjeGQ7CiAgICAgICAgICB9JiN4ZDsKICAgICAgICB9JiN4ZDsKICAgICAgICAvLyBJdGVyYXRlIGRlZHVwbGljYXRlZCBsaXN0MSBhZ2FpbnN0IGxpc3QyJ3MgaGFzaG1hcCB0byBwb3B1bGF0ZSBvbmx5aW4yJiN4ZDsKICAgICAgICBmb3IgKCBpID0gMDsgaSAmbHQ7IGRlZHVwMS5sZW5ndGg7IGkrKyApeyYjeGQ7CiAgICAgICAgICAvLyBVc2luZyBjb21wYXJlIGZvciBjYXNlIHNlbnNpdGl2ZSBhbmQgaW5zZW50aXZlIGNvbXBhcmlzc29uIHdoaWxlIGtlZXBpbmcgY3VyciBhcyB0aGUgY3VycmVudCB2YWx1ZSBjb2VyY2VkIHRvIHN0cmluZyYjeGQ7CiAgICAgICAgICBjdXJyID0gU3RyaW5nKCBkZWR1cDFbIGkgXSApOyYjeGQ7CiAgICAgICAgICBpZiAoIGlnbm9yZWNhc2UgPT09IHRydWUgKSB7JiN4ZDsKICAgICAgICAgICAgY29tcGFyZSA9IGN1cnIudG9Mb3dlckNhc2UoKTsmI3hkOwogICAgICAgICAgfSBlbHNlIHsmI3hkOwogICAgICAgICAgICBjb21wYXJlID0gY3VycjsmI3hkOwogICAgICAgICAgfSYjeGQ7CiAgICAgICAgICBpZiAoICEgZXhpc3RzMi5oYXNPd25Qcm9wZXJ0eSggY29tcGFyZSApICkgeyYjeGQ7CiAgICAgICAgICAgIG9ubHlpbjEucHVzaCggY3VyciApOyYjeGQ7CiAgICAgICAgICB9JiN4ZDsKICAgICAgICB9JiN4ZDsKICAgICAgICAvLyBDb252ZXJ0IHJlc3VsdHMgYmFjayB0byBWZWN0b3IgaWYgdGhlIG9iaiBwYXNzZWQgaW4gd2FzIGEgamF2YS51dGlsLlZlY3RvciYjeGQ7CiAgICAgIH0mI3hkOwogICAgfSBlbHNlIHsmI3hkOwogICAgICBsb2dlcnJvciggZm5hbWUgKyAnUGxlYXNlIHJldmlldyB0aGUgcGFyYW1ldGVycyBwcm92aWRlZCwgYWJvcnRpbmcuJyApOyYjeGQ7CiAgICB9JiN4ZDsKICAgIHJlcyA9IFsgb25seWluMSwgb25seWluMiwgaXNpbmJvdGggXTsmI3hkOwogICAgcmV0dXJuIHJlczsmI3hkOwogIH0mI3hkOwomI3hkOwogLyoqJiN4ZDsKICAgKiAoRm9ybSkgQ29tcGFyZXMgMiBvciBtb3JlIHVuaWRpbWVuc2lvbmFsIEVDTUEgQXJyYXlzIHdpdGhpbiBhbiBBcnJheSBhbmQgcmV0dXJucyBhbiBBcnJheSB3aXRoIGludGVyc2VjdGluZyByZXN1bHRzLiYjeGQ7CiAgICogQG1lbWJlcm9mIFBSRC51dGlsJiN4ZDsKICAgKiBAc2luY2UgMS4wLjcmI3hkOwogICAqJiN4ZDsKICAgKiBAcGFyYW0gIHtBcnJheS4mbHQ7c3RyaW5nW10mZ3Q7fSBhcnIgICAgICAgIEVDTUEgQXJyYXkuJiN4ZDsKICAgKiBAcGFyYW0gIHtib29sZWFufSAgICAgICAgICBpZ25vcmVjYXNlICAgQ2hhbmdlcyBzdHJpbmcgY29tcGFyaXNvbiB0byBjYXNlIGluc2Vuc2l0aXZlLiYjeGQ7CiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgYWxzbyBjYXVzZXMgdGhlIGNhc2luZyBvZiB0aGUgcmVzdWx0cyB3aWxsIG1hdGNoIHRoZSBjYXNpbmcgb2YgdGhlaXImI3hkOwogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCB0aW1lIGFwcGVhcmluZyBpbiB0aGUgbGlzdCBwcm92aWRlZC4mI3hkOwogICAqJiN4ZDsKICAgKiBAdHlwZSB7QXJyYXkuJmx0O3N0cmluZ1tdJmd0O30mI3hkOwogICAqIEByZXR1cm4ge3N0cmluZ1tdfSBFQ01BIEFycmF5IG9mIGludGVyc2VjdGluZyByZXN1bHRzLiYjeGQ7CiAgICovJiN4ZDsKICBmdW5jdGlvbiBpbnRlcnNlY3RBcnJheXMoIGFyciwgaWdub3JlQm9vbCApIHsmI3hkOwogICAgdmFyIGZuYW1lLCByZXN1bHQ7JiN4ZDsKICAgIGZuYW1lID0gJ2ludGVyc2VjdEFycmF5cygpOiAnOyYjeGQ7CiAgICB0cnkgeyYjeGQ7CiAgICAgIGlmICggYXJyLmxlbmd0aCA9PT0gMCApIHsmI3hkOwogICAgICAgIHJldHVybiBsb2dlcnJvciggZm5hbWUgKyAnIk11c3QgaGF2ZSBhcnJheSBlbGVtZW50cyB0byBjb21wYXJlJyApOyYjeGQ7CiAgICAgIH0mI3hkOwogICAgICBpZiAoIGFyci5sZW5ndGggPT09IDEgKSB7JiN4ZDsKICAgICAgICByZXR1cm4gYXJyWyAwIF07JiN4ZDsKICAgICAgfSBlbHNlIHsmI3hkOwogICAgICAgIHJlc3VsdCA9IFsgbnVsbCwgbnVsbCwgYXJyWyAwIF0gXTsmI3hkOwogICAgICAgIGFyci5mb3JFYWNoKGZ1bmN0aW9uICgga2V5LCBpbmQgKSB7JiN4ZDsKICAgICAgICAgIHZhciBuZXh0ID0gaW5kICsgMTsmI3hkOwogICAgICAgICAgaWYgKCBuZXh0ICZsdDsgYXJyLmxlbmd0aCApIHsmI3hkOwogICAgICAgICAgICByZXN1bHQgPSBQUkQudXRpbC5jb21wYXJlKCByZXN1bHRbIDIgXSwgYXJyWyBuZXh0IF0sIGlnbm9yZUJvb2wgKTsmI3hkOwogICAgICAgICAgfSYjeGQ7CiAgICAgICAgfSk7JiN4ZDsKICAgICAgICByZXR1cm4gcmVzdWx0WyAyIF07JiN4ZDsKICAgICAgfSYjeGQ7CiAgICB9IGNhdGNoICggZSApIHsmI3hkOwogICAgICByZXR1cm4gbG9nZXJyb3IoIGZuYW1lICsgJ011c3Qgc3VibWl0IGFycmF5IGFzIHBhcmFtZXRlci4gRXJyb3I6ICcgKyBlLm1lc3NhZ2UgKTsmI3hkOwogICAgfSYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiAoRW5naW5lKSBQYXJzZXMgYW4gdW5pZGltZW5zaW9uYWwgRUNNQSBBcnJheSBvciBKYXZhIFZlY3RvciBhbmQgcmV0dXJucyB0aGUgc2FtZSB0eXBlIG9mIG9iamVjdCB3aXRoIG9ubHkgdW5pcXVlIGVudHJpZXMuJmx0O2JyLyZndDsmI3hkOwogICAqIChGb3JtKSBQYXJzZXMgYW4gdW5pZGltZW5zaW9uYWwgRUNNQSBBcnJheSBhbmQgcmV0dXJucyB0aGUgc2FtZSB0eXBlIG9mIG9iamVjdCB3aXRoIG9ubHkgdW5pcXVlIGVudHJpZXMuJiN4ZDsKICAgKiYjeGQ7CiAgICogQG1lbWJlcm9mIFBSRC51dGlsJiN4ZDsKICAgKiBAc2luY2UgMS4wLjImI3hkOwogICAqJiN4ZDsKICAgKiBAcGFyYW0gIHsoc3RyaW5nW118amF2YS51dGlsLlZlY3Rvcil9IG9iaiAgICAgICAgICBFQ01BIEFycmF5IG9yIEphdmEgVmVjdG9yLiYjeGQ7CiAgICogQHBhcmFtICB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgICBpZ25vcmVjYXNlICAgQ2hhbmdlcyBzdHJpbmcgY29tcGFyaXNvbiB0byBjYXNlIGluc2Vuc2l0aXZlLiYjeGQ7CiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBhbHNvIGNhdXNlcyB0aGUgY2FzaW5nIG9mIHRoZSByZXN1bHRzIHdpbGwgbWF0Y2ggdGhlIGNhc2luZyBvZiB0aGVpciYjeGQ7CiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgdGltZSBhcHBlYXJpbmcgaW4gdGhlIGxpc3QgcHJvdmlkZWQuJiN4ZDsKICAgKiYjeGQ7CiAgICogQHR5cGUgeyhzdHJpbmdbXXxqYXZhLnV0aWwuVmVjdG9yKX0mI3hkOwogICAqIEByZXR1cm4geyhzdHJpbmdbXXxqYXZhLnV0aWwuVmVjdG9yKX0gRUNNQSBBcnJheSBvciBKYXZhIFZlY3Rvci4gSWYgb2JqIGlzIG5vdCBhIHZhbGlkIHR5cGUgcmV0dXJucyBlbXB0eSBFQ01BIEFycmF5LiYjeGQ7CiAgICovJiN4ZDsKICBmdW5jdGlvbiB1bmlxdWUoIG9iaiAsIGlnbm9yZWNhc2UgKSB7JiN4ZDsKICAgIHZhciBleGlzdHMgPSB7fSwgcmVzID0gW10sIGNvbnZlcnRUb1ZlY3RvciwgaSwgY3VyciwgY29tcGFyZSwgZm5hbWU7JiN4ZDsKICAgIGZuYW1lID0gJ1VuaXF1ZSgpOiAnOyYjeGQ7CiAgICBpZiAoIG9iaiAhPSBudWxsICZhbXA7JmFtcDsgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgKSB7JiN4ZDsKICAgICAgLy8gQ29udmVydCBWZWN0b3IgdG8gQXJyYXkgc28gd2UgY2FuIGRlZHVwbGljYXRlIGJvdGggdXNpbmcgdGhlIHNhbWUgY29kZSYjeGQ7CiAgICAgIGlmICggd2hlcmUgPT09J2VuZ2luZScgJmFtcDsmYW1wOyBpc0phdmFWZWN0b3IoIG9iaiApICkgeyYjeGQ7CiAgICAgICAgb2JqID0gSmF2YVZlY3RvclRvRUNNQUFycmF5KCBvYmogKTsmI3hkOwogICAgICAgIGNvbnZlcnRUb1ZlY3RvciA9IHRydWU7JiN4ZDsKICAgICAgfSBlbHNlIHsmI3hkOwogICAgICAgIGNvbnZlcnRUb1ZlY3RvciA9IGZhbHNlOyYjeGQ7CiAgICAgIH0mI3hkOwogICAgICAvLyBEZWR1cGxpY2F0ZSBhcnJheSwgZ2VuZXJhdGUmI3hkOwogICAgICBpZiAoIG9iaiBpbnN0YW5jZW9mIEFycmF5ICkgeyYjeGQ7CiAgICAgICAgZm9yICggaSA9IDA7IGkgJmx0OyBvYmoubGVuZ3RoOyBpKysgKSB7JiN4ZDsKICAgICAgICAgIC8vIFVzaW5nIGNvbXBhcmUgZm9yIGNhc2Ugc2Vuc2l0aXZlIGFuZCBpbnNlbnRpdmUgY29tcGFyaXNzb24gd2hpbGUga2VlcGluZyBjdXJyIGFzIHRoZSBjdXJyZW50IHZhbHVlIGNvZXJjZWQgdG8gc3RyaW5nJiN4ZDsKICAgICAgICAgIGN1cnIgPSBTdHJpbmcoIG9ialsgaSBdICk7JiN4ZDsKICAgICAgICAgIGlmICggaWdub3JlY2FzZSA9PT0gdHJ1ZSApIHsmI3hkOwogICAgICAgICAgICBjb21wYXJlID0gY3Vyci50b0xvd2VyQ2FzZSgpOyYjeGQ7CiAgICAgICAgICB9IGVsc2UgeyYjeGQ7CiAgICAgICAgICAgIGNvbXBhcmUgPSBjdXJyOyYjeGQ7CiAgICAgICAgICB9JiN4ZDsKICAgICAgICAgIGlmICggISBleGlzdHMuaGFzT3duUHJvcGVydHkoIGNvbXBhcmUgKSApIHsmI3hkOwogICAgICAgICAgICByZXMucHVzaCggY3VyciApOyYjeGQ7CiAgICAgICAgICAgIGV4aXN0c1sgY29tcGFyZSBdID0gdHJ1ZTsgLy8gbWFya2luZyB0aGUgZW50cnkgYXMgYWxyZWFkeSBleGlzdGluZyBmb3IgZGVkdXBsaWNhdGlvbiBwdXJwb3NlcyYjeGQ7CiAgICAgICAgICB9JiN4ZDsKICAgICAgICB9JiN4ZDsKICAgICAgICAvLyBDb252ZXJ0IHJlc3VsdHMgYmFjayB0byBWZWN0b3IgaWYgdGhlIG9iaiBwYXNzZWQgaW4gd2FzIGEgamF2YS51dGlsLlZlY3RvciYjeGQ7CiAgICAgICAgaWYgKCB3aGVyZSA9PT0nZW5naW5lJyAmYW1wOyZhbXA7IGNvbnZlcnRUb1ZlY3RvciApIHsmI3hkOwogICAgICAgICAgcmVzID0gRUNNQUFycmF5VG9KYXZhVmVjdG9yKCByZXMgKTsmI3hkOwogICAgICAgIH0mI3hkOwogICAgICB9JiN4ZDsKICAgIH0mI3hkOwogICAgcmV0dXJuIHJlczsmI3hkOwogIH0mI3hkOwomI3hkOwogIC8qKiYjeGQ7CiAgICogKEVuZ2luZSBvbmx5KSBQYXJzZXMgdGhlIHJlc3VsdCBmcm9tIGZsb3dkYXRhLmdldE9iamVjdCBpbnRvIGFuIEFycmF5IG9mIHN0cmluZ3MgYW5kIEVDTUEgb2JqZWN0cy4mbHQ7YnIvJmd0OyYjeGQ7CiAgICogRWFjaCBET00gZWxlbWVudCBub2RlIHdpbGwgYmUgYW4gb2JqZWN0J3MgcHJvcGVydHkgbmFtZSwgYW5kIGVhY2ggcHJvcGVydHkgd2lsbCBjb250YWluJiN4ZDsKICAgKiBhbiBhcnJheSBvZiBpdGVtcy4gVGhvc2UgaXRlbXMgY2FtIGJlIHN0cmluZ3Mgb3Igb3RoZXIgb2JqZWN0cy4mI3hkOwogICAqIEBtZW1iZXJvZiBQUkQudXRpbCYjeGQ7CiAgICogQHNpbmNlIDEuMC4yJiN4ZDsKICAgKiYjeGQ7CiAgICogQHBhcmFtICB7amF2YS51dGlsLkFycmF5TGlzdH0gIGxpc3QgIEphdmEgb2JqZWN0IHJlc3VsdGluZyBmcm9tIGZsb3dkYXRhLmdldE9iamVjdCgpJiN4ZDsKICAgKiYjeGQ7CiAgICogQHR5cGUgeyhhcnJheS4mbHQ7KG9iamVjdHxzdHJpbmcpJmd0O3xudWxsKX0mI3hkOwogICAqIEByZXR1cm4geyhhcnJheS4mbHQ7KG9iamVjdHxzdHJpbmcpJmd0O3xudWxsKX0gRUNNQSBBcnJheSBvZiBvYmplY3RzIGFuZCBzdHJpbmcuIElmIGVycm9yIG9jY3VyIHJldHVybnMgbnVsbC4mI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gZ2V0T2JqZWN0MmFyciggbGlzdCwgb25lbHZsICkgeyYjeGQ7CiAgICB2YXIgcmVzLCBmbmFtZSwgaW5pdGlhbG5vZGUsIGN1cnJub2RlLCBub2RlbmFtZSwgY2hpbGRub2RlcywgcHJlcHJvY2VzcywgcmVtb3Zlb2JqOyYjeGQ7CiAgICBmbmFtZSA9ICdnZXRPYmplY3QyYXJyKCk6ICc7JiN4ZDsKICAgIHJlcyA9IG51bGw7IHJlbW92ZW9iaiA9IHRydWU7JiN4ZDsKJiN4ZDsKICAgIGlmICggbGlzdCA9PT0gbnVsbCB8fCAoISggdHlwZW9mIGxpc3QgPT09ICdvYmplY3QnICZhbXA7JmFtcDsgbGlzdC5nZXRDbGFzcygpID09ICdjbGFzcyBqYXZhLnV0aWwuQXJyYXlMaXN0JyApKSApIHsmI3hkOwogICAgICBsb2dlcnJvciggZm5hbWUgKyAnSW52YWxpZCBwYXJhbWV0ZXIgcmVjZWl2ZWQuIGxpc3QgbXVzdCBiZSB0aGUgcmVzdWx0IG9mIGEgZmxvd2RhdGEuZ2V0T2JqZWN0KCkgY2FsbC4nICk7JiN4ZDsKICAgICAgcmV0dXJuIHJlczsmI3hkOwogICAgfSYjeGQ7CiAgICAvLyBSZXRyaWV2ZXMgdGhlIGZpcnN0IEVsZW1lbnROU0ltcGwgbm9kZSBmcm9tIHRoZSBsaXN0JiN4ZDsKICAgIGlmICggbGlzdC5zaXplKCkgJmd0OyAwICkgeyYjeGQ7CiAgICAgIGluaXRpYWxub2RlID0gbGlzdC5nZXQoMCk7JiN4ZDsKICAgIH0mI3hkOwomI3hkOwogICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBub2RlcywgZ3JvdXAgZWxlbWVudCBjaGlsZCBub2RlcyBpbnRvIGFycmF5cyBhcyBwZXIgdGhlaXIgY29udGVudC4mI3hkOwogICAgaWYgKCBpbml0aWFsbm9kZSAhPSBudWxsICZhbXA7JmFtcDsgdHlwZW9mIGluaXRpYWxub2RlID09PSAnb2JqZWN0JyAmYW1wOyZhbXA7IGluaXRpYWxub2RlLmdldENsYXNzKCkgPT0gJ2NsYXNzIG9yZy5hcGFjaGUueGVyY2VzLmRvbS5FbGVtZW50TlNJbXBsJyApIHsmI3hkOwogICAgICBjdXJybm9kZSA9IGluaXRpYWxub2RlOyYjeGQ7CiAgICAgIHJlcyA9IFsge30gXTsmI3hkOwogICAgICBwcmVwcm9jZXNzID0ge307JiN4ZDsKICAgICAgd2hpbGUgKCBjdXJybm9kZSApIHsmI3hkOwogICAgICAgIC8vIFRleHQgbm9kZXMgYXJlIGFwcGVuZGVkIGFzIGlzIHRvIHRoZSBjdXJyZW50IGxldmVsJiN4ZDsKICAgICAgICBpZiAoIGN1cnJub2RlLmdldE5vZGVUeXBlKCkgPT0gZ2V0Tm9kZVR5cGVzLm5vZGV0eXBlLlRleHQgKSB7JiN4ZDsKICAgICAgICAgIGlmICggc2hvdWxkUHJvY2Vzc05vZGUoIGN1cnJub2RlICkgKSB7JiN4ZDsKICAgICAgICAgICAgZGVidWdtc2coIGZuYW1lICsgJ2ZvdW5kIHRleHQgbm9kZS4gZ2V0Tm9kZVZhbHVlKCk6ICInICsgY3Vycm5vZGUuZ2V0Tm9kZVZhbHVlKCkgKyAnIicgKTsmI3hkOwogICAgICAgICAgICByZXMucHVzaCggU3RyaW5nKCBjdXJybm9kZS5nZXROb2RlVmFsdWUoKSApICk7JiN4ZDsKICAgICAgICAgIH0mI3hkOwogICAgICAgIH0mI3hkOwogICAgICAgIC8vIEVsZW1lbnQgbm9kZXMgcmVxdWlyZSBncm91cGluZyBmb3IgZGVkdXBsaWNhdGlvbiBzaW5jZSB3ZSBjYW4gaGF2ZSAyIHNpYmxpbmcgZWxlbWVudHMgd2l0aCB0aGUgc2FtZSBub2RlIG5hbWUmI3hkOwogICAgICAgIGlmICggY3Vycm5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBnZXROb2RlVHlwZXMubm9kZXR5cGUuRWxlbWVudCApIHsmI3hkOwogICAgICAgICAgLy8gRGVkdXBsaWNhdGlvbiBvZiBub2RlIG5hbWVzJiN4ZDsKICAgICAgICAgIG5vZGVuYW1lID0gU3RyaW5nKCBjdXJybm9kZS5nZXROb2RlTmFtZSgpICk7JiN4ZDsKICAgICAgICAgIGRlYnVnbXNnKCBmbmFtZSArICdmb3VuZCBlbGVtZW50IG5vZGUgIicgKyBub2RlbmFtZSArICciJyApOyYjeGQ7CiAgICAgICAgICBpZiAoICEgcHJlcHJvY2Vzcy5oYXNPd25Qcm9wZXJ0eSggbm9kZW5hbWUgKSApIHsmI3hkOwogICAgICAgICAgICBwcmVwcm9jZXNzWyBub2RlbmFtZSBdID0gW107JiN4ZDsKICAgICAgICAgIH0mI3hkOwogICAgICAgICAgcHJlcHJvY2Vzc1sgbm9kZW5hbWUgXS5wdXNoKCBjdXJybm9kZSApOyYjeGQ7CiAgICAgICAgICByZW1vdmVvYmogPSBmYWxzZTsmI3hkOwogICAgICAgIH0mI3hkOwogICAgICAgIGN1cnJub2RlID0gY3Vycm5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsmI3hkOwogICAgICB9JiN4ZDsKJiN4ZDsKICAgICAgLy8gSXRlcmF0ZXMgdGhlIHByb3BlcnRpZXMgYW5kIHNldCB0aGVtIHVwIHVzaW5nIGZsb3dkYXRhMm9iaiYjeGQ7CiAgICAgIGZvciAoIG5vZGVuYW1lIGluIHByZXByb2Nlc3MgKSB7JiN4ZDsKICAgICAgICByZXNbIDAgXVsgbm9kZW5hbWUgXSA9IGZsb3dkYXRhMm9iaiggcHJlcHJvY2Vzc1sgbm9kZW5hbWUgXSApOyYjeGQ7CiAgICAgIH0mI3hkOwomI3hkOwogICAgICBpZiAoIHJlbW92ZW9iaiApIHsmI3hkOwogICAgICAgIHJlcyA9IHJlcy5zcGxpY2UoIDEgKTsmI3hkOwogICAgICB9JiN4ZDsKICAgIH0mI3hkOwomI3hkOwogICAgcmV0dXJuIHJlczsmI3hkOwogIH0mI3hkOwomI3hkOwogIC8qKiYjeGQ7CiAgICogKEVuZ2luZSBvbmx5KSBDaGVjayBpZiB3ZSBzaG91bGQgc2tpcCBwcm9jZXNzaW5nIGEgdGV4dCBub2RlLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBVc2luZyB4ZXJjZXMgbGlicmFyaWVzIHRvIHBhcnNlZmxvd2RhdGEgc2libGluZy9jaGlsZCBub2RlcyB5aWVsZHMgc2V2ZXJhbCB0ZXh0IG5vZGVzIHdpdGggXCAoY2hhckNvZGVBdCgwKSBvZiAxMCkmI3hkOwogICAqIHRoYXQgZG8gbm90IGFwcGVhciB3aGVuIGxvb2tpbmcgYXQgZmxvd2RhdGEgeG1sIGluIHRoZSBtZXRheG1sIGZpZWxkIG9mIHRoZSBhZmRvY3VtZW50IHRhYmxlLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBHaXZlbiB0aGF0IGJlaGF2aW9yIHdlIG5lZWQgdG8gc3RyaXAgdGhvc2UgdGV4dCBub2RlcyBvdXQgb2Ygb3VyIHJlc3VsdHMuJiN4ZDsKICAgKiBAc2luY2UgMS4wLjImI3hkOwogICAqIEBwcml2YXRlJiN4ZDsKICAgKiBAcGFyYW0gIHsob3JnLmFwYWNoZS54ZXJjZXMuZG9tLkVsZW1lbnROU0ltcGx8b3JnLmFwYWNoZS54ZXJjZXMuZG9tLlRleHRJbXBsKX0gIG5vZGUgICAgIEphdmEgeGVyY2VzIG5vZGUmI3hkOwogICAqIEB0eXBlIHtib29sZWFufSYjeGQ7CiAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB3ZSBzaG91bGQgcHJvY2VzcyB0aGUgbm9kZSwgZmFsc2Ugb3RoZXJ3aXNlLiYjeGQ7CiAgICovJiN4ZDsKICBmdW5jdGlvbiBzaG91bGRQcm9jZXNzTm9kZSggbm9kZSApIHsmI3hkOwogICAgaWYgKCBub2RlID09PSBudWxsICkgeyYjeGQ7CiAgICAgIHJldHVybiBmYWxzZTsmI3hkOwogICAgfSYjeGQ7CiAgICBpZiAoIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JyAmYW1wOyZhbXA7IG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBnZXROb2RlVHlwZXMubm9kZXR5cGUuRWxlbWVudCApIHsmI3hkOwogICAgICByZXR1cm4gdHJ1ZTsmI3hkOwogICAgfSYjeGQ7CiAgICBpZiAoIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JyAmYW1wOyZhbXA7IG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBnZXROb2RlVHlwZXMubm9kZXR5cGUuVGV4dCApIHsmI3hkOwogICAgICBpZiAoIG5vZGUuZ2V0Tm9kZVZhbHVlKCkubGVuZ3RoID09PSAxICZhbXA7JmFtcDsgbm9kZS5nZXROb2RlVmFsdWUoKS5jaGFyQ29kZUF0KCAwICkgPT09IDEwICkgeyYjeGQ7CiAgICAgICAgcmV0dXJuIGZhbHNlOyYjeGQ7CiAgICAgIH0gZWxzZSB7JiN4ZDsKICAgICAgICByZXR1cm4gdHJ1ZTsmI3hkOwogICAgICB9JiN4ZDsKICAgIH0mI3hkOwogICAgcmV0dXJuIGZhbHNlOyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiAoRW5naW5lIG9ubHkpIEl0ZXJhdGVzIHJlY3Vyc2l2ZWx5IHRocm91Z2ggRE9NIG5vZGVzIGZyb20gZmxvd2RhdGEmI3hkOwogICAqIEBzaW5jZSAxLjAuMiYjeGQ7CiAgICogQHByaXZhdGUmI3hkOwogICAqIEBwYXJhbSAge29yZy5hcGFjaGUueGVyY2VzLmRvbS5FbGVtZW50TlNJbXBsW119ICBub2RlICAgICBKYXZhIHhlcmNlcyBub2RlIG9yIEVDTUEgYXJyYXkgb2Ygbm9kZXMmI3hkOwogICAqIEB0eXBlIHthcnJheS4mbHQ7KG9iamVjdHxzdHJpbmcpJmd0O30mI3hkOwogICAqIEByZXR1cm4ge2FycmF5LiZsdDsob2JqZWN0fHN0cmluZykmZ3Q7fSBFQ01BIEFycmF5IG9mIG9iamVjdHMgYW5kIHN0cmluZ3MuJiN4ZDsKICAgKi8mI3hkOwogIGZ1bmN0aW9uIGZsb3dkYXRhMm9iaiggbm9kZSApIHsmI3hkOwogICAgdmFyIGZuYW1lLCByZXMsIGksIGosIG5vZGVuYW1lLCBjaGlsZG5vZGVzLCBjaGlsZG5vZGUsIGl0ZXJhdGUsIHJlbW92ZW9iajsmI3hkOwogICAgZm5hbWUgPSAnZmxvd2RhdGEyb2JqKCk6ICc7JiN4ZDsKICAgIHJlcyA9IFsgJycgXTsgaXRlcmF0ZSA9IHt9OyByZW1vdmVvYmogPSB0cnVlOyYjeGQ7CiAgICAvLyBBcnJheSBvZiBub2RlcywgIHByb2Nlc3MgdGhlaXIgY2hpbGQgbm9kZXMgb25seSBhbmQgcmV0dXJuIGFycmF5IHdpdGggMSBvYmplY3QgYW5kIDEgb3IgbW9yZSB0ZXh0IG5vZGVzJiN4ZDsKICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgYXJyYXkgb2YgcGFyZW50IG5vZGVzIHRoYXQgc2hvdWxkIGhhdmUgdGhlIHNhbWUgZWxlbWVudCBuYW1lJiN4ZDsKICAgIGlmICggbm9kZSBpbnN0YW5jZW9mIEFycmF5ICkgeyYjeGQ7CiAgICAgIGRlYnVnbXNnKCBmbmFtZSArICdSZWNlaXZlZCBhcnJheSBmb3IgcHJvY2Vzc2luZywgbGVuZ3RoOiAnICsgbm9kZS5sZW5ndGggKTsmI3hkOwogICAgICByZXMgPSBbIHt9IF07JiN4ZDsKICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBwYXJlbnQgbm9kZXMgdG8gY29sbGF0ZSBjaGlsZCBub2RlcyB3aXRoIHNhbWUgZWxlbWVudCBuYW1lJiN4ZDsKICAgICAgZm9yICggaSA9IDA7IGkgJmx0OyBub2RlLmxlbmd0aDsgaSsrICkgeyYjeGQ7CiAgICAgICAgaWYgKCBub2RlWyBpIF0uaGFzQ2hpbGROb2RlcygpICkgeyYjeGQ7CiAgICAgICAgICBkZWJ1Z21zZyggZm5hbWUgKyAnbm9kZSBhdCBwb3NpdGlvbiAnICsgaSArICcgaGFzIGNoaWxkIG5vZGVzJyApOyYjeGQ7CiAgICAgICAgICBjaGlsZG5vZGVzID0gbm9kZVsgaSBdLmdldENoaWxkTm9kZXMoKTsmI3hkOwogICAgICAgICAgLy8gSXRlcmF0ZXMgdGhyb3VnaCBjaGlsZCBub2RlcyBvZiBhIHNpbmdsZSBwYXJlbnQgbm9kZSYjeGQ7CiAgICAgICAgICBmb3IgKCBqID0gMDsgaiAmbHQ7IGNoaWxkbm9kZXMuZ2V0TGVuZ3RoKCk7IGorKyApIHsmI3hkOwogICAgICAgICAgICBkZWJ1Z21zZyggZm5hbWUgKyAnYXJyYXkgaW5kZXggJyArIGkgKyAnOiBwcm9jZXNzaW5nIGNoaWxkIG5vZGUgJyArIGogKTsmI3hkOwogICAgICAgICAgICBjaGlsZG5vZGUgPSBjaGlsZG5vZGVzLml0ZW0oIGogKTsmI3hkOwogICAgICAgICAgICAvLyBUZXh0IG5vZGVzIGFyZSBhcHBlbmRlZCBhcyBpcyB0byB0aGUgY3VycmVudCBsZXZlbCYjeGQ7CiAgICAgICAgICAgIGlmICggY2hpbGRub2RlLmdldE5vZGVUeXBlKCkgPT0gZ2V0Tm9kZVR5cGVzLm5vZGV0eXBlLlRleHQgKSB7JiN4ZDsKICAgICAgICAgICAgICBpZiAoIHNob3VsZFByb2Nlc3NOb2RlKCBjaGlsZG5vZGUgKSApIHsmI3hkOwogICAgICAgICAgICAgICAgZGVidWdtc2coIGZuYW1lICsgJ0ZvdW5kIHRleHQgbm9kZS4gZ2V0Tm9kZVZhbHVlKCk6ICInICsgY2hpbGRub2RlLmdldE5vZGVWYWx1ZSgpICsgJyInICk7JiN4ZDsKICAgICAgICAgICAgICAgIHJlcy5wdXNoKCBTdHJpbmcoIGNoaWxkbm9kZS5nZXROb2RlVmFsdWUoKSApICk7JiN4ZDsKICAgICAgICAgICAgICB9JiN4ZDsKICAgICAgICAgICAgfSYjeGQ7CiAgICAgICAgICAgIC8vIEVsZW1lbnQgbm9kZXMgcmVxdWlyZSBncm91cGluZyBmb3IgZGVkdXBsaWNhdGlvbiBzaW5jZSB3ZSBjYW4gaGF2ZSAyIHNpYmxpbmcgZWxlbWVudHMgd2l0aCB0aGUgc2FtZSBub2RlIG5hbWUmI3hkOwogICAgICAgICAgICBpZiAoIGNoaWxkbm9kZS5nZXROb2RlVHlwZSgpID09IGdldE5vZGVUeXBlcy5ub2RldHlwZS5FbGVtZW50ICkgeyYjeGQ7CiAgICAgICAgICAgICAgLy8gRGVkdXBsaWNhdGlvbiBvZiBub2RlIG5hbWVzJiN4ZDsKICAgICAgICAgICAgICBub2RlbmFtZSA9IFN0cmluZyggY2hpbGRub2RlLmdldE5vZGVOYW1lKCkgKTsmI3hkOwogICAgICAgICAgICAgIGRlYnVnbXNnKCBmbmFtZSArICdmb3VuZCBlbGVtZW50IG5vZGUgIicgKyBub2RlbmFtZSArICciJyApOyYjeGQ7CiAgICAgICAgICAgICAgaWYgKCAhIGl0ZXJhdGUuaGFzT3duUHJvcGVydHkoIG5vZGVuYW1lICkgKSB7JiN4ZDsKICAgICAgICAgICAgICAgIGl0ZXJhdGVbIG5vZGVuYW1lIF0gPSBbXTsmI3hkOwogICAgICAgICAgICAgIH0mI3hkOwogICAgICAgICAgICAgIGl0ZXJhdGVbIG5vZGVuYW1lIF0ucHVzaCggY2hpbGRub2RlICk7JiN4ZDsKICAgICAgICAgICAgICByZW1vdmVvYmogPSBmYWxzZTsmI3hkOwogICAgICAgICAgICB9JiN4ZDsKICAgICAgICAgIH0gLy8gRmluaXNoZWQgcHJvY2Vzc2luZyBhIHNpbmdsZSBwYXJlbnQgbm9kZSdzIGNoaWxkIG5vZGVzJiN4ZDsKICAgICAgICB9JiN4ZDsKICAgICAgfSAvLyBGaW5pc2hlZCBwcm9jZXNzaW5nIGFsbCBwYXJlbnQgbm9kZXMmI3hkOwomI3hkOwogICAgICAvKiBBdCB0aGlzIHBvaW50IHdlJ3ZlIGdyb3VwZWQgYWxsIHRoZSBjaGlsZG5vZGVzIHRoYXQgY29udGFpbiB0aGUgc2FtZSBuYW1lcyYjeGQ7CiAgICAgICAgYWNyb3NzIGFsbCBwYXJlbnQgbm9kZXMgdGhhdCBjb250YWluZWQgdGhlIHNhbWUgbmFtZS4mI3hkOwogICAgICAgIFdlIGNhbiBub3cgcGFyc2UgdGhvc2UgcmVzdWxzIHJlY3Vyc2l2ZWx5ICovJiN4ZDsKJiN4ZDsKICAgICAgLy8gSXRlcmF0ZXMgdGhlIHByb3BlcnRpZXMgYW5kIHNldCB0aGVtIHVwIHJlY3Vyc2l2ZSBjYWxsaW5nIGZsb3dkYXRhMm9iaiBhZ2FpbiYjeGQ7CiAgICAgIGZvciAoIG5vZGVuYW1lIGluIGl0ZXJhdGUgKSB7JiN4ZDsKICAgICAgICByZXNbIDAgXVsgbm9kZW5hbWUgXSA9IGZsb3dkYXRhMm9iaiggaXRlcmF0ZVsgbm9kZW5hbWUgXSApOyYjeGQ7CiAgICAgIH0mI3hkOwomI3hkOwogICAgICBpZiAoIHJlbW92ZW9iaiApIHsmI3hkOwogICAgICAgIHJlcyA9IHJlcy5zcGxpY2UoIDEgKTsmI3hkOwogICAgICB9JiN4ZDsKICAgIH0mI3hkOwogICAgcmV0dXJuIHJlczsmI3hkOwogIH0mI3hkOwomI3hkOwogIC8qKiYjeGQ7CiAgICogKEVuZ2luZSBvbmx5KSBSZXR1cm5zIGFuIG9iamVjdCB0byBiZSB1c2VkIHRvIGNoZWNrIHdoYXQgbm9kZSB0eXBlIHdhcyByZXR1cm5lZCBmcm9tIG5vZGUuZ2V0Tm9kZVR5cGUoKS4mI3hkOwogICAqIEBzaW5jZSAxLjAuMiYjeGQ7CiAgICogQHByaXZhdGUmI3hkOwogICAqIEB0eXBlIHtvYmplY3R9JiN4ZDsKICAgKiBAcmV0dXJuIHtvYmplY3R9IEVDTUEgT2JqZWN0IHdob3NlIHByb3BlcnRpZXMgYW5kIHRoZWlyIHZhbHVlcyBtYXAgdG8gdGhlIHBvc3NpYmxlIHJlc3VsdHMgb2Ygbm9kZS5nZXROb2RlVHlwZSgpLiYjeGQ7CiAgICovJiN4ZDsKICBpZiAoIHdoZXJlID09PSAnZW5naW5lJyApIHsmI3hkOwogICAgLy8gQXR0YWNoaW5nIHRvIHRoZSBmdW5jdGlvbiBvbiBsb2FkIHRpbWUgc28gdGhhdCBpdCBvbmx5IHJ1bnMgb25jZS4mI3hkOwogICAgZ2V0Tm9kZVR5cGVzLm5vZGV0eXBlID0gZ2V0Tm9kZVR5cGVzKCk7JiN4ZDsKICB9JiN4ZDsKICBmdW5jdGlvbiBnZXROb2RlVHlwZXMoKSB7JiN4ZDsKICAgIHZhciBub2RldHlwZSA9IHt9OyYjeGQ7CiAgICBub2RldHlwZS5BdHRyID0gUGFja2FnZXMub3JnLnczYy5kb20uTm9kZS5BVFRSSUJVVEVfTk9ERTsmI3hkOwogICAgbm9kZXR5cGUuQ0RBVEFTZWN0aW9uID0gUGFja2FnZXMub3JnLnczYy5kb20uTm9kZS5DREFUQV9TRUNUSU9OX05PREU7JiN4ZDsKICAgIG5vZGV0eXBlLkNvbW1lbnQgPSBQYWNrYWdlcy5vcmcudzNjLmRvbS5Ob2RlLkNPTU1FTlRfTk9ERTsmI3hkOwogICAgbm9kZXR5cGUuRG9jdW1lbnRGcmFnbWVudCA9IFBhY2thZ2VzLm9yZy53M2MuZG9tLk5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERTsmI3hkOwogICAgbm9kZXR5cGUuRG9jdW1lbnQgPSBQYWNrYWdlcy5vcmcudzNjLmRvbS5Ob2RlLkRPQ1VNRU5UX05PREU7JiN4ZDsKICAgIG5vZGV0eXBlLkRvY3VtZW50VHlwZSA9IFBhY2thZ2VzLm9yZy53M2MuZG9tLk5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFOyYjeGQ7CiAgICBub2RldHlwZS5FbGVtZW50ID0gUGFja2FnZXMub3JnLnczYy5kb20uTm9kZS5FTEVNRU5UX05PREU7JiN4ZDsKICAgIG5vZGV0eXBlLkVudGl0eSA9IFBhY2thZ2VzLm9yZy53M2MuZG9tLk5vZGUuRU5USVRZX05PREU7JiN4ZDsKICAgIG5vZGV0eXBlLkVudGl0eVJlZmVyZW5jZSA9IFBhY2thZ2VzLm9yZy53M2MuZG9tLk5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFOyYjeGQ7CiAgICBub2RldHlwZS5Ob3RhdGlvbiA9IFBhY2thZ2VzLm9yZy53M2MuZG9tLk5vZGUuTk9UQVRJT05fTk9ERTsmI3hkOwogICAgbm9kZXR5cGUuUHJvY2Vzc2luZ0luc3RydWN0aW9uID0gUGFja2FnZXMub3JnLnczYy5kb20uTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU7JiN4ZDsKICAgIG5vZGV0eXBlLlRleHQgPSBQYWNrYWdlcy5vcmcudzNjLmRvbS5Ob2RlLlRFWFRfTk9ERTsmI3hkOwogICAgcmV0dXJuIG5vZGV0eXBlOyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiAoRW5naW5lIG9ubHkpIENvbnZlcnRzIGEgdW5pZGltZW5zaW9uYWwgSmF2YSBWZWN0b3Igd2hvc2UgZW50cmllcyBhcmUgc3RyaW5ncyB0byBhbiBFQ01BIEFycmF5LiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL2FwaS9qYXZhL3V0aWwvVmVjdG9yLmh0bWwmI3hkOwogICAqJiN4ZDsKICAgKiBAcGFyYW0gIHtqYXZhLnV0aWwuVmVjdG9yfSB2ICAgSmF2YSBWZWN0b3IuJiN4ZDsKICAgKiYjeGQ7CiAgICogQG1lbWJlcm9mIFBSRC51dGlsJiN4ZDsKICAgKiBAc2luY2UgMS4wLjAmI3hkOwogICAqJiN4ZDsKICAgKiBAdHlwZSB7c3RyaW5nW119JiN4ZDsKICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0gRUNNQSBhcnJheS4mI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gSmF2YVZlY3RvclRvRUNNQUFycmF5KCB2ICkgeyYjeGQ7CiAgICB2YXIgaXQsIHJlcyA9IFtdLCBmbmFtZTsmI3hkOwogICAgZm5hbWUgPSAnSmF2YVZlY3RvclRvRUNNQUFycmF5KCk6ICc7JiN4ZDsKICAgIGlmICggd2hlcmUgIT09ICdlbmdpbmUnICkgeyYjeGQ7CiAgICAgIGxvZ2Vycm9yKCBmbmFtZSArICdjYW4gb25seSBiZSB1c2VkIGluIHRoZSB3b3JrZmxvdyBlbmdpbmUuJyApOyYjeGQ7CiAgICAgIHJldHVybjsmI3hkOwogICAgfSYjeGQ7CiAgICBpZiAoIHYgIT0gbnVsbCAmYW1wOyZhbXA7IHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmYW1wOyZhbXA7IHYuc2l6ZSgpICZndDsgMCApIHsmI3hkOwogICAgICB0cnkgeyYjeGQ7CiAgICAgICAgaXQgPSB2Lml0ZXJhdG9yKCk7JiN4ZDsKICAgICAgICB3aGlsZSggaXQuaGFzTmV4dCgpICkgeyYjeGQ7CiAgICAgICAgICByZXMucHVzaCggU3RyaW5nKCBpdC5uZXh0KCkgKSApOyYjeGQ7CiAgICAgICAgfSYjeGQ7CiAgICAgIH0gY2F0Y2goIGUgKSB7JiN4ZDsKICAgICAgICBsb2dlcnJvciggZm5hbWUgKyAnRXJyb3IgY29udmVydGluZyBWZWN0b3IgaW50byBBcnJheTogJyArIGUubWVzc2FnZSApOyYjeGQ7CiAgICAgIH0mI3hkOwogICAgfSYjeGQ7CiAgICByZXR1cm4gcmVzOyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiAoRW5naW5lIG9ubHkpIENvbnZlcnRzIGEgdW5pZGltZW5zaW9uYWwgRUNNQSBhcnJheSB3aG9zZSBlbnRyaWVzIGFyZSBzdHJpbmdzIHRvIGEgSmF2YSBWZWN0b3IuJmx0O2JyLyZndDsmI3hkOwogICAqIGh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvYXBpL2phdmEvdXRpbC9WZWN0b3IuaHRtbCYjeGQ7CiAgIComI3hkOwogICAqIEBtZW1iZXJvZiBQUkQudXRpbCYjeGQ7CiAgICogQHNpbmNlIDEuMC4wJiN4ZDsKICAgKiYjeGQ7CiAgICogQHBhcmFtICB7c3RyaW5nW119IGFyciAgIEVDTUEgYXJyYXkuJiN4ZDsKICAgKiYjeGQ7CiAgICogQHR5cGUge2phdmEudXRpbC5WZWN0b3J9JiN4ZDsKICAgKiBAcmV0dXJuIHtqYXZhLnV0aWwuVmVjdG9yfSBKYXZhIFZlY3Rvci4mI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gRUNNQUFycmF5VG9KYXZhVmVjdG9yKCBhcnIgKSB7JiN4ZDsKICAgIHZhciBpLCByZXMsIGZuYW1lOyYjeGQ7CiAgICBmbmFtZSA9ICdFQ01BQXJyYXlUb0phdmFWZWN0b3IoKTogJzsmI3hkOwogICAgaWYgKCB3aGVyZSAhPT0gJ2VuZ2luZScgKSB7JiN4ZDsKICAgICAgbG9nZXJyb3IoIGZuYW1lICsgJ2NhbiBvbmx5IGJlIHVzZWQgaW4gdGhlIHdvcmtmbG93IGVuZ2luZS4nICk7JiN4ZDsKICAgICAgcmV0dXJuOyYjeGQ7CiAgICB9JiN4ZDsKICAgIHRyeSB7JiN4ZDsKICAgICAgcmVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsmI3hkOwogICAgICBmb3IgKCBpID0gMDsgaSAmbHQ7IGFyci5sZW5ndGg7IGkrKyApIHsmI3hkOwogICAgICAgIHJlcy5hZGQoIEpTdHJpbmcoIGFyclsgaSBdICkgKTsmI3hkOwogICAgICB9JiN4ZDsKICAgICAgcmV0dXJuIHJlczsmI3hkOwogICAgfSBjYXRjaCggZSApIHsmI3hkOwogICAgICBsb2dlcnJvciggZm5hbWUgKyAnRXJyb3IgY29udmVydGluZyBBcnJheSBpbnRvIFZlY3RvcjogJyArIGUubWVzc2FnZSApOyYjeGQ7CiAgICB9JiN4ZDsKICB9JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIFBlcmZvcm1zIGFuIElEVmF1bHQuZ2V0IGFuZCByZXR1cm5zIGFuIEVDTUEgYXJyYXkgd2l0aCB0aGUgcmVzdWx0LiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBSZWZhY3RvcmVkIG9uIHYxLjAuNCB0byByZXBsYWNlIHRoZSA0dGggb3B0aW9uYWwgcGFyYW1ldGVyIGZyb20gSURWYXVsdCBpbmplY3Rpb24gdG8gYSBmb3JtJ3MgZmllbGQgbmFtZS4mbHQ7YnIvJmd0OyYjeGQ7CiAgICogVGhpcyBjaGFuZ2UgY291bGQgYnJlYWsgZm9ybXMgdXNpbmcgcHJpb3IgdmVyc2lvbnMsIHBsZWFzZSBkb3VibGUgY2hlY2sgeW91ciBmb3JtIGNvZGUgYmVmb3JlIG1vdmluZyB0byB2MS4wLjQuJiN4ZDsKICAgKiYjeGQ7CiAgICogQG1lbWJlcm9mIFBSRCYjeGQ7CiAgICogQHNpbmNlIDEuMC4wJiN4ZDsKICAgKiYjeGQ7CiAgICogQHBhcmFtICB7c3RyaW5nfSAgbGRhcGRuICAgICAgIExEQVAgRnVsbHkgRGlzdGluZ3Vpc2VkIG5hbWUgb2YgdGhlIGVEaXJlY3Rvcnkgb2JqZWN0IHRvIGJlIHF1ZXJpZWQuJiN4ZDsKICAgKiBAcGFyYW0gIHtzdHJpbmd9ICBlbnRrZXkgICAgICAgREFMIGVudGl0eSBrZXkuJiN4ZDsKICAgKiBAcGFyYW0gIHtzdHJpbmd9ICBhdHRya2V5ICAgICAgREFMIGF0dHJpYnV0ZSBrZXkuIEF0dHJyaWJ1dGUgbXVzdCBiZSBjb25maWd1cmVkIHVuZGVyIHRoZSBEQUwgZW50aXR5LiYjeGQ7CiAgICogQHBhcmFtICB7c3RyaW5nPX0gW2ZpZWxkbmFtZV0gIChmb3JtIG1vZGUgb25seSkgTmFtZSBvZiB0aGUgZmllbGQgdG8gYmUgYXV0by1wb3B1bGF0ZWQgYnkgdGhlIGZ1bmN0aW9uLiYjeGQ7CiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIGZpZWxkIG5hbWUgZG9lcyBub3QgZXhpc3QgdGhlIGZvcm0gaXRzZWxmIHdpbGwgcHJlc2VudCB0aGUgZXJyb3I6JiN4ZDsKICAgKiAiQW4gZXJyb3IgJ0ZpZWxkIGF2b2NhZG8gbm90IGZvdW5kIG9yIG5vdCBpbnN0YW50aWF0ZWQgeWV0Licgd2FzIGVuY291bnRlcmVkIHdoaWxlIGV4ZWN1dGluZyB0aGUgc2NyaXB0ICdpbiBJRFZhdWx0LmdldCgpJyIuJiN4ZDsKICAgKiYjeGQ7CiAgICogQHR5cGUge3N0cmluZ1tdfSYjeGQ7CiAgICogQHJldHVybiB7c3RyaW5nW119IEVDTUEgYXJyYXkgd2l0aCB0aGUgcmVzdWx0cy4gRW1wdHkgaWYgSURWYXVsdC5nZXQgcmV0dXJuZWQgbnVsbCwgYXJyYXkgd2l0aCBvbmUgb3IgbW9yZSBlbGVtZW50cyBvdGhlcndpc2UuJiN4ZDsKICAgKi8mI3hkOwogIGZ1bmN0aW9uIElEVmdldCggbGRhcGRuLCBlbnRrZXksIGF0dHJrZXksIGZpZWxkbmFtZSApIHsmI3hkOwogICAgLy8gVmFyaWFibGUgZGVjbGFyYXRpb24uIEtlZXAgYWxsIHRoZSBkZWNsYXJhdGlvbnMgdG9nZXRoZXIuJiN4ZDsKICAgIHZhciBxcmVzID0gW107JiN4ZDsKICAgIHZhciBnYXR0ciwgZ2F0dHJWLCBlcnJtc2csIGZuYW1lOyYjeGQ7CiAgICBmbmFtZSA9ICdJRFZnZXQoKTogJzsmI3hkOwogICAgLy8gQWRqdXN0aW5nIGZ1bmN0aW9uIGlucHV0IHZhbHVlcyBiYXNlZCBvbiB3aGVyZSBpdCBpcyBiZWluZyBleGVjdXRlZC4mI3hkOwogICAgaWYgKCB3aGVyZSA9PT0gJ2VuZ2luZScgKSB7JiN4ZDsKICAgICAgSURWb2JqID0gSURWYXVsdDsmI3hkOwogICAgfSYjeGQ7CiAgICBpZiAoIHdoZXJlID09PSAnZm9ybScgKSB7JiN4ZDsKICAgICAgaWYgKCBJRE1BUFBTLklEVmF1bHQgIT09IG51bGwgKSB7JiN4ZDsKICAgICAgICBJRFZvYmogPSBJRE1BUFBTLklEVmF1bHQ7JiN4ZDsKICAgICAgfSBlbHNlIHsmI3hkOwogICAgICAgIGxvZ2Vycm9yKCBmbmFtZSArICdwbGVhc2UgdXNlIFBSRC5pbml0KCkgd2l0aCBhdCBsZWFzdCBJRFZhdWx0IGFzIGEgcGFyYW1ldGVyIHRvIGluaXRpYWxpemUgdGhlIG1hbmRhdG9yeSByZWZlcmVuY2UgdG8gdGhlIHNhbWUuIEFib3J0aW5nLicgKTsmI3hkOwogICAgICAgIHJldHVybiBxcmVzOyYjeGQ7CiAgICAgIH0mI3hkOwogICAgfSYjeGQ7CiAgICAvLyBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzLiYjeGQ7CiAgICBpZiAoIGxkYXBkbiA9PSBudWxsIHx8IGVudGtleSA9PSBudWxsIHx8IGF0dHJrZXkgPT0gbnVsbCApIHsmI3hkOwogICAgICBlcnJtc2cgPSBbXTsmI3hkOwogICAgICBlcnJtc2cucHVzaCggZm5hbWUgKyAnbWlzc2luZyBtYW5kYXRvcnkgcGFyYW1ldGVycy4nICk7JiN4ZDsKICAgICAgZXJybXNnLnB1c2goICdsZGFwZG46ICcgKyBTdHJpbmcoIGxkYXBkbiApICsgJywnICk7JiN4ZDsKICAgICAgZXJybXNnLnB1c2goICdlbnRrZXk6ICcgKyBTdHJpbmcoIGVudGtleSApICsgJywnICk7JiN4ZDsKICAgICAgZXJybXNnLnB1c2goICdhdHRya2V5OiAnICsgU3RyaW5nKCBhdHRya2V5ICkgKyAnLCcgKTsmI3hkOwogICAgICBsb2dlcnJvciggZXJybXNnLmpvaW4oICcgJyApICk7JiN4ZDsKICAgICAgcmV0dXJuIHFyZXM7JiN4ZDsKICAgIH0mI3hkOwogICAgbGRhcGRuID0gU3RyaW5nKCBsZGFwZG4gKTsgLy8gSXNzdWUgIzI0JiN4ZDsKICAgIGVudGtleSA9IFN0cmluZyggZW50a2V5ICk7IC8vIElzc3VlICMyNCYjeGQ7CiAgICBhdHRya2V5ID0gU3RyaW5nKCBhdHRya2V5ICk7IC8vIElzc3VlICMyNCYjeGQ7CiAgICAvLyBQZXJmb3JtcyB0aGUgcXVlcnkgYW5kIGhhbmRsZXMgZXJyb3JzJiN4ZDsKICAgIHRyeSB7JiN4ZDsKICAgICAgLy8gRnVuY3Rpb24gY2FsbCBwYXJhbWV0ZXJzIGFyZSBkaWZmZXJlbnQgYmV0d2VlbiBlbmdpbmUgYW5kIGZvcm0mI3hkOwogICAgICBpZiAoIHdoZXJlID09PSAnZm9ybScgKSB7JiN4ZDsKICAgICAgICBpZiAoIGZpZWxkbmFtZSA9PSBudWxsICkgeyYjeGQ7CiAgICAgICAgICBmaWVsZG5hbWUgPSBudWxsOyYjeGQ7CiAgICAgICAgfSYjeGQ7CiAgICAgICAgZ2F0dHIgPSBJRFZvYmouZ2V0KCBmaWVsZG5hbWUsIGxkYXBkbiwgZW50a2V5LCBhdHRya2V5ICk7JiN4ZDsKICAgICAgfSYjeGQ7CiAgICAgIGlmICggd2hlcmUgPT09ICdlbmdpbmUnICkgeyYjeGQ7CiAgICAgICAgZ2F0dHIgPSBJRFZvYmouZ2V0KCBsZGFwZG4sIGVudGtleSwgYXR0cmtleSApOyYjeGQ7CiAgICAgIH0mI3hkOwogICAgICAvLyBOb3JtYWxpemUgcmVzdWx0cyBpbnRvIGFuIEVDTUEgYXJyYXkmI3hkOwogICAgICBpZiAoIGdhdHRyID09PSBudWxsICkgeyYjeGQ7CiAgICAgICAgLy8gUXVlcnkgc3VjY2VlZGVkIHdpdGggMCByZXN1bHRzLiBTdHViIGxlZnQgaW4gY2FzZSB3ZSBuZWVkIHRvIGFkZCBkZWJ1ZyBtZXNzYWdlcy4mI3hkOwogICAgICB9IGVsc2UgaWYgKCBpc1N0cmluZyggZ2F0dHIgKSApIHsmI3hkOwogICAgICAgIC8vIFF1ZXJ5IHN1Y2NlZWRlZCB3aXRoIGEgc2luZ2xlIHJlc3VsdC4gQ2FzdHMgcmVzdWx0IGFzIGEgc2luZ2xlLWVsZW1lbnQgYXJyYXkgdG8gdGhlIHFyZXMgdmFyaWFibGUuJiN4ZDsKICAgICAgICBxcmVzLnB1c2goIGNvZXJjZVRvU3RyaW5nKCBnYXR0ciApICk7JiN4ZDsKICAgICAgfSBlbHNlIGlmICggd2hlcmUgPT09ICdmb3JtJyAmYW1wOyZhbXA7IGdhdHRyIGluc3RhbmNlb2YgQXJyYXkgKSB7JiN4ZDsKICAgICAgICAvLyBRdWVyeSBzdWNjZWVkZWQgd2l0aCAyIG9yIG1vcmUgcmVzdWx0cy4gU2F2ZXMgcmVzdWx0cyBkaXJlY3RseSB0byB0aGUgcXJlcyB2YXJpYWJsZS4mI3hkOwogICAgICAgIHFyZXMgPSBnYXR0cjsmI3hkOwogICAgICB9IGVsc2UgaWYgKCB3aGVyZSA9PT0gJ2VuZ2luZScgJmFtcDsmYW1wOyB0eXBlb2YgZ2F0dHIgPT09ICdvYmplY3QnICZhbXA7JmFtcDsgZ2F0dHIuc2l6ZSgpICZndDsgMCApIHsmI3hkOwogICAgICAgIC8vIFF1ZXJ5IHN1Y2NlZWRlZCB3aXRoIDIgb3IgbW9yZSByZXN1bHRzLiBTYXZlcyByZXN1bHRzIGRpcmVjdGx5IHRvIHRoZSBxcmVzIHZhcmlhYmxlLiYjeGQ7CiAgICAgICAgcXJlcyA9IEphdmFWZWN0b3JUb0VDTUFBcnJheSggZ2F0dHIgKTsmI3hkOwogICAgICB9JiN4ZDsKICAgIH0gY2F0Y2goIGUgKSB7JiN4ZDsKICAgICAgbG9nZXJyb3IoIGZuYW1lICsgJ0Vycm9yIG9jY3VyZWQgZHVyaW5nIElEVmF1bHQuZ2V0IHF1ZXJ5LiBBYm9ydGluZy4gRXJyb3IgbWVzc2FnZTogJyArIGUubWVzc2FnZSApOyYjeGQ7CiAgICB9JiN4ZDsKICAgIC8vIEZvcmNlIHRoZSByZXN1bHQgdG8gcmV0dXJuIGEgY29weSBvZiB0aGUgYXJyYXkuJiN4ZDsKICAgIHJldHVybiBxcmVzOyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiBQZXJmb3JtcyBhbiBJRFZhdWx0Lmdsb2JhbFF1ZXJ5IGFuZCByZXR1cm5zIGFuIG9iamVjdCB3aXRoIHRoZSByZXN1bHQuJmx0O2JyLyZndDsmI3hkOwogICAqIFJlZmFjdG9yZWQgb24gdjEuMC40IHRvIHJlcGxhY2UgdGhlIDR0aCBvcHRpb25hbCBwYXJhbWV0ZXIgZnJvbSBJRFZhdWx0IGluamVjdGlvbiB0byBhIGZvcm0ncyBmaWVsZCBuYW1lLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBUaGlzIGNoYW5nZSBjb3VsZCBicmVhayBmb3JtcyB1c2luZyBwcmlvciB2ZXJzaW9ucywgcGxlYXNlIGRvdWJsZSBjaGVjayB5b3VyIGZvcm0gY29kZSBiZWZvcmUgbW92aW5nIHRvIHYxLjAuNC4mI3hkOwogICAqJiN4ZDsKICAgKiBAbWVtYmVyb2YgUFJEJiN4ZDsKICAgKiBAc2luY2UgMS4wLjEmI3hkOwogICAqJiN4ZDsKICAgKiBAcGFyYW0gIHtzdHJpbmd9ICBkYWxxdWVyeWtleSAgREFMIFF1ZXJ5IGtleS4mI3hkOwogICAqIEBwYXJhbSAge29iamVjdH0gIHBhcmFtZXRlcnMgICBFQ01BIG9iamVjdCB3aXRoIHRoZSBwYXJhbXRlcnMgZGVmaW5lZCBpbiB0aGUgREFMIFF1ZXJ5LiB7cGFyYW1ldGVybmFtZTpwYXJhbWV0ZXJ2YWx1ZX0mI3hkOwogICAqIEBwYXJhbSAge29iamVjdD19IFtmaWVsZG5hbWVdICAoZm9ybSBtb2RlIG9ubHkpIE5hbWUgb2YgdGhlIGZpZWxkIHRvIGJlIGF1dG8tcG9wdWxhdGVkIGJ5IHRoZSBmdW5jdGlvbi4mI3hkOwogICAqJiN4ZDsKICAgKiBAdHlwZSB7c3RyaW5nW119JiN4ZDsKICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0gQXJyYXkgd2l0aCBMREFQIEROcyByZXR1cm5lZC4mI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gSURWZ2xvYmFsUXVlcnkoIGRhbHF1ZXJ5a2V5LCBwYXJhbWV0ZXJzLCBmaWVsZG5hbWUgKSB7JiN4ZDsKICAgIC8vIFZhcmlhYmxlIGRlY2xhcmF0aW9uLiBLZWVwIGFsbCB0aGUgZGVjbGFyYXRpb25zIHRvZ2V0aGVyLiYjeGQ7CiAgICB2YXIgcXJlcywgZ3FyLCBlcnJtc2csIHBjb252LCBmbmFtZSwga2V5LCBpLCB0cmVhdGVkcGFyYW1ldGVyczsmI3hkOwogICAgZm5hbWUgPSAnSURWZ2xvYmFsUXVlcnkoKTogJzsmI3hkOwogICAgcXJlcyA9IFtdOyYjeGQ7CiAgICBwY29udiA9ICcnOyYjeGQ7CiAgICB0cmVhdGVkcGFyYW1ldGVycyA9IHt9OyYjeGQ7CiAgICAvLyBBZGp1c3RpbmcgZnVuY3Rpb24gaW5wdXQgdmFsdWVzIGJhc2VkIG9uIHdoZXJlIGl0IGlzIGJlaW5nIGV4ZWN1dGVkLiYjeGQ7CiAgICBpZiAoIHdoZXJlID09PSAnZW5naW5lJyApIHsmI3hkOwogICAgICBJRFZvYmogPSBJRFZhdWx0OyYjeGQ7CiAgICB9JiN4ZDsKICAgIGlmICggd2hlcmUgPT09ICdmb3JtJyApIHsmI3hkOwogICAgICBpZiAoIElETUFQUFMuSURWYXVsdCAhPT0gbnVsbCApIHsmI3hkOwogICAgICAgIElEVm9iaiA9IElETUFQUFMuSURWYXVsdDsmI3hkOwogICAgICB9IGVsc2UgeyYjeGQ7CiAgICAgICAgbG9nZXJyb3IoIGZuYW1lICsgJ3BsZWFzZSB1c2UgUFJELmluaXQoKSB3aXRoIGF0IGxlYXN0IElEVmF1bHQgYXMgYSBwYXJhbWV0ZXIgdG8gaW5pdGlhbGl6ZSB0aGUgbWFuZGF0b3J5IHJlZmVyZW5jZSB0byB0aGUgc2FtZS4gQWJvcnRpbmcuJyApOyYjeGQ7CiAgICAgICAgcmV0dXJuIHFyZXM7JiN4ZDsKICAgICAgfSYjeGQ7CiAgICB9JiN4ZDsKICAgIC8vIENoZWNrIGlucHV0IHBhcmFtZXRlcnMuJiN4ZDsKICAgIGlmICggZGFscXVlcnlrZXkgPT0gbnVsbCB8fCBwYXJhbWV0ZXJzID09IG51bGwgKSB7JiN4ZDsKICAgICAgZXJybXNnID0gW107JiN4ZDsKICAgICAgZXJybXNnLnB1c2goIGZuYW1lICsgJ21pc3NpbmcgbWFuZGF0b3J5IHBhcmFtZXRlcnMuJyApOyYjeGQ7CiAgICAgIGVycm1zZy5wdXNoKCAnZGFscXVlcnlrZXk6ICcgKyBTdHJpbmcoIGRhbHF1ZXJ5a2V5ICkgKyAnLCcgKTsmI3hkOwogICAgICBpZiAoIHBhcmFtZXRlcnMgPT09IG51bGwgKSB7JiN4ZDsKICAgICAgICBwY29udiA9IFN0cmluZyggcGFyYW1ldGVycyApOyYjeGQ7CiAgICAgIH0gZWxzZSB7JiN4ZDsKICAgICAgICBwY29udiA9IEpTT05zdHJpbmdpZnkoIHBhcmFtZXRlcnMgKTsmI3hkOwogICAgICB9JiN4ZDsKICAgICAgZXJybXNnLnB1c2goICdwYXJhbWV0ZXJzOiAnICsgcGNvbnYgKyAnLCcgKTsmI3hkOwogICAgICBsb2dlcnJvciggZXJybXNnLmpvaW4oICcgJyApICk7JiN4ZDsKICAgICAgcmV0dXJuIHFyZXM7JiN4ZDsKICAgIH0mI3hkOwogICAgZGFscXVlcnlrZXkgPSBTdHJpbmcoIGRhbHF1ZXJ5a2V5ICk7IC8vICMyNCYjeGQ7CiAgICB0cmVhdGVkcGFyYW1ldGVycyA9IHt9OyAvLyAjMjQmI3hkOwogICAgZm9yICgga2V5IGluIHBhcmFtZXRlcnMgKSB7IC8vICMyNCAtIHRoZSB3aG9sZSBmb3IgaXRlcmF0aW9uLiYjeGQ7CiAgICAgIGlmICggcGFyYW1ldGVyc1sga2V5IF0gaW5zdGFuY2VvZiBBcnJheSApIHsmI3hkOwogICAgICAgIHRyZWF0ZWRwYXJhbWV0ZXJzWyBrZXkgXSA9IFtdOyYjeGQ7CiAgICAgICAgZm9yICggaSA9IDA7IGkgJmx0OyBwYXJhbWV0ZXJzWyBrZXkgXS5sZW5ndGg7IGkrKyApIHsmI3hkOwogICAgICAgICAgdHJlYXRlZHBhcmFtZXRlcnNbIGtleSBdLnB1c2goIFN0cmluZyggcGFyYW1ldGVyc1sga2V5IF1bIGkgXSApICk7JiN4ZDsKICAgICAgICB9JiN4ZDsKICAgICAgfSBlbHNlIHsmI3hkOwogICAgICAgIHRyZWF0ZWRwYXJhbWV0ZXJzWyBrZXkgXSA9IFN0cmluZyggcGFyYW1ldGVyc1sga2V5IF0gKTsmI3hkOwogICAgICB9JiN4ZDsKICAgIH0mI3hkOwogICAgLy8gUGVyZm9ybXMgdGhlIHF1ZXJ5IGFuZCBoYW5kbGVzIGVycm9ycyYjeGQ7CiAgICB0cnkgeyYjeGQ7CiAgICAgIC8vIEZ1bmN0aW9uIGNhbGwgcGFyYW1ldGVycyBhcmUgZGlmZmVyZW50IGJldHdlZW4gZW5naW5lIGFuZCBmb3JtLCBhcyBhcmUgcmV0dXJuIHR5cGVzLiYjeGQ7CiAgICAgIGlmICggd2hlcmUgPT09ICdmb3JtJyApIHsmI3hkOwogICAgICAgIGlmICggZmllbGRuYW1lID09IG51bGwgKSB7JiN4ZDsKICAgICAgICAgIGZpZWxkbmFtZSA9IG51bGw7JiN4ZDsKICAgICAgICB9JiN4ZDsKICAgICAgICBncXIgPSBJRFZvYmouZ2xvYmFsUXVlcnkoIGZpZWxkbmFtZSwgZGFscXVlcnlrZXksIHBhcmFtZXRlcnMgKTsmI3hkOwogICAgICAgIGlmICggZ3FyIGluc3RhbmNlb2YgQXJyYXkgJmFtcDsmYW1wOyBncXJbIDAgXSBpbnN0YW5jZW9mIEFycmF5ICZndDsgMCAmYW1wOyZhbXA7IGdxclsgMCBdWyAwIF0gIT0gJycgKSB7JiN4ZDsKICAgICAgICAgIHFyZXMgPSBncXJbIDAgXTsmI3hkOwogICAgICAgIH0mI3hkOwogICAgICB9JiN4ZDsKICAgICAgaWYgKCB3aGVyZSA9PT0gJ2VuZ2luZScgKSB7JiN4ZDsKICAgICAgICBncXIgPSBJRFZvYmouZ2xvYmFsUXVlcnkoIGRhbHF1ZXJ5a2V5LCBwYXJhbWV0ZXJzICk7JiN4ZDsKICAgICAgICBpZiAoIGdxciAhPSBudWxsICZhbXA7JmFtcDsgZ3FyLnNpemUoKSAmZ3Q7IDAgKSB7JiN4ZDsKICAgICAgICAgIHFyZXMgPSBKYXZhVmVjdG9yVG9FQ01BQXJyYXkoIGdxciApOyYjeGQ7CiAgICAgICAgfSYjeGQ7CiAgICAgIH0mI3hkOwogICAgfSBjYXRjaCAoIGUgKSB7JiN4ZDsKICAgICAgbG9nZXJyb3IoIGZuYW1lICsgJ0Vycm9yIG9jY3VyZWQgZHVyaW5nIElEVmF1bHQuZ2xvYmFsUXVlcnkgLiBBYm9ydGluZy4gRXJyb3IgbWVzc2FnZTogJyArIGUubWVzc2FnZSApOyYjeGQ7CiAgICB9JiN4ZDsKICAgIHJldHVybiBxcmVzOyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiAoRW5naW5lIG9ubHkpIFdyYXBlciBmb3IgR0NWLmdldCAuIEF0dGVtcHRzIHRvIHJldHJpZXZlIHRoZSBHQ1YgdmFsdWUuIHJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgKG9yICcnIGlmIG5vIGRlZmF1bHQgcHJvdmlkZWQpJiN4ZDsKICAgKiBAbWVtYmVyb2YgUFJELnV0aWwmI3hkOwogICAqIEBzaW5jZSAxLjAuMiYjeGQ7CiAgIComI3hkOwogICAqIEBwYXJhbSB7c3RyaW5nfSAgIEdDVm5hbWUgICAgICAgICBOYW1lIG9mIHRoZSBHQ1YgdG8gYmUgcmV0cmlldmVkLiYjeGQ7CiAgICogQHBhcmFtIHtzdHJpbmc9fSAgW3JldHVyblR5cGVdICAgICdzdHJpbmcnLCAnbnVtYmVyJyBvciAnYm9vbGVhbicuIEZvcmNlcyBjb2VyY2lvbiB0byBzYWlkIHR5cGUgZm9yIHRoZSByZXR1cm4uJiN4ZDsKICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gJ3N0cmluZycgaWYgbm90IHByb3ZpZGVkIG9yIGFueSBvdGhlciB2YWx1ZS4mI3hkOwogICAqIEBwYXJhbSB7c3RyaW5nPX0gIFtEZWZhdWx0VmFsdWVdICBEZWZhdWx0IHZhbHVlIHRvIGJlIHVzZWQgaWYgdGhlIEdDVi5nZXQoKSBmYWlscy4gRGVmYXVsdHMgdG8gJycgaWYgbm90IHByb3ZpZGVkLiYjeGQ7CiAgICogQHJldHVybiB7KHN0cmluZ3xudW1iZXJ8Ym9vbGVhbil9IEdDVi5nZXQgcmVzdWx0IG9yIGRlZmF1bHQgdmFsdWUuJiN4ZDsKICAgKi8mI3hkOwogIGZ1bmN0aW9uIEdDVmdldCggR0NWbmFtZSwgcmV0dXJuVHlwZSwgRGVmYXVsdFZhbHVlICkgeyYjeGQ7CiAgICB2YXIgcmV0LCBkZWZ2YWwgPSAnJywgZm5hbWU7JiN4ZDsKICAgIGZuYW1lID0gJ0dDVmdldCgpOiAnOyYjeGQ7CiAgICBpZiAoIERlZmF1bHRWYWx1ZSAhPSBudWxsICkgeyYjeGQ7CiAgICAgIGRlZnZhbCA9IFN0cmluZyggRGVmYXVsdFZhbHVlICk7JiN4ZDsKICAgIH0mI3hkOwogICAgaWYgKCBHQ1ZuYW1lICE9IG51bGwgJmFtcDsmYW1wOyBHQ1ZuYW1lICE9PSAnJyApIHsmI3hkOwogICAgICBHQ1ZuYW1lID0gU3RyaW5nKCBHQ1ZuYW1lICk7JiN4ZDsKICAgICAgdHJ5IHsmI3hkOwogICAgICAgIHJldCA9IEdDVi5nZXQoIEdDVm5hbWUgKTsmI3hkOwogICAgICB9IGNhdGNoICggZSApIHsmI3hkOwogICAgICAgIGxvZ2Vycm9yKCBmbmFtZSArICdGYWlsZWQgdG8gcmV0cmlldmUgdmFsdWUgZm9yIEdDViAiJyArIEdDVm5hbWUgKyAnIiwgRXJyb3I6ICcgKyBlLm1lc3NhZ2UgKTsmI3hkOwogICAgICB9JiN4ZDsKICAgIH0gZWxzZSB7JiN4ZDsKICAgICAgbG9nZXJyb3IoIGZuYW1lICsgJ0dDVm5hbWUgbm90IHByb3ZpZGVkLicgKTsmI3hkOwogICAgfSYjeGQ7CiAgICAvLyBGYWlsZWQgdG8gcmV0cmlldmUgdGhlIEdDViYjeGQ7CiAgICBpZiAoISByZXQgKSB7JiN4ZDsKICAgICAgbG9nZXJyb3IoIGZuYW1lICsgJ0dDVi5nZXQoICInICsgR0NWbmFtZSArICciICkgcmV0dXJuZWQgbnVsbCB2YWx1ZS4gUGxlYXNlIG1ha2Ugc3VyZSB0aGUgc2FtZSBpcyBhdmFpbGFibGUgb24gdGhlIFVzZXIgQXBwbGljYXRpb24gZHJpdmVyJyApOyYjeGQ7CiAgICAgIHJldCA9IGRlZnZhbDsmI3hkOwogICAgfSYjeGQ7CiAgICAvLyBDb2VyY2UgcmVzdWx0IGFzIHdlIHJldHVybiBpdC4mI3hkOwogICAgc3dpdGNoKCBTdHJpbmcoIHJldHVyblR5cGUgKSApIHsmI3hkOwogICAgICBjYXNlICdib29sZWFuJzomI3hkOwogICAgICAgIHJldHVybiBCb29sZWFuKCByZXQgKTsmI3hkOwogICAgICBjYXNlICdudW1iZXInOiYjeGQ7CiAgICAgICAgcmV0dXJuIE51bWJlciggcmV0ICk7JiN4ZDsKICAgICAgZGVmYXVsdDogLy8gY2FzZSAnc3RyaW5nJyBvdmVybGFwcyB3aXRoIHRoaXMgb25lJiN4ZDsKICAgICAgICByZXR1cm4gU3RyaW5nKCByZXQgKTsmI3hkOwogICAgfSYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiAoRW5naW5lIG9ubHkpIFdyYXBlciBmb3IgR0NWLmdldFZhbHVlRm9yTmFtZWRQYXNzd29yZC4gQXR0ZW1wdHMgdG8gcmV0cmlldmUgdGhlJiN4ZDsKICAgKiBuYW1lZCBwYXNzd29yZCB2YWx1ZSB1c2luZyBhIEdDVi1yZWYgYXMgdGhlIGJyaWRnZSBmb3IgdGhlIHNhbWUuJmx0O2JyLyZndDsmI3hkOwogICAqIElmIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIHRydWUgYW5kIHRoZSBuYW1lZCBwYXNzd29yZCByZWFkIGZhaWxzIHRoZSBmdW5jdGlvbiBhdHRlbXBzJiN4ZDsKICAgKiB1cCB0byA1IHJldHJpZXMgd2l0aCAxIHNlY29uZCBwYXVzZSBpbiBiZXR3ZWVuIHRoZW0uJiN4ZDsKICAgKiYjeGQ7CiAgICogQG1lbWJlcm9mIFBSRC51dGlsJiN4ZDsKICAgKiBAc2luY2UgMS4wLjImI3hkOwogICAqJiN4ZDsKICAgKiBAcGFyYW0ge3N0cmluZ30gIE5hbWVkUGFzc3dvcmQgIE5hbWUgb2YgdGhlIEdDVi1yZWYgdG8gdGhlIE5hbWVkIFBhc3N3b3JkIHRvIGJlIHJldHJpZXZlZC4mI3hkOwogICAqIEBwYXJhbSB7YW55PX0gICAgW3RyeTV0aW1lc10gICAgSWYgbm90IHByb3ZpZGVkIG9yIG51bGwgYSBzaW5nbGUgcmVhZCBpcyBhdHRlbXB0ZWQuJiN4ZDsKICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHByb3ZpZGVzIGFuZCByZWFkIGZhaWxzIHRyeSA0IG1vcmUgdGltZXMsIHdpdGggMSBzZWNvbmQgcGF1c2UgYmV0d2VlbiB0aGVtLiYjeGQ7CiAgICogQHJldHVybiB7KHN0cmluZ3xudWxsKX0gR0NWLmdldFZhbHVlRm9yTmFtZWRQYXNzd29yZCByZXN1bHQgb3IgbnVsbC4mI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gZ2V0TmFtZWRQYXNzd29yZCggTmFtZWRQYXNzd29yZCwgdHJ5NXRpbWVzICkgeyYjeGQ7CiAgICB2YXIgaSwgcmV0ID0gbnVsbCwgZm5hbWU7JiN4ZDsKICAgIGZuYW1lID0gJ2dldE5hbWVkUGFzc3dvcmQoKTogJzsmI3hkOwogICAgaWYgKCBOYW1lZFBhc3N3b3JkICE9IG51bGwgJmFtcDsmYW1wOyBOYW1lZFBhc3N3b3JkICE9PSAnJyApIHsmI3hkOwogICAgICBOYW1lZFBhc3N3b3JkID0gU3RyaW5nKCBOYW1lZFBhc3N3b3JkICk7JiN4ZDsKICAgICAgaWYgKCB0cnk1dGltZXMgIT0gbnVsbCApIHsmI3hkOwogICAgICAgIC8vIFRoaXMgYXBwcm9hY2ggd2lsbCBob2xkIHRoZSBKYXZhIHRocmVhZCB1cCB0byA1IHNlY29uZHMsIHBvc3NpYmx5IGNhdXNpbmcgcmVzb3VyY2UgY29udGVudGlvbiYjeGQ7CiAgICAgICAgLy8gb24gdGhlIHdvcmtmbG93IGVuZ2luZS4gUnVsZSBvZiB0aHVtYiB3ZSBzaG91bGQgYXZvaWQgdXNpbmcgamF2YS5sYW5nLlRocmVhZC5zbGVlcCgpIGluc2lkZSB3b3JrZmxvd3MmI3hkOwogICAgICAgIC8vIG9uIHN5c3RlbXMgd2l0aCBtZWRpdW0gdG8gbGFyZ2UgbG9hZC4mI3hkOwogICAgICAgIHRyeTV0aW1lczogeyYjeGQ7CiAgICAgICAgICBmb3IgKCBpID0gMDsgaSAmbHQ7IDU7IGkrKyApeyYjeGQ7CiAgICAgICAgICAgIHRyeSB7JiN4ZDsKICAgICAgICAgICAgICByZXQgPSBHQ1YuZ2V0VmFsdWVGb3JOYW1lZFBhc3N3b3JkKCBOYW1lZFBhc3N3b3JkICk7JiN4ZDsKICAgICAgICAgICAgfSBjYXRjaCAoIGUgKSB7JiN4ZDsKICAgICAgICAgICAgICBsb2dlcnJvciggZm5hbWUgKyAnRmFpbGVkIHRvIHJldHJpZXZlIHZhbHVlIGZvciBOYW1lZCBQYXNzd29yZCAiJyArIE5hbWVkUGFzc3dvcmQgKyAnIiwgRXJyb3I6ICcgKyBlLm1lc3NhZ2UgKTsmI3hkOwogICAgICAgICAgICB9JiN4ZDsKICAgICAgICAgICAgaWYgKCByZXQgIT0gbnVsbCAmYW1wOyZhbXA7IHJldCAhPT0gJycgKSB7JiN4ZDsKICAgICAgICAgICAgICBicmVhayB0cnk1dGltZXM7JiN4ZDsKICAgICAgICAgICAgfSYjeGQ7CiAgICAgICAgICAgIC8vIDEgc2Vjb25kIGRlbGF5JiN4ZDsKICAgICAgICAgICAgdHJ5IHsmI3hkOwogICAgICAgICAgICAgIGxvZ2Vycm9yKCBmbmFtZSArICdGYWlsZWQgYXR0ZW1wdCAnICsgKGkrMSkgKyAnIHRvIHJldHJpZXZlIE5hbWVkIFBhc3N3b3JkICInICsgTmFtZWRQYXNzd29yZCArICciLiBQYXVzaW5nIGZvciAxIHNlY29uZCB0aGVuIHJldHJ5aW5nLicgKTsmI3hkOwogICAgICAgICAgICAgIGphdmEubGFuZy5UaHJlYWQuc2xlZXAoIDEwMDAgKTsmI3hkOwogICAgICAgICAgICB9IGNhdGNoICggZSApIHsmI3hkOwogICAgICAgICAgICAgIGxvZ2Vycm9yKCBmbmFtZSArICdBbmQgbm93IGZhaWxlZCB0byB0cnkgYW5kIHBhdXNlIGZvciBhIHNlY29uZCBhcyB3ZWxsLiBFcnJvcjogJyArIGUubWVzc2FnZSApOyYjeGQ7CiAgICAgICAgICAgIH0mI3hkOwogICAgICAgICAgfSYjeGQ7CiAgICAgICAgfSYjeGQ7CiAgICAgIH0gZWxzZSB7JiN4ZDsKICAgICAgICB0cnkgeyYjeGQ7CiAgICAgICAgICByZXQgPSBHQ1YuZ2V0VmFsdWVGb3JOYW1lZFBhc3N3b3JkKCBOYW1lZFBhc3N3b3JkICk7JiN4ZDsKICAgICAgICB9IGNhdGNoICggZSApIHsmI3hkOwogICAgICAgICAgbG9nZXJyb3IoIGZuYW1lICsgJ0ZhaWxlZCB0byByZXRyaWV2ZSB2YWx1ZSBmb3IgTmFtZWQgUGFzc3dvcmQgIicgKyBOYW1lZFBhc3N3b3JkICsgJyIsIEVycm9yOiAnICsgZS5tZXNzYWdlICk7JiN4ZDsKICAgICAgICB9JiN4ZDsKICAgICAgfSYjeGQ7CiAgICB9IGVsc2UgeyYjeGQ7CiAgICAgIGxvZ2Vycm9yKCBmbmFtZSArICdOYW1lZFBhc3N3b3JkIG5vdCBwcm92aWRlZC4nICk7JiN4ZDsKICAgIH0mI3hkOwogICAgLy8gRmFpbGVkIHRvIHJldHJpZXZlIHRoZSBHQ1YmI3hkOwogICAgaWYgKCEgcmV0ICkgeyYjeGQ7CiAgICAgIGxvZ2Vycm9yKCBmbmFtZSArICdHQ1YuZ2V0VmFsdWVGb3JOYW1lZFBhc3N3b3JkKCAiJyArIE5hbWVkUGFzc3dvcmQgKyAnIiApIHJldHVybmVkIG51bGwgdmFsdWUuIFBsZWFzZSBtYWtlIHN1cmUgdGhlIHNhbWUgaXMgYXZhaWxhYmxlIG9uIHRoZSBVc2VyIEFwcGxpY2F0aW9uIGRyaXZlcicgKTsmI3hkOwogICAgICByZXR1cm4gJyc7JiN4ZDsKICAgIH0mI3hkOwogICAgcmV0dXJuIHJldDsmI3hkOwogIH0mI3hkOwomI3hkOwogIC8vIEVuZ2luZS1vbmx5IEFQSSBleHRlbnNpb25zOiYjeGQ7CiAgaWYgKCB3aGVyZSA9PT0gJ2VuZ2luZScgKSB7JiN4ZDsKICAgIFB1YmxpY0FQSS51dGlsLkphdmFWZWN0b3JUb0VDTUFBcnJheSA9IEphdmFWZWN0b3JUb0VDTUFBcnJheTsmI3hkOwogICAgUHVibGljQVBJLnV0aWwuRUNNQUFycmF5VG9KYXZhVmVjdG9yID0gRUNNQUFycmF5VG9KYXZhVmVjdG9yOyYjeGQ7CiAgICBQdWJsaWNBUEkudXRpbC5HQ1ZnZXQgPSBHQ1ZnZXQ7JiN4ZDsKICAgIFB1YmxpY0FQSS51dGlsLmdldE5hbWVkUGFzc3dvcmQgPSBnZXROYW1lZFBhc3N3b3JkOyYjeGQ7CiAgICBQdWJsaWNBUEkudXRpbC5nZXRPYmplY3QyYXJyID0gZ2V0T2JqZWN0MmFycjsmI3hkOwogICAgUHVibGljQVBJLnV0aWwuYmFzaWNIVFRQYXV0aEhlYWRlciA9IGJhc2ljSFRUUGF1dGhIZWFkZXI7JiN4ZDsKICAgIFB1YmxpY0FQSS51dGlsLnNob3VsZFJldHJ5ID0gc2hvdWxkUmV0cnk7JiN4ZDsKICAgIFB1YmxpY0FQSS51dGlsLmlzSmF2YVZlY3RvciA9IGlzSmF2YVZlY3RvcjsmI3hkOwogIH0mI3hkOwogIC8vIEZvcm0tb25seSBBUEkgZXh0ZW5zaW9uczomI3hkOwogIGlmICggd2hlcmUgPT09ICdmb3JtJyApIHsmI3hkOwogICAgUHVibGljQVBJLmluaXQgPSBmb3JtSW5pdDsmI3hkOwogICAgUHVibGljQVBJLnV0aWwuaW50ZXJzZWN0QXJyYXlzID0gaW50ZXJzZWN0QXJyYXlzOyYjeGQ7CiAgICBQdWJsaWNBUEkud2ViID0geyYjeGQ7CiAgICAgIGZpZWxkVmlzaWJpbGl0eTpmaWVsZFZpc2liaWxpdHkmI3hkOwogICAgfTsmI3hkOwogIH0mI3hkOwomI3hkOwogIHJldHVybiBQdWJsaWNBUEk7JiN4ZDsKfSkoICc9PT0mZ3Q7ICcpOzwvZWNtYS1zY3JpcHQ+PC9pbXBvcnQtc2NyaXB0PjxpbXBvcnQtc2NyaXB0CiAgICAgICAgICAgIGlubGluZT0idHJ1ZSI+PGVjbWEtc2NyaXB0Pi8qIDAxLWdsb2JhbC1wb2x5ZmlsbHMgcmV2IDIwMTcxMjI4ICovJiN4ZDsKJiN4ZDsKLy8gVmlhIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L21hcCYjeGQ7Ci8vIE1vZGlmaWVkIHRvIHJlbW92ZSBlcnJvciB0aHJvd3MmI3hkOwppZiAoIUFycmF5LnByb3RvdHlwZS5tYXApIHsmI3hkOwoJQXJyYXkucHJvdG90eXBlLm1hcCA9IGZ1bmN0aW9uKGNhbGxiYWNrLCB0aGlzQXJnKSB7JiN4ZDsKCQl2YXIgVCwgQSwgazsmI3hkOwomI3hkOwoJCWlmICh0aGlzID09PSBudWxsKSB7JiN4ZDsKCQkJamF2YS5sYW5nLlN5c3RlbS5vdXQucHJpbnRsbigiQW4gZXJyb3Igb2NjdXJyZWQgd2l0aGluIHRoZSBBcnJheS5wcm90b3R5cGUubWFwKCkgcG9seWZpbGw6IHRoZSBhcnJheSA9PT0gbnVsbC4iKTsmI3hkOwoJCQlyZXR1cm4gbnVsbDsmI3hkOwoJCX0mI3hkOwomI3hkOwoJCXZhciBPID0gT2JqZWN0KHRoaXMpOyYjeGQ7CiYjeGQ7CgkJdmFyIGxlbiA9IE8ubGVuZ3RoICZndDsmZ3Q7Jmd0OyAwOyYjeGQ7CiYjeGQ7CgkJaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykgeyYjeGQ7CgkJCWphdmEubGFuZy5TeXN0ZW0ub3V0LnByaW50bG4oIkFuIGVycm9yIG9jY3VycmVkIHdpdGhpbiB0aGUgQXJyYXkucHJvdG90eXBlLm1hcCgpIHBvbHlmaWxsOiB0aGUgY2FsbGJhY2sgIT09IGEgZnVuY3Rpb24uIik7JiN4ZDsKCQkJcmV0dXJuIG51bGw7JiN4ZDsKCQl9JiN4ZDsKJiN4ZDsKCQlpZiAoYXJndW1lbnRzLmxlbmd0aCAmZ3Q7IDEpIHsmI3hkOwoJCQlUID0gdGhpc0FyZzsmI3hkOwoJCX0mI3hkOwomI3hkOwoJCUEgPSBuZXcgQXJyYXkobGVuKTsmI3hkOwomI3hkOwoJCWsgPSAwOyYjeGQ7CiYjeGQ7CgkJd2hpbGUgKGsgJmx0OyBsZW4pIHsmI3hkOwoJCQl2YXIga1ZhbHVlLCBtYXBwZWRWYWx1ZTsmI3hkOwoJCQlpZiAoayBpbiBPKSB7JiN4ZDsKCQkJCWtWYWx1ZSA9IE9ba107JiN4ZDsKCQkJCW1hcHBlZFZhbHVlID0gY2FsbGJhY2suY2FsbChULCBrVmFsdWUsIGssIE8pOyYjeGQ7CiYjeGQ7CgkJCQlBW2tdID0gbWFwcGVkVmFsdWU7JiN4ZDsKCQkJfSYjeGQ7CgkJCWsrKzsmI3hkOwoJCX0mI3hkOwomI3hkOwoJCXJldHVybiBBOyYjeGQ7Cgl9OyYjeGQ7Cn0mI3hkOwomI3hkOwovLyBQcm9kdWN0aW9uIHN0ZXBzIG9mIEVDTUEtMjYyLCBFZGl0aW9uIDUsIDE1LjQuNC4xNCYjeGQ7Ci8vIFJlZmVyZW5jZTogaHR0cDovL2VzNS5naXRodWIuaW8vI3gxNS40LjQuMTQmI3hkOwomI3hkOwovLyBVc2VyYXBwIGhhcyBhIGJ1Z2d5IGltcGxlbWVudGF0aW9uLCB3ZSB3YW50IHRvIGludGVudGlvbmFsbHkgb3ZlcndyaXRlIGl0OiYjeGQ7Ci8vIGlmICghQXJyYXkucHJvdG90eXBlLmluZGV4T2YpIHsmI3hkOwpBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uKHNlYXJjaEVsZW1lbnQsIGZyb21JbmRleCkgeyYjeGQ7CiYjeGQ7CglpZiAodGhpcyA9PT0gbnVsbCkgeyYjeGQ7CgkJamF2YS5sYW5nLlN5c3RlbS5vdXQucHJpbnRsbigiQW4gZXJyb3Igb2NjdXJyZWQgd2l0aGluIHRoZSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZigpIHBvbHlmaWxsOiB0aGUgYXJyYXkgPT09IG51bGwuIik7JiN4ZDsKCQlyZXR1cm4gLTE7JiN4ZDsKCX0mI3hkOwomI3hkOwoJdmFyIE8gPSBPYmplY3QodGhpcyk7JiN4ZDsKJiN4ZDsKCXZhciBsZW4gPSBPLmxlbmd0aCAmZ3Q7Jmd0OyZndDsgMDsmI3hkOwomI3hkOwoJaWYgKGxlbiA9PT0gMCkgeyYjeGQ7CgkJamF2YS5sYW5nLlN5c3RlbS5vdXQucHJpbnRsbigiQW4gZXJyb3Igb2NjdXJyZWQgd2l0aGluIHRoZSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZigpIHBvbHlmaWxsOiB0aGUgYXJyYXkgbGVuZ3RoID09PSAwLiIpOyYjeGQ7CgkJcmV0dXJuIC0xOyYjeGQ7Cgl9JiN4ZDsKJiN4ZDsKCXZhciBuID0gK2Zyb21JbmRleCB8fCAwOyYjeGQ7CiYjeGQ7CglpZiAoTWF0aC5hYnMobikgPT09IEluZmluaXR5KSB7JiN4ZDsKCQluID0gMDsmI3hkOwoJfSYjeGQ7CiYjeGQ7CglpZiAobiAmZ3Q7PSBsZW4pIHsmI3hkOwoJCWphdmEubGFuZy5TeXN0ZW0ub3V0LnByaW50bG4oIkFuIGVycm9yIG9jY3VycmVkIHdpdGhpbiB0aGUgQXJyYXkucHJvdG90eXBlLmluZGV4T2YoKSBwb2x5ZmlsbDogbiAmZ3Q7PSBsZW4uIik7JiN4ZDsKCQlyZXR1cm4gLTE7JiN4ZDsKCX0mI3hkOwomI3hkOwoJLy8gTW9kaWZpZWQgYmVjYXVzZSBVc2VyYXBwIGNob2tlcyBvbiAnd2hpbGUnOiYjeGQ7Cglmb3IgKHZhciBpID0gMDsgaSAmbHQ7IGxlbjsgaSsrKSB7JiN4ZDsKCQlpZiAoT1tpXSA9PT0gc2VhcmNoRWxlbWVudCkgeyYjeGQ7CgkJCXJldHVybiBpOyYjeGQ7CgkJfSYjeGQ7Cgl9JiN4ZDsKCXJldHVybiAtMTsmI3hkOwp9OyYjeGQ7Ci8vIH0mI3hkOwomI3hkOwovLyBWaWEgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvZmlsdGVyJiN4ZDsKLy8gTW9kaWZpZWQgdG8gcmVtb3ZlIGVycm9yIHRocm93cyYjeGQ7CmlmICghQXJyYXkucHJvdG90eXBlLmZpbHRlcikgeyYjeGQ7CglBcnJheS5wcm90b3R5cGUuZmlsdGVyID0gZnVuY3Rpb24oZnVuIC8qLCB0aGlzQXJnKi8gKSB7JiN4ZDsKCQkndXNlIHN0cmljdCc7JiN4ZDsKJiN4ZDsKCQlpZiAodGhpcyA9PT0gdm9pZCAwIHx8IHRoaXMgPT09IG51bGwpIHsmI3hkOwoJCQlqYXZhLmxhbmcuU3lzdGVtLm91dC5wcmludGxuKCJBbiBlcnJvciBvY2N1cnJlZCB3aXRoaW4gdGhlIEFycmF5LnByb3RvdHlwZS5maWx0ZXIoKSBwb2x5ZmlsbDogdGhlIGFycmF5ID09PSBudWxsLiIpOyYjeGQ7CgkJCXJldHVybiBudWxsOyYjeGQ7CgkJfSYjeGQ7CiYjeGQ7CgkJdmFyIHQgPSBPYmplY3QodGhpcyk7JiN4ZDsKCQl2YXIgbGVuID0gdC5sZW5ndGggJmd0OyZndDsmZ3Q7IDA7JiN4ZDsKCQlpZiAodHlwZW9mIGZ1biAhPT0gJ2Z1bmN0aW9uJykgeyYjeGQ7CgkJCWphdmEubGFuZy5TeXN0ZW0ub3V0LnByaW50bG4oIkFuIGVycm9yIG9jY3VycmVkIHdpdGhpbiB0aGUgQXJyYXkucHJvdG90eXBlLmZpbHRlcigpIHBvbHlmaWxsOiB0aGUgY2FsbGJhY2sgIT09IGEgZnVuY3Rpb24uIik7JiN4ZDsKCQkJcmV0dXJuIG51bGw7JiN4ZDsKCQl9JiN4ZDsKJiN4ZDsKCQl2YXIgcmVzID0gW107JiN4ZDsKCQl2YXIgdGhpc0FyZyA9IGFyZ3VtZW50cy5sZW5ndGggJmd0Oz0gMiA/IGFyZ3VtZW50c1sxXSA6IHZvaWQgMDsmI3hkOwoJCWZvciAodmFyIGkgPSAwOyBpICZsdDsgbGVuOyBpKyspIHsmI3hkOwoJCQlpZiAoaSBpbiB0KSB7JiN4ZDsKCQkJCXZhciB2YWwgPSB0W2ldOyYjeGQ7CiYjeGQ7CgkJCQkvLyBOT1RFOiBUZWNobmljYWxseSB0aGlzIHNob3VsZCBPYmplY3QuZGVmaW5lUHJvcGVydHkgYXQmI3hkOwoJCQkJLy8gICAgICAgdGhlIG5leHQgaW5kZXgsIGFzIHB1c2ggY2FuIGJlIGFmZmVjdGVkIGJ5JiN4ZDsKCQkJCS8vICAgICAgIHByb3BlcnRpZXMgb24gT2JqZWN0LnByb3RvdHlwZSBhbmQgQXJyYXkucHJvdG90eXBlLiYjeGQ7CgkJCQkvLyAgICAgICBCdXQgdGhhdCBtZXRob2QncyBuZXcsIGFuZCBjb2xsaXNpb25zIHNob3VsZCBiZSYjeGQ7CgkJCQkvLyAgICAgICByYXJlLCBzbyB1c2UgdGhlIG1vcmUtY29tcGF0aWJsZSBhbHRlcm5hdGl2ZS4mI3hkOwoJCQkJaWYgKGZ1bi5jYWxsKHRoaXNBcmcsIHZhbCwgaSwgdCkpIHsmI3hkOwoJCQkJCXJlcy5wdXNoKHZhbCk7JiN4ZDsKCQkJCX0mI3hkOwoJCQl9JiN4ZDsKCQl9JiN4ZDsKJiN4ZDsKCQlyZXR1cm4gcmVzOyYjeGQ7Cgl9OyYjeGQ7Cn0mI3hkOwomI3hkOwovLyBQcm9kdWN0aW9uIHN0ZXBzIG9mIEVDTUEtMjYyLCBFZGl0aW9uIDUsIDE1LjQuNC4yMSYjeGQ7Ci8vIFJlZmVyZW5jZTogaHR0cDovL2VzNS5naXRodWIuaW8vI3gxNS40LjQuMjEmI3hkOwppZiAoIUFycmF5LnByb3RvdHlwZS5yZWR1Y2UpIHsmI3hkOwoJQXJyYXkucHJvdG90eXBlLnJlZHVjZSA9IGZ1bmN0aW9uKGNhbGxiYWNrIC8qLCBpbml0aWFsVmFsdWUqLyApIHsmI3hkOwoJCSd1c2Ugc3RyaWN0JzsmI3hkOwoJCWlmICh0aGlzID09PSBudWxsKSB7JiN4ZDsKCQkJamF2YS5sYW5nLlN5c3RlbS5vdXQucHJpbnRsbigiQW4gZXJyb3Igb2NjdXJyZWQgd2l0aGluIHRoZSBBcnJheS5wcm90b3R5cGUucmVkdWNlKCkgcG9seWZpbGw6IHRoZSBhcnJheSA9PT0gbnVsbC4iKTsmI3hkOwoJCQlyZXR1cm4gbnVsbDsmI3hkOwoJCX0mI3hkOwoJCWlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHsmI3hkOwoJCQlqYXZhLmxhbmcuU3lzdGVtLm91dC5wcmludGxuKCJBbiBlcnJvciBvY2N1cnJlZCB3aXRoaW4gdGhlIEFycmF5LnByb3RvdHlwZS5yZWR1Y2UoKSBwb2x5ZmlsbDogdGhlIGNhbGxiYWNrICE9PSBhIGZ1bmN0aW9uLiIpOyYjeGQ7CgkJCXJldHVybiBudWxsOyYjeGQ7CgkJfSYjeGQ7CgkJdmFyIHQgPSBPYmplY3QodGhpcyksJiN4ZDsKCQkJbGVuID0gdC5sZW5ndGggJmd0OyZndDsmZ3Q7IDAsJiN4ZDsKCQkJayA9IDAsJiN4ZDsKCQkJdmFsdWU7JiN4ZDsKCQlpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAyKSB7JiN4ZDsKCQkJdmFsdWUgPSBhcmd1bWVudHNbMV07JiN4ZDsKCQl9IGVsc2UgeyYjeGQ7CgkJCXdoaWxlIChrICZsdDsgbGVuICZhbXA7JmFtcDsgIShrIGluIHQpKSB7JiN4ZDsKCQkJCWsrKzsmI3hkOwoJCQl9JiN4ZDsKCQkJaWYgKGsgJmd0Oz0gbGVuKSB7JiN4ZDsKCQkJCWphdmEubGFuZy5TeXN0ZW0ub3V0LnByaW50bG4oIkFuIGVycm9yIG9jY3VycmVkIHdpdGhpbiB0aGUgQXJyYXkucHJvdG90eXBlLnJlZHVjZSgpIHBvbHlmaWxsOiBSZWR1Y2Ugb2YgZW1wdHkgYXJyYXkgd2l0aCBubyBpbml0aWFsIHZhbHVlLiIpOyYjeGQ7CgkJCQlyZXR1cm4gbnVsbDsmI3hkOwoJCQl9JiN4ZDsKCQkJdmFsdWUgPSB0W2srK107JiN4ZDsKCQl9JiN4ZDsKCQlmb3IgKDsgayAmbHQ7IGxlbjsgaysrKSB7JiN4ZDsKCQkJaWYgKGsgaW4gdCkgeyYjeGQ7CgkJCQl2YWx1ZSA9IGNhbGxiYWNrKHZhbHVlLCB0W2tdLCBrLCB0KTsmI3hkOwoJCQl9JiN4ZDsKCQl9JiN4ZDsKCQlyZXR1cm4gdmFsdWU7JiN4ZDsKCX07JiN4ZDsKfSYjeGQ7CiYjeGQ7Ci8vIFZpYSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9TdHJpbmcvVHJpbSYjeGQ7CmlmICghU3RyaW5nLnByb3RvdHlwZS50cmltKSB7JiN4ZDsKCVN0cmluZy5wcm90b3R5cGUudHJpbSA9IGZ1bmN0aW9uKCkgeyYjeGQ7CgkJcmV0dXJuIHRoaXMucmVwbGFjZSgvXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2csICcnKTsmI3hkOwoJfTsmI3hkOwp9JiN4ZDsKJiN4ZDsKLy8gQXJyYXkgZXF1YWxpdHkmI3hkOwovLyBWaWEgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy83ODM3NDU2L2hvdy10by1jb21wYXJlLWFycmF5cy1pbi1qYXZhc2NyaXB0JiN4ZDsKQXJyYXkucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uKGFycmF5KSB7JiN4ZDsKCS8vIGlmIHRoZSBvdGhlciBhcnJheSBpcyBhIGZhbHN5IHZhbHVlLCByZXR1cm4mI3hkOwoJaWYgKCFhcnJheSkgeyYjeGQ7CgkJcmV0dXJuIGZhbHNlOyYjeGQ7Cgl9JiN4ZDsKJiN4ZDsKCS8vIGNvbXBhcmUgbGVuZ3RocyAtIGNhbiBzYXZlIGEgbG90IG9mIHRpbWUmI3hkOwoJaWYgKHRoaXMubGVuZ3RoICE9IGFycmF5Lmxlbmd0aCkgeyYjeGQ7CgkJcmV0dXJuIGZhbHNlOyYjeGQ7Cgl9JiN4ZDsKJiN4ZDsKCWZvciAodmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgJmx0OyBsOyBpKyspIHsmI3hkOwoJCS8vIENoZWNrIGlmIHdlIGhhdmUgbmVzdGVkIGFycmF5cyYjeGQ7CgkJaWYgKHRoaXNbaV0gaW5zdGFuY2VvZiBBcnJheSAmYW1wOyZhbXA7IGFycmF5W2ldIGluc3RhbmNlb2YgQXJyYXkpIHsmI3hkOwoJCQkvLyByZWN1cnNlIGludG8gdGhlIG5lc3RlZCBhcnJheXMmI3hkOwoJCQlpZiAoIXRoaXNbaV0uZXF1YWxzKGFycmF5W2ldKSkgeyYjeGQ7CgkJCQlyZXR1cm4gZmFsc2U7JiN4ZDsKCQkJfSYjeGQ7CgkJfSBlbHNlIGlmICh0aGlzW2ldICE9IGFycmF5W2ldKSB7JiN4ZDsKCQkJLy8gV2FybmluZyAtIHR3byBkaWZmZXJlbnQgb2JqZWN0IGluc3RhbmNlcyB3aWxsIG5ldmVyIGJlIGVxdWFsOiB7eDoyMH0gIT0ge3g6MjB9JiN4ZDsKCQkJcmV0dXJuIGZhbHNlOyYjeGQ7CgkJfSYjeGQ7Cgl9JiN4ZDsKCXJldHVybiB0cnVlOyYjeGQ7Cn07JiN4ZDsKLy8gSGlkZSAuZXF1YWxzKCkgbWV0aG9kIGZyb20gZm9yLWluIGxvb3BzJiN4ZDsKaWYgKCEhT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7JiN4ZDsKCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsICJlcXVhbHMiLCB7JiN4ZDsKCQllbnVtZXJhYmxlOiBmYWxzZSYjeGQ7Cgl9KTsmI3hkOwp9JiN4ZDsKJiN4ZDsKLy8gUHJvZHVjdGlvbiBzdGVwcyBvZiBFQ01BLTI2MiwgRWRpdGlvbiA1LCAxNS40LjQuMTgmI3hkOwovLyBSZWZlcmVuY2U6IGh0dHA6Ly9lczUuZ2l0aHViLmlvLyN4MTUuNC40LjE4JiN4ZDsKLy8gRnJvbSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9mb3JFYWNoJiN4ZDsKLy8gTW9kaWZpZWQgdG8gcmVtb3ZlIGVycm9yIHRocm93cyYjeGQ7CmlmICghQXJyYXkucHJvdG90eXBlLmZvckVhY2gpIHsmI3hkOwomI3hkOwogIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24oY2FsbGJhY2svKiwgdGhpc0FyZyovKSB7JiN4ZDsKJiN4ZDsKICAgIHZhciBULCBrOyYjeGQ7CiYjeGQ7CiAgICBpZiAodGhpcyA9PSBudWxsKSB7JiN4ZDsKCQkJamF2YS5sYW5nLlN5c3RlbS5vdXQucHJpbnRsbigiQW4gZXJyb3Igb2NjdXJyZWQgd2l0aGluIHRoZSBBcnJheS5wcm90b3R5cGUuZm9yRWFjaCgpIHBvbHlmaWxsOiB0aGlzIGlzIG51bGwgb3Igbm90IGRlZmluZWQuIik7JiN4ZDsKCQkJcmV0dXJuIG51bGw7JiN4ZDsKICAgIH0mI3hkOwomI3hkOwogICAgLy8gMS4gTGV0IE8gYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRvT2JqZWN0KCkgcGFzc2luZyB0aGUmI3hkOwogICAgLy8gfHRoaXN8IHZhbHVlIGFzIHRoZSBhcmd1bWVudC4mI3hkOwogICAgdmFyIE8gPSBPYmplY3QodGhpcyk7JiN4ZDsKJiN4ZDsKICAgIC8vIDIuIExldCBsZW5WYWx1ZSBiZSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIEdldCgpIGludGVybmFsJiN4ZDsKICAgIC8vIG1ldGhvZCBvZiBPIHdpdGggdGhlIGFyZ3VtZW50ICJsZW5ndGgiLiYjeGQ7CiAgICAvLyAzLiBMZXQgbGVuIGJlIHRvVWludDMyKGxlblZhbHVlKS4mI3hkOwogICAgdmFyIGxlbiA9IE8ubGVuZ3RoICZndDsmZ3Q7Jmd0OyAwOyYjeGQ7CiYjeGQ7CiAgICAvLyA0LiBJZiBpc0NhbGxhYmxlKGNhbGxiYWNrKSBpcyBmYWxzZSwgdGhyb3cgYSBUeXBlRXJyb3IgZXhjZXB0aW9uLiYjeGQ7CiAgICAvLyBTZWU6IGh0dHA6Ly9lczUuZ2l0aHViLmNvbS8jeDkuMTEmI3hkOwogICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykgeyYjeGQ7CgkJCWphdmEubGFuZy5TeXN0ZW0ub3V0LnByaW50bG4oIkFuIGVycm9yIG9jY3VycmVkIHdpdGhpbiB0aGUgQXJyYXkucHJvdG90eXBlLmZvckVhY2goKSBwb2x5ZmlsbDogIiArIGNhbGxiYWNrICsgIiBpcyBub3QgYSBmdW5jdGlvbiIpOyYjeGQ7CgkJCXJldHVybiBudWxsOyYjeGQ7CiAgICB9JiN4ZDsKJiN4ZDsKICAgIC8vIDUuIElmIHRoaXNBcmcgd2FzIHN1cHBsaWVkLCBsZXQgVCBiZSB0aGlzQXJnOyBlbHNlIGxldCYjeGQ7CiAgICAvLyBUIGJlIHVuZGVmaW5lZC4mI3hkOwogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggJmd0OyAxKSB7JiN4ZDsKICAgICAgVCA9IGFyZ3VtZW50c1sxXTsmI3hkOwogICAgfSYjeGQ7CiYjeGQ7CiAgICAvLyA2LiBMZXQgayBiZSAwLiYjeGQ7CiAgICBrID0gMDsmI3hkOwomI3hkOwogICAgLy8gNy4gUmVwZWF0IHdoaWxlIGsgJmx0OyBsZW4uJiN4ZDsKICAgIHdoaWxlIChrICZsdDsgbGVuKSB7JiN4ZDsKJiN4ZDsKICAgICAgdmFyIGtWYWx1ZTsmI3hkOwomI3hkOwogICAgICAvLyBhLiBMZXQgUGsgYmUgVG9TdHJpbmcoaykuJiN4ZDsKICAgICAgLy8gICAgVGhpcyBpcyBpbXBsaWNpdCBmb3IgTEhTIG9wZXJhbmRzIG9mIHRoZSBpbiBvcGVyYXRvci4mI3hkOwogICAgICAvLyBiLiBMZXQga1ByZXNlbnQgYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBIYXNQcm9wZXJ0eSYjeGQ7CiAgICAgIC8vICAgIGludGVybmFsIG1ldGhvZCBvZiBPIHdpdGggYXJndW1lbnQgUGsuJiN4ZDsKICAgICAgLy8gICAgVGhpcyBzdGVwIGNhbiBiZSBjb21iaW5lZCB3aXRoIGMuJiN4ZDsKICAgICAgLy8gYy4gSWYga1ByZXNlbnQgaXMgdHJ1ZSwgdGhlbiYjeGQ7CiAgICAgIGlmIChrIGluIE8pIHsmI3hkOwomI3hkOwogICAgICAgIC8vIGkuIExldCBrVmFsdWUgYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBHZXQgaW50ZXJuYWwmI3hkOwogICAgICAgIC8vIG1ldGhvZCBvZiBPIHdpdGggYXJndW1lbnQgUGsuJiN4ZDsKICAgICAgICBrVmFsdWUgPSBPW2tdOyYjeGQ7CiYjeGQ7CiAgICAgICAgLy8gaWkuIENhbGwgdGhlIENhbGwgaW50ZXJuYWwgbWV0aG9kIG9mIGNhbGxiYWNrIHdpdGggVCBhcyYjeGQ7CiAgICAgICAgLy8gdGhlIHRoaXMgdmFsdWUgYW5kIGFyZ3VtZW50IGxpc3QgY29udGFpbmluZyBrVmFsdWUsIGssIGFuZCBPLiYjeGQ7CiAgICAgICAgY2FsbGJhY2suY2FsbChULCBrVmFsdWUsIGssIE8pOyYjeGQ7CiAgICAgIH0mI3hkOwogICAgICAvLyBkLiBJbmNyZWFzZSBrIGJ5IDEuJiN4ZDsKICAgICAgaysrOyYjeGQ7CiAgICB9JiN4ZDsKICAgIC8vIDguIHJldHVybiB1bmRlZmluZWQuJiN4ZDsKICB9OyYjeGQ7Cn0mI3hkOwomI3hkOwovLyBGcm9tIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9rZXlzJiN4ZDsKLy8gTW9kaWZpZWQgdG8gcmVtb3ZlIGVycm9yIHRocm93cyYjeGQ7CmlmICghT2JqZWN0LmtleXMpIHsmI3hkOwogIE9iamVjdC5rZXlzID0gKGZ1bmN0aW9uKCkgeyYjeGQ7CiAgICAndXNlIHN0cmljdCc7JiN4ZDsKICAgIHZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksJiN4ZDsKICAgICAgICBoYXNEb250RW51bUJ1ZyA9ICEoeyB0b1N0cmluZzogbnVsbCB9KS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgndG9TdHJpbmcnKSwmI3hkOwogICAgICAgIGRvbnRFbnVtcyA9IFsmI3hkOwogICAgICAgICAgJ3RvU3RyaW5nJywmI3hkOwogICAgICAgICAgJ3RvTG9jYWxlU3RyaW5nJywmI3hkOwogICAgICAgICAgJ3ZhbHVlT2YnLCYjeGQ7CiAgICAgICAgICAnaGFzT3duUHJvcGVydHknLCYjeGQ7CiAgICAgICAgICAnaXNQcm90b3R5cGVPZicsJiN4ZDsKICAgICAgICAgICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsJiN4ZDsKICAgICAgICAgICdjb25zdHJ1Y3RvcicmI3hkOwogICAgICAgIF0sJiN4ZDsKICAgICAgICBkb250RW51bXNMZW5ndGggPSBkb250RW51bXMubGVuZ3RoOyYjeGQ7CiYjeGQ7CiAgICByZXR1cm4gZnVuY3Rpb24ob2JqKSB7JiN4ZDsKICAgICAgaWYgKHR5cGVvZiBvYmogIT09ICdmdW5jdGlvbicgJmFtcDsmYW1wOyAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgb2JqID09PSBudWxsKSkgeyYjeGQ7CgkJCQlqYXZhLmxhbmcuU3lzdGVtLm91dC5wcmludGxuKCJPYmplY3Qua2V5cyBjYWxsZWQgb24gbm9uLW9iamVjdCIpOyYjeGQ7CgkJCQlyZXR1cm4gbnVsbDsmI3hkOwogICAgICB9JiN4ZDsKJiN4ZDsKICAgICAgdmFyIHJlc3VsdCA9IFtdLCBwcm9wLCBpOyYjeGQ7CiYjeGQ7CiAgICAgIGZvciAocHJvcCBpbiBvYmopIHsmI3hkOwogICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIHsmI3hkOwogICAgICAgICAgcmVzdWx0LnB1c2gocHJvcCk7JiN4ZDsKICAgICAgICB9JiN4ZDsKICAgICAgfSYjeGQ7CiYjeGQ7CiAgICAgIGlmIChoYXNEb250RW51bUJ1ZykgeyYjeGQ7CiAgICAgICAgZm9yIChpID0gMDsgaSAmbHQ7IGRvbnRFbnVtc0xlbmd0aDsgaSsrKSB7JiN4ZDsKICAgICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgZG9udEVudW1zW2ldKSkgeyYjeGQ7CiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGRvbnRFbnVtc1tpXSk7JiN4ZDsKICAgICAgICAgIH0mI3hkOwogICAgICAgIH0mI3hkOwogICAgICB9JiN4ZDsKICAgICAgcmV0dXJuIHJlc3VsdDsmI3hkOwogICAgfTsmI3hkOwogIH0oKSk7JiN4ZDsKfTwvZWNtYS1zY3JpcHQ+PC9pbXBvcnQtc2NyaXB0Pjxmb3JtCiAgICAgICAgICAgICAgICAgICAgZm9ybS1pZD0iYXBwcm92YWxfZm9ybSI+PGNvbnRlbnQ+PGZpZWxkIG5hbWU9InRpdGxlIgogICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIj48Y29udHJvbCBjb250cm9sLXR5cGU9IlRpdGxlIgogICAgICAgICAgICAgICAgICAgICAgICBlZGl0YWJsZT0iZmFsc2UiLz48L2ZpZWxkPjxmaWVsZD48Y29udHJvbAogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wtdHlwZT0iTGluZUJyZWFrIi8+PC9maWVsZD48ZmllbGQKICAgICAgICAgICAgICAgICAgICBuYW1lPSJzdWJoZWFkaW5nIiB2aXNpYmxlPSJ0cnVlIj48Y29udHJvbAogICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLXR5cGU9IlRpdGxlIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRhYmxlPSJmYWxzZSI+PHByb3BzPjxwcm9wCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImZvbnQtc2l6ZSI+PHZhbHVlPm1lZGl1bTwvdmFsdWU+PC9wcm9wPjwvcHJvcHM+PC9jb250cm9sPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJ6aC1UVyI+6KuL6YG45Y+W6YGp55W255qE5oyJ6YiV5qC45YeG5oiW5ouS57WV55Sz6KuL44CCPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJkZSI+Qml0dGUgd8OkaGxlbiBTaWUgZGllIGVudHNwcmVjaGVuZGUgU2NoYWx0ZmzDpGNoZSB6dW0gR2VuZWhtaWdlbiBvZGVyIEFibGVobmVuIGRlciBBbmZvcmRlcnVuZy48L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImVuIj5QbGVhc2Ugc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBidXR0b24gdG8gYXBwcm92ZSBvciByZWplY3QgdGhlIHJlcXVlc3QuPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJlcyI+U2VsZWNjaW9uZSBlbCBib3TDs24gYWRlY3VhZG8gcGFyYSBhcHJvYmFyIG8gcmVjaGF6YXIgbGEgcGV0aWNpw7NuLjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iZnIiPlPDqWxlY3Rpb25uZXogbGUgYm91dG9uIGFwcHJvcHJpw6kgcG91ciBhcHByb3V2ZXIgb3UgcmVmdXNlciBsYSByZXF1w6p0ZS48L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImphIj7oqbLlvZPjgZnjgovjg5zjgr/jg7PjgpLpgbjmip7jgZfjgabopoHmsYLjgpLmib/oqo3jgb7jgZ/jga/ljbTkuIvjgZfjgabjgY/jgaDjgZXjgYTjgII8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9Iml0Ij5TZWxlemlvbmFyZSBpbCBwdWxzYW50ZSBhcHByb3ByaWF0byBwZXIgYXBwcm92YXJlIG8gcmlmaXV0YXJlIGxhIHJpY2hpZXN0YS48L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9Im5sIj5TZWxlY3RlZXIgZGUgYmV0cmVmZmVuZGUga25vcCBvbSBkZSBhYW52cmFhZyBnb2VkIHRlIGtldXJlbiBvZiBhZiB0ZSB3aWp6ZW4uPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJwdCI+U2VsZWNpb25lIG8gYm90w6NvIGFwcm9wcmlhZG8gcGFyYSBhcHJvdmFyIG91IHJlamVpdGFyIGEgc29saWNpdGHDp8Ojby48L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InJ1Ij7QndCw0LbQvNC40YLQtSDRgdC+0L7RgtCy0LXRgtGB0YLQstGD0Y7RidGD0Y4g0LrQvdC+0L/QutGDINC00LvRjyDQv9C+0LTRgtCy0LXRgNC20LTQtdC90LjRjyDQuNC70Lgg0L7RgtC60LvQvtC90LXQvdC40Y8g0LfQsNC/0YDQvtGB0LAuPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJzdiI+R29ka8Okbm4gZWxsZXIgYXZzbMOlIGJlZ8OkcmFuIG1lZCBtb3RzdmFyYW5kZSBrbmFwcC48L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InpoLUNOIj7or7fpgInmi6nnm7jlupTnmoTmjInpkq7ku6Xmibnlh4bmiJbmi5Lnu53or7fmsYLjgII8L2Rpc3BsYXktbGFiZWw+PC9maWVsZD48ZmllbGQ+PGNvbnRyb2wKICAgICAgICAgICAgICAgICAgICBjb250cm9sLXR5cGU9IkxpbmVCcmVhayIvPjwvZmllbGQ+PGZpZWxkCiAgICAgICAgICAgICAgICAgICAgZGF0YS10eXBlPSJkbiIgbmFtZT0iaW5pdGlhdG9yIgogICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIj48Y29udHJvbCBjb250cm9sLXR5cGU9IkRORGlzcGxheSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0YWJsZT0iZmFsc2UiPjxwcm9wcz48cHJvcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImRpc3BsYXktZXhwIj48dmFsdWU+Rmlyc3ROYW1lIExhc3ROYW1lPC92YWx1ZT48L3Byb3A+PHByb3AKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iZGlzcGxheS1lbnRpdHlkZWYiPjx2YWx1ZT51c2VyPC92YWx1ZT48L3Byb3A+PC9wcm9wcz48L2NvbnRyb2w+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InpoLVRXIj7nlLPoq4vogIXvvJo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImRlIj5BbmdlZm9yZGVydCB2b246PC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJlbiI+UmVxdWVzdGVkIGJ5OjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iZXMiPlBldGljacOzbiBkZTo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImZyIj5EZW1hbmTDqSBwYXIgOjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iamEiPuimgeaxguWFgzo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9Iml0Ij5SaWNoaWVzdGEgZGE6PC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJubCI+QWFuZ2V2cmFhZ2QgZG9vcjo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InB0Ij5Tb2xpY2l0YWRvIHBvcjo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InJ1Ij7Ql9Cw0L/RgNCw0YjQuNCy0LDRjtGJ0LjQuTo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InN2Ij5CZWfDpHJhbiBza2lja2FkIGF2OjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJ6aC1DTiI+6K+35rGC5Lq677yaPC9kaXNwbGF5LWxhYmVsPjwvZmllbGQ+PGZpZWxkCiAgICAgICAgICAgICAgICAgICAgZGF0YS10eXBlPSJkbiIgbmFtZT0icmVjaXBpZW50IgogICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIj48Y29udHJvbCBjb250cm9sLXR5cGU9IkRORGlzcGxheSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0YWJsZT0iZmFsc2UiPjxwcm9wcz48cHJvcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImRpc3BsYXktZXhwIj48dmFsdWU+Rmlyc3ROYW1lIExhc3ROYW1lPC92YWx1ZT48L3Byb3A+PHByb3AKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iZGlzcGxheS1lbnRpdHlkZWYiPjx2YWx1ZT51c2VyPC92YWx1ZT48L3Byb3A+PC9wcm9wcz48L2NvbnRyb2w+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InpoLVRXIj7mlLbku7bogIXvvJo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImRlIj5FbXBmw6RuZ2VyOjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iZW4iPlJlY2lwaWVudDo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImVzIj5EZXN0aW5hdGFyaW86PC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJmciI+RGVzdGluYXRhaXJlIDo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImphIj7lj5fkv6HogIU6PC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJpdCI+RGVzdGluYXRhcmlvOjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0ibmwiPk9udHZhbmdlcjo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InB0Ij5EZXN0aW5hdMOhcmlvOjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0icnUiPtCf0L7Qu9GD0YfQsNGC0LXQu9GMOjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0ic3YiPk1vdHRhZ2FyZTo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InpoLUNOIj7mlLbku7bkurrvvJo8L2Rpc3BsYXktbGFiZWw+PC9maWVsZD48ZmllbGQ+PGNvbnRyb2wKICAgICAgICAgICAgICAgICAgICBjb250cm9sLXR5cGU9IkxpbmVCcmVhayIvPjwvZmllbGQ+PGZpZWxkCiAgICAgICAgICAgICAgICAgICAgZGF0YS10eXBlPSJkYXRlIiBuYW1lPSJpbml0aWF0ZWRUaW1lIgogICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIj48Y29udHJvbAogICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLXR5cGU9IkRhdGVQaWNrZXIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdGFibGU9ImZhbHNlIj48cHJvcHM+PHByb3AKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iZGF5SGVhZGVycyI+PHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJ6aC1UVyI+J+aXpScsJ+S4gCcsJ+S6jCcsJ+S4iScsJ+WbmycsJ+S6lCcsJ+WFrSc8L3ZhbHVlPjx2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iZGUiPidTJywnTScsJ0QnLCdNJywnRCcsJ0YnLCdTJzwvdmFsdWU+PHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJlbiI+J1MnLCdNJywnVCcsJ1cnLCdUJywnRicsJ1MnPC92YWx1ZT48dmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImVzIj4nRCcsJ0wnLCdNJywnTScsJ0onLCdWJywnUyc8L3ZhbHVlPjx2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iZnIiPidEJywnTCcsJ00nLCdNJywnSicsJ1YnLCdTJzwvdmFsdWU+PHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJqYSI+J+aXpScsJ+aciCcsJ+eBqycsJ+awtCcsJ+acqCcsJ+mHkScsJ+Wcnyc8L3ZhbHVlPjx2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iaXQiPidEJywnTCcsJ00nLCdNJywnRycsJ1YnLCdTJzwvdmFsdWU+PHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJubCI+J3onLCdtJywnZCcsJ3cnLCdkJywndicsJ3onPC92YWx1ZT48dmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InB0Ij4nRCcsJ1MnLCdUJywnUScsJ1EnLCdTJywnUyc8L3ZhbHVlPjx2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0icnUiPifQkicsJ9CfJywn0JInLCfQoScsJ9CnJywn0J8nLCfQoSc8L3ZhbHVlPjx2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0ic3YiPidTJywnTScsJ1QnLCdPJywnVCcsJ0YnLCdMJzwvdmFsdWU+PHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InpoLUNOIj4n5pelJywn5LiAJywn5LqMJywn5LiJJywn5ZubJywn5LqUJywn5YWtJzwvdmFsdWU+PC9wcm9wPjxwcm9wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im1vbnRoTmFtZXMiPjx2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iemgtVFciPicxIOaciCcsJzIg5pyIJywnMyDmnIgnLCc0IOaciCcsJzUg5pyIJywnNiDmnIgnLCc3IOaciCcsJzgg5pyIJywnOSDmnIgnLCcxMCDmnIgnLCcxMSDmnIgnLCcxMiDmnIgnPC92YWx1ZT48dmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImRlIj4nSmFudWFyJywnRmVicnVhcicsJ03DpHJ6JywnQXByaWwnLCdNYWknLCdKdW5pJywnSnVsaScsJ0F1Z3VzdCcsJ1NlcHRlbWJlcicsJ09rdG9iZXInLCdOb3ZlbWJlcicsJ0RlemVtYmVyJzwvdmFsdWU+PHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJlbiI+J0phbnVhcnknLCdGZWJydWFyeScsJ01hcmNoJywnQXByaWwnLCdNYXknLCdKdW5lJywnSnVseScsJ0F1Z3VzdCcsJ1NlcHRlbWJlcicsJ09jdG9iZXInLCdOb3ZlbWJlcicsJ0RlY2VtYmVyJzwvdmFsdWU+PHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJlcyI+J0VuZXJvJywnRmVicmVybycsJ01hcnpvJywnQWJyaWwnLCdNYXlvJywnSnVuaW8nLCdKdWxpbycsJ0Fnb3N0bycsJ1NlcHRpZW1icmUnLCdPY3R1YnJlJywnTm92aWVtYnJlJywnRGljaWVtYnJlJzwvdmFsdWU+PHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJmciI+J0phbnZpZXInLCdGw6l2cmllcicsJ01hcnMnLCdBdnJpbCcsJ01haScsJ0p1aW4nLCdKdWlsbGV0JywnQW/Du3QnLCdTZXB0ZW1icmUnLCdPY3RvYnJlJywnTm92ZW1icmUnLCdEw6ljZW1icmUnPC92YWx1ZT48dmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImphIj4nMeaciCcsJzLmnIgnLCcz5pyIJywnNOaciCcsJzXmnIgnLCc25pyIJywnN+aciCcsJzjmnIgnLCc55pyIJywnMTDmnIgnLCcxMeaciCcsJzEy5pyIJzwvdmFsdWU+PHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJpdCI+J2dlbm5haW8nLCdmZWJicmFpbycsJ21hcnpvJywnYXByaWxlJywnbWFnZ2lvJywnZ2l1Z25vJywnbHVnbGlvJywnYWdvc3RvJywnc2V0dGVtYnJlJywnb3R0b2JyZScsJ25vdmVtYnJlJywnZGljZW1icmUnPC92YWx1ZT48dmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9Im5sIj4namFudWFyaScsJ2ZlYnJ1YXJpJywnbWFhcnQnLCdhcHJpbCcsJ21laScsJ2p1bmknLCdqdWxpJywnYXVndXN0dXMnLCdzZXB0ZW1iZXInLCdva3RvYmVyJywnbm92ZW1iZXInLCdkZWNlbWJlcic8L3ZhbHVlPjx2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0icHQiPidKYW5laXJvJywnRmV2ZXJlaXJvJywnTWFyw6dvJywnQWJyaWwnLCdNYWlvJywnSnVuaG8nLCdKdWxobycsJ0Fnb3N0bycsJ1NldGVtYnJvJywnT3V0dWJybycsJ05vdmVtYnJvJywnRGV6ZW1icm8nPC92YWx1ZT48dmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InJ1Ij4n0K/QvdCy0LDRgNGMJywn0KTQtdCy0YDQsNC70YwnLCfQnNCw0YDRgicsJ9CQ0L/RgNC10LvRjCcsJ9Cc0LDQuScsJ9CY0Y7QvdGMJywn0JjRjtC70YwnLCfQkNCy0LPRg9GB0YInLNCh0LXQvdGC0Y/QsdGA0YwnLCfQntC60YLRj9Cx0YDRjCcsJ9Cd0L7Rj9Cx0YDRjCcsJ9CU0LXQutCw0LHRgNGMJzwvdmFsdWU+PHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJzdiI+J0phbnVhcmknLCdGZWJydWFyaScsJ01hcnMnLCdBcHJpbCcsJ01haicsJ0p1bmknLCdKdWxpJywnQXVndXN0aScsJ1NlcHRlbWJlcicsJ09rdG9iZXInLCdOb3ZlbWJlcicsJ0RlY2VtYmVyJzwvdmFsdWU+PHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJ6aC1DTiI+J+S4gOaciCcsJ+S6jOaciCcsJ+S4ieaciCcsJ+Wbm+aciCcsJ+S6lOaciCcsJ+WFreaciCcsJ+S4g+aciCcsJ+WFq+aciCcsJ+S5neaciCcsJ+WNgeaciCcsJ+WNgeS4gOaciCcsJ+WNgeS6jOaciCc8L3ZhbHVlPjwvcHJvcD48L3Byb3BzPjwvY29udHJvbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iemgtVFciPueUs+iri+aXpe+8mjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iZGUiPkFuZm9yZGVydW5nc2RhdHVtPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJlbiI+UmVxdWVzdCBEYXRlOjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iZXMiPkZlY2hhIGRlIGxhIHBldGljacOzbjo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImZyIj5EYXRlIGRlIGxhIHJlcXXDqnRlIDo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImphIj7opoHmsYLml6U6PC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJpdCI+RGF0YSBkZWxsYSByaWNoaWVzdGE6PC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJubCI+RGF0dW0gdmFuIGFhbnZyYWFnOjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0icHQiPkRhdGEgZGUgU29saWNpdGHDp8Ojbzo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InJ1Ij7QlNCw0YLQsCDQt9Cw0L/RgNC+0YHQsDo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InN2Ij5CZWfDpHJhbiBza2lja2FkIGRlbjo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InpoLUNOIj7or7fmsYLml6XmnJ/vvJo8L2Rpc3BsYXktbGFiZWw+PC9maWVsZD48ZmllbGQ+PGNvbnRyb2wKICAgICAgICAgICAgICAgICAgICBjb250cm9sLXR5cGU9IkxpbmVCcmVhayIvPjwvZmllbGQ+PGZpZWxkCiAgICAgICAgICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9InJlYXNvbiIKICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZT0idHJ1ZSI+PGNvbnRyb2wgY29udHJvbC10eXBlPSJUZXh0IgogICAgICAgICAgICAgICAgICAgICAgICBlZGl0YWJsZT0iZmFsc2UiLz48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iemgtVFciPuWOn+WboO+8mjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iZGUiPlVyc2FjaGU6PC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJlbiI+UmVhc29uOjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iZXMiPlJhesOzbjo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImZyIj5SYWlzb24gOjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iamEiPueQhueUsTo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9Iml0Ij5Nb3Rpdm86PC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJubCI+UmVkZW46PC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJwdCI+UmF6w6NvOjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0icnUiPtCf0YDQuNGH0LjQvdCwOjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0ic3YiPk9yc2FrOjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iemgtQ04iPuWOn+WboO+8mjwvZGlzcGxheS1sYWJlbD48L2ZpZWxkPjxmaWVsZD48Y29udHJvbAogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wtdHlwZT0iTGluZUJyZWFrIi8+PC9maWVsZD48ZmllbGQKICAgICAgICAgICAgICAgICAgICBkYXRhLXR5cGU9InN0cmluZyIgbmFtZT0iYXB3YUNvbW1lbnQiCiAgICAgICAgICAgICAgICAgICAgICAgIHZpc2libGU9InRydWUiPjxjb250cm9sIGNvbnRyb2wtdHlwZT0iVGV4dEFyZWEiCiAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRhYmxlPSJ0cnVlIiByZXF1aXJlZD0iZmFsc2UiLz48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iemgtVFciPuWCmeiou++8mjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iZGUiPktvbW1lbnRhcjo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImVuIj5Db21tZW50OjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iZXMiPkNvbWVudGFyaW86PC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJmciI+Q29tbWVudGFpcmUgOjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iamEiPuOCs+ODoeODs+ODiDo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9Iml0Ij5Db21tZW50bzo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9Im5sIj5PcG1lcmtpbmc6PC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJwdCI+Q29tZW50w6FyaW86PC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJydSI+0JrQvtC80LzQtdC90YLQsNGA0LjQuTo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InN2Ij5Lb21tZW50YXI6PC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJ6aC1DTiI+5rOo6YeK77yaPC9kaXNwbGF5LWxhYmVsPjwvZmllbGQ+PGZpZWxkPjxjb250cm9sCiAgICAgICAgICAgICAgICAgICAgY29udHJvbC10eXBlPSJMaW5lQnJlYWsiLz48L2ZpZWxkPjxhY3Rpb25zCiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uPSJib3R0b20iPjxhY3Rpb24gYmxvY2stb24tZXJyb3I9ImZhbHNlIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iQ29tbWVudEFjdGlvbiI+PGNvbnRyb2wKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wtdHlwZT0iQnV0dG9uIi8+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJ6aC1UVyI+5qqi6KaW5YKZ6Ki75q2356iLPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iZGUiPktvbW1lbnRhcnZlcmxhdWYgYW56ZWlnZW48L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJlbiI+VmlldyBDb21tZW50IEhpc3Rvcnk8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJlcyI+VmVyIGhpc3RvcmlhbCBkZSBjb21lbnRhcmlvczwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImZyIj5BZmZpY2hlciBsJ2hpc3RvcmlxdWUgZGVzIGNvbW1lbnRhaXJlczwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImphIj7jgrPjg6Hjg7Pjg4jlsaXmrbTjga7ooajnpLo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJpdCI+VmlzdWFsaXp6YSBjcm9ub2xvZ2lhIGNvbW1lbnRpPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0ibmwiPk9wbWVya2luZ3NoaXN0b3JpZSB3ZWVyZ2V2ZW48L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJwdCI+VmVyIEhpc3TDs3JpY28gZGUgQ29tZW50w6FyaW9zPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0icnUiPtCf0YDQvtGB0LzQvtGC0YAg0L/RgNC+0YLQvtC60L7Qu9CwINC60L7QvNC80LXQvdGC0LDRgNC40LXQsjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InN2Ij5WaXNhIGtvbW1lbnRhcnNoaXN0b3JpazwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InpoLUNOIj7mn6XnnIvms6jph4rljoblj7I8L2Rpc3BsYXktbGFiZWw+PC9hY3Rpb24+PGZpZWxkPjxjb250cm9sCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wtdHlwZT0iTGluZUJyZWFrIi8+PC9maWVsZD48YWN0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgIGhpZGUtaWYtcmVhZG9ubHk9InRydWUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJEZW55QWN0aW9uIj48Y29udHJvbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC10eXBlPSJCdXR0b24iLz48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InpoLVRXIj7mi5LntZU8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJkZSI+VmVyd2VpZ2VybjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImVuIj5EZW55PC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iZXMiPkRlbmVnYXI8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJmciI+UmVmdXNlcjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImphIj7ljbTkuIs8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJpdCI+UmlmaXV0YTwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9Im5sIj5BZndpanplbjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InB0Ij5OZWdhcjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InJ1Ij7Ql9Cw0L/RgNC10YLQuNGC0Yw8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJzdiI+QXZzbMOlPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJ6aC1DTiI+5ouS57udPC9kaXNwbGF5LWxhYmVsPjwvYWN0aW9uPjxhY3Rpb24KICAgICAgICAgICAgICAgICAgICAgICAgaGlkZS1pZi1yZWFkb25seT0idHJ1ZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IkFwcHJvdmFsQWN0aW9uIj48Y29udHJvbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC10eXBlPSJCdXR0b24iLz48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InpoLVRXIj7moLjlh4Y8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJkZSI+R2VuZWhtaWdlbjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImVuIj5BcHByb3ZlPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iZXMiPkFwcm9iYXI8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJmciI+QXBwcm91dmVyPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iamEiPuaJv+iqjTwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9Iml0Ij5BcHByb3ZhPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0ibmwiPkdvZWRrZXVyZW48L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJwdCI+QXByb3ZhcjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InJ1Ij7Qn9C+0LTRgtCy0LXRgNC00LjRgtGMPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0ic3YiPkdvZGvDpG5uPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJ6aC1DTiI+5om55YeGPC9kaXNwbGF5LWxhYmVsPjwvYWN0aW9uPjxhY3Rpb24KICAgICAgICAgICAgICAgICAgICAgICAgaGlkZS1pZi1yZWFkb25seT0idHJ1ZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IkNsYWltQWN0aW9uIj48Y29udHJvbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC10eXBlPSJCdXR0b24iLz48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InpoLVRXIj5DbGFpbTwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImRlIj5DbGFpbTwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImVuIj5DbGFpbTwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImVzIj5DbGFpbTwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImZyIj5DbGFpbTwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImphIj5DbGFpbTwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9Iml0Ij5DbGFpbTwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9Im5sIj5DbGFpbTwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InB0Ij5DbGFpbTwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InJ1Ij5DbGFpbTwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InN2Ij5DbGFpbTwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICB4bWw6bGFuZz0iemgtQ04iPkNsYWltPC9kaXNwbGF5LWxhYmVsPjwvYWN0aW9uPjwvYWN0aW9ucz48L2NvbnRlbnQ+PC9mb3JtPjxkYXRhLWl0ZW1zCiAgICAgICAgICAgICAgICBhY3Rpdml0eS1pZD0ibWFwVGVzdHMxIj48ZGF0YS1pdGVtIGRhdGEtdHlwZT0ic3RyaW5nIgogICAgICAgICAgICAgICAgbmFtZT0iTUFQMCIKICAgICAgICAgICAgICAgIHNvdXJjZT0iUFJELnV0aWwubG9nZXJyb3IoICc9PT09PT09PT09PT0nICk7IFBSRC51dGlsLmZvcm1PckVuZ2luZSgpOyIKICAgICAgICAgICAgICAgIHRhcmdldD0iZmxvd2RhdGEudGVzdC9Gb3JtT3JFbmdpbmUiCiAgICAgICAgICAgICAgICB0YXJnZXQtdHlwZT0ibXVsdGktdmFsdWUtbGlzdCIvPjxkYXRhLWl0ZW0KICAgICAgICAgICAgICAgIGRhdGEtdHlwZT0ic3RyaW5nIiBuYW1lPSJNQVAxIgogICAgICAgICAgICAgICAgc291cmNlPSJQUkQudXRpbC5FQ01BQXJyYXlUb0phdmFWZWN0b3IoIFsnMScsJzInLCczJ10gKTsiCiAgICAgICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvbWFueS92YWx1ZSIKICAgICAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDIiCiAgICAgICAgICAgICAgICBzb3VyY2U9IlBSRC5JRFZnZXQoICdjbj1hZG1pbixvdT1zYSxvPXN5c3RlbScsICd1c2VyJywgJ2NuJyApIgogICAgICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L0lEVmdldC90ZXN0MCIKICAgICAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDMiCiAgICAgICAgICAgICAgICBzb3VyY2U9IlBSRC5JRFZnZXQoICdjbj1hZG1pbixvdT1zYSxvPXN5c3RlbScsICd1c2VyJywgJ1RpdGxlJyApIgogICAgICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L0lEVmdldC90ZXN0MSIKICAgICAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDQiCiAgICAgICAgICAgICAgICBzb3VyY2U9IlBSRC5JRFZnZXQoICdjbj1hZG1pbixvdT1zYSxvPXN5c3RlbScsICd1c2VyJywgJ0NOJyApIgogICAgICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L0lEVmdldC90ZXN0MiIKICAgICAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDUiCiAgICAgICAgICAgICAgICBzb3VyY2U9IlBSRC5JRFZnZXQoICdjbj1hZG1pbixvdT1zYSxvPXN5c3RlbScsICd1c2VyJywgJ0FDTCcgKS5qb2luKCc7Jyk7IgogICAgICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L0lEVmdldC90ZXN0MyIKICAgICAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDYiCiAgICAgICAgICAgICAgICBzb3VyY2U9IklEVmF1bHQuZ2V0KCAnY249YWRtaW4sb3U9c2Esbz1zeXN0ZW0nLCAndXNlcicsICdBQ0wnICkiCiAgICAgICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvSURWZ2V0L3Rlc3Q0IgogICAgICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgICAgICBkYXRhLXR5cGU9InN0cmluZyIgbmFtZT0iTUFQNyIKICAgICAgICAgICAgICAgIHNvdXJjZT0iZnVuY3Rpb24gbGlzdCgpIHt2YXIgbD1uZXcgamF2YS51dGlsLlZlY3RvcigpO2wuYWRkKCdCbHVlJyk7bC5hZGQoJ1JlZCcpOyBsLmFkZCgnR3JlZW4nKTsgcmV0dXJuIGw7fSYjeGQ7JiN4YTtQUkQudXRpbC5KYXZhVmVjdG9yVG9FQ01BQXJyYXkoIGxpc3QoKSApLmpvaW4oJzsnKTsiCiAgICAgICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvVmVjdG9ydG9BcnJheSIKICAgICAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDgiCiAgICAgICAgICAgICAgICBzb3VyY2U9IlBSRC51dGlsLkdDVmdldCggJ3ByZHRlc3QubGFiLjAwMScgKTsiCiAgICAgICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvR0NWL2dldDEiCiAgICAgICAgICAgICAgICB0YXJnZXQtdHlwZT0ibXVsdGktdmFsdWUtbGlzdCIvPjxkYXRhLWl0ZW0KICAgICAgICAgICAgICAgIGRhdGEtdHlwZT0ic3RyaW5nIiBuYW1lPSJNQVA5IgogICAgICAgICAgICAgICAgc291cmNlPSJQUkQudXRpbC5HQ1ZnZXQoICdpbnZhbGlkbmFtZScgKTsiCiAgICAgICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvR0NWL2dldDIiCiAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PC9kYXRhLWl0ZW1zPjxkYXRhLWl0ZW1zCiAgICAgICAgICAgICAgICBhY3Rpdml0eS1pZD0ibWFwVGVzdHMyIj48ZGF0YS1pdGVtIGRhdGEtdHlwZT0ic3RyaW5nIgogICAgICAgICAgICAgICAgbmFtZT0iTUFQMCIKICAgICAgICAgICAgICAgIHNvdXJjZT0iUFJELnV0aWwubG9nZXJyb3IoICc9PT09PT09PT09PT0nICk7IFBSRC51dGlsLmxvZ2Vycm9yKCAnSURWZ1EgdGVzdDE6ICcgKTtQUkQuSURWZ2xvYmFsUXVlcnkoICdDb250YWluZXJzVW5kZXJEYXRhJyApIgogICAgICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L0lEVmdsb2JhbFF1ZXJ5L3Rlc3QwIgogICAgICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgICAgICBkYXRhLXR5cGU9InN0cmluZyIgbmFtZT0iTUFQMSIKICAgICAgICAgICAgICAgIHNvdXJjZT0iUFJELnV0aWwubG9nZXJyb3IoICdJRFZnUSB0ZXN0MjogJyApO1BSRC5JRFZnbG9iYWxRdWVyeSggJ0NvbnRhaW5lcnNVbmRlckRhdGEnLCB7fSApIgogICAgICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L0lEVmdsb2JhbFF1ZXJ5L3Rlc3QxIgogICAgICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgICAgICBkYXRhLXR5cGU9InN0cmluZyIgbmFtZT0iTUFQMiIKICAgICAgICAgICAgICAgIHNvdXJjZT0iUFJELnV0aWwubG9nZXJyb3IoICdJRFZnUSB0ZXN0MzogJyApOyBTY3JpcHRWYXVsdC5KU09OLnN0cmluZ2lmeSggUFJELklEVmdsb2JhbFF1ZXJ5KCAnQ29udGFpbmVyc1VuZGVyRGF0YScsIHsgJnF1b3Q7b3UmcXVvdDs6JnF1b3Q7c2EmcXVvdDt9ICkgKSIKICAgICAgICAgICAgICAgIHRhcmdldD0iZmxvd2RhdGEudGVzdC9JRFZnbG9iYWxRdWVyeS90ZXN0MiIKICAgICAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDMiCiAgICAgICAgICAgICAgICBzb3VyY2U9IlBSRC51dGlsLmxvZ2Vycm9yKCAnSURWZ1EgdGVzdDQ6ICcgKTtQUkQuSURWZ2xvYmFsUXVlcnkoICdDb250YWluZXJzVW5kZXJEYXRhJywgeyB3cm9uZ3BhcmFtOiZxdW90O0VuZ2luZWVyJnF1b3Q7fSApIgogICAgICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L0lEVmdsb2JhbFF1ZXJ5L3Rlc3QzIgogICAgICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgICAgICBkYXRhLXR5cGU9InN0cmluZyIgbmFtZT0iTUFQNCIKICAgICAgICAgICAgICAgIHNvdXJjZT0iUFJELnV0aWwubG9nZXJyb3IoICdJRFZnUSB0ZXN0NTogJyApO1BSRC5JRFZnbG9iYWxRdWVyeSggJ2luY29ycmVjdERBTHF1ZXJ5a2V5JywgeyB3cm9uZ3BhcmFtOiZxdW90O0VuZ2luZWVyJnF1b3Q7fSApIgogICAgICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L0lEVmdsb2JhbFF1ZXJ5L3Rlc3Q0IgogICAgICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgICAgICBkYXRhLXR5cGU9InN0cmluZyIgbmFtZT0iTUFQNSIKICAgICAgICAgICAgICAgIHNvdXJjZT0iUFJELnV0aWwubG9nZXJyb3IoICdJRFZnUSB0ZXN0NjogJyApOyBTY3JpcHRWYXVsdC5KU09OLnN0cmluZ2lmeSggUFJELklEVmdsb2JhbFF1ZXJ5KCAnQ29udGFpbmVyc1VuZGVyRGF0YScsIHsgb3U6JnF1b3Q7KiZxdW90OyB9ICkgKTsiCiAgICAgICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvSURWZ2xvYmFsUXVlcnkvdGVzdDUiCiAgICAgICAgICAgICAgICB0YXJnZXQtdHlwZT0ibXVsdGktdmFsdWUtbGlzdCIvPjxkYXRhLWl0ZW0KICAgICAgICAgICAgICAgIGRhdGEtdHlwZT0ic3RyaW5nIiBuYW1lPSJNQVA2IgogICAgICAgICAgICAgICAgc291cmNlPSJJRFZhdWx0Lmdsb2JhbFF1ZXJ5KCAnQ29udGFpbmVyc1VuZGVyRGF0YScsIHsgb3U6JnF1b3Q7KiZxdW90OyB9ICkiCiAgICAgICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvSURWZ2xvYmFsUXVlcnkvdGVzdDYiCiAgICAgICAgICAgICAgICB0YXJnZXQtdHlwZT0ibXVsdGktdmFsdWUtbGlzdCIvPjxkYXRhLWl0ZW0KICAgICAgICAgICAgICAgIGRhdGEtdHlwZT0ic3RyaW5nIiBuYW1lPSJNQVA3IgogICAgICAgICAgICAgICAgc291cmNlPSJQUkQuc2V0bG9ncHJlZml4KCAnPS09LT0tPj4gJyApOyBQUkQudXRpbC5nZXROYW1lZFBhc3N3b3JkKCAncHJkdGVzdC5sYWIucGFzc3dvcmQuMDAxJyApOyIKICAgICAgICAgICAgICAgIHRhcmdldD0iZmxvd2RhdGEudGVzdC9OYW1lZFB3ZC9nZXQxIgogICAgICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgICAgICBkYXRhLXR5cGU9InN0cmluZyIgbmFtZT0iTUFQOCIKICAgICAgICAgICAgICAgIHNvdXJjZT0iUFJELnV0aWwuZ2V0TmFtZWRQYXNzd29yZCggJ2ludmFsaWRuYW1lJyApOyIKICAgICAgICAgICAgICAgIHRhcmdldD0iZmxvd2RhdGEudGVzdC9OYW1lZFB3ZC9nZXQyIgogICAgICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgICAgICBkYXRhLXR5cGU9InN0cmluZyIgbmFtZT0iTUFQOSIKICAgICAgICAgICAgICAgIHNvdXJjZT0iUFJELnV0aWwuZ2V0TmFtZWRQYXNzd29yZCggJ3ByZHRlc3QubGFiLnBhc3N3b3JkLjAwMScsIHRydWUgKTsiCiAgICAgICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvTmFtZWRQd2QvZ2V0MyIKICAgICAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDEwIgogICAgICAgICAgICAgICAgc291cmNlPSJQUkQudXRpbC5nZXROYW1lZFBhc3N3b3JkKCAnaW52YWxpZG5hbWUnLCB0cnVlICk7IgogICAgICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L05hbWVkUHdkL2dldDQiCiAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PC9kYXRhLWl0ZW1zPjxkYXRhLWl0ZW1zCiAgICAgICAgICAgICAgICBhY3Rpdml0eS1pZD0ibWFwVGVzdHMzIj48ZGF0YS1pdGVtIGRhdGEtdHlwZT0ic3RyaW5nIgogICAgICAgICAgICAgICAgbmFtZT0iTUFQMCIKICAgICAgICAgICAgICAgIHNvdXJjZT0iUFJELnV0aWwubG9nZXJyb3IoICc9PT09PT09PT09PT0nICk7IFBSRC51dGlsLkpTT05vYmoucGFyc2UoICd7JnF1b3Q7dmFsaWQmcXVvdDs6JnF1b3Q7Zm9ybWF0JnF1b3Q7fScgKTsiCiAgICAgICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvSlNPTi9wYXJzZTAxIgogICAgICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgICAgICBkYXRhLXR5cGU9InN0cmluZyIgbmFtZT0iTUFQMSIKICAgICAgICAgICAgICAgIHNvdXJjZT0iUFJELnV0aWwuSlNPTm9iai5wYXJzZSggJ3smcXVvdDtmb28mcXVvdDs6IDEnICk7IgogICAgICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L0pTT04vcGFyc2UwMiIKICAgICAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDIiCiAgICAgICAgICAgICAgICBzb3VyY2U9InZhciB0c3Q9eyZxdW90O2EmcXVvdDs6JnF1b3Q7YiZxdW90O307UFJELnV0aWwuSlNPTm9iai5zdHJpbmdpZnkoIHRzdCApOyIKICAgICAgICAgICAgICAgIHRhcmdldD0iZmxvd2RhdGEudGVzdC9KU09OL3N0cmluZ2lmeTAxIgogICAgICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgICAgICBkYXRhLXR5cGU9InN0cmluZyIgbmFtZT0iTUFQMyIKICAgICAgICAgICAgICAgIHNvdXJjZT0iUFJELnV0aWwuSlNPTm9iai5zdHJpbmdpZnkoIG5ldyBqYXZhLnV0aWwuVmVjdG9yKCkgKTsiCiAgICAgICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvSlNPTi9zdHJpbmdpZnkwMiIKICAgICAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDQiCiAgICAgICAgICAgICAgICBzb3VyY2U9IlBSRC51dGlsLkpTT05vYmouc3RyaW5naWZ5KCBQUkQudXRpbC51bmlxdWUoIFsgNywgMSw0LDcsICd0ZXN0Jyw0ICwnbWFueScsIDkxNywxICwgOTE3LCAnbWFueScsIFsgJ2FyZ2gnIF0gXSApICk7IgogICAgICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L1VuaXF1ZS9BcnJheS9hMDEvaXRlbXMiCiAgICAgICAgICAgICAgICB0YXJnZXQtdHlwZT0ibXVsdGktdmFsdWUtbGlzdCIvPjxkYXRhLWl0ZW0KICAgICAgICAgICAgICAgIGRhdGEtdHlwZT0ic3RyaW5nIiBuYW1lPSJNQVA1IgogICAgICAgICAgICAgICAgc291cmNlPSJQUkQudXRpbC5KU09Ob2JqLnN0cmluZ2lmeSggUFJELnV0aWwudW5pcXVlKCBbICdyZWQnLCAnR3JlZW4nLCAnYmx1ZScsICdncmVlbicsICdibHVlJywgJ0dyZWVuJywgJ2JMdWUnLCAnZ3JlZW4nLCAncmVkJyBdICkgKTsiCiAgICAgICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvVW5pcXVlL0FycmF5L2EwMi9pdGVtcyIKICAgICAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDYiCiAgICAgICAgICAgICAgICBzb3VyY2U9IlBSRC51dGlsLkpTT05vYmouc3RyaW5naWZ5KCBQUkQudXRpbC51bmlxdWUoIFsgNywgMSw0LDcsICd0ZXN0Jyw0ICwnbWFueScsIDkxNywxICwgOTE3LCAnbWFueScsIFsgJ2FyZ2gnIF0gXSwgdHJ1ZSApICk7IgogICAgICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L1VuaXF1ZS9BcnJheS9hMDMvaXRlbXMiCiAgICAgICAgICAgICAgICB0YXJnZXQtdHlwZT0ibXVsdGktdmFsdWUtbGlzdCIvPjxkYXRhLWl0ZW0KICAgICAgICAgICAgICAgIGRhdGEtdHlwZT0ic3RyaW5nIiBuYW1lPSJNQVA3IgogICAgICAgICAgICAgICAgc291cmNlPSJQUkQudXRpbC5KU09Ob2JqLnN0cmluZ2lmeSggUFJELnV0aWwudW5pcXVlKCBbICdyZWQnLCAnR3JlZW4nLCAnYmx1ZScsICdncmVlbicsICdibHVlJywgJ0dyZWVuJywgJ2JMdWUnLCAnZ3JlZW4nLCAncmVkJyBdLCB0cnVlICkgKTsiCiAgICAgICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvVW5pcXVlL0FycmF5L2EwNC9pdGVtcyIKICAgICAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDgiCiAgICAgICAgICAgICAgICBzb3VyY2U9ImZ1bmN0aW9uIGxpc3QoKSB7dmFyIGw9bmV3IGphdmEudXRpbC5WZWN0b3IoKTtsLmFkZCgnQmx1ZScpO2wuYWRkKCdSZWQnKTsgbC5hZGQoJ0dyZWVuJyk7bC5hZGQoJ0JsdWUnKTtsLmFkZCgnUmVkJyk7IGwuYWRkKCdHcmVlbicpO2wuYWRkKCdibHVlJyk7bC5hZGQoJ3JlZCcpOyBsLmFkZCgnZ3JlZW4nKTtsLmFkZCgnQkxVRScpO2wuYWRkKCdSRUQnKTsgbC5hZGQoJ0dSRUVOJyk7IHJldHVybiBsO30mI3hkOyYjeGE7UFJELnV0aWwudW5pcXVlKCBsaXN0KCkgKTsiCiAgICAgICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvVW5pcXVlL1ZlY3Rvci92MDEvaXRlbXMiCiAgICAgICAgICAgICAgICB0YXJnZXQtdHlwZT0ibXVsdGktdmFsdWUtbGlzdCIvPjxkYXRhLWl0ZW0KICAgICAgICAgICAgICAgIGRhdGEtdHlwZT0ic3RyaW5nIiBuYW1lPSJNQVA5IgogICAgICAgICAgICAgICAgc291cmNlPSJmdW5jdGlvbiBsaXN0KCkge3ZhciBsPW5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7bC5hZGQoOTkpO2wuYWRkKDIzNDUyKTtsLmFkZCgxKTtsLmFkZCg5OSk7bC5hZGQoJ1JlZCcpOyBsLmFkZCgyKTtsLmFkZCgyKTtsLmFkZCgncmVkJyk7IGwuYWRkKCdHcmVlbicpO2wuYWRkKCdSRUQnKTsgcmV0dXJuIGw7fSYjeGQ7JiN4YTtQUkQudXRpbC51bmlxdWUoIGxpc3QoKSApOyIKICAgICAgICAgICAgICAgIHRhcmdldD0iZmxvd2RhdGEudGVzdC9VbmlxdWUvVmVjdG9yL3YwMi9pdGVtcyIKICAgICAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDEwIgogICAgICAgICAgICAgICAgc291cmNlPSJmdW5jdGlvbiBsaXN0KCkge3ZhciBsPW5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7bC5hZGQoJ0JsdWUnKTtsLmFkZCgnUmVkJyk7IGwuYWRkKCdHcmVlbicpO2wuYWRkKCdCbHVlJyk7bC5hZGQoJ1JlZCcpOyBsLmFkZCgnR3JlZW4nKTtsLmFkZCgnYmx1ZScpO2wuYWRkKCdyZWQnKTsgbC5hZGQoJ2dyZWVuJyk7bC5hZGQoJ0JMVUUnKTtsLmFkZCgnUkVEJyk7IGwuYWRkKCdHUkVFTicpOyByZXR1cm4gbDt9JiN4ZDsmI3hhO1BSRC51dGlsLnVuaXF1ZSggbGlzdCgpLCB0cnVlICk7IgogICAgICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L1VuaXF1ZS9WZWN0b3IvdjAzL2l0ZW1zIgogICAgICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgICAgICBkYXRhLXR5cGU9InN0cmluZyIgbmFtZT0iTUFQMTEiCiAgICAgICAgICAgICAgICBzb3VyY2U9ImZ1bmN0aW9uIGxpc3QoKSB7dmFyIGw9bmV3IGphdmEudXRpbC5WZWN0b3IoKTtsLmFkZCg5OSk7bC5hZGQoMjM0NTIpO2wuYWRkKDEpO2wuYWRkKDk5KTtsLmFkZCgnUmVkJyk7IGwuYWRkKDIpO2wuYWRkKDIpO2wuYWRkKCdyZWQnKTsgbC5hZGQoJ0dyZWVuJyk7bC5hZGQoJ1JFRCcpOyByZXR1cm4gbDt9JiN4ZDsmI3hhO1BSRC51dGlsLnVuaXF1ZSggbGlzdCgpLCB0cnVlICk7IgogICAgICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L1VuaXF1ZS9WZWN0b3IvdjA0L2l0ZW1zIgogICAgICAgICAgICB0YXJnZXQtdHlwZT0ibXVsdGktdmFsdWUtbGlzdCIvPjwvZGF0YS1pdGVtcz48ZGF0YS1pdGVtcwogICAgICAgICAgICAgICAgYWN0aXZpdHktaWQ9Im1hcFRlc3RzNCI+PGRhdGEtaXRlbSBkYXRhLXR5cGU9InN0cmluZyIKICAgICAgICAgICAgICAgIG5hbWU9Ik1BUDAiCiAgICAgICAgICAgICAgICBzb3VyY2U9IlBSRC51dGlsLmxvZ2Vycm9yKCAnPT09PT09PT09PT09JyApOyBbICd5ZWxsb3cnLCAnYnJvd24nLCAncGluaycgXTsiCiAgICAgICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvQ29tcGFyZS9hcnJheSIKICAgICAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDEiCiAgICAgICAgICAgICAgICBzb3VyY2U9IlsgWyd5ZWxsb3cnXSwgWydicm93biddLCBbJ3BpbmsnXSBdOyIKICAgICAgICAgICAgICAgIHRhcmdldD0iZmxvd2RhdGEudGVzdC9Db21wYXJlL2FycmF5T2ZBcnJheSIKICAgICAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDIiCiAgICAgICAgICAgICAgICBzb3VyY2U9IlBSRC51dGlsLkpTT05vYmouc3RyaW5naWZ5KCBQUkQudXRpbC5jb21wYXJlKCBbICdSZWQnLCAncmVkJywgJ2dyYXknLCAnR1JBWScsICdHcmF5JyBdLCBbICdyZWQnLCAnR3JlZW4nLCAnZ3JlZW4nLCAnR1JFRU4nIF0gKSApOyIKICAgICAgICAgICAgICAgIHRhcmdldD0iZmxvd2RhdGEudGVzdC9Db21wYXJlL2FycmF5L0ExIgogICAgICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgICAgICBkYXRhLXR5cGU9InN0cmluZyIgbmFtZT0iTUFQMyIKICAgICAgICAgICAgICAgIHNvdXJjZT0iUFJELnV0aWwuSlNPTm9iai5zdHJpbmdpZnkoIFBSRC51dGlsLmNvbXBhcmUoIFsgJ1JlZCcsICdyZWQnLCAnZ3JheScsICdHUkFZJywgJ0dyYXknIF0sIFsgJ3JlZCcsICdHcmVlbicsICdncmVlbicsICdHUkVFTicgXSwgdHJ1ZSApICk7IgogICAgICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L0NvbXBhcmUvYXJyYXkvQTIiCiAgICAgICAgICAgICAgICB0YXJnZXQtdHlwZT0ibXVsdGktdmFsdWUtbGlzdCIvPjxkYXRhLWl0ZW0KICAgICAgICAgICAgICAgIGRhdGEtdHlwZT0ic3RyaW5nIiBuYW1lPSJNQVA0IgogICAgICAgICAgICAgICAgc291cmNlPSJmdW5jdGlvbiBsaXN0MSgpIHt2YXIgbD1uZXcgamF2YS51dGlsLlZlY3RvcigpO2wuYWRkKCdSZWQnKTtsLmFkZCgncmVkJyk7IGwuYWRkKCdncmF5Jyk7bC5hZGQoJ0dSQVknKTtsLmFkZCgnR3JheScpOyByZXR1cm4gbDt9JiN4ZDsmI3hhO2Z1bmN0aW9uIGxpc3QyKCkge3ZhciBsPW5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7bC5hZGQoJ3JlZCcpO2wuYWRkKCdHcmVlbicpOyBsLmFkZCgnZ3JlZW4nKTtsLmFkZCgnR1JFRU4nKTsgcmV0dXJuIGw7fSYjeGQ7JiN4YTtQUkQudXRpbC5KU09Ob2JqLnN0cmluZ2lmeSggUFJELnV0aWwuY29tcGFyZSggbGlzdDEoKSwgbGlzdDIoKSApICk7IgogICAgICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L0NvbXBhcmUvdmVjdG9yL1YxIgogICAgICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgICAgICBkYXRhLXR5cGU9InN0cmluZyIgbmFtZT0iTUFQNSIKICAgICAgICAgICAgICAgIHNvdXJjZT0iZnVuY3Rpb24gbGlzdDEoKSB7dmFyIGw9bmV3IGphdmEudXRpbC5WZWN0b3IoKTtsLmFkZCgnUmVkJyk7bC5hZGQoJ3JlZCcpOyBsLmFkZCgnZ3JheScpO2wuYWRkKCdHUkFZJyk7bC5hZGQoJ0dyYXknKTsgcmV0dXJuIGw7fSYjeGQ7JiN4YTtmdW5jdGlvbiBsaXN0MigpIHt2YXIgbD1uZXcgamF2YS51dGlsLlZlY3RvcigpO2wuYWRkKCdyZWQnKTtsLmFkZCgnR3JlZW4nKTsgbC5hZGQoJ2dyZWVuJyk7bC5hZGQoJ0dSRUVOJyk7IHJldHVybiBsO30mI3hkOyYjeGE7UFJELnV0aWwuSlNPTm9iai5zdHJpbmdpZnkoIFBSRC51dGlsLmNvbXBhcmUoIGxpc3QxKCksIGxpc3QyKCksIHRydWUgKSApOyIKICAgICAgICAgICAgICAgIHRhcmdldD0iZmxvd2RhdGEudGVzdC9Db21wYXJlL3ZlY3Rvci9WMiIKICAgICAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDYiCiAgICAgICAgICAgICAgICBzb3VyY2U9IlBSRC51dGlsLnNob3VsZFJldHJ5KCAnMjAnLCAnMTAnICk7IgogICAgICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L3Nob3VsZFJldHJ5L3MwMSIKICAgICAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDciCiAgICAgICAgICAgICAgICBzb3VyY2U9IlBSRC51dGlsLnNob3VsZFJldHJ5KCAnMTAnLCAnMjAnICk7IgogICAgICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L3Nob3VsZFJldHJ5L3MwMiIKICAgICAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDgiCiAgICAgICAgICAgICAgICBzb3VyY2U9IlBSRC51dGlsLnNob3VsZFJldHJ5KCAnOTM0NScsICc5MzQ1JyApOyIKICAgICAgICAgICAgICAgIHRhcmdldD0iZmxvd2RhdGEudGVzdC9zaG91bGRSZXRyeS9zMDMiCiAgICAgICAgICAgICAgICB0YXJnZXQtdHlwZT0ibXVsdGktdmFsdWUtbGlzdCIvPjxkYXRhLWl0ZW0KICAgICAgICAgICAgICAgIGRhdGEtdHlwZT0ic3RyaW5nIiBuYW1lPSJNQVA5IgogICAgICAgICAgICAgICAgc291cmNlPSJQUkQudXRpbC5zaG91bGRSZXRyeSggJ2ludmFsaWQnLCAnc3R1ZmYnICk7IgogICAgICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L3Nob3VsZFJldHJ5L3MwNCIKICAgICAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDEwIgogICAgICAgICAgICAgICAgc291cmNlPSJQUkQudXRpbC5iYXNpY0hUVFBhdXRoSGVhZGVyKCAnU29tZVZhbHVlSGVyZScsICdBbmRIZXJlQ29tZXNBUGFzc3dvcmQnICk7IgogICAgICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L2Jhc2ljSFRUUGF1dGhIZWFkZXIiCiAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PC9kYXRhLWl0ZW1zPjxkYXRhLWl0ZW1zCiAgICAgICAgICAgICAgICBhY3Rpdml0eS1pZD0ibWFwVGVzdHM1Ij48ZGF0YS1pdGVtIGRhdGEtdHlwZT0ic3RyaW5nIgogICAgICAgICAgICAgICAgbmFtZT0iTUFQMCIKICAgICAgICAgICAgICAgIHNvdXJjZT0iUFJELnV0aWwubG9nZXJyb3IoICc9PT09PT09PT09PT0nICk7IFBSRC51dGlsLkpTT05vYmouc3RyaW5naWZ5KCBQUkQudXRpbC5nZXRPYmplY3QyYXJyKCBmbG93ZGF0YS5nZXRPYmplY3QoJ3Rlc3QnKSApICk7IgogICAgICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L2dldE9iamVjdDJhcnIvYTAxIgogICAgICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgICAgICBkYXRhLXR5cGU9InN0cmluZyIgbmFtZT0iTUFQMSIKICAgICAgICAgICAgICAgIHNvdXJjZT0iUFJELnV0aWwuSlNPTm9iai5zdHJpbmdpZnkoIFBSRC51dGlsLmdldE9iamVjdDJhcnIoIGZsb3dkYXRhLmdldE9iamVjdCgndGVzdC9VbmlxdWUvVmVjdG9yL3YwMS9pdGVtcycpICkgKTsiCiAgICAgICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvZ2V0T2JqZWN0MmFyci9hMDIiCiAgICAgICAgICAgICAgICB0YXJnZXQtdHlwZT0ibXVsdGktdmFsdWUtbGlzdCIvPjxkYXRhLWl0ZW0KICAgICAgICAgICAgICAgIGRhdGEtdHlwZT0ic3RyaW5nIiBuYW1lPSJNQVAyIgogICAgICAgICAgICAgICAgc291cmNlPSJQUkQudXRpbC5KU09Ob2JqLnN0cmluZ2lmeSggUFJELnV0aWwuZ2V0T2JqZWN0MmFyciggZmxvd2RhdGEuZ2V0T2JqZWN0KCd0ZXN0L0NvbXBhcmUvYXJyYXknKSApICk7IgogICAgICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L2dldE9iamVjdDJhcnIvYTAzIgogICAgICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgICAgICBkYXRhLXR5cGU9InN0cmluZyIgbmFtZT0iTUFQMyIKICAgICAgICAgICAgICAgIHNvdXJjZT0iUFJELnV0aWwuSlNPTm9iai5zdHJpbmdpZnkoIFBSRC51dGlsLmdldE9iamVjdDJhcnIoIGZsb3dkYXRhLmdldCgndGVzdC9HQ1YvZ2V0MScpICkgKTsiCiAgICAgICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvZ2V0T2JqZWN0MmFyci9hMDQiCiAgICAgICAgICAgICAgICB0YXJnZXQtdHlwZT0ibXVsdGktdmFsdWUtbGlzdCIvPjxkYXRhLWl0ZW0KICAgICAgICAgICAgICAgIGRhdGEtdHlwZT0ic3RyaW5nIiBuYW1lPSJNQVA0IgogICAgICAgICAgICAgICAgc291cmNlPSJQUkQudXRpbC5KU09Ob2JqLnN0cmluZ2lmeSggUFJELnV0aWwuZ2V0T2JqZWN0MmFyciggZmxvd2RhdGEuZ2V0T2JqZWN0KCd0ZXN0L0dDVi9nZXQyJykgKSApOyIKICAgICAgICAgICAgICAgIHRhcmdldD0iZmxvd2RhdGEudGVzdC9nZXRPYmplY3QyYXJyL2EwNSIKICAgICAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDUiCiAgICAgICAgICAgICAgICBzb3VyY2U9IlBSRC51dGlsLkpTT05vYmoudGVzdCggW3smcXVvdDtpdGVtcyZxdW90OzpbJnF1b3Q7Qmx1ZSZxdW90OywmcXVvdDtSZWQmcXVvdDssJnF1b3Q7R3JlZW4mcXVvdDtdfV0sICdbMF0uaXRlbXNbM10nICk7IgogICAgICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L0pTT04vdGVzdC90MDEiCiAgICAgICAgICAgICAgICB0YXJnZXQtdHlwZT0ibXVsdGktdmFsdWUtbGlzdCIvPjxkYXRhLWl0ZW0KICAgICAgICAgICAgICAgIGRhdGEtdHlwZT0ic3RyaW5nIiBuYW1lPSJNQVA2IgogICAgICAgICAgICAgICAgc291cmNlPSJQUkQudXRpbC5KU09Ob2JqLnRlc3QoICd7JnF1b3Q7cmVzdWx0JnF1b3Q7Olt7JnF1b3Q7b2JqJnF1b3Q7OjF9LHsmcXVvdDtvYmomcXVvdDs6Mn0seyZxdW90O29iaiZxdW90Ozp7JnF1b3Q7d2l0aC5kb3QmcXVvdDs6OTk5fX1dfScsICdyZXN1bHRbMl0ub2JqWyZxdW90O3dpdGguZG90JnF1b3Q7XScgKTsiCiAgICAgICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvSlNPTi90ZXN0L3QwMiIKICAgICAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDciCiAgICAgICAgICAgICAgICBzb3VyY2U9IlBSRC51dGlsLkpTT05vYmoudGVzdCggJ3smcXVvdDtyZXN1bHQmcXVvdDs6W3smcXVvdDtvYmomcXVvdDs6MX0seyZxdW90O29iaiZxdW90OzoyfSx7JnF1b3Q7b2JqJnF1b3Q7OnsmcXVvdDt3aXRoLmRvdCZxdW90Ozo5OTl9fV19JywgJ3Jlc3VsdFswXScgKTsiCiAgICAgICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvSlNPTi90ZXN0L3QwMyIKICAgICAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDgiCiAgICAgICAgICAgICAgICBzb3VyY2U9IlBSRC51dGlsLkpTT05vYmouZ2V0KCBbeyZxdW90O2l0ZW1zJnF1b3Q7OlsmcXVvdDtCbHVlJnF1b3Q7LCZxdW90O1JlZCZxdW90OywmcXVvdDtHcmVlbiZxdW90O119XSwgJ1swXS5pdGVtc1swXScsICdzdHJpbmcnICk7IgogICAgICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L0pTT04vZ2V0L2cwMSIKICAgICAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDkiCiAgICAgICAgICAgICAgICBzb3VyY2U9IlBSRC51dGlsLkpTT05vYmouZ2V0KCAneyZxdW90O3Jlc3VsdCZxdW90OzpbeyZxdW90O29iaiZxdW90OzoxfSx7JnF1b3Q7b2JqJnF1b3Q7OjJ9LHsmcXVvdDtvYmomcXVvdDs6eyZxdW90O3dpdGguZG90JnF1b3Q7Ojk5OX19XX0nLCAncmVzdWx0WzJdLm9ialsmcXVvdDt3aXRoLmRvdCZxdW90O10nLCAnbnVtYmVyJyApICogMTAwMDsiCiAgICAgICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvSlNPTi9nZXQvZzAyIgogICAgICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgICAgICBkYXRhLXR5cGU9InN0cmluZyIgbmFtZT0iTUFQMTAiCiAgICAgICAgICAgICAgICBzb3VyY2U9IlBSRC51dGlsLkpTT05vYmouc3RyaW5naWZ5KCBQUkQudXRpbC5KU09Ob2JqLmdldCggJ3smcXVvdDtyZXN1bHQmcXVvdDs6W3smcXVvdDtvYmomcXVvdDs6MX0seyZxdW90O29iaiZxdW90OzoyfSx7JnF1b3Q7b2JqJnF1b3Q7OnsmcXVvdDt3aXRoLmRvdCZxdW90Ozo5OTl9fV19JywgJ3Jlc3VsdFsyXScsICdyYXcnICkgKTsiCiAgICAgICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvSlNPTi9nZXQvZzAzIgogICAgICAgICAgICB0YXJnZXQtdHlwZT0ibXVsdGktdmFsdWUtbGlzdCIvPjwvZGF0YS1pdGVtcz48ZGF0YS1pdGVtcwogICAgICAgICAgICAgICAgYWN0aXZpdHktaWQ9Im1hcFRlc3RzNiI+PGRhdGEtaXRlbSBkYXRhLXR5cGU9InN0cmluZyIKICAgICAgICAgICAgICAgIG5hbWU9Ik1BUDAiCiAgICAgICAgICAgICAgICBzb3VyY2U9InZhciBzdHIgPSAnb25lJywgbnVtID0gMSwgYm9vbCA9IHRydWUsIHN0cjIgPSBuZXcgU3RyaW5nKCAndHdvJyApLCBudW0yID0gbmV3IE51bWJlciggMiApLCBib29sMiA9IG5ldyBCb29sZWFuKCB0cnVlICksIHZlYyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCksIHJlcyA9ICcnOyYjeGQ7JiN4YTt2YXIgYXJyID0gWyBzdHIsIG51bSwgYm9vbCwgc3RyMiwgbnVtMiwgYm9vbDIsIHZlYywgbnVsbCwgdW5kZWZpbmVkIF07JiN4ZDsmI3hhO2ZvciAoIHZhciBpID0gMDsgaSAmbHQ7IGFyci5sZW5ndGg7IGkrKyApIHsmI3hkOyYjeGE7ICByZXMgKz0gJ1ZhcmlhYmxlIGluZGV4OiAnICsgaTsmI3hkOyYjeGE7ICByZXMgKz0gJyBpc1N0cmluZygpIHJlc3VsdDogJyArIFBSRC51dGlsLmlzU3RyaW5nKCBhcnJbIGkgXSApICsgJzsgJzsmI3hkOyYjeGE7JiN4OTtyZXMgKz0gJyBpc051bWJlcigpIHJlc3VsdDogJyArIFBSRC51dGlsLmlzTnVtYmVyKCBhcnJbIGkgXSApICsgJzsgJzsmI3hkOyYjeGE7JiN4OTtyZXMgKz0gJyBpc0Jvb2xlYW4oKSByZXN1bHQ6ICcgKyBQUkQudXRpbC5pc0Jvb2xlYW4oIGFyclsgaSBdICkgKyAnOyAnOyYjeGQ7JiN4YTsmI3g5O3JlcyArPSAnIGlzSmF2YVZlY3RvcigpIHJlc3VsdDogJyArIFBSRC51dGlsLmlzSmF2YVZlY3RvciggYXJyWyBpIF0gKSArICc7ICc7JiN4ZDsmI3hhOyYjeDk7cmVzICs9ICcgaW5zcGVjdFR5cGUoKSByZXN1bHQ6ICcgKyBQUkQudXRpbC5pbnNwZWN0VHlwZSggYXJyWyBpIF0gKSArICc7ICc7JiN4ZDsmI3hhO30mI3hkOyYjeGE7cmVzOyIKICAgICAgICAgICAgICAgIHRhcmdldD0iZmxvd2RhdGEudGVzdC9pcy1hbmQtaW5zcGVjdC10ZXN0cyIKICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48L2RhdGEtaXRlbXM+PHN0YXJ0LWFjdGl2aXR5CiAgICAgICAgICAgICAgICBhY3Rpdml0eS1pZD0iU3RhcnQiPjxkaXNwbGF5LW5hbWUKICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJlbiI+U3RhcnQ8L2Rpc3BsYXktbmFtZT48ZGlzcGxheS1uYW1lCiAgICAgICAgICAgIHhtbDpsYW5nPSJlbiI+U3RhcnQ8L2Rpc3BsYXktbmFtZT48L3N0YXJ0LWFjdGl2aXR5PjxtYXBwaW5nLWFjdGl2aXR5CiAgICAgICAgICAgICAgICBhY3Rpdml0eS1pZD0ibWFwVGVzdHMxIj48ZGlzcGxheS1uYW1lCiAgICAgICAgICAgIHhtbDpsYW5nPSJlbiI+Zmxvd2RhdGEgdGVzdHMgMTwvZGlzcGxheS1uYW1lPjwvbWFwcGluZy1hY3Rpdml0eT48bWFwcGluZy1hY3Rpdml0eQogICAgICAgICAgICAgICAgYWN0aXZpdHktaWQ9Im1hcFRlc3RzMiI+PGRpc3BsYXktbmFtZQogICAgICAgICAgICB4bWw6bGFuZz0iZW4iPmZsb3dkYXRhIHRlc3RzIDI8L2Rpc3BsYXktbmFtZT48L21hcHBpbmctYWN0aXZpdHk+PG1hcHBpbmctYWN0aXZpdHkKICAgICAgICAgICAgICAgIGFjdGl2aXR5LWlkPSJtYXBUZXN0czMiPjxkaXNwbGF5LW5hbWUKICAgICAgICAgICAgeG1sOmxhbmc9ImVuIj5mbG93ZGF0YSB0ZXN0cyAzPC9kaXNwbGF5LW5hbWU+PC9tYXBwaW5nLWFjdGl2aXR5PjxtYXBwaW5nLWFjdGl2aXR5CiAgICAgICAgICAgICAgICBhY3Rpdml0eS1pZD0ibWFwVGVzdHM0Ij48ZGlzcGxheS1uYW1lCiAgICAgICAgICAgIHhtbDpsYW5nPSJlbiI+Zmxvd2RhdGEgdGVzdHMgNDwvZGlzcGxheS1uYW1lPjwvbWFwcGluZy1hY3Rpdml0eT48bWFwcGluZy1hY3Rpdml0eQogICAgICAgICAgICAgICAgYWN0aXZpdHktaWQ9Im1hcFRlc3RzNSI+PGRpc3BsYXktbmFtZQogICAgICAgICAgICB4bWw6bGFuZz0iZW4iPmZsb3dkYXRhIHRlc3RzIDU8L2Rpc3BsYXktbmFtZT48L21hcHBpbmctYWN0aXZpdHk+PG1hcHBpbmctYWN0aXZpdHkKICAgICAgICAgICAgICAgIGFjdGl2aXR5LWlkPSJtYXBUZXN0czYiPjxkaXNwbGF5LW5hbWUKICAgICAgICAgICAgeG1sOmxhbmc9ImVuIj5mbG93ZGF0YSB0ZXN0cyA2PC9kaXNwbGF5LW5hbWU+PC9tYXBwaW5nLWFjdGl2aXR5PjxmaW5pc2gtYWN0aXZpdHkKICAgICAgICAgICAgICAgIGFjdGl2aXR5LWlkPSJGaW5pc2giPjxkaXNwbGF5LW5hbWUKICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJlbiI+RmluaXNoPC9kaXNwbGF5LW5hbWU+PGRpc3BsYXktbmFtZQogICAgICAgICAgICAgICAgeG1sOmxhbmc9ImVuIj5GaW5pc2g8L2Rpc3BsYXktbmFtZT48bm90aWZ5CiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU9ImNuPVByb3Zpc2lvbmluZyBBcHByb3ZhbCBDb21wbGV0ZWQgTm90aWZpY2F0aW9uLGNuPURlZmF1bHQgTm90aWZpY2F0aW9uIENvbGxlY3Rpb24sY249U2VjdXJpdHkiPjxtYXAKICAgICAgICAgICAgICAgICAgICBzb3VyY2U9Il9kZWZhdWx0XyIKICAgICAgICAgICAgdGFyZ2V0PSJUTyIvPjwvbm90aWZ5PjwvZmluaXNoLWFjdGl2aXR5PjxsaW5rIHNvdXJjZT0iU3RhcnQiCiAgICAgICAgICAgIHRhcmdldD0ibWFwVGVzdHMxIiB0eXBlPSJmb3J3YXJkIi8+PGxpbmsgc291cmNlPSJtYXBUZXN0czEiCiAgICAgICAgICAgIHRhcmdldD0ibWFwVGVzdHMyIiB0eXBlPSJmb3J3YXJkIi8+PGxpbmsgc291cmNlPSJtYXBUZXN0czIiCiAgICAgICAgICAgIHRhcmdldD0ibWFwVGVzdHMzIiB0eXBlPSJmb3J3YXJkIi8+PGxpbmsgc291cmNlPSJtYXBUZXN0czMiCiAgICAgICAgICAgIHRhcmdldD0ibWFwVGVzdHM0IiB0eXBlPSJmb3J3YXJkIi8+PGxpbmsgc291cmNlPSJtYXBUZXN0czQiCiAgICAgICAgICAgIHRhcmdldD0ibWFwVGVzdHM1IiB0eXBlPSJmb3J3YXJkIi8+PGxpbmsgc291cmNlPSJtYXBUZXN0czUiCiAgICAgICAgICAgIHRhcmdldD0ibWFwVGVzdHM2IiB0eXBlPSJmb3J3YXJkIi8+PGxpbmsgc291cmNlPSJtYXBUZXN0czYiCiAgICAgICAgICAgIHRhcmdldD0iRmluaXNoIiB0eXBlPSJmb3J3YXJkIi8+PC9wcm9jZXNzPjwvcHJvdi1yZXEtZGVmbj4K]]></ds-value>
</ds-attribute>
<ds-attribute ds-attr-name="srvprvRequestXML">
<ds-value><![CDATA[PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHByb3Zpc2lvbi1yZXF1ZXN0IHZlcnNpb249IjQuNS4wIgogICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKICAgICAgICB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iQXBwcm92YWxSZXF1ZXN0NF81XzAueHNkIj4KICAgICAgICA8aW1wb3J0LXNjcmlwdAogICAgICAgIGlubGluZT0idHJ1ZSIKICAgICAgICB1c2UtaW4tZm9ybT0idHJ1ZSI+CiAgICAgICAgICAgIDxlY21hLXNjcmlwdD4vKiomI3hkOwogKiBTaW1wbGUgbW9kdWxlIHRvIGFzc2lzdCBvbiB3b3JrZmxvdyBkZXZlbG9wbWVudC4mbHQ7YnIvJmd0OyYjeGQ7CiAqIENyZWF0ZWQgdG8gYmUgaW1wb3J0ZWQgaW4gT3ZlcnZpZXcgJmd0OyBHbG9iYWwgU2NyaXB0cyBhbmQgdXNlZCBvbiBib3RoIGZvcm1zIGFuZCBlbmdpbmUuJmx0O2JyLyZndDsmI3hkOwogKiB2MS4wLjUgYnJlYWtpbmcgY2hhbmdlIC0gQ29tcGFyZSgpIGFuZCBVbmlxdWUoKSByZW5hbWVkIHRvIGNvbXBhcmUoKSBhbmQgdW5pcXVlKCkgYXMgcGVyICMyMCAuJmx0O2JyLyZndDsmI3hkOwogKiBAbmFtZXNwYWNlIFBSRCYjeGQ7CiAqIEB2ZXJzaW9uIDEuMC43JiN4ZDsKICogQGxpY2Vuc2UgTUlUIExpY2Vuc2UmI3hkOwogKi8mI3hkOwp2YXIgUFJEID0gKGZ1bmN0aW9uIElJRkUoIGxvZ3ByZWZpeCwgdmVyYm9zZW1zZyApIHsmI3hkOwogIC8vIEV4cG9ydGVkIHB1YmxpYyBBUEkuIEZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIG5vdCBkZWNsYXJlZCBoZXJlIHdpbGwgcmVtYWluIHByaXZhdGUgdG8gdGhpcyBtb2R1bGUmI3hkOwogIHZhciBQdWJsaWNBUEkgPSB7JiN4ZDsKICAgIHV0aWw6IHsmI3hkOwogICAgICBmb3JtT3JFbmdpbmU6Zm9ybU9yRW5naW5lLCYjeGQ7CiAgICAgIGxvZ2Vycm9yOmxvZ2Vycm9yLCYjeGQ7CiAgICAgIGNvZXJjZVRvU3RyaW5nOmNvZXJjZVRvU3RyaW5nLCYjeGQ7CiAgICAgIEpTT05vYmo6IHsmI3hkOwogICAgICAgIHBhcnNlOkpTT05wYXJzZSwmI3hkOwogICAgICAgIHN0cmluZ2lmeTpKU09Oc3RyaW5naWZ5LCYjeGQ7CiAgICAgICAgZ2V0OkpTT05nZXQsJiN4ZDsKICAgICAgICB0ZXN0OkpTT050ZXN0JiN4ZDsKICAgICAgfSwmI3hkOwogICAgICBjb21wYXJlOmNvbXBhcmUsJiN4ZDsKICAgICAgdW5pcXVlOnVuaXF1ZSwmI3hkOwogICAgICBpbnNwZWN0VHlwZTppbnNwZWN0VHlwZSwmI3hkOwogICAgICBpc1N0cmluZzppc1N0cmluZywmI3hkOwogICAgICBpc051bWJlcjppc051bWJlciwmI3hkOwogICAgICBpc0Jvb2xlYW46aXNCb29sZWFuLCYjeGQ7CiAgICAgIGRlYnVnbXNnOmRlYnVnbXNnLCYjeGQ7CiAgICB9LCYjeGQ7CiAgICBkZWJ1Z21lc3NhZ2VzOmRlYnVnbWVzc2FnZXMsJiN4ZDsKICAgIHNldGxvZ3ByZWZpeDpzZXRsb2dwcmVmaXgsJiN4ZDsKICAgIHZlcnNpb246dmVyc2lvbiwmI3hkOwogICAgSURWZ2V0OklEVmdldCwmI3hkOwogICAgSURWZ2xvYmFsUXVlcnk6SURWZ2xvYmFsUXVlcnkmI3hkOwogIH07JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIFJldHVybiBtb2R1bGUgdmVyc2lvbi4mI3hkOwogICAqJiN4ZDsKICAgKiBAbWVtYmVyb2YgUFJEJiN4ZDsKICAgKiBAc2luY2UgMS4wLjEmI3hkOwogICAqJiN4ZDsKICAgKiBAdHlwZSB7c3RyaW5nfSYjeGQ7CiAgICogQHJldHVybiB7c3RyaW5nfSBNb2R1bGUncyB2ZXJzaW9uIGluIHRoZSBmb3JtYXQgTS5tLnAgKE1ham9yLCBtaW5vciwgcGF0Y2gpJiN4ZDsKICAgKi8mI3hkOwogIGZ1bmN0aW9uIHZlcnNpb24oKSB7JiN4ZDsKICAgIHJldHVybiAnMS4wLjcnOyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgdXNlIGluICBJZGVudGl0eSBNYW5hZ2VyIHdvcmsgZmxvdyBkZXZlbG9wbWVudC4mI3hkOwogICAqIEBuYW1lc3BhY2UgUFJELnV0aWwmI3hkOwogICAqIEBtZW1iZXJvZiBQUkQmI3hkOwogICAqIEBzaW5jZSAxLjAuMCYjeGQ7CiAgICovJiN4ZDsKJiN4ZDsKICAgIC8qKiYjeGQ7CiAgICogUHJveHkgZm9yIHRoZSBhY3R1YWwgSlNPTiBvYmplY3QgdXNlZCBpbiBicm93c2VycyAoSlNPTikgb3Igd29ya2Zsb3cgZW5naW5lIChTY3JpcHRWYXVsdC5KU09OKS4mbHQ7YnIvJmd0OyYjeGQ7CiAgICogV3JhcHMgdGhlIHBhcnNlKCkgYW5kIHN0cmluZ2lmeSgpIGNhbGxzIGluIHRyeS9jYXRjaCBibG9ja3MgdG8gcmVwb3J0IGVycm9ycyB2aWEgbG9nZXJyb3IoKSBpbnN0ZWFkIG9mJiN4ZDsKICAgKiBsZXR0aW5nIHRoZSB3b3JrZmxvdyBlbmdpbmUgYnJlYWsgaXRzIHJlZ3VsYXIgZmxvdyB3aGVuIGFuIGVycm9yIG9jY3Vycy4mI3hkOwogICAqIEBuYW1lc3BhY2UgUFJELnV0aWwuSlNPTm9iaiYjeGQ7CiAgICogQG1lbWJlcm9mIFBSRC51dGlsJiN4ZDsKICAgKiBAc2luY2UgMS4wLjImI3hkOwogICAqLyYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiBGdW5jdGlvbnMgYW5kIG9iamVjdHMgdGhhdCBjYW4gb25seSBiZSBhY2Nlc3NlZCBpbiB3b3JrIGZsb3cgZm9ybXMuJiN4ZDsKICAgKiBAbmFtZXNwYWNlIFBSRC53ZWImI3hkOwogICAqIEBtZW1iZXJvZiBQUkQmI3hkOwogICAqIEBzaW5jZSAxLjAuNCYjeGQ7CiAgICovJiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIFN0b3JhZ2UgZm9yIHRoZSBmcmFtZXdvcmsgb2JqZWN0cywgb25seSB1c2VkIHdoZW4gZnVuY3Rpb25zIGFyZSBjYWxsZWQgZnJvbSBpbnNpZGUgYSBmb3JtLiYjeGQ7CiAgICogTm90IG5lZWRlZCB3aGVuIGNvZGUgaXMgcnVubmluZyBvbiB0aGUgd29ya2Zsb3cgZW5naW5lLiYjeGQ7CiAgICovJiN4ZDsKICB2YXIgSURNQVBQUyA9IHsmI3hkOwogICAgZmllbGQ6bnVsbCwmI3hkOwogICAgZm9ybTpudWxsLCYjeGQ7CiAgICBJRFZhdWx0Om51bGwmI3hkOwogIH07JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIEludGVybmFsIHN0YXRlLCB1c2VkIHRvIGRlZmluZSB3aGF0IGZ1bmN0aW9ucyB0byBleHBvcnQgYXMgd2VsbCBhcyYjeGQ7CiAgICogdGhlIGJlaGF2aW9yIGZvciBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCBpbiBib3RoIGZvcm0gYW5kIGVuZ2luZS4mI3hkOwogICAqLyYjeGQ7CiAgdmFyIHdoZXJlID0gZm9ybU9yRW5naW5lKCk7JiN4ZDsKICB2YXIgSlN0cmluZzsgLy8gSmF2YSBzdHJpbmcsIHVzZWQgb25seSBvbiB0aGUgd29ya2Zsb3cgZW5naW5lLiYjeGQ7CiAgdmFyIEpTT05wdHI7IC8vIEpTT04gaW50ZXJuYWwgcG9pbnRlci4gSWYgd2UgZXZhbHVhdGUgaXQgaW5zaWRlIGEgZnVuY3Rpb24gdGhhdCBmdW5jdGlvbiBjYW4gY2F1c2UgZm9ybSB0byBmYWlsIHRvIGxvYWQuJiN4ZDsKICB2YXIgcHJlZml4OyAvLyBwcmVmaXggdmFyaWFibGUgdXNlZCBieSB0aGUgbG9nZXJyb3IoKSBjYWxscy4mI3hkOwogIHZhciBkZWJ1ZzsgLy8gV2hlbiBzZXQsIGZ1bmN0aW9ucyB3aWxsIHByb3ZpZGUgbW9yZSB2ZXJib3NlIGxvZyBtZXNzYWdlcyYjeGQ7CiAgaWYgKCB3aGVyZSA9PT0gJ2VuZ2luZScgKSB7JiN4ZDsKICAgIEpTdHJpbmcgPSBqYXZhLmxhbmcuU3RyaW5nOyYjeGQ7CiAgICBKU09OcHRyID0gU2NyaXB0VmF1bHQuSlNPTjsmI3hkOwogIH0mI3hkOwogIGlmICggd2hlcmUgPT09ICdmb3JtJyApIHsmI3hkOwogICAgSlNPTnB0ciA9IEpTT047JiN4ZDsKICB9JiN4ZDsKICAvLyBJbml0aWFsaXplcyBkZWJ1ZyBtb2RlIGZyb20gbGlicmFyeSdzIHBhcmFtZXRlci4mI3hkOwogIGRlYnVnbWVzc2FnZXMoIHZlcmJvc2Vtc2cgKTsmI3hkOwogIC8vIEluaXRpYWxpemVzIHRoZSBwcmVmaXggdmFyaWFibGUgdXNlZCBieSB0aGUgbG9nZXJyb3IoKSBjYWxscy4mI3hkOwogIHNldGxvZ3ByZWZpeCggbG9ncHJlZml4ICk7JiN4ZDsKJiN4ZDsKICAvLyBGcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9oNWJwL2h0bWw1LWJvaWxlcnBsYXRlL2Jsb2IvbWFzdGVyL3NyYy9qcy9wbHVnaW5zLmpzICwmI3hkOwogIC8vIGltcGxlbWVudGVkIGFmdGVyIGVycm9ycyBvY2N1cmVkIG9uIGNlcnRhaW4gSUUgYnJvd3NlciB0ZXN0cyBvbiBsb2dlcnJvcigpIGNvbnNvbGUubG9nKCkgY2FsbHMuJiN4ZDsKICBpZiAoIHdoZXJlID09PSAnZm9ybScgKSB7JiN4ZDsKICAgIC8vIEF2b2lkIGBjb25zb2xlYCBlcnJvcnMgaW4gYnJvd3NlcnMgdGhhdCBsYWNrIGEgY29uc29sZS4mI3hkOwogICAgKGZ1bmN0aW9uKCkgeyYjeGQ7CiAgICAgIHZhciBtZXRob2Q7JiN4ZDsKICAgICAgdmFyIG5vb3AgPSBmdW5jdGlvbiAoKSB7fTsmI3hkOwogICAgICB2YXIgbWV0aG9kcyA9IFsmI3hkOwogICAgICAgICdhc3NlcnQnLCAnY2xlYXInLCAnY291bnQnLCAnZGVidWcnLCAnZGlyJywgJ2RpcnhtbCcsICdlcnJvcicsJiN4ZDsKICAgICAgICAnZXhjZXB0aW9uJywgJ2dyb3VwJywgJ2dyb3VwQ29sbGFwc2VkJywgJ2dyb3VwRW5kJywgJ2luZm8nLCAnbG9nJywmI3hkOwogICAgICAgICdtYXJrVGltZWxpbmUnLCAncHJvZmlsZScsICdwcm9maWxlRW5kJywgJ3RhYmxlJywgJ3RpbWUnLCAndGltZUVuZCcsJiN4ZDsKICAgICAgICAndGltZWxpbmUnLCAndGltZWxpbmVFbmQnLCAndGltZVN0YW1wJywgJ3RyYWNlJywgJ3dhcm4nJiN4ZDsKICAgICAgXTsmI3hkOwogICAgICB2YXIgbGVuZ3RoID0gbWV0aG9kcy5sZW5ndGg7JiN4ZDsKICAgICAgdmFyIGNvbnNvbGUgPSAod2luZG93LmNvbnNvbGUgPSB3aW5kb3cuY29uc29sZSB8fCB7fSk7JiN4ZDsKICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7JiN4ZDsKICAgICAgICBtZXRob2QgPSBtZXRob2RzW2xlbmd0aF07JiN4ZDsKICAgICAgICAvLyBPbmx5IHN0dWIgdW5kZWZpbmVkIG1ldGhvZHMuJiN4ZDsKICAgICAgICBpZiAoIWNvbnNvbGVbbWV0aG9kXSkgeyYjeGQ7CiAgICAgICAgICBjb25zb2xlW21ldGhvZF0gPSBub29wOyYjeGQ7CiAgICAgICAgfSYjeGQ7CiAgICAgIH0mI3hkOwogICAgfSgpKTsmI3hkOwogIH0mI3hkOwomI3hkOwogIC8qKiYjeGQ7CiAgICogU2V0IHByZWZpeCBmb3IgdGhlIGxvZyBhY3Rpdml0aWVzIGdlbmVyYXRlZCBieSBsb2dlcnJvcigpIG9uIGJvdGggZW5naW5lIGFuZCBmb3JtLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBHaXZlbiB0aGF0IGZvcm1zIGluc3RhbnRpYXRlIHRoZSBtb2R1bGUgb24gbG9hZCwgc2V0dGluZyB0aGUgdmFsdWUgaW5zaWRlIGEgZm9ybSB3b3VsZCBhZmZlY3Qgb25seSBzYWlkIGZvcm0uJmx0O2JyLyZndDsmI3hkOwogICAqIEdpdmVuIHRoYXQgdGhlIHdvcmtmbG93IGVuZ2luZSBjYW4gcGF1c2UgcHJvY2Vzc2luZyBhdCBwb2ludHMgYW5kIHJlbW92ZSB0aGUgdGhyZWFkIGZyb20gbWVtb3J5LCByZWFkaW5nIHRoZSBzYW1lJiN4ZDsKICAgKiBhZ2FpbiBsYXRlciwgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGFueXdoZXJlIG91dHNpZGUgdGhlIE92ZXJ2aWV3ICZndDsgR2xvYmFsIFNjcmlwdHMgbWlnaHQgY2F1c2UgdGhlIHZhbHVlIHNldCB0byBiZSBsb3N0JiN4ZDsKICAgKiBhZnRlciBzdWNoIHBhdXNlcy4gT25lIGV4YW1wbGUgb2Ygc3VjaCBwYXVzZXMvYmVoYXZpb3IgaXMgd2hlbiBhIHdvcmtmbG93IHJlYWNoZXMgYW4gYXBwcm92YWwgYWN0aXZpdHkuJiN4ZDsKICAgKiYjeGQ7CiAgICogQG1lbWJlcm9mIFBSRCYjeGQ7CiAgICogQHNpbmNlIDEuMC4yJiN4ZDsKICAgKiYjeGQ7CiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciAgU3RyaW5nIHRoYXQgd2lsbCBiZSBhcHBlbmRlZCB0byBhbnkgbG9nZXJyb3IoKSBjYWxsLiYjeGQ7CiAgICovJiN4ZDsKICBmdW5jdGlvbiBzZXRsb2dwcmVmaXgoIHN0ciApIHsmI3hkOwogICAgcHJlZml4ID0gY29lcmNlVG9TdHJpbmcoIHN0ciwgJycgKTsmI3hkOwogIH0mI3hkOwomI3hkOwogIC8qKiYjeGQ7CiAgICogU2V0cyBsaWJyYXJ5IGluIGRlYnVnIG1vZGUuIFRoZSBvdGhlciB3YXkgdG8gZG8gc28gaXMgdG8gcGFzcyB0cnVlIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyIG9uIHRoZSBsaWJyYXJ5IGltcG9ydC4mI3hkOwogICAqJiN4ZDsKICAgKiBAbWVtYmVyb2YgUFJEJiN4ZDsKICAgKiBAc2luY2UgMS4wLjUmI3hkOwogICAqJiN4ZDsKICAgKiBAcGFyYW0ge2Jvb2xlYW59IGJvb2wgIHRydWUgdG8gc2V0IHRoZSBsaWJyYXJ5IHRvIGRlYnVnIG1vZGUsIGZhbHNlIHRvIGRpc2FibGUgZGVidWcgbW9yZS4mI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gZGVidWdtZXNzYWdlcyggYm9vbCApIHsmI3hkOwogICAgaWYgKCBib29sID09PSB0cnVlICkgeyYjeGQ7CiAgICAgIGxvZ2Vycm9yKCAnRGVidWcgbWVzc2FnZXMgZW5hYmxlZC4nICk7JiN4ZDsKICAgICAgZGVidWcgPSB0cnVlOyYjeGQ7CiAgICB9JiN4ZDsKICAgIGlmICggYm9vbCA9PT0gZmFsc2UgKSB7JiN4ZDsKICAgICAgbG9nZXJyb3IoICdEZWJ1ZyBtZXNzYWdlcyBkaXNhYmxlZC4nICk7JiN4ZDsKICAgICAgZGVidWcgPSBmYWxzZTsmI3hkOwogICAgfSYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiBUcnkgdG8gZGV0ZWN0IGlmIHdlIGFyZSBpbiBhIHdlYiBicm93c2VyIG9yIGluIHRoZSBVc2VyIEFwcC9SQlBNL0lETUFQUHMgd29ya2Zsb3cgZW5naW5lLiYjeGQ7CiAgIComI3hkOwogICAqIEBtZW1iZXJvZiBQUkQudXRpbCYjeGQ7CiAgICogQHNpbmNlIDEuMC4wJiN4ZDsKICAgKiYjeGQ7CiAgICogQHR5cGUge3N0cmluZ30mI3hkOwogICAqIEByZXR1cm4ge3N0cmluZ30gJ2Zvcm0nIGlmIGluIGEgQnJvd3NlciwgJ2VuZ2luZScgaWYgb24gdGhlIHdvcmtmbG93IGVuZ2luZS4gJ2RldGVjdGlvbiBmYWlsZWQnIG90aGVyd2lzZS4mI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gZm9ybU9yRW5naW5lKCkgeyYjeGQ7CiAgICB2YXIgcmVzID0gJ0RldGVjdGlvbiBmYWlsZWQnOyYjeGQ7CiAgICBpZiAoIHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnICZhbXA7JmFtcDsmI3hkOwogICAgICAnZG9jdW1lbnQnIGluIHdpbmRvdyAmYW1wOyZhbXA7JiN4ZDsKICAgICAgdHlwZW9mIGphdmEgPT09ICd1bmRlZmluZWQnJiN4ZDsKICAgICkgeyYjeGQ7CiAgICAgIHJlcyA9ICdmb3JtJzsmI3hkOwogICAgfSYjeGQ7CiAgICBpZiAoIHR5cGVvZiBqYXZhID09PSAnb2JqZWN0JyAmYW1wOyZhbXA7JiN4ZDsKICAgICAgICAgICdsYW5nJyBpbiBqYXZhICZhbXA7JmFtcDsmI3hkOwogICAgICAgICAgJ1N0cmluZycgaW4gamF2YS5sYW5nICZhbXA7JmFtcDsmI3hkOwogICAgICB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyYjeGQ7CiAgICApIHsmI3hkOwogICAgICByZXMgPSAnZW5naW5lJzsmI3hkOwogICAgfSYjeGQ7CiAgICByZXR1cm4gcmVzOyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiBPdXRwdXQgZXJyb3IgbWVzc2FnZSBiYXNlZCBvbiB3aGVyZSB0aGUgY29kZSBpcyBydW5uaW5nLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBPdXRwdXQgdG8gdGhlIGNvbnNvbGUubG9nKCkgaWYgaW4gYSBicm93c2VyLCB0byBjYXRhbGluYS5vdXQgaWYgaW4gdGhlIHdvcmtmbG93IGVuZ2luZS4mbHQ7YnIvJmd0OyYjeGQ7CiAgICogUHJlcGVuZHMgdGhlIHZhbHVlIG9mIHRoZSBtb2R1bGUncyBpbnRlcm5hbCAncHJlZml4JyB2YXJpYWJsZS4mI3hkOwogICAqJiN4ZDsKICAgKiBAbWVtYmVyb2YgUFJELnV0aWwmI3hkOwogICAqIEBzaW5jZSAxLjAuMCYjeGQ7CiAgIComI3hkOwogICAqIEBwYXJhbSAge3N0cmluZ30gbXNnICAgIEVycm9yIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLiYjeGQ7CiAgIComI3hkOwogICAqIEB0eXBlIHtib29sZWFufSYjeGQ7CiAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgbWVzc2FnZSB3YXMgcmV0dXJuZWQgc3VjY2Vzc2Z1bGx5LCBmYWxzZSBvdGhlcndpc2UuJiN4ZDsKICAgKi8mI3hkOwogIGZ1bmN0aW9uIGxvZ2Vycm9yKCBtc2cgKSB7JiN4ZDsKICAgIHZhciByZXF1ZXN0SUQsIHByZXBlbmQ7JiN4ZDsKICAgIC8vIENvZXJjaW5nIGxvZyBtZXNzYWdlIHZpYSBTdHJpbmcoKSB0byBhdm9pZCBudWxsIGFuZCB1bmRlZmluZWQgcmVzdWx0cyBiZWluZyBwYXNzZWQgdG8gdGhlIGxvZyBtZWNoYW5pc20uJiN4ZDsKICAgIG1zZyA9IFN0cmluZyggbXNnICk7JiN4ZDsKICAgIC8vIENvZXJjaW5nIGxvZyBwcmVmaXggaW50ZXJuYWwgdmFyaWFibGUgdmlhIFN0cmluZygpIHRvIGF2b2lkIG51bGwgYW5kIHVuZGVmaW5lZCByZXN1bHRzIGJlaW5nIHBhc3NlZCB0byB0aGUgbG9nIG1lY2hhbmlzbS4mI3hkOwogICAgcHJlcGVuZCA9IFN0cmluZyggcHJlZml4ICk7JiN4ZDsKICAgIC8vIFVzaW5nIHRyeS9jYXRjaCBtYWtlcyB0aGUgY2FsbCBzYWZlciwgaXQgYWxzbyBpbXBhY3RzIHBlcmZvcm1hbmNlLiYjeGQ7CiAgICBpZiAoIHdoZXJlID09PSAnZW5naW5lJyApIHsmI3hkOwogICAgICAvLyBwcm9jZXNzLmdldFJlcXVlc3RJZCgpIG1heSBmYWlsIGlmIGNhbGxlZCBkdXJpbmcgR2xvYmFsIFNjcmlwdCBpbml0aWFsaXphdGlvbi4mI3hkOwogICAgICB0cnkgeyYjeGQ7CiAgICAgICAgcmVxdWVzdElEID0gcHJvY2Vzcy5nZXRSZXF1ZXN0SWQoKTsmI3hkOwogICAgICAgIHJlcXVlc3RJRCArPSAnOiAnOyYjeGQ7CiAgICAgIH0gY2F0Y2goZSkge30mI3hkOwogICAgfSYjeGQ7CiAgICB0cnkgeyYjeGQ7CiAgICAgIGlmICggd2hlcmUgPT09ICdmb3JtJyApIHsmI3hkOwogICAgICAgIGNvbnNvbGUubG9nKCBwcmVwZW5kICsgbXNnICk7JiN4ZDsKICAgICAgfSYjeGQ7CiAgICAgIGlmICggd2hlcmUgPT09ICdlbmdpbmUnICkgeyYjeGQ7CiAgICAgICAgamF2YS5sYW5nLlN5c3RlbS5vdXQucHJpbnRsbiggcHJlcGVuZCArIHJlcXVlc3RJRCArIG1zZyApOyYjeGQ7CiAgICAgIH0mI3hkOwogICAgfSBjYXRjaCAoIGUgKSB7JiN4ZDsKICAgICAgLy8gZGlzY2FyZGluZyBlcnJvciwgc2luY2UgdGhpcyBpcyBhbiBlcnJvciBhYm91dCBwcmludGluZyB0aGUgZXJyb3IgbWVzc2FnZS4uLiYjeGQ7CiAgICAgIHJldHVybiBmYWxzZTsmI3hkOwogICAgfSYjeGQ7CiAgICByZXR1cm4gdHJ1ZTsmI3hkOwogIH0mI3hkOwomI3hkOwogIC8qKiYjeGQ7CiAgICogT3V0cHV0IGRlYnVnIG1lc3NhZ2UgdmlhIGxvZ2Vycm9yKCkgb25seSBpZiB0aGUgaW50ZXJuYWwgdmFyaWFibGUgZGVidWcgaXMgc2V0IHRvIHRydWUmI3hkOwogICAqJiN4ZDsKICAgKiBAbWVtYmVyb2YgUFJELnV0aWwmI3hkOwogICAqIEBzaW5jZSAxLjAuMyYjeGQ7CiAgIComI3hkOwogICAqIEBwYXJhbSB7c3RyaW5nfSAgc3RyICAgU3RyaW5nIGlucHV0LiYjeGQ7CiAgICovJiN4ZDsKICBmdW5jdGlvbiBkZWJ1Z21zZyggc3RyICkgeyYjeGQ7CiAgICBpZiAoIGRlYnVnICkgeyYjeGQ7CiAgICAgIGxvZ2Vycm9yKCBzdHIgKTsmI3hkOwogICAgfSYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIGFuIEVDTUEgb2JqZWN0IG9yIGNsYXNzIG9mIGEgSmF2YSBvYmplY3QuJmx0O2JyLyZndDsmI3hkOwogICAqIEZvciBFQ01BIHJlbGllcyBvbiB0eXBlb2YgYW5kIGluc3RhbmNlb2YsIGlmIG5laXRoZXIgd29ya3MgdXNlcyBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nIC4mbHQ7YnIvJmd0OyYjeGQ7CiAgICogRm9yIEphdmEgb2JqZWN0cyBqdXN0IGNhbGxzIGdldENsYXNzKCkuJmx0O2JyLyZndDsmI3hkOwogICAqIFByaW50cyByZXN1bHQgd2hlbiBtb2R1bGUgaXMgcmFuIGluIGRlYnVnIG1vZGUsIHJldHVybnMgcmVzdWx0IGFzIHN0cmluZy4mI3hkOwogICAqJiN4ZDsKICAgKiBAbWVtYmVyb2YgUFJELnV0aWwmI3hkOwogICAqIEBzaW5jZSAxLjAuNSYjeGQ7CiAgIComI3hkOwogICAqIEBwYXJhbSB7YW55fSAgaW5wdXQgICBFQ01BIG9yIEphdmEgaW5wdXQmI3hkOwogICAqJiN4ZDsKICAgKiBAdHlwZSB7c3RyaW5nfSYjeGQ7CiAgICogQHJldHVybiB7c3RyaW5nfSBhbmFseXNpcyByZXN1bHQmI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gaW5zcGVjdFR5cGUoIGlucHV0ICkgeyYjeGQ7CiAgICB2YXIgcmVzID0gJyc7JiN4ZDsKICAgIC8vIFNlZTomI3hkOwogICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9EYXRhX3N0cnVjdHVyZXMmI3hkOwogICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT3BlcmF0b3JzL3R5cGVvZiYjeGQ7CiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9PcGVyYXRvcnMvaW5zdGFuY2VvZiYjeGQ7CiAgICAvLyBFQ01BIG51bGwmI3hkOwogICAgaWYgKCBpbnB1dCA9PT0gbnVsbCApIHsmI3hkOwogICAgICByZXMgPSAnbnVsbCc7JiN4ZDsKICAgIH0mI3hkOwogICAgLy8gRUNNQSB1bmRlZmluZWQmI3hkOwogICAgaWYgKCB0eXBlb2YgaW5wdXQgPT09ICd1bmRlZmluZWQnICkgeyYjeGQ7CiAgICAgIHJlcyA9ICd1bmRlZmluZWQnOyYjeGQ7CiAgICB9JiN4ZDsKICAgIC8vIEVDTUEgc3ltYm9sIChFUzYgb253YXJkcykmI3hkOwogICAgaWYgKCB0eXBlb2YgaW5wdXQgPT09ICdzeW1ib2wnICkgeyYjeGQ7CiAgICAgIHJlcyA9ICdzeW1ib2wnOyYjeGQ7CiAgICB9JiN4ZDsKICAgIC8vIEVDTUEgc3RyaW5nLiB0eXBlb2Ygd29uJ3QgY2FwdHVyZSB0aGUgY2FzZSB3aGVyZSBhIHN0cmluZyB3YXMgY3JlYXRlZCB2aWEgTmV3IFN0cmluZygpLCBzbyBuZWVkIGluc3RhbmNlb2YgdG9vJiN4ZDsKICAgIGlmICggdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyB8fCAoIHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcgJmFtcDsmYW1wOyBpbnB1dCBpbnN0YW5jZW9mIFN0cmluZyApICkgeyYjeGQ7CiAgICAgIHJlcyA9ICdzdHJpbmcnOyYjeGQ7CiAgICB9JiN4ZDsKICAgIC8vIEVDTUEgbnVtYmVyLiB0eXBlb2Ygd29uJ3QgY2FwdHVyZSB0aGUgY2FzZSB3aGVyZSBhIG51bWJlciB3YXMgY3JlYXRlZCB2aWEgTmV3IE51bWJlcigpLCBzbyBuZWVkIGluc3RhbmNlb2YgdG9vJiN4ZDsKICAgIGlmICggdHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJyB8fCAoIHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcgJmFtcDsmYW1wOyBpbnB1dCBpbnN0YW5jZW9mIE51bWJlciApICkgeyYjeGQ7CiAgICAgIHJlcyA9ICdudW1iZXInOyYjeGQ7CiAgICB9JiN4ZDsKICAgIC8vIEVDTUEgYm9vbGVhbi4gdHlwZW9mIHdvbid0IGNhcHR1cmUgdGhlIGNhc2Ugd2hlcmUgYSBzdHJpbmcgd2FzIGNyZWF0ZWQgdmlhIE5ldyBCb29sZWFuKCksIHNvIG5lZWQgaW5zdGFuY2VvZiB0b28mI3hkOwogICAgaWYgKCB0eXBlb2YgaW5wdXQgPT09ICdib29sZWFuJyB8fCAoIHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcgJmFtcDsmYW1wOyBpbnB1dCBpbnN0YW5jZW9mIEJvb2xlYW4gKSApIHsmI3hkOwogICAgICByZXMgPSAnYm9vbGVhbic7JiN4ZDsKICAgIH0mI3hkOwogICAgLy8gRUNNQSBmdW5jdGlvbm4uIFNvbWUgcG9zdHMgcmVwb3J0IHR5cGVvZiBub3QgcmV0dXJuaW5nICdmdW5jdGlvbicgb24gY2VydGFpbiBlbnZpcm9ubWVudHMgc28gY2hlY2tpbmcgdmlhIGluc3RhbmNlb2YgYXMgYSBmYWxsYmFjayYjeGQ7CiAgICBpZiAoIHR5cGVvZiBpbnB1dCA9PT0gJ2Z1bmN0aW9uJyB8fCAoIHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcgJmFtcDsmYW1wOyBpbnB1dCBpbnN0YW5jZW9mIEZ1bmN0aW9uICkgKSB7JiN4ZDsKICAgICAgcmVzID0gJ2Z1bmN0aW9uJzsmI3hkOwogICAgfSYjeGQ7CiAgICBpZiAoIHJlcyA9PT0gJycgJmFtcDsmYW1wOyB0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICkgeyYjeGQ7CiAgICAgIGlmICggaW5wdXQgaW5zdGFuY2VvZiBBcnJheSApIHsgLy8gRUNNQSBBcnJheSYjeGQ7CiAgICAgICAgcmVzID0gJ2FycmF5JzsmI3hkOwogICAgICB9IGVsc2UgaWYgKCBpbnB1dCBpbnN0YW5jZW9mIFJlZ0V4cCApIHsgLy8gRUNNQSByZWd1bGFyIGV4cHJlc3Npb24mI3hkOwogICAgICAgIHJlcyA9ICdyZWdleHAnOyYjeGQ7CiAgICAgIH0gZWxzZSBpZiAoIGlucHV0IGluc3RhbmNlb2YgRGF0ZSApIHsgLy8gRUNNQSBkYXRlIG9iamVjdCYjeGQ7CiAgICAgICAgcmVzID0gJ2RhdGUnOyYjeGQ7CiAgICAgIH0gZWxzZSBpZiAoIGlucHV0IGluc3RhbmNlb2YgRXJyb3IgKSB7IC8vIEVDTUEgZXJyb3Igb2JqZWN0JiN4ZDsKICAgICAgICByZXMgPSAnZXJyb3InOyYjeGQ7CiAgICAgIH0gZWxzZSBpZiAoICdnZXRDbGFzcycgaW4gaW5wdXQgKSB7IC8vIEphdmEgY2xhc3MmI3hkOwogICAgICAgIHJlcyA9IGlucHV0LmdldENsYXNzKCk7JiN4ZDsKICAgICAgfSBlbHNlIHsgLy8gRUNNQSBmYWxsYmFjayB0byBnZXQgdGhlIG9iamVjdCdzIGNvbnN0cnVjdG9yIG5hbWUuIGFkZGluZyAuc2xpY2UoIDgsIC0xICkgd291bGQgcmVtb3ZlIHRoZSBbIG9iamVjdCBdIHBvcnRpb24gb2YgdGhlIHN0cmluZy4mI3hkOwogICAgICAgIHJlcyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCggaW5wdXQgKTsmI3hkOwogICAgICB9JiN4ZDsKICAgIH0mI3hkOwogICAgZGVidWdtc2coIHJlcyApOyYjeGQ7CiAgICByZXR1cm4gcmVzOyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiBDaGVja3MgaWYgdGhlIHByb3ZpZGVkIGlucHV0IGlzIGFuIEVDTUEgU3RyaW5nIChwcmltaXRpdmUgb3Igb2JqZWN0KS4mI3hkOwogICAqJiN4ZDsKICAgKiBAbWVtYmVyb2YgUFJELnV0aWwmI3hkOwogICAqIEBzaW5jZSAxLjAuNSYjeGQ7CiAgIComI3hkOwogICAqIEBwYXJhbSB7YW55fSAgaW5wdXQgICBJbnB1dCB2YWx1ZSB3aG9zZSB0eXBlIHdpbGwgYmUgZXZhbHVhdGVkJiN4ZDsKICAgKiYjeGQ7CiAgICogQHR5cGUge2Jvb2xlYW59JiN4ZDsKICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHN0cmluZywgZmFsc2Ugb3RoZXJ3aXNlJiN4ZDsKICAgKi8mI3hkOwogIGZ1bmN0aW9uIGlzU3RyaW5nKCBpbnB1dCApIHsmI3hkOwogICAgcmV0dXJuICggdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyB8fCAoIHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcgJmFtcDsmYW1wOyBpbnB1dCBpbnN0YW5jZW9mIFN0cmluZyApICk7JiN4ZDsKICB9JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIENoZWNrcyBpZiB0aGUgcHJvdmlkZWQgaW5wdXQgaXMgYW4gRUNNQSBOdW1iZXIgKHByaW1pdGl2ZSBvciBvYmplY3QpLiYjeGQ7CiAgIComI3hkOwogICAqIEBtZW1iZXJvZiBQUkQudXRpbCYjeGQ7CiAgICogQHNpbmNlIDEuMC41JiN4ZDsKICAgKiYjeGQ7CiAgICogQHBhcmFtIHthbnl9ICBpbnB1dCAgIElucHV0IHZhbHVlIHdob3NlIHR5cGUgd2lsbCBiZSBldmFsdWF0ZWQmI3hkOwogICAqJiN4ZDsKICAgKiBAdHlwZSB7Ym9vbGVhbn0mI3hkOwogICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgbnVtYmVyLCBmYWxzZSBvdGhlcndpc2UmI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gaXNOdW1iZXIoIGlucHV0ICkgeyYjeGQ7CiAgICByZXR1cm4gKCB0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInIHx8ICggdHlwZW9mIGlucHV0ID09PSAnb2JqZWN0JyAmYW1wOyZhbXA7IGlucHV0IGluc3RhbmNlb2YgTnVtYmVyICkgKTsmI3hkOwogIH0mI3hkOwomI3hkOwogIC8qKiYjeGQ7CiAgICogQ2hlY2tzIGlmIHRoZSBwcm92aWRlZCBpbnB1dCBpcyBhbiBFQ01BIEJvb2xlYW4gKHByaW1pdGl2ZSBvciBvYmplY3QpLiYjeGQ7CiAgIComI3hkOwogICAqIEBtZW1iZXJvZiBQUkQudXRpbCYjeGQ7CiAgICogQHNpbmNlIDEuMC41JiN4ZDsKICAgKiYjeGQ7CiAgICogQHBhcmFtIHthbnl9ICBpbnB1dCAgIElucHV0IHZhbHVlIHdob3NlIHR5cGUgd2lsbCBiZSBldmFsdWF0ZWQmI3hkOwogICAqJiN4ZDsKICAgKiBAdHlwZSB7Ym9vbGVhbn0mI3hkOwogICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgYm9vbGVhbiwgZmFsc2Ugb3RoZXJ3aXNlJiN4ZDsKICAgKi8mI3hkOwogIGZ1bmN0aW9uIGlzQm9vbGVhbiggaW5wdXQgKSB7JiN4ZDsKICAgIHJldHVybiAoIHR5cGVvZiBpbnB1dCA9PT0gJ2Jvb2xlYW4nIHx8ICggdHlwZW9mIGlucHV0ID09PSAnb2JqZWN0JyAmYW1wOyZhbXA7IGlucHV0IGluc3RhbmNlb2YgQm9vbGVhbiApICk7JiN4ZDsKICB9JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIChFbmdpbmUgb25seSkgQ2hlY2tzIGlmIHRoZSBwcm92aWRlZCBpbnB1dCBpcyBhIEphdmEgVmVjdG9yLiYjeGQ7CiAgIComI3hkOwogICAqIEBtZW1iZXJvZiBQUkQudXRpbCYjeGQ7CiAgICogQHNpbmNlIDEuMC41JiN4ZDsKICAgKiYjeGQ7CiAgICogQHBhcmFtIHthbnl9ICBpbnB1dCAgIElucHV0IHZhbHVlIHdob3NlIHR5cGUgd2lsbCBiZSBldmFsdWF0ZWQmI3hkOwogICAqJiN4ZDsKICAgKiBAdHlwZSB7Ym9vbGVhbn0mI3hkOwogICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgSmF2YSBWZWN0b3IsIGZhbHNlIG90aGVyd2lzZSYjeGQ7CiAgICovJiN4ZDsKICBmdW5jdGlvbiBpc0phdmFWZWN0b3IoIGlucHV0ICkgeyYjeGQ7CiAgICByZXR1cm4gKCBpbnB1dCAhPSBudWxsICZhbXA7JmFtcDsgdHlwZW9mIGlucHV0ID09PSAnb2JqZWN0JyAmYW1wOyZhbXA7ICdnZXRDbGFzcycgaW4gaW5wdXQgJmFtcDsmYW1wOyBpbnB1dC5nZXRDbGFzcygpID09ICdjbGFzcyBqYXZhLnV0aWwuVmVjdG9yJyApOyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgIC8qKiYjeGQ7CiAgICogKEZvcm0gb25seSkgSW5pdGlhbGl6ZXMgcmVmZXJlbmNlcyB0byB0aGUgUkJQTS9JRE1BUFBTIGZyYW1ld29yayBvYmplY3RzIGFuZCBzYXZlIHRoZSBzYW1lIGluIHRoZSBpbnRlcm5hbCBzdG9yYWdlLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBVc2VzIElEVmF1bHQgaW50ZXJuYWxseSBvbiBJRFZnZXQoKSwgSURWZ2xvYmFsUXVlcnkoKSwgR0NWZ2V0KCksIGdldE5hbWVkUGFzc3dvcmQoKS4mbHQ7YnIvJmd0OyYjeGQ7CiAgICogRXhwb3J0cyBmaWVsZCBhcyBQUkQud2ViLmZpZWxkIGFuZCBmb3JtIGFzIFBSRC53ZWIuZm9ybSBmb3IgdXNhZ2UgaW5zaWRlIGdsb2JhbCBzY3JpcHRzLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBSZWZhY3RvcmVkIHRvIGFjY2VwdCAxIHRvIDMgcGFyYW1ldGVycyB3aXRoIHRoZSBmcmFtZXdvcmsgb2JqZWN0cyBpbiBhbnkgb3JkZXIuJmx0O2JyLyZndDsmI3hkOwogICAqIFJldHVybnMgbm90aGluZy4mI3hkOwogICAqJiN4ZDsKICAgKiBAZnVuY3Rpb24gaW5pdCYjeGQ7CiAgICogQG1lbWJlcm9mIFBSRCYjeGQ7CiAgICogQHNpbmNlIDEuMC4wJiN4ZDsKICAgKiYjeGQ7CiAgICogQHBhcmFtIHtvYmplY3R9ICAgb2JqMSAgICAgIE9uZSBvZiB0aGUgdGhyZWUgSURNQVBQUyBmcmFtZXdvcmsgb2JqZWN0JiN4ZDsKICAgKiBAcGFyYW0ge29iamVjdD19ICBbb2JqMl0gICAgT25lIG9mIHRoZSB0aHJlZSBJRE1BUFBTIGZyYW1ld29yayBvYmplY3QmI3hkOwogICAqIEBwYXJhbSB7b2JqZWN0PX0gIFtvYmozXSAgICBPbmUgb2YgdGhlIHRocmVlIElETUFQUFMgZnJhbWV3b3JrIG9iamVjdCYjeGQ7CiAgICovJiN4ZDsKICBmdW5jdGlvbiBmb3JtSW5pdCggb2JqMSwgb2JqMiwgb2JqMyApIHsmI3hkOwogICAgLy8gT25seSBhcHBlbmRzIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCBzbyB0aGF0IHdlIGNhbiBjaGVjayBmb3IgdGhlIGxpbmsncyBleGlzdGVuY2UmI3hkOwogICAgLy8gYmVmb3JlIHVzaW5nIGl0IGluIHRoZSBmdW5jdGlvbnMgdGhhdCByZXF1aXJlIHRoZSBVc2VyIEFwcC9SQlBNL0lETUFQUFMgZnJhbWV3b3JrJiN4ZDsKICAgIHZhciBmbmFtZSwgaSwgaW5wdXQgPSBbXTsmI3hkOwogICAgZm5hbWUgPSAnUFJELmluaXQoKTogJzsmI3hkOwogICAgaWYgKCBvYmoxICE9IG51bGwgKSB7JiN4ZDsKICAgICAgaW5wdXQucHVzaCggb2JqMSApOyYjeGQ7CiAgICB9IGVsc2UgeyYjeGQ7CiAgICAgIGxvZ2Vycm9yKCBmbmFtZSArICdyZXF1aXJlcyBhdCBsZWFzdCBvbmUgcGFyYW1ldGVyLicgKTsmI3hkOwogICAgfSYjeGQ7CiAgICBpZiAoIG9iajIgIT0gbnVsbCApIHsmI3hkOwogICAgICBpbnB1dC5wdXNoKCBvYmoyICk7JiN4ZDsKICAgIH0mI3hkOwogICAgaWYgKCBvYmozICE9IG51bGwgKSB7JiN4ZDsKICAgICAgaW5wdXQucHVzaCggb2JqMyApOyYjeGQ7CiAgICB9JiN4ZDsKICAgIC8vIFBhcnNlIGlucHV0IHBhcmFtZXRlcnMgYW5kIHNldHVwIHRoZSBJRE1BUFBTIGludGVybmFsIHZhcmlhYmxlJiN4ZDsKICAgIGZvciAoIGkgPSAwOyBpICZsdDsgaW5wdXQubGVuZ3RoOyBpKysgKSB7JiN4ZDsKICAgICAgaWYgKCBpc0ZpZWxkKCBpbnB1dFsgaSBdICkgJmFtcDsmYW1wOyBJRE1BUFBTLmZpZWxkID09PSBudWxsICkgeyYjeGQ7CiAgICAgICAgbG9nZXJyb3IoIGZuYW1lICsgJ3NldHRpbmcgdXAgaW50ZXJuYWwgcmVmZXJlbmNlIHRvIGZpZWxkLicgKTsmI3hkOwogICAgICAgIElETUFQUFMuZmllbGQgPSBpbnB1dFsgaSBdOyYjeGQ7CiAgICAgICAgaWYgKCAnd2ViJyBpbiBQdWJsaWNBUEkgKSB7JiN4ZDsKICAgICAgICAgIFB1YmxpY0FQSS53ZWIuZmllbGQgPSBpbnB1dFsgaSBdOyYjeGQ7CiAgICAgICAgfSYjeGQ7CiAgICAgIH0gZWxzZSBpZiAoIGlzRm9ybSggaW5wdXRbIGkgXSApICZhbXA7JmFtcDsgSURNQVBQUy5mb3JtID09PSBudWxsICkgeyYjeGQ7CiAgICAgICAgbG9nZXJyb3IoIGZuYW1lICsgJ3NldHRpbmcgdXAgaW50ZXJuYWwgcmVmZXJlbmNlIHRvIGZvcm0uJyApOyYjeGQ7CiAgICAgICAgSURNQVBQUy5mb3JtID0gaW5wdXRbIGkgXTsmI3hkOwogICAgICAgIGlmICggJ3dlYicgaW4gUHVibGljQVBJICkgeyYjeGQ7CiAgICAgICAgICBQdWJsaWNBUEkud2ViLmZvcm0gPSBpbnB1dFsgaSBdOyYjeGQ7CiAgICAgICAgfSYjeGQ7CiAgICAgIH0gZWxzZSBpZiAoIGlzSURWYXVsdCggaW5wdXRbIGkgXSApICZhbXA7JmFtcDsgSURNQVBQUy5JRFZhdWx0ID09PSBudWxsICkgeyYjeGQ7CiAgICAgICAgbG9nZXJyb3IoIGZuYW1lICsgJ3NldHRpbmcgdXAgaW50ZXJuYWwgcmVmZXJlbmNlIHRvIElEVmF1bHQuJyApOyYjeGQ7CiAgICAgICAgSURNQVBQUy5JRFZhdWx0ID0gaW5wdXRbIGkgXTsmI3hkOwogICAgICAgIGlmICggJ3dlYicgaW4gUHVibGljQVBJICkgeyYjeGQ7CiAgICAgICAgICBQdWJsaWNBUEkud2ViLklEVmF1bHQgPSBpbnB1dFsgaSBdOyYjeGQ7CiAgICAgICAgfSYjeGQ7CiAgICAgIH0gZWxzZSB7JiN4ZDsKICAgICAgICBsb2dlcnJvciggZm5hbWUgKyAnUGFyYW1ldGVyIG9iaicgKyAoaSsxKSArICcgaXMgbm90IG9uZSBvZiB0aGUgMyBleHBlY3RlZCBmcmFtZXdvcmsgb2JqZWN0cywgc2tpcHBpbmcgaXQuJyApOyYjeGQ7CiAgICAgIH0mI3hkOwogICAgfSYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiBJbnNwZWN0cyBpZiB0aGUgb2JqZWN0IHJlY2VpdmVkIGhhcyBhbGwgdGhlIHByb3BldGllcyBpbiB0aGUgYXJyYXkgcmVjZWl2ZWQgYW5kIHRoYXQgdGhleSBhcmUgdHlwZW9mICdmdW5jdGlvbicuJiN4ZDsKICAgKiBAc2luY2UgMS4wLjQmI3hkOwogICAqIEBwcml2YXRlJiN4ZDsKICAgKiBAcGFyYW0ge3N0cmluZ30gICAgb2JqICAgIE9iamVjdCB0byBjaGVjayYjeGQ7CiAgICogQHBhcmFtIHtzdHJpbmdbXX0gIGxpc3QgICBMaXN0IG9mIGZ1bmN0aW9ucyB0byB2YWxpZGF0ZSB0aGF0IHRoZSBvYmplY3QgaGFzIHRoZW0mI3hkOwogICAqIEB0eXBlIHtib29sZWFufSYjeGQ7CiAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgb2JqIGhhcyBhbGwgZnVuY3Rpb25zIGxpc3RlZCwgZmFsc2Ugb3RoZXJ3aXNlLiYjeGQ7CiAgICovJiN4ZDsKICBmdW5jdGlvbiBvYmplY3RIYXNGdW5jdGlvbnMoIG9iaiwgbGlzdCApIHsmI3hkOwogICAgdmFyIGZuYW1lLCBpOyYjeGQ7CiAgICBmbmFtZSA9ICdvYmplY3RIYXNGdW5jdGlvbnMoKTogJzsmI3hkOwogICAgaWYgKCBvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgKCEgKGxpc3QgaW5zdGFuY2VvZiBBcnJheSkgKSB8fCBsaXN0Lmxlbmd0aCA9PT0gMCApIHsmI3hkOwogICAgICBkZWJ1Z21zZyggZm5hbWUgKyAnUGxlYXNlIHJldmlldyB5b3VyIGlucHV0IHBhcmFtZXRlcnMuJyk7JiN4ZDsKICAgICAgcmV0dXJuIGZhbHNlOyYjeGQ7CiAgICB9JiN4ZDsKICAgIGZvciAoIGkgPSAwOyBpICZsdDsgbGlzdC5sZW5ndGg7IGkgKyspIHsmI3hkOwogICAgICBpZiAoICEgb2JqLmhhc093blByb3BlcnR5KCBsaXN0WyBpIF0gKSApIHsmI3hkOwogICAgICAgIHJldHVybiBmYWxzZTsmI3hkOwogICAgICB9IGVsc2UgaWYgKCB0eXBlb2Ygb2JqWyBsaXN0WyBpIF0gXSAhPT0gJ2Z1bmN0aW9uJyApIHsmI3hkOwogICAgICAgIHJldHVybiBmYWxzZTsmI3hkOwogICAgICB9JiN4ZDsKICAgIH0mI3hkOwogICAgcmV0dXJuIHRydWU7JiN4ZDsKICB9JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIEluc3BlY3RzIGlmIHRoZSBwYXJhbWV0ZXIgcHJvdmlkZWQgaXMgdGhlIElETUFQUFMgZnJhbWV3b3JrIG9iamVjdCAnZmllbGQnLiYjeGQ7CiAgICogQHNpbmNlIDEuMC40JiN4ZDsKICAgKiBAcHJpdmF0ZSYjeGQ7CiAgICogQHBhcmFtIHtzdHJpbmd9ICBvYmogICBPYmplY3QgdG8gY2hlY2smI3hkOwogICAqIEB0eXBlIHtib29sZWFufSYjeGQ7CiAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgaW5wdXQgaXMgSURNQVBQUyBmcmFtZXdvcmsgZmllbGQgb2JqZWN0LCBmYWxzZSBvdGhlcndpc2UuJiN4ZDsKICAgKi8mI3hkOwogIGZ1bmN0aW9uIGlzRmllbGQoIG9iaiApIHsmI3hkOwogICAgdmFyIHByb3BlcnRpZXM7JiN4ZDsKICAgIC8vIFByb3BlcnRpZXMgb2J0YWluZWQgZnJvbSBJRE0gNC41IE9iamVjdC5rZXlzKCBmaWVsZCApIGV4ZWN1dGVkIG9uIGEgd2ViIGJyb3dzZXImI3hkOwogICAgcHJvcGVydGllcyA9IFsgJ2dldE5hbWUnLCAnZ2V0TGFiZWwnLCAndmFsaWRhdGUnLCAnZmlyZUV2ZW50JywgJ2hpZGUnLCYjeGQ7CiAgICAgICdzaG93JywgJ2VuYWJsZScsICdkaXNhYmxlJywgJ2dldFZhbHVlJywgJ2dldFZhbHVlcycsICdnZXRBbGxWYWx1ZXMnLCYjeGQ7CiAgICAgICdzZXRWYWx1ZXMnLCAnZm9jdXMnLCAnc2VsZWN0JywgJ2FjdGl2YXRlJywgJ3NldFJlcXVpcmVkJyYjeGQ7CiAgICBdOyYjeGQ7CiAgICByZXR1cm4gb2JqZWN0SGFzRnVuY3Rpb25zKCBvYmosIHByb3BlcnRpZXMgKTsmI3hkOwogIH0mI3hkOwomI3hkOwogIC8qKiYjeGQ7CiAgICogSW5zcGVjdHMgaWYgdGhlIHBhcmFtZXRlciBwcm92aWRlZCBpcyB0aGUgSURNQVBQUyBmcmFtZXdvcmsgb2JqZWN0ICdmb3JtJy4mI3hkOwogICAqIEBzaW5jZSAxLjAuNCYjeGQ7CiAgICogQHByaXZhdGUmI3hkOwogICAqIEBwYXJhbSB7c3RyaW5nfSAgb2JqICAgT2JqZWN0IHRvIGNoZWNrJiN4ZDsKICAgKiBAdHlwZSB7Ym9vbGVhbn0mI3hkOwogICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIGlucHV0IGlzIElETUFQUFMgZnJhbWV3b3JrIGZpZWxkIG9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlLiYjeGQ7CiAgICovJiN4ZDsKICBmdW5jdGlvbiBpc0Zvcm0oIG9iaiApIHsmI3hkOwogICAgdmFyIHByb3BlcnRpZXM7JiN4ZDsKICAgIC8vIFByb3BlcnRpZXMgb2J0YWluZWQgZnJvbSBJRE0gNC41IE9iamVjdC5rZXlzKCBmb3JtICkgZXhlY3V0ZWQgb24gYSB3ZWIgYnJvd3NlciYjeGQ7CiAgICBwcm9wZXJ0aWVzID0gWyAnZ2V0RmllbGQnLCAnYWxlcnQnLCAnc2hvd01zZycsICdzaG93V2FybmluZycsICdzaG93RXJyb3InLCYjeGQ7CiAgICAgICdzaG93RmF0YWwnLCAndmFsaWRhdGUnLCAnc3VibWl0JywgJ2dldExhYmVsJywgJ2hpZGUnLCAnc2hvdycsICdlbmFibGUnLCYjeGQ7CiAgICAgICdkaXNhYmxlJywgJ2dldFZhbHVlJywgJ2dldFZhbHVlcycsICdnZXRBbGxWYWx1ZXMnLCAnc2V0VmFsdWVzJywgJ2ZvY3VzJywmI3hkOwogICAgICAnc2VsZWN0JywgJ2FjdGl2YXRlJywgJ3NldFJlcXVpcmVkJywgJ2ludGVyY2VwdEFjdGlvbicsICdnZXRMb2NhbGUnLCYjeGQ7CiAgICAgICdnZXREZWZhdWx0TG9jYWxlJywgJ2dldFJCTWVzc2FnZScsICdzdHJpbmdUb0RhdGUnLCAnZGF0ZVRvU3RyaW5nJywmI3hkOwogICAgICAnaXNWYWxpZERhdGUnLCAnc2hvd0RlYnVnTXNnJywgJ2FkZEN1c3RvbVZhbGlkYXRpb24nLCAnY2xlYXJNZXNzYWdlcycmI3hkOwogICAgXTsmI3hkOwogICAgcmV0dXJuIG9iamVjdEhhc0Z1bmN0aW9ucyggb2JqLCBwcm9wZXJ0aWVzICk7JiN4ZDsKICB9JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIEluc3BlY3RzIGlmIHRoZSBwYXJhbWV0ZXIgcHJvdmlkZWQgaXMgdGhlIElETUFQUFMgZnJhbWV3b3JrIG9iamVjdCAnSURWYXVsdCcmI3hkOwogICAqIEBzaW5jZSAxLjAuNCYjeGQ7CiAgICogQHByaXZhdGUmI3hkOwogICAqIEBwYXJhbSB7c3RyaW5nfSAgb2JqICAgT2JqZWN0IHRvIGNoZWNrJiN4ZDsKICAgKiBAdHlwZSB7Ym9vbGVhbn0mI3hkOwogICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIGlucHV0IGlzIElETUFQUFMgZnJhbWV3b3JrIGZpZWxkIG9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlLiYjeGQ7CiAgICovJiN4ZDsKICBmdW5jdGlvbiBpc0lEVmF1bHQoIG9iaiApIHsmI3hkOwogICAgdmFyIHByb3BlcnRpZXM7JiN4ZDsKICAgIC8vIFByb3BlcnRpZXMgb2J0YWluZWQgZnJvbSBJRE0gNC41IE9iamVjdC5rZXlzKCBJRHZhdWx0ICkgZXhlY3V0ZWQgb24gYSB3ZWIgYnJvd3NlciYjeGQ7CiAgICBwcm9wZXJ0aWVzID0gWyAnZ2xvYmFsUXVlcnknLCAnY29udGFpbmVycycsICdnZXQnLCAnZ2xvYmFsTGlzdCcsJiN4ZDsKICAgICAgJ2dldEd1aWRGcm9tRG4nLCAnZ2V0RG5Gcm9tR3VpZCcsICdleGVjU2VydmljZScmI3hkOwogICAgXTsmI3hkOwogICAgcmV0dXJuIG9iamVjdEhhc0Z1bmN0aW9ucyggb2JqLCBwcm9wZXJ0aWVzICk7JiN4ZDsKICB9JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIChGb3JtIG9ubHkpIFdoZW4gYWRkZWQgaW4gdGhlIGV2ZW50IHNlY3Rpb24gb2YgYSBmb3JtIGZpZWxkLCBhbGxvdyB1cyB0byBzaG93IGFuZCBoaWRlIHRoYXQgZmllbGQgYnkgdXNpbmcmbHQ7YnIvJmd0OyYjeGQ7CiAgICogZmllbGQuZmlyZUV2ZW50KCBldmVudC1uYW1lLCBhY3Rpb24gKTsmbHQ7YnIvJmd0OyYjeGQ7CiAgICogV2hlcmUgZXZlbnQtbmFtZSBpcyB0aGUgZXZlbnQncyBuYW1lIGFuZCBhY3Rpb24gaXMgZWl0aGVyICdzaG93JyBvciAnaGlkZScmbHQ7YnIvJmd0OyYjeGQ7CiAgICogJmx0O2JyLyZndDsmI3hkOwogICAqIFNpbmNlIHRoZSBmaWVsZCB2aXNpYmlsaXR5IGZ1bmN0aW9ucyBvbmx5IGV4aXN0IGluc2lkZSB0aGUgZmllbGQgY29udGV4dCB3ZSBuZWVkIHRvIHBhc3MgYm90aCBvYmplY3RzIGZyb20gd2hlcmUmI3hkOwogICAqIHRoZSBmdW5jdGlvbiBpcyBiZWluZyBjYWxsZWQgdG8gdXNlIHRoZW0gaW5zaWRlIHRoYXQgc2NvcGUvY29udGV4dC4gSW5zaWRlIHRoZSBldmVudCB3ZSBqdXN0IG5lZWQgdG8gYWRkIHRoZSBsaW5lOiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBJQXRvb2xzLmZpZWxkVmlzaWJpbGl0eSggZXZlbnQsIGZpZWxkICk7Jmx0O2JyLyZndDsmI3hkOwogICAqIHRvIHByb3Blcmx5IHVzZSB0aGlzIGZ1bmN0aW9uLiBObyBuZWVkIHRvIGNoYW5nZSBhbnl0aGluZyBvbiB0aGUgbGluZSBhYm92ZSwgaXQgaXMgYWxyZWFkeSBwYXNzaW5nIHRoZSBldmVudCBhbmQgZmllbGQgb2JqZWN0cyYjeGQ7CiAgICogYXMgc2VlbiBpbiB0aGUgc2NvcGUgb2YgdGhhdCBwYXJ0aWN1bGFyIGZvcm0gZmllbGQuJmx0O2JyLyZndDsmI3hkOwogICAqICZsdDtici8mZ3Q7JiN4ZDsKICAgKiBubyByZXR1cm4gdmFsdWUgcHJvdmlkZWQuJiN4ZDsKICAgKiYjeGQ7CiAgICogQG1lbWJlcm9mIFBSRC53ZWImI3hkOwogICAqIEBzaW5jZSAxLjAuNCYjeGQ7CiAgIComI3hkOwogICAqIEBwYXJhbSB7b2JqZWN0fSAgZXZlbnQgIGV2ZW50IG9iamVjdCBhcyBzZWVuIGJ5IHRoZSBmaWVsZCdzIHNjb3BlJiN4ZDsKICAgKiBAcGFyYW0ge29iamVjdH0gIGZpZWxkICBmaWVsZCAgb2JqZWN0IGFzIHNlZW4gYnkgdGhlIGZpZWxkJ3Mgc2NvcGUmI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gZmllbGRWaXNpYmlsaXR5KCBldmVudCwgZmllbGQgKSB7JiN4ZDsKICAgIHZhciBhY3Rpb24gPSBTdHJpbmcoIGV2ZW50LmdldEN1c3RvbURhdGEoKSApOyYjeGQ7CiAgICBzd2l0Y2ggKCBhY3Rpb24udG9Mb3dlckNhc2UoKSApIHsmI3hkOwogICAgICBjYXNlICdzaG93JzomI3hkOwogICAgICAgIGZpZWxkLnNob3coKTsmI3hkOwogICAgICAgIGJyZWFrOyYjeGQ7CiAgICAgIGNhc2UgJ2hpZGUnOiYjeGQ7CiAgICAgICAgZmllbGQuaGlkZSgpOyYjeGQ7CiAgICAgICAgYnJlYWs7JiN4ZDsKICAgICAgZGVmYXVsdDomI3hkOwogICAgICBsb2dlcnJvciggJ0ZpZWxkOiAnICsgZmllbGQuZ2V0TGFiZWwoKSArICcsIEV2ZW50OiAnICsgZXZlbnQuZ2V0RXZlbnROYW1lKCkgKyAnLCBJbnZhbGlkIG9wdGlvbiByZWNlaXZlZDogJyArIGFjdGlvbiApOyYjeGQ7CiAgICB9JiN4ZDsKICB9JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIFdyYXBwZXIgZm9yIHRoZSBwYXJzZSgpIGNhbGwgb24gdGhlIGhvc3QgZW52aXJvbm1lbnQncyBKU09OIG9iamVjdC4mbHQ7YnIvJmd0OyYjeGQ7CiAgICogU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0pTT04vcGFyc2UmI3hkOwogICAqJiN4ZDsKICAgKiBAZnVuY3Rpb24gcGFyc2UmI3hkOwogICAqIEBtZW1iZXJvZiBQUkQudXRpbC5KU09Ob2JqJiN4ZDsKICAgKiBAc2luY2UgMS4wLjImI3hkOwogICAqJiN4ZDsKICAgKiBAcGFyYW0ge3N0cmluZ30gICAgIHMgICAgICAgICAgU3RyaW5nIHdpdGggdmFsaWQgSlNPTiBzeW50YXgmI3hkOwogICAqIEBwYXJhbSB7ZnVuY3Rpb249fSAgW3Jldml2ZXJdIChPcHRpb25hbCkgSWYgYSBmdW5jdGlvbiwgdGhpcyBwcmVzY3JpYmVzIGhvdyB0aGUgdmFsdWUgb3JpZ2luYWxseSBwcm9kdWNlZCBieSBwYXJzaW5nIGlzIHRyYW5zZm9ybWVkLCBiZWZvcmUgYmVpbmcgcmV0dXJuZWQuJiN4ZDsKICAgKiYjeGQ7CiAgICogQHR5cGUge29iamVjdH0mI3hkOwogICAqIEByZXR1cm4ge29iamVjdH0gRUNNQSBPYmplY3QgZ2VuZXJhdGVkIGZyb20gdGhlIEpTT04gc3RyaW5nLiBPbiBlcnJvciByZXR1cm4gZW1wdHkgb2JqZWN0IGFuZCByZXBvcnQgdGhlIGVycm9yIHZpYSBsb2dlcnJvcigpJiN4ZDsKICAgKi8mI3hkOwogIGZ1bmN0aW9uIEpTT05wYXJzZSggcywgciApIHsmI3hkOwogICAgdmFyIGZuYW1lLCByZXMsIHBvaW50ZXI7JiN4ZDsKICAgIGZuYW1lID0gJ0pTT05vYmoucGFyc2UoKTogJzsmI3hkOwogICAgLy8gU2V0dXAgYSBwb2ludGVyIHRvIHRoZSBKU09OIG9iamVjdCBzaW5jZSBpdHMgbmFtZSBkaWZmZXJzIG9uIGZvcm1zIGFuZCBlbmdpbmUuJiN4ZDsKICAgIHBvaW50ZXIgPSBKU09OcHRyOyYjeGQ7CiAgICB0cnkgeyYjeGQ7CiAgICAgIHJlcyA9IHBvaW50ZXIucGFyc2UoIHMsIHIgKTsmI3hkOwogICAgfSBjYXRjaCggZSApeyYjeGQ7CiAgICAgIGxvZ2Vycm9yKCBmbmFtZSArIGUubWVzc2FnZSApOyYjeGQ7CiAgICB9JiN4ZDsKICAgIGlmICghIHJlcyApIHsmI3hkOwogICAgICBkZWJ1Z21zZyggZm5hbWUgKyAnaW5wdXQgcHJvY2Vzc2luZyByZXN1bHRlZCBpbiBhIG51bGwgdmFsdWUuJyApOyYjeGQ7CiAgICAgIHJldHVybiB7fTsmI3hkOwogICAgfSYjeGQ7CiAgICByZXR1cm4gcmVzOyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiBXcmFwcGVyIGZvciB0aGUgc3RyaW5naWZ5KCkgY2FsbCBvbiB0aGUgaG9zdCBlbnZpcm9ubWVudCdzIEpTT04gb2JqZWN0LiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvSlNPTi9zdHJpbmdpZnkmI3hkOwogICAqJiN4ZDsKICAgKiBAZnVuY3Rpb24gc3RyaW5naWZ5JiN4ZDsKICAgKiBAbWVtYmVyb2YgUFJELnV0aWwuSlNPTm9iaiYjeGQ7CiAgICogQHNpbmNlIDEuMC4yJiN4ZDsKICAgKiYjeGQ7CiAgICogQHBhcmFtIHtvYmplY3R9ICAgICAgICAgICAgICAgICAgICAgICAgbyAgICAgICAgICAgRUNNQSBvYmplY3QgdG8gY29udmVydCB0byBKU09OJiN4ZDsKICAgKiBAcGFyYW0geyhmdW5jdGlvbnxzdHJpbmdbXXxudW1iZXJbXSk9fSBbcmVwbGFjZXJdICAoT3B0aW9uYWwpIEEgZnVuY3Rpb24gdGhhdCBhbHRlcnMgdGhlIGJlaGF2aW9yIG9mIHRoZSBzdHJpbmdpZmljYXRpb24gcHJvY2Vzcywgb3IgYW4gYXJyYXkgb2YgU3RyaW5nIGFuZCBOdW1iZXIgb2JqZWN0cyB0aGF0IHNlcnZlIGFzIGEgd2hpdGVsaXN0IGZvciBzZWxlY3RpbmcvZmlsdGVyaW5nIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSB2YWx1ZSBvYmplY3QgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIEpTT04gc3RyaW5nLiBJZiB0aGlzIHZhbHVlIGlzIG51bGwgb3Igbm90IHByb3ZpZGVkLCBhbGwgcHJvcGVydGllcyBvZiB0aGUgb2JqZWN0IGFyZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIEpTT04gc3RyaW5nJiN4ZDsKICAgKiBAcGFyYW0geyhzdHJpbmd8bnVtYmVyKT19ICAgICAgICAgICAgICBbc3BhY2VdICAgICAoT3B0aW9uYWwpIEEgU3RyaW5nIG9yIE51bWJlciBvYmplY3QgdGhhdCdzIHVzZWQgdG8gaW5zZXJ0IHdoaXRlIHNwYWNlIGludG8gdGhlIG91dHB1dCBKU09OIHN0cmluZyBmb3IgcmVhZGFiaWxpdHkgcHVycG9zZXMuIElmIHRoaXMgaXMgYSBOdW1iZXIsIGl0IGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHNwYWNlIGNoYXJhY3RlcnMgdG8gdXNlIGFzIHdoaXRlIHNwYWNlOyB0aGlzIG51bWJlciBpcyBjYXBwZWQgYXQgMTAgKGlmIGl0IGlzIGdyZWF0ZXIsIHRoZSB2YWx1ZSBpcyBqdXN0IDEwKS4gVmFsdWVzIGxlc3MgdGhhbiAxIGluZGljYXRlIHRoYXQgbm8gc3BhY2Ugc2hvdWxkIGJlIHVzZWQuIElmIHRoaXMgaXMgYSBTdHJpbmcsIHRoZSBzdHJpbmcgKG9yIHRoZSBmaXJzdCAxMCBjaGFyYWN0ZXJzIG9mIHRoZSBzdHJpbmcsIGlmIGl0J3MgbG9uZ2VyIHRoYW4gdGhhdCkgaXMgdXNlZCBhcyB3aGl0ZSBzcGFjZS4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IHByb3ZpZGVkIChvciBpcyBudWxsKSwgbm8gd2hpdGUgc3BhY2UgaXMgdXNlZC4mI3hkOwogICAqJiN4ZDsKICAgKiBAdHlwZSB7c3RyaW5nfSYjeGQ7CiAgICogQHJldHVybiB7c3RyaW5nfSBTZXJpYWxpemVkIEVDTUEgb2JqZWN0IGluIEpTT04gZm9ybWF0LiBPbiBlcnJvciByZXR1cm4gZW1wdHkgc3RyaW5nIGFuZCByZXBvcnQgdGhlIGVycm9yIHZpYSBsb2dlcnJvcigpJiN4ZDsKICAgKi8mI3hkOwogIGZ1bmN0aW9uIEpTT05zdHJpbmdpZnkoIG8sIHIsIHMgKSB7JiN4ZDsKICAgIHZhciBmbmFtZSwgcmVzLCBwb2ludGVyOyYjeGQ7CiAgICBmbmFtZSA9ICdKU09Ob2JqLnN0cmluZ2lmeSgpOiAnOyYjeGQ7CiAgICAvLyBTZXR1cCBhIHBvaW50ZXIgdG8gdGhlIEpTT04gb2JqZWN0IHNpbmNlIGl0cyBuYW1lIGRpZmZlcnMgb24gZm9ybXMgYW5kIGVuZ2luZS4mI3hkOwogICAgcG9pbnRlciA9IEpTT05wdHI7JiN4ZDsKICAgIHRyeSB7JiN4ZDsKICAgICAgcmVzID0gcG9pbnRlci5zdHJpbmdpZnkoIG8sIHIsIHMgKTsmI3hkOwogICAgfSBjYXRjaCggZSApeyYjeGQ7CiAgICAgIGxvZ2Vycm9yKCBmbmFtZSArIGUubWVzc2FnZSApOyYjeGQ7CiAgICB9JiN4ZDsKICAgIGlmICghIHJlcyApIHsmI3hkOwogICAgICBkZWJ1Z21zZyggZm5hbWUgKyAnaW5wdXQgcHJvY2Vzc2luZyByZXN1bHRlZCBpbiBhIG51bGwgdmFsdWUuJyApOyYjeGQ7CiAgICAgIHJldHVybiAnJzsmI3hkOwogICAgfSYjeGQ7CiAgICByZXR1cm4gcmVzOyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICogVmVyaWZ5IGlmIGFuIEVDTUEgb2JqZWN0IGhhcyB0aGUgc2VsZWN0ZWQgbG9jYXRpb24uJmx0O2JyLyZndDsmI3hkOwogKiBOb3RlOiBUbyByZWZlcmVuY2UgcHJvcGVydGllcyB3aXRoIGEgZG90IGluIHRoZWlyIG5hbWUgdXNlIHRoZSBmb3JtYXQgWyJwcm9wZXJ0eS5uYW1lIl0gLiZsdDtici8mZ3Q7JiN4ZDsKIComI3hkOwogKiBQb3J0ZWQgZnJvbSBJRE0gZW5naW5lIHRvIFJCUE0uIElETSBFbmdpbmUgdmVyc2lvbiBhdCBodHRwczovL2dpdGh1Yi5jb20vZmNoaWVyYWQvSURNLUVDTUFsaWIvYmxvYi92MS4wLjIvSlNPTmxpYi1KUy5qcyYjeGQ7CiAqJiN4ZDsKICogQGZ1bmN0aW9uIHRlc3QmI3hkOwogKiBAbWVtYmVyb2YgUFJELnV0aWwuSlNPTm9iaiYjeGQ7CiAqIEBzaW5jZSAxLjAuMyYjeGQ7CiAqJiN4ZDsKICogQHBhcmFtIHsob2JqZWN0fHN0cmluZyl9ICBpbnB1dEpTT04gICAgSW5wdXQgSlNPTiAoRUNNQSBvYmplY3QpLiBJZiBhIHN0cmluZy1zZXJpYWxpemVkIEpTT04gaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBKU09OIG9iamVjdCBpbnRlcm5hbGx5JiN4ZDsKICogQHBhcmFtIHtzdHJpbmd9ICAgICAgICAgICB3aGF0dG90ZXN0ICAgRG90LXNlcGFyYXRlZCBsaXN0IG9mIHByb3BlcnRpZXMgYXMgaWYgeW91IGFyZSBhY2Nlc3NpbmcgdGhlbSB2aWEgRUNNQXNjcmlwdCYjeGQ7CiAqJiN4ZDsKICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgcGF0aCBpcyBmb3VuZCwgZmFsc2Ugb3RoZXJ3aXNlJiN4ZDsKICovJiN4ZDsKZnVuY3Rpb24gSlNPTnRlc3QoIGlucHV0SlNPTiwgd2hhdHRvdGVzdCApIHsmI3hkOwogIHZhciBmbmFtZSwgaSwgaXR2YWwsIGl0b2JqLCBvYmosIGdldEFyciwgcHJvcE5hbWU7JiN4ZDsKICBmbmFtZSA9ICdKU09Ob2JqLnRlc3QoKTogJzsmI3hkOwogIC8vIFJldmlldyBpbnB1dCBkYXRhJiN4ZDsKICBpZiAoIGlzU3RyaW5nKCBpbnB1dEpTT04gKSApIHsmI3hkOwogICAgb2JqID0gSlNPTnBhcnNlKCBpbnB1dEpTT04gKTsmI3hkOwogIH0gZWxzZSBpZiAoIGlucHV0SlNPTiAmYW1wOyZhbXA7IHR5cGVvZiBpbnB1dEpTT04gPT09ICdvYmplY3QnICkgeyYjeGQ7CiAgICBvYmogPSBpbnB1dEpTT047JiN4ZDsKICB9IGVsc2UgeyYjeGQ7CiAgICBsb2dlcnJvciggZm5hbWUgKyAncGFyYW1ldGVyIGlucHV0SlNPTiBuZWVkIHRvIGJlIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgSlNPTiBvYmplY3Qgb3IgdGhlIEpTT04gb2JqZWN0IGl0c2VsZi4nICk7JiN4ZDsKICAgIHJldHVybiBmYWxzZTsmI3hkOwogIH0mI3hkOwogIGlmICggaXNTdHJpbmcoIHdoYXR0b3Rlc3QgKSApIHsmI3hkOwogICAgZ2V0QXJyID0gY2hhckFyclRvUHJvcGVydHlOYW1lcyggc3RyaW5nVG9DaGFyQXJyYXkoIHdoYXR0b3Rlc3QgKSApOyYjeGQ7CiAgfSBlbHNlIHsmI3hkOwogICAgbG9nZXJyb3IoIGZuYW1lICsgJ3BhcmFtZXRlciB3aGF0dG90ZXN0IHNob3VsZCBiZSBhIHN0cmluZyB2YWx1ZS4nICk7JiN4ZDsKICAgIHJldHVybiBmYWxzZTsmI3hkOwogIH0mI3hkOwogIC8vIEl0ZXJhdGVzIHRocm91Z2ggdGhlIG9iamVjdCB1c2luZyBpdG9iaiBhbmQgaXR2YWwgYXMgdGhlIG1pZGRsZSBzdGVwcyB0byBmaW5kIHRoZSBkZXNpcmVkIHJlc3VsdCYjeGQ7CiAgaXRvYmogPSBvYmo7JiN4ZDsKICBmb3IgKCBpID0gMDsgaSAmbHQ7IGdldEFyci5sZW5ndGg7IGkrKyApIHsmI3hkOwogICAgcHJvcE5hbWUgPSBnZXRBcnJbIGkgXTsmI3hkOwogICAgZGVidWdtc2coIGZuYW1lICsgJ1BhcnNpbmc6ICInICsgcHJvcE5hbWUgKyAnIiwgdHlwZTogJyArIHR5cGVvZiBwcm9wTmFtZSApOyYjeGQ7CiAgICBpZiAoIHR5cGVvZiBpdG9iaiA9PT0gJ29iamVjdCcgJmFtcDsmYW1wOyBwcm9wTmFtZSBpbiBpdG9iaiApIHsmI3hkOwogICAgICBpdHZhbCA9IGl0b2JqWyBwcm9wTmFtZSBdOyYjeGQ7CiAgICB9IGVsc2UgeyYjeGQ7CiAgICAgIGRlYnVnbXNnKCBmbmFtZSArICdwYXJzaW5nICcgKyB3aGF0dG90ZXN0ICsgJywgY291bGQgbm90IGZpbmQgcHJvcGVydHkgIicgKyBwcm9wTmFtZSArICciIGluIHRoZSBjdXJyZW50IG9iamVjdCBsb2NhdGlvbi4nICk7JiN4ZDsKICAgICAgcmV0dXJuIGZhbHNlOyYjeGQ7CiAgICB9JiN4ZDsKICAgIGl0b2JqID0gaXR2YWw7JiN4ZDsKICB9JiN4ZDsKICByZXR1cm4gdHJ1ZTsmI3hkOwp9JiN4ZDsKJiN4ZDsKLyoqJiN4ZDsKICogUmV0cmlldmVzIGEgcHJvcGVydHkgb2YgYW4gRUNNQSBvYmplY3QgKG9yIGl0cyBzdWJvcmRpbmF0ZSBvYmplY3QpIGFuZCByZXR1cm5zIGl0IGluIHRoZSBzcGVjaWZpZWQgdHlwZS4mbHQ7YnIvJmd0OyYjeGQ7CiAqIE5vdGU6IFRvIHJlZmVyZW5jZSBwcm9wZXJ0aWVzIHdpdGggYSBkb3QgaW4gdGhlaXIgbmFtZSB1c2UgdGhlIGZvcm1hdCBbInByb3BlcnR5Lm5hbWUiXSAuJmx0O2JyLyZndDsmI3hkOwogKiYjeGQ7CiAqIFBvcnRlZCBmcm9tIElETSBlbmdpbmUgdG8gUkJQTS4gSURNIEVuZ2luZSB2ZXJzaW9uIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9mY2hpZXJhZC9JRE0tRUNNQWxpYi9ibG9iL3YxLjAuMi9KU09ObGliLUpTLmpzJiN4ZDsKIComI3hkOwogKiBAZnVuY3Rpb24gZ2V0JiN4ZDsKICogQG1lbWJlcm9mIFBSRC51dGlsLkpTT05vYmomI3hkOwogKiBAc2luY2UgMS4wLjMmI3hkOwogKiYjeGQ7CiAqIEBwYXJhbSB7KG9iamVjdHxzdHJpbmcpfSAgaW5wdXRKU09OICAgICBJbnB1dCBKU09OIChFQ01BIG9iamVjdCkuIElmIGEgc3RyaW5nLXNlcmlhbGl6ZWQgSlNPTiBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIEpTT04gb2JqZWN0IGludGVybmFsbHkmI3hkOwogKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgIHdoYXR0b2dldCAgICAgRG90LXNlcGFyYXRlZCBsaXN0IG9mIHByb3BlcnRpZXMgYXMgaWYgeW91IGFyZSBhY2Nlc3NpbmcgdGhlbSB2aWEgRUNNQXNjcmlwdCYjeGQ7CiAqIEBwYXJhbSB7c3RyaW5nPX0gICAgICAgICAgW3JldHVybnR5cGVdICAoT3B0aW9uYWwpIERlc2lyZWQgcmV0dXJuIHR5cGUuIFZhbGlkIHZhbHVlcyBhcmU6IHN0cmluZywgbnVtYmVyLCByYXcuIERlZmF1bHRzIHRvIHJhdyBpbiBjYXNlIHdoYXRldmVyIGlzIHByb3ZpZGVkIGlzIG5vdCBvbmUgb2YgdGhlIDMgdmFsaWQgb3B0aW9ucyYjeGQ7CiAqJiN4ZDsKICogQHJldHVybiB7KHN0cmluZ3xudW1iZXJ8Ym9vbGVhbnxvYmplY3QpfSBTZWxlY3RlZCBwcm9wZXJ0eSdzIHZhbHVlIGluIHRoZSBzZWxlY3RlZCBmb3JtYXQuIElmIHBhcnNpbmcgb2YgdGhlIG9iamVjdCBmYWlscyByZXR1cm5zIGFuIGVtcHR5IHN0cmluZyYjeGQ7CiAqLyYjeGQ7CmZ1bmN0aW9uIEpTT05nZXQoIGlucHV0SlNPTiwgd2hhdHRvZ2V0LCByZXR1cm50eXBlICkgeyYjeGQ7CiAgdmFyIGZuYW1lLCBpLCBpdHZhbCwgaXRvYmosIG9iaiwgZ2V0QXJyLCBwcm9wTmFtZSwgcmVzID0gJyc7JiN4ZDsKICBmbmFtZSA9ICdKU09Ob2JqLmdldCgpOiAnOyYjeGQ7CiAgLy8gUmV2aWV3IGlucHV0IGRhdGEmI3hkOwogIGlmICggaXNTdHJpbmcoIGlucHV0SlNPTiApICkgeyYjeGQ7CiAgICBvYmogPSBKU09OcGFyc2UoIGlucHV0SlNPTiApOyYjeGQ7CiAgfSBlbHNlIGlmICggaW5wdXRKU09OICZhbXA7JmFtcDsgdHlwZW9mIGlucHV0SlNPTiA9PT0gJ29iamVjdCcgKSB7JiN4ZDsKICAgIG9iaiA9IGlucHV0SlNPTjsmI3hkOwogIH0gZWxzZSB7JiN4ZDsKICAgIGxvZ2Vycm9yKCBmbmFtZSArICdwYXJhbWV0ZXIgaW5wdXRKU09OIG5lZWQgdG8gYmUgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBKU09OIG9iamVjdCBvciB0aGUgSlNPTiBvYmplY3QgaXRzZWxmLicgKTsmI3hkOwogICAgcmV0dXJuIHJlczsmI3hkOwogIH0mI3hkOwogIGlmICggaXNTdHJpbmcoIHdoYXR0b2dldCApICkgeyYjeGQ7CiAgICBnZXRBcnIgPSBjaGFyQXJyVG9Qcm9wZXJ0eU5hbWVzKCBzdHJpbmdUb0NoYXJBcnJheSggd2hhdHRvZ2V0ICkgKTsmI3hkOwogIH0gZWxzZSB7JiN4ZDsKICAgIGxvZ2Vycm9yKCBmbmFtZSArICdwYXJhbWV0ZXIgd2hhdHRvdGVzdCBzaG91bGQgYmUgYSBzdHJpbmcgdmFsdWUuJyApOyYjeGQ7CiAgICByZXR1cm4gcmVzOyYjeGQ7CiAgfSYjeGQ7CiAgaWYgKCByZXR1cm50eXBlICE9PSAnc3RyaW5nJyAmYW1wOyZhbXA7IHJldHVybnR5cGUgIT09ICdudW1iZXInICZhbXA7JmFtcDsgcmV0dXJudHlwZSAhPT0gJ3JhdycgKSB7JiN4ZDsKICAgICAgcmV0dXJudHlwZSA9ICdyYXcnOyYjeGQ7CiAgfSYjeGQ7CiAgLy8gSXRlcmF0ZXMgdGhyb3VnaCB0aGUgb2JqZWN0IHVzaW5nIGl0b2JqIGFuZCBpdHZhbCBhcyB0aGUgbWlkZGxlIHN0ZXBzIHRvIGZpbmQgdGhlIGRlc2lyZWQgcmVzdWx0JiN4ZDsKICBpdG9iaiA9IG9iajsmI3hkOwogIGZvciAoIGkgPSAwOyBpICZsdDsgZ2V0QXJyLmxlbmd0aDsgaSsrICkgeyYjeGQ7CiAgICBwcm9wTmFtZSA9IGdldEFyclsgaSBdOyYjeGQ7CiAgICBkZWJ1Z21zZyggZm5hbWUgKyAnUGFyc2luZzogIicgKyBwcm9wTmFtZSArICciLCB0eXBlOiAnICsgdHlwZW9mIHByb3BOYW1lICk7JiN4ZDsKICAgIGlmICggdHlwZW9mIGl0b2JqID09PSAnb2JqZWN0JyAmYW1wOyZhbXA7IHByb3BOYW1lIGluIGl0b2JqICkgeyYjeGQ7CiAgICAgIGl0dmFsID0gaXRvYmpbIHByb3BOYW1lIF07JiN4ZDsKICAgIH0gZWxzZSB7JiN4ZDsKICAgICAgbG9nZXJyb3IoIGZuYW1lICsgJ3BhcnNpbmcgJyArIHdoYXR0b2dldCArICcsIGNvdWxkIG5vdCBmaW5kIHByb3BlcnR5ICInICsgcHJvcE5hbWUgKyAnIiBpbiB0aGUgY3VycmVudCBvYmplY3QgbG9jYXRpb24uJyApOyYjeGQ7CiAgICAgIHJldHVybiByZXM7JiN4ZDsKICAgIH0mI3hkOwogICAgaXRvYmogPSBpdHZhbDsmI3hkOwogIH0mI3hkOwogIC8vIEluc3BlY3QgcmV0dXJuZWQgZGF0YSBhbmQgY29lcmNlIGl0IGFzIG5lZWRlZC4gTm8gZGVmYXVsdCBzZXQgc2luY2UgcmVzIGlzIHNldCBhdCB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uJiN4ZDsKICBzd2l0Y2ggKCByZXR1cm50eXBlICkgeyYjeGQ7CiAgICBjYXNlICdzdHJpbmcnOiYjeGQ7CiAgICAgIHJlcyA9IFN0cmluZyggaXR2YWwgKTsmI3hkOwogICAgICBicmVhazsmI3hkOwogICAgY2FzZSAnbnVtYmVyJzomI3hkOwogICAgICByZXMgPSBOdW1iZXIoIGl0dmFsICk7JiN4ZDsKICAgICAgYnJlYWs7JiN4ZDsKICAgIGNhc2UgJ3Jhdyc6JiN4ZDsKICAgICAgcmVzID0gaXR2YWw7JiN4ZDsKICAgICAgYnJlYWs7JiN4ZDsKICB9JiN4ZDsKICByZXR1cm4gcmVzOyYjeGQ7Cn0mI3hkOwomI3hkOwovLyAgaHR0cHM6Ly9naXRodWIuY29tL2ZjaGllcmFkL0lETS1FQ01BbGliL2Jsb2IvdjEuMC4yL0pTT05saWItSlMubWQjSlNPTmdldCYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiBVbmljb2RlLXNhZmUgc3BsaXQgb2YgYSBzdHJpbmcgdG8gYSBjaGFyYWN0ZXIgQXJyYXkuJmx0O2JyLyZndDsmI3hkOwogICAqJiN4ZDsKICAgKiBTaW5jZSBJRE0gNC41L0lETSA0LjYgZG9lcyBub3QgaGF2ZSBhY2Nlc3MgdG8gRVM2IC0gdGhlcmVmb3JlIG5vIHNwcmVhZCAuLi4gb3BlcmF0b3IgLSB0aGlzIGZ1bmN0aW9uIGlzIG5lZWRlZC4mbHQ7YnIvJmd0OyYjeGQ7CiAgICogT25jZSBJRE0gc3VwcG9ydHMgdGhlIHNwcmVhZCBvcGVyYXRvciB1c2UgdGhhdCBpbnN0ZWFkLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiYjeGQ7CiAgICogUG9ydGVkIGZyb20gSURNIGVuZ2luZSB0byBSQlBNLiBJRE0gRW5naW5lIHZlcnNpb24gYXQgaHR0cHM6Ly9naXRodWIuY29tL2ZjaGllcmFkL0lETS1FQ01BbGliL2Jsb2IvdjEuMC4yL0pTT05saWItSlMuanMmI3hkOwogICAqJiN4ZDsKICAgKiBAc2luY2UgMS4wLjMmI3hkOwogICAqIEBwcml2YXRlJiN4ZDsKICAgKiBAcGFyYW0ge3N0cmluZ30gIHN0ciAgIFN0cmluZyBpbnB1dC4gQW55IG90aGVyIGlucHV0IHdpbGwgYmUgY29lcmNlZCB0byBzdHJpbmcgdXNpbmcgU3RyaW5nKCkgYW5kIHByb2JhYmx5IHdvbid0IGJlaGF2ZSBhcyBleHBlY3RlZCYjeGQ7CiAgICogQHR5cGUge3N0cmluZ1tdfSYjeGQ7CiAgICogQHJldHVybiB7c3RyaW5nW119IFVuaWNvZGUtc2FmZSBjaGFyYWN0ZXIgYXJyYXkmI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gc3RyaW5nVG9DaGFyQXJyYXkoIHN0ciApIHsmI3hkOwogICAgdmFyIGNBcnIgPSBbXSwgZm5hbWU7JiN4ZDsKICAgIGZuYW1lID0gJ3N0cmluZ1RvQ2hhckFycmF5KCk6ICc7JiN4ZDsKICAgIHRyeSB7JiN4ZDsKICAgICAgY0FyciA9IFN0cmluZyggc3RyICkuc3BsaXQoIC8oPz0oPzpbXDAtXHRceDBCXGZceDBFLVx1MjAyN1x1MjAyQS1cdUQ3RkZcdUUwMDAtXHVGRkZGXXxbXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl18W1x1RDgwMC1cdURCRkZdKD8hW1x1REMwMC1cdURGRkZdKXwoPzpbXlx1RDgwMC1cdURCRkZdfF4pW1x1REMwMC1cdURGRkZdKSkvICk7JiN4ZDsKICAgIH0gY2F0Y2goIGUgKSB7JiN4ZDsKICAgICAgbG9nZXJyb3IoIGZuYW1lICsgJ0ZhaWxlZCB0byBzcGxpdCB0aGUgaW5wdXQgc3RyaW5nLCBlcnJvcjogJyArIGUubWVzc2FnZSApOyYjeGQ7CiAgICB9JiN4ZDsKICAgIHJldHVybiBjQXJyOyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiBKU09OIHBhdGggcGFyc2VyLiBJdGVyYXRlcyB0aHJvdWdoIGEgY2hhcmFjdGVyIGFycmF5IGFuZCByZXR1cm5zIGFuIGFycmF5IHdpdGggcHJvcGVydHkgbmFtZXMuJmx0O2JyLyZndDsmI3hkOwogICAqIEFycmF5IGluZGV4ZXMgYXJlIHB1cmVseSBudW1lcmljIHByb3BlcnR5IG5hbWVzIGFuZCB3aWxsIGJlIHJldHVybmVkIGFzIG51bWJlcnMsIG5vdCBzdHJpbmdzLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBDaGFyYWN0ZXIgQXJyYXkgc2hvdWxkIGhhdmUgYmVlbiBzcGxpdCBmcm9tIHRoZSBvcmlnaW5hbCBFQ01BIG9iamVjdCBwYXRoIHRoYXQgd2Ugd2FudCB0byBwYXJzZS4mbHQ7YnIvJmd0OyYjeGQ7CiAgIComI3hkOwogICAqIFBvcnRlZCBmcm9tIElETSBlbmdpbmUgdG8gUkJQTS4gSURNIEVuZ2luZSB2ZXJzaW9uIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9mY2hpZXJhZC9JRE0tRUNNQWxpYi9ibG9iL3YxLjAuMi9KU09ObGliLUpTLmpzJiN4ZDsKICAgKiYjeGQ7CiAgICogQHNpbmNlIDEuMC4wJiN4ZDsKICAgKiBAcHJpdmF0ZSYjeGQ7CiAgICogQHBhcmFtIHtzdHJpbmdbXX0gIHN0ciAgIENoYXJhY3RlciBzdHJpbmcuIEFzc3VtZXMgZWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgaXMgYSBzaW5nbGUgVW5pY29kZSBjaGFyYWN0ZXImI3hkOwogICAqIEB0eXBlIHtBcnJheSZsdDsoc3RyaW5nfG51bWJlcikmZ3Q7fSYjeGQ7CiAgICogQHJldHVybiB7QXJyYXkmbHQ7KHN0cmluZ3xudW1iZXIpJmd0O30gcHJvcGVydHkgbmFtZXMgYXJyYXkmI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gY2hhckFyclRvUHJvcGVydHlOYW1lcyggY0FyciApIHsmI3hkOwogICAgdmFyIGksIGZuYW1lLCBjdXJyZW50TmFtZSwgc3F1YXJlbWFyaywgcmVfd2hpdGVzcGFjZSwgcmVfbnVtYmVyLCByZV9xdW90ZXMsIHByb3BlcnR5ID0gW107JiN4ZDsKICAgIGZuYW1lID0gJ2NoYXJBcnJUb1Byb3BlcnR5TmFtZXMoKTogJzsmI3hkOwogICAgaWYgKCAhKCBjQXJyIGluc3RhbmNlb2YgQXJyYXkgKSApIHsmI3hkOwogICAgICBsb2dlcnJvciggZm5hbWUgKyAnSW5wdXQgcGFyYW1ldGVyIGlzIG5vdCBhbiBBcnJheSwgYWJvcnRpbmcuJyApOyYjeGQ7CiAgICAgIHJldHVybiBwcm9wZXJ0eTsmI3hkOwogICAgfSYjeGQ7CiAgICAvLyBTZXR1cCBmb3IgcGFyc2luZy4gRGVsaW1pdGVyIGZvciBwcm9wZXJ0eSBuYW1lcyBhcmUgZWl0aGVyIGRvdCBvciBvcGVuIGFuZCBjbG9zZSBzcXVhcmUgYnJhY2tldHMmI3hkOwogICAgLy8gSWYgdGhlIGNvbnRlbnRzIGluc2lkZSBzcXVhcmUgYnJhY2tldHMgYXJlIHB1cmVseSBudW1lcmljIHRoZW4gYSBudW1iZXIgaXMgcmV0dXJuZWQmI3hkOwogICAgY3VycmVudE5hbWUgPSAnJzsmI3hkOwogICAgcmVfbnVtYmVyID0gL15cZCskLzsmI3hkOwogICAgcmVfcXVvdGVzID0gL14oWyciXSkoLispXDEkLzsmI3hkOwogICAgc3F1YXJlbWFyayA9ICggY0FyclsgMCBdID09PSAnWycgKT8gJ2ZpcnN0JzonZW5kJzsgLy9zcXVhcmVtYXJrIGNhbiBiZSAnZmlyc3QnLCAnc3RhcnQnLCAnZW5kJyYjeGQ7CiAgICAvLyBJdGVyYXRlcyB0aHJvdWdoIHRoZSBjaGFyYWN0ZXIgYXJyYXkgcGFyc2luZyBlbGVtZW50cyBpbnRvIHRoZWlyIG93biBwcm9wZXJ0eSBhcnJheSBlbnRyeSYjeGQ7CiAgICBmb3IgKCBpPTA7IGkgJmx0OyBjQXJyLmxlbmd0aDsgaSsrICkgeyYjeGQ7CiAgICAgIGlmICggc3F1YXJlbWFyayA9PT0gJ2ZpcnN0JyAmYW1wOyZhbXA7IGNBcnJbIGkgXSA9PT0gJ1snICkgeyYjeGQ7CiAgICAgICAgc3F1YXJlbWFyayA9ICdzdGFydCc7JiN4ZDsKICAgICAgICBjb250aW51ZTsmI3hkOwogICAgICB9JiN4ZDsKICAgICAgaWYgKCBzcXVhcmVtYXJrID09PSAnZW5kJyAmYW1wOyZhbXA7IGNBcnJbIGkgXSA9PT0gJ1snICkgeyYjeGQ7CiAgICAgICAgc3F1YXJlbWFyayA9ICdzdGFydCc7JiN4ZDsKICAgICAgICBpZiAoIGN1cnJlbnROYW1lLnRyaW0oKSAhPT0gJycgKSB7IC8vIHByZXZlbnQgZG91YmxlIHB1c2ggb24gY29uc3RydWN0cyBsaWtlIGFyclswXVswXSYjeGQ7CiAgICAgICAgICBwcm9wZXJ0eS5wdXNoKCBjdXJyZW50TmFtZS50cmltKCkgKTsmI3hkOwogICAgICAgIH0mI3hkOwogICAgICAgIGN1cnJlbnROYW1lID0gJyc7JiN4ZDsKICAgICAgICBjb250aW51ZTsmI3hkOwogICAgICB9JiN4ZDsKICAgICAgaWYgKCBzcXVhcmVtYXJrID09PSAnc3RhcnQnICZhbXA7JmFtcDsgY0FyclsgaSBdID09PSAnXScgKSB7JiN4ZDsKICAgICAgICBzcXVhcmVtYXJrID0gJ2VuZCc7JiN4ZDsKICAgICAgICBjdXJyZW50TmFtZSA9IGN1cnJlbnROYW1lLnRyaW0oKTsmI3hkOwogICAgICAgIC8vIElmIHRoZSBwcm9wZXJ0eSBuYW1lIGJldHdlZW4gW10gaXMgYSBwdXJlIG51bWJlciwgY29lcmNlcyB0aGUgc3RyaW5nIHRvIGEgbnVtYmVyJiN4ZDsKICAgICAgICBpZiAoIHJlX251bWJlci50ZXN0KCBjdXJyZW50TmFtZSApICkgeyYjeGQ7CiAgICAgICAgICBjdXJyZW50TmFtZSA9IE51bWJlciggY3VycmVudE5hbWUgKTsmI3hkOwogICAgICAgIH0mI3hkOwogICAgICAgIC8vIFJlbW92ZSBxdW90ZXMgYXJvdW5kIHByb3BlcnR5IG5hbWUgaWYgdGhleSBhcmUgcHJlc2VudCBsaWtlIG9ialsicHJvcGVydHkgbmFtZSJdLCByZXR1cm5pbmcgcHJvcGVydHkgbmFtZSYjeGQ7CiAgICAgICAgaWYgKCByZV9xdW90ZXMudGVzdCggY3VycmVudE5hbWUgKSApIHsmI3hkOwogICAgICAgICAgY3VycmVudE5hbWUgPSByZV9xdW90ZXMuZXhlYyggY3VycmVudE5hbWUgKVsyXTsmI3hkOwogICAgICAgIH0mI3hkOwogICAgICAgIHByb3BlcnR5LnB1c2goIGN1cnJlbnROYW1lICk7JiN4ZDsKICAgICAgICBjdXJyZW50TmFtZSA9ICcnOyYjeGQ7CiAgICAgICAgY29udGludWU7JiN4ZDsKICAgICAgfSYjeGQ7CiAgICAgIC8vIFRyYWRpdGlvbmFsIC4gZGVsaW1pdGVyJiN4ZDsKICAgICAgaWYgKCBzcXVhcmVtYXJrID09PSAnZW5kJyAmYW1wOyZhbXA7IGNBcnJbIGkgXSA9PT0gJy4nICkgeyYjeGQ7CiAgICAgICAgaWYgKCBjdXJyZW50TmFtZS50cmltKCkgIT09ICcnICkgeyAvLyBwcmV2ZW50IGRvdWJsZSBwdXNoIG9uIGNvbnN0cnVjdHMgbGlrZSBhcnJbMF0ubmFtZSYjeGQ7CiAgICAgICAgICBwcm9wZXJ0eS5wdXNoKCBjdXJyZW50TmFtZS50cmltKCkgKTsmI3hkOwogICAgICAgIH0mI3hkOwogICAgICAgIGN1cnJlbnROYW1lID0gJyc7JiN4ZDsKICAgICAgICBjb250aW51ZTsmI3hkOwogICAgICB9JiN4ZDsKICAgICAgY3VycmVudE5hbWUgKz0gY0FyclsgaSBdOyYjeGQ7CiAgICB9JiN4ZDsKICAgIGlmICggY3VycmVudE5hbWUgIT09ICcnICkgeyYjeGQ7CiAgICAgIHByb3BlcnR5LnB1c2goIGN1cnJlbnROYW1lLnRyaW0oKSApOyYjeGQ7CiAgICB9JiN4ZDsKICAgIHJldHVybiBwcm9wZXJ0eTsmI3hkOwogIH0mI3hkOwomI3hkOwogIC8qKiYjeGQ7CiAgICogQ29lcmNlcyB0aGUgcmVzdWx0IHRvIGFuIEVDTUEgc3RyaW5nLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBDb2VyY2lvbiBydWxlcyBmb3IgdGhpcyBmdW5jdGlvbjombHQ7YnIvJmd0OyYjeGQ7CiAgICogSWYgdGhlIGZpcnN0IGlucHV0IHBhcmFtZXRlciBpcyBudWxsIG9yIHVuZGVmaW5lZCByZXR1cm5zIGRlZmF1bHQgdmFsdWUuJmx0O2JyLyZndDsmI3hkOwogICAqIElmIHRoZSBmaXJzdCBpbnB1dCBwYXJhbWV0ZXIgaXMgYW4gQXJyYXkgaXQgcmV0dXJucyB0aGUgYXJyYXkgam9pbmVkIGJ5ICcgJy4mbHQ7YnIvJmd0OyYjeGQ7CiAgICogSWYgdGhlIGZpcnN0IGlucHV0IHBhcmFtZXRlciBpcyBhIFN0cmluZywgTnVtYmVyIG9yIEJvb2xlYW4gaXQgcmV0dXJucyBhIHN0cmluZy4mbHQ7YnIvJmd0OyYjeGQ7CiAgICogSWYgdGhlIGZpcnN0IGlucHV0IHBhcmFtZXRlciBpcyBhbiBvYmplY3Qgb3RoZXIgdGhhbiBhbiBBcnJheSBpdCByZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBJZiB0aGUgc2Vjb25kIGlucHV0IHZhbHVlIGlzIG5vdCBudWxsIHRoZW4gdGhlIGRlZmF1bHQgdmFsdWUgYmVjb21lcyB0aGUgc2Vjb25kIGlucHV0IHZhbHVlLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBJZiB0aGUgY29lcmNpb24gdG8gc3RyaW5nIGZyb20gU3RyaW5nLCBOdW1iZXIsIEJvb2xlYW4gb3IgQXJyYXkgcmVzdWx0ZWQgaW4gZW1wdHkgc3RyaW5nLCByZXR1cm4gZGVmYXVsdCB2YWx1ZS4mI3hkOwogICAqJiN4ZDsKICAgKiBAbWVtYmVyb2YgUFJELnV0aWwmI3hkOwogICAqIEBzaW5jZSAxLjAuMCYjeGQ7CiAgIComI3hkOwogICAqIEBwYXJhbSAge2FueX0gICAgIGlucHV0ICAgICBJbnB1dCBwYXJhbWV0ZXIgdG8gYmUgY29lcmNlZC4mI3hkOwogICAqIEBwYXJhbSAge3N0cmluZ30gIFtkZWZWYWxdICBEZWZhdWx0IHZhbHVlIHRvIGJlIHVzZWQmI3hkOwogICAqJiN4ZDsKICAgKiBAdHlwZSB7c3RyaW5nfSYjeGQ7CiAgICogQHJldHVybiB7c3RyaW5nfSByZXN1bHRpbmcgc3RyaW5nLiYjeGQ7CiAgICovJiN4ZDsKICBmdW5jdGlvbiBjb2VyY2VUb1N0cmluZyggaW5wdXQsIGRlZlZhbCApIHsmI3hkOwogICAgdmFyIHJldCA9ICcnLCBzdHI7JiN4ZDsKICAgIC8qIFRocm91Z2hvdXQgdGhpcyBmdW5jdGlvbiBTdHJpbmcoKSBpcyB1c2VkIHRvIGd1YXJhbnRlZSB0aGF0IHRoZSBzdHJpbmcgZ2VuZXJhdGVkJiN4ZDsKICAgICAqIGlzIGFuIEVDTUEgc3RyaW5nLiBUaGlzIGlzIG9ubHkgYSBjb25jZXJuIG9uIHRoZSB3b3JrZmxvdyBlbmdpbmUgc2luY2UgdGhlIGVuZ2luZSYjeGQ7CiAgICAgKiBhbGxvd3MgYSBtaXggb2YgRUNNQSBhbmQgSmF2YSBjb2RlLiBSZXR1cm5pbmcgYSBKYXZhIHN0cmluZyB3aWxsIGNhdXNlIHRoZSYjeGQ7CiAgICAgKiB0b0pTT04oKSBmdW5jdGlvbiB0byBmYWlsIHdoZW4gdXNpbmcgSlNPTi5zdHJpbmdpZnkoKSwgaGVuY2UgdGhpcyBzYWZldHkuJiN4ZDsKICAgICAqLyYjeGQ7CiAgICBpZiAoIGRlZlZhbCAhPSBudWxsICZhbXA7JmFtcDsgaXNTdHJpbmcoIGRlZlZhbCApICkgeyYjeGQ7CiAgICAgIHJldCA9IFN0cmluZyggZGVmVmFsICk7JiN4ZDsKICAgIH0mI3hkOwogICAgaWYgKCBpbnB1dCA9PT0gbnVsbCB8fCBpbnB1dCA9PT0gdW5kZWZpbmVkICkgeyYjeGQ7CiAgICAgIHJldHVybiByZXQ7JiN4ZDsKICAgIH0mI3hkOwogICAgaWYgKCBpc1N0cmluZyggaW5wdXQgKSB8fCBpc051bWJlciggaW5wdXQgKSB8fCBpc0Jvb2xlYW4oIGlucHV0ICkgKSB7JiN4ZDsKICAgICAgc3RyID0gU3RyaW5nKCBpbnB1dCApOyYjeGQ7CiAgICB9JiN4ZDsKICAgIGlmICggaW5wdXQgaW5zdGFuY2VvZiBBcnJheSApIHsmI3hkOwogICAgICBzdHIgPSBTdHJpbmcoIGlucHV0LmpvaW4oICcgJyApICk7JiN4ZDsKICAgIH0mI3hkOwogICAgaWYgKCBzdHIgIT09ICcnICkgeyYjeGQ7CiAgICAgIHJldCA9IHN0cjsmI3hkOwogICAgfSYjeGQ7CiAgICByZXR1cm4gcmV0OyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiAoRW5naW5lIG9ubHkpIFJldHVybnMgYmFzaWMgSFRUUCBhdXRoIGhlYWRlci4gRm9ybWF0IGlzOiBCYXNpYyBCNjRlbmNvZGVkVVNFUk5BTUU6UEFTU1dPUkQmI3hkOwogICAqJiN4ZDsKICAgKiBAbWVtYmVyb2YgUFJELnV0aWwmI3hkOwogICAqIEBzaW5jZSAxLjAuMyYjeGQ7CiAgIComI3hkOwogICAqIEBwYXJhbSB7c3RyaW5nfSAgdXNlcm5hbWUgIEhUVFAgYXV0aCB1c2VyJ3MgbmFtZS4mI3hkOwogICAqIEBwYXJhbSB7c3RyaW5nfSAgcGFzc3dvcmQgIEhUVFAgYXV0aCB1c2VyJ3MgcGFzc3dvcmQuJiN4ZDsKICAgKiYjeGQ7CiAgICogQHR5cGUge3N0cmluZ30mI3hkOwogICAqIEByZXR1cm4ge3N0cmluZ30gSFRUUCBCYXNpYyAnQXV0aG9yaXphdGlvbicgaGVhZGVyJ3MgdmFsdWUuJiN4ZDsKICAgKi8mI3hkOwogIGZ1bmN0aW9uIGJhc2ljSFRUUGF1dGhIZWFkZXIoIHVzZXJuYW1lLCBwYXNzd29yZCApIHsmI3hkOwogICAgdmFyIGZuYW1lLCByZXMsIGNvbmMsIEJhc2U2NCwgYjY0c3RyOyYjeGQ7CiAgICBmbmFtZSA9ICdiYXNpY0hUVFBhdXRoSGVhZGVyKCk6ICc7JiN4ZDsKICAgIGlmICggdXNlcm5hbWUgPT0gbnVsbCB8fCBwYXNzd29yZCA9PSBudWxsICkgeyYjeGQ7CiAgICAgIGxvZ2Vycm9yKCBmbmFtZSArICd1c2VybmFtZSBhbmQgcGFzc3dvcmQgbXVzdCBiZSBwcm92aWRlZCBhbmQgbm90IG51bGwgbm9yIHVuZGVmaW5lZC4nICk7JiN4ZDsKICAgICAgcmV0dXJuICcnOyYjeGQ7CiAgICB9JiN4ZDsKICAgIHRyeSB7JiN4ZDsKICAgICAgQmFzZTY0ID0gbmV3IFBhY2thZ2VzLm9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5iaW5hcnkuQmFzZTY0KCk7JiN4ZDsKICAgICAgY29uYyA9IEpTdHJpbmcoIHVzZXJuYW1lICsgJzonICsgcGFzc3dvcmQgKS5nZXRCeXRlcyggJ1VURi04JyApOyYjeGQ7CiAgICAgIGI2NHN0ciA9IEpTdHJpbmcoIEJhc2U2NC5lbmNvZGVCYXNlNjQoIGNvbmMgKSwgJ1VURi04JyApOyYjeGQ7CiAgICAgIHJlcyA9ICdCYXNpYyAnICsgYjY0c3RyOyYjeGQ7CiAgICB9IGNhdGNoKCBlICkgeyYjeGQ7CiAgICAgIGxvZ2Vycm9yKCBmbmFtZSArICdGYWlsZWQgdG8gYnVpbGQgQmFzaWMgQXV0aGVudGljYXRpb24gSFRUUCBoZWFkZXIgdmFsdWUuIEVycm9yOiAnICsgZS5tZXNzYWdlICk7JiN4ZDsKICAgIH0mI3hkOwogICAgcmV0dXJuIHJlczsmI3hkOwogIH0mI3hkOwomI3hkOwogIC8qKiYjeGQ7CiAgICogKEVuZ2luZSBvbmx5KSBGdW5jdGlvbiB0byBjb2VyY2UgcHJvdmlkZWQgZmxvd2RhdGEgYW5kIHJldHVybiBpZiB3ZSBhcmUgcGFzdCBtYXggcmV0cmllcyBvciBub3QuJiN4ZDsKICAgKiYjeGQ7CiAgICogQG1lbWJlcm9mIFBSRC51dGlsJiN4ZDsKICAgKiBAc2luY2UgMS4wLjMmI3hkOwogICAqJiN4ZDsKICAgKiBAcGFyYW0ge3N0cmluZ30gIGN1cmNvdW50ZXIgIEN1cnJlbnQgQ291bnRlciYjeGQ7CiAgICogQHBhcmFtIHtzdHJpbmd9ICBtYXhyZXRyaWVzICBNYXhpbXVtIHJldHJpZXMgdmFsdWUmI3hkOwogICAqJiN4ZDsKICAgKiBAdHlwZSB7Ym9vbGVhbn0mI3hkOwogICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgbWF4cmV0cmllcyBpcyBncmVhdGVyIHRoYW4gY3VycmVudCBjb3VudGVyLCBmYWxzZSBvdGhlcndpc2UuJiN4ZDsKICAgKi8mI3hkOwogIGZ1bmN0aW9uIHNob3VsZFJldHJ5KCBjdXJjb3VudGVyLCBtYXhyZXRyaWVzICkgeyYjeGQ7CiAgICB2YXIgcmV0cnkgPSBmYWxzZTsmI3hkOwogICAgY3VyY291bnRlciA9IFN0cmluZyggY3VyY291bnRlciApIHwgMDsmI3hkOwogICAgbWF4cmV0cmllcyA9IFN0cmluZyggbWF4cmV0cmllcyApIHwgMDsmI3hkOwogICAgcmV0cnkgPSAoIGN1cmNvdW50ZXIgJmx0OyBtYXhyZXRyaWVzICkgPyB0cnVlIDogZmFsc2U7JiN4ZDsKICAgIHJldHVybiByZXRyeTsmI3hkOwogIH0mI3hkOwomI3hkOwogIC8qKiYjeGQ7CiAgICogKEVuZ2luZSkgQ29tcGFyZXMgMiB1bmlkaW1lbnNpb25hbCBFQ01BIEFycmF5cyBvciBKYXZhIFZlY3RvcnMgYW5kIHJldHVybnMgYW4gQXJyYXkgb2YgYXJyYXlzIHdpdGggY29tcGFyaXNvbiByZXN1bHRzLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiAoRm9ybSkgQ29tcGFyZXMgMiB1bmlkaW1lbnNpb25hbCBFQ01BIEFycmF5cyBhbmQgcmV0dXJucyBhbiBBcnJheSBvZiBhcnJheXMgd2l0aCBjb21wYXJpc29uIHJlc3VsdHMuJiN4ZDsKICAgKiYjeGQ7CiAgICogQG1lbWJlcm9mIFBSRC51dGlsJiN4ZDsKICAgKiBAc2luY2UgMS4wLjImI3hkOwogICAqJiN4ZDsKICAgKiBAcGFyYW0gIHsoc3RyaW5nW118amF2YS51dGlsLlZlY3Rvcil9IGxpc3QxICAgICAgICBFQ01BIEFycmF5IG9yIEphdmEgVmVjdG9yLiYjeGQ7CiAgICogQHBhcmFtICB7KHN0cmluZ1tdfGphdmEudXRpbC5WZWN0b3IpfSBsaXN0MiAgICAgICAgRUNNQSBBcnJheSBvciBKYXZhIFZlY3Rvci4mI3hkOwogICAqIEBwYXJhbSAge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgICAgaWdub3JlY2FzZSAgIENoYW5nZXMgc3RyaW5nIGNvbXBhcmlzb24gdG8gY2FzZSBpbnNlbnNpdGl2ZS4mI3hkOwogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgYWxzbyBjYXVzZXMgdGhlIGNhc2luZyBvZiB0aGUgcmVzdWx0cyB3aWxsIG1hdGNoIHRoZSBjYXNpbmcgb2YgdGhlaXImI3hkOwogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0IHRpbWUgYXBwZWFyaW5nIGluIHRoZSBsaXN0IHByb3ZpZGVkLiYjeGQ7CiAgIComI3hkOwogICAqIEB0eXBlIHtBcnJheS4mbHQ7c3RyaW5nW10mZ3Q7fSYjeGQ7CiAgICogQHJldHVybiB7QXJyYXkuJmx0O3N0cmluZ1tdJmd0O30gRUNNQSBBcnJheSB3aXRoIDMgcGFydHMuIFsgWyBlbGVtZW50cyBvbmx5IHByZXNlbnQgb24gbGlzdDEgXSwgWyBlbGVtZW50cyBvbmx5IHByZXNlbnQgb24gbGlzdDIgXSwgWyBlbGVtZW50cyBwcmVzZW50IG9uIGJvdGhdIF0mI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gY29tcGFyZSggbGlzdDEsIGxpc3QyICxpZ25vcmVjYXNlICkgeyYjeGQ7CiAgICB2YXIgZXhpc3RzMSA9IHt9LCBleGlzdHMyID0ge30sIG9ubHlpbjEgPSBbXSwgb25seWluMiA9IFtdLCBpc2luYm90aCA9IFtdLCByZXMsJiN4ZDsKICAgIGksIGN1cnIsIGNvbXBhcmUsIGZuYW1lLCBkZWR1cDEgPSBbXTsmI3hkOwogICAgZm5hbWUgPSAnVW5pcXVlKCk6ICc7JiN4ZDsKICAgIGlmICggbGlzdDEgIT0gbnVsbCAmYW1wOyZhbXA7IHR5cGVvZiBsaXN0MSA9PT0gJ29iamVjdCcgJmFtcDsmYW1wOyBsaXN0MiAhPSBudWxsICZhbXA7JmFtcDsgdHlwZW9mIGxpc3QyID09PSAnb2JqZWN0JyApIHsmI3hkOwogICAgICAvLyAoRW5naW5lIG9ubHkpIENvbnZlcnQgVmVjdG9yIHRvIEFycmF5IHNvIHdlIGNhbiBwZXJmb3JtIHRoZSBjb21wYXJpc29ucy4mI3hkOwogICAgICBpZiAoIHdoZXJlID09PSAnZW5naW5lJyApIHsmI3hkOwogICAgICAgIGlmICggaXNKYXZhVmVjdG9yKCBsaXN0MSApICkgeyYjeGQ7CiAgICAgICAgICBsaXN0MSA9IEphdmFWZWN0b3JUb0VDTUFBcnJheSggbGlzdDEgKTsmI3hkOwogICAgICAgIH0mI3hkOwogICAgICAgIGlmICggaXNKYXZhVmVjdG9yKCBsaXN0MiApICkgeyYjeGQ7CiAgICAgICAgICBsaXN0MiA9IEphdmFWZWN0b3JUb0VDTUFBcnJheSggbGlzdDIgKTsmI3hkOwogICAgICAgIH0mI3hkOwogICAgICB9JiN4ZDsKICAgICAgLy8gRGVkdXBsaWNhdGUgbGlzdHMsIHRoZW4gY29tcGFyZSB0aGVtJiN4ZDsKICAgICAgaWYgKCBsaXN0MSBpbnN0YW5jZW9mIEFycmF5ICZhbXA7JmFtcDsgbGlzdDIgaW5zdGFuY2VvZiBBcnJheSApIHsmI3hkOwogICAgICAgIC8vIGdlbmVyYXRlIGhhc2htYXAgZm9yIGxpc3QxJiN4ZDsKICAgICAgICBmb3IgKCBpID0gMDsgaSAmbHQ7IGxpc3QxLmxlbmd0aDsgaSsrICkgeyYjeGQ7CiAgICAgICAgICAvLyBVc2luZyBjb21wYXJlIGZvciBjYXNlIHNlbnNpdGl2ZSBhbmQgaW5zZW50aXZlIGNvbXBhcmlzc29uIHdoaWxlIGtlZXBpbmcgY3VyciBhcyB0aGUgY3VycmVudCB2YWx1ZSBjb2VyY2VkIHRvIHN0cmluZyYjeGQ7CiAgICAgICAgICBjdXJyID0gU3RyaW5nKCBsaXN0MVsgaSBdICk7JiN4ZDsKICAgICAgICAgIGlmICggaWdub3JlY2FzZSA9PT0gdHJ1ZSApIHsmI3hkOwogICAgICAgICAgICBjb21wYXJlID0gY3Vyci50b0xvd2VyQ2FzZSgpOyYjeGQ7CiAgICAgICAgICB9IGVsc2UgeyYjeGQ7CiAgICAgICAgICAgIGNvbXBhcmUgPSBjdXJyOyYjeGQ7CiAgICAgICAgICB9JiN4ZDsKICAgICAgICAgIGlmICggISBleGlzdHMxLmhhc093blByb3BlcnR5KCBjb21wYXJlICkgKSB7JiN4ZDsKICAgICAgICAgICAgZGVkdXAxLnB1c2goIGN1cnIgKTsmI3hkOwogICAgICAgICAgICBleGlzdHMxWyBjb21wYXJlIF0gPSB0cnVlOyAvLyBtYXJraW5nIHRoZSBlbnRyeSBhcyBhbHJlYWR5IGV4aXN0aW5nIGZvciBkZWR1cGxpY2F0aW9uIHB1cnBvc2VzJiN4ZDsKICAgICAgICAgIH0mI3hkOwogICAgICAgIH0mI3hkOwogICAgICAgIC8vIEJ1aWxkIG9ubHlpbjIgYW5kIGlzaW5ib3RoIGJ5IGl0ZXJhdGluZyBvbiBsaXN0MiwgZ2VuZXJhdGluZyBpdHMgaGFzaG1hcCB3aGlsZSBjb21wYXJpbmcgd2l0aCBsaXN0MSYjeGQ7CiAgICAgICAgZm9yICggaSA9IDA7IGkgJmx0OyBsaXN0Mi5sZW5ndGg7IGkrKyApIHsmI3hkOwogICAgICAgICAgLy8gVXNpbmcgY29tcGFyZSBmb3IgY2FzZSBzZW5zaXRpdmUgYW5kIGluc2VudGl2ZSBjb21wYXJpc3NvbiB3aGlsZSBrZWVwaW5nIGN1cnIgYXMgdGhlIGN1cnJlbnQgdmFsdWUgY29lcmNlZCB0byBzdHJpbmcmI3hkOwogICAgICAgICAgY3VyciA9IFN0cmluZyggbGlzdDJbIGkgXSApOyYjeGQ7CiAgICAgICAgICBpZiAoIGlnbm9yZWNhc2UgPT09IHRydWUgKSB7JiN4ZDsKICAgICAgICAgICAgY29tcGFyZSA9IGN1cnIudG9Mb3dlckNhc2UoKTsmI3hkOwogICAgICAgICAgfSBlbHNlIHsmI3hkOwogICAgICAgICAgICBjb21wYXJlID0gY3VycjsmI3hkOwogICAgICAgICAgfSYjeGQ7CiAgICAgICAgICBpZiAoICEgZXhpc3RzMi5oYXNPd25Qcm9wZXJ0eSggY29tcGFyZSApICkgeyYjeGQ7CiAgICAgICAgICAgIGV4aXN0czJbIGNvbXBhcmUgXSA9IHRydWU7IC8vIG1hcmtpbmcgdGhlIGVudHJ5IGFzIGFscmVhZHkgZXhpc3RpbmcgZm9yIGRlZHVwbGljYXRpb24gcHVycG9zZXMmI3hkOwogICAgICAgICAgICBpZiAoIGV4aXN0czEuaGFzT3duUHJvcGVydHkoIGNvbXBhcmUgKSApIHsmI3hkOwogICAgICAgICAgICAgIGlzaW5ib3RoLnB1c2goIGN1cnIgKTsmI3hkOwogICAgICAgICAgICB9IGVsc2UgeyYjeGQ7CiAgICAgICAgICAgICAgb25seWluMi5wdXNoKCBjdXJyICk7JiN4ZDsKICAgICAgICAgICAgfSYjeGQ7CiAgICAgICAgICB9JiN4ZDsKICAgICAgICB9JiN4ZDsKICAgICAgICAvLyBJdGVyYXRlIGRlZHVwbGljYXRlZCBsaXN0MSBhZ2FpbnN0IGxpc3QyJ3MgaGFzaG1hcCB0byBwb3B1bGF0ZSBvbmx5aW4yJiN4ZDsKICAgICAgICBmb3IgKCBpID0gMDsgaSAmbHQ7IGRlZHVwMS5sZW5ndGg7IGkrKyApeyYjeGQ7CiAgICAgICAgICAvLyBVc2luZyBjb21wYXJlIGZvciBjYXNlIHNlbnNpdGl2ZSBhbmQgaW5zZW50aXZlIGNvbXBhcmlzc29uIHdoaWxlIGtlZXBpbmcgY3VyciBhcyB0aGUgY3VycmVudCB2YWx1ZSBjb2VyY2VkIHRvIHN0cmluZyYjeGQ7CiAgICAgICAgICBjdXJyID0gU3RyaW5nKCBkZWR1cDFbIGkgXSApOyYjeGQ7CiAgICAgICAgICBpZiAoIGlnbm9yZWNhc2UgPT09IHRydWUgKSB7JiN4ZDsKICAgICAgICAgICAgY29tcGFyZSA9IGN1cnIudG9Mb3dlckNhc2UoKTsmI3hkOwogICAgICAgICAgfSBlbHNlIHsmI3hkOwogICAgICAgICAgICBjb21wYXJlID0gY3VycjsmI3hkOwogICAgICAgICAgfSYjeGQ7CiAgICAgICAgICBpZiAoICEgZXhpc3RzMi5oYXNPd25Qcm9wZXJ0eSggY29tcGFyZSApICkgeyYjeGQ7CiAgICAgICAgICAgIG9ubHlpbjEucHVzaCggY3VyciApOyYjeGQ7CiAgICAgICAgICB9JiN4ZDsKICAgICAgICB9JiN4ZDsKICAgICAgICAvLyBDb252ZXJ0IHJlc3VsdHMgYmFjayB0byBWZWN0b3IgaWYgdGhlIG9iaiBwYXNzZWQgaW4gd2FzIGEgamF2YS51dGlsLlZlY3RvciYjeGQ7CiAgICAgIH0mI3hkOwogICAgfSBlbHNlIHsmI3hkOwogICAgICBsb2dlcnJvciggZm5hbWUgKyAnUGxlYXNlIHJldmlldyB0aGUgcGFyYW1ldGVycyBwcm92aWRlZCwgYWJvcnRpbmcuJyApOyYjeGQ7CiAgICB9JiN4ZDsKICAgIHJlcyA9IFsgb25seWluMSwgb25seWluMiwgaXNpbmJvdGggXTsmI3hkOwogICAgcmV0dXJuIHJlczsmI3hkOwogIH0mI3hkOwomI3hkOwogLyoqJiN4ZDsKICAgKiAoRm9ybSkgQ29tcGFyZXMgMiBvciBtb3JlIHVuaWRpbWVuc2lvbmFsIEVDTUEgQXJyYXlzIHdpdGhpbiBhbiBBcnJheSBhbmQgcmV0dXJucyBhbiBBcnJheSB3aXRoIGludGVyc2VjdGluZyByZXN1bHRzLiYjeGQ7CiAgICogQG1lbWJlcm9mIFBSRC51dGlsJiN4ZDsKICAgKiBAc2luY2UgMS4wLjcmI3hkOwogICAqJiN4ZDsKICAgKiBAcGFyYW0gIHtBcnJheS4mbHQ7c3RyaW5nW10mZ3Q7fSBhcnIgICAgICAgIEVDTUEgQXJyYXkuJiN4ZDsKICAgKiBAcGFyYW0gIHtib29sZWFufSAgICAgICAgICBpZ25vcmVjYXNlICAgQ2hhbmdlcyBzdHJpbmcgY29tcGFyaXNvbiB0byBjYXNlIGluc2Vuc2l0aXZlLiYjeGQ7CiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgYWxzbyBjYXVzZXMgdGhlIGNhc2luZyBvZiB0aGUgcmVzdWx0cyB3aWxsIG1hdGNoIHRoZSBjYXNpbmcgb2YgdGhlaXImI3hkOwogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCB0aW1lIGFwcGVhcmluZyBpbiB0aGUgbGlzdCBwcm92aWRlZC4mI3hkOwogICAqJiN4ZDsKICAgKiBAdHlwZSB7QXJyYXkuJmx0O3N0cmluZ1tdJmd0O30mI3hkOwogICAqIEByZXR1cm4ge3N0cmluZ1tdfSBFQ01BIEFycmF5IG9mIGludGVyc2VjdGluZyByZXN1bHRzLiYjeGQ7CiAgICovJiN4ZDsKICBmdW5jdGlvbiBpbnRlcnNlY3RBcnJheXMoIGFyciwgaWdub3JlQm9vbCApIHsmI3hkOwogICAgdmFyIGZuYW1lLCByZXN1bHQ7JiN4ZDsKICAgIGZuYW1lID0gJ2ludGVyc2VjdEFycmF5cygpOiAnOyYjeGQ7CiAgICB0cnkgeyYjeGQ7CiAgICAgIGlmICggYXJyLmxlbmd0aCA9PT0gMCApIHsmI3hkOwogICAgICAgIHJldHVybiBsb2dlcnJvciggZm5hbWUgKyAnIk11c3QgaGF2ZSBhcnJheSBlbGVtZW50cyB0byBjb21wYXJlJyApOyYjeGQ7CiAgICAgIH0mI3hkOwogICAgICBpZiAoIGFyci5sZW5ndGggPT09IDEgKSB7JiN4ZDsKICAgICAgICByZXR1cm4gYXJyWyAwIF07JiN4ZDsKICAgICAgfSBlbHNlIHsmI3hkOwogICAgICAgIHJlc3VsdCA9IFsgbnVsbCwgbnVsbCwgYXJyWyAwIF0gXTsmI3hkOwogICAgICAgIGFyci5mb3JFYWNoKGZ1bmN0aW9uICgga2V5LCBpbmQgKSB7JiN4ZDsKICAgICAgICAgIHZhciBuZXh0ID0gaW5kICsgMTsmI3hkOwogICAgICAgICAgaWYgKCBuZXh0ICZsdDsgYXJyLmxlbmd0aCApIHsmI3hkOwogICAgICAgICAgICByZXN1bHQgPSBQUkQudXRpbC5jb21wYXJlKCByZXN1bHRbIDIgXSwgYXJyWyBuZXh0IF0sIGlnbm9yZUJvb2wgKTsmI3hkOwogICAgICAgICAgfSYjeGQ7CiAgICAgICAgfSk7JiN4ZDsKICAgICAgICByZXR1cm4gcmVzdWx0WyAyIF07JiN4ZDsKICAgICAgfSYjeGQ7CiAgICB9IGNhdGNoICggZSApIHsmI3hkOwogICAgICByZXR1cm4gbG9nZXJyb3IoIGZuYW1lICsgJ011c3Qgc3VibWl0IGFycmF5IGFzIHBhcmFtZXRlci4gRXJyb3I6ICcgKyBlLm1lc3NhZ2UgKTsmI3hkOwogICAgfSYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiAoRW5naW5lKSBQYXJzZXMgYW4gdW5pZGltZW5zaW9uYWwgRUNNQSBBcnJheSBvciBKYXZhIFZlY3RvciBhbmQgcmV0dXJucyB0aGUgc2FtZSB0eXBlIG9mIG9iamVjdCB3aXRoIG9ubHkgdW5pcXVlIGVudHJpZXMuJmx0O2JyLyZndDsmI3hkOwogICAqIChGb3JtKSBQYXJzZXMgYW4gdW5pZGltZW5zaW9uYWwgRUNNQSBBcnJheSBhbmQgcmV0dXJucyB0aGUgc2FtZSB0eXBlIG9mIG9iamVjdCB3aXRoIG9ubHkgdW5pcXVlIGVudHJpZXMuJiN4ZDsKICAgKiYjeGQ7CiAgICogQG1lbWJlcm9mIFBSRC51dGlsJiN4ZDsKICAgKiBAc2luY2UgMS4wLjImI3hkOwogICAqJiN4ZDsKICAgKiBAcGFyYW0gIHsoc3RyaW5nW118amF2YS51dGlsLlZlY3Rvcil9IG9iaiAgICAgICAgICBFQ01BIEFycmF5IG9yIEphdmEgVmVjdG9yLiYjeGQ7CiAgICogQHBhcmFtICB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgICBpZ25vcmVjYXNlICAgQ2hhbmdlcyBzdHJpbmcgY29tcGFyaXNvbiB0byBjYXNlIGluc2Vuc2l0aXZlLiYjeGQ7CiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBhbHNvIGNhdXNlcyB0aGUgY2FzaW5nIG9mIHRoZSByZXN1bHRzIHdpbGwgbWF0Y2ggdGhlIGNhc2luZyBvZiB0aGVpciYjeGQ7CiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgdGltZSBhcHBlYXJpbmcgaW4gdGhlIGxpc3QgcHJvdmlkZWQuJiN4ZDsKICAgKiYjeGQ7CiAgICogQHR5cGUgeyhzdHJpbmdbXXxqYXZhLnV0aWwuVmVjdG9yKX0mI3hkOwogICAqIEByZXR1cm4geyhzdHJpbmdbXXxqYXZhLnV0aWwuVmVjdG9yKX0gRUNNQSBBcnJheSBvciBKYXZhIFZlY3Rvci4gSWYgb2JqIGlzIG5vdCBhIHZhbGlkIHR5cGUgcmV0dXJucyBlbXB0eSBFQ01BIEFycmF5LiYjeGQ7CiAgICovJiN4ZDsKICBmdW5jdGlvbiB1bmlxdWUoIG9iaiAsIGlnbm9yZWNhc2UgKSB7JiN4ZDsKICAgIHZhciBleGlzdHMgPSB7fSwgcmVzID0gW10sIGNvbnZlcnRUb1ZlY3RvciwgaSwgY3VyciwgY29tcGFyZSwgZm5hbWU7JiN4ZDsKICAgIGZuYW1lID0gJ1VuaXF1ZSgpOiAnOyYjeGQ7CiAgICBpZiAoIG9iaiAhPSBudWxsICZhbXA7JmFtcDsgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgKSB7JiN4ZDsKICAgICAgLy8gQ29udmVydCBWZWN0b3IgdG8gQXJyYXkgc28gd2UgY2FuIGRlZHVwbGljYXRlIGJvdGggdXNpbmcgdGhlIHNhbWUgY29kZSYjeGQ7CiAgICAgIGlmICggd2hlcmUgPT09J2VuZ2luZScgJmFtcDsmYW1wOyBpc0phdmFWZWN0b3IoIG9iaiApICkgeyYjeGQ7CiAgICAgICAgb2JqID0gSmF2YVZlY3RvclRvRUNNQUFycmF5KCBvYmogKTsmI3hkOwogICAgICAgIGNvbnZlcnRUb1ZlY3RvciA9IHRydWU7JiN4ZDsKICAgICAgfSBlbHNlIHsmI3hkOwogICAgICAgIGNvbnZlcnRUb1ZlY3RvciA9IGZhbHNlOyYjeGQ7CiAgICAgIH0mI3hkOwogICAgICAvLyBEZWR1cGxpY2F0ZSBhcnJheSwgZ2VuZXJhdGUmI3hkOwogICAgICBpZiAoIG9iaiBpbnN0YW5jZW9mIEFycmF5ICkgeyYjeGQ7CiAgICAgICAgZm9yICggaSA9IDA7IGkgJmx0OyBvYmoubGVuZ3RoOyBpKysgKSB7JiN4ZDsKICAgICAgICAgIC8vIFVzaW5nIGNvbXBhcmUgZm9yIGNhc2Ugc2Vuc2l0aXZlIGFuZCBpbnNlbnRpdmUgY29tcGFyaXNzb24gd2hpbGUga2VlcGluZyBjdXJyIGFzIHRoZSBjdXJyZW50IHZhbHVlIGNvZXJjZWQgdG8gc3RyaW5nJiN4ZDsKICAgICAgICAgIGN1cnIgPSBTdHJpbmcoIG9ialsgaSBdICk7JiN4ZDsKICAgICAgICAgIGlmICggaWdub3JlY2FzZSA9PT0gdHJ1ZSApIHsmI3hkOwogICAgICAgICAgICBjb21wYXJlID0gY3Vyci50b0xvd2VyQ2FzZSgpOyYjeGQ7CiAgICAgICAgICB9IGVsc2UgeyYjeGQ7CiAgICAgICAgICAgIGNvbXBhcmUgPSBjdXJyOyYjeGQ7CiAgICAgICAgICB9JiN4ZDsKICAgICAgICAgIGlmICggISBleGlzdHMuaGFzT3duUHJvcGVydHkoIGNvbXBhcmUgKSApIHsmI3hkOwogICAgICAgICAgICByZXMucHVzaCggY3VyciApOyYjeGQ7CiAgICAgICAgICAgIGV4aXN0c1sgY29tcGFyZSBdID0gdHJ1ZTsgLy8gbWFya2luZyB0aGUgZW50cnkgYXMgYWxyZWFkeSBleGlzdGluZyBmb3IgZGVkdXBsaWNhdGlvbiBwdXJwb3NlcyYjeGQ7CiAgICAgICAgICB9JiN4ZDsKICAgICAgICB9JiN4ZDsKICAgICAgICAvLyBDb252ZXJ0IHJlc3VsdHMgYmFjayB0byBWZWN0b3IgaWYgdGhlIG9iaiBwYXNzZWQgaW4gd2FzIGEgamF2YS51dGlsLlZlY3RvciYjeGQ7CiAgICAgICAgaWYgKCB3aGVyZSA9PT0nZW5naW5lJyAmYW1wOyZhbXA7IGNvbnZlcnRUb1ZlY3RvciApIHsmI3hkOwogICAgICAgICAgcmVzID0gRUNNQUFycmF5VG9KYXZhVmVjdG9yKCByZXMgKTsmI3hkOwogICAgICAgIH0mI3hkOwogICAgICB9JiN4ZDsKICAgIH0mI3hkOwogICAgcmV0dXJuIHJlczsmI3hkOwogIH0mI3hkOwomI3hkOwogIC8qKiYjeGQ7CiAgICogKEVuZ2luZSBvbmx5KSBQYXJzZXMgdGhlIHJlc3VsdCBmcm9tIGZsb3dkYXRhLmdldE9iamVjdCBpbnRvIGFuIEFycmF5IG9mIHN0cmluZ3MgYW5kIEVDTUEgb2JqZWN0cy4mbHQ7YnIvJmd0OyYjeGQ7CiAgICogRWFjaCBET00gZWxlbWVudCBub2RlIHdpbGwgYmUgYW4gb2JqZWN0J3MgcHJvcGVydHkgbmFtZSwgYW5kIGVhY2ggcHJvcGVydHkgd2lsbCBjb250YWluJiN4ZDsKICAgKiBhbiBhcnJheSBvZiBpdGVtcy4gVGhvc2UgaXRlbXMgY2FtIGJlIHN0cmluZ3Mgb3Igb3RoZXIgb2JqZWN0cy4mI3hkOwogICAqIEBtZW1iZXJvZiBQUkQudXRpbCYjeGQ7CiAgICogQHNpbmNlIDEuMC4yJiN4ZDsKICAgKiYjeGQ7CiAgICogQHBhcmFtICB7amF2YS51dGlsLkFycmF5TGlzdH0gIGxpc3QgIEphdmEgb2JqZWN0IHJlc3VsdGluZyBmcm9tIGZsb3dkYXRhLmdldE9iamVjdCgpJiN4ZDsKICAgKiYjeGQ7CiAgICogQHR5cGUgeyhhcnJheS4mbHQ7KG9iamVjdHxzdHJpbmcpJmd0O3xudWxsKX0mI3hkOwogICAqIEByZXR1cm4geyhhcnJheS4mbHQ7KG9iamVjdHxzdHJpbmcpJmd0O3xudWxsKX0gRUNNQSBBcnJheSBvZiBvYmplY3RzIGFuZCBzdHJpbmcuIElmIGVycm9yIG9jY3VyIHJldHVybnMgbnVsbC4mI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gZ2V0T2JqZWN0MmFyciggbGlzdCwgb25lbHZsICkgeyYjeGQ7CiAgICB2YXIgcmVzLCBmbmFtZSwgaW5pdGlhbG5vZGUsIGN1cnJub2RlLCBub2RlbmFtZSwgY2hpbGRub2RlcywgcHJlcHJvY2VzcywgcmVtb3Zlb2JqOyYjeGQ7CiAgICBmbmFtZSA9ICdnZXRPYmplY3QyYXJyKCk6ICc7JiN4ZDsKICAgIHJlcyA9IG51bGw7IHJlbW92ZW9iaiA9IHRydWU7JiN4ZDsKJiN4ZDsKICAgIGlmICggbGlzdCA9PT0gbnVsbCB8fCAoISggdHlwZW9mIGxpc3QgPT09ICdvYmplY3QnICZhbXA7JmFtcDsgbGlzdC5nZXRDbGFzcygpID09ICdjbGFzcyBqYXZhLnV0aWwuQXJyYXlMaXN0JyApKSApIHsmI3hkOwogICAgICBsb2dlcnJvciggZm5hbWUgKyAnSW52YWxpZCBwYXJhbWV0ZXIgcmVjZWl2ZWQuIGxpc3QgbXVzdCBiZSB0aGUgcmVzdWx0IG9mIGEgZmxvd2RhdGEuZ2V0T2JqZWN0KCkgY2FsbC4nICk7JiN4ZDsKICAgICAgcmV0dXJuIHJlczsmI3hkOwogICAgfSYjeGQ7CiAgICAvLyBSZXRyaWV2ZXMgdGhlIGZpcnN0IEVsZW1lbnROU0ltcGwgbm9kZSBmcm9tIHRoZSBsaXN0JiN4ZDsKICAgIGlmICggbGlzdC5zaXplKCkgJmd0OyAwICkgeyYjeGQ7CiAgICAgIGluaXRpYWxub2RlID0gbGlzdC5nZXQoMCk7JiN4ZDsKICAgIH0mI3hkOwomI3hkOwogICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBub2RlcywgZ3JvdXAgZWxlbWVudCBjaGlsZCBub2RlcyBpbnRvIGFycmF5cyBhcyBwZXIgdGhlaXIgY29udGVudC4mI3hkOwogICAgaWYgKCBpbml0aWFsbm9kZSAhPSBudWxsICZhbXA7JmFtcDsgdHlwZW9mIGluaXRpYWxub2RlID09PSAnb2JqZWN0JyAmYW1wOyZhbXA7IGluaXRpYWxub2RlLmdldENsYXNzKCkgPT0gJ2NsYXNzIG9yZy5hcGFjaGUueGVyY2VzLmRvbS5FbGVtZW50TlNJbXBsJyApIHsmI3hkOwogICAgICBjdXJybm9kZSA9IGluaXRpYWxub2RlOyYjeGQ7CiAgICAgIHJlcyA9IFsge30gXTsmI3hkOwogICAgICBwcmVwcm9jZXNzID0ge307JiN4ZDsKICAgICAgd2hpbGUgKCBjdXJybm9kZSApIHsmI3hkOwogICAgICAgIC8vIFRleHQgbm9kZXMgYXJlIGFwcGVuZGVkIGFzIGlzIHRvIHRoZSBjdXJyZW50IGxldmVsJiN4ZDsKICAgICAgICBpZiAoIGN1cnJub2RlLmdldE5vZGVUeXBlKCkgPT0gZ2V0Tm9kZVR5cGVzLm5vZGV0eXBlLlRleHQgKSB7JiN4ZDsKICAgICAgICAgIGlmICggc2hvdWxkUHJvY2Vzc05vZGUoIGN1cnJub2RlICkgKSB7JiN4ZDsKICAgICAgICAgICAgZGVidWdtc2coIGZuYW1lICsgJ2ZvdW5kIHRleHQgbm9kZS4gZ2V0Tm9kZVZhbHVlKCk6ICInICsgY3Vycm5vZGUuZ2V0Tm9kZVZhbHVlKCkgKyAnIicgKTsmI3hkOwogICAgICAgICAgICByZXMucHVzaCggU3RyaW5nKCBjdXJybm9kZS5nZXROb2RlVmFsdWUoKSApICk7JiN4ZDsKICAgICAgICAgIH0mI3hkOwogICAgICAgIH0mI3hkOwogICAgICAgIC8vIEVsZW1lbnQgbm9kZXMgcmVxdWlyZSBncm91cGluZyBmb3IgZGVkdXBsaWNhdGlvbiBzaW5jZSB3ZSBjYW4gaGF2ZSAyIHNpYmxpbmcgZWxlbWVudHMgd2l0aCB0aGUgc2FtZSBub2RlIG5hbWUmI3hkOwogICAgICAgIGlmICggY3Vycm5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBnZXROb2RlVHlwZXMubm9kZXR5cGUuRWxlbWVudCApIHsmI3hkOwogICAgICAgICAgLy8gRGVkdXBsaWNhdGlvbiBvZiBub2RlIG5hbWVzJiN4ZDsKICAgICAgICAgIG5vZGVuYW1lID0gU3RyaW5nKCBjdXJybm9kZS5nZXROb2RlTmFtZSgpICk7JiN4ZDsKICAgICAgICAgIGRlYnVnbXNnKCBmbmFtZSArICdmb3VuZCBlbGVtZW50IG5vZGUgIicgKyBub2RlbmFtZSArICciJyApOyYjeGQ7CiAgICAgICAgICBpZiAoICEgcHJlcHJvY2Vzcy5oYXNPd25Qcm9wZXJ0eSggbm9kZW5hbWUgKSApIHsmI3hkOwogICAgICAgICAgICBwcmVwcm9jZXNzWyBub2RlbmFtZSBdID0gW107JiN4ZDsKICAgICAgICAgIH0mI3hkOwogICAgICAgICAgcHJlcHJvY2Vzc1sgbm9kZW5hbWUgXS5wdXNoKCBjdXJybm9kZSApOyYjeGQ7CiAgICAgICAgICByZW1vdmVvYmogPSBmYWxzZTsmI3hkOwogICAgICAgIH0mI3hkOwogICAgICAgIGN1cnJub2RlID0gY3Vycm5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsmI3hkOwogICAgICB9JiN4ZDsKJiN4ZDsKICAgICAgLy8gSXRlcmF0ZXMgdGhlIHByb3BlcnRpZXMgYW5kIHNldCB0aGVtIHVwIHVzaW5nIGZsb3dkYXRhMm9iaiYjeGQ7CiAgICAgIGZvciAoIG5vZGVuYW1lIGluIHByZXByb2Nlc3MgKSB7JiN4ZDsKICAgICAgICByZXNbIDAgXVsgbm9kZW5hbWUgXSA9IGZsb3dkYXRhMm9iaiggcHJlcHJvY2Vzc1sgbm9kZW5hbWUgXSApOyYjeGQ7CiAgICAgIH0mI3hkOwomI3hkOwogICAgICBpZiAoIHJlbW92ZW9iaiApIHsmI3hkOwogICAgICAgIHJlcyA9IHJlcy5zcGxpY2UoIDEgKTsmI3hkOwogICAgICB9JiN4ZDsKICAgIH0mI3hkOwomI3hkOwogICAgcmV0dXJuIHJlczsmI3hkOwogIH0mI3hkOwomI3hkOwogIC8qKiYjeGQ7CiAgICogKEVuZ2luZSBvbmx5KSBDaGVjayBpZiB3ZSBzaG91bGQgc2tpcCBwcm9jZXNzaW5nIGEgdGV4dCBub2RlLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBVc2luZyB4ZXJjZXMgbGlicmFyaWVzIHRvIHBhcnNlZmxvd2RhdGEgc2libGluZy9jaGlsZCBub2RlcyB5aWVsZHMgc2V2ZXJhbCB0ZXh0IG5vZGVzIHdpdGggXCAoY2hhckNvZGVBdCgwKSBvZiAxMCkmI3hkOwogICAqIHRoYXQgZG8gbm90IGFwcGVhciB3aGVuIGxvb2tpbmcgYXQgZmxvd2RhdGEgeG1sIGluIHRoZSBtZXRheG1sIGZpZWxkIG9mIHRoZSBhZmRvY3VtZW50IHRhYmxlLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBHaXZlbiB0aGF0IGJlaGF2aW9yIHdlIG5lZWQgdG8gc3RyaXAgdGhvc2UgdGV4dCBub2RlcyBvdXQgb2Ygb3VyIHJlc3VsdHMuJiN4ZDsKICAgKiBAc2luY2UgMS4wLjImI3hkOwogICAqIEBwcml2YXRlJiN4ZDsKICAgKiBAcGFyYW0gIHsob3JnLmFwYWNoZS54ZXJjZXMuZG9tLkVsZW1lbnROU0ltcGx8b3JnLmFwYWNoZS54ZXJjZXMuZG9tLlRleHRJbXBsKX0gIG5vZGUgICAgIEphdmEgeGVyY2VzIG5vZGUmI3hkOwogICAqIEB0eXBlIHtib29sZWFufSYjeGQ7CiAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB3ZSBzaG91bGQgcHJvY2VzcyB0aGUgbm9kZSwgZmFsc2Ugb3RoZXJ3aXNlLiYjeGQ7CiAgICovJiN4ZDsKICBmdW5jdGlvbiBzaG91bGRQcm9jZXNzTm9kZSggbm9kZSApIHsmI3hkOwogICAgaWYgKCBub2RlID09PSBudWxsICkgeyYjeGQ7CiAgICAgIHJldHVybiBmYWxzZTsmI3hkOwogICAgfSYjeGQ7CiAgICBpZiAoIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JyAmYW1wOyZhbXA7IG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBnZXROb2RlVHlwZXMubm9kZXR5cGUuRWxlbWVudCApIHsmI3hkOwogICAgICByZXR1cm4gdHJ1ZTsmI3hkOwogICAgfSYjeGQ7CiAgICBpZiAoIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JyAmYW1wOyZhbXA7IG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBnZXROb2RlVHlwZXMubm9kZXR5cGUuVGV4dCApIHsmI3hkOwogICAgICBpZiAoIG5vZGUuZ2V0Tm9kZVZhbHVlKCkubGVuZ3RoID09PSAxICZhbXA7JmFtcDsgbm9kZS5nZXROb2RlVmFsdWUoKS5jaGFyQ29kZUF0KCAwICkgPT09IDEwICkgeyYjeGQ7CiAgICAgICAgcmV0dXJuIGZhbHNlOyYjeGQ7CiAgICAgIH0gZWxzZSB7JiN4ZDsKICAgICAgICByZXR1cm4gdHJ1ZTsmI3hkOwogICAgICB9JiN4ZDsKICAgIH0mI3hkOwogICAgcmV0dXJuIGZhbHNlOyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiAoRW5naW5lIG9ubHkpIEl0ZXJhdGVzIHJlY3Vyc2l2ZWx5IHRocm91Z2ggRE9NIG5vZGVzIGZyb20gZmxvd2RhdGEmI3hkOwogICAqIEBzaW5jZSAxLjAuMiYjeGQ7CiAgICogQHByaXZhdGUmI3hkOwogICAqIEBwYXJhbSAge29yZy5hcGFjaGUueGVyY2VzLmRvbS5FbGVtZW50TlNJbXBsW119ICBub2RlICAgICBKYXZhIHhlcmNlcyBub2RlIG9yIEVDTUEgYXJyYXkgb2Ygbm9kZXMmI3hkOwogICAqIEB0eXBlIHthcnJheS4mbHQ7KG9iamVjdHxzdHJpbmcpJmd0O30mI3hkOwogICAqIEByZXR1cm4ge2FycmF5LiZsdDsob2JqZWN0fHN0cmluZykmZ3Q7fSBFQ01BIEFycmF5IG9mIG9iamVjdHMgYW5kIHN0cmluZ3MuJiN4ZDsKICAgKi8mI3hkOwogIGZ1bmN0aW9uIGZsb3dkYXRhMm9iaiggbm9kZSApIHsmI3hkOwogICAgdmFyIGZuYW1lLCByZXMsIGksIGosIG5vZGVuYW1lLCBjaGlsZG5vZGVzLCBjaGlsZG5vZGUsIGl0ZXJhdGUsIHJlbW92ZW9iajsmI3hkOwogICAgZm5hbWUgPSAnZmxvd2RhdGEyb2JqKCk6ICc7JiN4ZDsKICAgIHJlcyA9IFsgJycgXTsgaXRlcmF0ZSA9IHt9OyByZW1vdmVvYmogPSB0cnVlOyYjeGQ7CiAgICAvLyBBcnJheSBvZiBub2RlcywgIHByb2Nlc3MgdGhlaXIgY2hpbGQgbm9kZXMgb25seSBhbmQgcmV0dXJuIGFycmF5IHdpdGggMSBvYmplY3QgYW5kIDEgb3IgbW9yZSB0ZXh0IG5vZGVzJiN4ZDsKICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgYXJyYXkgb2YgcGFyZW50IG5vZGVzIHRoYXQgc2hvdWxkIGhhdmUgdGhlIHNhbWUgZWxlbWVudCBuYW1lJiN4ZDsKICAgIGlmICggbm9kZSBpbnN0YW5jZW9mIEFycmF5ICkgeyYjeGQ7CiAgICAgIGRlYnVnbXNnKCBmbmFtZSArICdSZWNlaXZlZCBhcnJheSBmb3IgcHJvY2Vzc2luZywgbGVuZ3RoOiAnICsgbm9kZS5sZW5ndGggKTsmI3hkOwogICAgICByZXMgPSBbIHt9IF07JiN4ZDsKICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBwYXJlbnQgbm9kZXMgdG8gY29sbGF0ZSBjaGlsZCBub2RlcyB3aXRoIHNhbWUgZWxlbWVudCBuYW1lJiN4ZDsKICAgICAgZm9yICggaSA9IDA7IGkgJmx0OyBub2RlLmxlbmd0aDsgaSsrICkgeyYjeGQ7CiAgICAgICAgaWYgKCBub2RlWyBpIF0uaGFzQ2hpbGROb2RlcygpICkgeyYjeGQ7CiAgICAgICAgICBkZWJ1Z21zZyggZm5hbWUgKyAnbm9kZSBhdCBwb3NpdGlvbiAnICsgaSArICcgaGFzIGNoaWxkIG5vZGVzJyApOyYjeGQ7CiAgICAgICAgICBjaGlsZG5vZGVzID0gbm9kZVsgaSBdLmdldENoaWxkTm9kZXMoKTsmI3hkOwogICAgICAgICAgLy8gSXRlcmF0ZXMgdGhyb3VnaCBjaGlsZCBub2RlcyBvZiBhIHNpbmdsZSBwYXJlbnQgbm9kZSYjeGQ7CiAgICAgICAgICBmb3IgKCBqID0gMDsgaiAmbHQ7IGNoaWxkbm9kZXMuZ2V0TGVuZ3RoKCk7IGorKyApIHsmI3hkOwogICAgICAgICAgICBkZWJ1Z21zZyggZm5hbWUgKyAnYXJyYXkgaW5kZXggJyArIGkgKyAnOiBwcm9jZXNzaW5nIGNoaWxkIG5vZGUgJyArIGogKTsmI3hkOwogICAgICAgICAgICBjaGlsZG5vZGUgPSBjaGlsZG5vZGVzLml0ZW0oIGogKTsmI3hkOwogICAgICAgICAgICAvLyBUZXh0IG5vZGVzIGFyZSBhcHBlbmRlZCBhcyBpcyB0byB0aGUgY3VycmVudCBsZXZlbCYjeGQ7CiAgICAgICAgICAgIGlmICggY2hpbGRub2RlLmdldE5vZGVUeXBlKCkgPT0gZ2V0Tm9kZVR5cGVzLm5vZGV0eXBlLlRleHQgKSB7JiN4ZDsKICAgICAgICAgICAgICBpZiAoIHNob3VsZFByb2Nlc3NOb2RlKCBjaGlsZG5vZGUgKSApIHsmI3hkOwogICAgICAgICAgICAgICAgZGVidWdtc2coIGZuYW1lICsgJ0ZvdW5kIHRleHQgbm9kZS4gZ2V0Tm9kZVZhbHVlKCk6ICInICsgY2hpbGRub2RlLmdldE5vZGVWYWx1ZSgpICsgJyInICk7JiN4ZDsKICAgICAgICAgICAgICAgIHJlcy5wdXNoKCBTdHJpbmcoIGNoaWxkbm9kZS5nZXROb2RlVmFsdWUoKSApICk7JiN4ZDsKICAgICAgICAgICAgICB9JiN4ZDsKICAgICAgICAgICAgfSYjeGQ7CiAgICAgICAgICAgIC8vIEVsZW1lbnQgbm9kZXMgcmVxdWlyZSBncm91cGluZyBmb3IgZGVkdXBsaWNhdGlvbiBzaW5jZSB3ZSBjYW4gaGF2ZSAyIHNpYmxpbmcgZWxlbWVudHMgd2l0aCB0aGUgc2FtZSBub2RlIG5hbWUmI3hkOwogICAgICAgICAgICBpZiAoIGNoaWxkbm9kZS5nZXROb2RlVHlwZSgpID09IGdldE5vZGVUeXBlcy5ub2RldHlwZS5FbGVtZW50ICkgeyYjeGQ7CiAgICAgICAgICAgICAgLy8gRGVkdXBsaWNhdGlvbiBvZiBub2RlIG5hbWVzJiN4ZDsKICAgICAgICAgICAgICBub2RlbmFtZSA9IFN0cmluZyggY2hpbGRub2RlLmdldE5vZGVOYW1lKCkgKTsmI3hkOwogICAgICAgICAgICAgIGRlYnVnbXNnKCBmbmFtZSArICdmb3VuZCBlbGVtZW50IG5vZGUgIicgKyBub2RlbmFtZSArICciJyApOyYjeGQ7CiAgICAgICAgICAgICAgaWYgKCAhIGl0ZXJhdGUuaGFzT3duUHJvcGVydHkoIG5vZGVuYW1lICkgKSB7JiN4ZDsKICAgICAgICAgICAgICAgIGl0ZXJhdGVbIG5vZGVuYW1lIF0gPSBbXTsmI3hkOwogICAgICAgICAgICAgIH0mI3hkOwogICAgICAgICAgICAgIGl0ZXJhdGVbIG5vZGVuYW1lIF0ucHVzaCggY2hpbGRub2RlICk7JiN4ZDsKICAgICAgICAgICAgICByZW1vdmVvYmogPSBmYWxzZTsmI3hkOwogICAgICAgICAgICB9JiN4ZDsKICAgICAgICAgIH0gLy8gRmluaXNoZWQgcHJvY2Vzc2luZyBhIHNpbmdsZSBwYXJlbnQgbm9kZSdzIGNoaWxkIG5vZGVzJiN4ZDsKICAgICAgICB9JiN4ZDsKICAgICAgfSAvLyBGaW5pc2hlZCBwcm9jZXNzaW5nIGFsbCBwYXJlbnQgbm9kZXMmI3hkOwomI3hkOwogICAgICAvKiBBdCB0aGlzIHBvaW50IHdlJ3ZlIGdyb3VwZWQgYWxsIHRoZSBjaGlsZG5vZGVzIHRoYXQgY29udGFpbiB0aGUgc2FtZSBuYW1lcyYjeGQ7CiAgICAgICAgYWNyb3NzIGFsbCBwYXJlbnQgbm9kZXMgdGhhdCBjb250YWluZWQgdGhlIHNhbWUgbmFtZS4mI3hkOwogICAgICAgIFdlIGNhbiBub3cgcGFyc2UgdGhvc2UgcmVzdWxzIHJlY3Vyc2l2ZWx5ICovJiN4ZDsKJiN4ZDsKICAgICAgLy8gSXRlcmF0ZXMgdGhlIHByb3BlcnRpZXMgYW5kIHNldCB0aGVtIHVwIHJlY3Vyc2l2ZSBjYWxsaW5nIGZsb3dkYXRhMm9iaiBhZ2FpbiYjeGQ7CiAgICAgIGZvciAoIG5vZGVuYW1lIGluIGl0ZXJhdGUgKSB7JiN4ZDsKICAgICAgICByZXNbIDAgXVsgbm9kZW5hbWUgXSA9IGZsb3dkYXRhMm9iaiggaXRlcmF0ZVsgbm9kZW5hbWUgXSApOyYjeGQ7CiAgICAgIH0mI3hkOwomI3hkOwogICAgICBpZiAoIHJlbW92ZW9iaiApIHsmI3hkOwogICAgICAgIHJlcyA9IHJlcy5zcGxpY2UoIDEgKTsmI3hkOwogICAgICB9JiN4ZDsKICAgIH0mI3hkOwogICAgcmV0dXJuIHJlczsmI3hkOwogIH0mI3hkOwomI3hkOwogIC8qKiYjeGQ7CiAgICogKEVuZ2luZSBvbmx5KSBSZXR1cm5zIGFuIG9iamVjdCB0byBiZSB1c2VkIHRvIGNoZWNrIHdoYXQgbm9kZSB0eXBlIHdhcyByZXR1cm5lZCBmcm9tIG5vZGUuZ2V0Tm9kZVR5cGUoKS4mI3hkOwogICAqIEBzaW5jZSAxLjAuMiYjeGQ7CiAgICogQHByaXZhdGUmI3hkOwogICAqIEB0eXBlIHtvYmplY3R9JiN4ZDsKICAgKiBAcmV0dXJuIHtvYmplY3R9IEVDTUEgT2JqZWN0IHdob3NlIHByb3BlcnRpZXMgYW5kIHRoZWlyIHZhbHVlcyBtYXAgdG8gdGhlIHBvc3NpYmxlIHJlc3VsdHMgb2Ygbm9kZS5nZXROb2RlVHlwZSgpLiYjeGQ7CiAgICovJiN4ZDsKICBpZiAoIHdoZXJlID09PSAnZW5naW5lJyApIHsmI3hkOwogICAgLy8gQXR0YWNoaW5nIHRvIHRoZSBmdW5jdGlvbiBvbiBsb2FkIHRpbWUgc28gdGhhdCBpdCBvbmx5IHJ1bnMgb25jZS4mI3hkOwogICAgZ2V0Tm9kZVR5cGVzLm5vZGV0eXBlID0gZ2V0Tm9kZVR5cGVzKCk7JiN4ZDsKICB9JiN4ZDsKICBmdW5jdGlvbiBnZXROb2RlVHlwZXMoKSB7JiN4ZDsKICAgIHZhciBub2RldHlwZSA9IHt9OyYjeGQ7CiAgICBub2RldHlwZS5BdHRyID0gUGFja2FnZXMub3JnLnczYy5kb20uTm9kZS5BVFRSSUJVVEVfTk9ERTsmI3hkOwogICAgbm9kZXR5cGUuQ0RBVEFTZWN0aW9uID0gUGFja2FnZXMub3JnLnczYy5kb20uTm9kZS5DREFUQV9TRUNUSU9OX05PREU7JiN4ZDsKICAgIG5vZGV0eXBlLkNvbW1lbnQgPSBQYWNrYWdlcy5vcmcudzNjLmRvbS5Ob2RlLkNPTU1FTlRfTk9ERTsmI3hkOwogICAgbm9kZXR5cGUuRG9jdW1lbnRGcmFnbWVudCA9IFBhY2thZ2VzLm9yZy53M2MuZG9tLk5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERTsmI3hkOwogICAgbm9kZXR5cGUuRG9jdW1lbnQgPSBQYWNrYWdlcy5vcmcudzNjLmRvbS5Ob2RlLkRPQ1VNRU5UX05PREU7JiN4ZDsKICAgIG5vZGV0eXBlLkRvY3VtZW50VHlwZSA9IFBhY2thZ2VzLm9yZy53M2MuZG9tLk5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFOyYjeGQ7CiAgICBub2RldHlwZS5FbGVtZW50ID0gUGFja2FnZXMub3JnLnczYy5kb20uTm9kZS5FTEVNRU5UX05PREU7JiN4ZDsKICAgIG5vZGV0eXBlLkVudGl0eSA9IFBhY2thZ2VzLm9yZy53M2MuZG9tLk5vZGUuRU5USVRZX05PREU7JiN4ZDsKICAgIG5vZGV0eXBlLkVudGl0eVJlZmVyZW5jZSA9IFBhY2thZ2VzLm9yZy53M2MuZG9tLk5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFOyYjeGQ7CiAgICBub2RldHlwZS5Ob3RhdGlvbiA9IFBhY2thZ2VzLm9yZy53M2MuZG9tLk5vZGUuTk9UQVRJT05fTk9ERTsmI3hkOwogICAgbm9kZXR5cGUuUHJvY2Vzc2luZ0luc3RydWN0aW9uID0gUGFja2FnZXMub3JnLnczYy5kb20uTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU7JiN4ZDsKICAgIG5vZGV0eXBlLlRleHQgPSBQYWNrYWdlcy5vcmcudzNjLmRvbS5Ob2RlLlRFWFRfTk9ERTsmI3hkOwogICAgcmV0dXJuIG5vZGV0eXBlOyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiAoRW5naW5lIG9ubHkpIENvbnZlcnRzIGEgdW5pZGltZW5zaW9uYWwgSmF2YSBWZWN0b3Igd2hvc2UgZW50cmllcyBhcmUgc3RyaW5ncyB0byBhbiBFQ01BIEFycmF5LiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL2FwaS9qYXZhL3V0aWwvVmVjdG9yLmh0bWwmI3hkOwogICAqJiN4ZDsKICAgKiBAcGFyYW0gIHtqYXZhLnV0aWwuVmVjdG9yfSB2ICAgSmF2YSBWZWN0b3IuJiN4ZDsKICAgKiYjeGQ7CiAgICogQG1lbWJlcm9mIFBSRC51dGlsJiN4ZDsKICAgKiBAc2luY2UgMS4wLjAmI3hkOwogICAqJiN4ZDsKICAgKiBAdHlwZSB7c3RyaW5nW119JiN4ZDsKICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0gRUNNQSBhcnJheS4mI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gSmF2YVZlY3RvclRvRUNNQUFycmF5KCB2ICkgeyYjeGQ7CiAgICB2YXIgaXQsIHJlcyA9IFtdLCBmbmFtZTsmI3hkOwogICAgZm5hbWUgPSAnSmF2YVZlY3RvclRvRUNNQUFycmF5KCk6ICc7JiN4ZDsKICAgIGlmICggd2hlcmUgIT09ICdlbmdpbmUnICkgeyYjeGQ7CiAgICAgIGxvZ2Vycm9yKCBmbmFtZSArICdjYW4gb25seSBiZSB1c2VkIGluIHRoZSB3b3JrZmxvdyBlbmdpbmUuJyApOyYjeGQ7CiAgICAgIHJldHVybjsmI3hkOwogICAgfSYjeGQ7CiAgICBpZiAoIHYgIT0gbnVsbCAmYW1wOyZhbXA7IHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmYW1wOyZhbXA7IHYuc2l6ZSgpICZndDsgMCApIHsmI3hkOwogICAgICB0cnkgeyYjeGQ7CiAgICAgICAgaXQgPSB2Lml0ZXJhdG9yKCk7JiN4ZDsKICAgICAgICB3aGlsZSggaXQuaGFzTmV4dCgpICkgeyYjeGQ7CiAgICAgICAgICByZXMucHVzaCggU3RyaW5nKCBpdC5uZXh0KCkgKSApOyYjeGQ7CiAgICAgICAgfSYjeGQ7CiAgICAgIH0gY2F0Y2goIGUgKSB7JiN4ZDsKICAgICAgICBsb2dlcnJvciggZm5hbWUgKyAnRXJyb3IgY29udmVydGluZyBWZWN0b3IgaW50byBBcnJheTogJyArIGUubWVzc2FnZSApOyYjeGQ7CiAgICAgIH0mI3hkOwogICAgfSYjeGQ7CiAgICByZXR1cm4gcmVzOyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiAoRW5naW5lIG9ubHkpIENvbnZlcnRzIGEgdW5pZGltZW5zaW9uYWwgRUNNQSBhcnJheSB3aG9zZSBlbnRyaWVzIGFyZSBzdHJpbmdzIHRvIGEgSmF2YSBWZWN0b3IuJmx0O2JyLyZndDsmI3hkOwogICAqIGh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvYXBpL2phdmEvdXRpbC9WZWN0b3IuaHRtbCYjeGQ7CiAgIComI3hkOwogICAqIEBtZW1iZXJvZiBQUkQudXRpbCYjeGQ7CiAgICogQHNpbmNlIDEuMC4wJiN4ZDsKICAgKiYjeGQ7CiAgICogQHBhcmFtICB7c3RyaW5nW119IGFyciAgIEVDTUEgYXJyYXkuJiN4ZDsKICAgKiYjeGQ7CiAgICogQHR5cGUge2phdmEudXRpbC5WZWN0b3J9JiN4ZDsKICAgKiBAcmV0dXJuIHtqYXZhLnV0aWwuVmVjdG9yfSBKYXZhIFZlY3Rvci4mI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gRUNNQUFycmF5VG9KYXZhVmVjdG9yKCBhcnIgKSB7JiN4ZDsKICAgIHZhciBpLCByZXMsIGZuYW1lOyYjeGQ7CiAgICBmbmFtZSA9ICdFQ01BQXJyYXlUb0phdmFWZWN0b3IoKTogJzsmI3hkOwogICAgaWYgKCB3aGVyZSAhPT0gJ2VuZ2luZScgKSB7JiN4ZDsKICAgICAgbG9nZXJyb3IoIGZuYW1lICsgJ2NhbiBvbmx5IGJlIHVzZWQgaW4gdGhlIHdvcmtmbG93IGVuZ2luZS4nICk7JiN4ZDsKICAgICAgcmV0dXJuOyYjeGQ7CiAgICB9JiN4ZDsKICAgIHRyeSB7JiN4ZDsKICAgICAgcmVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsmI3hkOwogICAgICBmb3IgKCBpID0gMDsgaSAmbHQ7IGFyci5sZW5ndGg7IGkrKyApIHsmI3hkOwogICAgICAgIHJlcy5hZGQoIEpTdHJpbmcoIGFyclsgaSBdICkgKTsmI3hkOwogICAgICB9JiN4ZDsKICAgICAgcmV0dXJuIHJlczsmI3hkOwogICAgfSBjYXRjaCggZSApIHsmI3hkOwogICAgICBsb2dlcnJvciggZm5hbWUgKyAnRXJyb3IgY29udmVydGluZyBBcnJheSBpbnRvIFZlY3RvcjogJyArIGUubWVzc2FnZSApOyYjeGQ7CiAgICB9JiN4ZDsKICB9JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIFBlcmZvcm1zIGFuIElEVmF1bHQuZ2V0IGFuZCByZXR1cm5zIGFuIEVDTUEgYXJyYXkgd2l0aCB0aGUgcmVzdWx0LiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBSZWZhY3RvcmVkIG9uIHYxLjAuNCB0byByZXBsYWNlIHRoZSA0dGggb3B0aW9uYWwgcGFyYW1ldGVyIGZyb20gSURWYXVsdCBpbmplY3Rpb24gdG8gYSBmb3JtJ3MgZmllbGQgbmFtZS4mbHQ7YnIvJmd0OyYjeGQ7CiAgICogVGhpcyBjaGFuZ2UgY291bGQgYnJlYWsgZm9ybXMgdXNpbmcgcHJpb3IgdmVyc2lvbnMsIHBsZWFzZSBkb3VibGUgY2hlY2sgeW91ciBmb3JtIGNvZGUgYmVmb3JlIG1vdmluZyB0byB2MS4wLjQuJiN4ZDsKICAgKiYjeGQ7CiAgICogQG1lbWJlcm9mIFBSRCYjeGQ7CiAgICogQHNpbmNlIDEuMC4wJiN4ZDsKICAgKiYjeGQ7CiAgICogQHBhcmFtICB7c3RyaW5nfSAgbGRhcGRuICAgICAgIExEQVAgRnVsbHkgRGlzdGluZ3Vpc2VkIG5hbWUgb2YgdGhlIGVEaXJlY3Rvcnkgb2JqZWN0IHRvIGJlIHF1ZXJpZWQuJiN4ZDsKICAgKiBAcGFyYW0gIHtzdHJpbmd9ICBlbnRrZXkgICAgICAgREFMIGVudGl0eSBrZXkuJiN4ZDsKICAgKiBAcGFyYW0gIHtzdHJpbmd9ICBhdHRya2V5ICAgICAgREFMIGF0dHJpYnV0ZSBrZXkuIEF0dHJyaWJ1dGUgbXVzdCBiZSBjb25maWd1cmVkIHVuZGVyIHRoZSBEQUwgZW50aXR5LiYjeGQ7CiAgICogQHBhcmFtICB7c3RyaW5nPX0gW2ZpZWxkbmFtZV0gIChmb3JtIG1vZGUgb25seSkgTmFtZSBvZiB0aGUgZmllbGQgdG8gYmUgYXV0by1wb3B1bGF0ZWQgYnkgdGhlIGZ1bmN0aW9uLiYjeGQ7CiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIGZpZWxkIG5hbWUgZG9lcyBub3QgZXhpc3QgdGhlIGZvcm0gaXRzZWxmIHdpbGwgcHJlc2VudCB0aGUgZXJyb3I6JiN4ZDsKICAgKiAiQW4gZXJyb3IgJ0ZpZWxkIGF2b2NhZG8gbm90IGZvdW5kIG9yIG5vdCBpbnN0YW50aWF0ZWQgeWV0Licgd2FzIGVuY291bnRlcmVkIHdoaWxlIGV4ZWN1dGluZyB0aGUgc2NyaXB0ICdpbiBJRFZhdWx0LmdldCgpJyIuJiN4ZDsKICAgKiYjeGQ7CiAgICogQHR5cGUge3N0cmluZ1tdfSYjeGQ7CiAgICogQHJldHVybiB7c3RyaW5nW119IEVDTUEgYXJyYXkgd2l0aCB0aGUgcmVzdWx0cy4gRW1wdHkgaWYgSURWYXVsdC5nZXQgcmV0dXJuZWQgbnVsbCwgYXJyYXkgd2l0aCBvbmUgb3IgbW9yZSBlbGVtZW50cyBvdGhlcndpc2UuJiN4ZDsKICAgKi8mI3hkOwogIGZ1bmN0aW9uIElEVmdldCggbGRhcGRuLCBlbnRrZXksIGF0dHJrZXksIGZpZWxkbmFtZSApIHsmI3hkOwogICAgLy8gVmFyaWFibGUgZGVjbGFyYXRpb24uIEtlZXAgYWxsIHRoZSBkZWNsYXJhdGlvbnMgdG9nZXRoZXIuJiN4ZDsKICAgIHZhciBxcmVzID0gW107JiN4ZDsKICAgIHZhciBnYXR0ciwgZ2F0dHJWLCBlcnJtc2csIGZuYW1lOyYjeGQ7CiAgICBmbmFtZSA9ICdJRFZnZXQoKTogJzsmI3hkOwogICAgLy8gQWRqdXN0aW5nIGZ1bmN0aW9uIGlucHV0IHZhbHVlcyBiYXNlZCBvbiB3aGVyZSBpdCBpcyBiZWluZyBleGVjdXRlZC4mI3hkOwogICAgaWYgKCB3aGVyZSA9PT0gJ2VuZ2luZScgKSB7JiN4ZDsKICAgICAgSURWb2JqID0gSURWYXVsdDsmI3hkOwogICAgfSYjeGQ7CiAgICBpZiAoIHdoZXJlID09PSAnZm9ybScgKSB7JiN4ZDsKICAgICAgaWYgKCBJRE1BUFBTLklEVmF1bHQgIT09IG51bGwgKSB7JiN4ZDsKICAgICAgICBJRFZvYmogPSBJRE1BUFBTLklEVmF1bHQ7JiN4ZDsKICAgICAgfSBlbHNlIHsmI3hkOwogICAgICAgIGxvZ2Vycm9yKCBmbmFtZSArICdwbGVhc2UgdXNlIFBSRC5pbml0KCkgd2l0aCBhdCBsZWFzdCBJRFZhdWx0IGFzIGEgcGFyYW1ldGVyIHRvIGluaXRpYWxpemUgdGhlIG1hbmRhdG9yeSByZWZlcmVuY2UgdG8gdGhlIHNhbWUuIEFib3J0aW5nLicgKTsmI3hkOwogICAgICAgIHJldHVybiBxcmVzOyYjeGQ7CiAgICAgIH0mI3hkOwogICAgfSYjeGQ7CiAgICAvLyBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzLiYjeGQ7CiAgICBpZiAoIGxkYXBkbiA9PSBudWxsIHx8IGVudGtleSA9PSBudWxsIHx8IGF0dHJrZXkgPT0gbnVsbCApIHsmI3hkOwogICAgICBlcnJtc2cgPSBbXTsmI3hkOwogICAgICBlcnJtc2cucHVzaCggZm5hbWUgKyAnbWlzc2luZyBtYW5kYXRvcnkgcGFyYW1ldGVycy4nICk7JiN4ZDsKICAgICAgZXJybXNnLnB1c2goICdsZGFwZG46ICcgKyBTdHJpbmcoIGxkYXBkbiApICsgJywnICk7JiN4ZDsKICAgICAgZXJybXNnLnB1c2goICdlbnRrZXk6ICcgKyBTdHJpbmcoIGVudGtleSApICsgJywnICk7JiN4ZDsKICAgICAgZXJybXNnLnB1c2goICdhdHRya2V5OiAnICsgU3RyaW5nKCBhdHRya2V5ICkgKyAnLCcgKTsmI3hkOwogICAgICBsb2dlcnJvciggZXJybXNnLmpvaW4oICcgJyApICk7JiN4ZDsKICAgICAgcmV0dXJuIHFyZXM7JiN4ZDsKICAgIH0mI3hkOwogICAgbGRhcGRuID0gU3RyaW5nKCBsZGFwZG4gKTsgLy8gSXNzdWUgIzI0JiN4ZDsKICAgIGVudGtleSA9IFN0cmluZyggZW50a2V5ICk7IC8vIElzc3VlICMyNCYjeGQ7CiAgICBhdHRya2V5ID0gU3RyaW5nKCBhdHRya2V5ICk7IC8vIElzc3VlICMyNCYjeGQ7CiAgICAvLyBQZXJmb3JtcyB0aGUgcXVlcnkgYW5kIGhhbmRsZXMgZXJyb3JzJiN4ZDsKICAgIHRyeSB7JiN4ZDsKICAgICAgLy8gRnVuY3Rpb24gY2FsbCBwYXJhbWV0ZXJzIGFyZSBkaWZmZXJlbnQgYmV0d2VlbiBlbmdpbmUgYW5kIGZvcm0mI3hkOwogICAgICBpZiAoIHdoZXJlID09PSAnZm9ybScgKSB7JiN4ZDsKICAgICAgICBpZiAoIGZpZWxkbmFtZSA9PSBudWxsICkgeyYjeGQ7CiAgICAgICAgICBmaWVsZG5hbWUgPSBudWxsOyYjeGQ7CiAgICAgICAgfSYjeGQ7CiAgICAgICAgZ2F0dHIgPSBJRFZvYmouZ2V0KCBmaWVsZG5hbWUsIGxkYXBkbiwgZW50a2V5LCBhdHRya2V5ICk7JiN4ZDsKICAgICAgfSYjeGQ7CiAgICAgIGlmICggd2hlcmUgPT09ICdlbmdpbmUnICkgeyYjeGQ7CiAgICAgICAgZ2F0dHIgPSBJRFZvYmouZ2V0KCBsZGFwZG4sIGVudGtleSwgYXR0cmtleSApOyYjeGQ7CiAgICAgIH0mI3hkOwogICAgICAvLyBOb3JtYWxpemUgcmVzdWx0cyBpbnRvIGFuIEVDTUEgYXJyYXkmI3hkOwogICAgICBpZiAoIGdhdHRyID09PSBudWxsICkgeyYjeGQ7CiAgICAgICAgLy8gUXVlcnkgc3VjY2VlZGVkIHdpdGggMCByZXN1bHRzLiBTdHViIGxlZnQgaW4gY2FzZSB3ZSBuZWVkIHRvIGFkZCBkZWJ1ZyBtZXNzYWdlcy4mI3hkOwogICAgICB9IGVsc2UgaWYgKCBpc1N0cmluZyggZ2F0dHIgKSApIHsmI3hkOwogICAgICAgIC8vIFF1ZXJ5IHN1Y2NlZWRlZCB3aXRoIGEgc2luZ2xlIHJlc3VsdC4gQ2FzdHMgcmVzdWx0IGFzIGEgc2luZ2xlLWVsZW1lbnQgYXJyYXkgdG8gdGhlIHFyZXMgdmFyaWFibGUuJiN4ZDsKICAgICAgICBxcmVzLnB1c2goIGNvZXJjZVRvU3RyaW5nKCBnYXR0ciApICk7JiN4ZDsKICAgICAgfSBlbHNlIGlmICggd2hlcmUgPT09ICdmb3JtJyAmYW1wOyZhbXA7IGdhdHRyIGluc3RhbmNlb2YgQXJyYXkgKSB7JiN4ZDsKICAgICAgICAvLyBRdWVyeSBzdWNjZWVkZWQgd2l0aCAyIG9yIG1vcmUgcmVzdWx0cy4gU2F2ZXMgcmVzdWx0cyBkaXJlY3RseSB0byB0aGUgcXJlcyB2YXJpYWJsZS4mI3hkOwogICAgICAgIHFyZXMgPSBnYXR0cjsmI3hkOwogICAgICB9IGVsc2UgaWYgKCB3aGVyZSA9PT0gJ2VuZ2luZScgJmFtcDsmYW1wOyB0eXBlb2YgZ2F0dHIgPT09ICdvYmplY3QnICZhbXA7JmFtcDsgZ2F0dHIuc2l6ZSgpICZndDsgMCApIHsmI3hkOwogICAgICAgIC8vIFF1ZXJ5IHN1Y2NlZWRlZCB3aXRoIDIgb3IgbW9yZSByZXN1bHRzLiBTYXZlcyByZXN1bHRzIGRpcmVjdGx5IHRvIHRoZSBxcmVzIHZhcmlhYmxlLiYjeGQ7CiAgICAgICAgcXJlcyA9IEphdmFWZWN0b3JUb0VDTUFBcnJheSggZ2F0dHIgKTsmI3hkOwogICAgICB9JiN4ZDsKICAgIH0gY2F0Y2goIGUgKSB7JiN4ZDsKICAgICAgbG9nZXJyb3IoIGZuYW1lICsgJ0Vycm9yIG9jY3VyZWQgZHVyaW5nIElEVmF1bHQuZ2V0IHF1ZXJ5LiBBYm9ydGluZy4gRXJyb3IgbWVzc2FnZTogJyArIGUubWVzc2FnZSApOyYjeGQ7CiAgICB9JiN4ZDsKICAgIC8vIEZvcmNlIHRoZSByZXN1bHQgdG8gcmV0dXJuIGEgY29weSBvZiB0aGUgYXJyYXkuJiN4ZDsKICAgIHJldHVybiBxcmVzOyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiBQZXJmb3JtcyBhbiBJRFZhdWx0Lmdsb2JhbFF1ZXJ5IGFuZCByZXR1cm5zIGFuIG9iamVjdCB3aXRoIHRoZSByZXN1bHQuJmx0O2JyLyZndDsmI3hkOwogICAqIFJlZmFjdG9yZWQgb24gdjEuMC40IHRvIHJlcGxhY2UgdGhlIDR0aCBvcHRpb25hbCBwYXJhbWV0ZXIgZnJvbSBJRFZhdWx0IGluamVjdGlvbiB0byBhIGZvcm0ncyBmaWVsZCBuYW1lLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBUaGlzIGNoYW5nZSBjb3VsZCBicmVhayBmb3JtcyB1c2luZyBwcmlvciB2ZXJzaW9ucywgcGxlYXNlIGRvdWJsZSBjaGVjayB5b3VyIGZvcm0gY29kZSBiZWZvcmUgbW92aW5nIHRvIHYxLjAuNC4mI3hkOwogICAqJiN4ZDsKICAgKiBAbWVtYmVyb2YgUFJEJiN4ZDsKICAgKiBAc2luY2UgMS4wLjEmI3hkOwogICAqJiN4ZDsKICAgKiBAcGFyYW0gIHtzdHJpbmd9ICBkYWxxdWVyeWtleSAgREFMIFF1ZXJ5IGtleS4mI3hkOwogICAqIEBwYXJhbSAge29iamVjdH0gIHBhcmFtZXRlcnMgICBFQ01BIG9iamVjdCB3aXRoIHRoZSBwYXJhbXRlcnMgZGVmaW5lZCBpbiB0aGUgREFMIFF1ZXJ5LiB7cGFyYW1ldGVybmFtZTpwYXJhbWV0ZXJ2YWx1ZX0mI3hkOwogICAqIEBwYXJhbSAge29iamVjdD19IFtmaWVsZG5hbWVdICAoZm9ybSBtb2RlIG9ubHkpIE5hbWUgb2YgdGhlIGZpZWxkIHRvIGJlIGF1dG8tcG9wdWxhdGVkIGJ5IHRoZSBmdW5jdGlvbi4mI3hkOwogICAqJiN4ZDsKICAgKiBAdHlwZSB7c3RyaW5nW119JiN4ZDsKICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0gQXJyYXkgd2l0aCBMREFQIEROcyByZXR1cm5lZC4mI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gSURWZ2xvYmFsUXVlcnkoIGRhbHF1ZXJ5a2V5LCBwYXJhbWV0ZXJzLCBmaWVsZG5hbWUgKSB7JiN4ZDsKICAgIC8vIFZhcmlhYmxlIGRlY2xhcmF0aW9uLiBLZWVwIGFsbCB0aGUgZGVjbGFyYXRpb25zIHRvZ2V0aGVyLiYjeGQ7CiAgICB2YXIgcXJlcywgZ3FyLCBlcnJtc2csIHBjb252LCBmbmFtZSwga2V5LCBpLCB0cmVhdGVkcGFyYW1ldGVyczsmI3hkOwogICAgZm5hbWUgPSAnSURWZ2xvYmFsUXVlcnkoKTogJzsmI3hkOwogICAgcXJlcyA9IFtdOyYjeGQ7CiAgICBwY29udiA9ICcnOyYjeGQ7CiAgICB0cmVhdGVkcGFyYW1ldGVycyA9IHt9OyYjeGQ7CiAgICAvLyBBZGp1c3RpbmcgZnVuY3Rpb24gaW5wdXQgdmFsdWVzIGJhc2VkIG9uIHdoZXJlIGl0IGlzIGJlaW5nIGV4ZWN1dGVkLiYjeGQ7CiAgICBpZiAoIHdoZXJlID09PSAnZW5naW5lJyApIHsmI3hkOwogICAgICBJRFZvYmogPSBJRFZhdWx0OyYjeGQ7CiAgICB9JiN4ZDsKICAgIGlmICggd2hlcmUgPT09ICdmb3JtJyApIHsmI3hkOwogICAgICBpZiAoIElETUFQUFMuSURWYXVsdCAhPT0gbnVsbCApIHsmI3hkOwogICAgICAgIElEVm9iaiA9IElETUFQUFMuSURWYXVsdDsmI3hkOwogICAgICB9IGVsc2UgeyYjeGQ7CiAgICAgICAgbG9nZXJyb3IoIGZuYW1lICsgJ3BsZWFzZSB1c2UgUFJELmluaXQoKSB3aXRoIGF0IGxlYXN0IElEVmF1bHQgYXMgYSBwYXJhbWV0ZXIgdG8gaW5pdGlhbGl6ZSB0aGUgbWFuZGF0b3J5IHJlZmVyZW5jZSB0byB0aGUgc2FtZS4gQWJvcnRpbmcuJyApOyYjeGQ7CiAgICAgICAgcmV0dXJuIHFyZXM7JiN4ZDsKICAgICAgfSYjeGQ7CiAgICB9JiN4ZDsKICAgIC8vIENoZWNrIGlucHV0IHBhcmFtZXRlcnMuJiN4ZDsKICAgIGlmICggZGFscXVlcnlrZXkgPT0gbnVsbCB8fCBwYXJhbWV0ZXJzID09IG51bGwgKSB7JiN4ZDsKICAgICAgZXJybXNnID0gW107JiN4ZDsKICAgICAgZXJybXNnLnB1c2goIGZuYW1lICsgJ21pc3NpbmcgbWFuZGF0b3J5IHBhcmFtZXRlcnMuJyApOyYjeGQ7CiAgICAgIGVycm1zZy5wdXNoKCAnZGFscXVlcnlrZXk6ICcgKyBTdHJpbmcoIGRhbHF1ZXJ5a2V5ICkgKyAnLCcgKTsmI3hkOwogICAgICBpZiAoIHBhcmFtZXRlcnMgPT09IG51bGwgKSB7JiN4ZDsKICAgICAgICBwY29udiA9IFN0cmluZyggcGFyYW1ldGVycyApOyYjeGQ7CiAgICAgIH0gZWxzZSB7JiN4ZDsKICAgICAgICBwY29udiA9IEpTT05zdHJpbmdpZnkoIHBhcmFtZXRlcnMgKTsmI3hkOwogICAgICB9JiN4ZDsKICAgICAgZXJybXNnLnB1c2goICdwYXJhbWV0ZXJzOiAnICsgcGNvbnYgKyAnLCcgKTsmI3hkOwogICAgICBsb2dlcnJvciggZXJybXNnLmpvaW4oICcgJyApICk7JiN4ZDsKICAgICAgcmV0dXJuIHFyZXM7JiN4ZDsKICAgIH0mI3hkOwogICAgZGFscXVlcnlrZXkgPSBTdHJpbmcoIGRhbHF1ZXJ5a2V5ICk7IC8vICMyNCYjeGQ7CiAgICB0cmVhdGVkcGFyYW1ldGVycyA9IHt9OyAvLyAjMjQmI3hkOwogICAgZm9yICgga2V5IGluIHBhcmFtZXRlcnMgKSB7IC8vICMyNCAtIHRoZSB3aG9sZSBmb3IgaXRlcmF0aW9uLiYjeGQ7CiAgICAgIGlmICggcGFyYW1ldGVyc1sga2V5IF0gaW5zdGFuY2VvZiBBcnJheSApIHsmI3hkOwogICAgICAgIHRyZWF0ZWRwYXJhbWV0ZXJzWyBrZXkgXSA9IFtdOyYjeGQ7CiAgICAgICAgZm9yICggaSA9IDA7IGkgJmx0OyBwYXJhbWV0ZXJzWyBrZXkgXS5sZW5ndGg7IGkrKyApIHsmI3hkOwogICAgICAgICAgdHJlYXRlZHBhcmFtZXRlcnNbIGtleSBdLnB1c2goIFN0cmluZyggcGFyYW1ldGVyc1sga2V5IF1bIGkgXSApICk7JiN4ZDsKICAgICAgICB9JiN4ZDsKICAgICAgfSBlbHNlIHsmI3hkOwogICAgICAgIHRyZWF0ZWRwYXJhbWV0ZXJzWyBrZXkgXSA9IFN0cmluZyggcGFyYW1ldGVyc1sga2V5IF0gKTsmI3hkOwogICAgICB9JiN4ZDsKICAgIH0mI3hkOwogICAgLy8gUGVyZm9ybXMgdGhlIHF1ZXJ5IGFuZCBoYW5kbGVzIGVycm9ycyYjeGQ7CiAgICB0cnkgeyYjeGQ7CiAgICAgIC8vIEZ1bmN0aW9uIGNhbGwgcGFyYW1ldGVycyBhcmUgZGlmZmVyZW50IGJldHdlZW4gZW5naW5lIGFuZCBmb3JtLCBhcyBhcmUgcmV0dXJuIHR5cGVzLiYjeGQ7CiAgICAgIGlmICggd2hlcmUgPT09ICdmb3JtJyApIHsmI3hkOwogICAgICAgIGlmICggZmllbGRuYW1lID09IG51bGwgKSB7JiN4ZDsKICAgICAgICAgIGZpZWxkbmFtZSA9IG51bGw7JiN4ZDsKICAgICAgICB9JiN4ZDsKICAgICAgICBncXIgPSBJRFZvYmouZ2xvYmFsUXVlcnkoIGZpZWxkbmFtZSwgZGFscXVlcnlrZXksIHBhcmFtZXRlcnMgKTsmI3hkOwogICAgICAgIGlmICggZ3FyIGluc3RhbmNlb2YgQXJyYXkgJmFtcDsmYW1wOyBncXJbIDAgXSBpbnN0YW5jZW9mIEFycmF5ICZndDsgMCAmYW1wOyZhbXA7IGdxclsgMCBdWyAwIF0gIT0gJycgKSB7JiN4ZDsKICAgICAgICAgIHFyZXMgPSBncXJbIDAgXTsmI3hkOwogICAgICAgIH0mI3hkOwogICAgICB9JiN4ZDsKICAgICAgaWYgKCB3aGVyZSA9PT0gJ2VuZ2luZScgKSB7JiN4ZDsKICAgICAgICBncXIgPSBJRFZvYmouZ2xvYmFsUXVlcnkoIGRhbHF1ZXJ5a2V5LCBwYXJhbWV0ZXJzICk7JiN4ZDsKICAgICAgICBpZiAoIGdxciAhPSBudWxsICZhbXA7JmFtcDsgZ3FyLnNpemUoKSAmZ3Q7IDAgKSB7JiN4ZDsKICAgICAgICAgIHFyZXMgPSBKYXZhVmVjdG9yVG9FQ01BQXJyYXkoIGdxciApOyYjeGQ7CiAgICAgICAgfSYjeGQ7CiAgICAgIH0mI3hkOwogICAgfSBjYXRjaCAoIGUgKSB7JiN4ZDsKICAgICAgbG9nZXJyb3IoIGZuYW1lICsgJ0Vycm9yIG9jY3VyZWQgZHVyaW5nIElEVmF1bHQuZ2xvYmFsUXVlcnkgLiBBYm9ydGluZy4gRXJyb3IgbWVzc2FnZTogJyArIGUubWVzc2FnZSApOyYjeGQ7CiAgICB9JiN4ZDsKICAgIHJldHVybiBxcmVzOyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiAoRW5naW5lIG9ubHkpIFdyYXBlciBmb3IgR0NWLmdldCAuIEF0dGVtcHRzIHRvIHJldHJpZXZlIHRoZSBHQ1YgdmFsdWUuIHJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgKG9yICcnIGlmIG5vIGRlZmF1bHQgcHJvdmlkZWQpJiN4ZDsKICAgKiBAbWVtYmVyb2YgUFJELnV0aWwmI3hkOwogICAqIEBzaW5jZSAxLjAuMiYjeGQ7CiAgIComI3hkOwogICAqIEBwYXJhbSB7c3RyaW5nfSAgIEdDVm5hbWUgICAgICAgICBOYW1lIG9mIHRoZSBHQ1YgdG8gYmUgcmV0cmlldmVkLiYjeGQ7CiAgICogQHBhcmFtIHtzdHJpbmc9fSAgW3JldHVyblR5cGVdICAgICdzdHJpbmcnLCAnbnVtYmVyJyBvciAnYm9vbGVhbicuIEZvcmNlcyBjb2VyY2lvbiB0byBzYWlkIHR5cGUgZm9yIHRoZSByZXR1cm4uJiN4ZDsKICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gJ3N0cmluZycgaWYgbm90IHByb3ZpZGVkIG9yIGFueSBvdGhlciB2YWx1ZS4mI3hkOwogICAqIEBwYXJhbSB7c3RyaW5nPX0gIFtEZWZhdWx0VmFsdWVdICBEZWZhdWx0IHZhbHVlIHRvIGJlIHVzZWQgaWYgdGhlIEdDVi5nZXQoKSBmYWlscy4gRGVmYXVsdHMgdG8gJycgaWYgbm90IHByb3ZpZGVkLiYjeGQ7CiAgICogQHJldHVybiB7KHN0cmluZ3xudW1iZXJ8Ym9vbGVhbil9IEdDVi5nZXQgcmVzdWx0IG9yIGRlZmF1bHQgdmFsdWUuJiN4ZDsKICAgKi8mI3hkOwogIGZ1bmN0aW9uIEdDVmdldCggR0NWbmFtZSwgcmV0dXJuVHlwZSwgRGVmYXVsdFZhbHVlICkgeyYjeGQ7CiAgICB2YXIgcmV0LCBkZWZ2YWwgPSAnJywgZm5hbWU7JiN4ZDsKICAgIGZuYW1lID0gJ0dDVmdldCgpOiAnOyYjeGQ7CiAgICBpZiAoIERlZmF1bHRWYWx1ZSAhPSBudWxsICkgeyYjeGQ7CiAgICAgIGRlZnZhbCA9IFN0cmluZyggRGVmYXVsdFZhbHVlICk7JiN4ZDsKICAgIH0mI3hkOwogICAgaWYgKCBHQ1ZuYW1lICE9IG51bGwgJmFtcDsmYW1wOyBHQ1ZuYW1lICE9PSAnJyApIHsmI3hkOwogICAgICBHQ1ZuYW1lID0gU3RyaW5nKCBHQ1ZuYW1lICk7JiN4ZDsKICAgICAgdHJ5IHsmI3hkOwogICAgICAgIHJldCA9IEdDVi5nZXQoIEdDVm5hbWUgKTsmI3hkOwogICAgICB9IGNhdGNoICggZSApIHsmI3hkOwogICAgICAgIGxvZ2Vycm9yKCBmbmFtZSArICdGYWlsZWQgdG8gcmV0cmlldmUgdmFsdWUgZm9yIEdDViAiJyArIEdDVm5hbWUgKyAnIiwgRXJyb3I6ICcgKyBlLm1lc3NhZ2UgKTsmI3hkOwogICAgICB9JiN4ZDsKICAgIH0gZWxzZSB7JiN4ZDsKICAgICAgbG9nZXJyb3IoIGZuYW1lICsgJ0dDVm5hbWUgbm90IHByb3ZpZGVkLicgKTsmI3hkOwogICAgfSYjeGQ7CiAgICAvLyBGYWlsZWQgdG8gcmV0cmlldmUgdGhlIEdDViYjeGQ7CiAgICBpZiAoISByZXQgKSB7JiN4ZDsKICAgICAgbG9nZXJyb3IoIGZuYW1lICsgJ0dDVi5nZXQoICInICsgR0NWbmFtZSArICciICkgcmV0dXJuZWQgbnVsbCB2YWx1ZS4gUGxlYXNlIG1ha2Ugc3VyZSB0aGUgc2FtZSBpcyBhdmFpbGFibGUgb24gdGhlIFVzZXIgQXBwbGljYXRpb24gZHJpdmVyJyApOyYjeGQ7CiAgICAgIHJldCA9IGRlZnZhbDsmI3hkOwogICAgfSYjeGQ7CiAgICAvLyBDb2VyY2UgcmVzdWx0IGFzIHdlIHJldHVybiBpdC4mI3hkOwogICAgc3dpdGNoKCBTdHJpbmcoIHJldHVyblR5cGUgKSApIHsmI3hkOwogICAgICBjYXNlICdib29sZWFuJzomI3hkOwogICAgICAgIHJldHVybiBCb29sZWFuKCByZXQgKTsmI3hkOwogICAgICBjYXNlICdudW1iZXInOiYjeGQ7CiAgICAgICAgcmV0dXJuIE51bWJlciggcmV0ICk7JiN4ZDsKICAgICAgZGVmYXVsdDogLy8gY2FzZSAnc3RyaW5nJyBvdmVybGFwcyB3aXRoIHRoaXMgb25lJiN4ZDsKICAgICAgICByZXR1cm4gU3RyaW5nKCByZXQgKTsmI3hkOwogICAgfSYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiAoRW5naW5lIG9ubHkpIFdyYXBlciBmb3IgR0NWLmdldFZhbHVlRm9yTmFtZWRQYXNzd29yZC4gQXR0ZW1wdHMgdG8gcmV0cmlldmUgdGhlJiN4ZDsKICAgKiBuYW1lZCBwYXNzd29yZCB2YWx1ZSB1c2luZyBhIEdDVi1yZWYgYXMgdGhlIGJyaWRnZSBmb3IgdGhlIHNhbWUuJmx0O2JyLyZndDsmI3hkOwogICAqIElmIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIHRydWUgYW5kIHRoZSBuYW1lZCBwYXNzd29yZCByZWFkIGZhaWxzIHRoZSBmdW5jdGlvbiBhdHRlbXBzJiN4ZDsKICAgKiB1cCB0byA1IHJldHJpZXMgd2l0aCAxIHNlY29uZCBwYXVzZSBpbiBiZXR3ZWVuIHRoZW0uJiN4ZDsKICAgKiYjeGQ7CiAgICogQG1lbWJlcm9mIFBSRC51dGlsJiN4ZDsKICAgKiBAc2luY2UgMS4wLjImI3hkOwogICAqJiN4ZDsKICAgKiBAcGFyYW0ge3N0cmluZ30gIE5hbWVkUGFzc3dvcmQgIE5hbWUgb2YgdGhlIEdDVi1yZWYgdG8gdGhlIE5hbWVkIFBhc3N3b3JkIHRvIGJlIHJldHJpZXZlZC4mI3hkOwogICAqIEBwYXJhbSB7YW55PX0gICAgW3RyeTV0aW1lc10gICAgSWYgbm90IHByb3ZpZGVkIG9yIG51bGwgYSBzaW5nbGUgcmVhZCBpcyBhdHRlbXB0ZWQuJiN4ZDsKICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHByb3ZpZGVzIGFuZCByZWFkIGZhaWxzIHRyeSA0IG1vcmUgdGltZXMsIHdpdGggMSBzZWNvbmQgcGF1c2UgYmV0d2VlbiB0aGVtLiYjeGQ7CiAgICogQHJldHVybiB7KHN0cmluZ3xudWxsKX0gR0NWLmdldFZhbHVlRm9yTmFtZWRQYXNzd29yZCByZXN1bHQgb3IgbnVsbC4mI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gZ2V0TmFtZWRQYXNzd29yZCggTmFtZWRQYXNzd29yZCwgdHJ5NXRpbWVzICkgeyYjeGQ7CiAgICB2YXIgaSwgcmV0ID0gbnVsbCwgZm5hbWU7JiN4ZDsKICAgIGZuYW1lID0gJ2dldE5hbWVkUGFzc3dvcmQoKTogJzsmI3hkOwogICAgaWYgKCBOYW1lZFBhc3N3b3JkICE9IG51bGwgJmFtcDsmYW1wOyBOYW1lZFBhc3N3b3JkICE9PSAnJyApIHsmI3hkOwogICAgICBOYW1lZFBhc3N3b3JkID0gU3RyaW5nKCBOYW1lZFBhc3N3b3JkICk7JiN4ZDsKICAgICAgaWYgKCB0cnk1dGltZXMgIT0gbnVsbCApIHsmI3hkOwogICAgICAgIC8vIFRoaXMgYXBwcm9hY2ggd2lsbCBob2xkIHRoZSBKYXZhIHRocmVhZCB1cCB0byA1IHNlY29uZHMsIHBvc3NpYmx5IGNhdXNpbmcgcmVzb3VyY2UgY29udGVudGlvbiYjeGQ7CiAgICAgICAgLy8gb24gdGhlIHdvcmtmbG93IGVuZ2luZS4gUnVsZSBvZiB0aHVtYiB3ZSBzaG91bGQgYXZvaWQgdXNpbmcgamF2YS5sYW5nLlRocmVhZC5zbGVlcCgpIGluc2lkZSB3b3JrZmxvd3MmI3hkOwogICAgICAgIC8vIG9uIHN5c3RlbXMgd2l0aCBtZWRpdW0gdG8gbGFyZ2UgbG9hZC4mI3hkOwogICAgICAgIHRyeTV0aW1lczogeyYjeGQ7CiAgICAgICAgICBmb3IgKCBpID0gMDsgaSAmbHQ7IDU7IGkrKyApeyYjeGQ7CiAgICAgICAgICAgIHRyeSB7JiN4ZDsKICAgICAgICAgICAgICByZXQgPSBHQ1YuZ2V0VmFsdWVGb3JOYW1lZFBhc3N3b3JkKCBOYW1lZFBhc3N3b3JkICk7JiN4ZDsKICAgICAgICAgICAgfSBjYXRjaCAoIGUgKSB7JiN4ZDsKICAgICAgICAgICAgICBsb2dlcnJvciggZm5hbWUgKyAnRmFpbGVkIHRvIHJldHJpZXZlIHZhbHVlIGZvciBOYW1lZCBQYXNzd29yZCAiJyArIE5hbWVkUGFzc3dvcmQgKyAnIiwgRXJyb3I6ICcgKyBlLm1lc3NhZ2UgKTsmI3hkOwogICAgICAgICAgICB9JiN4ZDsKICAgICAgICAgICAgaWYgKCByZXQgIT0gbnVsbCAmYW1wOyZhbXA7IHJldCAhPT0gJycgKSB7JiN4ZDsKICAgICAgICAgICAgICBicmVhayB0cnk1dGltZXM7JiN4ZDsKICAgICAgICAgICAgfSYjeGQ7CiAgICAgICAgICAgIC8vIDEgc2Vjb25kIGRlbGF5JiN4ZDsKICAgICAgICAgICAgdHJ5IHsmI3hkOwogICAgICAgICAgICAgIGxvZ2Vycm9yKCBmbmFtZSArICdGYWlsZWQgYXR0ZW1wdCAnICsgKGkrMSkgKyAnIHRvIHJldHJpZXZlIE5hbWVkIFBhc3N3b3JkICInICsgTmFtZWRQYXNzd29yZCArICciLiBQYXVzaW5nIGZvciAxIHNlY29uZCB0aGVuIHJldHJ5aW5nLicgKTsmI3hkOwogICAgICAgICAgICAgIGphdmEubGFuZy5UaHJlYWQuc2xlZXAoIDEwMDAgKTsmI3hkOwogICAgICAgICAgICB9IGNhdGNoICggZSApIHsmI3hkOwogICAgICAgICAgICAgIGxvZ2Vycm9yKCBmbmFtZSArICdBbmQgbm93IGZhaWxlZCB0byB0cnkgYW5kIHBhdXNlIGZvciBhIHNlY29uZCBhcyB3ZWxsLiBFcnJvcjogJyArIGUubWVzc2FnZSApOyYjeGQ7CiAgICAgICAgICAgIH0mI3hkOwogICAgICAgICAgfSYjeGQ7CiAgICAgICAgfSYjeGQ7CiAgICAgIH0gZWxzZSB7JiN4ZDsKICAgICAgICB0cnkgeyYjeGQ7CiAgICAgICAgICByZXQgPSBHQ1YuZ2V0VmFsdWVGb3JOYW1lZFBhc3N3b3JkKCBOYW1lZFBhc3N3b3JkICk7JiN4ZDsKICAgICAgICB9IGNhdGNoICggZSApIHsmI3hkOwogICAgICAgICAgbG9nZXJyb3IoIGZuYW1lICsgJ0ZhaWxlZCB0byByZXRyaWV2ZSB2YWx1ZSBmb3IgTmFtZWQgUGFzc3dvcmQgIicgKyBOYW1lZFBhc3N3b3JkICsgJyIsIEVycm9yOiAnICsgZS5tZXNzYWdlICk7JiN4ZDsKICAgICAgICB9JiN4ZDsKICAgICAgfSYjeGQ7CiAgICB9IGVsc2UgeyYjeGQ7CiAgICAgIGxvZ2Vycm9yKCBmbmFtZSArICdOYW1lZFBhc3N3b3JkIG5vdCBwcm92aWRlZC4nICk7JiN4ZDsKICAgIH0mI3hkOwogICAgLy8gRmFpbGVkIHRvIHJldHJpZXZlIHRoZSBHQ1YmI3hkOwogICAgaWYgKCEgcmV0ICkgeyYjeGQ7CiAgICAgIGxvZ2Vycm9yKCBmbmFtZSArICdHQ1YuZ2V0VmFsdWVGb3JOYW1lZFBhc3N3b3JkKCAiJyArIE5hbWVkUGFzc3dvcmQgKyAnIiApIHJldHVybmVkIG51bGwgdmFsdWUuIFBsZWFzZSBtYWtlIHN1cmUgdGhlIHNhbWUgaXMgYXZhaWxhYmxlIG9uIHRoZSBVc2VyIEFwcGxpY2F0aW9uIGRyaXZlcicgKTsmI3hkOwogICAgICByZXR1cm4gJyc7JiN4ZDsKICAgIH0mI3hkOwogICAgcmV0dXJuIHJldDsmI3hkOwogIH0mI3hkOwomI3hkOwogIC8vIEVuZ2luZS1vbmx5IEFQSSBleHRlbnNpb25zOiYjeGQ7CiAgaWYgKCB3aGVyZSA9PT0gJ2VuZ2luZScgKSB7JiN4ZDsKICAgIFB1YmxpY0FQSS51dGlsLkphdmFWZWN0b3JUb0VDTUFBcnJheSA9IEphdmFWZWN0b3JUb0VDTUFBcnJheTsmI3hkOwogICAgUHVibGljQVBJLnV0aWwuRUNNQUFycmF5VG9KYXZhVmVjdG9yID0gRUNNQUFycmF5VG9KYXZhVmVjdG9yOyYjeGQ7CiAgICBQdWJsaWNBUEkudXRpbC5HQ1ZnZXQgPSBHQ1ZnZXQ7JiN4ZDsKICAgIFB1YmxpY0FQSS51dGlsLmdldE5hbWVkUGFzc3dvcmQgPSBnZXROYW1lZFBhc3N3b3JkOyYjeGQ7CiAgICBQdWJsaWNBUEkudXRpbC5nZXRPYmplY3QyYXJyID0gZ2V0T2JqZWN0MmFycjsmI3hkOwogICAgUHVibGljQVBJLnV0aWwuYmFzaWNIVFRQYXV0aEhlYWRlciA9IGJhc2ljSFRUUGF1dGhIZWFkZXI7JiN4ZDsKICAgIFB1YmxpY0FQSS51dGlsLnNob3VsZFJldHJ5ID0gc2hvdWxkUmV0cnk7JiN4ZDsKICAgIFB1YmxpY0FQSS51dGlsLmlzSmF2YVZlY3RvciA9IGlzSmF2YVZlY3RvcjsmI3hkOwogIH0mI3hkOwogIC8vIEZvcm0tb25seSBBUEkgZXh0ZW5zaW9uczomI3hkOwogIGlmICggd2hlcmUgPT09ICdmb3JtJyApIHsmI3hkOwogICAgUHVibGljQVBJLmluaXQgPSBmb3JtSW5pdDsmI3hkOwogICAgUHVibGljQVBJLnV0aWwuaW50ZXJzZWN0QXJyYXlzID0gaW50ZXJzZWN0QXJyYXlzOyYjeGQ7CiAgICBQdWJsaWNBUEkud2ViID0geyYjeGQ7CiAgICAgIGZpZWxkVmlzaWJpbGl0eTpmaWVsZFZpc2liaWxpdHkmI3hkOwogICAgfTsmI3hkOwogIH0mI3hkOwomI3hkOwogIHJldHVybiBQdWJsaWNBUEk7JiN4ZDsKfSkoICc9PT0mZ3Q7ICcpOzwvZWNtYS1zY3JpcHQ+CiAgICAgICAgPC9pbXBvcnQtc2NyaXB0PgogICAgICAgIDxkYXRhLWl0ZW0KICAgICAgICBkYXRhLXR5cGU9InN0cmluZyIgbmFtZT0iRGF0YUVudHJ5IgogICAgICAgIHRhcmdldD0iZmxvd2RhdGEuU3RhcnQvcmVxdWVzdF9mb3JtL0RhdGFFbnRyeSIKICAgICAgICB0YXJnZXQtdHlwZT0ic2luZ2xlLXZhbHVlIi8+CiAgICAgICAgPGltcG9ydC1zY3JpcHQKICAgICAgICBpbmxpbmU9InRydWUiPgogICAgICAgICAgICA8ZWNtYS1zY3JpcHQ+LyogMDEtZ2xvYmFsLXBvbHlmaWxscyByZXYgMjAxNzEyMjggKi8mI3hkOwomI3hkOwovLyBWaWEgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvbWFwJiN4ZDsKLy8gTW9kaWZpZWQgdG8gcmVtb3ZlIGVycm9yIHRocm93cyYjeGQ7CmlmICghQXJyYXkucHJvdG90eXBlLm1hcCkgeyYjeGQ7CglBcnJheS5wcm90b3R5cGUubWFwID0gZnVuY3Rpb24oY2FsbGJhY2ssIHRoaXNBcmcpIHsmI3hkOwoJCXZhciBULCBBLCBrOyYjeGQ7CiYjeGQ7CgkJaWYgKHRoaXMgPT09IG51bGwpIHsmI3hkOwoJCQlqYXZhLmxhbmcuU3lzdGVtLm91dC5wcmludGxuKCJBbiBlcnJvciBvY2N1cnJlZCB3aXRoaW4gdGhlIEFycmF5LnByb3RvdHlwZS5tYXAoKSBwb2x5ZmlsbDogdGhlIGFycmF5ID09PSBudWxsLiIpOyYjeGQ7CgkJCXJldHVybiBudWxsOyYjeGQ7CgkJfSYjeGQ7CiYjeGQ7CgkJdmFyIE8gPSBPYmplY3QodGhpcyk7JiN4ZDsKJiN4ZDsKCQl2YXIgbGVuID0gTy5sZW5ndGggJmd0OyZndDsmZ3Q7IDA7JiN4ZDsKJiN4ZDsKCQlpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7JiN4ZDsKCQkJamF2YS5sYW5nLlN5c3RlbS5vdXQucHJpbnRsbigiQW4gZXJyb3Igb2NjdXJyZWQgd2l0aGluIHRoZSBBcnJheS5wcm90b3R5cGUubWFwKCkgcG9seWZpbGw6IHRoZSBjYWxsYmFjayAhPT0gYSBmdW5jdGlvbi4iKTsmI3hkOwoJCQlyZXR1cm4gbnVsbDsmI3hkOwoJCX0mI3hkOwomI3hkOwoJCWlmIChhcmd1bWVudHMubGVuZ3RoICZndDsgMSkgeyYjeGQ7CgkJCVQgPSB0aGlzQXJnOyYjeGQ7CgkJfSYjeGQ7CiYjeGQ7CgkJQSA9IG5ldyBBcnJheShsZW4pOyYjeGQ7CiYjeGQ7CgkJayA9IDA7JiN4ZDsKJiN4ZDsKCQl3aGlsZSAoayAmbHQ7IGxlbikgeyYjeGQ7CgkJCXZhciBrVmFsdWUsIG1hcHBlZFZhbHVlOyYjeGQ7CgkJCWlmIChrIGluIE8pIHsmI3hkOwoJCQkJa1ZhbHVlID0gT1trXTsmI3hkOwoJCQkJbWFwcGVkVmFsdWUgPSBjYWxsYmFjay5jYWxsKFQsIGtWYWx1ZSwgaywgTyk7JiN4ZDsKJiN4ZDsKCQkJCUFba10gPSBtYXBwZWRWYWx1ZTsmI3hkOwoJCQl9JiN4ZDsKCQkJaysrOyYjeGQ7CgkJfSYjeGQ7CiYjeGQ7CgkJcmV0dXJuIEE7JiN4ZDsKCX07JiN4ZDsKfSYjeGQ7CiYjeGQ7Ci8vIFByb2R1Y3Rpb24gc3RlcHMgb2YgRUNNQS0yNjIsIEVkaXRpb24gNSwgMTUuNC40LjE0JiN4ZDsKLy8gUmVmZXJlbmNlOiBodHRwOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjQuNC4xNCYjeGQ7CiYjeGQ7Ci8vIFVzZXJhcHAgaGFzIGEgYnVnZ3kgaW1wbGVtZW50YXRpb24sIHdlIHdhbnQgdG8gaW50ZW50aW9uYWxseSBvdmVyd3JpdGUgaXQ6JiN4ZDsKLy8gaWYgKCFBcnJheS5wcm90b3R5cGUuaW5kZXhPZikgeyYjeGQ7CkFycmF5LnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24oc2VhcmNoRWxlbWVudCwgZnJvbUluZGV4KSB7JiN4ZDsKJiN4ZDsKCWlmICh0aGlzID09PSBudWxsKSB7JiN4ZDsKCQlqYXZhLmxhbmcuU3lzdGVtLm91dC5wcmludGxuKCJBbiBlcnJvciBvY2N1cnJlZCB3aXRoaW4gdGhlIEFycmF5LnByb3RvdHlwZS5pbmRleE9mKCkgcG9seWZpbGw6IHRoZSBhcnJheSA9PT0gbnVsbC4iKTsmI3hkOwoJCXJldHVybiAtMTsmI3hkOwoJfSYjeGQ7CiYjeGQ7Cgl2YXIgTyA9IE9iamVjdCh0aGlzKTsmI3hkOwomI3hkOwoJdmFyIGxlbiA9IE8ubGVuZ3RoICZndDsmZ3Q7Jmd0OyAwOyYjeGQ7CiYjeGQ7CglpZiAobGVuID09PSAwKSB7JiN4ZDsKCQlqYXZhLmxhbmcuU3lzdGVtLm91dC5wcmludGxuKCJBbiBlcnJvciBvY2N1cnJlZCB3aXRoaW4gdGhlIEFycmF5LnByb3RvdHlwZS5pbmRleE9mKCkgcG9seWZpbGw6IHRoZSBhcnJheSBsZW5ndGggPT09IDAuIik7JiN4ZDsKCQlyZXR1cm4gLTE7JiN4ZDsKCX0mI3hkOwomI3hkOwoJdmFyIG4gPSArZnJvbUluZGV4IHx8IDA7JiN4ZDsKJiN4ZDsKCWlmIChNYXRoLmFicyhuKSA9PT0gSW5maW5pdHkpIHsmI3hkOwoJCW4gPSAwOyYjeGQ7Cgl9JiN4ZDsKJiN4ZDsKCWlmIChuICZndDs9IGxlbikgeyYjeGQ7CgkJamF2YS5sYW5nLlN5c3RlbS5vdXQucHJpbnRsbigiQW4gZXJyb3Igb2NjdXJyZWQgd2l0aGluIHRoZSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZigpIHBvbHlmaWxsOiBuICZndDs9IGxlbi4iKTsmI3hkOwoJCXJldHVybiAtMTsmI3hkOwoJfSYjeGQ7CiYjeGQ7CgkvLyBNb2RpZmllZCBiZWNhdXNlIFVzZXJhcHAgY2hva2VzIG9uICd3aGlsZSc6JiN4ZDsKCWZvciAodmFyIGkgPSAwOyBpICZsdDsgbGVuOyBpKyspIHsmI3hkOwoJCWlmIChPW2ldID09PSBzZWFyY2hFbGVtZW50KSB7JiN4ZDsKCQkJcmV0dXJuIGk7JiN4ZDsKCQl9JiN4ZDsKCX0mI3hkOwoJcmV0dXJuIC0xOyYjeGQ7Cn07JiN4ZDsKLy8gfSYjeGQ7CiYjeGQ7Ci8vIFZpYSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9maWx0ZXImI3hkOwovLyBNb2RpZmllZCB0byByZW1vdmUgZXJyb3IgdGhyb3dzJiN4ZDsKaWYgKCFBcnJheS5wcm90b3R5cGUuZmlsdGVyKSB7JiN4ZDsKCUFycmF5LnByb3RvdHlwZS5maWx0ZXIgPSBmdW5jdGlvbihmdW4gLyosIHRoaXNBcmcqLyApIHsmI3hkOwoJCSd1c2Ugc3RyaWN0JzsmI3hkOwomI3hkOwoJCWlmICh0aGlzID09PSB2b2lkIDAgfHwgdGhpcyA9PT0gbnVsbCkgeyYjeGQ7CgkJCWphdmEubGFuZy5TeXN0ZW0ub3V0LnByaW50bG4oIkFuIGVycm9yIG9jY3VycmVkIHdpdGhpbiB0aGUgQXJyYXkucHJvdG90eXBlLmZpbHRlcigpIHBvbHlmaWxsOiB0aGUgYXJyYXkgPT09IG51bGwuIik7JiN4ZDsKCQkJcmV0dXJuIG51bGw7JiN4ZDsKCQl9JiN4ZDsKJiN4ZDsKCQl2YXIgdCA9IE9iamVjdCh0aGlzKTsmI3hkOwoJCXZhciBsZW4gPSB0Lmxlbmd0aCAmZ3Q7Jmd0OyZndDsgMDsmI3hkOwoJCWlmICh0eXBlb2YgZnVuICE9PSAnZnVuY3Rpb24nKSB7JiN4ZDsKCQkJamF2YS5sYW5nLlN5c3RlbS5vdXQucHJpbnRsbigiQW4gZXJyb3Igb2NjdXJyZWQgd2l0aGluIHRoZSBBcnJheS5wcm90b3R5cGUuZmlsdGVyKCkgcG9seWZpbGw6IHRoZSBjYWxsYmFjayAhPT0gYSBmdW5jdGlvbi4iKTsmI3hkOwoJCQlyZXR1cm4gbnVsbDsmI3hkOwoJCX0mI3hkOwomI3hkOwoJCXZhciByZXMgPSBbXTsmI3hkOwoJCXZhciB0aGlzQXJnID0gYXJndW1lbnRzLmxlbmd0aCAmZ3Q7PSAyID8gYXJndW1lbnRzWzFdIDogdm9pZCAwOyYjeGQ7CgkJZm9yICh2YXIgaSA9IDA7IGkgJmx0OyBsZW47IGkrKykgeyYjeGQ7CgkJCWlmIChpIGluIHQpIHsmI3hkOwoJCQkJdmFyIHZhbCA9IHRbaV07JiN4ZDsKJiN4ZDsKCQkJCS8vIE5PVEU6IFRlY2huaWNhbGx5IHRoaXMgc2hvdWxkIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBhdCYjeGQ7CgkJCQkvLyAgICAgICB0aGUgbmV4dCBpbmRleCwgYXMgcHVzaCBjYW4gYmUgYWZmZWN0ZWQgYnkmI3hkOwoJCQkJLy8gICAgICAgcHJvcGVydGllcyBvbiBPYmplY3QucHJvdG90eXBlIGFuZCBBcnJheS5wcm90b3R5cGUuJiN4ZDsKCQkJCS8vICAgICAgIEJ1dCB0aGF0IG1ldGhvZCdzIG5ldywgYW5kIGNvbGxpc2lvbnMgc2hvdWxkIGJlJiN4ZDsKCQkJCS8vICAgICAgIHJhcmUsIHNvIHVzZSB0aGUgbW9yZS1jb21wYXRpYmxlIGFsdGVybmF0aXZlLiYjeGQ7CgkJCQlpZiAoZnVuLmNhbGwodGhpc0FyZywgdmFsLCBpLCB0KSkgeyYjeGQ7CgkJCQkJcmVzLnB1c2godmFsKTsmI3hkOwoJCQkJfSYjeGQ7CgkJCX0mI3hkOwoJCX0mI3hkOwomI3hkOwoJCXJldHVybiByZXM7JiN4ZDsKCX07JiN4ZDsKfSYjeGQ7CiYjeGQ7Ci8vIFByb2R1Y3Rpb24gc3RlcHMgb2YgRUNNQS0yNjIsIEVkaXRpb24gNSwgMTUuNC40LjIxJiN4ZDsKLy8gUmVmZXJlbmNlOiBodHRwOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjQuNC4yMSYjeGQ7CmlmICghQXJyYXkucHJvdG90eXBlLnJlZHVjZSkgeyYjeGQ7CglBcnJheS5wcm90b3R5cGUucmVkdWNlID0gZnVuY3Rpb24oY2FsbGJhY2sgLyosIGluaXRpYWxWYWx1ZSovICkgeyYjeGQ7CgkJJ3VzZSBzdHJpY3QnOyYjeGQ7CgkJaWYgKHRoaXMgPT09IG51bGwpIHsmI3hkOwoJCQlqYXZhLmxhbmcuU3lzdGVtLm91dC5wcmludGxuKCJBbiBlcnJvciBvY2N1cnJlZCB3aXRoaW4gdGhlIEFycmF5LnByb3RvdHlwZS5yZWR1Y2UoKSBwb2x5ZmlsbDogdGhlIGFycmF5ID09PSBudWxsLiIpOyYjeGQ7CgkJCXJldHVybiBudWxsOyYjeGQ7CgkJfSYjeGQ7CgkJaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykgeyYjeGQ7CgkJCWphdmEubGFuZy5TeXN0ZW0ub3V0LnByaW50bG4oIkFuIGVycm9yIG9jY3VycmVkIHdpdGhpbiB0aGUgQXJyYXkucHJvdG90eXBlLnJlZHVjZSgpIHBvbHlmaWxsOiB0aGUgY2FsbGJhY2sgIT09IGEgZnVuY3Rpb24uIik7JiN4ZDsKCQkJcmV0dXJuIG51bGw7JiN4ZDsKCQl9JiN4ZDsKCQl2YXIgdCA9IE9iamVjdCh0aGlzKSwmI3hkOwoJCQlsZW4gPSB0Lmxlbmd0aCAmZ3Q7Jmd0OyZndDsgMCwmI3hkOwoJCQlrID0gMCwmI3hkOwoJCQl2YWx1ZTsmI3hkOwoJCWlmIChhcmd1bWVudHMubGVuZ3RoID09IDIpIHsmI3hkOwoJCQl2YWx1ZSA9IGFyZ3VtZW50c1sxXTsmI3hkOwoJCX0gZWxzZSB7JiN4ZDsKCQkJd2hpbGUgKGsgJmx0OyBsZW4gJmFtcDsmYW1wOyAhKGsgaW4gdCkpIHsmI3hkOwoJCQkJaysrOyYjeGQ7CgkJCX0mI3hkOwoJCQlpZiAoayAmZ3Q7PSBsZW4pIHsmI3hkOwoJCQkJamF2YS5sYW5nLlN5c3RlbS5vdXQucHJpbnRsbigiQW4gZXJyb3Igb2NjdXJyZWQgd2l0aGluIHRoZSBBcnJheS5wcm90b3R5cGUucmVkdWNlKCkgcG9seWZpbGw6IFJlZHVjZSBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUuIik7JiN4ZDsKCQkJCXJldHVybiBudWxsOyYjeGQ7CgkJCX0mI3hkOwoJCQl2YWx1ZSA9IHRbaysrXTsmI3hkOwoJCX0mI3hkOwoJCWZvciAoOyBrICZsdDsgbGVuOyBrKyspIHsmI3hkOwoJCQlpZiAoayBpbiB0KSB7JiN4ZDsKCQkJCXZhbHVlID0gY2FsbGJhY2sodmFsdWUsIHRba10sIGssIHQpOyYjeGQ7CgkJCX0mI3hkOwoJCX0mI3hkOwoJCXJldHVybiB2YWx1ZTsmI3hkOwoJfTsmI3hkOwp9JiN4ZDsKJiN4ZDsKLy8gVmlhIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1N0cmluZy9UcmltJiN4ZDsKaWYgKCFTdHJpbmcucHJvdG90eXBlLnRyaW0pIHsmI3hkOwoJU3RyaW5nLnByb3RvdHlwZS50cmltID0gZnVuY3Rpb24oKSB7JiN4ZDsKCQlyZXR1cm4gdGhpcy5yZXBsYWNlKC9eW1xzXHVGRUZGXHhBMF0rfFtcc1x1RkVGRlx4QTBdKyQvZywgJycpOyYjeGQ7Cgl9OyYjeGQ7Cn0mI3hkOwomI3hkOwovLyBBcnJheSBlcXVhbGl0eSYjeGQ7Ci8vIFZpYSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzc4Mzc0NTYvaG93LXRvLWNvbXBhcmUtYXJyYXlzLWluLWphdmFzY3JpcHQmI3hkOwpBcnJheS5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24oYXJyYXkpIHsmI3hkOwoJLy8gaWYgdGhlIG90aGVyIGFycmF5IGlzIGEgZmFsc3kgdmFsdWUsIHJldHVybiYjeGQ7CglpZiAoIWFycmF5KSB7JiN4ZDsKCQlyZXR1cm4gZmFsc2U7JiN4ZDsKCX0mI3hkOwomI3hkOwoJLy8gY29tcGFyZSBsZW5ndGhzIC0gY2FuIHNhdmUgYSBsb3Qgb2YgdGltZSYjeGQ7CglpZiAodGhpcy5sZW5ndGggIT0gYXJyYXkubGVuZ3RoKSB7JiN4ZDsKCQlyZXR1cm4gZmFsc2U7JiN4ZDsKCX0mI3hkOwomI3hkOwoJZm9yICh2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSAmbHQ7IGw7IGkrKykgeyYjeGQ7CgkJLy8gQ2hlY2sgaWYgd2UgaGF2ZSBuZXN0ZWQgYXJyYXlzJiN4ZDsKCQlpZiAodGhpc1tpXSBpbnN0YW5jZW9mIEFycmF5ICZhbXA7JmFtcDsgYXJyYXlbaV0gaW5zdGFuY2VvZiBBcnJheSkgeyYjeGQ7CgkJCS8vIHJlY3Vyc2UgaW50byB0aGUgbmVzdGVkIGFycmF5cyYjeGQ7CgkJCWlmICghdGhpc1tpXS5lcXVhbHMoYXJyYXlbaV0pKSB7JiN4ZDsKCQkJCXJldHVybiBmYWxzZTsmI3hkOwoJCQl9JiN4ZDsKCQl9IGVsc2UgaWYgKHRoaXNbaV0gIT0gYXJyYXlbaV0pIHsmI3hkOwoJCQkvLyBXYXJuaW5nIC0gdHdvIGRpZmZlcmVudCBvYmplY3QgaW5zdGFuY2VzIHdpbGwgbmV2ZXIgYmUgZXF1YWw6IHt4OjIwfSAhPSB7eDoyMH0mI3hkOwoJCQlyZXR1cm4gZmFsc2U7JiN4ZDsKCQl9JiN4ZDsKCX0mI3hkOwoJcmV0dXJuIHRydWU7JiN4ZDsKfTsmI3hkOwovLyBIaWRlIC5lcXVhbHMoKSBtZXRob2QgZnJvbSBmb3ItaW4gbG9vcHMmI3hkOwppZiAoISFPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsmI3hkOwoJT2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwgImVxdWFscyIsIHsmI3hkOwoJCWVudW1lcmFibGU6IGZhbHNlJiN4ZDsKCX0pOyYjeGQ7Cn0mI3hkOwomI3hkOwovLyBQcm9kdWN0aW9uIHN0ZXBzIG9mIEVDTUEtMjYyLCBFZGl0aW9uIDUsIDE1LjQuNC4xOCYjeGQ7Ci8vIFJlZmVyZW5jZTogaHR0cDovL2VzNS5naXRodWIuaW8vI3gxNS40LjQuMTgmI3hkOwovLyBGcm9tIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2ZvckVhY2gmI3hkOwovLyBNb2RpZmllZCB0byByZW1vdmUgZXJyb3IgdGhyb3dzJiN4ZDsKaWYgKCFBcnJheS5wcm90b3R5cGUuZm9yRWFjaCkgeyYjeGQ7CiYjeGQ7CiAgQXJyYXkucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbihjYWxsYmFjay8qLCB0aGlzQXJnKi8pIHsmI3hkOwomI3hkOwogICAgdmFyIFQsIGs7JiN4ZDsKJiN4ZDsKICAgIGlmICh0aGlzID09IG51bGwpIHsmI3hkOwoJCQlqYXZhLmxhbmcuU3lzdGVtLm91dC5wcmludGxuKCJBbiBlcnJvciBvY2N1cnJlZCB3aXRoaW4gdGhlIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoKCkgcG9seWZpbGw6IHRoaXMgaXMgbnVsbCBvciBub3QgZGVmaW5lZC4iKTsmI3hkOwoJCQlyZXR1cm4gbnVsbDsmI3hkOwogICAgfSYjeGQ7CiYjeGQ7CiAgICAvLyAxLiBMZXQgTyBiZSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdG9PYmplY3QoKSBwYXNzaW5nIHRoZSYjeGQ7CiAgICAvLyB8dGhpc3wgdmFsdWUgYXMgdGhlIGFyZ3VtZW50LiYjeGQ7CiAgICB2YXIgTyA9IE9iamVjdCh0aGlzKTsmI3hkOwomI3hkOwogICAgLy8gMi4gTGV0IGxlblZhbHVlIGJlIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGUgR2V0KCkgaW50ZXJuYWwmI3hkOwogICAgLy8gbWV0aG9kIG9mIE8gd2l0aCB0aGUgYXJndW1lbnQgImxlbmd0aCIuJiN4ZDsKICAgIC8vIDMuIExldCBsZW4gYmUgdG9VaW50MzIobGVuVmFsdWUpLiYjeGQ7CiAgICB2YXIgbGVuID0gTy5sZW5ndGggJmd0OyZndDsmZ3Q7IDA7JiN4ZDsKJiN4ZDsKICAgIC8vIDQuIElmIGlzQ2FsbGFibGUoY2FsbGJhY2spIGlzIGZhbHNlLCB0aHJvdyBhIFR5cGVFcnJvciBleGNlcHRpb24uJiN4ZDsKICAgIC8vIFNlZTogaHR0cDovL2VzNS5naXRodWIuY29tLyN4OS4xMSYjeGQ7CiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7JiN4ZDsKCQkJamF2YS5sYW5nLlN5c3RlbS5vdXQucHJpbnRsbigiQW4gZXJyb3Igb2NjdXJyZWQgd2l0aGluIHRoZSBBcnJheS5wcm90b3R5cGUuZm9yRWFjaCgpIHBvbHlmaWxsOiAiICsgY2FsbGJhY2sgKyAiIGlzIG5vdCBhIGZ1bmN0aW9uIik7JiN4ZDsKCQkJcmV0dXJuIG51bGw7JiN4ZDsKICAgIH0mI3hkOwomI3hkOwogICAgLy8gNS4gSWYgdGhpc0FyZyB3YXMgc3VwcGxpZWQsIGxldCBUIGJlIHRoaXNBcmc7IGVsc2UgbGV0JiN4ZDsKICAgIC8vIFQgYmUgdW5kZWZpbmVkLiYjeGQ7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCAmZ3Q7IDEpIHsmI3hkOwogICAgICBUID0gYXJndW1lbnRzWzFdOyYjeGQ7CiAgICB9JiN4ZDsKJiN4ZDsKICAgIC8vIDYuIExldCBrIGJlIDAuJiN4ZDsKICAgIGsgPSAwOyYjeGQ7CiYjeGQ7CiAgICAvLyA3LiBSZXBlYXQgd2hpbGUgayAmbHQ7IGxlbi4mI3hkOwogICAgd2hpbGUgKGsgJmx0OyBsZW4pIHsmI3hkOwomI3hkOwogICAgICB2YXIga1ZhbHVlOyYjeGQ7CiYjeGQ7CiAgICAgIC8vIGEuIExldCBQayBiZSBUb1N0cmluZyhrKS4mI3hkOwogICAgICAvLyAgICBUaGlzIGlzIGltcGxpY2l0IGZvciBMSFMgb3BlcmFuZHMgb2YgdGhlIGluIG9wZXJhdG9yLiYjeGQ7CiAgICAgIC8vIGIuIExldCBrUHJlc2VudCBiZSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIEhhc1Byb3BlcnR5JiN4ZDsKICAgICAgLy8gICAgaW50ZXJuYWwgbWV0aG9kIG9mIE8gd2l0aCBhcmd1bWVudCBQay4mI3hkOwogICAgICAvLyAgICBUaGlzIHN0ZXAgY2FuIGJlIGNvbWJpbmVkIHdpdGggYy4mI3hkOwogICAgICAvLyBjLiBJZiBrUHJlc2VudCBpcyB0cnVlLCB0aGVuJiN4ZDsKICAgICAgaWYgKGsgaW4gTykgeyYjeGQ7CiYjeGQ7CiAgICAgICAgLy8gaS4gTGV0IGtWYWx1ZSBiZSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIEdldCBpbnRlcm5hbCYjeGQ7CiAgICAgICAgLy8gbWV0aG9kIG9mIE8gd2l0aCBhcmd1bWVudCBQay4mI3hkOwogICAgICAgIGtWYWx1ZSA9IE9ba107JiN4ZDsKJiN4ZDsKICAgICAgICAvLyBpaS4gQ2FsbCB0aGUgQ2FsbCBpbnRlcm5hbCBtZXRob2Qgb2YgY2FsbGJhY2sgd2l0aCBUIGFzJiN4ZDsKICAgICAgICAvLyB0aGUgdGhpcyB2YWx1ZSBhbmQgYXJndW1lbnQgbGlzdCBjb250YWluaW5nIGtWYWx1ZSwgaywgYW5kIE8uJiN4ZDsKICAgICAgICBjYWxsYmFjay5jYWxsKFQsIGtWYWx1ZSwgaywgTyk7JiN4ZDsKICAgICAgfSYjeGQ7CiAgICAgIC8vIGQuIEluY3JlYXNlIGsgYnkgMS4mI3hkOwogICAgICBrKys7JiN4ZDsKICAgIH0mI3hkOwogICAgLy8gOC4gcmV0dXJuIHVuZGVmaW5lZC4mI3hkOwogIH07JiN4ZDsKfSYjeGQ7CiYjeGQ7Ci8vIEZyb20gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2tleXMmI3hkOwovLyBNb2RpZmllZCB0byByZW1vdmUgZXJyb3IgdGhyb3dzJiN4ZDsKaWYgKCFPYmplY3Qua2V5cykgeyYjeGQ7CiAgT2JqZWN0LmtleXMgPSAoZnVuY3Rpb24oKSB7JiN4ZDsKICAgICd1c2Ugc3RyaWN0JzsmI3hkOwogICAgdmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSwmI3hkOwogICAgICAgIGhhc0RvbnRFbnVtQnVnID0gISh7IHRvU3RyaW5nOiBudWxsIH0pLnByb3BlcnR5SXNFbnVtZXJhYmxlKCd0b1N0cmluZycpLCYjeGQ7CiAgICAgICAgZG9udEVudW1zID0gWyYjeGQ7CiAgICAgICAgICAndG9TdHJpbmcnLCYjeGQ7CiAgICAgICAgICAndG9Mb2NhbGVTdHJpbmcnLCYjeGQ7CiAgICAgICAgICAndmFsdWVPZicsJiN4ZDsKICAgICAgICAgICdoYXNPd25Qcm9wZXJ0eScsJiN4ZDsKICAgICAgICAgICdpc1Byb3RvdHlwZU9mJywmI3hkOwogICAgICAgICAgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJywmI3hkOwogICAgICAgICAgJ2NvbnN0cnVjdG9yJyYjeGQ7CiAgICAgICAgXSwmI3hkOwogICAgICAgIGRvbnRFbnVtc0xlbmd0aCA9IGRvbnRFbnVtcy5sZW5ndGg7JiN4ZDsKJiN4ZDsKICAgIHJldHVybiBmdW5jdGlvbihvYmopIHsmI3hkOwogICAgICBpZiAodHlwZW9mIG9iaiAhPT0gJ2Z1bmN0aW9uJyAmYW1wOyZhbXA7ICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBvYmogPT09IG51bGwpKSB7JiN4ZDsKCQkJCWphdmEubGFuZy5TeXN0ZW0ub3V0LnByaW50bG4oIk9iamVjdC5rZXlzIGNhbGxlZCBvbiBub24tb2JqZWN0Iik7JiN4ZDsKCQkJCXJldHVybiBudWxsOyYjeGQ7CiAgICAgIH0mI3hkOwomI3hkOwogICAgICB2YXIgcmVzdWx0ID0gW10sIHByb3AsIGk7JiN4ZDsKJiN4ZDsKICAgICAgZm9yIChwcm9wIGluIG9iaikgeyYjeGQ7CiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkgeyYjeGQ7CiAgICAgICAgICByZXN1bHQucHVzaChwcm9wKTsmI3hkOwogICAgICAgIH0mI3hkOwogICAgICB9JiN4ZDsKJiN4ZDsKICAgICAgaWYgKGhhc0RvbnRFbnVtQnVnKSB7JiN4ZDsKICAgICAgICBmb3IgKGkgPSAwOyBpICZsdDsgZG9udEVudW1zTGVuZ3RoOyBpKyspIHsmI3hkOwogICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqLCBkb250RW51bXNbaV0pKSB7JiN4ZDsKICAgICAgICAgICAgcmVzdWx0LnB1c2goZG9udEVudW1zW2ldKTsmI3hkOwogICAgICAgICAgfSYjeGQ7CiAgICAgICAgfSYjeGQ7CiAgICAgIH0mI3hkOwogICAgICByZXR1cm4gcmVzdWx0OyYjeGQ7CiAgICB9OyYjeGQ7CiAgfSgpKTsmI3hkOwp9PC9lY21hLXNjcmlwdD4KICAgICAgICA8L2ltcG9ydC1zY3JpcHQ+CiAgICAgICAgPGZvcm0KICAgICAgICAgICAgICAgIGZvcm0taWQ9InJlcXVlc3RfZm9ybSI+CiAgICAgICAgICAgIDxjb250ZW50PgogICAgICAgICAgICAgICAgPHNjcmlwdD52YXIgQXBwID0ge307JiN4ZDsKJiN4ZDsKZnVuY3Rpb24gZm9ybWxvYWQoIGZpZWxkLCBmb3JtLCBJRFZhdWx0ICkgeyYjeGQ7CglBcHAuZmllbGQgPSBmaWVsZDsmI3hkOwoJQXBwLmZvcm0gPSBmb3JtOyYjeGQ7CglBcHAuSURWYXVsdCA9IElEVmF1bHQ7JiN4ZDsKfTwvc2NyaXB0PgogICAgICAgICAgICAgICAgPGZpZWxkCiAgICAgICAgICAgICAgICBkYXRhLXR5cGU9InN0cmluZyIKICAgICAgICAgICAgICAgICAgICBuYW1lPSJEYXRhRW50cnkiPgogICAgICAgICAgICAgICAgICAgIDxjb250cm9sCiAgICAgICAgICAgICAgICAgICAgY29udHJvbC10eXBlPSJUZXh0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdGFibGU9InRydWUiPgogICAgICAgICAgICAgICAgICAgICAgICA8cHJvcHM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iRGF0YUVudHJ5ViIKICAgICAgICAgICAgICAgICAgICB0eXBlPSJldmVudCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPmZpZWxkVmlzaWJpbGl0eSggZXZlbnQsIGZpZWxkICk7PC92YWx1ZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wcz4KICAgICAgICAgICAgICAgICAgICA8L2NvbnRyb2w+CiAgICAgICAgICAgICAgICAgICAgPGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iZW4iPklucHV0PC9kaXNwbGF5LWxhYmVsPgogICAgICAgICAgICAgICAgPC9maWVsZD4KICAgICAgICAgICAgICAgIDxmaWVsZD4KICAgICAgICAgICAgICAgICAgICA8Y29udHJvbAogICAgICAgICAgICAgICAgY29udHJvbC10eXBlPSJMaW5lQnJlYWsiLz4KICAgICAgICAgICAgICAgIDwvZmllbGQ+CiAgICAgICAgICAgICAgICA8ZmllbGQKICAgICAgICAgICAgICAgIGRhdGEtdHlwZT0ic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIG5hbWU9IkRhdGFFbnRyeU1WIj4KICAgICAgICAgICAgICAgICAgICA8Y29udHJvbAogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wtdHlwZT0iUGlja0xpc3QiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0YWJsZT0idHJ1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wcz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wCiAgICAgICAgICAgICAgICAgICAgbmFtZT0ibmJsaW5lcyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPjU8L3ZhbHVlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BzPgogICAgICAgICAgICAgICAgICAgIDwvY29udHJvbD4KICAgICAgICAgICAgICAgICAgICA8ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJlbiI+SW5wdXQyPC9kaXNwbGF5LWxhYmVsPgogICAgICAgICAgICAgICAgPC9maWVsZD4KICAgICAgICAgICAgICAgIDxmaWVsZD4KICAgICAgICAgICAgICAgICAgICA8Y29udHJvbAogICAgICAgICAgICAgICAgY29udHJvbC10eXBlPSJMaW5lQnJlYWsiLz4KICAgICAgICAgICAgICAgIDwvZmllbGQ+CiAgICAgICAgICAgICAgICA8YWN0aW9ucwogICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uPSJib3R0b20iPgogICAgICAgICAgICAgICAgICAgIDxhY3Rpb24KICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iU3VibWl0QWN0aW9uIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGNvbnRyb2wKICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC10eXBlPSJCdXR0b24iCiAgICAgICAgICAgICAgICAgICAgICAgIHZpc2libGU9InRydWUiLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImZyIj5Tb3VtZXR0cmU8L2Rpc3BsYXktbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJubCI+SW5kaWVuZW48L2Rpc3BsYXktbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJwdCI+U3VibWV0ZXI8L2Rpc3BsYXktbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJydSI+0J/QtdGA0LXQtNCw0YLRjDwvZGlzcGxheS1sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InpoLVRXIj7mj5DkuqQ8L2Rpc3BsYXktbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJ6aC1DTiI+5o+Q5LqkPC9kaXNwbGF5LWxhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iZW4iPlN1Ym1pdDwvZGlzcGxheS1sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImVzIj5FbnZpYXI8L2Rpc3BsYXktbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJpdCI+SW52aWE8L2Rpc3BsYXktbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJzdiI+U2tpY2thPC9kaXNwbGF5LWxhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iZGUiPlNlbmRlbjwvZGlzcGxheS1sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iamEiPumAgeS/oTwvZGlzcGxheS1sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8L2FjdGlvbj4KICAgICAgICAgICAgICAgICAgICA8YWN0aW9uCiAgICAgICAgICAgICAgICAgICAgYmxvY2stb24tZXJyb3I9ImZhbHNlIgogICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJDYW5jZWxBY3Rpb24iPgogICAgICAgICAgICAgICAgICAgICAgICA8Y29udHJvbAogICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLXR5cGU9IkJ1dHRvbiIKICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZT0idHJ1ZSIvPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iZnIiPkFubnVsZXI8L2Rpc3BsYXktbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJubCI+QW5udWxlcmVuPC9kaXNwbGF5LWxhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0icHQiPkNhbmNlbGFyPC9kaXNwbGF5LWxhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0icnUiPtCe0YLQvNC10L3QsDwvZGlzcGxheS1sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InpoLVRXIj7lj5bmtog8L2Rpc3BsYXktbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJ6aC1DTiI+5Y+W5raIPC9kaXNwbGF5LWxhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iZW4iPkNhbmNlbDwvZGlzcGxheS1sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImVzIj5DYW5jZWxhcjwvZGlzcGxheS1sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9Iml0Ij5Bbm51bGxhPC9kaXNwbGF5LWxhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0ic3YiPkF2YnJ5dDwvZGlzcGxheS1sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImRlIj5BYmJyZWNoZW48L2Rpc3BsYXktbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICB4bWw6bGFuZz0iamEiPuOCreODo+ODs+OCu+ODqzwvZGlzcGxheS1sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8L2FjdGlvbj4KICAgICAgICAgICAgICAgIDwvYWN0aW9ucz4KICAgICAgICAgICAgICAgIDxldmVudCBldmVudC10eXBlPSJvbmxvYWQiPmZvcm1sb2FkKCBmaWVsZCwgZm9ybSwgSURWYXVsdCApOzwvZXZlbnQ+CiAgICAgICAgICAgIDwvY29udGVudD4KICAgICAgICA8L2Zvcm0+CiAgICA8L3Byb3Zpc2lvbi1yZXF1ZXN0Pgo8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpDb3B5cmlnaHQgKGMpIDIwMDYgTm92ZWxsLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgpUSElTIFdPUksgSVMgU1VCSkVDVCBUTyBVLlMuIEFORCBJTlRFUk5BVElPTkFMIENPUFlSSUdIVCBMQVdTIEFORCBUUkVBVElFUwpOTyBQQVJUIE9GIFRISVMgV09SSyBNQVkgQkUgVVNFRCwgUFJBQ1RJQ0VELCBQRVJGT1JNRUQgQ09QSUVELCBESVNUUklCVVRFRCwKUkVWSVNFRCwgTU9ESUZJRUQsIFRSQU5TTEFURUQsIEFCUklER0VELCBDT05ERU5TRUQsIEVYUEFOREVELCBDT0xMRUNURUQsCkNPTVBJTEVELCBMSU5LRUQsIFJFQ0FTVCwgVFJBTlNGT1JNRUQgT1IgQURBUFRFRCBXSVRIT1VUIFRIRSBQUklPUiBXUklUVEVOCkNPTlNFTlQgT0YgTk9WRUxMLCBJTkMuIEFOWSBVU0UgT1IgRVhQTE9JVEFUSU9OIE9GIFRISVMgV09SSyBXSVRIT1VUCkFVVEhPUklaQVRJT04gQ09VTEQgU1VCSkVDVCBUSEUgUEVSUEVUUkFUT1IgVE8gQ1JJTUlOQUwgQU5EIENJVklMIApMSUFCSUxJVFkuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0+Cg==]]></ds-value>
</ds-attribute>
<ds-attribute ds-attr-name="srvprvProcessXML">
<ds-value><![CDATA[PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHByb2Nlc3MgZGVmYXVsdC1jb21wbGV0ZWQtYXBwcm92YWwtc3RhdHVzPSJhcHByb3ZlZCIKICAgIGlkPSJjbj1UZXN0UFJELGNuPVJlcXVlc3REZWZzLGNuPUFwcENvbmZpZyxjbj1yYnBtLGNuPWRyaXZlcnNldDEsbz1zeXN0ZW0iCiAgICBzZXRub3RpZnk9ImZhbHNlIiB2ZXJzaW9uPSI0LjUuMCIKICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCiAgICAgICAgeHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb249IkFwcHJvdmFsUHJvY2VzczRfNV8wLnhzZCI+PGRpc3BsYXktbmFtZQogICAgICAgIHhtbDpsYW5nPSJlbiI+VGVzdFBSRDwvZGlzcGxheS1uYW1lPjxpbXBvcnQtc2NyaXB0IGlubGluZT0idHJ1ZSIKICAgICAgICB1c2UtaW4tZm9ybT0idHJ1ZSI+PGVjbWEtc2NyaXB0Pi8qKiYjeGQ7CiAqIFNpbXBsZSBtb2R1bGUgdG8gYXNzaXN0IG9uIHdvcmtmbG93IGRldmVsb3BtZW50LiZsdDtici8mZ3Q7JiN4ZDsKICogQ3JlYXRlZCB0byBiZSBpbXBvcnRlZCBpbiBPdmVydmlldyAmZ3Q7IEdsb2JhbCBTY3JpcHRzIGFuZCB1c2VkIG9uIGJvdGggZm9ybXMgYW5kIGVuZ2luZS4mbHQ7YnIvJmd0OyYjeGQ7CiAqIHYxLjAuNSBicmVha2luZyBjaGFuZ2UgLSBDb21wYXJlKCkgYW5kIFVuaXF1ZSgpIHJlbmFtZWQgdG8gY29tcGFyZSgpIGFuZCB1bmlxdWUoKSBhcyBwZXIgIzIwIC4mbHQ7YnIvJmd0OyYjeGQ7CiAqIEBuYW1lc3BhY2UgUFJEJiN4ZDsKICogQHZlcnNpb24gMS4wLjcmI3hkOwogKiBAbGljZW5zZSBNSVQgTGljZW5zZSYjeGQ7CiAqLyYjeGQ7CnZhciBQUkQgPSAoZnVuY3Rpb24gSUlGRSggbG9ncHJlZml4LCB2ZXJib3NlbXNnICkgeyYjeGQ7CiAgLy8gRXhwb3J0ZWQgcHVibGljIEFQSS4gRnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgbm90IGRlY2xhcmVkIGhlcmUgd2lsbCByZW1haW4gcHJpdmF0ZSB0byB0aGlzIG1vZHVsZSYjeGQ7CiAgdmFyIFB1YmxpY0FQSSA9IHsmI3hkOwogICAgdXRpbDogeyYjeGQ7CiAgICAgIGZvcm1PckVuZ2luZTpmb3JtT3JFbmdpbmUsJiN4ZDsKICAgICAgbG9nZXJyb3I6bG9nZXJyb3IsJiN4ZDsKICAgICAgY29lcmNlVG9TdHJpbmc6Y29lcmNlVG9TdHJpbmcsJiN4ZDsKICAgICAgSlNPTm9iajogeyYjeGQ7CiAgICAgICAgcGFyc2U6SlNPTnBhcnNlLCYjeGQ7CiAgICAgICAgc3RyaW5naWZ5OkpTT05zdHJpbmdpZnksJiN4ZDsKICAgICAgICBnZXQ6SlNPTmdldCwmI3hkOwogICAgICAgIHRlc3Q6SlNPTnRlc3QmI3hkOwogICAgICB9LCYjeGQ7CiAgICAgIGNvbXBhcmU6Y29tcGFyZSwmI3hkOwogICAgICB1bmlxdWU6dW5pcXVlLCYjeGQ7CiAgICAgIGluc3BlY3RUeXBlOmluc3BlY3RUeXBlLCYjeGQ7CiAgICAgIGlzU3RyaW5nOmlzU3RyaW5nLCYjeGQ7CiAgICAgIGlzTnVtYmVyOmlzTnVtYmVyLCYjeGQ7CiAgICAgIGlzQm9vbGVhbjppc0Jvb2xlYW4sJiN4ZDsKICAgICAgZGVidWdtc2c6ZGVidWdtc2csJiN4ZDsKICAgIH0sJiN4ZDsKICAgIGRlYnVnbWVzc2FnZXM6ZGVidWdtZXNzYWdlcywmI3hkOwogICAgc2V0bG9ncHJlZml4OnNldGxvZ3ByZWZpeCwmI3hkOwogICAgdmVyc2lvbjp2ZXJzaW9uLCYjeGQ7CiAgICBJRFZnZXQ6SURWZ2V0LCYjeGQ7CiAgICBJRFZnbG9iYWxRdWVyeTpJRFZnbG9iYWxRdWVyeSYjeGQ7CiAgfTsmI3hkOwomI3hkOwogIC8qKiYjeGQ7CiAgICogUmV0dXJuIG1vZHVsZSB2ZXJzaW9uLiYjeGQ7CiAgIComI3hkOwogICAqIEBtZW1iZXJvZiBQUkQmI3hkOwogICAqIEBzaW5jZSAxLjAuMSYjeGQ7CiAgIComI3hkOwogICAqIEB0eXBlIHtzdHJpbmd9JiN4ZDsKICAgKiBAcmV0dXJuIHtzdHJpbmd9IE1vZHVsZSdzIHZlcnNpb24gaW4gdGhlIGZvcm1hdCBNLm0ucCAoTWFqb3IsIG1pbm9yLCBwYXRjaCkmI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gdmVyc2lvbigpIHsmI3hkOwogICAgcmV0dXJuICcxLjAuNyc7JiN4ZDsKICB9JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIFV0aWxpdHkgZnVuY3Rpb25zIGZvciB1c2UgaW4gIElkZW50aXR5IE1hbmFnZXIgd29yayBmbG93IGRldmVsb3BtZW50LiYjeGQ7CiAgICogQG5hbWVzcGFjZSBQUkQudXRpbCYjeGQ7CiAgICogQG1lbWJlcm9mIFBSRCYjeGQ7CiAgICogQHNpbmNlIDEuMC4wJiN4ZDsKICAgKi8mI3hkOwomI3hkOwogICAgLyoqJiN4ZDsKICAgKiBQcm94eSBmb3IgdGhlIGFjdHVhbCBKU09OIG9iamVjdCB1c2VkIGluIGJyb3dzZXJzIChKU09OKSBvciB3b3JrZmxvdyBlbmdpbmUgKFNjcmlwdFZhdWx0LkpTT04pLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBXcmFwcyB0aGUgcGFyc2UoKSBhbmQgc3RyaW5naWZ5KCkgY2FsbHMgaW4gdHJ5L2NhdGNoIGJsb2NrcyB0byByZXBvcnQgZXJyb3JzIHZpYSBsb2dlcnJvcigpIGluc3RlYWQgb2YmI3hkOwogICAqIGxldHRpbmcgdGhlIHdvcmtmbG93IGVuZ2luZSBicmVhayBpdHMgcmVndWxhciBmbG93IHdoZW4gYW4gZXJyb3Igb2NjdXJzLiYjeGQ7CiAgICogQG5hbWVzcGFjZSBQUkQudXRpbC5KU09Ob2JqJiN4ZDsKICAgKiBAbWVtYmVyb2YgUFJELnV0aWwmI3hkOwogICAqIEBzaW5jZSAxLjAuMiYjeGQ7CiAgICovJiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIEZ1bmN0aW9ucyBhbmQgb2JqZWN0cyB0aGF0IGNhbiBvbmx5IGJlIGFjY2Vzc2VkIGluIHdvcmsgZmxvdyBmb3Jtcy4mI3hkOwogICAqIEBuYW1lc3BhY2UgUFJELndlYiYjeGQ7CiAgICogQG1lbWJlcm9mIFBSRCYjeGQ7CiAgICogQHNpbmNlIDEuMC40JiN4ZDsKICAgKi8mI3hkOwomI3hkOwogIC8qKiYjeGQ7CiAgICogU3RvcmFnZSBmb3IgdGhlIGZyYW1ld29yayBvYmplY3RzLCBvbmx5IHVzZWQgd2hlbiBmdW5jdGlvbnMgYXJlIGNhbGxlZCBmcm9tIGluc2lkZSBhIGZvcm0uJiN4ZDsKICAgKiBOb3QgbmVlZGVkIHdoZW4gY29kZSBpcyBydW5uaW5nIG9uIHRoZSB3b3JrZmxvdyBlbmdpbmUuJiN4ZDsKICAgKi8mI3hkOwogIHZhciBJRE1BUFBTID0geyYjeGQ7CiAgICBmaWVsZDpudWxsLCYjeGQ7CiAgICBmb3JtOm51bGwsJiN4ZDsKICAgIElEVmF1bHQ6bnVsbCYjeGQ7CiAgfTsmI3hkOwomI3hkOwogIC8qKiYjeGQ7CiAgICogSW50ZXJuYWwgc3RhdGUsIHVzZWQgdG8gZGVmaW5lIHdoYXQgZnVuY3Rpb25zIHRvIGV4cG9ydCBhcyB3ZWxsIGFzJiN4ZDsKICAgKiB0aGUgYmVoYXZpb3IgZm9yIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIGluIGJvdGggZm9ybSBhbmQgZW5naW5lLiYjeGQ7CiAgICovJiN4ZDsKICB2YXIgd2hlcmUgPSBmb3JtT3JFbmdpbmUoKTsmI3hkOwogIHZhciBKU3RyaW5nOyAvLyBKYXZhIHN0cmluZywgdXNlZCBvbmx5IG9uIHRoZSB3b3JrZmxvdyBlbmdpbmUuJiN4ZDsKICB2YXIgSlNPTnB0cjsgLy8gSlNPTiBpbnRlcm5hbCBwb2ludGVyLiBJZiB3ZSBldmFsdWF0ZSBpdCBpbnNpZGUgYSBmdW5jdGlvbiB0aGF0IGZ1bmN0aW9uIGNhbiBjYXVzZSBmb3JtIHRvIGZhaWwgdG8gbG9hZC4mI3hkOwogIHZhciBwcmVmaXg7IC8vIHByZWZpeCB2YXJpYWJsZSB1c2VkIGJ5IHRoZSBsb2dlcnJvcigpIGNhbGxzLiYjeGQ7CiAgdmFyIGRlYnVnOyAvLyBXaGVuIHNldCwgZnVuY3Rpb25zIHdpbGwgcHJvdmlkZSBtb3JlIHZlcmJvc2UgbG9nIG1lc3NhZ2VzJiN4ZDsKICBpZiAoIHdoZXJlID09PSAnZW5naW5lJyApIHsmI3hkOwogICAgSlN0cmluZyA9IGphdmEubGFuZy5TdHJpbmc7JiN4ZDsKICAgIEpTT05wdHIgPSBTY3JpcHRWYXVsdC5KU09OOyYjeGQ7CiAgfSYjeGQ7CiAgaWYgKCB3aGVyZSA9PT0gJ2Zvcm0nICkgeyYjeGQ7CiAgICBKU09OcHRyID0gSlNPTjsmI3hkOwogIH0mI3hkOwogIC8vIEluaXRpYWxpemVzIGRlYnVnIG1vZGUgZnJvbSBsaWJyYXJ5J3MgcGFyYW1ldGVyLiYjeGQ7CiAgZGVidWdtZXNzYWdlcyggdmVyYm9zZW1zZyApOyYjeGQ7CiAgLy8gSW5pdGlhbGl6ZXMgdGhlIHByZWZpeCB2YXJpYWJsZSB1c2VkIGJ5IHRoZSBsb2dlcnJvcigpIGNhbGxzLiYjeGQ7CiAgc2V0bG9ncHJlZml4KCBsb2dwcmVmaXggKTsmI3hkOwomI3hkOwogIC8vIEZyb20gaHR0cHM6Ly9naXRodWIuY29tL2g1YnAvaHRtbDUtYm9pbGVycGxhdGUvYmxvYi9tYXN0ZXIvc3JjL2pzL3BsdWdpbnMuanMgLCYjeGQ7CiAgLy8gaW1wbGVtZW50ZWQgYWZ0ZXIgZXJyb3JzIG9jY3VyZWQgb24gY2VydGFpbiBJRSBicm93c2VyIHRlc3RzIG9uIGxvZ2Vycm9yKCkgY29uc29sZS5sb2coKSBjYWxscy4mI3hkOwogIGlmICggd2hlcmUgPT09ICdmb3JtJyApIHsmI3hkOwogICAgLy8gQXZvaWQgYGNvbnNvbGVgIGVycm9ycyBpbiBicm93c2VycyB0aGF0IGxhY2sgYSBjb25zb2xlLiYjeGQ7CiAgICAoZnVuY3Rpb24oKSB7JiN4ZDsKICAgICAgdmFyIG1ldGhvZDsmI3hkOwogICAgICB2YXIgbm9vcCA9IGZ1bmN0aW9uICgpIHt9OyYjeGQ7CiAgICAgIHZhciBtZXRob2RzID0gWyYjeGQ7CiAgICAgICAgJ2Fzc2VydCcsICdjbGVhcicsICdjb3VudCcsICdkZWJ1ZycsICdkaXInLCAnZGlyeG1sJywgJ2Vycm9yJywmI3hkOwogICAgICAgICdleGNlcHRpb24nLCAnZ3JvdXAnLCAnZ3JvdXBDb2xsYXBzZWQnLCAnZ3JvdXBFbmQnLCAnaW5mbycsICdsb2cnLCYjeGQ7CiAgICAgICAgJ21hcmtUaW1lbGluZScsICdwcm9maWxlJywgJ3Byb2ZpbGVFbmQnLCAndGFibGUnLCAndGltZScsICd0aW1lRW5kJywmI3hkOwogICAgICAgICd0aW1lbGluZScsICd0aW1lbGluZUVuZCcsICd0aW1lU3RhbXAnLCAndHJhY2UnLCAnd2FybicmI3hkOwogICAgICBdOyYjeGQ7CiAgICAgIHZhciBsZW5ndGggPSBtZXRob2RzLmxlbmd0aDsmI3hkOwogICAgICB2YXIgY29uc29sZSA9ICh3aW5kb3cuY29uc29sZSA9IHdpbmRvdy5jb25zb2xlIHx8IHt9KTsmI3hkOwogICAgICB3aGlsZSAobGVuZ3RoLS0pIHsmI3hkOwogICAgICAgIG1ldGhvZCA9IG1ldGhvZHNbbGVuZ3RoXTsmI3hkOwogICAgICAgIC8vIE9ubHkgc3R1YiB1bmRlZmluZWQgbWV0aG9kcy4mI3hkOwogICAgICAgIGlmICghY29uc29sZVttZXRob2RdKSB7JiN4ZDsKICAgICAgICAgIGNvbnNvbGVbbWV0aG9kXSA9IG5vb3A7JiN4ZDsKICAgICAgICB9JiN4ZDsKICAgICAgfSYjeGQ7CiAgICB9KCkpOyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiBTZXQgcHJlZml4IGZvciB0aGUgbG9nIGFjdGl2aXRpZXMgZ2VuZXJhdGVkIGJ5IGxvZ2Vycm9yKCkgb24gYm90aCBlbmdpbmUgYW5kIGZvcm0uJmx0O2JyLyZndDsmI3hkOwogICAqIEdpdmVuIHRoYXQgZm9ybXMgaW5zdGFudGlhdGUgdGhlIG1vZHVsZSBvbiBsb2FkLCBzZXR0aW5nIHRoZSB2YWx1ZSBpbnNpZGUgYSBmb3JtIHdvdWxkIGFmZmVjdCBvbmx5IHNhaWQgZm9ybS4mbHQ7YnIvJmd0OyYjeGQ7CiAgICogR2l2ZW4gdGhhdCB0aGUgd29ya2Zsb3cgZW5naW5lIGNhbiBwYXVzZSBwcm9jZXNzaW5nIGF0IHBvaW50cyBhbmQgcmVtb3ZlIHRoZSB0aHJlYWQgZnJvbSBtZW1vcnksIHJlYWRpbmcgdGhlIHNhbWUmI3hkOwogICAqIGFnYWluIGxhdGVyLCBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gYW55d2hlcmUgb3V0c2lkZSB0aGUgT3ZlcnZpZXcgJmd0OyBHbG9iYWwgU2NyaXB0cyBtaWdodCBjYXVzZSB0aGUgdmFsdWUgc2V0IHRvIGJlIGxvc3QmI3hkOwogICAqIGFmdGVyIHN1Y2ggcGF1c2VzLiBPbmUgZXhhbXBsZSBvZiBzdWNoIHBhdXNlcy9iZWhhdmlvciBpcyB3aGVuIGEgd29ya2Zsb3cgcmVhY2hlcyBhbiBhcHByb3ZhbCBhY3Rpdml0eS4mI3hkOwogICAqJiN4ZDsKICAgKiBAbWVtYmVyb2YgUFJEJiN4ZDsKICAgKiBAc2luY2UgMS4wLjImI3hkOwogICAqJiN4ZDsKICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyICBTdHJpbmcgdGhhdCB3aWxsIGJlIGFwcGVuZGVkIHRvIGFueSBsb2dlcnJvcigpIGNhbGwuJiN4ZDsKICAgKi8mI3hkOwogIGZ1bmN0aW9uIHNldGxvZ3ByZWZpeCggc3RyICkgeyYjeGQ7CiAgICBwcmVmaXggPSBjb2VyY2VUb1N0cmluZyggc3RyLCAnJyApOyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiBTZXRzIGxpYnJhcnkgaW4gZGVidWcgbW9kZS4gVGhlIG90aGVyIHdheSB0byBkbyBzbyBpcyB0byBwYXNzIHRydWUgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIgb24gdGhlIGxpYnJhcnkgaW1wb3J0LiYjeGQ7CiAgIComI3hkOwogICAqIEBtZW1iZXJvZiBQUkQmI3hkOwogICAqIEBzaW5jZSAxLjAuNSYjeGQ7CiAgIComI3hkOwogICAqIEBwYXJhbSB7Ym9vbGVhbn0gYm9vbCAgdHJ1ZSB0byBzZXQgdGhlIGxpYnJhcnkgdG8gZGVidWcgbW9kZSwgZmFsc2UgdG8gZGlzYWJsZSBkZWJ1ZyBtb3JlLiYjeGQ7CiAgICovJiN4ZDsKICBmdW5jdGlvbiBkZWJ1Z21lc3NhZ2VzKCBib29sICkgeyYjeGQ7CiAgICBpZiAoIGJvb2wgPT09IHRydWUgKSB7JiN4ZDsKICAgICAgbG9nZXJyb3IoICdEZWJ1ZyBtZXNzYWdlcyBlbmFibGVkLicgKTsmI3hkOwogICAgICBkZWJ1ZyA9IHRydWU7JiN4ZDsKICAgIH0mI3hkOwogICAgaWYgKCBib29sID09PSBmYWxzZSApIHsmI3hkOwogICAgICBsb2dlcnJvciggJ0RlYnVnIG1lc3NhZ2VzIGRpc2FibGVkLicgKTsmI3hkOwogICAgICBkZWJ1ZyA9IGZhbHNlOyYjeGQ7CiAgICB9JiN4ZDsKICB9JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIFRyeSB0byBkZXRlY3QgaWYgd2UgYXJlIGluIGEgd2ViIGJyb3dzZXIgb3IgaW4gdGhlIFVzZXIgQXBwL1JCUE0vSURNQVBQcyB3b3JrZmxvdyBlbmdpbmUuJiN4ZDsKICAgKiYjeGQ7CiAgICogQG1lbWJlcm9mIFBSRC51dGlsJiN4ZDsKICAgKiBAc2luY2UgMS4wLjAmI3hkOwogICAqJiN4ZDsKICAgKiBAdHlwZSB7c3RyaW5nfSYjeGQ7CiAgICogQHJldHVybiB7c3RyaW5nfSAnZm9ybScgaWYgaW4gYSBCcm93c2VyLCAnZW5naW5lJyBpZiBvbiB0aGUgd29ya2Zsb3cgZW5naW5lLiAnZGV0ZWN0aW9uIGZhaWxlZCcgb3RoZXJ3aXNlLiYjeGQ7CiAgICovJiN4ZDsKICBmdW5jdGlvbiBmb3JtT3JFbmdpbmUoKSB7JiN4ZDsKICAgIHZhciByZXMgPSAnRGV0ZWN0aW9uIGZhaWxlZCc7JiN4ZDsKICAgIGlmICggdHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcgJmFtcDsmYW1wOyYjeGQ7CiAgICAgICdkb2N1bWVudCcgaW4gd2luZG93ICZhbXA7JmFtcDsmI3hkOwogICAgICB0eXBlb2YgamF2YSA9PT0gJ3VuZGVmaW5lZCcmI3hkOwogICAgKSB7JiN4ZDsKICAgICAgcmVzID0gJ2Zvcm0nOyYjeGQ7CiAgICB9JiN4ZDsKICAgIGlmICggdHlwZW9mIGphdmEgPT09ICdvYmplY3QnICZhbXA7JmFtcDsmI3hkOwogICAgICAgICAgJ2xhbmcnIGluIGphdmEgJmFtcDsmYW1wOyYjeGQ7CiAgICAgICAgICAnU3RyaW5nJyBpbiBqYXZhLmxhbmcgJmFtcDsmYW1wOyYjeGQ7CiAgICAgIHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnJiN4ZDsKICAgICkgeyYjeGQ7CiAgICAgIHJlcyA9ICdlbmdpbmUnOyYjeGQ7CiAgICB9JiN4ZDsKICAgIHJldHVybiByZXM7JiN4ZDsKICB9JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIE91dHB1dCBlcnJvciBtZXNzYWdlIGJhc2VkIG9uIHdoZXJlIHRoZSBjb2RlIGlzIHJ1bm5pbmcuJmx0O2JyLyZndDsmI3hkOwogICAqIE91dHB1dCB0byB0aGUgY29uc29sZS5sb2coKSBpZiBpbiBhIGJyb3dzZXIsIHRvIGNhdGFsaW5hLm91dCBpZiBpbiB0aGUgd29ya2Zsb3cgZW5naW5lLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBQcmVwZW5kcyB0aGUgdmFsdWUgb2YgdGhlIG1vZHVsZSdzIGludGVybmFsICdwcmVmaXgnIHZhcmlhYmxlLiYjeGQ7CiAgIComI3hkOwogICAqIEBtZW1iZXJvZiBQUkQudXRpbCYjeGQ7CiAgICogQHNpbmNlIDEuMC4wJiN4ZDsKICAgKiYjeGQ7CiAgICogQHBhcmFtICB7c3RyaW5nfSBtc2cgICAgRXJyb3IgbWVzc2FnZSB0byBiZSBsb2dnZWQuJiN4ZDsKICAgKiYjeGQ7CiAgICogQHR5cGUge2Jvb2xlYW59JiN4ZDsKICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBtZXNzYWdlIHdhcyByZXR1cm5lZCBzdWNjZXNzZnVsbHksIGZhbHNlIG90aGVyd2lzZS4mI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gbG9nZXJyb3IoIG1zZyApIHsmI3hkOwogICAgdmFyIHJlcXVlc3RJRCwgcHJlcGVuZDsmI3hkOwogICAgLy8gQ29lcmNpbmcgbG9nIG1lc3NhZ2UgdmlhIFN0cmluZygpIHRvIGF2b2lkIG51bGwgYW5kIHVuZGVmaW5lZCByZXN1bHRzIGJlaW5nIHBhc3NlZCB0byB0aGUgbG9nIG1lY2hhbmlzbS4mI3hkOwogICAgbXNnID0gU3RyaW5nKCBtc2cgKTsmI3hkOwogICAgLy8gQ29lcmNpbmcgbG9nIHByZWZpeCBpbnRlcm5hbCB2YXJpYWJsZSB2aWEgU3RyaW5nKCkgdG8gYXZvaWQgbnVsbCBhbmQgdW5kZWZpbmVkIHJlc3VsdHMgYmVpbmcgcGFzc2VkIHRvIHRoZSBsb2cgbWVjaGFuaXNtLiYjeGQ7CiAgICBwcmVwZW5kID0gU3RyaW5nKCBwcmVmaXggKTsmI3hkOwogICAgLy8gVXNpbmcgdHJ5L2NhdGNoIG1ha2VzIHRoZSBjYWxsIHNhZmVyLCBpdCBhbHNvIGltcGFjdHMgcGVyZm9ybWFuY2UuJiN4ZDsKICAgIGlmICggd2hlcmUgPT09ICdlbmdpbmUnICkgeyYjeGQ7CiAgICAgIC8vIHByb2Nlc3MuZ2V0UmVxdWVzdElkKCkgbWF5IGZhaWwgaWYgY2FsbGVkIGR1cmluZyBHbG9iYWwgU2NyaXB0IGluaXRpYWxpemF0aW9uLiYjeGQ7CiAgICAgIHRyeSB7JiN4ZDsKICAgICAgICByZXF1ZXN0SUQgPSBwcm9jZXNzLmdldFJlcXVlc3RJZCgpOyYjeGQ7CiAgICAgICAgcmVxdWVzdElEICs9ICc6ICc7JiN4ZDsKICAgICAgfSBjYXRjaChlKSB7fSYjeGQ7CiAgICB9JiN4ZDsKICAgIHRyeSB7JiN4ZDsKICAgICAgaWYgKCB3aGVyZSA9PT0gJ2Zvcm0nICkgeyYjeGQ7CiAgICAgICAgY29uc29sZS5sb2coIHByZXBlbmQgKyBtc2cgKTsmI3hkOwogICAgICB9JiN4ZDsKICAgICAgaWYgKCB3aGVyZSA9PT0gJ2VuZ2luZScgKSB7JiN4ZDsKICAgICAgICBqYXZhLmxhbmcuU3lzdGVtLm91dC5wcmludGxuKCBwcmVwZW5kICsgcmVxdWVzdElEICsgbXNnICk7JiN4ZDsKICAgICAgfSYjeGQ7CiAgICB9IGNhdGNoICggZSApIHsmI3hkOwogICAgICAvLyBkaXNjYXJkaW5nIGVycm9yLCBzaW5jZSB0aGlzIGlzIGFuIGVycm9yIGFib3V0IHByaW50aW5nIHRoZSBlcnJvciBtZXNzYWdlLi4uJiN4ZDsKICAgICAgcmV0dXJuIGZhbHNlOyYjeGQ7CiAgICB9JiN4ZDsKICAgIHJldHVybiB0cnVlOyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiBPdXRwdXQgZGVidWcgbWVzc2FnZSB2aWEgbG9nZXJyb3IoKSBvbmx5IGlmIHRoZSBpbnRlcm5hbCB2YXJpYWJsZSBkZWJ1ZyBpcyBzZXQgdG8gdHJ1ZSYjeGQ7CiAgIComI3hkOwogICAqIEBtZW1iZXJvZiBQUkQudXRpbCYjeGQ7CiAgICogQHNpbmNlIDEuMC4zJiN4ZDsKICAgKiYjeGQ7CiAgICogQHBhcmFtIHtzdHJpbmd9ICBzdHIgICBTdHJpbmcgaW5wdXQuJiN4ZDsKICAgKi8mI3hkOwogIGZ1bmN0aW9uIGRlYnVnbXNnKCBzdHIgKSB7JiN4ZDsKICAgIGlmICggZGVidWcgKSB7JiN4ZDsKICAgICAgbG9nZXJyb3IoIHN0ciApOyYjeGQ7CiAgICB9JiN4ZDsKICB9JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIFJldHVybnMgdGhlIHR5cGUgb2YgYW4gRUNNQSBvYmplY3Qgb3IgY2xhc3Mgb2YgYSBKYXZhIG9iamVjdC4mbHQ7YnIvJmd0OyYjeGQ7CiAgICogRm9yIEVDTUEgcmVsaWVzIG9uIHR5cGVvZiBhbmQgaW5zdGFuY2VvZiwgaWYgbmVpdGhlciB3b3JrcyB1c2VzIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcgLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBGb3IgSmF2YSBvYmplY3RzIGp1c3QgY2FsbHMgZ2V0Q2xhc3MoKS4mbHQ7YnIvJmd0OyYjeGQ7CiAgICogUHJpbnRzIHJlc3VsdCB3aGVuIG1vZHVsZSBpcyByYW4gaW4gZGVidWcgbW9kZSwgcmV0dXJucyByZXN1bHQgYXMgc3RyaW5nLiYjeGQ7CiAgIComI3hkOwogICAqIEBtZW1iZXJvZiBQUkQudXRpbCYjeGQ7CiAgICogQHNpbmNlIDEuMC41JiN4ZDsKICAgKiYjeGQ7CiAgICogQHBhcmFtIHthbnl9ICBpbnB1dCAgIEVDTUEgb3IgSmF2YSBpbnB1dCYjeGQ7CiAgIComI3hkOwogICAqIEB0eXBlIHtzdHJpbmd9JiN4ZDsKICAgKiBAcmV0dXJuIHtzdHJpbmd9IGFuYWx5c2lzIHJlc3VsdCYjeGQ7CiAgICovJiN4ZDsKICBmdW5jdGlvbiBpbnNwZWN0VHlwZSggaW5wdXQgKSB7JiN4ZDsKICAgIHZhciByZXMgPSAnJzsmI3hkOwogICAgLy8gU2VlOiYjeGQ7CiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L0RhdGFfc3RydWN0dXJlcyYjeGQ7CiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9PcGVyYXRvcnMvdHlwZW9mJiN4ZDsKICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL09wZXJhdG9ycy9pbnN0YW5jZW9mJiN4ZDsKICAgIC8vIEVDTUEgbnVsbCYjeGQ7CiAgICBpZiAoIGlucHV0ID09PSBudWxsICkgeyYjeGQ7CiAgICAgIHJlcyA9ICdudWxsJzsmI3hkOwogICAgfSYjeGQ7CiAgICAvLyBFQ01BIHVuZGVmaW5lZCYjeGQ7CiAgICBpZiAoIHR5cGVvZiBpbnB1dCA9PT0gJ3VuZGVmaW5lZCcgKSB7JiN4ZDsKICAgICAgcmVzID0gJ3VuZGVmaW5lZCc7JiN4ZDsKICAgIH0mI3hkOwogICAgLy8gRUNNQSBzeW1ib2wgKEVTNiBvbndhcmRzKSYjeGQ7CiAgICBpZiAoIHR5cGVvZiBpbnB1dCA9PT0gJ3N5bWJvbCcgKSB7JiN4ZDsKICAgICAgcmVzID0gJ3N5bWJvbCc7JiN4ZDsKICAgIH0mI3hkOwogICAgLy8gRUNNQSBzdHJpbmcuIHR5cGVvZiB3b24ndCBjYXB0dXJlIHRoZSBjYXNlIHdoZXJlIGEgc3RyaW5nIHdhcyBjcmVhdGVkIHZpYSBOZXcgU3RyaW5nKCksIHNvIG5lZWQgaW5zdGFuY2VvZiB0b28mI3hkOwogICAgaWYgKCB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnIHx8ICggdHlwZW9mIGlucHV0ID09PSAnb2JqZWN0JyAmYW1wOyZhbXA7IGlucHV0IGluc3RhbmNlb2YgU3RyaW5nICkgKSB7JiN4ZDsKICAgICAgcmVzID0gJ3N0cmluZyc7JiN4ZDsKICAgIH0mI3hkOwogICAgLy8gRUNNQSBudW1iZXIuIHR5cGVvZiB3b24ndCBjYXB0dXJlIHRoZSBjYXNlIHdoZXJlIGEgbnVtYmVyIHdhcyBjcmVhdGVkIHZpYSBOZXcgTnVtYmVyKCksIHNvIG5lZWQgaW5zdGFuY2VvZiB0b28mI3hkOwogICAgaWYgKCB0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInIHx8ICggdHlwZW9mIGlucHV0ID09PSAnb2JqZWN0JyAmYW1wOyZhbXA7IGlucHV0IGluc3RhbmNlb2YgTnVtYmVyICkgKSB7JiN4ZDsKICAgICAgcmVzID0gJ251bWJlcic7JiN4ZDsKICAgIH0mI3hkOwogICAgLy8gRUNNQSBib29sZWFuLiB0eXBlb2Ygd29uJ3QgY2FwdHVyZSB0aGUgY2FzZSB3aGVyZSBhIHN0cmluZyB3YXMgY3JlYXRlZCB2aWEgTmV3IEJvb2xlYW4oKSwgc28gbmVlZCBpbnN0YW5jZW9mIHRvbyYjeGQ7CiAgICBpZiAoIHR5cGVvZiBpbnB1dCA9PT0gJ2Jvb2xlYW4nIHx8ICggdHlwZW9mIGlucHV0ID09PSAnb2JqZWN0JyAmYW1wOyZhbXA7IGlucHV0IGluc3RhbmNlb2YgQm9vbGVhbiApICkgeyYjeGQ7CiAgICAgIHJlcyA9ICdib29sZWFuJzsmI3hkOwogICAgfSYjeGQ7CiAgICAvLyBFQ01BIGZ1bmN0aW9ubi4gU29tZSBwb3N0cyByZXBvcnQgdHlwZW9mIG5vdCByZXR1cm5pbmcgJ2Z1bmN0aW9uJyBvbiBjZXJ0YWluIGVudmlyb25tZW50cyBzbyBjaGVja2luZyB2aWEgaW5zdGFuY2VvZiBhcyBhIGZhbGxiYWNrJiN4ZDsKICAgIGlmICggdHlwZW9mIGlucHV0ID09PSAnZnVuY3Rpb24nIHx8ICggdHlwZW9mIGlucHV0ID09PSAnb2JqZWN0JyAmYW1wOyZhbXA7IGlucHV0IGluc3RhbmNlb2YgRnVuY3Rpb24gKSApIHsmI3hkOwogICAgICByZXMgPSAnZnVuY3Rpb24nOyYjeGQ7CiAgICB9JiN4ZDsKICAgIGlmICggcmVzID09PSAnJyAmYW1wOyZhbXA7IHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcgKSB7JiN4ZDsKICAgICAgaWYgKCBpbnB1dCBpbnN0YW5jZW9mIEFycmF5ICkgeyAvLyBFQ01BIEFycmF5JiN4ZDsKICAgICAgICByZXMgPSAnYXJyYXknOyYjeGQ7CiAgICAgIH0gZWxzZSBpZiAoIGlucHV0IGluc3RhbmNlb2YgUmVnRXhwICkgeyAvLyBFQ01BIHJlZ3VsYXIgZXhwcmVzc2lvbiYjeGQ7CiAgICAgICAgcmVzID0gJ3JlZ2V4cCc7JiN4ZDsKICAgICAgfSBlbHNlIGlmICggaW5wdXQgaW5zdGFuY2VvZiBEYXRlICkgeyAvLyBFQ01BIGRhdGUgb2JqZWN0JiN4ZDsKICAgICAgICByZXMgPSAnZGF0ZSc7JiN4ZDsKICAgICAgfSBlbHNlIGlmICggaW5wdXQgaW5zdGFuY2VvZiBFcnJvciApIHsgLy8gRUNNQSBlcnJvciBvYmplY3QmI3hkOwogICAgICAgIHJlcyA9ICdlcnJvcic7JiN4ZDsKICAgICAgfSBlbHNlIGlmICggJ2dldENsYXNzJyBpbiBpbnB1dCApIHsgLy8gSmF2YSBjbGFzcyYjeGQ7CiAgICAgICAgcmVzID0gaW5wdXQuZ2V0Q2xhc3MoKTsmI3hkOwogICAgICB9IGVsc2UgeyAvLyBFQ01BIGZhbGxiYWNrIHRvIGdldCB0aGUgb2JqZWN0J3MgY29uc3RydWN0b3IgbmFtZS4gYWRkaW5nIC5zbGljZSggOCwgLTEgKSB3b3VsZCByZW1vdmUgdGhlIFsgb2JqZWN0IF0gcG9ydGlvbiBvZiB0aGUgc3RyaW5nLiYjeGQ7CiAgICAgICAgcmVzID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKCBpbnB1dCApOyYjeGQ7CiAgICAgIH0mI3hkOwogICAgfSYjeGQ7CiAgICBkZWJ1Z21zZyggcmVzICk7JiN4ZDsKICAgIHJldHVybiByZXM7JiN4ZDsKICB9JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIENoZWNrcyBpZiB0aGUgcHJvdmlkZWQgaW5wdXQgaXMgYW4gRUNNQSBTdHJpbmcgKHByaW1pdGl2ZSBvciBvYmplY3QpLiYjeGQ7CiAgIComI3hkOwogICAqIEBtZW1iZXJvZiBQUkQudXRpbCYjeGQ7CiAgICogQHNpbmNlIDEuMC41JiN4ZDsKICAgKiYjeGQ7CiAgICogQHBhcmFtIHthbnl9ICBpbnB1dCAgIElucHV0IHZhbHVlIHdob3NlIHR5cGUgd2lsbCBiZSBldmFsdWF0ZWQmI3hkOwogICAqJiN4ZDsKICAgKiBAdHlwZSB7Ym9vbGVhbn0mI3hkOwogICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgc3RyaW5nLCBmYWxzZSBvdGhlcndpc2UmI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gaXNTdHJpbmcoIGlucHV0ICkgeyYjeGQ7CiAgICByZXR1cm4gKCB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnIHx8ICggdHlwZW9mIGlucHV0ID09PSAnb2JqZWN0JyAmYW1wOyZhbXA7IGlucHV0IGluc3RhbmNlb2YgU3RyaW5nICkgKTsmI3hkOwogIH0mI3hkOwomI3hkOwogIC8qKiYjeGQ7CiAgICogQ2hlY2tzIGlmIHRoZSBwcm92aWRlZCBpbnB1dCBpcyBhbiBFQ01BIE51bWJlciAocHJpbWl0aXZlIG9yIG9iamVjdCkuJiN4ZDsKICAgKiYjeGQ7CiAgICogQG1lbWJlcm9mIFBSRC51dGlsJiN4ZDsKICAgKiBAc2luY2UgMS4wLjUmI3hkOwogICAqJiN4ZDsKICAgKiBAcGFyYW0ge2FueX0gIGlucHV0ICAgSW5wdXQgdmFsdWUgd2hvc2UgdHlwZSB3aWxsIGJlIGV2YWx1YXRlZCYjeGQ7CiAgIComI3hkOwogICAqIEB0eXBlIHtib29sZWFufSYjeGQ7CiAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiBudW1iZXIsIGZhbHNlIG90aGVyd2lzZSYjeGQ7CiAgICovJiN4ZDsKICBmdW5jdGlvbiBpc051bWJlciggaW5wdXQgKSB7JiN4ZDsKICAgIHJldHVybiAoIHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcicgfHwgKCB0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICZhbXA7JmFtcDsgaW5wdXQgaW5zdGFuY2VvZiBOdW1iZXIgKSApOyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiBDaGVja3MgaWYgdGhlIHByb3ZpZGVkIGlucHV0IGlzIGFuIEVDTUEgQm9vbGVhbiAocHJpbWl0aXZlIG9yIG9iamVjdCkuJiN4ZDsKICAgKiYjeGQ7CiAgICogQG1lbWJlcm9mIFBSRC51dGlsJiN4ZDsKICAgKiBAc2luY2UgMS4wLjUmI3hkOwogICAqJiN4ZDsKICAgKiBAcGFyYW0ge2FueX0gIGlucHV0ICAgSW5wdXQgdmFsdWUgd2hvc2UgdHlwZSB3aWxsIGJlIGV2YWx1YXRlZCYjeGQ7CiAgIComI3hkOwogICAqIEB0eXBlIHtib29sZWFufSYjeGQ7CiAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiBib29sZWFuLCBmYWxzZSBvdGhlcndpc2UmI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gaXNCb29sZWFuKCBpbnB1dCApIHsmI3hkOwogICAgcmV0dXJuICggdHlwZW9mIGlucHV0ID09PSAnYm9vbGVhbicgfHwgKCB0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICZhbXA7JmFtcDsgaW5wdXQgaW5zdGFuY2VvZiBCb29sZWFuICkgKTsmI3hkOwogIH0mI3hkOwomI3hkOwogIC8qKiYjeGQ7CiAgICogKEVuZ2luZSBvbmx5KSBDaGVja3MgaWYgdGhlIHByb3ZpZGVkIGlucHV0IGlzIGEgSmF2YSBWZWN0b3IuJiN4ZDsKICAgKiYjeGQ7CiAgICogQG1lbWJlcm9mIFBSRC51dGlsJiN4ZDsKICAgKiBAc2luY2UgMS4wLjUmI3hkOwogICAqJiN4ZDsKICAgKiBAcGFyYW0ge2FueX0gIGlucHV0ICAgSW5wdXQgdmFsdWUgd2hvc2UgdHlwZSB3aWxsIGJlIGV2YWx1YXRlZCYjeGQ7CiAgIComI3hkOwogICAqIEB0eXBlIHtib29sZWFufSYjeGQ7CiAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiBKYXZhIFZlY3RvciwgZmFsc2Ugb3RoZXJ3aXNlJiN4ZDsKICAgKi8mI3hkOwogIGZ1bmN0aW9uIGlzSmF2YVZlY3RvciggaW5wdXQgKSB7JiN4ZDsKICAgIHJldHVybiAoIGlucHV0ICE9IG51bGwgJmFtcDsmYW1wOyB0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICZhbXA7JmFtcDsgJ2dldENsYXNzJyBpbiBpbnB1dCAmYW1wOyZhbXA7IGlucHV0LmdldENsYXNzKCkgPT0gJ2NsYXNzIGphdmEudXRpbC5WZWN0b3InICk7JiN4ZDsKICB9JiN4ZDsKJiN4ZDsKICAgLyoqJiN4ZDsKICAgKiAoRm9ybSBvbmx5KSBJbml0aWFsaXplcyByZWZlcmVuY2VzIHRvIHRoZSBSQlBNL0lETUFQUFMgZnJhbWV3b3JrIG9iamVjdHMgYW5kIHNhdmUgdGhlIHNhbWUgaW4gdGhlIGludGVybmFsIHN0b3JhZ2UuJmx0O2JyLyZndDsmI3hkOwogICAqIFVzZXMgSURWYXVsdCBpbnRlcm5hbGx5IG9uIElEVmdldCgpLCBJRFZnbG9iYWxRdWVyeSgpLCBHQ1ZnZXQoKSwgZ2V0TmFtZWRQYXNzd29yZCgpLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBFeHBvcnRzIGZpZWxkIGFzIFBSRC53ZWIuZmllbGQgYW5kIGZvcm0gYXMgUFJELndlYi5mb3JtIGZvciB1c2FnZSBpbnNpZGUgZ2xvYmFsIHNjcmlwdHMuJmx0O2JyLyZndDsmI3hkOwogICAqIFJlZmFjdG9yZWQgdG8gYWNjZXB0IDEgdG8gMyBwYXJhbWV0ZXJzIHdpdGggdGhlIGZyYW1ld29yayBvYmplY3RzIGluIGFueSBvcmRlci4mbHQ7YnIvJmd0OyYjeGQ7CiAgICogUmV0dXJucyBub3RoaW5nLiYjeGQ7CiAgIComI3hkOwogICAqIEBmdW5jdGlvbiBpbml0JiN4ZDsKICAgKiBAbWVtYmVyb2YgUFJEJiN4ZDsKICAgKiBAc2luY2UgMS4wLjAmI3hkOwogICAqJiN4ZDsKICAgKiBAcGFyYW0ge29iamVjdH0gICBvYmoxICAgICAgT25lIG9mIHRoZSB0aHJlZSBJRE1BUFBTIGZyYW1ld29yayBvYmplY3QmI3hkOwogICAqIEBwYXJhbSB7b2JqZWN0PX0gIFtvYmoyXSAgICBPbmUgb2YgdGhlIHRocmVlIElETUFQUFMgZnJhbWV3b3JrIG9iamVjdCYjeGQ7CiAgICogQHBhcmFtIHtvYmplY3Q9fSAgW29iajNdICAgIE9uZSBvZiB0aGUgdGhyZWUgSURNQVBQUyBmcmFtZXdvcmsgb2JqZWN0JiN4ZDsKICAgKi8mI3hkOwogIGZ1bmN0aW9uIGZvcm1Jbml0KCBvYmoxLCBvYmoyLCBvYmozICkgeyYjeGQ7CiAgICAvLyBPbmx5IGFwcGVuZHMgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHNvIHRoYXQgd2UgY2FuIGNoZWNrIGZvciB0aGUgbGluaydzIGV4aXN0ZW5jZSYjeGQ7CiAgICAvLyBiZWZvcmUgdXNpbmcgaXQgaW4gdGhlIGZ1bmN0aW9ucyB0aGF0IHJlcXVpcmUgdGhlIFVzZXIgQXBwL1JCUE0vSURNQVBQUyBmcmFtZXdvcmsmI3hkOwogICAgdmFyIGZuYW1lLCBpLCBpbnB1dCA9IFtdOyYjeGQ7CiAgICBmbmFtZSA9ICdQUkQuaW5pdCgpOiAnOyYjeGQ7CiAgICBpZiAoIG9iajEgIT0gbnVsbCApIHsmI3hkOwogICAgICBpbnB1dC5wdXNoKCBvYmoxICk7JiN4ZDsKICAgIH0gZWxzZSB7JiN4ZDsKICAgICAgbG9nZXJyb3IoIGZuYW1lICsgJ3JlcXVpcmVzIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIuJyApOyYjeGQ7CiAgICB9JiN4ZDsKICAgIGlmICggb2JqMiAhPSBudWxsICkgeyYjeGQ7CiAgICAgIGlucHV0LnB1c2goIG9iajIgKTsmI3hkOwogICAgfSYjeGQ7CiAgICBpZiAoIG9iajMgIT0gbnVsbCApIHsmI3hkOwogICAgICBpbnB1dC5wdXNoKCBvYmozICk7JiN4ZDsKICAgIH0mI3hkOwogICAgLy8gUGFyc2UgaW5wdXQgcGFyYW1ldGVycyBhbmQgc2V0dXAgdGhlIElETUFQUFMgaW50ZXJuYWwgdmFyaWFibGUmI3hkOwogICAgZm9yICggaSA9IDA7IGkgJmx0OyBpbnB1dC5sZW5ndGg7IGkrKyApIHsmI3hkOwogICAgICBpZiAoIGlzRmllbGQoIGlucHV0WyBpIF0gKSAmYW1wOyZhbXA7IElETUFQUFMuZmllbGQgPT09IG51bGwgKSB7JiN4ZDsKICAgICAgICBsb2dlcnJvciggZm5hbWUgKyAnc2V0dGluZyB1cCBpbnRlcm5hbCByZWZlcmVuY2UgdG8gZmllbGQuJyApOyYjeGQ7CiAgICAgICAgSURNQVBQUy5maWVsZCA9IGlucHV0WyBpIF07JiN4ZDsKICAgICAgICBpZiAoICd3ZWInIGluIFB1YmxpY0FQSSApIHsmI3hkOwogICAgICAgICAgUHVibGljQVBJLndlYi5maWVsZCA9IGlucHV0WyBpIF07JiN4ZDsKICAgICAgICB9JiN4ZDsKICAgICAgfSBlbHNlIGlmICggaXNGb3JtKCBpbnB1dFsgaSBdICkgJmFtcDsmYW1wOyBJRE1BUFBTLmZvcm0gPT09IG51bGwgKSB7JiN4ZDsKICAgICAgICBsb2dlcnJvciggZm5hbWUgKyAnc2V0dGluZyB1cCBpbnRlcm5hbCByZWZlcmVuY2UgdG8gZm9ybS4nICk7JiN4ZDsKICAgICAgICBJRE1BUFBTLmZvcm0gPSBpbnB1dFsgaSBdOyYjeGQ7CiAgICAgICAgaWYgKCAnd2ViJyBpbiBQdWJsaWNBUEkgKSB7JiN4ZDsKICAgICAgICAgIFB1YmxpY0FQSS53ZWIuZm9ybSA9IGlucHV0WyBpIF07JiN4ZDsKICAgICAgICB9JiN4ZDsKICAgICAgfSBlbHNlIGlmICggaXNJRFZhdWx0KCBpbnB1dFsgaSBdICkgJmFtcDsmYW1wOyBJRE1BUFBTLklEVmF1bHQgPT09IG51bGwgKSB7JiN4ZDsKICAgICAgICBsb2dlcnJvciggZm5hbWUgKyAnc2V0dGluZyB1cCBpbnRlcm5hbCByZWZlcmVuY2UgdG8gSURWYXVsdC4nICk7JiN4ZDsKICAgICAgICBJRE1BUFBTLklEVmF1bHQgPSBpbnB1dFsgaSBdOyYjeGQ7CiAgICAgICAgaWYgKCAnd2ViJyBpbiBQdWJsaWNBUEkgKSB7JiN4ZDsKICAgICAgICAgIFB1YmxpY0FQSS53ZWIuSURWYXVsdCA9IGlucHV0WyBpIF07JiN4ZDsKICAgICAgICB9JiN4ZDsKICAgICAgfSBlbHNlIHsmI3hkOwogICAgICAgIGxvZ2Vycm9yKCBmbmFtZSArICdQYXJhbWV0ZXIgb2JqJyArIChpKzEpICsgJyBpcyBub3Qgb25lIG9mIHRoZSAzIGV4cGVjdGVkIGZyYW1ld29yayBvYmplY3RzLCBza2lwcGluZyBpdC4nICk7JiN4ZDsKICAgICAgfSYjeGQ7CiAgICB9JiN4ZDsKICB9JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIEluc3BlY3RzIGlmIHRoZSBvYmplY3QgcmVjZWl2ZWQgaGFzIGFsbCB0aGUgcHJvcGV0aWVzIGluIHRoZSBhcnJheSByZWNlaXZlZCBhbmQgdGhhdCB0aGV5IGFyZSB0eXBlb2YgJ2Z1bmN0aW9uJy4mI3hkOwogICAqIEBzaW5jZSAxLjAuNCYjeGQ7CiAgICogQHByaXZhdGUmI3hkOwogICAqIEBwYXJhbSB7c3RyaW5nfSAgICBvYmogICAgT2JqZWN0IHRvIGNoZWNrJiN4ZDsKICAgKiBAcGFyYW0ge3N0cmluZ1tdfSAgbGlzdCAgIExpc3Qgb2YgZnVuY3Rpb25zIHRvIHZhbGlkYXRlIHRoYXQgdGhlIG9iamVjdCBoYXMgdGhlbSYjeGQ7CiAgICogQHR5cGUge2Jvb2xlYW59JiN4ZDsKICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBvYmogaGFzIGFsbCBmdW5jdGlvbnMgbGlzdGVkLCBmYWxzZSBvdGhlcndpc2UuJiN4ZDsKICAgKi8mI3hkOwogIGZ1bmN0aW9uIG9iamVjdEhhc0Z1bmN0aW9ucyggb2JqLCBsaXN0ICkgeyYjeGQ7CiAgICB2YXIgZm5hbWUsIGk7JiN4ZDsKICAgIGZuYW1lID0gJ29iamVjdEhhc0Z1bmN0aW9ucygpOiAnOyYjeGQ7CiAgICBpZiAoIG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCAoISAobGlzdCBpbnN0YW5jZW9mIEFycmF5KSApIHx8IGxpc3QubGVuZ3RoID09PSAwICkgeyYjeGQ7CiAgICAgIGRlYnVnbXNnKCBmbmFtZSArICdQbGVhc2UgcmV2aWV3IHlvdXIgaW5wdXQgcGFyYW1ldGVycy4nKTsmI3hkOwogICAgICByZXR1cm4gZmFsc2U7JiN4ZDsKICAgIH0mI3hkOwogICAgZm9yICggaSA9IDA7IGkgJmx0OyBsaXN0Lmxlbmd0aDsgaSArKykgeyYjeGQ7CiAgICAgIGlmICggISBvYmouaGFzT3duUHJvcGVydHkoIGxpc3RbIGkgXSApICkgeyYjeGQ7CiAgICAgICAgcmV0dXJuIGZhbHNlOyYjeGQ7CiAgICAgIH0gZWxzZSBpZiAoIHR5cGVvZiBvYmpbIGxpc3RbIGkgXSBdICE9PSAnZnVuY3Rpb24nICkgeyYjeGQ7CiAgICAgICAgcmV0dXJuIGZhbHNlOyYjeGQ7CiAgICAgIH0mI3hkOwogICAgfSYjeGQ7CiAgICByZXR1cm4gdHJ1ZTsmI3hkOwogIH0mI3hkOwomI3hkOwogIC8qKiYjeGQ7CiAgICogSW5zcGVjdHMgaWYgdGhlIHBhcmFtZXRlciBwcm92aWRlZCBpcyB0aGUgSURNQVBQUyBmcmFtZXdvcmsgb2JqZWN0ICdmaWVsZCcuJiN4ZDsKICAgKiBAc2luY2UgMS4wLjQmI3hkOwogICAqIEBwcml2YXRlJiN4ZDsKICAgKiBAcGFyYW0ge3N0cmluZ30gIG9iaiAgIE9iamVjdCB0byBjaGVjayYjeGQ7CiAgICogQHR5cGUge2Jvb2xlYW59JiN4ZDsKICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBpbnB1dCBpcyBJRE1BUFBTIGZyYW1ld29yayBmaWVsZCBvYmplY3QsIGZhbHNlIG90aGVyd2lzZS4mI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gaXNGaWVsZCggb2JqICkgeyYjeGQ7CiAgICB2YXIgcHJvcGVydGllczsmI3hkOwogICAgLy8gUHJvcGVydGllcyBvYnRhaW5lZCBmcm9tIElETSA0LjUgT2JqZWN0LmtleXMoIGZpZWxkICkgZXhlY3V0ZWQgb24gYSB3ZWIgYnJvd3NlciYjeGQ7CiAgICBwcm9wZXJ0aWVzID0gWyAnZ2V0TmFtZScsICdnZXRMYWJlbCcsICd2YWxpZGF0ZScsICdmaXJlRXZlbnQnLCAnaGlkZScsJiN4ZDsKICAgICAgJ3Nob3cnLCAnZW5hYmxlJywgJ2Rpc2FibGUnLCAnZ2V0VmFsdWUnLCAnZ2V0VmFsdWVzJywgJ2dldEFsbFZhbHVlcycsJiN4ZDsKICAgICAgJ3NldFZhbHVlcycsICdmb2N1cycsICdzZWxlY3QnLCAnYWN0aXZhdGUnLCAnc2V0UmVxdWlyZWQnJiN4ZDsKICAgIF07JiN4ZDsKICAgIHJldHVybiBvYmplY3RIYXNGdW5jdGlvbnMoIG9iaiwgcHJvcGVydGllcyApOyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiBJbnNwZWN0cyBpZiB0aGUgcGFyYW1ldGVyIHByb3ZpZGVkIGlzIHRoZSBJRE1BUFBTIGZyYW1ld29yayBvYmplY3QgJ2Zvcm0nLiYjeGQ7CiAgICogQHNpbmNlIDEuMC40JiN4ZDsKICAgKiBAcHJpdmF0ZSYjeGQ7CiAgICogQHBhcmFtIHtzdHJpbmd9ICBvYmogICBPYmplY3QgdG8gY2hlY2smI3hkOwogICAqIEB0eXBlIHtib29sZWFufSYjeGQ7CiAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgaW5wdXQgaXMgSURNQVBQUyBmcmFtZXdvcmsgZmllbGQgb2JqZWN0LCBmYWxzZSBvdGhlcndpc2UuJiN4ZDsKICAgKi8mI3hkOwogIGZ1bmN0aW9uIGlzRm9ybSggb2JqICkgeyYjeGQ7CiAgICB2YXIgcHJvcGVydGllczsmI3hkOwogICAgLy8gUHJvcGVydGllcyBvYnRhaW5lZCBmcm9tIElETSA0LjUgT2JqZWN0LmtleXMoIGZvcm0gKSBleGVjdXRlZCBvbiBhIHdlYiBicm93c2VyJiN4ZDsKICAgIHByb3BlcnRpZXMgPSBbICdnZXRGaWVsZCcsICdhbGVydCcsICdzaG93TXNnJywgJ3Nob3dXYXJuaW5nJywgJ3Nob3dFcnJvcicsJiN4ZDsKICAgICAgJ3Nob3dGYXRhbCcsICd2YWxpZGF0ZScsICdzdWJtaXQnLCAnZ2V0TGFiZWwnLCAnaGlkZScsICdzaG93JywgJ2VuYWJsZScsJiN4ZDsKICAgICAgJ2Rpc2FibGUnLCAnZ2V0VmFsdWUnLCAnZ2V0VmFsdWVzJywgJ2dldEFsbFZhbHVlcycsICdzZXRWYWx1ZXMnLCAnZm9jdXMnLCYjeGQ7CiAgICAgICdzZWxlY3QnLCAnYWN0aXZhdGUnLCAnc2V0UmVxdWlyZWQnLCAnaW50ZXJjZXB0QWN0aW9uJywgJ2dldExvY2FsZScsJiN4ZDsKICAgICAgJ2dldERlZmF1bHRMb2NhbGUnLCAnZ2V0UkJNZXNzYWdlJywgJ3N0cmluZ1RvRGF0ZScsICdkYXRlVG9TdHJpbmcnLCYjeGQ7CiAgICAgICdpc1ZhbGlkRGF0ZScsICdzaG93RGVidWdNc2cnLCAnYWRkQ3VzdG9tVmFsaWRhdGlvbicsICdjbGVhck1lc3NhZ2VzJyYjeGQ7CiAgICBdOyYjeGQ7CiAgICByZXR1cm4gb2JqZWN0SGFzRnVuY3Rpb25zKCBvYmosIHByb3BlcnRpZXMgKTsmI3hkOwogIH0mI3hkOwomI3hkOwogIC8qKiYjeGQ7CiAgICogSW5zcGVjdHMgaWYgdGhlIHBhcmFtZXRlciBwcm92aWRlZCBpcyB0aGUgSURNQVBQUyBmcmFtZXdvcmsgb2JqZWN0ICdJRFZhdWx0JyYjeGQ7CiAgICogQHNpbmNlIDEuMC40JiN4ZDsKICAgKiBAcHJpdmF0ZSYjeGQ7CiAgICogQHBhcmFtIHtzdHJpbmd9ICBvYmogICBPYmplY3QgdG8gY2hlY2smI3hkOwogICAqIEB0eXBlIHtib29sZWFufSYjeGQ7CiAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgaW5wdXQgaXMgSURNQVBQUyBmcmFtZXdvcmsgZmllbGQgb2JqZWN0LCBmYWxzZSBvdGhlcndpc2UuJiN4ZDsKICAgKi8mI3hkOwogIGZ1bmN0aW9uIGlzSURWYXVsdCggb2JqICkgeyYjeGQ7CiAgICB2YXIgcHJvcGVydGllczsmI3hkOwogICAgLy8gUHJvcGVydGllcyBvYnRhaW5lZCBmcm9tIElETSA0LjUgT2JqZWN0LmtleXMoIElEdmF1bHQgKSBleGVjdXRlZCBvbiBhIHdlYiBicm93c2VyJiN4ZDsKICAgIHByb3BlcnRpZXMgPSBbICdnbG9iYWxRdWVyeScsICdjb250YWluZXJzJywgJ2dldCcsICdnbG9iYWxMaXN0JywmI3hkOwogICAgICAnZ2V0R3VpZEZyb21EbicsICdnZXREbkZyb21HdWlkJywgJ2V4ZWNTZXJ2aWNlJyYjeGQ7CiAgICBdOyYjeGQ7CiAgICByZXR1cm4gb2JqZWN0SGFzRnVuY3Rpb25zKCBvYmosIHByb3BlcnRpZXMgKTsmI3hkOwogIH0mI3hkOwomI3hkOwogIC8qKiYjeGQ7CiAgICogKEZvcm0gb25seSkgV2hlbiBhZGRlZCBpbiB0aGUgZXZlbnQgc2VjdGlvbiBvZiBhIGZvcm0gZmllbGQsIGFsbG93IHVzIHRvIHNob3cgYW5kIGhpZGUgdGhhdCBmaWVsZCBieSB1c2luZyZsdDtici8mZ3Q7JiN4ZDsKICAgKiBmaWVsZC5maXJlRXZlbnQoIGV2ZW50LW5hbWUsIGFjdGlvbiApOyZsdDtici8mZ3Q7JiN4ZDsKICAgKiBXaGVyZSBldmVudC1uYW1lIGlzIHRoZSBldmVudCdzIG5hbWUgYW5kIGFjdGlvbiBpcyBlaXRoZXIgJ3Nob3cnIG9yICdoaWRlJyZsdDtici8mZ3Q7JiN4ZDsKICAgKiAmbHQ7YnIvJmd0OyYjeGQ7CiAgICogU2luY2UgdGhlIGZpZWxkIHZpc2liaWxpdHkgZnVuY3Rpb25zIG9ubHkgZXhpc3QgaW5zaWRlIHRoZSBmaWVsZCBjb250ZXh0IHdlIG5lZWQgdG8gcGFzcyBib3RoIG9iamVjdHMgZnJvbSB3aGVyZSYjeGQ7CiAgICogdGhlIGZ1bmN0aW9uIGlzIGJlaW5nIGNhbGxlZCB0byB1c2UgdGhlbSBpbnNpZGUgdGhhdCBzY29wZS9jb250ZXh0LiBJbnNpZGUgdGhlIGV2ZW50IHdlIGp1c3QgbmVlZCB0byBhZGQgdGhlIGxpbmU6Jmx0O2JyLyZndDsmI3hkOwogICAqIElBdG9vbHMuZmllbGRWaXNpYmlsaXR5KCBldmVudCwgZmllbGQgKTsmbHQ7YnIvJmd0OyYjeGQ7CiAgICogdG8gcHJvcGVybHkgdXNlIHRoaXMgZnVuY3Rpb24uIE5vIG5lZWQgdG8gY2hhbmdlIGFueXRoaW5nIG9uIHRoZSBsaW5lIGFib3ZlLCBpdCBpcyBhbHJlYWR5IHBhc3NpbmcgdGhlIGV2ZW50IGFuZCBmaWVsZCBvYmplY3RzJiN4ZDsKICAgKiBhcyBzZWVuIGluIHRoZSBzY29wZSBvZiB0aGF0IHBhcnRpY3VsYXIgZm9ybSBmaWVsZC4mbHQ7YnIvJmd0OyYjeGQ7CiAgICogJmx0O2JyLyZndDsmI3hkOwogICAqIG5vIHJldHVybiB2YWx1ZSBwcm92aWRlZC4mI3hkOwogICAqJiN4ZDsKICAgKiBAbWVtYmVyb2YgUFJELndlYiYjeGQ7CiAgICogQHNpbmNlIDEuMC40JiN4ZDsKICAgKiYjeGQ7CiAgICogQHBhcmFtIHtvYmplY3R9ICBldmVudCAgZXZlbnQgb2JqZWN0IGFzIHNlZW4gYnkgdGhlIGZpZWxkJ3Mgc2NvcGUmI3hkOwogICAqIEBwYXJhbSB7b2JqZWN0fSAgZmllbGQgIGZpZWxkICBvYmplY3QgYXMgc2VlbiBieSB0aGUgZmllbGQncyBzY29wZSYjeGQ7CiAgICovJiN4ZDsKICBmdW5jdGlvbiBmaWVsZFZpc2liaWxpdHkoIGV2ZW50LCBmaWVsZCApIHsmI3hkOwogICAgdmFyIGFjdGlvbiA9IFN0cmluZyggZXZlbnQuZ2V0Q3VzdG9tRGF0YSgpICk7JiN4ZDsKICAgIHN3aXRjaCAoIGFjdGlvbi50b0xvd2VyQ2FzZSgpICkgeyYjeGQ7CiAgICAgIGNhc2UgJ3Nob3cnOiYjeGQ7CiAgICAgICAgZmllbGQuc2hvdygpOyYjeGQ7CiAgICAgICAgYnJlYWs7JiN4ZDsKICAgICAgY2FzZSAnaGlkZSc6JiN4ZDsKICAgICAgICBmaWVsZC5oaWRlKCk7JiN4ZDsKICAgICAgICBicmVhazsmI3hkOwogICAgICBkZWZhdWx0OiYjeGQ7CiAgICAgIGxvZ2Vycm9yKCAnRmllbGQ6ICcgKyBmaWVsZC5nZXRMYWJlbCgpICsgJywgRXZlbnQ6ICcgKyBldmVudC5nZXRFdmVudE5hbWUoKSArICcsIEludmFsaWQgb3B0aW9uIHJlY2VpdmVkOiAnICsgYWN0aW9uICk7JiN4ZDsKICAgIH0mI3hkOwogIH0mI3hkOwomI3hkOwogIC8qKiYjeGQ7CiAgICogV3JhcHBlciBmb3IgdGhlIHBhcnNlKCkgY2FsbCBvbiB0aGUgaG9zdCBlbnZpcm9ubWVudCdzIEpTT04gb2JqZWN0LiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvSlNPTi9wYXJzZSYjeGQ7CiAgIComI3hkOwogICAqIEBmdW5jdGlvbiBwYXJzZSYjeGQ7CiAgICogQG1lbWJlcm9mIFBSRC51dGlsLkpTT05vYmomI3hkOwogICAqIEBzaW5jZSAxLjAuMiYjeGQ7CiAgIComI3hkOwogICAqIEBwYXJhbSB7c3RyaW5nfSAgICAgcyAgICAgICAgICBTdHJpbmcgd2l0aCB2YWxpZCBKU09OIHN5bnRheCYjeGQ7CiAgICogQHBhcmFtIHtmdW5jdGlvbj19ICBbcmV2aXZlcl0gKE9wdGlvbmFsKSBJZiBhIGZ1bmN0aW9uLCB0aGlzIHByZXNjcmliZXMgaG93IHRoZSB2YWx1ZSBvcmlnaW5hbGx5IHByb2R1Y2VkIGJ5IHBhcnNpbmcgaXMgdHJhbnNmb3JtZWQsIGJlZm9yZSBiZWluZyByZXR1cm5lZC4mI3hkOwogICAqJiN4ZDsKICAgKiBAdHlwZSB7b2JqZWN0fSYjeGQ7CiAgICogQHJldHVybiB7b2JqZWN0fSBFQ01BIE9iamVjdCBnZW5lcmF0ZWQgZnJvbSB0aGUgSlNPTiBzdHJpbmcuIE9uIGVycm9yIHJldHVybiBlbXB0eSBvYmplY3QgYW5kIHJlcG9ydCB0aGUgZXJyb3IgdmlhIGxvZ2Vycm9yKCkmI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gSlNPTnBhcnNlKCBzLCByICkgeyYjeGQ7CiAgICB2YXIgZm5hbWUsIHJlcywgcG9pbnRlcjsmI3hkOwogICAgZm5hbWUgPSAnSlNPTm9iai5wYXJzZSgpOiAnOyYjeGQ7CiAgICAvLyBTZXR1cCBhIHBvaW50ZXIgdG8gdGhlIEpTT04gb2JqZWN0IHNpbmNlIGl0cyBuYW1lIGRpZmZlcnMgb24gZm9ybXMgYW5kIGVuZ2luZS4mI3hkOwogICAgcG9pbnRlciA9IEpTT05wdHI7JiN4ZDsKICAgIHRyeSB7JiN4ZDsKICAgICAgcmVzID0gcG9pbnRlci5wYXJzZSggcywgciApOyYjeGQ7CiAgICB9IGNhdGNoKCBlICl7JiN4ZDsKICAgICAgbG9nZXJyb3IoIGZuYW1lICsgZS5tZXNzYWdlICk7JiN4ZDsKICAgIH0mI3hkOwogICAgaWYgKCEgcmVzICkgeyYjeGQ7CiAgICAgIGRlYnVnbXNnKCBmbmFtZSArICdpbnB1dCBwcm9jZXNzaW5nIHJlc3VsdGVkIGluIGEgbnVsbCB2YWx1ZS4nICk7JiN4ZDsKICAgICAgcmV0dXJuIHt9OyYjeGQ7CiAgICB9JiN4ZDsKICAgIHJldHVybiByZXM7JiN4ZDsKICB9JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIFdyYXBwZXIgZm9yIHRoZSBzdHJpbmdpZnkoKSBjYWxsIG9uIHRoZSBob3N0IGVudmlyb25tZW50J3MgSlNPTiBvYmplY3QuJmx0O2JyLyZndDsmI3hkOwogICAqIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9KU09OL3N0cmluZ2lmeSYjeGQ7CiAgIComI3hkOwogICAqIEBmdW5jdGlvbiBzdHJpbmdpZnkmI3hkOwogICAqIEBtZW1iZXJvZiBQUkQudXRpbC5KU09Ob2JqJiN4ZDsKICAgKiBAc2luY2UgMS4wLjImI3hkOwogICAqJiN4ZDsKICAgKiBAcGFyYW0ge29iamVjdH0gICAgICAgICAgICAgICAgICAgICAgICBvICAgICAgICAgICBFQ01BIG9iamVjdCB0byBjb252ZXJ0IHRvIEpTT04mI3hkOwogICAqIEBwYXJhbSB7KGZ1bmN0aW9ufHN0cmluZ1tdfG51bWJlcltdKT19IFtyZXBsYWNlcl0gIChPcHRpb25hbCkgQSBmdW5jdGlvbiB0aGF0IGFsdGVycyB0aGUgYmVoYXZpb3Igb2YgdGhlIHN0cmluZ2lmaWNhdGlvbiBwcm9jZXNzLCBvciBhbiBhcnJheSBvZiBTdHJpbmcgYW5kIE51bWJlciBvYmplY3RzIHRoYXQgc2VydmUgYXMgYSB3aGl0ZWxpc3QgZm9yIHNlbGVjdGluZy9maWx0ZXJpbmcgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHZhbHVlIG9iamVjdCB0byBiZSBpbmNsdWRlZCBpbiB0aGUgSlNPTiBzdHJpbmcuIElmIHRoaXMgdmFsdWUgaXMgbnVsbCBvciBub3QgcHJvdmlkZWQsIGFsbCBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3QgYXJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgSlNPTiBzdHJpbmcmI3hkOwogICAqIEBwYXJhbSB7KHN0cmluZ3xudW1iZXIpPX0gICAgICAgICAgICAgIFtzcGFjZV0gICAgIChPcHRpb25hbCkgQSBTdHJpbmcgb3IgTnVtYmVyIG9iamVjdCB0aGF0J3MgdXNlZCB0byBpbnNlcnQgd2hpdGUgc3BhY2UgaW50byB0aGUgb3V0cHV0IEpTT04gc3RyaW5nIGZvciByZWFkYWJpbGl0eSBwdXJwb3Nlcy4gSWYgdGhpcyBpcyBhIE51bWJlciwgaXQgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2Ygc3BhY2UgY2hhcmFjdGVycyB0byB1c2UgYXMgd2hpdGUgc3BhY2U7IHRoaXMgbnVtYmVyIGlzIGNhcHBlZCBhdCAxMCAoaWYgaXQgaXMgZ3JlYXRlciwgdGhlIHZhbHVlIGlzIGp1c3QgMTApLiBWYWx1ZXMgbGVzcyB0aGFuIDEgaW5kaWNhdGUgdGhhdCBubyBzcGFjZSBzaG91bGQgYmUgdXNlZC4gSWYgdGhpcyBpcyBhIFN0cmluZywgdGhlIHN0cmluZyAob3IgdGhlIGZpcnN0IDEwIGNoYXJhY3RlcnMgb2YgdGhlIHN0cmluZywgaWYgaXQncyBsb25nZXIgdGhhbiB0aGF0KSBpcyB1c2VkIGFzIHdoaXRlIHNwYWNlLiBJZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgcHJvdmlkZWQgKG9yIGlzIG51bGwpLCBubyB3aGl0ZSBzcGFjZSBpcyB1c2VkLiYjeGQ7CiAgIComI3hkOwogICAqIEB0eXBlIHtzdHJpbmd9JiN4ZDsKICAgKiBAcmV0dXJuIHtzdHJpbmd9IFNlcmlhbGl6ZWQgRUNNQSBvYmplY3QgaW4gSlNPTiBmb3JtYXQuIE9uIGVycm9yIHJldHVybiBlbXB0eSBzdHJpbmcgYW5kIHJlcG9ydCB0aGUgZXJyb3IgdmlhIGxvZ2Vycm9yKCkmI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gSlNPTnN0cmluZ2lmeSggbywgciwgcyApIHsmI3hkOwogICAgdmFyIGZuYW1lLCByZXMsIHBvaW50ZXI7JiN4ZDsKICAgIGZuYW1lID0gJ0pTT05vYmouc3RyaW5naWZ5KCk6ICc7JiN4ZDsKICAgIC8vIFNldHVwIGEgcG9pbnRlciB0byB0aGUgSlNPTiBvYmplY3Qgc2luY2UgaXRzIG5hbWUgZGlmZmVycyBvbiBmb3JtcyBhbmQgZW5naW5lLiYjeGQ7CiAgICBwb2ludGVyID0gSlNPTnB0cjsmI3hkOwogICAgdHJ5IHsmI3hkOwogICAgICByZXMgPSBwb2ludGVyLnN0cmluZ2lmeSggbywgciwgcyApOyYjeGQ7CiAgICB9IGNhdGNoKCBlICl7JiN4ZDsKICAgICAgbG9nZXJyb3IoIGZuYW1lICsgZS5tZXNzYWdlICk7JiN4ZDsKICAgIH0mI3hkOwogICAgaWYgKCEgcmVzICkgeyYjeGQ7CiAgICAgIGRlYnVnbXNnKCBmbmFtZSArICdpbnB1dCBwcm9jZXNzaW5nIHJlc3VsdGVkIGluIGEgbnVsbCB2YWx1ZS4nICk7JiN4ZDsKICAgICAgcmV0dXJuICcnOyYjeGQ7CiAgICB9JiN4ZDsKICAgIHJldHVybiByZXM7JiN4ZDsKICB9JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogKiBWZXJpZnkgaWYgYW4gRUNNQSBvYmplY3QgaGFzIHRoZSBzZWxlY3RlZCBsb2NhdGlvbi4mbHQ7YnIvJmd0OyYjeGQ7CiAqIE5vdGU6IFRvIHJlZmVyZW5jZSBwcm9wZXJ0aWVzIHdpdGggYSBkb3QgaW4gdGhlaXIgbmFtZSB1c2UgdGhlIGZvcm1hdCBbInByb3BlcnR5Lm5hbWUiXSAuJmx0O2JyLyZndDsmI3hkOwogKiYjeGQ7CiAqIFBvcnRlZCBmcm9tIElETSBlbmdpbmUgdG8gUkJQTS4gSURNIEVuZ2luZSB2ZXJzaW9uIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9mY2hpZXJhZC9JRE0tRUNNQWxpYi9ibG9iL3YxLjAuMi9KU09ObGliLUpTLmpzJiN4ZDsKIComI3hkOwogKiBAZnVuY3Rpb24gdGVzdCYjeGQ7CiAqIEBtZW1iZXJvZiBQUkQudXRpbC5KU09Ob2JqJiN4ZDsKICogQHNpbmNlIDEuMC4zJiN4ZDsKIComI3hkOwogKiBAcGFyYW0geyhvYmplY3R8c3RyaW5nKX0gIGlucHV0SlNPTiAgICBJbnB1dCBKU09OIChFQ01BIG9iamVjdCkuIElmIGEgc3RyaW5nLXNlcmlhbGl6ZWQgSlNPTiBpcyBwcm92aWRlZCBpdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIEpTT04gb2JqZWN0IGludGVybmFsbHkmI3hkOwogKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICAgIHdoYXR0b3Rlc3QgICBEb3Qtc2VwYXJhdGVkIGxpc3Qgb2YgcHJvcGVydGllcyBhcyBpZiB5b3UgYXJlIGFjY2Vzc2luZyB0aGVtIHZpYSBFQ01Bc2NyaXB0JiN4ZDsKIComI3hkOwogKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBwYXRoIGlzIGZvdW5kLCBmYWxzZSBvdGhlcndpc2UmI3hkOwogKi8mI3hkOwpmdW5jdGlvbiBKU09OdGVzdCggaW5wdXRKU09OLCB3aGF0dG90ZXN0ICkgeyYjeGQ7CiAgdmFyIGZuYW1lLCBpLCBpdHZhbCwgaXRvYmosIG9iaiwgZ2V0QXJyLCBwcm9wTmFtZTsmI3hkOwogIGZuYW1lID0gJ0pTT05vYmoudGVzdCgpOiAnOyYjeGQ7CiAgLy8gUmV2aWV3IGlucHV0IGRhdGEmI3hkOwogIGlmICggaXNTdHJpbmcoIGlucHV0SlNPTiApICkgeyYjeGQ7CiAgICBvYmogPSBKU09OcGFyc2UoIGlucHV0SlNPTiApOyYjeGQ7CiAgfSBlbHNlIGlmICggaW5wdXRKU09OICZhbXA7JmFtcDsgdHlwZW9mIGlucHV0SlNPTiA9PT0gJ29iamVjdCcgKSB7JiN4ZDsKICAgIG9iaiA9IGlucHV0SlNPTjsmI3hkOwogIH0gZWxzZSB7JiN4ZDsKICAgIGxvZ2Vycm9yKCBmbmFtZSArICdwYXJhbWV0ZXIgaW5wdXRKU09OIG5lZWQgdG8gYmUgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBKU09OIG9iamVjdCBvciB0aGUgSlNPTiBvYmplY3QgaXRzZWxmLicgKTsmI3hkOwogICAgcmV0dXJuIGZhbHNlOyYjeGQ7CiAgfSYjeGQ7CiAgaWYgKCBpc1N0cmluZyggd2hhdHRvdGVzdCApICkgeyYjeGQ7CiAgICBnZXRBcnIgPSBjaGFyQXJyVG9Qcm9wZXJ0eU5hbWVzKCBzdHJpbmdUb0NoYXJBcnJheSggd2hhdHRvdGVzdCApICk7JiN4ZDsKICB9IGVsc2UgeyYjeGQ7CiAgICBsb2dlcnJvciggZm5hbWUgKyAncGFyYW1ldGVyIHdoYXR0b3Rlc3Qgc2hvdWxkIGJlIGEgc3RyaW5nIHZhbHVlLicgKTsmI3hkOwogICAgcmV0dXJuIGZhbHNlOyYjeGQ7CiAgfSYjeGQ7CiAgLy8gSXRlcmF0ZXMgdGhyb3VnaCB0aGUgb2JqZWN0IHVzaW5nIGl0b2JqIGFuZCBpdHZhbCBhcyB0aGUgbWlkZGxlIHN0ZXBzIHRvIGZpbmQgdGhlIGRlc2lyZWQgcmVzdWx0JiN4ZDsKICBpdG9iaiA9IG9iajsmI3hkOwogIGZvciAoIGkgPSAwOyBpICZsdDsgZ2V0QXJyLmxlbmd0aDsgaSsrICkgeyYjeGQ7CiAgICBwcm9wTmFtZSA9IGdldEFyclsgaSBdOyYjeGQ7CiAgICBkZWJ1Z21zZyggZm5hbWUgKyAnUGFyc2luZzogIicgKyBwcm9wTmFtZSArICciLCB0eXBlOiAnICsgdHlwZW9mIHByb3BOYW1lICk7JiN4ZDsKICAgIGlmICggdHlwZW9mIGl0b2JqID09PSAnb2JqZWN0JyAmYW1wOyZhbXA7IHByb3BOYW1lIGluIGl0b2JqICkgeyYjeGQ7CiAgICAgIGl0dmFsID0gaXRvYmpbIHByb3BOYW1lIF07JiN4ZDsKICAgIH0gZWxzZSB7JiN4ZDsKICAgICAgZGVidWdtc2coIGZuYW1lICsgJ3BhcnNpbmcgJyArIHdoYXR0b3Rlc3QgKyAnLCBjb3VsZCBub3QgZmluZCBwcm9wZXJ0eSAiJyArIHByb3BOYW1lICsgJyIgaW4gdGhlIGN1cnJlbnQgb2JqZWN0IGxvY2F0aW9uLicgKTsmI3hkOwogICAgICByZXR1cm4gZmFsc2U7JiN4ZDsKICAgIH0mI3hkOwogICAgaXRvYmogPSBpdHZhbDsmI3hkOwogIH0mI3hkOwogIHJldHVybiB0cnVlOyYjeGQ7Cn0mI3hkOwomI3hkOwovKiomI3hkOwogKiBSZXRyaWV2ZXMgYSBwcm9wZXJ0eSBvZiBhbiBFQ01BIG9iamVjdCAob3IgaXRzIHN1Ym9yZGluYXRlIG9iamVjdCkgYW5kIHJldHVybnMgaXQgaW4gdGhlIHNwZWNpZmllZCB0eXBlLiZsdDtici8mZ3Q7JiN4ZDsKICogTm90ZTogVG8gcmVmZXJlbmNlIHByb3BlcnRpZXMgd2l0aCBhIGRvdCBpbiB0aGVpciBuYW1lIHVzZSB0aGUgZm9ybWF0IFsicHJvcGVydHkubmFtZSJdIC4mbHQ7YnIvJmd0OyYjeGQ7CiAqJiN4ZDsKICogUG9ydGVkIGZyb20gSURNIGVuZ2luZSB0byBSQlBNLiBJRE0gRW5naW5lIHZlcnNpb24gYXQgaHR0cHM6Ly9naXRodWIuY29tL2ZjaGllcmFkL0lETS1FQ01BbGliL2Jsb2IvdjEuMC4yL0pTT05saWItSlMuanMmI3hkOwogKiYjeGQ7CiAqIEBmdW5jdGlvbiBnZXQmI3hkOwogKiBAbWVtYmVyb2YgUFJELnV0aWwuSlNPTm9iaiYjeGQ7CiAqIEBzaW5jZSAxLjAuMyYjeGQ7CiAqJiN4ZDsKICogQHBhcmFtIHsob2JqZWN0fHN0cmluZyl9ICBpbnB1dEpTT04gICAgIElucHV0IEpTT04gKEVDTUEgb2JqZWN0KS4gSWYgYSBzdHJpbmctc2VyaWFsaXplZCBKU09OIGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgY29udmVydGVkIHRvIGEgSlNPTiBvYmplY3QgaW50ZXJuYWxseSYjeGQ7CiAqIEBwYXJhbSB7c3RyaW5nfSAgICAgICAgICAgd2hhdHRvZ2V0ICAgICBEb3Qtc2VwYXJhdGVkIGxpc3Qgb2YgcHJvcGVydGllcyBhcyBpZiB5b3UgYXJlIGFjY2Vzc2luZyB0aGVtIHZpYSBFQ01Bc2NyaXB0JiN4ZDsKICogQHBhcmFtIHtzdHJpbmc9fSAgICAgICAgICBbcmV0dXJudHlwZV0gIChPcHRpb25hbCkgRGVzaXJlZCByZXR1cm4gdHlwZS4gVmFsaWQgdmFsdWVzIGFyZTogc3RyaW5nLCBudW1iZXIsIHJhdy4gRGVmYXVsdHMgdG8gcmF3IGluIGNhc2Ugd2hhdGV2ZXIgaXMgcHJvdmlkZWQgaXMgbm90IG9uZSBvZiB0aGUgMyB2YWxpZCBvcHRpb25zJiN4ZDsKIComI3hkOwogKiBAcmV0dXJuIHsoc3RyaW5nfG51bWJlcnxib29sZWFufG9iamVjdCl9IFNlbGVjdGVkIHByb3BlcnR5J3MgdmFsdWUgaW4gdGhlIHNlbGVjdGVkIGZvcm1hdC4gSWYgcGFyc2luZyBvZiB0aGUgb2JqZWN0IGZhaWxzIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nJiN4ZDsKICovJiN4ZDsKZnVuY3Rpb24gSlNPTmdldCggaW5wdXRKU09OLCB3aGF0dG9nZXQsIHJldHVybnR5cGUgKSB7JiN4ZDsKICB2YXIgZm5hbWUsIGksIGl0dmFsLCBpdG9iaiwgb2JqLCBnZXRBcnIsIHByb3BOYW1lLCByZXMgPSAnJzsmI3hkOwogIGZuYW1lID0gJ0pTT05vYmouZ2V0KCk6ICc7JiN4ZDsKICAvLyBSZXZpZXcgaW5wdXQgZGF0YSYjeGQ7CiAgaWYgKCBpc1N0cmluZyggaW5wdXRKU09OICkgKSB7JiN4ZDsKICAgIG9iaiA9IEpTT05wYXJzZSggaW5wdXRKU09OICk7JiN4ZDsKICB9IGVsc2UgaWYgKCBpbnB1dEpTT04gJmFtcDsmYW1wOyB0eXBlb2YgaW5wdXRKU09OID09PSAnb2JqZWN0JyApIHsmI3hkOwogICAgb2JqID0gaW5wdXRKU09OOyYjeGQ7CiAgfSBlbHNlIHsmI3hkOwogICAgbG9nZXJyb3IoIGZuYW1lICsgJ3BhcmFtZXRlciBpbnB1dEpTT04gbmVlZCB0byBiZSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIEpTT04gb2JqZWN0IG9yIHRoZSBKU09OIG9iamVjdCBpdHNlbGYuJyApOyYjeGQ7CiAgICByZXR1cm4gcmVzOyYjeGQ7CiAgfSYjeGQ7CiAgaWYgKCBpc1N0cmluZyggd2hhdHRvZ2V0ICkgKSB7JiN4ZDsKICAgIGdldEFyciA9IGNoYXJBcnJUb1Byb3BlcnR5TmFtZXMoIHN0cmluZ1RvQ2hhckFycmF5KCB3aGF0dG9nZXQgKSApOyYjeGQ7CiAgfSBlbHNlIHsmI3hkOwogICAgbG9nZXJyb3IoIGZuYW1lICsgJ3BhcmFtZXRlciB3aGF0dG90ZXN0IHNob3VsZCBiZSBhIHN0cmluZyB2YWx1ZS4nICk7JiN4ZDsKICAgIHJldHVybiByZXM7JiN4ZDsKICB9JiN4ZDsKICBpZiAoIHJldHVybnR5cGUgIT09ICdzdHJpbmcnICZhbXA7JmFtcDsgcmV0dXJudHlwZSAhPT0gJ251bWJlcicgJmFtcDsmYW1wOyByZXR1cm50eXBlICE9PSAncmF3JyApIHsmI3hkOwogICAgICByZXR1cm50eXBlID0gJ3Jhdyc7JiN4ZDsKICB9JiN4ZDsKICAvLyBJdGVyYXRlcyB0aHJvdWdoIHRoZSBvYmplY3QgdXNpbmcgaXRvYmogYW5kIGl0dmFsIGFzIHRoZSBtaWRkbGUgc3RlcHMgdG8gZmluZCB0aGUgZGVzaXJlZCByZXN1bHQmI3hkOwogIGl0b2JqID0gb2JqOyYjeGQ7CiAgZm9yICggaSA9IDA7IGkgJmx0OyBnZXRBcnIubGVuZ3RoOyBpKysgKSB7JiN4ZDsKICAgIHByb3BOYW1lID0gZ2V0QXJyWyBpIF07JiN4ZDsKICAgIGRlYnVnbXNnKCBmbmFtZSArICdQYXJzaW5nOiAiJyArIHByb3BOYW1lICsgJyIsIHR5cGU6ICcgKyB0eXBlb2YgcHJvcE5hbWUgKTsmI3hkOwogICAgaWYgKCB0eXBlb2YgaXRvYmogPT09ICdvYmplY3QnICZhbXA7JmFtcDsgcHJvcE5hbWUgaW4gaXRvYmogKSB7JiN4ZDsKICAgICAgaXR2YWwgPSBpdG9ialsgcHJvcE5hbWUgXTsmI3hkOwogICAgfSBlbHNlIHsmI3hkOwogICAgICBsb2dlcnJvciggZm5hbWUgKyAncGFyc2luZyAnICsgd2hhdHRvZ2V0ICsgJywgY291bGQgbm90IGZpbmQgcHJvcGVydHkgIicgKyBwcm9wTmFtZSArICciIGluIHRoZSBjdXJyZW50IG9iamVjdCBsb2NhdGlvbi4nICk7JiN4ZDsKICAgICAgcmV0dXJuIHJlczsmI3hkOwogICAgfSYjeGQ7CiAgICBpdG9iaiA9IGl0dmFsOyYjeGQ7CiAgfSYjeGQ7CiAgLy8gSW5zcGVjdCByZXR1cm5lZCBkYXRhIGFuZCBjb2VyY2UgaXQgYXMgbmVlZGVkLiBObyBkZWZhdWx0IHNldCBzaW5jZSByZXMgaXMgc2V0IGF0IHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24mI3hkOwogIHN3aXRjaCAoIHJldHVybnR5cGUgKSB7JiN4ZDsKICAgIGNhc2UgJ3N0cmluZyc6JiN4ZDsKICAgICAgcmVzID0gU3RyaW5nKCBpdHZhbCApOyYjeGQ7CiAgICAgIGJyZWFrOyYjeGQ7CiAgICBjYXNlICdudW1iZXInOiYjeGQ7CiAgICAgIHJlcyA9IE51bWJlciggaXR2YWwgKTsmI3hkOwogICAgICBicmVhazsmI3hkOwogICAgY2FzZSAncmF3JzomI3hkOwogICAgICByZXMgPSBpdHZhbDsmI3hkOwogICAgICBicmVhazsmI3hkOwogIH0mI3hkOwogIHJldHVybiByZXM7JiN4ZDsKfSYjeGQ7CiYjeGQ7Ci8vICBodHRwczovL2dpdGh1Yi5jb20vZmNoaWVyYWQvSURNLUVDTUFsaWIvYmxvYi92MS4wLjIvSlNPTmxpYi1KUy5tZCNKU09OZ2V0JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIFVuaWNvZGUtc2FmZSBzcGxpdCBvZiBhIHN0cmluZyB0byBhIGNoYXJhY3RlciBBcnJheS4mbHQ7YnIvJmd0OyYjeGQ7CiAgIComI3hkOwogICAqIFNpbmNlIElETSA0LjUvSURNIDQuNiBkb2VzIG5vdCBoYXZlIGFjY2VzcyB0byBFUzYgLSB0aGVyZWZvcmUgbm8gc3ByZWFkIC4uLiBvcGVyYXRvciAtIHRoaXMgZnVuY3Rpb24gaXMgbmVlZGVkLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBPbmNlIElETSBzdXBwb3J0cyB0aGUgc3ByZWFkIG9wZXJhdG9yIHVzZSB0aGF0IGluc3RlYWQuJmx0O2JyLyZndDsmI3hkOwogICAqJiN4ZDsKICAgKiBQb3J0ZWQgZnJvbSBJRE0gZW5naW5lIHRvIFJCUE0uIElETSBFbmdpbmUgdmVyc2lvbiBhdCBodHRwczovL2dpdGh1Yi5jb20vZmNoaWVyYWQvSURNLUVDTUFsaWIvYmxvYi92MS4wLjIvSlNPTmxpYi1KUy5qcyYjeGQ7CiAgIComI3hkOwogICAqIEBzaW5jZSAxLjAuMyYjeGQ7CiAgICogQHByaXZhdGUmI3hkOwogICAqIEBwYXJhbSB7c3RyaW5nfSAgc3RyICAgU3RyaW5nIGlucHV0LiBBbnkgb3RoZXIgaW5wdXQgd2lsbCBiZSBjb2VyY2VkIHRvIHN0cmluZyB1c2luZyBTdHJpbmcoKSBhbmQgcHJvYmFibHkgd29uJ3QgYmVoYXZlIGFzIGV4cGVjdGVkJiN4ZDsKICAgKiBAdHlwZSB7c3RyaW5nW119JiN4ZDsKICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0gVW5pY29kZS1zYWZlIGNoYXJhY3RlciBhcnJheSYjeGQ7CiAgICovJiN4ZDsKICBmdW5jdGlvbiBzdHJpbmdUb0NoYXJBcnJheSggc3RyICkgeyYjeGQ7CiAgICB2YXIgY0FyciA9IFtdLCBmbmFtZTsmI3hkOwogICAgZm5hbWUgPSAnc3RyaW5nVG9DaGFyQXJyYXkoKTogJzsmI3hkOwogICAgdHJ5IHsmI3hkOwogICAgICBjQXJyID0gU3RyaW5nKCBzdHIgKS5zcGxpdCggLyg/PSg/OltcMC1cdFx4MEJcZlx4MEUtXHUyMDI3XHUyMDJBLVx1RDdGRlx1RTAwMC1cdUZGRkZdfFtcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGXXxbXHVEODAwLVx1REJGRl0oPyFbXHVEQzAwLVx1REZGRl0pfCg/OlteXHVEODAwLVx1REJGRl18XilbXHVEQzAwLVx1REZGRl0pKS8gKTsmI3hkOwogICAgfSBjYXRjaCggZSApIHsmI3hkOwogICAgICBsb2dlcnJvciggZm5hbWUgKyAnRmFpbGVkIHRvIHNwbGl0IHRoZSBpbnB1dCBzdHJpbmcsIGVycm9yOiAnICsgZS5tZXNzYWdlICk7JiN4ZDsKICAgIH0mI3hkOwogICAgcmV0dXJuIGNBcnI7JiN4ZDsKICB9JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIEpTT04gcGF0aCBwYXJzZXIuIEl0ZXJhdGVzIHRocm91Z2ggYSBjaGFyYWN0ZXIgYXJyYXkgYW5kIHJldHVybnMgYW4gYXJyYXkgd2l0aCBwcm9wZXJ0eSBuYW1lcy4mbHQ7YnIvJmd0OyYjeGQ7CiAgICogQXJyYXkgaW5kZXhlcyBhcmUgcHVyZWx5IG51bWVyaWMgcHJvcGVydHkgbmFtZXMgYW5kIHdpbGwgYmUgcmV0dXJuZWQgYXMgbnVtYmVycywgbm90IHN0cmluZ3MuJmx0O2JyLyZndDsmI3hkOwogICAqIENoYXJhY3RlciBBcnJheSBzaG91bGQgaGF2ZSBiZWVuIHNwbGl0IGZyb20gdGhlIG9yaWdpbmFsIEVDTUEgb2JqZWN0IHBhdGggdGhhdCB3ZSB3YW50IHRvIHBhcnNlLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiYjeGQ7CiAgICogUG9ydGVkIGZyb20gSURNIGVuZ2luZSB0byBSQlBNLiBJRE0gRW5naW5lIHZlcnNpb24gYXQgaHR0cHM6Ly9naXRodWIuY29tL2ZjaGllcmFkL0lETS1FQ01BbGliL2Jsb2IvdjEuMC4yL0pTT05saWItSlMuanMmI3hkOwogICAqJiN4ZDsKICAgKiBAc2luY2UgMS4wLjAmI3hkOwogICAqIEBwcml2YXRlJiN4ZDsKICAgKiBAcGFyYW0ge3N0cmluZ1tdfSAgc3RyICAgQ2hhcmFjdGVyIHN0cmluZy4gQXNzdW1lcyBlYWNoIGVudHJ5IGluIHRoZSBhcnJheSBpcyBhIHNpbmdsZSBVbmljb2RlIGNoYXJhY3RlciYjeGQ7CiAgICogQHR5cGUge0FycmF5Jmx0OyhzdHJpbmd8bnVtYmVyKSZndDt9JiN4ZDsKICAgKiBAcmV0dXJuIHtBcnJheSZsdDsoc3RyaW5nfG51bWJlcikmZ3Q7fSBwcm9wZXJ0eSBuYW1lcyBhcnJheSYjeGQ7CiAgICovJiN4ZDsKICBmdW5jdGlvbiBjaGFyQXJyVG9Qcm9wZXJ0eU5hbWVzKCBjQXJyICkgeyYjeGQ7CiAgICB2YXIgaSwgZm5hbWUsIGN1cnJlbnROYW1lLCBzcXVhcmVtYXJrLCByZV93aGl0ZXNwYWNlLCByZV9udW1iZXIsIHJlX3F1b3RlcywgcHJvcGVydHkgPSBbXTsmI3hkOwogICAgZm5hbWUgPSAnY2hhckFyclRvUHJvcGVydHlOYW1lcygpOiAnOyYjeGQ7CiAgICBpZiAoICEoIGNBcnIgaW5zdGFuY2VvZiBBcnJheSApICkgeyYjeGQ7CiAgICAgIGxvZ2Vycm9yKCBmbmFtZSArICdJbnB1dCBwYXJhbWV0ZXIgaXMgbm90IGFuIEFycmF5LCBhYm9ydGluZy4nICk7JiN4ZDsKICAgICAgcmV0dXJuIHByb3BlcnR5OyYjeGQ7CiAgICB9JiN4ZDsKICAgIC8vIFNldHVwIGZvciBwYXJzaW5nLiBEZWxpbWl0ZXIgZm9yIHByb3BlcnR5IG5hbWVzIGFyZSBlaXRoZXIgZG90IG9yIG9wZW4gYW5kIGNsb3NlIHNxdWFyZSBicmFja2V0cyYjeGQ7CiAgICAvLyBJZiB0aGUgY29udGVudHMgaW5zaWRlIHNxdWFyZSBicmFja2V0cyBhcmUgcHVyZWx5IG51bWVyaWMgdGhlbiBhIG51bWJlciBpcyByZXR1cm5lZCYjeGQ7CiAgICBjdXJyZW50TmFtZSA9ICcnOyYjeGQ7CiAgICByZV9udW1iZXIgPSAvXlxkKyQvOyYjeGQ7CiAgICByZV9xdW90ZXMgPSAvXihbJyJdKSguKylcMSQvOyYjeGQ7CiAgICBzcXVhcmVtYXJrID0gKCBjQXJyWyAwIF0gPT09ICdbJyApPyAnZmlyc3QnOidlbmQnOyAvL3NxdWFyZW1hcmsgY2FuIGJlICdmaXJzdCcsICdzdGFydCcsICdlbmQnJiN4ZDsKICAgIC8vIEl0ZXJhdGVzIHRocm91Z2ggdGhlIGNoYXJhY3RlciBhcnJheSBwYXJzaW5nIGVsZW1lbnRzIGludG8gdGhlaXIgb3duIHByb3BlcnR5IGFycmF5IGVudHJ5JiN4ZDsKICAgIGZvciAoIGk9MDsgaSAmbHQ7IGNBcnIubGVuZ3RoOyBpKysgKSB7JiN4ZDsKICAgICAgaWYgKCBzcXVhcmVtYXJrID09PSAnZmlyc3QnICZhbXA7JmFtcDsgY0FyclsgaSBdID09PSAnWycgKSB7JiN4ZDsKICAgICAgICBzcXVhcmVtYXJrID0gJ3N0YXJ0JzsmI3hkOwogICAgICAgIGNvbnRpbnVlOyYjeGQ7CiAgICAgIH0mI3hkOwogICAgICBpZiAoIHNxdWFyZW1hcmsgPT09ICdlbmQnICZhbXA7JmFtcDsgY0FyclsgaSBdID09PSAnWycgKSB7JiN4ZDsKICAgICAgICBzcXVhcmVtYXJrID0gJ3N0YXJ0JzsmI3hkOwogICAgICAgIGlmICggY3VycmVudE5hbWUudHJpbSgpICE9PSAnJyApIHsgLy8gcHJldmVudCBkb3VibGUgcHVzaCBvbiBjb25zdHJ1Y3RzIGxpa2UgYXJyWzBdWzBdJiN4ZDsKICAgICAgICAgIHByb3BlcnR5LnB1c2goIGN1cnJlbnROYW1lLnRyaW0oKSApOyYjeGQ7CiAgICAgICAgfSYjeGQ7CiAgICAgICAgY3VycmVudE5hbWUgPSAnJzsmI3hkOwogICAgICAgIGNvbnRpbnVlOyYjeGQ7CiAgICAgIH0mI3hkOwogICAgICBpZiAoIHNxdWFyZW1hcmsgPT09ICdzdGFydCcgJmFtcDsmYW1wOyBjQXJyWyBpIF0gPT09ICddJyApIHsmI3hkOwogICAgICAgIHNxdWFyZW1hcmsgPSAnZW5kJzsmI3hkOwogICAgICAgIGN1cnJlbnROYW1lID0gY3VycmVudE5hbWUudHJpbSgpOyYjeGQ7CiAgICAgICAgLy8gSWYgdGhlIHByb3BlcnR5IG5hbWUgYmV0d2VlbiBbXSBpcyBhIHB1cmUgbnVtYmVyLCBjb2VyY2VzIHRoZSBzdHJpbmcgdG8gYSBudW1iZXImI3hkOwogICAgICAgIGlmICggcmVfbnVtYmVyLnRlc3QoIGN1cnJlbnROYW1lICkgKSB7JiN4ZDsKICAgICAgICAgIGN1cnJlbnROYW1lID0gTnVtYmVyKCBjdXJyZW50TmFtZSApOyYjeGQ7CiAgICAgICAgfSYjeGQ7CiAgICAgICAgLy8gUmVtb3ZlIHF1b3RlcyBhcm91bmQgcHJvcGVydHkgbmFtZSBpZiB0aGV5IGFyZSBwcmVzZW50IGxpa2Ugb2JqWyJwcm9wZXJ0eSBuYW1lIl0sIHJldHVybmluZyBwcm9wZXJ0eSBuYW1lJiN4ZDsKICAgICAgICBpZiAoIHJlX3F1b3Rlcy50ZXN0KCBjdXJyZW50TmFtZSApICkgeyYjeGQ7CiAgICAgICAgICBjdXJyZW50TmFtZSA9IHJlX3F1b3Rlcy5leGVjKCBjdXJyZW50TmFtZSApWzJdOyYjeGQ7CiAgICAgICAgfSYjeGQ7CiAgICAgICAgcHJvcGVydHkucHVzaCggY3VycmVudE5hbWUgKTsmI3hkOwogICAgICAgIGN1cnJlbnROYW1lID0gJyc7JiN4ZDsKICAgICAgICBjb250aW51ZTsmI3hkOwogICAgICB9JiN4ZDsKICAgICAgLy8gVHJhZGl0aW9uYWwgLiBkZWxpbWl0ZXImI3hkOwogICAgICBpZiAoIHNxdWFyZW1hcmsgPT09ICdlbmQnICZhbXA7JmFtcDsgY0FyclsgaSBdID09PSAnLicgKSB7JiN4ZDsKICAgICAgICBpZiAoIGN1cnJlbnROYW1lLnRyaW0oKSAhPT0gJycgKSB7IC8vIHByZXZlbnQgZG91YmxlIHB1c2ggb24gY29uc3RydWN0cyBsaWtlIGFyclswXS5uYW1lJiN4ZDsKICAgICAgICAgIHByb3BlcnR5LnB1c2goIGN1cnJlbnROYW1lLnRyaW0oKSApOyYjeGQ7CiAgICAgICAgfSYjeGQ7CiAgICAgICAgY3VycmVudE5hbWUgPSAnJzsmI3hkOwogICAgICAgIGNvbnRpbnVlOyYjeGQ7CiAgICAgIH0mI3hkOwogICAgICBjdXJyZW50TmFtZSArPSBjQXJyWyBpIF07JiN4ZDsKICAgIH0mI3hkOwogICAgaWYgKCBjdXJyZW50TmFtZSAhPT0gJycgKSB7JiN4ZDsKICAgICAgcHJvcGVydHkucHVzaCggY3VycmVudE5hbWUudHJpbSgpICk7JiN4ZDsKICAgIH0mI3hkOwogICAgcmV0dXJuIHByb3BlcnR5OyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiBDb2VyY2VzIHRoZSByZXN1bHQgdG8gYW4gRUNNQSBzdHJpbmcuJmx0O2JyLyZndDsmI3hkOwogICAqIENvZXJjaW9uIHJ1bGVzIGZvciB0aGlzIGZ1bmN0aW9uOiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBJZiB0aGUgZmlyc3QgaW5wdXQgcGFyYW1ldGVyIGlzIG51bGwgb3IgdW5kZWZpbmVkIHJldHVybnMgZGVmYXVsdCB2YWx1ZS4mbHQ7YnIvJmd0OyYjeGQ7CiAgICogSWYgdGhlIGZpcnN0IGlucHV0IHBhcmFtZXRlciBpcyBhbiBBcnJheSBpdCByZXR1cm5zIHRoZSBhcnJheSBqb2luZWQgYnkgJyAnLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBJZiB0aGUgZmlyc3QgaW5wdXQgcGFyYW1ldGVyIGlzIGEgU3RyaW5nLCBOdW1iZXIgb3IgQm9vbGVhbiBpdCByZXR1cm5zIGEgc3RyaW5nLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBJZiB0aGUgZmlyc3QgaW5wdXQgcGFyYW1ldGVyIGlzIGFuIG9iamVjdCBvdGhlciB0aGFuIGFuIEFycmF5IGl0IHJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUuJmx0O2JyLyZndDsmI3hkOwogICAqIElmIHRoZSBzZWNvbmQgaW5wdXQgdmFsdWUgaXMgbm90IG51bGwgdGhlbiB0aGUgZGVmYXVsdCB2YWx1ZSBiZWNvbWVzIHRoZSBzZWNvbmQgaW5wdXQgdmFsdWUuJmx0O2JyLyZndDsmI3hkOwogICAqIElmIHRoZSBjb2VyY2lvbiB0byBzdHJpbmcgZnJvbSBTdHJpbmcsIE51bWJlciwgQm9vbGVhbiBvciBBcnJheSByZXN1bHRlZCBpbiBlbXB0eSBzdHJpbmcsIHJldHVybiBkZWZhdWx0IHZhbHVlLiYjeGQ7CiAgIComI3hkOwogICAqIEBtZW1iZXJvZiBQUkQudXRpbCYjeGQ7CiAgICogQHNpbmNlIDEuMC4wJiN4ZDsKICAgKiYjeGQ7CiAgICogQHBhcmFtICB7YW55fSAgICAgaW5wdXQgICAgIElucHV0IHBhcmFtZXRlciB0byBiZSBjb2VyY2VkLiYjeGQ7CiAgICogQHBhcmFtICB7c3RyaW5nfSAgW2RlZlZhbF0gIERlZmF1bHQgdmFsdWUgdG8gYmUgdXNlZCYjeGQ7CiAgIComI3hkOwogICAqIEB0eXBlIHtzdHJpbmd9JiN4ZDsKICAgKiBAcmV0dXJuIHtzdHJpbmd9IHJlc3VsdGluZyBzdHJpbmcuJiN4ZDsKICAgKi8mI3hkOwogIGZ1bmN0aW9uIGNvZXJjZVRvU3RyaW5nKCBpbnB1dCwgZGVmVmFsICkgeyYjeGQ7CiAgICB2YXIgcmV0ID0gJycsIHN0cjsmI3hkOwogICAgLyogVGhyb3VnaG91dCB0aGlzIGZ1bmN0aW9uIFN0cmluZygpIGlzIHVzZWQgdG8gZ3VhcmFudGVlIHRoYXQgdGhlIHN0cmluZyBnZW5lcmF0ZWQmI3hkOwogICAgICogaXMgYW4gRUNNQSBzdHJpbmcuIFRoaXMgaXMgb25seSBhIGNvbmNlcm4gb24gdGhlIHdvcmtmbG93IGVuZ2luZSBzaW5jZSB0aGUgZW5naW5lJiN4ZDsKICAgICAqIGFsbG93cyBhIG1peCBvZiBFQ01BIGFuZCBKYXZhIGNvZGUuIFJldHVybmluZyBhIEphdmEgc3RyaW5nIHdpbGwgY2F1c2UgdGhlJiN4ZDsKICAgICAqIHRvSlNPTigpIGZ1bmN0aW9uIHRvIGZhaWwgd2hlbiB1c2luZyBKU09OLnN0cmluZ2lmeSgpLCBoZW5jZSB0aGlzIHNhZmV0eS4mI3hkOwogICAgICovJiN4ZDsKICAgIGlmICggZGVmVmFsICE9IG51bGwgJmFtcDsmYW1wOyBpc1N0cmluZyggZGVmVmFsICkgKSB7JiN4ZDsKICAgICAgcmV0ID0gU3RyaW5nKCBkZWZWYWwgKTsmI3hkOwogICAgfSYjeGQ7CiAgICBpZiAoIGlucHV0ID09PSBudWxsIHx8IGlucHV0ID09PSB1bmRlZmluZWQgKSB7JiN4ZDsKICAgICAgcmV0dXJuIHJldDsmI3hkOwogICAgfSYjeGQ7CiAgICBpZiAoIGlzU3RyaW5nKCBpbnB1dCApIHx8IGlzTnVtYmVyKCBpbnB1dCApIHx8IGlzQm9vbGVhbiggaW5wdXQgKSApIHsmI3hkOwogICAgICBzdHIgPSBTdHJpbmcoIGlucHV0ICk7JiN4ZDsKICAgIH0mI3hkOwogICAgaWYgKCBpbnB1dCBpbnN0YW5jZW9mIEFycmF5ICkgeyYjeGQ7CiAgICAgIHN0ciA9IFN0cmluZyggaW5wdXQuam9pbiggJyAnICkgKTsmI3hkOwogICAgfSYjeGQ7CiAgICBpZiAoIHN0ciAhPT0gJycgKSB7JiN4ZDsKICAgICAgcmV0ID0gc3RyOyYjeGQ7CiAgICB9JiN4ZDsKICAgIHJldHVybiByZXQ7JiN4ZDsKICB9JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIChFbmdpbmUgb25seSkgUmV0dXJucyBiYXNpYyBIVFRQIGF1dGggaGVhZGVyLiBGb3JtYXQgaXM6IEJhc2ljIEI2NGVuY29kZWRVU0VSTkFNRTpQQVNTV09SRCYjeGQ7CiAgIComI3hkOwogICAqIEBtZW1iZXJvZiBQUkQudXRpbCYjeGQ7CiAgICogQHNpbmNlIDEuMC4zJiN4ZDsKICAgKiYjeGQ7CiAgICogQHBhcmFtIHtzdHJpbmd9ICB1c2VybmFtZSAgSFRUUCBhdXRoIHVzZXIncyBuYW1lLiYjeGQ7CiAgICogQHBhcmFtIHtzdHJpbmd9ICBwYXNzd29yZCAgSFRUUCBhdXRoIHVzZXIncyBwYXNzd29yZC4mI3hkOwogICAqJiN4ZDsKICAgKiBAdHlwZSB7c3RyaW5nfSYjeGQ7CiAgICogQHJldHVybiB7c3RyaW5nfSBIVFRQIEJhc2ljICdBdXRob3JpemF0aW9uJyBoZWFkZXIncyB2YWx1ZS4mI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gYmFzaWNIVFRQYXV0aEhlYWRlciggdXNlcm5hbWUsIHBhc3N3b3JkICkgeyYjeGQ7CiAgICB2YXIgZm5hbWUsIHJlcywgY29uYywgQmFzZTY0LCBiNjRzdHI7JiN4ZDsKICAgIGZuYW1lID0gJ2Jhc2ljSFRUUGF1dGhIZWFkZXIoKTogJzsmI3hkOwogICAgaWYgKCB1c2VybmFtZSA9PSBudWxsIHx8IHBhc3N3b3JkID09IG51bGwgKSB7JiN4ZDsKICAgICAgbG9nZXJyb3IoIGZuYW1lICsgJ3VzZXJuYW1lIGFuZCBwYXNzd29yZCBtdXN0IGJlIHByb3ZpZGVkIGFuZCBub3QgbnVsbCBub3IgdW5kZWZpbmVkLicgKTsmI3hkOwogICAgICByZXR1cm4gJyc7JiN4ZDsKICAgIH0mI3hkOwogICAgdHJ5IHsmI3hkOwogICAgICBCYXNlNjQgPSBuZXcgUGFja2FnZXMub3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmJpbmFyeS5CYXNlNjQoKTsmI3hkOwogICAgICBjb25jID0gSlN0cmluZyggdXNlcm5hbWUgKyAnOicgKyBwYXNzd29yZCApLmdldEJ5dGVzKCAnVVRGLTgnICk7JiN4ZDsKICAgICAgYjY0c3RyID0gSlN0cmluZyggQmFzZTY0LmVuY29kZUJhc2U2NCggY29uYyApLCAnVVRGLTgnICk7JiN4ZDsKICAgICAgcmVzID0gJ0Jhc2ljICcgKyBiNjRzdHI7JiN4ZDsKICAgIH0gY2F0Y2goIGUgKSB7JiN4ZDsKICAgICAgbG9nZXJyb3IoIGZuYW1lICsgJ0ZhaWxlZCB0byBidWlsZCBCYXNpYyBBdXRoZW50aWNhdGlvbiBIVFRQIGhlYWRlciB2YWx1ZS4gRXJyb3I6ICcgKyBlLm1lc3NhZ2UgKTsmI3hkOwogICAgfSYjeGQ7CiAgICByZXR1cm4gcmVzOyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiAoRW5naW5lIG9ubHkpIEZ1bmN0aW9uIHRvIGNvZXJjZSBwcm92aWRlZCBmbG93ZGF0YSBhbmQgcmV0dXJuIGlmIHdlIGFyZSBwYXN0IG1heCByZXRyaWVzIG9yIG5vdC4mI3hkOwogICAqJiN4ZDsKICAgKiBAbWVtYmVyb2YgUFJELnV0aWwmI3hkOwogICAqIEBzaW5jZSAxLjAuMyYjeGQ7CiAgIComI3hkOwogICAqIEBwYXJhbSB7c3RyaW5nfSAgY3VyY291bnRlciAgQ3VycmVudCBDb3VudGVyJiN4ZDsKICAgKiBAcGFyYW0ge3N0cmluZ30gIG1heHJldHJpZXMgIE1heGltdW0gcmV0cmllcyB2YWx1ZSYjeGQ7CiAgIComI3hkOwogICAqIEB0eXBlIHtib29sZWFufSYjeGQ7CiAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiBtYXhyZXRyaWVzIGlzIGdyZWF0ZXIgdGhhbiBjdXJyZW50IGNvdW50ZXIsIGZhbHNlIG90aGVyd2lzZS4mI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gc2hvdWxkUmV0cnkoIGN1cmNvdW50ZXIsIG1heHJldHJpZXMgKSB7JiN4ZDsKICAgIHZhciByZXRyeSA9IGZhbHNlOyYjeGQ7CiAgICBjdXJjb3VudGVyID0gU3RyaW5nKCBjdXJjb3VudGVyICkgfCAwOyYjeGQ7CiAgICBtYXhyZXRyaWVzID0gU3RyaW5nKCBtYXhyZXRyaWVzICkgfCAwOyYjeGQ7CiAgICByZXRyeSA9ICggY3VyY291bnRlciAmbHQ7IG1heHJldHJpZXMgKSA/IHRydWUgOiBmYWxzZTsmI3hkOwogICAgcmV0dXJuIHJldHJ5OyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiAoRW5naW5lKSBDb21wYXJlcyAyIHVuaWRpbWVuc2lvbmFsIEVDTUEgQXJyYXlzIG9yIEphdmEgVmVjdG9ycyBhbmQgcmV0dXJucyBhbiBBcnJheSBvZiBhcnJheXMgd2l0aCBjb21wYXJpc29uIHJlc3VsdHMuJmx0O2JyLyZndDsmI3hkOwogICAqIChGb3JtKSBDb21wYXJlcyAyIHVuaWRpbWVuc2lvbmFsIEVDTUEgQXJyYXlzIGFuZCByZXR1cm5zIGFuIEFycmF5IG9mIGFycmF5cyB3aXRoIGNvbXBhcmlzb24gcmVzdWx0cy4mI3hkOwogICAqJiN4ZDsKICAgKiBAbWVtYmVyb2YgUFJELnV0aWwmI3hkOwogICAqIEBzaW5jZSAxLjAuMiYjeGQ7CiAgIComI3hkOwogICAqIEBwYXJhbSAgeyhzdHJpbmdbXXxqYXZhLnV0aWwuVmVjdG9yKX0gbGlzdDEgICAgICAgIEVDTUEgQXJyYXkgb3IgSmF2YSBWZWN0b3IuJiN4ZDsKICAgKiBAcGFyYW0gIHsoc3RyaW5nW118amF2YS51dGlsLlZlY3Rvcil9IGxpc3QyICAgICAgICBFQ01BIEFycmF5IG9yIEphdmEgVmVjdG9yLiYjeGQ7CiAgICogQHBhcmFtICB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgICAgICBpZ25vcmVjYXNlICAgQ2hhbmdlcyBzdHJpbmcgY29tcGFyaXNvbiB0byBjYXNlIGluc2Vuc2l0aXZlLiYjeGQ7CiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBhbHNvIGNhdXNlcyB0aGUgY2FzaW5nIG9mIHRoZSByZXN1bHRzIHdpbGwgbWF0Y2ggdGhlIGNhc2luZyBvZiB0aGVpciYjeGQ7CiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgdGltZSBhcHBlYXJpbmcgaW4gdGhlIGxpc3QgcHJvdmlkZWQuJiN4ZDsKICAgKiYjeGQ7CiAgICogQHR5cGUge0FycmF5LiZsdDtzdHJpbmdbXSZndDt9JiN4ZDsKICAgKiBAcmV0dXJuIHtBcnJheS4mbHQ7c3RyaW5nW10mZ3Q7fSBFQ01BIEFycmF5IHdpdGggMyBwYXJ0cy4gWyBbIGVsZW1lbnRzIG9ubHkgcHJlc2VudCBvbiBsaXN0MSBdLCBbIGVsZW1lbnRzIG9ubHkgcHJlc2VudCBvbiBsaXN0MiBdLCBbIGVsZW1lbnRzIHByZXNlbnQgb24gYm90aF0gXSYjeGQ7CiAgICovJiN4ZDsKICBmdW5jdGlvbiBjb21wYXJlKCBsaXN0MSwgbGlzdDIgLGlnbm9yZWNhc2UgKSB7JiN4ZDsKICAgIHZhciBleGlzdHMxID0ge30sIGV4aXN0czIgPSB7fSwgb25seWluMSA9IFtdLCBvbmx5aW4yID0gW10sIGlzaW5ib3RoID0gW10sIHJlcywmI3hkOwogICAgaSwgY3VyciwgY29tcGFyZSwgZm5hbWUsIGRlZHVwMSA9IFtdOyYjeGQ7CiAgICBmbmFtZSA9ICdVbmlxdWUoKTogJzsmI3hkOwogICAgaWYgKCBsaXN0MSAhPSBudWxsICZhbXA7JmFtcDsgdHlwZW9mIGxpc3QxID09PSAnb2JqZWN0JyAmYW1wOyZhbXA7IGxpc3QyICE9IG51bGwgJmFtcDsmYW1wOyB0eXBlb2YgbGlzdDIgPT09ICdvYmplY3QnICkgeyYjeGQ7CiAgICAgIC8vIChFbmdpbmUgb25seSkgQ29udmVydCBWZWN0b3IgdG8gQXJyYXkgc28gd2UgY2FuIHBlcmZvcm0gdGhlIGNvbXBhcmlzb25zLiYjeGQ7CiAgICAgIGlmICggd2hlcmUgPT09ICdlbmdpbmUnICkgeyYjeGQ7CiAgICAgICAgaWYgKCBpc0phdmFWZWN0b3IoIGxpc3QxICkgKSB7JiN4ZDsKICAgICAgICAgIGxpc3QxID0gSmF2YVZlY3RvclRvRUNNQUFycmF5KCBsaXN0MSApOyYjeGQ7CiAgICAgICAgfSYjeGQ7CiAgICAgICAgaWYgKCBpc0phdmFWZWN0b3IoIGxpc3QyICkgKSB7JiN4ZDsKICAgICAgICAgIGxpc3QyID0gSmF2YVZlY3RvclRvRUNNQUFycmF5KCBsaXN0MiApOyYjeGQ7CiAgICAgICAgfSYjeGQ7CiAgICAgIH0mI3hkOwogICAgICAvLyBEZWR1cGxpY2F0ZSBsaXN0cywgdGhlbiBjb21wYXJlIHRoZW0mI3hkOwogICAgICBpZiAoIGxpc3QxIGluc3RhbmNlb2YgQXJyYXkgJmFtcDsmYW1wOyBsaXN0MiBpbnN0YW5jZW9mIEFycmF5ICkgeyYjeGQ7CiAgICAgICAgLy8gZ2VuZXJhdGUgaGFzaG1hcCBmb3IgbGlzdDEmI3hkOwogICAgICAgIGZvciAoIGkgPSAwOyBpICZsdDsgbGlzdDEubGVuZ3RoOyBpKysgKSB7JiN4ZDsKICAgICAgICAgIC8vIFVzaW5nIGNvbXBhcmUgZm9yIGNhc2Ugc2Vuc2l0aXZlIGFuZCBpbnNlbnRpdmUgY29tcGFyaXNzb24gd2hpbGUga2VlcGluZyBjdXJyIGFzIHRoZSBjdXJyZW50IHZhbHVlIGNvZXJjZWQgdG8gc3RyaW5nJiN4ZDsKICAgICAgICAgIGN1cnIgPSBTdHJpbmcoIGxpc3QxWyBpIF0gKTsmI3hkOwogICAgICAgICAgaWYgKCBpZ25vcmVjYXNlID09PSB0cnVlICkgeyYjeGQ7CiAgICAgICAgICAgIGNvbXBhcmUgPSBjdXJyLnRvTG93ZXJDYXNlKCk7JiN4ZDsKICAgICAgICAgIH0gZWxzZSB7JiN4ZDsKICAgICAgICAgICAgY29tcGFyZSA9IGN1cnI7JiN4ZDsKICAgICAgICAgIH0mI3hkOwogICAgICAgICAgaWYgKCAhIGV4aXN0czEuaGFzT3duUHJvcGVydHkoIGNvbXBhcmUgKSApIHsmI3hkOwogICAgICAgICAgICBkZWR1cDEucHVzaCggY3VyciApOyYjeGQ7CiAgICAgICAgICAgIGV4aXN0czFbIGNvbXBhcmUgXSA9IHRydWU7IC8vIG1hcmtpbmcgdGhlIGVudHJ5IGFzIGFscmVhZHkgZXhpc3RpbmcgZm9yIGRlZHVwbGljYXRpb24gcHVycG9zZXMmI3hkOwogICAgICAgICAgfSYjeGQ7CiAgICAgICAgfSYjeGQ7CiAgICAgICAgLy8gQnVpbGQgb25seWluMiBhbmQgaXNpbmJvdGggYnkgaXRlcmF0aW5nIG9uIGxpc3QyLCBnZW5lcmF0aW5nIGl0cyBoYXNobWFwIHdoaWxlIGNvbXBhcmluZyB3aXRoIGxpc3QxJiN4ZDsKICAgICAgICBmb3IgKCBpID0gMDsgaSAmbHQ7IGxpc3QyLmxlbmd0aDsgaSsrICkgeyYjeGQ7CiAgICAgICAgICAvLyBVc2luZyBjb21wYXJlIGZvciBjYXNlIHNlbnNpdGl2ZSBhbmQgaW5zZW50aXZlIGNvbXBhcmlzc29uIHdoaWxlIGtlZXBpbmcgY3VyciBhcyB0aGUgY3VycmVudCB2YWx1ZSBjb2VyY2VkIHRvIHN0cmluZyYjeGQ7CiAgICAgICAgICBjdXJyID0gU3RyaW5nKCBsaXN0MlsgaSBdICk7JiN4ZDsKICAgICAgICAgIGlmICggaWdub3JlY2FzZSA9PT0gdHJ1ZSApIHsmI3hkOwogICAgICAgICAgICBjb21wYXJlID0gY3Vyci50b0xvd2VyQ2FzZSgpOyYjeGQ7CiAgICAgICAgICB9IGVsc2UgeyYjeGQ7CiAgICAgICAgICAgIGNvbXBhcmUgPSBjdXJyOyYjeGQ7CiAgICAgICAgICB9JiN4ZDsKICAgICAgICAgIGlmICggISBleGlzdHMyLmhhc093blByb3BlcnR5KCBjb21wYXJlICkgKSB7JiN4ZDsKICAgICAgICAgICAgZXhpc3RzMlsgY29tcGFyZSBdID0gdHJ1ZTsgLy8gbWFya2luZyB0aGUgZW50cnkgYXMgYWxyZWFkeSBleGlzdGluZyBmb3IgZGVkdXBsaWNhdGlvbiBwdXJwb3NlcyYjeGQ7CiAgICAgICAgICAgIGlmICggZXhpc3RzMS5oYXNPd25Qcm9wZXJ0eSggY29tcGFyZSApICkgeyYjeGQ7CiAgICAgICAgICAgICAgaXNpbmJvdGgucHVzaCggY3VyciApOyYjeGQ7CiAgICAgICAgICAgIH0gZWxzZSB7JiN4ZDsKICAgICAgICAgICAgICBvbmx5aW4yLnB1c2goIGN1cnIgKTsmI3hkOwogICAgICAgICAgICB9JiN4ZDsKICAgICAgICAgIH0mI3hkOwogICAgICAgIH0mI3hkOwogICAgICAgIC8vIEl0ZXJhdGUgZGVkdXBsaWNhdGVkIGxpc3QxIGFnYWluc3QgbGlzdDIncyBoYXNobWFwIHRvIHBvcHVsYXRlIG9ubHlpbjImI3hkOwogICAgICAgIGZvciAoIGkgPSAwOyBpICZsdDsgZGVkdXAxLmxlbmd0aDsgaSsrICl7JiN4ZDsKICAgICAgICAgIC8vIFVzaW5nIGNvbXBhcmUgZm9yIGNhc2Ugc2Vuc2l0aXZlIGFuZCBpbnNlbnRpdmUgY29tcGFyaXNzb24gd2hpbGUga2VlcGluZyBjdXJyIGFzIHRoZSBjdXJyZW50IHZhbHVlIGNvZXJjZWQgdG8gc3RyaW5nJiN4ZDsKICAgICAgICAgIGN1cnIgPSBTdHJpbmcoIGRlZHVwMVsgaSBdICk7JiN4ZDsKICAgICAgICAgIGlmICggaWdub3JlY2FzZSA9PT0gdHJ1ZSApIHsmI3hkOwogICAgICAgICAgICBjb21wYXJlID0gY3Vyci50b0xvd2VyQ2FzZSgpOyYjeGQ7CiAgICAgICAgICB9IGVsc2UgeyYjeGQ7CiAgICAgICAgICAgIGNvbXBhcmUgPSBjdXJyOyYjeGQ7CiAgICAgICAgICB9JiN4ZDsKICAgICAgICAgIGlmICggISBleGlzdHMyLmhhc093blByb3BlcnR5KCBjb21wYXJlICkgKSB7JiN4ZDsKICAgICAgICAgICAgb25seWluMS5wdXNoKCBjdXJyICk7JiN4ZDsKICAgICAgICAgIH0mI3hkOwogICAgICAgIH0mI3hkOwogICAgICAgIC8vIENvbnZlcnQgcmVzdWx0cyBiYWNrIHRvIFZlY3RvciBpZiB0aGUgb2JqIHBhc3NlZCBpbiB3YXMgYSBqYXZhLnV0aWwuVmVjdG9yJiN4ZDsKICAgICAgfSYjeGQ7CiAgICB9IGVsc2UgeyYjeGQ7CiAgICAgIGxvZ2Vycm9yKCBmbmFtZSArICdQbGVhc2UgcmV2aWV3IHRoZSBwYXJhbWV0ZXJzIHByb3ZpZGVkLCBhYm9ydGluZy4nICk7JiN4ZDsKICAgIH0mI3hkOwogICAgcmVzID0gWyBvbmx5aW4xLCBvbmx5aW4yLCBpc2luYm90aCBdOyYjeGQ7CiAgICByZXR1cm4gcmVzOyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAvKiomI3hkOwogICAqIChGb3JtKSBDb21wYXJlcyAyIG9yIG1vcmUgdW5pZGltZW5zaW9uYWwgRUNNQSBBcnJheXMgd2l0aGluIGFuIEFycmF5IGFuZCByZXR1cm5zIGFuIEFycmF5IHdpdGggaW50ZXJzZWN0aW5nIHJlc3VsdHMuJiN4ZDsKICAgKiBAbWVtYmVyb2YgUFJELnV0aWwmI3hkOwogICAqIEBzaW5jZSAxLjAuNyYjeGQ7CiAgIComI3hkOwogICAqIEBwYXJhbSAge0FycmF5LiZsdDtzdHJpbmdbXSZndDt9IGFyciAgICAgICAgRUNNQSBBcnJheS4mI3hkOwogICAqIEBwYXJhbSAge2Jvb2xlYW59ICAgICAgICAgIGlnbm9yZWNhc2UgICBDaGFuZ2VzIHN0cmluZyBjb21wYXJpc29uIHRvIGNhc2UgaW5zZW5zaXRpdmUuJiN4ZDsKICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBhbHNvIGNhdXNlcyB0aGUgY2FzaW5nIG9mIHRoZSByZXN1bHRzIHdpbGwgbWF0Y2ggdGhlIGNhc2luZyBvZiB0aGVpciYjeGQ7CiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0IHRpbWUgYXBwZWFyaW5nIGluIHRoZSBsaXN0IHByb3ZpZGVkLiYjeGQ7CiAgIComI3hkOwogICAqIEB0eXBlIHtBcnJheS4mbHQ7c3RyaW5nW10mZ3Q7fSYjeGQ7CiAgICogQHJldHVybiB7c3RyaW5nW119IEVDTUEgQXJyYXkgb2YgaW50ZXJzZWN0aW5nIHJlc3VsdHMuJiN4ZDsKICAgKi8mI3hkOwogIGZ1bmN0aW9uIGludGVyc2VjdEFycmF5cyggYXJyLCBpZ25vcmVCb29sICkgeyYjeGQ7CiAgICB2YXIgZm5hbWUsIHJlc3VsdDsmI3hkOwogICAgZm5hbWUgPSAnaW50ZXJzZWN0QXJyYXlzKCk6ICc7JiN4ZDsKICAgIHRyeSB7JiN4ZDsKICAgICAgaWYgKCBhcnIubGVuZ3RoID09PSAwICkgeyYjeGQ7CiAgICAgICAgcmV0dXJuIGxvZ2Vycm9yKCBmbmFtZSArICciTXVzdCBoYXZlIGFycmF5IGVsZW1lbnRzIHRvIGNvbXBhcmUnICk7JiN4ZDsKICAgICAgfSYjeGQ7CiAgICAgIGlmICggYXJyLmxlbmd0aCA9PT0gMSApIHsmI3hkOwogICAgICAgIHJldHVybiBhcnJbIDAgXTsmI3hkOwogICAgICB9IGVsc2UgeyYjeGQ7CiAgICAgICAgcmVzdWx0ID0gWyBudWxsLCBudWxsLCBhcnJbIDAgXSBdOyYjeGQ7CiAgICAgICAgYXJyLmZvckVhY2goZnVuY3Rpb24gKCBrZXksIGluZCApIHsmI3hkOwogICAgICAgICAgdmFyIG5leHQgPSBpbmQgKyAxOyYjeGQ7CiAgICAgICAgICBpZiAoIG5leHQgJmx0OyBhcnIubGVuZ3RoICkgeyYjeGQ7CiAgICAgICAgICAgIHJlc3VsdCA9IFBSRC51dGlsLmNvbXBhcmUoIHJlc3VsdFsgMiBdLCBhcnJbIG5leHQgXSwgaWdub3JlQm9vbCApOyYjeGQ7CiAgICAgICAgICB9JiN4ZDsKICAgICAgICB9KTsmI3hkOwogICAgICAgIHJldHVybiByZXN1bHRbIDIgXTsmI3hkOwogICAgICB9JiN4ZDsKICAgIH0gY2F0Y2ggKCBlICkgeyYjeGQ7CiAgICAgIHJldHVybiBsb2dlcnJvciggZm5hbWUgKyAnTXVzdCBzdWJtaXQgYXJyYXkgYXMgcGFyYW1ldGVyLiBFcnJvcjogJyArIGUubWVzc2FnZSApOyYjeGQ7CiAgICB9JiN4ZDsKICB9JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIChFbmdpbmUpIFBhcnNlcyBhbiB1bmlkaW1lbnNpb25hbCBFQ01BIEFycmF5IG9yIEphdmEgVmVjdG9yIGFuZCByZXR1cm5zIHRoZSBzYW1lIHR5cGUgb2Ygb2JqZWN0IHdpdGggb25seSB1bmlxdWUgZW50cmllcy4mbHQ7YnIvJmd0OyYjeGQ7CiAgICogKEZvcm0pIFBhcnNlcyBhbiB1bmlkaW1lbnNpb25hbCBFQ01BIEFycmF5IGFuZCByZXR1cm5zIHRoZSBzYW1lIHR5cGUgb2Ygb2JqZWN0IHdpdGggb25seSB1bmlxdWUgZW50cmllcy4mI3hkOwogICAqJiN4ZDsKICAgKiBAbWVtYmVyb2YgUFJELnV0aWwmI3hkOwogICAqIEBzaW5jZSAxLjAuMiYjeGQ7CiAgIComI3hkOwogICAqIEBwYXJhbSAgeyhzdHJpbmdbXXxqYXZhLnV0aWwuVmVjdG9yKX0gb2JqICAgICAgICAgIEVDTUEgQXJyYXkgb3IgSmF2YSBWZWN0b3IuJiN4ZDsKICAgKiBAcGFyYW0gIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAgIGlnbm9yZWNhc2UgICBDaGFuZ2VzIHN0cmluZyBjb21wYXJpc29uIHRvIGNhc2UgaW5zZW5zaXRpdmUuJiN4ZDsKICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGFsc28gY2F1c2VzIHRoZSBjYXNpbmcgb2YgdGhlIHJlc3VsdHMgd2lsbCBtYXRjaCB0aGUgY2FzaW5nIG9mIHRoZWlyJiN4ZDsKICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCB0aW1lIGFwcGVhcmluZyBpbiB0aGUgbGlzdCBwcm92aWRlZC4mI3hkOwogICAqJiN4ZDsKICAgKiBAdHlwZSB7KHN0cmluZ1tdfGphdmEudXRpbC5WZWN0b3IpfSYjeGQ7CiAgICogQHJldHVybiB7KHN0cmluZ1tdfGphdmEudXRpbC5WZWN0b3IpfSBFQ01BIEFycmF5IG9yIEphdmEgVmVjdG9yLiBJZiBvYmogaXMgbm90IGEgdmFsaWQgdHlwZSByZXR1cm5zIGVtcHR5IEVDTUEgQXJyYXkuJiN4ZDsKICAgKi8mI3hkOwogIGZ1bmN0aW9uIHVuaXF1ZSggb2JqICwgaWdub3JlY2FzZSApIHsmI3hkOwogICAgdmFyIGV4aXN0cyA9IHt9LCByZXMgPSBbXSwgY29udmVydFRvVmVjdG9yLCBpLCBjdXJyLCBjb21wYXJlLCBmbmFtZTsmI3hkOwogICAgZm5hbWUgPSAnVW5pcXVlKCk6ICc7JiN4ZDsKICAgIGlmICggb2JqICE9IG51bGwgJmFtcDsmYW1wOyB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyApIHsmI3hkOwogICAgICAvLyBDb252ZXJ0IFZlY3RvciB0byBBcnJheSBzbyB3ZSBjYW4gZGVkdXBsaWNhdGUgYm90aCB1c2luZyB0aGUgc2FtZSBjb2RlJiN4ZDsKICAgICAgaWYgKCB3aGVyZSA9PT0nZW5naW5lJyAmYW1wOyZhbXA7IGlzSmF2YVZlY3Rvciggb2JqICkgKSB7JiN4ZDsKICAgICAgICBvYmogPSBKYXZhVmVjdG9yVG9FQ01BQXJyYXkoIG9iaiApOyYjeGQ7CiAgICAgICAgY29udmVydFRvVmVjdG9yID0gdHJ1ZTsmI3hkOwogICAgICB9IGVsc2UgeyYjeGQ7CiAgICAgICAgY29udmVydFRvVmVjdG9yID0gZmFsc2U7JiN4ZDsKICAgICAgfSYjeGQ7CiAgICAgIC8vIERlZHVwbGljYXRlIGFycmF5LCBnZW5lcmF0ZSYjeGQ7CiAgICAgIGlmICggb2JqIGluc3RhbmNlb2YgQXJyYXkgKSB7JiN4ZDsKICAgICAgICBmb3IgKCBpID0gMDsgaSAmbHQ7IG9iai5sZW5ndGg7IGkrKyApIHsmI3hkOwogICAgICAgICAgLy8gVXNpbmcgY29tcGFyZSBmb3IgY2FzZSBzZW5zaXRpdmUgYW5kIGluc2VudGl2ZSBjb21wYXJpc3NvbiB3aGlsZSBrZWVwaW5nIGN1cnIgYXMgdGhlIGN1cnJlbnQgdmFsdWUgY29lcmNlZCB0byBzdHJpbmcmI3hkOwogICAgICAgICAgY3VyciA9IFN0cmluZyggb2JqWyBpIF0gKTsmI3hkOwogICAgICAgICAgaWYgKCBpZ25vcmVjYXNlID09PSB0cnVlICkgeyYjeGQ7CiAgICAgICAgICAgIGNvbXBhcmUgPSBjdXJyLnRvTG93ZXJDYXNlKCk7JiN4ZDsKICAgICAgICAgIH0gZWxzZSB7JiN4ZDsKICAgICAgICAgICAgY29tcGFyZSA9IGN1cnI7JiN4ZDsKICAgICAgICAgIH0mI3hkOwogICAgICAgICAgaWYgKCAhIGV4aXN0cy5oYXNPd25Qcm9wZXJ0eSggY29tcGFyZSApICkgeyYjeGQ7CiAgICAgICAgICAgIHJlcy5wdXNoKCBjdXJyICk7JiN4ZDsKICAgICAgICAgICAgZXhpc3RzWyBjb21wYXJlIF0gPSB0cnVlOyAvLyBtYXJraW5nIHRoZSBlbnRyeSBhcyBhbHJlYWR5IGV4aXN0aW5nIGZvciBkZWR1cGxpY2F0aW9uIHB1cnBvc2VzJiN4ZDsKICAgICAgICAgIH0mI3hkOwogICAgICAgIH0mI3hkOwogICAgICAgIC8vIENvbnZlcnQgcmVzdWx0cyBiYWNrIHRvIFZlY3RvciBpZiB0aGUgb2JqIHBhc3NlZCBpbiB3YXMgYSBqYXZhLnV0aWwuVmVjdG9yJiN4ZDsKICAgICAgICBpZiAoIHdoZXJlID09PSdlbmdpbmUnICZhbXA7JmFtcDsgY29udmVydFRvVmVjdG9yICkgeyYjeGQ7CiAgICAgICAgICByZXMgPSBFQ01BQXJyYXlUb0phdmFWZWN0b3IoIHJlcyApOyYjeGQ7CiAgICAgICAgfSYjeGQ7CiAgICAgIH0mI3hkOwogICAgfSYjeGQ7CiAgICByZXR1cm4gcmVzOyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiAoRW5naW5lIG9ubHkpIFBhcnNlcyB0aGUgcmVzdWx0IGZyb20gZmxvd2RhdGEuZ2V0T2JqZWN0IGludG8gYW4gQXJyYXkgb2Ygc3RyaW5ncyBhbmQgRUNNQSBvYmplY3RzLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBFYWNoIERPTSBlbGVtZW50IG5vZGUgd2lsbCBiZSBhbiBvYmplY3QncyBwcm9wZXJ0eSBuYW1lLCBhbmQgZWFjaCBwcm9wZXJ0eSB3aWxsIGNvbnRhaW4mI3hkOwogICAqIGFuIGFycmF5IG9mIGl0ZW1zLiBUaG9zZSBpdGVtcyBjYW0gYmUgc3RyaW5ncyBvciBvdGhlciBvYmplY3RzLiYjeGQ7CiAgICogQG1lbWJlcm9mIFBSRC51dGlsJiN4ZDsKICAgKiBAc2luY2UgMS4wLjImI3hkOwogICAqJiN4ZDsKICAgKiBAcGFyYW0gIHtqYXZhLnV0aWwuQXJyYXlMaXN0fSAgbGlzdCAgSmF2YSBvYmplY3QgcmVzdWx0aW5nIGZyb20gZmxvd2RhdGEuZ2V0T2JqZWN0KCkmI3hkOwogICAqJiN4ZDsKICAgKiBAdHlwZSB7KGFycmF5LiZsdDsob2JqZWN0fHN0cmluZykmZ3Q7fG51bGwpfSYjeGQ7CiAgICogQHJldHVybiB7KGFycmF5LiZsdDsob2JqZWN0fHN0cmluZykmZ3Q7fG51bGwpfSBFQ01BIEFycmF5IG9mIG9iamVjdHMgYW5kIHN0cmluZy4gSWYgZXJyb3Igb2NjdXIgcmV0dXJucyBudWxsLiYjeGQ7CiAgICovJiN4ZDsKICBmdW5jdGlvbiBnZXRPYmplY3QyYXJyKCBsaXN0LCBvbmVsdmwgKSB7JiN4ZDsKICAgIHZhciByZXMsIGZuYW1lLCBpbml0aWFsbm9kZSwgY3Vycm5vZGUsIG5vZGVuYW1lLCBjaGlsZG5vZGVzLCBwcmVwcm9jZXNzLCByZW1vdmVvYmo7JiN4ZDsKICAgIGZuYW1lID0gJ2dldE9iamVjdDJhcnIoKTogJzsmI3hkOwogICAgcmVzID0gbnVsbDsgcmVtb3Zlb2JqID0gdHJ1ZTsmI3hkOwomI3hkOwogICAgaWYgKCBsaXN0ID09PSBudWxsIHx8ICghKCB0eXBlb2YgbGlzdCA9PT0gJ29iamVjdCcgJmFtcDsmYW1wOyBsaXN0LmdldENsYXNzKCkgPT0gJ2NsYXNzIGphdmEudXRpbC5BcnJheUxpc3QnICkpICkgeyYjeGQ7CiAgICAgIGxvZ2Vycm9yKCBmbmFtZSArICdJbnZhbGlkIHBhcmFtZXRlciByZWNlaXZlZC4gbGlzdCBtdXN0IGJlIHRoZSByZXN1bHQgb2YgYSBmbG93ZGF0YS5nZXRPYmplY3QoKSBjYWxsLicgKTsmI3hkOwogICAgICByZXR1cm4gcmVzOyYjeGQ7CiAgICB9JiN4ZDsKICAgIC8vIFJldHJpZXZlcyB0aGUgZmlyc3QgRWxlbWVudE5TSW1wbCBub2RlIGZyb20gdGhlIGxpc3QmI3hkOwogICAgaWYgKCBsaXN0LnNpemUoKSAmZ3Q7IDAgKSB7JiN4ZDsKICAgICAgaW5pdGlhbG5vZGUgPSBsaXN0LmdldCgwKTsmI3hkOwogICAgfSYjeGQ7CiYjeGQ7CiAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIG5vZGVzLCBncm91cCBlbGVtZW50IGNoaWxkIG5vZGVzIGludG8gYXJyYXlzIGFzIHBlciB0aGVpciBjb250ZW50LiYjeGQ7CiAgICBpZiAoIGluaXRpYWxub2RlICE9IG51bGwgJmFtcDsmYW1wOyB0eXBlb2YgaW5pdGlhbG5vZGUgPT09ICdvYmplY3QnICZhbXA7JmFtcDsgaW5pdGlhbG5vZGUuZ2V0Q2xhc3MoKSA9PSAnY2xhc3Mgb3JnLmFwYWNoZS54ZXJjZXMuZG9tLkVsZW1lbnROU0ltcGwnICkgeyYjeGQ7CiAgICAgIGN1cnJub2RlID0gaW5pdGlhbG5vZGU7JiN4ZDsKICAgICAgcmVzID0gWyB7fSBdOyYjeGQ7CiAgICAgIHByZXByb2Nlc3MgPSB7fTsmI3hkOwogICAgICB3aGlsZSAoIGN1cnJub2RlICkgeyYjeGQ7CiAgICAgICAgLy8gVGV4dCBub2RlcyBhcmUgYXBwZW5kZWQgYXMgaXMgdG8gdGhlIGN1cnJlbnQgbGV2ZWwmI3hkOwogICAgICAgIGlmICggY3Vycm5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBnZXROb2RlVHlwZXMubm9kZXR5cGUuVGV4dCApIHsmI3hkOwogICAgICAgICAgaWYgKCBzaG91bGRQcm9jZXNzTm9kZSggY3Vycm5vZGUgKSApIHsmI3hkOwogICAgICAgICAgICBkZWJ1Z21zZyggZm5hbWUgKyAnZm91bmQgdGV4dCBub2RlLiBnZXROb2RlVmFsdWUoKTogIicgKyBjdXJybm9kZS5nZXROb2RlVmFsdWUoKSArICciJyApOyYjeGQ7CiAgICAgICAgICAgIHJlcy5wdXNoKCBTdHJpbmcoIGN1cnJub2RlLmdldE5vZGVWYWx1ZSgpICkgKTsmI3hkOwogICAgICAgICAgfSYjeGQ7CiAgICAgICAgfSYjeGQ7CiAgICAgICAgLy8gRWxlbWVudCBub2RlcyByZXF1aXJlIGdyb3VwaW5nIGZvciBkZWR1cGxpY2F0aW9uIHNpbmNlIHdlIGNhbiBoYXZlIDIgc2libGluZyBlbGVtZW50cyB3aXRoIHRoZSBzYW1lIG5vZGUgbmFtZSYjeGQ7CiAgICAgICAgaWYgKCBjdXJybm9kZS5nZXROb2RlVHlwZSgpID09IGdldE5vZGVUeXBlcy5ub2RldHlwZS5FbGVtZW50ICkgeyYjeGQ7CiAgICAgICAgICAvLyBEZWR1cGxpY2F0aW9uIG9mIG5vZGUgbmFtZXMmI3hkOwogICAgICAgICAgbm9kZW5hbWUgPSBTdHJpbmcoIGN1cnJub2RlLmdldE5vZGVOYW1lKCkgKTsmI3hkOwogICAgICAgICAgZGVidWdtc2coIGZuYW1lICsgJ2ZvdW5kIGVsZW1lbnQgbm9kZSAiJyArIG5vZGVuYW1lICsgJyInICk7JiN4ZDsKICAgICAgICAgIGlmICggISBwcmVwcm9jZXNzLmhhc093blByb3BlcnR5KCBub2RlbmFtZSApICkgeyYjeGQ7CiAgICAgICAgICAgIHByZXByb2Nlc3NbIG5vZGVuYW1lIF0gPSBbXTsmI3hkOwogICAgICAgICAgfSYjeGQ7CiAgICAgICAgICBwcmVwcm9jZXNzWyBub2RlbmFtZSBdLnB1c2goIGN1cnJub2RlICk7JiN4ZDsKICAgICAgICAgIHJlbW92ZW9iaiA9IGZhbHNlOyYjeGQ7CiAgICAgICAgfSYjeGQ7CiAgICAgICAgY3Vycm5vZGUgPSBjdXJybm9kZS5nZXROZXh0U2libGluZygpOyYjeGQ7CiAgICAgIH0mI3hkOwomI3hkOwogICAgICAvLyBJdGVyYXRlcyB0aGUgcHJvcGVydGllcyBhbmQgc2V0IHRoZW0gdXAgdXNpbmcgZmxvd2RhdGEyb2JqJiN4ZDsKICAgICAgZm9yICggbm9kZW5hbWUgaW4gcHJlcHJvY2VzcyApIHsmI3hkOwogICAgICAgIHJlc1sgMCBdWyBub2RlbmFtZSBdID0gZmxvd2RhdGEyb2JqKCBwcmVwcm9jZXNzWyBub2RlbmFtZSBdICk7JiN4ZDsKICAgICAgfSYjeGQ7CiYjeGQ7CiAgICAgIGlmICggcmVtb3Zlb2JqICkgeyYjeGQ7CiAgICAgICAgcmVzID0gcmVzLnNwbGljZSggMSApOyYjeGQ7CiAgICAgIH0mI3hkOwogICAgfSYjeGQ7CiYjeGQ7CiAgICByZXR1cm4gcmVzOyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiAoRW5naW5lIG9ubHkpIENoZWNrIGlmIHdlIHNob3VsZCBza2lwIHByb2Nlc3NpbmcgYSB0ZXh0IG5vZGUuJmx0O2JyLyZndDsmI3hkOwogICAqIFVzaW5nIHhlcmNlcyBsaWJyYXJpZXMgdG8gcGFyc2VmbG93ZGF0YSBzaWJsaW5nL2NoaWxkIG5vZGVzIHlpZWxkcyBzZXZlcmFsIHRleHQgbm9kZXMgd2l0aCBcIChjaGFyQ29kZUF0KDApIG9mIDEwKSYjeGQ7CiAgICogdGhhdCBkbyBub3QgYXBwZWFyIHdoZW4gbG9va2luZyBhdCBmbG93ZGF0YSB4bWwgaW4gdGhlIG1ldGF4bWwgZmllbGQgb2YgdGhlIGFmZG9jdW1lbnQgdGFibGUuJmx0O2JyLyZndDsmI3hkOwogICAqIEdpdmVuIHRoYXQgYmVoYXZpb3Igd2UgbmVlZCB0byBzdHJpcCB0aG9zZSB0ZXh0IG5vZGVzIG91dCBvZiBvdXIgcmVzdWx0cy4mI3hkOwogICAqIEBzaW5jZSAxLjAuMiYjeGQ7CiAgICogQHByaXZhdGUmI3hkOwogICAqIEBwYXJhbSAgeyhvcmcuYXBhY2hlLnhlcmNlcy5kb20uRWxlbWVudE5TSW1wbHxvcmcuYXBhY2hlLnhlcmNlcy5kb20uVGV4dEltcGwpfSAgbm9kZSAgICAgSmF2YSB4ZXJjZXMgbm9kZSYjeGQ7CiAgICogQHR5cGUge2Jvb2xlYW59JiN4ZDsKICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHdlIHNob3VsZCBwcm9jZXNzIHRoZSBub2RlLCBmYWxzZSBvdGhlcndpc2UuJiN4ZDsKICAgKi8mI3hkOwogIGZ1bmN0aW9uIHNob3VsZFByb2Nlc3NOb2RlKCBub2RlICkgeyYjeGQ7CiAgICBpZiAoIG5vZGUgPT09IG51bGwgKSB7JiN4ZDsKICAgICAgcmV0dXJuIGZhbHNlOyYjeGQ7CiAgICB9JiN4ZDsKICAgIGlmICggdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnICZhbXA7JmFtcDsgbm9kZS5nZXROb2RlVHlwZSgpID09IGdldE5vZGVUeXBlcy5ub2RldHlwZS5FbGVtZW50ICkgeyYjeGQ7CiAgICAgIHJldHVybiB0cnVlOyYjeGQ7CiAgICB9JiN4ZDsKICAgIGlmICggdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnICZhbXA7JmFtcDsgbm9kZS5nZXROb2RlVHlwZSgpID09IGdldE5vZGVUeXBlcy5ub2RldHlwZS5UZXh0ICkgeyYjeGQ7CiAgICAgIGlmICggbm9kZS5nZXROb2RlVmFsdWUoKS5sZW5ndGggPT09IDEgJmFtcDsmYW1wOyBub2RlLmdldE5vZGVWYWx1ZSgpLmNoYXJDb2RlQXQoIDAgKSA9PT0gMTAgKSB7JiN4ZDsKICAgICAgICByZXR1cm4gZmFsc2U7JiN4ZDsKICAgICAgfSBlbHNlIHsmI3hkOwogICAgICAgIHJldHVybiB0cnVlOyYjeGQ7CiAgICAgIH0mI3hkOwogICAgfSYjeGQ7CiAgICByZXR1cm4gZmFsc2U7JiN4ZDsKICB9JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIChFbmdpbmUgb25seSkgSXRlcmF0ZXMgcmVjdXJzaXZlbHkgdGhyb3VnaCBET00gbm9kZXMgZnJvbSBmbG93ZGF0YSYjeGQ7CiAgICogQHNpbmNlIDEuMC4yJiN4ZDsKICAgKiBAcHJpdmF0ZSYjeGQ7CiAgICogQHBhcmFtICB7b3JnLmFwYWNoZS54ZXJjZXMuZG9tLkVsZW1lbnROU0ltcGxbXX0gIG5vZGUgICAgIEphdmEgeGVyY2VzIG5vZGUgb3IgRUNNQSBhcnJheSBvZiBub2RlcyYjeGQ7CiAgICogQHR5cGUge2FycmF5LiZsdDsob2JqZWN0fHN0cmluZykmZ3Q7fSYjeGQ7CiAgICogQHJldHVybiB7YXJyYXkuJmx0OyhvYmplY3R8c3RyaW5nKSZndDt9IEVDTUEgQXJyYXkgb2Ygb2JqZWN0cyBhbmQgc3RyaW5ncy4mI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gZmxvd2RhdGEyb2JqKCBub2RlICkgeyYjeGQ7CiAgICB2YXIgZm5hbWUsIHJlcywgaSwgaiwgbm9kZW5hbWUsIGNoaWxkbm9kZXMsIGNoaWxkbm9kZSwgaXRlcmF0ZSwgcmVtb3Zlb2JqOyYjeGQ7CiAgICBmbmFtZSA9ICdmbG93ZGF0YTJvYmooKTogJzsmI3hkOwogICAgcmVzID0gWyAnJyBdOyBpdGVyYXRlID0ge307IHJlbW92ZW9iaiA9IHRydWU7JiN4ZDsKICAgIC8vIEFycmF5IG9mIG5vZGVzLCAgcHJvY2VzcyB0aGVpciBjaGlsZCBub2RlcyBvbmx5IGFuZCByZXR1cm4gYXJyYXkgd2l0aCAxIG9iamVjdCBhbmQgMSBvciBtb3JlIHRleHQgbm9kZXMmI3hkOwogICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBhcnJheSBvZiBwYXJlbnQgbm9kZXMgdGhhdCBzaG91bGQgaGF2ZSB0aGUgc2FtZSBlbGVtZW50IG5hbWUmI3hkOwogICAgaWYgKCBub2RlIGluc3RhbmNlb2YgQXJyYXkgKSB7JiN4ZDsKICAgICAgZGVidWdtc2coIGZuYW1lICsgJ1JlY2VpdmVkIGFycmF5IGZvciBwcm9jZXNzaW5nLCBsZW5ndGg6ICcgKyBub2RlLmxlbmd0aCApOyYjeGQ7CiAgICAgIHJlcyA9IFsge30gXTsmI3hkOwogICAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIHBhcmVudCBub2RlcyB0byBjb2xsYXRlIGNoaWxkIG5vZGVzIHdpdGggc2FtZSBlbGVtZW50IG5hbWUmI3hkOwogICAgICBmb3IgKCBpID0gMDsgaSAmbHQ7IG5vZGUubGVuZ3RoOyBpKysgKSB7JiN4ZDsKICAgICAgICBpZiAoIG5vZGVbIGkgXS5oYXNDaGlsZE5vZGVzKCkgKSB7JiN4ZDsKICAgICAgICAgIGRlYnVnbXNnKCBmbmFtZSArICdub2RlIGF0IHBvc2l0aW9uICcgKyBpICsgJyBoYXMgY2hpbGQgbm9kZXMnICk7JiN4ZDsKICAgICAgICAgIGNoaWxkbm9kZXMgPSBub2RlWyBpIF0uZ2V0Q2hpbGROb2RlcygpOyYjeGQ7CiAgICAgICAgICAvLyBJdGVyYXRlcyB0aHJvdWdoIGNoaWxkIG5vZGVzIG9mIGEgc2luZ2xlIHBhcmVudCBub2RlJiN4ZDsKICAgICAgICAgIGZvciAoIGogPSAwOyBqICZsdDsgY2hpbGRub2Rlcy5nZXRMZW5ndGgoKTsgaisrICkgeyYjeGQ7CiAgICAgICAgICAgIGRlYnVnbXNnKCBmbmFtZSArICdhcnJheSBpbmRleCAnICsgaSArICc6IHByb2Nlc3NpbmcgY2hpbGQgbm9kZSAnICsgaiApOyYjeGQ7CiAgICAgICAgICAgIGNoaWxkbm9kZSA9IGNoaWxkbm9kZXMuaXRlbSggaiApOyYjeGQ7CiAgICAgICAgICAgIC8vIFRleHQgbm9kZXMgYXJlIGFwcGVuZGVkIGFzIGlzIHRvIHRoZSBjdXJyZW50IGxldmVsJiN4ZDsKICAgICAgICAgICAgaWYgKCBjaGlsZG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBnZXROb2RlVHlwZXMubm9kZXR5cGUuVGV4dCApIHsmI3hkOwogICAgICAgICAgICAgIGlmICggc2hvdWxkUHJvY2Vzc05vZGUoIGNoaWxkbm9kZSApICkgeyYjeGQ7CiAgICAgICAgICAgICAgICBkZWJ1Z21zZyggZm5hbWUgKyAnRm91bmQgdGV4dCBub2RlLiBnZXROb2RlVmFsdWUoKTogIicgKyBjaGlsZG5vZGUuZ2V0Tm9kZVZhbHVlKCkgKyAnIicgKTsmI3hkOwogICAgICAgICAgICAgICAgcmVzLnB1c2goIFN0cmluZyggY2hpbGRub2RlLmdldE5vZGVWYWx1ZSgpICkgKTsmI3hkOwogICAgICAgICAgICAgIH0mI3hkOwogICAgICAgICAgICB9JiN4ZDsKICAgICAgICAgICAgLy8gRWxlbWVudCBub2RlcyByZXF1aXJlIGdyb3VwaW5nIGZvciBkZWR1cGxpY2F0aW9uIHNpbmNlIHdlIGNhbiBoYXZlIDIgc2libGluZyBlbGVtZW50cyB3aXRoIHRoZSBzYW1lIG5vZGUgbmFtZSYjeGQ7CiAgICAgICAgICAgIGlmICggY2hpbGRub2RlLmdldE5vZGVUeXBlKCkgPT0gZ2V0Tm9kZVR5cGVzLm5vZGV0eXBlLkVsZW1lbnQgKSB7JiN4ZDsKICAgICAgICAgICAgICAvLyBEZWR1cGxpY2F0aW9uIG9mIG5vZGUgbmFtZXMmI3hkOwogICAgICAgICAgICAgIG5vZGVuYW1lID0gU3RyaW5nKCBjaGlsZG5vZGUuZ2V0Tm9kZU5hbWUoKSApOyYjeGQ7CiAgICAgICAgICAgICAgZGVidWdtc2coIGZuYW1lICsgJ2ZvdW5kIGVsZW1lbnQgbm9kZSAiJyArIG5vZGVuYW1lICsgJyInICk7JiN4ZDsKICAgICAgICAgICAgICBpZiAoICEgaXRlcmF0ZS5oYXNPd25Qcm9wZXJ0eSggbm9kZW5hbWUgKSApIHsmI3hkOwogICAgICAgICAgICAgICAgaXRlcmF0ZVsgbm9kZW5hbWUgXSA9IFtdOyYjeGQ7CiAgICAgICAgICAgICAgfSYjeGQ7CiAgICAgICAgICAgICAgaXRlcmF0ZVsgbm9kZW5hbWUgXS5wdXNoKCBjaGlsZG5vZGUgKTsmI3hkOwogICAgICAgICAgICAgIHJlbW92ZW9iaiA9IGZhbHNlOyYjeGQ7CiAgICAgICAgICAgIH0mI3hkOwogICAgICAgICAgfSAvLyBGaW5pc2hlZCBwcm9jZXNzaW5nIGEgc2luZ2xlIHBhcmVudCBub2RlJ3MgY2hpbGQgbm9kZXMmI3hkOwogICAgICAgIH0mI3hkOwogICAgICB9IC8vIEZpbmlzaGVkIHByb2Nlc3NpbmcgYWxsIHBhcmVudCBub2RlcyYjeGQ7CiYjeGQ7CiAgICAgIC8qIEF0IHRoaXMgcG9pbnQgd2UndmUgZ3JvdXBlZCBhbGwgdGhlIGNoaWxkbm9kZXMgdGhhdCBjb250YWluIHRoZSBzYW1lIG5hbWVzJiN4ZDsKICAgICAgICBhY3Jvc3MgYWxsIHBhcmVudCBub2RlcyB0aGF0IGNvbnRhaW5lZCB0aGUgc2FtZSBuYW1lLiYjeGQ7CiAgICAgICAgV2UgY2FuIG5vdyBwYXJzZSB0aG9zZSByZXN1bHMgcmVjdXJzaXZlbHkgKi8mI3hkOwomI3hkOwogICAgICAvLyBJdGVyYXRlcyB0aGUgcHJvcGVydGllcyBhbmQgc2V0IHRoZW0gdXAgcmVjdXJzaXZlIGNhbGxpbmcgZmxvd2RhdGEyb2JqIGFnYWluJiN4ZDsKICAgICAgZm9yICggbm9kZW5hbWUgaW4gaXRlcmF0ZSApIHsmI3hkOwogICAgICAgIHJlc1sgMCBdWyBub2RlbmFtZSBdID0gZmxvd2RhdGEyb2JqKCBpdGVyYXRlWyBub2RlbmFtZSBdICk7JiN4ZDsKICAgICAgfSYjeGQ7CiYjeGQ7CiAgICAgIGlmICggcmVtb3Zlb2JqICkgeyYjeGQ7CiAgICAgICAgcmVzID0gcmVzLnNwbGljZSggMSApOyYjeGQ7CiAgICAgIH0mI3hkOwogICAgfSYjeGQ7CiAgICByZXR1cm4gcmVzOyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLyoqJiN4ZDsKICAgKiAoRW5naW5lIG9ubHkpIFJldHVybnMgYW4gb2JqZWN0IHRvIGJlIHVzZWQgdG8gY2hlY2sgd2hhdCBub2RlIHR5cGUgd2FzIHJldHVybmVkIGZyb20gbm9kZS5nZXROb2RlVHlwZSgpLiYjeGQ7CiAgICogQHNpbmNlIDEuMC4yJiN4ZDsKICAgKiBAcHJpdmF0ZSYjeGQ7CiAgICogQHR5cGUge29iamVjdH0mI3hkOwogICAqIEByZXR1cm4ge29iamVjdH0gRUNNQSBPYmplY3Qgd2hvc2UgcHJvcGVydGllcyBhbmQgdGhlaXIgdmFsdWVzIG1hcCB0byB0aGUgcG9zc2libGUgcmVzdWx0cyBvZiBub2RlLmdldE5vZGVUeXBlKCkuJiN4ZDsKICAgKi8mI3hkOwogIGlmICggd2hlcmUgPT09ICdlbmdpbmUnICkgeyYjeGQ7CiAgICAvLyBBdHRhY2hpbmcgdG8gdGhlIGZ1bmN0aW9uIG9uIGxvYWQgdGltZSBzbyB0aGF0IGl0IG9ubHkgcnVucyBvbmNlLiYjeGQ7CiAgICBnZXROb2RlVHlwZXMubm9kZXR5cGUgPSBnZXROb2RlVHlwZXMoKTsmI3hkOwogIH0mI3hkOwogIGZ1bmN0aW9uIGdldE5vZGVUeXBlcygpIHsmI3hkOwogICAgdmFyIG5vZGV0eXBlID0ge307JiN4ZDsKICAgIG5vZGV0eXBlLkF0dHIgPSBQYWNrYWdlcy5vcmcudzNjLmRvbS5Ob2RlLkFUVFJJQlVURV9OT0RFOyYjeGQ7CiAgICBub2RldHlwZS5DREFUQVNlY3Rpb24gPSBQYWNrYWdlcy5vcmcudzNjLmRvbS5Ob2RlLkNEQVRBX1NFQ1RJT05fTk9ERTsmI3hkOwogICAgbm9kZXR5cGUuQ29tbWVudCA9IFBhY2thZ2VzLm9yZy53M2MuZG9tLk5vZGUuQ09NTUVOVF9OT0RFOyYjeGQ7CiAgICBub2RldHlwZS5Eb2N1bWVudEZyYWdtZW50ID0gUGFja2FnZXMub3JnLnczYy5kb20uTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFOyYjeGQ7CiAgICBub2RldHlwZS5Eb2N1bWVudCA9IFBhY2thZ2VzLm9yZy53M2MuZG9tLk5vZGUuRE9DVU1FTlRfTk9ERTsmI3hkOwogICAgbm9kZXR5cGUuRG9jdW1lbnRUeXBlID0gUGFja2FnZXMub3JnLnczYy5kb20uTm9kZS5ET0NVTUVOVF9UWVBFX05PREU7JiN4ZDsKICAgIG5vZGV0eXBlLkVsZW1lbnQgPSBQYWNrYWdlcy5vcmcudzNjLmRvbS5Ob2RlLkVMRU1FTlRfTk9ERTsmI3hkOwogICAgbm9kZXR5cGUuRW50aXR5ID0gUGFja2FnZXMub3JnLnczYy5kb20uTm9kZS5FTlRJVFlfTk9ERTsmI3hkOwogICAgbm9kZXR5cGUuRW50aXR5UmVmZXJlbmNlID0gUGFja2FnZXMub3JnLnczYy5kb20uTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREU7JiN4ZDsKICAgIG5vZGV0eXBlLk5vdGF0aW9uID0gUGFja2FnZXMub3JnLnczYy5kb20uTm9kZS5OT1RBVElPTl9OT0RFOyYjeGQ7CiAgICBub2RldHlwZS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gPSBQYWNrYWdlcy5vcmcudzNjLmRvbS5Ob2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERTsmI3hkOwogICAgbm9kZXR5cGUuVGV4dCA9IFBhY2thZ2VzLm9yZy53M2MuZG9tLk5vZGUuVEVYVF9OT0RFOyYjeGQ7CiAgICByZXR1cm4gbm9kZXR5cGU7JiN4ZDsKICB9JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIChFbmdpbmUgb25seSkgQ29udmVydHMgYSB1bmlkaW1lbnNpb25hbCBKYXZhIFZlY3RvciB3aG9zZSBlbnRyaWVzIGFyZSBzdHJpbmdzIHRvIGFuIEVDTUEgQXJyYXkuJmx0O2JyLyZndDsmI3hkOwogICAqIGh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvYXBpL2phdmEvdXRpbC9WZWN0b3IuaHRtbCYjeGQ7CiAgIComI3hkOwogICAqIEBwYXJhbSAge2phdmEudXRpbC5WZWN0b3J9IHYgICBKYXZhIFZlY3Rvci4mI3hkOwogICAqJiN4ZDsKICAgKiBAbWVtYmVyb2YgUFJELnV0aWwmI3hkOwogICAqIEBzaW5jZSAxLjAuMCYjeGQ7CiAgIComI3hkOwogICAqIEB0eXBlIHtzdHJpbmdbXX0mI3hkOwogICAqIEByZXR1cm4ge3N0cmluZ1tdfSBFQ01BIGFycmF5LiYjeGQ7CiAgICovJiN4ZDsKICBmdW5jdGlvbiBKYXZhVmVjdG9yVG9FQ01BQXJyYXkoIHYgKSB7JiN4ZDsKICAgIHZhciBpdCwgcmVzID0gW10sIGZuYW1lOyYjeGQ7CiAgICBmbmFtZSA9ICdKYXZhVmVjdG9yVG9FQ01BQXJyYXkoKTogJzsmI3hkOwogICAgaWYgKCB3aGVyZSAhPT0gJ2VuZ2luZScgKSB7JiN4ZDsKICAgICAgbG9nZXJyb3IoIGZuYW1lICsgJ2NhbiBvbmx5IGJlIHVzZWQgaW4gdGhlIHdvcmtmbG93IGVuZ2luZS4nICk7JiN4ZDsKICAgICAgcmV0dXJuOyYjeGQ7CiAgICB9JiN4ZDsKICAgIGlmICggdiAhPSBudWxsICZhbXA7JmFtcDsgdHlwZW9mIHYgPT09ICdvYmplY3QnICZhbXA7JmFtcDsgdi5zaXplKCkgJmd0OyAwICkgeyYjeGQ7CiAgICAgIHRyeSB7JiN4ZDsKICAgICAgICBpdCA9IHYuaXRlcmF0b3IoKTsmI3hkOwogICAgICAgIHdoaWxlKCBpdC5oYXNOZXh0KCkgKSB7JiN4ZDsKICAgICAgICAgIHJlcy5wdXNoKCBTdHJpbmcoIGl0Lm5leHQoKSApICk7JiN4ZDsKICAgICAgICB9JiN4ZDsKICAgICAgfSBjYXRjaCggZSApIHsmI3hkOwogICAgICAgIGxvZ2Vycm9yKCBmbmFtZSArICdFcnJvciBjb252ZXJ0aW5nIFZlY3RvciBpbnRvIEFycmF5OiAnICsgZS5tZXNzYWdlICk7JiN4ZDsKICAgICAgfSYjeGQ7CiAgICB9JiN4ZDsKICAgIHJldHVybiByZXM7JiN4ZDsKICB9JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIChFbmdpbmUgb25seSkgQ29udmVydHMgYSB1bmlkaW1lbnNpb25hbCBFQ01BIGFycmF5IHdob3NlIGVudHJpZXMgYXJlIHN0cmluZ3MgdG8gYSBKYXZhIFZlY3Rvci4mbHQ7YnIvJmd0OyYjeGQ7CiAgICogaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy9hcGkvamF2YS91dGlsL1ZlY3Rvci5odG1sJiN4ZDsKICAgKiYjeGQ7CiAgICogQG1lbWJlcm9mIFBSRC51dGlsJiN4ZDsKICAgKiBAc2luY2UgMS4wLjAmI3hkOwogICAqJiN4ZDsKICAgKiBAcGFyYW0gIHtzdHJpbmdbXX0gYXJyICAgRUNNQSBhcnJheS4mI3hkOwogICAqJiN4ZDsKICAgKiBAdHlwZSB7amF2YS51dGlsLlZlY3Rvcn0mI3hkOwogICAqIEByZXR1cm4ge2phdmEudXRpbC5WZWN0b3J9IEphdmEgVmVjdG9yLiYjeGQ7CiAgICovJiN4ZDsKICBmdW5jdGlvbiBFQ01BQXJyYXlUb0phdmFWZWN0b3IoIGFyciApIHsmI3hkOwogICAgdmFyIGksIHJlcywgZm5hbWU7JiN4ZDsKICAgIGZuYW1lID0gJ0VDTUFBcnJheVRvSmF2YVZlY3RvcigpOiAnOyYjeGQ7CiAgICBpZiAoIHdoZXJlICE9PSAnZW5naW5lJyApIHsmI3hkOwogICAgICBsb2dlcnJvciggZm5hbWUgKyAnY2FuIG9ubHkgYmUgdXNlZCBpbiB0aGUgd29ya2Zsb3cgZW5naW5lLicgKTsmI3hkOwogICAgICByZXR1cm47JiN4ZDsKICAgIH0mI3hkOwogICAgdHJ5IHsmI3hkOwogICAgICByZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOyYjeGQ7CiAgICAgIGZvciAoIGkgPSAwOyBpICZsdDsgYXJyLmxlbmd0aDsgaSsrICkgeyYjeGQ7CiAgICAgICAgcmVzLmFkZCggSlN0cmluZyggYXJyWyBpIF0gKSApOyYjeGQ7CiAgICAgIH0mI3hkOwogICAgICByZXR1cm4gcmVzOyYjeGQ7CiAgICB9IGNhdGNoKCBlICkgeyYjeGQ7CiAgICAgIGxvZ2Vycm9yKCBmbmFtZSArICdFcnJvciBjb252ZXJ0aW5nIEFycmF5IGludG8gVmVjdG9yOiAnICsgZS5tZXNzYWdlICk7JiN4ZDsKICAgIH0mI3hkOwogIH0mI3hkOwomI3hkOwogIC8qKiYjeGQ7CiAgICogUGVyZm9ybXMgYW4gSURWYXVsdC5nZXQgYW5kIHJldHVybnMgYW4gRUNNQSBhcnJheSB3aXRoIHRoZSByZXN1bHQuJmx0O2JyLyZndDsmI3hkOwogICAqIFJlZmFjdG9yZWQgb24gdjEuMC40IHRvIHJlcGxhY2UgdGhlIDR0aCBvcHRpb25hbCBwYXJhbWV0ZXIgZnJvbSBJRFZhdWx0IGluamVjdGlvbiB0byBhIGZvcm0ncyBmaWVsZCBuYW1lLiZsdDtici8mZ3Q7JiN4ZDsKICAgKiBUaGlzIGNoYW5nZSBjb3VsZCBicmVhayBmb3JtcyB1c2luZyBwcmlvciB2ZXJzaW9ucywgcGxlYXNlIGRvdWJsZSBjaGVjayB5b3VyIGZvcm0gY29kZSBiZWZvcmUgbW92aW5nIHRvIHYxLjAuNC4mI3hkOwogICAqJiN4ZDsKICAgKiBAbWVtYmVyb2YgUFJEJiN4ZDsKICAgKiBAc2luY2UgMS4wLjAmI3hkOwogICAqJiN4ZDsKICAgKiBAcGFyYW0gIHtzdHJpbmd9ICBsZGFwZG4gICAgICAgTERBUCBGdWxseSBEaXN0aW5ndWlzZWQgbmFtZSBvZiB0aGUgZURpcmVjdG9yeSBvYmplY3QgdG8gYmUgcXVlcmllZC4mI3hkOwogICAqIEBwYXJhbSAge3N0cmluZ30gIGVudGtleSAgICAgICBEQUwgZW50aXR5IGtleS4mI3hkOwogICAqIEBwYXJhbSAge3N0cmluZ30gIGF0dHJrZXkgICAgICBEQUwgYXR0cmlidXRlIGtleS4gQXR0cnJpYnV0ZSBtdXN0IGJlIGNvbmZpZ3VyZWQgdW5kZXIgdGhlIERBTCBlbnRpdHkuJiN4ZDsKICAgKiBAcGFyYW0gIHtzdHJpbmc9fSBbZmllbGRuYW1lXSAgKGZvcm0gbW9kZSBvbmx5KSBOYW1lIG9mIHRoZSBmaWVsZCB0byBiZSBhdXRvLXBvcHVsYXRlZCBieSB0aGUgZnVuY3Rpb24uJiN4ZDsKICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgZmllbGQgbmFtZSBkb2VzIG5vdCBleGlzdCB0aGUgZm9ybSBpdHNlbGYgd2lsbCBwcmVzZW50IHRoZSBlcnJvcjomI3hkOwogICAqICJBbiBlcnJvciAnRmllbGQgYXZvY2FkbyBub3QgZm91bmQgb3Igbm90IGluc3RhbnRpYXRlZCB5ZXQuJyB3YXMgZW5jb3VudGVyZWQgd2hpbGUgZXhlY3V0aW5nIHRoZSBzY3JpcHQgJ2luIElEVmF1bHQuZ2V0KCknIi4mI3hkOwogICAqJiN4ZDsKICAgKiBAdHlwZSB7c3RyaW5nW119JiN4ZDsKICAgKiBAcmV0dXJuIHtzdHJpbmdbXX0gRUNNQSBhcnJheSB3aXRoIHRoZSByZXN1bHRzLiBFbXB0eSBpZiBJRFZhdWx0LmdldCByZXR1cm5lZCBudWxsLCBhcnJheSB3aXRoIG9uZSBvciBtb3JlIGVsZW1lbnRzIG90aGVyd2lzZS4mI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gSURWZ2V0KCBsZGFwZG4sIGVudGtleSwgYXR0cmtleSwgZmllbGRuYW1lICkgeyYjeGQ7CiAgICAvLyBWYXJpYWJsZSBkZWNsYXJhdGlvbi4gS2VlcCBhbGwgdGhlIGRlY2xhcmF0aW9ucyB0b2dldGhlci4mI3hkOwogICAgdmFyIHFyZXMgPSBbXTsmI3hkOwogICAgdmFyIGdhdHRyLCBnYXR0clYsIGVycm1zZywgZm5hbWU7JiN4ZDsKICAgIGZuYW1lID0gJ0lEVmdldCgpOiAnOyYjeGQ7CiAgICAvLyBBZGp1c3RpbmcgZnVuY3Rpb24gaW5wdXQgdmFsdWVzIGJhc2VkIG9uIHdoZXJlIGl0IGlzIGJlaW5nIGV4ZWN1dGVkLiYjeGQ7CiAgICBpZiAoIHdoZXJlID09PSAnZW5naW5lJyApIHsmI3hkOwogICAgICBJRFZvYmogPSBJRFZhdWx0OyYjeGQ7CiAgICB9JiN4ZDsKICAgIGlmICggd2hlcmUgPT09ICdmb3JtJyApIHsmI3hkOwogICAgICBpZiAoIElETUFQUFMuSURWYXVsdCAhPT0gbnVsbCApIHsmI3hkOwogICAgICAgIElEVm9iaiA9IElETUFQUFMuSURWYXVsdDsmI3hkOwogICAgICB9IGVsc2UgeyYjeGQ7CiAgICAgICAgbG9nZXJyb3IoIGZuYW1lICsgJ3BsZWFzZSB1c2UgUFJELmluaXQoKSB3aXRoIGF0IGxlYXN0IElEVmF1bHQgYXMgYSBwYXJhbWV0ZXIgdG8gaW5pdGlhbGl6ZSB0aGUgbWFuZGF0b3J5IHJlZmVyZW5jZSB0byB0aGUgc2FtZS4gQWJvcnRpbmcuJyApOyYjeGQ7CiAgICAgICAgcmV0dXJuIHFyZXM7JiN4ZDsKICAgICAgfSYjeGQ7CiAgICB9JiN4ZDsKICAgIC8vIENoZWNrIGlucHV0IHBhcmFtZXRlcnMuJiN4ZDsKICAgIGlmICggbGRhcGRuID09IG51bGwgfHwgZW50a2V5ID09IG51bGwgfHwgYXR0cmtleSA9PSBudWxsICkgeyYjeGQ7CiAgICAgIGVycm1zZyA9IFtdOyYjeGQ7CiAgICAgIGVycm1zZy5wdXNoKCBmbmFtZSArICdtaXNzaW5nIG1hbmRhdG9yeSBwYXJhbWV0ZXJzLicgKTsmI3hkOwogICAgICBlcnJtc2cucHVzaCggJ2xkYXBkbjogJyArIFN0cmluZyggbGRhcGRuICkgKyAnLCcgKTsmI3hkOwogICAgICBlcnJtc2cucHVzaCggJ2VudGtleTogJyArIFN0cmluZyggZW50a2V5ICkgKyAnLCcgKTsmI3hkOwogICAgICBlcnJtc2cucHVzaCggJ2F0dHJrZXk6ICcgKyBTdHJpbmcoIGF0dHJrZXkgKSArICcsJyApOyYjeGQ7CiAgICAgIGxvZ2Vycm9yKCBlcnJtc2cuam9pbiggJyAnICkgKTsmI3hkOwogICAgICByZXR1cm4gcXJlczsmI3hkOwogICAgfSYjeGQ7CiAgICBsZGFwZG4gPSBTdHJpbmcoIGxkYXBkbiApOyAvLyBJc3N1ZSAjMjQmI3hkOwogICAgZW50a2V5ID0gU3RyaW5nKCBlbnRrZXkgKTsgLy8gSXNzdWUgIzI0JiN4ZDsKICAgIGF0dHJrZXkgPSBTdHJpbmcoIGF0dHJrZXkgKTsgLy8gSXNzdWUgIzI0JiN4ZDsKICAgIC8vIFBlcmZvcm1zIHRoZSBxdWVyeSBhbmQgaGFuZGxlcyBlcnJvcnMmI3hkOwogICAgdHJ5IHsmI3hkOwogICAgICAvLyBGdW5jdGlvbiBjYWxsIHBhcmFtZXRlcnMgYXJlIGRpZmZlcmVudCBiZXR3ZWVuIGVuZ2luZSBhbmQgZm9ybSYjeGQ7CiAgICAgIGlmICggd2hlcmUgPT09ICdmb3JtJyApIHsmI3hkOwogICAgICAgIGlmICggZmllbGRuYW1lID09IG51bGwgKSB7JiN4ZDsKICAgICAgICAgIGZpZWxkbmFtZSA9IG51bGw7JiN4ZDsKICAgICAgICB9JiN4ZDsKICAgICAgICBnYXR0ciA9IElEVm9iai5nZXQoIGZpZWxkbmFtZSwgbGRhcGRuLCBlbnRrZXksIGF0dHJrZXkgKTsmI3hkOwogICAgICB9JiN4ZDsKICAgICAgaWYgKCB3aGVyZSA9PT0gJ2VuZ2luZScgKSB7JiN4ZDsKICAgICAgICBnYXR0ciA9IElEVm9iai5nZXQoIGxkYXBkbiwgZW50a2V5LCBhdHRya2V5ICk7JiN4ZDsKICAgICAgfSYjeGQ7CiAgICAgIC8vIE5vcm1hbGl6ZSByZXN1bHRzIGludG8gYW4gRUNNQSBhcnJheSYjeGQ7CiAgICAgIGlmICggZ2F0dHIgPT09IG51bGwgKSB7JiN4ZDsKICAgICAgICAvLyBRdWVyeSBzdWNjZWVkZWQgd2l0aCAwIHJlc3VsdHMuIFN0dWIgbGVmdCBpbiBjYXNlIHdlIG5lZWQgdG8gYWRkIGRlYnVnIG1lc3NhZ2VzLiYjeGQ7CiAgICAgIH0gZWxzZSBpZiAoIGlzU3RyaW5nKCBnYXR0ciApICkgeyYjeGQ7CiAgICAgICAgLy8gUXVlcnkgc3VjY2VlZGVkIHdpdGggYSBzaW5nbGUgcmVzdWx0LiBDYXN0cyByZXN1bHQgYXMgYSBzaW5nbGUtZWxlbWVudCBhcnJheSB0byB0aGUgcXJlcyB2YXJpYWJsZS4mI3hkOwogICAgICAgIHFyZXMucHVzaCggY29lcmNlVG9TdHJpbmcoIGdhdHRyICkgKTsmI3hkOwogICAgICB9IGVsc2UgaWYgKCB3aGVyZSA9PT0gJ2Zvcm0nICZhbXA7JmFtcDsgZ2F0dHIgaW5zdGFuY2VvZiBBcnJheSApIHsmI3hkOwogICAgICAgIC8vIFF1ZXJ5IHN1Y2NlZWRlZCB3aXRoIDIgb3IgbW9yZSByZXN1bHRzLiBTYXZlcyByZXN1bHRzIGRpcmVjdGx5IHRvIHRoZSBxcmVzIHZhcmlhYmxlLiYjeGQ7CiAgICAgICAgcXJlcyA9IGdhdHRyOyYjeGQ7CiAgICAgIH0gZWxzZSBpZiAoIHdoZXJlID09PSAnZW5naW5lJyAmYW1wOyZhbXA7IHR5cGVvZiBnYXR0ciA9PT0gJ29iamVjdCcgJmFtcDsmYW1wOyBnYXR0ci5zaXplKCkgJmd0OyAwICkgeyYjeGQ7CiAgICAgICAgLy8gUXVlcnkgc3VjY2VlZGVkIHdpdGggMiBvciBtb3JlIHJlc3VsdHMuIFNhdmVzIHJlc3VsdHMgZGlyZWN0bHkgdG8gdGhlIHFyZXMgdmFyaWFibGUuJiN4ZDsKICAgICAgICBxcmVzID0gSmF2YVZlY3RvclRvRUNNQUFycmF5KCBnYXR0ciApOyYjeGQ7CiAgICAgIH0mI3hkOwogICAgfSBjYXRjaCggZSApIHsmI3hkOwogICAgICBsb2dlcnJvciggZm5hbWUgKyAnRXJyb3Igb2NjdXJlZCBkdXJpbmcgSURWYXVsdC5nZXQgcXVlcnkuIEFib3J0aW5nLiBFcnJvciBtZXNzYWdlOiAnICsgZS5tZXNzYWdlICk7JiN4ZDsKICAgIH0mI3hkOwogICAgLy8gRm9yY2UgdGhlIHJlc3VsdCB0byByZXR1cm4gYSBjb3B5IG9mIHRoZSBhcnJheS4mI3hkOwogICAgcmV0dXJuIHFyZXM7JiN4ZDsKICB9JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIFBlcmZvcm1zIGFuIElEVmF1bHQuZ2xvYmFsUXVlcnkgYW5kIHJldHVybnMgYW4gb2JqZWN0IHdpdGggdGhlIHJlc3VsdC4mbHQ7YnIvJmd0OyYjeGQ7CiAgICogUmVmYWN0b3JlZCBvbiB2MS4wLjQgdG8gcmVwbGFjZSB0aGUgNHRoIG9wdGlvbmFsIHBhcmFtZXRlciBmcm9tIElEVmF1bHQgaW5qZWN0aW9uIHRvIGEgZm9ybSdzIGZpZWxkIG5hbWUuJmx0O2JyLyZndDsmI3hkOwogICAqIFRoaXMgY2hhbmdlIGNvdWxkIGJyZWFrIGZvcm1zIHVzaW5nIHByaW9yIHZlcnNpb25zLCBwbGVhc2UgZG91YmxlIGNoZWNrIHlvdXIgZm9ybSBjb2RlIGJlZm9yZSBtb3ZpbmcgdG8gdjEuMC40LiYjeGQ7CiAgIComI3hkOwogICAqIEBtZW1iZXJvZiBQUkQmI3hkOwogICAqIEBzaW5jZSAxLjAuMSYjeGQ7CiAgIComI3hkOwogICAqIEBwYXJhbSAge3N0cmluZ30gIGRhbHF1ZXJ5a2V5ICBEQUwgUXVlcnkga2V5LiYjeGQ7CiAgICogQHBhcmFtICB7b2JqZWN0fSAgcGFyYW1ldGVycyAgIEVDTUEgb2JqZWN0IHdpdGggdGhlIHBhcmFtdGVycyBkZWZpbmVkIGluIHRoZSBEQUwgUXVlcnkuIHtwYXJhbWV0ZXJuYW1lOnBhcmFtZXRlcnZhbHVlfSYjeGQ7CiAgICogQHBhcmFtICB7b2JqZWN0PX0gW2ZpZWxkbmFtZV0gIChmb3JtIG1vZGUgb25seSkgTmFtZSBvZiB0aGUgZmllbGQgdG8gYmUgYXV0by1wb3B1bGF0ZWQgYnkgdGhlIGZ1bmN0aW9uLiYjeGQ7CiAgIComI3hkOwogICAqIEB0eXBlIHtzdHJpbmdbXX0mI3hkOwogICAqIEByZXR1cm4ge3N0cmluZ1tdfSBBcnJheSB3aXRoIExEQVAgRE5zIHJldHVybmVkLiYjeGQ7CiAgICovJiN4ZDsKICBmdW5jdGlvbiBJRFZnbG9iYWxRdWVyeSggZGFscXVlcnlrZXksIHBhcmFtZXRlcnMsIGZpZWxkbmFtZSApIHsmI3hkOwogICAgLy8gVmFyaWFibGUgZGVjbGFyYXRpb24uIEtlZXAgYWxsIHRoZSBkZWNsYXJhdGlvbnMgdG9nZXRoZXIuJiN4ZDsKICAgIHZhciBxcmVzLCBncXIsIGVycm1zZywgcGNvbnYsIGZuYW1lLCBrZXksIGksIHRyZWF0ZWRwYXJhbWV0ZXJzOyYjeGQ7CiAgICBmbmFtZSA9ICdJRFZnbG9iYWxRdWVyeSgpOiAnOyYjeGQ7CiAgICBxcmVzID0gW107JiN4ZDsKICAgIHBjb252ID0gJyc7JiN4ZDsKICAgIHRyZWF0ZWRwYXJhbWV0ZXJzID0ge307JiN4ZDsKICAgIC8vIEFkanVzdGluZyBmdW5jdGlvbiBpbnB1dCB2YWx1ZXMgYmFzZWQgb24gd2hlcmUgaXQgaXMgYmVpbmcgZXhlY3V0ZWQuJiN4ZDsKICAgIGlmICggd2hlcmUgPT09ICdlbmdpbmUnICkgeyYjeGQ7CiAgICAgIElEVm9iaiA9IElEVmF1bHQ7JiN4ZDsKICAgIH0mI3hkOwogICAgaWYgKCB3aGVyZSA9PT0gJ2Zvcm0nICkgeyYjeGQ7CiAgICAgIGlmICggSURNQVBQUy5JRFZhdWx0ICE9PSBudWxsICkgeyYjeGQ7CiAgICAgICAgSURWb2JqID0gSURNQVBQUy5JRFZhdWx0OyYjeGQ7CiAgICAgIH0gZWxzZSB7JiN4ZDsKICAgICAgICBsb2dlcnJvciggZm5hbWUgKyAncGxlYXNlIHVzZSBQUkQuaW5pdCgpIHdpdGggYXQgbGVhc3QgSURWYXVsdCBhcyBhIHBhcmFtZXRlciB0byBpbml0aWFsaXplIHRoZSBtYW5kYXRvcnkgcmVmZXJlbmNlIHRvIHRoZSBzYW1lLiBBYm9ydGluZy4nICk7JiN4ZDsKICAgICAgICByZXR1cm4gcXJlczsmI3hkOwogICAgICB9JiN4ZDsKICAgIH0mI3hkOwogICAgLy8gQ2hlY2sgaW5wdXQgcGFyYW1ldGVycy4mI3hkOwogICAgaWYgKCBkYWxxdWVyeWtleSA9PSBudWxsIHx8IHBhcmFtZXRlcnMgPT0gbnVsbCApIHsmI3hkOwogICAgICBlcnJtc2cgPSBbXTsmI3hkOwogICAgICBlcnJtc2cucHVzaCggZm5hbWUgKyAnbWlzc2luZyBtYW5kYXRvcnkgcGFyYW1ldGVycy4nICk7JiN4ZDsKICAgICAgZXJybXNnLnB1c2goICdkYWxxdWVyeWtleTogJyArIFN0cmluZyggZGFscXVlcnlrZXkgKSArICcsJyApOyYjeGQ7CiAgICAgIGlmICggcGFyYW1ldGVycyA9PT0gbnVsbCApIHsmI3hkOwogICAgICAgIHBjb252ID0gU3RyaW5nKCBwYXJhbWV0ZXJzICk7JiN4ZDsKICAgICAgfSBlbHNlIHsmI3hkOwogICAgICAgIHBjb252ID0gSlNPTnN0cmluZ2lmeSggcGFyYW1ldGVycyApOyYjeGQ7CiAgICAgIH0mI3hkOwogICAgICBlcnJtc2cucHVzaCggJ3BhcmFtZXRlcnM6ICcgKyBwY29udiArICcsJyApOyYjeGQ7CiAgICAgIGxvZ2Vycm9yKCBlcnJtc2cuam9pbiggJyAnICkgKTsmI3hkOwogICAgICByZXR1cm4gcXJlczsmI3hkOwogICAgfSYjeGQ7CiAgICBkYWxxdWVyeWtleSA9IFN0cmluZyggZGFscXVlcnlrZXkgKTsgLy8gIzI0JiN4ZDsKICAgIHRyZWF0ZWRwYXJhbWV0ZXJzID0ge307IC8vICMyNCYjeGQ7CiAgICBmb3IgKCBrZXkgaW4gcGFyYW1ldGVycyApIHsgLy8gIzI0IC0gdGhlIHdob2xlIGZvciBpdGVyYXRpb24uJiN4ZDsKICAgICAgaWYgKCBwYXJhbWV0ZXJzWyBrZXkgXSBpbnN0YW5jZW9mIEFycmF5ICkgeyYjeGQ7CiAgICAgICAgdHJlYXRlZHBhcmFtZXRlcnNbIGtleSBdID0gW107JiN4ZDsKICAgICAgICBmb3IgKCBpID0gMDsgaSAmbHQ7IHBhcmFtZXRlcnNbIGtleSBdLmxlbmd0aDsgaSsrICkgeyYjeGQ7CiAgICAgICAgICB0cmVhdGVkcGFyYW1ldGVyc1sga2V5IF0ucHVzaCggU3RyaW5nKCBwYXJhbWV0ZXJzWyBrZXkgXVsgaSBdICkgKTsmI3hkOwogICAgICAgIH0mI3hkOwogICAgICB9IGVsc2UgeyYjeGQ7CiAgICAgICAgdHJlYXRlZHBhcmFtZXRlcnNbIGtleSBdID0gU3RyaW5nKCBwYXJhbWV0ZXJzWyBrZXkgXSApOyYjeGQ7CiAgICAgIH0mI3hkOwogICAgfSYjeGQ7CiAgICAvLyBQZXJmb3JtcyB0aGUgcXVlcnkgYW5kIGhhbmRsZXMgZXJyb3JzJiN4ZDsKICAgIHRyeSB7JiN4ZDsKICAgICAgLy8gRnVuY3Rpb24gY2FsbCBwYXJhbWV0ZXJzIGFyZSBkaWZmZXJlbnQgYmV0d2VlbiBlbmdpbmUgYW5kIGZvcm0sIGFzIGFyZSByZXR1cm4gdHlwZXMuJiN4ZDsKICAgICAgaWYgKCB3aGVyZSA9PT0gJ2Zvcm0nICkgeyYjeGQ7CiAgICAgICAgaWYgKCBmaWVsZG5hbWUgPT0gbnVsbCApIHsmI3hkOwogICAgICAgICAgZmllbGRuYW1lID0gbnVsbDsmI3hkOwogICAgICAgIH0mI3hkOwogICAgICAgIGdxciA9IElEVm9iai5nbG9iYWxRdWVyeSggZmllbGRuYW1lLCBkYWxxdWVyeWtleSwgcGFyYW1ldGVycyApOyYjeGQ7CiAgICAgICAgaWYgKCBncXIgaW5zdGFuY2VvZiBBcnJheSAmYW1wOyZhbXA7IGdxclsgMCBdIGluc3RhbmNlb2YgQXJyYXkgJmd0OyAwICZhbXA7JmFtcDsgZ3FyWyAwIF1bIDAgXSAhPSAnJyApIHsmI3hkOwogICAgICAgICAgcXJlcyA9IGdxclsgMCBdOyYjeGQ7CiAgICAgICAgfSYjeGQ7CiAgICAgIH0mI3hkOwogICAgICBpZiAoIHdoZXJlID09PSAnZW5naW5lJyApIHsmI3hkOwogICAgICAgIGdxciA9IElEVm9iai5nbG9iYWxRdWVyeSggZGFscXVlcnlrZXksIHBhcmFtZXRlcnMgKTsmI3hkOwogICAgICAgIGlmICggZ3FyICE9IG51bGwgJmFtcDsmYW1wOyBncXIuc2l6ZSgpICZndDsgMCApIHsmI3hkOwogICAgICAgICAgcXJlcyA9IEphdmFWZWN0b3JUb0VDTUFBcnJheSggZ3FyICk7JiN4ZDsKICAgICAgICB9JiN4ZDsKICAgICAgfSYjeGQ7CiAgICB9IGNhdGNoICggZSApIHsmI3hkOwogICAgICBsb2dlcnJvciggZm5hbWUgKyAnRXJyb3Igb2NjdXJlZCBkdXJpbmcgSURWYXVsdC5nbG9iYWxRdWVyeSAuIEFib3J0aW5nLiBFcnJvciBtZXNzYWdlOiAnICsgZS5tZXNzYWdlICk7JiN4ZDsKICAgIH0mI3hkOwogICAgcmV0dXJuIHFyZXM7JiN4ZDsKICB9JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIChFbmdpbmUgb25seSkgV3JhcGVyIGZvciBHQ1YuZ2V0IC4gQXR0ZW1wdHMgdG8gcmV0cmlldmUgdGhlIEdDViB2YWx1ZS4gcmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSAob3IgJycgaWYgbm8gZGVmYXVsdCBwcm92aWRlZCkmI3hkOwogICAqIEBtZW1iZXJvZiBQUkQudXRpbCYjeGQ7CiAgICogQHNpbmNlIDEuMC4yJiN4ZDsKICAgKiYjeGQ7CiAgICogQHBhcmFtIHtzdHJpbmd9ICAgR0NWbmFtZSAgICAgICAgIE5hbWUgb2YgdGhlIEdDViB0byBiZSByZXRyaWV2ZWQuJiN4ZDsKICAgKiBAcGFyYW0ge3N0cmluZz19ICBbcmV0dXJuVHlwZV0gICAgJ3N0cmluZycsICdudW1iZXInIG9yICdib29sZWFuJy4gRm9yY2VzIGNvZXJjaW9uIHRvIHNhaWQgdHlwZSBmb3IgdGhlIHJldHVybi4mI3hkOwogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byAnc3RyaW5nJyBpZiBub3QgcHJvdmlkZWQgb3IgYW55IG90aGVyIHZhbHVlLiYjeGQ7CiAgICogQHBhcmFtIHtzdHJpbmc9fSAgW0RlZmF1bHRWYWx1ZV0gIERlZmF1bHQgdmFsdWUgdG8gYmUgdXNlZCBpZiB0aGUgR0NWLmdldCgpIGZhaWxzLiBEZWZhdWx0cyB0byAnJyBpZiBub3QgcHJvdmlkZWQuJiN4ZDsKICAgKiBAcmV0dXJuIHsoc3RyaW5nfG51bWJlcnxib29sZWFuKX0gR0NWLmdldCByZXN1bHQgb3IgZGVmYXVsdCB2YWx1ZS4mI3hkOwogICAqLyYjeGQ7CiAgZnVuY3Rpb24gR0NWZ2V0KCBHQ1ZuYW1lLCByZXR1cm5UeXBlLCBEZWZhdWx0VmFsdWUgKSB7JiN4ZDsKICAgIHZhciByZXQsIGRlZnZhbCA9ICcnLCBmbmFtZTsmI3hkOwogICAgZm5hbWUgPSAnR0NWZ2V0KCk6ICc7JiN4ZDsKICAgIGlmICggRGVmYXVsdFZhbHVlICE9IG51bGwgKSB7JiN4ZDsKICAgICAgZGVmdmFsID0gU3RyaW5nKCBEZWZhdWx0VmFsdWUgKTsmI3hkOwogICAgfSYjeGQ7CiAgICBpZiAoIEdDVm5hbWUgIT0gbnVsbCAmYW1wOyZhbXA7IEdDVm5hbWUgIT09ICcnICkgeyYjeGQ7CiAgICAgIEdDVm5hbWUgPSBTdHJpbmcoIEdDVm5hbWUgKTsmI3hkOwogICAgICB0cnkgeyYjeGQ7CiAgICAgICAgcmV0ID0gR0NWLmdldCggR0NWbmFtZSApOyYjeGQ7CiAgICAgIH0gY2F0Y2ggKCBlICkgeyYjeGQ7CiAgICAgICAgbG9nZXJyb3IoIGZuYW1lICsgJ0ZhaWxlZCB0byByZXRyaWV2ZSB2YWx1ZSBmb3IgR0NWICInICsgR0NWbmFtZSArICciLCBFcnJvcjogJyArIGUubWVzc2FnZSApOyYjeGQ7CiAgICAgIH0mI3hkOwogICAgfSBlbHNlIHsmI3hkOwogICAgICBsb2dlcnJvciggZm5hbWUgKyAnR0NWbmFtZSBub3QgcHJvdmlkZWQuJyApOyYjeGQ7CiAgICB9JiN4ZDsKICAgIC8vIEZhaWxlZCB0byByZXRyaWV2ZSB0aGUgR0NWJiN4ZDsKICAgIGlmICghIHJldCApIHsmI3hkOwogICAgICBsb2dlcnJvciggZm5hbWUgKyAnR0NWLmdldCggIicgKyBHQ1ZuYW1lICsgJyIgKSByZXR1cm5lZCBudWxsIHZhbHVlLiBQbGVhc2UgbWFrZSBzdXJlIHRoZSBzYW1lIGlzIGF2YWlsYWJsZSBvbiB0aGUgVXNlciBBcHBsaWNhdGlvbiBkcml2ZXInICk7JiN4ZDsKICAgICAgcmV0ID0gZGVmdmFsOyYjeGQ7CiAgICB9JiN4ZDsKICAgIC8vIENvZXJjZSByZXN1bHQgYXMgd2UgcmV0dXJuIGl0LiYjeGQ7CiAgICBzd2l0Y2goIFN0cmluZyggcmV0dXJuVHlwZSApICkgeyYjeGQ7CiAgICAgIGNhc2UgJ2Jvb2xlYW4nOiYjeGQ7CiAgICAgICAgcmV0dXJuIEJvb2xlYW4oIHJldCApOyYjeGQ7CiAgICAgIGNhc2UgJ251bWJlcic6JiN4ZDsKICAgICAgICByZXR1cm4gTnVtYmVyKCByZXQgKTsmI3hkOwogICAgICBkZWZhdWx0OiAvLyBjYXNlICdzdHJpbmcnIG92ZXJsYXBzIHdpdGggdGhpcyBvbmUmI3hkOwogICAgICAgIHJldHVybiBTdHJpbmcoIHJldCApOyYjeGQ7CiAgICB9JiN4ZDsKICB9JiN4ZDsKJiN4ZDsKICAvKiomI3hkOwogICAqIChFbmdpbmUgb25seSkgV3JhcGVyIGZvciBHQ1YuZ2V0VmFsdWVGb3JOYW1lZFBhc3N3b3JkLiBBdHRlbXB0cyB0byByZXRyaWV2ZSB0aGUmI3hkOwogICAqIG5hbWVkIHBhc3N3b3JkIHZhbHVlIHVzaW5nIGEgR0NWLXJlZiBhcyB0aGUgYnJpZGdlIGZvciB0aGUgc2FtZS4mbHQ7YnIvJmd0OyYjeGQ7CiAgICogSWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgdHJ1ZSBhbmQgdGhlIG5hbWVkIHBhc3N3b3JkIHJlYWQgZmFpbHMgdGhlIGZ1bmN0aW9uIGF0dGVtcHMmI3hkOwogICAqIHVwIHRvIDUgcmV0cmllcyB3aXRoIDEgc2Vjb25kIHBhdXNlIGluIGJldHdlZW4gdGhlbS4mI3hkOwogICAqJiN4ZDsKICAgKiBAbWVtYmVyb2YgUFJELnV0aWwmI3hkOwogICAqIEBzaW5jZSAxLjAuMiYjeGQ7CiAgIComI3hkOwogICAqIEBwYXJhbSB7c3RyaW5nfSAgTmFtZWRQYXNzd29yZCAgTmFtZSBvZiB0aGUgR0NWLXJlZiB0byB0aGUgTmFtZWQgUGFzc3dvcmQgdG8gYmUgcmV0cmlldmVkLiYjeGQ7CiAgICogQHBhcmFtIHthbnk9fSAgICBbdHJ5NXRpbWVzXSAgICBJZiBub3QgcHJvdmlkZWQgb3IgbnVsbCBhIHNpbmdsZSByZWFkIGlzIGF0dGVtcHRlZC4mI3hkOwogICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgcHJvdmlkZXMgYW5kIHJlYWQgZmFpbHMgdHJ5IDQgbW9yZSB0aW1lcywgd2l0aCAxIHNlY29uZCBwYXVzZSBiZXR3ZWVuIHRoZW0uJiN4ZDsKICAgKiBAcmV0dXJuIHsoc3RyaW5nfG51bGwpfSBHQ1YuZ2V0VmFsdWVGb3JOYW1lZFBhc3N3b3JkIHJlc3VsdCBvciBudWxsLiYjeGQ7CiAgICovJiN4ZDsKICBmdW5jdGlvbiBnZXROYW1lZFBhc3N3b3JkKCBOYW1lZFBhc3N3b3JkLCB0cnk1dGltZXMgKSB7JiN4ZDsKICAgIHZhciBpLCByZXQgPSBudWxsLCBmbmFtZTsmI3hkOwogICAgZm5hbWUgPSAnZ2V0TmFtZWRQYXNzd29yZCgpOiAnOyYjeGQ7CiAgICBpZiAoIE5hbWVkUGFzc3dvcmQgIT0gbnVsbCAmYW1wOyZhbXA7IE5hbWVkUGFzc3dvcmQgIT09ICcnICkgeyYjeGQ7CiAgICAgIE5hbWVkUGFzc3dvcmQgPSBTdHJpbmcoIE5hbWVkUGFzc3dvcmQgKTsmI3hkOwogICAgICBpZiAoIHRyeTV0aW1lcyAhPSBudWxsICkgeyYjeGQ7CiAgICAgICAgLy8gVGhpcyBhcHByb2FjaCB3aWxsIGhvbGQgdGhlIEphdmEgdGhyZWFkIHVwIHRvIDUgc2Vjb25kcywgcG9zc2libHkgY2F1c2luZyByZXNvdXJjZSBjb250ZW50aW9uJiN4ZDsKICAgICAgICAvLyBvbiB0aGUgd29ya2Zsb3cgZW5naW5lLiBSdWxlIG9mIHRodW1iIHdlIHNob3VsZCBhdm9pZCB1c2luZyBqYXZhLmxhbmcuVGhyZWFkLnNsZWVwKCkgaW5zaWRlIHdvcmtmbG93cyYjeGQ7CiAgICAgICAgLy8gb24gc3lzdGVtcyB3aXRoIG1lZGl1bSB0byBsYXJnZSBsb2FkLiYjeGQ7CiAgICAgICAgdHJ5NXRpbWVzOiB7JiN4ZDsKICAgICAgICAgIGZvciAoIGkgPSAwOyBpICZsdDsgNTsgaSsrICl7JiN4ZDsKICAgICAgICAgICAgdHJ5IHsmI3hkOwogICAgICAgICAgICAgIHJldCA9IEdDVi5nZXRWYWx1ZUZvck5hbWVkUGFzc3dvcmQoIE5hbWVkUGFzc3dvcmQgKTsmI3hkOwogICAgICAgICAgICB9IGNhdGNoICggZSApIHsmI3hkOwogICAgICAgICAgICAgIGxvZ2Vycm9yKCBmbmFtZSArICdGYWlsZWQgdG8gcmV0cmlldmUgdmFsdWUgZm9yIE5hbWVkIFBhc3N3b3JkICInICsgTmFtZWRQYXNzd29yZCArICciLCBFcnJvcjogJyArIGUubWVzc2FnZSApOyYjeGQ7CiAgICAgICAgICAgIH0mI3hkOwogICAgICAgICAgICBpZiAoIHJldCAhPSBudWxsICZhbXA7JmFtcDsgcmV0ICE9PSAnJyApIHsmI3hkOwogICAgICAgICAgICAgIGJyZWFrIHRyeTV0aW1lczsmI3hkOwogICAgICAgICAgICB9JiN4ZDsKICAgICAgICAgICAgLy8gMSBzZWNvbmQgZGVsYXkmI3hkOwogICAgICAgICAgICB0cnkgeyYjeGQ7CiAgICAgICAgICAgICAgbG9nZXJyb3IoIGZuYW1lICsgJ0ZhaWxlZCBhdHRlbXB0ICcgKyAoaSsxKSArICcgdG8gcmV0cmlldmUgTmFtZWQgUGFzc3dvcmQgIicgKyBOYW1lZFBhc3N3b3JkICsgJyIuIFBhdXNpbmcgZm9yIDEgc2Vjb25kIHRoZW4gcmV0cnlpbmcuJyApOyYjeGQ7CiAgICAgICAgICAgICAgamF2YS5sYW5nLlRocmVhZC5zbGVlcCggMTAwMCApOyYjeGQ7CiAgICAgICAgICAgIH0gY2F0Y2ggKCBlICkgeyYjeGQ7CiAgICAgICAgICAgICAgbG9nZXJyb3IoIGZuYW1lICsgJ0FuZCBub3cgZmFpbGVkIHRvIHRyeSBhbmQgcGF1c2UgZm9yIGEgc2Vjb25kIGFzIHdlbGwuIEVycm9yOiAnICsgZS5tZXNzYWdlICk7JiN4ZDsKICAgICAgICAgICAgfSYjeGQ7CiAgICAgICAgICB9JiN4ZDsKICAgICAgICB9JiN4ZDsKICAgICAgfSBlbHNlIHsmI3hkOwogICAgICAgIHRyeSB7JiN4ZDsKICAgICAgICAgIHJldCA9IEdDVi5nZXRWYWx1ZUZvck5hbWVkUGFzc3dvcmQoIE5hbWVkUGFzc3dvcmQgKTsmI3hkOwogICAgICAgIH0gY2F0Y2ggKCBlICkgeyYjeGQ7CiAgICAgICAgICBsb2dlcnJvciggZm5hbWUgKyAnRmFpbGVkIHRvIHJldHJpZXZlIHZhbHVlIGZvciBOYW1lZCBQYXNzd29yZCAiJyArIE5hbWVkUGFzc3dvcmQgKyAnIiwgRXJyb3I6ICcgKyBlLm1lc3NhZ2UgKTsmI3hkOwogICAgICAgIH0mI3hkOwogICAgICB9JiN4ZDsKICAgIH0gZWxzZSB7JiN4ZDsKICAgICAgbG9nZXJyb3IoIGZuYW1lICsgJ05hbWVkUGFzc3dvcmQgbm90IHByb3ZpZGVkLicgKTsmI3hkOwogICAgfSYjeGQ7CiAgICAvLyBGYWlsZWQgdG8gcmV0cmlldmUgdGhlIEdDViYjeGQ7CiAgICBpZiAoISByZXQgKSB7JiN4ZDsKICAgICAgbG9nZXJyb3IoIGZuYW1lICsgJ0dDVi5nZXRWYWx1ZUZvck5hbWVkUGFzc3dvcmQoICInICsgTmFtZWRQYXNzd29yZCArICciICkgcmV0dXJuZWQgbnVsbCB2YWx1ZS4gUGxlYXNlIG1ha2Ugc3VyZSB0aGUgc2FtZSBpcyBhdmFpbGFibGUgb24gdGhlIFVzZXIgQXBwbGljYXRpb24gZHJpdmVyJyApOyYjeGQ7CiAgICAgIHJldHVybiAnJzsmI3hkOwogICAgfSYjeGQ7CiAgICByZXR1cm4gcmV0OyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgLy8gRW5naW5lLW9ubHkgQVBJIGV4dGVuc2lvbnM6JiN4ZDsKICBpZiAoIHdoZXJlID09PSAnZW5naW5lJyApIHsmI3hkOwogICAgUHVibGljQVBJLnV0aWwuSmF2YVZlY3RvclRvRUNNQUFycmF5ID0gSmF2YVZlY3RvclRvRUNNQUFycmF5OyYjeGQ7CiAgICBQdWJsaWNBUEkudXRpbC5FQ01BQXJyYXlUb0phdmFWZWN0b3IgPSBFQ01BQXJyYXlUb0phdmFWZWN0b3I7JiN4ZDsKICAgIFB1YmxpY0FQSS51dGlsLkdDVmdldCA9IEdDVmdldDsmI3hkOwogICAgUHVibGljQVBJLnV0aWwuZ2V0TmFtZWRQYXNzd29yZCA9IGdldE5hbWVkUGFzc3dvcmQ7JiN4ZDsKICAgIFB1YmxpY0FQSS51dGlsLmdldE9iamVjdDJhcnIgPSBnZXRPYmplY3QyYXJyOyYjeGQ7CiAgICBQdWJsaWNBUEkudXRpbC5iYXNpY0hUVFBhdXRoSGVhZGVyID0gYmFzaWNIVFRQYXV0aEhlYWRlcjsmI3hkOwogICAgUHVibGljQVBJLnV0aWwuc2hvdWxkUmV0cnkgPSBzaG91bGRSZXRyeTsmI3hkOwogICAgUHVibGljQVBJLnV0aWwuaXNKYXZhVmVjdG9yID0gaXNKYXZhVmVjdG9yOyYjeGQ7CiAgfSYjeGQ7CiAgLy8gRm9ybS1vbmx5IEFQSSBleHRlbnNpb25zOiYjeGQ7CiAgaWYgKCB3aGVyZSA9PT0gJ2Zvcm0nICkgeyYjeGQ7CiAgICBQdWJsaWNBUEkuaW5pdCA9IGZvcm1Jbml0OyYjeGQ7CiAgICBQdWJsaWNBUEkudXRpbC5pbnRlcnNlY3RBcnJheXMgPSBpbnRlcnNlY3RBcnJheXM7JiN4ZDsKICAgIFB1YmxpY0FQSS53ZWIgPSB7JiN4ZDsKICAgICAgZmllbGRWaXNpYmlsaXR5OmZpZWxkVmlzaWJpbGl0eSYjeGQ7CiAgICB9OyYjeGQ7CiAgfSYjeGQ7CiYjeGQ7CiAgcmV0dXJuIFB1YmxpY0FQSTsmI3hkOwp9KSggJz09PSZndDsgJyk7PC9lY21hLXNjcmlwdD48L2ltcG9ydC1zY3JpcHQ+PGltcG9ydC1zY3JpcHQKICAgICAgICBpbmxpbmU9InRydWUiPjxlY21hLXNjcmlwdD4vKiAwMS1nbG9iYWwtcG9seWZpbGxzIHJldiAyMDE3MTIyOCAqLyYjeGQ7CiYjeGQ7Ci8vIFZpYSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9tYXAmI3hkOwovLyBNb2RpZmllZCB0byByZW1vdmUgZXJyb3IgdGhyb3dzJiN4ZDsKaWYgKCFBcnJheS5wcm90b3R5cGUubWFwKSB7JiN4ZDsKCUFycmF5LnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbihjYWxsYmFjaywgdGhpc0FyZykgeyYjeGQ7CgkJdmFyIFQsIEEsIGs7JiN4ZDsKJiN4ZDsKCQlpZiAodGhpcyA9PT0gbnVsbCkgeyYjeGQ7CgkJCWphdmEubGFuZy5TeXN0ZW0ub3V0LnByaW50bG4oIkFuIGVycm9yIG9jY3VycmVkIHdpdGhpbiB0aGUgQXJyYXkucHJvdG90eXBlLm1hcCgpIHBvbHlmaWxsOiB0aGUgYXJyYXkgPT09IG51bGwuIik7JiN4ZDsKCQkJcmV0dXJuIG51bGw7JiN4ZDsKCQl9JiN4ZDsKJiN4ZDsKCQl2YXIgTyA9IE9iamVjdCh0aGlzKTsmI3hkOwomI3hkOwoJCXZhciBsZW4gPSBPLmxlbmd0aCAmZ3Q7Jmd0OyZndDsgMDsmI3hkOwomI3hkOwoJCWlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHsmI3hkOwoJCQlqYXZhLmxhbmcuU3lzdGVtLm91dC5wcmludGxuKCJBbiBlcnJvciBvY2N1cnJlZCB3aXRoaW4gdGhlIEFycmF5LnByb3RvdHlwZS5tYXAoKSBwb2x5ZmlsbDogdGhlIGNhbGxiYWNrICE9PSBhIGZ1bmN0aW9uLiIpOyYjeGQ7CgkJCXJldHVybiBudWxsOyYjeGQ7CgkJfSYjeGQ7CiYjeGQ7CgkJaWYgKGFyZ3VtZW50cy5sZW5ndGggJmd0OyAxKSB7JiN4ZDsKCQkJVCA9IHRoaXNBcmc7JiN4ZDsKCQl9JiN4ZDsKJiN4ZDsKCQlBID0gbmV3IEFycmF5KGxlbik7JiN4ZDsKJiN4ZDsKCQlrID0gMDsmI3hkOwomI3hkOwoJCXdoaWxlIChrICZsdDsgbGVuKSB7JiN4ZDsKCQkJdmFyIGtWYWx1ZSwgbWFwcGVkVmFsdWU7JiN4ZDsKCQkJaWYgKGsgaW4gTykgeyYjeGQ7CgkJCQlrVmFsdWUgPSBPW2tdOyYjeGQ7CgkJCQltYXBwZWRWYWx1ZSA9IGNhbGxiYWNrLmNhbGwoVCwga1ZhbHVlLCBrLCBPKTsmI3hkOwomI3hkOwoJCQkJQVtrXSA9IG1hcHBlZFZhbHVlOyYjeGQ7CgkJCX0mI3hkOwoJCQlrKys7JiN4ZDsKCQl9JiN4ZDsKJiN4ZDsKCQlyZXR1cm4gQTsmI3hkOwoJfTsmI3hkOwp9JiN4ZDsKJiN4ZDsKLy8gUHJvZHVjdGlvbiBzdGVwcyBvZiBFQ01BLTI2MiwgRWRpdGlvbiA1LCAxNS40LjQuMTQmI3hkOwovLyBSZWZlcmVuY2U6IGh0dHA6Ly9lczUuZ2l0aHViLmlvLyN4MTUuNC40LjE0JiN4ZDsKJiN4ZDsKLy8gVXNlcmFwcCBoYXMgYSBidWdneSBpbXBsZW1lbnRhdGlvbiwgd2Ugd2FudCB0byBpbnRlbnRpb25hbGx5IG92ZXJ3cml0ZSBpdDomI3hkOwovLyBpZiAoIUFycmF5LnByb3RvdHlwZS5pbmRleE9mKSB7JiN4ZDsKQXJyYXkucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbihzZWFyY2hFbGVtZW50LCBmcm9tSW5kZXgpIHsmI3hkOwomI3hkOwoJaWYgKHRoaXMgPT09IG51bGwpIHsmI3hkOwoJCWphdmEubGFuZy5TeXN0ZW0ub3V0LnByaW50bG4oIkFuIGVycm9yIG9jY3VycmVkIHdpdGhpbiB0aGUgQXJyYXkucHJvdG90eXBlLmluZGV4T2YoKSBwb2x5ZmlsbDogdGhlIGFycmF5ID09PSBudWxsLiIpOyYjeGQ7CgkJcmV0dXJuIC0xOyYjeGQ7Cgl9JiN4ZDsKJiN4ZDsKCXZhciBPID0gT2JqZWN0KHRoaXMpOyYjeGQ7CiYjeGQ7Cgl2YXIgbGVuID0gTy5sZW5ndGggJmd0OyZndDsmZ3Q7IDA7JiN4ZDsKJiN4ZDsKCWlmIChsZW4gPT09IDApIHsmI3hkOwoJCWphdmEubGFuZy5TeXN0ZW0ub3V0LnByaW50bG4oIkFuIGVycm9yIG9jY3VycmVkIHdpdGhpbiB0aGUgQXJyYXkucHJvdG90eXBlLmluZGV4T2YoKSBwb2x5ZmlsbDogdGhlIGFycmF5IGxlbmd0aCA9PT0gMC4iKTsmI3hkOwoJCXJldHVybiAtMTsmI3hkOwoJfSYjeGQ7CiYjeGQ7Cgl2YXIgbiA9ICtmcm9tSW5kZXggfHwgMDsmI3hkOwomI3hkOwoJaWYgKE1hdGguYWJzKG4pID09PSBJbmZpbml0eSkgeyYjeGQ7CgkJbiA9IDA7JiN4ZDsKCX0mI3hkOwomI3hkOwoJaWYgKG4gJmd0Oz0gbGVuKSB7JiN4ZDsKCQlqYXZhLmxhbmcuU3lzdGVtLm91dC5wcmludGxuKCJBbiBlcnJvciBvY2N1cnJlZCB3aXRoaW4gdGhlIEFycmF5LnByb3RvdHlwZS5pbmRleE9mKCkgcG9seWZpbGw6IG4gJmd0Oz0gbGVuLiIpOyYjeGQ7CgkJcmV0dXJuIC0xOyYjeGQ7Cgl9JiN4ZDsKJiN4ZDsKCS8vIE1vZGlmaWVkIGJlY2F1c2UgVXNlcmFwcCBjaG9rZXMgb24gJ3doaWxlJzomI3hkOwoJZm9yICh2YXIgaSA9IDA7IGkgJmx0OyBsZW47IGkrKykgeyYjeGQ7CgkJaWYgKE9baV0gPT09IHNlYXJjaEVsZW1lbnQpIHsmI3hkOwoJCQlyZXR1cm4gaTsmI3hkOwoJCX0mI3hkOwoJfSYjeGQ7CglyZXR1cm4gLTE7JiN4ZDsKfTsmI3hkOwovLyB9JiN4ZDsKJiN4ZDsKLy8gVmlhIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2ZpbHRlciYjeGQ7Ci8vIE1vZGlmaWVkIHRvIHJlbW92ZSBlcnJvciB0aHJvd3MmI3hkOwppZiAoIUFycmF5LnByb3RvdHlwZS5maWx0ZXIpIHsmI3hkOwoJQXJyYXkucHJvdG90eXBlLmZpbHRlciA9IGZ1bmN0aW9uKGZ1biAvKiwgdGhpc0FyZyovICkgeyYjeGQ7CgkJJ3VzZSBzdHJpY3QnOyYjeGQ7CiYjeGQ7CgkJaWYgKHRoaXMgPT09IHZvaWQgMCB8fCB0aGlzID09PSBudWxsKSB7JiN4ZDsKCQkJamF2YS5sYW5nLlN5c3RlbS5vdXQucHJpbnRsbigiQW4gZXJyb3Igb2NjdXJyZWQgd2l0aGluIHRoZSBBcnJheS5wcm90b3R5cGUuZmlsdGVyKCkgcG9seWZpbGw6IHRoZSBhcnJheSA9PT0gbnVsbC4iKTsmI3hkOwoJCQlyZXR1cm4gbnVsbDsmI3hkOwoJCX0mI3hkOwomI3hkOwoJCXZhciB0ID0gT2JqZWN0KHRoaXMpOyYjeGQ7CgkJdmFyIGxlbiA9IHQubGVuZ3RoICZndDsmZ3Q7Jmd0OyAwOyYjeGQ7CgkJaWYgKHR5cGVvZiBmdW4gIT09ICdmdW5jdGlvbicpIHsmI3hkOwoJCQlqYXZhLmxhbmcuU3lzdGVtLm91dC5wcmludGxuKCJBbiBlcnJvciBvY2N1cnJlZCB3aXRoaW4gdGhlIEFycmF5LnByb3RvdHlwZS5maWx0ZXIoKSBwb2x5ZmlsbDogdGhlIGNhbGxiYWNrICE9PSBhIGZ1bmN0aW9uLiIpOyYjeGQ7CgkJCXJldHVybiBudWxsOyYjeGQ7CgkJfSYjeGQ7CiYjeGQ7CgkJdmFyIHJlcyA9IFtdOyYjeGQ7CgkJdmFyIHRoaXNBcmcgPSBhcmd1bWVudHMubGVuZ3RoICZndDs9IDIgPyBhcmd1bWVudHNbMV0gOiB2b2lkIDA7JiN4ZDsKCQlmb3IgKHZhciBpID0gMDsgaSAmbHQ7IGxlbjsgaSsrKSB7JiN4ZDsKCQkJaWYgKGkgaW4gdCkgeyYjeGQ7CgkJCQl2YXIgdmFsID0gdFtpXTsmI3hkOwomI3hkOwoJCQkJLy8gTk9URTogVGVjaG5pY2FsbHkgdGhpcyBzaG91bGQgT2JqZWN0LmRlZmluZVByb3BlcnR5IGF0JiN4ZDsKCQkJCS8vICAgICAgIHRoZSBuZXh0IGluZGV4LCBhcyBwdXNoIGNhbiBiZSBhZmZlY3RlZCBieSYjeGQ7CgkJCQkvLyAgICAgICBwcm9wZXJ0aWVzIG9uIE9iamVjdC5wcm90b3R5cGUgYW5kIEFycmF5LnByb3RvdHlwZS4mI3hkOwoJCQkJLy8gICAgICAgQnV0IHRoYXQgbWV0aG9kJ3MgbmV3LCBhbmQgY29sbGlzaW9ucyBzaG91bGQgYmUmI3hkOwoJCQkJLy8gICAgICAgcmFyZSwgc28gdXNlIHRoZSBtb3JlLWNvbXBhdGlibGUgYWx0ZXJuYXRpdmUuJiN4ZDsKCQkJCWlmIChmdW4uY2FsbCh0aGlzQXJnLCB2YWwsIGksIHQpKSB7JiN4ZDsKCQkJCQlyZXMucHVzaCh2YWwpOyYjeGQ7CgkJCQl9JiN4ZDsKCQkJfSYjeGQ7CgkJfSYjeGQ7CiYjeGQ7CgkJcmV0dXJuIHJlczsmI3hkOwoJfTsmI3hkOwp9JiN4ZDsKJiN4ZDsKLy8gUHJvZHVjdGlvbiBzdGVwcyBvZiBFQ01BLTI2MiwgRWRpdGlvbiA1LCAxNS40LjQuMjEmI3hkOwovLyBSZWZlcmVuY2U6IGh0dHA6Ly9lczUuZ2l0aHViLmlvLyN4MTUuNC40LjIxJiN4ZDsKaWYgKCFBcnJheS5wcm90b3R5cGUucmVkdWNlKSB7JiN4ZDsKCUFycmF5LnByb3RvdHlwZS5yZWR1Y2UgPSBmdW5jdGlvbihjYWxsYmFjayAvKiwgaW5pdGlhbFZhbHVlKi8gKSB7JiN4ZDsKCQkndXNlIHN0cmljdCc7JiN4ZDsKCQlpZiAodGhpcyA9PT0gbnVsbCkgeyYjeGQ7CgkJCWphdmEubGFuZy5TeXN0ZW0ub3V0LnByaW50bG4oIkFuIGVycm9yIG9jY3VycmVkIHdpdGhpbiB0aGUgQXJyYXkucHJvdG90eXBlLnJlZHVjZSgpIHBvbHlmaWxsOiB0aGUgYXJyYXkgPT09IG51bGwuIik7JiN4ZDsKCQkJcmV0dXJuIG51bGw7JiN4ZDsKCQl9JiN4ZDsKCQlpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7JiN4ZDsKCQkJamF2YS5sYW5nLlN5c3RlbS5vdXQucHJpbnRsbigiQW4gZXJyb3Igb2NjdXJyZWQgd2l0aGluIHRoZSBBcnJheS5wcm90b3R5cGUucmVkdWNlKCkgcG9seWZpbGw6IHRoZSBjYWxsYmFjayAhPT0gYSBmdW5jdGlvbi4iKTsmI3hkOwoJCQlyZXR1cm4gbnVsbDsmI3hkOwoJCX0mI3hkOwoJCXZhciB0ID0gT2JqZWN0KHRoaXMpLCYjeGQ7CgkJCWxlbiA9IHQubGVuZ3RoICZndDsmZ3Q7Jmd0OyAwLCYjeGQ7CgkJCWsgPSAwLCYjeGQ7CgkJCXZhbHVlOyYjeGQ7CgkJaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgeyYjeGQ7CgkJCXZhbHVlID0gYXJndW1lbnRzWzFdOyYjeGQ7CgkJfSBlbHNlIHsmI3hkOwoJCQl3aGlsZSAoayAmbHQ7IGxlbiAmYW1wOyZhbXA7ICEoayBpbiB0KSkgeyYjeGQ7CgkJCQlrKys7JiN4ZDsKCQkJfSYjeGQ7CgkJCWlmIChrICZndDs9IGxlbikgeyYjeGQ7CgkJCQlqYXZhLmxhbmcuU3lzdGVtLm91dC5wcmludGxuKCJBbiBlcnJvciBvY2N1cnJlZCB3aXRoaW4gdGhlIEFycmF5LnByb3RvdHlwZS5yZWR1Y2UoKSBwb2x5ZmlsbDogUmVkdWNlIG9mIGVtcHR5IGFycmF5IHdpdGggbm8gaW5pdGlhbCB2YWx1ZS4iKTsmI3hkOwoJCQkJcmV0dXJuIG51bGw7JiN4ZDsKCQkJfSYjeGQ7CgkJCXZhbHVlID0gdFtrKytdOyYjeGQ7CgkJfSYjeGQ7CgkJZm9yICg7IGsgJmx0OyBsZW47IGsrKykgeyYjeGQ7CgkJCWlmIChrIGluIHQpIHsmI3hkOwoJCQkJdmFsdWUgPSBjYWxsYmFjayh2YWx1ZSwgdFtrXSwgaywgdCk7JiN4ZDsKCQkJfSYjeGQ7CgkJfSYjeGQ7CgkJcmV0dXJuIHZhbHVlOyYjeGQ7Cgl9OyYjeGQ7Cn0mI3hkOwomI3hkOwovLyBWaWEgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvU3RyaW5nL1RyaW0mI3hkOwppZiAoIVN0cmluZy5wcm90b3R5cGUudHJpbSkgeyYjeGQ7CglTdHJpbmcucHJvdG90eXBlLnRyaW0gPSBmdW5jdGlvbigpIHsmI3hkOwoJCXJldHVybiB0aGlzLnJlcGxhY2UoL15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nLCAnJyk7JiN4ZDsKCX07JiN4ZDsKfSYjeGQ7CiYjeGQ7Ci8vIEFycmF5IGVxdWFsaXR5JiN4ZDsKLy8gVmlhIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNzgzNzQ1Ni9ob3ctdG8tY29tcGFyZS1hcnJheXMtaW4tamF2YXNjcmlwdCYjeGQ7CkFycmF5LnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbihhcnJheSkgeyYjeGQ7CgkvLyBpZiB0aGUgb3RoZXIgYXJyYXkgaXMgYSBmYWxzeSB2YWx1ZSwgcmV0dXJuJiN4ZDsKCWlmICghYXJyYXkpIHsmI3hkOwoJCXJldHVybiBmYWxzZTsmI3hkOwoJfSYjeGQ7CiYjeGQ7CgkvLyBjb21wYXJlIGxlbmd0aHMgLSBjYW4gc2F2ZSBhIGxvdCBvZiB0aW1lJiN4ZDsKCWlmICh0aGlzLmxlbmd0aCAhPSBhcnJheS5sZW5ndGgpIHsmI3hkOwoJCXJldHVybiBmYWxzZTsmI3hkOwoJfSYjeGQ7CiYjeGQ7Cglmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpICZsdDsgbDsgaSsrKSB7JiN4ZDsKCQkvLyBDaGVjayBpZiB3ZSBoYXZlIG5lc3RlZCBhcnJheXMmI3hkOwoJCWlmICh0aGlzW2ldIGluc3RhbmNlb2YgQXJyYXkgJmFtcDsmYW1wOyBhcnJheVtpXSBpbnN0YW5jZW9mIEFycmF5KSB7JiN4ZDsKCQkJLy8gcmVjdXJzZSBpbnRvIHRoZSBuZXN0ZWQgYXJyYXlzJiN4ZDsKCQkJaWYgKCF0aGlzW2ldLmVxdWFscyhhcnJheVtpXSkpIHsmI3hkOwoJCQkJcmV0dXJuIGZhbHNlOyYjeGQ7CgkJCX0mI3hkOwoJCX0gZWxzZSBpZiAodGhpc1tpXSAhPSBhcnJheVtpXSkgeyYjeGQ7CgkJCS8vIFdhcm5pbmcgLSB0d28gZGlmZmVyZW50IG9iamVjdCBpbnN0YW5jZXMgd2lsbCBuZXZlciBiZSBlcXVhbDoge3g6MjB9ICE9IHt4OjIwfSYjeGQ7CgkJCXJldHVybiBmYWxzZTsmI3hkOwoJCX0mI3hkOwoJfSYjeGQ7CglyZXR1cm4gdHJ1ZTsmI3hkOwp9OyYjeGQ7Ci8vIEhpZGUgLmVxdWFscygpIG1ldGhvZCBmcm9tIGZvci1pbiBsb29wcyYjeGQ7CmlmICghIU9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyYjeGQ7CglPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCAiZXF1YWxzIiwgeyYjeGQ7CgkJZW51bWVyYWJsZTogZmFsc2UmI3hkOwoJfSk7JiN4ZDsKfSYjeGQ7CiYjeGQ7Ci8vIFByb2R1Y3Rpb24gc3RlcHMgb2YgRUNNQS0yNjIsIEVkaXRpb24gNSwgMTUuNC40LjE4JiN4ZDsKLy8gUmVmZXJlbmNlOiBodHRwOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjQuNC4xOCYjeGQ7Ci8vIEZyb20gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvZm9yRWFjaCYjeGQ7Ci8vIE1vZGlmaWVkIHRvIHJlbW92ZSBlcnJvciB0aHJvd3MmI3hkOwppZiAoIUFycmF5LnByb3RvdHlwZS5mb3JFYWNoKSB7JiN4ZDsKJiN4ZDsKICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uKGNhbGxiYWNrLyosIHRoaXNBcmcqLykgeyYjeGQ7CiYjeGQ7CiAgICB2YXIgVCwgazsmI3hkOwomI3hkOwogICAgaWYgKHRoaXMgPT0gbnVsbCkgeyYjeGQ7CgkJCWphdmEubGFuZy5TeXN0ZW0ub3V0LnByaW50bG4oIkFuIGVycm9yIG9jY3VycmVkIHdpdGhpbiB0aGUgQXJyYXkucHJvdG90eXBlLmZvckVhY2goKSBwb2x5ZmlsbDogdGhpcyBpcyBudWxsIG9yIG5vdCBkZWZpbmVkLiIpOyYjeGQ7CgkJCXJldHVybiBudWxsOyYjeGQ7CiAgICB9JiN4ZDsKJiN4ZDsKICAgIC8vIDEuIExldCBPIGJlIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0b09iamVjdCgpIHBhc3NpbmcgdGhlJiN4ZDsKICAgIC8vIHx0aGlzfCB2YWx1ZSBhcyB0aGUgYXJndW1lbnQuJiN4ZDsKICAgIHZhciBPID0gT2JqZWN0KHRoaXMpOyYjeGQ7CiYjeGQ7CiAgICAvLyAyLiBMZXQgbGVuVmFsdWUgYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBHZXQoKSBpbnRlcm5hbCYjeGQ7CiAgICAvLyBtZXRob2Qgb2YgTyB3aXRoIHRoZSBhcmd1bWVudCAibGVuZ3RoIi4mI3hkOwogICAgLy8gMy4gTGV0IGxlbiBiZSB0b1VpbnQzMihsZW5WYWx1ZSkuJiN4ZDsKICAgIHZhciBsZW4gPSBPLmxlbmd0aCAmZ3Q7Jmd0OyZndDsgMDsmI3hkOwomI3hkOwogICAgLy8gNC4gSWYgaXNDYWxsYWJsZShjYWxsYmFjaykgaXMgZmFsc2UsIHRocm93IGEgVHlwZUVycm9yIGV4Y2VwdGlvbi4mI3hkOwogICAgLy8gU2VlOiBodHRwOi8vZXM1LmdpdGh1Yi5jb20vI3g5LjExJiN4ZDsKICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHsmI3hkOwoJCQlqYXZhLmxhbmcuU3lzdGVtLm91dC5wcmludGxuKCJBbiBlcnJvciBvY2N1cnJlZCB3aXRoaW4gdGhlIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoKCkgcG9seWZpbGw6ICIgKyBjYWxsYmFjayArICIgaXMgbm90IGEgZnVuY3Rpb24iKTsmI3hkOwoJCQlyZXR1cm4gbnVsbDsmI3hkOwogICAgfSYjeGQ7CiYjeGQ7CiAgICAvLyA1LiBJZiB0aGlzQXJnIHdhcyBzdXBwbGllZCwgbGV0IFQgYmUgdGhpc0FyZzsgZWxzZSBsZXQmI3hkOwogICAgLy8gVCBiZSB1bmRlZmluZWQuJiN4ZDsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoICZndDsgMSkgeyYjeGQ7CiAgICAgIFQgPSBhcmd1bWVudHNbMV07JiN4ZDsKICAgIH0mI3hkOwomI3hkOwogICAgLy8gNi4gTGV0IGsgYmUgMC4mI3hkOwogICAgayA9IDA7JiN4ZDsKJiN4ZDsKICAgIC8vIDcuIFJlcGVhdCB3aGlsZSBrICZsdDsgbGVuLiYjeGQ7CiAgICB3aGlsZSAoayAmbHQ7IGxlbikgeyYjeGQ7CiYjeGQ7CiAgICAgIHZhciBrVmFsdWU7JiN4ZDsKJiN4ZDsKICAgICAgLy8gYS4gTGV0IFBrIGJlIFRvU3RyaW5nKGspLiYjeGQ7CiAgICAgIC8vICAgIFRoaXMgaXMgaW1wbGljaXQgZm9yIExIUyBvcGVyYW5kcyBvZiB0aGUgaW4gb3BlcmF0b3IuJiN4ZDsKICAgICAgLy8gYi4gTGV0IGtQcmVzZW50IGJlIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGUgSGFzUHJvcGVydHkmI3hkOwogICAgICAvLyAgICBpbnRlcm5hbCBtZXRob2Qgb2YgTyB3aXRoIGFyZ3VtZW50IFBrLiYjeGQ7CiAgICAgIC8vICAgIFRoaXMgc3RlcCBjYW4gYmUgY29tYmluZWQgd2l0aCBjLiYjeGQ7CiAgICAgIC8vIGMuIElmIGtQcmVzZW50IGlzIHRydWUsIHRoZW4mI3hkOwogICAgICBpZiAoayBpbiBPKSB7JiN4ZDsKJiN4ZDsKICAgICAgICAvLyBpLiBMZXQga1ZhbHVlIGJlIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGUgR2V0IGludGVybmFsJiN4ZDsKICAgICAgICAvLyBtZXRob2Qgb2YgTyB3aXRoIGFyZ3VtZW50IFBrLiYjeGQ7CiAgICAgICAga1ZhbHVlID0gT1trXTsmI3hkOwomI3hkOwogICAgICAgIC8vIGlpLiBDYWxsIHRoZSBDYWxsIGludGVybmFsIG1ldGhvZCBvZiBjYWxsYmFjayB3aXRoIFQgYXMmI3hkOwogICAgICAgIC8vIHRoZSB0aGlzIHZhbHVlIGFuZCBhcmd1bWVudCBsaXN0IGNvbnRhaW5pbmcga1ZhbHVlLCBrLCBhbmQgTy4mI3hkOwogICAgICAgIGNhbGxiYWNrLmNhbGwoVCwga1ZhbHVlLCBrLCBPKTsmI3hkOwogICAgICB9JiN4ZDsKICAgICAgLy8gZC4gSW5jcmVhc2UgayBieSAxLiYjeGQ7CiAgICAgIGsrKzsmI3hkOwogICAgfSYjeGQ7CiAgICAvLyA4LiByZXR1cm4gdW5kZWZpbmVkLiYjeGQ7CiAgfTsmI3hkOwp9JiN4ZDsKJiN4ZDsKLy8gRnJvbSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3Qva2V5cyYjeGQ7Ci8vIE1vZGlmaWVkIHRvIHJlbW92ZSBlcnJvciB0aHJvd3MmI3hkOwppZiAoIU9iamVjdC5rZXlzKSB7JiN4ZDsKICBPYmplY3Qua2V5cyA9IChmdW5jdGlvbigpIHsmI3hkOwogICAgJ3VzZSBzdHJpY3QnOyYjeGQ7CiAgICB2YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LCYjeGQ7CiAgICAgICAgaGFzRG9udEVudW1CdWcgPSAhKHsgdG9TdHJpbmc6IG51bGwgfSkucHJvcGVydHlJc0VudW1lcmFibGUoJ3RvU3RyaW5nJyksJiN4ZDsKICAgICAgICBkb250RW51bXMgPSBbJiN4ZDsKICAgICAgICAgICd0b1N0cmluZycsJiN4ZDsKICAgICAgICAgICd0b0xvY2FsZVN0cmluZycsJiN4ZDsKICAgICAgICAgICd2YWx1ZU9mJywmI3hkOwogICAgICAgICAgJ2hhc093blByb3BlcnR5JywmI3hkOwogICAgICAgICAgJ2lzUHJvdG90eXBlT2YnLCYjeGQ7CiAgICAgICAgICAncHJvcGVydHlJc0VudW1lcmFibGUnLCYjeGQ7CiAgICAgICAgICAnY29uc3RydWN0b3InJiN4ZDsKICAgICAgICBdLCYjeGQ7CiAgICAgICAgZG9udEVudW1zTGVuZ3RoID0gZG9udEVudW1zLmxlbmd0aDsmI3hkOwomI3hkOwogICAgcmV0dXJuIGZ1bmN0aW9uKG9iaikgeyYjeGQ7CiAgICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnZnVuY3Rpb24nICZhbXA7JmFtcDsgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8IG9iaiA9PT0gbnVsbCkpIHsmI3hkOwoJCQkJamF2YS5sYW5nLlN5c3RlbS5vdXQucHJpbnRsbigiT2JqZWN0LmtleXMgY2FsbGVkIG9uIG5vbi1vYmplY3QiKTsmI3hkOwoJCQkJcmV0dXJuIG51bGw7JiN4ZDsKICAgICAgfSYjeGQ7CiYjeGQ7CiAgICAgIHZhciByZXN1bHQgPSBbXSwgcHJvcCwgaTsmI3hkOwomI3hkOwogICAgICBmb3IgKHByb3AgaW4gb2JqKSB7JiN4ZDsKICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSB7JiN4ZDsKICAgICAgICAgIHJlc3VsdC5wdXNoKHByb3ApOyYjeGQ7CiAgICAgICAgfSYjeGQ7CiAgICAgIH0mI3hkOwomI3hkOwogICAgICBpZiAoaGFzRG9udEVudW1CdWcpIHsmI3hkOwogICAgICAgIGZvciAoaSA9IDA7IGkgJmx0OyBkb250RW51bXNMZW5ndGg7IGkrKykgeyYjeGQ7CiAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGRvbnRFbnVtc1tpXSkpIHsmI3hkOwogICAgICAgICAgICByZXN1bHQucHVzaChkb250RW51bXNbaV0pOyYjeGQ7CiAgICAgICAgICB9JiN4ZDsKICAgICAgICB9JiN4ZDsKICAgICAgfSYjeGQ7CiAgICAgIHJldHVybiByZXN1bHQ7JiN4ZDsKICAgIH07JiN4ZDsKICB9KCkpOyYjeGQ7Cn08L2VjbWEtc2NyaXB0PjwvaW1wb3J0LXNjcmlwdD48Zm9ybQogICAgICAgICAgICAgICAgZm9ybS1pZD0iYXBwcm92YWxfZm9ybSI+PGNvbnRlbnQ+PGZpZWxkIG5hbWU9InRpdGxlIgogICAgICAgICAgICAgICAgICAgIHZpc2libGU9InRydWUiPjxjb250cm9sIGNvbnRyb2wtdHlwZT0iVGl0bGUiCiAgICAgICAgICAgICAgICAgICAgZWRpdGFibGU9ImZhbHNlIi8+PC9maWVsZD48ZmllbGQ+PGNvbnRyb2wKICAgICAgICAgICAgICAgIGNvbnRyb2wtdHlwZT0iTGluZUJyZWFrIi8+PC9maWVsZD48ZmllbGQKICAgICAgICAgICAgICAgIG5hbWU9InN1YmhlYWRpbmciIHZpc2libGU9InRydWUiPjxjb250cm9sCiAgICAgICAgICAgICAgICAgICAgY29udHJvbC10eXBlPSJUaXRsZSIgZWRpdGFibGU9ImZhbHNlIj48cHJvcHM+PHByb3AKICAgICAgICAgICAgICAgICAgICBuYW1lPSJmb250LXNpemUiPjx2YWx1ZT5tZWRpdW08L3ZhbHVlPjwvcHJvcD48L3Byb3BzPjwvY29udHJvbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJ6aC1UVyI+6KuL6YG45Y+W6YGp55W255qE5oyJ6YiV5qC45YeG5oiW5ouS57WV55Sz6KuL44CCPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImRlIj5CaXR0ZSB3w6RobGVuIFNpZSBkaWUgZW50c3ByZWNoZW5kZSBTY2hhbHRmbMOkY2hlIHp1bSBHZW5laG1pZ2VuIG9kZXIgQWJsZWhuZW4gZGVyIEFuZm9yZGVydW5nLjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJlbiI+UGxlYXNlIHNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgYnV0dG9uIHRvIGFwcHJvdmUgb3IgcmVqZWN0IHRoZSByZXF1ZXN0LjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJlcyI+U2VsZWNjaW9uZSBlbCBib3TDs24gYWRlY3VhZG8gcGFyYSBhcHJvYmFyIG8gcmVjaGF6YXIgbGEgcGV0aWNpw7NuLjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJmciI+U8OpbGVjdGlvbm5leiBsZSBib3V0b24gYXBwcm9wcmnDqSBwb3VyIGFwcHJvdXZlciBvdSByZWZ1c2VyIGxhIHJlcXXDqnRlLjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJqYSI+6Kmy5b2T44GZ44KL44Oc44K/44Oz44KS6YG45oqe44GX44Gm6KaB5rGC44KS5om/6KqN44G+44Gf44Gv5Y205LiL44GX44Gm44GP44Gg44GV44GE44CCPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9Iml0Ij5TZWxlemlvbmFyZSBpbCBwdWxzYW50ZSBhcHByb3ByaWF0byBwZXIgYXBwcm92YXJlIG8gcmlmaXV0YXJlIGxhIHJpY2hpZXN0YS48L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0ibmwiPlNlbGVjdGVlciBkZSBiZXRyZWZmZW5kZSBrbm9wIG9tIGRlIGFhbnZyYWFnIGdvZWQgdGUga2V1cmVuIG9mIGFmIHRlIHdpanplbi48L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0icHQiPlNlbGVjaW9uZSBvIGJvdMOjbyBhcHJvcHJpYWRvIHBhcmEgYXByb3ZhciBvdSByZWplaXRhciBhIHNvbGljaXRhw6fDo28uPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InJ1Ij7QndCw0LbQvNC40YLQtSDRgdC+0L7RgtCy0LXRgtGB0YLQstGD0Y7RidGD0Y4g0LrQvdC+0L/QutGDINC00LvRjyDQv9C+0LTRgtCy0LXRgNC20LTQtdC90LjRjyDQuNC70Lgg0L7RgtC60LvQvtC90LXQvdC40Y8g0LfQsNC/0YDQvtGB0LAuPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InN2Ij5Hb2Rrw6RubiBlbGxlciBhdnNsw6UgYmVnw6RyYW4gbWVkIG1vdHN2YXJhbmRlIGtuYXBwLjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJ6aC1DTiI+6K+36YCJ5oup55u45bqU55qE5oyJ6ZKu5Lul5om55YeG5oiW5ouS57ud6K+35rGC44CCPC9kaXNwbGF5LWxhYmVsPjwvZmllbGQ+PGZpZWxkPjxjb250cm9sCiAgICAgICAgICAgICAgICBjb250cm9sLXR5cGU9IkxpbmVCcmVhayIvPjwvZmllbGQ+PGZpZWxkIGRhdGEtdHlwZT0iZG4iCiAgICAgICAgICAgICAgICBuYW1lPSJpbml0aWF0b3IiIHZpc2libGU9InRydWUiPjxjb250cm9sCiAgICAgICAgICAgICAgICAgICAgY29udHJvbC10eXBlPSJETkRpc3BsYXkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0YWJsZT0iZmFsc2UiPjxwcm9wcz48cHJvcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iZGlzcGxheS1leHAiPjx2YWx1ZT5GaXJzdE5hbWUgTGFzdE5hbWU8L3ZhbHVlPjwvcHJvcD48cHJvcAogICAgICAgICAgICAgICAgICAgIG5hbWU9ImRpc3BsYXktZW50aXR5ZGVmIj48dmFsdWU+dXNlcjwvdmFsdWU+PC9wcm9wPjwvcHJvcHM+PC9jb250cm9sPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InpoLVRXIj7nlLPoq4vogIXvvJo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iZGUiPkFuZ2Vmb3JkZXJ0IHZvbjo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iZW4iPlJlcXVlc3RlZCBieTo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iZXMiPlBldGljacOzbiBkZTo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iZnIiPkRlbWFuZMOpIHBhciA6PC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImphIj7opoHmsYLlhYM6PC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9Iml0Ij5SaWNoaWVzdGEgZGE6PC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9Im5sIj5BYW5nZXZyYWFnZCBkb29yOjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJwdCI+U29saWNpdGFkbyBwb3I6PC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InJ1Ij7Ql9Cw0L/RgNCw0YjQuNCy0LDRjtGJ0LjQuTo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0ic3YiPkJlZ8OkcmFuIHNraWNrYWQgYXY6PC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICB4bWw6bGFuZz0iemgtQ04iPuivt+axguS6uu+8mjwvZGlzcGxheS1sYWJlbD48L2ZpZWxkPjxmaWVsZAogICAgICAgICAgICAgICAgZGF0YS10eXBlPSJkbiIgbmFtZT0icmVjaXBpZW50IiB2aXNpYmxlPSJ0cnVlIj48Y29udHJvbAogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wtdHlwZT0iRE5EaXNwbGF5IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdGFibGU9ImZhbHNlIj48cHJvcHM+PHByb3AKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImRpc3BsYXktZXhwIj48dmFsdWU+Rmlyc3ROYW1lIExhc3ROYW1lPC92YWx1ZT48L3Byb3A+PHByb3AKICAgICAgICAgICAgICAgICAgICBuYW1lPSJkaXNwbGF5LWVudGl0eWRlZiI+PHZhbHVlPnVzZXI8L3ZhbHVlPjwvcHJvcD48L3Byb3BzPjwvY29udHJvbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJ6aC1UVyI+5pS25Lu26ICF77yaPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImRlIj5FbXBmw6RuZ2VyOjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJlbiI+UmVjaXBpZW50OjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJlcyI+RGVzdGluYXRhcmlvOjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJmciI+RGVzdGluYXRhaXJlIDo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iamEiPuWPl+S/oeiAhTo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iaXQiPkRlc3RpbmF0YXJpbzo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0ibmwiPk9udHZhbmdlcjo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0icHQiPkRlc3RpbmF0w6FyaW86PC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InJ1Ij7Qn9C+0LvRg9GH0LDRgtC10LvRjDo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0ic3YiPk1vdHRhZ2FyZTo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iemgtQ04iPuaUtuS7tuS6uu+8mjwvZGlzcGxheS1sYWJlbD48L2ZpZWxkPjxmaWVsZD48Y29udHJvbAogICAgICAgICAgICAgICAgY29udHJvbC10eXBlPSJMaW5lQnJlYWsiLz48L2ZpZWxkPjxmaWVsZAogICAgICAgICAgICAgICAgZGF0YS10eXBlPSJkYXRlIiBuYW1lPSJpbml0aWF0ZWRUaW1lIgogICAgICAgICAgICAgICAgICAgIHZpc2libGU9InRydWUiPjxjb250cm9sIGNvbnRyb2wtdHlwZT0iRGF0ZVBpY2tlciIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRhYmxlPSJmYWxzZSI+PHByb3BzPjxwcm9wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iZGF5SGVhZGVycyI+PHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InpoLVRXIj4n5pelJywn5LiAJywn5LqMJywn5LiJJywn5ZubJywn5LqUJywn5YWtJzwvdmFsdWU+PHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImRlIj4nUycsJ00nLCdEJywnTScsJ0QnLCdGJywnUyc8L3ZhbHVlPjx2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJlbiI+J1MnLCdNJywnVCcsJ1cnLCdUJywnRicsJ1MnPC92YWx1ZT48dmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iZXMiPidEJywnTCcsJ00nLCdNJywnSicsJ1YnLCdTJzwvdmFsdWU+PHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImZyIj4nRCcsJ0wnLCdNJywnTScsJ0onLCdWJywnUyc8L3ZhbHVlPjx2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJqYSI+J+aXpScsJ+aciCcsJ+eBqycsJ+awtCcsJ+acqCcsJ+mHkScsJ+Wcnyc8L3ZhbHVlPjx2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJpdCI+J0QnLCdMJywnTScsJ00nLCdHJywnVicsJ1MnPC92YWx1ZT48dmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0ibmwiPid6JywnbScsJ2QnLCd3JywnZCcsJ3YnLCd6JzwvdmFsdWU+PHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InB0Ij4nRCcsJ1MnLCdUJywnUScsJ1EnLCdTJywnUyc8L3ZhbHVlPjx2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJydSI+J9CSJywn0J8nLCfQkicsJ9ChJywn0KcnLCfQnycsJ9ChJzwvdmFsdWU+PHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InN2Ij4nUycsJ00nLCdUJywnTycsJ1QnLCdGJywnTCc8L3ZhbHVlPjx2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InpoLUNOIj4n5pelJywn5LiAJywn5LqMJywn5LiJJywn5ZubJywn5LqUJywn5YWtJzwvdmFsdWU+PC9wcm9wPjxwcm9wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ibW9udGhOYW1lcyI+PHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InpoLVRXIj4nMSDmnIgnLCcyIOaciCcsJzMg5pyIJywnNCDmnIgnLCc1IOaciCcsJzYg5pyIJywnNyDmnIgnLCc4IOaciCcsJzkg5pyIJywnMTAg5pyIJywnMTEg5pyIJywnMTIg5pyIJzwvdmFsdWU+PHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImRlIj4nSmFudWFyJywnRmVicnVhcicsJ03DpHJ6JywnQXByaWwnLCdNYWknLCdKdW5pJywnSnVsaScsJ0F1Z3VzdCcsJ1NlcHRlbWJlcicsJ09rdG9iZXInLCdOb3ZlbWJlcicsJ0RlemVtYmVyJzwvdmFsdWU+PHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImVuIj4nSmFudWFyeScsJ0ZlYnJ1YXJ5JywnTWFyY2gnLCdBcHJpbCcsJ01heScsJ0p1bmUnLCdKdWx5JywnQXVndXN0JywnU2VwdGVtYmVyJywnT2N0b2JlcicsJ05vdmVtYmVyJywnRGVjZW1iZXInPC92YWx1ZT48dmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iZXMiPidFbmVybycsJ0ZlYnJlcm8nLCdNYXJ6bycsJ0FicmlsJywnTWF5bycsJ0p1bmlvJywnSnVsaW8nLCdBZ29zdG8nLCdTZXB0aWVtYnJlJywnT2N0dWJyZScsJ05vdmllbWJyZScsJ0RpY2llbWJyZSc8L3ZhbHVlPjx2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJmciI+J0phbnZpZXInLCdGw6l2cmllcicsJ01hcnMnLCdBdnJpbCcsJ01haScsJ0p1aW4nLCdKdWlsbGV0JywnQW/Du3QnLCdTZXB0ZW1icmUnLCdPY3RvYnJlJywnTm92ZW1icmUnLCdEw6ljZW1icmUnPC92YWx1ZT48dmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iamEiPicx5pyIJywnMuaciCcsJzPmnIgnLCc05pyIJywnNeaciCcsJzbmnIgnLCc35pyIJywnOOaciCcsJznmnIgnLCcxMOaciCcsJzEx5pyIJywnMTLmnIgnPC92YWx1ZT48dmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iaXQiPidnZW5uYWlvJywnZmViYnJhaW8nLCdtYXJ6bycsJ2FwcmlsZScsJ21hZ2dpbycsJ2dpdWdubycsJ2x1Z2xpbycsJ2Fnb3N0bycsJ3NldHRlbWJyZScsJ290dG9icmUnLCdub3ZlbWJyZScsJ2RpY2VtYnJlJzwvdmFsdWU+PHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9Im5sIj4namFudWFyaScsJ2ZlYnJ1YXJpJywnbWFhcnQnLCdhcHJpbCcsJ21laScsJ2p1bmknLCdqdWxpJywnYXVndXN0dXMnLCdzZXB0ZW1iZXInLCdva3RvYmVyJywnbm92ZW1iZXInLCdkZWNlbWJlcic8L3ZhbHVlPjx2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJwdCI+J0phbmVpcm8nLCdGZXZlcmVpcm8nLCdNYXLDp28nLCdBYnJpbCcsJ01haW8nLCdKdW5obycsJ0p1bGhvJywnQWdvc3RvJywnU2V0ZW1icm8nLCdPdXR1YnJvJywnTm92ZW1icm8nLCdEZXplbWJybyc8L3ZhbHVlPjx2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJydSI+J9Cv0L3QstCw0YDRjCcsJ9Ck0LXQstGA0LDQu9GMJywn0JzQsNGA0YInLCfQkNC/0YDQtdC70YwnLCfQnNCw0LknLCfQmNGO0L3RjCcsJ9CY0Y7Qu9GMJywn0JDQstCz0YPRgdGCJyzQodC10L3RgtGP0LHRgNGMJywn0J7QutGC0Y/QsdGA0YwnLCfQndC+0Y/QsdGA0YwnLCfQlNC10LrQsNCx0YDRjCc8L3ZhbHVlPjx2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJzdiI+J0phbnVhcmknLCdGZWJydWFyaScsJ01hcnMnLCdBcHJpbCcsJ01haicsJ0p1bmknLCdKdWxpJywnQXVndXN0aScsJ1NlcHRlbWJlcicsJ09rdG9iZXInLCdOb3ZlbWJlcicsJ0RlY2VtYmVyJzwvdmFsdWU+PHZhbHVlCiAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InpoLUNOIj4n5LiA5pyIJywn5LqM5pyIJywn5LiJ5pyIJywn5Zub5pyIJywn5LqU5pyIJywn5YWt5pyIJywn5LiD5pyIJywn5YWr5pyIJywn5Lmd5pyIJywn5Y2B5pyIJywn5Y2B5LiA5pyIJywn5Y2B5LqM5pyIJzwvdmFsdWU+PC9wcm9wPjwvcHJvcHM+PC9jb250cm9sPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InpoLVRXIj7nlLPoq4vml6XvvJo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iZGUiPkFuZm9yZGVydW5nc2RhdHVtPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImVuIj5SZXF1ZXN0IERhdGU6PC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImVzIj5GZWNoYSBkZSBsYSBwZXRpY2nDs246PC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImZyIj5EYXRlIGRlIGxhIHJlcXXDqnRlIDo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iamEiPuimgeaxguaXpTo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iaXQiPkRhdGEgZGVsbGEgcmljaGllc3RhOjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJubCI+RGF0dW0gdmFuIGFhbnZyYWFnOjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJwdCI+RGF0YSBkZSBTb2xpY2l0YcOnw6NvOjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJydSI+0JTQsNGC0LAg0LfQsNC/0YDQvtGB0LA6PC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InN2Ij5CZWfDpHJhbiBza2lja2FkIGRlbjo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iemgtQ04iPuivt+axguaXpeacn++8mjwvZGlzcGxheS1sYWJlbD48L2ZpZWxkPjxmaWVsZD48Y29udHJvbAogICAgICAgICAgICAgICAgY29udHJvbC10eXBlPSJMaW5lQnJlYWsiLz48L2ZpZWxkPjxmaWVsZAogICAgICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9InJlYXNvbiIgdmlzaWJsZT0idHJ1ZSI+PGNvbnRyb2wKICAgICAgICAgICAgICAgICAgICBjb250cm9sLXR5cGU9IlRleHQiIGVkaXRhYmxlPSJmYWxzZSIvPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InpoLVRXIj7ljp/lm6DvvJo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iZGUiPlVyc2FjaGU6PC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImVuIj5SZWFzb246PC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImVzIj5SYXrDs246PC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImZyIj5SYWlzb24gOjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJqYSI+55CG55SxOjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJpdCI+TW90aXZvOjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJubCI+UmVkZW46PC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InB0Ij5SYXrDo286PC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InJ1Ij7Qn9GA0LjRh9C40L3QsDo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0ic3YiPk9yc2FrOjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJ6aC1DTiI+5Y6f5Zug77yaPC9kaXNwbGF5LWxhYmVsPjwvZmllbGQ+PGZpZWxkPjxjb250cm9sCiAgICAgICAgICAgICAgICBjb250cm9sLXR5cGU9IkxpbmVCcmVhayIvPjwvZmllbGQ+PGZpZWxkCiAgICAgICAgICAgICAgICBkYXRhLXR5cGU9InN0cmluZyIgbmFtZT0iYXB3YUNvbW1lbnQiCiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZT0idHJ1ZSI+PGNvbnRyb2wgY29udHJvbC10eXBlPSJUZXh0QXJlYSIKICAgICAgICAgICAgICAgICAgICBlZGl0YWJsZT0idHJ1ZSIgcmVxdWlyZWQ9ImZhbHNlIi8+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iemgtVFciPuWCmeiou++8mjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJkZSI+S29tbWVudGFyOjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJlbiI+Q29tbWVudDo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iZXMiPkNvbWVudGFyaW86PC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImZyIj5Db21tZW50YWlyZSA6PC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImphIj7jgrPjg6Hjg7Pjg4g6PC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9Iml0Ij5Db21tZW50bzo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0ibmwiPk9wbWVya2luZzo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0icHQiPkNvbWVudMOhcmlvOjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJydSI+0JrQvtC80LzQtdC90YLQsNGA0LjQuTo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0ic3YiPktvbW1lbnRhcjo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iemgtQ04iPuazqOmHiu+8mjwvZGlzcGxheS1sYWJlbD48L2ZpZWxkPjxmaWVsZD48Y29udHJvbAogICAgICAgICAgICAgICAgY29udHJvbC10eXBlPSJMaW5lQnJlYWsiLz48L2ZpZWxkPjxhY3Rpb25zCiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb249ImJvdHRvbSI+PGFjdGlvbiBibG9jay1vbi1lcnJvcj0iZmFsc2UiCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IkNvbW1lbnRBY3Rpb24iPjxjb250cm9sCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wtdHlwZT0iQnV0dG9uIi8+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InpoLVRXIj7mqqLoppblgpnoqLvmrbfnqIs8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImRlIj5Lb21tZW50YXJ2ZXJsYXVmIGFuemVpZ2VuPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJlbiI+VmlldyBDb21tZW50IEhpc3Rvcnk8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImVzIj5WZXIgaGlzdG9yaWFsIGRlIGNvbWVudGFyaW9zPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJmciI+QWZmaWNoZXIgbCdoaXN0b3JpcXVlIGRlcyBjb21tZW50YWlyZXM8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImphIj7jgrPjg6Hjg7Pjg4jlsaXmrbTjga7ooajnpLo8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9Iml0Ij5WaXN1YWxpenphIGNyb25vbG9naWEgY29tbWVudGk8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9Im5sIj5PcG1lcmtpbmdzaGlzdG9yaWUgd2VlcmdldmVuPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJwdCI+VmVyIEhpc3TDs3JpY28gZGUgQ29tZW50w6FyaW9zPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJydSI+0J/RgNC+0YHQvNC+0YLRgCDQv9GA0L7RgtC+0LrQvtC70LAg0LrQvtC80LzQtdC90YLQsNGA0LjQtdCyPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJzdiI+VmlzYSBrb21tZW50YXJzaGlzdG9yaWs8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InpoLUNOIj7mn6XnnIvms6jph4rljoblj7I8L2Rpc3BsYXktbGFiZWw+PC9hY3Rpb24+PGZpZWxkPjxjb250cm9sCiAgICAgICAgICAgICAgICAgICAgY29udHJvbC10eXBlPSJMaW5lQnJlYWsiLz48L2ZpZWxkPjxhY3Rpb24KICAgICAgICAgICAgICAgICAgICBoaWRlLWlmLXJlYWRvbmx5PSJ0cnVlIiBuYW1lPSJEZW55QWN0aW9uIj48Y29udHJvbAogICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLXR5cGU9IkJ1dHRvbiIvPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJ6aC1UVyI+5ouS57WVPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJkZSI+VmVyd2VpZ2VybjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iZW4iPkRlbnk8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImVzIj5EZW5lZ2FyPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJmciI+UmVmdXNlcjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iamEiPuWNtOS4izwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iaXQiPlJpZml1dGE8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9Im5sIj5BZndpanplbjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0icHQiPk5lZ2FyPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJydSI+0JfQsNC/0YDQtdGC0LjRgtGMPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJzdiI+QXZzbMOlPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InpoLUNOIj7mi5Lnu508L2Rpc3BsYXktbGFiZWw+PC9hY3Rpb24+PGFjdGlvbgogICAgICAgICAgICAgICAgICAgIGhpZGUtaWYtcmVhZG9ubHk9InRydWUiCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IkFwcHJvdmFsQWN0aW9uIj48Y29udHJvbAogICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLXR5cGU9IkJ1dHRvbiIvPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJ6aC1UVyI+5qC45YeGPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJkZSI+R2VuZWhtaWdlbjwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iZW4iPkFwcHJvdmU8L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImVzIj5BcHJvYmFyPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJmciI+QXBwcm91dmVyPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJqYSI+5om/6KqNPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJpdCI+QXBwcm92YTwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0ibmwiPkdvZWRrZXVyZW48L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InB0Ij5BcHJvdmFyPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJydSI+0J/QvtC00YLQstC10YDQtNC40YLRjDwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0ic3YiPkdvZGvDpG5uPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InpoLUNOIj7mibnlh4Y8L2Rpc3BsYXktbGFiZWw+PC9hY3Rpb24+PGFjdGlvbgogICAgICAgICAgICAgICAgICAgIGhpZGUtaWYtcmVhZG9ubHk9InRydWUiIG5hbWU9IkNsYWltQWN0aW9uIj48Y29udHJvbAogICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLXR5cGU9IkJ1dHRvbiIvPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJ6aC1UVyI+Q2xhaW08L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImRlIj5DbGFpbTwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iZW4iPkNsYWltPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJlcyI+Q2xhaW08L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9ImZyIj5DbGFpbTwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0iamEiPkNsYWltPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJpdCI+Q2xhaW08L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9Im5sIj5DbGFpbTwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB4bWw6bGFuZz0icHQiPkNsYWltPC9kaXNwbGF5LWxhYmVsPjxkaXNwbGF5LWxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIHhtbDpsYW5nPSJydSI+Q2xhaW08L2Rpc3BsYXktbGFiZWw+PGRpc3BsYXktbGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgeG1sOmxhbmc9InN2Ij5DbGFpbTwvZGlzcGxheS1sYWJlbD48ZGlzcGxheS1sYWJlbAogICAgICAgIHhtbDpsYW5nPSJ6aC1DTiI+Q2xhaW08L2Rpc3BsYXktbGFiZWw+PC9hY3Rpb24+PC9hY3Rpb25zPjwvY29udGVudD48L2Zvcm0+PGRhdGEtaXRlbXMKICAgICAgICAgICAgYWN0aXZpdHktaWQ9Im1hcFRlc3RzMSI+PGRhdGEtaXRlbSBkYXRhLXR5cGU9InN0cmluZyIKICAgICAgICAgICAgbmFtZT0iTUFQMCIKICAgICAgICAgICAgc291cmNlPSJQUkQudXRpbC5sb2dlcnJvciggJz09PT09PT09PT09PScgKTsgUFJELnV0aWwuZm9ybU9yRW5naW5lKCk7IgogICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvRm9ybU9yRW5naW5lIgogICAgICAgICAgICB0YXJnZXQtdHlwZT0ibXVsdGktdmFsdWUtbGlzdCIvPjxkYXRhLWl0ZW0KICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDEiCiAgICAgICAgICAgIHNvdXJjZT0iUFJELnV0aWwuRUNNQUFycmF5VG9KYXZhVmVjdG9yKCBbJzEnLCcyJywnMyddICk7IgogICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvbWFueS92YWx1ZSIKICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgIGRhdGEtdHlwZT0ic3RyaW5nIiBuYW1lPSJNQVAyIgogICAgICAgICAgICBzb3VyY2U9IlBSRC5JRFZnZXQoICdjbj1hZG1pbixvdT1zYSxvPXN5c3RlbScsICd1c2VyJywgJ2NuJyApIgogICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvSURWZ2V0L3Rlc3QwIgogICAgICAgICAgICB0YXJnZXQtdHlwZT0ibXVsdGktdmFsdWUtbGlzdCIvPjxkYXRhLWl0ZW0KICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDMiCiAgICAgICAgICAgIHNvdXJjZT0iUFJELklEVmdldCggJ2NuPWFkbWluLG91PXNhLG89c3lzdGVtJywgJ3VzZXInLCAnVGl0bGUnICkiCiAgICAgICAgICAgIHRhcmdldD0iZmxvd2RhdGEudGVzdC9JRFZnZXQvdGVzdDEiCiAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICBkYXRhLXR5cGU9InN0cmluZyIgbmFtZT0iTUFQNCIKICAgICAgICAgICAgc291cmNlPSJQUkQuSURWZ2V0KCAnY249YWRtaW4sb3U9c2Esbz1zeXN0ZW0nLCAndXNlcicsICdDTicgKSIKICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L0lEVmdldC90ZXN0MiIKICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgIGRhdGEtdHlwZT0ic3RyaW5nIiBuYW1lPSJNQVA1IgogICAgICAgICAgICBzb3VyY2U9IlBSRC5JRFZnZXQoICdjbj1hZG1pbixvdT1zYSxvPXN5c3RlbScsICd1c2VyJywgJ0FDTCcgKS5qb2luKCc7Jyk7IgogICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvSURWZ2V0L3Rlc3QzIgogICAgICAgICAgICB0YXJnZXQtdHlwZT0ibXVsdGktdmFsdWUtbGlzdCIvPjxkYXRhLWl0ZW0KICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDYiCiAgICAgICAgICAgIHNvdXJjZT0iSURWYXVsdC5nZXQoICdjbj1hZG1pbixvdT1zYSxvPXN5c3RlbScsICd1c2VyJywgJ0FDTCcgKSIKICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L0lEVmdldC90ZXN0NCIKICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgIGRhdGEtdHlwZT0ic3RyaW5nIiBuYW1lPSJNQVA3IgogICAgICAgICAgICBzb3VyY2U9ImZ1bmN0aW9uIGxpc3QoKSB7dmFyIGw9bmV3IGphdmEudXRpbC5WZWN0b3IoKTtsLmFkZCgnQmx1ZScpO2wuYWRkKCdSZWQnKTsgbC5hZGQoJ0dyZWVuJyk7IHJldHVybiBsO30mI3hkOyYjeGE7UFJELnV0aWwuSmF2YVZlY3RvclRvRUNNQUFycmF5KCBsaXN0KCkgKS5qb2luKCc7Jyk7IgogICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvVmVjdG9ydG9BcnJheSIKICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgIGRhdGEtdHlwZT0ic3RyaW5nIiBuYW1lPSJNQVA4IgogICAgICAgICAgICBzb3VyY2U9IlBSRC51dGlsLkdDVmdldCggJ3ByZHRlc3QubGFiLjAwMScgKTsiCiAgICAgICAgICAgIHRhcmdldD0iZmxvd2RhdGEudGVzdC9HQ1YvZ2V0MSIKICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgIGRhdGEtdHlwZT0ic3RyaW5nIiBuYW1lPSJNQVA5IgogICAgICAgICAgICBzb3VyY2U9IlBSRC51dGlsLkdDVmdldCggJ2ludmFsaWRuYW1lJyApOyIKICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L0dDVi9nZXQyIgogICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PC9kYXRhLWl0ZW1zPjxkYXRhLWl0ZW1zCiAgICAgICAgICAgIGFjdGl2aXR5LWlkPSJtYXBUZXN0czIiPjxkYXRhLWl0ZW0gZGF0YS10eXBlPSJzdHJpbmciCiAgICAgICAgICAgIG5hbWU9Ik1BUDAiCiAgICAgICAgICAgIHNvdXJjZT0iUFJELnV0aWwubG9nZXJyb3IoICc9PT09PT09PT09PT0nICk7IFBSRC51dGlsLmxvZ2Vycm9yKCAnSURWZ1EgdGVzdDE6ICcgKTtQUkQuSURWZ2xvYmFsUXVlcnkoICdDb250YWluZXJzVW5kZXJEYXRhJyApIgogICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvSURWZ2xvYmFsUXVlcnkvdGVzdDAiCiAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICBkYXRhLXR5cGU9InN0cmluZyIgbmFtZT0iTUFQMSIKICAgICAgICAgICAgc291cmNlPSJQUkQudXRpbC5sb2dlcnJvciggJ0lEVmdRIHRlc3QyOiAnICk7UFJELklEVmdsb2JhbFF1ZXJ5KCAnQ29udGFpbmVyc1VuZGVyRGF0YScsIHt9ICkiCiAgICAgICAgICAgIHRhcmdldD0iZmxvd2RhdGEudGVzdC9JRFZnbG9iYWxRdWVyeS90ZXN0MSIKICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgIGRhdGEtdHlwZT0ic3RyaW5nIiBuYW1lPSJNQVAyIgogICAgICAgICAgICBzb3VyY2U9IlBSRC51dGlsLmxvZ2Vycm9yKCAnSURWZ1EgdGVzdDM6ICcgKTsgU2NyaXB0VmF1bHQuSlNPTi5zdHJpbmdpZnkoIFBSRC5JRFZnbG9iYWxRdWVyeSggJ0NvbnRhaW5lcnNVbmRlckRhdGEnLCB7ICZxdW90O291JnF1b3Q7OiZxdW90O3NhJnF1b3Q7fSApICkiCiAgICAgICAgICAgIHRhcmdldD0iZmxvd2RhdGEudGVzdC9JRFZnbG9iYWxRdWVyeS90ZXN0MiIKICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgIGRhdGEtdHlwZT0ic3RyaW5nIiBuYW1lPSJNQVAzIgogICAgICAgICAgICBzb3VyY2U9IlBSRC51dGlsLmxvZ2Vycm9yKCAnSURWZ1EgdGVzdDQ6ICcgKTtQUkQuSURWZ2xvYmFsUXVlcnkoICdDb250YWluZXJzVW5kZXJEYXRhJywgeyB3cm9uZ3BhcmFtOiZxdW90O0VuZ2luZWVyJnF1b3Q7fSApIgogICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvSURWZ2xvYmFsUXVlcnkvdGVzdDMiCiAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICBkYXRhLXR5cGU9InN0cmluZyIgbmFtZT0iTUFQNCIKICAgICAgICAgICAgc291cmNlPSJQUkQudXRpbC5sb2dlcnJvciggJ0lEVmdRIHRlc3Q1OiAnICk7UFJELklEVmdsb2JhbFF1ZXJ5KCAnaW5jb3JyZWN0REFMcXVlcnlrZXknLCB7IHdyb25ncGFyYW06JnF1b3Q7RW5naW5lZXImcXVvdDt9ICkiCiAgICAgICAgICAgIHRhcmdldD0iZmxvd2RhdGEudGVzdC9JRFZnbG9iYWxRdWVyeS90ZXN0NCIKICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgIGRhdGEtdHlwZT0ic3RyaW5nIiBuYW1lPSJNQVA1IgogICAgICAgICAgICBzb3VyY2U9IlBSRC51dGlsLmxvZ2Vycm9yKCAnSURWZ1EgdGVzdDY6ICcgKTsgU2NyaXB0VmF1bHQuSlNPTi5zdHJpbmdpZnkoIFBSRC5JRFZnbG9iYWxRdWVyeSggJ0NvbnRhaW5lcnNVbmRlckRhdGEnLCB7IG91OiZxdW90OyomcXVvdDsgfSApICk7IgogICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvSURWZ2xvYmFsUXVlcnkvdGVzdDUiCiAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICBkYXRhLXR5cGU9InN0cmluZyIgbmFtZT0iTUFQNiIKICAgICAgICAgICAgc291cmNlPSJJRFZhdWx0Lmdsb2JhbFF1ZXJ5KCAnQ29udGFpbmVyc1VuZGVyRGF0YScsIHsgb3U6JnF1b3Q7KiZxdW90OyB9ICkiCiAgICAgICAgICAgIHRhcmdldD0iZmxvd2RhdGEudGVzdC9JRFZnbG9iYWxRdWVyeS90ZXN0NiIKICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgIGRhdGEtdHlwZT0ic3RyaW5nIiBuYW1lPSJNQVA3IgogICAgICAgICAgICBzb3VyY2U9IlBSRC5zZXRsb2dwcmVmaXgoICc9LT0tPS0+PiAnICk7IFBSRC51dGlsLmdldE5hbWVkUGFzc3dvcmQoICdwcmR0ZXN0LmxhYi5wYXNzd29yZC4wMDEnICk7IgogICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvTmFtZWRQd2QvZ2V0MSIKICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgIGRhdGEtdHlwZT0ic3RyaW5nIiBuYW1lPSJNQVA4IgogICAgICAgICAgICBzb3VyY2U9IlBSRC51dGlsLmdldE5hbWVkUGFzc3dvcmQoICdpbnZhbGlkbmFtZScgKTsiCiAgICAgICAgICAgIHRhcmdldD0iZmxvd2RhdGEudGVzdC9OYW1lZFB3ZC9nZXQyIgogICAgICAgICAgICB0YXJnZXQtdHlwZT0ibXVsdGktdmFsdWUtbGlzdCIvPjxkYXRhLWl0ZW0KICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDkiCiAgICAgICAgICAgIHNvdXJjZT0iUFJELnV0aWwuZ2V0TmFtZWRQYXNzd29yZCggJ3ByZHRlc3QubGFiLnBhc3N3b3JkLjAwMScsIHRydWUgKTsiCiAgICAgICAgICAgIHRhcmdldD0iZmxvd2RhdGEudGVzdC9OYW1lZFB3ZC9nZXQzIgogICAgICAgICAgICB0YXJnZXQtdHlwZT0ibXVsdGktdmFsdWUtbGlzdCIvPjxkYXRhLWl0ZW0KICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDEwIgogICAgICAgICAgICBzb3VyY2U9IlBSRC51dGlsLmdldE5hbWVkUGFzc3dvcmQoICdpbnZhbGlkbmFtZScsIHRydWUgKTsiCiAgICAgICAgICAgIHRhcmdldD0iZmxvd2RhdGEudGVzdC9OYW1lZFB3ZC9nZXQ0IgogICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PC9kYXRhLWl0ZW1zPjxkYXRhLWl0ZW1zCiAgICAgICAgICAgIGFjdGl2aXR5LWlkPSJtYXBUZXN0czMiPjxkYXRhLWl0ZW0gZGF0YS10eXBlPSJzdHJpbmciCiAgICAgICAgICAgIG5hbWU9Ik1BUDAiCiAgICAgICAgICAgIHNvdXJjZT0iUFJELnV0aWwubG9nZXJyb3IoICc9PT09PT09PT09PT0nICk7IFBSRC51dGlsLkpTT05vYmoucGFyc2UoICd7JnF1b3Q7dmFsaWQmcXVvdDs6JnF1b3Q7Zm9ybWF0JnF1b3Q7fScgKTsiCiAgICAgICAgICAgIHRhcmdldD0iZmxvd2RhdGEudGVzdC9KU09OL3BhcnNlMDEiCiAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICBkYXRhLXR5cGU9InN0cmluZyIgbmFtZT0iTUFQMSIKICAgICAgICAgICAgc291cmNlPSJQUkQudXRpbC5KU09Ob2JqLnBhcnNlKCAneyZxdW90O2ZvbyZxdW90OzogMScgKTsiCiAgICAgICAgICAgIHRhcmdldD0iZmxvd2RhdGEudGVzdC9KU09OL3BhcnNlMDIiCiAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICBkYXRhLXR5cGU9InN0cmluZyIgbmFtZT0iTUFQMiIKICAgICAgICAgICAgc291cmNlPSJ2YXIgdHN0PXsmcXVvdDthJnF1b3Q7OiZxdW90O2ImcXVvdDt9O1BSRC51dGlsLkpTT05vYmouc3RyaW5naWZ5KCB0c3QgKTsiCiAgICAgICAgICAgIHRhcmdldD0iZmxvd2RhdGEudGVzdC9KU09OL3N0cmluZ2lmeTAxIgogICAgICAgICAgICB0YXJnZXQtdHlwZT0ibXVsdGktdmFsdWUtbGlzdCIvPjxkYXRhLWl0ZW0KICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDMiCiAgICAgICAgICAgIHNvdXJjZT0iUFJELnV0aWwuSlNPTm9iai5zdHJpbmdpZnkoIG5ldyBqYXZhLnV0aWwuVmVjdG9yKCkgKTsiCiAgICAgICAgICAgIHRhcmdldD0iZmxvd2RhdGEudGVzdC9KU09OL3N0cmluZ2lmeTAyIgogICAgICAgICAgICB0YXJnZXQtdHlwZT0ibXVsdGktdmFsdWUtbGlzdCIvPjxkYXRhLWl0ZW0KICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDQiCiAgICAgICAgICAgIHNvdXJjZT0iUFJELnV0aWwuSlNPTm9iai5zdHJpbmdpZnkoIFBSRC51dGlsLnVuaXF1ZSggWyA3LCAxLDQsNywgJ3Rlc3QnLDQgLCdtYW55JywgOTE3LDEgLCA5MTcsICdtYW55JywgWyAnYXJnaCcgXSBdICkgKTsiCiAgICAgICAgICAgIHRhcmdldD0iZmxvd2RhdGEudGVzdC9VbmlxdWUvQXJyYXkvYTAxL2l0ZW1zIgogICAgICAgICAgICB0YXJnZXQtdHlwZT0ibXVsdGktdmFsdWUtbGlzdCIvPjxkYXRhLWl0ZW0KICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDUiCiAgICAgICAgICAgIHNvdXJjZT0iUFJELnV0aWwuSlNPTm9iai5zdHJpbmdpZnkoIFBSRC51dGlsLnVuaXF1ZSggWyAncmVkJywgJ0dyZWVuJywgJ2JsdWUnLCAnZ3JlZW4nLCAnYmx1ZScsICdHcmVlbicsICdiTHVlJywgJ2dyZWVuJywgJ3JlZCcgXSApICk7IgogICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvVW5pcXVlL0FycmF5L2EwMi9pdGVtcyIKICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgIGRhdGEtdHlwZT0ic3RyaW5nIiBuYW1lPSJNQVA2IgogICAgICAgICAgICBzb3VyY2U9IlBSRC51dGlsLkpTT05vYmouc3RyaW5naWZ5KCBQUkQudXRpbC51bmlxdWUoIFsgNywgMSw0LDcsICd0ZXN0Jyw0ICwnbWFueScsIDkxNywxICwgOTE3LCAnbWFueScsIFsgJ2FyZ2gnIF0gXSwgdHJ1ZSApICk7IgogICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvVW5pcXVlL0FycmF5L2EwMy9pdGVtcyIKICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgIGRhdGEtdHlwZT0ic3RyaW5nIiBuYW1lPSJNQVA3IgogICAgICAgICAgICBzb3VyY2U9IlBSRC51dGlsLkpTT05vYmouc3RyaW5naWZ5KCBQUkQudXRpbC51bmlxdWUoIFsgJ3JlZCcsICdHcmVlbicsICdibHVlJywgJ2dyZWVuJywgJ2JsdWUnLCAnR3JlZW4nLCAnYkx1ZScsICdncmVlbicsICdyZWQnIF0sIHRydWUgKSApOyIKICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L1VuaXF1ZS9BcnJheS9hMDQvaXRlbXMiCiAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICBkYXRhLXR5cGU9InN0cmluZyIgbmFtZT0iTUFQOCIKICAgICAgICAgICAgc291cmNlPSJmdW5jdGlvbiBsaXN0KCkge3ZhciBsPW5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7bC5hZGQoJ0JsdWUnKTtsLmFkZCgnUmVkJyk7IGwuYWRkKCdHcmVlbicpO2wuYWRkKCdCbHVlJyk7bC5hZGQoJ1JlZCcpOyBsLmFkZCgnR3JlZW4nKTtsLmFkZCgnYmx1ZScpO2wuYWRkKCdyZWQnKTsgbC5hZGQoJ2dyZWVuJyk7bC5hZGQoJ0JMVUUnKTtsLmFkZCgnUkVEJyk7IGwuYWRkKCdHUkVFTicpOyByZXR1cm4gbDt9JiN4ZDsmI3hhO1BSRC51dGlsLnVuaXF1ZSggbGlzdCgpICk7IgogICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvVW5pcXVlL1ZlY3Rvci92MDEvaXRlbXMiCiAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICBkYXRhLXR5cGU9InN0cmluZyIgbmFtZT0iTUFQOSIKICAgICAgICAgICAgc291cmNlPSJmdW5jdGlvbiBsaXN0KCkge3ZhciBsPW5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7bC5hZGQoOTkpO2wuYWRkKDIzNDUyKTtsLmFkZCgxKTtsLmFkZCg5OSk7bC5hZGQoJ1JlZCcpOyBsLmFkZCgyKTtsLmFkZCgyKTtsLmFkZCgncmVkJyk7IGwuYWRkKCdHcmVlbicpO2wuYWRkKCdSRUQnKTsgcmV0dXJuIGw7fSYjeGQ7JiN4YTtQUkQudXRpbC51bmlxdWUoIGxpc3QoKSApOyIKICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L1VuaXF1ZS9WZWN0b3IvdjAyL2l0ZW1zIgogICAgICAgICAgICB0YXJnZXQtdHlwZT0ibXVsdGktdmFsdWUtbGlzdCIvPjxkYXRhLWl0ZW0KICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDEwIgogICAgICAgICAgICBzb3VyY2U9ImZ1bmN0aW9uIGxpc3QoKSB7dmFyIGw9bmV3IGphdmEudXRpbC5WZWN0b3IoKTtsLmFkZCgnQmx1ZScpO2wuYWRkKCdSZWQnKTsgbC5hZGQoJ0dyZWVuJyk7bC5hZGQoJ0JsdWUnKTtsLmFkZCgnUmVkJyk7IGwuYWRkKCdHcmVlbicpO2wuYWRkKCdibHVlJyk7bC5hZGQoJ3JlZCcpOyBsLmFkZCgnZ3JlZW4nKTtsLmFkZCgnQkxVRScpO2wuYWRkKCdSRUQnKTsgbC5hZGQoJ0dSRUVOJyk7IHJldHVybiBsO30mI3hkOyYjeGE7UFJELnV0aWwudW5pcXVlKCBsaXN0KCksIHRydWUgKTsiCiAgICAgICAgICAgIHRhcmdldD0iZmxvd2RhdGEudGVzdC9VbmlxdWUvVmVjdG9yL3YwMy9pdGVtcyIKICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgIGRhdGEtdHlwZT0ic3RyaW5nIiBuYW1lPSJNQVAxMSIKICAgICAgICAgICAgc291cmNlPSJmdW5jdGlvbiBsaXN0KCkge3ZhciBsPW5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7bC5hZGQoOTkpO2wuYWRkKDIzNDUyKTtsLmFkZCgxKTtsLmFkZCg5OSk7bC5hZGQoJ1JlZCcpOyBsLmFkZCgyKTtsLmFkZCgyKTtsLmFkZCgncmVkJyk7IGwuYWRkKCdHcmVlbicpO2wuYWRkKCdSRUQnKTsgcmV0dXJuIGw7fSYjeGQ7JiN4YTtQUkQudXRpbC51bmlxdWUoIGxpc3QoKSwgdHJ1ZSApOyIKICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L1VuaXF1ZS9WZWN0b3IvdjA0L2l0ZW1zIgogICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PC9kYXRhLWl0ZW1zPjxkYXRhLWl0ZW1zCiAgICAgICAgICAgIGFjdGl2aXR5LWlkPSJtYXBUZXN0czQiPjxkYXRhLWl0ZW0gZGF0YS10eXBlPSJzdHJpbmciCiAgICAgICAgICAgIG5hbWU9Ik1BUDAiCiAgICAgICAgICAgIHNvdXJjZT0iUFJELnV0aWwubG9nZXJyb3IoICc9PT09PT09PT09PT0nICk7IFsgJ3llbGxvdycsICdicm93bicsICdwaW5rJyBdOyIKICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L0NvbXBhcmUvYXJyYXkiCiAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICBkYXRhLXR5cGU9InN0cmluZyIgbmFtZT0iTUFQMSIKICAgICAgICAgICAgc291cmNlPSJbIFsneWVsbG93J10sIFsnYnJvd24nXSwgWydwaW5rJ10gXTsiCiAgICAgICAgICAgIHRhcmdldD0iZmxvd2RhdGEudGVzdC9Db21wYXJlL2FycmF5T2ZBcnJheSIKICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgIGRhdGEtdHlwZT0ic3RyaW5nIiBuYW1lPSJNQVAyIgogICAgICAgICAgICBzb3VyY2U9IlBSRC51dGlsLkpTT05vYmouc3RyaW5naWZ5KCBQUkQudXRpbC5jb21wYXJlKCBbICdSZWQnLCAncmVkJywgJ2dyYXknLCAnR1JBWScsICdHcmF5JyBdLCBbICdyZWQnLCAnR3JlZW4nLCAnZ3JlZW4nLCAnR1JFRU4nIF0gKSApOyIKICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L0NvbXBhcmUvYXJyYXkvQTEiCiAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICBkYXRhLXR5cGU9InN0cmluZyIgbmFtZT0iTUFQMyIKICAgICAgICAgICAgc291cmNlPSJQUkQudXRpbC5KU09Ob2JqLnN0cmluZ2lmeSggUFJELnV0aWwuY29tcGFyZSggWyAnUmVkJywgJ3JlZCcsICdncmF5JywgJ0dSQVknLCAnR3JheScgXSwgWyAncmVkJywgJ0dyZWVuJywgJ2dyZWVuJywgJ0dSRUVOJyBdLCB0cnVlICkgKTsiCiAgICAgICAgICAgIHRhcmdldD0iZmxvd2RhdGEudGVzdC9Db21wYXJlL2FycmF5L0EyIgogICAgICAgICAgICB0YXJnZXQtdHlwZT0ibXVsdGktdmFsdWUtbGlzdCIvPjxkYXRhLWl0ZW0KICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDQiCiAgICAgICAgICAgIHNvdXJjZT0iZnVuY3Rpb24gbGlzdDEoKSB7dmFyIGw9bmV3IGphdmEudXRpbC5WZWN0b3IoKTtsLmFkZCgnUmVkJyk7bC5hZGQoJ3JlZCcpOyBsLmFkZCgnZ3JheScpO2wuYWRkKCdHUkFZJyk7bC5hZGQoJ0dyYXknKTsgcmV0dXJuIGw7fSYjeGQ7JiN4YTtmdW5jdGlvbiBsaXN0MigpIHt2YXIgbD1uZXcgamF2YS51dGlsLlZlY3RvcigpO2wuYWRkKCdyZWQnKTtsLmFkZCgnR3JlZW4nKTsgbC5hZGQoJ2dyZWVuJyk7bC5hZGQoJ0dSRUVOJyk7IHJldHVybiBsO30mI3hkOyYjeGE7UFJELnV0aWwuSlNPTm9iai5zdHJpbmdpZnkoIFBSRC51dGlsLmNvbXBhcmUoIGxpc3QxKCksIGxpc3QyKCkgKSApOyIKICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L0NvbXBhcmUvdmVjdG9yL1YxIgogICAgICAgICAgICB0YXJnZXQtdHlwZT0ibXVsdGktdmFsdWUtbGlzdCIvPjxkYXRhLWl0ZW0KICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDUiCiAgICAgICAgICAgIHNvdXJjZT0iZnVuY3Rpb24gbGlzdDEoKSB7dmFyIGw9bmV3IGphdmEudXRpbC5WZWN0b3IoKTtsLmFkZCgnUmVkJyk7bC5hZGQoJ3JlZCcpOyBsLmFkZCgnZ3JheScpO2wuYWRkKCdHUkFZJyk7bC5hZGQoJ0dyYXknKTsgcmV0dXJuIGw7fSYjeGQ7JiN4YTtmdW5jdGlvbiBsaXN0MigpIHt2YXIgbD1uZXcgamF2YS51dGlsLlZlY3RvcigpO2wuYWRkKCdyZWQnKTtsLmFkZCgnR3JlZW4nKTsgbC5hZGQoJ2dyZWVuJyk7bC5hZGQoJ0dSRUVOJyk7IHJldHVybiBsO30mI3hkOyYjeGE7UFJELnV0aWwuSlNPTm9iai5zdHJpbmdpZnkoIFBSRC51dGlsLmNvbXBhcmUoIGxpc3QxKCksIGxpc3QyKCksIHRydWUgKSApOyIKICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L0NvbXBhcmUvdmVjdG9yL1YyIgogICAgICAgICAgICB0YXJnZXQtdHlwZT0ibXVsdGktdmFsdWUtbGlzdCIvPjxkYXRhLWl0ZW0KICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDYiCiAgICAgICAgICAgIHNvdXJjZT0iUFJELnV0aWwuc2hvdWxkUmV0cnkoICcyMCcsICcxMCcgKTsiCiAgICAgICAgICAgIHRhcmdldD0iZmxvd2RhdGEudGVzdC9zaG91bGRSZXRyeS9zMDEiCiAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICBkYXRhLXR5cGU9InN0cmluZyIgbmFtZT0iTUFQNyIKICAgICAgICAgICAgc291cmNlPSJQUkQudXRpbC5zaG91bGRSZXRyeSggJzEwJywgJzIwJyApOyIKICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L3Nob3VsZFJldHJ5L3MwMiIKICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgIGRhdGEtdHlwZT0ic3RyaW5nIiBuYW1lPSJNQVA4IgogICAgICAgICAgICBzb3VyY2U9IlBSRC51dGlsLnNob3VsZFJldHJ5KCAnOTM0NScsICc5MzQ1JyApOyIKICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L3Nob3VsZFJldHJ5L3MwMyIKICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgIGRhdGEtdHlwZT0ic3RyaW5nIiBuYW1lPSJNQVA5IgogICAgICAgICAgICBzb3VyY2U9IlBSRC51dGlsLnNob3VsZFJldHJ5KCAnaW52YWxpZCcsICdzdHVmZicgKTsiCiAgICAgICAgICAgIHRhcmdldD0iZmxvd2RhdGEudGVzdC9zaG91bGRSZXRyeS9zMDQiCiAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICBkYXRhLXR5cGU9InN0cmluZyIgbmFtZT0iTUFQMTAiCiAgICAgICAgICAgIHNvdXJjZT0iUFJELnV0aWwuYmFzaWNIVFRQYXV0aEhlYWRlciggJ1NvbWVWYWx1ZUhlcmUnLCAnQW5kSGVyZUNvbWVzQVBhc3N3b3JkJyApOyIKICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L2Jhc2ljSFRUUGF1dGhIZWFkZXIiCiAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48L2RhdGEtaXRlbXM+PGRhdGEtaXRlbXMKICAgICAgICAgICAgYWN0aXZpdHktaWQ9Im1hcFRlc3RzNSI+PGRhdGEtaXRlbSBkYXRhLXR5cGU9InN0cmluZyIKICAgICAgICAgICAgbmFtZT0iTUFQMCIKICAgICAgICAgICAgc291cmNlPSJQUkQudXRpbC5sb2dlcnJvciggJz09PT09PT09PT09PScgKTsgUFJELnV0aWwuSlNPTm9iai5zdHJpbmdpZnkoIFBSRC51dGlsLmdldE9iamVjdDJhcnIoIGZsb3dkYXRhLmdldE9iamVjdCgndGVzdCcpICkgKTsiCiAgICAgICAgICAgIHRhcmdldD0iZmxvd2RhdGEudGVzdC9nZXRPYmplY3QyYXJyL2EwMSIKICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgIGRhdGEtdHlwZT0ic3RyaW5nIiBuYW1lPSJNQVAxIgogICAgICAgICAgICBzb3VyY2U9IlBSRC51dGlsLkpTT05vYmouc3RyaW5naWZ5KCBQUkQudXRpbC5nZXRPYmplY3QyYXJyKCBmbG93ZGF0YS5nZXRPYmplY3QoJ3Rlc3QvVW5pcXVlL1ZlY3Rvci92MDEvaXRlbXMnKSApICk7IgogICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvZ2V0T2JqZWN0MmFyci9hMDIiCiAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICBkYXRhLXR5cGU9InN0cmluZyIgbmFtZT0iTUFQMiIKICAgICAgICAgICAgc291cmNlPSJQUkQudXRpbC5KU09Ob2JqLnN0cmluZ2lmeSggUFJELnV0aWwuZ2V0T2JqZWN0MmFyciggZmxvd2RhdGEuZ2V0T2JqZWN0KCd0ZXN0L0NvbXBhcmUvYXJyYXknKSApICk7IgogICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvZ2V0T2JqZWN0MmFyci9hMDMiCiAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICBkYXRhLXR5cGU9InN0cmluZyIgbmFtZT0iTUFQMyIKICAgICAgICAgICAgc291cmNlPSJQUkQudXRpbC5KU09Ob2JqLnN0cmluZ2lmeSggUFJELnV0aWwuZ2V0T2JqZWN0MmFyciggZmxvd2RhdGEuZ2V0KCd0ZXN0L0dDVi9nZXQxJykgKSApOyIKICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L2dldE9iamVjdDJhcnIvYTA0IgogICAgICAgICAgICB0YXJnZXQtdHlwZT0ibXVsdGktdmFsdWUtbGlzdCIvPjxkYXRhLWl0ZW0KICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDQiCiAgICAgICAgICAgIHNvdXJjZT0iUFJELnV0aWwuSlNPTm9iai5zdHJpbmdpZnkoIFBSRC51dGlsLmdldE9iamVjdDJhcnIoIGZsb3dkYXRhLmdldE9iamVjdCgndGVzdC9HQ1YvZ2V0MicpICkgKTsiCiAgICAgICAgICAgIHRhcmdldD0iZmxvd2RhdGEudGVzdC9nZXRPYmplY3QyYXJyL2EwNSIKICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgIGRhdGEtdHlwZT0ic3RyaW5nIiBuYW1lPSJNQVA1IgogICAgICAgICAgICBzb3VyY2U9IlBSRC51dGlsLkpTT05vYmoudGVzdCggW3smcXVvdDtpdGVtcyZxdW90OzpbJnF1b3Q7Qmx1ZSZxdW90OywmcXVvdDtSZWQmcXVvdDssJnF1b3Q7R3JlZW4mcXVvdDtdfV0sICdbMF0uaXRlbXNbM10nICk7IgogICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvSlNPTi90ZXN0L3QwMSIKICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgIGRhdGEtdHlwZT0ic3RyaW5nIiBuYW1lPSJNQVA2IgogICAgICAgICAgICBzb3VyY2U9IlBSRC51dGlsLkpTT05vYmoudGVzdCggJ3smcXVvdDtyZXN1bHQmcXVvdDs6W3smcXVvdDtvYmomcXVvdDs6MX0seyZxdW90O29iaiZxdW90OzoyfSx7JnF1b3Q7b2JqJnF1b3Q7OnsmcXVvdDt3aXRoLmRvdCZxdW90Ozo5OTl9fV19JywgJ3Jlc3VsdFsyXS5vYmpbJnF1b3Q7d2l0aC5kb3QmcXVvdDtdJyApOyIKICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L0pTT04vdGVzdC90MDIiCiAgICAgICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PGRhdGEtaXRlbQogICAgICAgICAgICBkYXRhLXR5cGU9InN0cmluZyIgbmFtZT0iTUFQNyIKICAgICAgICAgICAgc291cmNlPSJQUkQudXRpbC5KU09Ob2JqLnRlc3QoICd7JnF1b3Q7cmVzdWx0JnF1b3Q7Olt7JnF1b3Q7b2JqJnF1b3Q7OjF9LHsmcXVvdDtvYmomcXVvdDs6Mn0seyZxdW90O29iaiZxdW90Ozp7JnF1b3Q7d2l0aC5kb3QmcXVvdDs6OTk5fX1dfScsICdyZXN1bHRbMF0nICk7IgogICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvSlNPTi90ZXN0L3QwMyIKICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgIGRhdGEtdHlwZT0ic3RyaW5nIiBuYW1lPSJNQVA4IgogICAgICAgICAgICBzb3VyY2U9IlBSRC51dGlsLkpTT05vYmouZ2V0KCBbeyZxdW90O2l0ZW1zJnF1b3Q7OlsmcXVvdDtCbHVlJnF1b3Q7LCZxdW90O1JlZCZxdW90OywmcXVvdDtHcmVlbiZxdW90O119XSwgJ1swXS5pdGVtc1swXScsICdzdHJpbmcnICk7IgogICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvSlNPTi9nZXQvZzAxIgogICAgICAgICAgICB0YXJnZXQtdHlwZT0ibXVsdGktdmFsdWUtbGlzdCIvPjxkYXRhLWl0ZW0KICAgICAgICAgICAgZGF0YS10eXBlPSJzdHJpbmciIG5hbWU9Ik1BUDkiCiAgICAgICAgICAgIHNvdXJjZT0iUFJELnV0aWwuSlNPTm9iai5nZXQoICd7JnF1b3Q7cmVzdWx0JnF1b3Q7Olt7JnF1b3Q7b2JqJnF1b3Q7OjF9LHsmcXVvdDtvYmomcXVvdDs6Mn0seyZxdW90O29iaiZxdW90Ozp7JnF1b3Q7d2l0aC5kb3QmcXVvdDs6OTk5fX1dfScsICdyZXN1bHRbMl0ub2JqWyZxdW90O3dpdGguZG90JnF1b3Q7XScsICdudW1iZXInICkgKiAxMDAwOyIKICAgICAgICAgICAgdGFyZ2V0PSJmbG93ZGF0YS50ZXN0L0pTT04vZ2V0L2cwMiIKICAgICAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48ZGF0YS1pdGVtCiAgICAgICAgICAgIGRhdGEtdHlwZT0ic3RyaW5nIiBuYW1lPSJNQVAxMCIKICAgICAgICAgICAgc291cmNlPSJQUkQudXRpbC5KU09Ob2JqLnN0cmluZ2lmeSggUFJELnV0aWwuSlNPTm9iai5nZXQoICd7JnF1b3Q7cmVzdWx0JnF1b3Q7Olt7JnF1b3Q7b2JqJnF1b3Q7OjF9LHsmcXVvdDtvYmomcXVvdDs6Mn0seyZxdW90O29iaiZxdW90Ozp7JnF1b3Q7d2l0aC5kb3QmcXVvdDs6OTk5fX1dfScsICdyZXN1bHRbMl0nLCAncmF3JyApICk7IgogICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvSlNPTi9nZXQvZzAzIgogICAgICAgIHRhcmdldC10eXBlPSJtdWx0aS12YWx1ZS1saXN0Ii8+PC9kYXRhLWl0ZW1zPjxkYXRhLWl0ZW1zCiAgICAgICAgICAgIGFjdGl2aXR5LWlkPSJtYXBUZXN0czYiPjxkYXRhLWl0ZW0gZGF0YS10eXBlPSJzdHJpbmciCiAgICAgICAgICAgIG5hbWU9Ik1BUDAiCiAgICAgICAgICAgIHNvdXJjZT0idmFyIHN0ciA9ICdvbmUnLCBudW0gPSAxLCBib29sID0gdHJ1ZSwgc3RyMiA9IG5ldyBTdHJpbmcoICd0d28nICksIG51bTIgPSBuZXcgTnVtYmVyKCAyICksIGJvb2wyID0gbmV3IEJvb2xlYW4oIHRydWUgKSwgdmVjID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKSwgcmVzID0gJyc7JiN4ZDsmI3hhO3ZhciBhcnIgPSBbIHN0ciwgbnVtLCBib29sLCBzdHIyLCBudW0yLCBib29sMiwgdmVjLCBudWxsLCB1bmRlZmluZWQgXTsmI3hkOyYjeGE7Zm9yICggdmFyIGkgPSAwOyBpICZsdDsgYXJyLmxlbmd0aDsgaSsrICkgeyYjeGQ7JiN4YTsgIHJlcyArPSAnVmFyaWFibGUgaW5kZXg6ICcgKyBpOyYjeGQ7JiN4YTsgIHJlcyArPSAnIGlzU3RyaW5nKCkgcmVzdWx0OiAnICsgUFJELnV0aWwuaXNTdHJpbmcoIGFyclsgaSBdICkgKyAnOyAnOyYjeGQ7JiN4YTsmI3g5O3JlcyArPSAnIGlzTnVtYmVyKCkgcmVzdWx0OiAnICsgUFJELnV0aWwuaXNOdW1iZXIoIGFyclsgaSBdICkgKyAnOyAnOyYjeGQ7JiN4YTsmI3g5O3JlcyArPSAnIGlzQm9vbGVhbigpIHJlc3VsdDogJyArIFBSRC51dGlsLmlzQm9vbGVhbiggYXJyWyBpIF0gKSArICc7ICc7JiN4ZDsmI3hhOyYjeDk7cmVzICs9ICcgaXNKYXZhVmVjdG9yKCkgcmVzdWx0OiAnICsgUFJELnV0aWwuaXNKYXZhVmVjdG9yKCBhcnJbIGkgXSApICsgJzsgJzsmI3hkOyYjeGE7JiN4OTtyZXMgKz0gJyBpbnNwZWN0VHlwZSgpIHJlc3VsdDogJyArIFBSRC51dGlsLmluc3BlY3RUeXBlKCBhcnJbIGkgXSApICsgJzsgJzsmI3hkOyYjeGE7fSYjeGQ7JiN4YTtyZXM7IgogICAgICAgICAgICB0YXJnZXQ9ImZsb3dkYXRhLnRlc3QvaXMtYW5kLWluc3BlY3QtdGVzdHMiCiAgICAgICAgdGFyZ2V0LXR5cGU9Im11bHRpLXZhbHVlLWxpc3QiLz48L2RhdGEtaXRlbXM+PHN0YXJ0LWFjdGl2aXR5CiAgICAgICAgICAgIGFjdGl2aXR5LWlkPSJTdGFydCI+PGRpc3BsYXktbmFtZQogICAgICAgICAgICB4bWw6bGFuZz0iZW4iPlN0YXJ0PC9kaXNwbGF5LW5hbWU+PGRpc3BsYXktbmFtZQogICAgICAgIHhtbDpsYW5nPSJlbiI+U3RhcnQ8L2Rpc3BsYXktbmFtZT48L3N0YXJ0LWFjdGl2aXR5PjxtYXBwaW5nLWFjdGl2aXR5CiAgICAgICAgICAgIGFjdGl2aXR5LWlkPSJtYXBUZXN0czEiPjxkaXNwbGF5LW5hbWUKICAgICAgICB4bWw6bGFuZz0iZW4iPmZsb3dkYXRhIHRlc3RzIDE8L2Rpc3BsYXktbmFtZT48L21hcHBpbmctYWN0aXZpdHk+PG1hcHBpbmctYWN0aXZpdHkKICAgICAgICAgICAgYWN0aXZpdHktaWQ9Im1hcFRlc3RzMiI+PGRpc3BsYXktbmFtZQogICAgICAgIHhtbDpsYW5nPSJlbiI+Zmxvd2RhdGEgdGVzdHMgMjwvZGlzcGxheS1uYW1lPjwvbWFwcGluZy1hY3Rpdml0eT48bWFwcGluZy1hY3Rpdml0eQogICAgICAgICAgICBhY3Rpdml0eS1pZD0ibWFwVGVzdHMzIj48ZGlzcGxheS1uYW1lCiAgICAgICAgeG1sOmxhbmc9ImVuIj5mbG93ZGF0YSB0ZXN0cyAzPC9kaXNwbGF5LW5hbWU+PC9tYXBwaW5nLWFjdGl2aXR5PjxtYXBwaW5nLWFjdGl2aXR5CiAgICAgICAgICAgIGFjdGl2aXR5LWlkPSJtYXBUZXN0czQiPjxkaXNwbGF5LW5hbWUKICAgICAgICB4bWw6bGFuZz0iZW4iPmZsb3dkYXRhIHRlc3RzIDQ8L2Rpc3BsYXktbmFtZT48L21hcHBpbmctYWN0aXZpdHk+PG1hcHBpbmctYWN0aXZpdHkKICAgICAgICAgICAgYWN0aXZpdHktaWQ9Im1hcFRlc3RzNSI+PGRpc3BsYXktbmFtZQogICAgICAgIHhtbDpsYW5nPSJlbiI+Zmxvd2RhdGEgdGVzdHMgNTwvZGlzcGxheS1uYW1lPjwvbWFwcGluZy1hY3Rpdml0eT48bWFwcGluZy1hY3Rpdml0eQogICAgICAgICAgICBhY3Rpdml0eS1pZD0ibWFwVGVzdHM2Ij48ZGlzcGxheS1uYW1lCiAgICAgICAgeG1sOmxhbmc9ImVuIj5mbG93ZGF0YSB0ZXN0cyA2PC9kaXNwbGF5LW5hbWU+PC9tYXBwaW5nLWFjdGl2aXR5PjxmaW5pc2gtYWN0aXZpdHkKICAgICAgICAgICAgYWN0aXZpdHktaWQ9IkZpbmlzaCI+PGRpc3BsYXktbmFtZQogICAgICAgICAgICB4bWw6bGFuZz0iZW4iPkZpbmlzaDwvZGlzcGxheS1uYW1lPjxkaXNwbGF5LW5hbWUKICAgICAgICAgICAgeG1sOmxhbmc9ImVuIj5GaW5pc2g8L2Rpc3BsYXktbmFtZT48bm90aWZ5CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZT0iY249UHJvdmlzaW9uaW5nIEFwcHJvdmFsIENvbXBsZXRlZCBOb3RpZmljYXRpb24sY249RGVmYXVsdCBOb3RpZmljYXRpb24gQ29sbGVjdGlvbixjbj1TZWN1cml0eSI+PG1hcAogICAgICAgICAgICAgICAgc291cmNlPSJfZGVmYXVsdF8iCiAgICAgICAgdGFyZ2V0PSJUTyIvPjwvbm90aWZ5PjwvZmluaXNoLWFjdGl2aXR5PjxsaW5rIHNvdXJjZT0iU3RhcnQiCiAgICAgICAgdGFyZ2V0PSJtYXBUZXN0czEiIHR5cGU9ImZvcndhcmQiLz48bGluayBzb3VyY2U9Im1hcFRlc3RzMSIKICAgICAgICB0YXJnZXQ9Im1hcFRlc3RzMiIgdHlwZT0iZm9yd2FyZCIvPjxsaW5rIHNvdXJjZT0ibWFwVGVzdHMyIgogICAgICAgIHRhcmdldD0ibWFwVGVzdHMzIiB0eXBlPSJmb3J3YXJkIi8+PGxpbmsgc291cmNlPSJtYXBUZXN0czMiCiAgICAgICAgdGFyZ2V0PSJtYXBUZXN0czQiIHR5cGU9ImZvcndhcmQiLz48bGluayBzb3VyY2U9Im1hcFRlc3RzNCIKICAgICAgICB0YXJnZXQ9Im1hcFRlc3RzNSIgdHlwZT0iZm9yd2FyZCIvPjxsaW5rIHNvdXJjZT0ibWFwVGVzdHM1IgogICAgICAgIHRhcmdldD0ibWFwVGVzdHM2IiB0eXBlPSJmb3J3YXJkIi8+PGxpbmsgc291cmNlPSJtYXBUZXN0czYiCiAgICAgICAgdGFyZ2V0PSJGaW5pc2giIHR5cGU9ImZvcndhcmQiLz48L3Byb2Nlc3M+CjwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkNvcHlyaWdodCAoYykgMjAwNiBOb3ZlbGwsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KClRISVMgV09SSyBJUyBTVUJKRUNUIFRPIFUuUy4gQU5EIElOVEVSTkFUSU9OQUwgQ09QWVJJR0hUIExBV1MgQU5EIFRSRUFUSUVTCk5PIFBBUlQgT0YgVEhJUyBXT1JLIE1BWSBCRSBVU0VELCBQUkFDVElDRUQsIFBFUkZPUk1FRCBDT1BJRUQsIERJU1RSSUJVVEVELApSRVZJU0VELCBNT0RJRklFRCwgVFJBTlNMQVRFRCwgQUJSSURHRUQsIENPTkRFTlNFRCwgRVhQQU5ERUQsIENPTExFQ1RFRCwKQ09NUElMRUQsIExJTktFRCwgUkVDQVNULCBUUkFOU0ZPUk1FRCBPUiBBREFQVEVEIFdJVEhPVVQgVEhFIFBSSU9SIFdSSVRURU4KQ09OU0VOVCBPRiBOT1ZFTEwsIElOQy4gQU5ZIFVTRSBPUiBFWFBMT0lUQVRJT04gT0YgVEhJUyBXT1JLIFdJVEhPVVQKQVVUSE9SSVpBVElPTiBDT1VMRCBTVUJKRUNUIFRIRSBQRVJQRVRSQVRPUiBUTyBDUklNSU5BTCBBTkQgQ0lWSUwgCkxJQUJJTElUWS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLT4K]]></ds-value>
</ds-attribute>
</ds-attributes>
</ds-object>
</ds-object>
<ds-object ds-object-class="nrfConfig" ds-object-name="RoleConfig">
<ds-attributes/>
<ds-object ds-object-class="nrfAttestations" ds-object-name="Attestations">
<ds-attributes/>
</ds-object>
<ds-object ds-object-class="nrfReportDefs" ds-object-name="ReportDefs">
<ds-attributes/>
</ds-object>
<ds-object ds-object-class="nrfResourceDefs" ds-object-name="ResourceDefs">
<ds-attributes/>
</ds-object>
<ds-object ds-object-class="nrfRoleDefs" ds-object-name="RoleDefs">
<ds-attributes/>
<ds-object ds-object-class="nrfRoleDefs" ds-object-name="Level10">
<ds-attributes/>
</ds-object>
<ds-object ds-object-class="nrfRoleDefs" ds-object-name="Level20">
<ds-attributes/>
<ds-object ds-object-class="nrfRoleDefs" ds-object-name="System">
<ds-attributes/>
</ds-object>
</ds-object>
<ds-object ds-object-class="nrfRoleDefs" ds-object-name="Level30">
<ds-attributes/>
</ds-object>
</ds-object>
<ds-object ds-object-class="nrfResourceAssociations" ds-object-name="ResourceAssociations">
<ds-attributes/>
</ds-object>
<ds-object ds-object-class="nrfResourceRequests" ds-object-name="ResourceRequests">
<ds-attributes/>
</ds-object>
<ds-object ds-object-class="nrfSODDefs" ds-object-name="SoDDefs">
<ds-attributes/>
</ds-object>
</ds-object>
<ds-object ds-object-class="srvprvTeamDefs" ds-object-name="TeamDefs">
<ds-attributes/>
</ds-object>
</ds-object>
</provisioning>
</children></driver-configuration>