SELinux启动流程

SELinux启动流程包含了几个阶段:

  • init进程
  • libselinux
  • 内核部分

1号进程

SELinux的启动由用户态init程序发起,例如CentOS上的systemd,再例如busybox的init进程。用户态初始化方法大同小异,都是利用SELinux提供的用户态接口,包括libselinux,selinuxfs调用SELinux内核接口。本文以busybox init为例介绍。
其实用户态进程部分代码非常少:

#if ENABLE_SELINUX
	if (getenv("SELINUX_INIT") == NULL) {
		int enforce = 0;

		putenv((char*)"SELINUX_INIT=YES");
		if (selinux_init_load_policy(&enforce) == 0) {
			BB_EXECVP(argv[0], argv);
		} else if (enforce > 0) {
			/* SELinux in enforcing mode but load_policy failed */
			message(L_CONSOLE, "can't load SELinux Policy. "
				"Machine is in enforcing mode. Halting now.");
			return EXIT_FAILURE;
		}
	}
#endif

其中selinux_init_load_policy是libselinux提供的接口,用来对整个SELinux子系统进行初始化。而BB_EXECVP是由宏定义的exec类libc接口,实际上就是init进程又重新执行了一遍,这样init进程本身就有了正确的身份了(因为定义了type_transition规则)。

#define BB_EXECVP(prog,cmd)     execvp(prog,cmd)

libselinux部分

SELinux有很大一部分机制处于用户态,包括模式配置,策略查询等等。而这一切的初始化都由libselinux提供的selinux_init_load_policy接口来实现。可以说libselinux部分是SELinux用户态最重要,而往往又容易被忽视的部分。

PHN2ZyBpZD0iZGFnbnJ3Yml1dXIiIHdpZHRoPSIxMDAlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXgtd2lkdGg6IDQ4Ny44NDM3NXB4OyIgdmlld0JveD0iMCAwIDQ4Ny44NDM3NSA1ODYuMjUiPjxzdHlsZT4KCgojZGFnbnJ3Yml1dXIgLmxhYmVsIHsKICBmb250LWZhbWlseTogJ3RyZWJ1Y2hldCBtcycsIHZlcmRhbmEsIGFyaWFsOwogIGNvbG9yOiAjMzMzOyB9CgojZGFnbnJ3Yml1dXIgLm5vZGUgcmVjdCwKI2RhZ25yd2JpdXVyIC5ub2RlIGNpcmNsZSwKI2RhZ25yd2JpdXVyIC5ub2RlIGVsbGlwc2UsCiNkYWducndiaXV1ciAubm9kZSBwb2x5Z29uIHsKICBmaWxsOiAjRUNFQ0ZGOwogIHN0cm9rZTogIzkzNzBEQjsKICBzdHJva2Utd2lkdGg6IDFweDsgfQoKI2RhZ25yd2JpdXVyIC5ub2RlLmNsaWNrYWJsZSB7CiAgY3Vyc29yOiBwb2ludGVyOyB9CgojZGFnbnJ3Yml1dXIgLmFycm93aGVhZFBhdGggewogIGZpbGw6ICMzMzMzMzM7IH0KCiNkYWducndiaXV1ciAuZWRnZVBhdGggLnBhdGggewogIHN0cm9rZTogIzMzMzMzMzsKICBzdHJva2Utd2lkdGg6IDEuNXB4OyB9CgojZGFnbnJ3Yml1dXIgLmVkZ2VMYWJlbCB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2U4ZThlODsgfQoKI2RhZ25yd2JpdXVyIC5jbHVzdGVyIHJlY3QgewogIGZpbGw6ICNmZmZmZGUgIWltcG9ydGFudDsKICBzdHJva2U6ICNhYWFhMzMgIWltcG9ydGFudDsKICBzdHJva2Utd2lkdGg6IDFweCAhaW1wb3J0YW50OyB9CgojZGFnbnJ3Yml1dXIgLmNsdXN0ZXIgdGV4dCB7CiAgZmlsbDogIzMzMzsgfQoKI2RhZ25yd2JpdXVyIGRpdi5tZXJtYWlkVG9vbHRpcCB7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBtYXgtd2lkdGg6IDIwMHB4OwogIHBhZGRpbmc6IDJweDsKICBmb250LWZhbWlseTogJ3RyZWJ1Y2hldCBtcycsIHZlcmRhbmEsIGFyaWFsOwogIGZvbnQtc2l6ZTogMTJweDsKICBiYWNrZ3JvdW5kOiAjZmZmZmRlOwogIGJvcmRlcjogMXB4IHNvbGlkICNhYWFhMzM7CiAgYm9yZGVyLXJhZGl1czogMnB4OwogIHBvaW50ZXItZXZlbnRzOiBub25lOwogIHotaW5kZXg6IDEwMDsgfQoKI2RhZ25yd2JpdXVyIC5hY3RvciB7CiAgc3Ryb2tlOiAjQ0NDQ0ZGOwogIGZpbGw6ICNFQ0VDRkY7IH0KCiNkYWducndiaXV1ciB0ZXh0LmFjdG9yIHsKICBmaWxsOiBibGFjazsKICBzdHJva2U6IG5vbmU7IH0KCiNkYWducndiaXV1ciAuYWN0b3ItbGluZSB7CiAgc3Ryb2tlOiBncmV5OyB9CgojZGFnbnJ3Yml1dXIgLm1lc3NhZ2VMaW5lMCB7CiAgc3Ryb2tlLXdpZHRoOiAxLjU7CiAgc3Ryb2tlLWRhc2hhcnJheTogJzIgMic7CiAgc3Ryb2tlOiAjMzMzOyB9CgojZGFnbnJ3Yml1dXIgLm1lc3NhZ2VMaW5lMSB7CiAgc3Ryb2tlLXdpZHRoOiAxLjU7CiAgc3Ryb2tlLWRhc2hhcnJheTogJzIgMic7CiAgc3Ryb2tlOiAjMzMzOyB9CgojZGFnbnJ3Yml1dXIgI2Fycm93aGVhZCB7CiAgZmlsbDogIzMzMzsgfQoKI2RhZ25yd2JpdXVyICNjcm9zc2hlYWQgcGF0aCB7CiAgZmlsbDogIzMzMyAhaW1wb3J0YW50OwogIHN0cm9rZTogIzMzMyAhaW1wb3J0YW50OyB9CgojZGFnbnJ3Yml1dXIgLm1lc3NhZ2VUZXh0IHsKICBmaWxsOiAjMzMzOwogIHN0cm9rZTogbm9uZTsgfQoKI2RhZ25yd2JpdXVyIC5sYWJlbEJveCB7CiAgc3Ryb2tlOiAjQ0NDQ0ZGOwogIGZpbGw6ICNFQ0VDRkY7IH0KCiNkYWducndiaXV1ciAubGFiZWxUZXh0IHsKICBmaWxsOiBibGFjazsKICBzdHJva2U6IG5vbmU7IH0KCiNkYWducndiaXV1ciAubG9vcFRleHQgewogIGZpbGw6IGJsYWNrOwogIHN0cm9rZTogbm9uZTsgfQoKI2RhZ25yd2JpdXVyIC5sb29wTGluZSB7CiAgc3Ryb2tlLXdpZHRoOiAyOwogIHN0cm9rZS1kYXNoYXJyYXk6ICcyIDInOwogIHN0cm9rZTogI0NDQ0NGRjsgfQoKI2RhZ25yd2JpdXVyIC5ub3RlIHsKICBzdHJva2U6ICNhYWFhMzM7CiAgZmlsbDogI2ZmZjVhZDsgfQoKI2RhZ25yd2JpdXVyIC5ub3RlVGV4dCB7CiAgZmlsbDogYmxhY2s7CiAgc3Ryb2tlOiBub25lOwogIGZvbnQtZmFtaWx5OiAndHJlYnVjaGV0IG1zJywgdmVyZGFuYSwgYXJpYWw7CiAgZm9udC1zaXplOiAxNHB4OyB9CgojZGFnbnJ3Yml1dXIgLmFjdGl2YXRpb24wIHsKICBmaWxsOiAjZjRmNGY0OwogIHN0cm9rZTogIzY2NjsgfQoKI2RhZ25yd2JpdXVyIC5hY3RpdmF0aW9uMSB7CiAgZmlsbDogI2Y0ZjRmNDsKICBzdHJva2U6ICM2NjY7IH0KCiNkYWducndiaXV1ciAuYWN0aXZhdGlvbjIgewogIGZpbGw6ICNmNGY0ZjQ7CiAgc3Ryb2tlOiAjNjY2OyB9CgoKI2RhZ25yd2JpdXVyIC5zZWN0aW9uIHsKICBzdHJva2U6IG5vbmU7CiAgb3BhY2l0eTogMC4yOyB9CgojZGFnbnJ3Yml1dXIgLnNlY3Rpb24wIHsKICBmaWxsOiByZ2JhKDEwMiwgMTAyLCAyNTUsIDAuNDkpOyB9CgojZGFnbnJ3Yml1dXIgLnNlY3Rpb24yIHsKICBmaWxsOiAjZmZmNDAwOyB9CgojZGFnbnJ3Yml1dXIgLnNlY3Rpb24xLAojZGFnbnJ3Yml1dXIgLnNlY3Rpb24zIHsKICBmaWxsOiB3aGl0ZTsKICBvcGFjaXR5OiAwLjI7IH0KCiNkYWducndiaXV1ciAuc2VjdGlvblRpdGxlMCB7CiAgZmlsbDogIzMzMzsgfQoKI2RhZ25yd2JpdXVyIC5zZWN0aW9uVGl0bGUxIHsKICBmaWxsOiAjMzMzOyB9CgojZGFnbnJ3Yml1dXIgLnNlY3Rpb25UaXRsZTIgewogIGZpbGw6ICMzMzM7IH0KCiNkYWducndiaXV1ciAuc2VjdGlvblRpdGxlMyB7CiAgZmlsbDogIzMzMzsgfQoKI2RhZ25yd2JpdXVyIC5zZWN0aW9uVGl0bGUgewogIHRleHQtYW5jaG9yOiBzdGFydDsKICBmb250LXNpemU6IDExcHg7CiAgdGV4dC1oZWlnaHQ6IDE0cHg7IH0KCgojZGFnbnJ3Yml1dXIgLmdyaWQgLnRpY2sgewogIHN0cm9rZTogbGlnaHRncmV5OwogIG9wYWNpdHk6IDAuMzsKICBzaGFwZS1yZW5kZXJpbmc6IGNyaXNwRWRnZXM7IH0KCiNkYWducndiaXV1ciAuZ3JpZCBwYXRoIHsKICBzdHJva2Utd2lkdGg6IDA7IH0KCgojZGFnbnJ3Yml1dXIgLnRvZGF5IHsKICBmaWxsOiBub25lOwogIHN0cm9rZTogcmVkOwogIHN0cm9rZS13aWR0aDogMnB4OyB9CgoKCiNkYWducndiaXV1ciAudGFzayB7CiAgc3Ryb2tlLXdpZHRoOiAyOyB9CgojZGFnbnJ3Yml1dXIgLnRhc2tUZXh0IHsKICB0ZXh0LWFuY2hvcjogbWlkZGxlOwogIGZvbnQtc2l6ZTogMTFweDsgfQoKI2RhZ25yd2JpdXVyIC50YXNrVGV4dE91dHNpZGVSaWdodCB7CiAgZmlsbDogYmxhY2s7CiAgdGV4dC1hbmNob3I6IHN0YXJ0OwogIGZvbnQtc2l6ZTogMTFweDsgfQoKI2RhZ25yd2JpdXVyIC50YXNrVGV4dE91dHNpZGVMZWZ0IHsKICBmaWxsOiBibGFjazsKICB0ZXh0LWFuY2hvcjogZW5kOwogIGZvbnQtc2l6ZTogMTFweDsgfQoKCiNkYWducndiaXV1ciAudGFza1RleHQwLAojZGFnbnJ3Yml1dXIgLnRhc2tUZXh0MSwKI2RhZ25yd2JpdXVyIC50YXNrVGV4dDIsCiNkYWducndiaXV1ciAudGFza1RleHQzIHsKICBmaWxsOiB3aGl0ZTsgfQoKI2RhZ25yd2JpdXVyIC50YXNrMCwKI2RhZ25yd2JpdXVyIC50YXNrMSwKI2RhZ25yd2JpdXVyIC50YXNrMiwKI2RhZ25yd2JpdXVyIC50YXNrMyB7CiAgZmlsbDogIzhhOTBkZDsKICBzdHJva2U6ICM1MzRmYmM7IH0KCiNkYWducndiaXV1ciAudGFza1RleHRPdXRzaWRlMCwKI2RhZ25yd2JpdXVyIC50YXNrVGV4dE91dHNpZGUyIHsKICBmaWxsOiBibGFjazsgfQoKI2RhZ25yd2JpdXVyIC50YXNrVGV4dE91dHNpZGUxLAojZGFnbnJ3Yml1dXIgLnRhc2tUZXh0T3V0c2lkZTMgewogIGZpbGw6IGJsYWNrOyB9CgoKI2RhZ25yd2JpdXVyIC5hY3RpdmUwLAojZGFnbnJ3Yml1dXIgLmFjdGl2ZTEsCiNkYWducndiaXV1ciAuYWN0aXZlMiwKI2RhZ25yd2JpdXVyIC5hY3RpdmUzIHsKICBmaWxsOiAjYmZjN2ZmOwogIHN0cm9rZTogIzUzNGZiYzsgfQoKI2RhZ25yd2JpdXVyIC5hY3RpdmVUZXh0MCwKI2RhZ25yd2JpdXVyIC5hY3RpdmVUZXh0MSwKI2RhZ25yd2JpdXVyIC5hY3RpdmVUZXh0MiwKI2RhZ25yd2JpdXVyIC5hY3RpdmVUZXh0MyB7CiAgZmlsbDogYmxhY2sgIWltcG9ydGFudDsgfQoKCiNkYWducndiaXV1ciAuZG9uZTAsCiNkYWducndiaXV1ciAuZG9uZTEsCiNkYWducndiaXV1ciAuZG9uZTIsCiNkYWducndiaXV1ciAuZG9uZTMgewogIHN0cm9rZTogZ3JleTsKICBmaWxsOiBsaWdodGdyZXk7CiAgc3Ryb2tlLXdpZHRoOiAyOyB9CgojZGFnbnJ3Yml1dXIgLmRvbmVUZXh0MCwKI2RhZ25yd2JpdXVyIC5kb25lVGV4dDEsCiNkYWducndiaXV1ciAuZG9uZVRleHQyLAojZGFnbnJ3Yml1dXIgLmRvbmVUZXh0MyB7CiAgZmlsbDogYmxhY2sgIWltcG9ydGFudDsgfQoKCiNkYWducndiaXV1ciAuY3JpdDAsCiNkYWducndiaXV1ciAuY3JpdDEsCiNkYWducndiaXV1ciAuY3JpdDIsCiNkYWducndiaXV1ciAuY3JpdDMgewogIHN0cm9rZTogI2ZmODg4ODsKICBmaWxsOiByZWQ7CiAgc3Ryb2tlLXdpZHRoOiAyOyB9CgojZGFnbnJ3Yml1dXIgLmFjdGl2ZUNyaXQwLAojZGFnbnJ3Yml1dXIgLmFjdGl2ZUNyaXQxLAojZGFnbnJ3Yml1dXIgLmFjdGl2ZUNyaXQyLAojZGFnbnJ3Yml1dXIgLmFjdGl2ZUNyaXQzIHsKICBzdHJva2U6ICNmZjg4ODg7CiAgZmlsbDogI2JmYzdmZjsKICBzdHJva2Utd2lkdGg6IDI7IH0KCiNkYWducndiaXV1ciAuZG9uZUNyaXQwLAojZGFnbnJ3Yml1dXIgLmRvbmVDcml0MSwKI2RhZ25yd2JpdXVyIC5kb25lQ3JpdDIsCiNkYWducndiaXV1ciAuZG9uZUNyaXQzIHsKICBzdHJva2U6ICNmZjg4ODg7CiAgZmlsbDogbGlnaHRncmV5OwogIHN0cm9rZS13aWR0aDogMjsKICBjdXJzb3I6IHBvaW50ZXI7CiAgc2hhcGUtcmVuZGVyaW5nOiBjcmlzcEVkZ2VzOyB9CgojZGFnbnJ3Yml1dXIgLmRvbmVDcml0VGV4dDAsCiNkYWducndiaXV1ciAuZG9uZUNyaXRUZXh0MSwKI2RhZ25yd2JpdXVyIC5kb25lQ3JpdFRleHQyLAojZGFnbnJ3Yml1dXIgLmRvbmVDcml0VGV4dDMgewogIGZpbGw6IGJsYWNrICFpbXBvcnRhbnQ7IH0KCiNkYWducndiaXV1ciAuYWN0aXZlQ3JpdFRleHQwLAojZGFnbnJ3Yml1dXIgLmFjdGl2ZUNyaXRUZXh0MSwKI2RhZ25yd2JpdXVyIC5hY3RpdmVDcml0VGV4dDIsCiNkYWducndiaXV1ciAuYWN0aXZlQ3JpdFRleHQzIHsKICBmaWxsOiBibGFjayAhaW1wb3J0YW50OyB9CgojZGFnbnJ3Yml1dXIgLnRpdGxlVGV4dCB7CiAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICBmb250LXNpemU6IDE4cHg7CiAgZmlsbDogYmxhY2s7IH0KCiNkYWducndiaXV1ciBnLmNsYXNzR3JvdXAgdGV4dCB7CiAgZmlsbDogIzkzNzBEQjsKICBzdHJva2U6IG5vbmU7CiAgZm9udC1mYW1pbHk6ICd0cmVidWNoZXQgbXMnLCB2ZXJkYW5hLCBhcmlhbDsKICBmb250LXNpemU6IDEwcHg7IH0KCiNkYWducndiaXV1ciBnLmNsYXNzR3JvdXAgcmVjdCB7CiAgZmlsbDogI0VDRUNGRjsKICBzdHJva2U6ICM5MzcwREI7IH0KCiNkYWducndiaXV1ciBnLmNsYXNzR3JvdXAgbGluZSB7CiAgc3Ryb2tlOiAjOTM3MERCOwogIHN0cm9rZS13aWR0aDogMTsgfQoKI2RhZ25yd2JpdXVyIC5jbGFzc0xhYmVsIC5ib3ggewogIHN0cm9rZTogbm9uZTsKICBzdHJva2Utd2lkdGg6IDA7CiAgZmlsbDogI0VDRUNGRjsKICBvcGFjaXR5OiAwLjU7IH0KCiNkYWducndiaXV1ciAuY2xhc3NMYWJlbCAubGFiZWwgewogIGZpbGw6ICM5MzcwREI7CiAgZm9udC1zaXplOiAxMHB4OyB9CgojZGFnbnJ3Yml1dXIgLnJlbGF0aW9uIHsKICBzdHJva2U6ICM5MzcwREI7CiAgc3Ryb2tlLXdpZHRoOiAxOwogIGZpbGw6IG5vbmU7IH0KCiNkYWducndiaXV1ciAjY29tcG9zaXRpb25TdGFydCB7CiAgZmlsbDogIzkzNzBEQjsKICBzdHJva2U6ICM5MzcwREI7CiAgc3Ryb2tlLXdpZHRoOiAxOyB9CgojZGFnbnJ3Yml1dXIgI2NvbXBvc2l0aW9uRW5kIHsKICBmaWxsOiAjOTM3MERCOwogIHN0cm9rZTogIzkzNzBEQjsKICBzdHJva2Utd2lkdGg6IDE7IH0KCiNkYWducndiaXV1ciAjYWdncmVnYXRpb25TdGFydCB7CiAgZmlsbDogI0VDRUNGRjsKICBzdHJva2U6ICM5MzcwREI7CiAgc3Ryb2tlLXdpZHRoOiAxOyB9CgojZGFnbnJ3Yml1dXIgI2FnZ3JlZ2F0aW9uRW5kIHsKICBmaWxsOiAjRUNFQ0ZGOwogIHN0cm9rZTogIzkzNzBEQjsKICBzdHJva2Utd2lkdGg6IDE7IH0KCiNkYWducndiaXV1ciAjZGVwZW5kZW5jeVN0YXJ0IHsKICBmaWxsOiAjOTM3MERCOwogIHN0cm9rZTogIzkzNzBEQjsKICBzdHJva2Utd2lkdGg6IDE7IH0KCiNkYWducndiaXV1ciAjZGVwZW5kZW5jeUVuZCB7CiAgZmlsbDogIzkzNzBEQjsKICBzdHJva2U6ICM5MzcwREI7CiAgc3Ryb2tlLXdpZHRoOiAxOyB9CgojZGFnbnJ3Yml1dXIgI2V4dGVuc2lvblN0YXJ0IHsKICBmaWxsOiAjOTM3MERCOwogIHN0cm9rZTogIzkzNzBEQjsKICBzdHJva2Utd2lkdGg6IDE7IH0KCiNkYWducndiaXV1ciAjZXh0ZW5zaW9uRW5kIHsKICBmaWxsOiAjOTM3MERCOwogIHN0cm9rZTogIzkzNzBEQjsKICBzdHJva2Utd2lkdGg6IDE7IH0KCiNkYWducndiaXV1ciAuY29tbWl0LWlkLAojZGFnbnJ3Yml1dXIgLmNvbW1pdC1tc2csCiNkYWducndiaXV1ciAuYnJhbmNoLWxhYmVsIHsKICBmaWxsOiBsaWdodGdyZXk7CiAgY29sb3I6IGxpZ2h0Z3JleTsgfQoKCgojZGFnbnJ3Yml1dXIgLmxhYmVsewogIGNvbG9yOiMxOEIxNEU7Cn0KI2RhZ25yd2JpdXVyIC50ZS1tZC1jb250YWluZXItLWRhcmsgLm5vZGUgcmVjdCB7CiAgZmlsbDogcmVkOwp9CgojZGFnbnJ3Yml1dXIgLm5vZGUgcmVjdCwKI2RhZ25yd2JpdXVyIC5ub2RlIGNpcmNsZSwKI2RhZ25yd2JpdXVyIC5ub2RlIGVsbGlwc2UsCiNkYWducndiaXV1ciAubm9kZSBwb2x5Z29uIHsKICBmaWxsOiAjRjlGRkZCOzsKICBzdHJva2U6ICMyREJENjA7CiAgc3Ryb2tlLXdpZHRoOiAxLjVweDsKfQojZGFnbnJ3Yml1dXIgLmFycm93aGVhZFBhdGh7CiAgZmlsbDogIzJEQkQ2MDsKfQojZGFnbnJ3Yml1dXIgLmVkZ2VQYXRoIC5wYXRoIHsKICBzdHJva2U6ICMyREJENjA7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7Cn0KI2RhZ25yd2JpdXVyIC5lZGdlTGFiZWwgewogIGJhY2tncm91bmQtY29sb3I6ICNmZmY7Cn0KI2RhZ25yd2JpdXVyIC5jbHVzdGVyIHJlY3QgewogIGZpbGw6ICNGOUZGRkIgIWltcG9ydGFudDsKICBzdHJva2U6ICMyREJENjAgIWltcG9ydGFudDsKICBzdHJva2Utd2lkdGg6IDFweCAhaW1wb3J0YW50Owp9CgojZGFnbnJ3Yml1dXIgLmNsdXN0ZXIgdGV4dCB7CiAgZmlsbDogI0Y5RkZGQjsKfQoKI2RhZ25yd2JpdXVyIGRpdi5tZXJtYWlkVG9vbHRpcCB7CiAgYmFja2dyb3VuZDogI0Y5RkZGQjsKICBib3JkZXI6IDFweCBzb2xpZCAjMkRCRDYwOwp9CgoKI2RhZ25yd2JpdXVyIC5hY3RvciB7CiAgc3Ryb2tlOiAjMkRCRDYwOwogIGZpbGw6ICNGOUZGRkI7Cn0KCiNkYWducndiaXV1ciB0ZXh0LmFjdG9yIHsKICBmaWxsOiAjMkRCRDYwOwogIHN0cm9rZTogbm9uZTsKfQoKI2RhZ25yd2JpdXVyIC5hY3Rvci1saW5lIHsKICBzdHJva2U6ICMyREJENjA7Cn0KCiNkYWducndiaXV1ciAubWVzc2FnZUxpbmUwIHsKICBzdHJva2Utd2lkdGg6IDEuNTsKICBzdHJva2UtZGFzaGFycmF5OiAnMiAyJzsKICBtYXJrZXItZW5kOiAndXJsKCNhcnJvd2hlYWQpJzsKICBzdHJva2U6ICMyREJENjA7Cn0KCiNkYWducndiaXV1ciAubWVzc2FnZUxpbmUxIHsKICBzdHJva2Utd2lkdGg6IDEuNTsKICBzdHJva2UtZGFzaGFycmF5OiAnMiAyJzsKICBzdHJva2U6ICMyREJENjA7Cn0KCiNkYWducndiaXV1ciAjYXJyb3doZWFkIHsKICBmaWxsOiAjMkRCRDYwOwp9CgojZGFnbnJ3Yml1dXIgI2Nyb3NzaGVhZCBwYXRoIHsKICBmaWxsOiAjMkRCRDYwICFpbXBvcnRhbnQ7CiAgc3Ryb2tlOiAjMkRCRDYwICFpbXBvcnRhbnQ7Cn0KCiNkYWducndiaXV1ciAubWVzc2FnZVRleHQgewogIGZpbGw6ICMyREJENjA7CiAgc3Ryb2tlOiBub25lOwp9CgojZGFnbnJ3Yml1dXIgLmxhYmVsQm94IHsKICBzdHJva2U6ICMyREJENjA7CiAgZmlsbDogI0Y5RkZGQjsKfQoKI2RhZ25yd2JpdXVyIC5sYWJlbFRleHQgewogIGZpbGw6ICMyREJENjA7CiAgc3Ryb2tlOiAjMkRCRDYwOwp9CgojZGFnbnJ3Yml1dXIgLmxvb3BUZXh0IHsKICBmaWxsOiAjMkRCRDYwOwogIHN0cm9rZTogIzJEQkQ2MDsKfQoKI2RhZ25yd2JpdXVyIC5sb29wTGluZSB7CiAgc3Ryb2tlLXdpZHRoOiAyOwogIHN0cm9rZS1kYXNoYXJyYXk6ICcyIDInOwogIG1hcmtlci1lbmQ6ICd1cmwoI2Fycm93aGVhZCknOwogIHN0cm9rZTogIzJEQkQ2MDsKfQoKI2RhZ25yd2JpdXVyIC5ub3RlIHsKICBzdHJva2U6ICMyREJENjA7CiAgZmlsbDogI0Y5RkZGQjsKfQoKI2RhZ25yd2JpdXVyIC5ub3RlVGV4dCB7CiAgZmlsbDogIzJEQkQ2MDsKICBzdHJva2U6ICMyREJENjA7Cn0KCgojZGFnbnJ3Yml1dXIgLnNlY3Rpb257CiAgb3BhY2l0eToxOwp9CiNkYWducndiaXV1ciAuc2VjdGlvbjAsI2RhZ25yd2JpdXVyICAuc2VjdGlvbjIgewogIGZpbGw6ICNFQ0Y3RjA7Cn0KCiNkYWducndiaXV1ciAuc2VjdGlvbjEsCiNkYWducndiaXV1ciAuc2VjdGlvbjMgewogIGZpbGw6ICNGRkY7Cn0KI2RhZ25yd2JpdXVyIC50YXNrVGV4dDAsCiNkYWducndiaXV1ciAudGFza1RleHQxLAojZGFnbnJ3Yml1dXIgLnRhc2tUZXh0MiwKI2RhZ25yd2JpdXVyIC50YXNrVGV4dDMgewogIGZpbGw6ICNmZmY7Cn0KCiNkYWducndiaXV1ciAudGFzazAsCiNkYWducndiaXV1ciAudGFzazEsCiNkYWducndiaXV1ciAudGFzazIsCiNkYWducndiaXV1ciAudGFzazMgewogIGZpbGw6ICMyREJENjA7CiAgc3Ryb2tlOiAjMzU5RjVBOwp9Cjwvc3R5bGU+PHN0eWxlPiNkYWducndiaXV1ciB7CiAgICBjb2xvcjogcmdiKDIwMCwgMjAxLCAxOTgpOwogICAgZm9udDogbm9ybWFsIG5vcm1hbCBub3JtYWwgbm9ybWFsIDE0cHgvMjIuMzk5OTk5NjE4NTMwMjczcHggbW9ub3NwYWNlOwogIH08L3N0eWxlPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMiwgLTEyKSI+PGcgY2xhc3M9Im91dHB1dCI+PGcgY2xhc3M9ImNsdXN0ZXJzIj48L2c+PGcgY2xhc3M9ImVkZ2VQYXRocyI+PGcgY2xhc3M9ImVkZ2VQYXRoIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxwYXRoIGNsYXNzPSJwYXRoIiBkPSJNMjQ5Ljc4MTI1LDU2LjI4MTI1TDI0OS43ODEyNSw4MS4yODEyNUwyNDkuNzgxMjUsMTA2LjI4MTI1IiBtYXJrZXItZW5kPSJ1cmwoI2Fycm93aGVhZDIxMikiIHN0eWxlPSJzdHJva2U6ICMzMzM7IHN0cm9rZS13aWR0aDogMS41cHg7ZmlsbDpub25lIj48L3BhdGg+PGRlZnM+PG1hcmtlciBpZD0iYXJyb3doZWFkMjEyIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlclVuaXRzPSJzdHJva2VXaWR0aCIgbWFya2VyV2lkdGg9IjgiIG1hcmtlckhlaWdodD0iNiIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNIDAgMCBMIDEwIDUgTCAwIDEwIHoiIGNsYXNzPSJhcnJvd2hlYWRQYXRoIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxcHg7IHN0cm9rZS1kYXNoYXJyYXk6IDFweCwgMHB4OyI+PC9wYXRoPjwvbWFya2VyPjwvZGVmcz48L2c+PGcgY2xhc3M9ImVkZ2VQYXRoIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxwYXRoIGNsYXNzPSJwYXRoIiBkPSJNMjQ5Ljc4MTI1LDE0Mi41NjI1TDI0OS43ODEyNSwxNjcuNTYyNUwyNDkuNzgxMjUsMTkyLjU2MjUiIG1hcmtlci1lbmQ9InVybCgjYXJyb3doZWFkMjEzKSIgc3R5bGU9InN0cm9rZTogIzMzMzsgc3Ryb2tlLXdpZHRoOiAxLjVweDtmaWxsOm5vbmUiPjwvcGF0aD48ZGVmcz48bWFya2VyIGlkPSJhcnJvd2hlYWQyMTMiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOSIgcmVmWT0iNSIgbWFya2VyVW5pdHM9InN0cm9rZVdpZHRoIiBtYXJrZXJXaWR0aD0iOCIgbWFya2VySGVpZ2h0PSI2IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0gMCAwIEwgMTAgNSBMIDAgMTAgeiIgY2xhc3M9ImFycm93aGVhZFBhdGgiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDFweDsgc3Ryb2tlLWRhc2hhcnJheTogMXB4LCAwcHg7Ij48L3BhdGg+PC9tYXJrZXI+PC9kZWZzPjwvZz48ZyBjbGFzcz0iZWRnZVBhdGgiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PHBhdGggY2xhc3M9InBhdGgiIGQ9Ik0yMDMuNjMwOTkxNDg3NjU5OTcsMjI4Ljg0Mzc1TDExOS4zMjAzMTI1LDI2MS45ODQzNzVMMTE5LjMyMDMxMjUsMjk1LjEyNSIgbWFya2VyLWVuZD0idXJsKCNhcnJvd2hlYWQyMTQpIiBzdHlsZT0ic3Ryb2tlOiAjMzMzOyBzdHJva2Utd2lkdGg6IDEuNXB4O2ZpbGw6bm9uZSI+PC9wYXRoPjxkZWZzPjxtYXJrZXIgaWQ9ImFycm93aGVhZDIxNCIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI5IiByZWZZPSI1IiBtYXJrZXJVbml0cz0ic3Ryb2tlV2lkdGgiIG1hcmtlcldpZHRoPSI4IiBtYXJrZXJIZWlnaHQ9IjYiIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTSAwIDAgTCAxMCA1IEwgMCAxMCB6IiBjbGFzcz0iYXJyb3doZWFkUGF0aCIgc3R5bGU9InN0cm9rZS13aWR0aDogMXB4OyBzdHJva2UtZGFzaGFycmF5OiAxcHgsIDBweDsiPjwvcGF0aD48L21hcmtlcj48L2RlZnM+PC9nPjxnIGNsYXNzPSJlZGdlUGF0aCIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48cGF0aCBjbGFzcz0icGF0aCIgZD0iTTI5NS45MzE1MDg1MTIzNDAwMywyMjguODQzNzVMMzgwLjI0MjE4NzUsMjYxLjk4NDM3NUwzODAuMjQyMTg3NSwyOTUuMTI1IiBtYXJrZXItZW5kPSJ1cmwoI2Fycm93aGVhZDIxNSkiIHN0eWxlPSJzdHJva2U6ICMzMzM7IHN0cm9rZS13aWR0aDogMS41cHg7ZmlsbDpub25lIj48L3BhdGg+PGRlZnM+PG1hcmtlciBpZD0iYXJyb3doZWFkMjE1IiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlclVuaXRzPSJzdHJva2VXaWR0aCIgbWFya2VyV2lkdGg9IjgiIG1hcmtlckhlaWdodD0iNiIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNIDAgMCBMIDEwIDUgTCAwIDEwIHoiIGNsYXNzPSJhcnJvd2hlYWRQYXRoIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxcHg7IHN0cm9rZS1kYXNoYXJyYXk6IDFweCwgMHB4OyI+PC9wYXRoPjwvbWFya2VyPjwvZGVmcz48L2c+PGcgY2xhc3M9ImVkZ2VQYXRoIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxwYXRoIGNsYXNzPSJwYXRoIiBkPSJNMTE5LjMyMDMxMjUsMzMxLjQwNjI1TDExOS4zMjAzMTI1LDM1Ni40MDYyNUwxOTQuOTIyNDQ5NDA2OTE3OCwzODEuNDA2MjUiIG1hcmtlci1lbmQ9InVybCgjYXJyb3doZWFkMjE2KSIgc3R5bGU9InN0cm9rZTogIzMzMzsgc3Ryb2tlLXdpZHRoOiAxLjVweDtmaWxsOm5vbmUiPjwvcGF0aD48ZGVmcz48bWFya2VyIGlkPSJhcnJvd2hlYWQyMTYiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOSIgcmVmWT0iNSIgbWFya2VyVW5pdHM9InN0cm9rZVdpZHRoIiBtYXJrZXJXaWR0aD0iOCIgbWFya2VySGVpZ2h0PSI2IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0gMCAwIEwgMTAgNSBMIDAgMTAgeiIgY2xhc3M9ImFycm93aGVhZFBhdGgiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDFweDsgc3Ryb2tlLWRhc2hhcnJheTogMXB4LCAwcHg7Ij48L3BhdGg+PC9tYXJrZXI+PC9kZWZzPjwvZz48ZyBjbGFzcz0iZWRnZVBhdGgiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PHBhdGggY2xhc3M9InBhdGgiIGQ9Ik0zODAuMjQyMTg3NSwzMzEuNDA2MjVMMzgwLjI0MjE4NzUsMzU2LjQwNjI1TDMwNC42NDAwNTA1OTMwODIyLDM4MS40MDYyNSIgbWFya2VyLWVuZD0idXJsKCNhcnJvd2hlYWQyMTcpIiBzdHlsZT0ic3Ryb2tlOiAjMzMzOyBzdHJva2Utd2lkdGg6IDEuNXB4O2ZpbGw6bm9uZSI+PC9wYXRoPjxkZWZzPjxtYXJrZXIgaWQ9ImFycm93aGVhZDIxNyIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI5IiByZWZZPSI1IiBtYXJrZXJVbml0cz0ic3Ryb2tlV2lkdGgiIG1hcmtlcldpZHRoPSI4IiBtYXJrZXJIZWlnaHQ9IjYiIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTSAwIDAgTCAxMCA1IEwgMCAxMCB6IiBjbGFzcz0iYXJyb3doZWFkUGF0aCIgc3R5bGU9InN0cm9rZS13aWR0aDogMXB4OyBzdHJva2UtZGFzaGFycmF5OiAxcHgsIDBweDsiPjwvcGF0aD48L21hcmtlcj48L2RlZnM+PC9nPjxnIGNsYXNzPSJlZGdlUGF0aCIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48cGF0aCBjbGFzcz0icGF0aCIgZD0iTTI0OS43ODEyNSw0MTcuNjg3NUwyNDkuNzgxMjUsNDQyLjY4NzVMMjQ5Ljc4MTI1LDQ2Ny42ODc1IiBtYXJrZXItZW5kPSJ1cmwoI2Fycm93aGVhZDIxOCkiIHN0eWxlPSJzdHJva2U6ICMzMzM7IHN0cm9rZS13aWR0aDogMS41cHg7ZmlsbDpub25lIj48L3BhdGg+PGRlZnM+PG1hcmtlciBpZD0iYXJyb3doZWFkMjE4IiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlclVuaXRzPSJzdHJva2VXaWR0aCIgbWFya2VyV2lkdGg9IjgiIG1hcmtlckhlaWdodD0iNiIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNIDAgMCBMIDEwIDUgTCAwIDEwIHoiIGNsYXNzPSJhcnJvd2hlYWRQYXRoIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxcHg7IHN0cm9rZS1kYXNoYXJyYXk6IDFweCwgMHB4OyI+PC9wYXRoPjwvbWFya2VyPjwvZGVmcz48L2c+PGcgY2xhc3M9ImVkZ2VQYXRoIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxwYXRoIGNsYXNzPSJwYXRoIiBkPSJNMjQ5Ljc4MTI1LDUwMy45Njg3NUwyNDkuNzgxMjUsNTI4Ljk2ODc1TDI0OS43ODEyNSw1NTMuOTY4NzUiIG1hcmtlci1lbmQ9InVybCgjYXJyb3doZWFkMjE5KSIgc3R5bGU9InN0cm9rZTogIzMzMzsgc3Ryb2tlLXdpZHRoOiAxLjVweDtmaWxsOm5vbmUiPjwvcGF0aD48ZGVmcz48bWFya2VyIGlkPSJhcnJvd2hlYWQyMTkiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOSIgcmVmWT0iNSIgbWFya2VyVW5pdHM9InN0cm9rZVdpZHRoIiBtYXJrZXJXaWR0aD0iOCIgbWFya2VySGVpZ2h0PSI2IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0gMCAwIEwgMTAgNSBMIDAgMTAgeiIgY2xhc3M9ImFycm93aGVhZFBhdGgiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDFweDsgc3Ryb2tlLWRhc2hhcnJheTogMXB4LCAwcHg7Ij48L3BhdGg+PC9tYXJrZXI+PC9kZWZzPjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbHMiPjxnIGNsYXNzPSJlZGdlTGFiZWwiIHN0eWxlPSJvcGFjaXR5OiAxOyIgdHJhbnNmb3JtPSIiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiIGNsYXNzPSJsYWJlbCI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB3aWR0aD0iMCIgaGVpZ2h0PSIwIiBzdHlsZT0iZmlsbDojZThlOGU4OyI+PC9yZWN0Pjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj48L3RzcGFuPjwvdGV4dD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiIHN0eWxlPSJvcGFjaXR5OiAxOyIgdHJhbnNmb3JtPSIiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiIGNsYXNzPSJsYWJlbCI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB3aWR0aD0iMCIgaGVpZ2h0PSIwIiBzdHlsZT0iZmlsbDojZThlOGU4OyI+PC9yZWN0Pjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj48L3RzcGFuPjwvdGV4dD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiIHN0eWxlPSJvcGFjaXR5OiAxOyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTE5LjMyMDMxMjUsMjYxLjk4NDM3NSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00LjIwMzEyNSwtOC4wMDc4MTI1KSIgY2xhc3M9ImxhYmVsIj48cmVjdCByeD0iMCIgcnk9IjAiIHdpZHRoPSI3LjQ4NDM3NSIgaGVpZ2h0PSIxNi41NjI1IiBzdHlsZT0iZmlsbDojZThlOGU4OyI+PC9yZWN0Pjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj4xPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVsIiBzdHlsZT0ib3BhY2l0eTogMTsiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDM4MC4yNDIxODc1LDI2MS45ODQzNzUpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNC4yMDMxMjUsLTguMDA3ODEyNSkiIGNsYXNzPSJsYWJlbCI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB3aWR0aD0iNy40ODQzNzUiIGhlaWdodD0iMTYuNTYyNSIgc3R5bGU9ImZpbGw6I2U4ZThlODsiPjwvcmVjdD48dGV4dD48dHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZHk9IjFlbSIgeD0iMSI+MjwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCIgc3R5bGU9Im9wYWNpdHk6IDE7IiB0cmFuc2Zvcm09IiI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSIgY2xhc3M9ImxhYmVsIj48cmVjdCByeD0iMCIgcnk9IjAiIHdpZHRoPSIwIiBoZWlnaHQ9IjAiIHN0eWxlPSJmaWxsOiNlOGU4ZTg7Ij48L3JlY3Q+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPjwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCIgc3R5bGU9Im9wYWNpdHk6IDE7IiB0cmFuc2Zvcm09IiI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSIgY2xhc3M9ImxhYmVsIj48cmVjdCByeD0iMCIgcnk9IjAiIHdpZHRoPSIwIiBoZWlnaHQ9IjAiIHN0eWxlPSJmaWxsOiNlOGU4ZTg7Ij48L3JlY3Q+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPjwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCIgc3R5bGU9Im9wYWNpdHk6IDE7IiB0cmFuc2Zvcm09IiI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSIgY2xhc3M9ImxhYmVsIj48cmVjdCByeD0iMCIgcnk9IjAiIHdpZHRoPSIwIiBoZWlnaHQ9IjAiIHN0eWxlPSJmaWxsOiNlOGU4ZTg7Ij48L3JlY3Q+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPjwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCIgc3R5bGU9Im9wYWNpdHk6IDE7IiB0cmFuc2Zvcm09IiI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSIgY2xhc3M9ImxhYmVsIj48cmVjdCByeD0iMCIgcnk9IjAiIHdpZHRoPSIwIiBoZWlnaHQ9IjAiIHN0eWxlPSJmaWxsOiNlOGU4ZTg7Ij48L3JlY3Q+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPjwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PC9nPjxnIGNsYXNzPSJub2RlcyI+PGcgY2xhc3M9Im5vZGUiIHN0eWxlPSJvcGFjaXR5OiAxOyIgaWQ9IkEiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI0OS43ODEyNSwzOC4xNDA2MjUpIj48cmVjdCByeD0iMCIgcnk9IjAiIHg9Ii04Mi4wNjI1IiB5PSItMTguMTQwNjI1IiB3aWR0aD0iMTY0LjEyNSIgaGVpZ2h0PSIzNi4yODEyNSI+PC9yZWN0PjxnIGNsYXNzPSJsYWJlbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTcyLjA2MjUsLTguMTQwNjI1KSI+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPnNlbGludXhfaW5pdF9sb2FkX3BvbGljeTwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PC9nPjxnIGNsYXNzPSJub2RlIiBzdHlsZT0ib3BhY2l0eTogMTsiIGlkPSJCIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNDkuNzgxMjUsMTI0LjQyMTg3NSkiPjxyZWN0IHJ4PSIwIiByeT0iMCIgeD0iLTcxLjQ3NjU2MjUiIHk9Ii0xOC4xNDA2MjUiIHdpZHRoPSIxNDIuOTUzMTI1IiBoZWlnaHQ9IjM2LjI4MTI1Ij48L3JlY3Q+PGcgY2xhc3M9ImxhYmVsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDApIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNjEuNDc2NTYyNSwtOC4xNDA2MjUpIj48dGV4dD48dHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZHk9IjFlbSIgeD0iMSI+c2VsaW51eF9yZXNldF9jb25maWc8L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48ZyBjbGFzcz0ibm9kZSIgc3R5bGU9Im9wYWNpdHk6IDE7IiBpZD0iQyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjQ5Ljc4MTI1LDIxMC43MDMxMjUpIj48cmVjdCByeD0iMCIgcnk9IjAiIHg9Ii02My4zNTE1NjI1IiB5PSItMTguMTQwNjI1IiB3aWR0aD0iMTI2LjcwMzEyNSIgaGVpZ2h0PSIzNi4yODEyNSI+PC9yZWN0PjxnIGNsYXNzPSJsYWJlbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTUzLjM1MTU2MjUsLTguMTQwNjI1KSI+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPmdldCBlbmZvcmNlIG1vZGU8L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48ZyBjbGFzcz0ibm9kZSIgc3R5bGU9Im9wYWNpdHk6IDE7IiBpZD0iRCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTE5LjMyMDMxMjUsMzEzLjI2NTYyNSkiPjxyZWN0IHJ4PSIwIiByeT0iMCIgeD0iLTk5LjMyMDMxMjUiIHk9Ii0xOC4xNDA2MjUiIHdpZHRoPSIxOTguNjQwNjI1IiBoZWlnaHQ9IjM2LjI4MTI1Ij48L3JlY3Q+PGcgY2xhc3M9ImxhYmVsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDApIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtODkuMzIwMzEyNSwtOC4xNDA2MjUpIj48dGV4dD48dHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZHk9IjFlbSIgeD0iMSI+ZnJvbSAvZXRjL3NlbGludXgvY29uZmln5paH5Lu2PC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PGcgY2xhc3M9Im5vZGUiIHN0eWxlPSJvcGFjaXR5OiAxOyIgaWQ9IkUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDM4MC4yNDIxODc1LDMxMy4yNjU2MjUpIj48cmVjdCByeD0iMCIgcnk9IjAiIHg9Ii0xMTEuNjAxNTYyNSIgeT0iLTE4LjE0MDYyNSIgd2lkdGg9IjIyMy4yMDMxMjUiIGhlaWdodD0iMzYuMjgxMjUiPjwvcmVjdD48ZyBjbGFzcz0ibGFiZWwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMDEuNjAxNTYyNSwtOC4xNDA2MjUpIj48dGV4dD48dHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZHk9IjFlbSIgeD0iMSI+ZnJvbSDlhoXmoLjlkK/liqjlj4LmlbAvcHJvYy9jbWRsaW5lPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PGcgY2xhc3M9Im5vZGUiIHN0eWxlPSJvcGFjaXR5OiAxOyIgaWQ9IkYiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI0OS43ODEyNSwzOTkuNTQ2ODc1KSI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB4PSItMTg4LjQ1MzEyNSIgeT0iLTE4LjE0MDYyNSIgd2lkdGg9IjM3Ni45MDYyNSIgaGVpZ2h0PSIzNi4yODEyNSI+PC9yZWN0PjxnIGNsYXNzPSJsYWJlbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE3OC40NTMxMjUsLTguMTQwNjI1KSI+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPm1vdW50IHNlbGludXhmc+WIsC9zeXMvZnMvc2VsaW51eO+8iOaXp+eahOaMgui9veeCueWcqC9zZWxpbnV477yJPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PGcgY2xhc3M9Im5vZGUiIHN0eWxlPSJvcGFjaXR5OiAxOyIgaWQ9IkciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI0OS43ODEyNSw0ODUuODI4MTI1KSI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB4PSItMTU2LjAyMzQzNzUiIHk9Ii0xOC4xNDA2MjUiIHdpZHRoPSIzMTIuMDQ2ODc1IiBoZWlnaHQ9IjM2LjI4MTI1Ij48L3JlY3Q+PGcgY2xhc3M9ImxhYmVsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDApIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTQ2LjAyMzQzNzUsLTguMTQwNjI1KSI+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPuS9v+iDvVNFTGludXjvvIzpgJrov4flvoAvc3lzL2ZzL3NlbGludXgvZW5mb3JjZeWGmTE8L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48ZyBjbGFzcz0ibm9kZSIgc3R5bGU9Im9wYWNpdHk6IDE7IiBpZD0iSCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjQ5Ljc4MTI1LDU3Mi4xMDkzNzUpIj48cmVjdCByeD0iMCIgcnk9IjAiIHg9Ii0xMTEuODM1OTM3NSIgeT0iLTE4LjE0MDYyNSIgd2lkdGg9IjIyMy42NzE4NzUiIGhlaWdodD0iMzYuMjgxMjUiPjwvcmVjdD48ZyBjbGFzcz0ibGFiZWwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMDEuODM1OTM3NSwtOC4xNDA2MjUpIj48dGV4dD48dHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZHk9IjFlbSIgeD0iMSI+5Yqg6L29562W55Wl77yMc2VsaW51eF9ta2xvYWRfcG9saWN5PC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PC9nPjwvZz48L2c+PC9zdmc+

selinux_mkload_policy仍然是libselinux定义的接口,其调用了libsel库,对读入的策略二进制进行了预处理,例如策略语言版本不匹配时的语法降级。最终调用security_load_policy来加载策略,而该函数仅仅是将mmap出的文件,写入/sys/fs/selinux/load文件,从而使内核可以做真正的加载策略工作。

内核部分

SELinux最核心的部分就是内核中的LSM框架以及selinux模块部分。其位置位于security/selinux。而刚才提到的selinuxfs源码位于security/selinux/selinuxfs.c

selinuxfs

其初始化位于init_sel_fs。这是一个内核初始化函数,由内核启动时调用。其作用就是使用Linux内核的libfs接口,将selinuxfs准备好,在init进程中再进行挂载。其中有一个关键数据结构,即selinux_files

static const struct tree_descr selinux_files[] = {
    [SEL_LOAD] = {"load", &sel_load_ops, S_IRUSR|S_IWUSR},
    [SEL_ENFORCE] = {"enforce", &sel_enforce_ops, S_IRUGO|S_IWUSR},
    [SEL_CONTEXT] = {"context", &transaction_ops, S_IRUGO|S_IWUGO},
    [SEL_ACCESS] = {"access", &transaction_ops, S_IRUGO|S_IWUGO},
    [SEL_CREATE] = {"create", &transaction_ops, S_IRUGO|S_IWUGO},
    [SEL_RELABEL] = {"relabel", &transaction_ops, S_IRUGO|S_IWUGO},
    [SEL_USER] = {"user", &transaction_ops, S_IRUGO|S_IWUGO},
    [SEL_POLICYVERS] = {"policyvers", &sel_policyvers_ops, S_IRUGO},
    [SEL_COMMIT_BOOLS] = {"commit_pending_bools", &sel_commit_bools_ops, S_IWUSR},
    [SEL_MLS] = {"mls", &sel_mls_ops, S_IRUGO},
    [SEL_DISABLE] = {"disable", &sel_disable_ops, S_IWUSR},
    [SEL_MEMBER] = {"member", &transaction_ops, S_IRUGO|S_IWUGO},
    [SEL_CHECKREQPROT] = {"checkreqprot", &sel_checkreqprot_ops, S_IRUGO|S_IWUSR},
    [SEL_REJECT_UNKNOWN] = {"reject_unknown", &sel_handle_unknown_ops, S_IRUGO},
    [SEL_DENY_UNKNOWN] = {"deny_unknown", &sel_handle_unknown_ops, S_IRUGO},
    [SEL_STATUS] = {"status", &sel_handle_status_ops, S_IRUGO},
    [SEL_POLICY] = {"policy", &sel_policy_ops, S_IRUGO},
    [SEL_VALIDATE_TRANS] = {"validatetrans", &sel_transition_ops,
                S_IWUGO},
    /* last one */ {""}
};

他为每个selinuxfs文件均定义了file_operation。再看看运行时的selinuxfs:

[ben@localhost targeted]$ tree /sys/fs/selinux/ -L 1
/sys/fs/selinux/
├── access
├── avc
├── booleans
├── checkreqprot
├── class
├── commit_pending_bools
├── context
├── create
├── deny_unknown
├── disable
├── enforce
├── initial_contexts
├── load
├── member
├── mls
├── null
├── policy
├── policy_capabilities
├── policyvers
├── reject_unknown
├── relabel
├── ss
├── status
├── user
└── validatetrans

6 directories, 19 files

selinux_files定义的文件在这里都可以找到,除了一个特殊的文件null。init_sel_fs除了创建这些文件,还创建了一些目录,例如avc, booleans, class, initial_contexts等。

selinuxfs SID初始化

selinuxfs每个文件和一个普通文件一样,都有对应的context,并对应到SID。SELinux子系统在初始化时,创建了selinuxfs。selinuxfs的文件节点通过d_add(entry, inode)函数添加。而每个文件的SID也是由d_add打上。但因为牵扯到SELinux策略加载,过程比较复杂一些。先看看d_add怎么最终完成selinux文件SID的加载。

PHN2ZyBpZD0iZDUyNWE1Z3oyNHoiIHdpZHRoPSIxMDAlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXgtd2lkdGg6IDU2MC44MTI1cHg7IiB2aWV3Qm94PSIwIDAgNTYwLjgxMjUgMTA1My42OTM3NTYxMDM1MTU2Ij48c3R5bGU+CgoKI2Q1MjVhNWd6MjR6IC5sYWJlbCB7CiAgZm9udC1mYW1pbHk6ICd0cmVidWNoZXQgbXMnLCB2ZXJkYW5hLCBhcmlhbDsKICBjb2xvcjogIzMzMzsgfQoKI2Q1MjVhNWd6MjR6IC5ub2RlIHJlY3QsCiNkNTI1YTVnejI0eiAubm9kZSBjaXJjbGUsCiNkNTI1YTVnejI0eiAubm9kZSBlbGxpcHNlLAojZDUyNWE1Z3oyNHogLm5vZGUgcG9seWdvbiB7CiAgZmlsbDogI0VDRUNGRjsKICBzdHJva2U6ICM5MzcwREI7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7IH0KCiNkNTI1YTVnejI0eiAubm9kZS5jbGlja2FibGUgewogIGN1cnNvcjogcG9pbnRlcjsgfQoKI2Q1MjVhNWd6MjR6IC5hcnJvd2hlYWRQYXRoIHsKICBmaWxsOiAjMzMzMzMzOyB9CgojZDUyNWE1Z3oyNHogLmVkZ2VQYXRoIC5wYXRoIHsKICBzdHJva2U6ICMzMzMzMzM7CiAgc3Ryb2tlLXdpZHRoOiAxLjVweDsgfQoKI2Q1MjVhNWd6MjR6IC5lZGdlTGFiZWwgewogIGJhY2tncm91bmQtY29sb3I6ICNlOGU4ZTg7IH0KCiNkNTI1YTVnejI0eiAuY2x1c3RlciByZWN0IHsKICBmaWxsOiAjZmZmZmRlICFpbXBvcnRhbnQ7CiAgc3Ryb2tlOiAjYWFhYTMzICFpbXBvcnRhbnQ7CiAgc3Ryb2tlLXdpZHRoOiAxcHggIWltcG9ydGFudDsgfQoKI2Q1MjVhNWd6MjR6IC5jbHVzdGVyIHRleHQgewogIGZpbGw6ICMzMzM7IH0KCiNkNTI1YTVnejI0eiBkaXYubWVybWFpZFRvb2x0aXAgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgbWF4LXdpZHRoOiAyMDBweDsKICBwYWRkaW5nOiAycHg7CiAgZm9udC1mYW1pbHk6ICd0cmVidWNoZXQgbXMnLCB2ZXJkYW5hLCBhcmlhbDsKICBmb250LXNpemU6IDEycHg7CiAgYmFja2dyb3VuZDogI2ZmZmZkZTsKICBib3JkZXI6IDFweCBzb2xpZCAjYWFhYTMzOwogIGJvcmRlci1yYWRpdXM6IDJweDsKICBwb2ludGVyLWV2ZW50czogbm9uZTsKICB6LWluZGV4OiAxMDA7IH0KCiNkNTI1YTVnejI0eiAuYWN0b3IgewogIHN0cm9rZTogI0NDQ0NGRjsKICBmaWxsOiAjRUNFQ0ZGOyB9CgojZDUyNWE1Z3oyNHogdGV4dC5hY3RvciB7CiAgZmlsbDogYmxhY2s7CiAgc3Ryb2tlOiBub25lOyB9CgojZDUyNWE1Z3oyNHogLmFjdG9yLWxpbmUgewogIHN0cm9rZTogZ3JleTsgfQoKI2Q1MjVhNWd6MjR6IC5tZXNzYWdlTGluZTAgewogIHN0cm9rZS13aWR0aDogMS41OwogIHN0cm9rZS1kYXNoYXJyYXk6ICcyIDInOwogIHN0cm9rZTogIzMzMzsgfQoKI2Q1MjVhNWd6MjR6IC5tZXNzYWdlTGluZTEgewogIHN0cm9rZS13aWR0aDogMS41OwogIHN0cm9rZS1kYXNoYXJyYXk6ICcyIDInOwogIHN0cm9rZTogIzMzMzsgfQoKI2Q1MjVhNWd6MjR6ICNhcnJvd2hlYWQgewogIGZpbGw6ICMzMzM7IH0KCiNkNTI1YTVnejI0eiAjY3Jvc3NoZWFkIHBhdGggewogIGZpbGw6ICMzMzMgIWltcG9ydGFudDsKICBzdHJva2U6ICMzMzMgIWltcG9ydGFudDsgfQoKI2Q1MjVhNWd6MjR6IC5tZXNzYWdlVGV4dCB7CiAgZmlsbDogIzMzMzsKICBzdHJva2U6IG5vbmU7IH0KCiNkNTI1YTVnejI0eiAubGFiZWxCb3ggewogIHN0cm9rZTogI0NDQ0NGRjsKICBmaWxsOiAjRUNFQ0ZGOyB9CgojZDUyNWE1Z3oyNHogLmxhYmVsVGV4dCB7CiAgZmlsbDogYmxhY2s7CiAgc3Ryb2tlOiBub25lOyB9CgojZDUyNWE1Z3oyNHogLmxvb3BUZXh0IHsKICBmaWxsOiBibGFjazsKICBzdHJva2U6IG5vbmU7IH0KCiNkNTI1YTVnejI0eiAubG9vcExpbmUgewogIHN0cm9rZS13aWR0aDogMjsKICBzdHJva2UtZGFzaGFycmF5OiAnMiAyJzsKICBzdHJva2U6ICNDQ0NDRkY7IH0KCiNkNTI1YTVnejI0eiAubm90ZSB7CiAgc3Ryb2tlOiAjYWFhYTMzOwogIGZpbGw6ICNmZmY1YWQ7IH0KCiNkNTI1YTVnejI0eiAubm90ZVRleHQgewogIGZpbGw6IGJsYWNrOwogIHN0cm9rZTogbm9uZTsKICBmb250LWZhbWlseTogJ3RyZWJ1Y2hldCBtcycsIHZlcmRhbmEsIGFyaWFsOwogIGZvbnQtc2l6ZTogMTRweDsgfQoKI2Q1MjVhNWd6MjR6IC5hY3RpdmF0aW9uMCB7CiAgZmlsbDogI2Y0ZjRmNDsKICBzdHJva2U6ICM2NjY7IH0KCiNkNTI1YTVnejI0eiAuYWN0aXZhdGlvbjEgewogIGZpbGw6ICNmNGY0ZjQ7CiAgc3Ryb2tlOiAjNjY2OyB9CgojZDUyNWE1Z3oyNHogLmFjdGl2YXRpb24yIHsKICBmaWxsOiAjZjRmNGY0OwogIHN0cm9rZTogIzY2NjsgfQoKCiNkNTI1YTVnejI0eiAuc2VjdGlvbiB7CiAgc3Ryb2tlOiBub25lOwogIG9wYWNpdHk6IDAuMjsgfQoKI2Q1MjVhNWd6MjR6IC5zZWN0aW9uMCB7CiAgZmlsbDogcmdiYSgxMDIsIDEwMiwgMjU1LCAwLjQ5KTsgfQoKI2Q1MjVhNWd6MjR6IC5zZWN0aW9uMiB7CiAgZmlsbDogI2ZmZjQwMDsgfQoKI2Q1MjVhNWd6MjR6IC5zZWN0aW9uMSwKI2Q1MjVhNWd6MjR6IC5zZWN0aW9uMyB7CiAgZmlsbDogd2hpdGU7CiAgb3BhY2l0eTogMC4yOyB9CgojZDUyNWE1Z3oyNHogLnNlY3Rpb25UaXRsZTAgewogIGZpbGw6ICMzMzM7IH0KCiNkNTI1YTVnejI0eiAuc2VjdGlvblRpdGxlMSB7CiAgZmlsbDogIzMzMzsgfQoKI2Q1MjVhNWd6MjR6IC5zZWN0aW9uVGl0bGUyIHsKICBmaWxsOiAjMzMzOyB9CgojZDUyNWE1Z3oyNHogLnNlY3Rpb25UaXRsZTMgewogIGZpbGw6ICMzMzM7IH0KCiNkNTI1YTVnejI0eiAuc2VjdGlvblRpdGxlIHsKICB0ZXh0LWFuY2hvcjogc3RhcnQ7CiAgZm9udC1zaXplOiAxMXB4OwogIHRleHQtaGVpZ2h0OiAxNHB4OyB9CgoKI2Q1MjVhNWd6MjR6IC5ncmlkIC50aWNrIHsKICBzdHJva2U6IGxpZ2h0Z3JleTsKICBvcGFjaXR5OiAwLjM7CiAgc2hhcGUtcmVuZGVyaW5nOiBjcmlzcEVkZ2VzOyB9CgojZDUyNWE1Z3oyNHogLmdyaWQgcGF0aCB7CiAgc3Ryb2tlLXdpZHRoOiAwOyB9CgoKI2Q1MjVhNWd6MjR6IC50b2RheSB7CiAgZmlsbDogbm9uZTsKICBzdHJva2U6IHJlZDsKICBzdHJva2Utd2lkdGg6IDJweDsgfQoKCgojZDUyNWE1Z3oyNHogLnRhc2sgewogIHN0cm9rZS13aWR0aDogMjsgfQoKI2Q1MjVhNWd6MjR6IC50YXNrVGV4dCB7CiAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICBmb250LXNpemU6IDExcHg7IH0KCiNkNTI1YTVnejI0eiAudGFza1RleHRPdXRzaWRlUmlnaHQgewogIGZpbGw6IGJsYWNrOwogIHRleHQtYW5jaG9yOiBzdGFydDsKICBmb250LXNpemU6IDExcHg7IH0KCiNkNTI1YTVnejI0eiAudGFza1RleHRPdXRzaWRlTGVmdCB7CiAgZmlsbDogYmxhY2s7CiAgdGV4dC1hbmNob3I6IGVuZDsKICBmb250LXNpemU6IDExcHg7IH0KCgojZDUyNWE1Z3oyNHogLnRhc2tUZXh0MCwKI2Q1MjVhNWd6MjR6IC50YXNrVGV4dDEsCiNkNTI1YTVnejI0eiAudGFza1RleHQyLAojZDUyNWE1Z3oyNHogLnRhc2tUZXh0MyB7CiAgZmlsbDogd2hpdGU7IH0KCiNkNTI1YTVnejI0eiAudGFzazAsCiNkNTI1YTVnejI0eiAudGFzazEsCiNkNTI1YTVnejI0eiAudGFzazIsCiNkNTI1YTVnejI0eiAudGFzazMgewogIGZpbGw6ICM4YTkwZGQ7CiAgc3Ryb2tlOiAjNTM0ZmJjOyB9CgojZDUyNWE1Z3oyNHogLnRhc2tUZXh0T3V0c2lkZTAsCiNkNTI1YTVnejI0eiAudGFza1RleHRPdXRzaWRlMiB7CiAgZmlsbDogYmxhY2s7IH0KCiNkNTI1YTVnejI0eiAudGFza1RleHRPdXRzaWRlMSwKI2Q1MjVhNWd6MjR6IC50YXNrVGV4dE91dHNpZGUzIHsKICBmaWxsOiBibGFjazsgfQoKCiNkNTI1YTVnejI0eiAuYWN0aXZlMCwKI2Q1MjVhNWd6MjR6IC5hY3RpdmUxLAojZDUyNWE1Z3oyNHogLmFjdGl2ZTIsCiNkNTI1YTVnejI0eiAuYWN0aXZlMyB7CiAgZmlsbDogI2JmYzdmZjsKICBzdHJva2U6ICM1MzRmYmM7IH0KCiNkNTI1YTVnejI0eiAuYWN0aXZlVGV4dDAsCiNkNTI1YTVnejI0eiAuYWN0aXZlVGV4dDEsCiNkNTI1YTVnejI0eiAuYWN0aXZlVGV4dDIsCiNkNTI1YTVnejI0eiAuYWN0aXZlVGV4dDMgewogIGZpbGw6IGJsYWNrICFpbXBvcnRhbnQ7IH0KCgojZDUyNWE1Z3oyNHogLmRvbmUwLAojZDUyNWE1Z3oyNHogLmRvbmUxLAojZDUyNWE1Z3oyNHogLmRvbmUyLAojZDUyNWE1Z3oyNHogLmRvbmUzIHsKICBzdHJva2U6IGdyZXk7CiAgZmlsbDogbGlnaHRncmV5OwogIHN0cm9rZS13aWR0aDogMjsgfQoKI2Q1MjVhNWd6MjR6IC5kb25lVGV4dDAsCiNkNTI1YTVnejI0eiAuZG9uZVRleHQxLAojZDUyNWE1Z3oyNHogLmRvbmVUZXh0MiwKI2Q1MjVhNWd6MjR6IC5kb25lVGV4dDMgewogIGZpbGw6IGJsYWNrICFpbXBvcnRhbnQ7IH0KCgojZDUyNWE1Z3oyNHogLmNyaXQwLAojZDUyNWE1Z3oyNHogLmNyaXQxLAojZDUyNWE1Z3oyNHogLmNyaXQyLAojZDUyNWE1Z3oyNHogLmNyaXQzIHsKICBzdHJva2U6ICNmZjg4ODg7CiAgZmlsbDogcmVkOwogIHN0cm9rZS13aWR0aDogMjsgfQoKI2Q1MjVhNWd6MjR6IC5hY3RpdmVDcml0MCwKI2Q1MjVhNWd6MjR6IC5hY3RpdmVDcml0MSwKI2Q1MjVhNWd6MjR6IC5hY3RpdmVDcml0MiwKI2Q1MjVhNWd6MjR6IC5hY3RpdmVDcml0MyB7CiAgc3Ryb2tlOiAjZmY4ODg4OwogIGZpbGw6ICNiZmM3ZmY7CiAgc3Ryb2tlLXdpZHRoOiAyOyB9CgojZDUyNWE1Z3oyNHogLmRvbmVDcml0MCwKI2Q1MjVhNWd6MjR6IC5kb25lQ3JpdDEsCiNkNTI1YTVnejI0eiAuZG9uZUNyaXQyLAojZDUyNWE1Z3oyNHogLmRvbmVDcml0MyB7CiAgc3Ryb2tlOiAjZmY4ODg4OwogIGZpbGw6IGxpZ2h0Z3JleTsKICBzdHJva2Utd2lkdGg6IDI7CiAgY3Vyc29yOiBwb2ludGVyOwogIHNoYXBlLXJlbmRlcmluZzogY3Jpc3BFZGdlczsgfQoKI2Q1MjVhNWd6MjR6IC5kb25lQ3JpdFRleHQwLAojZDUyNWE1Z3oyNHogLmRvbmVDcml0VGV4dDEsCiNkNTI1YTVnejI0eiAuZG9uZUNyaXRUZXh0MiwKI2Q1MjVhNWd6MjR6IC5kb25lQ3JpdFRleHQzIHsKICBmaWxsOiBibGFjayAhaW1wb3J0YW50OyB9CgojZDUyNWE1Z3oyNHogLmFjdGl2ZUNyaXRUZXh0MCwKI2Q1MjVhNWd6MjR6IC5hY3RpdmVDcml0VGV4dDEsCiNkNTI1YTVnejI0eiAuYWN0aXZlQ3JpdFRleHQyLAojZDUyNWE1Z3oyNHogLmFjdGl2ZUNyaXRUZXh0MyB7CiAgZmlsbDogYmxhY2sgIWltcG9ydGFudDsgfQoKI2Q1MjVhNWd6MjR6IC50aXRsZVRleHQgewogIHRleHQtYW5jaG9yOiBtaWRkbGU7CiAgZm9udC1zaXplOiAxOHB4OwogIGZpbGw6IGJsYWNrOyB9CgojZDUyNWE1Z3oyNHogZy5jbGFzc0dyb3VwIHRleHQgewogIGZpbGw6ICM5MzcwREI7CiAgc3Ryb2tlOiBub25lOwogIGZvbnQtZmFtaWx5OiAndHJlYnVjaGV0IG1zJywgdmVyZGFuYSwgYXJpYWw7CiAgZm9udC1zaXplOiAxMHB4OyB9CgojZDUyNWE1Z3oyNHogZy5jbGFzc0dyb3VwIHJlY3QgewogIGZpbGw6ICNFQ0VDRkY7CiAgc3Ryb2tlOiAjOTM3MERCOyB9CgojZDUyNWE1Z3oyNHogZy5jbGFzc0dyb3VwIGxpbmUgewogIHN0cm9rZTogIzkzNzBEQjsKICBzdHJva2Utd2lkdGg6IDE7IH0KCiNkNTI1YTVnejI0eiAuY2xhc3NMYWJlbCAuYm94IHsKICBzdHJva2U6IG5vbmU7CiAgc3Ryb2tlLXdpZHRoOiAwOwogIGZpbGw6ICNFQ0VDRkY7CiAgb3BhY2l0eTogMC41OyB9CgojZDUyNWE1Z3oyNHogLmNsYXNzTGFiZWwgLmxhYmVsIHsKICBmaWxsOiAjOTM3MERCOwogIGZvbnQtc2l6ZTogMTBweDsgfQoKI2Q1MjVhNWd6MjR6IC5yZWxhdGlvbiB7CiAgc3Ryb2tlOiAjOTM3MERCOwogIHN0cm9rZS13aWR0aDogMTsKICBmaWxsOiBub25lOyB9CgojZDUyNWE1Z3oyNHogI2NvbXBvc2l0aW9uU3RhcnQgewogIGZpbGw6ICM5MzcwREI7CiAgc3Ryb2tlOiAjOTM3MERCOwogIHN0cm9rZS13aWR0aDogMTsgfQoKI2Q1MjVhNWd6MjR6ICNjb21wb3NpdGlvbkVuZCB7CiAgZmlsbDogIzkzNzBEQjsKICBzdHJva2U6ICM5MzcwREI7CiAgc3Ryb2tlLXdpZHRoOiAxOyB9CgojZDUyNWE1Z3oyNHogI2FnZ3JlZ2F0aW9uU3RhcnQgewogIGZpbGw6ICNFQ0VDRkY7CiAgc3Ryb2tlOiAjOTM3MERCOwogIHN0cm9rZS13aWR0aDogMTsgfQoKI2Q1MjVhNWd6MjR6ICNhZ2dyZWdhdGlvbkVuZCB7CiAgZmlsbDogI0VDRUNGRjsKICBzdHJva2U6ICM5MzcwREI7CiAgc3Ryb2tlLXdpZHRoOiAxOyB9CgojZDUyNWE1Z3oyNHogI2RlcGVuZGVuY3lTdGFydCB7CiAgZmlsbDogIzkzNzBEQjsKICBzdHJva2U6ICM5MzcwREI7CiAgc3Ryb2tlLXdpZHRoOiAxOyB9CgojZDUyNWE1Z3oyNHogI2RlcGVuZGVuY3lFbmQgewogIGZpbGw6ICM5MzcwREI7CiAgc3Ryb2tlOiAjOTM3MERCOwogIHN0cm9rZS13aWR0aDogMTsgfQoKI2Q1MjVhNWd6MjR6ICNleHRlbnNpb25TdGFydCB7CiAgZmlsbDogIzkzNzBEQjsKICBzdHJva2U6ICM5MzcwREI7CiAgc3Ryb2tlLXdpZHRoOiAxOyB9CgojZDUyNWE1Z3oyNHogI2V4dGVuc2lvbkVuZCB7CiAgZmlsbDogIzkzNzBEQjsKICBzdHJva2U6ICM5MzcwREI7CiAgc3Ryb2tlLXdpZHRoOiAxOyB9CgojZDUyNWE1Z3oyNHogLmNvbW1pdC1pZCwKI2Q1MjVhNWd6MjR6IC5jb21taXQtbXNnLAojZDUyNWE1Z3oyNHogLmJyYW5jaC1sYWJlbCB7CiAgZmlsbDogbGlnaHRncmV5OwogIGNvbG9yOiBsaWdodGdyZXk7IH0KCgoKI2Q1MjVhNWd6MjR6IC5sYWJlbHsKICBjb2xvcjojMThCMTRFOwp9CiNkNTI1YTVnejI0eiAudGUtbWQtY29udGFpbmVyLS1kYXJrIC5ub2RlIHJlY3QgewogIGZpbGw6IHJlZDsKfQoKI2Q1MjVhNWd6MjR6IC5ub2RlIHJlY3QsCiNkNTI1YTVnejI0eiAubm9kZSBjaXJjbGUsCiNkNTI1YTVnejI0eiAubm9kZSBlbGxpcHNlLAojZDUyNWE1Z3oyNHogLm5vZGUgcG9seWdvbiB7CiAgZmlsbDogI0Y5RkZGQjs7CiAgc3Ryb2tlOiAjMkRCRDYwOwogIHN0cm9rZS13aWR0aDogMS41cHg7Cn0KI2Q1MjVhNWd6MjR6IC5hcnJvd2hlYWRQYXRoewogIGZpbGw6ICMyREJENjA7Cn0KI2Q1MjVhNWd6MjR6IC5lZGdlUGF0aCAucGF0aCB7CiAgc3Ryb2tlOiAjMkRCRDYwOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CiNkNTI1YTVnejI0eiAuZWRnZUxhYmVsIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwp9CiNkNTI1YTVnejI0eiAuY2x1c3RlciByZWN0IHsKICBmaWxsOiAjRjlGRkZCICFpbXBvcnRhbnQ7CiAgc3Ryb2tlOiAjMkRCRDYwICFpbXBvcnRhbnQ7CiAgc3Ryb2tlLXdpZHRoOiAxcHggIWltcG9ydGFudDsKfQoKI2Q1MjVhNWd6MjR6IC5jbHVzdGVyIHRleHQgewogIGZpbGw6ICNGOUZGRkI7Cn0KCiNkNTI1YTVnejI0eiBkaXYubWVybWFpZFRvb2x0aXAgewogIGJhY2tncm91bmQ6ICNGOUZGRkI7CiAgYm9yZGVyOiAxcHggc29saWQgIzJEQkQ2MDsKfQoKCiNkNTI1YTVnejI0eiAuYWN0b3IgewogIHN0cm9rZTogIzJEQkQ2MDsKICBmaWxsOiAjRjlGRkZCOwp9CgojZDUyNWE1Z3oyNHogdGV4dC5hY3RvciB7CiAgZmlsbDogIzJEQkQ2MDsKICBzdHJva2U6IG5vbmU7Cn0KCiNkNTI1YTVnejI0eiAuYWN0b3ItbGluZSB7CiAgc3Ryb2tlOiAjMkRCRDYwOwp9CgojZDUyNWE1Z3oyNHogLm1lc3NhZ2VMaW5lMCB7CiAgc3Ryb2tlLXdpZHRoOiAxLjU7CiAgc3Ryb2tlLWRhc2hhcnJheTogJzIgMic7CiAgbWFya2VyLWVuZDogJ3VybCgjYXJyb3doZWFkKSc7CiAgc3Ryb2tlOiAjMkRCRDYwOwp9CgojZDUyNWE1Z3oyNHogLm1lc3NhZ2VMaW5lMSB7CiAgc3Ryb2tlLXdpZHRoOiAxLjU7CiAgc3Ryb2tlLWRhc2hhcnJheTogJzIgMic7CiAgc3Ryb2tlOiAjMkRCRDYwOwp9CgojZDUyNWE1Z3oyNHogI2Fycm93aGVhZCB7CiAgZmlsbDogIzJEQkQ2MDsKfQoKI2Q1MjVhNWd6MjR6ICNjcm9zc2hlYWQgcGF0aCB7CiAgZmlsbDogIzJEQkQ2MCAhaW1wb3J0YW50OwogIHN0cm9rZTogIzJEQkQ2MCAhaW1wb3J0YW50Owp9CgojZDUyNWE1Z3oyNHogLm1lc3NhZ2VUZXh0IHsKICBmaWxsOiAjMkRCRDYwOwogIHN0cm9rZTogbm9uZTsKfQoKI2Q1MjVhNWd6MjR6IC5sYWJlbEJveCB7CiAgc3Ryb2tlOiAjMkRCRDYwOwogIGZpbGw6ICNGOUZGRkI7Cn0KCiNkNTI1YTVnejI0eiAubGFiZWxUZXh0IHsKICBmaWxsOiAjMkRCRDYwOwogIHN0cm9rZTogIzJEQkQ2MDsKfQoKI2Q1MjVhNWd6MjR6IC5sb29wVGV4dCB7CiAgZmlsbDogIzJEQkQ2MDsKICBzdHJva2U6ICMyREJENjA7Cn0KCiNkNTI1YTVnejI0eiAubG9vcExpbmUgewogIHN0cm9rZS13aWR0aDogMjsKICBzdHJva2UtZGFzaGFycmF5OiAnMiAyJzsKICBtYXJrZXItZW5kOiAndXJsKCNhcnJvd2hlYWQpJzsKICBzdHJva2U6ICMyREJENjA7Cn0KCiNkNTI1YTVnejI0eiAubm90ZSB7CiAgc3Ryb2tlOiAjMkRCRDYwOwogIGZpbGw6ICNGOUZGRkI7Cn0KCiNkNTI1YTVnejI0eiAubm90ZVRleHQgewogIGZpbGw6ICMyREJENjA7CiAgc3Ryb2tlOiAjMkRCRDYwOwp9CgoKI2Q1MjVhNWd6MjR6IC5zZWN0aW9uewogIG9wYWNpdHk6MTsKfQojZDUyNWE1Z3oyNHogLnNlY3Rpb24wLCNkNTI1YTVnejI0eiAgLnNlY3Rpb24yIHsKICBmaWxsOiAjRUNGN0YwOwp9CgojZDUyNWE1Z3oyNHogLnNlY3Rpb24xLAojZDUyNWE1Z3oyNHogLnNlY3Rpb24zIHsKICBmaWxsOiAjRkZGOwp9CiNkNTI1YTVnejI0eiAudGFza1RleHQwLAojZDUyNWE1Z3oyNHogLnRhc2tUZXh0MSwKI2Q1MjVhNWd6MjR6IC50YXNrVGV4dDIsCiNkNTI1YTVnejI0eiAudGFza1RleHQzIHsKICBmaWxsOiAjZmZmOwp9CgojZDUyNWE1Z3oyNHogLnRhc2swLAojZDUyNWE1Z3oyNHogLnRhc2sxLAojZDUyNWE1Z3oyNHogLnRhc2syLAojZDUyNWE1Z3oyNHogLnRhc2szIHsKICBmaWxsOiAjMkRCRDYwOwogIHN0cm9rZTogIzM1OUY1QTsKfQo8L3N0eWxlPjxzdHlsZT4jZDUyNWE1Z3oyNHogewogICAgY29sb3I6IHJnYigyMDAsIDIwMSwgMTk4KTsKICAgIGZvbnQ6IG5vcm1hbCBub3JtYWwgbm9ybWFsIG5vcm1hbCAxNHB4LzIyLjM5OTk5OTYxODUzMDI3M3B4IG1vbm9zcGFjZTsKICB9PC9zdHlsZT48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTIsIC0xMikiPjxnIGNsYXNzPSJvdXRwdXQiPjxnIGNsYXNzPSJjbHVzdGVycyI+PC9nPjxnIGNsYXNzPSJlZGdlUGF0aHMiPjxnIGNsYXNzPSJlZGdlUGF0aCIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48cGF0aCBjbGFzcz0icGF0aCIgZD0iTTMzMC41MTE3MTg3NSw1Ni4yODEyNUwzMzAuNTExNzE4NzUsODEuMjgxMjVMMzMwLjUxMTcxODc1LDEwNi4yODEyNSIgbWFya2VyLWVuZD0idXJsKCNhcnJvd2hlYWQyNzkpIiBzdHlsZT0ic3Ryb2tlOiAjMzMzOyBzdHJva2Utd2lkdGg6IDEuNXB4O2ZpbGw6bm9uZSI+PC9wYXRoPjxkZWZzPjxtYXJrZXIgaWQ9ImFycm93aGVhZDI3OSIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI5IiByZWZZPSI1IiBtYXJrZXJVbml0cz0ic3Ryb2tlV2lkdGgiIG1hcmtlcldpZHRoPSI4IiBtYXJrZXJIZWlnaHQ9IjYiIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTSAwIDAgTCAxMCA1IEwgMCAxMCB6IiBjbGFzcz0iYXJyb3doZWFkUGF0aCIgc3R5bGU9InN0cm9rZS13aWR0aDogMXB4OyBzdHJva2UtZGFzaGFycmF5OiAxcHgsIDBweDsiPjwvcGF0aD48L21hcmtlcj48L2RlZnM+PC9nPjxnIGNsYXNzPSJlZGdlUGF0aCIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48cGF0aCBjbGFzcz0icGF0aCIgZD0iTTMzMC41MTE3MTg3NSwxNDIuNTYyNUwzMzAuNTExNzE4NzUsMTY3LjU2MjVMMzMwLjUxMTcxODc1LDE5Mi41NjI1IiBtYXJrZXItZW5kPSJ1cmwoI2Fycm93aGVhZDI4MCkiIHN0eWxlPSJzdHJva2U6ICMzMzM7IHN0cm9rZS13aWR0aDogMS41cHg7ZmlsbDpub25lIj48L3BhdGg+PGRlZnM+PG1hcmtlciBpZD0iYXJyb3doZWFkMjgwIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlclVuaXRzPSJzdHJva2VXaWR0aCIgbWFya2VyV2lkdGg9IjgiIG1hcmtlckhlaWdodD0iNiIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNIDAgMCBMIDEwIDUgTCAwIDEwIHoiIGNsYXNzPSJhcnJvd2hlYWRQYXRoIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxcHg7IHN0cm9rZS1kYXNoYXJyYXk6IDFweCwgMHB4OyI+PC9wYXRoPjwvbWFya2VyPjwvZGVmcz48L2c+PGcgY2xhc3M9ImVkZ2VQYXRoIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxwYXRoIGNsYXNzPSJwYXRoIiBkPSJNMzMwLjUxMTcxODc1LDIyOC44NDM3NUwzMzAuNTExNzE4NzUsMjUzLjg0Mzc1TDMzMC41MTE3MTg3NSwyNzguODQzNzUiIG1hcmtlci1lbmQ9InVybCgjYXJyb3doZWFkMjgxKSIgc3R5bGU9InN0cm9rZTogIzMzMzsgc3Ryb2tlLXdpZHRoOiAxLjVweDtmaWxsOm5vbmUiPjwvcGF0aD48ZGVmcz48bWFya2VyIGlkPSJhcnJvd2hlYWQyODEiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOSIgcmVmWT0iNSIgbWFya2VyVW5pdHM9InN0cm9rZVdpZHRoIiBtYXJrZXJXaWR0aD0iOCIgbWFya2VySGVpZ2h0PSI2IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0gMCAwIEwgMTAgNSBMIDAgMTAgeiIgY2xhc3M9ImFycm93aGVhZFBhdGgiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDFweDsgc3Ryb2tlLWRhc2hhcnJheTogMXB4LCAwcHg7Ij48L3BhdGg+PC9tYXJrZXI+PC9kZWZzPjwvZz48ZyBjbGFzcz0iZWRnZVBhdGgiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PHBhdGggY2xhc3M9InBhdGgiIGQ9Ik0zMzAuNTExNzE4NzUsMzE1LjEyNUwzMzAuNTExNzE4NzUsMzQ4LjI2NTYyNUwzMzAuNTExNzE4NzUsMzgxLjQwNjI1IiBtYXJrZXItZW5kPSJ1cmwoI2Fycm93aGVhZDI4MikiIHN0eWxlPSJzdHJva2U6ICMzMzM7IHN0cm9rZS13aWR0aDogMS41cHg7ZmlsbDpub25lIj48L3BhdGg+PGRlZnM+PG1hcmtlciBpZD0iYXJyb3doZWFkMjgyIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlclVuaXRzPSJzdHJva2VXaWR0aCIgbWFya2VyV2lkdGg9IjgiIG1hcmtlckhlaWdodD0iNiIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNIDAgMCBMIDEwIDUgTCAwIDEwIHoiIGNsYXNzPSJhcnJvd2hlYWRQYXRoIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxcHg7IHN0cm9rZS1kYXNoYXJyYXk6IDFweCwgMHB4OyI+PC9wYXRoPjwvbWFya2VyPjwvZGVmcz48L2c+PGcgY2xhc3M9ImVkZ2VQYXRoIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxwYXRoIGNsYXNzPSJwYXRoIiBkPSJNMzMwLjUxMTcxODc1LDQxNy42ODc1TDMzMC41MTE3MTg3NSw0NDIuNjg3NUwzMzAuNTExNzE4NzUsNDY3LjY4NzUiIG1hcmtlci1lbmQ9InVybCgjYXJyb3doZWFkMjgzKSIgc3R5bGU9InN0cm9rZTogIzMzMzsgc3Ryb2tlLXdpZHRoOiAxLjVweDtmaWxsOm5vbmUiPjwvcGF0aD48ZGVmcz48bWFya2VyIGlkPSJhcnJvd2hlYWQyODMiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOSIgcmVmWT0iNSIgbWFya2VyVW5pdHM9InN0cm9rZVdpZHRoIiBtYXJrZXJXaWR0aD0iOCIgbWFya2VySGVpZ2h0PSI2IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0gMCAwIEwgMTAgNSBMIDAgMTAgeiIgY2xhc3M9ImFycm93aGVhZFBhdGgiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDFweDsgc3Ryb2tlLWRhc2hhcnJheTogMXB4LCAwcHg7Ij48L3BhdGg+PC9tYXJrZXI+PC9kZWZzPjwvZz48ZyBjbGFzcz0iZWRnZVBhdGgiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PHBhdGggY2xhc3M9InBhdGgiIGQ9Ik0yOTAuODM4NTQ2MzgyNjUxMiw1MDMuOTY4NzVMMjM2LjE2NDA2MjUsNTI4Ljk2ODc1TDIzNi42NjQwNjI1LDU1NC40Njg3NTMwNTE3NTc2IiBtYXJrZXItZW5kPSJ1cmwoI2Fycm93aGVhZDI4NCkiIHN0eWxlPSJzdHJva2U6ICMzMzM7IHN0cm9rZS13aWR0aDogMS41cHg7ZmlsbDpub25lIj48L3BhdGg+PGRlZnM+PG1hcmtlciBpZD0iYXJyb3doZWFkMjg0IiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlclVuaXRzPSJzdHJva2VXaWR0aCIgbWFya2VyV2lkdGg9IjgiIG1hcmtlckhlaWdodD0iNiIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNIDAgMCBMIDEwIDUgTCAwIDEwIHoiIGNsYXNzPSJhcnJvd2hlYWRQYXRoIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxcHg7IHN0cm9rZS1kYXNoYXJyYXk6IDFweCwgMHB4OyI+PC9wYXRoPjwvbWFya2VyPjwvZGVmcz48L2c+PGcgY2xhc3M9ImVkZ2VQYXRoIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxwYXRoIGNsYXNzPSJwYXRoIiBkPSJNMTgxLjAwMjk5ODEzMjI2MDksNzI3LjQwNzY4ODY4NDAxODlMOTYuMjEwOTM3NSw4MTUuNzA5MzgxMTAzNTE1Nkw5Ni4yMTA5Mzc1LDg0OC44NTAwMDYxMDM1MTU2IiBtYXJrZXItZW5kPSJ1cmwoI2Fycm93aGVhZDI4NSkiIHN0eWxlPSJzdHJva2U6ICMzMzM7IHN0cm9rZS13aWR0aDogMS41cHg7ZmlsbDpub25lIj48L3BhdGg+PGRlZnM+PG1hcmtlciBpZD0iYXJyb3doZWFkMjg1IiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlclVuaXRzPSJzdHJva2VXaWR0aCIgbWFya2VyV2lkdGg9IjgiIG1hcmtlckhlaWdodD0iNiIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNIDAgMCBMIDEwIDUgTCAwIDEwIHoiIGNsYXNzPSJhcnJvd2hlYWRQYXRoIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxcHg7IHN0cm9rZS1kYXNoYXJyYXk6IDFweCwgMHB4OyI+PC9wYXRoPjwvbWFya2VyPjwvZGVmcz48L2c+PGcgY2xhc3M9ImVkZ2VQYXRoIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxwYXRoIGNsYXNzPSJwYXRoIiBkPSJNMjkyLjMyNTEyMzg5NTQ4OTIsNzI3LjQwNzY4NTU1Mjc1MzNMMzc2LjExNzE4NzUsODE1LjcwOTM4MTEwMzUxNTZMMzc2LjExNzE4NzUsODQ4Ljg1MDAwNjEwMzUxNTYiIG1hcmtlci1lbmQ9InVybCgjYXJyb3doZWFkMjg2KSIgc3R5bGU9InN0cm9rZTogIzMzMzsgc3Ryb2tlLXdpZHRoOiAxLjVweDtmaWxsOm5vbmUiPjwvcGF0aD48ZGVmcz48bWFya2VyIGlkPSJhcnJvd2hlYWQyODYiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOSIgcmVmWT0iNSIgbWFya2VyVW5pdHM9InN0cm9rZVdpZHRoIiBtYXJrZXJXaWR0aD0iOCIgbWFya2VySGVpZ2h0PSI2IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0gMCAwIEwgMTAgNSBMIDAgMTAgeiIgY2xhc3M9ImFycm93aGVhZFBhdGgiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDFweDsgc3Ryb2tlLWRhc2hhcnJheTogMXB4LCAwcHg7Ij48L3BhdGg+PC9tYXJrZXI+PC9kZWZzPjwvZz48ZyBjbGFzcz0iZWRnZVBhdGgiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PHBhdGggY2xhc3M9InBhdGgiIGQ9Ik05Ni4yMTA5Mzc1LDg4NS4xMzEyNTYxMDM1MTU2TDk2LjIxMDkzNzUsOTEwLjEzMTI1NjEwMzUxNTZMOTYuMjEwOTM3NSw5MzUuMTMxMjU2MTAzNTE1NiIgbWFya2VyLWVuZD0idXJsKCNhcnJvd2hlYWQyODcpIiBzdHlsZT0ic3Ryb2tlOiAjMzMzOyBzdHJva2Utd2lkdGg6IDEuNXB4O2ZpbGw6bm9uZSI+PC9wYXRoPjxkZWZzPjxtYXJrZXIgaWQ9ImFycm93aGVhZDI4NyIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI5IiByZWZZPSI1IiBtYXJrZXJVbml0cz0ic3Ryb2tlV2lkdGgiIG1hcmtlcldpZHRoPSI4IiBtYXJrZXJIZWlnaHQ9IjYiIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTSAwIDAgTCAwIDAgTCAwIDAgeiIgc3R5bGU9ImZpbGw6ICMzMzMiPjwvcGF0aD48L21hcmtlcj48L2RlZnM+PC9nPjxnIGNsYXNzPSJlZGdlUGF0aCIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48cGF0aCBjbGFzcz0icGF0aCIgZD0iTTk2LjIxMDkzNzUsOTcxLjQxMjUwNjEwMzUxNTZMOTYuMjEwOTM3NSw5OTYuNDEyNTA2MTAzNTE1NkwyMzEuOTg4MjgyNjY0Nzk1MzUsMTAyMS40MTI1MDYxMDM1MTU2IiBtYXJrZXItZW5kPSJ1cmwoI2Fycm93aGVhZDI4OCkiIHN0eWxlPSJzdHJva2U6ICMzMzM7IHN0cm9rZS13aWR0aDogMS41cHg7ZmlsbDpub25lIj48L3BhdGg+PGRlZnM+PG1hcmtlciBpZD0iYXJyb3doZWFkMjg4IiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlclVuaXRzPSJzdHJva2VXaWR0aCIgbWFya2VyV2lkdGg9IjgiIG1hcmtlckhlaWdodD0iNiIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNIDAgMCBMIDEwIDUgTCAwIDEwIHoiIGNsYXNzPSJhcnJvd2hlYWRQYXRoIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxcHg7IHN0cm9rZS1kYXNoYXJyYXk6IDFweCwgMHB4OyI+PC9wYXRoPjwvbWFya2VyPjwvZGVmcz48L2c+PGcgY2xhc3M9ImVkZ2VQYXRoIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxwYXRoIGNsYXNzPSJwYXRoIiBkPSJNNDI5LjAzNTE1NDgzNTIwNDY1LDEwMjEuNDEyNTA2MTAzNTE1Nkw1NjQuODEyNSw5OTYuNDEyNTA2MTAzNTE1Nkw1NjQuODEyNSw5NTMuMjcxODgxMTAzNTE1Nkw1NjQuODEyNSw5MTAuMTMxMjU2MTAzNTE1Nkw1NjQuODEyNSw4NjYuOTkwNjMxMTAzNTE1Nkw1NjQuODEyNSw4MTUuNzA5MzgxMTAzNTE1Nkw1NjQuODEyNSw2NjguMjY4NzUzMDUxNzU3OEw1NjQuODEyNSw1MjguOTY4NzVMNDE3LjkxNzk2ODc1LDUwMS45MjE3OTg0MTMyNDc1MyIgbWFya2VyLWVuZD0idXJsKCNhcnJvd2hlYWQyODkpIiBzdHlsZT0ic3Ryb2tlOiAjMzMzOyBzdHJva2Utd2lkdGg6IDEuNXB4O2ZpbGw6bm9uZSI+PC9wYXRoPjxkZWZzPjxtYXJrZXIgaWQ9ImFycm93aGVhZDI4OSIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI5IiByZWZZPSI1IiBtYXJrZXJVbml0cz0ic3Ryb2tlV2lkdGgiIG1hcmtlcldpZHRoPSI4IiBtYXJrZXJIZWlnaHQ9IjYiIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTSAwIDAgTCAxMCA1IEwgMCAxMCB6IiBjbGFzcz0iYXJyb3doZWFkUGF0aCIgc3R5bGU9InN0cm9rZS13aWR0aDogMXB4OyBzdHJva2UtZGFzaGFycmF5OiAxcHgsIDBweDsiPjwvcGF0aD48L21hcmtlcj48L2RlZnM+PC9nPjxnIGNsYXNzPSJlZGdlUGF0aCIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48cGF0aCBjbGFzcz0icGF0aCIgZD0iTTM3Ni4xMTcxODc1LDg4NS4xMzEyNTYxMDM1MTU2TDM3Ni4xMTcxODc1LDkxMC4xMzEyNTYxMDM1MTU2TDM3Ni4xMTcxODc1LDkzNS4xMzEyNTYxMDM1MTU2IiBtYXJrZXItZW5kPSJ1cmwoI2Fycm93aGVhZDI5MCkiIHN0eWxlPSJzdHJva2U6ICMzMzM7IHN0cm9rZS13aWR0aDogMS41cHg7ZmlsbDpub25lIj48L3BhdGg+PGRlZnM+PG1hcmtlciBpZD0iYXJyb3doZWFkMjkwIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlclVuaXRzPSJzdHJva2VXaWR0aCIgbWFya2VyV2lkdGg9IjgiIG1hcmtlckhlaWdodD0iNiIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNIDAgMCBMIDEwIDUgTCAwIDEwIHoiIGNsYXNzPSJhcnJvd2hlYWRQYXRoIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxcHg7IHN0cm9rZS1kYXNoYXJyYXk6IDFweCwgMHB4OyI+PC9wYXRoPjwvbWFya2VyPjwvZGVmcz48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWxzIj48ZyBjbGFzcz0iZWRnZUxhYmVsIiBzdHlsZT0ib3BhY2l0eTogMTsiIHRyYW5zZm9ybT0iIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDApIiBjbGFzcz0ibGFiZWwiPjxyZWN0IHJ4PSIwIiByeT0iMCIgd2lkdGg9IjAiIGhlaWdodD0iMCIgc3R5bGU9ImZpbGw6I2U4ZThlODsiPjwvcmVjdD48dGV4dD48dHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZHk9IjFlbSIgeD0iMSI+PC90c3Bhbj48L3RleHQ+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVsIiBzdHlsZT0ib3BhY2l0eTogMTsiIHRyYW5zZm9ybT0iIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDApIiBjbGFzcz0ibGFiZWwiPjxyZWN0IHJ4PSIwIiByeT0iMCIgd2lkdGg9IjAiIGhlaWdodD0iMCIgc3R5bGU9ImZpbGw6I2U4ZThlODsiPjwvcmVjdD48dGV4dD48dHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZHk9IjFlbSIgeD0iMSI+PC90c3Bhbj48L3RleHQ+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVsIiBzdHlsZT0ib3BhY2l0eTogMTsiIHRyYW5zZm9ybT0iIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDApIiBjbGFzcz0ibGFiZWwiPjxyZWN0IHJ4PSIwIiByeT0iMCIgd2lkdGg9IjAiIGhlaWdodD0iMCIgc3R5bGU9ImZpbGw6I2U4ZThlODsiPjwvcmVjdD48dGV4dD48dHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZHk9IjFlbSIgeD0iMSI+PC90c3Bhbj48L3RleHQ+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVsIiBzdHlsZT0ib3BhY2l0eTogMTsiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMzMC41MTE3MTg3NSwzNDguMjY1NjI1KSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQwLjY2NDA2MjUsLTguMDA3ODEyNSkiIGNsYXNzPSJsYWJlbCI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB3aWR0aD0iNTcuMjk2ODc1IiBoZWlnaHQ9IjE1Ljg3NSIgc3R5bGU9ImZpbGw6I2U4ZThlODsiPjwvcmVjdD48dGV4dD48dHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZHk9IjFlbSIgeD0iMSI+aXMgU0VMaW51eDwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCIgc3R5bGU9Im9wYWNpdHk6IDE7IiB0cmFuc2Zvcm09IiI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSIgY2xhc3M9ImxhYmVsIj48cmVjdCByeD0iMCIgcnk9IjAiIHdpZHRoPSIwIiBoZWlnaHQ9IjAiIHN0eWxlPSJmaWxsOiNlOGU4ZTg7Ij48L3JlY3Q+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPjwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCIgc3R5bGU9Im9wYWNpdHk6IDE7IiB0cmFuc2Zvcm09IiI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSIgY2xhc3M9ImxhYmVsIj48cmVjdCByeD0iMCIgcnk9IjAiIHdpZHRoPSIwIiBoZWlnaHQ9IjAiIHN0eWxlPSJmaWxsOiNlOGU4ZTg7Ij48L3JlY3Q+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPjwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCIgc3R5bGU9Im9wYWNpdHk6IDE7IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg5Ni4yMTA5Mzc1LDgxNS43MDkzODExMDM1MTU2KSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQuMjAzMTI1LC04LjAwNzgxMjUpIiBjbGFzcz0ibGFiZWwiPjxyZWN0IHJ4PSIwIiByeT0iMCIgd2lkdGg9IjguNzE4NzUiIGhlaWdodD0iMTUuODc1IiBzdHlsZT0iZmlsbDojZThlOGU4OyI+PC9yZWN0Pjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj5OPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48ZyBjbGFzcz0iZWRnZUxhYmVsIiBzdHlsZT0ib3BhY2l0eTogMTsiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDM3Ni4xMTcxODc1LDgxNS43MDkzODExMDM1MTU2KSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQuMjAzMTI1LC04LjAwNzgxMjUpIiBjbGFzcz0ibGFiZWwiPjxyZWN0IHJ4PSIwIiByeT0iMCIgd2lkdGg9IjcuNzk2ODc1IiBoZWlnaHQ9IjE1Ljg3NSIgc3R5bGU9ImZpbGw6I2U4ZThlODsiPjwvcmVjdD48dGV4dD48dHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZHk9IjFlbSIgeD0iMSI+WTwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCIgc3R5bGU9Im9wYWNpdHk6IDE7IiB0cmFuc2Zvcm09IiI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSIgY2xhc3M9ImxhYmVsIj48cmVjdCByeD0iMCIgcnk9IjAiIHdpZHRoPSIwIiBoZWlnaHQ9IjAiIHN0eWxlPSJmaWxsOiNlOGU4ZTg7Ij48L3JlY3Q+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPjwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCIgc3R5bGU9Im9wYWNpdHk6IDE7IiB0cmFuc2Zvcm09IiI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSIgY2xhc3M9ImxhYmVsIj48cmVjdCByeD0iMCIgcnk9IjAiIHdpZHRoPSIwIiBoZWlnaHQ9IjAiIHN0eWxlPSJmaWxsOiNlOGU4ZTg7Ij48L3JlY3Q+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPjwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCIgc3R5bGU9Im9wYWNpdHk6IDE7IiB0cmFuc2Zvcm09IiI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSIgY2xhc3M9ImxhYmVsIj48cmVjdCByeD0iMCIgcnk9IjAiIHdpZHRoPSIwIiBoZWlnaHQ9IjAiIHN0eWxlPSJmaWxsOiNlOGU4ZTg7Ij48L3JlY3Q+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPjwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbCIgc3R5bGU9Im9wYWNpdHk6IDE7IiB0cmFuc2Zvcm09IiI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSIgY2xhc3M9ImxhYmVsIj48cmVjdCByeD0iMCIgcnk9IjAiIHdpZHRoPSIwIiBoZWlnaHQ9IjAiIHN0eWxlPSJmaWxsOiNlOGU4ZTg7Ij48L3JlY3Q+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPjwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PC9nPjxnIGNsYXNzPSJub2RlcyI+PGcgY2xhc3M9Im5vZGUiIHN0eWxlPSJvcGFjaXR5OiAxOyIgaWQ9IkEiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMzMC41MTE3MTg3NSwzOC4xNDA2MjUpIj48cmVjdCByeD0iMCIgcnk9IjAiIHg9Ii0yOC40NTMxMjUiIHk9Ii0xOC4xNDA2MjUiIHdpZHRoPSI1Ni45MDYyNSIgaGVpZ2h0PSIzNi4yODEyNSI+PC9yZWN0PjxnIGNsYXNzPSJsYWJlbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE4LjQ1MzEyNSwtOC4xNDA2MjUpIj48dGV4dD48dHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZHk9IjFlbSIgeD0iMSI+ZF9hZGQ8L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48ZyBjbGFzcz0ibm9kZSIgc3R5bGU9Im9wYWNpdHk6IDE7IiBpZD0iQiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzMwLjUxMTcxODc1LDEyNC40MjE4NzUpIj48cmVjdCByeD0iMCIgcnk9IjAiIHg9Ii03Ni45NTMxMjUiIHk9Ii0xOC4xNDA2MjUiIHdpZHRoPSIxNTMuOTA2MjUiIGhlaWdodD0iMzYuMjgxMjUiPjwvcmVjdD48ZyBjbGFzcz0ibGFiZWwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC02Ni45NTMxMjUsLTguMTQwNjI1KSI+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPnNlY3VyaXR5X2RfaW5zdGFudGlhdGU8L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48ZyBjbGFzcz0ibm9kZSIgc3R5bGU9Im9wYWNpdHk6IDE7IiBpZD0iQyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzMwLjUxMTcxODc1LDIxMC43MDMxMjUpIj48cmVjdCByeD0iMCIgcnk9IjAiIHg9Ii0xMDguNzM0Mzc1IiB5PSItMTguMTQwNjI1IiB3aWR0aD0iMjE3LjQ2ODc1IiBoZWlnaHQ9IjM2LjI4MTI1Ij48L3JlY3Q+PGcgY2xhc3M9ImxhYmVsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDApIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtOTguNzM0Mzc1LC04LjE0MDYyNSkiPjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj5jYWxsX3ZvaWRfaG9vayhkX2luc3RhbnRpYXRlLC4uLik8L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48ZyBjbGFzcz0ibm9kZSIgc3R5bGU9Im9wYWNpdHk6IDE7IiBpZD0iRCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzMwLjUxMTcxODc1LDI5Ni45ODQzNzUpIj48cmVjdCByeD0iMCIgcnk9IjAiIHg9Ii0xMjUuNTkzNzUiIHk9Ii0xOC4xNDA2MjUiIHdpZHRoPSIyNTEuMTg3NSIgaGVpZ2h0PSIzNi4yODEyNSI+PC9yZWN0PjxnIGNsYXNzPSJsYWJlbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTExNS41OTM3NSwtOC4xNDA2MjUpIj48dGV4dD48dHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZHk9IjFlbSIgeD0iMSI+Y2FsbCBlYWNoIGhvb2sgb24gbGlzdCBmb3IgZF9pbnN0YW50aWF0ZTwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PC9nPjxnIGNsYXNzPSJub2RlIiBzdHlsZT0ib3BhY2l0eTogMTsiIGlkPSJFIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzMzAuNTExNzE4NzUsMzk5LjU0Njg3NSkiPjxyZWN0IHJ4PSIwIiByeT0iMCIgeD0iLTc0LjA4NTkzNzUiIHk9Ii0xOC4xNDA2MjUiIHdpZHRoPSIxNDguMTcxODc1IiBoZWlnaHQ9IjM2LjI4MTI1Ij48L3JlY3Q+PGcgY2xhc3M9ImxhYmVsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDApIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNjQuMDg1OTM3NSwtOC4xNDA2MjUpIj48dGV4dD48dHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZHk9IjFlbSIgeD0iMSI+c2VsaW51eF9kX2luc3RhbnRpYXRlPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PGcgY2xhc3M9Im5vZGUiIHN0eWxlPSJvcGFjaXR5OiAxOyIgaWQ9IkYiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMzMC41MTE3MTg3NSw0ODUuODI4MTI1KSI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB4PSItODcuNDA2MjUiIHk9Ii0xOC4xNDA2MjUiIHdpZHRoPSIxNzQuODEyNSIgaGVpZ2h0PSIzNi4yODEyNSI+PC9yZWN0PjxnIGNsYXNzPSJsYWJlbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTc3LjQwNjI1LC04LjE0MDYyNSkiPjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj5pbm9kZV9kb2luaXRfd2l0aF9kZW50cnk8L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48ZyBjbGFzcz0ibm9kZSIgc3R5bGU9Im9wYWNpdHk6IDE7IiBpZD0iRyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjM2LjE2NDA2MjUsNjY4LjI2ODc1MzA1MTc1NzgpIj48cG9seWdvbiBwb2ludHM9IjExNC4zLDAgMjI4LjYsLTExNC4zIDExNC4zLC0yMjguNiAwLC0xMTQuMyIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTE0LjMsMTE0LjMpIj48L3BvbHlnb24+PGcgY2xhc3M9ImxhYmVsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDApIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtOTguODU5Mzc1LC04LjE0MDYyNSkiPjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj5zYnNlYy0mZ3Q7ZmxhZ3MgJmFtcDsgU0VfU0JJTklUSUFMSVpFRD88L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48ZyBjbGFzcz0ibm9kZSIgc3R5bGU9Im9wYWNpdHk6IDE7IiBpZD0iSCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOTYuMjEwOTM3NSw4NjYuOTkwNjMxMTAzNTE1NikiPjxyZWN0IHJ4PSIwIiByeT0iMCIgeD0iLTQ1LjY4NzUiIHk9Ii0xOC4xNDA2MjUiIHdpZHRoPSI5MS4zNzUiIGhlaWdodD0iMzYuMjgxMjUiPjwvcmVjdD48ZyBjbGFzcz0ibGFiZWwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zNS42ODc1LC04LjE0MDYyNSkiPjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj5kZWxheWVkIGluaXQ8L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48ZyBjbGFzcz0ibm9kZSIgc3R5bGU9Im9wYWNpdHk6IDE7IiBpZD0iSyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzc2LjExNzE4NzUsODY2Ljk5MDYzMTEwMzUxNTYpIj48cmVjdCByeD0iMCIgcnk9IjAiIHg9Ii00My4xMDE1NjI1IiB5PSItMTguMTQwNjI1IiB3aWR0aD0iODYuMjAzMTI1IiBoZWlnaHQ9IjM2LjI4MTI1Ij48L3JlY3Q+PGcgY2xhc3M9ImxhYmVsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDApIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMzMuMTAxNTYyNSwtOC4xNDA2MjUpIj48dGV4dD48dHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZHk9IjFlbSIgeD0iMSI+ZG8gcmVhbCBpbml0PC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PGcgY2xhc3M9Im5vZGUiIHN0eWxlPSJvcGFjaXR5OiAxOyIgaWQ9IkkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDk2LjIxMDkzNzUsOTUzLjI3MTg4MTEwMzUxNTYpIj48cmVjdCByeD0iMCIgcnk9IjAiIHg9Ii03Ni4yMTA5Mzc1IiB5PSItMTguMTQwNjI1IiB3aWR0aD0iMTUyLjQyMTg3NSIgaGVpZ2h0PSIzNi4yODEyNSI+PC9yZWN0PjxnIGNsYXNzPSJsYWJlbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTY2LjIxMDkzNzUsLTguMTQwNjI1KSI+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPnNlbGludXhfY29tcGxldGVfaW5pdDwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PC9nPjxnIGNsYXNzPSJub2RlIiBzdHlsZT0ib3BhY2l0eTogMTsiIGlkPSJKIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzMzAuNTExNzE4NzUsMTAzOS41NTMxMzExMDM1MTU2KSI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB4PSItMTA4LjY4NzUiIHk9Ii0xOC4xNDA2MjUiIHdpZHRoPSIyMTcuMzc1IiBoZWlnaHQ9IjM2LjI4MTI1Ij48L3JlY3Q+PGcgY2xhc3M9ImxhYmVsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDApIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtOTguNjg3NSwtOC4xNDA2MjUpIj48dGV4dD48dHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZHk9IjFlbSIgeD0iMSI+c2JzZWMtJmd0O2ZsYWdzIHw9IFNFX1NCSU5JVElBTElaRUQ8L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48ZyBjbGFzcz0ibm9kZSIgc3R5bGU9Im9wYWNpdHk6IDE7IiBpZD0iTCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzc2LjExNzE4NzUsOTUzLjI3MTg4MTEwMzUxNTYpIj48cmVjdCByeD0iMCIgcnk9IjAiIHg9Ii0xNTMuNjk1MzEyNSIgeT0iLTE4LjE0MDYyNSIgd2lkdGg9IjMwNy4zOTA2MjUiIGhlaWdodD0iMzYuMjgxMjUiPjwvcmVjdD48ZyBjbGFzcz0ibGFiZWwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xNDMuNjk1MzEyNSwtOC4xNDA2MjUpIj48dGV4dD48dHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZHk9IjFlbSIgeD0iMSI+5qC55o2uc2JzZWMtJmd0O2JlaGF2aW9yKeehruWummlub2RlLSZndDtpX3NlY3VyaXR5LSZndDtzaWQ8L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9nPjwvZz48L3N2Zz4=

selinuxfs文件的SID最终由inode_doinit_with_dentry赋值。inode_doinit_with_dentry被执行了两遍,第一遍由最初的初始化函数__init init_sel_fs发起,但因为此时策略还没加载,所以需要一个delayed init,第二遍调用由selinux_complete_init发起,最终进入inode_doinit_with_dentry完成selinuxfs SID最终的初始化。流程大致如下:

PHN2ZyBpZD0iZGd0aDJxbzRjczIiIHdpZHRoPSIxMDAlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXgtd2lkdGg6IDE5MC44MTI1cHg7IiB2aWV3Qm94PSIwIDAgMTkwLjgxMjUgNDgzLjY4NzUiPjxzdHlsZT4KCgojZGd0aDJxbzRjczIgLmxhYmVsIHsKICBmb250LWZhbWlseTogJ3RyZWJ1Y2hldCBtcycsIHZlcmRhbmEsIGFyaWFsOwogIGNvbG9yOiAjMzMzOyB9CgojZGd0aDJxbzRjczIgLm5vZGUgcmVjdCwKI2RndGgycW80Y3MyIC5ub2RlIGNpcmNsZSwKI2RndGgycW80Y3MyIC5ub2RlIGVsbGlwc2UsCiNkZ3RoMnFvNGNzMiAubm9kZSBwb2x5Z29uIHsKICBmaWxsOiAjRUNFQ0ZGOwogIHN0cm9rZTogIzkzNzBEQjsKICBzdHJva2Utd2lkdGg6IDFweDsgfQoKI2RndGgycW80Y3MyIC5ub2RlLmNsaWNrYWJsZSB7CiAgY3Vyc29yOiBwb2ludGVyOyB9CgojZGd0aDJxbzRjczIgLmFycm93aGVhZFBhdGggewogIGZpbGw6ICMzMzMzMzM7IH0KCiNkZ3RoMnFvNGNzMiAuZWRnZVBhdGggLnBhdGggewogIHN0cm9rZTogIzMzMzMzMzsKICBzdHJva2Utd2lkdGg6IDEuNXB4OyB9CgojZGd0aDJxbzRjczIgLmVkZ2VMYWJlbCB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2U4ZThlODsgfQoKI2RndGgycW80Y3MyIC5jbHVzdGVyIHJlY3QgewogIGZpbGw6ICNmZmZmZGUgIWltcG9ydGFudDsKICBzdHJva2U6ICNhYWFhMzMgIWltcG9ydGFudDsKICBzdHJva2Utd2lkdGg6IDFweCAhaW1wb3J0YW50OyB9CgojZGd0aDJxbzRjczIgLmNsdXN0ZXIgdGV4dCB7CiAgZmlsbDogIzMzMzsgfQoKI2RndGgycW80Y3MyIGRpdi5tZXJtYWlkVG9vbHRpcCB7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBtYXgtd2lkdGg6IDIwMHB4OwogIHBhZGRpbmc6IDJweDsKICBmb250LWZhbWlseTogJ3RyZWJ1Y2hldCBtcycsIHZlcmRhbmEsIGFyaWFsOwogIGZvbnQtc2l6ZTogMTJweDsKICBiYWNrZ3JvdW5kOiAjZmZmZmRlOwogIGJvcmRlcjogMXB4IHNvbGlkICNhYWFhMzM7CiAgYm9yZGVyLXJhZGl1czogMnB4OwogIHBvaW50ZXItZXZlbnRzOiBub25lOwogIHotaW5kZXg6IDEwMDsgfQoKI2RndGgycW80Y3MyIC5hY3RvciB7CiAgc3Ryb2tlOiAjQ0NDQ0ZGOwogIGZpbGw6ICNFQ0VDRkY7IH0KCiNkZ3RoMnFvNGNzMiB0ZXh0LmFjdG9yIHsKICBmaWxsOiBibGFjazsKICBzdHJva2U6IG5vbmU7IH0KCiNkZ3RoMnFvNGNzMiAuYWN0b3ItbGluZSB7CiAgc3Ryb2tlOiBncmV5OyB9CgojZGd0aDJxbzRjczIgLm1lc3NhZ2VMaW5lMCB7CiAgc3Ryb2tlLXdpZHRoOiAxLjU7CiAgc3Ryb2tlLWRhc2hhcnJheTogJzIgMic7CiAgc3Ryb2tlOiAjMzMzOyB9CgojZGd0aDJxbzRjczIgLm1lc3NhZ2VMaW5lMSB7CiAgc3Ryb2tlLXdpZHRoOiAxLjU7CiAgc3Ryb2tlLWRhc2hhcnJheTogJzIgMic7CiAgc3Ryb2tlOiAjMzMzOyB9CgojZGd0aDJxbzRjczIgI2Fycm93aGVhZCB7CiAgZmlsbDogIzMzMzsgfQoKI2RndGgycW80Y3MyICNjcm9zc2hlYWQgcGF0aCB7CiAgZmlsbDogIzMzMyAhaW1wb3J0YW50OwogIHN0cm9rZTogIzMzMyAhaW1wb3J0YW50OyB9CgojZGd0aDJxbzRjczIgLm1lc3NhZ2VUZXh0IHsKICBmaWxsOiAjMzMzOwogIHN0cm9rZTogbm9uZTsgfQoKI2RndGgycW80Y3MyIC5sYWJlbEJveCB7CiAgc3Ryb2tlOiAjQ0NDQ0ZGOwogIGZpbGw6ICNFQ0VDRkY7IH0KCiNkZ3RoMnFvNGNzMiAubGFiZWxUZXh0IHsKICBmaWxsOiBibGFjazsKICBzdHJva2U6IG5vbmU7IH0KCiNkZ3RoMnFvNGNzMiAubG9vcFRleHQgewogIGZpbGw6IGJsYWNrOwogIHN0cm9rZTogbm9uZTsgfQoKI2RndGgycW80Y3MyIC5sb29wTGluZSB7CiAgc3Ryb2tlLXdpZHRoOiAyOwogIHN0cm9rZS1kYXNoYXJyYXk6ICcyIDInOwogIHN0cm9rZTogI0NDQ0NGRjsgfQoKI2RndGgycW80Y3MyIC5ub3RlIHsKICBzdHJva2U6ICNhYWFhMzM7CiAgZmlsbDogI2ZmZjVhZDsgfQoKI2RndGgycW80Y3MyIC5ub3RlVGV4dCB7CiAgZmlsbDogYmxhY2s7CiAgc3Ryb2tlOiBub25lOwogIGZvbnQtZmFtaWx5OiAndHJlYnVjaGV0IG1zJywgdmVyZGFuYSwgYXJpYWw7CiAgZm9udC1zaXplOiAxNHB4OyB9CgojZGd0aDJxbzRjczIgLmFjdGl2YXRpb24wIHsKICBmaWxsOiAjZjRmNGY0OwogIHN0cm9rZTogIzY2NjsgfQoKI2RndGgycW80Y3MyIC5hY3RpdmF0aW9uMSB7CiAgZmlsbDogI2Y0ZjRmNDsKICBzdHJva2U6ICM2NjY7IH0KCiNkZ3RoMnFvNGNzMiAuYWN0aXZhdGlvbjIgewogIGZpbGw6ICNmNGY0ZjQ7CiAgc3Ryb2tlOiAjNjY2OyB9CgoKI2RndGgycW80Y3MyIC5zZWN0aW9uIHsKICBzdHJva2U6IG5vbmU7CiAgb3BhY2l0eTogMC4yOyB9CgojZGd0aDJxbzRjczIgLnNlY3Rpb24wIHsKICBmaWxsOiByZ2JhKDEwMiwgMTAyLCAyNTUsIDAuNDkpOyB9CgojZGd0aDJxbzRjczIgLnNlY3Rpb24yIHsKICBmaWxsOiAjZmZmNDAwOyB9CgojZGd0aDJxbzRjczIgLnNlY3Rpb24xLAojZGd0aDJxbzRjczIgLnNlY3Rpb24zIHsKICBmaWxsOiB3aGl0ZTsKICBvcGFjaXR5OiAwLjI7IH0KCiNkZ3RoMnFvNGNzMiAuc2VjdGlvblRpdGxlMCB7CiAgZmlsbDogIzMzMzsgfQoKI2RndGgycW80Y3MyIC5zZWN0aW9uVGl0bGUxIHsKICBmaWxsOiAjMzMzOyB9CgojZGd0aDJxbzRjczIgLnNlY3Rpb25UaXRsZTIgewogIGZpbGw6ICMzMzM7IH0KCiNkZ3RoMnFvNGNzMiAuc2VjdGlvblRpdGxlMyB7CiAgZmlsbDogIzMzMzsgfQoKI2RndGgycW80Y3MyIC5zZWN0aW9uVGl0bGUgewogIHRleHQtYW5jaG9yOiBzdGFydDsKICBmb250LXNpemU6IDExcHg7CiAgdGV4dC1oZWlnaHQ6IDE0cHg7IH0KCgojZGd0aDJxbzRjczIgLmdyaWQgLnRpY2sgewogIHN0cm9rZTogbGlnaHRncmV5OwogIG9wYWNpdHk6IDAuMzsKICBzaGFwZS1yZW5kZXJpbmc6IGNyaXNwRWRnZXM7IH0KCiNkZ3RoMnFvNGNzMiAuZ3JpZCBwYXRoIHsKICBzdHJva2Utd2lkdGg6IDA7IH0KCgojZGd0aDJxbzRjczIgLnRvZGF5IHsKICBmaWxsOiBub25lOwogIHN0cm9rZTogcmVkOwogIHN0cm9rZS13aWR0aDogMnB4OyB9CgoKCiNkZ3RoMnFvNGNzMiAudGFzayB7CiAgc3Ryb2tlLXdpZHRoOiAyOyB9CgojZGd0aDJxbzRjczIgLnRhc2tUZXh0IHsKICB0ZXh0LWFuY2hvcjogbWlkZGxlOwogIGZvbnQtc2l6ZTogMTFweDsgfQoKI2RndGgycW80Y3MyIC50YXNrVGV4dE91dHNpZGVSaWdodCB7CiAgZmlsbDogYmxhY2s7CiAgdGV4dC1hbmNob3I6IHN0YXJ0OwogIGZvbnQtc2l6ZTogMTFweDsgfQoKI2RndGgycW80Y3MyIC50YXNrVGV4dE91dHNpZGVMZWZ0IHsKICBmaWxsOiBibGFjazsKICB0ZXh0LWFuY2hvcjogZW5kOwogIGZvbnQtc2l6ZTogMTFweDsgfQoKCiNkZ3RoMnFvNGNzMiAudGFza1RleHQwLAojZGd0aDJxbzRjczIgLnRhc2tUZXh0MSwKI2RndGgycW80Y3MyIC50YXNrVGV4dDIsCiNkZ3RoMnFvNGNzMiAudGFza1RleHQzIHsKICBmaWxsOiB3aGl0ZTsgfQoKI2RndGgycW80Y3MyIC50YXNrMCwKI2RndGgycW80Y3MyIC50YXNrMSwKI2RndGgycW80Y3MyIC50YXNrMiwKI2RndGgycW80Y3MyIC50YXNrMyB7CiAgZmlsbDogIzhhOTBkZDsKICBzdHJva2U6ICM1MzRmYmM7IH0KCiNkZ3RoMnFvNGNzMiAudGFza1RleHRPdXRzaWRlMCwKI2RndGgycW80Y3MyIC50YXNrVGV4dE91dHNpZGUyIHsKICBmaWxsOiBibGFjazsgfQoKI2RndGgycW80Y3MyIC50YXNrVGV4dE91dHNpZGUxLAojZGd0aDJxbzRjczIgLnRhc2tUZXh0T3V0c2lkZTMgewogIGZpbGw6IGJsYWNrOyB9CgoKI2RndGgycW80Y3MyIC5hY3RpdmUwLAojZGd0aDJxbzRjczIgLmFjdGl2ZTEsCiNkZ3RoMnFvNGNzMiAuYWN0aXZlMiwKI2RndGgycW80Y3MyIC5hY3RpdmUzIHsKICBmaWxsOiAjYmZjN2ZmOwogIHN0cm9rZTogIzUzNGZiYzsgfQoKI2RndGgycW80Y3MyIC5hY3RpdmVUZXh0MCwKI2RndGgycW80Y3MyIC5hY3RpdmVUZXh0MSwKI2RndGgycW80Y3MyIC5hY3RpdmVUZXh0MiwKI2RndGgycW80Y3MyIC5hY3RpdmVUZXh0MyB7CiAgZmlsbDogYmxhY2sgIWltcG9ydGFudDsgfQoKCiNkZ3RoMnFvNGNzMiAuZG9uZTAsCiNkZ3RoMnFvNGNzMiAuZG9uZTEsCiNkZ3RoMnFvNGNzMiAuZG9uZTIsCiNkZ3RoMnFvNGNzMiAuZG9uZTMgewogIHN0cm9rZTogZ3JleTsKICBmaWxsOiBsaWdodGdyZXk7CiAgc3Ryb2tlLXdpZHRoOiAyOyB9CgojZGd0aDJxbzRjczIgLmRvbmVUZXh0MCwKI2RndGgycW80Y3MyIC5kb25lVGV4dDEsCiNkZ3RoMnFvNGNzMiAuZG9uZVRleHQyLAojZGd0aDJxbzRjczIgLmRvbmVUZXh0MyB7CiAgZmlsbDogYmxhY2sgIWltcG9ydGFudDsgfQoKCiNkZ3RoMnFvNGNzMiAuY3JpdDAsCiNkZ3RoMnFvNGNzMiAuY3JpdDEsCiNkZ3RoMnFvNGNzMiAuY3JpdDIsCiNkZ3RoMnFvNGNzMiAuY3JpdDMgewogIHN0cm9rZTogI2ZmODg4ODsKICBmaWxsOiByZWQ7CiAgc3Ryb2tlLXdpZHRoOiAyOyB9CgojZGd0aDJxbzRjczIgLmFjdGl2ZUNyaXQwLAojZGd0aDJxbzRjczIgLmFjdGl2ZUNyaXQxLAojZGd0aDJxbzRjczIgLmFjdGl2ZUNyaXQyLAojZGd0aDJxbzRjczIgLmFjdGl2ZUNyaXQzIHsKICBzdHJva2U6ICNmZjg4ODg7CiAgZmlsbDogI2JmYzdmZjsKICBzdHJva2Utd2lkdGg6IDI7IH0KCiNkZ3RoMnFvNGNzMiAuZG9uZUNyaXQwLAojZGd0aDJxbzRjczIgLmRvbmVDcml0MSwKI2RndGgycW80Y3MyIC5kb25lQ3JpdDIsCiNkZ3RoMnFvNGNzMiAuZG9uZUNyaXQzIHsKICBzdHJva2U6ICNmZjg4ODg7CiAgZmlsbDogbGlnaHRncmV5OwogIHN0cm9rZS13aWR0aDogMjsKICBjdXJzb3I6IHBvaW50ZXI7CiAgc2hhcGUtcmVuZGVyaW5nOiBjcmlzcEVkZ2VzOyB9CgojZGd0aDJxbzRjczIgLmRvbmVDcml0VGV4dDAsCiNkZ3RoMnFvNGNzMiAuZG9uZUNyaXRUZXh0MSwKI2RndGgycW80Y3MyIC5kb25lQ3JpdFRleHQyLAojZGd0aDJxbzRjczIgLmRvbmVDcml0VGV4dDMgewogIGZpbGw6IGJsYWNrICFpbXBvcnRhbnQ7IH0KCiNkZ3RoMnFvNGNzMiAuYWN0aXZlQ3JpdFRleHQwLAojZGd0aDJxbzRjczIgLmFjdGl2ZUNyaXRUZXh0MSwKI2RndGgycW80Y3MyIC5hY3RpdmVDcml0VGV4dDIsCiNkZ3RoMnFvNGNzMiAuYWN0aXZlQ3JpdFRleHQzIHsKICBmaWxsOiBibGFjayAhaW1wb3J0YW50OyB9CgojZGd0aDJxbzRjczIgLnRpdGxlVGV4dCB7CiAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICBmb250LXNpemU6IDE4cHg7CiAgZmlsbDogYmxhY2s7IH0KCiNkZ3RoMnFvNGNzMiBnLmNsYXNzR3JvdXAgdGV4dCB7CiAgZmlsbDogIzkzNzBEQjsKICBzdHJva2U6IG5vbmU7CiAgZm9udC1mYW1pbHk6ICd0cmVidWNoZXQgbXMnLCB2ZXJkYW5hLCBhcmlhbDsKICBmb250LXNpemU6IDEwcHg7IH0KCiNkZ3RoMnFvNGNzMiBnLmNsYXNzR3JvdXAgcmVjdCB7CiAgZmlsbDogI0VDRUNGRjsKICBzdHJva2U6ICM5MzcwREI7IH0KCiNkZ3RoMnFvNGNzMiBnLmNsYXNzR3JvdXAgbGluZSB7CiAgc3Ryb2tlOiAjOTM3MERCOwogIHN0cm9rZS13aWR0aDogMTsgfQoKI2RndGgycW80Y3MyIC5jbGFzc0xhYmVsIC5ib3ggewogIHN0cm9rZTogbm9uZTsKICBzdHJva2Utd2lkdGg6IDA7CiAgZmlsbDogI0VDRUNGRjsKICBvcGFjaXR5OiAwLjU7IH0KCiNkZ3RoMnFvNGNzMiAuY2xhc3NMYWJlbCAubGFiZWwgewogIGZpbGw6ICM5MzcwREI7CiAgZm9udC1zaXplOiAxMHB4OyB9CgojZGd0aDJxbzRjczIgLnJlbGF0aW9uIHsKICBzdHJva2U6ICM5MzcwREI7CiAgc3Ryb2tlLXdpZHRoOiAxOwogIGZpbGw6IG5vbmU7IH0KCiNkZ3RoMnFvNGNzMiAjY29tcG9zaXRpb25TdGFydCB7CiAgZmlsbDogIzkzNzBEQjsKICBzdHJva2U6ICM5MzcwREI7CiAgc3Ryb2tlLXdpZHRoOiAxOyB9CgojZGd0aDJxbzRjczIgI2NvbXBvc2l0aW9uRW5kIHsKICBmaWxsOiAjOTM3MERCOwogIHN0cm9rZTogIzkzNzBEQjsKICBzdHJva2Utd2lkdGg6IDE7IH0KCiNkZ3RoMnFvNGNzMiAjYWdncmVnYXRpb25TdGFydCB7CiAgZmlsbDogI0VDRUNGRjsKICBzdHJva2U6ICM5MzcwREI7CiAgc3Ryb2tlLXdpZHRoOiAxOyB9CgojZGd0aDJxbzRjczIgI2FnZ3JlZ2F0aW9uRW5kIHsKICBmaWxsOiAjRUNFQ0ZGOwogIHN0cm9rZTogIzkzNzBEQjsKICBzdHJva2Utd2lkdGg6IDE7IH0KCiNkZ3RoMnFvNGNzMiAjZGVwZW5kZW5jeVN0YXJ0IHsKICBmaWxsOiAjOTM3MERCOwogIHN0cm9rZTogIzkzNzBEQjsKICBzdHJva2Utd2lkdGg6IDE7IH0KCiNkZ3RoMnFvNGNzMiAjZGVwZW5kZW5jeUVuZCB7CiAgZmlsbDogIzkzNzBEQjsKICBzdHJva2U6ICM5MzcwREI7CiAgc3Ryb2tlLXdpZHRoOiAxOyB9CgojZGd0aDJxbzRjczIgI2V4dGVuc2lvblN0YXJ0IHsKICBmaWxsOiAjOTM3MERCOwogIHN0cm9rZTogIzkzNzBEQjsKICBzdHJva2Utd2lkdGg6IDE7IH0KCiNkZ3RoMnFvNGNzMiAjZXh0ZW5zaW9uRW5kIHsKICBmaWxsOiAjOTM3MERCOwogIHN0cm9rZTogIzkzNzBEQjsKICBzdHJva2Utd2lkdGg6IDE7IH0KCiNkZ3RoMnFvNGNzMiAuY29tbWl0LWlkLAojZGd0aDJxbzRjczIgLmNvbW1pdC1tc2csCiNkZ3RoMnFvNGNzMiAuYnJhbmNoLWxhYmVsIHsKICBmaWxsOiBsaWdodGdyZXk7CiAgY29sb3I6IGxpZ2h0Z3JleTsgfQoKCgojZGd0aDJxbzRjczIgLmxhYmVsewogIGNvbG9yOiMxOEIxNEU7Cn0KI2RndGgycW80Y3MyIC50ZS1tZC1jb250YWluZXItLWRhcmsgLm5vZGUgcmVjdCB7CiAgZmlsbDogcmVkOwp9CgojZGd0aDJxbzRjczIgLm5vZGUgcmVjdCwKI2RndGgycW80Y3MyIC5ub2RlIGNpcmNsZSwKI2RndGgycW80Y3MyIC5ub2RlIGVsbGlwc2UsCiNkZ3RoMnFvNGNzMiAubm9kZSBwb2x5Z29uIHsKICBmaWxsOiAjRjlGRkZCOzsKICBzdHJva2U6ICMyREJENjA7CiAgc3Ryb2tlLXdpZHRoOiAxLjVweDsKfQojZGd0aDJxbzRjczIgLmFycm93aGVhZFBhdGh7CiAgZmlsbDogIzJEQkQ2MDsKfQojZGd0aDJxbzRjczIgLmVkZ2VQYXRoIC5wYXRoIHsKICBzdHJva2U6ICMyREJENjA7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7Cn0KI2RndGgycW80Y3MyIC5lZGdlTGFiZWwgewogIGJhY2tncm91bmQtY29sb3I6ICNmZmY7Cn0KI2RndGgycW80Y3MyIC5jbHVzdGVyIHJlY3QgewogIGZpbGw6ICNGOUZGRkIgIWltcG9ydGFudDsKICBzdHJva2U6ICMyREJENjAgIWltcG9ydGFudDsKICBzdHJva2Utd2lkdGg6IDFweCAhaW1wb3J0YW50Owp9CgojZGd0aDJxbzRjczIgLmNsdXN0ZXIgdGV4dCB7CiAgZmlsbDogI0Y5RkZGQjsKfQoKI2RndGgycW80Y3MyIGRpdi5tZXJtYWlkVG9vbHRpcCB7CiAgYmFja2dyb3VuZDogI0Y5RkZGQjsKICBib3JkZXI6IDFweCBzb2xpZCAjMkRCRDYwOwp9CgoKI2RndGgycW80Y3MyIC5hY3RvciB7CiAgc3Ryb2tlOiAjMkRCRDYwOwogIGZpbGw6ICNGOUZGRkI7Cn0KCiNkZ3RoMnFvNGNzMiB0ZXh0LmFjdG9yIHsKICBmaWxsOiAjMkRCRDYwOwogIHN0cm9rZTogbm9uZTsKfQoKI2RndGgycW80Y3MyIC5hY3Rvci1saW5lIHsKICBzdHJva2U6ICMyREJENjA7Cn0KCiNkZ3RoMnFvNGNzMiAubWVzc2FnZUxpbmUwIHsKICBzdHJva2Utd2lkdGg6IDEuNTsKICBzdHJva2UtZGFzaGFycmF5OiAnMiAyJzsKICBtYXJrZXItZW5kOiAndXJsKCNhcnJvd2hlYWQpJzsKICBzdHJva2U6ICMyREJENjA7Cn0KCiNkZ3RoMnFvNGNzMiAubWVzc2FnZUxpbmUxIHsKICBzdHJva2Utd2lkdGg6IDEuNTsKICBzdHJva2UtZGFzaGFycmF5OiAnMiAyJzsKICBzdHJva2U6ICMyREJENjA7Cn0KCiNkZ3RoMnFvNGNzMiAjYXJyb3doZWFkIHsKICBmaWxsOiAjMkRCRDYwOwp9CgojZGd0aDJxbzRjczIgI2Nyb3NzaGVhZCBwYXRoIHsKICBmaWxsOiAjMkRCRDYwICFpbXBvcnRhbnQ7CiAgc3Ryb2tlOiAjMkRCRDYwICFpbXBvcnRhbnQ7Cn0KCiNkZ3RoMnFvNGNzMiAubWVzc2FnZVRleHQgewogIGZpbGw6ICMyREJENjA7CiAgc3Ryb2tlOiBub25lOwp9CgojZGd0aDJxbzRjczIgLmxhYmVsQm94IHsKICBzdHJva2U6ICMyREJENjA7CiAgZmlsbDogI0Y5RkZGQjsKfQoKI2RndGgycW80Y3MyIC5sYWJlbFRleHQgewogIGZpbGw6ICMyREJENjA7CiAgc3Ryb2tlOiAjMkRCRDYwOwp9CgojZGd0aDJxbzRjczIgLmxvb3BUZXh0IHsKICBmaWxsOiAjMkRCRDYwOwogIHN0cm9rZTogIzJEQkQ2MDsKfQoKI2RndGgycW80Y3MyIC5sb29wTGluZSB7CiAgc3Ryb2tlLXdpZHRoOiAyOwogIHN0cm9rZS1kYXNoYXJyYXk6ICcyIDInOwogIG1hcmtlci1lbmQ6ICd1cmwoI2Fycm93aGVhZCknOwogIHN0cm9rZTogIzJEQkQ2MDsKfQoKI2RndGgycW80Y3MyIC5ub3RlIHsKICBzdHJva2U6ICMyREJENjA7CiAgZmlsbDogI0Y5RkZGQjsKfQoKI2RndGgycW80Y3MyIC5ub3RlVGV4dCB7CiAgZmlsbDogIzJEQkQ2MDsKICBzdHJva2U6ICMyREJENjA7Cn0KCgojZGd0aDJxbzRjczIgLnNlY3Rpb257CiAgb3BhY2l0eToxOwp9CiNkZ3RoMnFvNGNzMiAuc2VjdGlvbjAsI2RndGgycW80Y3MyICAuc2VjdGlvbjIgewogIGZpbGw6ICNFQ0Y3RjA7Cn0KCiNkZ3RoMnFvNGNzMiAuc2VjdGlvbjEsCiNkZ3RoMnFvNGNzMiAuc2VjdGlvbjMgewogIGZpbGw6ICNGRkY7Cn0KI2RndGgycW80Y3MyIC50YXNrVGV4dDAsCiNkZ3RoMnFvNGNzMiAudGFza1RleHQxLAojZGd0aDJxbzRjczIgLnRhc2tUZXh0MiwKI2RndGgycW80Y3MyIC50YXNrVGV4dDMgewogIGZpbGw6ICNmZmY7Cn0KCiNkZ3RoMnFvNGNzMiAudGFzazAsCiNkZ3RoMnFvNGNzMiAudGFzazEsCiNkZ3RoMnFvNGNzMiAudGFzazIsCiNkZ3RoMnFvNGNzMiAudGFzazMgewogIGZpbGw6ICMyREJENjA7CiAgc3Ryb2tlOiAjMzU5RjVBOwp9Cjwvc3R5bGU+PHN0eWxlPiNkZ3RoMnFvNGNzMiB7CiAgICBjb2xvcjogcmdiKDIwMCwgMjAxLCAxOTgpOwogICAgZm9udDogbm9ybWFsIG5vcm1hbCBub3JtYWwgbm9ybWFsIDE0cHgvMjIuMzk5OTk5NjE4NTMwMjczcHggbW9ub3NwYWNlOwogIH08L3N0eWxlPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMiwgLTEyKSI+PGcgY2xhc3M9Im91dHB1dCI+PGcgY2xhc3M9ImNsdXN0ZXJzIj48L2c+PGcgY2xhc3M9ImVkZ2VQYXRocyI+PGcgY2xhc3M9ImVkZ2VQYXRoIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxwYXRoIGNsYXNzPSJwYXRoIiBkPSJNMTA3LjQwNjI1LDU2LjI4MTI1TDEwNy40MDYyNSw4MS4yODEyNUwxMDcuNDA2MjUsMTA2LjI4MTI1IiBtYXJrZXItZW5kPSJ1cmwoI2Fycm93aGVhZDMxNykiIHN0eWxlPSJzdHJva2U6ICMzMzM7IHN0cm9rZS13aWR0aDogMS41cHg7ZmlsbDpub25lIj48L3BhdGg+PGRlZnM+PG1hcmtlciBpZD0iYXJyb3doZWFkMzE3IiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlclVuaXRzPSJzdHJva2VXaWR0aCIgbWFya2VyV2lkdGg9IjgiIG1hcmtlckhlaWdodD0iNiIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNIDAgMCBMIDEwIDUgTCAwIDEwIHoiIGNsYXNzPSJhcnJvd2hlYWRQYXRoIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxcHg7IHN0cm9rZS1kYXNoYXJyYXk6IDFweCwgMHB4OyI+PC9wYXRoPjwvbWFya2VyPjwvZGVmcz48L2c+PGcgY2xhc3M9ImVkZ2VQYXRoIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxwYXRoIGNsYXNzPSJwYXRoIiBkPSJNMTA3LjQwNjI1LDE0Mi41NjI1TDEwNy40MDYyNSwxNjcuNTYyNUwxMDcuNDA2MjUsMTkyLjU2MjUiIG1hcmtlci1lbmQ9InVybCgjYXJyb3doZWFkMzE4KSIgc3R5bGU9InN0cm9rZTogIzMzMzsgc3Ryb2tlLXdpZHRoOiAxLjVweDtmaWxsOm5vbmUiPjwvcGF0aD48ZGVmcz48bWFya2VyIGlkPSJhcnJvd2hlYWQzMTgiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOSIgcmVmWT0iNSIgbWFya2VyVW5pdHM9InN0cm9rZVdpZHRoIiBtYXJrZXJXaWR0aD0iOCIgbWFya2VySGVpZ2h0PSI2IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0gMCAwIEwgMTAgNSBMIDAgMTAgeiIgY2xhc3M9ImFycm93aGVhZFBhdGgiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDFweDsgc3Ryb2tlLWRhc2hhcnJheTogMXB4LCAwcHg7Ij48L3BhdGg+PC9tYXJrZXI+PC9kZWZzPjwvZz48ZyBjbGFzcz0iZWRnZVBhdGgiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PHBhdGggY2xhc3M9InBhdGgiIGQ9Ik0xMDcuNDA2MjUsMjI4Ljg0Mzc1TDEwNy40MDYyNSwyNTMuODQzNzVMMTA3LjQwNjI1LDI3OC44NDM3NSIgbWFya2VyLWVuZD0idXJsKCNhcnJvd2hlYWQzMTkpIiBzdHlsZT0ic3Ryb2tlOiAjMzMzOyBzdHJva2Utd2lkdGg6IDEuNXB4O2ZpbGw6bm9uZSI+PC9wYXRoPjxkZWZzPjxtYXJrZXIgaWQ9ImFycm93aGVhZDMxOSIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI5IiByZWZZPSI1IiBtYXJrZXJVbml0cz0ic3Ryb2tlV2lkdGgiIG1hcmtlcldpZHRoPSI4IiBtYXJrZXJIZWlnaHQ9IjYiIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTSAwIDAgTCAxMCA1IEwgMCAxMCB6IiBjbGFzcz0iYXJyb3doZWFkUGF0aCIgc3R5bGU9InN0cm9rZS13aWR0aDogMXB4OyBzdHJva2UtZGFzaGFycmF5OiAxcHgsIDBweDsiPjwvcGF0aD48L21hcmtlcj48L2RlZnM+PC9nPjxnIGNsYXNzPSJlZGdlUGF0aCIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48cGF0aCBjbGFzcz0icGF0aCIgZD0iTTEwNy40MDYyNSwzMTUuMTI1TDEwNy40MDYyNSwzNDAuMTI1TDEwNy40MDYyNSwzNjUuMTI1IiBtYXJrZXItZW5kPSJ1cmwoI2Fycm93aGVhZDMyMCkiIHN0eWxlPSJzdHJva2U6ICMzMzM7IHN0cm9rZS13aWR0aDogMS41cHg7ZmlsbDpub25lIj48L3BhdGg+PGRlZnM+PG1hcmtlciBpZD0iYXJyb3doZWFkMzIwIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlclVuaXRzPSJzdHJva2VXaWR0aCIgbWFya2VyV2lkdGg9IjgiIG1hcmtlckhlaWdodD0iNiIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNIDAgMCBMIDEwIDUgTCAwIDEwIHoiIGNsYXNzPSJhcnJvd2hlYWRQYXRoIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxcHg7IHN0cm9rZS1kYXNoYXJyYXk6IDFweCwgMHB4OyI+PC9wYXRoPjwvbWFya2VyPjwvZGVmcz48L2c+PGcgY2xhc3M9ImVkZ2VQYXRoIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxwYXRoIGNsYXNzPSJwYXRoIiBkPSJNMTA3LjQwNjI1LDQwMS40MDYyNUwxMDcuNDA2MjUsNDI2LjQwNjI1TDEwNy40MDYyNSw0NTEuNDA2MjUiIG1hcmtlci1lbmQ9InVybCgjYXJyb3doZWFkMzIxKSIgc3R5bGU9InN0cm9rZTogIzMzMzsgc3Ryb2tlLXdpZHRoOiAxLjVweDtmaWxsOm5vbmUiPjwvcGF0aD48ZGVmcz48bWFya2VyIGlkPSJhcnJvd2hlYWQzMjEiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOSIgcmVmWT0iNSIgbWFya2VyVW5pdHM9InN0cm9rZVdpZHRoIiBtYXJrZXJXaWR0aD0iOCIgbWFya2VySGVpZ2h0PSI2IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0gMCAwIEwgMTAgNSBMIDAgMTAgeiIgY2xhc3M9ImFycm93aGVhZFBhdGgiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDFweDsgc3Ryb2tlLWRhc2hhcnJheTogMXB4LCAwcHg7Ij48L3BhdGg+PC9tYXJrZXI+PC9kZWZzPjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbHMiPjxnIGNsYXNzPSJlZGdlTGFiZWwiIHN0eWxlPSJvcGFjaXR5OiAxOyIgdHJhbnNmb3JtPSIiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiIGNsYXNzPSJsYWJlbCI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB3aWR0aD0iMCIgaGVpZ2h0PSIwIiBzdHlsZT0iZmlsbDojZThlOGU4OyI+PC9yZWN0Pjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj48L3RzcGFuPjwvdGV4dD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiIHN0eWxlPSJvcGFjaXR5OiAxOyIgdHJhbnNmb3JtPSIiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiIGNsYXNzPSJsYWJlbCI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB3aWR0aD0iMCIgaGVpZ2h0PSIwIiBzdHlsZT0iZmlsbDojZThlOGU4OyI+PC9yZWN0Pjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj48L3RzcGFuPjwvdGV4dD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiIHN0eWxlPSJvcGFjaXR5OiAxOyIgdHJhbnNmb3JtPSIiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiIGNsYXNzPSJsYWJlbCI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB3aWR0aD0iMCIgaGVpZ2h0PSIwIiBzdHlsZT0iZmlsbDojZThlOGU4OyI+PC9yZWN0Pjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj48L3RzcGFuPjwvdGV4dD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiIHN0eWxlPSJvcGFjaXR5OiAxOyIgdHJhbnNmb3JtPSIiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiIGNsYXNzPSJsYWJlbCI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB3aWR0aD0iMCIgaGVpZ2h0PSIwIiBzdHlsZT0iZmlsbDojZThlOGU4OyI+PC9yZWN0Pjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj48L3RzcGFuPjwvdGV4dD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiIHN0eWxlPSJvcGFjaXR5OiAxOyIgdHJhbnNmb3JtPSIiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiIGNsYXNzPSJsYWJlbCI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB3aWR0aD0iMCIgaGVpZ2h0PSIwIiBzdHlsZT0iZmlsbDojZThlOGU4OyI+PC9yZWN0Pjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj48L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48ZyBjbGFzcz0ibm9kZXMiPjxnIGNsYXNzPSJub2RlIiBzdHlsZT0ib3BhY2l0eTogMTsiIGlkPSJBIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMDcuNDA2MjUsMzguMTQwNjI1KSI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB4PSItNzYuMjEwOTM3NSIgeT0iLTE4LjE0MDYyNSIgd2lkdGg9IjE1Mi40MjE4NzUiIGhlaWdodD0iMzYuMjgxMjUiPjwvcmVjdD48ZyBjbGFzcz0ibGFiZWwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC02Ni4yMTA5Mzc1LC04LjE0MDYyNSkiPjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj5zZWxpbnV4X2NvbXBsZXRlX2luaXQ8L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48ZyBjbGFzcz0ibm9kZSIgc3R5bGU9Im9wYWNpdHk6IDE7IiBpZD0iQiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTA3LjQwNjI1LDEyNC40MjE4NzUpIj48cmVjdCByeD0iMCIgcnk9IjAiIHg9Ii04My4wNzgxMjUiIHk9Ii0xOC4xNDA2MjUiIHdpZHRoPSIxNjYuMTU2MjUiIGhlaWdodD0iMzYuMjgxMjUiPjwvcmVjdD48ZyBjbGFzcz0ibGFiZWwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC03My4wNzgxMjUsLTguMTQwNjI1KSI+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPmRlbGF5ZWRfc3VwZXJibG9ja19pbml0PC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PGcgY2xhc3M9Im5vZGUiIHN0eWxlPSJvcGFjaXR5OiAxOyIgaWQ9IkMiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEwNy40MDYyNSwyMTAuNzAzMTI1KSI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB4PSItNjMuMzM1OTM3NSIgeT0iLTE4LjE0MDYyNSIgd2lkdGg9IjEyNi42NzE4NzUiIGhlaWdodD0iMzYuMjgxMjUiPjwvcmVjdD48ZyBjbGFzcz0ibGFiZWwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC01My4zMzU5Mzc1LC04LjE0MDYyNSkiPjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj5zdXBlcmJsb2NrX2RvaW5pdDwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PC9nPjxnIGNsYXNzPSJub2RlIiBzdHlsZT0ib3BhY2l0eTogMTsiIGlkPSJEIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMDcuNDA2MjUsMjk2Ljk4NDM3NSkiPjxyZWN0IHJ4PSIwIiByeT0iMCIgeD0iLTc1LjE0MDYyNSIgeT0iLTE4LjE0MDYyNSIgd2lkdGg9IjE1MC4yODEyNSIgaGVpZ2h0PSIzNi4yODEyNSI+PC9yZWN0PjxnIGNsYXNzPSJsYWJlbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTY1LjE0MDYyNSwtOC4xNDA2MjUpIj48dGV4dD48dHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZHk9IjFlbSIgeD0iMSI+c2VsaW51eF9zZXRfbW50X29wdHM8L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48ZyBjbGFzcz0ibm9kZSIgc3R5bGU9Im9wYWNpdHk6IDE7IiBpZD0iRSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTA3LjQwNjI1LDM4My4yNjU2MjUpIj48cmVjdCByeD0iMCIgcnk9IjAiIHg9Ii02NC45NTMxMjUiIHk9Ii0xOC4xNDA2MjUiIHdpZHRoPSIxMjkuOTA2MjUiIGhlaWdodD0iMzYuMjgxMjUiPjwvcmVjdD48ZyBjbGFzcz0ibGFiZWwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC01NC45NTMxMjUsLTguMTQwNjI1KSI+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPnNiX2ZpbmlzaF9zZXRfb3B0czwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PC9nPjxnIGNsYXNzPSJub2RlIiBzdHlsZT0ib3BhY2l0eTogMTsiIGlkPSJGIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMDcuNDA2MjUsNDY5LjU0Njg3NSkiPjxyZWN0IHJ4PSIwIiByeT0iMCIgeD0iLTg3LjQwNjI1IiB5PSItMTguMTQwNjI1IiB3aWR0aD0iMTc0LjgxMjUiIGhlaWdodD0iMzYuMjgxMjUiPjwvcmVjdD48ZyBjbGFzcz0ibGFiZWwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC03Ny40MDYyNSwtOC4xNDA2MjUpIj48dGV4dD48dHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZHk9IjFlbSIgeD0iMSI+aW5vZGVfZG9pbml0X3dpdGhfZGVudHJ5PC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PC9nPjwvZz48L2c+PC9zdmc+

selinux_complete_initsecurity_load_policy调用,而调用inode_doinit_with_dentry时policy和initial SID均已加载成功。
selinux_complete_init调用selinux_set_mnt_opts设置了sbsec->behavior,最终inode_doinit_with_dentry再根据sbsec->behavior设置SID。

if (!sbsec->behavior) { // 由sb_alloc_security分配,并被初始化为0,所以下面的security_fs_use会被调用
    /*
     * Determine the labeling behavior to use for this
     * filesystem type.
     */
    rc = security_fs_use(&selinux_state, sb);
    if (rc) {
        pr_warn("%s: security_fs_use(%s) returned %d\n",
                __func__, sb->s_type->name, rc);
        goto out;
    }
}

考虑selinuxfs没用fs_use,但用了genfs,所以security_fs_use最终会使用genfs对应的SID,参考Fedora refpolicy,即gen_context(system_u:object_r:security_t,s0)。所以可见selinuxfs中的文件SID最终会由加载的策略二进制中对应的上下文来描述。例如selinuxfs对应的genfscon语句。可以用seinfo命令验证:

[ben@localhost gateways]$ seinfo --fs_use|grep selinux
[ben@localhost gateways]$ seinfo --genfs|grep selinux
   genfscon selinuxfs /  system_u:object_r:security_t:s0

第一条命令没有任何输出,而第二条命令可以看到selinuxfs的context。

selinux_init

init_sel_fs一样,SELinux子系统自身在系统启动时,也会进行初始化,即selinux_init。此时init进程尚未被内核启动,所以策略数据也没被加载。selinux_init就是为后面的selinuxfs加载策略做一些准备工作。

PHN2ZyBpZD0iZHY5dGo4Ym5tbWciIHdpZHRoPSIxMDAlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXgtd2lkdGg6IDQ0Ny4wNjI1cHg7IiB2aWV3Qm94PSIwIDAgNDQ3LjA2MjUgNDgzLjY4NzUiPjxzdHlsZT4KCgojZHY5dGo4Ym5tbWcgLmxhYmVsIHsKICBmb250LWZhbWlseTogJ3RyZWJ1Y2hldCBtcycsIHZlcmRhbmEsIGFyaWFsOwogIGNvbG9yOiAjMzMzOyB9CgojZHY5dGo4Ym5tbWcgLm5vZGUgcmVjdCwKI2R2OXRqOGJubW1nIC5ub2RlIGNpcmNsZSwKI2R2OXRqOGJubW1nIC5ub2RlIGVsbGlwc2UsCiNkdjl0ajhibm1tZyAubm9kZSBwb2x5Z29uIHsKICBmaWxsOiAjRUNFQ0ZGOwogIHN0cm9rZTogIzkzNzBEQjsKICBzdHJva2Utd2lkdGg6IDFweDsgfQoKI2R2OXRqOGJubW1nIC5ub2RlLmNsaWNrYWJsZSB7CiAgY3Vyc29yOiBwb2ludGVyOyB9CgojZHY5dGo4Ym5tbWcgLmFycm93aGVhZFBhdGggewogIGZpbGw6ICMzMzMzMzM7IH0KCiNkdjl0ajhibm1tZyAuZWRnZVBhdGggLnBhdGggewogIHN0cm9rZTogIzMzMzMzMzsKICBzdHJva2Utd2lkdGg6IDEuNXB4OyB9CgojZHY5dGo4Ym5tbWcgLmVkZ2VMYWJlbCB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2U4ZThlODsgfQoKI2R2OXRqOGJubW1nIC5jbHVzdGVyIHJlY3QgewogIGZpbGw6ICNmZmZmZGUgIWltcG9ydGFudDsKICBzdHJva2U6ICNhYWFhMzMgIWltcG9ydGFudDsKICBzdHJva2Utd2lkdGg6IDFweCAhaW1wb3J0YW50OyB9CgojZHY5dGo4Ym5tbWcgLmNsdXN0ZXIgdGV4dCB7CiAgZmlsbDogIzMzMzsgfQoKI2R2OXRqOGJubW1nIGRpdi5tZXJtYWlkVG9vbHRpcCB7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBtYXgtd2lkdGg6IDIwMHB4OwogIHBhZGRpbmc6IDJweDsKICBmb250LWZhbWlseTogJ3RyZWJ1Y2hldCBtcycsIHZlcmRhbmEsIGFyaWFsOwogIGZvbnQtc2l6ZTogMTJweDsKICBiYWNrZ3JvdW5kOiAjZmZmZmRlOwogIGJvcmRlcjogMXB4IHNvbGlkICNhYWFhMzM7CiAgYm9yZGVyLXJhZGl1czogMnB4OwogIHBvaW50ZXItZXZlbnRzOiBub25lOwogIHotaW5kZXg6IDEwMDsgfQoKI2R2OXRqOGJubW1nIC5hY3RvciB7CiAgc3Ryb2tlOiAjQ0NDQ0ZGOwogIGZpbGw6ICNFQ0VDRkY7IH0KCiNkdjl0ajhibm1tZyB0ZXh0LmFjdG9yIHsKICBmaWxsOiBibGFjazsKICBzdHJva2U6IG5vbmU7IH0KCiNkdjl0ajhibm1tZyAuYWN0b3ItbGluZSB7CiAgc3Ryb2tlOiBncmV5OyB9CgojZHY5dGo4Ym5tbWcgLm1lc3NhZ2VMaW5lMCB7CiAgc3Ryb2tlLXdpZHRoOiAxLjU7CiAgc3Ryb2tlLWRhc2hhcnJheTogJzIgMic7CiAgc3Ryb2tlOiAjMzMzOyB9CgojZHY5dGo4Ym5tbWcgLm1lc3NhZ2VMaW5lMSB7CiAgc3Ryb2tlLXdpZHRoOiAxLjU7CiAgc3Ryb2tlLWRhc2hhcnJheTogJzIgMic7CiAgc3Ryb2tlOiAjMzMzOyB9CgojZHY5dGo4Ym5tbWcgI2Fycm93aGVhZCB7CiAgZmlsbDogIzMzMzsgfQoKI2R2OXRqOGJubW1nICNjcm9zc2hlYWQgcGF0aCB7CiAgZmlsbDogIzMzMyAhaW1wb3J0YW50OwogIHN0cm9rZTogIzMzMyAhaW1wb3J0YW50OyB9CgojZHY5dGo4Ym5tbWcgLm1lc3NhZ2VUZXh0IHsKICBmaWxsOiAjMzMzOwogIHN0cm9rZTogbm9uZTsgfQoKI2R2OXRqOGJubW1nIC5sYWJlbEJveCB7CiAgc3Ryb2tlOiAjQ0NDQ0ZGOwogIGZpbGw6ICNFQ0VDRkY7IH0KCiNkdjl0ajhibm1tZyAubGFiZWxUZXh0IHsKICBmaWxsOiBibGFjazsKICBzdHJva2U6IG5vbmU7IH0KCiNkdjl0ajhibm1tZyAubG9vcFRleHQgewogIGZpbGw6IGJsYWNrOwogIHN0cm9rZTogbm9uZTsgfQoKI2R2OXRqOGJubW1nIC5sb29wTGluZSB7CiAgc3Ryb2tlLXdpZHRoOiAyOwogIHN0cm9rZS1kYXNoYXJyYXk6ICcyIDInOwogIHN0cm9rZTogI0NDQ0NGRjsgfQoKI2R2OXRqOGJubW1nIC5ub3RlIHsKICBzdHJva2U6ICNhYWFhMzM7CiAgZmlsbDogI2ZmZjVhZDsgfQoKI2R2OXRqOGJubW1nIC5ub3RlVGV4dCB7CiAgZmlsbDogYmxhY2s7CiAgc3Ryb2tlOiBub25lOwogIGZvbnQtZmFtaWx5OiAndHJlYnVjaGV0IG1zJywgdmVyZGFuYSwgYXJpYWw7CiAgZm9udC1zaXplOiAxNHB4OyB9CgojZHY5dGo4Ym5tbWcgLmFjdGl2YXRpb24wIHsKICBmaWxsOiAjZjRmNGY0OwogIHN0cm9rZTogIzY2NjsgfQoKI2R2OXRqOGJubW1nIC5hY3RpdmF0aW9uMSB7CiAgZmlsbDogI2Y0ZjRmNDsKICBzdHJva2U6ICM2NjY7IH0KCiNkdjl0ajhibm1tZyAuYWN0aXZhdGlvbjIgewogIGZpbGw6ICNmNGY0ZjQ7CiAgc3Ryb2tlOiAjNjY2OyB9CgoKI2R2OXRqOGJubW1nIC5zZWN0aW9uIHsKICBzdHJva2U6IG5vbmU7CiAgb3BhY2l0eTogMC4yOyB9CgojZHY5dGo4Ym5tbWcgLnNlY3Rpb24wIHsKICBmaWxsOiByZ2JhKDEwMiwgMTAyLCAyNTUsIDAuNDkpOyB9CgojZHY5dGo4Ym5tbWcgLnNlY3Rpb24yIHsKICBmaWxsOiAjZmZmNDAwOyB9CgojZHY5dGo4Ym5tbWcgLnNlY3Rpb24xLAojZHY5dGo4Ym5tbWcgLnNlY3Rpb24zIHsKICBmaWxsOiB3aGl0ZTsKICBvcGFjaXR5OiAwLjI7IH0KCiNkdjl0ajhibm1tZyAuc2VjdGlvblRpdGxlMCB7CiAgZmlsbDogIzMzMzsgfQoKI2R2OXRqOGJubW1nIC5zZWN0aW9uVGl0bGUxIHsKICBmaWxsOiAjMzMzOyB9CgojZHY5dGo4Ym5tbWcgLnNlY3Rpb25UaXRsZTIgewogIGZpbGw6ICMzMzM7IH0KCiNkdjl0ajhibm1tZyAuc2VjdGlvblRpdGxlMyB7CiAgZmlsbDogIzMzMzsgfQoKI2R2OXRqOGJubW1nIC5zZWN0aW9uVGl0bGUgewogIHRleHQtYW5jaG9yOiBzdGFydDsKICBmb250LXNpemU6IDExcHg7CiAgdGV4dC1oZWlnaHQ6IDE0cHg7IH0KCgojZHY5dGo4Ym5tbWcgLmdyaWQgLnRpY2sgewogIHN0cm9rZTogbGlnaHRncmV5OwogIG9wYWNpdHk6IDAuMzsKICBzaGFwZS1yZW5kZXJpbmc6IGNyaXNwRWRnZXM7IH0KCiNkdjl0ajhibm1tZyAuZ3JpZCBwYXRoIHsKICBzdHJva2Utd2lkdGg6IDA7IH0KCgojZHY5dGo4Ym5tbWcgLnRvZGF5IHsKICBmaWxsOiBub25lOwogIHN0cm9rZTogcmVkOwogIHN0cm9rZS13aWR0aDogMnB4OyB9CgoKCiNkdjl0ajhibm1tZyAudGFzayB7CiAgc3Ryb2tlLXdpZHRoOiAyOyB9CgojZHY5dGo4Ym5tbWcgLnRhc2tUZXh0IHsKICB0ZXh0LWFuY2hvcjogbWlkZGxlOwogIGZvbnQtc2l6ZTogMTFweDsgfQoKI2R2OXRqOGJubW1nIC50YXNrVGV4dE91dHNpZGVSaWdodCB7CiAgZmlsbDogYmxhY2s7CiAgdGV4dC1hbmNob3I6IHN0YXJ0OwogIGZvbnQtc2l6ZTogMTFweDsgfQoKI2R2OXRqOGJubW1nIC50YXNrVGV4dE91dHNpZGVMZWZ0IHsKICBmaWxsOiBibGFjazsKICB0ZXh0LWFuY2hvcjogZW5kOwogIGZvbnQtc2l6ZTogMTFweDsgfQoKCiNkdjl0ajhibm1tZyAudGFza1RleHQwLAojZHY5dGo4Ym5tbWcgLnRhc2tUZXh0MSwKI2R2OXRqOGJubW1nIC50YXNrVGV4dDIsCiNkdjl0ajhibm1tZyAudGFza1RleHQzIHsKICBmaWxsOiB3aGl0ZTsgfQoKI2R2OXRqOGJubW1nIC50YXNrMCwKI2R2OXRqOGJubW1nIC50YXNrMSwKI2R2OXRqOGJubW1nIC50YXNrMiwKI2R2OXRqOGJubW1nIC50YXNrMyB7CiAgZmlsbDogIzhhOTBkZDsKICBzdHJva2U6ICM1MzRmYmM7IH0KCiNkdjl0ajhibm1tZyAudGFza1RleHRPdXRzaWRlMCwKI2R2OXRqOGJubW1nIC50YXNrVGV4dE91dHNpZGUyIHsKICBmaWxsOiBibGFjazsgfQoKI2R2OXRqOGJubW1nIC50YXNrVGV4dE91dHNpZGUxLAojZHY5dGo4Ym5tbWcgLnRhc2tUZXh0T3V0c2lkZTMgewogIGZpbGw6IGJsYWNrOyB9CgoKI2R2OXRqOGJubW1nIC5hY3RpdmUwLAojZHY5dGo4Ym5tbWcgLmFjdGl2ZTEsCiNkdjl0ajhibm1tZyAuYWN0aXZlMiwKI2R2OXRqOGJubW1nIC5hY3RpdmUzIHsKICBmaWxsOiAjYmZjN2ZmOwogIHN0cm9rZTogIzUzNGZiYzsgfQoKI2R2OXRqOGJubW1nIC5hY3RpdmVUZXh0MCwKI2R2OXRqOGJubW1nIC5hY3RpdmVUZXh0MSwKI2R2OXRqOGJubW1nIC5hY3RpdmVUZXh0MiwKI2R2OXRqOGJubW1nIC5hY3RpdmVUZXh0MyB7CiAgZmlsbDogYmxhY2sgIWltcG9ydGFudDsgfQoKCiNkdjl0ajhibm1tZyAuZG9uZTAsCiNkdjl0ajhibm1tZyAuZG9uZTEsCiNkdjl0ajhibm1tZyAuZG9uZTIsCiNkdjl0ajhibm1tZyAuZG9uZTMgewogIHN0cm9rZTogZ3JleTsKICBmaWxsOiBsaWdodGdyZXk7CiAgc3Ryb2tlLXdpZHRoOiAyOyB9CgojZHY5dGo4Ym5tbWcgLmRvbmVUZXh0MCwKI2R2OXRqOGJubW1nIC5kb25lVGV4dDEsCiNkdjl0ajhibm1tZyAuZG9uZVRleHQyLAojZHY5dGo4Ym5tbWcgLmRvbmVUZXh0MyB7CiAgZmlsbDogYmxhY2sgIWltcG9ydGFudDsgfQoKCiNkdjl0ajhibm1tZyAuY3JpdDAsCiNkdjl0ajhibm1tZyAuY3JpdDEsCiNkdjl0ajhibm1tZyAuY3JpdDIsCiNkdjl0ajhibm1tZyAuY3JpdDMgewogIHN0cm9rZTogI2ZmODg4ODsKICBmaWxsOiByZWQ7CiAgc3Ryb2tlLXdpZHRoOiAyOyB9CgojZHY5dGo4Ym5tbWcgLmFjdGl2ZUNyaXQwLAojZHY5dGo4Ym5tbWcgLmFjdGl2ZUNyaXQxLAojZHY5dGo4Ym5tbWcgLmFjdGl2ZUNyaXQyLAojZHY5dGo4Ym5tbWcgLmFjdGl2ZUNyaXQzIHsKICBzdHJva2U6ICNmZjg4ODg7CiAgZmlsbDogI2JmYzdmZjsKICBzdHJva2Utd2lkdGg6IDI7IH0KCiNkdjl0ajhibm1tZyAuZG9uZUNyaXQwLAojZHY5dGo4Ym5tbWcgLmRvbmVDcml0MSwKI2R2OXRqOGJubW1nIC5kb25lQ3JpdDIsCiNkdjl0ajhibm1tZyAuZG9uZUNyaXQzIHsKICBzdHJva2U6ICNmZjg4ODg7CiAgZmlsbDogbGlnaHRncmV5OwogIHN0cm9rZS13aWR0aDogMjsKICBjdXJzb3I6IHBvaW50ZXI7CiAgc2hhcGUtcmVuZGVyaW5nOiBjcmlzcEVkZ2VzOyB9CgojZHY5dGo4Ym5tbWcgLmRvbmVDcml0VGV4dDAsCiNkdjl0ajhibm1tZyAuZG9uZUNyaXRUZXh0MSwKI2R2OXRqOGJubW1nIC5kb25lQ3JpdFRleHQyLAojZHY5dGo4Ym5tbWcgLmRvbmVDcml0VGV4dDMgewogIGZpbGw6IGJsYWNrICFpbXBvcnRhbnQ7IH0KCiNkdjl0ajhibm1tZyAuYWN0aXZlQ3JpdFRleHQwLAojZHY5dGo4Ym5tbWcgLmFjdGl2ZUNyaXRUZXh0MSwKI2R2OXRqOGJubW1nIC5hY3RpdmVDcml0VGV4dDIsCiNkdjl0ajhibm1tZyAuYWN0aXZlQ3JpdFRleHQzIHsKICBmaWxsOiBibGFjayAhaW1wb3J0YW50OyB9CgojZHY5dGo4Ym5tbWcgLnRpdGxlVGV4dCB7CiAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICBmb250LXNpemU6IDE4cHg7CiAgZmlsbDogYmxhY2s7IH0KCiNkdjl0ajhibm1tZyBnLmNsYXNzR3JvdXAgdGV4dCB7CiAgZmlsbDogIzkzNzBEQjsKICBzdHJva2U6IG5vbmU7CiAgZm9udC1mYW1pbHk6ICd0cmVidWNoZXQgbXMnLCB2ZXJkYW5hLCBhcmlhbDsKICBmb250LXNpemU6IDEwcHg7IH0KCiNkdjl0ajhibm1tZyBnLmNsYXNzR3JvdXAgcmVjdCB7CiAgZmlsbDogI0VDRUNGRjsKICBzdHJva2U6ICM5MzcwREI7IH0KCiNkdjl0ajhibm1tZyBnLmNsYXNzR3JvdXAgbGluZSB7CiAgc3Ryb2tlOiAjOTM3MERCOwogIHN0cm9rZS13aWR0aDogMTsgfQoKI2R2OXRqOGJubW1nIC5jbGFzc0xhYmVsIC5ib3ggewogIHN0cm9rZTogbm9uZTsKICBzdHJva2Utd2lkdGg6IDA7CiAgZmlsbDogI0VDRUNGRjsKICBvcGFjaXR5OiAwLjU7IH0KCiNkdjl0ajhibm1tZyAuY2xhc3NMYWJlbCAubGFiZWwgewogIGZpbGw6ICM5MzcwREI7CiAgZm9udC1zaXplOiAxMHB4OyB9CgojZHY5dGo4Ym5tbWcgLnJlbGF0aW9uIHsKICBzdHJva2U6ICM5MzcwREI7CiAgc3Ryb2tlLXdpZHRoOiAxOwogIGZpbGw6IG5vbmU7IH0KCiNkdjl0ajhibm1tZyAjY29tcG9zaXRpb25TdGFydCB7CiAgZmlsbDogIzkzNzBEQjsKICBzdHJva2U6ICM5MzcwREI7CiAgc3Ryb2tlLXdpZHRoOiAxOyB9CgojZHY5dGo4Ym5tbWcgI2NvbXBvc2l0aW9uRW5kIHsKICBmaWxsOiAjOTM3MERCOwogIHN0cm9rZTogIzkzNzBEQjsKICBzdHJva2Utd2lkdGg6IDE7IH0KCiNkdjl0ajhibm1tZyAjYWdncmVnYXRpb25TdGFydCB7CiAgZmlsbDogI0VDRUNGRjsKICBzdHJva2U6ICM5MzcwREI7CiAgc3Ryb2tlLXdpZHRoOiAxOyB9CgojZHY5dGo4Ym5tbWcgI2FnZ3JlZ2F0aW9uRW5kIHsKICBmaWxsOiAjRUNFQ0ZGOwogIHN0cm9rZTogIzkzNzBEQjsKICBzdHJva2Utd2lkdGg6IDE7IH0KCiNkdjl0ajhibm1tZyAjZGVwZW5kZW5jeVN0YXJ0IHsKICBmaWxsOiAjOTM3MERCOwogIHN0cm9rZTogIzkzNzBEQjsKICBzdHJva2Utd2lkdGg6IDE7IH0KCiNkdjl0ajhibm1tZyAjZGVwZW5kZW5jeUVuZCB7CiAgZmlsbDogIzkzNzBEQjsKICBzdHJva2U6ICM5MzcwREI7CiAgc3Ryb2tlLXdpZHRoOiAxOyB9CgojZHY5dGo4Ym5tbWcgI2V4dGVuc2lvblN0YXJ0IHsKICBmaWxsOiAjOTM3MERCOwogIHN0cm9rZTogIzkzNzBEQjsKICBzdHJva2Utd2lkdGg6IDE7IH0KCiNkdjl0ajhibm1tZyAjZXh0ZW5zaW9uRW5kIHsKICBmaWxsOiAjOTM3MERCOwogIHN0cm9rZTogIzkzNzBEQjsKICBzdHJva2Utd2lkdGg6IDE7IH0KCiNkdjl0ajhibm1tZyAuY29tbWl0LWlkLAojZHY5dGo4Ym5tbWcgLmNvbW1pdC1tc2csCiNkdjl0ajhibm1tZyAuYnJhbmNoLWxhYmVsIHsKICBmaWxsOiBsaWdodGdyZXk7CiAgY29sb3I6IGxpZ2h0Z3JleTsgfQoKCgojZHY5dGo4Ym5tbWcgLmxhYmVsewogIGNvbG9yOiMxOEIxNEU7Cn0KI2R2OXRqOGJubW1nIC50ZS1tZC1jb250YWluZXItLWRhcmsgLm5vZGUgcmVjdCB7CiAgZmlsbDogcmVkOwp9CgojZHY5dGo4Ym5tbWcgLm5vZGUgcmVjdCwKI2R2OXRqOGJubW1nIC5ub2RlIGNpcmNsZSwKI2R2OXRqOGJubW1nIC5ub2RlIGVsbGlwc2UsCiNkdjl0ajhibm1tZyAubm9kZSBwb2x5Z29uIHsKICBmaWxsOiAjRjlGRkZCOzsKICBzdHJva2U6ICMyREJENjA7CiAgc3Ryb2tlLXdpZHRoOiAxLjVweDsKfQojZHY5dGo4Ym5tbWcgLmFycm93aGVhZFBhdGh7CiAgZmlsbDogIzJEQkQ2MDsKfQojZHY5dGo4Ym5tbWcgLmVkZ2VQYXRoIC5wYXRoIHsKICBzdHJva2U6ICMyREJENjA7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7Cn0KI2R2OXRqOGJubW1nIC5lZGdlTGFiZWwgewogIGJhY2tncm91bmQtY29sb3I6ICNmZmY7Cn0KI2R2OXRqOGJubW1nIC5jbHVzdGVyIHJlY3QgewogIGZpbGw6ICNGOUZGRkIgIWltcG9ydGFudDsKICBzdHJva2U6ICMyREJENjAgIWltcG9ydGFudDsKICBzdHJva2Utd2lkdGg6IDFweCAhaW1wb3J0YW50Owp9CgojZHY5dGo4Ym5tbWcgLmNsdXN0ZXIgdGV4dCB7CiAgZmlsbDogI0Y5RkZGQjsKfQoKI2R2OXRqOGJubW1nIGRpdi5tZXJtYWlkVG9vbHRpcCB7CiAgYmFja2dyb3VuZDogI0Y5RkZGQjsKICBib3JkZXI6IDFweCBzb2xpZCAjMkRCRDYwOwp9CgoKI2R2OXRqOGJubW1nIC5hY3RvciB7CiAgc3Ryb2tlOiAjMkRCRDYwOwogIGZpbGw6ICNGOUZGRkI7Cn0KCiNkdjl0ajhibm1tZyB0ZXh0LmFjdG9yIHsKICBmaWxsOiAjMkRCRDYwOwogIHN0cm9rZTogbm9uZTsKfQoKI2R2OXRqOGJubW1nIC5hY3Rvci1saW5lIHsKICBzdHJva2U6ICMyREJENjA7Cn0KCiNkdjl0ajhibm1tZyAubWVzc2FnZUxpbmUwIHsKICBzdHJva2Utd2lkdGg6IDEuNTsKICBzdHJva2UtZGFzaGFycmF5OiAnMiAyJzsKICBtYXJrZXItZW5kOiAndXJsKCNhcnJvd2hlYWQpJzsKICBzdHJva2U6ICMyREJENjA7Cn0KCiNkdjl0ajhibm1tZyAubWVzc2FnZUxpbmUxIHsKICBzdHJva2Utd2lkdGg6IDEuNTsKICBzdHJva2UtZGFzaGFycmF5OiAnMiAyJzsKICBzdHJva2U6ICMyREJENjA7Cn0KCiNkdjl0ajhibm1tZyAjYXJyb3doZWFkIHsKICBmaWxsOiAjMkRCRDYwOwp9CgojZHY5dGo4Ym5tbWcgI2Nyb3NzaGVhZCBwYXRoIHsKICBmaWxsOiAjMkRCRDYwICFpbXBvcnRhbnQ7CiAgc3Ryb2tlOiAjMkRCRDYwICFpbXBvcnRhbnQ7Cn0KCiNkdjl0ajhibm1tZyAubWVzc2FnZVRleHQgewogIGZpbGw6ICMyREJENjA7CiAgc3Ryb2tlOiBub25lOwp9CgojZHY5dGo4Ym5tbWcgLmxhYmVsQm94IHsKICBzdHJva2U6ICMyREJENjA7CiAgZmlsbDogI0Y5RkZGQjsKfQoKI2R2OXRqOGJubW1nIC5sYWJlbFRleHQgewogIGZpbGw6ICMyREJENjA7CiAgc3Ryb2tlOiAjMkRCRDYwOwp9CgojZHY5dGo4Ym5tbWcgLmxvb3BUZXh0IHsKICBmaWxsOiAjMkRCRDYwOwogIHN0cm9rZTogIzJEQkQ2MDsKfQoKI2R2OXRqOGJubW1nIC5sb29wTGluZSB7CiAgc3Ryb2tlLXdpZHRoOiAyOwogIHN0cm9rZS1kYXNoYXJyYXk6ICcyIDInOwogIG1hcmtlci1lbmQ6ICd1cmwoI2Fycm93aGVhZCknOwogIHN0cm9rZTogIzJEQkQ2MDsKfQoKI2R2OXRqOGJubW1nIC5ub3RlIHsKICBzdHJva2U6ICMyREJENjA7CiAgZmlsbDogI0Y5RkZGQjsKfQoKI2R2OXRqOGJubW1nIC5ub3RlVGV4dCB7CiAgZmlsbDogIzJEQkQ2MDsKICBzdHJva2U6ICMyREJENjA7Cn0KCgojZHY5dGo4Ym5tbWcgLnNlY3Rpb257CiAgb3BhY2l0eToxOwp9CiNkdjl0ajhibm1tZyAuc2VjdGlvbjAsI2R2OXRqOGJubW1nICAuc2VjdGlvbjIgewogIGZpbGw6ICNFQ0Y3RjA7Cn0KCiNkdjl0ajhibm1tZyAuc2VjdGlvbjEsCiNkdjl0ajhibm1tZyAuc2VjdGlvbjMgewogIGZpbGw6ICNGRkY7Cn0KI2R2OXRqOGJubW1nIC50YXNrVGV4dDAsCiNkdjl0ajhibm1tZyAudGFza1RleHQxLAojZHY5dGo4Ym5tbWcgLnRhc2tUZXh0MiwKI2R2OXRqOGJubW1nIC50YXNrVGV4dDMgewogIGZpbGw6ICNmZmY7Cn0KCiNkdjl0ajhibm1tZyAudGFzazAsCiNkdjl0ajhibm1tZyAudGFzazEsCiNkdjl0ajhibm1tZyAudGFzazIsCiNkdjl0ajhibm1tZyAudGFzazMgewogIGZpbGw6ICMyREJENjA7CiAgc3Ryb2tlOiAjMzU5RjVBOwp9Cjwvc3R5bGU+PHN0eWxlPiNkdjl0ajhibm1tZyB7CiAgICBjb2xvcjogcmdiKDIwMCwgMjAxLCAxOTgpOwogICAgZm9udDogbm9ybWFsIG5vcm1hbCBub3JtYWwgbm9ybWFsIDE0cHgvMjIuMzk5OTk5NjE4NTMwMjczcHggbW9ub3NwYWNlOwogIH08L3N0eWxlPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMiwgLTEyKSI+PGcgY2xhc3M9Im91dHB1dCI+PGcgY2xhc3M9ImNsdXN0ZXJzIj48L2c+PGcgY2xhc3M9ImVkZ2VQYXRocyI+PGcgY2xhc3M9ImVkZ2VQYXRoIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxwYXRoIGNsYXNzPSJwYXRoIiBkPSJNMjM1LjUzMTI1LDU2LjI4MTI1TDIzNS41MzEyNSw4MS4yODEyNUwyMzUuNTMxMjUsMTA2LjI4MTI1IiBtYXJrZXItZW5kPSJ1cmwoI2Fycm93aGVhZDM0OCkiIHN0eWxlPSJzdHJva2U6ICMzMzM7IHN0cm9rZS13aWR0aDogMS41cHg7ZmlsbDpub25lIj48L3BhdGg+PGRlZnM+PG1hcmtlciBpZD0iYXJyb3doZWFkMzQ4IiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlclVuaXRzPSJzdHJva2VXaWR0aCIgbWFya2VyV2lkdGg9IjgiIG1hcmtlckhlaWdodD0iNiIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNIDAgMCBMIDEwIDUgTCAwIDEwIHoiIGNsYXNzPSJhcnJvd2hlYWRQYXRoIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxcHg7IHN0cm9rZS1kYXNoYXJyYXk6IDFweCwgMHB4OyI+PC9wYXRoPjwvbWFya2VyPjwvZGVmcz48L2c+PGcgY2xhc3M9ImVkZ2VQYXRoIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxwYXRoIGNsYXNzPSJwYXRoIiBkPSJNMjM1LjUzMTI1LDE0Mi41NjI1TDIzNS41MzEyNSwxNjcuNTYyNUwyMzUuNTMxMjUsMTkyLjU2MjUiIG1hcmtlci1lbmQ9InVybCgjYXJyb3doZWFkMzQ5KSIgc3R5bGU9InN0cm9rZTogIzMzMzsgc3Ryb2tlLXdpZHRoOiAxLjVweDtmaWxsOm5vbmUiPjwvcGF0aD48ZGVmcz48bWFya2VyIGlkPSJhcnJvd2hlYWQzNDkiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOSIgcmVmWT0iNSIgbWFya2VyVW5pdHM9InN0cm9rZVdpZHRoIiBtYXJrZXJXaWR0aD0iOCIgbWFya2VySGVpZ2h0PSI2IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0gMCAwIEwgMTAgNSBMIDAgMTAgeiIgY2xhc3M9ImFycm93aGVhZFBhdGgiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDFweDsgc3Ryb2tlLWRhc2hhcnJheTogMXB4LCAwcHg7Ij48L3BhdGg+PC9tYXJrZXI+PC9kZWZzPjwvZz48ZyBjbGFzcz0iZWRnZVBhdGgiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PHBhdGggY2xhc3M9InBhdGgiIGQ9Ik0yMzUuNTMxMjUsMjI4Ljg0Mzc1TDIzNS41MzEyNSwyNTMuODQzNzVMMjM1LjUzMTI1LDI3OC44NDM3NSIgbWFya2VyLWVuZD0idXJsKCNhcnJvd2hlYWQzNTApIiBzdHlsZT0ic3Ryb2tlOiAjMzMzOyBzdHJva2Utd2lkdGg6IDEuNXB4O2ZpbGw6bm9uZSI+PC9wYXRoPjxkZWZzPjxtYXJrZXIgaWQ9ImFycm93aGVhZDM1MCIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI5IiByZWZZPSI1IiBtYXJrZXJVbml0cz0ic3Ryb2tlV2lkdGgiIG1hcmtlcldpZHRoPSI4IiBtYXJrZXJIZWlnaHQ9IjYiIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTSAwIDAgTCAxMCA1IEwgMCAxMCB6IiBjbGFzcz0iYXJyb3doZWFkUGF0aCIgc3R5bGU9InN0cm9rZS13aWR0aDogMXB4OyBzdHJva2UtZGFzaGFycmF5OiAxcHgsIDBweDsiPjwvcGF0aD48L21hcmtlcj48L2RlZnM+PC9nPjxnIGNsYXNzPSJlZGdlUGF0aCIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48cGF0aCBjbGFzcz0icGF0aCIgZD0iTTIzNS41MzEyNSwzMTUuMTI1TDIzNS41MzEyNSwzNDAuMTI1TDIzNS41MzEyNSwzNjUuMTI1IiBtYXJrZXItZW5kPSJ1cmwoI2Fycm93aGVhZDM1MSkiIHN0eWxlPSJzdHJva2U6ICMzMzM7IHN0cm9rZS13aWR0aDogMS41cHg7ZmlsbDpub25lIj48L3BhdGg+PGRlZnM+PG1hcmtlciBpZD0iYXJyb3doZWFkMzUxIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlclVuaXRzPSJzdHJva2VXaWR0aCIgbWFya2VyV2lkdGg9IjgiIG1hcmtlckhlaWdodD0iNiIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNIDAgMCBMIDEwIDUgTCAwIDEwIHoiIGNsYXNzPSJhcnJvd2hlYWRQYXRoIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxcHg7IHN0cm9rZS1kYXNoYXJyYXk6IDFweCwgMHB4OyI+PC9wYXRoPjwvbWFya2VyPjwvZGVmcz48L2c+PGcgY2xhc3M9ImVkZ2VQYXRoIiBzdHlsZT0ib3BhY2l0eTogMTsiPjxwYXRoIGNsYXNzPSJwYXRoIiBkPSJNMjM1LjUzMTI1LDQwMS40MDYyNUwyMzUuNTMxMjUsNDI2LjQwNjI1TDIzNS41MzEyNSw0NTEuNDA2MjUiIG1hcmtlci1lbmQ9InVybCgjYXJyb3doZWFkMzUyKSIgc3R5bGU9InN0cm9rZTogIzMzMzsgc3Ryb2tlLXdpZHRoOiAxLjVweDtmaWxsOm5vbmUiPjwvcGF0aD48ZGVmcz48bWFya2VyIGlkPSJhcnJvd2hlYWQzNTIiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOSIgcmVmWT0iNSIgbWFya2VyVW5pdHM9InN0cm9rZVdpZHRoIiBtYXJrZXJXaWR0aD0iOCIgbWFya2VySGVpZ2h0PSI2IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0gMCAwIEwgMTAgNSBMIDAgMTAgeiIgY2xhc3M9ImFycm93aGVhZFBhdGgiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDFweDsgc3Ryb2tlLWRhc2hhcnJheTogMXB4LCAwcHg7Ij48L3BhdGg+PC9tYXJrZXI+PC9kZWZzPjwvZz48L2c+PGcgY2xhc3M9ImVkZ2VMYWJlbHMiPjxnIGNsYXNzPSJlZGdlTGFiZWwiIHN0eWxlPSJvcGFjaXR5OiAxOyIgdHJhbnNmb3JtPSIiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiIGNsYXNzPSJsYWJlbCI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB3aWR0aD0iMCIgaGVpZ2h0PSIwIiBzdHlsZT0iZmlsbDojZThlOGU4OyI+PC9yZWN0Pjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj48L3RzcGFuPjwvdGV4dD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiIHN0eWxlPSJvcGFjaXR5OiAxOyIgdHJhbnNmb3JtPSIiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiIGNsYXNzPSJsYWJlbCI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB3aWR0aD0iMCIgaGVpZ2h0PSIwIiBzdHlsZT0iZmlsbDojZThlOGU4OyI+PC9yZWN0Pjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj48L3RzcGFuPjwvdGV4dD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiIHN0eWxlPSJvcGFjaXR5OiAxOyIgdHJhbnNmb3JtPSIiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiIGNsYXNzPSJsYWJlbCI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB3aWR0aD0iMCIgaGVpZ2h0PSIwIiBzdHlsZT0iZmlsbDojZThlOGU4OyI+PC9yZWN0Pjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj48L3RzcGFuPjwvdGV4dD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiIHN0eWxlPSJvcGFjaXR5OiAxOyIgdHJhbnNmb3JtPSIiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiIGNsYXNzPSJsYWJlbCI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB3aWR0aD0iMCIgaGVpZ2h0PSIwIiBzdHlsZT0iZmlsbDojZThlOGU4OyI+PC9yZWN0Pjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj48L3RzcGFuPjwvdGV4dD48L2c+PC9nPjxnIGNsYXNzPSJlZGdlTGFiZWwiIHN0eWxlPSJvcGFjaXR5OiAxOyIgdHJhbnNmb3JtPSIiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiIGNsYXNzPSJsYWJlbCI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB3aWR0aD0iMCIgaGVpZ2h0PSIwIiBzdHlsZT0iZmlsbDojZThlOGU4OyI+PC9yZWN0Pjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj48L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48ZyBjbGFzcz0ibm9kZXMiPjxnIGNsYXNzPSJub2RlIiBzdHlsZT0ib3BhY2l0eTogMTsiIGlkPSJBIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMzUuNTMxMjUsMzguMTQwNjI1KSI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB4PSItMTc3LjIwMzEyNSIgeT0iLTE4LjE0MDYyNSIgd2lkdGg9IjM1NC40MDYyNSIgaGVpZ2h0PSIzNi4yODEyNSI+PC9yZWN0PjxnIGNsYXNzPSJsYWJlbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE2Ny4yMDMxMjUsLTguMTQwNjI1KSI+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPuagueaNrnNlbGludXhfZW5mb3JjaW5nX2Jvb3Torr7nva5zZWxpbnV4X3N0YXRlLmVuZm9yY2luZzwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PC9nPjxnIGNsYXNzPSJub2RlIiBzdHlsZT0ib3BhY2l0eTogMTsiIGlkPSJCIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMzUuNTMxMjUsMTI0LjQyMTg3NSkiPjxyZWN0IHJ4PSIwIiByeT0iMCIgeD0iLTEwNS43MjY1NjI1IiB5PSItMTguMTQwNjI1IiB3aWR0aD0iMjExLjQ1MzEyNSIgaGVpZ2h0PSIzNi4yODEyNSI+PC9yZWN0PjxnIGNsYXNzPSJsYWJlbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTk1LjcyNjU2MjUsLTguMTQwNjI1KSI+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPnNlbGludXhfc3NfaW5pdCwgc2VsaW51eF9hdmNfaW5pdDwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PC9nPjxnIGNsYXNzPSJub2RlIiBzdHlsZT0ib3BhY2l0eTogMTsiIGlkPSJEIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMzUuNTMxMjUsMjEwLjcwMzEyNSkiPjxyZWN0IHJ4PSIwIiByeT0iMCIgeD0iLTY0LjE3OTY4NzUiIHk9Ii0xOC4xNDA2MjUiIHdpZHRoPSIxMjguMzU5Mzc1IiBoZWlnaHQ9IjM2LjI4MTI1Ij48L3JlY3Q+PGcgY2xhc3M9ImxhYmVsIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDApIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNTQuMTc5Njg3NSwtOC4xNDA2MjUpIj48dGV4dD48dHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZHk9IjFlbSIgeD0iMSI+Y3JlZF9pbml0X3NlY3VyaXR5PC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PGcgY2xhc3M9Im5vZGUiIHN0eWxlPSJvcGFjaXR5OiAxOyIgaWQ9IkUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzNS41MzEyNSwyOTYuOTg0Mzc1KSI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB4PSItMjE1LjUzMTI1IiB5PSItMTguMTQwNjI1IiB3aWR0aD0iNDMxLjA2MjUiIGhlaWdodD0iMzYuMjgxMjUiPjwvcmVjdD48ZyBjbGFzcz0ibGFiZWwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMDUuNTMxMjUsLTguMTQwNjI1KSI+PHRleHQ+PHRzcGFuIHhtbDpzcGFjZT0icHJlc2VydmUiIGR5PSIxZW0iIHg9IjEiPmF2Y19pbml0LCBhdnRhYl9jYWNoZV9pbml0LCBlYml0bWFwX2NhY2hlX2luaXQsIGhhc2h0YWJfY2FjaGVfaW5pdDwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PC9nPjxnIGNsYXNzPSJub2RlIiBzdHlsZT0ib3BhY2l0eTogMTsiIGlkPSJGIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMzUuNTMxMjUsMzgzLjI2NTYyNSkiPjxyZWN0IHJ4PSIwIiByeT0iMCIgeD0iLTY4Ljg1OTM3NSIgeT0iLTE4LjE0MDYyNSIgd2lkdGg9IjEzNy43MTg3NSIgaGVpZ2h0PSIzNi4yODEyNSI+PC9yZWN0PjxnIGNsYXNzPSJsYWJlbCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTU4Ljg1OTM3NSwtOC4xNDA2MjUpIj48dGV4dD48dHNwYW4geG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZHk9IjFlbSIgeD0iMSI+c2VjdXJpdHlfYWRkX2hvb2tzPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PGcgY2xhc3M9Im5vZGUiIHN0eWxlPSJvcGFjaXR5OiAxOyIgaWQ9IkciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIzNS41MzEyNSw0NjkuNTQ2ODc1KSI+PHJlY3Qgcng9IjAiIHJ5PSIwIiB4PSItNjIuOTkyMTg3NSIgeT0iLTE4LjE0MDYyNSIgd2lkdGg9IjEyNS45ODQzNzUiIGhlaWdodD0iMzYuMjgxMjUiPjwvcmVjdD48ZyBjbGFzcz0ibGFiZWwiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC01Mi45OTIxODc1LC04LjE0MDYyNSkiPjx0ZXh0Pjx0c3BhbiB4bWw6c3BhY2U9InByZXNlcnZlIiBkeT0iMWVtIiB4PSIxIj5hdmNfYWRkX2NhbGxiYWNrPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PC9nPjwvZz48L2c+PC9zdmc+

这里比较重要的是

  • cred_init_security为current创建了初始身份, 注意此时init进程还未被拉起,所以init进程启动后,会继承该身份,即SECINITSID_KERNEL
	tsec->osid = tsec->sid = SECINITSID_KERNEL;
	cred->security = tsec;
  • SELinux定义的hook列表,被加入到LSM子系统的hook列表中,自此,内核的系统调用就会进入SELinux子系统的视野。
  • selinux_init会根据内核启动参数,设置enforcing模式

security_setenforce

security_setenforce为libselinux接口,其实就是往selinuxfs的enforce文件写1。此处只考虑启动时的setenforce。此时由于libselinux中调用顺序,setenforce在load_policy之前,所以此时state->initialized仍为0,策略也还未加载。参考selinuxfs实现,也就是调用sel_write_enforce函数。整个sel_write_enforce函数逻辑比较简单,主要就是做了以下几件事情:

  • 在需要时设置selinux_state.enforcing变量
  • 如果设置了变了就通知enforcing状态变更,并刷新AVC
    这里值得注意的就是,selinuxfs的enforce文件也是一个文件,对其写,SELinux也进行了权限判断,如下:
length = avc_has_perm(&selinux_state,
              current_sid(), SECINITSID_SECURITY,
              SECCLASS_SECURITY, SECURITY__SETENFORCE,
              NULL);

匹配的双方分别是:

  • current_sid()
  • SECINITSID_SECURITY

current_sid()即init进程第一次运行时的SID,此时策略尚未加载,所以此时的SID是SECINITSID_KERNEL。这里的SECINITSID_SECURITY就是本章一直关注的initial SID, SECINITSID_KERNEL也是。此时的权限判断,由于在系统启动的非常早期,所以判断逻辑非常简单,在security_compute_av中:

if (!state->initialized)
    goto allow;

在启动后,如果用户通过selinuxfs enforce来配置SELinux模式时,则会判断进程的身份和一个initial SID SECINITSID_SECURITY的匹配关系。

security_load_policy

策略加载由用户态的init进程发起,其方法就是mmap策略二进制文件,并将数据写入selinuxfs的load文件,最终调用sel_write_load函数。该函数分以下几步:

  1. 判断用户写load文件的权限, 此时策略尚未加载,且state->initialized仍为0(该变量由security_load_policy赋值)。所以此时的avc_has_perm只是走个过场
length = avc_has_perm(&selinux_state,
              current_sid(), SECINITSID_SECURITY,
              SECCLASS_SECURITY, SECURITY__LOAD_POLICY, NULL);
  1. security_load_policy是加载策略的主角,他加载了所有策略数据,也包括了我们关注的initial SID
  2. sel_make_policy_nodes用来生成selinuxfs相关的节点,包括:bools,classes,policycap
    security_load_policy调用policydb_load_isids初始化sidtab,并插入了所有的initial SID以及其对应context。intial SID由initial_sid文件指定,而其对应的context,由对应的.te文件定义。例如sid kernel其上下文由policy/modules/kernel/kernel.te指定:
sid kernel gen_context(system_u:system_r:kernel_t,mls_systemhigh)

策略加载是SELinux最核心也是最复杂的部分。security_load_policy调用policydb_read把整个策略二进制文件加载到内存的policydb数据结构中。除了加载策略,security_load_policy还做了几件初始化的事情,标注在代码里。

rc = policydb_read(policydb, fp);
if (rc)
    goto out;

policydb->len = len;
rc = selinux_set_mapping(policydb, secclass_map,
             &state->ss->map);
if (rc) {
    policydb_destroy(policydb);
    goto out;
}

rc = policydb_load_isids(policydb, sidtab); // 加载initial SID到policydb sidtab中
if (rc) {
    policydb_destroy(policydb);
    goto out;
}

security_load_policycaps(state); // 加载policy capability
state->initialized = 1; // 设置SELinux初始化标志
seqno = ++state->ss->latest_granting;
selinux_complete_init(); // 完成selinuxfs super block delayed init
avc_ss_reset(state->avc, seqno); 
selnl_notify_policyload(seqno);
selinux_status_update_policyload(state, seqno);

总结

整个SELinux初始化,发起于0号进程,并由内核SELinux模块完成。内核的核心初始化主要包括策略的加载和selinuxfs的初始化。所有的SELinux用户态接口都是通过selinuxfs实现的。

参考文献

  • Linux source 4.20.5
  • busybox master on 2020/10/11
%5BTOC%5D%0ASELinux%E5%90%AF%E5%8A%A8%E6%B5%81%E7%A8%8B%E5%8C%85%E5%90%AB%E4%BA%86%E5%87%A0%E4%B8%AA%E9%98%B6%E6%AE%B5%EF%BC%9A%0A-%20init%E8%BF%9B%E7%A8%8B%0A-%20libselinux%0A-%20%E5%86%85%E6%A0%B8%E9%83%A8%E5%88%86%0A%23%201%E5%8F%B7%E8%BF%9B%E7%A8%8B%0ASELinux%E7%9A%84%E5%90%AF%E5%8A%A8%E7%94%B1%E7%94%A8%E6%88%B7%E6%80%81init%E7%A8%8B%E5%BA%8F%E5%8F%91%E8%B5%B7%EF%BC%8C%E4%BE%8B%E5%A6%82CentOS%E4%B8%8A%E7%9A%84systemd%EF%BC%8C%E5%86%8D%E4%BE%8B%E5%A6%82busybox%E7%9A%84init%E8%BF%9B%E7%A8%8B%E3%80%82%E7%94%A8%E6%88%B7%E6%80%81%E5%88%9D%E5%A7%8B%E5%8C%96%E6%96%B9%E6%B3%95%E5%A4%A7%E5%90%8C%E5%B0%8F%E5%BC%82%EF%BC%8C%E9%83%BD%E6%98%AF%E5%88%A9%E7%94%A8SELinux%E6%8F%90%E4%BE%9B%E7%9A%84%E7%94%A8%E6%88%B7%E6%80%81%E6%8E%A5%E5%8F%A3%EF%BC%8C%E5%8C%85%E6%8B%AClibselinux%EF%BC%8Cselinuxfs%E8%B0%83%E7%94%A8SELinux%E5%86%85%E6%A0%B8%E6%8E%A5%E5%8F%A3%E3%80%82%E6%9C%AC%E6%96%87%E4%BB%A5busybox%20init%E4%B8%BA%E4%BE%8B%E4%BB%8B%E7%BB%8D%E3%80%82%0A%E5%85%B6%E5%AE%9E%E7%94%A8%E6%88%B7%E6%80%81%E8%BF%9B%E7%A8%8B%E9%83%A8%E5%88%86%E4%BB%A3%E7%A0%81%E9%9D%9E%E5%B8%B8%E5%B0%91%EF%BC%9A%0A%60%60%60c%0A%23if%20ENABLE_SELINUX%0A%09if%20(getenv(%22SELINUX_INIT%22)%20%3D%3D%20NULL)%20%7B%0A%09%09int%20enforce%20%3D%200%3B%0A%0A%09%09putenv((char*)%22SELINUX_INIT%3DYES%22)%3B%0A%09%09if%20(selinux_init_load_policy(%26enforce)%20%3D%3D%200)%20%7B%0A%09%09%09BB_EXECVP(argv%5B0%5D%2C%20argv)%3B%0A%09%09%7D%20else%20if%20(enforce%20%3E%200)%20%7B%0A%09%09%09%2F*%20SELinux%20in%20enforcing%20mode%20but%20load_policy%20failed%20*%2F%0A%09%09%09message(L_CONSOLE%2C%20%22can't%20load%20SELinux%20Policy.%20%22%0A%09%09%09%09%22Machine%20is%20in%20enforcing%20mode.%20Halting%20now.%22)%3B%0A%09%09%09return%20EXIT_FAILURE%3B%0A%09%09%7D%0A%09%7D%0A%23endif%0A%60%60%60%0A%E5%85%B6%E4%B8%AD%60selinux_init_load_policy%60%E6%98%AFlibselinux%E6%8F%90%E4%BE%9B%E7%9A%84%E6%8E%A5%E5%8F%A3%EF%BC%8C%E7%94%A8%E6%9D%A5%E5%AF%B9%E6%95%B4%E4%B8%AASELinux%E5%AD%90%E7%B3%BB%E7%BB%9F%E8%BF%9B%E8%A1%8C%E5%88%9D%E5%A7%8B%E5%8C%96%E3%80%82%E8%80%8C%60BB_EXECVP%60%E6%98%AF%E7%94%B1%E5%AE%8F%E5%AE%9A%E4%B9%89%E7%9A%84exec%E7%B1%BBlibc%E6%8E%A5%E5%8F%A3%EF%BC%8C%E5%AE%9E%E9%99%85%E4%B8%8A%E5%B0%B1%E6%98%AFinit%E8%BF%9B%E7%A8%8B%E5%8F%88%E9%87%8D%E6%96%B0%E6%89%A7%E8%A1%8C%E4%BA%86%E4%B8%80%E9%81%8D%EF%BC%8C%E8%BF%99%E6%A0%B7init%E8%BF%9B%E7%A8%8B%E6%9C%AC%E8%BA%AB%E5%B0%B1%E6%9C%89%E4%BA%86%E6%AD%A3%E7%A1%AE%E7%9A%84%E8%BA%AB%E4%BB%BD%E4%BA%86%EF%BC%88%E5%9B%A0%E4%B8%BA%E5%AE%9A%E4%B9%89%E4%BA%86type_transition%E8%A7%84%E5%88%99)%E3%80%82%0A%60%60%60c%0A%23define%20BB_EXECVP(prog%2Ccmd)%20%20%20%20%20execvp(prog%2Ccmd)%0A%60%60%60%0A%0A%23%20libselinux%E9%83%A8%E5%88%86%0ASELinux%E6%9C%89%E5%BE%88%E5%A4%A7%E4%B8%80%E9%83%A8%E5%88%86%E6%9C%BA%E5%88%B6%E5%A4%84%E4%BA%8E%E7%94%A8%E6%88%B7%E6%80%81%EF%BC%8C%E5%8C%85%E6%8B%AC%E6%A8%A1%E5%BC%8F%E9%85%8D%E7%BD%AE%EF%BC%8C%E7%AD%96%E7%95%A5%E6%9F%A5%E8%AF%A2%E7%AD%89%E7%AD%89%E3%80%82%E8%80%8C%E8%BF%99%E4%B8%80%E5%88%87%E7%9A%84%E5%88%9D%E5%A7%8B%E5%8C%96%E9%83%BD%E7%94%B1libselinux%E6%8F%90%E4%BE%9B%E7%9A%84%60selinux_init_load_policy%60%E6%8E%A5%E5%8F%A3%E6%9D%A5%E5%AE%9E%E7%8E%B0%E3%80%82%E5%8F%AF%E4%BB%A5%E8%AF%B4libselinux%E9%83%A8%E5%88%86%E6%98%AFSELinux%E7%94%A8%E6%88%B7%E6%80%81%E6%9C%80%E9%87%8D%E8%A6%81%EF%BC%8C%E8%80%8C%E5%BE%80%E5%BE%80%E5%8F%88%E5%AE%B9%E6%98%93%E8%A2%AB%E5%BF%BD%E8%A7%86%E7%9A%84%E9%83%A8%E5%88%86%E3%80%82%0A%60%60%60mermaid%0Agraph%20TD%0AA%5Bselinux_init_load_policy%5D%0AA%20--%3E%20B%5B%22selinux_reset_config%22%5D%0AB%20--%3E%20C%5B%22get%20enforce%20mode%22%5D%0AC%20--%3E%20%7C1%7C%20D%5B%22from%20%2Fetc%2Fselinux%2Fconfig%E6%96%87%E4%BB%B6%22%5D%0AC%20--%3E%20%7C2%7C%20E%5B%22from%20%E5%86%85%E6%A0%B8%E5%90%AF%E5%8A%A8%E5%8F%82%E6%95%B0%2Fproc%2Fcmdline%22%5D%0AD%20--%3E%20F%5B%22mount%20selinuxfs%E5%88%B0%2Fsys%2Ffs%2Fselinux%EF%BC%88%E6%97%A7%E7%9A%84%E6%8C%82%E8%BD%BD%E7%82%B9%E5%9C%A8%2Fselinux%EF%BC%89%22%5D%0AE%20--%3E%20F%0AF%20--%3E%20G%5B%22%E4%BD%BF%E8%83%BDSELinux%EF%BC%8C%E9%80%9A%E8%BF%87%E5%BE%80%2Fsys%2Ffs%2Fselinux%2Fenforce%E5%86%991%22%5D%0AG%20--%3E%20H%5B%22%E5%8A%A0%E8%BD%BD%E7%AD%96%E7%95%A5%EF%BC%8Cselinux_mkload_policy%22%5D%0A%60%60%60%0A%60selinux_mkload_policy%60%E4%BB%8D%E7%84%B6%E6%98%AFlibselinux%E5%AE%9A%E4%B9%89%E7%9A%84%E6%8E%A5%E5%8F%A3%EF%BC%8C%E5%85%B6%E8%B0%83%E7%94%A8%E4%BA%86libsel%E5%BA%93%EF%BC%8C%E5%AF%B9%E8%AF%BB%E5%85%A5%E7%9A%84%E7%AD%96%E7%95%A5%E4%BA%8C%E8%BF%9B%E5%88%B6%E8%BF%9B%E8%A1%8C%E4%BA%86%E9%A2%84%E5%A4%84%E7%90%86%EF%BC%8C%E4%BE%8B%E5%A6%82%E7%AD%96%E7%95%A5%E8%AF%AD%E8%A8%80%E7%89%88%E6%9C%AC%E4%B8%8D%E5%8C%B9%E9%85%8D%E6%97%B6%E7%9A%84%E8%AF%AD%E6%B3%95%E9%99%8D%E7%BA%A7%E3%80%82%E6%9C%80%E7%BB%88%E8%B0%83%E7%94%A8%60security_load_policy%60%E6%9D%A5%E5%8A%A0%E8%BD%BD%E7%AD%96%E7%95%A5%EF%BC%8C%E8%80%8C%E8%AF%A5%E5%87%BD%E6%95%B0%E4%BB%85%E4%BB%85%E6%98%AF%E5%B0%86mmap%E5%87%BA%E7%9A%84%E6%96%87%E4%BB%B6%EF%BC%8C%E5%86%99%E5%85%A5%2Fsys%2Ffs%2Fselinux%2Fload%E6%96%87%E4%BB%B6%EF%BC%8C%E4%BB%8E%E8%80%8C%E4%BD%BF%E5%86%85%E6%A0%B8%E5%8F%AF%E4%BB%A5%E5%81%9A%E7%9C%9F%E6%AD%A3%E7%9A%84%E5%8A%A0%E8%BD%BD%E7%AD%96%E7%95%A5%E5%B7%A5%E4%BD%9C%E3%80%82%0A%23%20%E5%86%85%E6%A0%B8%E9%83%A8%E5%88%86%0ASELinux%E6%9C%80%E6%A0%B8%E5%BF%83%E7%9A%84%E9%83%A8%E5%88%86%E5%B0%B1%E6%98%AF%E5%86%85%E6%A0%B8%E4%B8%AD%E7%9A%84LSM%E6%A1%86%E6%9E%B6%E4%BB%A5%E5%8F%8Aselinux%E6%A8%A1%E5%9D%97%E9%83%A8%E5%88%86%E3%80%82%E5%85%B6%E4%BD%8D%E7%BD%AE%E4%BD%8D%E4%BA%8E%60security%2Fselinux%60%E3%80%82%E8%80%8C%E5%88%9A%E6%89%8D%E6%8F%90%E5%88%B0%E7%9A%84selinuxfs%E6%BA%90%E7%A0%81%E4%BD%8D%E4%BA%8E%60security%2Fselinux%2Fselinuxfs.c%60%E3%80%82%0A%23%23%20selinuxfs%0A%E5%85%B6%E5%88%9D%E5%A7%8B%E5%8C%96%E4%BD%8D%E4%BA%8E%60init_sel_fs%60%E3%80%82%E8%BF%99%E6%98%AF%E4%B8%80%E4%B8%AA%E5%86%85%E6%A0%B8%E5%88%9D%E5%A7%8B%E5%8C%96%E5%87%BD%E6%95%B0%EF%BC%8C%E7%94%B1%E5%86%85%E6%A0%B8%E5%90%AF%E5%8A%A8%E6%97%B6%E8%B0%83%E7%94%A8%E3%80%82%E5%85%B6%E4%BD%9C%E7%94%A8%E5%B0%B1%E6%98%AF%E4%BD%BF%E7%94%A8Linux%E5%86%85%E6%A0%B8%E7%9A%84libfs%E6%8E%A5%E5%8F%A3%EF%BC%8C%E5%B0%86selinuxfs%E5%87%86%E5%A4%87%E5%A5%BD%EF%BC%8C%E5%9C%A8init%E8%BF%9B%E7%A8%8B%E4%B8%AD%E5%86%8D%E8%BF%9B%E8%A1%8C%E6%8C%82%E8%BD%BD%E3%80%82%E5%85%B6%E4%B8%AD%E6%9C%89%E4%B8%80%E4%B8%AA%E5%85%B3%E9%94%AE%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%EF%BC%8C%E5%8D%B3%60selinux_files%60%E3%80%82%0A%60%60%60c%0Astatic%20const%20struct%20tree_descr%20selinux_files%5B%5D%20%3D%20%7B%0A%20%20%20%20%5BSEL_LOAD%5D%20%3D%20%7B%22load%22%2C%20%26sel_load_ops%2C%20S_IRUSR%7CS_IWUSR%7D%2C%0A%20%20%20%20%5BSEL_ENFORCE%5D%20%3D%20%7B%22enforce%22%2C%20%26sel_enforce_ops%2C%20S_IRUGO%7CS_IWUSR%7D%2C%0A%20%20%20%20%5BSEL_CONTEXT%5D%20%3D%20%7B%22context%22%2C%20%26transaction_ops%2C%20S_IRUGO%7CS_IWUGO%7D%2C%0A%20%20%20%20%5BSEL_ACCESS%5D%20%3D%20%7B%22access%22%2C%20%26transaction_ops%2C%20S_IRUGO%7CS_IWUGO%7D%2C%0A%20%20%20%20%5BSEL_CREATE%5D%20%3D%20%7B%22create%22%2C%20%26transaction_ops%2C%20S_IRUGO%7CS_IWUGO%7D%2C%0A%20%20%20%20%5BSEL_RELABEL%5D%20%3D%20%7B%22relabel%22%2C%20%26transaction_ops%2C%20S_IRUGO%7CS_IWUGO%7D%2C%0A%20%20%20%20%5BSEL_USER%5D%20%3D%20%7B%22user%22%2C%20%26transaction_ops%2C%20S_IRUGO%7CS_IWUGO%7D%2C%0A%20%20%20%20%5BSEL_POLICYVERS%5D%20%3D%20%7B%22policyvers%22%2C%20%26sel_policyvers_ops%2C%20S_IRUGO%7D%2C%0A%20%20%20%20%5BSEL_COMMIT_BOOLS%5D%20%3D%20%7B%22commit_pending_bools%22%2C%20%26sel_commit_bools_ops%2C%20S_IWUSR%7D%2C%0A%20%20%20%20%5BSEL_MLS%5D%20%3D%20%7B%22mls%22%2C%20%26sel_mls_ops%2C%20S_IRUGO%7D%2C%0A%20%20%20%20%5BSEL_DISABLE%5D%20%3D%20%7B%22disable%22%2C%20%26sel_disable_ops%2C%20S_IWUSR%7D%2C%0A%20%20%20%20%5BSEL_MEMBER%5D%20%3D%20%7B%22member%22%2C%20%26transaction_ops%2C%20S_IRUGO%7CS_IWUGO%7D%2C%0A%20%20%20%20%5BSEL_CHECKREQPROT%5D%20%3D%20%7B%22checkreqprot%22%2C%20%26sel_checkreqprot_ops%2C%20S_IRUGO%7CS_IWUSR%7D%2C%0A%20%20%20%20%5BSEL_REJECT_UNKNOWN%5D%20%3D%20%7B%22reject_unknown%22%2C%20%26sel_handle_unknown_ops%2C%20S_IRUGO%7D%2C%0A%20%20%20%20%5BSEL_DENY_UNKNOWN%5D%20%3D%20%7B%22deny_unknown%22%2C%20%26sel_handle_unknown_ops%2C%20S_IRUGO%7D%2C%0A%20%20%20%20%5BSEL_STATUS%5D%20%3D%20%7B%22status%22%2C%20%26sel_handle_status_ops%2C%20S_IRUGO%7D%2C%0A%20%20%20%20%5BSEL_POLICY%5D%20%3D%20%7B%22policy%22%2C%20%26sel_policy_ops%2C%20S_IRUGO%7D%2C%0A%20%20%20%20%5BSEL_VALIDATE_TRANS%5D%20%3D%20%7B%22validatetrans%22%2C%20%26sel_transition_ops%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20S_IWUGO%7D%2C%0A%20%20%20%20%2F*%20last%20one%20*%2F%20%7B%22%22%7D%0A%7D%3B%0A%60%60%60%0A%E4%BB%96%E4%B8%BA%E6%AF%8F%E4%B8%AAselinuxfs%E6%96%87%E4%BB%B6%E5%9D%87%E5%AE%9A%E4%B9%89%E4%BA%86file_operation%E3%80%82%E5%86%8D%E7%9C%8B%E7%9C%8B%E8%BF%90%E8%A1%8C%E6%97%B6%E7%9A%84selinuxfs%EF%BC%9A%0A%60%60%60shell%0A%5Bben%40localhost%20targeted%5D%24%20tree%20%2Fsys%2Ffs%2Fselinux%2F%20-L%201%0A%2Fsys%2Ffs%2Fselinux%2F%0A%E2%94%9C%E2%94%80%E2%94%80%20access%0A%E2%94%9C%E2%94%80%E2%94%80%20avc%0A%E2%94%9C%E2%94%80%E2%94%80%20booleans%0A%E2%94%9C%E2%94%80%E2%94%80%20checkreqprot%0A%E2%94%9C%E2%94%80%E2%94%80%20class%0A%E2%94%9C%E2%94%80%E2%94%80%20commit_pending_bools%0A%E2%94%9C%E2%94%80%E2%94%80%20context%0A%E2%94%9C%E2%94%80%E2%94%80%20create%0A%E2%94%9C%E2%94%80%E2%94%80%20deny_unknown%0A%E2%94%9C%E2%94%80%E2%94%80%20disable%0A%E2%94%9C%E2%94%80%E2%94%80%20enforce%0A%E2%94%9C%E2%94%80%E2%94%80%20initial_contexts%0A%E2%94%9C%E2%94%80%E2%94%80%20load%0A%E2%94%9C%E2%94%80%E2%94%80%20member%0A%E2%94%9C%E2%94%80%E2%94%80%20mls%0A%E2%94%9C%E2%94%80%E2%94%80%20null%0A%E2%94%9C%E2%94%80%E2%94%80%20policy%0A%E2%94%9C%E2%94%80%E2%94%80%20policy_capabilities%0A%E2%94%9C%E2%94%80%E2%94%80%20policyvers%0A%E2%94%9C%E2%94%80%E2%94%80%20reject_unknown%0A%E2%94%9C%E2%94%80%E2%94%80%20relabel%0A%E2%94%9C%E2%94%80%E2%94%80%20ss%0A%E2%94%9C%E2%94%80%E2%94%80%20status%0A%E2%94%9C%E2%94%80%E2%94%80%20user%0A%E2%94%94%E2%94%80%E2%94%80%20validatetrans%0A%0A6%20directories%2C%2019%20files%0A%60%60%60%0A%60selinux_files%60%E5%AE%9A%E4%B9%89%E7%9A%84%E6%96%87%E4%BB%B6%E5%9C%A8%E8%BF%99%E9%87%8C%E9%83%BD%E5%8F%AF%E4%BB%A5%E6%89%BE%E5%88%B0%EF%BC%8C%E9%99%A4%E4%BA%86%E4%B8%80%E4%B8%AA%E7%89%B9%E6%AE%8A%E7%9A%84%E6%96%87%E4%BB%B6null%E3%80%82%60init_sel_fs%60%E9%99%A4%E4%BA%86%E5%88%9B%E5%BB%BA%E8%BF%99%E4%BA%9B%E6%96%87%E4%BB%B6%EF%BC%8C%E8%BF%98%E5%88%9B%E5%BB%BA%E4%BA%86%E4%B8%80%E4%BA%9B%E7%9B%AE%E5%BD%95%EF%BC%8C%E4%BE%8B%E5%A6%82avc%2C%20booleans%2C%20class%2C%20initial_contexts%E7%AD%89%E3%80%82%0A%23%23%23%20selinuxfs%20SID%E5%88%9D%E5%A7%8B%E5%8C%96%0Aselinuxfs%E6%AF%8F%E4%B8%AA%E6%96%87%E4%BB%B6%E5%92%8C%E4%B8%80%E4%B8%AA%E6%99%AE%E9%80%9A%E6%96%87%E4%BB%B6%E4%B8%80%E6%A0%B7%EF%BC%8C%E9%83%BD%E6%9C%89%E5%AF%B9%E5%BA%94%E7%9A%84context%EF%BC%8C%E5%B9%B6%E5%AF%B9%E5%BA%94%E5%88%B0SID%E3%80%82SELinux%E5%AD%90%E7%B3%BB%E7%BB%9F%E5%9C%A8%E5%88%9D%E5%A7%8B%E5%8C%96%E6%97%B6%EF%BC%8C%E5%88%9B%E5%BB%BA%E4%BA%86selinuxfs%E3%80%82selinuxfs%E7%9A%84%E6%96%87%E4%BB%B6%E8%8A%82%E7%82%B9%E9%80%9A%E8%BF%87%60d_add(entry%2C%20inode)%60%E5%87%BD%E6%95%B0%E6%B7%BB%E5%8A%A0%E3%80%82%E8%80%8C%E6%AF%8F%E4%B8%AA%E6%96%87%E4%BB%B6%E7%9A%84SID%E4%B9%9F%E6%98%AF%E7%94%B1%60d_add%60%E6%89%93%E4%B8%8A%E3%80%82%E4%BD%86%E5%9B%A0%E4%B8%BA%E7%89%B5%E6%89%AF%E5%88%B0SELinux%E7%AD%96%E7%95%A5%E5%8A%A0%E8%BD%BD%EF%BC%8C%E8%BF%87%E7%A8%8B%E6%AF%94%E8%BE%83%E5%A4%8D%E6%9D%82%E4%B8%80%E4%BA%9B%E3%80%82%E5%85%88%E7%9C%8B%E7%9C%8B%60d_add%60%E6%80%8E%E4%B9%88%E6%9C%80%E7%BB%88%E5%AE%8C%E6%88%90selinux%E6%96%87%E4%BB%B6SID%E7%9A%84%E5%8A%A0%E8%BD%BD%E3%80%82%0A%60%60%60mermaid%0Agraph%20TD%0AA%5B%22d_add%22%5D%0AA%20--%3E%20B%5B%22security_d_instantiate%22%5D%0AB%20--%3E%20C%5B%22call_void_hook(d_instantiate%2C...)%22%5D%0AC%20--%3E%20D%5B%22call%20each%20hook%20on%20list%20for%20d_instantiate%22%5D%0AD%20--is%20SELinux--%3E%20E%5B%22selinux_d_instantiate%22%5D%0AE%20--%3E%20F%5B%22inode_doinit_with_dentry%22%5D%0AF%20--%3E%20G%7B%22sbsec-%3Eflags%20%26%20SE_SBINITIALIZED%3F%22%7D%0AG%20--%3E%20%7CN%7C%20H%5B%22delayed%20init%22%5D%0AG%20--%3E%20%7CY%7C%20K%5B%22do%20real%20init%22%5D%0AH%20-.-%20I%5B%22selinux_complete_init%22%5D%0AI%20--%3E%20J%5B%22sbsec-%3Eflags%20%7C%3D%20SE_SBINITIALIZED%22%5D%0AJ%20--%3E%20F%0AK%20--%3E%20L%5B%22%E6%A0%B9%E6%8D%AEsbsec-%3Ebehavior)%E7%A1%AE%E5%AE%9Ainode-%3Ei_security-%3Esid%22%5D%0A%60%60%60%0Aselinuxfs%E6%96%87%E4%BB%B6%E7%9A%84SID%E6%9C%80%E7%BB%88%E7%94%B1%60inode_doinit_with_dentry%60%E8%B5%8B%E5%80%BC%E3%80%82%60inode_doinit_with_dentry%60%E8%A2%AB%E6%89%A7%E8%A1%8C%E4%BA%86%E4%B8%A4%E9%81%8D%EF%BC%8C%E7%AC%AC%E4%B8%80%E9%81%8D%E7%94%B1%E6%9C%80%E5%88%9D%E7%9A%84%E5%88%9D%E5%A7%8B%E5%8C%96%E5%87%BD%E6%95%B0%60__init%20init_sel_fs%60%E5%8F%91%E8%B5%B7%EF%BC%8C%E4%BD%86%E5%9B%A0%E4%B8%BA%E6%AD%A4%E6%97%B6%E7%AD%96%E7%95%A5%E8%BF%98%E6%B2%A1%E5%8A%A0%E8%BD%BD%EF%BC%8C%E6%89%80%E4%BB%A5%E9%9C%80%E8%A6%81%E4%B8%80%E4%B8%AAdelayed%20init%EF%BC%8C%E7%AC%AC%E4%BA%8C%E9%81%8D%E8%B0%83%E7%94%A8%E7%94%B1%60selinux_complete_init%60%E5%8F%91%E8%B5%B7%EF%BC%8C%E6%9C%80%E7%BB%88%E8%BF%9B%E5%85%A5%60inode_doinit_with_dentry%60%E5%AE%8C%E6%88%90selinuxfs%20SID%E6%9C%80%E7%BB%88%E7%9A%84%E5%88%9D%E5%A7%8B%E5%8C%96%E3%80%82%E6%B5%81%E7%A8%8B%E5%A4%A7%E8%87%B4%E5%A6%82%E4%B8%8B%EF%BC%9A%0A%60%60%60mermaid%0Agraph%20TD%0AA%5B%22selinux_complete_init%22%5D%0AA%20%3D%3D%3E%20B%5B%22delayed_superblock_init%22%5D%0AB%20%3D%3D%3E%20C%5B%22superblock_doinit%22%5D%0AC%20%3D%3D%3E%20D%5B%22selinux_set_mnt_opts%22%5D%0AD%20%3D%3D%3E%20E%5B%22sb_finish_set_opts%22%5D%0AE%20%3D%3D%3E%20F%5B%22inode_doinit_with_dentry%22%5D%0A%60%60%60%0A%60selinux_complete_init%60%E7%94%B1%60security_load_policy%60%E8%B0%83%E7%94%A8%EF%BC%8C%E8%80%8C%E8%B0%83%E7%94%A8%60inode_doinit_with_dentry%60%E6%97%B6policy%E5%92%8Cinitial%20SID%E5%9D%87%E5%B7%B2%E5%8A%A0%E8%BD%BD%E6%88%90%E5%8A%9F%E3%80%82%0A%60selinux_complete_init%60%E8%B0%83%E7%94%A8%60selinux_set_mnt_opts%60%E8%AE%BE%E7%BD%AE%E4%BA%86sbsec-%3Ebehavior%EF%BC%8C%E6%9C%80%E7%BB%88%60inode_doinit_with_dentry%60%E5%86%8D%E6%A0%B9%E6%8D%AE%60sbsec-%3Ebehavior%60%E8%AE%BE%E7%BD%AESID%E3%80%82%0A%60%60%60c%0Aif%20(!sbsec-%3Ebehavior)%20%7B%20%2F%2F%20%E7%94%B1sb_alloc_security%E5%88%86%E9%85%8D%EF%BC%8C%E5%B9%B6%E8%A2%AB%E5%88%9D%E5%A7%8B%E5%8C%96%E4%B8%BA0%EF%BC%8C%E6%89%80%E4%BB%A5%E4%B8%8B%E9%9D%A2%E7%9A%84security_fs_use%E4%BC%9A%E8%A2%AB%E8%B0%83%E7%94%A8%0A%20%20%20%20%2F*%0A%20%20%20%20%20*%20Determine%20the%20labeling%20behavior%20to%20use%20for%20this%0A%20%20%20%20%20*%20filesystem%20type.%0A%20%20%20%20%20*%2F%0A%20%20%20%20rc%20%3D%20security_fs_use(%26selinux_state%2C%20sb)%3B%0A%20%20%20%20if%20(rc)%20%7B%0A%20%20%20%20%20%20%20%20pr_warn(%22%25s%3A%20security_fs_use(%25s)%20returned%20%25d%5Cn%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20__func__%2C%20sb-%3Es_type-%3Ename%2C%20rc)%3B%0A%20%20%20%20%20%20%20%20goto%20out%3B%0A%20%20%20%20%7D%0A%7D%0A%60%60%60%0A%E8%80%83%E8%99%91selinuxfs%E6%B2%A1%E7%94%A8fs_use%EF%BC%8C%E4%BD%86%E7%94%A8%E4%BA%86genfs%EF%BC%8C%E6%89%80%E4%BB%A5%60security_fs_use%60%E6%9C%80%E7%BB%88%E4%BC%9A%E4%BD%BF%E7%94%A8genfs%E5%AF%B9%E5%BA%94%E7%9A%84SID%EF%BC%8C%E5%8F%82%E8%80%83Fedora%20refpolicy%EF%BC%8C%E5%8D%B3%60gen_context(system_u%3Aobject_r%3Asecurity_t%2Cs0)%60%E3%80%82%E6%89%80%E4%BB%A5%E5%8F%AF%E8%A7%81selinuxfs%E4%B8%AD%E7%9A%84%E6%96%87%E4%BB%B6SID%E6%9C%80%E7%BB%88%E4%BC%9A%E7%94%B1%E5%8A%A0%E8%BD%BD%E7%9A%84%E7%AD%96%E7%95%A5%E4%BA%8C%E8%BF%9B%E5%88%B6%E4%B8%AD%E5%AF%B9%E5%BA%94%E7%9A%84%E4%B8%8A%E4%B8%8B%E6%96%87%E6%9D%A5%E6%8F%8F%E8%BF%B0%E3%80%82%E4%BE%8B%E5%A6%82selinuxfs%E5%AF%B9%E5%BA%94%E7%9A%84genfscon%E8%AF%AD%E5%8F%A5%E3%80%82%E5%8F%AF%E4%BB%A5%E7%94%A8seinfo%E5%91%BD%E4%BB%A4%E9%AA%8C%E8%AF%81%EF%BC%9A%0A%60%60%60shell%0A%5Bben%40localhost%20gateways%5D%24%20seinfo%20--fs_use%7Cgrep%20selinux%0A%5Bben%40localhost%20gateways%5D%24%20seinfo%20--genfs%7Cgrep%20selinux%0A%20%20%20genfscon%20selinuxfs%20%2F%20%20system_u%3Aobject_r%3Asecurity_t%3As0%0A%60%60%60%0A%E7%AC%AC%E4%B8%80%E6%9D%A1%E5%91%BD%E4%BB%A4%E6%B2%A1%E6%9C%89%E4%BB%BB%E4%BD%95%E8%BE%93%E5%87%BA%EF%BC%8C%E8%80%8C%E7%AC%AC%E4%BA%8C%E6%9D%A1%E5%91%BD%E4%BB%A4%E5%8F%AF%E4%BB%A5%E7%9C%8B%E5%88%B0selinuxfs%E7%9A%84context%E3%80%82%0A%23%23%20selinux_init%0A%E5%90%8C%60init_sel_fs%60%E4%B8%80%E6%A0%B7%EF%BC%8CSELinux%E5%AD%90%E7%B3%BB%E7%BB%9F%E8%87%AA%E8%BA%AB%E5%9C%A8%E7%B3%BB%E7%BB%9F%E5%90%AF%E5%8A%A8%E6%97%B6%EF%BC%8C%E4%B9%9F%E4%BC%9A%E8%BF%9B%E8%A1%8C%E5%88%9D%E5%A7%8B%E5%8C%96%EF%BC%8C%E5%8D%B3%60selinux_init%60%E3%80%82%E6%AD%A4%E6%97%B6init%E8%BF%9B%E7%A8%8B%E5%B0%9A%E6%9C%AA%E8%A2%AB%E5%86%85%E6%A0%B8%E5%90%AF%E5%8A%A8%EF%BC%8C%E6%89%80%E4%BB%A5%E7%AD%96%E7%95%A5%E6%95%B0%E6%8D%AE%E4%B9%9F%E6%B2%A1%E8%A2%AB%E5%8A%A0%E8%BD%BD%E3%80%82%60selinux_init%60%E5%B0%B1%E6%98%AF%E4%B8%BA%E5%90%8E%E9%9D%A2%E7%9A%84selinuxfs%E5%8A%A0%E8%BD%BD%E7%AD%96%E7%95%A5%E5%81%9A%E4%B8%80%E4%BA%9B%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C%E3%80%82%0A%60%60%60mermaid%0Agraph%20TD%0AA%5B%22%E6%A0%B9%E6%8D%AEselinux_enforcing_boot%E8%AE%BE%E7%BD%AEselinux_state.enforcing%22%5D%0AA%20--%3E%20B%5B%22selinux_ss_init%2C%20selinux_avc_init%22%5D%0AB%20--%3E%20D%5B%22cred_init_security%22%5D%0AD%20--%3E%20E%5B%22avc_init%2C%20avtab_cache_init%2C%20ebitmap_cache_init%2C%20hashtab_cache_init%22%5D%0AE%20--%3E%20F%5B%22security_add_hooks%22%5D%0AF%20--%3E%20G%5B%22avc_add_callback%22%5D%0A%60%60%60%0A%E8%BF%99%E9%87%8C%E6%AF%94%E8%BE%83%E9%87%8D%E8%A6%81%E7%9A%84%E6%98%AF%0A-%20%60cred_init_security%60%E4%B8%BAcurrent%E5%88%9B%E5%BB%BA%E4%BA%86%E5%88%9D%E5%A7%8B%E8%BA%AB%E4%BB%BD%2C%20%E6%B3%A8%E6%84%8F%E6%AD%A4%E6%97%B6init%E8%BF%9B%E7%A8%8B%E8%BF%98%E6%9C%AA%E8%A2%AB%E6%8B%89%E8%B5%B7%EF%BC%8C%E6%89%80%E4%BB%A5init%E8%BF%9B%E7%A8%8B%E5%90%AF%E5%8A%A8%E5%90%8E%EF%BC%8C%E4%BC%9A%E7%BB%A7%E6%89%BF%E8%AF%A5%E8%BA%AB%E4%BB%BD%EF%BC%8C%E5%8D%B3%60SECINITSID_KERNEL%60%0A%60%60%60c%0A%09tsec-%3Eosid%20%3D%20tsec-%3Esid%20%3D%20SECINITSID_KERNEL%3B%0A%09cred-%3Esecurity%20%3D%20tsec%3B%0A%60%60%60%0A-%20SELinux%E5%AE%9A%E4%B9%89%E7%9A%84hook%E5%88%97%E8%A1%A8%EF%BC%8C%E8%A2%AB%E5%8A%A0%E5%85%A5%E5%88%B0LSM%E5%AD%90%E7%B3%BB%E7%BB%9F%E7%9A%84hook%E5%88%97%E8%A1%A8%E4%B8%AD%EF%BC%8C%E8%87%AA%E6%AD%A4%EF%BC%8C%E5%86%85%E6%A0%B8%E7%9A%84%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8%E5%B0%B1%E4%BC%9A%E8%BF%9B%E5%85%A5SELinux%E5%AD%90%E7%B3%BB%E7%BB%9F%E7%9A%84%E8%A7%86%E9%87%8E%E3%80%82%0A-%20%60selinux_init%60%E4%BC%9A%E6%A0%B9%E6%8D%AE%E5%86%85%E6%A0%B8%E5%90%AF%E5%8A%A8%E5%8F%82%E6%95%B0%EF%BC%8C%E8%AE%BE%E7%BD%AEenforcing%E6%A8%A1%E5%BC%8F%0A%23%23%20security_setenforce%0A%60security_setenforce%60%E4%B8%BAlibselinux%E6%8E%A5%E5%8F%A3%EF%BC%8C%E5%85%B6%E5%AE%9E%E5%B0%B1%E6%98%AF%E5%BE%80selinuxfs%E7%9A%84enforce%E6%96%87%E4%BB%B6%E5%86%991%E3%80%82%E6%AD%A4%E5%A4%84%E5%8F%AA%E8%80%83%E8%99%91%E5%90%AF%E5%8A%A8%E6%97%B6%E7%9A%84setenforce%E3%80%82%E6%AD%A4%E6%97%B6%E7%94%B1%E4%BA%8Elibselinux%E4%B8%AD%E8%B0%83%E7%94%A8%E9%A1%BA%E5%BA%8F%EF%BC%8Csetenforce%E5%9C%A8load_policy%E4%B9%8B%E5%89%8D%EF%BC%8C%E6%89%80%E4%BB%A5%E6%AD%A4%E6%97%B6%60state-%3Einitialized%60%E4%BB%8D%E4%B8%BA0%2C%E7%AD%96%E7%95%A5%E4%B9%9F%E8%BF%98%E6%9C%AA%E5%8A%A0%E8%BD%BD%E3%80%82%E5%8F%82%E8%80%83selinuxfs%E5%AE%9E%E7%8E%B0%EF%BC%8C%E4%B9%9F%E5%B0%B1%E6%98%AF%E8%B0%83%E7%94%A8%60sel_write_enforce%60%E5%87%BD%E6%95%B0%E3%80%82%E6%95%B4%E4%B8%AA%60sel_write_enforce%60%E5%87%BD%E6%95%B0%E9%80%BB%E8%BE%91%E6%AF%94%E8%BE%83%E7%AE%80%E5%8D%95%EF%BC%8C%E4%B8%BB%E8%A6%81%E5%B0%B1%E6%98%AF%E5%81%9A%E4%BA%86%E4%BB%A5%E4%B8%8B%E5%87%A0%E4%BB%B6%E4%BA%8B%E6%83%85%EF%BC%9A%0A-%20%E5%9C%A8%E9%9C%80%E8%A6%81%E6%97%B6%E8%AE%BE%E7%BD%AE%60selinux_state.enforcing%60%E5%8F%98%E9%87%8F%0A-%20%E5%A6%82%E6%9E%9C%E8%AE%BE%E7%BD%AE%E4%BA%86%E5%8F%98%E4%BA%86%E5%B0%B1%E9%80%9A%E7%9F%A5enforcing%E7%8A%B6%E6%80%81%E5%8F%98%E6%9B%B4%EF%BC%8C%E5%B9%B6%E5%88%B7%E6%96%B0AVC%0A%E8%BF%99%E9%87%8C%E5%80%BC%E5%BE%97%E6%B3%A8%E6%84%8F%E7%9A%84%E5%B0%B1%E6%98%AF%EF%BC%8Cselinuxfs%E7%9A%84enforce%E6%96%87%E4%BB%B6%E4%B9%9F%E6%98%AF%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%EF%BC%8C%E5%AF%B9%E5%85%B6%E5%86%99%EF%BC%8CSELinux%E4%B9%9F%E8%BF%9B%E8%A1%8C%E4%BA%86%E6%9D%83%E9%99%90%E5%88%A4%E6%96%AD%EF%BC%8C%E5%A6%82%E4%B8%8B%EF%BC%9A%0A%60%60%60c%0Alength%20%3D%20avc_has_perm(%26selinux_state%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20current_sid()%2C%20SECINITSID_SECURITY%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SECCLASS_SECURITY%2C%20SECURITY__SETENFORCE%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20NULL)%3B%0A%60%60%60%0A%E5%8C%B9%E9%85%8D%E7%9A%84%E5%8F%8C%E6%96%B9%E5%88%86%E5%88%AB%E6%98%AF%EF%BC%9A%0A-%20current_sid()%0A-%20SECINITSID_SECURITY%0A%0A%60current_sid()%60%E5%8D%B3init%E8%BF%9B%E7%A8%8B%E7%AC%AC%E4%B8%80%E6%AC%A1%E8%BF%90%E8%A1%8C%E6%97%B6%E7%9A%84SID%EF%BC%8C%E6%AD%A4%E6%97%B6%E7%AD%96%E7%95%A5%E5%B0%9A%E6%9C%AA%E5%8A%A0%E8%BD%BD%EF%BC%8C%E6%89%80%E4%BB%A5%E6%AD%A4%E6%97%B6%E7%9A%84SID%E6%98%AF%60SECINITSID_KERNEL%60%E3%80%82%E8%BF%99%E9%87%8C%E7%9A%84%60SECINITSID_SECURITY%60%E5%B0%B1%E6%98%AF%E6%9C%AC%E7%AB%A0%E4%B8%80%E7%9B%B4%E5%85%B3%E6%B3%A8%E7%9A%84initial%20SID%2C%20%60SECINITSID_KERNEL%60%E4%B9%9F%E6%98%AF%E3%80%82%E6%AD%A4%E6%97%B6%E7%9A%84%E6%9D%83%E9%99%90%E5%88%A4%E6%96%AD%EF%BC%8C%E7%94%B1%E4%BA%8E%E5%9C%A8%E7%B3%BB%E7%BB%9F%E5%90%AF%E5%8A%A8%E7%9A%84%E9%9D%9E%E5%B8%B8%E6%97%A9%E6%9C%9F%EF%BC%8C%E6%89%80%E4%BB%A5%E5%88%A4%E6%96%AD%E9%80%BB%E8%BE%91%E9%9D%9E%E5%B8%B8%E7%AE%80%E5%8D%95%EF%BC%8C%E5%9C%A8%60security_compute_av%60%E4%B8%AD%3A%0A%60%60%60c%0Aif%20(!state-%3Einitialized)%0A%20%20%20%20goto%20allow%3B%0A%60%60%60%0A%E5%9C%A8%E5%90%AF%E5%8A%A8%E5%90%8E%EF%BC%8C%E5%A6%82%E6%9E%9C%E7%94%A8%E6%88%B7%E9%80%9A%E8%BF%87selinuxfs%20enforce%E6%9D%A5%E9%85%8D%E7%BD%AESELinux%E6%A8%A1%E5%BC%8F%E6%97%B6%EF%BC%8C%E5%88%99%E4%BC%9A%E5%88%A4%E6%96%AD%E8%BF%9B%E7%A8%8B%E7%9A%84%E8%BA%AB%E4%BB%BD%E5%92%8C%E4%B8%80%E4%B8%AAinitial%20SID%20%60SECINITSID_SECURITY%60%E7%9A%84%E5%8C%B9%E9%85%8D%E5%85%B3%E7%B3%BB%E3%80%82%0A%23%23%20security_load_policy%0A%E7%AD%96%E7%95%A5%E5%8A%A0%E8%BD%BD%E7%94%B1%E7%94%A8%E6%88%B7%E6%80%81%E7%9A%84init%E8%BF%9B%E7%A8%8B%E5%8F%91%E8%B5%B7%EF%BC%8C%E5%85%B6%E6%96%B9%E6%B3%95%E5%B0%B1%E6%98%AFmmap%E7%AD%96%E7%95%A5%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%96%87%E4%BB%B6%EF%BC%8C%E5%B9%B6%E5%B0%86%E6%95%B0%E6%8D%AE%E5%86%99%E5%85%A5selinuxfs%E7%9A%84load%E6%96%87%E4%BB%B6%EF%BC%8C%E6%9C%80%E7%BB%88%E8%B0%83%E7%94%A8%60sel_write_load%60%E5%87%BD%E6%95%B0%E3%80%82%E8%AF%A5%E5%87%BD%E6%95%B0%E5%88%86%E4%BB%A5%E4%B8%8B%E5%87%A0%E6%AD%A5%EF%BC%9A%0A1.%20%E5%88%A4%E6%96%AD%E7%94%A8%E6%88%B7%E5%86%99load%E6%96%87%E4%BB%B6%E7%9A%84%E6%9D%83%E9%99%90%2C%20%E6%AD%A4%E6%97%B6%E7%AD%96%E7%95%A5%E5%B0%9A%E6%9C%AA%E5%8A%A0%E8%BD%BD%EF%BC%8C%E4%B8%94%60state-%3Einitialized%60%E4%BB%8D%E4%B8%BA0(%E8%AF%A5%E5%8F%98%E9%87%8F%E7%94%B1%60security_load_policy%60%E8%B5%8B%E5%80%BC)%E3%80%82%E6%89%80%E4%BB%A5%E6%AD%A4%E6%97%B6%E7%9A%84avc_has_perm%E5%8F%AA%E6%98%AF%E8%B5%B0%E4%B8%AA%E8%BF%87%E5%9C%BA%0A%60%60%60c%0Alength%20%3D%20avc_has_perm(%26selinux_state%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20current_sid()%2C%20SECINITSID_SECURITY%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SECCLASS_SECURITY%2C%20SECURITY__LOAD_POLICY%2C%20NULL)%3B%0A%60%60%60%0A2.%20%60security_load_policy%60%E6%98%AF%E5%8A%A0%E8%BD%BD%E7%AD%96%E7%95%A5%E7%9A%84%E4%B8%BB%E8%A7%92%EF%BC%8C%E4%BB%96%E5%8A%A0%E8%BD%BD%E4%BA%86%E6%89%80%E6%9C%89%E7%AD%96%E7%95%A5%E6%95%B0%E6%8D%AE%EF%BC%8C%E4%B9%9F%E5%8C%85%E6%8B%AC%E4%BA%86%E6%88%91%E4%BB%AC%E5%85%B3%E6%B3%A8%E7%9A%84initial%20SID%0A3.%20%60sel_make_policy_nodes%60%E7%94%A8%E6%9D%A5%E7%94%9F%E6%88%90selinuxfs%E7%9B%B8%E5%85%B3%E7%9A%84%E8%8A%82%E7%82%B9%EF%BC%8C%E5%8C%85%E6%8B%AC%EF%BC%9Abools%EF%BC%8Cclasses%EF%BC%8Cpolicycap%0A%60security_load_policy%60%E8%B0%83%E7%94%A8%60policydb_load_isids%60%E5%88%9D%E5%A7%8B%E5%8C%96sidtab%EF%BC%8C%E5%B9%B6%E6%8F%92%E5%85%A5%E4%BA%86%E6%89%80%E6%9C%89%E7%9A%84initial%20SID%E4%BB%A5%E5%8F%8A%E5%85%B6%E5%AF%B9%E5%BA%94context%E3%80%82intial%20SID%E7%94%B1initial_sid%E6%96%87%E4%BB%B6%E6%8C%87%E5%AE%9A%EF%BC%8C%E8%80%8C%E5%85%B6%E5%AF%B9%E5%BA%94%E7%9A%84context%EF%BC%8C%E7%94%B1%E5%AF%B9%E5%BA%94%E7%9A%84.te%E6%96%87%E4%BB%B6%E5%AE%9A%E4%B9%89%E3%80%82%E4%BE%8B%E5%A6%82%60sid%20kernel%60%E5%85%B6%E4%B8%8A%E4%B8%8B%E6%96%87%E7%94%B1%60policy%2Fmodules%2Fkernel%2Fkernel.te%60%E6%8C%87%E5%AE%9A%EF%BC%9A%0A%60%60%60%0Asid%20kernel%20gen_context(system_u%3Asystem_r%3Akernel_t%2Cmls_systemhigh)%0A%60%60%60%0A%E7%AD%96%E7%95%A5%E5%8A%A0%E8%BD%BD%E6%98%AFSELinux%E6%9C%80%E6%A0%B8%E5%BF%83%E4%B9%9F%E6%98%AF%E6%9C%80%E5%A4%8D%E6%9D%82%E7%9A%84%E9%83%A8%E5%88%86%E3%80%82%60security_load_policy%60%E8%B0%83%E7%94%A8%60policydb_read%60%E6%8A%8A%E6%95%B4%E4%B8%AA%E7%AD%96%E7%95%A5%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%96%87%E4%BB%B6%E5%8A%A0%E8%BD%BD%E5%88%B0%E5%86%85%E5%AD%98%E7%9A%84policydb%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%AD%E3%80%82%E9%99%A4%E4%BA%86%E5%8A%A0%E8%BD%BD%E7%AD%96%E7%95%A5%EF%BC%8C%60security_load_policy%60%E8%BF%98%E5%81%9A%E4%BA%86%E5%87%A0%E4%BB%B6%E5%88%9D%E5%A7%8B%E5%8C%96%E7%9A%84%E4%BA%8B%E6%83%85%EF%BC%8C%E6%A0%87%E6%B3%A8%E5%9C%A8%E4%BB%A3%E7%A0%81%E9%87%8C%E3%80%82%0A%60%60%60c%0Arc%20%3D%20policydb_read(policydb%2C%20fp)%3B%0Aif%20(rc)%0A%20%20%20%20goto%20out%3B%0A%0Apolicydb-%3Elen%20%3D%20len%3B%0Arc%20%3D%20selinux_set_mapping(policydb%2C%20secclass_map%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%26state-%3Ess-%3Emap)%3B%0Aif%20(rc)%20%7B%0A%20%20%20%20policydb_destroy(policydb)%3B%0A%20%20%20%20goto%20out%3B%0A%7D%0A%0Arc%20%3D%20policydb_load_isids(policydb%2C%20sidtab)%3B%20%2F%2F%20%E5%8A%A0%E8%BD%BDinitial%20SID%E5%88%B0policydb%20sidtab%E4%B8%AD%0Aif%20(rc)%20%7B%0A%20%20%20%20policydb_destroy(policydb)%3B%0A%20%20%20%20goto%20out%3B%0A%7D%0A%0Asecurity_load_policycaps(state)%3B%20%2F%2F%20%E5%8A%A0%E8%BD%BDpolicy%20capability%0Astate-%3Einitialized%20%3D%201%3B%20%2F%2F%20%E8%AE%BE%E7%BD%AESELinux%E5%88%9D%E5%A7%8B%E5%8C%96%E6%A0%87%E5%BF%97%0Aseqno%20%3D%20%2B%2Bstate-%3Ess-%3Elatest_granting%3B%0Aselinux_complete_init()%3B%20%2F%2F%20%E5%AE%8C%E6%88%90selinuxfs%20super%20block%20delayed%20init%0Aavc_ss_reset(state-%3Eavc%2C%20seqno)%3B%20%0Aselnl_notify_policyload(seqno)%3B%0Aselinux_status_update_policyload(state%2C%20seqno)%3B%0A%60%60%60%0A%0A%23%20%E6%80%BB%E7%BB%93%0A%E6%95%B4%E4%B8%AASELinux%E5%88%9D%E5%A7%8B%E5%8C%96%EF%BC%8C%E5%8F%91%E8%B5%B7%E4%BA%8E0%E5%8F%B7%E8%BF%9B%E7%A8%8B%EF%BC%8C%E5%B9%B6%E7%94%B1%E5%86%85%E6%A0%B8SELinux%E6%A8%A1%E5%9D%97%E5%AE%8C%E6%88%90%E3%80%82%E5%86%85%E6%A0%B8%E7%9A%84%E6%A0%B8%E5%BF%83%E5%88%9D%E5%A7%8B%E5%8C%96%E4%B8%BB%E8%A6%81%E5%8C%85%E6%8B%AC%E7%AD%96%E7%95%A5%E7%9A%84%E5%8A%A0%E8%BD%BD%E5%92%8Cselinuxfs%E7%9A%84%E5%88%9D%E5%A7%8B%E5%8C%96%E3%80%82%E6%89%80%E6%9C%89%E7%9A%84SELinux%E7%94%A8%E6%88%B7%E6%80%81%E6%8E%A5%E5%8F%A3%E9%83%BD%E6%98%AF%E9%80%9A%E8%BF%87selinuxfs%E5%AE%9E%E7%8E%B0%E7%9A%84%E3%80%82%0A%0A%23%20%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE%0A-%20Linux%20source%204.20.5%0A-%20busybox%20master%20on%202020%2F10%2F11