{
	"schemaVersion": 1,
	"quickAddVersion": "2.27.0",
	"createdAt": "2026-09-27T00:00:00.000Z",
	"rootChoiceIds": [
		"qa-pkg-migrate-dataview-properties"
	],
	"choices": [
		{
			"choice": {
				"id": "qa-pkg-migrate-dataview-properties",
				"name": "Migrate Dataview properties",
				"type": "Macro",
				"command": true,
				"runOnStartup": false,
				"macro": {
					"id": "qa-pkg-migrate-dataview-properties-macro",
					"name": "Migrate Dataview properties",
					"commands": [
						{
							"id": "qa-pkg-migrate-dataview-properties-script",
							"name": "migrateDataviewToFrontmatter",
							"type": "UserScript",
							"path": "scripts/migrateDataviewToFrontmatter.js",
							"settings": {
								"Migrate All Properties": false,
								"Properties to Migrate": "Reference, Related"
							}
						}
					]
				}
			},
			"pathHint": [
				"Migrate Dataview properties"
			],
			"parentChoiceId": null
		}
	],
	"assets": [
		{
			"kind": "user-script",
			"originalPath": "scripts/migrateDataviewToFrontmatter.js",
			"contentEncoding": "base64",
			"content": "LyoqCiAqIE1pZ3JhdGUgRGF0YXZpZXcgSW5saW5lIFByb3BlcnRpZXMgdG8gRnJvbnRtYXR0ZXIKICoKICogVGhpcyBzY3JpcHQgbWlncmF0ZXMgaW5saW5lIGRhdGF2aWV3IHByb3BlcnRpZXMgKGUuZy4sICJSZWZlcmVuY2U6OiBbW2xpbmtdXSIpCiAqIHRvIFlBTUwgZnJvbnRtYXR0ZXIuIEl0IGhhbmRsZXMgY29tbWEtc2VwYXJhdGVkIHZhbHVlcyB3aXRoIHNwZWNpYWwgY2FyZSBmb3IKICogY29tbWFzIGluc2lkZSB3aWtpbGlua3MuCiAqCiAqIEJFRk9SRToKICogICBSZWZlcmVuY2U6OiBbWzIwMjUtMTAtMTIgLSBTdW4gT2N0IDEyXV0KICogICBSZWxhdGVkOjogW1tBZ2VudGljIEVuZ2luZWVyaW5nfEFnZW50aWMgY29kaW5nXV0sIFtbTm90ZSwgd2l0aCBjb21tYV1dCiAqICAgVGFnczo6ICNwcm9qZWN0LCAjaW1wb3J0YW50CiAqCiAqIEFGVEVSOgogKiAgIC0tLQogKiAgIFJlZmVyZW5jZTogIltbMjAyNS0xMC0xMiAtIFN1biBPY3QgMTJdXSIKICogICBSZWxhdGVkOgogKiAgICAgLSAiW1tBZ2VudGljIEVuZ2luZWVyaW5nfEFnZW50aWMgY29kaW5nXV0iCiAqICAgICAtICJbW05vdGUsIHdpdGggY29tbWFdXSIKICogICB0YWdzOgogKiAgICAgLSAicHJvamVjdCIKICogICAgIC0gImltcG9ydGFudCIKICogICAtLS0KICoKICogU3BlY2lhbCBoYW5kbGluZyBmb3IgT2JzaWRpYW4gcmVzZXJ2ZWQgcHJvcGVydGllczoKICogLSAidGFncyIgaXMgbm9ybWFsaXplZCB0byBsb3dlcmNhc2UgKFRhZ3MgLT4gdGFncykKICogLSAiIyIgc3ltYm9scyBhcmUgc3RyaXBwZWQgZnJvbSB0YWcgdmFsdWVzICgjcHJvamVjdCAtPiBwcm9qZWN0KQogKgogKiBDb25maWd1cmUgd2hpY2ggcHJvcGVydGllcyB0byBtaWdyYXRlIGluIHRoZSBzY3JpcHQgc2V0dGluZ3MuCiAqCiAqIFVzYWdlOgogKiAxLiBBZGQgdGhpcyBzY3JpcHQgdG8gYSBRdWlja0FkZCBtYWNybyBhcyBhIFVzZXIgU2NyaXB0CiAqIDIuIENvbmZpZ3VyZSB0aGUgc2NyaXB0IHNldHRpbmdzIHRvIHNwZWNpZnkgd2hpY2ggcHJvcGVydGllcyB0byBtaWdyYXRlCiAqIDMuIE9wZW4gYSBub3RlIHdpdGggaW5saW5lIERhdGF2aWV3IHByb3BlcnRpZXMKICogNC4gUnVuIHRoZSBtYWNybyB0byBtaWdyYXRlIHByb3BlcnRpZXMgdG8gZnJvbnRtYXR0ZXIKICovCgptb2R1bGUuZXhwb3J0cyA9IHsKICAgIGVudHJ5OiBzdGFydCwKICAgIHNldHRpbmdzOiB7CiAgICAgICAgbmFtZTogIk1pZ3JhdGUgRGF0YXZpZXcgUHJvcGVydGllcyB0byBGcm9udG1hdHRlciIsCiAgICAgICAgYXV0aG9yOiAiUXVpY2tBZGQiLAogICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgIk1pZ3JhdGUgQWxsIFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICB0eXBlOiAidG9nZ2xlIiwKICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsCiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogIk1pZ3JhdGUgYWxsIGlubGluZSBwcm9wZXJ0aWVzIChpZ25vcmVzIHRoZSBwcm9wZXJ0eSBsaXN0IGJlbG93KSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgIlByb3BlcnRpZXMgdG8gTWlncmF0ZSI6IHsKICAgICAgICAgICAgICAgIHR5cGU6ICJ0ZXh0IiwKICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogIlJlZmVyZW5jZSwgUmVsYXRlZCIsCiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogIlByb3BlcnR5MSwgUHJvcGVydHkyLCBQcm9wZXJ0eTMiLAogICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICJDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBwcm9wZXJ0eSBuYW1lcyB0byBtaWdyYXRlIChjYXNlLWluc2Vuc2l0aXZlKS4gTGVhdmUgZW1wdHkgd2l0aCB0b2dnbGUgb2ZmIHRvIHVzZSBkZWZhdWx0cy4iCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn07Cgphc3luYyBmdW5jdGlvbiBzdGFydChwYXJhbXMsIHNldHRpbmdzKSB7CiAgICBjb25zdCB7IGFwcCwgb2JzaWRpYW4gfSA9IHBhcmFtczsKCiAgICAvLyBEZXRlcm1pbmUgd2hpY2ggcHJvcGVydGllcyB0byBtaWdyYXRlCiAgICBsZXQgcHJvcGVydGllc1RvTWlncmF0ZSA9IFtdOwogICAgY29uc3QgbWlncmF0ZUFsbCA9IHNldHRpbmdzWyJNaWdyYXRlIEFsbCBQcm9wZXJ0aWVzIl07CgogICAgaWYgKCFtaWdyYXRlQWxsKSB7CiAgICAgICAgY29uc3QgcHJvcGVydGllc0lucHV0ID0gc2V0dGluZ3NbIlByb3BlcnRpZXMgdG8gTWlncmF0ZSJdOwogICAgICAgIGlmIChwcm9wZXJ0aWVzSW5wdXQgJiYgcHJvcGVydGllc0lucHV0LnRyaW0oKSkgewogICAgICAgICAgICAvLyBQYXJzZSBjb21tYS1zZXBhcmF0ZWQgcHJvcGVydHkgbmFtZXMKICAgICAgICAgICAgcHJvcGVydGllc1RvTWlncmF0ZSA9IHByb3BlcnRpZXNJbnB1dAogICAgICAgICAgICAgICAgLnNwbGl0KCcsJykKICAgICAgICAgICAgICAgIC5tYXAocCA9PiBwLnRyaW0oKS50b0xvd2VyQ2FzZSgpKQogICAgICAgICAgICAgICAgLmZpbHRlcihwID0+IHAubGVuZ3RoID4gMCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gRGVmYXVsdCB0byBSZWZlcmVuY2UgYW5kIFJlbGF0ZWQgaWYgbm90aGluZyBzcGVjaWZpZWQKICAgICAgICAgICAgcHJvcGVydGllc1RvTWlncmF0ZSA9IFsncmVmZXJlbmNlJywgJ3JlbGF0ZWQnXTsKICAgICAgICB9CiAgICB9CgogICAgLy8gR2V0IHRoZSBhY3RpdmUgZmlsZQogICAgY29uc3QgYWN0aXZlRmlsZSA9IGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlRmlsZSgpOwogICAgaWYgKCFhY3RpdmVGaWxlKSB7CiAgICAgICAgbmV3IG9ic2lkaWFuLk5vdGljZSgiTm8gYWN0aXZlIGZpbGUuIFBsZWFzZSBvcGVuIGEgZmlsZSBmaXJzdC4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgdHJ5IHsKICAgICAgICAvLyBSZWFkIHRoZSBmaWxlIGNvbnRlbnQKICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgYXBwLnZhdWx0LnJlYWQoYWN0aXZlRmlsZSk7CgogICAgICAgIC8vIFBhcnNlIGlubGluZSBmaWVsZHMKICAgICAgICBjb25zdCB7IGZpZWxkcywgY2xlYW5lZENvbnRlbnQgfSA9IHBhcnNlSW5saW5lRmllbGRzV2l0aFdpa2lsaW5rcyhjb250ZW50LCBwcm9wZXJ0aWVzVG9NaWdyYXRlLCBtaWdyYXRlQWxsKTsKCiAgICAgICAgaWYgKGZpZWxkcy5zaXplID09PSAwKSB7CiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBtaWdyYXRlQWxsCiAgICAgICAgICAgICAgICA/ICJObyBpbmxpbmUgZGF0YXZpZXcgcHJvcGVydGllcyBmb3VuZCBpbiB0aGlzIGZpbGUuIgogICAgICAgICAgICAgICAgOiBgTm8gJHtwcm9wZXJ0aWVzVG9NaWdyYXRlLmpvaW4oJywgJyl9IHByb3BlcnRpZXMgZm91bmQgaW4gdGhpcyBmaWxlLmA7CiAgICAgICAgICAgIG5ldyBvYnNpZGlhbi5Ob3RpY2UobWVzc2FnZSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIFVwZGF0ZSBmcm9udG1hdHRlciBBTkQgY29udGVudCBpbiBhIHNpbmdsZSBvcGVyYXRpb24KICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHJhY2UgY29uZGl0aW9ucyBmcm9tIHByb2Nlc3NGcm9udE1hdHRlciArIHZhdWx0Lm1vZGlmeQogICAgICAgIGF3YWl0IGFwcC5maWxlTWFuYWdlci5wcm9jZXNzRnJvbnRNYXR0ZXIoYWN0aXZlRmlsZSwgKGZyb250bWF0dGVyKSA9PiB7CiAgICAgICAgICAgIGZpZWxkcy5mb3JFYWNoKCh2YWx1ZXMsIGZpZWxkTmFtZSkgPT4gewogICAgICAgICAgICAgICAgLy8gQ29udmVydCBTZXQgdG8gYXJyYXkKICAgICAgICAgICAgICAgIGxldCB2YWx1ZXNBcnJheSA9IEFycmF5LmZyb20odmFsdWVzKTsKCiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgc3BlY2lhbCBwcm9wZXJ0eSBuYW1lcyAoT2JzaWRpYW4gcmVzZXJ2ZWQgZmllbGRzKQogICAgICAgICAgICAgICAgLy8gInRhZ3MiIG11c3QgYmUgbG93ZXJjYXNlIGFuZCB0YWcgdmFsdWVzIHNob3VsZCBub3QgaGF2ZSAiIyIgcHJlZml4CiAgICAgICAgICAgICAgICBjb25zdCBpc1RhZ3MgPSBmaWVsZE5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3RhZ3MnOwogICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZEZpZWxkTmFtZSA9IGlzVGFncyA/ICd0YWdzJyA6IGZpZWxkTmFtZTsKCiAgICAgICAgICAgICAgICBpZiAoaXNUYWdzKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gU3RyaXAgIiMiIGZyb20gdGFnIHZhbHVlcwogICAgICAgICAgICAgICAgICAgIHZhbHVlc0FycmF5ID0gdmFsdWVzQXJyYXkubWFwKHRhZyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBsZWFkaW5nICIjIiBpZiBwcmVzZW50CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWcuc3RhcnRzV2l0aCgnIycpID8gdGFnLnN1YnN0cmluZygxKSA6IHRhZzsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBGcm9udG1hdHRlciBwcm9wZXJ0eSBuYW1lcyBiZWhhdmUgY2FzZS1pbnNlbnNpdGl2ZWx5IGluIE9ic2lkaWFuLAogICAgICAgICAgICAgICAgLy8gc28gY29sbGVjdCBFVkVSWSBrZXkgdGhhdCBtYXRjaGVzIGNhc2UtaW5zZW5zaXRpdmVseS4gQSBoYW5kLWVkaXRlZAogICAgICAgICAgICAgICAgLy8gb3Igc3luY2VkIG5vdGUgKG9yIGEgbm90ZSBtaWdyYXRlZCBieSBhbiBvbGRlciB2ZXJzaW9uIG9mIHRoaXMKICAgICAgICAgICAgICAgIC8vIHNjcmlwdCkgY2FuIGhvbGQgbW9yZSB0aGFuIG9uZSBjYXNlIHZhcmlhbnQgLSBlLmcuIGJvdGggIlJlZmVyZW5jZSIKICAgICAgICAgICAgICAgIC8vIGFuZCAicmVmZXJlbmNlIiwgb3IgYm90aCAiVGFncyIgYW5kICJ0YWdzIiAtIGFuZCB3ZSBtdXN0IG1lcmdlIHRoZW0KICAgICAgICAgICAgICAgIC8vIGFsbCBpbnRvIG9uZSBrZXkgcmF0aGVyIHRoYW4gc3RyYW5kaW5nIChvciBkcm9wcGluZykgYSB2YXJpYW50LgogICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hpbmdLZXlzID0gT2JqZWN0LmtleXMoZnJvbnRtYXR0ZXIpLmZpbHRlcigKICAgICAgICAgICAgICAgICAgICBrZXkgPT4ga2V5LnRvTG93ZXJDYXNlKCkgPT09IG5vcm1hbGl6ZWRGaWVsZE5hbWUudG9Mb3dlckNhc2UoKQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAvLyBUaGUgcmVzZXJ2ZWQgInRhZ3MiIHByb3BlcnR5IG11c3QgYmUgc3RvcmVkIGxvd2VyY2FzZSwgc28gYWx3YXlzCiAgICAgICAgICAgICAgICAvLyB0YXJnZXQgInRhZ3MiOyBvdGhlciBwcm9wZXJ0aWVzIHJldXNlIHRoZSBmaXJzdCBleGlzdGluZyBrZXkncyBjYXNlCiAgICAgICAgICAgICAgICAvLyAob3IgdGhlIGZpZWxkIG5hbWUpLgogICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0S2V5ID0gaXNUYWdzID8gJ3RhZ3MnIDogKG1hdGNoaW5nS2V5c1swXSA/PyBub3JtYWxpemVkRmllbGROYW1lKTsKCiAgICAgICAgICAgICAgICAvLyBHYXRoZXIgdGhlIGV4aXN0aW5nIHZhbHVlcyBmcm9tIGV2ZXJ5IGNhc2UgdmFyaWFudCwgdGhlbiBkcm9wIHRoZQogICAgICAgICAgICAgICAgLy8gbm9uLXRhcmdldCBrZXlzIHNvIG5vIGR1cGxpY2F0ZSBzdXJ2aXZlcy4KICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nVmFsdWVzID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBtYXRjaGluZ0tleXMpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGZyb250bWF0dGVyW2tleV07CiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSBleGlzdGluZ1ZhbHVlcy5wdXNoKC4uLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBleGlzdGluZ1ZhbHVlcy5wdXNoKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGtleSAhPT0gdGFyZ2V0S2V5KSBkZWxldGUgZnJvbnRtYXR0ZXJba2V5XTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdWYWx1ZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgIC8vIENvbWJpbmUsIHRoZW4gZGVkdXBsaWNhdGUgYnkgc3RyaW5nIGZvcm0gV0lUSE9VVCBjb2VyY2luZyB0aGUKICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZWQgdmFsdWVzIC0ga2VlcCB0aGUgb3JpZ2luYWwgdHlwZWQgdmFsdWVzIChudW1iZXJzLAogICAgICAgICAgICAgICAgICAgIC8vIGJvb2xlYW5zKSBzbyBhbiBleGlzdGluZyAicmF0aW5nOiA1IiBzdGF5cyBhIG51bWJlci4KICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21iaW5lZCA9IFsuLi5leGlzdGluZ1ZhbHVlcywgLi4udmFsdWVzQXJyYXldOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0KCk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVkdXBsaWNhdGVkID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBjb21iaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBTdHJpbmcodmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlZW4uaGFzKGtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZW4uYWRkKGtleSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWR1cGxpY2F0ZWQucHVzaCh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIFN0b3JlIGFzIHN0cmluZyBvciBhcnJheSBkZXBlbmRpbmcgb24gY291bnQKICAgICAgICAgICAgICAgICAgICBmcm9udG1hdHRlclt0YXJnZXRLZXldID0gZGVkdXBsaWNhdGVkLmxlbmd0aCA9PT0gMQogICAgICAgICAgICAgICAgICAgICAgICA/IGRlZHVwbGljYXRlZFswXQogICAgICAgICAgICAgICAgICAgICAgICA6IGRlZHVwbGljYXRlZDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gUHJvcGVydHkgZG9lc24ndCBleGlzdCAtIGFkZCBpdAogICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXNBcnJheS5sZW5ndGggPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnRtYXR0ZXJbdGFyZ2V0S2V5XSA9IHZhbHVlc0FycmF5WzBdOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWVzQXJyYXkubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgICBmcm9udG1hdHRlclt0YXJnZXRLZXldID0gdmFsdWVzQXJyYXk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gTm93IHN0cmlwIHRoZSBtaWdyYXRlZCBpbmxpbmUgcHJvcGVydGllcyBmcm9tIHRoZSBib2R5LiBVc2UgdmF1bHQucHJvY2VzcwogICAgICAgIC8vIHNvIHRoZSByZWFkICsgcmV3cml0ZSBpcyBhIHNpbmdsZSBhdG9taWMgb3BlcmF0aW9uIChwcm9jZXNzRnJvbnRNYXR0ZXIKICAgICAgICAvLyBhbHJlYWR5IHBlcnNpc3RlZCB0aGUgZnJvbnRtYXR0ZXI7IGEgc2VwYXJhdGUgcmVhZC10aGVuLW1vZGlmeSBjb3VsZAogICAgICAgIC8vIGNsb2JiZXIgYSBjb25jdXJyZW50IGVkaXQgb3Igc3luYyB0aGF0IGxhbmRlZCBpbiBiZXR3ZWVuKS4KICAgICAgICBhd2FpdCBhcHAudmF1bHQucHJvY2VzcyhhY3RpdmVGaWxlLCAoZGF0YSkgPT4gewogICAgICAgICAgICBjb25zdCB7IGNsZWFuZWRDb250ZW50IH0gPSBwYXJzZUlubGluZUZpZWxkc1dpdGhXaWtpbGlua3MoZGF0YSwgcHJvcGVydGllc1RvTWlncmF0ZSwgbWlncmF0ZUFsbCk7CiAgICAgICAgICAgIHJldHVybiBjbGVhbmVkQ29udGVudDsKICAgICAgICB9KTsKCiAgICAgICAgLy8gU2hvdyBzdWNjZXNzIG1lc3NhZ2UKICAgICAgICBjb25zdCBmaWVsZE5hbWVzID0gQXJyYXkuZnJvbShmaWVsZHMua2V5cygpKS5qb2luKCIsICIpOwogICAgICAgIG5ldyBvYnNpZGlhbi5Ob3RpY2UoCiAgICAgICAgICAgIGBNaWdyYXRlZCAke2ZpZWxkcy5zaXplfSBwcm9wZXJ0eS9wcm9wZXJ0aWVzIHRvIGZyb250bWF0dGVyOiAke2ZpZWxkTmFtZXN9YCwKICAgICAgICAgICAgNTAwMAogICAgICAgICk7CgogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJFcnJvciBtaWdyYXRpbmcgZGF0YXZpZXcgcHJvcGVydGllczoiLCBlcnJvcik7CiAgICAgICAgbmV3IG9ic2lkaWFuLk5vdGljZShgRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCA1MDAwKTsKICAgICAgICB0aHJvdyBlcnJvcjsKICAgIH0KfQoKLyoqCiAqIFBhcnNlIGlubGluZSBmaWVsZHMgd2l0aCBzcGVjaWFsIGhhbmRsaW5nIGZvciB3aWtpbGlua3MgaW4gY29tbWEtc2VwYXJhdGVkIHZhbHVlcwogKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCAtIFRoZSBmaWxlIGNvbnRlbnQKICogQHBhcmFtIHtzdHJpbmdbXX0gYWxsb3dlZFByb3BlcnRpZXMgLSBBcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyB0byBtaWdyYXRlIChjYXNlLWluc2Vuc2l0aXZlKQogKiBAcGFyYW0ge2Jvb2xlYW59IG1pZ3JhdGVBbGwgLSBJZiB0cnVlLCBtaWdyYXRlIGFsbCBwcm9wZXJ0aWVzIHJlZ2FyZGxlc3Mgb2YgYWxsb3dlZFByb3BlcnRpZXMKICogQHJldHVybnMge3tmaWVsZHM6IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PiwgY2xlYW5lZENvbnRlbnQ6IHN0cmluZ319CiAqLwpmdW5jdGlvbiBwYXJzZUlubGluZUZpZWxkc1dpdGhXaWtpbGlua3MoY29udGVudCwgYWxsb3dlZFByb3BlcnRpZXMgPSBbXSwgbWlncmF0ZUFsbCA9IGZhbHNlKSB7CiAgICBjb25zdCBmaWVsZHMgPSBuZXcgTWFwKCk7CiAgICBjb25zdCBhbGxvd2VkUHJvcGVydGllc0xvd2VyID0gYWxsb3dlZFByb3BlcnRpZXMubWFwKHAgPT4gcC50b0xvd2VyQ2FzZSgpKTsKCiAgICAvLyBTcGxpdCBjb250ZW50IGludG8gZnJvbnRtYXR0ZXIgYW5kIGJvZHkuIEZyb250bWF0dGVyIGlzIHByZXNlcnZlZCB2ZXJiYXRpbQogICAgLy8gYW5kIGlzIG5ldmVyIHNjYW5uZWQgZm9yIGZpZWxkcyBvciBjb2xsYXBzZWQuCiAgICBjb25zdCB7IGZyb250bWF0dGVyRW5kLCBoYXNFeGlzdGluZ0Zyb250bWF0dGVyLCBmcm9udG1hdHRlclRleHQgfSA9IGZpbmRGcm9udG1hdHRlckVuZChjb250ZW50KTsKICAgIGNvbnN0IGJvZHlDb250ZW50ID0gaGFzRXhpc3RpbmdGcm9udG1hdHRlciA/IGNvbnRlbnQuc2xpY2UoZnJvbnRtYXR0ZXJFbmQpIDogY29udGVudDsKCiAgICAvLyBQcm9jZXNzIGVhY2ggbGluZSBpbiB0aGUgYm9keS4KICAgIGNvbnN0IGJvZHlMaW5lcyA9IGJvZHlDb250ZW50LnNwbGl0KCdcbicpOwogICAgY29uc3QgY2xlYW5lZEJvZHlMaW5lcyA9IFtdOwogICAgLy8gUGFyYWxsZWwgdG8gY2xlYW5lZEJvZHlMaW5lczogYSAicHJvdGVjdGVkIiBsaW5lIChhIGZlbmNlIGRlbGltaXRlciBvciBhbnkKICAgIC8vIGxpbmUgaW5zaWRlIGEgZmVuY2VkIGNvZGUgYmxvY2spIGlzIGtlcHQgdmVyYmF0aW0gYW5kIG5ldmVyIGNvbGxhcHNlZC4KICAgIGNvbnN0IHByb3RlY3RlZEZsYWdzID0gW107CgogICAgLy8gVHJhY2sgdGhlIGN1cnJlbnRseSBvcGVuIGZlbmNlZCBjb2RlIGJsb2NrLCBpZiBhbnkuIGZlbmNlRGVwdGggaXMgdGhlCiAgICAvLyBibG9ja3F1b3RlIG5lc3RpbmcgbGV2ZWwgdGhlIGZlbmNlIG9wZW5lZCBhdCAoMCA9IHRvcCBsZXZlbCksIHNvIGEgZmVuY2UKICAgIC8vIGluc2lkZSAiPiAuLi4iIGlzIGNsb3NlZCBieSBhIGNsb3NlciBhdCB0aGUgc2FtZSBxdW90ZSBkZXB0aC4gZmVuY2VMaXN0SW5kZW50CiAgICAvLyBpcyB0aGUgbGlzdC1pdGVtIGNvbnRlbnQgaW5kZW50IHRoZSBmZW5jZSBvcGVuZWQgYXQgKDAgPSBub3QgaW4gYSBsaXN0KSwgc28gYQogICAgLy8gZmVuY2Ugb3BlbmVkIGJ5ICItIGBgYCIgaGFzIGl0cyBib2R5IGFuZCBjbG9zaW5nIGZlbmNlIHRyYWNrZWQgYXQgdGhhdCBpbmRlbnQuCiAgICBsZXQgZmVuY2VDaGFyID0gbnVsbDsgLy8gJ2AnIG9yICd+JwogICAgbGV0IGZlbmNlTGVuID0gMDsKICAgIGxldCBmZW5jZURlcHRoID0gMDsKICAgIGxldCBmZW5jZUxpc3RJbmRlbnQgPSAwOwoKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYm9keUxpbmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY29uc3QgbGluZSA9IGJvZHlMaW5lc1tpXTsKCiAgICAgICAgaWYgKGZlbmNlQ2hhciAhPT0gbnVsbCkgewogICAgICAgICAgICAvLyBJbnNpZGUgYSBmZW5jZWQgY29kZSBibG9jay4gU3RyaXAgZXhhY3RseSB0aGUgZmVuY2UncyBibG9ja3F1b3RlCiAgICAgICAgICAgIC8vIGNvbnRhaW5lcjsgaWYgdGhpcyBsaW5lIGNhcnJpZXMgZmV3ZXIgbWFya2VycywgdGhlIGJsb2NrcXVvdGUgKGFuZAogICAgICAgICAgICAvLyB0aGVyZWZvcmUgdGhlIGZlbmNlZCBibG9jaykgaGFzIGVuZGVkIC0gcmVwcm9jZXNzIHRoZSBsaW5lIGJlbG93IGFzCiAgICAgICAgICAgIC8vIG5vbi1mZW5jZSBzbyBhIHJlYWwgZmllbGQgYWZ0ZXIgdGhlIGJsb2NrIHN0aWxsIG1pZ3JhdGVzLgogICAgICAgICAgICBjb25zdCB7IGRlcHRoLCBjb250ZW50IH0gPSBzdHJpcEJsb2NrcXVvdGUobGluZSwgZmVuY2VEZXB0aCk7CiAgICAgICAgICAgIGlmIChkZXB0aCA+PSBmZW5jZURlcHRoKSB7CiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZmVuY2Ugb3BlbmVkIGluc2lkZSBhIGxpc3QgaXRlbSwgaXRzIGJvZHkgYW5kIGNsb3NpbmcgZmVuY2UKICAgICAgICAgICAgICAgIC8vIHNpdCBhdCB0aGUgbGlzdCdzIGNvbnRlbnQgaW5kZW50IC0gc3RyaXAgdGhhdCBiZWZvcmUgbWF0Y2hpbmcgdGhlCiAgICAgICAgICAgICAgICAvLyBjbG9zZXIuIEZvciBhIG5vbi1saXN0IGZlbmNlIGZlbmNlTGlzdEluZGVudCBpcyAwLCBzbyB0aGlzIGlzIGEKICAgICAgICAgICAgICAgIC8vIG5vLW9wIGFuZCBiZWhhdmlvdXIgaXMgaWRlbnRpY2FsIHRvIGEgcGxhaW4gdG9wLWxldmVsIGZlbmNlLgogICAgICAgICAgICAgICAgY29uc3QgeyByZXN0LCBpbmRlbnQgfSA9IHN0cmlwTGVhZGluZ1NwYWNlcyhjb250ZW50LCBmZW5jZUxpc3RJbmRlbnQpOwogICAgICAgICAgICAgICAgaWYgKGZlbmNlTGlzdEluZGVudCA+IDAgJiYgaW5kZW50IDwgZmVuY2VMaXN0SW5kZW50ICYmIHJlc3QudHJpbSgpICE9PSAnJykgewogICAgICAgICAgICAgICAgICAgIC8vIEEgbm9uLWJsYW5rIGxpbmUgaW5kZW50ZWQgTEVTUyB0aGFuIHRoZSBsaXN0IGNvbnRlbnQgaGFzIGxlZnQKICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbGlzdCBpdGVtLCBzbyBwZXIgQ29tbW9uTWFyayB0aGUgKHVuY2xvc2VkKSBmZW5jZSBlbmRzCiAgICAgICAgICAgICAgICAgICAgLy8gaGVyZS4gRXhpdCBhbmQgZmFsbCB0aHJvdWdoIHRvIHJlcHJvY2VzcyB0aGUgbGluZSAtIGl0IG1heSBiZSBhCiAgICAgICAgICAgICAgICAgICAgLy8gcmVhbCBmaWVsZCBvciBhIE5FVyB0b3AtbGV2ZWwgZmVuY2UgKGUuZy4gYSBiYXJlIGBgYCB0aGF0IHdvdWxkCiAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGJlIG1pc3Rha2VuIGZvciB0aGlzIGZlbmNlJ3MgY2xvc2VyKS4gQmxhbmsgbGluZXMgc3RheQogICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBibG9jay4KICAgICAgICAgICAgICAgICAgICBmZW5jZUNoYXIgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGZlbmNlTGVuID0gMDsKICAgICAgICAgICAgICAgICAgICBmZW5jZURlcHRoID0gMDsKICAgICAgICAgICAgICAgICAgICBmZW5jZUxpc3RJbmRlbnQgPSAwOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyBTdGlsbCBpbnNpZGUgdGhlIGJsb2NrOiBwcmVzZXJ2ZSB2ZXJiYXRpbSwgbmV2ZXIgbWlncmF0ZS4gT25seSBhCiAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hpbmcgY2xvc2luZyBmZW5jZSAoc2FtZSBtYXJrZXIsIGxvbmcgZW5vdWdoLCBubyBpbmZvIHN0cmluZykKICAgICAgICAgICAgICAgICAgICAvLyBhdCB0aGUgc2FtZSBxdW90ZSArIGxpc3QgZGVwdGggZW5kcyBpdC4KICAgICAgICAgICAgICAgICAgICBpZiAoaXNDbG9zaW5nRmVuY2UocmVzdCwgZmVuY2VDaGFyLCBmZW5jZUxlbikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2VDaGFyID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2VMZW4gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICBmZW5jZURlcHRoID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgZmVuY2VMaXN0SW5kZW50ID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2xlYW5lZEJvZHlMaW5lcy5wdXNoKGxpbmUpOwogICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZEZsYWdzLnB1c2godHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBCbG9ja3F1b3RlIGNvbnRhaW5lciBleGl0ZWQ6IGVuZCB0aGUgZmVuY2UgYW5kIGZhbGwgdGhyb3VnaCBzbyB0aGlzCiAgICAgICAgICAgICAgICAvLyBsaW5lIGlzIGhhbmRsZWQgbm9ybWFsbHkuCiAgICAgICAgICAgICAgICBmZW5jZUNoYXIgPSBudWxsOwogICAgICAgICAgICAgICAgZmVuY2VMZW4gPSAwOwogICAgICAgICAgICAgICAgZmVuY2VEZXB0aCA9IDA7CiAgICAgICAgICAgICAgICBmZW5jZUxpc3RJbmRlbnQgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBOb3QgaW5zaWRlIGEgY29kZSBibG9jazogYW4gb3BlbmluZyBmZW5jZSAodG9wLWxldmVsLCBibG9ja3F1b3RlZCwgb3IgYXMKICAgICAgICAvLyB0aGUgZmlyc3QgY29udGVudCBvZiBhIGxpc3QgaXRlbSkgc3RhcnRzIG9uZS4gRGV0ZWN0IGl0IG9uIHRoZQogICAgICAgIC8vIGJsb2NrcXVvdGUtc3RyaXBwZWQgY29udGVudCwgYWZ0ZXIgb3B0aW9uYWxseSBzdHJpcHBpbmcgYSBsaXN0IG1hcmtlciwgYW5kCiAgICAgICAgLy8gcmVtZW1iZXIgdGhlIHF1b3RlIGRlcHRoICsgbGlzdCBpbmRlbnQgc28gdGhlIG1hdGNoaW5nIGNsb3NlciBpcyBmb3VuZC4KICAgICAgICB7CiAgICAgICAgICAgIGNvbnN0IHsgZGVwdGgsIGNvbnRlbnQgfSA9IHN0cmlwQmxvY2txdW90ZShsaW5lLCBJbmZpbml0eSk7CiAgICAgICAgICAgIGNvbnN0IHsgcmVzdCwgaW5kZW50IH0gPSBzdHJpcExpc3RNYXJrZXIoY29udGVudCk7CiAgICAgICAgICAgIGNvbnN0IGZlbmNlID0gb3BlbmluZ0ZlbmNlKHJlc3QpOwogICAgICAgICAgICBpZiAoZmVuY2UpIHsKICAgICAgICAgICAgICAgIGZlbmNlQ2hhciA9IGZlbmNlLmNoYXI7CiAgICAgICAgICAgICAgICBmZW5jZUxlbiA9IGZlbmNlLmxlbjsKICAgICAgICAgICAgICAgIGZlbmNlRGVwdGggPSBkZXB0aDsKICAgICAgICAgICAgICAgIGZlbmNlTGlzdEluZGVudCA9IGluZGVudDsKICAgICAgICAgICAgICAgIGNsZWFuZWRCb2R5TGluZXMucHVzaChsaW5lKTsKICAgICAgICAgICAgICAgIHByb3RlY3RlZEZsYWdzLnB1c2godHJ1ZSk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gT3V0c2lkZSBhbnkgY29kZSBmZW5jZTogZGVjaWRlIHdoZXRoZXIgdGhpcyBsaW5lIGlzIGEgbWlncmF0YWJsZSBmaWVsZC4KICAgICAgICBjb25zdCB0cmltbWVkTGluZSA9IGxpbmUudHJpbSgpOwogICAgICAgIGxldCBpc1Byb3BlcnR5VG9SZW1vdmUgPSBmYWxzZTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICB0cmltbWVkTGluZS5pbmNsdWRlcygnOjonKSAmJgogICAgICAgICAgICAvLyBTa2lwIHRhc2sgY2hlY2tib3hlcyAoZS5nLiAiLSBbIF0gZG86OiB0aGluZyIpLgogICAgICAgICAgICAhL15bLSorXVxzK1xbW3hYIF1cXS8udGVzdCh0cmltbWVkTGluZSkKICAgICAgICApIHsKICAgICAgICAgICAgLy8gTWFzayBpbmxpbmUgY29kZSBzcGFucyBzbyBhICI6OiIgaW5zaWRlIGNvZGUgaXMgbm90IHJlYWQgYXMgYSBmaWVsZAogICAgICAgICAgICAvLyBzZXBhcmF0b3IuIE1hc2tpbmcgcHJlc2VydmVzIGxlbmd0aCBzbyBwb3NpdGlvbnMgc3RheSBhbGlnbmVkIHdpdGgKICAgICAgICAgICAgLy8gdGhlIG9yaWdpbmFsIGxpbmUuCiAgICAgICAgICAgIGNvbnN0IG1hc2tlZExpbmUgPSBtYXNrSW5saW5lQ29kZSh0cmltbWVkTGluZSk7CiAgICAgICAgICAgIGNvbnN0IGZpZWxkTWF0Y2ggPSBtYXNrZWRMaW5lLm1hdGNoKC9eKFteOl0rPyk6OiguKikkLyk7CgogICAgICAgICAgICBpZiAoZmllbGRNYXRjaCkgewogICAgICAgICAgICAgICAgY29uc3QgbmFtZUVuZCA9IGZpZWxkTWF0Y2hbMV0ubGVuZ3RoOwogICAgICAgICAgICAgICAgLy8gVGhlIGZpZWxkIG5hbWUgbXVzdCBiZSBmcmVlIG9mIGlubGluZSBjb2RlLiBJZiBtYXNraW5nIGNoYW5nZWQKICAgICAgICAgICAgICAgIC8vIHRoZSBuYW1lIHJlZ2lvbiwgdGhlIGxpbmUgaXMgbWlkLWNvbnRlbnQgKGUuZy4gYSBjb2RlIHNwYW4gc2l0cwogICAgICAgICAgICAgICAgLy8gYmVmb3JlIHRoZSBjb2xvbiksIG5vdCBhIGNsZWFuICJuYW1lOjogdmFsdWUiIGZpZWxkIC0gbGVhdmUgaXQKICAgICAgICAgICAgICAgIC8vIHZlcmJhdGltIHNvIHdlIG5ldmVyIGRlbGV0ZSB0aGUgY29kZSBzcGFuIHRoYXQgcHJlY2VkZXMgaXQuCiAgICAgICAgICAgICAgICBjb25zdCBuYW1lSXNDbGVhbiA9CiAgICAgICAgICAgICAgICAgICAgbWFza2VkTGluZS5zbGljZSgwLCBuYW1lRW5kKSA9PT0gdHJpbW1lZExpbmUuc2xpY2UoMCwgbmFtZUVuZCk7CgogICAgICAgICAgICAgICAgaWYgKG5hbWVJc0NsZWFuKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmllbGROYW1lID0gdHJpbW1lZExpbmUuc2xpY2UoMCwgbmFtZUVuZCkudHJpbSgpOwogICAgICAgICAgICAgICAgICAgIC8vIFNraXAgdGhlICI6OiIgc2VwYXJhdG9yOyByZWNvdmVyIHRoZSByZWFsIHZhbHVlIChpbmNsdWRpbmcgYW55CiAgICAgICAgICAgICAgICAgICAgLy8gYmFja3RpY2tzKSBmcm9tIHRoZSBvcmlnaW5hbCBsaW5lLgogICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkVmFsdWUgPSB0cmltbWVkTGluZS5zbGljZShuYW1lRW5kICsgMikudHJpbSgpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGROYW1lICYmIGZpZWxkVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmllbGROYW1lTG93ZXIgPSBmaWVsZE5hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGZyb250bWF0dGVyWydfX3Byb3RvX18nXSA9IHZhbHVlYCBoaXRzIHRoZSBPYmplY3QucHJvdG90eXBlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjY2Vzc29yIGluc3RlYWQgb2YgY3JlYXRpbmcgYW4gb3duIHByb3BlcnR5LCBzbyB0aGUgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd291bGQgYmUgc2lsZW50bHkgZHJvcHBlZCB3aGlsZSB0aGUgYm9keSBsaW5lIGlzIGRlbGV0ZWQgLQogICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIGxvc3MuIExlYXZlIHN1Y2ggYSBsaW5lIGluIHRoZSBib2R5IHZlcmJhdGltIGluc3RlYWQKICAgICAgICAgICAgICAgICAgICAgICAgLy8gKG1pcnJvcnMgdGhlIGNvcmUgcGx1Z2luJ3MgZHVuZGVyLWtleSBndWFyZCwgd2hpY2ggYmxvY2tzCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIF9fcHJvdG9fXyBpbiBhbnkgcG9zaXRpb24pLgogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1Vud3JpdGFibGVOYW1lID0gZmllbGROYW1lID09PSAnX19wcm90b19fJzsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkTWlncmF0ZSA9ICFpc1Vud3JpdGFibGVOYW1lICYmIChtaWdyYXRlQWxsIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb3dlZFByb3BlcnRpZXNMb3dlci5sZW5ndGggPiAwICYmIGFsbG93ZWRQcm9wZXJ0aWVzTG93ZXIuaW5jbHVkZXMoZmllbGROYW1lTG93ZXIpKSk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkTWlncmF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBsaW5lIHNob3VsZCBiZSByZW1vdmVkIChtb3ZlZCB0byBmcm9udG1hdHRlcikuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1Byb3BlcnR5VG9SZW1vdmUgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmllbGRzLmhhcyhmaWVsZE5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzLnNldChmaWVsZE5hbWUsIG5ldyBTZXQoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFyc2UgdGhlIHZhbHVlIHdpdGggc3BlY2lhbCBoYW5kbGluZyBmb3Igd2lraWxpbmtzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkVmFsdWVzID0gcGFyc2VDb21tYVNlcGFyYXRlZFdpdGhXaWtpbGlua3MoZmllbGRWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWRWYWx1ZXMuZm9yRWFjaCh2YWx1ZSA9PiBmaWVsZHMuZ2V0KGZpZWxkTmFtZSkuYWRkKHZhbHVlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIEtlZXAgdGhlIGxpbmUgaWYgaXQncyBub3QgYSBwcm9wZXJ0eSB0byByZW1vdmUuCiAgICAgICAgaWYgKCFpc1Byb3BlcnR5VG9SZW1vdmUpIHsKICAgICAgICAgICAgY2xlYW5lZEJvZHlMaW5lcy5wdXNoKGxpbmUpOwogICAgICAgICAgICBwcm90ZWN0ZWRGbGFncy5wdXNoKGZhbHNlKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gQ29sbGFwc2UgcnVucyBvZiAyKyBjb25zZWN1dGl2ZSBibGFuayBsaW5lcyBkb3duIHRvIGEgc2luZ2xlIGJsYW5rIGxpbmUsIGJ1dAogICAgLy8gbmV2ZXIgdG91Y2ggYmxhbmsgbGluZXMgaW5zaWRlIGZlbmNlZCBjb2RlIGJsb2NrcyAodmVyYmF0aW0gZ3VhcmFudGVlKS4gVGhpcwogICAgLy8gYWxzbyBsZWF2ZXMgdGhlIGZyb250bWF0dGVyIHVudG91Y2hlZCwgdW5saWtlIGEgZ2xvYmFsIG5ld2xpbmUgcmVnZXguCiAgICBjb25zdCBjb2xsYXBzZWRMaW5lcyA9IFtdOwogICAgbGV0IGJsYW5rUnVuID0gMDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xlYW5lZEJvZHlMaW5lcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNvbnN0IGJvZHlMaW5lID0gY2xlYW5lZEJvZHlMaW5lc1tpXTsKICAgICAgICBpZiAoIXByb3RlY3RlZEZsYWdzW2ldICYmIGJvZHlMaW5lLnRyaW0oKSA9PT0gJycpIHsKICAgICAgICAgICAgYmxhbmtSdW4gKz0gMTsKICAgICAgICAgICAgaWYgKGJsYW5rUnVuIDw9IDEpIHsKICAgICAgICAgICAgICAgIGNvbGxhcHNlZExpbmVzLnB1c2goYm9keUxpbmUpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYmxhbmtSdW4gPSAwOwogICAgICAgICAgICBjb2xsYXBzZWRMaW5lcy5wdXNoKGJvZHlMaW5lKTsKICAgICAgICB9CiAgICB9CgogICAgY29uc3QgY2xlYW5lZEJvZHkgPSBjb2xsYXBzZWRMaW5lcy5qb2luKCdcbicpOwogICAgY29uc3QgY2xlYW5lZENvbnRlbnQgPSBoYXNFeGlzdGluZ0Zyb250bWF0dGVyCiAgICAgICAgPyBmcm9udG1hdHRlclRleHQgKyBjbGVhbmVkQm9keQogICAgICAgIDogY2xlYW5lZEJvZHk7CgogICAgcmV0dXJuIHsgZmllbGRzLCBjbGVhbmVkQ29udGVudCB9Owp9CgovKioKICogU3RyaXAgdXAgdG8gYG1heGAgbGVhZGluZyBibG9ja3F1b3RlIG1hcmtlcnMgZnJvbSBhIGxpbmUuIEEgbWFya2VyIGlzIHVwIHRvIDMKICogc3BhY2VzIG9mIGluZGVudGF0aW9uLCBhICI+IiwgYW5kIG9uZSBvcHRpb25hbCBmb2xsb3dpbmcgc3BhY2UsIGFuZCBtYXJrZXJzCiAqIG5lc3QgKCI+ID4gIiBvciAiPj4gIikuIFJldHVybnMgdGhlIG51bWJlciBvZiBtYXJrZXJzIHN0cmlwcGVkIChgZGVwdGhgKSBhbmQgdGhlCiAqIHJlbWFpbmluZyBgY29udGVudGAuIFRoaXMgbGV0cyBmZW5jZWQgY29kZSBibG9ja3MgYmUgdHJhY2tlZCBpbnNpZGUgYmxvY2txdW90ZXM6CiAqIHRoZSBibG9jaydzIGNvbnRlbnQgYW5kIGl0cyBjbG9zaW5nIGZlbmNlIHNpdCBhdCB0aGUgc2FtZSBxdW90ZSBkZXB0aCBhcyB0aGUKICogb3BlbmVyLCBhbmQgYSBsaW5lIHdpdGggZmV3ZXIgbWFya2VycyBtZWFucyB0aGUgYmxvY2txdW90ZSAoYW5kIHRoZSBibG9jaykgZW5kZWQuCiAqLwpmdW5jdGlvbiBzdHJpcEJsb2NrcXVvdGUobGluZSwgbWF4KSB7CiAgICBsZXQgY29udGVudCA9IGxpbmU7CiAgICBsZXQgZGVwdGggPSAwOwogICAgd2hpbGUgKGRlcHRoIDwgbWF4KSB7CiAgICAgICAgY29uc3QgbWF0Y2ggPSBjb250ZW50Lm1hdGNoKC9eIHswLDN9PiggPykvKTsKICAgICAgICBpZiAoIW1hdGNoKSBicmVhazsKICAgICAgICBkZXB0aCArPSAxOwogICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKG1hdGNoWzBdLmxlbmd0aCk7CiAgICB9CiAgICByZXR1cm4geyBkZXB0aCwgY29udGVudCB9Owp9CgovKioKICogU3RyaXAgYW4gb3B0aW9uYWwgbGVhZGluZyBsaXN0LWl0ZW0gbWFya2VyICgiLSAiLCAiKiAiLCAiKyAiLCAiMS4gIiwgIjEpICIpCiAqIGZyb20gYSBsaW5lIHdob3NlIGJsb2NrcXVvdGUgbWFya2VycyBoYXZlIGFscmVhZHkgYmVlbiByZW1vdmVkLiBSZXR1cm5zIHRoZQogKiByZW1haW5pbmcgdGV4dCBhbmQgdGhlIG51bWJlciBvZiBjb2x1bW5zIHRoZSBtYXJrZXIgY29uc3VtZWQgKHRoZSBsaXN0IGNvbnRlbnQKICogaW5kZW50KS4gVGhpcyBsZXRzIGEgY29kZSBmZW5jZSB0aGF0IG9wZW5zIGFzIHRoZSBmaXJzdCBjb250ZW50IG9mIGEgbGlzdCBpdGVtCiAqIChlLmcuICItIGBgYCIpIGJlIHJlY29nbmlzZWQsIHdpdGggaXRzIGJvZHkgYW5kIGNsb3NpbmcgZmVuY2UgdHJhY2tlZCBhdCB0aGF0CiAqIGluZGVudC4gQSBsaXN0IG1hcmtlciBpcyBhbiB1bmFtYmlndW91cyBibG9jayBjb250YWluZXIsIHNvIGRldGVjdGluZyBpdCBoZXJlIGlzCiAqIHNhZmUgLSB1bmxpa2UgYSBiYXJlIGluZGVudCwgaXQgY2Fubm90IGJlIGNvbmZ1c2VkIHdpdGggb3JkaW5hcnkgdGV4dC4KICovCmZ1bmN0aW9uIHN0cmlwTGlzdE1hcmtlcihjb250ZW50KSB7CiAgICBjb25zdCBtYXRjaCA9IGNvbnRlbnQubWF0Y2goL14gezAsM30oPzpbLSorXXxcZHsxLDl9Wy4pXSlccysvKTsKICAgIGlmICghbWF0Y2gpIHJldHVybiB7IHJlc3Q6IGNvbnRlbnQsIGluZGVudDogMCB9OwogICAgcmV0dXJuIHsgcmVzdDogY29udGVudC5zbGljZShtYXRjaFswXS5sZW5ndGgpLCBpbmRlbnQ6IG1hdGNoWzBdLmxlbmd0aCB9Owp9CgovKioKICogU3RyaXAgdXAgdG8gYG1heGAgbGVhZGluZyBzcGFjZXMgZnJvbSBhIGxpbmUuIFJldHVybnMgdGhlIHJlbWFpbmluZyB0ZXh0IGFuZCB0aGUKICogbnVtYmVyIG9mIHNwYWNlcyBhY3R1YWxseSByZW1vdmVkLgogKi8KZnVuY3Rpb24gc3RyaXBMZWFkaW5nU3BhY2VzKGNvbnRlbnQsIG1heCkgewogICAgbGV0IGluZGVudCA9IDA7CiAgICB3aGlsZSAoaW5kZW50IDwgbWF4ICYmIGNvbnRlbnRbaW5kZW50XSA9PT0gJyAnKSBpbmRlbnQgKz0gMTsKICAgIHJldHVybiB7IHJlc3Q6IGNvbnRlbnQuc2xpY2UoaW5kZW50KSwgaW5kZW50IH07Cn0KCi8qKgogKiBEZXRlY3QgYW4gb3BlbmluZyBjb2RlIGZlbmNlIChgYGAgb3Igfn5+KSBvbiBhIGxpbmUgd2hvc2UgYmxvY2txdW90ZSBhbmQgbGlzdAogKiBtYXJrZXJzIGhhdmUgYWxyZWFkeSBiZWVuIHN0cmlwcGVkLiBQZXIgQ29tbW9uTWFyayBhIGZlbmNlIG1heSBiZSBpbmRlbnRlZCAwLTMKICogc3BhY2VzICg0KyBpcyBhbiBpbmRlbnRlZCBjb2RlIGJsb2NrKSBhbmQgbWF5IGNhcnJ5IGFuIGluZm8gc3RyaW5nLiBSZXR1cm5zCiAqIHsgY2hhciwgbGVuIH0gZm9yIHRoZSBtYXJrZXIsIG9yIG51bGwuCiAqCiAqIE91dCBvZiBzY29wZSAtIDQtc3BhY2UgSU5ERU5URUQgY29kZSBibG9ja3MgYXJlIG5vdCBkZXRlY3RlZC4gVGVsbGluZyBhIGdlbnVpbmUKICogaW5kZW50ZWQgY29kZSBibG9jayBhcGFydCBmcm9tIGluZGVudGVkIHRleHQgbmVlZHMgcGFyYWdyYXBoIGJsb2NrIGNvbnRleHQKICogKENvbW1vbk1hcms6IGluZGVudGVkIGNvZGUgY2Fubm90IGludGVycnVwdCBhIHBhcmFncmFwaCwgYW5kIGEgNC1zcGFjZSBpbmRlbnQKICogdW5kZXIgYSBsaXN0IGl0ZW0gaXMgbGlzdCBjb250ZW50IHJhdGhlciB0aGFuIGNvZGUpLiBBIGxpbmUtYmFzZWQgc2NyaXB0IGxhY2tzCiAqIHRoYXQgY29udGV4dCwgYW5kIGEgcGFydGlhbCBoZXVyaXN0aWMgd291bGQgZWl0aGVyIHJlaW50cm9kdWNlIGRhdGEgbG9zcwogKiAoZGVsZXRpbmcgaW5kZW50ZWQgY29kZSkgb3IgY2F1c2UgdGhlIG9wcG9zaXRlIGJ1ZyAtIHNpbGVudGx5IHNraXBwaW5nIGEgcmVhbAogKiBpbmxpbmUgZmllbGQgbWVyZWx5IGluZGVudGVkIHVuZGVyIGEgbGlzdCAoRGF0YXZpZXcgcGFyc2VzIHRob3NlIGFzIGZpZWxkcywgc28KICogdXNlcnMgZXhwZWN0IHRoZW0gdG8gbWlncmF0ZSkuIEZlbmNlZCBjb2RlICh0b3AtbGV2ZWwsIGJsb2NrcXVvdGVkLCBBTkQgbGlzdC0KICogbmVzdGVkKSBhbmQgaW5saW5lIGNvZGUgQVJFIGRldGVjdGVkIGFuZCBwcmVzZXJ2ZWQ7IG9ubHkgYW4gaW5saW5lLWZpZWxkLWxpa2UKICogbGluZSBpbnNpZGUgYSBnZW51aW5lIElOREVOVEVEIGNvZGUgYmxvY2sgbWF5IHN0aWxsIG1pZ3JhdGUuCiAqLwpmdW5jdGlvbiBvcGVuaW5nRmVuY2UobGluZSkgewogICAgY29uc3QgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eIHswLDN9KGB7Myx9fH57Myx9KS8pOwogICAgaWYgKCFtYXRjaCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4geyBjaGFyOiBtYXRjaFsxXVswXSwgbGVuOiBtYXRjaFsxXS5sZW5ndGggfTsKfQoKLyoqCiAqIEEgY2xvc2luZyBmZW5jZSB1c2VzIHRoZSBzYW1lIG1hcmtlciBjaGFyYWN0ZXIsIGlzIGF0IGxlYXN0IGFzIGxvbmcgYXMgdGhlCiAqIG9wZW5pbmcgZmVuY2UsIGFuZCBjYXJyaWVzIG5vIGluZm8gc3RyaW5nIChvbmx5IG9wdGlvbmFsIHRyYWlsaW5nIHdoaXRlc3BhY2UpLgogKi8KZnVuY3Rpb24gaXNDbG9zaW5nRmVuY2UobGluZSwgZmVuY2VDaGFyLCBmZW5jZUxlbikgewogICAgLy8gQWxsb3cgYSB0cmFpbGluZyBDUiBzbyBDUkxGIGZpbGVzIGNsb3NlIHRoZWlyIGZlbmNlcyBjb3JyZWN0bHkuCiAgICBjb25zdCBtYXRjaCA9IGxpbmUubWF0Y2goL14gezAsM30oYHszLH18fnszLH0pWyBcdF0qXHI/JC8pOwogICAgaWYgKCFtYXRjaCkgcmV0dXJuIGZhbHNlOwogICAgY29uc3QgbWFya2VyID0gbWF0Y2hbMV07CiAgICByZXR1cm4gbWFya2VyWzBdID09PSBmZW5jZUNoYXIgJiYgbWFya2VyLmxlbmd0aCA+PSBmZW5jZUxlbjsKfQoKLyoqCiAqIFJlcGxhY2UgaW5saW5lIGNvZGUgc3BhbnMgd2l0aCBlcXVhbC1sZW5ndGggYmxhbmtzIHNvIGEgIjo6IiBpbnNpZGUgY29kZSBpcyBub3QKICogbWlzdGFrZW4gZm9yIGFuIGlubGluZS1maWVsZCBzZXBhcmF0b3IuIFN1cHBvcnRzIGFyYml0cmFyeSBiYWNrdGljay1ydW4gbGVuZ3RocwogKiAoYGNvZGVgLCBgYGNvYGRlYGApLiBDaGFyYWN0ZXIgcG9zaXRpb25zIGFyZSBwcmVzZXJ2ZWQgc28gdGhlIGNhbGxlciBjYW4gc2xpY2UKICogdGhlIG9yaWdpbmFsIGxpbmUgYnkgb2Zmc2V0cyBjb21wdXRlZCBvbiB0aGUgbWFza2VkIGxpbmUuCiAqCiAqIEltcGxlbWVudGVkIGFzIGEgbGluZWFyLXRpbWUgc2NhbiBvdmVyIHRoZSBpbmRleGVkIGJhY2t0aWNrIHJ1bnMgKG5vCiAqIGJhY2t0cmFja2luZzsgaXQgaW5kZXhlcyB0aGUgcnVucywgdGhlbiB3YWxrcyB0aGVtIG9uY2UpLiBUaGUgZWFybGllciByZWdleAogKiAvKGArKSg/Oig/IVwxKVtcc1xTXSkqP1wxL2cgY29tYmluZWQgYSBiYWNrcmVmZXJlbmNlZCBvcGVuZXIsIGEgbGF6eSBib2R5LCBhbmQgYQogKiBuZWdhdGl2ZSBsb29rYWhlYWQsIHdoaWNoIGJhY2t0cmFja3Mgc3VwZXItbGluZWFybHkgKHNlY29uZHMgb2YgbWFpbi10aHJlYWQKICogZnJlZXplKSBvbiBhIGxvbmcgYmFja3RpY2sgcnVuIHdpdGggbm8gbWF0Y2hpbmctbGVuZ3RoIGNsb3NlciAtIHJlYWNoYWJsZSBmcm9tIGEKICogc3luY2VkL3NoYXJlZCBub3RlIHRoYXQgdGhlIHVzZXIgbWlncmF0ZXMuIFRoaXMgc2Nhbm5lciByZXByb2R1Y2VzIHRoZSByZWdleCdzCiAqIGV4YWN0IG1hc2tpbmcgYmVoYXZpb3VyIHdpdGggTyhuKSB3b3JrOiBhIHJ1biBvZiBrIGJhY2t0aWNrcyBpcyBjbG9zZWQgYnkgdGhlCiAqIGZpcnN0IHJ1biBvZiBhdCBsZWFzdCBrIGJhY2t0aWNrcyAoaXRzIGZpcnN0IGsgYmFja3RpY2tzIGZvcm0gdGhlIGNsb3NlciwgdGhlCiAqIHJlZ2V4J3MgYFwxYCksIHByZWZlcnJpbmcgdGhlIGxvbmdlc3Qgb3BlbmVyIGxlbmd0aCB0aGUgZW5naW5lIHdvdWxkIGhhdmUKICogbWF0Y2hlZC4gQW4gdW5jbG9zZWQgb3BlbmVyIHN0YXlzIHZlcmJhdGltLgogKi8KZnVuY3Rpb24gbWFza0lubGluZUNvZGUodGV4dCkgewogICAgY29uc3QgbiA9IHRleHQubGVuZ3RoOwoKICAgIC8vIEluZGV4IGV2ZXJ5IG1heGltYWwgcnVuIG9mIGJhY2t0aWNrcyBvbmNlLgogICAgY29uc3QgcnVuU3RhcnQgPSBbXTsKICAgIGNvbnN0IHJ1bkxlbiA9IFtdOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyApIHsKICAgICAgICBpZiAodGV4dC5jaGFyQ29kZUF0KGkpID09PSA5NiAvKiBgICovKSB7CiAgICAgICAgICAgIGxldCBqID0gaSArIDE7CiAgICAgICAgICAgIHdoaWxlIChqIDwgbiAmJiB0ZXh0LmNoYXJDb2RlQXQoaikgPT09IDk2KSBqKys7CiAgICAgICAgICAgIHJ1blN0YXJ0LnB1c2goaSk7CiAgICAgICAgICAgIHJ1bkxlbi5wdXNoKGogLSBpKTsKICAgICAgICAgICAgaSA9IGo7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaSsrOwogICAgICAgIH0KICAgIH0KICAgIGNvbnN0IHJ1bkNvdW50ID0gcnVuU3RhcnQubGVuZ3RoOwogICAgaWYgKHJ1bkNvdW50ID09PSAwKSByZXR1cm4gdGV4dDsKCiAgICAvLyBzdWZmaXhNYXhbYV0gPSBsb25nZXN0IHJ1biBvdmVyIHJ1bnNbYS4uZW5kXTsgc3VmZml4TWF4W3J1bkNvdW50XSA9IDAuIExldHMgdGhlCiAgICAvLyBiZXN0IGNsb3NlciBmb3IgYSBnaXZlbiBvcGVuZXIgYmUgZm91bmQgd2l0aG91dCByZS1zY2FubmluZyBsYXRlciBydW5zLgogICAgY29uc3Qgc3VmZml4TWF4ID0gbmV3IEFycmF5KHJ1bkNvdW50ICsgMSk7CiAgICBzdWZmaXhNYXhbcnVuQ291bnRdID0gMDsKICAgIGZvciAobGV0IGEgPSBydW5Db3VudCAtIDE7IGEgPj0gMDsgYS0tKSB7CiAgICAgICAgc3VmZml4TWF4W2FdID0gTWF0aC5tYXgocnVuTGVuW2FdLCBzdWZmaXhNYXhbYSArIDFdKTsKICAgIH0KCiAgICBjb25zdCBvdXQgPSB0ZXh0LnNwbGl0KCcnKTsKICAgIGNvbnN0IGJsYW5rID0gKGZyb20sIHRvKSA9PiB7IGZvciAobGV0IHAgPSBmcm9tOyBwIDwgdG87IHArKykgb3V0W3BdID0gJyAnOyB9OwoKICAgIC8vIFdhbGsgZWFjaCBsb2dpY2FsIG9wZW5lci4gYGFgIGlzIHRoZSBydW4gd2Ugc2l0IGluOyBgaWAvYG1gIGFyZSB0aGUgb3BlbmVyJ3MKICAgIC8vIHN0YXJ0IHBvc2l0aW9uIGFuZCByZW1haW5pbmcgYmFja3RpY2sgY291bnQgKG0gPCBydW5MZW5bYV0gb25seSB3aGVuIGEgcHJpb3IKICAgIC8vIGNsb3NlciBhbHJlYWR5IGNvbnN1bWVkIGEgcHJlZml4IG9mIHRoaXMgcnVuKS4KICAgIGxldCBhID0gMDsKICAgIGxldCBpID0gcnVuU3RhcnRbMF07CiAgICBsZXQgbSA9IHJ1bkxlblswXTsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgY29uc3QgaGFsZiA9IG0gPj4gMTsgICAgICAgICAgICAvLyBmbG9vcihtLzIpOiBsb25nZXN0IG9wZW5lciB0aGF0IGNsb3NlcyBpbnNpZGUgdGhpcyBydW4KICAgICAgICBjb25zdCBtYXhMYXRlciA9IHN1ZmZpeE1heFthICsgMV07CiAgICAgICAgY29uc3Qga1VwcGVyID0gTWF0aC5taW4obSwgbWF4TGF0ZXIpOyAvLyBsb25nZXN0IG9wZW5lciB0aGF0IGNsb3NlcyBpbiBhIGxhdGVyIHJ1bgoKICAgICAgICBpZiAoa1VwcGVyID4gaGFsZikgewogICAgICAgICAgICAvLyBHcmVlZHkgb3BlbmVyIG9mIGxlbmd0aCBrVXBwZXI7IGNsb3NlciBpcyB0aGUgZmlyc3QgbGF0ZXIgcnVuIHRoYXQgbG9uZy4KICAgICAgICAgICAgY29uc3QgayA9IGtVcHBlcjsKICAgICAgICAgICAgbGV0IGIgPSBhICsgMTsKICAgICAgICAgICAgd2hpbGUgKHJ1bkxlbltiXSA8IGspIGIrKzsgIC8vIGV4aXN0cyBiZWNhdXNlIG1heExhdGVyID49IGsKICAgICAgICAgICAgY29uc3QgbWF0Y2hFbmQgPSBydW5TdGFydFtiXSArIGs7CiAgICAgICAgICAgIGJsYW5rKGksIG1hdGNoRW5kKTsKICAgICAgICAgICAgY29uc3QgbGVmdG92ZXIgPSBydW5MZW5bYl0gLSBrOwogICAgICAgICAgICBpZiAobGVmdG92ZXIgPiAwKSB7IGEgPSBiOyBpID0gbWF0Y2hFbmQ7IG0gPSBsZWZ0b3ZlcjsgY29udGludWU7IH0KICAgICAgICAgICAgYSA9IGIgKyAxOwogICAgICAgIH0gZWxzZSBpZiAoaGFsZiA+IDApIHsKICAgICAgICAgICAgLy8gQ2xvc2VyIGlzIHRoZSBuZXh0IGBoYWxmYCBiYWNrdGlja3MgaW5zaWRlIHRoaXMgc2FtZSBydW4uCiAgICAgICAgICAgIGNvbnN0IG1hdGNoRW5kID0gaSArIDIgKiBoYWxmOwogICAgICAgICAgICBibGFuayhpLCBtYXRjaEVuZCk7CiAgICAgICAgICAgIGNvbnN0IGxlZnRvdmVyID0gbSAtIDIgKiBoYWxmOyAvLyAwIChldmVuIHJ1bikgb3IgMSAob2RkIHJ1bikKICAgICAgICAgICAgaWYgKGxlZnRvdmVyID4gMCkgeyBpID0gbWF0Y2hFbmQ7IG0gPSBsZWZ0b3ZlcjsgY29udGludWU7IH0KICAgICAgICAgICAgYSA9IGEgKyAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIG0gPT09IDEgd2l0aCBubyBsYXRlciBiYWNrdGlja3M6IGEgbG9uZSBiYWNrdGljayBzdGF5cyBsaXRlcmFsLgogICAgICAgICAgICBhID0gYSArIDE7CiAgICAgICAgfQoKICAgICAgICBpZiAoYSA+PSBydW5Db3VudCkgYnJlYWs7CiAgICAgICAgaSA9IHJ1blN0YXJ0W2FdOwogICAgICAgIG0gPSBydW5MZW5bYV07CiAgICB9CiAgICByZXR1cm4gb3V0LmpvaW4oJycpOwp9CgovKioKICogRmluZCB0aGUgZW5kIHBvc2l0aW9uIG9mIGZyb250bWF0dGVyCiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IC0gVGhlIGZpbGUgY29udGVudAogKiBAcmV0dXJucyB7e2Zyb250bWF0dGVyRW5kOiBudW1iZXIsIGhhc0V4aXN0aW5nRnJvbnRtYXR0ZXI6IGJvb2xlYW4sIGZyb250bWF0dGVyVGV4dDogc3RyaW5nfX0KICovCmZ1bmN0aW9uIGZpbmRGcm9udG1hdHRlckVuZChjb250ZW50KSB7CiAgICBjb25zdCBmcm9udG1hdHRlclJlZ2V4ID0gL14tLS1ccj9cbihbXHNcU10qPylccj9cbi0tLVxyP1xuLzsKICAgIGNvbnN0IG1hdGNoID0gY29udGVudC5tYXRjaChmcm9udG1hdHRlclJlZ2V4KTsKCiAgICBpZiAobWF0Y2gpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBmcm9udG1hdHRlckVuZDogbWF0Y2hbMF0ubGVuZ3RoLAogICAgICAgICAgICBoYXNFeGlzdGluZ0Zyb250bWF0dGVyOiB0cnVlLAogICAgICAgICAgICBmcm9udG1hdHRlclRleHQ6IG1hdGNoWzBdCiAgICAgICAgfTsKICAgIH0KCiAgICByZXR1cm4gewogICAgICAgIGZyb250bWF0dGVyRW5kOiAwLAogICAgICAgIGhhc0V4aXN0aW5nRnJvbnRtYXR0ZXI6IGZhbHNlLAogICAgICAgIGZyb250bWF0dGVyVGV4dDogJycKICAgIH07Cn0KCi8qKgogKiBQYXJzZSBjb21tYS1zZXBhcmF0ZWQgdmFsdWVzIHdpdGggc3BlY2lhbCBoYW5kbGluZyBmb3Igd2lraWxpbmtzCiAqIEVuc3VyZXMgY29tbWFzIGluc2lkZSBbW3dpa2lsaW5rc11dIGFyZSBub3QgdHJlYXRlZCBhcyBzZXBhcmF0b3JzCiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFRoZSBmaWVsZCB2YWx1ZSB0byBwYXJzZQogKiBAcmV0dXJucyB7c3RyaW5nW119IEFycmF5IG9mIHBhcnNlZCB2YWx1ZXMKICovCmZ1bmN0aW9uIHBhcnNlQ29tbWFTZXBhcmF0ZWRXaXRoV2lraWxpbmtzKHZhbHVlKSB7CiAgICAvLyBJZiBubyBjb21tYXMsIHJldHVybiBhcyBzaW5nbGUgdmFsdWUKICAgIGlmICghdmFsdWUuaW5jbHVkZXMoJywnKSkgewogICAgICAgIHJldHVybiBbdmFsdWUudHJpbSgpXTsKICAgIH0KCiAgICBjb25zdCB2YWx1ZXMgPSBbXTsKICAgIGxldCBjdXJyZW50VmFsdWUgPSAnJzsKICAgIGxldCBpbnNpZGVXaWtpbGluayA9IGZhbHNlOwoKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHsKICAgICAgICBjb25zdCBjaGFyID0gdmFsdWVbaV07CiAgICAgICAgY29uc3QgbmV4dENoYXIgPSB2YWx1ZVtpICsgMV07CgogICAgICAgIC8vIENoZWNrIGZvciB3aWtpbGluayBvcGVuaW5nIFtbCiAgICAgICAgaWYgKGNoYXIgPT09ICdbJyAmJiBuZXh0Q2hhciA9PT0gJ1snKSB7CiAgICAgICAgICAgIGluc2lkZVdpa2lsaW5rID0gdHJ1ZTsKICAgICAgICAgICAgY3VycmVudFZhbHVlICs9IGNoYXI7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgLy8gQ2hlY2sgZm9yIHdpa2lsaW5rIGNsb3NpbmcgXV0KICAgICAgICBpZiAoY2hhciA9PT0gJ10nICYmIG5leHRDaGFyID09PSAnXScpIHsKICAgICAgICAgICAgaW5zaWRlV2lraWxpbmsgPSBmYWxzZTsKICAgICAgICAgICAgY3VycmVudFZhbHVlICs9IGNoYXI7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgLy8gSWYgd2UgaGl0IGEgY29tbWEgb3V0c2lkZSB3aWtpbGlua3MsIHNwbGl0CiAgICAgICAgaWYgKGNoYXIgPT09ICcsJyAmJiAhaW5zaWRlV2lraWxpbmspIHsKICAgICAgICAgICAgY29uc3QgdHJpbW1lZCA9IGN1cnJlbnRWYWx1ZS50cmltKCk7CiAgICAgICAgICAgIGlmICh0cmltbWVkKSB7CiAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaCh0cmltbWVkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjdXJyZW50VmFsdWUgPSAnJzsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICBjdXJyZW50VmFsdWUgKz0gY2hhcjsKICAgIH0KCiAgICAvLyBBZGQgdGhlIGxhc3QgdmFsdWUKICAgIGNvbnN0IHRyaW1tZWQgPSBjdXJyZW50VmFsdWUudHJpbSgpOwogICAgaWYgKHRyaW1tZWQpIHsKICAgICAgICB2YWx1ZXMucHVzaCh0cmltbWVkKTsKICAgIH0KCiAgICByZXR1cm4gdmFsdWVzLmxlbmd0aCA+IDAgPyB2YWx1ZXMgOiBbdmFsdWUudHJpbSgpXTsKfQo="
		}
	]
}
