[PATCH] realm match - match by route entry

Sampsa Ranta sampsa@netsonic.fi
Mon, 30 Jul 2001 13:07:58 +0300 (EEST)


  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

--180552343-607848605-996487678=:8773
Content-Type: TEXT/PLAIN; charset=US-ASCII


Hello,

Here is my contribution to Netfilter.

...
Author: Sampsa Ranta <sampsa@netsonic.fi>
Status: Experimental

realm match: uses realm key from routing as match criteria similiar to
             one in packet classifier

/** snip from packet classifier in Configure.help */
Routing tables based classifier
CONFIG_NET_CLS_ROUTE4
  If you say Y here, you will be able to classify outgoing packets
  according to the route table entry they matched. If unsure, say Y.
/** end snip **/


# Example
# add route
/sbin/ip route add 194.29.194.0/24 via 194.29.192.1 realm 10

# source realm is in realm with mask 0xFFFF0000,
# destination is in realm with mask 0x0000FFFF

# match destination realm
/usr/local/sbin/iptables -A OUTPUT -m realm --realm 10 -j LOG

# match realm of source, this is also determinated by routing,
/usr/local/sbin/iptables -A INPUT -m realm --realm 655360 -j LOG

THIS PATCH REQUIRES CONFIG_NET_CLS_ROUTE TO BE SET
...

 - Sampsa Ranta
   sampsa@netsonic.fi



--180552343-607848605-996487678=:8773
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="realm.patch"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.4.33.0107301307580.8773@nalle.netsonic.fi>
Content-Description: 
Content-Disposition: attachment; filename="realm.patch"

ZGlmZiAtdXJOIGxpbnV4Lm9yaWcvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJf
aXB2NC9pcHRfcmVhbG0uaCBsaW51eC9pbmNsdWRlL2xpbnV4L25ldGZpbHRl
cl9pcHY0L2lwdF9yZWFsbS5oDQotLS0gbGludXgub3JpZy9pbmNsdWRlL2xp
bnV4L25ldGZpbHRlcl9pcHY0L2lwdF9yZWFsbS5oCVRodSBKYW4gIDEgMDI6
MDA6MDAgMTk3MA0KKysrIGxpbnV4L2luY2x1ZGUvbGludXgvbmV0ZmlsdGVy
X2lwdjQvaXB0X3JlYWxtLmgJTW9uIEp1bCAzMCAxMzowMToxMyAyMDAxDQpA
QCAtMCwwICsxLDggQEANCisjaWZuZGVmIF9JUFRfUkVBTE1fSA0KKyNkZWZp
bmUgX0lQVF9SRUFMTV9IDQorDQorc3RydWN0IGlwdF9yZWFsbV9pbmZvIHsN
CisgICAgdW5zaWduZWQgbG9uZyBpZCwgbWFzazsNCisgICAgdV9pbnQ4X3Qg
aW52ZXJ0Ow0KK307DQorI2VuZGlmIC8qX0lQVF9SRUFMTV9IKi8NCmRpZmYg
LXVyTiBsaW51eC5vcmlnL25ldC9pcHY0L25ldGZpbHRlci9Db25maWcuaW4g
bGludXgvbmV0L2lwdjQvbmV0ZmlsdGVyL0NvbmZpZy5pbg0KLS0tIGxpbnV4
Lm9yaWcvbmV0L2lwdjQvbmV0ZmlsdGVyL0NvbmZpZy5pbglXZWQgTWFyICA3
IDA4OjQ0OjE2IDIwMDENCisrKyBsaW51eC9uZXQvaXB2NC9uZXRmaWx0ZXIv
Q29uZmlnLmluCU1vbiBKdWwgMzAgMTM6MDA6MzMgMjAwMQ0KQEAgLTIxLDYg
KzIxLDcgQEANCiAgIGRlcF90cmlzdGF0ZSAnICBNdWx0aXBsZSBwb3J0IG1h
dGNoIHN1cHBvcnQnIENPTkZJR19JUF9ORl9NQVRDSF9NVUxUSVBPUlQgJENP
TkZJR19JUF9ORl9JUFRBQkxFUw0KICAgZGVwX3RyaXN0YXRlICcgIFRPUyBt
YXRjaCBzdXBwb3J0JyBDT05GSUdfSVBfTkZfTUFUQ0hfVE9TICRDT05GSUdf
SVBfTkZfSVBUQUJMRVMNCiAgIGRlcF90cmlzdGF0ZSAnICB0Y3Btc3MgbWF0
Y2ggc3VwcG9ydCcgQ09ORklHX0lQX05GX01BVENIX1RDUE1TUyAkQ09ORklH
X0lQX05GX0lQVEFCTEVTDQorICBkZXBfdHJpc3RhdGUgJyAgcmVhbG0gbWF0
Y2ggc3VwcG9ydCcgQ09ORklHX0lQX05GX01BVENIX1JFQUxNICRDT05GSUdf
SVBfTkZfSVBUQUJMRVMNCiAgIGlmIFsgIiRDT05GSUdfSVBfTkZfQ09OTlRS
QUNLIiAhPSAibiIgXTsgdGhlbg0KICAgICBkZXBfdHJpc3RhdGUgJyAgQ29u
bmVjdGlvbiBzdGF0ZSBtYXRjaCBzdXBwb3J0JyBDT05GSUdfSVBfTkZfTUFU
Q0hfU1RBVEUgJENPTkZJR19JUF9ORl9DT05OVFJBQ0sgJENPTkZJR19JUF9O
Rl9JUFRBQkxFUyANCiAgIGZpDQpkaWZmIC11ck4gbGludXgub3JpZy9uZXQv
aXB2NC9uZXRmaWx0ZXIvTWFrZWZpbGUgbGludXgvbmV0L2lwdjQvbmV0Zmls
dGVyL01ha2VmaWxlDQotLS0gbGludXgub3JpZy9uZXQvaXB2NC9uZXRmaWx0
ZXIvTWFrZWZpbGUJVGh1IEFwciAyNiAwMTowMDoyOCAyMDAxDQorKysgbGlu
dXgvbmV0L2lwdjQvbmV0ZmlsdGVyL01ha2VmaWxlCU1vbiBKdWwgMzAgMTM6
MDA6MjggMjAwMQ0KQEAgLTU1LDYgKzU1LDcgQEANCiBvYmotJChDT05GSUdf
SVBfTkZfTUFUQ0hfU1RBVEUpICs9IGlwdF9zdGF0ZS5vDQogb2JqLSQoQ09O
RklHX0lQX05GX01BVENIX1VOQ0xFQU4pICs9IGlwdF91bmNsZWFuLm8NCiBv
YmotJChDT05GSUdfSVBfTkZfTUFUQ0hfVENQTVNTKSArPSBpcHRfdGNwbXNz
Lm8NCitvYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfUkVBTE0pICs9IGlwdF9y
ZWFsbS5vDQogDQogIyB0YXJnZXRzDQogb2JqLSQoQ09ORklHX0lQX05GX1RB
UkdFVF9SRUpFQ1QpICs9IGlwdF9SRUpFQ1Qubw0KZGlmZiAtdXJOIGxpbnV4
Lm9yaWcvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9yZWFsbS5jIGxpbnV4L25l
dC9pcHY0L25ldGZpbHRlci9pcHRfcmVhbG0uYw0KLS0tIGxpbnV4Lm9yaWcv
bmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9yZWFsbS5jCVRodSBKYW4gIDEgMDI6
MDA6MDAgMTk3MA0KKysrIGxpbnV4L25ldC9pcHY0L25ldGZpbHRlci9pcHRf
cmVhbG0uYwlNb24gSnVsIDMwIDEzOjAwOjQyIDIwMDENCkBAIC0wLDAgKzEs
NjQgQEANCisvKiBLZXJuZWwgbW9kdWxlIHRvIG1hdGNoIHJlYWxtIGZyb20g
cm91dGluZy4gKi8NCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+DQorI2lu
Y2x1ZGUgPG5ldC9pcC5oPg0KKyNpbmNsdWRlIDxuZXQvcm91dGUuaD4NCisj
aW5jbHVkZSA8bGludXgvc2tidWZmLmg+DQorI2luY2x1ZGUgPGxpbnV4L2lm
X2V0aGVyLmg+DQorDQorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0
L2lwdF9yZWFsbS5oPg0KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2
NC9pcF90YWJsZXMuaD4NCisNCitzdGF0aWMgaW50DQorbWF0Y2goY29uc3Qg
c3RydWN0IHNrX2J1ZmYgKnNrYiwNCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0
X2RldmljZSAqaW4sDQorICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Ug
Km91dCwNCisgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sDQorICAgICAg
aW50IG9mZnNldCwNCisgICAgICBjb25zdCB2b2lkICpoZHIsDQorICAgICAg
dV9pbnQxNl90IGRhdGFsZW4sDQorICAgICAgaW50ICpob3Rkcm9wKQ0KK3sN
CisgICAgc3RydWN0IGRzdF9lbnRyeSAqZHN0Ow0KKyAgICB1MzIgaWQ7DQor
ICAgIGNvbnN0IHN0cnVjdCBpcHRfcmVhbG1faW5mbyAqaW5mbyA9IG1hdGNo
aW5mbzsNCisgICAgDQorICAgIGlmKChkc3QgPSBza2ItPmRzdCkgPT0gTlVM
TCkNCisgICAgICAgICByZXR1cm4gMDsNCisgICAgaWQgPSBkc3QtPnRjbGFz
c2lkOw0KKw0KKyAgICByZXR1cm4gKGluZm8tPmlkID09IChpZCAmIGluZm8t
Pm1hc2spKSBeIGluZm8tPmludmVydDsNCit9DQorDQorc3RhdGljIGludCBj
aGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsDQorICAgICAgICAgICAgICAg
ICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwNCisJCSB2b2lkICptYXRjaGlu
Zm8sDQorCQkgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwNCisJCSB1bnNpZ25l
ZCBpbnQgaG9va19tYXNrKQ0KK3sNCisJaWYgKGhvb2tfbWFzaw0KKwkgICAg
JiB+KCgxIDw8IE5GX0lQX1BPU1RfUk9VVElORykgfCAoMSA8PCBORl9JUF9G
T1JXQVJEKSB8ICgxIDw8IE5GX0lQX0xPQ0FMX09VVCl8ICgxIDw8IE5GX0lQ
X0xPQ0FMX0lOKSkpIHsNCisJCXByaW50aygiaXB0X3JlYWxtOiBvbmx5IHZh
bGlkIGZvciBQT1NUX1JPVVRJTkcsIExPQ0FMX09VVCwgTE9DQUxfSU4gb3Ig
Rk9SV0FSRC5cbiIpOw0KKwkJcmV0dXJuIDA7DQorCX0NCisNCisJaWYgKG1h
dGNoc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfcmVhbG1f
aW5mbykpKQ0KKwkJcmV0dXJuIDA7DQorDQorCXJldHVybiAxOw0KK30NCisN
CitzdGF0aWMgc3RydWN0IGlwdF9tYXRjaCByZWFsbV9tYXRjaA0KKz0geyB7
IE5VTEwsIE5VTEwgfSwgInJlYWxtIiwgJm1hdGNoLCAmY2hlY2ssIE5VTEws
IFRISVNfTU9EVUxFIH07DQorDQorc3RhdGljIGludCBfX2luaXQgaW5pdCh2
b2lkKQ0KK3sNCisJcmV0dXJuIGlwdF9yZWdpc3Rlcl9tYXRjaCgmcmVhbG1f
bWF0Y2gpOw0KK30NCisNCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lk
KQ0KK3sNCisJaXB0X3VucmVnaXN0ZXJfbWF0Y2goJnJlYWxtX21hdGNoKTsN
Cit9DQorDQorbW9kdWxlX2luaXQoaW5pdCk7DQorbW9kdWxlX2V4aXQoZmlu
aSk7DQo=
--180552343-607848605-996487678=:8773
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="libipt_realm.c"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.4.33.0107301307581.8773@nalle.netsonic.fi>
Content-Description: 
Content-Disposition: attachment; filename="libipt_realm.c"

LyogU2hhcmVkIGxpYnJhcnkgYWRkLW9uIHRvIGlwdGFibGVzIHRvIGFkZCBN
QUMgYWRkcmVzcyBzdXBwb3J0LiAqLw0KI2luY2x1ZGUgPHN0ZGlvLmg+DQoj
aW5jbHVkZSA8bmV0ZGIuaD4NCiNpbmNsdWRlIDxzdHJpbmcuaD4NCiNpbmNs
dWRlIDxzdGRsaWIuaD4NCiNpbmNsdWRlIDxnZXRvcHQuaD4NCiNpZiBkZWZp
bmVkKF9fR0xJQkNfXykgJiYgX19HTElCQ19fID09IDINCiNpbmNsdWRlIDxu
ZXQvZXRoZXJuZXQuaD4NCiNlbHNlDQojaW5jbHVkZSA8bGludXgvaWZfZXRo
ZXIuaD4NCiNlbmRpZg0KI2luY2x1ZGUgPGlwdGFibGVzLmg+DQojaW5jbHVk
ZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3JlYWxtLmg+DQoNCi8qIEZ1
bmN0aW9uIHdoaWNoIHByaW50cyBvdXQgdXNhZ2UgbWVzc2FnZS4gKi8NCnN0
YXRpYyB2b2lkDQpoZWxwKHZvaWQpDQp7DQoJcHJpbnRmKA0KIlJFQUxNIHYl
cyBvcHRpb25zOlxuIg0KIiAtLXJlYWxtIFshXSB2YWx1ZVsvbWFza11cbiIN
CiIJCQkJTWF0Y2ggcmVhbG1cbiINCiJcbiIsIE5FVEZJTFRFUl9WRVJTSU9O
KTsNCn0NCg0Kc3RhdGljIHN0cnVjdCBvcHRpb24gb3B0c1tdID0gew0KCXsg
InJlYWxtIiwgMSwgMCwgJzEnIH0sDQoJezB9DQp9Ow0KDQovKiBJbml0aWFs
aXplIHRoZSBtYXRjaC4gKi8NCnN0YXRpYyB2b2lkDQppbml0KHN0cnVjdCBp
cHRfZW50cnlfbWF0Y2ggKm0sIHVuc2lnbmVkIGludCAqbmZjYWNoZSkNCnsN
CgkvKiBDYW4ndCBjYWNoZSB0aGlzICovDQoJKm5mY2FjaGUgfD0gTkZDX1VO
S05PV047DQp9DQoNCi8qIEZ1bmN0aW9uIHdoaWNoIHBhcnNlcyBjb21tYW5k
IG9wdGlvbnM7IHJldHVybnMgdHJ1ZSBpZiBpdA0KICAgYXRlIGFuIG9wdGlv
biAqLw0Kc3RhdGljIGludA0KcGFyc2UoaW50IGMsIGNoYXIgKiphcmd2LCBp
bnQgaW52ZXJ0LCB1bnNpZ25lZCBpbnQgKmZsYWdzLA0KICAgICAgY29uc3Qg
c3RydWN0IGlwdF9lbnRyeSAqZW50cnksDQogICAgICB1bnNpZ25lZCBpbnQg
Km5mY2FjaGUsDQogICAgICBzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICoqbWF0
Y2gpDQp7DQoJc3RydWN0IGlwdF9yZWFsbV9pbmZvICpyZWFsbWluZm8gPSAo
c3RydWN0IGlwdF9yZWFsbV9pbmZvICopKCptYXRjaCktPmRhdGE7DQoNCglz
d2l0Y2ggKGMpIHsNCgkJY2hhciAqZW5kOw0KCWNhc2UgJzEnOg0KCQlpZiAo
Y2hlY2tfaW52ZXJzZShvcHRhcmcsICZpbnZlcnQpKQ0KCQkJb3B0aW5kKys7
DQoJCXJlYWxtaW5mby0+aWQgPSBzdHJ0b3VsKG9wdGFyZywgJmVuZCwgMCk7
DQoJCWlmICgqZW5kID09ICcvJykgew0KCQkJcmVhbG1pbmZvLT5tYXNrID0g
c3RydG91bChlbmQrMSwgJmVuZCwgMCk7DQoJCX0gZWxzZQ0KCQkJcmVhbG1p
bmZvLT5tYXNrID0gMHhmZmZmZmZmZjsNCgkJaWYgKCplbmQgIT0gJ1wwJyB8
fCBlbmQgPT0gb3B0YXJnKQ0KCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJP
QkxFTSwgIkJhZCBSRUFMTSB2YWx1ZSBgJXMnIiwgb3B0YXJnKTsNCgkJaWYg
KGludmVydCkNCgkJCXJlYWxtaW5mby0+aW52ZXJ0ID0gMTsNCgkJKmZsYWdz
ID0gMTsNCgkJYnJlYWs7DQoNCglkZWZhdWx0Og0KCQlyZXR1cm4gMDsNCgl9
DQoJcmV0dXJuIDE7DQp9DQoNCnN0YXRpYyB2b2lkDQpwcmludF9yZWFsbSh1
bnNpZ25lZCBsb25nIGlkLCB1bnNpZ25lZCBsb25nIG1hc2ssIGludCBpbnZl
cnQsIGludCBudW1lcmljKQ0Kew0KCWlmIChpbnZlcnQpDQoJCWZwdXRjKCch
Jywgc3Rkb3V0KTsNCg0KCWlmKG1hc2sgIT0gMHhmZmZmZmZmZikNCgkJcHJp
bnRmKCIweCVseC8weCVseCAiLCBpZCwgbWFzayk7DQoJZWxzZQ0KCQlwcmlu
dGYoIjB4JWx4ICIsIGlkKTsNCn0NCg0KLyogUHJpbnRzIG91dCB0aGUgbWF0
Y2hpbmZvLiAqLw0Kc3RhdGljIHZvaWQNCnByaW50KGNvbnN0IHN0cnVjdCBp
cHRfaXAgKmlwLA0KICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeV9tYXRj
aCAqbWF0Y2gsDQogICAgICBpbnQgbnVtZXJpYykNCnsNCglwcmludGYoIlJF
QUxNIG1hdGNoICIpOw0KCXByaW50X3JlYWxtKCgoc3RydWN0IGlwdF9yZWFs
bV9pbmZvICopbWF0Y2gtPmRhdGEpLT5pZCwNCgkJICAgKChzdHJ1Y3QgaXB0
X3JlYWxtX2luZm8gKiltYXRjaC0+ZGF0YSktPm1hc2ssDQoJCSAgICgoc3Ry
dWN0IGlwdF9yZWFsbV9pbmZvICopbWF0Y2gtPmRhdGEpLT5pbnZlcnQsIG51
bWVyaWMpOw0KfQ0KDQoNCi8qIFNhdmVzIHRoZSB1bmlvbiBpcHRfbWF0Y2hp
bmZvIGluIHBhcnNhYmxlIGZvcm0gdG8gc3Rkb3V0LiAqLw0Kc3RhdGljIHZv
aWQNCnNhdmUoY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsIGNvbnN0IHN0cnVj
dCBpcHRfZW50cnlfbWF0Y2ggKm1hdGNoKQ0Kew0KCXByaW50ZigiLS1yZWFs
bSAiKTsNCglwcmludF9yZWFsbSgoKHN0cnVjdCBpcHRfcmVhbG1faW5mbyAq
KW1hdGNoLT5kYXRhKS0+aWQsDQoJCSAgICgoc3RydWN0IGlwdF9yZWFsbV9p
bmZvICopbWF0Y2gtPmRhdGEpLT5tYXNrLA0KCQkgICAoKHN0cnVjdCBpcHRf
cmVhbG1faW5mbyAqKW1hdGNoLT5kYXRhKS0+aW52ZXJ0LCAwKTsNCn0NCg0K
LyogRmluYWwgY2hlY2s7IG11c3QgaGF2ZSBzcGVjaWZpZWQgLS1tYXJrLiAq
Lw0Kc3RhdGljIHZvaWQNCmZpbmFsX2NoZWNrKHVuc2lnbmVkIGludCBmbGFn
cykNCnsNCglpZiAoIWZsYWdzKQ0KCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9Q
Uk9CTEVNLA0KCQkJICAgIlJFQUxNIG1hdGNoOiBZb3UgbXVzdCBzcGVjaWZ5
IGAtLXJlYWxtJyIpOw0KfQ0KDQpzdHJ1Y3QgaXB0YWJsZXNfbWF0Y2ggcmVh
bG0NCj0geyBOVUxMLA0KICAgICJyZWFsbSIsDQogICAgTkVURklMVEVSX1ZF
UlNJT04sDQogICAgSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X3JlYWxt
X2luZm8pKSwNCiAgICBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfcmVh
bG1faW5mbykpLA0KICAgICZoZWxwLA0KICAgICZpbml0LA0KICAgICZwYXJz
ZSwNCiAgICAmZmluYWxfY2hlY2ssDQogICAgJnByaW50LA0KICAgICZzYXZl
LA0KICAgIG9wdHMNCn07DQoNCnZvaWQgX2luaXQodm9pZCkNCnsNCglyZWdp
c3Rlcl9tYXRjaCgmcmVhbG0pOw0KfQ0KDQoNCg==
--180552343-607848605-996487678=:8773
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="realm.patch.help"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.4.33.0107301307582.8773@nalle.netsonic.fi>
Content-Description: 
Content-Disposition: attachment; filename="realm.patch.help"

QXV0aG9yOiBTYW1wc2EgUmFudGEgPHNhbXBzYUBuZXRzb25pYy5maT4NClN0
YXR1czogRXhwZXJpbWVudGFsDQoNCnJlYWxtIG1hdGNoOiB1c2VzIHJlYWxt
IGtleSBmcm9tIHJvdXRpbmcgYXMgbWF0Y2ggY3JpdGVyaWEgc2ltaWxpYXIg
dG8NCiAgICAgICAgICAgICBvbmUgaW4gcGFja2V0IGNsYXNzaWZpZXINCg0K
LyoqIHNuaXAgZnJvbSBwYWNrZXQgY2xhc3NpZmllciBkb2N1bWVudGF0aW9u
ICovDQpSb3V0aW5nIHRhYmxlcyBiYXNlZCBjbGFzc2lmaWVyDQpDT05GSUdf
TkVUX0NMU19ST1VURTQNCiAgSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxs
IGJlIGFibGUgdG8gY2xhc3NpZnkgb3V0Z29pbmcgcGFja2V0cw0KICBhY2Nv
cmRpbmcgdG8gdGhlIHJvdXRlIHRhYmxlIGVudHJ5IHRoZXkgbWF0Y2hlZC4g
SWYgdW5zdXJlLCBzYXkgWS4NCi8qKiBlbmQgc25pcCAqKi8NCg0KDQojIEV4
YW1wbGUNCiMgYWRkIHJvdXRlDQovc2Jpbi9pcCByb3V0ZSBhZGQgMTk0LjI5
LjE5NC4wLzI0IHZpYSAxOTQuMjkuMTkyLjEgcmVhbG0gMTANCg0KIyBzb3Vy
Y2UgcmVhbG0gaXMgaW4gcmVhbG0gd2l0aCBtYXNrIDB4RkZGRjAwMDAsDQoj
IGRlc3RpbmF0aW9uIGlzIGluIHJlYWxtIHdpdGggbWFzayAweDAwMDBGRkZG
DQoNCiMgbWF0Y2ggZGVzdGluYXRpb24gcmVhbG0NCi91c3IvbG9jYWwvc2Jp
bi9pcHRhYmxlcyAtQSBPVVRQVVQgLW0gcmVhbG0gLS1yZWFsbSAxMCAtaiBM
T0cNCg0KIyBtYXRjaCByZWFsbSBvZiBzb3VyY2UsIHRoaXMgaXMgYWxzbyBk
ZXRlcm1pbmF0ZWQgYnkgcm91dGluZywNCi91c3IvbG9jYWwvc2Jpbi9pcHRh
YmxlcyAtQSBJTlBVVCAtbSByZWFsbSAtLXJlYWxtIDY1NTM2MCAtaiBMT0cN
Cg0KVEhJUyBQQVRDSCBSRVFVSVJFUyBDT05GSUdfTkVUX0NMU19ST1VURSBU
TyBCRSBTRVQNCg==
--180552343-607848605-996487678=:8773--