wherdr 1.3.1 → 1.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.output/nitro.json +1 -1
- package/.output/public/_nuxt/{WLQjK8uJ.js → 8ksjcuDu.js} +51 -41
- package/.output/public/_nuxt/B7QP1TFs.js +23 -0
- package/.output/public/_nuxt/{CiYar6hg.js → BOpBIziZ.js} +2 -2
- package/.output/public/_nuxt/BWXdFfeg.js +17 -0
- package/.output/public/_nuxt/COFCNFpG.js +83 -0
- package/.output/public/_nuxt/{C2T9fQ4f.js → Cd8j9O5w.js} +1 -1
- package/.output/public/_nuxt/{C12eXl5z.js → CkZ8t6uB.js} +1 -1
- package/.output/public/_nuxt/{CctS2Xn6.js → D4Yz4rat.js} +4 -4
- package/.output/public/_nuxt/{B6qBWHWB.js → D7sxNXx1.js} +1 -1
- package/.output/public/_nuxt/DViwOclv.js +1 -0
- package/.output/public/_nuxt/DoD7Qb5P.js +30 -0
- package/.output/public/_nuxt/{BMIe8p_3.js → DyBZDSCV.js} +1 -1
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/7afbf062-5369-4002-b20d-7a582ff6e0f1.json +1 -0
- package/.output/public/_nuxt/{entry.cKR16VqG.css → entry.Crt1r4l3.css} +1 -1
- package/.output/public/_nuxt/hePW80VL.js +1 -0
- package/.output/public/sw.js +1 -1
- package/.output/server/chunks/_/branding.mjs +1 -1
- package/.output/server/chunks/_/package.mjs +96 -0
- package/.output/server/chunks/_/plugins.mjs +1 -1
- package/.output/server/chunks/_/projectBoard.mjs +1 -1
- package/.output/server/chunks/_/projectsPlugin.mjs +1 -1
- package/.output/server/chunks/_/selfupdate.mjs +82 -0
- package/.output/server/chunks/_/updates.mjs +50 -0
- package/.output/server/chunks/_/worktrees.mjs +1 -1
- package/.output/server/chunks/_/ws.mjs +1 -1
- package/.output/server/chunks/nitro/nitro.mjs +1670 -899
- package/.output/server/chunks/raw/herdr-plugin.mjs +1 -1
- package/.output/server/chunks/routes/api/_..._.mjs +5 -1
- package/.output/server/chunks/routes/api/agents.post.mjs +5 -1
- package/.output/server/chunks/routes/api/ask-tab.post.mjs +5 -1
- package/.output/server/chunks/routes/api/attach.post.mjs +5 -1
- package/.output/server/chunks/routes/api/auth/disable.post.mjs +5 -1
- package/.output/server/chunks/routes/api/auth/lock-all.post.mjs +5 -1
- package/.output/server/chunks/routes/api/auth/lock.post.mjs +5 -1
- package/.output/server/chunks/routes/api/auth/login/options.post.mjs +5 -1
- package/.output/server/chunks/routes/api/auth/login/verify.post.mjs +5 -1
- package/.output/server/chunks/routes/api/auth/max-session.post.mjs +5 -1
- package/.output/server/chunks/routes/api/auth/register/options.post.mjs +5 -1
- package/.output/server/chunks/routes/api/auth/register/verify.post.mjs +5 -1
- package/.output/server/chunks/routes/api/auth/status.get.mjs +5 -1
- package/.output/server/chunks/routes/api/changes.get.mjs +5 -1
- package/.output/server/chunks/routes/api/chat/image.get.mjs +5 -1
- package/.output/server/chunks/routes/api/chat.get.mjs +5 -1
- package/.output/server/chunks/routes/api/choose.post.mjs +5 -1
- package/.output/server/chunks/routes/api/claude-statusline.post.mjs +5 -1
- package/.output/server/chunks/routes/api/close/status.get.mjs +5 -1
- package/.output/server/chunks/routes/api/close.post.mjs +5 -1
- package/.output/server/chunks/routes/api/codex-update.post.mjs +5 -1
- package/.output/server/chunks/routes/api/commands.get.mjs +5 -1
- package/.output/server/chunks/routes/api/config.get.mjs +5 -1
- package/.output/server/chunks/routes/api/dirs.get.mjs +5 -1
- package/.output/server/chunks/routes/api/dismiss.post.mjs +5 -1
- package/.output/server/chunks/routes/api/effort.post.mjs +5 -1
- package/.output/server/chunks/routes/api/efforts.get.mjs +5 -1
- package/.output/server/chunks/routes/api/file.post.mjs +5 -1
- package/.output/server/chunks/routes/api/gitroot.get.mjs +5 -1
- package/.output/server/chunks/routes/api/health.get.mjs +36 -0
- package/.output/server/chunks/routes/api/index.get.mjs +5 -1
- package/.output/server/chunks/routes/api/input.post.mjs +5 -1
- package/.output/server/chunks/routes/api/interrupt.post.mjs +5 -1
- package/.output/server/chunks/routes/api/isgit.get.mjs +5 -1
- package/.output/server/chunks/routes/api/machine/awake.get.mjs +5 -1
- package/.output/server/chunks/routes/api/machine/awake.post.mjs +5 -1
- package/.output/server/chunks/routes/api/machine/order.get.mjs +5 -1
- package/.output/server/chunks/routes/api/machine/order.post.mjs +5 -1
- package/.output/server/chunks/routes/api/machine/rename.post.mjs +5 -1
- package/.output/server/chunks/routes/api/menu.post.mjs +5 -1
- package/.output/server/chunks/routes/api/model.post.mjs +5 -1
- package/.output/server/chunks/routes/api/models.get.mjs +5 -1
- package/.output/server/chunks/routes/api/nav.post.mjs +5 -1
- package/.output/server/chunks/routes/api/onboarding.get.mjs +5 -1
- package/.output/server/chunks/routes/api/onboarding.post.mjs +5 -1
- package/.output/server/chunks/routes/api/phone.get.mjs +5 -6
- package/.output/server/chunks/routes/api/phone.post.mjs +5 -6
- package/.output/server/chunks/routes/api/plugins/actions.get.mjs +5 -1
- package/.output/server/chunks/routes/api/plugins/invoke.post.mjs +5 -1
- package/.output/server/chunks/routes/api/plugins/profiles.get.mjs +5 -1
- package/.output/server/chunks/routes/api/plugins/projects.get.mjs +5 -1
- package/.output/server/chunks/routes/api/plugins/projects.post.mjs +5 -1
- package/.output/server/chunks/routes/api/plugins/thread-limits.get.mjs +6 -2
- package/.output/server/chunks/routes/api/plugins/thread-limits.post.mjs +6 -2
- package/.output/server/chunks/routes/api/project/report.get.mjs +5 -1
- package/.output/server/chunks/routes/api/prompt.post.mjs +6 -2
- package/.output/server/chunks/routes/api/push/quiet.post.mjs +6 -2
- package/.output/server/chunks/routes/api/push/subscribe.post.mjs +6 -2
- package/.output/server/chunks/routes/api/push/test.post.mjs +6 -2
- package/.output/server/chunks/routes/api/push/unsubscribe.post.mjs +6 -2
- package/.output/server/chunks/routes/api/quotas.get.mjs +6 -2
- package/.output/server/chunks/routes/api/rename.post.mjs +5 -1
- package/.output/server/chunks/routes/api/requeue.post.mjs +6 -2
- package/.output/server/chunks/routes/api/restart.get.mjs +5 -1
- package/.output/server/chunks/routes/api/restart.post.mjs +5 -1
- package/.output/server/chunks/routes/api/reveal.post.mjs +5 -1
- package/.output/server/chunks/routes/api/screen-key.post.mjs +6 -2
- package/.output/server/chunks/routes/api/screen.get.mjs +6 -2
- package/.output/server/chunks/routes/api/search.get.mjs +6 -2
- package/.output/server/chunks/routes/api/seen.post.mjs +6 -2
- package/.output/server/chunks/routes/api/sessions.get.mjs +6 -2
- package/.output/server/chunks/routes/api/sessions.post.mjs +6 -2
- package/.output/server/chunks/routes/api/space.post.mjs +6 -2
- package/.output/server/chunks/routes/api/state.get.mjs +6 -2
- package/.output/server/chunks/routes/api/unqueue.post.mjs +6 -2
- package/.output/server/chunks/routes/api/update/status.get.mjs +38 -0
- package/.output/server/chunks/routes/api/update.get.mjs +11 -50
- package/.output/server/chunks/routes/api/update.post.mjs +41 -0
- package/.output/server/chunks/routes/api/upload.post.mjs +5 -1
- package/.output/server/chunks/routes/api/worktrees/remove.post.mjs +5 -1
- package/.output/server/chunks/routes/api/worktrees.get.mjs +5 -1
- package/.output/server/chunks/routes/favicon.ico.get.mjs +5 -1
- package/.output/server/chunks/routes/icons/_name_.get.mjs +6 -2
- package/.output/server/chunks/routes/renderer.mjs +7 -3
- package/.output/server/chunks/routes/uploads/_...name_.get.mjs +6 -2
- package/.output/server/chunks/routes/ws/_..._.mjs +6 -2
- package/.output/server/chunks/routes/ws/events.mjs +6 -2
- package/.output/server/chunks/routes/ws/mirror.mjs +6 -2
- package/.output/server/chunks/routes/ws/term.mjs +8 -4
- package/.output/server/chunks/virtual/precomputed.mjs +1 -1
- package/.output/server/index.mjs +6 -2
- package/.output/server/package.json +1 -1
- package/README.md +110 -23
- package/bin/lib/commands.mjs +42 -8
- package/bin/lib/core.mjs +17 -2
- package/bin/lib/tailnet.d.mts +12 -3
- package/bin/lib/tailnet.mjs +103 -25
- package/bin/lib/updater.mjs +267 -0
- package/package.json +2 -1
- package/.output/public/_nuxt/BpQH8Ho1.js +0 -1
- package/.output/public/_nuxt/BrAeJIZR.js +0 -30
- package/.output/public/_nuxt/CYxHnMNH.js +0 -83
- package/.output/public/_nuxt/DLLQgP0d.js +0 -1
- package/.output/public/_nuxt/Dwh-l2rQ.js +0 -17
- package/.output/public/_nuxt/builds/meta/6466b0ab-7935-460c-abdf-2ea632dae6d0.json +0 -1
- package/.output/public/_nuxt/whFLy_Ne.js +0 -23
- package/.output/server/chunks/_/phone.mjs +0 -343
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { b as base64ToUint8Array } from '../virtual/_raw-helpers.mjs';
|
|
2
2
|
|
|
3
3
|
// ROLLUP_NO_REPLACE
|
|
4
|
-
const herdrPlugin = base64ToUint8Array("IyEvYmluL3NoCiMgd2hlcmRyIGFzIGEgSGVyZHIgcGx1Z2luIChoZXJkci1wbHVnaW4udG9tbCk6IGJ1aWxkIChpbnN0YWxsICsgZmlyc3Qgc3RhcnQpLAojIHRoZSBwYW5lbCwgc3RhcnQsIHN0b3AsIHN0YXR1cywgb3BlbiwgdXBkYXRlLCBzZXJ2aWNlLCBza2lsbCwga2V5LgojCiMgICBoZXJkciBwbHVnaW4gaW5zdGFsbCA8b3duZXI+L3doZXJkcgojCiMgVHdvIHdheXMgdG8gcnVuIHdoZXJkciwgcGlja2VkIG9uY2UgYXQgaW5zdGFsbCB0aW1lIGFuZCBrZXB0IGluCiMgJFdIRVJEUl9ESVIvcGx1Z2luLmVudjoKIyAgIGRvY2tlciAgTGludXggd2l0aCBEb2NrZXIgQ29tcG9zZSB2MiB1c2FibGUgYnkgdGhpcyB1c2VyOiB0aGUgcHVibGlzaGVkCiMgICAgICAgICAgIGltYWdlLCBydW4gZnJvbSAkV0hFUkRSX0RJUiBleGFjdGx5IGxpa2UgaHR0cHM6Ly93aGVyZHIuZGV2L2luc3RhbGwuCiMgICBuYXRpdmUgIGV2ZXJ5d2hlcmUgZWxzZSAoYWx3YXlzIG9uIG1hY09TOiBEb2NrZXIgRGVza3RvcCBjYW5ub3QgcmVhY2gKIyAgICAgICAgICAgSGVyZHIncyBVbml4IHNvY2tldCk6IE5vZGUuanMgMjIgKG9yIEJ1bikgcnVucyB0aGUgcHJlYnVpbHQgbnBtCiMgICAgICAgICAgIHBhY2thZ2Ugb2YgdGhpcyB2ZXJzaW9uIChvciBhIGJ1aWxkIG1hZGUgaW4gdGhlIHBsdWdpbiBmb2xkZXIpLAojICAgICAgICAgICBjb3BpZWQgdG8gJFdIRVJEUl9ESVIvYXBwIGFuZCBzdGFydGVkIGRldGFjaGVkIGZyb20gdGhlcmUsIHdpdGgKIyAgICAgICAgICAgaXRzIHBpZCBhbmQgbG9nIGluICRXSEVSRFJfRElSLgojIEhlcmRyIGJ1aWxkcyBhIHBsdWdpbiBpbiBhIHRlbXBvcmFyeSBmb2xkZXIsIHRoZW4gbW92ZXMgaXQ6IGEgc2VydmVyIHN0YXJ0ZWQKIyBmcm9tIHRoZSBjaGVja291dCBkdXJpbmcgdGhlIGJ1aWxkIHdvdWxkIGxvc2UgaXRzIGZpbGVzLiAkV0hFUkRSX0RJUi9hcHAKIyBzdGF5cyBwdXQsIGFjcm9zcyBwbHVnaW4gdXBkYXRlcyB0b28sIHNvIHRoZSBidWlsZCBjYW4gc3RhcnQgd2hlcmRyIGFuZCBhCiMgbG9naW4gc2VydmljZSBjYW4gcG9pbnQgYXQgaXQuCiMgV0hFUkRSX01PREU9bmF0aXZlIChvciBkb2NrZXIpIGluIHRoZSBlbnZpcm9ubWVudCBvZiBgaGVyZHIgcGx1Z2luIGluc3RhbGxgCiMgZm9yY2VzIHRoZSBjaG9pY2U7IGVkaXQgcGx1Z2luLmVudiB0byBjaGFuZ2UgaXQgbGF0ZXIsIHRoZW4gcnVuIFVwZGF0ZS4KIwojIFNhZmV0eSBydWxlczoKIyAgIC0gbm90aGluZyBnbG9iYWwgaXMgaW5zdGFsbGVkLCBubyBzdWRvOyBmaWxlcyBhcmUgb25seSB3cml0dGVuIHRvIHRoZQojICAgICBwbHVnaW4gZm9sZGVyIGFuZCAkV0hFUkRSX0RJUiAoZGVmYXVsdCB+L3doZXJkciksIHBsdXMgdGhlIGZvbGRlcnMgdGhlCiMgICAgIERvY2tlciBzZXR1cCBtb3VudHMgKH4vLmNvbmZpZy9oZXJkciwgfi8uY2FjaGUvaGVyZHItd2Vi4oCmKSwgYW5kIHRoZQojICAgICBsb2dpbiBzZXJ2aWNlIG9ubHkgd2hlbiBhc2tlZCAoa2V5IEEgb2YgdGhlIHBhbmVsKSwgcGx1cyBhICJ3aGVyZHIiCiMgICAgIGxpbmsgaW4gdGhlIGFnZW50cycgdXNlciBza2lsbCBmb2xkZXJzIChzZWUgY21kX3NraWxsKSwgcGx1cyBvbmUgbWFya2VkCiMgICAgIGJsb2NrIGFwcGVuZGVkIHRvIEhlcmRyJ3MgY29uZmlnLnRvbWw6IHRoZSBrZXkgdGhhdCBvcGVucyB0aGUgcGFuZWwKIyAgICAgKHNlZSBjbWRfa2V5KTsKIyAgIC0gdGhlIGluc3RhbGwgc3RhcnRzIHdoZXJkciwgYW5kIEhlcmRyJ3Mgc3RhcnR1cCBob29rIHN0YXJ0cyBpdCBhZ2FpbiwKIyAgICAgYnV0IG9ubHkgd2hlbiBub3RoaW5nIGFuc3dlcnMgb24gdGhlIHBvcnQ6IGEgd2hlcmRyIHN0YXJ0ZWQgYW5vdGhlciB3YXkKIyAgICAgKERvY2tlciwgc3lzdGVtZCwgYnkgaGFuZCkgaXMgbmV2ZXIgdG91Y2hlZCwgbm8gc2Vjb25kIHdoZXJkciBpcyBzdGFydGVkOwojICAgLSBzdG9wIG9ubHkgc3RvcHMgd2hhdCB0aGlzIHBsdWdpbiBzdGFydGVkIChpdHMgcGlkLCBpdHMgbG9naW4gc2VydmljZSwgb3IKIyAgICAgdGhlIGNvbnRhaW5lciBvZiBpdHMgb3duIGNvbXBvc2UgZm9sZGVyKS4KIwojIFVuaW5zdGFsbDogSGVyZHIgaGFzIG5vIHVuaW5zdGFsbCBob29rLiBTdG9wIHdoZXJkciAoYW5kIHJlbW92ZSB0aGUgbG9naW4KIyBzZXJ2aWNlKSBmcm9tIHRoZSBwYW5lbCBmaXJzdCwgdGhlbjoKIyAgIHNoIHNjcmlwdHMvaGVyZHItcGx1Z2luLnNoIHNraWxsIHVuaW5zdGFsbCAgIChpbiB0aGUgcGx1Z2luIGZvbGRlcikKIyAgIHNoIHNjcmlwdHMvaGVyZHItcGx1Z2luLnNoIGtleSB1bmluc3RhbGwgICAgICh0aGUgSGVyZHIga2V5IG9mIHRoZSBwYW5lbCkKIyAgIGhlcmRyIHBsdWdpbiB1bmluc3RhbGwgPG93bmVyPi53aGVyZHIgJiYgcm0gLXJmIH4vd2hlcmRyCiMKIyBTZXR0aW5ncyAoJFdIRVJEUl9ESVIvcGx1Z2luLmVudiwgb3IgdGhlIGVudmlyb25tZW50KToKIyAgIFdIRVJEUl9NT0RFICBkb2NrZXIgfCBuYXRpdmUgICAgICAgIChkZWZhdWx0OiBjaG9zZW4gYXQgaW5zdGFsbCkKIyAgIFdIRVJEUl9QT1JUICBsb2NhbCBwb3J0ICAgICAgICAgICAgICAoZGVmYXVsdDogNzY4MykKIyAgIEFQUF9VUkwgICAgICBwcml2YXRlIEhUVFBTIGFkZHJlc3MgICAobmF0aXZlOyBEb2NrZXIgcmVhZHMgaXRzIC5lbnYpCiMgICBXSEVSRFJfUlVOVElNRSAgYWJzb2x1dGUgcGF0aCBvZiBub2RlIC8gYnVuIChuYXRpdmU7IGZvdW5kIGF0IGluc3RhbGwpCgpzZXQgLWV1CgpST09UPSIkKGNkICIkKGRpcm5hbWUgIiQwIikvLi4iICYmIHB3ZCAtUCkiCiMgQnVpbGQgY29tbWFuZHMgZ2V0IG5vIHBsdWdpbiBlbnZpcm9ubWVudDogdGhlIGZvbGRlciBjaG9zZW4gYXQgaW5zdGFsbAojIHRpbWUgaXMgcmVtZW1iZXJlZCBpbiB0aGUgcGx1Z2luIGNoZWNrb3V0IGZvciB0aGUgcnVudGltZSBjb21tYW5kcy4KaWYgWyAteiAiJHtXSEVSRFJfRElSOi19IiBdICYmIFsgLWYgIiRST09ULy53aGVyZHItZGlyIiBdOyB0aGVuCiAgV0hFUkRSX0RJUj0iJChjYXQgIiRST09ULy53aGVyZHItZGlyIikiCmZpCkRJUj0iJHtXSEVSRFJfRElSOi0kSE9NRS93aGVyZHJ9IgpDT05GPSIkRElSL3BsdWdpbi5lbnYiCiMgTmF0aXZlIG1vZGU6IHRoZSBpbnN0YWxsZWQgY29weSBvZiB3aGVyZHIgKGJpbiArIGJ1aWx0IHNlcnZlcikuCkFQUD0iJERJUi9hcHAiCiMgR2l0SHViIHNvdXJjZSBvZiB0aGlzIHBsdWdpbjogaXRzIG1hbmlmZXN0IGlkIHdpdGggIi8iIGZvciAiLiIgKG93bmVyLndoZXJkcikuClNPVVJDRT0iJChzZWQgLW4gJ3MvXmlkID0gIlwoLipcKSIkL1wxL3AnICIkUk9PVC9oZXJkci1wbHVnaW4udG9tbCIgfCBoZWFkIC1uIDEgfCB0ciAuIC8pIgojIGNvbnRhaW5lcl9uYW1lIG9mIHRoZSBjb21wb3NlIGZpbGUgKHdoZXJkciB1bmxlc3MgeW91IHJlbmFtZWQgaXQpLgpDT05UQUlORVI9IiQoc2VkIC1uICdzL14gKmNvbnRhaW5lcl9uYW1lOiAqLy9wJyAiJERJUi9kb2NrZXItY29tcG9zZS55bWwiIDI+L2Rldi9udWxsIHwgaGVhZCAtbiAxKSIKQ09OVEFJTkVSPSIke0NPTlRBSU5FUjotd2hlcmRyfSIKIyBUaGUgZW52aXJvbm1lbnQgd2lucyBvdmVyIHBsdWdpbi5lbnYuCkVOVl9NT0RFPSIke1dIRVJEUl9NT0RFOi19IiBFTlZfUE9SVD0iJHtXSEVSRFJfUE9SVDotfSIgRU5WX0FQUF9VUkw9IiR7QVBQX1VSTDotfSIgRU5WX1JVTlRJTUU9IiR7V0hFUkRSX1JVTlRJTUU6LX0iCmlmIFsgLWYgIiRDT05GIiBdOyB0aGVuCiAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MxMDkwCiAgLiAiJENPTkYiCmZpCk1PREU9IiR7RU5WX01PREU6LSR7V0hFUkRSX01PREU6LX19IgpQT1JUPSIke0VOVl9QT1JUOi0ke1dIRVJEUl9QT1JUOi03NjgzfX0iCkFQUF9VUkw9IiR7RU5WX0FQUF9VUkw6LSR7QVBQX1VSTDotfX0iCiMgTmF0aXZlIG1vZGU6IGFic29sdXRlIHBhdGggb2YgdGhlIG5vZGUgKG9yIGJ1bikgdGhhdCBydW5zIHRoZSBzZXJ2ZXIuIEhlcmRyCiMgcnVucyBhY3Rpb25zIHdpdGggaXRzIHNlcnZlcidzIFBBVEgsIHdoaWNoIG9mdGVuIGxhY2tzIG52bSAvIG4gLyBmbm0gZm9sZGVycy4KUlVOVElNRT0iJHtFTlZfUlVOVElNRTotJHtXSEVSRFJfUlVOVElNRTotfX0iClVSTD0iaHR0cDovL2xvY2FsaG9zdDokUE9SVCIKCnNheSgpIHsgcHJpbnRmICclc1xuJyAiJCoiOyB9Cm9rKCkgeyBwcmludGYgJyAg4pyTICVzXG4nICIkKiI7IH0Kd2FybigpIHsgcHJpbnRmICcgICEgJXNcbicgIiQqIiA+JjI7IH0KZGllKCkgeyBwcmludGYgJyAg4pyXICVzXG4nICIkKiIgPiYyOyBleGl0IDE7IH0KCiMgQW55IEhUVFAgYW5zd2VyIGNvdW50cyAoYSBsb2NrZWQgd2hlcmRyIGFuc3dlcnMgNDAxKTogdGhlIHBvcnQgaXMgdGFrZW4uCmFuc3dlcnMoKSB7CiAgaWYgY29tbWFuZCAtdiBjdXJsID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgY29kZT0iJChjdXJsIC1zIC1vIC9kZXYvbnVsbCAtLW1heC10aW1lIDIgLXcgJyV7aHR0cF9jb2RlfScgImh0dHA6Ly8xMjcuMC4wLjE6JFBPUlQvIiAyPi9kZXYvbnVsbCB8fCB0cnVlKSIKICAgIFsgLW4gIiRjb2RlIiBdICYmIFsgIiRjb2RlIiAhPSAiMDAwIiBdCiAgZWxpZiBjb21tYW5kIC12IG5jID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgbmMgLXogMTI3LjAuMC4xICIkUE9SVCIgPi9kZXYvbnVsbCAyPiYxCiAgZWxzZQogICAgZGllICJjdXJsIG9yIG5jIGlzIG5lZWRlZCB0byBjaGVjayBwb3J0ICRQT1JULiIKICBmaQp9Cgpkb2NrZXJfdXNhYmxlKCkgewogIFsgIiQodW5hbWUgLXMpIiA9ICJMaW51eCIgXSB8fCByZXR1cm4gMQogIGNvbW1hbmQgLXYgZG9ja2VyID4vZGV2L251bGwgMj4mMSB8fCByZXR1cm4gMQogIGRvY2tlciBjb21wb3NlIHZlcnNpb24gPi9kZXYvbnVsbCAyPiYxIHx8IHJldHVybiAxCiAgZG9ja2VyIGluZm8gPi9kZXYvbnVsbCAyPiYxCn0KCiMgTWFqb3IgdmVyc2lvbiBvZiBhIG5vZGUgYmluYXJ5LCAwIHdoZW4gaXQgaXMgbm90IG9uZS4Kbm9kZV9tYWpvcigpIHsKICAiJDEiIC1wICdwcm9jZXNzLnZlcnNpb25zLm5vZGUuc3BsaXQoIi4iKVswXScgMj4vZGV2L251bGwgfHwgZWNobyAwCn0KCiMgQSB1c2FibGUgcnVudGltZTogTm9kZS5qcyAyMiBvciBuZXdlciwgb3IgQnVuIChpdCBydW5zIHRoZSBidWlsdCBzZXJ2ZXIgdG9vKS4KcnVudGltZV9vaygpIHsKICBbIC1uICIkMSIgXSAmJiBbIC14ICIkMSIgXSAmJiBbICEgLWQgIiQxIiBdIHx8IHJldHVybiAxCiAgY2FzZSAiJChiYXNlbmFtZSAiJDEiKSIgaW4KICAgIGJ1bikgIiQxIiAtLXZlcnNpb24gPi9kZXYvbnVsbCAyPiYxIDs7CiAgICAqKSBbICIkKG5vZGVfbWFqb3IgIiQxIikiIC1nZSAyMiBdIDI+L2Rldi9udWxsIDs7CiAgZXNhYwp9CgojIEFic29sdXRlIHBhdGggb2YgdGhlIHJ1bnRpbWU6IFdIRVJEUl9SVU5USU1FLCB0aGVuIG5vZGUgb24gdGhlIFBBVEgsIHRoZW4gdGhlCiMgdXN1YWwgaW5zdGFsbCBmb2xkZXJzIChuLCBudm0sIFZvbHRhLCBmbm0sIGFzZGYsIEhvbWVicmV3KSwgdGhlbiBCdW4uCiMgUHJpbnRzIG5vdGhpbmcgYW5kIGZhaWxzIHdoZW4gbm9uZSBpcyBmb3VuZC4KZmluZF9ydW50aW1lKCkgewogIGZvciBjIGluICIkUlVOVElNRSIgIiQoY29tbWFuZCAtdiBub2RlIDI+L2Rldi9udWxsIHx8IHRydWUpIiBcCiAgICAiJEhPTUUvLm4vYmluL25vZGUiICIke05fUFJFRklYOiskTl9QUkVGSVgvYmluL25vZGV9IiBcCiAgICAkKGxzIC1kICIkSE9NRSIvLm52bS92ZXJzaW9ucy9ub2RlL3YqL2Jpbi9ub2RlIDI+L2Rldi9udWxsIHwgc29ydCAtciAtVikgXAogICAgIiRIT01FLy52b2x0YS9iaW4vbm9kZSIgXAogICAgJChscyAtZCAiJEhPTUUiLy5sb2NhbC9zaGFyZS9mbm0vbm9kZS12ZXJzaW9ucy8qL2luc3RhbGxhdGlvbi9iaW4vbm9kZSAiJEhPTUUiLy5mbm0vbm9kZS12ZXJzaW9ucy8qL2luc3RhbGxhdGlvbi9iaW4vbm9kZSAyPi9kZXYvbnVsbCB8IHNvcnQgLXIgLVYpIFwKICAgICIkSE9NRS8uYXNkZi9zaGltcy9ub2RlIiAvb3B0L2hvbWVicmV3L2Jpbi9ub2RlIC91c3IvbG9jYWwvYmluL25vZGUgL3Vzci9iaW4vbm9kZSBcCiAgICAiJChjb21tYW5kIC12IGJ1biAyPi9kZXYvbnVsbCB8fCB0cnVlKSIgIiRIT01FLy5idW4vYmluL2J1biIgL29wdC9ob21lYnJldy9iaW4vYnVuIC91c3IvbG9jYWwvYmluL2J1bjsgZG8KICAgIGlmIHJ1bnRpbWVfb2sgIiRjIjsgdGhlbiBlY2hvICIkYyI7IHJldHVybiAwOyBmaQogIGRvbmUKICByZXR1cm4gMQp9CgpSVU5USU1FX0hFTFA9Ik5vZGUuanMgMjIgb3IgbmV3ZXIgKG9yIEJ1bikgaXMgcmVxdWlyZWQgdG8gcnVuIHdoZXJkciB3aXRob3V0IERvY2tlci4KICAgICBJbnN0YWxsIGl0IGZyb20gaHR0cHM6Ly9ub2RlanMub3JnLCBvciBzZXQgaXRzIGFic29sdXRlIHBhdGggaW4gJENPTkY6CiAgICAgICBXSEVSRFJfUlVOVElNRT0vcGF0aC90by9ub2RlIgoKaGVyZHJfYmluKCkgewogIGlmIFsgLW4gIiR7SEVSRFJfQklOX1BBVEg6LX0iIF07IHRoZW4gZWNobyAiJEhFUkRSX0JJTl9QQVRIIgogIGVsaWYgWyAteCAiJEhPTUUvLmxvY2FsL2Jpbi9oZXJkciIgXTsgdGhlbiBlY2hvICIkSE9NRS8ubG9jYWwvYmluL2hlcmRyIgogIGVsc2UgY29tbWFuZCAtdiBoZXJkciAyPi9kZXYvbnVsbCB8fCBlY2hvIGhlcmRyCiAgZmkKfQoKcmVhbF9kaXIoKSB7IChjZCAiJDEiIDI+L2Rldi9udWxsICYmIHB3ZCAtUCkgfHwgZWNobyAiJDEiOyB9CgojIENvbXBvc2UgZm9sZGVyIG9mIHRoZSBgd2hlcmRyYCBjb250YWluZXIsIGVtcHR5IHdoZW4gdGhlcmUgaXMgbm9uZS4KY29udGFpbmVyX2RpcigpIHsKICBkb2NrZXIgaW5zcGVjdCAiJENPTlRBSU5FUiIgLS1mb3JtYXQgJ3t7IGluZGV4IC5Db25maWcuTGFiZWxzICJjb20uZG9ja2VyLmNvbXBvc2UucHJvamVjdC53b3JraW5nX2RpciIgfX0nIDI+L2Rldi9udWxsIHx8IHRydWUKfQoKIyBUcnVlIHdoZW4gdGhlIGB3aGVyZHJgIGNvbnRhaW5lciBiZWxvbmdzIHRvICRESVIgKG9yIGRvZXMgbm90IGV4aXN0IHlldCkuCmNvbnRhaW5lcl9vdXJzKCkgewogIG93bmVyPSIkKGNvbnRhaW5lcl9kaXIpIgogIFsgLXogIiRvd25lciIgXSB8fCBbICIkKHJlYWxfZGlyICIkb3duZXIiKSIgPSAiJChyZWFsX2RpciAiJERJUiIpIiBdCn0KCmNvbXBvc2UoKSB7IGRvY2tlciBjb21wb3NlIC0tcHJvamVjdC1kaXJlY3RvcnkgIiRESVIiIC1mICIkRElSL2RvY2tlci1jb21wb3NlLnltbCIgIiRAIjsgfQoKd2FpdF91cCgpIHsKICBpPTAKICB3aGlsZSBbICIkaSIgLWx0ICIkezE6LTMwfSIgXTsgZG8KICAgIGlmIGFuc3dlcnM7IHRoZW4gcmV0dXJuIDA7IGZpCiAgICBpPSQoKGkgKyAxKSk7IHNsZWVwIDEKICBkb25lCiAgcmV0dXJuIDEKfQoKIyBUaGUgY29tbWFuZHMgb2YgdGhlIG5hdGl2ZSBtb2RlOiB0aGUgaW5zdGFsbGVkIGNvcHksIG9yIHRoZSBjaGVja291dCBpdHNlbGYKIyAoYSBsaW5rZWQgcGx1Z2luIGJ1aWx0IGJ5IGhhbmQsIG9yIGEgcGx1Z2luIGluc3RhbGxlZCBiZWZvcmUgJEFQUCBleGlzdGVkKS4KY2xpX3Jvb3QoKSB7CiAgaWYgWyAtZiAiJEFQUC9iaW4vd2hlcmRyLm1qcyIgXSAmJiBbIC1mICIkQVBQLy5vdXRwdXQvc2VydmVyL2luZGV4Lm1qcyIgXTsgdGhlbiBlY2hvICIkQVBQIjsgZWxzZSBlY2hvICIkUk9PVCI7IGZpCn0KCiMgVGhlIHBlcnNvbiBydW5uaW5nIGBoZXJkciBwbHVnaW4gaW5zdGFsbGAgc2VlcyBvbmx5IEhlcmRyJ3Mgb3duIGxpbmVzOiB0aGUKIyBvdXRwdXQgb2YgYnVpbGQgY29tbWFuZHMgaXMgY2FwdHVyZWQuIEltcG9ydGFudCBsaW5lcyBhbHNvIGdvIHRvIHRoZSB0ZXJtaW5hbC4KdGVsbCgpIHsKICBwcmludGYgJyVzXG4nICIkKiIKICB7IHByaW50ZiAnJXNcbicgIiQqIiA+IC9kZXYvdHR5OyB9IDI+L2Rldi9udWxsIHx8IHRydWUKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYnVpbGQKY21kX2J1aWxkKCkgewogIHRlbGwgIndoZXJkcjogaW5zdGFsbGluZyBpbiAkRElSIgogICMgRmlyc3QgaW5zdGFsbCAobm8gcGx1Z2luLmVudiB5ZXQpOiB0aGUgYnJvd3NlciBvcGVucyBvbiB0aGUgc2V0dXAgZ3VpZGUKICAjIG9uY2Ugd2hlcmRyIHJ1bnMuIFVwZGF0ZXMga2VlcCBwbHVnaW4uZW52IGFuZCBvcGVuIG5vdGhpbmcuCiAgRklSU1RfSU5TVEFMTD0wCiAgWyAtZiAiJENPTkYiIF0gfHwgRklSU1RfSU5TVEFMTD0xCiAgbWtkaXIgLXAgIiRESVIiCiAgcHJpbnRmICclc1xuJyAiJERJUiIgPiAiJFJPT1QvLndoZXJkci1kaXIiCgogIGlmIFsgLXogIiRNT0RFIiBdOyB0aGVuCiAgICBpZiBkb2NrZXJfdXNhYmxlOyB0aGVuIE1PREU9ZG9ja2VyOyBlbHNlIE1PREU9bmF0aXZlOyBmaQogIGZpCiAgY2FzZSAiJE1PREUiIGluCiAgICBkb2NrZXIpIGRvY2tlcl91c2FibGUgfHwgZGllICJXSEVSRFJfTU9ERT1kb2NrZXIsIGJ1dCBEb2NrZXIgQ29tcG9zZSB2MiBpcyBub3QgdXNhYmxlIGJ5ICQoaWQgLXVuKSBvbiB0aGlzIHN5c3RlbS4iIDs7CiAgICBuYXRpdmUpIDs7CiAgICAqKSBkaWUgIldIRVJEUl9NT0RFIG11c3QgYmUgZG9ja2VyIG9yIG5hdGl2ZSAoZ290OiAkTU9ERSkuIiA7OwogIGVzYWMKCiAgaWYgWyAiJE1PREUiID0gImRvY2tlciIgXTsgdGhlbiBidWlsZF9kb2NrZXI7IGVsc2UgYnVpbGRfbmF0aXZlOyBmaQogICMgV3JpdHRlbiBsYXN0OiBhIGZhaWxlZCBidWlsZCBrZWVwcyBubyBoYWxmLW1hZGUgY2hvaWNlLiBSZXdyaXR0ZW4gb24gZWFjaAogICMgaW5zdGFsbCBmcm9tIHRoZSBtZXJnZWQgc2V0dGluZ3MgKGVudmlyb25tZW50IG92ZXIgdGhlIHByZXZpb3VzIGZpbGUpLgogIHdyaXRlX2NvbmYKICBvayAicGx1Z2luLmVudiB3cml0dGVuIChtb2RlOiAkTU9ERSkiCiAgKCBjbWRfc2tpbGwgaW5zdGFsbCApIHx8IHdhcm4gIndoZXJkciBza2lsbCBub3QgbGlua2VkIChvcHRpb25hbCk6IHJ1biAkMCBza2lsbCBpbnN0YWxsIgogICggY21kX2tleSBpbnN0YWxsICkgfHwgd2FybiAibm8gSGVyZHIga2V5IGZvciB0aGUgcGFuZWwgKG9wdGlvbmFsKTogcnVuICQwIGtleSBpbnN0YWxsIgogIGJ1aWxkX3N0YXJ0Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHNraWxsCiMgVGhlICJ3aGVyZHIiIGFnZW50IHNraWxsIChza2lsbHMvd2hlcmRyL1NLSUxMLm1kKTogdGhlIGNvbnZlbnRpb25zIG9mIHRoZQojIFByb2plY3QgcGFuZWwgZm9yIGhlcmRyLXByb2plY3RzIGNvb3JkaW5hdG9ycy4gQ29waWVkIHRvICRESVIvc2tpbGxzL3doZXJkcgojICh0aGUgY2hlY2tvdXQgaXMgYnVpbHQgaW4gYSB0ZW1wb3JhcnkgZm9sZGVyLCB0aGVuIG1vdmVkKSwgdGhlbiBsaW5rZWQgaW50bwojIHRoZSB1c2VyIHNraWxsIGZvbGRlcnM6IENsYXVkZSBDb2RlJ3MgJHtDTEFVREVfQ09ORklHX0RJUjotfi8uY2xhdWRlfS9za2lsbHMsCiMgYW5kIH4vLmFnZW50cy9za2lsbHMsIHJlYWQgYnkgQ29kZXggYW5kIG9tcC4gT25seSBsaW5rcyB0byB0aGF0IGNvcHkgYXJlCiMgZXZlciBjcmVhdGVkIG9yIHJlbW92ZWQ6IGEgIndoZXJkciIgc2tpbGwgb2Ygc29tZW9uZSBlbHNlIGlzIGxlZnQgYWxvbmUuClNLSUxMX0NPUFk9IiRESVIvc2tpbGxzL3doZXJkciIKCnNraWxsX2RpcnMoKSB7CiAgY2xhdWRlPSIke0NMQVVERV9DT05GSUdfRElSOi0kSE9NRS8uY2xhdWRlfSIKICBbIC1kICIkY2xhdWRlIiBdICYmIGVjaG8gIiRjbGF1ZGUvc2tpbGxzIgogIGlmIFsgLWQgIiRIT01FLy5hZ2VudHMiIF0gfHwgWyAtZCAiJEhPTUUvLmNvZGV4IiBdIHx8IFsgLWQgIiRIT01FLy5vbXAiIF07IHRoZW4gZWNobyAiJEhPTUUvLmFnZW50cy9za2lsbHMiOyBmaQogIHJldHVybiAwCn0KCmNtZF9za2lsbCgpIHsKICBjYXNlICIkezE6LX0iIGluCiAgICBpbnN0YWxsKQogICAgICBta2RpciAtcCAiJFNLSUxMX0NPUFkiCiAgICAgIGNwICIkUk9PVC9za2lsbHMvd2hlcmRyL1NLSUxMLm1kIiAiJFNLSUxMX0NPUFkvU0tJTEwubWQiCiAgICAgIHNraWxsX2RpcnMgfCB3aGlsZSBJRlM9IHJlYWQgLXIgZDsgZG8KICAgICAgICBsaW5rPSIkZC93aGVyZHIiCiAgICAgICAgaWYgWyAtTCAiJGxpbmsiIF0gJiYgWyAiJChyZWFkbGluayAiJGxpbmsiKSIgPSAiJFNLSUxMX0NPUFkiIF07IHRoZW4gb2sgInNraWxsIGFscmVhZHkgbGlua2VkOiAkbGluayIKICAgICAgICBlbGlmIFsgLWUgIiRsaW5rIiBdIHx8IFsgLUwgIiRsaW5rIiBdOyB0aGVuIHdhcm4gInNraWxsIG5vdCBsaW5rZWQ6ICRsaW5rIGFscmVhZHkgZXhpc3RzIChsZWZ0IGFsb25lKSIKICAgICAgICBlbHNlIG1rZGlyIC1wICIkZCIgJiYgbG4gLXMgIiRTS0lMTF9DT1BZIiAiJGxpbmsiICYmIG9rICJza2lsbCBsaW5rZWQ6ICRsaW5rIgogICAgICAgIGZpCiAgICAgIGRvbmUKICAgICAgOzsKICAgIHVuaW5zdGFsbCkKICAgICAgc2tpbGxfZGlycyB8IHdoaWxlIElGUz0gcmVhZCAtciBkOyBkbwogICAgICAgIGxpbms9IiRkL3doZXJkciIKICAgICAgICBpZiBbIC1MICIkbGluayIgXSAmJiBbICIkKHJlYWRsaW5rICIkbGluayIpIiA9ICIkU0tJTExfQ09QWSIgXTsgdGhlbiBybSAiJGxpbmsiICYmIG9rICJza2lsbCB1bmxpbmtlZDogJGxpbmsiOyBmaQogICAgICBkb25lCiAgICAgIHJtIC1yZiAiJFNLSUxMX0NPUFkiCiAgICAgIHJtZGlyICIkRElSL3NraWxscyIgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgICA7OwogICAgKikgZGllICJ1c2FnZTogJDAgc2tpbGwgaW5zdGFsbHx1bmluc3RhbGwiIDs7CiAgZXNhYwp9CgojIExhc3Qgc3RlcCBvZiB0aGUgaW5zdGFsbDogc3RhcnQgd2hlcmRyIChvciByZXN0YXJ0IHRoZSBvbmUgdGhpcyBwbHVnaW4KIyBydW5zLCBvbiBhbiB1cGRhdGUpLiBOZXZlciBmYWlscyB0aGUgaW5zdGFsbDogYSB3aGVyZHIgdGhhdCBjYW5ub3Qgc3RhcnQgaXMKIyByZXBvcnRlZCB3aXRoIHdoYXQgdG8gZG8sIHRoZSBwbHVnaW4gc3RheXMgaW5zdGFsbGVkLgpidWlsZF9zdGFydCgpIHsKICBzZXQgK2UKICBvdXQ9IiQoIChjbWRfc3RhcnQpIDI+JjEgKSIKICBjb2RlPSQ/CiAgc2V0IC1lCiAgcHJpbnRmICclc1xuJyAiJG91dCIKICBpZiBbICIkY29kZSIgLWVxIDAgXSAmJiBhbnN3ZXJzOyB0aGVuCiAgICAjIGh0dHBzOi8vd2hlcmRyLmRldi9pbnN0YWxsIHByaW50cyBpdHMgb3duIHN1bW1hcnkgKFdIRVJEUl9JTlNUQUxMRVI9MSkuCiAgICBxdWlldD0wCiAgICBbICIke1dIRVJEUl9JTlNUQUxMRVI6LTB9IiA9IDEgXSAmJiBxdWlldD0xCiAgICBbICIkcXVpZXQiID0gMSBdIHx8IHRlbGwgIiIKICAgIFsgIiRxdWlldCIgPSAxIF0gfHwgdGVsbCAi4pyTIHdoZXJkciBpcyBydW5uaW5nIOKGkiAkVVJMIgogICAgaWYgWyAiJHtGSVJTVF9JTlNUQUxMOi0wfSIgPSAxIF07IHRoZW4KICAgICAgaWYgb3Blbl9icm93c2VyICIkVVJMLyMvc2V0dXAiOyB0aGVuIFsgIiRxdWlldCIgPSAxIF0gfHwgdGVsbCAiICBTZXR1cCBndWlkZSBvcGVuZWQgaW4geW91ciBicm93c2VyIgogICAgICBlbHNlIFsgIiRxdWlldCIgPSAxIF0gfHwgdGVsbCAiICBTZXR1cCBndWlkZTogb3BlbiAkVVJMLyMvc2V0dXAgaW4gYSBicm93c2VyIG9uIHRoaXMgY29tcHV0ZXIiCiAgICAgIGZpCiAgICBmaQogICAgWyAiJHF1aWV0IiA9IDEgXSB8fCB0ZWxsICIgIFBob25lOiBvcGVuIHRoZSB3aGVyZHIgcGFuZWwgaW4gSGVyZHIgKGtleSBhYm92ZSwgb3IgaGVyZHIgcGx1Z2luIGFjdGlvbiBpbnZva2UgcGFuZWwgLS1wbHVnaW4gJFBMVUdJTl9JRCkiCiAgZWxzZQogICAgdGVsbCAiIgogICAgdGVsbCAiISB3aGVyZHIgaXMgaW5zdGFsbGVkIGJ1dCBkaWQgbm90IHN0YXJ0OiIKICAgIHByaW50ZiAnJXNcbicgIiRvdXQiIHwgdGFpbCAtbiA4IHwgd2hpbGUgSUZTPSByZWFkIC1yIGw7IGRvIHRlbGwgIiAgICAkbCI7IGRvbmUKICAgIHRlbGwgIiAgT3BlbiB0aGUgd2hlcmRyIHBhbmVsIGluIEhlcmRyLCB0aGVuIHByZXNzIFMgdG8gc3RhcnQgaXQgb3IgTCBmb3IgaXRzIGxvZy4iCiAgZmkKfQoKd3JpdGVfY29uZigpIHsKICB7CiAgICBlY2hvICIjIHdoZXJkciBIZXJkciBwbHVnaW4gc2V0dGluZ3MgKGhlcmRyLXBsdWdpbi5zaCkuIgogICAgZWNobyAiIyBUbyBzd2l0Y2ggbW9kZSwgc2V0IFdIRVJEUl9NT0RFIGFuZCBydW46IGhlcmRyIHBsdWdpbiBpbnN0YWxsICRTT1VSQ0UiCiAgICBlY2hvICJXSEVSRFJfTU9ERT0kTU9ERSIKICAgIGVjaG8gIldIRVJEUl9QT1JUPSRQT1JUIgogICAgZWNobyAiIyBOYXRpdmUgbW9kZTogcHJpdmF0ZSBIVFRQUyBhZGRyZXNzICh0YWlsc2NhbGUgc2VydmUpLCBmb3IgcHVzaCBub3RpZmljYXRpb25zLiIKICAgIGVjaG8gIkFQUF9VUkw9JHtBUFBfVVJMOi19IgogICAgaWYgWyAiJE1PREUiID0gIm5hdGl2ZSIgXTsgdGhlbgogICAgICBlY2hvICIjIE5hdGl2ZSBtb2RlOiBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBub2RlICgyMispIG9yIGJ1biB0aGF0IHJ1bnMgd2hlcmRyLiIKICAgICAgZWNobyAiV0hFUkRSX1JVTlRJTUU9JFJVTlRJTUUiCiAgICBmaQogIH0gPiAiJENPTkYiCn0KCiMgVGhlIHB1Ymxpc2hlZCBucG0gcGFja2FnZSBvZiB0aGlzIGV4YWN0IHZlcnNpb24gaG9sZHMgdGhlIGJ1aWx0IHNlcnZlcjoKIyBkb3dubG9hZCBpdCBpbnN0ZWFkIG9mIGJ1aWxkaW5nIChubyBucG0gY2kpLiBGYWlscyB3aGVuIGl0IGlzIG5vdCBwdWJsaXNoZWQuCmZldGNoX3ByZWJ1aWx0KCkgewogIGNvbW1hbmQgLXYgY3VybCA+L2Rldi9udWxsIDI+JjEgJiYgY29tbWFuZCAtdiB0YXIgPi9kZXYvbnVsbCAyPiYxIHx8IHJldHVybiAxCiAgdmVyc2lvbj0iJChzZWQgLW4gJ3MvXnZlcnNpb24gPSAiXCguKlwpIiQvXDEvcCcgIiRST09UL2hlcmRyLXBsdWdpbi50b21sIiB8IGhlYWQgLW4gMSkiCiAgdG1wPSIkKG1rdGVtcCAtZCkiCiAgaWYgY3VybCAtZnNTTCAtLW1heC10aW1lIDEyMCAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvd2hlcmRyLy0vd2hlcmRyLSR2ZXJzaW9uLnRneiIgLW8gIiR0bXAvd2hlcmRyLnRneiIgMj4vZGV2L251bGwgXAogICAgJiYgdGFyIC14emYgIiR0bXAvd2hlcmRyLnRneiIgLUMgIiR0bXAiIFwKICAgICYmIFsgLWYgIiR0bXAvcGFja2FnZS8ub3V0cHV0L3NlcnZlci9pbmRleC5tanMiIF07IHRoZW4KICAgIHJtIC1yZiAiJFJPT1QvLm91dHB1dCIKICAgIG12ICIkdG1wL3BhY2thZ2UvLm91dHB1dCIgIiRST09ULy5vdXRwdXQiCiAgICBybSAtcmYgIiR0bXAiCiAgICBvayAid2hlcmRyICR2ZXJzaW9uIGRvd25sb2FkZWQgKHByZWJ1aWx0IG5wbSBwYWNrYWdlKSIKICAgIHJldHVybiAwCiAgZmkKICBybSAtcmYgIiR0bXAiCiAgcmV0dXJuIDEKfQoKIyBxcmNvZGUtdGVybWluYWwgKHRoZSBwYW5lbCdzIFFSIGNvZGUpLCB0aGUgb25seSBwYWNrYWdlIHRoZSBjb21tYW5kcyBuZWVkCiMgYXQgcnVudGltZSwgd2hlbiB0aGUgZm9sZGVyIGRvZXMgbm90IGhhdmUgaXQgeWV0IChubyBucG0gY2kgd2FzIHJ1bikuCmZldGNoX3FyKCkgewogIFsgLWYgIiQxL25vZGVfbW9kdWxlcy9xcmNvZGUtdGVybWluYWwvcGFja2FnZS5qc29uIiBdICYmIHJldHVybiAwCiAgY29tbWFuZCAtdiBjdXJsID4vZGV2L251bGwgMj4mMSAmJiBjb21tYW5kIC12IHRhciA+L2Rldi9udWxsIDI+JjEgfHwgcmV0dXJuIDAKICB0bXA9IiQobWt0ZW1wIC1kKSIKICBpZiBjdXJsIC1mc1NMIC0tbWF4LXRpbWUgNjAgaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcXJjb2RlLXRlcm1pbmFsLy0vcXJjb2RlLXRlcm1pbmFsLTAuMTIuMC50Z3ogLW8gIiR0bXAvcXIudGd6IiAyPi9kZXYvbnVsbCBcCiAgICAmJiB0YXIgLXh6ZiAiJHRtcC9xci50Z3oiIC1DICIkdG1wIjsgdGhlbgogICAgbWtkaXIgLXAgIiQxL25vZGVfbW9kdWxlcyIKICAgIHJtIC1yZiAiJDEvbm9kZV9tb2R1bGVzL3FyY29kZS10ZXJtaW5hbCIKICAgIG12ICIkdG1wL3BhY2thZ2UiICIkMS9ub2RlX21vZHVsZXMvcXJjb2RlLXRlcm1pbmFsIgogIGVsc2UKICAgIHdhcm4gIk5vIFFSIGNvZGUgaW4gdGhlIHBhbmVsIChxcmNvZGUtdGVybWluYWwgY291bGQgbm90IGJlIGRvd25sb2FkZWQpLiIKICBmaQogIHJtIC1yZiAiJHRtcCIKfQoKYnVpbGRfbmF0aXZlKCkgewogIFJVTlRJTUU9IiQoZmluZF9ydW50aW1lKSIgfHwgZGllICIkUlVOVElNRV9IRUxQIgogIG9rICJSdW50aW1lOiAkUlVOVElNRSAoJCgiJFJVTlRJTUUiIC0tdmVyc2lvbiAyPi9kZXYvbnVsbCkpIgogIGlmIGZldGNoX3ByZWJ1aWx0OyB0aGVuCiAgICBpbnN0YWxsX2FwcAogICAgcmV0dXJuIDAKICBmaQogIGNhc2UgIiQoYmFzZW5hbWUgIiRSVU5USU1FIikiIGluCiAgICBidW4pIGRpZSAiVGhlIHByZWJ1aWx0IHdoZXJkciBwYWNrYWdlIGNvdWxkIG5vdCBiZSBkb3dubG9hZGVkLCBhbmQgYnVpbGRpbmcgaXQgbmVlZHMgTm9kZS5qcyAyMiB3aXRoIG5wbS4KICAgICBDaGVjayB0aGUgbmV0d29yaywgb3IgaW5zdGFsbCBOb2RlLmpzIDIyLCB0aGVuIGluc3RhbGwgdGhlIHBsdWdpbiBhZ2Fpbi4iIDs7CiAgZXNhYwogIGJpbmRpcj0iJChkaXJuYW1lICIkUlVOVElNRSIpIgogIFsgLXggIiRiaW5kaXIvbnBtIiBdIHx8IGNvbW1hbmQgLXYgbnBtID4vZGV2L251bGwgMj4mMSB8fCBkaWUgIm5wbSBpcyBtaXNzaW5nIChpdCBjb21lcyB3aXRoIE5vZGUuanMpLiIKICB0ZWxsICJ3aGVyZHI6IGJ1aWxkaW5nIChhIGZldyBtaW51dGVzIHRoZSBmaXJzdCB0aW1lKeKApiIKICAoCiAgICBjZCAiJFJPT1QiCiAgICBQQVRIPSIkYmluZGlyOiRQQVRIIiBucG0gY2kgLS1uby1hdWRpdCAtLW5vLWZ1bmQKICAgIFBBVEg9IiRiaW5kaXI6JFBBVEgiIG5wbSBydW4gYnVpbGQKICApCiAgb2sgIndoZXJkciBidWlsdCBpbiB0aGUgcGx1Z2luIGZvbGRlciIKICBpbnN0YWxsX2FwcAp9CgojIENvcGllcyB0aGUgY29tbWFuZHMgYW5kIHRoZSBidWlsdCBzZXJ2ZXIgdG8gJEFQUCwgd2hpY2ggb3V0bGl2ZXMgdGhpcwojIGNoZWNrb3V0LiBBIHdoZXJkciB0aGlzIHBsdWdpbiBydW5zIGZyb20gdGhlIHByZXZpb3VzIGNvcHkgaXMgc3RvcHBlZCBmb3IKIyB0aGUgc3dhcDsgYnVpbGRfc3RhcnQgc3RhcnRzIHRoZSBuZXcgb25lLgppbnN0YWxsX2FwcCgpIHsKICAjIE5pdHJvIGxpbmtzIHNvbWUgcGFja2FnZXMgKHRzbGliKSB0byBpdHMgb3duIGZvbGRlcjogY29waWVzLCBub3QgbGlua3MuCiAgaWYgWyAtZCAiJFJPT1QvLm91dHB1dC9zZXJ2ZXIvbm9kZV9tb2R1bGVzIiBdOyB0aGVuICIkUlVOVElNRSIgIiRST09UL3NjcmlwdHMvcGFjay1vdXRwdXQubWpzIiA+L2Rldi9udWxsOyBmaQogIG5ldz0iJEFQUC5uZXciCiAgcm0gLXJmICIkbmV3IgogIG1rZGlyIC1wICIkbmV3IgogIGNwIC1SICIkUk9PVC9iaW4iICIkUk9PVC8ub3V0cHV0IiAiJFJPT1QvcGFja2FnZS5qc29uIiAiJG5ldy8iCiAgaWYgWyAtZCAiJFJPT1Qvbm9kZV9tb2R1bGVzL3FyY29kZS10ZXJtaW5hbCIgXTsgdGhlbgogICAgbWtkaXIgLXAgIiRuZXcvbm9kZV9tb2R1bGVzIgogICAgY3AgLVIgIiRST09UL25vZGVfbW9kdWxlcy9xcmNvZGUtdGVybWluYWwiICIkbmV3L25vZGVfbW9kdWxlcy8iCiAgZmkKICBmZXRjaF9xciAiJG5ldyIKICAjIFRoZSB3aGVyZHIgdGhpcyBwbHVnaW4gcnVucyAoZnJvbSB0aGUgcHJldmlvdXMgY29weSwgb3IgZnJvbSBhbiBvbGRlcgogICMgcGx1Z2luIGNoZWNrb3V0KTogc3RvcHBlZCBmb3IgdGhlIHN3YXAsIHN0YXJ0ZWQgYWdhaW4gYnkgYnVpbGRfc3RhcnQuCiAgaWYgWyAtZiAiJERJUi93aGVyZHIucGlkIiBdIHx8IFsgLWYgIiRBUFAvYmluL3doZXJkci5tanMiIF07IHRoZW4gY2xpIHN0b3AgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWU7IGZpCiAgcm0gLXJmICIkQVBQLm9sZCIKICBpZiBbIC1kICIkQVBQIiBdOyB0aGVuIG12ICIkQVBQIiAiJEFQUC5vbGQiOyBmaQogIG12ICIkbmV3IiAiJEFQUCIKICBybSAtcmYgIiRBUFAub2xkIgogIG9rICJ3aGVyZHIgJChzZWQgLW4gJ3MvXiAqInZlcnNpb24iOiAqIlwoLipcKSIsJC9cMS9wJyAiJEFQUC9wYWNrYWdlLmpzb24iIHwgaGVhZCAtbiAxKSBpbnN0YWxsZWQgaW4gJEFQUCIKfQoKYnVpbGRfZG9ja2VyKCkgewogIG9rICJEb2NrZXIgJChkb2NrZXIgdmVyc2lvbiAtLWZvcm1hdCAne3suU2VydmVyLlZlcnNpb259fScgMj4vZGV2L251bGwgfHwgZWNobyAnPycpIgogIHN0YW1wPSIkRElSLy5jb21wb3NlLWZyb20tcGx1Z2luIgogIGlmIFsgISAtZiAiJERJUi9kb2NrZXItY29tcG9zZS55bWwiIF07IHRoZW4KICAgIGNwICIkUk9PVC9kb2NrZXItY29tcG9zZS55bWwiICIkRElSL2RvY2tlci1jb21wb3NlLnltbCIKICAgIGNrc3VtIDwgIiRESVIvZG9ja2VyLWNvbXBvc2UueW1sIiA+ICIkc3RhbXAiCiAgICBvayAiZG9ja2VyLWNvbXBvc2UueW1sIGNvcGllZCIKICBlbGlmIGNtcCAtcyAiJFJPT1QvZG9ja2VyLWNvbXBvc2UueW1sIiAiJERJUi9kb2NrZXItY29tcG9zZS55bWwiOyB0aGVuCiAgICBvayAiZG9ja2VyLWNvbXBvc2UueW1sIGlzIHVwIHRvIGRhdGUiCiAgZWxpZiBbIC1mICIkc3RhbXAiIF0gJiYgWyAiJChja3N1bSA8ICIkRElSL2RvY2tlci1jb21wb3NlLnltbCIpIiA9ICIkKGNhdCAiJHN0YW1wIikiIF07IHRoZW4KICAgICMgVW5jaGFuZ2VkIHNpbmNlIHRoZSBwbHVnaW4gd3JvdGUgaXQ6IHNhZmUgdG8gcmVmcmVzaC4KICAgIGNwICIkUk9PVC9kb2NrZXItY29tcG9zZS55bWwiICIkRElSL2RvY2tlci1jb21wb3NlLnltbCIKICAgIGNrc3VtIDwgIiRESVIvZG9ja2VyLWNvbXBvc2UueW1sIiA+ICIkc3RhbXAiCiAgICBvayAiZG9ja2VyLWNvbXBvc2UueW1sIHVwZGF0ZWQiCiAgZWxzZQogICAgd2FybiAiS2VlcGluZyB5b3VyIGVkaXRlZCBkb2NrZXItY29tcG9zZS55bWwgKHRoZSBuZXcgb25lIGlzICRST09UL2RvY2tlci1jb21wb3NlLnltbCkuIgogIGZpCiAgaWYgWyAhIC1mICIkRElSLy5lbnYiIF07IHRoZW4KICAgIGhlcmRyPSIkKGhlcmRyX2JpbikiCiAgICB7CiAgICAgIGVjaG8gIiMgd2hlcmRyIHNldHRpbmdzLCByZWFkIGJ5IGRvY2tlciBjb21wb3NlIChzZWUgLmVudi5leGFtcGxlIGluIHRoZSByZXBvc2l0b3J5KS4iCiAgICAgIGVjaG8gIkhPU1RfSE9NRT0kSE9NRSIKICAgICAgZWNobyAiUFVJRD0kKGlkIC11KSIKICAgICAgZWNobyAiUEdJRD0kKGlkIC1nKSIKICAgICAgZWNobyAiUE9SVD0kUE9SVCIKICAgICAgZWNobyAiIyBQcml2YXRlIEhUVFBTIGFkZHJlc3MgKHRhaWxzY2FsZSBzZXJ2ZSksIG5lZWRlZCBmb3IgcHVzaCBub3RpZmljYXRpb25zLiIKICAgICAgZWNobyAiQVBQX1VSTD0ke0FQUF9VUkw6LWh0dHA6Ly9sb2NhbGhvc3Q6JFBPUlQvfSIKICAgICAgZWNobyAiVFo9JHtUWjotVVRDfSIKICAgICAgaWYgWyAiJGhlcmRyIiAhPSAiJEhPTUUvLmxvY2FsL2Jpbi9oZXJkciIgXTsgdGhlbiBlY2hvICJIRVJEUl9CSU49JGhlcmRyIjsgZmkKICAgIH0gPiAiJERJUi8uZW52IgogICAgb2sgIi5lbnYgY3JlYXRlZCIKICBlbHNlCiAgICBvayAiLmVudiBrZXB0IgogIGZpCiAgY29tcG9zZSBwdWxsIC0tcXVpZXQgfHwgZGllICJDb3VsZCBub3QgcHVsbCB0aGUgd2hlcmRyIGltYWdlLiBDaGVjayB0aGUgbmV0d29yaywgdGhlbiBpbnN0YWxsIHRoZSBwbHVnaW4gYWdhaW4uIgogIG9rICJJbWFnZSBwdWxsZWQiCiAgIyBUaGUgcGFuZWwgcnVucyBmcm9tIHRoZSBjaGVja291dCB3aXRoIG5vZGUgd2hlbiB0aGVyZSBpcyBvbmUuCiAgZmV0Y2hfcXIgIiRST09UIgp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzdGFydApjbWRfc3RhcnQoKSB7CiAgaWYgYW5zd2VyczsgdGhlbgogICAgc2F5ICJ3aGVyZHI6IHNvbWV0aGluZyBhbHJlYWR5IGFuc3dlcnMgb24gcG9ydCAkUE9SVCwgbm90aGluZyB0byBzdGFydCAoJFVSTCkuIgogICAgcmV0dXJuIDAKICBmaQogIGNhc2UgIiRNT0RFIiBpbgogICAgZG9ja2VyKSBzdGFydF9kb2NrZXIgOzsKICAgIG5hdGl2ZSkgc3RhcnRfbmF0aXZlIDs7CiAgICAqKSBkaWUgIndoZXJkciBwbHVnaW4gaXMgbm90IHNldCB1cCAoJENPTkYgaXMgbWlzc2luZyk6IGluc3RhbGwgaXQgYWdhaW4gd2l0aCBoZXJkciBwbHVnaW4gaW5zdGFsbCAkU09VUkNFLiIgOzsKICBlc2FjCiAgaWYgWyAiJE1PREUiID0gIm5hdGl2ZSIgXTsgdGhlbiByZXR1cm4gMDsgZmkKICBpZiB3YWl0X3VwIDQ1OyB0aGVuCiAgICBzYXkgIndoZXJkciBpcyBydW5uaW5nOiAkVVJMIgogIGVsc2UKICAgIHdhcm4gIndoZXJkciBkb2VzIG5vdCBhbnN3ZXIgb24gcG9ydCAkUE9SVCB5ZXQuIExvZzogJChsb2dfaGludCkiCiAgICBleGl0IDEKICBmaQp9CgojIE5hdGl2ZSBtb2RlOiB0aGUgd2hlcmRyIGNvbW1hbmQgKGJpbi93aGVyZHIubWpzKSBkb2VzIHRoZSB3b3JrLCB3aXRoIHRoZQojIHJ1bnRpbWUgc2F2ZWQgYXQgaW5zdGFsbDsgaXQgc2F5cyAic3RhcnRlZCIgb25seSBvbmNlIHRoZSBwb3J0IGFuc3dlcnMuCmVuc3VyZV9ydW50aW1lKCkgewogIGlmICEgcnVudGltZV9vayAiJFJVTlRJTUUiOyB0aGVuCiAgICBzYXZlZD0iJFJVTlRJTUUiCiAgICBSVU5USU1FPSIkKGZpbmRfcnVudGltZSkiIHx8IGRpZSAiJHtzYXZlZDorVGhlIHNhdmVkIHJ1bnRpbWUgKCRzYXZlZCkgaXMgZ29uZS4gfSRSVU5USU1FX0hFTFAiCiAgICB3YXJuICIke3NhdmVkOiskc2F2ZWQgaXMgZ29uZTogfXVzaW5nICRSVU5USU1FIChzYXZlZCBpbiAkQ09ORikuIgogICAgd3JpdGVfY29uZgogIGZpCn0KCmNsaSgpIHsKICBlbnN1cmVfcnVudGltZQogIHNvY2s9IiR7SEVSRFJfU09DS0VUX1BBVEg6LX0iCiAgIyBBIHBsdWdpbiBzdGFydGVkIGZyb20gYSBuYW1lZCBIZXJkciBzZXNzaW9uIGRyaXZlcyB0aGF0IHNlc3Npb24uCiAgc2Vzc2lvbj0iIgogIGNhc2UgIiRzb2NrIiBpbiAqL3Nlc3Npb25zLyovaGVyZHIuc29jaykgc2Vzc2lvbj0iJChiYXNlbmFtZSAiJChkaXJuYW1lICIkc29jayIpIikiIDs7IGVzYWMKICAoCiAgICBjZCAiJERJUiIKICAgIEhFUkRSX0JJTj0iJChoZXJkcl9iaW4pIgogICAgIyBUaGUgcnVudGltZSdzIGZvbGRlciBmaXJzdDogdG9vbHMgaXQgc3RhcnRzIGZpbmQgdGhlIHNhbWUgbm9kZS4KICAgIFBBVEg9IiQoZGlybmFtZSAiJFJVTlRJTUUiKTokUEFUSCIKICAgIGV4cG9ydCBQQVRIIFdIRVJEUl9ESVI9IiRESVIiIFdIRVJEUl9SVU5USU1FPSIkUlVOVElNRSIgSE9TVD0xMjcuMC4wLjEgUE9SVCBIRVJEUl9CSU4KICAgIGlmIFsgLW4gIiRzZXNzaW9uIiBdOyB0aGVuIGV4cG9ydCBIRVJEUl9XRUJfU0VTU0lPTj0iJHNlc3Npb24iOyBmaQogICAgaWYgWyAtbiAiJHNvY2siIF07IHRoZW4gZXhwb3J0IEhFUkRSX1NPQ0s9IiRzb2NrIjsgZmkKICAgIGlmIFsgLW4gIiR7QVBQX1VSTDotfSIgXTsgdGhlbiBleHBvcnQgQVBQX1VSTDsgZmkKICAgIGV4ZWMgIiRSVU5USU1FIiAiJChjbGlfcm9vdCkvYmluL3doZXJkci5tanMiICIkQCIKICApCn0KCnN0YXJ0X25hdGl2ZSgpIHsKICBbIC1mICIkKGNsaV9yb290KS8ub3V0cHV0L3NlcnZlci9pbmRleC5tanMiIF0gfHwgZGllICJ3aGVyZHIgaXMgbm90IGJ1aWx0OiBpbnN0YWxsIHRoZSBwbHVnaW4gYWdhaW4gKGhlcmRyIHBsdWdpbiBpbnN0YWxsICRTT1VSQ0UgLS15ZXMpLiIKICBta2RpciAtcCAiJERJUiIKICBjbGkgc3RhcnQKfQoKc3RhcnRfZG9ja2VyKCkgewogIFsgLWYgIiRESVIvZG9ja2VyLWNvbXBvc2UueW1sIiBdIHx8IGRpZSAiJERJUi9kb2NrZXItY29tcG9zZS55bWwgaXMgbWlzc2luZzogcnVuIHRoZSBVcGRhdGUgYWN0aW9uLiIKICBpZiAhIGNvbnRhaW5lcl9vdXJzOyB0aGVuCiAgICBzYXkgIndoZXJkcjogdGhlIFwiJENPTlRBSU5FUlwiIGNvbnRhaW5lciBiZWxvbmdzIHRvICQoY29udGFpbmVyX2Rpcik7IHN0YXJ0IGl0IGZyb20gdGhlcmUuIE5vdGhpbmcgZG9uZS4iCiAgICBleGl0IDAKICBmaQogICMgQ3JlYXRlZCBhcyB0aGlzIHVzZXIgZmlyc3Q6IERvY2tlciB3b3VsZCBjcmVhdGUgbWlzc2luZyBiaW5kIG1vdW50cyBhcyByb290LgogIG1rZGlyIC1wICIkRElSL2RhdGEiICIkSE9NRS8uY29uZmlnL2hlcmRyIiAiJEhPTUUvLmxvY2FsL3N0YXRlL2hlcmRyL2NsaWVudCIgXAogICAgIiRIT01FLy5jYWNoZS9oZXJkci13ZWIiICIkSE9NRS8uaGVyZHItcHJvamVjdHMiCiAgY29tcG9zZSB1cCAtZCAtLXJlbW92ZS1vcnBoYW5zCiAgb2sgImNvbnRhaW5lciBzdGFydGVkIgp9Cgpsb2dfaGludCgpIHsgZWNobyAiY2QgJERJUiAmJiBkb2NrZXIgY29tcG9zZSBsb2dzIjsgfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHN0b3AKY21kX3N0b3AoKSB7CiAgY2FzZSAiJE1PREUiIGluCiAgICBuYXRpdmUpIGNsaSBzdG9wOyByZXR1cm4gMCA7OwogICAgZG9ja2VyKQogICAgICBpZiBbIC1uICIkKGNvbnRhaW5lcl9kaXIpIiBdICYmIGNvbnRhaW5lcl9vdXJzOyB0aGVuCiAgICAgICAgY29tcG9zZSBzdG9wCiAgICAgICAgc2F5ICJ3aGVyZHIgc3RvcHBlZCAoY29udGFpbmVyICRDT05UQUlORVIpLiIKICAgICAgICByZXR1cm4gMAogICAgICBmaQogICAgICA7OwogIGVzYWMKICBpZiBhbnN3ZXJzOyB0aGVuCiAgICBzYXkgIndoZXJkciBvbiBwb3J0ICRQT1JUIHdhcyBub3Qgc3RhcnRlZCBieSB0aGlzIHBsdWdpbjogbGVmdCBydW5uaW5nLiIKICBlbHNlCiAgICBzYXkgIndoZXJkciBpcyBub3QgcnVubmluZy4iCiAgZmkKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzdGF0dXMKY21kX3N0YXR1cygpIHsKICBpZiBbICIkTU9ERSIgPSAibmF0aXZlIiBdOyB0aGVuCiAgICBjbGkgc3RhdHVzCiAgICBzYXkgIiAgUGx1Z2luICAgbmF0aXZlIG1vZGUsIHNldHRpbmdzIGluICRDT05GIgogICAgcmV0dXJuIDAKICBmaQogIHNheSAiTW9kZTogICAgJHtNT0RFOi1ub3Qgc2V0IHVwfSIKICBzYXkgIkZvbGRlcjogICRESVIiCiAgaWYgYW5zd2VyczsgdGhlbiBzYXkgIlBvcnQ6ICAgICRQT1JUIGFuc3dlcnMgKCRVUkwpIjsgZWxzZSBzYXkgIlBvcnQ6ICAgICRQT1JUIGZyZWUiOyBmaQogIGlmIFsgIiRNT0RFIiA9ICJkb2NrZXIiIF07IHRoZW4KICAgIG93bmVyPSIkKGNvbnRhaW5lcl9kaXIpIgogICAgaWYgWyAteiAiJG93bmVyIiBdOyB0aGVuIHNheSAiQ29udGFpbmVyOiBub25lIgogICAgZWxpZiBjb250YWluZXJfb3VyczsgdGhlbiBzYXkgIkNvbnRhaW5lcjogJENPTlRBSU5FUiAoJChkb2NrZXIgaW5zcGVjdCAiJENPTlRBSU5FUiIgLS1mb3JtYXQgJ3t7LlN0YXRlLlN0YXR1c319JyAyPi9kZXYvbnVsbCkpLCBtYW5hZ2VkIGJ5IHRoZSBwbHVnaW4iCiAgICBlbHNlIHNheSAiQ29udGFpbmVyOiAkQ09OVEFJTkVSLCBtYW5hZ2VkIGZyb20gJG93bmVyIChsZWZ0IGFsb25lKSIKICAgIGZpCiAgZmkKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGxvZ3MsIGRvY3RvcgpjbWRfbG9ncygpIHsKICBjYXNlICIkTU9ERSIgaW4KICAgIG5hdGl2ZSkgY2xpIGxvZ3MgLS1mb2xsb3cgOzsKICAgIGRvY2tlcikgY29tcG9zZSBsb2dzIC0tZm9sbG93IC0tdGFpbCAxMDAgOzsKICAgICopIGRpZSAid2hlcmRyIHBsdWdpbiBpcyBub3Qgc2V0IHVwOiBpbnN0YWxsIGl0IGFnYWluIHdpdGggaGVyZHIgcGx1Z2luIGluc3RhbGwgJFNPVVJDRS4iIDs7CiAgZXNhYwp9CgpjbWRfZG9jdG9yKCkgewogIGlmIFsgIiRNT0RFIiA9ICJuYXRpdmUiIF07IHRoZW4gY2xpIGRvY3RvcjsgZWxzZSBjbWRfc3RhdHVzOyBmaQp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gb3BlbgojIFRoZSBkZWZhdWx0IGJyb3dzZXIsIG9uIGEgY29tcHV0ZXIgd2l0aCBhIHNjcmVlbiBvbmx5OiBgb3BlbmAgb24gbWFjT1MsCiMgYHhkZy1vcGVuYCBvbiBMaW51eCB3aXRoIGEgZGlzcGxheS4gRmFpbHMgKG9wZW5zIG5vdGhpbmcpIG9uIGEgaGVhZGxlc3Mgc2VydmVyLAojIG9yIHdpdGggV0hFUkRSX05PX0JST1dTRVI9MSAoc2V0IGJ5IGh0dHBzOi8vd2hlcmRyLmRldi9pbnN0YWxsIG92ZXIgU1NIKS4Kb3Blbl9icm93c2VyKCkgewogIGlmIFsgIiR7V0hFUkRSX05PX0JST1dTRVI6LTB9IiA9ICIxIiBdOyB0aGVuIHJldHVybiAxCiAgZWxpZiBbICIkKHVuYW1lIC1zKSIgPSAiRGFyd2luIiBdICYmIGNvbW1hbmQgLXYgb3BlbiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gb3BlbiAiJDEiCiAgZWxpZiBbIC1uICIke0RJU1BMQVk6LX0ke1dBWUxBTkRfRElTUExBWTotfSIgXSAmJiBjb21tYW5kIC12IHhkZy1vcGVuID4vZGV2L251bGwgMj4mMTsgdGhlbiB4ZGctb3BlbiAiJDEiID4vZGV2L251bGwgMj4mMSAmCiAgZWxzZSByZXR1cm4gMQogIGZpCn0KCmNtZF9vcGVuKCkgewogIG9wZW5fYnJvd3NlciAiJFVSTCIgfHwgdHJ1ZQogIHNheSAiJFVSTCIKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB1cGRhdGUKY21kX3VwZGF0ZSgpIHsKICBjYXNlICIkTU9ERSIgaW4KICAgIGRvY2tlcikKICAgICAgY29udGFpbmVyX291cnMgfHwgZGllICJUaGUgXCIkQ09OVEFJTkVSXCIgY29udGFpbmVyIGJlbG9uZ3MgdG8gJChjb250YWluZXJfZGlyKTogdXBkYXRlIGl0IGZyb20gdGhlcmUuIgogICAgICBjb21wb3NlIHB1bGwgLS1xdWlldAogICAgICBpZiBbICIkKGRvY2tlciBpbnNwZWN0ICIkQ09OVEFJTkVSIiAtLWZvcm1hdCAne3suU3RhdGUuUnVubmluZ319JyAyPi9kZXYvbnVsbCkiID0gInRydWUiIF07IHRoZW4KICAgICAgICBjb21wb3NlIHVwIC1kIC0tcmVtb3ZlLW9ycGhhbnMKICAgICAgICBzYXkgIndoZXJkciB1cGRhdGVkIGFuZCByZXN0YXJ0ZWQuIgogICAgICBlbHNlCiAgICAgICAgc2F5ICJ3aGVyZHIgaW1hZ2UgdXBkYXRlZDsgaXQgcnVucyB0aGUgbmV3IHZlcnNpb24gYXQgdGhlIG5leHQgc3RhcnQuIgogICAgICBmaQogICAgICA7OwogICAgbmF0aXZlKQogICAgICAjIEEgbmV3IGNoZWNrb3V0LCBhIG5ldyBjb3B5IGluICRBUFAsIGFuZCB3aGVyZHIgcmVzdGFydGVkIChidWlsZF9zdGFydCkuCiAgICAgIHNheSAiVXBkYXRpbmcgdGhlIHdoZXJkciBwbHVnaW4gZnJvbSAkU09VUkNF4oCmIgogICAgICAiJChoZXJkcl9iaW4pIiBwbHVnaW4gaW5zdGFsbCAiJFNPVVJDRSIgLS15ZXMKICAgICAgOzsKICAgICopIGRpZSAid2hlcmRyIHBsdWdpbiBpcyBub3Qgc2V0IHVwOiBpbnN0YWxsIGl0IGFnYWluIHdpdGggaGVyZHIgcGx1Z2luIGluc3RhbGwgJFNPVVJDRS4iIDs7CiAgZXNhYwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwaG9uZQp0YWlsbmV0X25hbWUoKSB7CiAgY29tbWFuZCAtdiB0YWlsc2NhbGUgPi9kZXYvbnVsbCAyPiYxIHx8IHJldHVybiAxCiAgIyBTZWxmIGNvbWVzIGJlZm9yZSBQZWVyIGluIGB0YWlsc2NhbGUgc3RhdHVzIC0tanNvbmA6IHRoZSBmaXJzdCBETlNOYW1lIGlzIHRoaXMgbWFjaGluZS4KICB0YWlsc2NhbGUgc3RhdHVzIC0tanNvbiAyPi9kZXYvbnVsbCB8IHNlZCAtbiAncy8uKiJETlNOYW1lIjogKiJcKFteIl0qXClcLiIuKi9cMS9wJyB8IGhlYWQgLW4gMQp9CgojIFRoZSBwaG9uZSBzZXR1cCBpcyBhIHBhZ2Ugb2YgdGhlIGFwcCAoU2V0dGluZ3Mg4oC6IFBob25lKTsgYHdoZXJkciBwaG9uZWAKIyBwcmludHMgdGhlIHN0YXRlIGFuZCBpdHMgbGluay4gRG9ja2VyIHdpdGhvdXQgTm9kZS5qczogdGhlIHN0ZXBzIGJ5IGhhbmQuCmNtZF9waG9uZSgpIHsKICBpZiBbICIkTU9ERSIgPSAibmF0aXZlIiBdOyB0aGVuIGNsaSBwaG9uZTsgcmV0dXJuIDA7IGZpCiAgc2F5ICIiCiAgc2F5ICIgIFdIRVJEUiDCtyBQSE9ORSBTRVRVUCIKICBzYXkgIiIKICBpZiBhbnN3ZXJzOyB0aGVuIHNheSAiICDinJMgd2hlcmRyIGFuc3dlcnMgb24gJFVSTCI7IGVsc2Ugc2F5ICIgICEgd2hlcmRyIGlzIG5vdCBydW5uaW5nOiBwcmVzcyBTIGluIHRoZSB3aGVyZHIgcGFuZWwgZmlyc3QuIjsgZmkKICBuYW1lPSIkKHRhaWxuZXRfbmFtZSB8fCB0cnVlKSIKICBzYXkgIiIKICBzYXkgIiAgWW91ciBwaG9uZSBuZWVkcyBhIHByaXZhdGUgSFRUUFMgYWRkcmVzcyAobmV2ZXIgdGhlIHB1YmxpYyBJbnRlcm5ldCk6IgogIHNheSAiICAxLiBJbnN0YWxsIFRhaWxzY2FsZSBvbiB0aGlzIG1hY2hpbmUgYW5kIHlvdXIgcGhvbmUsIEhUVFBTIGNlcnRpZmljYXRlcyBlbmFibGVkLiIKICBzYXkgIiAgMi4gUnVuOiAgdGFpbHNjYWxlIHNlcnZlIC0tYmcgLS1odHRwcz0kUE9SVCBodHRwOi8vMTI3LjAuMC4xOiRQT1JUIgogIGlmIFsgLW4gIiRuYW1lIiBdOyB0aGVuCiAgICBwaG9uZT0iaHR0cHM6Ly8kbmFtZTokUE9SVC8iCiAgICBzYXkgIiAgMy4gT3BlbiAgJHBob25lICBvbiB0aGUgcGhvbmUgYW5kIGFkZCBpdCB0byB0aGUgaG9tZSBzY3JlZW4uIgogIGVsc2UKICAgIHBob25lPSIiCiAgICBzYXkgIiAgMy4gT3BlbiAgaHR0cHM6Ly88bWFjaGluZT4uPHRhaWxuZXQ+LnRzLm5ldDokUE9SVC8gIG9uIHRoZSBwaG9uZSwgYWRkIGl0IHRvIHRoZSBob21lIHNjcmVlbi4iCiAgZmkKICBzYXkgIiAgNC4gVGhlbiBvcGVuICRVUkwvIy9zZXR0aW5ncz9zZWN0aW9uPXBob25lOiB3aGVyZHIgY2hlY2tzIHRoZSBhZGRyZXNzIGFuZCBzZXRzIEFQUF9VUkwgaXRzZWxmLiIKICBzYXkgIiAgNS4gSW4gdGhlIGFwcDogU2V0dGluZ3Mg4oaSIEVuYWJsZSBub3RpZmljYXRpb25zLCB0aGVuIFNlY3VyaXR5IOKGkiBFbmFibGUgcGFzc2tleSBsb2NrLiIKICAjIFRoZSBRUiBjb2RlIG9ubHkgZm9yIGFuIGFkZHJlc3MgdGhhdCBhbnN3ZXJzIGxpa2Ugd2hlcmRyLgogIGlmIFsgLW4gIiRwaG9uZSIgXSAmJiBjb21tYW5kIC12IGN1cmwgPi9kZXYvbnVsbCAyPiYxIFwKICAgICYmIGN1cmwgLWZzUyAtLW1heC10aW1lIDggIiR7cGhvbmV9bWFuaWZlc3Qud2VibWFuaWZlc3QiIDI+L2Rldi9udWxsIHwgZ3JlcCAtcSB3aGVyZHI7IHRoZW4KICAgIHNheSAiIgogICAgaWYgY29tbWFuZCAtdiBxcmVuY29kZSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgcXJlbmNvZGUgLXQgQU5TSVVURjggLW0gMiAiJHBob25lIgogICAgZWxzZQogICAgICBzYXkgIiAgKEluc3RhbGwgcXJlbmNvZGUgdG8gc2hvdyBhIFFSIGNvZGUgb2YgJHBob25lIGhlcmUuKSIKICAgIGZpCiAgZWxpZiBbIC1uICIkcGhvbmUiIF07IHRoZW4KICAgIHNheSAiIgogICAgc2F5ICIgICEgTm90IHJlYWNoYWJsZSBmcm9tIHlvdXIgcGhvbmUgeWV0OiAkcGhvbmUgZG9lcyBub3QgYW5zd2VyIChzdGVwIDIpLiIKICBmaQogIHNheSAiIgogIHNheSAiICBHdWlkZTogaHR0cHM6Ly9naXRodWIuY29tLyRTT1VSQ0UjaW5zdGFsbC1pdC1hcy1hbi1hcHAiCn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHNlcnZpY2UKY21kX3NlcnZpY2UoKSB7CiAgY2FzZSAiJHsxOi19IiBpbiBpbnN0YWxsfHVuaW5zdGFsbCkgOzsgKikgZGllICJ1c2FnZTogJDAgc2VydmljZSBpbnN0YWxsfHVuaW5zdGFsbCIgOzsgZXNhYwogIGlmIFsgIiRNT0RFIiA9ICJkb2NrZXIiIF07IHRoZW4KICAgIHNheSAid2hlcmRyIHJ1bnMgaW4gRG9ja2VyOiB0aGUgY29udGFpbmVyIGFscmVhZHkgc3RhcnRzIHdpdGggRG9ja2VyIChyZXN0YXJ0OiBhbHdheXMpLiIKICAgIHJldHVybiAwCiAgZmkKICBjbGkgc2VydmljZSAiJDEiCiAgIyBXaXRob3V0IHRoZSBzZXJ2aWNlLCB0aGUgcGx1Z2luIHJ1bnMgd2hlcmRyIGFnYWluIChhbmQgaXRzIHN0YXJ0dXAgaG9vawogICMgc3RhcnRzIGl0IHdpdGggSGVyZHIpLgogIGlmIFsgIiQxIiA9ICJ1bmluc3RhbGwiIF07IHRoZW4gY21kX3N0YXJ0OyBmaQp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBrZXkKIyBBIEhlcmRyIGtleSB0aGF0IG9wZW5zIHRoZSB3aGVyZHIgcGFuZWw6IEhlcmRyIHYxIHBsdWdpbnMgaGF2ZSBubyBtZW51LCBzbwojIHRoZSBpbnN0YWxsIGFwcGVuZHMgb25lIG1hcmtlZCBbW2tleXMuY29tbWFuZF1dIGJsb2NrIHRvIEhlcmRyJ3MKIyBjb25maWcudG9tbCwgb24gdGhlIGZpcnN0IGZyZWUga2V5IG9mIEhPVEtFWVMgKG5ldmVyIG9uZSBIZXJkciBvciB0aGUgdXNlcgojIGFscmVhZHkgYmluZHMpLiBFeGlzdGluZyBsaW5lcyBhcmUgbmV2ZXIgY2hhbmdlZDogdGhlIGJsb2NrIGlzIG9ubHkgZXZlcgojIGFwcGVuZGVkLCB0aGVuIHJlbW92ZWQgYnkgYGtleSB1bmluc3RhbGxgLiBOb3RoaW5nIGlzIGFkZGVkIHdoZW4gdGhlIHBhbmVsCiMgYWxyZWFkeSBoYXMgYSBrZXksIG9yIHdoZW4gbm8gY2FuZGlkYXRlIGlzIGZyZWUuCkhPVEtFWVM9IiR7V0hFUkRSX0hPVEtFWVM6LXByZWZpeCtpIHByZWZpeCt1IHByZWZpeCt5IHByZWZpeCttIHByZWZpeCthbHQrd30iCkhFUkRSX0NPTkZJRz0iJHtIRVJEUl9DT05GSUdfUEFUSDotJHtYREdfQ09ORklHX0hPTUU6LSRIT01FLy5jb25maWd9L2hlcmRyL2NvbmZpZy50b21sfSIKUExVR0lOX0lEPSIkKHByaW50ZiAnJXMnICIkU09VUkNFIiB8IHRyIC8gLikiClBBTkVMX0FDVElPTj0iJFBMVUdJTl9JRC5wYW5lbCIKS0VZX0JFR0lOPSIjIHdoZXJkcjoga2V5IHRoYXQgb3BlbnMgdGhlIHdoZXJkciBwYW5lbCAocmVtb3ZlIHRoaXMgYmxvY2sgdG8gdW5iaW5kIGl0KSIKS0VZX0VORD0iIyBlbmQgd2hlcmRyIgoKIyBIZXJkcidzIGRlZmF1bHQga2V5bWFwLCBmcm9tIHRoZSBydW5uaW5nIGJpbmFyeSB3aGVuIGl0IGNhbiBwcmludCBpdCwKIyBvdGhlcndpc2UgYXMgb2YgSGVyZHIgMC45LjMgKCJuYW1lPFRBQj5rZXkiIGxpbmVzKS4KZGVmYXVsdF9rZXlzKCkgewogIG91dD0iJCgiJChoZXJkcl9iaW4pIiAtLWRlZmF1bHQtY29uZmlnIDI+L2Rldi9udWxsIHwgYXdrICcKICAgIC9eXFtrZXlzXF0vIHsgayA9IDE7IG5leHQgfQogICAgayAmJiAvXlxbLyB7IGV4aXQgfQogICAgayAmJiBtYXRjaCgkMCwgL14jIFthLXpfXSsgPSAiW14iXSoiLykgewogICAgICBsaW5lID0gc3Vic3RyKCQwLCAzLCBSTEVOR1RIIC0gMik7IGVxID0gaW5kZXgobGluZSwgIiA9ICIpCiAgICAgIHYgPSBzdWJzdHIobGluZSwgZXEgKyA0KTsgc3ViKC8iJC8sICIiLCB2KQogICAgICBpZiAodiAhPSAiIikgcHJpbnRmICIlc1x0JXNcbiIsIHN1YnN0cihsaW5lLCAxLCBlcSAtIDEpLCB2CiAgICB9JykiIHx8IG91dD0iIgogIGlmIFsgLW4gIiRvdXQiIF07IHRoZW4gcHJpbnRmICclc1xuJyAiJG91dCI7IHJldHVybjsgZmkKICBmb3IgcCBpbiBoZWxwOj8gc2V0dGluZ3M6cyBkZXRhY2g6cSByZWxvYWRfY29uZmlnOnNoaWZ0K3Igb3Blbl9ub3RpZmljYXRpb25fdGFyZ2V0Om8gXAogICAgd29ya3NwYWNlX3BpY2tlcjp3IGdvdG86ZyBuZXdfd29ya3NwYWNlOnNoaWZ0K24gbmV3X3dvcmt0cmVlOnNoaWZ0K2cgcmVuYW1lX3dvcmtzcGFjZTpzaGlmdCt3IFwKICAgIGNsb3NlX3dvcmtzcGFjZTpzaGlmdCtkIG5ld190YWI6YyByZW5hbWVfdGFiOnNoaWZ0K3QgcHJldmlvdXNfdGFiOnAgbmV4dF90YWI6biBcCiAgICBjbG9zZV90YWI6c2hpZnQreCByZW5hbWVfcGFuZTpzaGlmdCtwIGVkaXRfc2Nyb2xsYmFjazplIGZvY3VzX3BhbmVfbGVmdDpoIGZvY3VzX3BhbmVfZG93bjpqIFwKICAgIGZvY3VzX3BhbmVfdXA6ayBmb2N1c19wYW5lX3JpZ2h0OmwgY3ljbGVfcGFuZV9uZXh0OnRhYiBjeWNsZV9wYW5lX3ByZXZpb3VzOnNoaWZ0K3RhYiBcCiAgICBzcGxpdF92ZXJ0aWNhbDp2IHNwbGl0X2hvcml6b250YWw6bWludXMgY2xvc2VfcGFuZTp4IHpvb206eiByZXNpemVfbW9kZTpyIHRvZ2dsZV9zaWRlYmFyOmI7IGRvCiAgICBwcmludGYgJyVzXHRwcmVmaXgrJXNcbicgIiR7cCUlOip9IiAiJHtwIyo6fSIKICBkb25lCn0KCiMgT25lIGxpbmUgb24gdGhlIGNvbmZpZzogImJvdW5kIDxrZXk+IiB3aGVuIGEgW1trZXlzLmNvbW1hbmRdXSBhbHJlYWR5IHJ1bnMKIyB0aGUgcGFuZWwsIGVsc2UgImZyZWUgPGtleT4iIChmaXJzdCBmcmVlIGNhbmRpZGF0ZSkgb3IgIm5vbmUiLiBBbHNvCiMgIm9sZCA8a2V5PiIgZm9yIGEgYmluZGluZyBvZiB0aGUgcGFuZWwncyBmb3JtZXIgYWN0aW9uIGlkICg8aWQ+LndoZXJkcikuCmtleV9zY2FuKCkgewogIGRlZmF1bHRzPSIkKGRlZmF1bHRfa2V5cykiCiAgeyBwcmludGYgJyVzXG4nICIkZGVmYXVsdHMiOyBwcmludGYgJ1wwMDFcbic7IGNhdCAiJEhFUkRSX0NPTkZJRyIgMj4vZGV2L251bGw7IH0gfCBhd2sgXAogICAgLXYgY2FuZHM9IiRIT1RLRVlTIiAtdiBhY3Rpb249IiRQQU5FTF9BQ1RJT04iIC12IG9sZD0iJFBMVUdJTl9JRC53aGVyZHIiICcKICAgIGZ1bmN0aW9uIG5vcm0oaykgewogICAgICBnc3ViKC9bIFx0XS8sICIiLCBrKQogICAgICAjICJwcmVmaXgrVyIgaXMgInByZWZpeCtzaGlmdCt3IgogICAgICBpZiAobWF0Y2goaywgL1wrW0EtWl0kLykpIGsgPSBzdWJzdHIoaywgMSwgUlNUQVJUKSAic2hpZnQrIiB0b2xvd2VyKHN1YnN0cihrLCBSU1RBUlQgKyAxKSkKICAgICAgcmV0dXJuIHRvbG93ZXIoaykKICAgIH0KICAgIGZ1bmN0aW9uIHN0cmluZ3Mocywgb3V0LCAgIG4pIHsKICAgICAgbiA9IDAKICAgICAgd2hpbGUgKG1hdGNoKHMsIC8iW14iXSoiLykpIHsgb3V0Wysrbl0gPSBzdWJzdHIocywgUlNUQVJUICsgMSwgUkxFTkdUSCAtIDIpOyBzID0gc3Vic3RyKHMsIFJTVEFSVCArIFJMRU5HVEgpIH0KICAgICAgcmV0dXJuIG4KICAgIH0KICAgIGZ1bmN0aW9uIGZsdXNoKCkgewogICAgICBpZiAoY2tleSAhPSAiIiAmJiBjbWQgPT0gYWN0aW9uICYmIGJvdW5kID09ICIiKSBib3VuZCA9IGNrZXkKICAgICAgaWYgKGNrZXkgIT0gIiIgJiYgY21kID09IG9sZCAmJiBvbGRrZXkgPT0gIiIpIG9sZGtleSA9IGNrZXkKICAgICAgY2tleSA9ICIiOyBjbWQgPSAiIgogICAgfQogICAgJDAgPT0gIlwwMDEiIHsgY29uZiA9IDE7IG5leHQgfQogICAgIWNvbmYgeyBzcGxpdCgkMCwgZCwgIlx0Iik7IGRlZltkWzFdXSA9IGRbMl07IG5leHQgfQogICAgL15bIFx0XSpcWy8gewogICAgICBmbHVzaCgpOyB0ID0gJDA7IHN1YigvIy4qLywgIiIsIHQpOyBnc3ViKC9bIFx0XS8sICIiLCB0KQogICAgICBzZWN0ID0gdCA9PSAiW2tleXNdIiA/ICJrZXlzIiA6IHQgPT0gIltba2V5cy5jb21tYW5kXV0iID8gImNtZCIgOiAiIgogICAgICBuZXh0CiAgICB9CiAgICAvXlsgXHRdKigjfCQpLyB7IG5leHQgfQogICAgewogICAgICBlcSA9IGluZGV4KCQwLCAiPSIpOyBpZiAoIWVxKSBuZXh0CiAgICAgIG5hbWUgPSBzdWJzdHIoJDAsIDEsIGVxIC0gMSk7IGdzdWIoL1sgXHRdLywgIiIsIG5hbWUpOyB2YWwgPSBzdWJzdHIoJDAsIGVxICsgMSkKICAgICAgaWYgKHNlY3QgPT0gImtleXMiKSB7CiAgICAgICAgb3ZlcltuYW1lXSA9IDE7IG4gPSBzdHJpbmdzKHZhbCwgcykKICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IG47IGkrKykgdGFrZW5bbm9ybShzW2ldKV0gPSAxCiAgICAgIH0gZWxzZSBpZiAoc2VjdCA9PSAiY21kIiAmJiBzdHJpbmdzKHZhbCwgcykpIHsKICAgICAgICBpZiAobmFtZSA9PSAia2V5IikgeyBja2V5ID0gc1sxXTsgdGFrZW5bbm9ybShzWzFdKV0gPSAxIH0KICAgICAgICBpZiAobmFtZSA9PSAiY29tbWFuZCIpIGNtZCA9IHNbMV0KICAgICAgfQogICAgfQogICAgRU5EIHsKICAgICAgZmx1c2goKQogICAgICBpZiAob2xka2V5ICE9ICIiKSBwcmludCAib2xkICIgb2xka2V5CiAgICAgIGlmIChib3VuZCAhPSAiIikgeyBwcmludCAiYm91bmQgIiBib3VuZDsgZXhpdCB9CiAgICAgIGZvciAoYSBpbiBkZWYpIGlmICghKGEgaW4gb3ZlcikpIHRha2VuW25vcm0oZGVmW2FdKV0gPSAxCiAgICAgIG4gPSBzcGxpdChjYW5kcywgYywgIiAiKQogICAgICBmb3IgKGkgPSAxOyBpIDw9IG47IGkrKykgaWYgKCEobm9ybShjW2ldKSBpbiB0YWtlbikpIHsgcHJpbnQgImZyZWUgIiBjW2ldOyBleGl0IH0KICAgICAgcHJpbnQgIm5vbmUiCiAgICB9Jwp9CgojIFRoZSBrZXkgYm91bmQgdG8gdGhlIHBhbmVsLCBpZiBhbnkuCmtleV9ib3VuZCgpIHsga2V5X3NjYW4gfCBzZWQgLW4gJ3MvXmJvdW5kIC8vcCc7IH0KCiMgSGVyZHIgYXBwbGllcyBrZXliaW5kaW5ncyBvbiBgaGVyZHIgc2VydmVyIHJlbG9hZC1jb25maWdgIChubyByZXN0YXJ0KS4Ka2V5X3JlbG9hZCgpIHsKICBpZiAiJChoZXJkcl9iaW4pIiBzZXJ2ZXIgcmVsb2FkLWNvbmZpZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIHRlbGwgIiAgSGVyZHIgcmVsb2FkZWQgaXRzIGNvbmZpZzogbm8gcmVzdGFydCBuZWVkZWQuIgogIGVsc2UKICAgIHRlbGwgIiAgUnVuIGhlcmRyIHNlcnZlciByZWxvYWQtY29uZmlnIChvciByZXN0YXJ0IEhlcmRyKSB0byBhcHBseSBpdC4iCiAgZmkKfQoKY21kX2tleSgpIHsKICBjYXNlICIkezE6LX0iIGluCiAgICBpbnN0YWxsKQogICAgICBzY2FuPSIkKGtleV9zY2FuKSIKICAgICAgb2xkPSIkKHByaW50ZiAnJXNcbicgIiRzY2FuIiB8IHNlZCAtbiAncy9eb2xkIC8vcCcpIgogICAgICBbIC16ICIkb2xkIiBdIHx8IHdhcm4gIiRvbGQgcnVucyAkUExVR0lOX0lELndoZXJkciwgcmVuYW1lZCAkUEFORUxfQUNUSU9OOiBlZGl0IHRoYXQgbGluZSBvZiAkSEVSRFJfQ09ORklHLiIKICAgICAgcmVzPSIkKHByaW50ZiAnJXNcbicgIiRzY2FuIiB8IHNlZCAnL15vbGQgL2QnKSIKICAgICAgY2FzZSAiJHJlcyIgaW4KICAgICAgICBib3VuZFwgKikgdGVsbCAiUHJlc3MgJHtyZXMjYm91bmQgfSBpbiBIZXJkciB0byBvcGVuIHRoZSB3aGVyZHIgcGFuZWwuIiA7OwogICAgICAgIGZyZWVcICopCiAgICAgICAgICBrZXk9IiR7cmVzI2ZyZWUgfSIKICAgICAgICAgIG1rZGlyIC1wICIkKGRpcm5hbWUgIiRIRVJEUl9DT05GSUciKSIKICAgICAgICAgIGJsb2NrPSIkKHByaW50ZiAnJXNcbltba2V5cy5jb21tYW5kXV1cbmtleSA9ICIlcyJcbnR5cGUgPSAicGx1Z2luX2FjdGlvbiJcbmNvbW1hbmQgPSAiJXMiXG5kZXNjcmlwdGlvbiA9ICJ3aGVyZHIiXG4lcycgXAogICAgICAgICAgICAiJEtFWV9CRUdJTiIgIiRrZXkiICIkUEFORUxfQUNUSU9OIiAiJEtFWV9FTkQiKSIKICAgICAgICAgIHNlcD0iIgogICAgICAgICAgaWYgWyAtcyAiJEhFUkRSX0NPTkZJRyIgXTsgdGhlbgogICAgICAgICAgICBzZXA9IgoiCiAgICAgICAgICAgICMgQSBsYXN0IGxpbmUgd2l0aG91dCBpdHMgbmV3bGluZSBnZXRzIG9uZSBmaXJzdC4KICAgICAgICAgICAgWyAiJCh0YWlsIC1jIDEgIiRIRVJEUl9DT05GSUciIHwgb2QgLUFuIC1jIHwgdHIgLWQgJyAnKSIgPSAnXG4nIF0gfHwgc2VwPSIKJHNlcCIKICAgICAgICAgIGZpCiAgICAgICAgICAjIENoZWNrZWQgb24gYSBjb3B5IGZpcnN0IHdoZW4gdGhpcyBIZXJkciBjYW4gdmFsaWRhdGUgYSBjb25maWc6CiAgICAgICAgICAjIGEgY29uZmlnIEhlcmRyIHdvdWxkIHJlamVjdCBpcyBuZXZlciB3cml0dGVuLgogICAgICAgICAgdG1wPSIkSEVSRFJfQ09ORklHLndoZXJkci1jaGVjay50b21sIgogICAgICAgICAgeyBpZiBbIC1mICIkSEVSRFJfQ09ORklHIiBdOyB0aGVuIGNhdCAiJEhFUkRSX0NPTkZJRyI7IGZpOyBwcmludGYgJyVzJXNcbicgIiRzZXAiICIkYmxvY2siOyB9ID4gIiR0bXAiCiAgICAgICAgICBpZiAiJChoZXJkcl9iaW4pIiBjb25maWcgLS1oZWxwID4vZGV2L251bGwgMj4mMSAmJiAhIEhFUkRSX0NPTkZJR19QQVRIPSIkdG1wIiAiJChoZXJkcl9iaW4pIiBjb25maWcgY2hlY2sgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICAgICAgIHJtIC1mICIkdG1wIgogICAgICAgICAgICB3YXJuICJubyBIZXJkciBrZXkgYWRkZWQ6ICRIRVJEUl9DT05GSUcgd291bGQgbm90IHZhbGlkYXRlIHdpdGggaXQgKGhlcmRyIGNvbmZpZyBjaGVjaykuIgogICAgICAgICAgICByZXR1cm4gMAogICAgICAgICAgZmkKICAgICAgICAgIHJtIC1mICIkdG1wIgogICAgICAgICAgcHJpbnRmICclcyVzXG4nICIkc2VwIiAiJGJsb2NrIiA+PiAiJEhFUkRSX0NPTkZJRyIKICAgICAgICAgIG9rICJIZXJkciBrZXkgJGtleSBhZGRlZCB0byAkSEVSRFJfQ09ORklHIgogICAgICAgICAgdGVsbCAiUHJlc3MgJGtleSBpbiBIZXJkciB0byBvcGVuIHRoZSB3aGVyZHIgcGFuZWwuIgogICAgICAgICAga2V5X3JlbG9hZAogICAgICAgICAgOzsKICAgICAgICAqKSB3YXJuICJubyBIZXJkciBrZXkgYWRkZWQ6ICRIT1RLRVlTIGFyZSBhbGwgdGFrZW4uIEJpbmQgb25lIHRvICRQQU5FTF9BQ1RJT04gKHR5cGUgPSBcInBsdWdpbl9hY3Rpb25cIikgaW4gJEhFUkRSX0NPTkZJRy4iIDs7CiAgICAgIGVzYWMKICAgICAgOzsKICAgIHVuaW5zdGFsbCkKICAgICAgaWYgISBncmVwIC1xeEYgIiRLRVlfQkVHSU4iICIkSEVSRFJfQ09ORklHIiAyPi9kZXYvbnVsbDsgdGhlbiBvayAibm8gd2hlcmRyIGtleSBpbiAkSEVSRFJfQ09ORklHIjsgcmV0dXJuIDA7IGZpCiAgICAgICMgRHJvcHMgdGhlIG1hcmtlZCBibG9jayBhbmQgdGhlIGJsYW5rIGxpbmUgd3JpdHRlbiBiZWZvcmUgaXQuCiAgICAgIHRtcD0iJEhFUkRSX0NPTkZJRy53aGVyZHItdG1wIgogICAgICBhd2sgLXYgYj0iJEtFWV9CRUdJTiIgLXYgZT0iJEtFWV9FTkQiICcKICAgICAgICAkMCA9PSBiIHsgc2tpcCA9IDE7IGlmIChibGFuaykgYmxhbmstLTsgbmV4dCB9CiAgICAgICAgc2tpcCB7IGlmICgkMCA9PSBlKSBza2lwID0gMDsgbmV4dCB9CiAgICAgICAgJDAgPT0gIiIgeyBibGFuaysrOyBuZXh0IH0KICAgICAgICB7IHdoaWxlIChibGFuaykgeyBwcmludCAiIjsgYmxhbmstLSB9IHByaW50IH0KICAgICAgICBFTkQgeyB3aGlsZSAoYmxhbmspIHsgcHJpbnQgIiI7IGJsYW5rLS0gfSB9JyAiJEhFUkRSX0NPTkZJRyIgPiAiJHRtcCIKICAgICAgIyBSZXdyaXR0ZW4gaW4gcGxhY2U6IHRoZSBmaWxlIGtlZXBzIGl0cyBvd25lciBhbmQgbW9kZS4KICAgICAgY2F0ICIkdG1wIiA+ICIkSEVSRFJfQ09ORklHIiAmJiBybSAtZiAiJHRtcCIKICAgICAgb2sgIndoZXJkciBrZXkgcmVtb3ZlZCBmcm9tICRIRVJEUl9DT05GSUciCiAgICAgIGtleV9yZWxvYWQKICAgICAgOzsKICAgIHN0YXR1cykgYj0iJChrZXlfYm91bmQpIjsgaWYgWyAtbiAiJGIiIF07IHRoZW4gc2F5ICIkYiI7IGVsc2Ugc2F5ICJub25lIjsgZmkgOzsKICAgICopIGRpZSAidXNhZ2U6ICQwIGtleSBpbnN0YWxsfHVuaW5zdGFsbHxzdGF0dXMiIDs7CiAgZXNhYwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwYW5lbAojIFRoZSAicGFuZWwiIGFjdGlvbjogb25lIHBvcHVwIHdpdGggdGhlIHN0YXRlLCBPcGVuIHdoZXJkciwgU2V0IHVwIG15IHBob25lCiMgKG9wZW5zIFNldHRpbmdzIOKAuiBQaG9uZSkgYW5kIHRoZSBvdGhlciBjb21tYW5kcyAoYmluL2xpYi9wYW5lbC5tanMpLAojIGRyaXZpbmcgdGhpcyBzY3JpcHQuCmNtZF9wYW5lbCgpIHsKICBjb250cm9sPSIkKHByaW50ZiAnWyJzaCIsIiVzIl0nICIkKHByaW50ZiAnJXMnICIkUk9PVC9zY3JpcHRzL2hlcmRyLXBsdWdpbi5zaCIgfCBzZWQgJ3MvW1xcIl0vXFwmL2cnKSIpIgogIGlmIFsgIiRNT0RFIiA9ICJuYXRpdmUiIF0gfHwgeyBbIC1uICIkTU9ERSIgXSAmJiBSVU5USU1FPSIkKGZpbmRfcnVudGltZSkiOyB9OyB0aGVuCiAgICBXSEVSRFJfQ09OVFJPTD0iJGNvbnRyb2wiIFdIRVJEUl9NT0RFPSIkTU9ERSIgV0hFUkRSX0hPVEtFWT0iJChrZXlfYm91bmQpIiBjbGkgcGFuZWwKICBlbGlmIFsgLW4gIiRNT0RFIiBdOyB0aGVuCiAgICBzaF9wYW5lbAogIGVsc2UKICAgIGRpZSAid2hlcmRyIHBsdWdpbiBpcyBub3Qgc2V0IHVwICgkQ09ORiBpcyBtaXNzaW5nKTogaW5zdGFsbCBpdCBhZ2FpbiB3aXRoIGhlcmRyIHBsdWdpbiBpbnN0YWxsICRTT1VSQ0UgLS15ZXMuIgogIGZpCn0KCiMgRG9ja2VyIG1vZGUgd2l0aG91dCBOb2RlLmpzOiB0aGUgc2FtZSBrZXlzLCB3aXRob3V0IHRoZSBRUiBjb2RlLgpzaF9wYW5lbCgpIHsKICBzYXZlZD0iJChzdHR5IC1nKSIKICB0cmFwICdzdHR5ICIkc2F2ZWQiJyBFWElUCiAgd2hpbGUgOjsgZG8KICAgIHByaW50ZiAnXDAzM1tIXDAzM1sySlxuICBXSEVSRFJcblxuJwogICAgKCBjbWRfc3RhdHVzICkgfHwgdHJ1ZQogICAgcHJpbnRmICdcbiAgUyBzdGFydCAgWCBzdG9wICBSIHJlc3RhcnQgIE8gb3BlbiAgTCBsb2cgIFUgdXBkYXRlICBQIHBob25lICBRIHF1aXRcbicKICAgIHByaW50ZiAnICBSZW1vdmU6IFgsIHRoZW4gc2ggJXMga2V5IHVuaW5zdGFsbCwgdGhlbiBoZXJkciBwbHVnaW4gdW5pbnN0YWxsICVzICYmIHJtIC1yZiAlc1xuJyAiJFJPT1Qvc2NyaXB0cy9oZXJkci1wbHVnaW4uc2giICIkUExVR0lOX0lEIiAiJERJUiIKICAgIHN0dHkgLWljYW5vbiAtZWNobyBtaW4gMCB0aW1lIDUwCiAgICBrPSIkKGRkIGJzPTEgY291bnQ9MSAyPi9kZXYvbnVsbCB8fCB0cnVlKSIKICAgIHN0dHkgIiRzYXZlZCIKICAgIGNhc2UgIiRrIiBpbgogICAgICBzfFMpIGFjdD1zdGFydCA7OyB4fFgpIGFjdD1zdG9wIDs7IHJ8UikgYWN0PXJlc3RhcnQgOzsgb3xPKSBhY3Q9b3BlbiA7OwogICAgICBsfEwpIGFjdD1sb2dzIDs7IHV8VSkgYWN0PXVwZGF0ZSA7OyBwfFApIGFjdD1waG9uZSA7OyBxfFEpIGJyZWFrIDs7CiAgICAgICopIGNvbnRpbnVlIDs7CiAgICBlc2FjCiAgICBwcmludGYgJ1wwMzNbSFwwMzNbMkpcbicKICAgICggdHJhcCAtIElOVDsgImNtZF8kYWN0IiApIHx8IHRydWUKICAgIHByaW50ZiAnXG4gIFByZXNzIEVudGVyIHRvIGdvIGJhY2suICcKICAgIHJlYWQgLXIgXyB8fCB0cnVlCiAgZG9uZQp9CgpjbWRfcmVzdGFydCgpIHsgY21kX3N0b3A7IGNtZF9zdGFydDsgfQoKY2FzZSAiJHsxOi19IiBpbgogIGJ1aWxkKSBjbWRfYnVpbGQgOzsKICBwYW5lbCkgY21kX3BhbmVsIDs7CiAgc3RhcnR8c3RvcHxyZXN0YXJ0fHN0YXR1c3xvcGVufHVwZGF0ZXxwaG9uZXxsb2dzfGRvY3RvcikgImNtZF8kMSIgOzsKICBzZXJ2aWNlKSBjbWRfc2VydmljZSAiJHsyOi19IiA7OwogIHNraWxsKSBjbWRfc2tpbGwgIiR7MjotfSIgOzsKICBrZXkpIGNtZF9rZXkgIiR7MjotfSIgOzsKICAqKSBkaWUgInVzYWdlOiAkMCBidWlsZHxwYW5lbHxzdGFydHxzdG9wfHJlc3RhcnR8c3RhdHVzfG9wZW58dXBkYXRlfHBob25lfGxvZ3N8ZG9jdG9yfHNlcnZpY2UgaW5zdGFsbHx1bmluc3RhbGx8c2tpbGwgaW5zdGFsbHx1bmluc3RhbGx8a2V5IGluc3RhbGx8dW5pbnN0YWxsfHN0YXR1cyIgOzsKZXNhYwo=");
|
|
4
|
+
const herdrPlugin = base64ToUint8Array("IyEvYmluL3NoCiMgd2hlcmRyIGFzIGEgSGVyZHIgcGx1Z2luIChoZXJkci1wbHVnaW4udG9tbCk6IGJ1aWxkIChpbnN0YWxsICsgZmlyc3Qgc3RhcnQpLAojIHRoZSBwYW5lbCwgc3RhcnQsIHN0b3AsIHN0YXR1cywgb3BlbiwgdXBkYXRlLCBzZXJ2aWNlLCBza2lsbCwga2V5LgojCiMgICBoZXJkciBwbHVnaW4gaW5zdGFsbCA8b3duZXI+L3doZXJkcgojCiMgVHdvIHdheXMgdG8gcnVuIHdoZXJkciwgcGlja2VkIG9uY2UgYXQgaW5zdGFsbCB0aW1lIGFuZCBrZXB0IGluCiMgJFdIRVJEUl9ESVIvcGx1Z2luLmVudjoKIyAgIGRvY2tlciAgTGludXggd2l0aCBEb2NrZXIgQ29tcG9zZSB2MiB1c2FibGUgYnkgdGhpcyB1c2VyOiB0aGUgcHVibGlzaGVkCiMgICAgICAgICAgIGltYWdlLCBydW4gZnJvbSAkV0hFUkRSX0RJUiBleGFjdGx5IGxpa2UgaHR0cHM6Ly93aGVyZHIuZGV2L2luc3RhbGwuCiMgICBuYXRpdmUgIGV2ZXJ5d2hlcmUgZWxzZSAoYWx3YXlzIG9uIG1hY09TOiBEb2NrZXIgRGVza3RvcCBjYW5ub3QgcmVhY2gKIyAgICAgICAgICAgSGVyZHIncyBVbml4IHNvY2tldCk6IE5vZGUuanMgMjIgKG9yIEJ1bikgcnVucyB0aGUgcHJlYnVpbHQgbnBtCiMgICAgICAgICAgIHBhY2thZ2Ugb2YgdGhpcyB2ZXJzaW9uIChvciBhIGJ1aWxkIG1hZGUgaW4gdGhlIHBsdWdpbiBmb2xkZXIpLAojICAgICAgICAgICBjb3BpZWQgdG8gJFdIRVJEUl9ESVIvYXBwIGFuZCBzdGFydGVkIGRldGFjaGVkIGZyb20gdGhlcmUsIHdpdGgKIyAgICAgICAgICAgaXRzIHBpZCBhbmQgbG9nIGluICRXSEVSRFJfRElSLgojIEhlcmRyIGJ1aWxkcyBhIHBsdWdpbiBpbiBhIHRlbXBvcmFyeSBmb2xkZXIsIHRoZW4gbW92ZXMgaXQ6IGEgc2VydmVyIHN0YXJ0ZWQKIyBmcm9tIHRoZSBjaGVja291dCBkdXJpbmcgdGhlIGJ1aWxkIHdvdWxkIGxvc2UgaXRzIGZpbGVzLiAkV0hFUkRSX0RJUi9hcHAKIyBzdGF5cyBwdXQsIGFjcm9zcyBwbHVnaW4gdXBkYXRlcyB0b28sIHNvIHRoZSBidWlsZCBjYW4gc3RhcnQgd2hlcmRyIGFuZCBhCiMgbG9naW4gc2VydmljZSBjYW4gcG9pbnQgYXQgaXQuCiMgV0hFUkRSX01PREU9bmF0aXZlIChvciBkb2NrZXIpIGluIHRoZSBlbnZpcm9ubWVudCBvZiBgaGVyZHIgcGx1Z2luIGluc3RhbGxgCiMgZm9yY2VzIHRoZSBjaG9pY2U7IGVkaXQgcGx1Z2luLmVudiB0byBjaGFuZ2UgaXQgbGF0ZXIsIHRoZW4gcnVuIFVwZGF0ZS4KIwojIFNhZmV0eSBydWxlczoKIyAgIC0gbm90aGluZyBnbG9iYWwgaXMgaW5zdGFsbGVkLCBubyBzdWRvOyBmaWxlcyBhcmUgb25seSB3cml0dGVuIHRvIHRoZQojICAgICBwbHVnaW4gZm9sZGVyIGFuZCAkV0hFUkRSX0RJUiAoZGVmYXVsdCB+L3doZXJkciksIHBsdXMgdGhlIGZvbGRlcnMgdGhlCiMgICAgIERvY2tlciBzZXR1cCBtb3VudHMgKH4vLmNvbmZpZy9oZXJkciwgfi8uY2FjaGUvaGVyZHItd2Vi4oCmKSwgYW5kIHRoZQojICAgICBsb2dpbiBzZXJ2aWNlIG9ubHkgd2hlbiBhc2tlZCAoa2V5IEEgb2YgdGhlIHBhbmVsKSwgcGx1cyBhICJ3aGVyZHIiCiMgICAgIGxpbmsgaW4gdGhlIGFnZW50cycgdXNlciBza2lsbCBmb2xkZXJzIChzZWUgY21kX3NraWxsKSwgcGx1cyBvbmUgbWFya2VkCiMgICAgIGJsb2NrIGFwcGVuZGVkIHRvIEhlcmRyJ3MgY29uZmlnLnRvbWw6IHRoZSBrZXkgdGhhdCBvcGVucyB0aGUgcGFuZWwKIyAgICAgKHNlZSBjbWRfa2V5KTsKIyAgIC0gdGhlIGluc3RhbGwgc3RhcnRzIHdoZXJkciwgYW5kIEhlcmRyJ3Mgc3RhcnR1cCBob29rIHN0YXJ0cyBpdCBhZ2FpbiwKIyAgICAgYnV0IG9ubHkgd2hlbiBub3RoaW5nIGFuc3dlcnMgb24gdGhlIHBvcnQ6IGEgd2hlcmRyIHN0YXJ0ZWQgYW5vdGhlciB3YXkKIyAgICAgKERvY2tlciwgc3lzdGVtZCwgYnkgaGFuZCkgaXMgbmV2ZXIgdG91Y2hlZCwgbm8gc2Vjb25kIHdoZXJkciBpcyBzdGFydGVkOwojICAgLSBzdG9wIG9ubHkgc3RvcHMgd2hhdCB0aGlzIHBsdWdpbiBzdGFydGVkIChpdHMgcGlkLCBpdHMgbG9naW4gc2VydmljZSwgb3IKIyAgICAgdGhlIGNvbnRhaW5lciBvZiBpdHMgb3duIGNvbXBvc2UgZm9sZGVyKS4KIwojIFVuaW5zdGFsbDogSGVyZHIgaGFzIG5vIHVuaW5zdGFsbCBob29rLiBTdG9wIHdoZXJkciAoYW5kIHJlbW92ZSB0aGUgbG9naW4KIyBzZXJ2aWNlKSBmcm9tIHRoZSBwYW5lbCBmaXJzdCwgdGhlbjoKIyAgIHNoIHNjcmlwdHMvaGVyZHItcGx1Z2luLnNoIHNraWxsIHVuaW5zdGFsbCAgIChpbiB0aGUgcGx1Z2luIGZvbGRlcikKIyAgIHNoIHNjcmlwdHMvaGVyZHItcGx1Z2luLnNoIGtleSB1bmluc3RhbGwgICAgICh0aGUgSGVyZHIga2V5IG9mIHRoZSBwYW5lbCkKIyAgIGhlcmRyIHBsdWdpbiB1bmluc3RhbGwgPG93bmVyPi53aGVyZHIgJiYgcm0gLXJmIH4vd2hlcmRyCiMKIyBTZXR0aW5ncyAoJFdIRVJEUl9ESVIvcGx1Z2luLmVudiwgb3IgdGhlIGVudmlyb25tZW50KToKIyAgIFdIRVJEUl9NT0RFICBkb2NrZXIgfCBuYXRpdmUgICAgICAgIChkZWZhdWx0OiBjaG9zZW4gYXQgaW5zdGFsbCkKIyAgIFdIRVJEUl9QT1JUICBsb2NhbCBwb3J0ICAgICAgICAgICAgICAoZGVmYXVsdDogNzY4MykKIyAgIEFQUF9VUkwgICAgICBwcml2YXRlIEhUVFBTIGFkZHJlc3MgICAobmF0aXZlOyBEb2NrZXIgcmVhZHMgaXRzIC5lbnYpCiMgICBXSEVSRFJfUlVOVElNRSAgYWJzb2x1dGUgcGF0aCBvZiBub2RlIC8gYnVuIChuYXRpdmU7IGZvdW5kIGF0IGluc3RhbGwpCgpzZXQgLWV1CgpST09UPSIkKGNkICIkKGRpcm5hbWUgIiQwIikvLi4iICYmIHB3ZCAtUCkiCiMgQnVpbGQgY29tbWFuZHMgZ2V0IG5vIHBsdWdpbiBlbnZpcm9ubWVudDogdGhlIGZvbGRlciBjaG9zZW4gYXQgaW5zdGFsbAojIHRpbWUgaXMgcmVtZW1iZXJlZCBpbiB0aGUgcGx1Z2luIGNoZWNrb3V0IGZvciB0aGUgcnVudGltZSBjb21tYW5kcy4KaWYgWyAteiAiJHtXSEVSRFJfRElSOi19IiBdICYmIFsgLWYgIiRST09ULy53aGVyZHItZGlyIiBdOyB0aGVuCiAgV0hFUkRSX0RJUj0iJChjYXQgIiRST09ULy53aGVyZHItZGlyIikiCmZpCkRJUj0iJHtXSEVSRFJfRElSOi0kSE9NRS93aGVyZHJ9IgpDT05GPSIkRElSL3BsdWdpbi5lbnYiCiMgTmF0aXZlIG1vZGU6IHRoZSBpbnN0YWxsZWQgY29weSBvZiB3aGVyZHIgKGJpbiArIGJ1aWx0IHNlcnZlcikuCkFQUD0iJERJUi9hcHAiCiMgR2l0SHViIHNvdXJjZSBvZiB0aGlzIHBsdWdpbjogaXRzIG1hbmlmZXN0IGlkIHdpdGggIi8iIGZvciAiLiIgKG93bmVyLndoZXJkcikuClNPVVJDRT0iJChzZWQgLW4gJ3MvXmlkID0gIlwoLipcKSIkL1wxL3AnICIkUk9PVC9oZXJkci1wbHVnaW4udG9tbCIgfCBoZWFkIC1uIDEgfCB0ciAuIC8pIgojIGNvbnRhaW5lcl9uYW1lIG9mIHRoZSBjb21wb3NlIGZpbGUgKHdoZXJkciB1bmxlc3MgeW91IHJlbmFtZWQgaXQpLgpDT05UQUlORVI9IiQoc2VkIC1uICdzL14gKmNvbnRhaW5lcl9uYW1lOiAqLy9wJyAiJERJUi9kb2NrZXItY29tcG9zZS55bWwiIDI+L2Rldi9udWxsIHwgaGVhZCAtbiAxKSIKQ09OVEFJTkVSPSIke0NPTlRBSU5FUjotd2hlcmRyfSIKIyBUaGUgZW52aXJvbm1lbnQgd2lucyBvdmVyIHBsdWdpbi5lbnYuCkVOVl9NT0RFPSIke1dIRVJEUl9NT0RFOi19IiBFTlZfUE9SVD0iJHtXSEVSRFJfUE9SVDotfSIgRU5WX0FQUF9VUkw9IiR7QVBQX1VSTDotfSIgRU5WX1JVTlRJTUU9IiR7V0hFUkRSX1JVTlRJTUU6LX0iCmlmIFsgLWYgIiRDT05GIiBdOyB0aGVuCiAgIyBzaGVsbGNoZWNrIGRpc2FibGU9U0MxMDkwCiAgLiAiJENPTkYiCmZpCk1PREU9IiR7RU5WX01PREU6LSR7V0hFUkRSX01PREU6LX19IgpQT1JUPSIke0VOVl9QT1JUOi0ke1dIRVJEUl9QT1JUOi03NjgzfX0iCkFQUF9VUkw9IiR7RU5WX0FQUF9VUkw6LSR7QVBQX1VSTDotfX0iCiMgTmF0aXZlIG1vZGU6IGFic29sdXRlIHBhdGggb2YgdGhlIG5vZGUgKG9yIGJ1bikgdGhhdCBydW5zIHRoZSBzZXJ2ZXIuIEhlcmRyCiMgcnVucyBhY3Rpb25zIHdpdGggaXRzIHNlcnZlcidzIFBBVEgsIHdoaWNoIG9mdGVuIGxhY2tzIG52bSAvIG4gLyBmbm0gZm9sZGVycy4KUlVOVElNRT0iJHtFTlZfUlVOVElNRTotJHtXSEVSRFJfUlVOVElNRTotfX0iClVSTD0iaHR0cDovL2xvY2FsaG9zdDokUE9SVCIKCnNheSgpIHsgcHJpbnRmICclc1xuJyAiJCoiOyB9Cm9rKCkgeyBwcmludGYgJyAg4pyTICVzXG4nICIkKiI7IH0Kd2FybigpIHsgcHJpbnRmICcgICEgJXNcbicgIiQqIiA+JjI7IH0KZGllKCkgeyBwcmludGYgJyAg4pyXICVzXG4nICIkKiIgPiYyOyBleGl0IDE7IH0KCiMgQW55IEhUVFAgYW5zd2VyIGNvdW50cyAoYSBsb2NrZWQgd2hlcmRyIGFuc3dlcnMgNDAxKTogdGhlIHBvcnQgaXMgdGFrZW4uCmFuc3dlcnMoKSB7CiAgaWYgY29tbWFuZCAtdiBjdXJsID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgY29kZT0iJChjdXJsIC1zIC1vIC9kZXYvbnVsbCAtLW1heC10aW1lIDIgLXcgJyV7aHR0cF9jb2RlfScgImh0dHA6Ly8xMjcuMC4wLjE6JFBPUlQvIiAyPi9kZXYvbnVsbCB8fCB0cnVlKSIKICAgIFsgLW4gIiRjb2RlIiBdICYmIFsgIiRjb2RlIiAhPSAiMDAwIiBdCiAgZWxpZiBjb21tYW5kIC12IG5jID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgbmMgLXogMTI3LjAuMC4xICIkUE9SVCIgPi9kZXYvbnVsbCAyPiYxCiAgZWxzZQogICAgZGllICJjdXJsIG9yIG5jIGlzIG5lZWRlZCB0byBjaGVjayBwb3J0ICRQT1JULiIKICBmaQp9Cgpkb2NrZXJfdXNhYmxlKCkgewogIFsgIiQodW5hbWUgLXMpIiA9ICJMaW51eCIgXSB8fCByZXR1cm4gMQogIGNvbW1hbmQgLXYgZG9ja2VyID4vZGV2L251bGwgMj4mMSB8fCByZXR1cm4gMQogIGRvY2tlciBjb21wb3NlIHZlcnNpb24gPi9kZXYvbnVsbCAyPiYxIHx8IHJldHVybiAxCiAgZG9ja2VyIGluZm8gPi9kZXYvbnVsbCAyPiYxCn0KCiMgTWFqb3IgdmVyc2lvbiBvZiBhIG5vZGUgYmluYXJ5LCAwIHdoZW4gaXQgaXMgbm90IG9uZS4Kbm9kZV9tYWpvcigpIHsKICAiJDEiIC1wICdwcm9jZXNzLnZlcnNpb25zLm5vZGUuc3BsaXQoIi4iKVswXScgMj4vZGV2L251bGwgfHwgZWNobyAwCn0KCiMgQSB1c2FibGUgcnVudGltZTogTm9kZS5qcyAyMiBvciBuZXdlciwgb3IgQnVuIChpdCBydW5zIHRoZSBidWlsdCBzZXJ2ZXIgdG9vKS4KcnVudGltZV9vaygpIHsKICBbIC1uICIkMSIgXSAmJiBbIC14ICIkMSIgXSAmJiBbICEgLWQgIiQxIiBdIHx8IHJldHVybiAxCiAgY2FzZSAiJChiYXNlbmFtZSAiJDEiKSIgaW4KICAgIGJ1bikgIiQxIiAtLXZlcnNpb24gPi9kZXYvbnVsbCAyPiYxIDs7CiAgICAqKSBbICIkKG5vZGVfbWFqb3IgIiQxIikiIC1nZSAyMiBdIDI+L2Rldi9udWxsIDs7CiAgZXNhYwp9CgojIEFic29sdXRlIHBhdGggb2YgdGhlIHJ1bnRpbWU6IFdIRVJEUl9SVU5USU1FLCB0aGVuIG5vZGUgb24gdGhlIFBBVEgsIHRoZW4gdGhlCiMgdXN1YWwgaW5zdGFsbCBmb2xkZXJzIChuLCBudm0sIFZvbHRhLCBmbm0sIGFzZGYsIEhvbWVicmV3KSwgdGhlbiBCdW4uCiMgUHJpbnRzIG5vdGhpbmcgYW5kIGZhaWxzIHdoZW4gbm9uZSBpcyBmb3VuZC4KZmluZF9ydW50aW1lKCkgewogIGZvciBjIGluICIkUlVOVElNRSIgIiQoY29tbWFuZCAtdiBub2RlIDI+L2Rldi9udWxsIHx8IHRydWUpIiBcCiAgICAiJEhPTUUvLm4vYmluL25vZGUiICIke05fUFJFRklYOiskTl9QUkVGSVgvYmluL25vZGV9IiBcCiAgICAkKGxzIC1kICIkSE9NRSIvLm52bS92ZXJzaW9ucy9ub2RlL3YqL2Jpbi9ub2RlIDI+L2Rldi9udWxsIHwgc29ydCAtciAtVikgXAogICAgIiRIT01FLy52b2x0YS9iaW4vbm9kZSIgXAogICAgJChscyAtZCAiJEhPTUUiLy5sb2NhbC9zaGFyZS9mbm0vbm9kZS12ZXJzaW9ucy8qL2luc3RhbGxhdGlvbi9iaW4vbm9kZSAiJEhPTUUiLy5mbm0vbm9kZS12ZXJzaW9ucy8qL2luc3RhbGxhdGlvbi9iaW4vbm9kZSAyPi9kZXYvbnVsbCB8IHNvcnQgLXIgLVYpIFwKICAgICIkSE9NRS8uYXNkZi9zaGltcy9ub2RlIiAvb3B0L2hvbWVicmV3L2Jpbi9ub2RlIC91c3IvbG9jYWwvYmluL25vZGUgL3Vzci9iaW4vbm9kZSBcCiAgICAiJChjb21tYW5kIC12IGJ1biAyPi9kZXYvbnVsbCB8fCB0cnVlKSIgIiRIT01FLy5idW4vYmluL2J1biIgL29wdC9ob21lYnJldy9iaW4vYnVuIC91c3IvbG9jYWwvYmluL2J1bjsgZG8KICAgIGlmIHJ1bnRpbWVfb2sgIiRjIjsgdGhlbiBlY2hvICIkYyI7IHJldHVybiAwOyBmaQogIGRvbmUKICByZXR1cm4gMQp9CgpSVU5USU1FX0hFTFA9Ik5vZGUuanMgMjIgb3IgbmV3ZXIgKG9yIEJ1bikgaXMgcmVxdWlyZWQgdG8gcnVuIHdoZXJkciB3aXRob3V0IERvY2tlci4KICAgICBJbnN0YWxsIGl0IGZyb20gaHR0cHM6Ly9ub2RlanMub3JnLCBvciBzZXQgaXRzIGFic29sdXRlIHBhdGggaW4gJENPTkY6CiAgICAgICBXSEVSRFJfUlVOVElNRT0vcGF0aC90by9ub2RlIgoKIyBUaGUgbWFjaGluZSdzIHNob3J0IG5hbWUgKG5vIGRvbWFpbik6IHdoYXQgdGhlIGFwcCBzaG93cywgYW5kIHRoZSBjb250YWluZXIncwojIGhvc3QgbmFtZS4gV2l0aG91dCBpdCB0aGUgY29udGFpbmVyIHdvdWxkIGJlIGNhbGxlZCAid2hlcmRyIi4Kc2hvcnRfaG9zdCgpIHsKICBoPSIkKGhvc3RuYW1lIDI+L2Rldi9udWxsIHwgY3V0IC1kLiAtZjEpIgogIGVjaG8gIiR7aDotc2VydmVyfSIKfQoKaGVyZHJfYmluKCkgewogIGlmIFsgLW4gIiR7SEVSRFJfQklOX1BBVEg6LX0iIF07IHRoZW4gZWNobyAiJEhFUkRSX0JJTl9QQVRIIgogIGVsaWYgWyAteCAiJEhPTUUvLmxvY2FsL2Jpbi9oZXJkciIgXTsgdGhlbiBlY2hvICIkSE9NRS8ubG9jYWwvYmluL2hlcmRyIgogIGVsc2UgY29tbWFuZCAtdiBoZXJkciAyPi9kZXYvbnVsbCB8fCBlY2hvIGhlcmRyCiAgZmkKfQoKcmVhbF9kaXIoKSB7IChjZCAiJDEiIDI+L2Rldi9udWxsICYmIHB3ZCAtUCkgfHwgZWNobyAiJDEiOyB9CgojIENvbXBvc2UgZm9sZGVyIG9mIHRoZSBgd2hlcmRyYCBjb250YWluZXIsIGVtcHR5IHdoZW4gdGhlcmUgaXMgbm9uZS4KY29udGFpbmVyX2RpcigpIHsKICBkb2NrZXIgaW5zcGVjdCAiJENPTlRBSU5FUiIgLS1mb3JtYXQgJ3t7IGluZGV4IC5Db25maWcuTGFiZWxzICJjb20uZG9ja2VyLmNvbXBvc2UucHJvamVjdC53b3JraW5nX2RpciIgfX0nIDI+L2Rldi9udWxsIHx8IHRydWUKfQoKIyBUcnVlIHdoZW4gdGhlIGB3aGVyZHJgIGNvbnRhaW5lciBiZWxvbmdzIHRvICRESVIgKG9yIGRvZXMgbm90IGV4aXN0IHlldCkuCmNvbnRhaW5lcl9vdXJzKCkgewogIG93bmVyPSIkKGNvbnRhaW5lcl9kaXIpIgogIFsgLXogIiRvd25lciIgXSB8fCBbICIkKHJlYWxfZGlyICIkb3duZXIiKSIgPSAiJChyZWFsX2RpciAiJERJUiIpIiBdCn0KCmNvbXBvc2UoKSB7IGRvY2tlciBjb21wb3NlIC0tcHJvamVjdC1kaXJlY3RvcnkgIiRESVIiIC1mICIkRElSL2RvY2tlci1jb21wb3NlLnltbCIgIiRAIjsgfQoKd2FpdF91cCgpIHsKICBpPTAKICB3aGlsZSBbICIkaSIgLWx0ICIkezE6LTMwfSIgXTsgZG8KICAgIGlmIGFuc3dlcnM7IHRoZW4gcmV0dXJuIDA7IGZpCiAgICBpPSQoKGkgKyAxKSk7IHNsZWVwIDEKICBkb25lCiAgcmV0dXJuIDEKfQoKIyBUaGUgY29tbWFuZHMgb2YgdGhlIG5hdGl2ZSBtb2RlOiB0aGUgaW5zdGFsbGVkIGNvcHksIG9yIHRoZSBjaGVja291dCBpdHNlbGYKIyAoYSBsaW5rZWQgcGx1Z2luIGJ1aWx0IGJ5IGhhbmQsIG9yIGEgcGx1Z2luIGluc3RhbGxlZCBiZWZvcmUgJEFQUCBleGlzdGVkKS4KY2xpX3Jvb3QoKSB7CiAgaWYgWyAtZiAiJEFQUC9iaW4vd2hlcmRyLm1qcyIgXSAmJiBbIC1mICIkQVBQLy5vdXRwdXQvc2VydmVyL2luZGV4Lm1qcyIgXTsgdGhlbiBlY2hvICIkQVBQIjsgZWxzZSBlY2hvICIkUk9PVCI7IGZpCn0KCiMgVGhlIHBlcnNvbiBydW5uaW5nIGBoZXJkciBwbHVnaW4gaW5zdGFsbGAgc2VlcyBvbmx5IEhlcmRyJ3Mgb3duIGxpbmVzOiB0aGUKIyBvdXRwdXQgb2YgYnVpbGQgY29tbWFuZHMgaXMgY2FwdHVyZWQuIEltcG9ydGFudCBsaW5lcyBhbHNvIGdvIHRvIHRoZSB0ZXJtaW5hbC4KdGVsbCgpIHsKICBwcmludGYgJyVzXG4nICIkKiIKICB7IHByaW50ZiAnJXNcbicgIiQqIiA+IC9kZXYvdHR5OyB9IDI+L2Rldi9udWxsIHx8IHRydWUKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYnVpbGQKY21kX2J1aWxkKCkgewogIHRlbGwgIndoZXJkcjogaW5zdGFsbGluZyBpbiAkRElSIgogICMgRmlyc3QgaW5zdGFsbCAobm8gcGx1Z2luLmVudiB5ZXQpOiB0aGUgYnJvd3NlciBvcGVucyBvbiB0aGUgc2V0dXAgZ3VpZGUKICAjIG9uY2Ugd2hlcmRyIHJ1bnMuIFVwZGF0ZXMga2VlcCBwbHVnaW4uZW52IGFuZCBvcGVuIG5vdGhpbmcuCiAgRklSU1RfSU5TVEFMTD0wCiAgWyAtZiAiJENPTkYiIF0gfHwgRklSU1RfSU5TVEFMTD0xCiAgbWtkaXIgLXAgIiRESVIiCiAgcHJpbnRmICclc1xuJyAiJERJUiIgPiAiJFJPT1QvLndoZXJkci1kaXIiCgogIGlmIFsgLXogIiRNT0RFIiBdOyB0aGVuCiAgICBpZiBkb2NrZXJfdXNhYmxlOyB0aGVuIE1PREU9ZG9ja2VyOyBlbHNlIE1PREU9bmF0aXZlOyBmaQogIGZpCiAgY2FzZSAiJE1PREUiIGluCiAgICBkb2NrZXIpIGRvY2tlcl91c2FibGUgfHwgZGllICJXSEVSRFJfTU9ERT1kb2NrZXIsIGJ1dCBEb2NrZXIgQ29tcG9zZSB2MiBpcyBub3QgdXNhYmxlIGJ5ICQoaWQgLXVuKSBvbiB0aGlzIHN5c3RlbS4iIDs7CiAgICBuYXRpdmUpIDs7CiAgICAqKSBkaWUgIldIRVJEUl9NT0RFIG11c3QgYmUgZG9ja2VyIG9yIG5hdGl2ZSAoZ290OiAkTU9ERSkuIiA7OwogIGVzYWMKCiAgaWYgWyAiJE1PREUiID0gImRvY2tlciIgXTsgdGhlbiBidWlsZF9kb2NrZXI7IGVsc2UgYnVpbGRfbmF0aXZlOyBmaQogICMgV3JpdHRlbiBsYXN0OiBhIGZhaWxlZCBidWlsZCBrZWVwcyBubyBoYWxmLW1hZGUgY2hvaWNlLiBSZXdyaXR0ZW4gb24gZWFjaAogICMgaW5zdGFsbCBmcm9tIHRoZSBtZXJnZWQgc2V0dGluZ3MgKGVudmlyb25tZW50IG92ZXIgdGhlIHByZXZpb3VzIGZpbGUpLgogIHdyaXRlX2NvbmYKICBvayAicGx1Z2luLmVudiB3cml0dGVuIChtb2RlOiAkTU9ERSkiCiAgKCBjbWRfc2tpbGwgaW5zdGFsbCApIHx8IHdhcm4gIndoZXJkciBza2lsbCBub3QgbGlua2VkIChvcHRpb25hbCk6IHJ1biAkMCBza2lsbCBpbnN0YWxsIgogICggY21kX2tleSBpbnN0YWxsICkgfHwgd2FybiAibm8gSGVyZHIga2V5IGZvciB0aGUgcGFuZWwgKG9wdGlvbmFsKTogcnVuICQwIGtleSBpbnN0YWxsIgogIGJ1aWxkX3N0YXJ0Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHNraWxsCiMgVGhlICJ3aGVyZHIiIGFnZW50IHNraWxsIChza2lsbHMvd2hlcmRyL1NLSUxMLm1kKTogdGhlIGNvbnZlbnRpb25zIG9mIHRoZQojIFByb2plY3QgcGFuZWwgZm9yIGhlcmRyLXByb2plY3RzIGNvb3JkaW5hdG9ycy4gQ29waWVkIHRvICRESVIvc2tpbGxzL3doZXJkcgojICh0aGUgY2hlY2tvdXQgaXMgYnVpbHQgaW4gYSB0ZW1wb3JhcnkgZm9sZGVyLCB0aGVuIG1vdmVkKSwgdGhlbiBsaW5rZWQgaW50bwojIHRoZSB1c2VyIHNraWxsIGZvbGRlcnM6IENsYXVkZSBDb2RlJ3MgJHtDTEFVREVfQ09ORklHX0RJUjotfi8uY2xhdWRlfS9za2lsbHMsCiMgYW5kIH4vLmFnZW50cy9za2lsbHMsIHJlYWQgYnkgQ29kZXggYW5kIG9tcC4gT25seSBsaW5rcyB0byB0aGF0IGNvcHkgYXJlCiMgZXZlciBjcmVhdGVkIG9yIHJlbW92ZWQ6IGEgIndoZXJkciIgc2tpbGwgb2Ygc29tZW9uZSBlbHNlIGlzIGxlZnQgYWxvbmUuClNLSUxMX0NPUFk9IiRESVIvc2tpbGxzL3doZXJkciIKCnNraWxsX2RpcnMoKSB7CiAgY2xhdWRlPSIke0NMQVVERV9DT05GSUdfRElSOi0kSE9NRS8uY2xhdWRlfSIKICBbIC1kICIkY2xhdWRlIiBdICYmIGVjaG8gIiRjbGF1ZGUvc2tpbGxzIgogIGlmIFsgLWQgIiRIT01FLy5hZ2VudHMiIF0gfHwgWyAtZCAiJEhPTUUvLmNvZGV4IiBdIHx8IFsgLWQgIiRIT01FLy5vbXAiIF07IHRoZW4gZWNobyAiJEhPTUUvLmFnZW50cy9za2lsbHMiOyBmaQogIHJldHVybiAwCn0KCmNtZF9za2lsbCgpIHsKICBjYXNlICIkezE6LX0iIGluCiAgICBpbnN0YWxsKQogICAgICBta2RpciAtcCAiJFNLSUxMX0NPUFkiCiAgICAgIGNwICIkUk9PVC9za2lsbHMvd2hlcmRyL1NLSUxMLm1kIiAiJFNLSUxMX0NPUFkvU0tJTEwubWQiCiAgICAgIHNraWxsX2RpcnMgfCB3aGlsZSBJRlM9IHJlYWQgLXIgZDsgZG8KICAgICAgICBsaW5rPSIkZC93aGVyZHIiCiAgICAgICAgaWYgWyAtTCAiJGxpbmsiIF0gJiYgWyAiJChyZWFkbGluayAiJGxpbmsiKSIgPSAiJFNLSUxMX0NPUFkiIF07IHRoZW4gb2sgInNraWxsIGFscmVhZHkgbGlua2VkOiAkbGluayIKICAgICAgICBlbGlmIFsgLWUgIiRsaW5rIiBdIHx8IFsgLUwgIiRsaW5rIiBdOyB0aGVuIHdhcm4gInNraWxsIG5vdCBsaW5rZWQ6ICRsaW5rIGFscmVhZHkgZXhpc3RzIChsZWZ0IGFsb25lKSIKICAgICAgICBlbHNlIG1rZGlyIC1wICIkZCIgJiYgbG4gLXMgIiRTS0lMTF9DT1BZIiAiJGxpbmsiICYmIG9rICJza2lsbCBsaW5rZWQ6ICRsaW5rIgogICAgICAgIGZpCiAgICAgIGRvbmUKICAgICAgOzsKICAgIHVuaW5zdGFsbCkKICAgICAgc2tpbGxfZGlycyB8IHdoaWxlIElGUz0gcmVhZCAtciBkOyBkbwogICAgICAgIGxpbms9IiRkL3doZXJkciIKICAgICAgICBpZiBbIC1MICIkbGluayIgXSAmJiBbICIkKHJlYWRsaW5rICIkbGluayIpIiA9ICIkU0tJTExfQ09QWSIgXTsgdGhlbiBybSAiJGxpbmsiICYmIG9rICJza2lsbCB1bmxpbmtlZDogJGxpbmsiOyBmaQogICAgICBkb25lCiAgICAgIHJtIC1yZiAiJFNLSUxMX0NPUFkiCiAgICAgIHJtZGlyICIkRElSL3NraWxscyIgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgICA7OwogICAgKikgZGllICJ1c2FnZTogJDAgc2tpbGwgaW5zdGFsbHx1bmluc3RhbGwiIDs7CiAgZXNhYwp9CgojIExhc3Qgc3RlcCBvZiB0aGUgaW5zdGFsbDogc3RhcnQgd2hlcmRyIChvciByZXN0YXJ0IHRoZSBvbmUgdGhpcyBwbHVnaW4KIyBydW5zLCBvbiBhbiB1cGRhdGUpLiBOZXZlciBmYWlscyB0aGUgaW5zdGFsbDogYSB3aGVyZHIgdGhhdCBjYW5ub3Qgc3RhcnQgaXMKIyByZXBvcnRlZCB3aXRoIHdoYXQgdG8gZG8sIHRoZSBwbHVnaW4gc3RheXMgaW5zdGFsbGVkLgpidWlsZF9zdGFydCgpIHsKICBzZXQgK2UKICBvdXQ9IiQoIChjbWRfc3RhcnQpIDI+JjEgKSIKICBjb2RlPSQ/CiAgc2V0IC1lCiAgcHJpbnRmICclc1xuJyAiJG91dCIKICBpZiBbICIkY29kZSIgLWVxIDAgXSAmJiBhbnN3ZXJzOyB0aGVuCiAgICAjIGh0dHBzOi8vd2hlcmRyLmRldi9pbnN0YWxsIHByaW50cyBpdHMgb3duIHN1bW1hcnkgKFdIRVJEUl9JTlNUQUxMRVI9MSkuCiAgICBxdWlldD0wCiAgICBbICIke1dIRVJEUl9JTlNUQUxMRVI6LTB9IiA9IDEgXSAmJiBxdWlldD0xCiAgICBbICIkcXVpZXQiID0gMSBdIHx8IHRlbGwgIiIKICAgIFsgIiRxdWlldCIgPSAxIF0gfHwgdGVsbCAi4pyTIHdoZXJkciBpcyBydW5uaW5nIOKGkiAkVVJMIgogICAgaWYgWyAiJHtGSVJTVF9JTlNUQUxMOi0wfSIgPSAxIF07IHRoZW4KICAgICAgIyBBbHJlYWR5IHB1Ymxpc2hlZCBvbiB0aGUgdGFpbG5ldCAoYSByZWluc3RhbGwsIG9yIGB0YWlsc2NhbGUgc2VydmVgCiAgICAgICMgcnVuIGZpcnN0KTogdGhlIGd1aWRlIG9wZW5zIG9uIHRoYXQgYWRkcmVzcywgd2hlcmUgcGFzc2tleXMgYmVsb25nLgogICAgICBndWlkZT0iJChvcGVuX2FkZHJlc3MpLyMvc2V0dXAiCiAgICAgIGlmIG9wZW5fYnJvd3NlciAiJGd1aWRlIjsgdGhlbiBbICIkcXVpZXQiID0gMSBdIHx8IHRlbGwgIiAgU2V0dXAgZ3VpZGUgb3BlbmVkIGluIHlvdXIgYnJvd3NlcjogJGd1aWRlIgogICAgICBlbHNlIFsgIiRxdWlldCIgPSAxIF0gfHwgdGVsbCAiICBTZXR1cCBndWlkZTogb3BlbiAkZ3VpZGUgaW4gYSBicm93c2VyIgogICAgICBmaQogICAgZmkKICAgIFsgIiRxdWlldCIgPSAxIF0gfHwgdGVsbCAiICBQaG9uZTogb3BlbiB0aGUgd2hlcmRyIHBhbmVsIGluIEhlcmRyIChrZXkgYWJvdmUsIG9yIGhlcmRyIHBsdWdpbiBhY3Rpb24gaW52b2tlIHBhbmVsIC0tcGx1Z2luICRQTFVHSU5fSUQpIgogIGVsc2UKICAgIHRlbGwgIiIKICAgIHRlbGwgIiEgd2hlcmRyIGlzIGluc3RhbGxlZCBidXQgZGlkIG5vdCBzdGFydDoiCiAgICBwcmludGYgJyVzXG4nICIkb3V0IiB8IHRhaWwgLW4gOCB8IHdoaWxlIElGUz0gcmVhZCAtciBsOyBkbyB0ZWxsICIgICAgJGwiOyBkb25lCiAgICB0ZWxsICIgIE9wZW4gdGhlIHdoZXJkciBwYW5lbCBpbiBIZXJkciwgdGhlbiBwcmVzcyBTIHRvIHN0YXJ0IGl0IG9yIEwgZm9yIGl0cyBsb2cuIgogIGZpCn0KCndyaXRlX2NvbmYoKSB7CiAgewogICAgZWNobyAiIyB3aGVyZHIgSGVyZHIgcGx1Z2luIHNldHRpbmdzIChoZXJkci1wbHVnaW4uc2gpLiIKICAgIGVjaG8gIiMgVG8gc3dpdGNoIG1vZGUsIHNldCBXSEVSRFJfTU9ERSBhbmQgcnVuOiBoZXJkciBwbHVnaW4gaW5zdGFsbCAkU09VUkNFIgogICAgZWNobyAiV0hFUkRSX01PREU9JE1PREUiCiAgICBlY2hvICJXSEVSRFJfUE9SVD0kUE9SVCIKICAgIGVjaG8gIiMgTmF0aXZlIG1vZGU6IHByaXZhdGUgSFRUUFMgYWRkcmVzcyAodGFpbHNjYWxlIHNlcnZlKSwgZm9yIHB1c2ggbm90aWZpY2F0aW9ucy4iCiAgICBlY2hvICJBUFBfVVJMPSR7QVBQX1VSTDotfSIKICAgIGlmIFsgIiRNT0RFIiA9ICJuYXRpdmUiIF07IHRoZW4KICAgICAgZWNobyAiIyBOYXRpdmUgbW9kZTogYWJzb2x1dGUgcGF0aCBvZiB0aGUgbm9kZSAoMjIrKSBvciBidW4gdGhhdCBydW5zIHdoZXJkci4iCiAgICAgIGVjaG8gIldIRVJEUl9SVU5USU1FPSRSVU5USU1FIgogICAgZmkKICB9ID4gIiRDT05GIgp9CgojIFRoZSBwdWJsaXNoZWQgbnBtIHBhY2thZ2Ugb2YgdGhpcyBleGFjdCB2ZXJzaW9uIGhvbGRzIHRoZSBidWlsdCBzZXJ2ZXI6CiMgZG93bmxvYWQgaXQgaW5zdGVhZCBvZiBidWlsZGluZyAobm8gbnBtIGNpKS4gRmFpbHMgd2hlbiBpdCBpcyBub3QgcHVibGlzaGVkLgpmZXRjaF9wcmVidWlsdCgpIHsKICBjb21tYW5kIC12IGN1cmwgPi9kZXYvbnVsbCAyPiYxICYmIGNvbW1hbmQgLXYgdGFyID4vZGV2L251bGwgMj4mMSB8fCByZXR1cm4gMQogIHZlcnNpb249IiQoc2VkIC1uICdzL152ZXJzaW9uID0gIlwoLipcKSIkL1wxL3AnICIkUk9PVC9oZXJkci1wbHVnaW4udG9tbCIgfCBoZWFkIC1uIDEpIgogIHRtcD0iJChta3RlbXAgLWQpIgogIGlmIGN1cmwgLWZzU0wgLS1tYXgtdGltZSAxMjAgImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3doZXJkci8tL3doZXJkci0kdmVyc2lvbi50Z3oiIC1vICIkdG1wL3doZXJkci50Z3oiIDI+L2Rldi9udWxsIFwKICAgICYmIHRhciAteHpmICIkdG1wL3doZXJkci50Z3oiIC1DICIkdG1wIiBcCiAgICAmJiBbIC1mICIkdG1wL3BhY2thZ2UvLm91dHB1dC9zZXJ2ZXIvaW5kZXgubWpzIiBdOyB0aGVuCiAgICBybSAtcmYgIiRST09ULy5vdXRwdXQiCiAgICBtdiAiJHRtcC9wYWNrYWdlLy5vdXRwdXQiICIkUk9PVC8ub3V0cHV0IgogICAgcm0gLXJmICIkdG1wIgogICAgb2sgIndoZXJkciAkdmVyc2lvbiBkb3dubG9hZGVkIChwcmVidWlsdCBucG0gcGFja2FnZSkiCiAgICByZXR1cm4gMAogIGZpCiAgcm0gLXJmICIkdG1wIgogIHJldHVybiAxCn0KCiMgcXJjb2RlLXRlcm1pbmFsICh0aGUgcGFuZWwncyBRUiBjb2RlKSwgdGhlIG9ubHkgcGFja2FnZSB0aGUgY29tbWFuZHMgbmVlZAojIGF0IHJ1bnRpbWUsIHdoZW4gdGhlIGZvbGRlciBkb2VzIG5vdCBoYXZlIGl0IHlldCAobm8gbnBtIGNpIHdhcyBydW4pLgpmZXRjaF9xcigpIHsKICBbIC1mICIkMS9ub2RlX21vZHVsZXMvcXJjb2RlLXRlcm1pbmFsL3BhY2thZ2UuanNvbiIgXSAmJiByZXR1cm4gMAogIGNvbW1hbmQgLXYgY3VybCA+L2Rldi9udWxsIDI+JjEgJiYgY29tbWFuZCAtdiB0YXIgPi9kZXYvbnVsbCAyPiYxIHx8IHJldHVybiAwCiAgdG1wPSIkKG1rdGVtcCAtZCkiCiAgaWYgY3VybCAtZnNTTCAtLW1heC10aW1lIDYwIGh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3FyY29kZS10ZXJtaW5hbC8tL3FyY29kZS10ZXJtaW5hbC0wLjEyLjAudGd6IC1vICIkdG1wL3FyLnRneiIgMj4vZGV2L251bGwgXAogICAgJiYgdGFyIC14emYgIiR0bXAvcXIudGd6IiAtQyAiJHRtcCI7IHRoZW4KICAgIG1rZGlyIC1wICIkMS9ub2RlX21vZHVsZXMiCiAgICBybSAtcmYgIiQxL25vZGVfbW9kdWxlcy9xcmNvZGUtdGVybWluYWwiCiAgICBtdiAiJHRtcC9wYWNrYWdlIiAiJDEvbm9kZV9tb2R1bGVzL3FyY29kZS10ZXJtaW5hbCIKICBlbHNlCiAgICB3YXJuICJObyBRUiBjb2RlIGluIHRoZSBwYW5lbCAocXJjb2RlLXRlcm1pbmFsIGNvdWxkIG5vdCBiZSBkb3dubG9hZGVkKS4iCiAgZmkKICBybSAtcmYgIiR0bXAiCn0KCmJ1aWxkX25hdGl2ZSgpIHsKICBSVU5USU1FPSIkKGZpbmRfcnVudGltZSkiIHx8IGRpZSAiJFJVTlRJTUVfSEVMUCIKICBvayAiUnVudGltZTogJFJVTlRJTUUgKCQoIiRSVU5USU1FIiAtLXZlcnNpb24gMj4vZGV2L251bGwpKSIKICBpZiBmZXRjaF9wcmVidWlsdDsgdGhlbgogICAgaW5zdGFsbF9hcHAKICAgIHJldHVybiAwCiAgZmkKICBjYXNlICIkKGJhc2VuYW1lICIkUlVOVElNRSIpIiBpbgogICAgYnVuKSBkaWUgIlRoZSBwcmVidWlsdCB3aGVyZHIgcGFja2FnZSBjb3VsZCBub3QgYmUgZG93bmxvYWRlZCwgYW5kIGJ1aWxkaW5nIGl0IG5lZWRzIE5vZGUuanMgMjIgd2l0aCBucG0uCiAgICAgQ2hlY2sgdGhlIG5ldHdvcmssIG9yIGluc3RhbGwgTm9kZS5qcyAyMiwgdGhlbiBpbnN0YWxsIHRoZSBwbHVnaW4gYWdhaW4uIiA7OwogIGVzYWMKICBiaW5kaXI9IiQoZGlybmFtZSAiJFJVTlRJTUUiKSIKICBbIC14ICIkYmluZGlyL25wbSIgXSB8fCBjb21tYW5kIC12IG5wbSA+L2Rldi9udWxsIDI+JjEgfHwgZGllICJucG0gaXMgbWlzc2luZyAoaXQgY29tZXMgd2l0aCBOb2RlLmpzKS4iCiAgdGVsbCAid2hlcmRyOiBidWlsZGluZyAoYSBmZXcgbWludXRlcyB0aGUgZmlyc3QgdGltZSnigKYiCiAgKAogICAgY2QgIiRST09UIgogICAgUEFUSD0iJGJpbmRpcjokUEFUSCIgbnBtIGNpIC0tbm8tYXVkaXQgLS1uby1mdW5kCiAgICBQQVRIPSIkYmluZGlyOiRQQVRIIiBucG0gcnVuIGJ1aWxkCiAgKQogIG9rICJ3aGVyZHIgYnVpbHQgaW4gdGhlIHBsdWdpbiBmb2xkZXIiCiAgaW5zdGFsbF9hcHAKfQoKIyBDb3BpZXMgdGhlIGNvbW1hbmRzIGFuZCB0aGUgYnVpbHQgc2VydmVyIHRvICRBUFAsIHdoaWNoIG91dGxpdmVzIHRoaXMKIyBjaGVja291dC4gQSB3aGVyZHIgdGhpcyBwbHVnaW4gcnVucyBmcm9tIHRoZSBwcmV2aW91cyBjb3B5IGlzIHN0b3BwZWQgZm9yCiMgdGhlIHN3YXA7IGJ1aWxkX3N0YXJ0IHN0YXJ0cyB0aGUgbmV3IG9uZS4KaW5zdGFsbF9hcHAoKSB7CiAgIyBOaXRybyBsaW5rcyBzb21lIHBhY2thZ2VzICh0c2xpYikgdG8gaXRzIG93biBmb2xkZXI6IGNvcGllcywgbm90IGxpbmtzLgogIGlmIFsgLWQgIiRST09ULy5vdXRwdXQvc2VydmVyL25vZGVfbW9kdWxlcyIgXTsgdGhlbiAiJFJVTlRJTUUiICIkUk9PVC9zY3JpcHRzL3BhY2stb3V0cHV0Lm1qcyIgPi9kZXYvbnVsbDsgZmkKICBuZXc9IiRBUFAubmV3IgogIHJtIC1yZiAiJG5ldyIKICBta2RpciAtcCAiJG5ldyIKICBjcCAtUiAiJFJPT1QvYmluIiAiJFJPT1QvLm91dHB1dCIgIiRST09UL3BhY2thZ2UuanNvbiIgIiRuZXcvIgogIGlmIFsgLWQgIiRST09UL25vZGVfbW9kdWxlcy9xcmNvZGUtdGVybWluYWwiIF07IHRoZW4KICAgIG1rZGlyIC1wICIkbmV3L25vZGVfbW9kdWxlcyIKICAgIGNwIC1SICIkUk9PVC9ub2RlX21vZHVsZXMvcXJjb2RlLXRlcm1pbmFsIiAiJG5ldy9ub2RlX21vZHVsZXMvIgogIGZpCiAgZmV0Y2hfcXIgIiRuZXciCiAgIyBUaGUgd2hlcmRyIHRoaXMgcGx1Z2luIHJ1bnMgKGZyb20gdGhlIHByZXZpb3VzIGNvcHksIG9yIGZyb20gYW4gb2xkZXIKICAjIHBsdWdpbiBjaGVja291dCk6IHN0b3BwZWQgZm9yIHRoZSBzd2FwLCBzdGFydGVkIGFnYWluIGJ5IGJ1aWxkX3N0YXJ0LgogIGlmIFsgLWYgIiRESVIvd2hlcmRyLnBpZCIgXSB8fCBbIC1mICIkQVBQL2Jpbi93aGVyZHIubWpzIiBdOyB0aGVuIGNsaSBzdG9wID4vZGV2L251bGwgMj4mMSB8fCB0cnVlOyBmaQogIHJtIC1yZiAiJEFQUC5vbGQiCiAgaWYgWyAtZCAiJEFQUCIgXTsgdGhlbiBtdiAiJEFQUCIgIiRBUFAub2xkIjsgZmkKICBtdiAiJG5ldyIgIiRBUFAiCiAgcm0gLXJmICIkQVBQLm9sZCIKICBvayAid2hlcmRyICQoc2VkIC1uICdzL14gKiJ2ZXJzaW9uIjogKiJcKC4qXCkiLCQvXDEvcCcgIiRBUFAvcGFja2FnZS5qc29uIiB8IGhlYWQgLW4gMSkgaW5zdGFsbGVkIGluICRBUFAiCn0KCmJ1aWxkX2RvY2tlcigpIHsKICBvayAiRG9ja2VyICQoZG9ja2VyIHZlcnNpb24gLS1mb3JtYXQgJ3t7LlNlcnZlci5WZXJzaW9ufX0nIDI+L2Rldi9udWxsIHx8IGVjaG8gJz8nKSIKICBzdGFtcD0iJERJUi8uY29tcG9zZS1mcm9tLXBsdWdpbiIKICBpZiBbICEgLWYgIiRESVIvZG9ja2VyLWNvbXBvc2UueW1sIiBdOyB0aGVuCiAgICBjcCAiJFJPT1QvZG9ja2VyLWNvbXBvc2UueW1sIiAiJERJUi9kb2NrZXItY29tcG9zZS55bWwiCiAgICBja3N1bSA8ICIkRElSL2RvY2tlci1jb21wb3NlLnltbCIgPiAiJHN0YW1wIgogICAgb2sgImRvY2tlci1jb21wb3NlLnltbCBjb3BpZWQiCiAgZWxpZiBjbXAgLXMgIiRST09UL2RvY2tlci1jb21wb3NlLnltbCIgIiRESVIvZG9ja2VyLWNvbXBvc2UueW1sIjsgdGhlbgogICAgb2sgImRvY2tlci1jb21wb3NlLnltbCBpcyB1cCB0byBkYXRlIgogIGVsaWYgWyAtZiAiJHN0YW1wIiBdICYmIFsgIiQoY2tzdW0gPCAiJERJUi9kb2NrZXItY29tcG9zZS55bWwiKSIgPSAiJChjYXQgIiRzdGFtcCIpIiBdOyB0aGVuCiAgICAjIFVuY2hhbmdlZCBzaW5jZSB0aGUgcGx1Z2luIHdyb3RlIGl0OiBzYWZlIHRvIHJlZnJlc2guCiAgICBjcCAiJFJPT1QvZG9ja2VyLWNvbXBvc2UueW1sIiAiJERJUi9kb2NrZXItY29tcG9zZS55bWwiCiAgICBja3N1bSA8ICIkRElSL2RvY2tlci1jb21wb3NlLnltbCIgPiAiJHN0YW1wIgogICAgb2sgImRvY2tlci1jb21wb3NlLnltbCB1cGRhdGVkIgogIGVsc2UKICAgIHdhcm4gIktlZXBpbmcgeW91ciBlZGl0ZWQgZG9ja2VyLWNvbXBvc2UueW1sICh0aGUgbmV3IG9uZSBpcyAkUk9PVC9kb2NrZXItY29tcG9zZS55bWwpLiIKICBmaQogIGlmIFsgISAtZiAiJERJUi8uZW52IiBdOyB0aGVuCiAgICBoZXJkcj0iJChoZXJkcl9iaW4pIgogICAgewogICAgICBlY2hvICIjIHdoZXJkciBzZXR0aW5ncywgcmVhZCBieSBkb2NrZXIgY29tcG9zZSAoc2VlIC5lbnYuZXhhbXBsZSBpbiB0aGUgcmVwb3NpdG9yeSkuIgogICAgICBlY2hvICJIT1NUX0hPTUU9JEhPTUUiCiAgICAgIGVjaG8gIlBVSUQ9JChpZCAtdSkiCiAgICAgIGVjaG8gIlBHSUQ9JChpZCAtZykiCiAgICAgIGVjaG8gIlBPUlQ9JFBPUlQiCiAgICAgIGVjaG8gIiMgUHJpdmF0ZSBIVFRQUyBhZGRyZXNzICh0YWlsc2NhbGUgc2VydmUpLCBuZWVkZWQgZm9yIHB1c2ggbm90aWZpY2F0aW9ucy4iCiAgICAgIGVjaG8gIkFQUF9VUkw9JHtBUFBfVVJMOi1odHRwOi8vbG9jYWxob3N0OiRQT1JUL30iCiAgICAgIGVjaG8gIkhPU1RfTEFCRUw9JChzaG9ydF9ob3N0KSIKICAgICAgZWNobyAiVFo9JHtUWjotVVRDfSIKICAgICAgaWYgWyAiJGhlcmRyIiAhPSAiJEhPTUUvLmxvY2FsL2Jpbi9oZXJkciIgXTsgdGhlbiBlY2hvICJIRVJEUl9CSU49JGhlcmRyIjsgZmkKICAgIH0gPiAiJERJUi8uZW52IgogICAgb2sgIi5lbnYgY3JlYXRlZCIKICBlbHNlCiAgICBvayAiLmVudiBrZXB0IgogIGZpCiAgY29tcG9zZSBwdWxsIC0tcXVpZXQgfHwgZGllICJDb3VsZCBub3QgcHVsbCB0aGUgd2hlcmRyIGltYWdlLiBDaGVjayB0aGUgbmV0d29yaywgdGhlbiBpbnN0YWxsIHRoZSBwbHVnaW4gYWdhaW4uIgogIG9rICJJbWFnZSBwdWxsZWQiCiAgIyBUaGUgcGFuZWwgcnVucyBmcm9tIHRoZSBjaGVja291dCB3aXRoIG5vZGUgd2hlbiB0aGVyZSBpcyBvbmUuCiAgZmV0Y2hfcXIgIiRST09UIgp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzdGFydApjbWRfc3RhcnQoKSB7CiAgaWYgYW5zd2VyczsgdGhlbgogICAgc2F5ICJ3aGVyZHI6IHNvbWV0aGluZyBhbHJlYWR5IGFuc3dlcnMgb24gcG9ydCAkUE9SVCwgbm90aGluZyB0byBzdGFydCAoJFVSTCkuIgogICAgcmV0dXJuIDAKICBmaQogIGNhc2UgIiRNT0RFIiBpbgogICAgZG9ja2VyKSBzdGFydF9kb2NrZXIgOzsKICAgIG5hdGl2ZSkgc3RhcnRfbmF0aXZlIDs7CiAgICAqKSBkaWUgIndoZXJkciBwbHVnaW4gaXMgbm90IHNldCB1cCAoJENPTkYgaXMgbWlzc2luZyk6IGluc3RhbGwgaXQgYWdhaW4gd2l0aCBoZXJkciBwbHVnaW4gaW5zdGFsbCAkU09VUkNFLiIgOzsKICBlc2FjCiAgaWYgWyAiJE1PREUiID0gIm5hdGl2ZSIgXTsgdGhlbiByZXR1cm4gMDsgZmkKICBpZiB3YWl0X3VwIDQ1OyB0aGVuCiAgICBzYXkgIndoZXJkciBpcyBydW5uaW5nOiAkVVJMIgogIGVsc2UKICAgIHdhcm4gIndoZXJkciBkb2VzIG5vdCBhbnN3ZXIgb24gcG9ydCAkUE9SVCB5ZXQuIExvZzogJChsb2dfaGludCkiCiAgICBleGl0IDEKICBmaQp9CgojIE5hdGl2ZSBtb2RlOiB0aGUgd2hlcmRyIGNvbW1hbmQgKGJpbi93aGVyZHIubWpzKSBkb2VzIHRoZSB3b3JrLCB3aXRoIHRoZQojIHJ1bnRpbWUgc2F2ZWQgYXQgaW5zdGFsbDsgaXQgc2F5cyAic3RhcnRlZCIgb25seSBvbmNlIHRoZSBwb3J0IGFuc3dlcnMuCmVuc3VyZV9ydW50aW1lKCkgewogIGlmICEgcnVudGltZV9vayAiJFJVTlRJTUUiOyB0aGVuCiAgICBzYXZlZD0iJFJVTlRJTUUiCiAgICBSVU5USU1FPSIkKGZpbmRfcnVudGltZSkiIHx8IGRpZSAiJHtzYXZlZDorVGhlIHNhdmVkIHJ1bnRpbWUgKCRzYXZlZCkgaXMgZ29uZS4gfSRSVU5USU1FX0hFTFAiCiAgICB3YXJuICIke3NhdmVkOiskc2F2ZWQgaXMgZ29uZTogfXVzaW5nICRSVU5USU1FIChzYXZlZCBpbiAkQ09ORikuIgogICAgd3JpdGVfY29uZgogIGZpCn0KCmNsaSgpIHsKICBlbnN1cmVfcnVudGltZQogIHNvY2s9IiR7SEVSRFJfU09DS0VUX1BBVEg6LX0iCiAgIyBBIHBsdWdpbiBzdGFydGVkIGZyb20gYSBuYW1lZCBIZXJkciBzZXNzaW9uIGRyaXZlcyB0aGF0IHNlc3Npb24uCiAgc2Vzc2lvbj0iIgogIGNhc2UgIiRzb2NrIiBpbiAqL3Nlc3Npb25zLyovaGVyZHIuc29jaykgc2Vzc2lvbj0iJChiYXNlbmFtZSAiJChkaXJuYW1lICIkc29jayIpIikiIDs7IGVzYWMKICAoCiAgICBjZCAiJERJUiIKICAgIEhFUkRSX0JJTj0iJChoZXJkcl9iaW4pIgogICAgIyBUaGUgcnVudGltZSdzIGZvbGRlciBmaXJzdDogdG9vbHMgaXQgc3RhcnRzIGZpbmQgdGhlIHNhbWUgbm9kZS4KICAgIFBBVEg9IiQoZGlybmFtZSAiJFJVTlRJTUUiKTokUEFUSCIKICAgIGV4cG9ydCBQQVRIIFdIRVJEUl9ESVI9IiRESVIiIFdIRVJEUl9SVU5USU1FPSIkUlVOVElNRSIgSE9TVD0xMjcuMC4wLjEgUE9SVCBIRVJEUl9CSU4KICAgIGlmIFsgLW4gIiRzZXNzaW9uIiBdOyB0aGVuIGV4cG9ydCBIRVJEUl9XRUJfU0VTU0lPTj0iJHNlc3Npb24iOyBmaQogICAgaWYgWyAtbiAiJHNvY2siIF07IHRoZW4gZXhwb3J0IEhFUkRSX1NPQ0s9IiRzb2NrIjsgZmkKICAgIGlmIFsgLW4gIiR7QVBQX1VSTDotfSIgXTsgdGhlbiBleHBvcnQgQVBQX1VSTDsgZmkKICAgIGV4ZWMgIiRSVU5USU1FIiAiJChjbGlfcm9vdCkvYmluL3doZXJkci5tanMiICIkQCIKICApCn0KCnN0YXJ0X25hdGl2ZSgpIHsKICBbIC1mICIkKGNsaV9yb290KS8ub3V0cHV0L3NlcnZlci9pbmRleC5tanMiIF0gfHwgZGllICJ3aGVyZHIgaXMgbm90IGJ1aWx0OiBpbnN0YWxsIHRoZSBwbHVnaW4gYWdhaW4gKGhlcmRyIHBsdWdpbiBpbnN0YWxsICRTT1VSQ0UgLS15ZXMpLiIKICBta2RpciAtcCAiJERJUiIKICBjbGkgc3RhcnQKfQoKc3RhcnRfZG9ja2VyKCkgewogIFsgLWYgIiRESVIvZG9ja2VyLWNvbXBvc2UueW1sIiBdIHx8IGRpZSAiJERJUi9kb2NrZXItY29tcG9zZS55bWwgaXMgbWlzc2luZzogcnVuIHRoZSBVcGRhdGUgYWN0aW9uLiIKICBpZiAhIGNvbnRhaW5lcl9vdXJzOyB0aGVuCiAgICBzYXkgIndoZXJkcjogdGhlIFwiJENPTlRBSU5FUlwiIGNvbnRhaW5lciBiZWxvbmdzIHRvICQoY29udGFpbmVyX2Rpcik7IHN0YXJ0IGl0IGZyb20gdGhlcmUuIE5vdGhpbmcgZG9uZS4iCiAgICBleGl0IDAKICBmaQogICMgQ3JlYXRlZCBhcyB0aGlzIHVzZXIgZmlyc3Q6IERvY2tlciB3b3VsZCBjcmVhdGUgbWlzc2luZyBiaW5kIG1vdW50cyBhcyByb290LgogIG1rZGlyIC1wICIkRElSL2RhdGEiICIkSE9NRS8uY29uZmlnL2hlcmRyIiAiJEhPTUUvLmxvY2FsL3N0YXRlL2hlcmRyL2NsaWVudCIgXAogICAgIiRIT01FLy5jYWNoZS9oZXJkci13ZWIiICIkSE9NRS8uaGVyZHItcHJvamVjdHMiCiAgY29tcG9zZSB1cCAtZCAtLXJlbW92ZS1vcnBoYW5zCiAgb2sgImNvbnRhaW5lciBzdGFydGVkIgp9Cgpsb2dfaGludCgpIHsgZWNobyAiY2QgJERJUiAmJiBkb2NrZXIgY29tcG9zZSBsb2dzIjsgfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHN0b3AKY21kX3N0b3AoKSB7CiAgY2FzZSAiJE1PREUiIGluCiAgICBuYXRpdmUpIGNsaSBzdG9wOyByZXR1cm4gMCA7OwogICAgZG9ja2VyKQogICAgICBpZiBbIC1uICIkKGNvbnRhaW5lcl9kaXIpIiBdICYmIGNvbnRhaW5lcl9vdXJzOyB0aGVuCiAgICAgICAgY29tcG9zZSBzdG9wCiAgICAgICAgc2F5ICJ3aGVyZHIgc3RvcHBlZCAoY29udGFpbmVyICRDT05UQUlORVIpLiIKICAgICAgICByZXR1cm4gMAogICAgICBmaQogICAgICA7OwogIGVzYWMKICBpZiBhbnN3ZXJzOyB0aGVuCiAgICBzYXkgIndoZXJkciBvbiBwb3J0ICRQT1JUIHdhcyBub3Qgc3RhcnRlZCBieSB0aGlzIHBsdWdpbjogbGVmdCBydW5uaW5nLiIKICBlbHNlCiAgICBzYXkgIndoZXJkciBpcyBub3QgcnVubmluZy4iCiAgZmkKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzdGF0dXMKY21kX3N0YXR1cygpIHsKICBpZiBbICIkTU9ERSIgPSAibmF0aXZlIiBdOyB0aGVuCiAgICBjbGkgc3RhdHVzCiAgICBzYXkgIiAgUGx1Z2luICAgbmF0aXZlIG1vZGUsIHNldHRpbmdzIGluICRDT05GIgogICAgcmV0dXJuIDAKICBmaQogIHNheSAiTW9kZTogICAgJHtNT0RFOi1ub3Qgc2V0IHVwfSIKICBzYXkgIkZvbGRlcjogICRESVIiCiAgaWYgYW5zd2VyczsgdGhlbiBzYXkgIlBvcnQ6ICAgICRQT1JUIGFuc3dlcnMgKCRVUkwpIjsgZWxzZSBzYXkgIlBvcnQ6ICAgICRQT1JUIGZyZWUiOyBmaQogIGlmIFsgIiRNT0RFIiA9ICJkb2NrZXIiIF07IHRoZW4KICAgIG93bmVyPSIkKGNvbnRhaW5lcl9kaXIpIgogICAgaWYgWyAteiAiJG93bmVyIiBdOyB0aGVuIHNheSAiQ29udGFpbmVyOiBub25lIgogICAgZWxpZiBjb250YWluZXJfb3VyczsgdGhlbiBzYXkgIkNvbnRhaW5lcjogJENPTlRBSU5FUiAoJChkb2NrZXIgaW5zcGVjdCAiJENPTlRBSU5FUiIgLS1mb3JtYXQgJ3t7LlN0YXRlLlN0YXR1c319JyAyPi9kZXYvbnVsbCkpLCBtYW5hZ2VkIGJ5IHRoZSBwbHVnaW4iCiAgICBlbHNlIHNheSAiQ29udGFpbmVyOiAkQ09OVEFJTkVSLCBtYW5hZ2VkIGZyb20gJG93bmVyIChsZWZ0IGFsb25lKSIKICAgIGZpCiAgZmkKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGxvZ3MsIGRvY3RvcgpjbWRfbG9ncygpIHsKICBjYXNlICIkTU9ERSIgaW4KICAgIG5hdGl2ZSkgY2xpIGxvZ3MgLS1mb2xsb3cgOzsKICAgIGRvY2tlcikgY29tcG9zZSBsb2dzIC0tZm9sbG93IC0tdGFpbCAxMDAgOzsKICAgICopIGRpZSAid2hlcmRyIHBsdWdpbiBpcyBub3Qgc2V0IHVwOiBpbnN0YWxsIGl0IGFnYWluIHdpdGggaGVyZHIgcGx1Z2luIGluc3RhbGwgJFNPVVJDRS4iIDs7CiAgZXNhYwp9CgpjbWRfZG9jdG9yKCkgewogIGlmIFsgIiRNT0RFIiA9ICJuYXRpdmUiIF07IHRoZW4gY2xpIGRvY3RvcjsgZWxzZSBjbWRfc3RhdHVzOyBmaQp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gb3BlbgojIFRoZSBkZWZhdWx0IGJyb3dzZXIsIG9uIGEgY29tcHV0ZXIgd2l0aCBhIHNjcmVlbiBvbmx5OiBgb3BlbmAgb24gbWFjT1MsCiMgYHhkZy1vcGVuYCBvbiBMaW51eCB3aXRoIGEgZGlzcGxheS4gRmFpbHMgKG9wZW5zIG5vdGhpbmcpIG9uIGEgaGVhZGxlc3Mgc2VydmVyLAojIG9yIHdpdGggV0hFUkRSX05PX0JST1dTRVI9MSAoc2V0IGJ5IGh0dHBzOi8vd2hlcmRyLmRldi9pbnN0YWxsIG92ZXIgU1NIKS4Kb3Blbl9icm93c2VyKCkgewogIGlmIFsgIiR7V0hFUkRSX05PX0JST1dTRVI6LTB9IiA9ICIxIiBdOyB0aGVuIHJldHVybiAxCiAgZWxpZiBbICIkKHVuYW1lIC1zKSIgPSAiRGFyd2luIiBdICYmIGNvbW1hbmQgLXYgb3BlbiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gb3BlbiAiJDEiCiAgZWxpZiBbIC1uICIke0RJU1BMQVk6LX0ke1dBWUxBTkRfRElTUExBWTotfSIgXSAmJiBjb21tYW5kIC12IHhkZy1vcGVuID4vZGV2L251bGwgMj4mMTsgdGhlbiB4ZGctb3BlbiAiJDEiID4vZGV2L251bGwgMj4mMSAmCiAgZWxzZSByZXR1cm4gMQogIGZpCn0KCiMgVGhlIHRhaWxzY2FsZSBDTEk6IG9uIHRoZSBQQVRILCBvciBpbnNpZGUgdGhlIG1hY09TIGFwcC4KdGFpbHNjYWxlX2JpbigpIHsKICBpZiBjb21tYW5kIC12IHRhaWxzY2FsZSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gY29tbWFuZCAtdiB0YWlsc2NhbGUKICBlbGlmIFsgLXggL0FwcGxpY2F0aW9ucy9UYWlsc2NhbGUuYXBwL0NvbnRlbnRzL01hY09TL1RhaWxzY2FsZSBdOyB0aGVuIGVjaG8gL0FwcGxpY2F0aW9ucy9UYWlsc2NhbGUuYXBwL0NvbnRlbnRzL01hY09TL1RhaWxzY2FsZQogIGVsc2UgcmV0dXJuIDEKICBmaQp9CgojICI8bWFjaGluZT4uPHRhaWxuZXQ+LnRzLm5ldFs6cG9ydF0iIG9mIHRoZSBhZGRyZXNzIGB0YWlsc2NhbGUgc2VydmVgCiMgcHVibGlzaGVzIGZvciB3aGVyZHIncyBsb2NhbCBwb3J0LCByZWFkIGZyb20gVGFpbHNjYWxlIG9uIHRoaXMgbWFjaGluZS4Kc2VydmVkX2hvc3QoKSB7CiAgdHM9IiQodGFpbHNjYWxlX2JpbikiIHx8IHJldHVybiAxCiAgIyAiPG5hbWU+OjxodHRwcyBwb3J0PiIgb2YgdGhlIFdlYiBlbnRyeSB3aG9zZSBwcm94eSB0YXJnZXRzIG91ciBwb3J0LgogIGhvc3Q9IiQoIiR0cyIgc2VydmUgc3RhdHVzIC0tanNvbiAyPi9kZXYvbnVsbCB8IHRyICd7LCcgJ1xuXG4nIHwgYXdrIC12IHBvcnQ9IiRQT1JUIiAnCiAgICAvIlteIl0qOlswLTldKyJbIFx0XSo6WyBcdF0qJC8geyBrZXkgPSAkMDsgc3ViKC9eW14iXSoiLywgIiIsIGtleSk7IHN1YigvIi4qJC8sICIiLCBrZXkpIH0KICAgIC8iUHJveHkiLyAmJiAkMCB+ICgiXCIoaHR0cHM/Oi8vKT8oMTI3XFwuMFxcLjBcXC4xfGxvY2FsaG9zdCk6IiBwb3J0ICIvP1wiIikgeyBwcmludCBrZXk7IGV4aXQgfScpIgogIFsgLW4gIiRob3N0IiBdIHx8IHJldHVybiAxCiAgcHJpbnRmICclc1xuJyAiJHtob3N0JTo0NDN9Igp9CgojIHdoZXJkciBhZG9wdHMgdGhlIGFkZHJlc3MgYHRhaWxzY2FsZSBzZXJ2ZWAgcHVibGlzaGVzIGJ5IGl0c2VsZjogYSBsb2NhbAojIHJlcXVlc3QgbWFrZXMgaXQgcmVhZCBUYWlsc2NhbGUgYWdhaW4gYXQgb25jZS4gQSBjb250YWluZXIgc3RhcnRlZCB3aXRob3V0CiMgVGFpbHNjYWxlJ3Mgc29ja2V0IChhbiBvbGRlciBkb2NrZXItY29tcG9zZS55bWwpIGNhbm5vdCByZWFkIGl0OiB0aGUgYWRkcmVzcwojIHJlYWQgaGVyZSwgb24gdGhlIGhvc3QsIGlzIHNlbnQgdG8gaXQgaW5zdGVhZC4gQm90aCBvbmx5IHdvcmsgZnJvbSB0aGlzCiMgbWFjaGluZSAoc2VydmVyL3V0aWxzL3Bob25lLnRzLCBwaG9uZUFjY2VzcykuCmFkb3B0X2FkZHJlc3MoKSB7CiAgY29tbWFuZCAtdiBjdXJsID4vZGV2L251bGwgMj4mMSB8fCByZXR1cm4gMAogIGN1cmwgLXMgLW8gL2Rldi9udWxsIC0tbWF4LXRpbWUgMjAgLUggJ2NvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vanNvbicgXAogICAgLWQgIntcImFjdGlvblwiOlwiYWRkcmVzc1wiLFwidXJsXCI6XCJodHRwczovLyQxL1wifSIgImh0dHA6Ly8xMjcuMC4wLjE6JFBPUlQvYXBpL3Bob25lIiAyPi9kZXYvbnVsbCB8fCB0cnVlCn0KCiMgRG9lcyB0aGUgcGhvbmUgYWRkcmVzcyBhbnN3ZXI/ICJvayIgKHdoZXJkciwgYW5kIGl0IGFjY2VwdHMgdGhhdCBhZGRyZXNzKSwKIyAiaG9zdCIgKHdoZXJkciByZWZ1c2VzIHRoYXQgYWRkcmVzcyksIG9yICJub25lIi4gL2FwaS9oZWFsdGggZ29lcyB0aHJvdWdoCiMgd2hlcmRyJ3MgaG9zdCBjaGVjazsgdGhlIHN0YXRpYyBtYW5pZmVzdCBhbnN3ZXJzIGZvciBhbnkgaG9zdCBuYW1lIGFuZCBvbmx5CiMgcmVjb2duaXplcyBhIHdoZXJkciBvbGRlciB0aGFuIHRoYXQgcm91dGUuCnBob25lX3JlYWNoKCkgewogIGNvbW1hbmQgLXYgY3VybCA+L2Rldi9udWxsIDI+JjEgfHwgeyBlY2hvIG5vbmU7IHJldHVybiAwOyB9CiAgYm9keT0iJChjdXJsIC1zIC0tbWF4LXRpbWUgOCAiJHsxfWFwaS9oZWFsdGgiIDI+L2Rldi9udWxsIHx8IHRydWUpIgogIGNhc2UgIiRib2R5IiBpbgogICAgKicibmFtZSI6IndoZXJkciInKikgZWNobyBvayA7OwogICAgKiciY29kZSI6Imhvc3QiJyopIGVjaG8gaG9zdCA7OwogICAgKikgaWYgY3VybCAtZnNTIC0tbWF4LXRpbWUgOCAiJHsxfW1hbmlmZXN0LndlYm1hbmlmZXN0IiAyPi9kZXYvbnVsbCB8IGdyZXAgLXEgd2hlcmRyOyB0aGVuIGVjaG8gb2s7IGVsc2UgZWNobyBub25lOyBmaSA7OwogIGVzYWMKfQoKIyBUaGUgdGFpbG5ldCBhZGRyZXNzIGB0YWlsc2NhbGUgc2VydmVgIGFscmVhZHkgcHVibGlzaGVzIGZvciB3aGVyZHIncyBsb2NhbAojIHBvcnQgKGh0dHBzOi8vPG1hY2hpbmU+Ljx0YWlsbmV0Pi50cy5uZXRbOnBvcnRdKSwgb25seSB3aGVuIGl0IGFuc3dlcnMgbGlrZQojIHdoZXJkci4gUGFzc2tleXMgYXJlIHRpZWQgdG8gdGhlIGFkZHJlc3M6IHRoYXQgaXMgdGhlIG9uZSB0byBvcGVuLgp0YWlsbmV0X2FkZHJlc3MoKSB7CiAgY29tbWFuZCAtdiBjdXJsID4vZGV2L251bGwgMj4mMSB8fCByZXR1cm4gMQogIGhvc3Q9IiQoc2VydmVkX2hvc3QpIiB8fCByZXR1cm4gMQogIGFkb3B0X2FkZHJlc3MgIiRob3N0IgogIFsgIiQocGhvbmVfcmVhY2ggImh0dHBzOi8vJGhvc3QvIikiID0gb2sgXSB8fCByZXR1cm4gMQogIHByaW50ZiAnaHR0cHM6Ly8lc1xuJyAiJGhvc3QiCn0KCiMgVGhlIGFkZHJlc3MgdG8gb3BlbjogdGhlIHRhaWxuZXQgb25lIHdoZW4gcHVibGlzaGVkIGFuZCBhbnN3ZXJpbmcsIGVsc2UgbG9jYWxob3N0LgpvcGVuX2FkZHJlc3MoKSB7IHRhaWxuZXRfYWRkcmVzcyB8fCBwcmludGYgJyVzXG4nICIkVVJMIjsgfQoKY21kX29wZW4oKSB7CiAgYWRkcmVzcz0iJChvcGVuX2FkZHJlc3MpIgogIG9wZW5fYnJvd3NlciAiJGFkZHJlc3MiIHx8IHRydWUKICBzYXkgIiRhZGRyZXNzIgp9CgojIGBhZGRyZXNzYDogd2hhdCBgb3BlbmAgd291bGQgb3Blbiwgd2l0aG91dCBvcGVuaW5nIGl0IChodHRwczovL3doZXJkci5kZXYvaW5zdGFsbCkuCmNtZF9hZGRyZXNzKCkgeyBvcGVuX2FkZHJlc3M7IH0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdXBkYXRlCmNtZF91cGRhdGUoKSB7CiAgY2FzZSAiJE1PREUiIGluCiAgICBkb2NrZXIpCiAgICAgIGNvbnRhaW5lcl9vdXJzIHx8IGRpZSAiVGhlIFwiJENPTlRBSU5FUlwiIGNvbnRhaW5lciBiZWxvbmdzIHRvICQoY29udGFpbmVyX2Rpcik6IHVwZGF0ZSBpdCBmcm9tIHRoZXJlLiIKICAgICAgY29tcG9zZSBwdWxsIC0tcXVpZXQKICAgICAgaWYgWyAiJChkb2NrZXIgaW5zcGVjdCAiJENPTlRBSU5FUiIgLS1mb3JtYXQgJ3t7LlN0YXRlLlJ1bm5pbmd9fScgMj4vZGV2L251bGwpIiA9ICJ0cnVlIiBdOyB0aGVuCiAgICAgICAgY29tcG9zZSB1cCAtZCAtLXJlbW92ZS1vcnBoYW5zCiAgICAgICAgc2F5ICJ3aGVyZHIgdXBkYXRlZCBhbmQgcmVzdGFydGVkLiIKICAgICAgZWxzZQogICAgICAgIHNheSAid2hlcmRyIGltYWdlIHVwZGF0ZWQ7IGl0IHJ1bnMgdGhlIG5ldyB2ZXJzaW9uIGF0IHRoZSBuZXh0IHN0YXJ0LiIKICAgICAgZmkKICAgICAgOzsKICAgIG5hdGl2ZSkKICAgICAgIyBBIG5ldyBjaGVja291dCwgYSBuZXcgY29weSBpbiAkQVBQLCBhbmQgd2hlcmRyIHJlc3RhcnRlZCAoYnVpbGRfc3RhcnQpLgogICAgICBzYXkgIlVwZGF0aW5nIHRoZSB3aGVyZHIgcGx1Z2luIGZyb20gJFNPVVJDReKApiIKICAgICAgIiQoaGVyZHJfYmluKSIgcGx1Z2luIGluc3RhbGwgIiRTT1VSQ0UiIC0teWVzCiAgICAgIDs7CiAgICAqKSBkaWUgIndoZXJkciBwbHVnaW4gaXMgbm90IHNldCB1cDogaW5zdGFsbCBpdCBhZ2FpbiB3aXRoIGhlcmRyIHBsdWdpbiBpbnN0YWxsICRTT1VSQ0UuIiA7OwogIGVzYWMKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGhvbmUKdGFpbG5ldF9uYW1lKCkgewogIHRzPSIkKHRhaWxzY2FsZV9iaW4pIiB8fCByZXR1cm4gMQogICMgU2VsZiBjb21lcyBiZWZvcmUgUGVlciBpbiBgdGFpbHNjYWxlIHN0YXR1cyAtLWpzb25gOiB0aGUgZmlyc3QgRE5TTmFtZSBpcyB0aGlzIG1hY2hpbmUuCiAgIiR0cyIgc3RhdHVzIC0tanNvbiAyPi9kZXYvbnVsbCB8IHNlZCAtbiAncy8uKiJETlNOYW1lIjogKiJcKFteIl0qXClcLiIuKi9cMS9wJyB8IGhlYWQgLW4gMQp9CgojIFRoZSBwaG9uZSBzZXR1cCBpcyBhIHBhZ2Ugb2YgdGhlIGFwcCAoU2V0dGluZ3Mg4oC6IFBob25lKTsgYHdoZXJkciBwaG9uZWAKIyBwcmludHMgdGhlIHN0YXRlIGFuZCBpdHMgbGluay4gRG9ja2VyIHdpdGhvdXQgTm9kZS5qczogdGhlIHNhbWUgc3RhdGUgZnJvbQojIGhlcmUsIHdoZXJlIHRoZSB0YWlsc2NhbGUgY29tbWFuZCBpczogcHVibGlzaGVkIG9yIG5vdCwgdGhlIGFkZHJlc3MgaGFuZGVkCiMgdG8gd2hlcmRyIChhZG9wdF9hZGRyZXNzKSwgYW5kIHdoZXRoZXIgaXQgYW5zd2Vycy4KY21kX3Bob25lKCkgewogIGlmIFsgIiRNT0RFIiA9ICJuYXRpdmUiIF07IHRoZW4gY2xpIHBob25lOyByZXR1cm4gMDsgZmkKICBzYXkgIiIKICBzYXkgIiAgV0hFUkRSIMK3IFBIT05FIFNFVFVQIgogIHNheSAiIgogIGlmIGFuc3dlcnM7IHRoZW4gc2F5ICIgIOKckyB3aGVyZHIgYW5zd2VycyBvbiAkVVJMIjsgZWxzZSBzYXkgIiAgISB3aGVyZHIgaXMgbm90IHJ1bm5pbmc6IHByZXNzIFMgaW4gdGhlIHdoZXJkciBwYW5lbCBmaXJzdC4iOyBmaQogIHB1Ymxpc2g9InRhaWxzY2FsZSBzZXJ2ZSAtLWJnIC0taHR0cHM9JFBPUlQgaHR0cDovLzEyNy4wLjAuMTokUE9SVCIKICBuYW1lPSIkKHRhaWxuZXRfbmFtZSB8fCB0cnVlKSIKICBob3N0PSIkKHNlcnZlZF9ob3N0IHx8IHRydWUpIgogIGlmIFsgLW4gIiRob3N0IiBdOyB0aGVuCiAgICBwaG9uZT0iaHR0cHM6Ly8kaG9zdC8iCiAgICBhZG9wdF9hZGRyZXNzICIkaG9zdCIKICAgIHJlYWNoPSIkKHBob25lX3JlYWNoICIkcGhvbmUiKSIKICAgIGlmIFsgIiRyZWFjaCIgPSBvayBdOyB0aGVuCiAgICAgIHNheSAiICDinJMgJHBob25lIGFuc3dlcnMiCiAgICAgIHNheSAiIgogICAgICBpZiBjb21tYW5kIC12IHFyZW5jb2RlID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgIHFyZW5jb2RlIC10IEFOU0lVVEY4IC1tIDIgIiRwaG9uZSIKICAgICAgZWxzZQogICAgICAgIHNheSAiICAoSW5zdGFsbCBxcmVuY29kZSB0byBzaG93IGEgUVIgY29kZSBvZiAkcGhvbmUgaGVyZS4pIgogICAgICBmaQogICAgICBzYXkgIiAgT3BlbiBpdCBvbiB0aGUgcGhvbmUsIGFkZCBpdCB0byB0aGUgaG9tZSBzY3JlZW4sIHRoZW4gaW4gdGhlIGFwcDoiCiAgICAgIHNheSAiICBTZXR0aW5ncyDihpIgRW5hYmxlIG5vdGlmaWNhdGlvbnMsIHRoZW4gU2VjdXJpdHkg4oaSIEVuYWJsZSBwYXNza2V5IGxvY2suIgogICAgZWxpZiBbICIkcmVhY2giID0gaG9zdCBdOyB0aGVuCiAgICAgIHNheSAiICAhIE5vdCByZWFjaGFibGUgZnJvbSB5b3VyIHBob25lIHlldDogd2hlcmRyIGFuc3dlcnMgb24gJHBob25lIGJ1dCByZWZ1c2VzIHRoYXQgYWRkcmVzcy4iCiAgICAgIHNheSAiICAgIFJlc3RhcnQgd2hlcmRyIChYIHRoZW4gUyBpbiB0aGUgcGFuZWwpOiBpdCByZWFkcyBUYWlsc2NhbGUgYXQgc3RhcnR1cC4gVGhlbiBydW4gdGhpcyBhZ2Fpbi4iCiAgICBlbHNlCiAgICAgIHNheSAiICAhIE5vdCByZWFjaGFibGUgZnJvbSB5b3VyIHBob25lIHlldDogJHBob25lIGlzIHB1Ymxpc2hlZCBidXQgZG9lcyBub3QgYW5zd2VyIGxpa2Ugd2hlcmRyLiIKICAgICAgc2F5ICIgICAgQSBuZXcgYWRkcmVzcyBjYW4gdGFrZSBhIG1pbnV0ZSAoSFRUUFMgY2VydGlmaWNhdGUpOyB0aGVuIHJ1biB0aGlzIGFnYWluLiIKICAgIGZpCiAgZWxpZiAhIHRhaWxzY2FsZV9iaW4gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBzYXkgIiAgISBUYWlsc2NhbGUgaXMgbm90IGluc3RhbGxlZCBvbiB0aGlzIG1hY2hpbmU6IGh0dHBzOi8vdGFpbHNjYWxlLmNvbS9kb3dubG9hZCIKICAgIHNheSAiICAgIFlvdXIgcGhvbmUgbmVlZHMgaXQgdG9vIChzYW1lIGFjY291bnQpLCB3aXRoIEhUVFBTIGNlcnRpZmljYXRlcyBlbmFibGVkLiIKICBlbGlmIFsgLXogIiRuYW1lIiBdOyB0aGVuCiAgICBzYXkgIiAgISBUYWlsc2NhbGUgaXMgbm90IGNvbm5lY3RlZCBvbiB0aGlzIG1hY2hpbmU6IHRhaWxzY2FsZSB1cCIKICBlbHNlCiAgICBzYXkgIiAgISBOb3QgcmVhY2hhYmxlIGZyb20geW91ciBwaG9uZSB5ZXQ6IHdoZXJkciBpcyBub3QgcHVibGlzaGVkIG9uIHlvdXIgdGFpbG5ldC4iCiAgICBzYXkgIiAgICBQdWJsaXNoIGl0IChwcml2YXRlLCBvbmx5IHlvdXIgVGFpbHNjYWxlIGRldmljZXMpOiIKICAgIHNheSAiICAgICAgJHB1Ymxpc2giCiAgICBzYXkgIiAgICB3aGVyZHIgZW5hYmxlcyBodHRwczovLyRuYW1lOiRQT1JULyBieSBpdHNlbGY7IHJ1biB0aGlzIGFnYWluIGZvciBpdHMgUVIgY29kZS4iCiAgZmkKICBzYXkgIiIKICBzYXkgIiAgR3VpZGU6IGh0dHBzOi8vZ2l0aHViLmNvbS8kU09VUkNFI2luc3RhbGwtaXQtYXMtYW4tYXBwIgp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzZXJ2aWNlCmNtZF9zZXJ2aWNlKCkgewogIGNhc2UgIiR7MTotfSIgaW4gaW5zdGFsbHx1bmluc3RhbGwpIDs7ICopIGRpZSAidXNhZ2U6ICQwIHNlcnZpY2UgaW5zdGFsbHx1bmluc3RhbGwiIDs7IGVzYWMKICBpZiBbICIkTU9ERSIgPSAiZG9ja2VyIiBdOyB0aGVuCiAgICBzYXkgIndoZXJkciBydW5zIGluIERvY2tlcjogdGhlIGNvbnRhaW5lciBhbHJlYWR5IHN0YXJ0cyB3aXRoIERvY2tlciAocmVzdGFydDogYWx3YXlzKS4iCiAgICByZXR1cm4gMAogIGZpCiAgY2xpIHNlcnZpY2UgIiQxIgogICMgV2l0aG91dCB0aGUgc2VydmljZSwgdGhlIHBsdWdpbiBydW5zIHdoZXJkciBhZ2FpbiAoYW5kIGl0cyBzdGFydHVwIGhvb2sKICAjIHN0YXJ0cyBpdCB3aXRoIEhlcmRyKS4KICBpZiBbICIkMSIgPSAidW5pbnN0YWxsIiBdOyB0aGVuIGNtZF9zdGFydDsgZmkKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0ga2V5CiMgQSBIZXJkciBrZXkgdGhhdCBvcGVucyB0aGUgd2hlcmRyIHBhbmVsOiBIZXJkciB2MSBwbHVnaW5zIGhhdmUgbm8gbWVudSwgc28KIyB0aGUgaW5zdGFsbCBhcHBlbmRzIG9uZSBtYXJrZWQgW1trZXlzLmNvbW1hbmRdXSBibG9jayB0byBIZXJkcidzCiMgY29uZmlnLnRvbWwsIG9uIHRoZSBmaXJzdCBmcmVlIGtleSBvZiBIT1RLRVlTIChuZXZlciBvbmUgSGVyZHIgb3IgdGhlIHVzZXIKIyBhbHJlYWR5IGJpbmRzKS4gRXhpc3RpbmcgbGluZXMgYXJlIG5ldmVyIGNoYW5nZWQ6IHRoZSBibG9jayBpcyBvbmx5IGV2ZXIKIyBhcHBlbmRlZCwgdGhlbiByZW1vdmVkIGJ5IGBrZXkgdW5pbnN0YWxsYC4gTm90aGluZyBpcyBhZGRlZCB3aGVuIHRoZSBwYW5lbAojIGFscmVhZHkgaGFzIGEga2V5LCBvciB3aGVuIG5vIGNhbmRpZGF0ZSBpcyBmcmVlLgpIT1RLRVlTPSIke1dIRVJEUl9IT1RLRVlTOi1wcmVmaXgraSBwcmVmaXgrdSBwcmVmaXgreSBwcmVmaXgrbSBwcmVmaXgrYWx0K3d9IgpIRVJEUl9DT05GSUc9IiR7SEVSRFJfQ09ORklHX1BBVEg6LSR7WERHX0NPTkZJR19IT01FOi0kSE9NRS8uY29uZmlnfS9oZXJkci9jb25maWcudG9tbH0iClBMVUdJTl9JRD0iJChwcmludGYgJyVzJyAiJFNPVVJDRSIgfCB0ciAvIC4pIgpQQU5FTF9BQ1RJT049IiRQTFVHSU5fSUQucGFuZWwiCktFWV9CRUdJTj0iIyB3aGVyZHI6IGtleSB0aGF0IG9wZW5zIHRoZSB3aGVyZHIgcGFuZWwgKHJlbW92ZSB0aGlzIGJsb2NrIHRvIHVuYmluZCBpdCkiCktFWV9FTkQ9IiMgZW5kIHdoZXJkciIKCiMgSGVyZHIncyBkZWZhdWx0IGtleW1hcCwgZnJvbSB0aGUgcnVubmluZyBiaW5hcnkgd2hlbiBpdCBjYW4gcHJpbnQgaXQsCiMgb3RoZXJ3aXNlIGFzIG9mIEhlcmRyIDAuOS4zICgibmFtZTxUQUI+a2V5IiBsaW5lcykuCmRlZmF1bHRfa2V5cygpIHsKICBvdXQ9IiQoIiQoaGVyZHJfYmluKSIgLS1kZWZhdWx0LWNvbmZpZyAyPi9kZXYvbnVsbCB8IGF3ayAnCiAgICAvXlxba2V5c1xdLyB7IGsgPSAxOyBuZXh0IH0KICAgIGsgJiYgL15cWy8geyBleGl0IH0KICAgIGsgJiYgbWF0Y2goJDAsIC9eIyBbYS16X10rID0gIlteIl0qIi8pIHsKICAgICAgbGluZSA9IHN1YnN0cigkMCwgMywgUkxFTkdUSCAtIDIpOyBlcSA9IGluZGV4KGxpbmUsICIgPSAiKQogICAgICB2ID0gc3Vic3RyKGxpbmUsIGVxICsgNCk7IHN1YigvIiQvLCAiIiwgdikKICAgICAgaWYgKHYgIT0gIiIpIHByaW50ZiAiJXNcdCVzXG4iLCBzdWJzdHIobGluZSwgMSwgZXEgLSAxKSwgdgogICAgfScpIiB8fCBvdXQ9IiIKICBpZiBbIC1uICIkb3V0IiBdOyB0aGVuIHByaW50ZiAnJXNcbicgIiRvdXQiOyByZXR1cm47IGZpCiAgZm9yIHAgaW4gaGVscDo/IHNldHRpbmdzOnMgZGV0YWNoOnEgcmVsb2FkX2NvbmZpZzpzaGlmdCtyIG9wZW5fbm90aWZpY2F0aW9uX3RhcmdldDpvIFwKICAgIHdvcmtzcGFjZV9waWNrZXI6dyBnb3RvOmcgbmV3X3dvcmtzcGFjZTpzaGlmdCtuIG5ld193b3JrdHJlZTpzaGlmdCtnIHJlbmFtZV93b3Jrc3BhY2U6c2hpZnQrdyBcCiAgICBjbG9zZV93b3Jrc3BhY2U6c2hpZnQrZCBuZXdfdGFiOmMgcmVuYW1lX3RhYjpzaGlmdCt0IHByZXZpb3VzX3RhYjpwIG5leHRfdGFiOm4gXAogICAgY2xvc2VfdGFiOnNoaWZ0K3ggcmVuYW1lX3BhbmU6c2hpZnQrcCBlZGl0X3Njcm9sbGJhY2s6ZSBmb2N1c19wYW5lX2xlZnQ6aCBmb2N1c19wYW5lX2Rvd246aiBcCiAgICBmb2N1c19wYW5lX3VwOmsgZm9jdXNfcGFuZV9yaWdodDpsIGN5Y2xlX3BhbmVfbmV4dDp0YWIgY3ljbGVfcGFuZV9wcmV2aW91czpzaGlmdCt0YWIgXAogICAgc3BsaXRfdmVydGljYWw6diBzcGxpdF9ob3Jpem9udGFsOm1pbnVzIGNsb3NlX3BhbmU6eCB6b29tOnogcmVzaXplX21vZGU6ciB0b2dnbGVfc2lkZWJhcjpiOyBkbwogICAgcHJpbnRmICclc1x0cHJlZml4KyVzXG4nICIke3AlJToqfSIgIiR7cCMqOn0iCiAgZG9uZQp9CgojIE9uZSBsaW5lIG9uIHRoZSBjb25maWc6ICJib3VuZCA8a2V5PiIgd2hlbiBhIFtba2V5cy5jb21tYW5kXV0gYWxyZWFkeSBydW5zCiMgdGhlIHBhbmVsLCBlbHNlICJmcmVlIDxrZXk+IiAoZmlyc3QgZnJlZSBjYW5kaWRhdGUpIG9yICJub25lIi4gQWxzbwojICJvbGQgPGtleT4iIGZvciBhIGJpbmRpbmcgb2YgdGhlIHBhbmVsJ3MgZm9ybWVyIGFjdGlvbiBpZCAoPGlkPi53aGVyZHIpLgprZXlfc2NhbigpIHsKICBkZWZhdWx0cz0iJChkZWZhdWx0X2tleXMpIgogIHsgcHJpbnRmICclc1xuJyAiJGRlZmF1bHRzIjsgcHJpbnRmICdcMDAxXG4nOyBjYXQgIiRIRVJEUl9DT05GSUciIDI+L2Rldi9udWxsOyB9IHwgYXdrIFwKICAgIC12IGNhbmRzPSIkSE9US0VZUyIgLXYgYWN0aW9uPSIkUEFORUxfQUNUSU9OIiAtdiBvbGQ9IiRQTFVHSU5fSUQud2hlcmRyIiAnCiAgICBmdW5jdGlvbiBub3JtKGspIHsKICAgICAgZ3N1YigvWyBcdF0vLCAiIiwgaykKICAgICAgIyAicHJlZml4K1ciIGlzICJwcmVmaXgrc2hpZnQrdyIKICAgICAgaWYgKG1hdGNoKGssIC9cK1tBLVpdJC8pKSBrID0gc3Vic3RyKGssIDEsIFJTVEFSVCkgInNoaWZ0KyIgdG9sb3dlcihzdWJzdHIoaywgUlNUQVJUICsgMSkpCiAgICAgIHJldHVybiB0b2xvd2VyKGspCiAgICB9CiAgICBmdW5jdGlvbiBzdHJpbmdzKHMsIG91dCwgICBuKSB7CiAgICAgIG4gPSAwCiAgICAgIHdoaWxlIChtYXRjaChzLCAvIlteIl0qIi8pKSB7IG91dFsrK25dID0gc3Vic3RyKHMsIFJTVEFSVCArIDEsIFJMRU5HVEggLSAyKTsgcyA9IHN1YnN0cihzLCBSU1RBUlQgKyBSTEVOR1RIKSB9CiAgICAgIHJldHVybiBuCiAgICB9CiAgICBmdW5jdGlvbiBmbHVzaCgpIHsKICAgICAgaWYgKGNrZXkgIT0gIiIgJiYgY21kID09IGFjdGlvbiAmJiBib3VuZCA9PSAiIikgYm91bmQgPSBja2V5CiAgICAgIGlmIChja2V5ICE9ICIiICYmIGNtZCA9PSBvbGQgJiYgb2xka2V5ID09ICIiKSBvbGRrZXkgPSBja2V5CiAgICAgIGNrZXkgPSAiIjsgY21kID0gIiIKICAgIH0KICAgICQwID09ICJcMDAxIiB7IGNvbmYgPSAxOyBuZXh0IH0KICAgICFjb25mIHsgc3BsaXQoJDAsIGQsICJcdCIpOyBkZWZbZFsxXV0gPSBkWzJdOyBuZXh0IH0KICAgIC9eWyBcdF0qXFsvIHsKICAgICAgZmx1c2goKTsgdCA9ICQwOyBzdWIoLyMuKi8sICIiLCB0KTsgZ3N1YigvWyBcdF0vLCAiIiwgdCkKICAgICAgc2VjdCA9IHQgPT0gIltrZXlzXSIgPyAia2V5cyIgOiB0ID09ICJbW2tleXMuY29tbWFuZF1dIiA/ICJjbWQiIDogIiIKICAgICAgbmV4dAogICAgfQogICAgL15bIFx0XSooI3wkKS8geyBuZXh0IH0KICAgIHsKICAgICAgZXEgPSBpbmRleCgkMCwgIj0iKTsgaWYgKCFlcSkgbmV4dAogICAgICBuYW1lID0gc3Vic3RyKCQwLCAxLCBlcSAtIDEpOyBnc3ViKC9bIFx0XS8sICIiLCBuYW1lKTsgdmFsID0gc3Vic3RyKCQwLCBlcSArIDEpCiAgICAgIGlmIChzZWN0ID09ICJrZXlzIikgewogICAgICAgIG92ZXJbbmFtZV0gPSAxOyBuID0gc3RyaW5ncyh2YWwsIHMpCiAgICAgICAgZm9yIChpID0gMTsgaSA8PSBuOyBpKyspIHRha2VuW25vcm0oc1tpXSldID0gMQogICAgICB9IGVsc2UgaWYgKHNlY3QgPT0gImNtZCIgJiYgc3RyaW5ncyh2YWwsIHMpKSB7CiAgICAgICAgaWYgKG5hbWUgPT0gImtleSIpIHsgY2tleSA9IHNbMV07IHRha2VuW25vcm0oc1sxXSldID0gMSB9CiAgICAgICAgaWYgKG5hbWUgPT0gImNvbW1hbmQiKSBjbWQgPSBzWzFdCiAgICAgIH0KICAgIH0KICAgIEVORCB7CiAgICAgIGZsdXNoKCkKICAgICAgaWYgKG9sZGtleSAhPSAiIikgcHJpbnQgIm9sZCAiIG9sZGtleQogICAgICBpZiAoYm91bmQgIT0gIiIpIHsgcHJpbnQgImJvdW5kICIgYm91bmQ7IGV4aXQgfQogICAgICBmb3IgKGEgaW4gZGVmKSBpZiAoIShhIGluIG92ZXIpKSB0YWtlbltub3JtKGRlZlthXSldID0gMQogICAgICBuID0gc3BsaXQoY2FuZHMsIGMsICIgIikKICAgICAgZm9yIChpID0gMTsgaSA8PSBuOyBpKyspIGlmICghKG5vcm0oY1tpXSkgaW4gdGFrZW4pKSB7IHByaW50ICJmcmVlICIgY1tpXTsgZXhpdCB9CiAgICAgIHByaW50ICJub25lIgogICAgfScKfQoKIyBUaGUga2V5IGJvdW5kIHRvIHRoZSBwYW5lbCwgaWYgYW55LgprZXlfYm91bmQoKSB7IGtleV9zY2FuIHwgc2VkIC1uICdzL15ib3VuZCAvL3AnOyB9CgojIEhlcmRyIGFwcGxpZXMga2V5YmluZGluZ3Mgb24gYGhlcmRyIHNlcnZlciByZWxvYWQtY29uZmlnYCAobm8gcmVzdGFydCkuCmtleV9yZWxvYWQoKSB7CiAgaWYgIiQoaGVyZHJfYmluKSIgc2VydmVyIHJlbG9hZC1jb25maWcgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICB0ZWxsICIgIEhlcmRyIHJlbG9hZGVkIGl0cyBjb25maWc6IG5vIHJlc3RhcnQgbmVlZGVkLiIKICBlbHNlCiAgICB0ZWxsICIgIFJ1biBoZXJkciBzZXJ2ZXIgcmVsb2FkLWNvbmZpZyAob3IgcmVzdGFydCBIZXJkcikgdG8gYXBwbHkgaXQuIgogIGZpCn0KCmNtZF9rZXkoKSB7CiAgY2FzZSAiJHsxOi19IiBpbgogICAgaW5zdGFsbCkKICAgICAgc2Nhbj0iJChrZXlfc2NhbikiCiAgICAgIG9sZD0iJChwcmludGYgJyVzXG4nICIkc2NhbiIgfCBzZWQgLW4gJ3MvXm9sZCAvL3AnKSIKICAgICAgWyAteiAiJG9sZCIgXSB8fCB3YXJuICIkb2xkIHJ1bnMgJFBMVUdJTl9JRC53aGVyZHIsIHJlbmFtZWQgJFBBTkVMX0FDVElPTjogZWRpdCB0aGF0IGxpbmUgb2YgJEhFUkRSX0NPTkZJRy4iCiAgICAgIHJlcz0iJChwcmludGYgJyVzXG4nICIkc2NhbiIgfCBzZWQgJy9eb2xkIC9kJykiCiAgICAgIGNhc2UgIiRyZXMiIGluCiAgICAgICAgYm91bmRcICopIHRlbGwgIlByZXNzICR7cmVzI2JvdW5kIH0gaW4gSGVyZHIgdG8gb3BlbiB0aGUgd2hlcmRyIHBhbmVsLiIgOzsKICAgICAgICBmcmVlXCAqKQogICAgICAgICAga2V5PSIke3JlcyNmcmVlIH0iCiAgICAgICAgICBta2RpciAtcCAiJChkaXJuYW1lICIkSEVSRFJfQ09ORklHIikiCiAgICAgICAgICBibG9jaz0iJChwcmludGYgJyVzXG5bW2tleXMuY29tbWFuZF1dXG5rZXkgPSAiJXMiXG50eXBlID0gInBsdWdpbl9hY3Rpb24iXG5jb21tYW5kID0gIiVzIlxuZGVzY3JpcHRpb24gPSAid2hlcmRyIlxuJXMnIFwKICAgICAgICAgICAgIiRLRVlfQkVHSU4iICIka2V5IiAiJFBBTkVMX0FDVElPTiIgIiRLRVlfRU5EIikiCiAgICAgICAgICBzZXA9IiIKICAgICAgICAgIGlmIFsgLXMgIiRIRVJEUl9DT05GSUciIF07IHRoZW4KICAgICAgICAgICAgc2VwPSIKIgogICAgICAgICAgICAjIEEgbGFzdCBsaW5lIHdpdGhvdXQgaXRzIG5ld2xpbmUgZ2V0cyBvbmUgZmlyc3QuCiAgICAgICAgICAgIFsgIiQodGFpbCAtYyAxICIkSEVSRFJfQ09ORklHIiB8IG9kIC1BbiAtYyB8IHRyIC1kICcgJykiID0gJ1xuJyBdIHx8IHNlcD0iCiRzZXAiCiAgICAgICAgICBmaQogICAgICAgICAgIyBDaGVja2VkIG9uIGEgY29weSBmaXJzdCB3aGVuIHRoaXMgSGVyZHIgY2FuIHZhbGlkYXRlIGEgY29uZmlnOgogICAgICAgICAgIyBhIGNvbmZpZyBIZXJkciB3b3VsZCByZWplY3QgaXMgbmV2ZXIgd3JpdHRlbi4KICAgICAgICAgIHRtcD0iJEhFUkRSX0NPTkZJRy53aGVyZHItY2hlY2sudG9tbCIKICAgICAgICAgIHsgaWYgWyAtZiAiJEhFUkRSX0NPTkZJRyIgXTsgdGhlbiBjYXQgIiRIRVJEUl9DT05GSUciOyBmaTsgcHJpbnRmICclcyVzXG4nICIkc2VwIiAiJGJsb2NrIjsgfSA+ICIkdG1wIgogICAgICAgICAgaWYgIiQoaGVyZHJfYmluKSIgY29uZmlnIC0taGVscCA+L2Rldi9udWxsIDI+JjEgJiYgISBIRVJEUl9DT05GSUdfUEFUSD0iJHRtcCIgIiQoaGVyZHJfYmluKSIgY29uZmlnIGNoZWNrID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgICAgICBybSAtZiAiJHRtcCIKICAgICAgICAgICAgd2FybiAibm8gSGVyZHIga2V5IGFkZGVkOiAkSEVSRFJfQ09ORklHIHdvdWxkIG5vdCB2YWxpZGF0ZSB3aXRoIGl0IChoZXJkciBjb25maWcgY2hlY2spLiIKICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICAgIGZpCiAgICAgICAgICBybSAtZiAiJHRtcCIKICAgICAgICAgIHByaW50ZiAnJXMlc1xuJyAiJHNlcCIgIiRibG9jayIgPj4gIiRIRVJEUl9DT05GSUciCiAgICAgICAgICBvayAiSGVyZHIga2V5ICRrZXkgYWRkZWQgdG8gJEhFUkRSX0NPTkZJRyIKICAgICAgICAgIHRlbGwgIlByZXNzICRrZXkgaW4gSGVyZHIgdG8gb3BlbiB0aGUgd2hlcmRyIHBhbmVsLiIKICAgICAgICAgIGtleV9yZWxvYWQKICAgICAgICAgIDs7CiAgICAgICAgKikgd2FybiAibm8gSGVyZHIga2V5IGFkZGVkOiAkSE9US0VZUyBhcmUgYWxsIHRha2VuLiBCaW5kIG9uZSB0byAkUEFORUxfQUNUSU9OICh0eXBlID0gXCJwbHVnaW5fYWN0aW9uXCIpIGluICRIRVJEUl9DT05GSUcuIiA7OwogICAgICBlc2FjCiAgICAgIDs7CiAgICB1bmluc3RhbGwpCiAgICAgIGlmICEgZ3JlcCAtcXhGICIkS0VZX0JFR0lOIiAiJEhFUkRSX0NPTkZJRyIgMj4vZGV2L251bGw7IHRoZW4gb2sgIm5vIHdoZXJkciBrZXkgaW4gJEhFUkRSX0NPTkZJRyI7IHJldHVybiAwOyBmaQogICAgICAjIERyb3BzIHRoZSBtYXJrZWQgYmxvY2sgYW5kIHRoZSBibGFuayBsaW5lIHdyaXR0ZW4gYmVmb3JlIGl0LgogICAgICB0bXA9IiRIRVJEUl9DT05GSUcud2hlcmRyLXRtcCIKICAgICAgYXdrIC12IGI9IiRLRVlfQkVHSU4iIC12IGU9IiRLRVlfRU5EIiAnCiAgICAgICAgJDAgPT0gYiB7IHNraXAgPSAxOyBpZiAoYmxhbmspIGJsYW5rLS07IG5leHQgfQogICAgICAgIHNraXAgeyBpZiAoJDAgPT0gZSkgc2tpcCA9IDA7IG5leHQgfQogICAgICAgICQwID09ICIiIHsgYmxhbmsrKzsgbmV4dCB9CiAgICAgICAgeyB3aGlsZSAoYmxhbmspIHsgcHJpbnQgIiI7IGJsYW5rLS0gfSBwcmludCB9CiAgICAgICAgRU5EIHsgd2hpbGUgKGJsYW5rKSB7IHByaW50ICIiOyBibGFuay0tIH0gfScgIiRIRVJEUl9DT05GSUciID4gIiR0bXAiCiAgICAgICMgUmV3cml0dGVuIGluIHBsYWNlOiB0aGUgZmlsZSBrZWVwcyBpdHMgb3duZXIgYW5kIG1vZGUuCiAgICAgIGNhdCAiJHRtcCIgPiAiJEhFUkRSX0NPTkZJRyIgJiYgcm0gLWYgIiR0bXAiCiAgICAgIG9rICJ3aGVyZHIga2V5IHJlbW92ZWQgZnJvbSAkSEVSRFJfQ09ORklHIgogICAgICBrZXlfcmVsb2FkCiAgICAgIDs7CiAgICBzdGF0dXMpIGI9IiQoa2V5X2JvdW5kKSI7IGlmIFsgLW4gIiRiIiBdOyB0aGVuIHNheSAiJGIiOyBlbHNlIHNheSAibm9uZSI7IGZpIDs7CiAgICAqKSBkaWUgInVzYWdlOiAkMCBrZXkgaW5zdGFsbHx1bmluc3RhbGx8c3RhdHVzIiA7OwogIGVzYWMKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGFuZWwKIyBUaGUgInBhbmVsIiBhY3Rpb246IG9uZSBwb3B1cCB3aXRoIHRoZSBzdGF0ZSwgT3BlbiB3aGVyZHIsIFNldCB1cCBteSBwaG9uZQojIChvcGVucyBTZXR0aW5ncyDigLogUGhvbmUpIGFuZCB0aGUgb3RoZXIgY29tbWFuZHMgKGJpbi9saWIvcGFuZWwubWpzKSwKIyBkcml2aW5nIHRoaXMgc2NyaXB0LgpjbWRfcGFuZWwoKSB7CiAgY29udHJvbD0iJChwcmludGYgJ1sic2giLCIlcyJdJyAiJChwcmludGYgJyVzJyAiJFJPT1Qvc2NyaXB0cy9oZXJkci1wbHVnaW4uc2giIHwgc2VkICdzL1tcXCJdL1xcJi9nJykiKSIKICBpZiBbICIkTU9ERSIgPSAibmF0aXZlIiBdIHx8IHsgWyAtbiAiJE1PREUiIF0gJiYgUlVOVElNRT0iJChmaW5kX3J1bnRpbWUpIjsgfTsgdGhlbgogICAgV0hFUkRSX0NPTlRST0w9IiRjb250cm9sIiBXSEVSRFJfTU9ERT0iJE1PREUiIFdIRVJEUl9IT1RLRVk9IiQoa2V5X2JvdW5kKSIgY2xpIHBhbmVsCiAgZWxpZiBbIC1uICIkTU9ERSIgXTsgdGhlbgogICAgc2hfcGFuZWwKICBlbHNlCiAgICBkaWUgIndoZXJkciBwbHVnaW4gaXMgbm90IHNldCB1cCAoJENPTkYgaXMgbWlzc2luZyk6IGluc3RhbGwgaXQgYWdhaW4gd2l0aCBoZXJkciBwbHVnaW4gaW5zdGFsbCAkU09VUkNFIC0teWVzLiIKICBmaQp9CgojIERvY2tlciBtb2RlIHdpdGhvdXQgTm9kZS5qczogdGhlIHNhbWUga2V5cywgd2l0aG91dCB0aGUgUVIgY29kZS4Kc2hfcGFuZWwoKSB7CiAgc2F2ZWQ9IiQoc3R0eSAtZykiCiAgdHJhcCAnc3R0eSAiJHNhdmVkIicgRVhJVAogIHdoaWxlIDo7IGRvCiAgICBwcmludGYgJ1wwMzNbSFwwMzNbMkpcbiAgV0hFUkRSXG5cbicKICAgICggY21kX3N0YXR1cyApIHx8IHRydWUKICAgIHByaW50ZiAnXG4gIFMgc3RhcnQgIFggc3RvcCAgUiByZXN0YXJ0ICBPIG9wZW4gIEwgbG9nICBVIHVwZGF0ZSAgUCBwaG9uZSAgUSBxdWl0XG4nCiAgICBwcmludGYgJyAgUmVtb3ZlOiBYLCB0aGVuIHNoICVzIGtleSB1bmluc3RhbGwsIHRoZW4gaGVyZHIgcGx1Z2luIHVuaW5zdGFsbCAlcyAmJiBybSAtcmYgJXNcbicgIiRST09UL3NjcmlwdHMvaGVyZHItcGx1Z2luLnNoIiAiJFBMVUdJTl9JRCIgIiRESVIiCiAgICBzdHR5IC1pY2Fub24gLWVjaG8gbWluIDAgdGltZSA1MAogICAgaz0iJChkZCBicz0xIGNvdW50PTEgMj4vZGV2L251bGwgfHwgdHJ1ZSkiCiAgICBzdHR5ICIkc2F2ZWQiCiAgICBjYXNlICIkayIgaW4KICAgICAgc3xTKSBhY3Q9c3RhcnQgOzsgeHxYKSBhY3Q9c3RvcCA7OyByfFIpIGFjdD1yZXN0YXJ0IDs7IG98TykgYWN0PW9wZW4gOzsKICAgICAgbHxMKSBhY3Q9bG9ncyA7OyB1fFUpIGFjdD11cGRhdGUgOzsgcHxQKSBhY3Q9cGhvbmUgOzsgcXxRKSBicmVhayA7OwogICAgICAqKSBjb250aW51ZSA7OwogICAgZXNhYwogICAgcHJpbnRmICdcMDMzW0hcMDMzWzJKXG4nCiAgICAoIHRyYXAgLSBJTlQ7ICJjbWRfJGFjdCIgKSB8fCB0cnVlCiAgICBwcmludGYgJ1xuICBQcmVzcyBFbnRlciB0byBnbyBiYWNrLiAnCiAgICByZWFkIC1yIF8gfHwgdHJ1ZQogIGRvbmUKfQoKY21kX3Jlc3RhcnQoKSB7IGNtZF9zdG9wOyBjbWRfc3RhcnQ7IH0KCmNhc2UgIiR7MTotfSIgaW4KICBidWlsZCkgY21kX2J1aWxkIDs7CiAgcGFuZWwpIGNtZF9wYW5lbCA7OwogIHN0YXJ0fHN0b3B8cmVzdGFydHxzdGF0dXN8b3BlbnxhZGRyZXNzfHVwZGF0ZXxwaG9uZXxsb2dzfGRvY3RvcikgImNtZF8kMSIgOzsKICBzZXJ2aWNlKSBjbWRfc2VydmljZSAiJHsyOi19IiA7OwogIHNraWxsKSBjbWRfc2tpbGwgIiR7MjotfSIgOzsKICBrZXkpIGNtZF9rZXkgIiR7MjotfSIgOzsKICAqKSBkaWUgInVzYWdlOiAkMCBidWlsZHxwYW5lbHxzdGFydHxzdG9wfHJlc3RhcnR8c3RhdHVzfG9wZW58YWRkcmVzc3x1cGRhdGV8cGhvbmV8bG9nc3xkb2N0b3J8c2VydmljZSBpbnN0YWxsfHVuaW5zdGFsbHxza2lsbCBpbnN0YWxsfHVuaW5zdGFsbHxrZXkgaW5zdGFsbHx1bmluc3RhbGx8c3RhdHVzIiA7Owplc2FjCg==");
|
|
5
5
|
|
|
6
6
|
export { herdrPlugin as default };
|
|
7
7
|
//# sourceMappingURL=herdr-plugin.mjs.map
|
|
@@ -22,8 +22,12 @@ import 'node:child_process';
|
|
|
22
22
|
import 'node:net';
|
|
23
23
|
import 'node:readline';
|
|
24
24
|
import 'node:fs/promises';
|
|
25
|
-
import 'node:
|
|
25
|
+
import 'node:dns';
|
|
26
|
+
import 'node:util';
|
|
27
|
+
import 'qrcode-terminal/vendor/QRCode/index.js';
|
|
28
|
+
import 'qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js';
|
|
26
29
|
import '@simplewebauthn/server';
|
|
30
|
+
import 'node:url';
|
|
27
31
|
|
|
28
32
|
const _____ = defineEventHandler((event) => sendError(event, 404, { error: "Not found" }));
|
|
29
33
|
|
|
@@ -22,8 +22,12 @@ import 'node:child_process';
|
|
|
22
22
|
import 'node:net';
|
|
23
23
|
import 'node:readline';
|
|
24
24
|
import 'node:fs/promises';
|
|
25
|
-
import 'node:
|
|
25
|
+
import 'node:dns';
|
|
26
|
+
import 'node:util';
|
|
27
|
+
import 'qrcode-terminal/vendor/QRCode/index.js';
|
|
28
|
+
import 'qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js';
|
|
26
29
|
import '@simplewebauthn/server';
|
|
30
|
+
import 'node:url';
|
|
27
31
|
|
|
28
32
|
const agents_post = defineApi((event, b) => createAgent(b));
|
|
29
33
|
|
|
@@ -22,8 +22,12 @@ import 'node:child_process';
|
|
|
22
22
|
import 'node:net';
|
|
23
23
|
import 'node:readline';
|
|
24
24
|
import 'node:fs/promises';
|
|
25
|
-
import 'node:
|
|
25
|
+
import 'node:dns';
|
|
26
|
+
import 'node:util';
|
|
27
|
+
import 'qrcode-terminal/vendor/QRCode/index.js';
|
|
28
|
+
import 'qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js';
|
|
26
29
|
import '@simplewebauthn/server';
|
|
30
|
+
import 'node:url';
|
|
27
31
|
|
|
28
32
|
const askTab_post = defineApi(async (event, b) => {
|
|
29
33
|
var _a;
|
|
@@ -22,8 +22,12 @@ import 'node:child_process';
|
|
|
22
22
|
import 'node:net';
|
|
23
23
|
import 'node:readline';
|
|
24
24
|
import 'node:fs/promises';
|
|
25
|
-
import 'node:
|
|
25
|
+
import 'node:dns';
|
|
26
|
+
import 'node:util';
|
|
27
|
+
import 'qrcode-terminal/vendor/QRCode/index.js';
|
|
28
|
+
import 'qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js';
|
|
26
29
|
import '@simplewebauthn/server';
|
|
30
|
+
import 'node:url';
|
|
27
31
|
|
|
28
32
|
const attach_post = defineApi((event, b) => {
|
|
29
33
|
const q = getQuery(event);
|
|
@@ -22,8 +22,12 @@ import 'node:child_process';
|
|
|
22
22
|
import 'node:net';
|
|
23
23
|
import 'node:readline';
|
|
24
24
|
import 'node:fs/promises';
|
|
25
|
-
import 'node:
|
|
25
|
+
import 'node:dns';
|
|
26
|
+
import 'node:util';
|
|
27
|
+
import 'qrcode-terminal/vendor/QRCode/index.js';
|
|
28
|
+
import 'qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js';
|
|
26
29
|
import '@simplewebauthn/server';
|
|
30
|
+
import 'node:url';
|
|
27
31
|
|
|
28
32
|
const disable_post = defineApi((event) => auth.disable(reqOf(event)));
|
|
29
33
|
|
|
@@ -22,8 +22,12 @@ import 'node:child_process';
|
|
|
22
22
|
import 'node:net';
|
|
23
23
|
import 'node:readline';
|
|
24
24
|
import 'node:fs/promises';
|
|
25
|
-
import 'node:
|
|
25
|
+
import 'node:dns';
|
|
26
|
+
import 'node:util';
|
|
27
|
+
import 'qrcode-terminal/vendor/QRCode/index.js';
|
|
28
|
+
import 'qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js';
|
|
26
29
|
import '@simplewebauthn/server';
|
|
30
|
+
import 'node:url';
|
|
27
31
|
|
|
28
32
|
const lockAll_post = defineApi((event) => auth.lockAll(reqOf(event)));
|
|
29
33
|
|
|
@@ -22,8 +22,12 @@ import 'node:child_process';
|
|
|
22
22
|
import 'node:net';
|
|
23
23
|
import 'node:readline';
|
|
24
24
|
import 'node:fs/promises';
|
|
25
|
-
import 'node:
|
|
25
|
+
import 'node:dns';
|
|
26
|
+
import 'node:util';
|
|
27
|
+
import 'qrcode-terminal/vendor/QRCode/index.js';
|
|
28
|
+
import 'qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js';
|
|
26
29
|
import '@simplewebauthn/server';
|
|
30
|
+
import 'node:url';
|
|
27
31
|
|
|
28
32
|
const lock_post = defineApi((event) => auth.lock(reqOf(event)));
|
|
29
33
|
|
|
@@ -22,8 +22,12 @@ import 'node:child_process';
|
|
|
22
22
|
import 'node:net';
|
|
23
23
|
import 'node:readline';
|
|
24
24
|
import 'node:fs/promises';
|
|
25
|
-
import 'node:
|
|
25
|
+
import 'node:dns';
|
|
26
|
+
import 'node:util';
|
|
27
|
+
import 'qrcode-terminal/vendor/QRCode/index.js';
|
|
28
|
+
import 'qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js';
|
|
26
29
|
import '@simplewebauthn/server';
|
|
30
|
+
import 'node:url';
|
|
27
31
|
|
|
28
32
|
const options_post = defineApi((event) => auth.loginOptions(reqOf(event)));
|
|
29
33
|
|
|
@@ -22,8 +22,12 @@ import 'node:child_process';
|
|
|
22
22
|
import 'node:net';
|
|
23
23
|
import 'node:readline';
|
|
24
24
|
import 'node:fs/promises';
|
|
25
|
-
import 'node:
|
|
25
|
+
import 'node:dns';
|
|
26
|
+
import 'node:util';
|
|
27
|
+
import 'qrcode-terminal/vendor/QRCode/index.js';
|
|
28
|
+
import 'qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js';
|
|
26
29
|
import '@simplewebauthn/server';
|
|
30
|
+
import 'node:url';
|
|
27
31
|
|
|
28
32
|
const verify_post = defineApi((event, body) => auth.loginVerify(reqOf(event), body));
|
|
29
33
|
|
|
@@ -22,8 +22,12 @@ import 'node:child_process';
|
|
|
22
22
|
import 'node:net';
|
|
23
23
|
import 'node:readline';
|
|
24
24
|
import 'node:fs/promises';
|
|
25
|
-
import 'node:
|
|
25
|
+
import 'node:dns';
|
|
26
|
+
import 'node:util';
|
|
27
|
+
import 'qrcode-terminal/vendor/QRCode/index.js';
|
|
28
|
+
import 'qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js';
|
|
26
29
|
import '@simplewebauthn/server';
|
|
30
|
+
import 'node:url';
|
|
27
31
|
|
|
28
32
|
const maxSession_post = defineApi((event, body) => auth.setMaxSession(reqOf(event), body == null ? void 0 : body.days));
|
|
29
33
|
|
|
@@ -22,8 +22,12 @@ import 'node:child_process';
|
|
|
22
22
|
import 'node:net';
|
|
23
23
|
import 'node:readline';
|
|
24
24
|
import 'node:fs/promises';
|
|
25
|
-
import 'node:
|
|
25
|
+
import 'node:dns';
|
|
26
|
+
import 'node:util';
|
|
27
|
+
import 'qrcode-terminal/vendor/QRCode/index.js';
|
|
28
|
+
import 'qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js';
|
|
26
29
|
import '@simplewebauthn/server';
|
|
30
|
+
import 'node:url';
|
|
27
31
|
|
|
28
32
|
const options_post = defineApi((event, body) => auth.registerOptions(reqOf(event), body));
|
|
29
33
|
|
|
@@ -22,8 +22,12 @@ import 'node:child_process';
|
|
|
22
22
|
import 'node:net';
|
|
23
23
|
import 'node:readline';
|
|
24
24
|
import 'node:fs/promises';
|
|
25
|
-
import 'node:
|
|
25
|
+
import 'node:dns';
|
|
26
|
+
import 'node:util';
|
|
27
|
+
import 'qrcode-terminal/vendor/QRCode/index.js';
|
|
28
|
+
import 'qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js';
|
|
26
29
|
import '@simplewebauthn/server';
|
|
30
|
+
import 'node:url';
|
|
27
31
|
|
|
28
32
|
const verify_post = defineApi((event, body) => auth.registerVerify(reqOf(event), body));
|
|
29
33
|
|
|
@@ -22,8 +22,12 @@ import 'node:child_process';
|
|
|
22
22
|
import 'node:net';
|
|
23
23
|
import 'node:readline';
|
|
24
24
|
import 'node:fs/promises';
|
|
25
|
-
import 'node:
|
|
25
|
+
import 'node:dns';
|
|
26
|
+
import 'node:util';
|
|
27
|
+
import 'qrcode-terminal/vendor/QRCode/index.js';
|
|
28
|
+
import 'qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js';
|
|
26
29
|
import '@simplewebauthn/server';
|
|
30
|
+
import 'node:url';
|
|
27
31
|
|
|
28
32
|
const status_get = defineApi((event) => ({
|
|
29
33
|
...auth.status(reqOf(event), { resume: getQuery(event).resume === "1" }),
|
|
@@ -23,8 +23,12 @@ import 'node:child_process';
|
|
|
23
23
|
import 'node:net';
|
|
24
24
|
import 'node:readline';
|
|
25
25
|
import 'node:fs/promises';
|
|
26
|
-
import 'node:
|
|
26
|
+
import 'node:dns';
|
|
27
|
+
import 'node:util';
|
|
28
|
+
import 'qrcode-terminal/vendor/QRCode/index.js';
|
|
29
|
+
import 'qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js';
|
|
27
30
|
import '@simplewebauthn/server';
|
|
31
|
+
import 'node:url';
|
|
28
32
|
|
|
29
33
|
const changes_get = defineApi(async (event) => {
|
|
30
34
|
const q = getQuery(event);
|
|
@@ -22,8 +22,12 @@ import 'node:child_process';
|
|
|
22
22
|
import 'node:net';
|
|
23
23
|
import 'node:readline';
|
|
24
24
|
import 'node:fs/promises';
|
|
25
|
-
import 'node:
|
|
25
|
+
import 'node:dns';
|
|
26
|
+
import 'node:util';
|
|
27
|
+
import 'qrcode-terminal/vendor/QRCode/index.js';
|
|
28
|
+
import 'qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js';
|
|
26
29
|
import '@simplewebauthn/server';
|
|
30
|
+
import 'node:url';
|
|
27
31
|
|
|
28
32
|
const image_get = defineEventHandler(async (event) => {
|
|
29
33
|
const q = getQuery(event);
|
|
@@ -22,8 +22,12 @@ import 'node:os';
|
|
|
22
22
|
import 'node:child_process';
|
|
23
23
|
import 'node:net';
|
|
24
24
|
import 'node:readline';
|
|
25
|
-
import 'node:
|
|
25
|
+
import 'node:dns';
|
|
26
|
+
import 'node:util';
|
|
27
|
+
import 'qrcode-terminal/vendor/QRCode/index.js';
|
|
28
|
+
import 'qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js';
|
|
26
29
|
import '@simplewebauthn/server';
|
|
30
|
+
import 'node:url';
|
|
27
31
|
|
|
28
32
|
const UPLOAD_PATH = /\.cache\/herdr-web\/uploads\/([\w-]+\.[a-z]+)/g;
|
|
29
33
|
const CACHE_MAX = 500;
|
|
@@ -22,8 +22,12 @@ import 'node:child_process';
|
|
|
22
22
|
import 'node:net';
|
|
23
23
|
import 'node:readline';
|
|
24
24
|
import 'node:fs/promises';
|
|
25
|
-
import 'node:
|
|
25
|
+
import 'node:dns';
|
|
26
|
+
import 'node:util';
|
|
27
|
+
import 'qrcode-terminal/vendor/QRCode/index.js';
|
|
28
|
+
import 'qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js';
|
|
26
29
|
import '@simplewebauthn/server';
|
|
30
|
+
import 'node:url';
|
|
27
31
|
|
|
28
32
|
const OPEN_MS = 3e3;
|
|
29
33
|
const answering = /* @__PURE__ */ new Set();
|
|
@@ -22,8 +22,12 @@ import 'node:child_process';
|
|
|
22
22
|
import 'node:net';
|
|
23
23
|
import 'node:readline';
|
|
24
24
|
import 'node:fs/promises';
|
|
25
|
-
import 'node:
|
|
25
|
+
import 'node:dns';
|
|
26
|
+
import 'node:util';
|
|
27
|
+
import 'qrcode-terminal/vendor/QRCode/index.js';
|
|
28
|
+
import 'qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js';
|
|
26
29
|
import '@simplewebauthn/server';
|
|
30
|
+
import 'node:url';
|
|
27
31
|
|
|
28
32
|
const claudeStatusline_post = defineApi(async (_event, body) => {
|
|
29
33
|
const key = typeof body.key === "string" ? body.key : null;
|
|
@@ -23,8 +23,12 @@ import 'node:child_process';
|
|
|
23
23
|
import 'node:net';
|
|
24
24
|
import 'node:readline';
|
|
25
25
|
import 'node:fs/promises';
|
|
26
|
-
import 'node:
|
|
26
|
+
import 'node:dns';
|
|
27
|
+
import 'node:util';
|
|
28
|
+
import 'qrcode-terminal/vendor/QRCode/index.js';
|
|
29
|
+
import 'qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js';
|
|
27
30
|
import '@simplewebauthn/server';
|
|
31
|
+
import 'node:url';
|
|
28
32
|
|
|
29
33
|
const status_get = defineApi(async (event) => {
|
|
30
34
|
const p = findPane(String(getQuery(event).pane || ""));
|
|
@@ -22,8 +22,12 @@ import 'node:child_process';
|
|
|
22
22
|
import 'node:net';
|
|
23
23
|
import 'node:readline';
|
|
24
24
|
import 'node:fs/promises';
|
|
25
|
-
import 'node:
|
|
25
|
+
import 'node:dns';
|
|
26
|
+
import 'node:util';
|
|
27
|
+
import 'qrcode-terminal/vendor/QRCode/index.js';
|
|
28
|
+
import 'qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js';
|
|
26
29
|
import '@simplewebauthn/server';
|
|
30
|
+
import 'node:url';
|
|
27
31
|
|
|
28
32
|
const close_post = defineApi(async (event, b) => {
|
|
29
33
|
if (!PANE_RE.test(b.pane_id || "")) throw new HerdrError("bad_pane", "Invalid pane");
|
|
@@ -23,8 +23,12 @@ import 'node:child_process';
|
|
|
23
23
|
import 'node:net';
|
|
24
24
|
import 'node:readline';
|
|
25
25
|
import 'node:fs/promises';
|
|
26
|
-
import 'node:
|
|
26
|
+
import 'node:dns';
|
|
27
|
+
import 'node:util';
|
|
28
|
+
import 'qrcode-terminal/vendor/QRCode/index.js';
|
|
29
|
+
import 'qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js';
|
|
27
30
|
import '@simplewebauthn/server';
|
|
31
|
+
import 'node:url';
|
|
28
32
|
|
|
29
33
|
const codexUpdate_post = defineApi(async (event, b) => {
|
|
30
34
|
if (!PANE_RE.test(b.pane_id || "")) throw new HerdrError("bad_pane", "Invalid pane");
|
|
@@ -22,8 +22,12 @@ import 'node:child_process';
|
|
|
22
22
|
import 'node:net';
|
|
23
23
|
import 'node:readline';
|
|
24
24
|
import 'node:fs/promises';
|
|
25
|
-
import 'node:
|
|
25
|
+
import 'node:dns';
|
|
26
|
+
import 'node:util';
|
|
27
|
+
import 'qrcode-terminal/vendor/QRCode/index.js';
|
|
28
|
+
import 'qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js';
|
|
26
29
|
import '@simplewebauthn/server';
|
|
30
|
+
import 'node:url';
|
|
27
31
|
|
|
28
32
|
const commands_get = defineApi(async (event) => {
|
|
29
33
|
const p = findPane(String(getQuery(event).pane || ""));
|
|
@@ -23,8 +23,12 @@ import 'node:child_process';
|
|
|
23
23
|
import 'node:net';
|
|
24
24
|
import 'node:readline';
|
|
25
25
|
import 'node:fs/promises';
|
|
26
|
-
import 'node:
|
|
26
|
+
import 'node:dns';
|
|
27
|
+
import 'node:util';
|
|
28
|
+
import 'qrcode-terminal/vendor/QRCode/index.js';
|
|
29
|
+
import 'qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js';
|
|
27
30
|
import '@simplewebauthn/server';
|
|
31
|
+
import 'node:url';
|
|
28
32
|
|
|
29
33
|
const COLOR = /^(#[0-9a-f]{3,8}|[a-z]{3,20}|rgb\(\s*\d{1,3}\s*,\s*\d{1,3}\s*,\s*\d{1,3}\s*\))$/i;
|
|
30
34
|
const NAME = /^[a-z0-9][a-z0-9-]{0,39}$/i;
|
|
@@ -22,8 +22,12 @@ import 'node:child_process';
|
|
|
22
22
|
import 'node:net';
|
|
23
23
|
import 'node:readline';
|
|
24
24
|
import 'node:fs/promises';
|
|
25
|
-
import 'node:
|
|
25
|
+
import 'node:dns';
|
|
26
|
+
import 'node:util';
|
|
27
|
+
import 'qrcode-terminal/vendor/QRCode/index.js';
|
|
28
|
+
import 'qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js';
|
|
26
29
|
import '@simplewebauthn/server';
|
|
30
|
+
import 'node:url';
|
|
27
31
|
|
|
28
32
|
const dirs_get = defineApi((event) => {
|
|
29
33
|
const q = getQuery(event);
|
|
@@ -22,8 +22,12 @@ import 'node:child_process';
|
|
|
22
22
|
import 'node:net';
|
|
23
23
|
import 'node:readline';
|
|
24
24
|
import 'node:fs/promises';
|
|
25
|
-
import 'node:
|
|
25
|
+
import 'node:dns';
|
|
26
|
+
import 'node:util';
|
|
27
|
+
import 'qrcode-terminal/vendor/QRCode/index.js';
|
|
28
|
+
import 'qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js';
|
|
26
29
|
import '@simplewebauthn/server';
|
|
30
|
+
import 'node:url';
|
|
27
31
|
|
|
28
32
|
const dismiss_post = defineApi(async (event, b) => {
|
|
29
33
|
if (!PANE_RE.test(b.pane_id || "")) throw new HerdrError("bad_pane", "Invalid pane");
|