From a4b74c70dbdac7f9f19f417ef9f216b1f886789e Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 21 Feb 2021 22:51:08 +0000 Subject: [PATCH 0001/1416] Note --- httpsig.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/httpsig.py b/httpsig.py index 2b0c9eb1b..f61d0c7d2 100644 --- a/httpsig.py +++ b/httpsig.py @@ -8,6 +8,9 @@ __email__ = "bob@freedombone.net" __status__ = "Production" # see https://tools.ietf.org/html/draft-cavage-http-signatures-06 +# +# This might change in future +# see https://tools.ietf.org/html/draft-ietf-httpbis-message-signatures-01 from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives.serialization import load_pem_private_key From 4edc3af8f760c6efbbdfb72e1592433879c1a1ff Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 22 Feb 2021 10:09:56 +0000 Subject: [PATCH 0002/1416] Invert logic --- daemon.py | 2 +- tests.py | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/daemon.py b/daemon.py index 8f1dfd3aa..2891c2649 100644 --- a/daemon.py +++ b/daemon.py @@ -13805,7 +13805,7 @@ class PubServer(BaseHTTPRequestHandler): self._benchmarkPOSTtimings(POSTstartTime, POSTtimings, 21) - if not self.headers.get('signature'): + if self.headers.get('signature'): if 'keyId=' not in self.headers['signature']: if self.server.debug: print('DEBUG: POST to inbox has no keyId in ' + diff --git a/tests.py b/tests.py index 5a4bd233e..964971ba0 100644 --- a/tests.py +++ b/tests.py @@ -3116,6 +3116,9 @@ def testValidHashTag(): def runAllTests(): print('Running tests...') + testHttpsig() + return + testFunctions() testValidHashTag() testPrepareHtmlPostNickname() From 4e2487aa27f9f12e70829f989d1d1ba89c2aa675 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 22 Feb 2021 11:13:27 +0000 Subject: [PATCH 0003/1416] Support for newer http signature specification --- daemon.py | 19 +++++++++++++++++-- httpsig.py | 41 +++++++++++++++++++++++++++++++++++++---- 2 files changed, 54 insertions(+), 6 deletions(-) diff --git a/daemon.py b/daemon.py index 2891c2649..d2029b346 100644 --- a/daemon.py +++ b/daemon.py @@ -300,6 +300,19 @@ def saveDomainQrcode(baseDir: str, httpPrefix: str, class PubServer(BaseHTTPRequestHandler): protocol_version = 'HTTP/1.1' + def _getheaderSignatureInput(self): + """There are different versions of http signatures with + different header styles + """ + if self.headers.get('Signature-Input'): + # https://tools.ietf.org/html/ + # draft-ietf-httpbis-message-signatures-01 + return self.headers['Signature-Input'] + elif self.headers.get('signature'): + # Ye olde Masto http sig + return self.headers['signature'] + return None + def _pathIsImage(self, path: str) -> bool: if path.endswith('.png') or \ path.endswith('.jpg') or \ @@ -13805,8 +13818,10 @@ class PubServer(BaseHTTPRequestHandler): self._benchmarkPOSTtimings(POSTstartTime, POSTtimings, 21) - if self.headers.get('signature'): - if 'keyId=' not in self.headers['signature']: + headerSignature = self._getheaderSignatureInput() + + if headerSignature: + if 'keyId=' not in headerSignature: if self.server.debug: print('DEBUG: POST to inbox has no keyId in ' + 'header signature parameter') diff --git a/httpsig.py b/httpsig.py index f61d0c7d2..e99766bad 100644 --- a/httpsig.py +++ b/httpsig.py @@ -184,21 +184,42 @@ def verifyPostHeaders(httpPrefix: str, publicKeyPem: str, headers: dict, pubkey = load_pem_public_key(publicKeyPem.encode('utf-8'), backend=default_backend()) # Build a dictionary of the signature values - signatureHeader = headers['signature'] + if headers.get('Signature-Input'): + signatureHeader = headers['Signature-Input'] + fieldSep1 = ';' + fieldSep2 = ',' + else: + signatureHeader = headers['signature'] + fieldSep1 = ',' + fieldSep2 = ' ' + + # split the signature input into separate fields signatureDict = { k: v[1:-1] - for k, v in [i.split('=', 1) for i in signatureHeader.split(',')] + for k, v in [i.split('=', 1) for i in signatureHeader.split(fieldSep1)] } # Unpack the signed headers and set values based on current headers and # body (if a digest was included) signedHeaderList = [] - for signedHeader in signatureDict['headers'].split(' '): + for signedHeader in signatureDict['headers'].split(fieldSep2): + signedHeader = signedHeader.strip() if debug: print('DEBUG: verifyPostHeaders signedHeader=' + signedHeader) if signedHeader == '(request-target)': + # original Mastodon http signature appendStr = f'(request-target): {method.lower()} {path}' signedHeaderList.append(appendStr) + elif '*request-target' in signedHeader: + # https://tools.ietf.org/html/ + # draft-ietf-httpbis-message-signatures-01 + appendStr = f'*request-target: {method.lower()} {path}' + # remove sig1=( + if '=(' in appendStr: + appendStr = appendStr.split('=(')[1] + if ')' in appendStr: + appendStr = appendStr.split(')')[0] + signedHeaderList.append(appendStr) elif signedHeader == 'digest': if messageBodyDigest: bodyDigest = messageBodyDigest @@ -253,7 +274,19 @@ def verifyPostHeaders(httpPrefix: str, publicKeyPem: str, headers: dict, headerDigest = getSHA256(signedHeaderText.encode('ascii')) # Get the signature, verify with public key, return result - signature = base64.b64decode(signatureDict['signature']) + signature = None + if headers.get('Signature-Input') and headers.get('Signature'): + # https://tools.ietf.org/html/ + # draft-ietf-httpbis-message-signatures-01 + headersSig = headers['Signature'] + # remove sig1=: + if '=:' in headersSig: + headersSig = headersSig.split('=:')[1] + headersSig = headersSig[:len(headersSig)-1] + signature = base64.b64decode(headersSig) + else: + # Original Mastodon signature + signature = base64.b64decode(signatureDict['signature']) try: pubkey.verify( From 56e9130287d3f108778ca14f0fc605ca6019660e Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 22 Feb 2021 14:03:24 +0000 Subject: [PATCH 0004/1416] Unit test for verifying new http signature type --- httpsig.py | 50 ++++++++++++-------- tests.py | 131 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 160 insertions(+), 21 deletions(-) diff --git a/httpsig.py b/httpsig.py index e99766bad..d15d94654 100644 --- a/httpsig.py +++ b/httpsig.py @@ -163,7 +163,8 @@ def _verifyRecentSignature(signedDateStr: str) -> bool: def verifyPostHeaders(httpPrefix: str, publicKeyPem: str, headers: dict, path: str, GETmethod: bool, messageBodyDigest: str, - messageBodyJsonStr: str, debug: bool) -> bool: + messageBodyJsonStr: str, debug: bool, + noRecencyCheck=False) -> bool: """Returns true or false depending on if the key that we plugged in here validates against the headers, method, and path. publicKeyPem - the public key from an rsa key pair @@ -186,23 +187,36 @@ def verifyPostHeaders(httpPrefix: str, publicKeyPem: str, headers: dict, # Build a dictionary of the signature values if headers.get('Signature-Input'): signatureHeader = headers['Signature-Input'] - fieldSep1 = ';' fieldSep2 = ',' + # split the signature input into separate fields + signatureDict = { + k.strip(): v.strip() + for k, v in [i.split('=', 1) for i in signatureHeader.split(';')] + } + requestTargetKey = None + requestTargetStr = None + for k, v in signatureDict.items(): + if v.startswith('('): + requestTargetKey = k + requestTargetStr = v[1:-1] + break + if not requestTargetKey: + return False + signatureDict[requestTargetKey] = requestTargetStr else: + requestTargetKey = 'headers' signatureHeader = headers['signature'] - fieldSep1 = ',' fieldSep2 = ' ' - - # split the signature input into separate fields - signatureDict = { - k: v[1:-1] - for k, v in [i.split('=', 1) for i in signatureHeader.split(fieldSep1)] - } + # split the signature input into separate fields + signatureDict = { + k: v[1:-1] + for k, v in [i.split('=', 1) for i in signatureHeader.split(',')] + } # Unpack the signed headers and set values based on current headers and # body (if a digest was included) signedHeaderList = [] - for signedHeader in signatureDict['headers'].split(fieldSep2): + for signedHeader in signatureDict[requestTargetKey].split(fieldSep2): signedHeader = signedHeader.strip() if debug: print('DEBUG: verifyPostHeaders signedHeader=' + signedHeader) @@ -214,11 +228,11 @@ def verifyPostHeaders(httpPrefix: str, publicKeyPem: str, headers: dict, # https://tools.ietf.org/html/ # draft-ietf-httpbis-message-signatures-01 appendStr = f'*request-target: {method.lower()} {path}' - # remove sig1=( - if '=(' in appendStr: - appendStr = appendStr.split('=(')[1] - if ')' in appendStr: - appendStr = appendStr.split(')')[0] + # remove () + # if appendStr.startswith('('): + # appendStr = appendStr.split('(')[1] + # if ')' in appendStr: + # appendStr = appendStr.split(')')[0] signedHeaderList.append(appendStr) elif signedHeader == 'digest': if messageBodyDigest: @@ -245,7 +259,7 @@ def verifyPostHeaders(httpPrefix: str, publicKeyPem: str, headers: dict, ' not found in ' + str(headers)) else: if headers.get(signedHeader): - if signedHeader == 'date': + if signedHeader == 'date' and not noRecencyCheck: if not _verifyRecentSignature(headers[signedHeader]): if debug: print('DEBUG: ' + @@ -280,8 +294,8 @@ def verifyPostHeaders(httpPrefix: str, publicKeyPem: str, headers: dict, # draft-ietf-httpbis-message-signatures-01 headersSig = headers['Signature'] # remove sig1=: - if '=:' in headersSig: - headersSig = headersSig.split('=:')[1] + if requestTargetKey + '=:' in headersSig: + headersSig = headersSig.split(requestTargetKey + '=:')[1] headersSig = headersSig[:len(headersSig)-1] signature = base64.b64decode(headersSig) else: diff --git a/tests.py b/tests.py index 964971ba0..180dfc661 100644 --- a/tests.py +++ b/tests.py @@ -106,6 +106,133 @@ thrBob = None thrEve = None +def testHttpSigNew(): + print('testHttpSigNew') + messageBodyJson = {"hello": "world"} + messageBodyJsonStr = json.dumps(messageBodyJson) + publicKeyPem = \ + '-----BEGIN RSA PUBLIC KEY-----\n' + \ + 'MIIBCgKCAQEAhAKYdtoeoy8zcAcR874L8' + \ + 'cnZxKzAGwd7v36APp7Pv6Q2jdsPBRrw\n' + \ + 'WEBnez6d0UDKDwGbc6nxfEXAy5mbhgajz' + \ + 'rw3MOEt8uA5txSKobBpKDeBLOsdJKFq\n' + \ + 'MGmXCQvEG7YemcxDTRPxAleIAgYYRjTSd' + \ + '/QBwVW9OwNFhekro3RtlinV0a75jfZg\n' + \ + 'kne/YiktSvLG34lw2zqXBDTC5NHROUqGT' + \ + 'lML4PlNZS5Ri2U4aCNx2rUPRcKIlE0P\n' + \ + 'uKxI4T+HIaFpv8+rdV6eUgOrB2xeI1dSF' + \ + 'Fn/nnv5OoZJEIB+VmuKn3DCUcCZSFlQ\n' + \ + 'PSXSfBDiUGhwOw76WuSSsf1D4b/vLoJ10wIDAQAB\n' + \ + '-----END RSA PUBLIC KEY-----\n' + + # privKey = \ + # '-----BEGIN RSA PRIVATE KEY-----\n' + \ + # 'MIIEqAIBAAKCAQEAhAKYdtoeoy8zcAcR8' + \ + # '74L8cnZxKzAGwd7v36APp7Pv6Q2jdsP\n' + \ + # 'BRrwWEBnez6d0UDKDwGbc6nxfEXAy5mbh' + \ + # 'gajzrw3MOEt8uA5txSKobBpKDeBLOsd\n' + \ + # 'JKFqMGmXCQvEG7YemcxDTRPxAleIAgYYR' + \ + # 'jTSd/QBwVW9OwNFhekro3RtlinV0a75\n' + \ + # 'jfZgkne/YiktSvLG34lw2zqXBDTC5NHRO' + \ + # 'UqGTlML4PlNZS5Ri2U4aCNx2rUPRcKI\n' + \ + # 'lE0PuKxI4T+HIaFpv8+rdV6eUgOrB2xeI' + \ + # '1dSFFn/nnv5OoZJEIB+VmuKn3DCUcCZ\n' + \ + # 'SFlQPSXSfBDiUGhwOw76WuSSsf1D4b/vL' + \ + # 'oJ10wIDAQABAoIBAG/JZuSWdoVHbi56\n' + \ + # 'vjgCgkjg3lkO1KrO3nrdm6nrgA9P9qaPj' + \ + # 'xuKoWaKO1cBQlE1pSWp/cKncYgD5WxE\n' + \ + # 'CpAnRUXG2pG4zdkzCYzAh1i+c34L6oZoH' + \ + # 'sirK6oNcEnHveydfzJL5934egm6p8DW\n' + \ + # '+m1RQ70yUt4uRc0YSor+q1LGJvGQHReF0' + \ + # 'WmJBZHrhz5e63Pq7lE0gIwuBqL8SMaA\n' + \ + # 'yRXtK+JGxZpImTq+NHvEWWCu09SCq0r83' + \ + # '8ceQI55SvzmTkwqtC+8AT2zFviMZkKR\n' + \ + # 'Qo6SPsrqItxZWRty2izawTF0Bf5S2VAx7' + \ + # 'O+6t3wBsQ1sLptoSgX3QblELY5asI0J\n' + \ + # 'YFz7LJECgYkAsqeUJmqXE3LP8tYoIjMIA' + \ + # 'KiTm9o6psPlc8CrLI9CH0UbuaA2JCOM\n' + \ + # 'cCNq8SyYbTqgnWlB9ZfcAm/cFpA8tYci9' + \ + # 'm5vYK8HNxQr+8FS3Qo8N9RJ8d0U5Csw\n' + \ + # 'DzMYfRghAfUGwmlWj5hp1pQzAuhwbOXFt' + \ + # 'xKHVsMPhz1IBtF9Y8jvgqgYHLbmyiu1\n' + \ + # 'mwJ5AL0pYF0G7x81prlARURwHo0Yf52kE' + \ + # 'w1dxpx+JXER7hQRWQki5/NsUEtv+8RT\n' + \ + # 'qn2m6qte5DXLyn83b1qRscSdnCCwKtKWU' + \ + # 'ug5q2ZbwVOCJCtmRwmnP131lWRYfj67\n' + \ + # 'B/xJ1ZA6X3GEf4sNReNAtaucPEelgR2ns' + \ + # 'N0gKQKBiGoqHWbK1qYvBxX2X3kbPDkv\n' + \ + # '9C+celgZd2PW7aGYLCHq7nPbmfDV0yHcW' + \ + # 'jOhXZ8jRMjmANVR/eLQ2EfsRLdW69bn\n' + \ + # 'f3ZD7JS1fwGnO3exGmHO3HZG+6AvberKY' + \ + # 'VYNHahNFEw5TsAcQWDLRpkGybBcxqZo\n' + \ + # '81YCqlqidwfeO5YtlO7etx1xLyqa2NsCe' + \ + # 'G9A86UjG+aeNnXEIDk1PDK+EuiThIUa\n' + \ + # '/2IxKzJKWl1BKr2d4xAfR0ZnEYuRrbeDQ' + \ + # 'YgTImOlfW6/GuYIxKYgEKCFHFqJATAG\n' + \ + # 'IxHrq1PDOiSwXd2GmVVYyEmhZnbcp8Cxa' + \ + # 'EMQoevxAta0ssMK3w6UsDtvUvYvF22m\n' + \ + # 'qQKBiD5GwESzsFPy3Ga0MvZpn3D6EJQLg' + \ + # 'snrtUPZx+z2Ep2x0xc5orneB5fGyF1P\n' + \ + # 'WtP+fG5Q6Dpdz3LRfm+KwBCWFKQjg7uTx' + \ + # 'cjerhBWEYPmEMKYwTJF5PBG9/ddvHLQ\n' + \ + # 'EQeNC8fHGg4UXU8mhHnSBt3EA10qQJfRD' + \ + # 's15M38eG2cYwB1PZpDHScDnDA0=\n' + \ + # '-----END RSA PRIVATE KEY-----' + sigInput = \ + 'sig1=(date); alg=rsa-sha256; keyId="test-key-b"' + sig = \ + 'sig1=:HtXycCl97RBVkZi66ADKnC9c5eSSlb57GnQ4KFqNZplOpNfxqk62' + \ + 'JzZ484jXgLvoOTRaKfR4hwyxlcyb+BWkVasApQovBSdit9Ml/YmN2IvJDPncrlhPD' + \ + 'VDv36Z9/DiSO+RNHD7iLXugdXo1+MGRimW1RmYdenl/ITeb7rjfLZ4b9VNnLFtVWw' + \ + 'rjhAiwIqeLjodVImzVc5srrk19HMZNuUejK6I3/MyN3+3U8tIRW4LWzx6ZgGZUaEE' + \ + 'P0aBlBkt7Fj0Tt5/P5HNW/Sa/m8smxbOHnwzAJDa10PyjzdIbywlnWIIWtZKPPsoV' + \ + 'oKVopUWEU3TNhpWmaVhFrUL/O6SN3w==:' + # "hs2019", using RSASSA-PSS [RFC8017] and SHA-512 [RFC6234] + # sigInput = \ + # 'sig1=(*request-target, *created, host, date, ' + \ + # 'cache-control, x-empty-header, x-example); keyId="test-key-a"; ' + \ + # 'alg=hs2019; created=1402170695; expires=1402170995' + # sig = \ + # 'sig1=:K2qGT5srn2OGbOIDzQ6kYT+ruaycnDAAUpKv+ePFfD0RAxn/1BUe' + \ + # 'Zx/Kdrq32DrfakQ6bPsvB9aqZqognNT6be4olHROIkeV879RrsrObury8L9SCEibe' + \ + # 'oHyqU/yCjphSmEdd7WD+zrchK57quskKwRefy2iEC5S2uAH0EPyOZKWlvbKmKu5q4' + \ + # 'CaB8X/I5/+HLZLGvDiezqi6/7p2Gngf5hwZ0lSdy39vyNMaaAT0tKo6nuVw0S1MVg' + \ + # '1Q7MpWYZs0soHjttq0uLIA3DIbQfLiIvK6/l0BdWTU7+2uQj7lBkQAsFZHoA96ZZg' + \ + # 'FquQrXRlmYOh+Hx5D9fJkXcXe5tmAg==:' + boxpath = '/foo' + # headers = { + # "*request-target": "get " + boxpath, + # "*created": "1402170695", + # "host": "example.org", + # "date": "Tue, 07 Jun 2014 20:51:35 GMT", + # "cache-control": "max-age=60, must-revalidate", + # "x-emptyheader": "", + # "x-example": "Example header with some whitespace.", + # "x-dictionary": "b=2", + # "x-dictionary": "a=1", + # "x-list": "(a, b, c)", + # "Signature-Input": sigInput, + # "Signature": sig + # } + headers = { + "*created": "1402170695", + "*request-target": "post /foo?param=value&pet=dog", + "host": "example.com", + "date": "Tue, 07 Jun 2014 20:51:35 GMT", + "content-type": "application/json", + "digest": "SHA-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=", + "content-length": "18", + "Signature-Input": sigInput, + "Signature": sig + } + httpPrefix = 'https' + debug = False + assert verifyPostHeaders(httpPrefix, publicKeyPem, headers, + boxpath, False, None, + messageBodyJsonStr, debug, + True) + + def _testHttpsigBase(withDigest): print('testHttpsig(' + str(withDigest) + ')') @@ -3116,9 +3243,6 @@ def testValidHashTag(): def runAllTests(): print('Running tests...') - testHttpsig() - return - testFunctions() testValidHashTag() testPrepareHtmlPostNickname() @@ -3156,6 +3280,7 @@ def runAllTests(): testAddEmoji() testActorParsing() testHttpsig() + testHttpSigNew() testCache() testThreads() testCreatePerson() From 3d1c4405844a5e70dbe67a4e1511242c21bf70c6 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 22 Feb 2021 18:20:33 +0000 Subject: [PATCH 0005/1416] Support for new style of http signatures --- httpsig.py | 84 +++++++++++++++++++++++++++++ tests.py | 152 +++++++++++++++++++++++++++++++++-------------------- 2 files changed, 180 insertions(+), 56 deletions(-) diff --git a/httpsig.py b/httpsig.py index d15d94654..bb2997f03 100644 --- a/httpsig.py +++ b/httpsig.py @@ -18,6 +18,7 @@ from cryptography.hazmat.primitives.serialization import load_pem_public_key from cryptography.hazmat.primitives.asymmetric import padding from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.asymmetric import utils as hazutils +import calendar import base64 from time import gmtime, strftime import datetime @@ -99,6 +100,89 @@ def signPostHeaders(dateStr: str, privateKeyPem: str, return signatureHeader +def signPostHeadersNew(dateStr: str, privateKeyPem: str, + nickname: str, + domain: str, port: int, + toDomain: str, toPort: int, + path: str, + httpPrefix: str, + messageBodyJsonStr: str, + algorithm: str) -> (str, str): + """Returns a raw signature strings that can be plugged into a header + as "Signature-Input" and "Signature" + used to verify the authenticity of an HTTP transmission. + See https://tools.ietf.org/html/draft-ietf-httpbis-message-signatures-01 + """ + domain = getFullDomain(domain, port) + + toDomain = getFullDomain(toDomain, toPort) + + timeFormat = "%a, %d %b %Y %H:%M:%S %Z" + if not dateStr: + currTime = gmtime() + secondsSinceEpoch = int(calendar.timegm(currTime)) + dateStr = strftime(timeFormat, currTime) + else: + currTime = datetime.datetime.strptime(dateStr, timeFormat) + secondsSinceEpoch = int(currTime.timestamp()) + keyID = httpPrefix + '://' + domain + '/users/' + nickname + '#main-key' + if not messageBodyJsonStr: + headers = { + '*request-target': f'post {path}', + '*created': str(secondsSinceEpoch), + 'host': toDomain, + 'date': dateStr, + 'content-type': 'application/json' + } + else: + bodyDigest = messageContentDigest(messageBodyJsonStr) + contentLength = len(messageBodyJsonStr) + headers = { + '*request-target': f'post {path}', + '*created': str(secondsSinceEpoch), + 'host': toDomain, + 'date': dateStr, + 'digest': f'SHA-256={bodyDigest}', + 'content-type': 'application/activity+json', + 'content-length': str(contentLength) + } + key = load_pem_private_key(privateKeyPem.encode('utf-8'), + None, backend=default_backend()) + # build a digest for signing + signedHeaderKeys = headers.keys() + signedHeaderText = '' + for headerKey in signedHeaderKeys: + signedHeaderText += f'{headerKey}: {headers[headerKey]}\n' + signedHeaderText = signedHeaderText.strip() + headerDigest = getSHA256(signedHeaderText.encode('ascii')) + + # Sign the digest. Potentially other signing algorithms can be added here. + signature = '' + if algorithm == 'rsa-sha256': + rawSignature = key.sign(headerDigest, + padding.PKCS1v15(), + hazutils.Prehashed(hashes.SHA256())) + signature = base64.b64encode(rawSignature).decode('ascii') + + sigKey = 'sig1' + # Put it into a valid HTTP signature format + signatureInputDict = { + 'keyId': keyID, + } + signatureIndexHeader = '; '.join( + [f'{k}="{v}"' for k, v in signatureInputDict.items()]) + signatureIndexHeader += '; alg=hs2019' + signatureIndexHeader += '; created=' + str(secondsSinceEpoch) + signatureIndexHeader += \ + '; ' + sigKey + '=(' + ', '.join(signedHeaderKeys) + ')' + signatureDict = { + sigKey: signature + } + signatureHeader = '; '.join( + [f'{k}=:{v}:' for k, v in signatureDict.items()]) + return signatureIndexHeader, signatureHeader + + def createSignedHeader(privateKeyPem: str, nickname: str, domain: str, port: int, toDomain: str, toPort: int, diff --git a/tests.py b/tests.py index 180dfc661..0256d0d95 100644 --- a/tests.py +++ b/tests.py @@ -13,6 +13,7 @@ import json from time import gmtime, strftime from pprint import pprint from httpsig import signPostHeaders +from httpsig import signPostHeadersNew from httpsig import verifyPostHeaders from httpsig import messageContentDigest from cache import storePersonInCache @@ -125,59 +126,59 @@ def testHttpSigNew(): 'PSXSfBDiUGhwOw76WuSSsf1D4b/vLoJ10wIDAQAB\n' + \ '-----END RSA PUBLIC KEY-----\n' - # privKey = \ - # '-----BEGIN RSA PRIVATE KEY-----\n' + \ - # 'MIIEqAIBAAKCAQEAhAKYdtoeoy8zcAcR8' + \ - # '74L8cnZxKzAGwd7v36APp7Pv6Q2jdsP\n' + \ - # 'BRrwWEBnez6d0UDKDwGbc6nxfEXAy5mbh' + \ - # 'gajzrw3MOEt8uA5txSKobBpKDeBLOsd\n' + \ - # 'JKFqMGmXCQvEG7YemcxDTRPxAleIAgYYR' + \ - # 'jTSd/QBwVW9OwNFhekro3RtlinV0a75\n' + \ - # 'jfZgkne/YiktSvLG34lw2zqXBDTC5NHRO' + \ - # 'UqGTlML4PlNZS5Ri2U4aCNx2rUPRcKI\n' + \ - # 'lE0PuKxI4T+HIaFpv8+rdV6eUgOrB2xeI' + \ - # '1dSFFn/nnv5OoZJEIB+VmuKn3DCUcCZ\n' + \ - # 'SFlQPSXSfBDiUGhwOw76WuSSsf1D4b/vL' + \ - # 'oJ10wIDAQABAoIBAG/JZuSWdoVHbi56\n' + \ - # 'vjgCgkjg3lkO1KrO3nrdm6nrgA9P9qaPj' + \ - # 'xuKoWaKO1cBQlE1pSWp/cKncYgD5WxE\n' + \ - # 'CpAnRUXG2pG4zdkzCYzAh1i+c34L6oZoH' + \ - # 'sirK6oNcEnHveydfzJL5934egm6p8DW\n' + \ - # '+m1RQ70yUt4uRc0YSor+q1LGJvGQHReF0' + \ - # 'WmJBZHrhz5e63Pq7lE0gIwuBqL8SMaA\n' + \ - # 'yRXtK+JGxZpImTq+NHvEWWCu09SCq0r83' + \ - # '8ceQI55SvzmTkwqtC+8AT2zFviMZkKR\n' + \ - # 'Qo6SPsrqItxZWRty2izawTF0Bf5S2VAx7' + \ - # 'O+6t3wBsQ1sLptoSgX3QblELY5asI0J\n' + \ - # 'YFz7LJECgYkAsqeUJmqXE3LP8tYoIjMIA' + \ - # 'KiTm9o6psPlc8CrLI9CH0UbuaA2JCOM\n' + \ - # 'cCNq8SyYbTqgnWlB9ZfcAm/cFpA8tYci9' + \ - # 'm5vYK8HNxQr+8FS3Qo8N9RJ8d0U5Csw\n' + \ - # 'DzMYfRghAfUGwmlWj5hp1pQzAuhwbOXFt' + \ - # 'xKHVsMPhz1IBtF9Y8jvgqgYHLbmyiu1\n' + \ - # 'mwJ5AL0pYF0G7x81prlARURwHo0Yf52kE' + \ - # 'w1dxpx+JXER7hQRWQki5/NsUEtv+8RT\n' + \ - # 'qn2m6qte5DXLyn83b1qRscSdnCCwKtKWU' + \ - # 'ug5q2ZbwVOCJCtmRwmnP131lWRYfj67\n' + \ - # 'B/xJ1ZA6X3GEf4sNReNAtaucPEelgR2ns' + \ - # 'N0gKQKBiGoqHWbK1qYvBxX2X3kbPDkv\n' + \ - # '9C+celgZd2PW7aGYLCHq7nPbmfDV0yHcW' + \ - # 'jOhXZ8jRMjmANVR/eLQ2EfsRLdW69bn\n' + \ - # 'f3ZD7JS1fwGnO3exGmHO3HZG+6AvberKY' + \ - # 'VYNHahNFEw5TsAcQWDLRpkGybBcxqZo\n' + \ - # '81YCqlqidwfeO5YtlO7etx1xLyqa2NsCe' + \ - # 'G9A86UjG+aeNnXEIDk1PDK+EuiThIUa\n' + \ - # '/2IxKzJKWl1BKr2d4xAfR0ZnEYuRrbeDQ' + \ - # 'YgTImOlfW6/GuYIxKYgEKCFHFqJATAG\n' + \ - # 'IxHrq1PDOiSwXd2GmVVYyEmhZnbcp8Cxa' + \ - # 'EMQoevxAta0ssMK3w6UsDtvUvYvF22m\n' + \ - # 'qQKBiD5GwESzsFPy3Ga0MvZpn3D6EJQLg' + \ - # 'snrtUPZx+z2Ep2x0xc5orneB5fGyF1P\n' + \ - # 'WtP+fG5Q6Dpdz3LRfm+KwBCWFKQjg7uTx' + \ - # 'cjerhBWEYPmEMKYwTJF5PBG9/ddvHLQ\n' + \ - # 'EQeNC8fHGg4UXU8mhHnSBt3EA10qQJfRD' + \ - # 's15M38eG2cYwB1PZpDHScDnDA0=\n' + \ - # '-----END RSA PRIVATE KEY-----' + privateKeyPem = \ + '-----BEGIN RSA PRIVATE KEY-----\n' + \ + 'MIIEqAIBAAKCAQEAhAKYdtoeoy8zcAcR8' + \ + '74L8cnZxKzAGwd7v36APp7Pv6Q2jdsP\n' + \ + 'BRrwWEBnez6d0UDKDwGbc6nxfEXAy5mbh' + \ + 'gajzrw3MOEt8uA5txSKobBpKDeBLOsd\n' + \ + 'JKFqMGmXCQvEG7YemcxDTRPxAleIAgYYR' + \ + 'jTSd/QBwVW9OwNFhekro3RtlinV0a75\n' + \ + 'jfZgkne/YiktSvLG34lw2zqXBDTC5NHRO' + \ + 'UqGTlML4PlNZS5Ri2U4aCNx2rUPRcKI\n' + \ + 'lE0PuKxI4T+HIaFpv8+rdV6eUgOrB2xeI' + \ + '1dSFFn/nnv5OoZJEIB+VmuKn3DCUcCZ\n' + \ + 'SFlQPSXSfBDiUGhwOw76WuSSsf1D4b/vL' + \ + 'oJ10wIDAQABAoIBAG/JZuSWdoVHbi56\n' + \ + 'vjgCgkjg3lkO1KrO3nrdm6nrgA9P9qaPj' + \ + 'xuKoWaKO1cBQlE1pSWp/cKncYgD5WxE\n' + \ + 'CpAnRUXG2pG4zdkzCYzAh1i+c34L6oZoH' + \ + 'sirK6oNcEnHveydfzJL5934egm6p8DW\n' + \ + '+m1RQ70yUt4uRc0YSor+q1LGJvGQHReF0' + \ + 'WmJBZHrhz5e63Pq7lE0gIwuBqL8SMaA\n' + \ + 'yRXtK+JGxZpImTq+NHvEWWCu09SCq0r83' + \ + '8ceQI55SvzmTkwqtC+8AT2zFviMZkKR\n' + \ + 'Qo6SPsrqItxZWRty2izawTF0Bf5S2VAx7' + \ + 'O+6t3wBsQ1sLptoSgX3QblELY5asI0J\n' + \ + 'YFz7LJECgYkAsqeUJmqXE3LP8tYoIjMIA' + \ + 'KiTm9o6psPlc8CrLI9CH0UbuaA2JCOM\n' + \ + 'cCNq8SyYbTqgnWlB9ZfcAm/cFpA8tYci9' + \ + 'm5vYK8HNxQr+8FS3Qo8N9RJ8d0U5Csw\n' + \ + 'DzMYfRghAfUGwmlWj5hp1pQzAuhwbOXFt' + \ + 'xKHVsMPhz1IBtF9Y8jvgqgYHLbmyiu1\n' + \ + 'mwJ5AL0pYF0G7x81prlARURwHo0Yf52kE' + \ + 'w1dxpx+JXER7hQRWQki5/NsUEtv+8RT\n' + \ + 'qn2m6qte5DXLyn83b1qRscSdnCCwKtKWU' + \ + 'ug5q2ZbwVOCJCtmRwmnP131lWRYfj67\n' + \ + 'B/xJ1ZA6X3GEf4sNReNAtaucPEelgR2ns' + \ + 'N0gKQKBiGoqHWbK1qYvBxX2X3kbPDkv\n' + \ + '9C+celgZd2PW7aGYLCHq7nPbmfDV0yHcW' + \ + 'jOhXZ8jRMjmANVR/eLQ2EfsRLdW69bn\n' + \ + 'f3ZD7JS1fwGnO3exGmHO3HZG+6AvberKY' + \ + 'VYNHahNFEw5TsAcQWDLRpkGybBcxqZo\n' + \ + '81YCqlqidwfeO5YtlO7etx1xLyqa2NsCe' + \ + 'G9A86UjG+aeNnXEIDk1PDK+EuiThIUa\n' + \ + '/2IxKzJKWl1BKr2d4xAfR0ZnEYuRrbeDQ' + \ + 'YgTImOlfW6/GuYIxKYgEKCFHFqJATAG\n' + \ + 'IxHrq1PDOiSwXd2GmVVYyEmhZnbcp8Cxa' + \ + 'EMQoevxAta0ssMK3w6UsDtvUvYvF22m\n' + \ + 'qQKBiD5GwESzsFPy3Ga0MvZpn3D6EJQLg' + \ + 'snrtUPZx+z2Ep2x0xc5orneB5fGyF1P\n' + \ + 'WtP+fG5Q6Dpdz3LRfm+KwBCWFKQjg7uTx' + \ + 'cjerhBWEYPmEMKYwTJF5PBG9/ddvHLQ\n' + \ + 'EQeNC8fHGg4UXU8mhHnSBt3EA10qQJfRD' + \ + 's15M38eG2cYwB1PZpDHScDnDA0=\n' + \ + '-----END RSA PRIVATE KEY-----' sigInput = \ 'sig1=(date); alg=rsa-sha256; keyId="test-key-b"' sig = \ @@ -199,7 +200,8 @@ def testHttpSigNew(): # 'CaB8X/I5/+HLZLGvDiezqi6/7p2Gngf5hwZ0lSdy39vyNMaaAT0tKo6nuVw0S1MVg' + \ # '1Q7MpWYZs0soHjttq0uLIA3DIbQfLiIvK6/l0BdWTU7+2uQj7lBkQAsFZHoA96ZZg' + \ # 'FquQrXRlmYOh+Hx5D9fJkXcXe5tmAg==:' - boxpath = '/foo' + nickname = 'foo' + boxpath = '/' + nickname # headers = { # "*request-target": "get " + boxpath, # "*created": "1402170695", @@ -214,11 +216,14 @@ def testHttpSigNew(): # "Signature-Input": sigInput, # "Signature": sig # } + dateStr = "Tue, 07 Jun 2014 20:51:35 GMT" + domain = "example.com" + port = 443 headers = { "*created": "1402170695", "*request-target": "post /foo?param=value&pet=dog", - "host": "example.com", - "date": "Tue, 07 Jun 2014 20:51:35 GMT", + "host": domain, + "date": dateStr, "content-type": "application/json", "digest": "SHA-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=", "content-length": "18", @@ -231,6 +236,41 @@ def testHttpSigNew(): boxpath, False, None, messageBodyJsonStr, debug, True) + # make a deliberate mistake + headers['Signature'] = headers['Signature'].replace('V', 'B') + assert not verifyPostHeaders(httpPrefix, publicKeyPem, headers, + boxpath, False, None, + messageBodyJsonStr, debug, + True) + # test signing + bodyDigest = messageContentDigest(messageBodyJsonStr) + contentLength = len(messageBodyJsonStr) + headers = { + "host": domain, + "date": dateStr, + "digest": f'SHA-256={bodyDigest}', + "content-type": "application/json", + "content-length": str(contentLength) + } + signatureIndexHeader, signatureHeader = \ + signPostHeadersNew(dateStr, privateKeyPem, nickname, + domain, port, + domain, port, + boxpath, httpPrefix, messageBodyJsonStr, + 'rsa-sha256') + assert signatureIndexHeader == \ + 'keyId="https://example.com/users/foo#main-key"; ' + \ + 'alg=hs2019; created=1402170695; ' + \ + 'sig1=(*request-target, *created, host, date, ' + \ + 'digest, content-type, content-length)' + assert signatureHeader == \ + 'sig1=:LQU1PcJILSp1Q30GWINusfftYYKfTtam7InSu2c+ZzfGC' + \ + 'bTSevRgifZFuG2asFi8ubG/uUVHiBwIxxIz1u/JyWC3lYIFgjQF' + \ + 'RFM6As2b/ytnMA0LQhNebvk05iUNsz5izSoNTp5h9J7+roWkl6l' + \ + '8d5EA7vPMTQTJZnyU1cXBlvP1MtuVAKR6MbB3Aa/iZ4XOeaNK5E' + \ + '1VuPfNFrdnizIELE3nGVoVqNNImgMY3DWhtF3vvezrcT0J2vNGZ' + \ + 'cvhBfgn/xeAsNxz67SIHMgiXvLL6TFqEI1en9dl9A3ihB6ZO6+W' + \ + 'gUoW7OobZNlPxAUkQCc2A6oVjCYOdpKdrMAXQp2TQQ==:' def _testHttpsigBase(withDigest): From 0b7d96f48c9035ad7b5f39eabaa6e6042825730a Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 22 Feb 2021 18:27:04 +0000 Subject: [PATCH 0006/1416] Tidying --- tests.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests.py b/tests.py index 0256d0d95..02fe2b604 100644 --- a/tests.py +++ b/tests.py @@ -217,10 +217,11 @@ def testHttpSigNew(): # "Signature": sig # } dateStr = "Tue, 07 Jun 2014 20:51:35 GMT" + secondsSinceEpoch = 1402170695 domain = "example.com" port = 443 headers = { - "*created": "1402170695", + "*created": str(secondsSinceEpoch), "*request-target": "post /foo?param=value&pet=dog", "host": domain, "date": dateStr, @@ -260,7 +261,7 @@ def testHttpSigNew(): 'rsa-sha256') assert signatureIndexHeader == \ 'keyId="https://example.com/users/foo#main-key"; ' + \ - 'alg=hs2019; created=1402170695; ' + \ + 'alg=hs2019; created=' + str(secondsSinceEpoch) + '; ' + \ 'sig1=(*request-target, *created, host, date, ' + \ 'digest, content-type, content-length)' assert signatureHeader == \ From e03b2e0fd8da8be2fadbd5554db2b1caade4cbaf Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 23 Feb 2021 14:01:22 +0000 Subject: [PATCH 0007/1416] Set a flag to clear the browser cache when the theme is changed --- theme.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/theme.py b/theme.py index 9a27ec6e6..dbf78cf27 100644 --- a/theme.py +++ b/theme.py @@ -619,6 +619,15 @@ def setNewsAvatar(baseDir: str, name: str, nickname + '@' + domain + '/avatar.png') +def _setClearCacheFlag(baseDir: str) -> None: + """Sets a flag which can be used by an external system + (eg. a script in a cron job) to clear the browser cache + """ + flagFilename = baseDir + '/accounts/.clear_cache' + with open(flagFilename, 'w+') as flagFile: + flagFile.write('\n') + + def setTheme(baseDir: str, name: str, domain: str, allowLocalNetworkAccess: bool) -> bool: """Sets the theme with the given name as the current theme @@ -674,4 +683,5 @@ def setTheme(baseDir: str, name: str, domain: str, disableGrayscale(baseDir) _setThemeInConfig(baseDir, name) + _setClearCacheFlag(baseDir) return result From 0dbd048a1516bcdf07a1a3200f879d781609f220 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 23 Feb 2021 17:29:22 +0000 Subject: [PATCH 0008/1416] Check authorization on person options --- daemon.py | 11 +- webapp_person_options.py | 229 ++++++++++++++++++++------------------- 2 files changed, 125 insertions(+), 115 deletions(-) diff --git a/daemon.py b/daemon.py index d2029b346..b147c100d 100644 --- a/daemon.py +++ b/daemon.py @@ -2819,7 +2819,7 @@ class PubServer(BaseHTTPRequestHandler): domain, domainFull, GETstartTime, GETtimings, onionDomain, i2pDomain, - cookie, debug) + cookie, debug, authorized) return else: showPublishedDateOnly = self.server.showPublishedDateOnly @@ -5486,7 +5486,8 @@ class PubServer(BaseHTTPRequestHandler): domain: str, domainFull: str, GETstartTime, GETtimings: {}, onionDomain: str, i2pDomain: str, - cookie: str, debug: bool) -> None: + cookie: str, debug: bool, + authorized: bool) -> None: """Show person options screen """ backToPath = '' @@ -5576,7 +5577,8 @@ class PubServer(BaseHTTPRequestHandler): lockedAccount, movedTo, alsoKnownAs, self.server.textModeBanner, - self.server.newsInstance).encode('utf-8') + self.server.newsInstance, + authorized).encode('utf-8') msglen = len(msg) self._set_headers('text/html', msglen, cookie, callingDomain) @@ -10495,7 +10497,8 @@ class PubServer(BaseHTTPRequestHandler): GETstartTime, GETtimings, self.server.onionDomain, self.server.i2pDomain, - cookie, self.server.debug) + cookie, self.server.debug, + authorized) return self._benchmarkGETtimings(GETstartTime, GETtimings, diff --git a/webapp_person_options.py b/webapp_person_options.py index 75dd21045..5c903ce9b 100644 --- a/webapp_person_options.py +++ b/webapp_person_options.py @@ -53,7 +53,8 @@ def htmlPersonOptions(defaultTimeline: str, movedTo: str, alsoKnownAs: [], textModeBanner: str, - newsInstance: bool) -> str: + newsInstance: bool, + authorized: bool) -> str: """Show options for a person: view/follow/block/report """ optionsDomain, optionsPort = getDomainFromActor(optionsActor) @@ -225,88 +226,91 @@ def htmlPersonOptions(defaultTimeline: str, optionsActor + '">\n' optionsStr += ' \n' - if optionsNickname: - handle = optionsNickname + '@' + optionsDomainFull - petname = getPetName(baseDir, nickname, domain, handle) - optionsStr += \ - ' ' + translate['Petname'] + ': \n' + \ - ' \n' \ - '
\n' + if authorized: + if optionsNickname: + handle = optionsNickname + '@' + optionsDomainFull + petname = getPetName(baseDir, nickname, domain, handle) + optionsStr += \ + ' ' + translate['Petname'] + ': \n' + \ + ' \n' \ + '
\n' - # checkbox for receiving calendar events - if isFollowingActor(baseDir, nickname, domain, optionsActor): - checkboxStr = \ - ' ' + \ - translate['Receive calendar events from this account'] + \ - '\n
\n' - if not receivingCalendarEvents(baseDir, nickname, domain, - optionsNickname, optionsDomainFull): - checkboxStr = checkboxStr.replace(' checked>', '>') - optionsStr += checkboxStr + # checkbox for receiving calendar events + if isFollowingActor(baseDir, nickname, domain, optionsActor): + checkboxStr = \ + ' ' + \ + translate['Receive calendar events from this account'] + \ + '\n
\n' + if not receivingCalendarEvents(baseDir, nickname, domain, + optionsNickname, + optionsDomainFull): + checkboxStr = checkboxStr.replace(' checked>', '>') + optionsStr += checkboxStr - # checkbox for permission to post to newswire - newswirePostsPermitted = False - if optionsDomainFull == domainFull: - adminNickname = getConfigParam(baseDir, 'admin') - if (nickname == adminNickname or - (isModerator(baseDir, nickname) and - not isModerator(baseDir, optionsNickname))): - newswireBlockedFilename = \ + # checkbox for permission to post to newswire + newswirePostsPermitted = False + if optionsDomainFull == domainFull: + adminNickname = getConfigParam(baseDir, 'admin') + if (nickname == adminNickname or + (isModerator(baseDir, nickname) and + not isModerator(baseDir, optionsNickname))): + newswireBlockedFilename = \ + baseDir + '/accounts/' + \ + optionsNickname + '@' + optionsDomain + '/.nonewswire' + checkboxStr = \ + ' ' + \ + translate['Allow news posts'] + \ + '\n
\n' + if os.path.isfile(newswireBlockedFilename): + checkboxStr = checkboxStr.replace(' checked>', '>') + else: + newswirePostsPermitted = True + optionsStr += checkboxStr + + # whether blogs created by this account are moderated on the newswire + if newswirePostsPermitted: + moderatedFilename = \ baseDir + '/accounts/' + \ - optionsNickname + '@' + optionsDomain + '/.nonewswire' + optionsNickname + '@' + optionsDomain + '/.newswiremoderated' checkboxStr = \ ' ' + \ - translate['Allow news posts'] + \ + 'class="profilecheckbox" name="modNewsPosts" checked> ' + \ + translate['News posts are moderated'] + \ '\n
\n' - if os.path.isfile(newswireBlockedFilename): - checkboxStr = checkboxStr.replace(' checked>', '>') - else: - newswirePostsPermitted = True - optionsStr += checkboxStr - - # whether blogs created by this account are moderated on the newswire - if newswirePostsPermitted: - moderatedFilename = \ - baseDir + '/accounts/' + \ - optionsNickname + '@' + optionsDomain + '/.newswiremoderated' - checkboxStr = \ - ' ' + \ - translate['News posts are moderated'] + \ - '\n
\n' - if not os.path.isfile(moderatedFilename): - checkboxStr = checkboxStr.replace(' checked>', '>') - optionsStr += checkboxStr - - # checkbox for permission to post to featured articles - if newsInstance and optionsDomainFull == domainFull: - adminNickname = getConfigParam(baseDir, 'admin') - if (nickname == adminNickname or - (isModerator(baseDir, nickname) and - not isModerator(baseDir, optionsNickname))): - checkboxStr = \ - ' ' + \ - translate['Featured writer'] + \ - '\n
\n' - if not isFeaturedWriter(baseDir, optionsNickname, - optionsDomain): + if not os.path.isfile(moderatedFilename): checkboxStr = checkboxStr.replace(' checked>', '>') optionsStr += checkboxStr + # checkbox for permission to post to featured articles + if newsInstance and optionsDomainFull == domainFull: + adminNickname = getConfigParam(baseDir, 'admin') + if (nickname == adminNickname or + (isModerator(baseDir, nickname) and + not isModerator(baseDir, optionsNickname))): + checkboxStr = \ + ' ' + \ + translate['Featured writer'] + \ + '\n
\n' + if not isFeaturedWriter(baseDir, optionsNickname, + optionsDomain): + checkboxStr = checkboxStr.replace(' checked>', '>') + optionsStr += checkboxStr + optionsStr += optionsLinkStr backPath = '/' if nickname: @@ -317,49 +321,52 @@ def htmlPersonOptions(defaultTimeline: str, ' \n' - optionsStr += \ - ' \n' + if authorized: + optionsStr += \ + ' \n' optionsStr += donateStr - optionsStr += \ - ' \n' - optionsStr += \ - ' \n' - optionsStr += \ - ' \n' - optionsStr += \ - ' \n' - optionsStr += \ - ' \n' - - if isModerator(baseDir, nickname): + if authorized: + optionsStr += \ + ' \n' + optionsStr += \ + ' \n' + optionsStr += \ + ' \n' + optionsStr += \ + ' \n' optionsStr += \ ' \n' + 'name="submitReport">' + translate['Report'] + '\n' - personNotes = '' - personNotesFilename = \ - baseDir + '/accounts/' + nickname + '@' + domain + \ - '/notes/' + handle + '.txt' - if os.path.isfile(personNotesFilename): - with open(personNotesFilename, 'r') as fp: - personNotes = fp.read() + if isModerator(baseDir, nickname): + optionsStr += \ + ' \n' - optionsStr += \ - '

' + translate['Notes'] + ': \n' - optionsStr += '
\n' - optionsStr += \ - ' \n' + personNotes = '' + personNotesFilename = \ + baseDir + '/accounts/' + nickname + '@' + domain + \ + '/notes/' + handle + '.txt' + if os.path.isfile(personNotesFilename): + with open(personNotesFilename, 'r') as fp: + personNotes = fp.read() + + optionsStr += \ + '

' + translate['Notes'] + ': \n' + optionsStr += '
\n' + optionsStr += \ + ' \n' optionsStr += ' \n' optionsStr += '\n' From 8124a7cdc6fdab55bf996f1c817331258f2bb451 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 23 Feb 2021 17:35:26 +0000 Subject: [PATCH 0009/1416] Check that notes belong to the viewer --- webapp_person_options.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/webapp_person_options.py b/webapp_person_options.py index 5c903ce9b..6459f2d45 100644 --- a/webapp_person_options.py +++ b/webapp_person_options.py @@ -351,12 +351,13 @@ def htmlPersonOptions(defaultTimeline: str, translate['Info'] + '\n' personNotes = '' - personNotesFilename = \ - baseDir + '/accounts/' + nickname + '@' + domain + \ - '/notes/' + handle + '.txt' - if os.path.isfile(personNotesFilename): - with open(personNotesFilename, 'r') as fp: - personNotes = fp.read() + if originPathStr.startswith('/' + nickname + '/'): + personNotesFilename = \ + baseDir + '/accounts/' + nickname + '@' + domain + \ + '/notes/' + handle + '.txt' + if os.path.isfile(personNotesFilename): + with open(personNotesFilename, 'r') as fp: + personNotes = fp.read() optionsStr += \ '

' + translate['Notes'] + ': \n' From 8e343f2ca0240b7dd74ef3773a541fc013105483 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 23 Feb 2021 17:40:22 +0000 Subject: [PATCH 0010/1416] Users --- webapp_person_options.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp_person_options.py b/webapp_person_options.py index 6459f2d45..c7f18490a 100644 --- a/webapp_person_options.py +++ b/webapp_person_options.py @@ -351,7 +351,7 @@ def htmlPersonOptions(defaultTimeline: str, translate['Info'] + '\n' personNotes = '' - if originPathStr.startswith('/' + nickname + '/'): + if originPathStr.startswith('/users/' + nickname + '/'): personNotesFilename = \ baseDir + '/accounts/' + nickname + '@' + domain + \ '/notes/' + handle + '.txt' From 8635d68e3e1c571f6f0e7158d5ec23089fb54a3a Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 23 Feb 2021 17:42:11 +0000 Subject: [PATCH 0011/1416] Debug --- webapp_person_options.py | 1 + 1 file changed, 1 insertion(+) diff --git a/webapp_person_options.py b/webapp_person_options.py index c7f18490a..3ee334b49 100644 --- a/webapp_person_options.py +++ b/webapp_person_options.py @@ -351,6 +351,7 @@ def htmlPersonOptions(defaultTimeline: str, translate['Info'] + '\n' personNotes = '' + print('originPathStr=' + originPathStr) if originPathStr.startswith('/users/' + nickname + '/'): personNotesFilename = \ baseDir + '/accounts/' + nickname + '@' + domain + \ From 2d861657957306787259cbba28dec42032f875fb Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 23 Feb 2021 17:45:53 +0000 Subject: [PATCH 0012/1416] Origin check --- webapp_person_options.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/webapp_person_options.py b/webapp_person_options.py index 3ee334b49..5f824b3bc 100644 --- a/webapp_person_options.py +++ b/webapp_person_options.py @@ -351,8 +351,7 @@ def htmlPersonOptions(defaultTimeline: str, translate['Info'] + '\n' personNotes = '' - print('originPathStr=' + originPathStr) - if originPathStr.startswith('/users/' + nickname + '/'): + if originPathStr == '/users/' + nickname: personNotesFilename = \ baseDir + '/accounts/' + nickname + '@' + domain + \ '/notes/' + handle + '.txt' From 9145ac0801e226a3fec3ce54bb61e262904adc54 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 23 Feb 2021 17:51:48 +0000 Subject: [PATCH 0013/1416] More checks on visibility of items on person options --- webapp_person_options.py | 152 ++++++++++++++++++++------------------- 1 file changed, 78 insertions(+), 74 deletions(-) diff --git a/webapp_person_options.py b/webapp_person_options.py index 5f824b3bc..176d75bdc 100644 --- a/webapp_person_options.py +++ b/webapp_person_options.py @@ -227,90 +227,94 @@ def htmlPersonOptions(defaultTimeline: str, optionsStr += ' \n' if authorized: - if optionsNickname: - handle = optionsNickname + '@' + optionsDomainFull - petname = getPetName(baseDir, nickname, domain, handle) - optionsStr += \ - ' ' + translate['Petname'] + ': \n' + \ - ' \n' \ - '
\n' + if originPathStr == '/users/' + nickname: + if optionsNickname: + handle = optionsNickname + '@' + optionsDomainFull + petname = getPetName(baseDir, nickname, domain, handle) + optionsStr += \ + ' ' + translate['Petname'] + ': \n' + \ + ' \n' \ + '
\n' - # checkbox for receiving calendar events - if isFollowingActor(baseDir, nickname, domain, optionsActor): - checkboxStr = \ - ' ' + \ - translate['Receive calendar events from this account'] + \ - '\n
\n' - if not receivingCalendarEvents(baseDir, nickname, domain, - optionsNickname, - optionsDomainFull): - checkboxStr = checkboxStr.replace(' checked>', '>') - optionsStr += checkboxStr + # checkbox for receiving calendar events + if isFollowingActor(baseDir, nickname, domain, optionsActor): + checkboxStr = \ + ' ' + \ + translate['Receive calendar events from this account'] + \ + '\n
\n' + if not receivingCalendarEvents(baseDir, nickname, domain, + optionsNickname, + optionsDomainFull): + checkboxStr = checkboxStr.replace(' checked>', '>') + optionsStr += checkboxStr - # checkbox for permission to post to newswire - newswirePostsPermitted = False - if optionsDomainFull == domainFull: - adminNickname = getConfigParam(baseDir, 'admin') - if (nickname == adminNickname or - (isModerator(baseDir, nickname) and - not isModerator(baseDir, optionsNickname))): - newswireBlockedFilename = \ + # checkbox for permission to post to newswire + newswirePostsPermitted = False + if optionsDomainFull == domainFull: + adminNickname = getConfigParam(baseDir, 'admin') + if (nickname == adminNickname or + (isModerator(baseDir, nickname) and + not isModerator(baseDir, optionsNickname))): + newswireBlockedFilename = \ + baseDir + '/accounts/' + \ + optionsNickname + '@' + optionsDomain + '/.nonewswire' + checkboxStr = \ + ' ' + \ + translate['Allow news posts'] + \ + '\n
\n' + if os.path.isfile(newswireBlockedFilename): + checkboxStr = checkboxStr.replace(' checked>', '>') + else: + newswirePostsPermitted = True + optionsStr += checkboxStr + + # whether blogs created by this account are moderated on + # the newswire + if newswirePostsPermitted: + moderatedFilename = \ baseDir + '/accounts/' + \ - optionsNickname + '@' + optionsDomain + '/.nonewswire' + optionsNickname + '@' + \ + optionsDomain + '/.newswiremoderated' checkboxStr = \ ' ' + \ - translate['Allow news posts'] + \ + 'class="profilecheckbox" name="modNewsPosts" checked> ' + \ + translate['News posts are moderated'] + \ '\n
\n' - if os.path.isfile(newswireBlockedFilename): - checkboxStr = checkboxStr.replace(' checked>', '>') - else: - newswirePostsPermitted = True - optionsStr += checkboxStr - - # whether blogs created by this account are moderated on the newswire - if newswirePostsPermitted: - moderatedFilename = \ - baseDir + '/accounts/' + \ - optionsNickname + '@' + optionsDomain + '/.newswiremoderated' - checkboxStr = \ - ' ' + \ - translate['News posts are moderated'] + \ - '\n
\n' - if not os.path.isfile(moderatedFilename): - checkboxStr = checkboxStr.replace(' checked>', '>') - optionsStr += checkboxStr - - # checkbox for permission to post to featured articles - if newsInstance and optionsDomainFull == domainFull: - adminNickname = getConfigParam(baseDir, 'admin') - if (nickname == adminNickname or - (isModerator(baseDir, nickname) and - not isModerator(baseDir, optionsNickname))): - checkboxStr = \ - ' ' + \ - translate['Featured writer'] + \ - '\n
\n' - if not isFeaturedWriter(baseDir, optionsNickname, - optionsDomain): + if not os.path.isfile(moderatedFilename): checkboxStr = checkboxStr.replace(' checked>', '>') optionsStr += checkboxStr + # checkbox for permission to post to featured articles + if newsInstance and optionsDomainFull == domainFull: + adminNickname = getConfigParam(baseDir, 'admin') + if (nickname == adminNickname or + (isModerator(baseDir, nickname) and + not isModerator(baseDir, optionsNickname))): + checkboxStr = \ + ' ' + \ + translate['Featured writer'] + \ + '\n
\n' + if not isFeaturedWriter(baseDir, optionsNickname, + optionsDomain): + checkboxStr = checkboxStr.replace(' checked>', '>') + optionsStr += checkboxStr + optionsStr += optionsLinkStr backPath = '/' if nickname: From 4e6d9d2d4561ea8864ce0cbf31f1fbefc9bc2aba Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 23 Feb 2021 17:58:52 +0000 Subject: [PATCH 0014/1416] Change behavior of back button if not logged in --- webapp_person_options.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/webapp_person_options.py b/webapp_person_options.py index 176d75bdc..91f1c14bd 100644 --- a/webapp_person_options.py +++ b/webapp_person_options.py @@ -321,10 +321,16 @@ def htmlPersonOptions(defaultTimeline: str, backPath = '/users/' + nickname + '/' + defaultTimeline if 'moderation' in backToPath: backPath = '/users/' + nickname + '/moderation' - optionsStr += \ - ' \n' + if authorized: + optionsStr += \ + ' \n' + else: + optionsStr += \ + ' \n' if authorized: optionsStr += \ ' ' # add other buttons diff --git a/webapp_timeline.py b/webapp_timeline.py index 8f2e4c399..1c3cf7f63 100644 --- a/webapp_timeline.py +++ b/webapp_timeline.py @@ -385,7 +385,7 @@ def htmlTimeline(cssCache: {}, defaultTimeline: str, menuInbox = \ htmlHideFromScreenReader('📥') + ' ' + translate['Inbox'] menuOutbox = \ - htmlHideFromScreenReader('📤') + ' ' + translate['Outbox'] + htmlHideFromScreenReader('📤') + ' ' + translate['Sent'] menuSearch = \ htmlHideFromScreenReader('🔍') + ' ' + \ translate['Search and follow'] From 764f6673c0db19d5fbad1688c2e229f465d22d77 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 24 Feb 2021 09:54:37 +0000 Subject: [PATCH 0018/1416] Improve follow checking when a DM arrives --- follow.py | 7 +++++++ inbox.py | 7 ++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/follow.py b/follow.py index cce18f1b2..b29632ea1 100644 --- a/follow.py +++ b/follow.py @@ -126,6 +126,7 @@ def _removeFromFollowRejects(baseDir: str, def isFollowingActor(baseDir: str, nickname: str, domain: str, actor: str) -> bool: """Is the given nickname following the given actor? + The actor can also be a handle: nickname@domain """ if ':' in domain: domain = domain.split(':')[0] @@ -137,6 +138,12 @@ def isFollowingActor(baseDir: str, return False if actor.lower() in open(followingFile).read().lower(): return True + if '@' in actor and '://' not in actor: + # the actor is a handle: nickname@domain + followingHandle = actor.lower() + if followingHandle in open(followingFile).read().lower(): + return True + return False followingNickname = getNicknameFromActor(actor) if not followingNickname: print('WARN: unable to find nickname in ' + actor) diff --git a/inbox.py b/inbox.py index 86507b87d..321a27480 100644 --- a/inbox.py +++ b/inbox.py @@ -40,6 +40,7 @@ from categories import setHashtagCategory from httpsig import verifyPostHeaders from session import createSession from session import getJson +from follow import isFollowingActor from follow import receiveFollowRequest from follow import getFollowersOfActor from follow import unfollowerOfAccount @@ -73,7 +74,6 @@ from git import receiveGitPatch from followingCalendar import receivingCalendarEvents from happening import saveEventPost from delete import removeOldHashtags -from follow import isFollowingActor from categories import guessHashtagCategory from context import hasValidContext @@ -2288,8 +2288,9 @@ def _inboxAfterInitial(recentPostsCache: {}, maxRecentPosts: int, sendH = \ sendingActorNickname + '@' + sendingActorDomain if sendH != nickname + '@' + domain: - if sendH not in \ - open(followingFilename).read(): + if not isFollowingActor(baseDir, + nickname, domain, + sendH): print(nickname + '@' + domain + ' cannot receive DM from ' + sendH + From 99035b1b7bcd125a42fb333557c2c1285ef0455b Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 24 Feb 2021 09:56:08 +0000 Subject: [PATCH 0019/1416] Redundant logic --- follow.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/follow.py b/follow.py index b29632ea1..c3a383664 100644 --- a/follow.py +++ b/follow.py @@ -138,12 +138,6 @@ def isFollowingActor(baseDir: str, return False if actor.lower() in open(followingFile).read().lower(): return True - if '@' in actor and '://' not in actor: - # the actor is a handle: nickname@domain - followingHandle = actor.lower() - if followingHandle in open(followingFile).read().lower(): - return True - return False followingNickname = getNicknameFromActor(actor) if not followingNickname: print('WARN: unable to find nickname in ' + actor) From 4555917eeb04191ff549896335609219b67e4df9 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 24 Feb 2021 10:05:30 +0000 Subject: [PATCH 0020/1416] Tidying --- inbox.py | 52 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/inbox.py b/inbox.py index 321a27480..01623b270 100644 --- a/inbox.py +++ b/inbox.py @@ -2263,42 +2263,52 @@ def _inboxAfterInitial(recentPostsCache: {}, maxRecentPosts: int, postIsDM = isDM(postJsonObject) if postIsDM: if nickname != 'inbox': + # check for the flag file which indicates to + # only receive DMs from people you are following followDMsFilename = \ baseDir + '/accounts/' + \ nickname + '@' + domain + '/.followDMs' if os.path.isfile(followDMsFilename): + # get the file containing following handles followingFilename = \ baseDir + '/accounts/' + \ nickname + '@' + domain + '/following.txt' + # who is sending a DM? if not postJsonObject.get('actor'): return False sendingActor = postJsonObject['actor'] sendingActorNickname = \ getNicknameFromActor(sendingActor) + if not sendingActorNickname: + return False sendingActorDomain, sendingActorPort = \ getDomainFromActor(sendingActor) - if sendingActorNickname and sendingActorDomain: - if not os.path.isfile(followingFilename): - print('No following.txt file exists for ' + - nickname + '@' + domain + - ' so not accepting DM from ' + - sendingActorNickname + '@' + - sendingActorDomain) - return False - sendH = \ - sendingActorNickname + '@' + sendingActorDomain - if sendH != nickname + '@' + domain: - if not isFollowingActor(baseDir, - nickname, domain, - sendH): - print(nickname + '@' + domain + - ' cannot receive DM from ' + - sendH + - ' because they do not ' + - 'follow them') - return False - else: + if not sendingActorDomain: return False + # check that the following file exists + if not os.path.isfile(followingFilename): + print('No following.txt file exists for ' + + nickname + '@' + domain + + ' so not accepting DM from ' + + sendingActorNickname + '@' + + sendingActorDomain) + return False + # get the handle of the DM sender + sendH = \ + sendingActorNickname + '@' + sendingActorDomain + # Not sending to yourself + if sendH != nickname + '@' + domain: + # check the follow + if not isFollowingActor(baseDir, + nickname, domain, + sendH): + print(nickname + '@' + domain + + ' cannot receive DM from ' + + sendH + + ' because they do not ' + + 'follow them') + return False + # dm index will be updated updateIndexList.append('dm') _dmNotify(baseDir, handle, From a9de85cb1385b7aa0874124aedf56b43da06c37b Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 24 Feb 2021 11:01:44 +0000 Subject: [PATCH 0021/1416] Send DM bounce messages --- inbox.py | 78 +++++++++++++++++++++++++++++++++++++++++--- translations/ar.json | 3 +- translations/ca.json | 3 +- translations/cy.json | 3 +- translations/de.json | 3 +- translations/en.json | 3 +- translations/es.json | 3 +- translations/fr.json | 3 +- translations/ga.json | 3 +- translations/hi.json | 3 +- translations/it.json | 3 +- translations/ja.json | 3 +- translations/oc.json | 3 +- translations/pt.json | 3 +- translations/ru.json | 3 +- translations/zh.json | 3 +- 16 files changed, 103 insertions(+), 20 deletions(-) diff --git a/inbox.py b/inbox.py index 01623b270..f44d17d2b 100644 --- a/inbox.py +++ b/inbox.py @@ -58,6 +58,7 @@ from utils import updateAnnounceCollection from utils import undoAnnounceCollectionEntry from utils import dangerousMarkup from httpsig import messageContentDigest +from posts import createDirectMessagePost from posts import validContentWarning from posts import downloadAnnounce from posts import isDM @@ -2056,6 +2057,67 @@ def _updateLastSeen(baseDir: str, handle: str, actor: str) -> None: lastSeenFile.write(str(daysSinceEpoch)) +def _bounceDM(senderPostId: str, session, httpPrefix: str, + baseDir: str, nickname: str, domain: str, port: int, + sendingHandle: str, federationList: [], + sendThreads: [], postLog: [], + cachedWebfingers: {}, personCache: {}, + translate: {}, debug: bool) -> None: + """Sends a bounce message back to the sending handle + if a DM has been rejected + """ + print(nickname + '@' + domain + + ' cannot receive DM from ' + sendingHandle + + ' because they do not follow them') + senderNickname = sendingHandle.split('@')[0] + senderDomain = sendingHandle.split('@')[1] + senderPort = port + if ':' in senderDomain: + senderPortStr = senderDomain.split(':')[1] + if senderPortStr.isdigit(): + senderPort = int(senderPortStr) + senderDomain = senderDomain.split(':')[0] + cc = [] + + # create the bounce DM + subject = None + content = translate['DM bounce'] + followersOnly = False + saveToFile = False + clientToServer = False + commentsEnabled = False + attachImageFilename = None + mediaType = None + imageDescription = '' + inReplyTo = removeIdEnding(senderPostId) + inReplyToAtomUri = None + schedulePost = False + eventDate = None + eventTime = None + location = None + postJsonObject = \ + createDirectMessagePost(baseDir, nickname, domain, port, + httpPrefix, content, followersOnly, + saveToFile, clientToServer, + commentsEnabled, + attachImageFilename, mediaType, + imageDescription, + inReplyTo, inReplyToAtomUri, + subject, debug, schedulePost, + eventDate, eventTime, location) + if not postJsonObject: + print('WARN: unable to create bounce message to ' + sendingHandle) + return + # bounce DM goes back to the sender + print('Sending bounce DM to ' + sendingHandle) + sendSignedJson(postJsonObject, session, baseDir, + nickname, domain, port, + senderNickname, senderDomain, senderPort, cc, + httpPrefix, False, False, federationList, + sendThreads, postLog, cachedWebfingers, + personCache, debug, __version__) + + def _inboxAfterInitial(recentPostsCache: {}, maxRecentPosts: int, session, keyId: str, handle: str, messageJson: {}, baseDir: str, httpPrefix: str, sendThreads: [], @@ -2302,11 +2364,17 @@ def _inboxAfterInitial(recentPostsCache: {}, maxRecentPosts: int, if not isFollowingActor(baseDir, nickname, domain, sendH): - print(nickname + '@' + domain + - ' cannot receive DM from ' + - sendH + - ' because they do not ' + - 'follow them') + # send back a bounce DM + if postJsonObject.get('id'): + senderPostId = \ + postJsonObject['id'] + _bounceDM(senderPostId, + session, httpPrefix, + baseDir, nickname, domain, port, + sendH, federationList, + sendThreads, postLog, + cachedWebfingers, personCache, + translate, debug) return False # dm index will be updated diff --git a/translations/ar.json b/translations/ar.json index bec3a0389..6d4b5b6d8 100644 --- a/translations/ar.json +++ b/translations/ar.json @@ -370,5 +370,6 @@ "Publish a blog article": "نشر مقال بلوق", "Featured writer": "كاتب متميز", "Broch mode": "وضع الكتيب", - "Pixel": "بكسل" + "Pixel": "بكسل", + "DM bounce": "يتم قبول الرسائل فقط من الحسابات المتبعة" } diff --git a/translations/ca.json b/translations/ca.json index ae3607114..17ee18c1c 100644 --- a/translations/ca.json +++ b/translations/ca.json @@ -370,5 +370,6 @@ "Publish a blog article": "Publicar un article del bloc", "Featured writer": "Escriptor destacat", "Broch mode": "Mode Broch", - "Pixel": "Pixel" + "Pixel": "Pixel", + "DM bounce": "Els missatges només s’accepten des dels comptes seguits" } diff --git a/translations/cy.json b/translations/cy.json index 0ab618d79..b3e77400d 100644 --- a/translations/cy.json +++ b/translations/cy.json @@ -370,5 +370,6 @@ "Publish a blog article": "Cyhoeddi erthygl blog", "Featured writer": "Awdur dan sylw", "Broch mode": "Modd Broch", - "Pixel": "Pixel" + "Pixel": "Pixel", + "DM bounce": "Dim ond o gyfrifon a ddilynir y derbynnir negeseuon" } diff --git a/translations/de.json b/translations/de.json index a5f963c83..c7c1cb650 100644 --- a/translations/de.json +++ b/translations/de.json @@ -370,5 +370,6 @@ "Publish a blog article": "Veröffentlichen Sie einen Blog-Artikel", "Featured writer": "Ausgewählter Schriftsteller", "Broch mode": "Broch-Modus", - "Pixel": "Pixel" + "Pixel": "Pixel", + "DM bounce": "Nachrichten werden nur von folgenden Konten akzeptiert" } diff --git a/translations/en.json b/translations/en.json index 4d2af2ec5..4e3db4794 100644 --- a/translations/en.json +++ b/translations/en.json @@ -370,5 +370,6 @@ "Publish a blog article": "Publish a blog article", "Featured writer": "Featured writer", "Broch mode": "Broch mode", - "Pixel": "Pixel" + "Pixel": "Pixel", + "DM bounce": "Messages are only accepted from followed accounts" } diff --git a/translations/es.json b/translations/es.json index 095363f66..fa7f25060 100644 --- a/translations/es.json +++ b/translations/es.json @@ -370,5 +370,6 @@ "Publish a blog article": "Publica un artículo de blog", "Featured writer": "Escritora destacada", "Broch mode": "Modo broche", - "Pixel": "Pixel" + "Pixel": "Pixel", + "DM bounce": "Solo se aceptan mensajes de cuentas seguidas" } diff --git a/translations/fr.json b/translations/fr.json index 835b52d5f..0c8d6f0c6 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -370,5 +370,6 @@ "Publish a blog article": "Publier un article de blog", "Featured writer": "Écrivain en vedette", "Broch mode": "Mode Broch", - "Pixel": "Pixel" + "Pixel": "Pixel", + "DM bounce": "Les messages ne sont acceptés que des comptes suivis" } diff --git a/translations/ga.json b/translations/ga.json index b04c8b874..d9eb10393 100644 --- a/translations/ga.json +++ b/translations/ga.json @@ -370,5 +370,6 @@ "Publish a blog article": "Foilsigh alt blagála", "Featured writer": "Scríbhneoir mór le rá", "Broch mode": "Modh broch", - "Pixel": "Pixel" + "Pixel": "Pixel", + "DM bounce": "Ní ghlactar le teachtaireachtaí ach ó chuntais a leanann" } diff --git a/translations/hi.json b/translations/hi.json index a3a81ab27..ac8b0b00e 100644 --- a/translations/hi.json +++ b/translations/hi.json @@ -370,5 +370,6 @@ "Publish a blog article": "एक ब्लॉग लेख प्रकाशित करें", "Featured writer": "फीचर्ड लेखक", "Broch mode": "ब्रोच मोड", - "Pixel": "पिक्सेल" + "Pixel": "पिक्सेल", + "DM bounce": "संदेश केवल अनुसरण किए गए खातों से स्वीकार किए जाते हैं" } diff --git a/translations/it.json b/translations/it.json index 13a001e35..a22a09d4e 100644 --- a/translations/it.json +++ b/translations/it.json @@ -370,5 +370,6 @@ "Publish a blog article": "Pubblica un articolo sul blog", "Featured writer": "Scrittore in primo piano", "Broch mode": "Modalità Broch", - "Pixel": "Pixel" + "Pixel": "Pixel", + "DM bounce": "I messaggi sono accettati solo dagli account seguiti" } diff --git a/translations/ja.json b/translations/ja.json index 36ea8d2ef..736dde695 100644 --- a/translations/ja.json +++ b/translations/ja.json @@ -370,5 +370,6 @@ "Publish a blog article": "ブログ記事を公開する", "Featured writer": "注目の作家", "Broch mode": "ブロッホモード", - "Pixel": "ピクセル" + "Pixel": "ピクセル", + "DM bounce": "メッセージはフォローされているアカウントからのみ受け付けられます" } diff --git a/translations/oc.json b/translations/oc.json index ce631490f..75d48eee6 100644 --- a/translations/oc.json +++ b/translations/oc.json @@ -366,5 +366,6 @@ "Publish a blog article": "Publish a blog article", "Featured writer": "Featured writer", "Broch mode": "Broch mode", - "Pixel": "Pixel" + "Pixel": "Pixel", + "DM bounce": "Messages are only accepted from followed accounts" } diff --git a/translations/pt.json b/translations/pt.json index b86088f68..e1d37d4f7 100644 --- a/translations/pt.json +++ b/translations/pt.json @@ -370,5 +370,6 @@ "Publish a blog article": "Publique um artigo de blog", "Featured writer": "Escritor em destaque", "Broch mode": "Modo broch", - "Pixel": "Pixel" + "Pixel": "Pixel", + "DM bounce": "Mensagens são aceitas apenas de contas seguidas" } diff --git a/translations/ru.json b/translations/ru.json index 88ea8db79..a1d021f05 100644 --- a/translations/ru.json +++ b/translations/ru.json @@ -370,5 +370,6 @@ "Publish a blog article": "Опубликовать статью в блоге", "Featured writer": "Избранный писатель", "Broch mode": "Брош режим", - "Pixel": "Пиксель" + "Pixel": "Пиксель", + "DM bounce": "Сообщения принимаются только от следующих аккаунтов" } diff --git a/translations/zh.json b/translations/zh.json index 90283d086..8cd6a124d 100644 --- a/translations/zh.json +++ b/translations/zh.json @@ -370,5 +370,6 @@ "Publish a blog article": "发布博客文章", "Featured writer": "特色作家", "Broch mode": "断点模式", - "Pixel": "像素点" + "Pixel": "像素点", + "DM bounce": "仅接受来自后续帐户的邮件" } From cc35f0317026426e6625b14bfc3cf298da10740b Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 24 Feb 2021 11:09:53 +0000 Subject: [PATCH 0022/1416] Don't send bounces to replies to bounces --- inbox.py | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/inbox.py b/inbox.py index f44d17d2b..4f70044cb 100644 --- a/inbox.py +++ b/inbox.py @@ -2365,16 +2365,24 @@ def _inboxAfterInitial(recentPostsCache: {}, maxRecentPosts: int, nickname, domain, sendH): # send back a bounce DM - if postJsonObject.get('id'): - senderPostId = \ - postJsonObject['id'] - _bounceDM(senderPostId, - session, httpPrefix, - baseDir, nickname, domain, port, - sendH, federationList, - sendThreads, postLog, - cachedWebfingers, personCache, - translate, debug) + if postJsonObject.get('id') and \ + postJsonObject.get('object'): + # don't send bounces back to + # replies to bounce messages + obj = postJsonObject['object'] + if isinstance(obj, dict): + if not obj.get('inReplyTo'): + senderPostId = \ + postJsonObject['id'] + _bounceDM(senderPostId, + session, httpPrefix, + baseDir, + nickname, domain, port, + sendH, federationList, + sendThreads, postLog, + cachedWebfingers, + personCache, + translate, debug) return False # dm index will be updated From a0a800c980e115aee10aa72682d8145254f6deed Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 24 Feb 2021 11:43:48 +0000 Subject: [PATCH 0023/1416] Don't send bounce messages too frequently Otherwise an adversary can tie up your instance with sending bounces --- inbox.py | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/inbox.py b/inbox.py index 4f70044cb..0efca270d 100644 --- a/inbox.py +++ b/inbox.py @@ -2062,13 +2062,25 @@ def _bounceDM(senderPostId: str, session, httpPrefix: str, sendingHandle: str, federationList: [], sendThreads: [], postLog: [], cachedWebfingers: {}, personCache: {}, - translate: {}, debug: bool) -> None: + translate: {}, debug: bool, + lastBounceMessage: []) -> bool: """Sends a bounce message back to the sending handle if a DM has been rejected """ print(nickname + '@' + domain + ' cannot receive DM from ' + sendingHandle + ' because they do not follow them') + + # Don't send out bounce messages too frequently. + # Otherwise an adversary could try to DoS your instance + # by continuously sending DMs to you + currTime = int(time.time()) + if currTime - lastBounceMessage[0] < 60: + return False + + # record the last time that a bounce was generated + lastBounceMessage[0] = currTime + senderNickname = sendingHandle.split('@')[0] senderDomain = sendingHandle.split('@')[1] senderPort = port @@ -2107,7 +2119,7 @@ def _bounceDM(senderPostId: str, session, httpPrefix: str, eventDate, eventTime, location) if not postJsonObject: print('WARN: unable to create bounce message to ' + sendingHandle) - return + return False # bounce DM goes back to the sender print('Sending bounce DM to ' + sendingHandle) sendSignedJson(postJsonObject, session, baseDir, @@ -2116,6 +2128,7 @@ def _bounceDM(senderPostId: str, session, httpPrefix: str, httpPrefix, False, False, federationList, sendThreads, postLog, cachedWebfingers, personCache, debug, __version__) + return True def _inboxAfterInitial(recentPostsCache: {}, maxRecentPosts: int, @@ -2132,7 +2145,8 @@ def _inboxAfterInitial(recentPostsCache: {}, maxRecentPosts: int, unitTest: bool, YTReplacementDomain: str, showPublishedDateOnly: bool, allowLocalNetworkAccess: bool, - peertubeInstances: []) -> bool: + peertubeInstances: [], + lastBounceMessage: []) -> bool: """ Anything which needs to be done after initial checks have passed """ actor = keyId @@ -2377,12 +2391,14 @@ def _inboxAfterInitial(recentPostsCache: {}, maxRecentPosts: int, _bounceDM(senderPostId, session, httpPrefix, baseDir, - nickname, domain, port, - sendH, federationList, + nickname, domain, + port, sendH, + federationList, sendThreads, postLog, cachedWebfingers, personCache, - translate, debug) + translate, debug, + lastBounceMessage) return False # dm index will be updated @@ -2600,6 +2616,11 @@ def runInboxQueue(recentPostsCache: {}, maxRecentPosts: int, heartBeatCtr = 0 queueRestoreCtr = 0 + # time when the last DM bounce message was sent + # This is in a list so that it can be changed by reference + # within _bounceDM + lastBounceMessage = [int(time.time())] + while True: time.sleep(1) @@ -3056,7 +3077,8 @@ def runInboxQueue(recentPostsCache: {}, maxRecentPosts: int, YTReplacementDomain, showPublishedDateOnly, allowLocalNetworkAccess, - peertubeInstances) + peertubeInstances, + lastBounceMessage) if debug: pprint(queueJson['post']) From 36e921a06dbd55c6fd9810da8d21df9548b25848 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 24 Feb 2021 12:08:36 +0000 Subject: [PATCH 0024/1416] Check the domain when adding or removing accounts from commandline --- epicyon.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/epicyon.py b/epicyon.py index cf0289c65..5b5d01b8b 100644 --- a/epicyon.py +++ b/epicyon.py @@ -1617,6 +1617,13 @@ if args.addaccount: if not args.domain or not getConfigParam(baseDir, 'domain'): print('Use the --domain option to set the domain name') sys.exit() + + configuredDomain = getConfigParam(baseDir, 'domain') + if configuredDomain: + if domain != configuredDomain: + print('The account domain is expected to be ' + configuredDomain) + sys.exit() + if not validNickname(domain, nickname): print(nickname + ' is a reserved name. Use something different.') sys.exit() @@ -1688,6 +1695,13 @@ if args.rmaccount: if not args.domain or not getConfigParam(baseDir, 'domain'): print('Use the --domain option to set the domain name') sys.exit() + + configuredDomain = getConfigParam(baseDir, 'domain') + if configuredDomain: + if domain != configuredDomain: + print('The account domain is expected to be ' + configuredDomain) + sys.exit() + if args.deactivate: if deactivateAccount(baseDir, nickname, domain): print('Account for ' + nickname + '@' + domain + From fd7ff355822a41569290673dbf683e6e8a23a1b0 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 24 Feb 2021 12:55:34 +0000 Subject: [PATCH 0025/1416] Showing DM icon on posts --- webapp_post.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/webapp_post.py b/webapp_post.py index b5646c416..9be58c1be 100644 --- a/webapp_post.py +++ b/webapp_post.py @@ -1270,8 +1270,9 @@ def individualPostAsHtml(allowDownloads: bool, showRepeatIcon = showRepeats isPublicRepeat = False showDMicon = False + postIsDM = isDM(postJsonObject) if showRepeats: - if isDM(postJsonObject): + if postIsDM: showDMicon = True showRepeatIcon = False else: @@ -1347,7 +1348,7 @@ def individualPostAsHtml(allowDownloads: bool, _logPostTiming(enableTimingLog, postStartTime, '9') # Show a DM icon for DMs in the inbox timeline - if showDMicon: + if postIsDM: titleStr = \ titleStr + ' \n' @@ -1501,7 +1502,7 @@ def individualPostAsHtml(allowDownloads: bool, '" class="' + timeClass + '">' + publishedStr + '\n' # change the background color for DMs in inbox timeline - if showDMicon: + if postIsDM: containerClassIcons = 'containericons dm' containerClass = 'container dm' From 91c900a6d6574848b035e67167d169b5a87bd1eb Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 24 Feb 2021 13:43:38 +0000 Subject: [PATCH 0026/1416] Background for different post types --- epicyon-profile.css | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/epicyon-profile.css b/epicyon-profile.css index 2afefdc66..384c60893 100644 --- a/epicyon-profile.css +++ b/epicyon-profile.css @@ -599,15 +599,15 @@ a:focus { vertical-align: middle; } -.darker { +.container.darker { background-color: var(--main-bg-color-reply); } -.dm { +.container.dm { background-color: var(--main-bg-color-dm); } -.report { +.container.report { border-color: #255; background-color: var(--main-bg-color-report); } From e75e35fc22089d6d6d6448f5e0fc495d84973b3f Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 24 Feb 2021 14:31:04 +0000 Subject: [PATCH 0027/1416] Allow gemini style links --- webapp_column_left.py | 16 +++++++++++++++- webapp_post.py | 2 -- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/webapp_column_left.py b/webapp_column_left.py index 14651564f..61d1d0014 100644 --- a/webapp_column_left.py +++ b/webapp_column_left.py @@ -176,7 +176,8 @@ def getLeftColumnContent(baseDir: str, nickname: str, domainFull: str, if ' ' not in lineStr: if '#' not in lineStr: if '*' not in lineStr: - continue + if not lineStr.startswith('=> '): + continue lineStr = lineStr.strip() words = lineStr.split(' ') # get the link @@ -186,6 +187,8 @@ def getLeftColumnContent(baseDir: str, nickname: str, domainFull: str, continue if word == '*': continue + if word == '=>': + continue if '://' in word: linkStr = word break @@ -203,6 +206,17 @@ def getLeftColumnContent(baseDir: str, nickname: str, domainFull: str, 'rel="nofollow noopener noreferrer">' + \ lineStr + '

\n' linksFileContainsEntries = True + elif lineStr.startswith('=> '): + # gemini style link + lineStr = lineStr.replace('=> ', '') + lineStr = lineStr.replace(linkStr, '') + # add link to the returned html + htmlStr += \ + '

' + \ + lineStr.strip() + '

\n' + linksFileContainsEntries = True else: if lineStr.startswith('#') or lineStr.startswith('*'): lineStr = lineStr[1:].strip() diff --git a/webapp_post.py b/webapp_post.py index 9be58c1be..f66d53a87 100644 --- a/webapp_post.py +++ b/webapp_post.py @@ -1269,11 +1269,9 @@ def individualPostAsHtml(allowDownloads: bool, # If this is the inbox timeline then don't show the repeat icon on any DMs showRepeatIcon = showRepeats isPublicRepeat = False - showDMicon = False postIsDM = isDM(postJsonObject) if showRepeats: if postIsDM: - showDMicon = True showRepeatIcon = False else: if not isPublicPost(postJsonObject): From 6a93f8d9a85fcdaab1358551396ce2737eae7595 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 24 Feb 2021 14:41:46 +0000 Subject: [PATCH 0028/1416] Support markdown format links --- webapp_column_left.py | 42 +++++++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/webapp_column_left.py b/webapp_column_left.py index 61d1d0014..598b53821 100644 --- a/webapp_column_left.py +++ b/webapp_column_left.py @@ -176,22 +176,42 @@ def getLeftColumnContent(baseDir: str, nickname: str, domainFull: str, if ' ' not in lineStr: if '#' not in lineStr: if '*' not in lineStr: - if not lineStr.startswith('=> '): - continue + if not lineStr.startswith('['): + if not lineStr.startswith('=> '): + continue lineStr = lineStr.strip() - words = lineStr.split(' ') - # get the link linkStr = None - for word in words: - if word == '#': + if not lineStr.startswith('['): + words = lineStr.split(' ') + # get the link + for word in words: + if word == '#': + continue + if word == '*': + continue + if word == '=>': + continue + if '://' in word: + linkStr = word + break + else: + # markdown link + if ']' not in lineStr: continue - if word == '*': + if '(' not in lineStr: continue - if word == '=>': + if ')' not in lineStr: continue - if '://' in word: - linkStr = word - break + linkStr = lineStr.split('(')[1] + if ')' not in linkStr: + continue + linkStr = linkStr.split(')')[0] + if '://' not in linkStr: + continue + lineStr = lineStr.split('[')[1] + if ']' not in lineStr: + continue + lineStr = lineStr.split(']')[0] if linkStr: lineStr = lineStr.replace(linkStr, '').strip() # avoid any dubious scripts being added From 53774bed1b21d324abedae527c12016b105fa89d Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 24 Feb 2021 18:44:26 +0000 Subject: [PATCH 0029/1416] Welcome screen --- epicyon-welcome.css | 233 +++++++++++++++++++++++++++++++++++++++++++ translations/ar.json | 3 +- translations/ca.json | 3 +- translations/cy.json | 3 +- translations/de.json | 3 +- translations/en.json | 3 +- translations/es.json | 3 +- translations/fr.json | 3 +- translations/ga.json | 3 +- translations/hi.json | 3 +- translations/it.json | 3 +- translations/ja.json | 3 +- translations/oc.json | 3 +- translations/pt.json | 3 +- translations/ru.json | 3 +- translations/zh.json | 3 +- webapp_welcome.py | 61 +++++++++++ 17 files changed, 324 insertions(+), 15 deletions(-) create mode 100644 epicyon-welcome.css create mode 100644 webapp_welcome.py diff --git a/epicyon-welcome.css b/epicyon-welcome.css new file mode 100644 index 000000000..70f984bc4 --- /dev/null +++ b/epicyon-welcome.css @@ -0,0 +1,233 @@ +@chaste "UTF-8"; + +:root { + --welcome-bg-color: #282c37; + --link-bg-color: #282c37; + --welcome-fg-color: #dddddd; + --main-link-color: #999; + --main-visited-color: #888; + --border-color: #505050; + --border-width: 2px; + --font-size-header: 18px; + --font-color-header: #ccc; + --welcome-font-size: 22px; + --welcome-font-size-mobile: 40px; + --text-entry-foreground: #ccc; + --text-entry-background: #111; + --time-color: #aaa; + --button-text: #FFFFFF; + --button-background: #999; + --button-selected: #666; + --form-border-radius: 30px; + --focus-color: white; + --line-spacing: 130%; + --welcome-logo-width: 20%; + --main-link-color-hover: #bbb; + --rendering: normal; +} + +@font-face { + font-family: 'Bedstead'; + font-style: italic; + font-weight: normal; + font-display: block; + src: url('./fonts/bedstead.otf') format('opentype'); +} +@font-face { + font-family: 'Bedstead'; + font-style: normal; + font-weight: normal; + font-display: block; + src: url('./fonts/bedstead.otf') format('opentype'); +} + +body, html { + background-color: var(--welcome-bg-color); + color: var(--welcome-fg-color); + + background-image: url("/welcome-background.jpg"); + background-size: cover; + -webkit-background-size: cover; + -moz-background-size: cover; + background-repeat: no-repeat; + background-position: center; + height: 100%; + font-family: Arial, Helvetica, sans-serif; + max-width: 60%; + min-width: 600px; + margin: 0 auto; + font-size: var(--welcome-font-size); + line-height: var(--line-spacing); + image-rendering: var(--rendering); +} + +a, u { + color: var(--welcome-fg-color); +} + +a:visited{ + color: var(--main-visited-color); + background: var(--link-bg-color); + font-weight: normal; + text-decoration: none; +} + +a:link { + color: var(--main-link-color); + background: var(--link-bg-color); + font-weight: normal; + text-decoration: none; +} + +a:link:hover { + color: var(--main-link-color-hover); +} + +a:visited:hover { + color: var(--main-link-color-hover); +} + +a:focus { + border: 2px solid var(--focus-color); +} + +form { + border: var(--border-width) solid var(--border-color); + border-radius: var(--form-border-radius); +} + +.transparent { + color: transparent; + background: transparent; + font-size: 0px; + line-height: 0px; + height: 0px; +} + +button { + background-color: var(--button-background); + color: var(--button-text); + padding: 14px 20px; + margin: 8px 0; + border: none; + cursor: pointer; + width: 100%; + font-size: var(--welcome-font-size); + font-family: Arial, Helvetica, sans-serif; +} + +.welcome-text { + font-size: var(--welcome-font-size); + font-family: Arial, Helvetica, sans-serif; +} + +button:hover { + opacity: 0.8; +} + +.imgcontainer { + text-align: center; + margin: 24px 0 12px 0; +} + +.imgcontainer img { + width: var(--welcome-logo-width); +} + +img.avatar { + width: 40%; + border-radius: 50%; +} + +.container { + padding: 16px; +} + +.container.next { + float: right; +} + +span.psw { + float: right; + padding-top: 16px; +} + +@media screen and (min-width: 400px) { + body, html { + background-color: var(--welcome-bg-color); + color: var(--welcome-fg-color); + height: 100%; + font-family: Arial, Helvetica, sans-serif; + max-width: 60%; + min-width: 600px; + margin: 0 auto; + font-size: var(--welcome-font-size); + font-family: Arial, Helvetica, sans-serif; + position: relative; + } + .welcome-text { + font-size: var(--welcome-font-size); + font-family: Arial, Helvetica, sans-serif; + } + input[type=text], input[type=password] { + width: 100%; + padding: 12px 20px; + margin: 8px 0; + display: inline-block; + border: 1px solid #ccc; + box-sizing: border-box; + font-size: var(--welcome-font-size); + font-family: Arial, Helvetica, sans-serif; + } + button { + background-color: var(--button-background); + color: var(--button-text); + padding: 14px 20px; + margin: 8px 0; + border: none; + cursor: pointer; + width: 100%; + font-size: var(--welcome-font-size); + font-family: Arial, Helvetica, sans-serif; + } +} + +@media screen and (max-width: 1000px) { + body, html { + background-color: var(--welcome-bg-color); + color: var(--welcome-fg-color); + height: 100%; + font-family: Arial, Helvetica, sans-serif; + max-width: 95%; + min-width: 600px; + margin: 0 auto; + font-size: var(--welcome-font-size-mobile); + font-family: Arial, Helvetica, sans-serif; + position: relative; + } + .welcome-text { + font-size: var(--welcome-font-size-mobile); + font-family: Arial, Helvetica, sans-serif; + } + input[type=text], input[type=password] { + width: 100%; + padding: 12px 20px; + margin: 8px 0; + display: inline-block; + border: 1px solid #ccc; + box-sizing: border-box; + font-size: var(--welcome-font-size-mobile); + font-family: Arial, Helvetica, sans-serif; + } + button { + background-color: var(--button-background); + color: var(--button-text); + padding: 14px 20px; + margin: 8px 0; + border: none; + cursor: pointer; + width: 100%; + font-size: var(--welcome-font-size-mobile); + font-family: Arial, Helvetica, sans-serif; + } +} diff --git a/translations/ar.json b/translations/ar.json index 6d4b5b6d8..41410f8b1 100644 --- a/translations/ar.json +++ b/translations/ar.json @@ -371,5 +371,6 @@ "Featured writer": "كاتب متميز", "Broch mode": "وضع الكتيب", "Pixel": "بكسل", - "DM bounce": "يتم قبول الرسائل فقط من الحسابات المتبعة" + "DM bounce": "يتم قبول الرسائل فقط من الحسابات المتبعة", + "Next": "التالي" } diff --git a/translations/ca.json b/translations/ca.json index 17ee18c1c..7bfdfc584 100644 --- a/translations/ca.json +++ b/translations/ca.json @@ -371,5 +371,6 @@ "Featured writer": "Escriptor destacat", "Broch mode": "Mode Broch", "Pixel": "Pixel", - "DM bounce": "Els missatges només s’accepten des dels comptes seguits" + "DM bounce": "Els missatges només s’accepten des dels comptes seguits", + "Next": "Pròxim" } diff --git a/translations/cy.json b/translations/cy.json index b3e77400d..e10b5049f 100644 --- a/translations/cy.json +++ b/translations/cy.json @@ -371,5 +371,6 @@ "Featured writer": "Awdur dan sylw", "Broch mode": "Modd Broch", "Pixel": "Pixel", - "DM bounce": "Dim ond o gyfrifon a ddilynir y derbynnir negeseuon" + "DM bounce": "Dim ond o gyfrifon a ddilynir y derbynnir negeseuon", + "Next": "Nesaf" } diff --git a/translations/de.json b/translations/de.json index c7c1cb650..e280a2e19 100644 --- a/translations/de.json +++ b/translations/de.json @@ -371,5 +371,6 @@ "Featured writer": "Ausgewählter Schriftsteller", "Broch mode": "Broch-Modus", "Pixel": "Pixel", - "DM bounce": "Nachrichten werden nur von folgenden Konten akzeptiert" + "DM bounce": "Nachrichten werden nur von folgenden Konten akzeptiert", + "Next": "Nächster" } diff --git a/translations/en.json b/translations/en.json index 4e3db4794..b34511781 100644 --- a/translations/en.json +++ b/translations/en.json @@ -371,5 +371,6 @@ "Featured writer": "Featured writer", "Broch mode": "Broch mode", "Pixel": "Pixel", - "DM bounce": "Messages are only accepted from followed accounts" + "DM bounce": "Messages are only accepted from followed accounts", + "Next": "Next" } diff --git a/translations/es.json b/translations/es.json index fa7f25060..c4094c7fb 100644 --- a/translations/es.json +++ b/translations/es.json @@ -371,5 +371,6 @@ "Featured writer": "Escritora destacada", "Broch mode": "Modo broche", "Pixel": "Pixel", - "DM bounce": "Solo se aceptan mensajes de cuentas seguidas" + "DM bounce": "Solo se aceptan mensajes de cuentas seguidas", + "Next": "Próxima" } diff --git a/translations/fr.json b/translations/fr.json index 0c8d6f0c6..067e9c7ac 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -371,5 +371,6 @@ "Featured writer": "Écrivain en vedette", "Broch mode": "Mode Broch", "Pixel": "Pixel", - "DM bounce": "Les messages ne sont acceptés que des comptes suivis" + "DM bounce": "Les messages ne sont acceptés que des comptes suivis", + "Next": "Suivante" } diff --git a/translations/ga.json b/translations/ga.json index d9eb10393..e90397fdc 100644 --- a/translations/ga.json +++ b/translations/ga.json @@ -371,5 +371,6 @@ "Featured writer": "Scríbhneoir mór le rá", "Broch mode": "Modh broch", "Pixel": "Pixel", - "DM bounce": "Ní ghlactar le teachtaireachtaí ach ó chuntais a leanann" + "DM bounce": "Ní ghlactar le teachtaireachtaí ach ó chuntais a leanann", + "Next": "Ar Aghaidh" } diff --git a/translations/hi.json b/translations/hi.json index ac8b0b00e..fbc481e8f 100644 --- a/translations/hi.json +++ b/translations/hi.json @@ -371,5 +371,6 @@ "Featured writer": "फीचर्ड लेखक", "Broch mode": "ब्रोच मोड", "Pixel": "पिक्सेल", - "DM bounce": "संदेश केवल अनुसरण किए गए खातों से स्वीकार किए जाते हैं" + "DM bounce": "संदेश केवल अनुसरण किए गए खातों से स्वीकार किए जाते हैं", + "Next": "अगला" } diff --git a/translations/it.json b/translations/it.json index a22a09d4e..ba842eca6 100644 --- a/translations/it.json +++ b/translations/it.json @@ -371,5 +371,6 @@ "Featured writer": "Scrittore in primo piano", "Broch mode": "Modalità Broch", "Pixel": "Pixel", - "DM bounce": "I messaggi sono accettati solo dagli account seguiti" + "DM bounce": "I messaggi sono accettati solo dagli account seguiti", + "Next": "Il prossimo" } diff --git a/translations/ja.json b/translations/ja.json index 736dde695..c4c4d8223 100644 --- a/translations/ja.json +++ b/translations/ja.json @@ -371,5 +371,6 @@ "Featured writer": "注目の作家", "Broch mode": "ブロッホモード", "Pixel": "ピクセル", - "DM bounce": "メッセージはフォローされているアカウントからのみ受け付けられます" + "DM bounce": "メッセージはフォローされているアカウントからのみ受け付けられます", + "Next": "次" } diff --git a/translations/oc.json b/translations/oc.json index 75d48eee6..a271ce5ec 100644 --- a/translations/oc.json +++ b/translations/oc.json @@ -367,5 +367,6 @@ "Featured writer": "Featured writer", "Broch mode": "Broch mode", "Pixel": "Pixel", - "DM bounce": "Messages are only accepted from followed accounts" + "DM bounce": "Messages are only accepted from followed accounts", + "Next": "Next" } diff --git a/translations/pt.json b/translations/pt.json index e1d37d4f7..4ccf54d6c 100644 --- a/translations/pt.json +++ b/translations/pt.json @@ -371,5 +371,6 @@ "Featured writer": "Escritor em destaque", "Broch mode": "Modo broch", "Pixel": "Pixel", - "DM bounce": "Mensagens são aceitas apenas de contas seguidas" + "DM bounce": "Mensagens são aceitas apenas de contas seguidas", + "Next": "Próxima" } diff --git a/translations/ru.json b/translations/ru.json index a1d021f05..f845a384d 100644 --- a/translations/ru.json +++ b/translations/ru.json @@ -371,5 +371,6 @@ "Featured writer": "Избранный писатель", "Broch mode": "Брош режим", "Pixel": "Пиксель", - "DM bounce": "Сообщения принимаются только от следующих аккаунтов" + "DM bounce": "Сообщения принимаются только от следующих аккаунтов", + "Next": "Следующий" } diff --git a/translations/zh.json b/translations/zh.json index 8cd6a124d..0e0b33e8c 100644 --- a/translations/zh.json +++ b/translations/zh.json @@ -371,5 +371,6 @@ "Featured writer": "特色作家", "Broch mode": "断点模式", "Pixel": "像素点", - "DM bounce": "仅接受来自后续帐户的邮件" + "DM bounce": "仅接受来自后续帐户的邮件", + "Next": "下一个" } diff --git a/webapp_welcome.py b/webapp_welcome.py new file mode 100644 index 000000000..95ccee620 --- /dev/null +++ b/webapp_welcome.py @@ -0,0 +1,61 @@ +__filename__ = "webapp_welcome.py" +__author__ = "Bob Mottram" +__license__ = "AGPL3+" +__version__ = "1.2.0" +__maintainer__ = "Bob Mottram" +__email__ = "bob@freedombone.net" +__status__ = "Production" + +import os +from shutil import copyfile +from utils import getConfigParam +from webapp_utils import htmlHeaderWithExternalStyle +from webapp_utils import htmlFooter + + +def welcomeScreenShown(baseDir: str, nickname: str, domain: str): + """Indicates that the welcome screen has been shown for a given account + """ + shownFilename = baseDir + '/accounts/.welcome_shown' + shownFile = open(shownFilename, 'w+') + if shownFile: + shownFile.write('\n') + shownFile.close() + + +def htmlWelcomeScreen(baseDir: str, nickname: str, domain: str, + language: str, translate: {}) -> str: + """Returns the welcome screen + """ + # set a custom background for the welcome screen + if os.path.isfile(baseDir + '/accounts/welcome-background-custom.jpg'): + if not os.path.isfile(baseDir + '/accounts/welcome-background.jpg'): + copyfile(baseDir + '/accounts/welcome-background-custom.jpg', + baseDir + '/accounts/welcome-background.jpg') + + welcomeText = 'Welcome to Epicyon' + welcomeFilename = baseDir + '/accounts/welcome.txt' + if not os.path.isfile(welcomeFilename): + defaultFilename = baseDir + '/defaultwelcome/' + language + '.txt' + if os.path.isfile(defaultFilename): + copyfile(defaultFilename, welcomeFilename) + if os.path.isfile(welcomeFilename): + with open(baseDir + '/accounts/welcome.txt', 'r') as welcomeFile: + welcomeText = welcomeFile.read() + + welcomeForm = '' + cssFilename = baseDir + '/epicyon-welcome.css' + if os.path.isfile(baseDir + '/welcome.css'): + cssFilename = baseDir + '/welcome.css' + + instanceTitle = \ + getConfigParam(baseDir, 'instanceTitle') + welcomeForm = htmlHeaderWithExternalStyle(cssFilename, instanceTitle) + welcomeForm += '
' + welcomeText + '
\n' + welcomeForm += ' \n' + welcomeForm += '\n' + welcomeForm += htmlFooter() + return welcomeForm From 28deeff7758d5925a349bf91dc9ccf7a128f9e3d Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 24 Feb 2021 18:47:29 +0000 Subject: [PATCH 0030/1416] Convert line endings --- webapp_welcome.py | 1 + 1 file changed, 1 insertion(+) diff --git a/webapp_welcome.py b/webapp_welcome.py index 95ccee620..0cdecfe11 100644 --- a/webapp_welcome.py +++ b/webapp_welcome.py @@ -42,6 +42,7 @@ def htmlWelcomeScreen(baseDir: str, nickname: str, domain: str, if os.path.isfile(welcomeFilename): with open(baseDir + '/accounts/welcome.txt', 'r') as welcomeFile: welcomeText = welcomeFile.read() + welcomeText = welcomeText.replace('\n', '
') welcomeForm = '' cssFilename = baseDir + '/epicyon-welcome.css' From 47788d5a43f2fccbfc2336a81ca2e092c6d1df61 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 24 Feb 2021 19:04:51 +0000 Subject: [PATCH 0031/1416] Formatting of welcome text --- defaultwelcome/en.txt | 5 +++++ defaultwelcome/en.txt~ | 1 + webapp_utils.py | 20 ++++++++++++++++++++ webapp_welcome.py | 4 ++-- 4 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 defaultwelcome/en.txt create mode 100644 defaultwelcome/en.txt~ diff --git a/defaultwelcome/en.txt b/defaultwelcome/en.txt new file mode 100644 index 000000000..9e8186fe8 --- /dev/null +++ b/defaultwelcome/en.txt @@ -0,0 +1,5 @@ +# Welcome + +Epicyon is an ActivityPub server designed for self-hosting of a few people on low power systems such as single board computers or old laptops. It's intended to be as easy as possible to install and maintain. + + diff --git a/defaultwelcome/en.txt~ b/defaultwelcome/en.txt~ new file mode 100644 index 000000000..334cab178 --- /dev/null +++ b/defaultwelcome/en.txt~ @@ -0,0 +1 @@ +Welcome to Epicyon diff --git a/webapp_utils.py b/webapp_utils.py index 64b1cae89..1ab1afd40 100644 --- a/webapp_utils.py +++ b/webapp_utils.py @@ -21,6 +21,26 @@ from content import addHtmlTags from content import replaceEmojiFromTags +def markdownToHtml(markdown: str) -> str: + """Converts markdown formatted text to html + """ + linesList = markdown.split('\n') + htmlStr = '' + for line in linesList: + if line.startswith('#####'): + line = line.replace('#####', '
').strip() + '
' + elif line.startswith('####'): + line = line.replace('####', '

').strip() + '

' + elif line.startswith('###'): + line = line.replace('###', '

').strip() + '

' + elif line.startswith('##'): + line = line.replace('##', '

').strip() + '

' + elif line.startswith('#'): + line = line.replace('#', '

').strip() + '

' + htmlStr += line + return htmlStr + + def getBrokenLinkSubstitute() -> str: """Returns html used to show a default image if the link to an image is broken diff --git a/webapp_welcome.py b/webapp_welcome.py index 0cdecfe11..41f0f4d8f 100644 --- a/webapp_welcome.py +++ b/webapp_welcome.py @@ -11,6 +11,7 @@ from shutil import copyfile from utils import getConfigParam from webapp_utils import htmlHeaderWithExternalStyle from webapp_utils import htmlFooter +from webapp_utils import markdownToHtml def welcomeScreenShown(baseDir: str, nickname: str, domain: str): @@ -41,8 +42,7 @@ def htmlWelcomeScreen(baseDir: str, nickname: str, domain: str, copyfile(defaultFilename, welcomeFilename) if os.path.isfile(welcomeFilename): with open(baseDir + '/accounts/welcome.txt', 'r') as welcomeFile: - welcomeText = welcomeFile.read() - welcomeText = welcomeText.replace('\n', '
') + welcomeText = markdownToHtml(welcomeFile.read()) welcomeForm = '' cssFilename = baseDir + '/epicyon-welcome.css' From 32eb256a496042cba6ae500cad710bf137f3c015 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 24 Feb 2021 20:37:59 +0000 Subject: [PATCH 0032/1416] Welcome text in markdown --- defaultwelcome/{en.txt => en.md} | 0 defaultwelcome/en.txt~ | 1 - tests.py | 23 +++++++++++++++++ webapp_utils.py | 42 ++++++++++++++++++++++++++++---- webapp_welcome.py | 6 ++--- 5 files changed, 63 insertions(+), 9 deletions(-) rename defaultwelcome/{en.txt => en.md} (100%) delete mode 100644 defaultwelcome/en.txt~ diff --git a/defaultwelcome/en.txt b/defaultwelcome/en.md similarity index 100% rename from defaultwelcome/en.txt rename to defaultwelcome/en.md diff --git a/defaultwelcome/en.txt~ b/defaultwelcome/en.txt~ deleted file mode 100644 index 334cab178..000000000 --- a/defaultwelcome/en.txt~ +++ /dev/null @@ -1 +0,0 @@ -Welcome to Epicyon diff --git a/tests.py b/tests.py index 02fe2b604..79ba90062 100644 --- a/tests.py +++ b/tests.py @@ -98,6 +98,7 @@ from newswire import parseFeedDate from mastoapiv1 import getMastoApiV1IdFromNickname from mastoapiv1 import getNicknameFromMastoApiV1Id from webapp_post import prepareHtmlPostNickname +from webapp_utils import markdownToHtml testServerAliceRunning = False testServerBobRunning = False @@ -3282,9 +3283,31 @@ def testValidHashTag(): assert not validHashTag('This=IsAlsoNotValid"') +def testMarkdownToHtml(): + print('testMarkdownToHtml') + markdown = 'This is just plain text' + assert markdownToHtml(markdown) == markdown + + markdown = '# Title1\n### Title3\n## Title2\n' + assert markdownToHtml(markdown) == \ + '

Title1


Title3


Title2


' + + markdown = \ + 'This is [a link](https://something.somewhere) to something\n' + \ + 'And [something else](https://cat.pic).' + assert markdownToHtml(markdown) == \ + 'This is ' + \ + 'a link to something
' + \ + 'And ' + \ + 'something else.' + + def runAllTests(): print('Running tests...') testFunctions() + testMarkdownToHtml() testValidHashTag() testPrepareHtmlPostNickname() testDomainHandling() diff --git a/webapp_utils.py b/webapp_utils.py index 1ab1afd40..52b83d424 100644 --- a/webapp_utils.py +++ b/webapp_utils.py @@ -24,20 +24,52 @@ from content import replaceEmojiFromTags def markdownToHtml(markdown: str) -> str: """Converts markdown formatted text to html """ + # replace markdown style links with html links + replaceLinks = {} + text = markdown + while '[' in text: + if ')' not in text: + break + text = text.split('[', 1)[1] + markdownLink = '[' + text.split(')')[0] + ')' + if ']' not in markdownLink or \ + '(' not in markdownLink: + text = text.split(')', 1)[1] + continue + replaceLinks[markdownLink] = \ + '' + \ + markdownLink.split('[')[1].split(']')[0] + \ + '' + text = text.split(')', 1)[1] + for mdLink, htmlLink in replaceLinks.items(): + markdown = markdown.replace(mdLink, htmlLink) + + # replace headers linesList = markdown.split('\n') htmlStr = '' + ctr = 0 for line in linesList: + if ctr > 0: + htmlStr += '
' if line.startswith('#####'): - line = line.replace('#####', '
').strip() + '
' + line = line.replace('#####', '').strip() + line = '
' + line + '
' elif line.startswith('####'): - line = line.replace('####', '

').strip() + '

' + line = line.replace('####', '').strip() + line = '

' + line + '

' elif line.startswith('###'): - line = line.replace('###', '

').strip() + '

' + line = line.replace('###', '').strip() + line = '

' + line + '

' elif line.startswith('##'): - line = line.replace('##', '

').strip() + '

' + line = line.replace('##', '').strip() + line = '

' + line + '

' elif line.startswith('#'): - line = line.replace('#', '

').strip() + '

' + line = line.replace('#', '').strip() + line = '

' + line + '

' htmlStr += line + ctr += 1 return htmlStr diff --git a/webapp_welcome.py b/webapp_welcome.py index 41f0f4d8f..2ab528d87 100644 --- a/webapp_welcome.py +++ b/webapp_welcome.py @@ -35,13 +35,13 @@ def htmlWelcomeScreen(baseDir: str, nickname: str, domain: str, baseDir + '/accounts/welcome-background.jpg') welcomeText = 'Welcome to Epicyon' - welcomeFilename = baseDir + '/accounts/welcome.txt' + welcomeFilename = baseDir + '/accounts/welcome.md' if not os.path.isfile(welcomeFilename): - defaultFilename = baseDir + '/defaultwelcome/' + language + '.txt' + defaultFilename = baseDir + '/defaultwelcome/' + language + '.md' if os.path.isfile(defaultFilename): copyfile(defaultFilename, welcomeFilename) if os.path.isfile(welcomeFilename): - with open(baseDir + '/accounts/welcome.txt', 'r') as welcomeFile: + with open(baseDir + '/accounts/welcome.md', 'r') as welcomeFile: welcomeText = markdownToHtml(welcomeFile.read()) welcomeForm = '' From 93f7aa78895fe37ef61829349ea429827c04def9 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 24 Feb 2021 20:45:38 +0000 Subject: [PATCH 0033/1416] Button link --- webapp_welcome.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webapp_welcome.py b/webapp_welcome.py index 2ab528d87..d73c69cc8 100644 --- a/webapp_welcome.py +++ b/webapp_welcome.py @@ -54,8 +54,8 @@ def htmlWelcomeScreen(baseDir: str, nickname: str, domain: str, welcomeForm = htmlHeaderWithExternalStyle(cssFilename, instanceTitle) welcomeForm += '
' + welcomeText + '
\n' welcomeForm += ' \n' welcomeForm += '\n' welcomeForm += htmlFooter() From b8ac29a515532eb4001481d15f7709e5c0c13dad Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 24 Feb 2021 21:17:08 +0000 Subject: [PATCH 0034/1416] Displaying welcome screen --- daemon.py | 25 +++++++++++++++++++++++++ tests.py | 2 +- webapp_utils.py | 5 +++++ webapp_welcome.py | 27 ++++++++++++++++++++------- 4 files changed, 51 insertions(+), 8 deletions(-) diff --git a/daemon.py b/daemon.py index b147c100d..04abd8e45 100644 --- a/daemon.py +++ b/daemon.py @@ -181,6 +181,8 @@ from webapp_search import htmlSearchEmojiTextEntry from webapp_search import htmlSearch from webapp_hashtagswarm import getHashtagCategoriesFeed from webapp_hashtagswarm import htmlSearchHashtagCategory +from webapp_welcome import htmlWelcomeScreen +from webapp_welcome import isWelcomeScreenComplete from shares import getSharesFeedForPerson from shares import addShare from shares import removeShare @@ -10670,6 +10672,29 @@ class PubServer(BaseHTTPRequestHandler): 'show about screen done', 'robots txt') + if htmlGET and authorized and \ + '/users/' in self.path and self.path.endswith('/welcome'): + nickname = self.path.split('/users/')[1] + if '/' in nickname: + nickname = nickname.split('/')[0] + if not isWelcomeScreenComplete(self.server.baseDir, + nickname, + self.server.domain): + msg = \ + htmlWelcomeScreen(self.server.baseDir, + self.server.systemLanguage, + self.server.translate) + msg = msg.encode('utf-8') + msglen = len(msg) + self._login_headers('text/html', msglen, callingDomain) + self._write(msg) + self._benchmarkGETtimings(GETstartTime, GETtimings, + 'following accounts done', + 'show welcome screen') + return + else: + self.path = self.path.replace('/welcome', '') + # if not authorized then show the login screen if htmlGET and self.path != '/login' and \ not self._pathIsImage(self.path) and \ diff --git a/tests.py b/tests.py index 79ba90062..fcacfd4be 100644 --- a/tests.py +++ b/tests.py @@ -3290,7 +3290,7 @@ def testMarkdownToHtml(): markdown = '# Title1\n### Title3\n## Title2\n' assert markdownToHtml(markdown) == \ - '

Title1


Title3


Title2


' + '

Title1

Title3

Title2

' markdown = \ 'This is [a link](https://something.somewhere) to something\n' + \ diff --git a/webapp_utils.py b/webapp_utils.py index 52b83d424..9d144d3b3 100644 --- a/webapp_utils.py +++ b/webapp_utils.py @@ -56,18 +56,23 @@ def markdownToHtml(markdown: str) -> str: if line.startswith('#####'): line = line.replace('#####', '').strip() line = '
' + line + '
' + ctr = -1 elif line.startswith('####'): line = line.replace('####', '').strip() line = '

' + line + '

' + ctr = -1 elif line.startswith('###'): line = line.replace('###', '').strip() line = '

' + line + '

' + ctr = -1 elif line.startswith('##'): line = line.replace('##', '').strip() line = '

' + line + '

' + ctr = -1 elif line.startswith('#'): line = line.replace('#', '').strip() line = '

' + line + '

' + ctr = -1 htmlStr += line ctr += 1 return htmlStr diff --git a/webapp_welcome.py b/webapp_welcome.py index d73c69cc8..ec7a58370 100644 --- a/webapp_welcome.py +++ b/webapp_welcome.py @@ -14,17 +14,30 @@ from webapp_utils import htmlFooter from webapp_utils import markdownToHtml -def welcomeScreenShown(baseDir: str, nickname: str, domain: str): +def isWelcomeScreenComplete(baseDir: str, nickname: str, domain: str) -> bool: + """Returns true if the welcome screen is complete for the given account + """ + accountPath = baseDir + '/accounts/' + nickname + '@' + domain + if not os.path.isdir(accountPath): + return + completeFilename = accountPath + '/.welcome_complete' + return os.path.isfile(completeFilename) + + +def welcomeScreenIsComplete(baseDir: str, nickname: str, domain: str) -> None: """Indicates that the welcome screen has been shown for a given account """ - shownFilename = baseDir + '/accounts/.welcome_shown' - shownFile = open(shownFilename, 'w+') - if shownFile: - shownFile.write('\n') - shownFile.close() + accountPath = baseDir + '/accounts/' + nickname + '@' + domain + if not os.path.isdir(accountPath): + return + completeFilename = accountPath + '/.welcome_complete' + completeFile = open(completeFilename, 'w+') + if completeFile: + completeFile.write('\n') + completeFile.close() -def htmlWelcomeScreen(baseDir: str, nickname: str, domain: str, +def htmlWelcomeScreen(baseDir: str, language: str, translate: {}) -> str: """Returns the welcome screen """ From 064269e4a7f1c64c2170e70c14ea3f6377c0734f Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 24 Feb 2021 21:22:32 +0000 Subject: [PATCH 0035/1416] Default to English --- webapp_welcome.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/webapp_welcome.py b/webapp_welcome.py index ec7a58370..087240f3a 100644 --- a/webapp_welcome.py +++ b/webapp_welcome.py @@ -51,8 +51,9 @@ def htmlWelcomeScreen(baseDir: str, welcomeFilename = baseDir + '/accounts/welcome.md' if not os.path.isfile(welcomeFilename): defaultFilename = baseDir + '/defaultwelcome/' + language + '.md' - if os.path.isfile(defaultFilename): - copyfile(defaultFilename, welcomeFilename) + if not os.path.isfile(defaultFilename): + defaultFilename = baseDir + '/defaultwelcome/en.md' + copyfile(defaultFilename, welcomeFilename) if os.path.isfile(welcomeFilename): with open(baseDir + '/accounts/welcome.md', 'r') as welcomeFile: welcomeText = markdownToHtml(welcomeFile.read()) From 13b4307b305248c0a9b38f653ee87190de1fcb6e Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 24 Feb 2021 21:27:20 +0000 Subject: [PATCH 0036/1416] Welcome text --- defaultwelcome/en.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/defaultwelcome/en.md b/defaultwelcome/en.md index 9e8186fe8..e05bb2c04 100644 --- a/defaultwelcome/en.md +++ b/defaultwelcome/en.md @@ -1,5 +1,7 @@ # Welcome -Epicyon is an ActivityPub server designed for self-hosting of a few people on low power systems such as single board computers or old laptops. It's intended to be as easy as possible to install and maintain. +Epicyon is an ActivityPub server designed for easy self-hosting of a few people on low power systems, such as single board computers or old laptops. +Run your own social network presence the way you want to, and say goodbye to Big Tech. +Now, lets get going... From bd408e73c0c999fa8eebac30b2c3dd571c6548cf Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 24 Feb 2021 21:31:53 +0000 Subject: [PATCH 0037/1416] Change link --- webapp_welcome.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp_welcome.py b/webapp_welcome.py index 087240f3a..ff75ede00 100644 --- a/webapp_welcome.py +++ b/webapp_welcome.py @@ -68,7 +68,7 @@ def htmlWelcomeScreen(baseDir: str, welcomeForm = htmlHeaderWithExternalStyle(cssFilename, instanceTitle) welcomeForm += '
' + welcomeText + '
\n' welcomeForm += ' \n' welcomeForm += '\n' From 830bab130e659e0c631dff322a53e7f541113216 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 25 Feb 2021 10:37:20 +0000 Subject: [PATCH 0038/1416] Allow for a series of welcome screens --- defaultwelcome/profile_en.md | 3 + defaultwelcome/{en.md => welcome_en.md} | 0 webapp_welcome.py | 23 ++++++-- webapp_welcome_profile.py | 73 +++++++++++++++++++++++++ 4 files changed, 93 insertions(+), 6 deletions(-) create mode 100644 defaultwelcome/profile_en.md rename defaultwelcome/{en.md => welcome_en.md} (100%) create mode 100644 webapp_welcome_profile.py diff --git a/defaultwelcome/profile_en.md b/defaultwelcome/profile_en.md new file mode 100644 index 000000000..4f00d8ae1 --- /dev/null +++ b/defaultwelcome/profile_en.md @@ -0,0 +1,3 @@ +# Account Setup + +Add your avatar image, name and description. Use a small avatar image (eg. 128x128 pixels) so that it's quick to download. diff --git a/defaultwelcome/en.md b/defaultwelcome/welcome_en.md similarity index 100% rename from defaultwelcome/en.md rename to defaultwelcome/welcome_en.md diff --git a/webapp_welcome.py b/webapp_welcome.py index ff75ede00..b3acadd31 100644 --- a/webapp_welcome.py +++ b/webapp_welcome.py @@ -38,7 +38,9 @@ def welcomeScreenIsComplete(baseDir: str, nickname: str, domain: str) -> None: def htmlWelcomeScreen(baseDir: str, - language: str, translate: {}) -> str: + language: str, translate: {}, + currScreen='welcome', + nextScreen=None, prevScreen=None) -> str: """Returns the welcome screen """ # set a custom background for the welcome screen @@ -47,15 +49,20 @@ def htmlWelcomeScreen(baseDir: str, copyfile(baseDir + '/accounts/welcome-background-custom.jpg', baseDir + '/accounts/welcome-background.jpg') + if not nextScreen: + nextScreen = 'welcome_profile' + welcomeText = 'Welcome to Epicyon' - welcomeFilename = baseDir + '/accounts/welcome.md' + welcomeFilename = baseDir + '/accounts/' + currScreen + '.md' if not os.path.isfile(welcomeFilename): - defaultFilename = baseDir + '/defaultwelcome/' + language + '.md' + defaultFilename = \ + baseDir + '/defaultwelcome/' + currScreen + '_' + language + '.md' if not os.path.isfile(defaultFilename): - defaultFilename = baseDir + '/defaultwelcome/en.md' + defaultFilename = \ + baseDir + '/defaultwelcome/' + currScreen + '_en.md' copyfile(defaultFilename, welcomeFilename) if os.path.isfile(welcomeFilename): - with open(baseDir + '/accounts/welcome.md', 'r') as welcomeFile: + with open(welcomeFilename, 'r') as welcomeFile: welcomeText = markdownToHtml(welcomeFile.read()) welcomeForm = '' @@ -68,7 +75,11 @@ def htmlWelcomeScreen(baseDir: str, welcomeForm = htmlHeaderWithExternalStyle(cssFilename, instanceTitle) welcomeForm += '
' + welcomeText + '
\n' welcomeForm += ' \n' welcomeForm += '\n' diff --git a/webapp_welcome_profile.py b/webapp_welcome_profile.py new file mode 100644 index 000000000..901fe5555 --- /dev/null +++ b/webapp_welcome_profile.py @@ -0,0 +1,73 @@ +__filename__ = "webapp_welcome_profile.py" +__author__ = "Bob Mottram" +__license__ = "AGPL3+" +__version__ = "1.2.0" +__maintainer__ = "Bob Mottram" +__email__ = "bob@freedombone.net" +__status__ = "Production" + +import os +from shutil import copyfile +from utils import getConfigParam +from utils import getImageExtensions +from webapp_utils import htmlHeaderWithExternalStyle +from webapp_utils import htmlFooter +from webapp_utils import markdownToHtml + + +def htmlWelcomeProfile(baseDir: str, nickname: str, domain: str, + httpPrefix: str, domainFull: str, + language: str, translate: {}, + prevScreen='welcome') -> str: + """Returns the welcome profile screen to set avatar and bio + """ + # set a custom background for the welcome screen + if os.path.isfile(baseDir + '/accounts/welcome-background-custom.jpg'): + if not os.path.isfile(baseDir + '/accounts/welcome-background.jpg'): + copyfile(baseDir + '/accounts/welcome-background-custom.jpg', + baseDir + '/accounts/welcome-background.jpg') + + profileText = 'Welcome to Epicyon' + profileFilename = baseDir + '/accounts/welcome_profile.md' + if not os.path.isfile(profileFilename): + defaultFilename = \ + baseDir + '/defaultwelcome/profile_' + language + '.md' + if not os.path.isfile(defaultFilename): + defaultFilename = baseDir + '/defaultwelcome/profile_en.md' + copyfile(defaultFilename, profileFilename) + if os.path.isfile(profileFilename): + with open(profileFilename, 'r') as profileFile: + profileText = markdownToHtml(profileFile.read()) + + profileForm = '' + cssFilename = baseDir + '/epicyon-welcome.css' + if os.path.isfile(baseDir + '/welcome.css'): + cssFilename = baseDir + '/welcome.css' + + instanceTitle = \ + getConfigParam(baseDir, 'instanceTitle') + profileForm = htmlHeaderWithExternalStyle(cssFilename, instanceTitle) + + # get the url of the avatar + for ext in getImageExtensions(): + avatarFilename = \ + baseDir + '/accounts/' + nickname + '@' + domain + '/avatar.' + ext + if os.path.isfile(avatarFilename): + break + avatarUrl = \ + httpPrefix + '://' + domainFull + \ + '/users/' + nickname + '/avatar.' + ext + + profileForm += '
\n' + profileForm += '\n' + profileForm += '
\n' + profileForm += '
' + profileText + '
\n' + profileForm += ' \n' + profileForm += '\n' + profileForm += htmlFooter() + return profileForm From 75249cf554f7992ce56b986109ad90302ac4c3c3 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 25 Feb 2021 10:54:38 +0000 Subject: [PATCH 0039/1416] Markdown emphasis --- tests.py | 16 ++++++++++++++-- webapp_utils.py | 25 +++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/tests.py b/tests.py index fcacfd4be..ddab940d4 100644 --- a/tests.py +++ b/tests.py @@ -3288,17 +3288,29 @@ def testMarkdownToHtml(): markdown = 'This is just plain text' assert markdownToHtml(markdown) == markdown + markdown = 'This is **bold**' + assert markdownToHtml(markdown) == 'This is bold' + + markdown = 'This is *italic*' + assert markdownToHtml(markdown) == 'This is italic' + + markdown = 'This is _underlined_' + assert markdownToHtml(markdown) == 'This is
    underlined
' + + markdown = 'This is **just** plain text' + assert markdownToHtml(markdown) == 'This is just plain text' + markdown = '# Title1\n### Title3\n## Title2\n' assert markdownToHtml(markdown) == \ '

Title1

Title3

Title2

' markdown = \ - 'This is [a link](https://something.somewhere) to something\n' + \ + 'This is [a link](https://something.somewhere) to something.\n' + \ 'And [something else](https://cat.pic).' assert markdownToHtml(markdown) == \ 'This is ' + \ - 'a link to something
' + \ + 'a link to something.
' + \ 'And ' + \ 'something else.' diff --git a/webapp_utils.py b/webapp_utils.py index 9d144d3b3..4d7c25f8b 100644 --- a/webapp_utils.py +++ b/webapp_utils.py @@ -21,9 +21,34 @@ from content import addHtmlTags from content import replaceEmojiFromTags +def _markdownEmphasisHtml(markdown: str) -> str: + """Add italics and bold html markup to the given markdown + """ + punctuation = ('.', ';', ':') + noPunctuation = markdown + for ch in punctuation: + noPunctuation = noPunctuation.replace(ch, ' ') + wordList = noPunctuation.split(' ') + replacements = {} + for word in wordList: + if word.startswith('**') and word.endswith('**'): + replacements[word] = \ + '' + word.replace('*', '') + '' + elif word.startswith('*') and word.endswith('*'): + replacements[word] = \ + '' + word.replace('*', '') + '' + elif word.startswith('_') and word.endswith('_'): + replacements[word] = \ + '
    ' + word.replace('_', '') + '
' + for md, html in replacements.items(): + markdown = markdown.replace(md, html) + return markdown + + def markdownToHtml(markdown: str) -> str: """Converts markdown formatted text to html """ + markdown = _markdownEmphasisHtml(markdown) # replace markdown style links with html links replaceLinks = {} text = markdown From 57875659616117619efe9cf1e7be88f140a37942 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 25 Feb 2021 12:17:41 +0000 Subject: [PATCH 0040/1416] Welcome profile screen --- daemon.py | 27 ++++++++++++++++++++++ defaultwelcome/profile_en.md | 4 ++-- webapp_welcome.py | 27 +++++++++++----------- webapp_welcome_profile.py | 45 ++++++++++++++++++++++++++++++------ 4 files changed, 81 insertions(+), 22 deletions(-) diff --git a/daemon.py b/daemon.py index 04abd8e45..dd669485c 100644 --- a/daemon.py +++ b/daemon.py @@ -183,6 +183,7 @@ from webapp_hashtagswarm import getHashtagCategoriesFeed from webapp_hashtagswarm import htmlSearchHashtagCategory from webapp_welcome import htmlWelcomeScreen from webapp_welcome import isWelcomeScreenComplete +from webapp_welcome_profile import htmlWelcomeProfile from shares import getSharesFeedForPerson from shares import addShare from shares import removeShare @@ -10695,6 +10696,32 @@ class PubServer(BaseHTTPRequestHandler): else: self.path = self.path.replace('/welcome', '') + if htmlGET and authorized and \ + '/users/' in self.path and self.path.endswith('/welcome_profile'): + nickname = self.path.split('/users/')[1] + if '/' in nickname: + nickname = nickname.split('/')[0] + if not isWelcomeScreenComplete(self.server.baseDir, + nickname, + self.server.domain): + msg = \ + htmlWelcomeProfile(self.server.baseDir, nickname, + self.server.domain, + self.server.httpPrefix, + self.server.domainFull, + self.server.systemLanguage, + self.server.translate) + msg = msg.encode('utf-8') + msglen = len(msg) + self._login_headers('text/html', msglen, callingDomain) + self._write(msg) + self._benchmarkGETtimings(GETstartTime, GETtimings, + 'show welcome screen', + 'show welcome profile screen') + return + else: + self.path = self.path.replace('/welcome_profile', '') + # if not authorized then show the login screen if htmlGET and self.path != '/login' and \ not self._pathIsImage(self.path) and \ diff --git a/defaultwelcome/profile_en.md b/defaultwelcome/profile_en.md index 4f00d8ae1..4487c20da 100644 --- a/defaultwelcome/profile_en.md +++ b/defaultwelcome/profile_en.md @@ -1,3 +1,3 @@ -# Account Setup +## Account Setup -Add your avatar image, name and description. Use a small avatar image (eg. 128x128 pixels) so that it's quick to download. +Select your avatar image and add your name and description. Use a small avatar image (eg. 128x128 pixels) so that it's quick to download. diff --git a/webapp_welcome.py b/webapp_welcome.py index b3acadd31..a7ed00635 100644 --- a/webapp_welcome.py +++ b/webapp_welcome.py @@ -24,19 +24,20 @@ def isWelcomeScreenComplete(baseDir: str, nickname: str, domain: str) -> bool: return os.path.isfile(completeFilename) -def welcomeScreenIsComplete(baseDir: str, nickname: str, domain: str) -> None: - """Indicates that the welcome screen has been shown for a given account - """ - accountPath = baseDir + '/accounts/' + nickname + '@' + domain - if not os.path.isdir(accountPath): - return - completeFilename = accountPath + '/.welcome_complete' - completeFile = open(completeFilename, 'w+') - if completeFile: - completeFile.write('\n') - completeFile.close() - - +# def welcomeScreenIsComplete(baseDir: str, +# nickname: str, domain: str) -> None: +# """Indicates that the welcome screen has been shown for a given account +# """ +# accountPath = baseDir + '/accounts/' + nickname + '@' + domain +# if not os.path.isdir(accountPath): +# return +# completeFilename = accountPath + '/.welcome_complete' +# completeFile = open(completeFilename, 'w+') +# if completeFile: +# completeFile.write('\n') +# completeFile.close() +# +# def htmlWelcomeScreen(baseDir: str, language: str, translate: {}, currScreen='welcome', diff --git a/webapp_welcome_profile.py b/webapp_welcome_profile.py index 901fe5555..e0ca34da4 100644 --- a/webapp_welcome_profile.py +++ b/webapp_welcome_profile.py @@ -8,8 +8,10 @@ __status__ = "Production" import os from shutil import copyfile +from utils import loadJson from utils import getConfigParam from utils import getImageExtensions +from utils import getImageFormats from webapp_utils import htmlHeaderWithExternalStyle from webapp_utils import htmlFooter from webapp_utils import markdownToHtml @@ -17,8 +19,7 @@ from webapp_utils import markdownToHtml def htmlWelcomeProfile(baseDir: str, nickname: str, domain: str, httpPrefix: str, domainFull: str, - language: str, translate: {}, - prevScreen='welcome') -> str: + language: str, translate: {}) -> str: """Returns the welcome profile screen to set avatar and bio """ # set a custom background for the welcome screen @@ -58,16 +59,46 @@ def htmlWelcomeProfile(baseDir: str, nickname: str, domain: str, httpPrefix + '://' + domainFull + \ '/users/' + nickname + '/avatar.' + ext + imageFormats = getImageFormats() + profileForm += \ + '
\n' profileForm += '
\n' - profileForm += '\n' + profileForm += '
\n' + profileForm += ' \n' + profileForm += '
\n' profileForm += '
' + profileText + '
\n' profileForm += ' \n' profileForm += '\n' + + actorFilename = baseDir + '/accounts/' + nickname + '@' + domain + '.json' + actorJson = loadJson(actorFilename) + displayNickname = actorJson['name'] + profileForm += ' \n' + profileForm += '
\n' + + profileForm += '
\n' + bioStr = \ + actorJson['summary'].replace('

', '').replace('

', '') + profileForm += ' \n' + profileForm += ' \n' + + profileForm += '
\n' + profileForm += '
\n' profileForm += htmlFooter() return profileForm From c62283c60ad402456e5cda824b85e5ed31430738 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 25 Feb 2021 12:24:26 +0000 Subject: [PATCH 0041/1416] Rearrange welcome profile --- webapp_welcome_profile.py | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/webapp_welcome_profile.py b/webapp_welcome_profile.py index e0ca34da4..2fe237f6d 100644 --- a/webapp_welcome_profile.py +++ b/webapp_welcome_profile.py @@ -71,6 +71,25 @@ def htmlWelcomeProfile(baseDir: str, nickname: str, domain: str, profileForm += 'accept="' + imageFormats + '">\n' profileForm += '\n' + + actorFilename = baseDir + '/accounts/' + nickname + '@' + domain + '.json' + actorJson = loadJson(actorFilename) + displayNickname = actorJson['name'] + profileForm += '
\n' + profileForm += '
\n' + + profileForm += '
\n' + bioStr = \ + actorJson['summary'].replace('

', '').replace('

', '') + profileForm += '
\n' + profileForm += ' \n' + + profileForm += '
\n' + profileForm += '
' + profileText + '
\n' profileForm += ' \n' profileForm += '\n' - actorFilename = baseDir + '/accounts/' + nickname + '@' + domain + '.json' - actorJson = loadJson(actorFilename) - displayNickname = actorJson['name'] - profileForm += ' \n' - profileForm += '
\n' - - profileForm += '
\n' - bioStr = \ - actorJson['summary'].replace('

', '').replace('

', '') - profileForm += ' \n' - profileForm += ' \n' - - profileForm += '
\n' profileForm += '\n' profileForm += htmlFooter() return profileForm From cf8d8d11399a7a0e8926263894fac13dc6eb5f8f Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 25 Feb 2021 12:29:41 +0000 Subject: [PATCH 0042/1416] Not centered --- webapp_welcome_profile.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/webapp_welcome_profile.py b/webapp_welcome_profile.py index 2fe237f6d..505187cd2 100644 --- a/webapp_welcome_profile.py +++ b/webapp_welcome_profile.py @@ -80,7 +80,6 @@ def htmlWelcomeProfile(baseDir: str, nickname: str, domain: str, profileForm += '
\n' - profileForm += '
\n' bioStr = \ actorJson['summary'].replace('

', '').replace('

', '') profileForm += '
\n' - profileForm += '
' + profileText + '
\n' profileForm += ' \n' profileForm += '\n' profileForm += htmlFooter() From 78b574e00e4b6a213e5a756deb5d60dbc5eec58f Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 25 Feb 2021 12:36:06 +0000 Subject: [PATCH 0044/1416] Separate divisions --- webapp_welcome_profile.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/webapp_welcome_profile.py b/webapp_welcome_profile.py index 8dfffc9ea..41d149a66 100644 --- a/webapp_welcome_profile.py +++ b/webapp_welcome_profile.py @@ -65,17 +65,19 @@ def htmlWelcomeProfile(baseDir: str, nickname: str, domain: str, '
\n' - profileForm += '
\n' - profileForm += ' \n' + profileForm += '
\n' + profileForm += '
\n' - profileForm += ' \n' - - profileForm += '
\n' + profileForm += '
\n' + profileForm += '\n' actorFilename = baseDir + '/accounts/' + nickname + '@' + domain + '.json' actorJson = loadJson(actorFilename) displayNickname = actorJson['name'] + profileForm += '
\n' profileForm += '
\n' profileForm += ' ' + bioStr + '\n' + profileForm += '
\n' - profileForm += ' \n' profileForm += '
\n' profileForm += htmlFooter() From d96d73a1481fa7bb8084e5004064b432d8c197c2 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 25 Feb 2021 12:42:05 +0000 Subject: [PATCH 0045/1416] Welcome screen css --- defaultwelcome/profile_en.md | 1 - theme.py | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/defaultwelcome/profile_en.md b/defaultwelcome/profile_en.md index 4487c20da..10d1e09e3 100644 --- a/defaultwelcome/profile_en.md +++ b/defaultwelcome/profile_en.md @@ -1,3 +1,2 @@ ## Account Setup - Select your avatar image and add your name and description. Use a small avatar image (eg. 128x128 pixels) so that it's quick to download. diff --git a/theme.py b/theme.py index dbf78cf27..64caf6d2f 100644 --- a/theme.py +++ b/theme.py @@ -19,7 +19,8 @@ def _getThemeFiles() -> []: """ return ('epicyon.css', 'login.css', 'follow.css', 'suspended.css', 'calendar.css', 'blog.css', - 'options.css', 'search.css', 'links.css') + 'options.css', 'search.css', 'links.css', + 'welcome.css') def getThemesList(baseDir: str) -> []: From 843e4b2d077298173445f714d00c5910b8414a55 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 25 Feb 2021 12:47:03 +0000 Subject: [PATCH 0046/1416] Welcome screen avatar width --- epicyon-welcome.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/epicyon-welcome.css b/epicyon-welcome.css index 70f984bc4..e70744b25 100644 --- a/epicyon-welcome.css +++ b/epicyon-welcome.css @@ -22,6 +22,7 @@ --focus-color: white; --line-spacing: 130%; --welcome-logo-width: 20%; + --welcome-avatar-width: 40%; --main-link-color-hover: #bbb; --rendering: normal; } @@ -143,6 +144,10 @@ img.avatar { padding: 16px; } +.container img.welcomeavatar { + width: var(--welcome-avatar-width); +} + .container.next { float: right; } From 6df30d02c06192f3a6bfec9ca6097949ec1550a4 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 25 Feb 2021 13:07:55 +0000 Subject: [PATCH 0047/1416] Text box style --- epicyon-welcome.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/epicyon-welcome.css b/epicyon-welcome.css index e70744b25..0e3594ca7 100644 --- a/epicyon-welcome.css +++ b/epicyon-welcome.css @@ -174,7 +174,7 @@ span.psw { font-size: var(--welcome-font-size); font-family: Arial, Helvetica, sans-serif; } - input[type=text], input[type=password] { + input[type=text], input[type=password], textarea { width: 100%; padding: 12px 20px; margin: 8px 0; @@ -214,7 +214,7 @@ span.psw { font-size: var(--welcome-font-size-mobile); font-family: Arial, Helvetica, sans-serif; } - input[type=text], input[type=password] { + input[type=text], input[type=password], textarea { width: 100%; padding: 12px 20px; margin: 8px 0; From 938ad6376dd2a6d6164e8a024c20e08fa32ae9fc Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 25 Feb 2021 13:08:18 +0000 Subject: [PATCH 0048/1416] Less height --- webapp_welcome_profile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp_welcome_profile.py b/webapp_welcome_profile.py index 41d149a66..8c4a093b5 100644 --- a/webapp_welcome_profile.py +++ b/webapp_welcome_profile.py @@ -88,7 +88,7 @@ def htmlWelcomeProfile(baseDir: str, nickname: str, domain: str, profileForm += '
\n' profileForm += ' \n' + 'style="height:100px">' + bioStr + '\n' profileForm += '\n' profileForm += '\n' profileForm += '\n' - # end of column-center - tlStr += ' \n' + # end of column-center + tlStr += ' \n' # right column rightColumnStr = getRightColumnContent(baseDir, nickname, domainFull, From ee9a8cad48b7abaa4b8d5c3b5c5282e16b687e04 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 26 Feb 2021 12:38:13 +0000 Subject: [PATCH 0089/1416] Section endings --- webapp_timeline.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/webapp_timeline.py b/webapp_timeline.py index 2b44add0c..ab6043912 100644 --- a/webapp_timeline.py +++ b/webapp_timeline.py @@ -738,10 +738,10 @@ def htmlTimeline(cssCache: {}, defaultTimeline: str, elif itemCtr == 0: tlStr += _getHelpForTimeline(baseDir, boxName) - if itemCtr > 0: - # end of timeline-posts - tlStr += ' \n' + # end of timeline-posts + tlStr += ' \n' + if itemCtr > 0: # end of column-center tlStr += ' \n' From e541a03a591ae82eed0851b9bab1fac9cbd1751e Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 26 Feb 2021 12:41:09 +0000 Subject: [PATCH 0090/1416] Newline --- webapp_timeline.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/webapp_timeline.py b/webapp_timeline.py index ab6043912..e1f1fd322 100644 --- a/webapp_timeline.py +++ b/webapp_timeline.py @@ -74,7 +74,7 @@ def _getHelpForTimeline(baseDir: str, boxName: str) -> str: helpText = helpFile.read() helpText = helpText.replace('INSTANCE', instanceTitle) return '
\n' + \ - markdownToHtml(removeHtml(helpText)) + \ + markdownToHtml(removeHtml(helpText)) + '\n' + \ '<\div>\n' return '' @@ -741,9 +741,8 @@ def htmlTimeline(cssCache: {}, defaultTimeline: str, # end of timeline-posts tlStr += '
\n' - if itemCtr > 0: - # end of column-center - tlStr += ' \n' + # end of column-center + tlStr += ' \n' # right column rightColumnStr = getRightColumnContent(baseDir, nickname, domainFull, From 993ae3141e39f54c9344234df53500e43183dc5e Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 26 Feb 2021 12:42:29 +0000 Subject: [PATCH 0091/1416] Slash --- webapp_timeline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp_timeline.py b/webapp_timeline.py index e1f1fd322..4022382c6 100644 --- a/webapp_timeline.py +++ b/webapp_timeline.py @@ -75,7 +75,7 @@ def _getHelpForTimeline(baseDir: str, boxName: str) -> str: helpText = helpText.replace('INSTANCE', instanceTitle) return '
\n' + \ markdownToHtml(removeHtml(helpText)) + '\n' + \ - '<\div>\n' + '
\n' return '' From a85e6cb2236bfac2b4dff030a586173f68e06fb2 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 26 Feb 2021 12:44:37 +0000 Subject: [PATCH 0092/1416] Don't use unicode emoji in help text --- defaultwelcome/help_inbox_en.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/defaultwelcome/help_inbox_en.md b/defaultwelcome/help_inbox_en.md index d7ca2e813..2ae21843f 100644 --- a/defaultwelcome/help_inbox_en.md +++ b/defaultwelcome/help_inbox_en.md @@ -1,20 +1,20 @@ ### Middle column Incoming posts will appear here, as a chronological timeline. If you send any posts they will also appear here. -### 🡱 The top banner 🡱 +### The top banner At the top of the screen you can select the **banner** to switch to your profile, and edit it or log out. -### 🡱 Timeline buttons and icons 🡱 +### Timeline buttons and icons The **buttons** below the top banner allow you to select different timelines. There are also **icons** on the right to **search**, view your **calendar** or create **new posts**. The **show/hide** icon allows more timeline buttons to be shown, along with moderator controls. -### 🡰 Left column 🡰 +### <- Left column Here you can add **useful links**. This only appears on desktop displays or devices with larger screens. It is similar to a *blogroll*. You can only add or edit links if you have an **administrator** or **editor** role. If you are on mobile then user the **links icon** at the top to read news. -### 🡲 Right column 🡲 +### Right column -> RSS feeds can be added in the right column, known as the *newswire*. This only appears on desktop displays or devices with larger screens. You can only add or edit feeds if you have an **administrator** or **editor** role, and incoming feed items can also be moderated. If you are on mobile then user the **newswire icon** at the top to read news. From 2335ef30d4d701b3abc6df8c10d3be9bfd741bc4 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 26 Feb 2021 12:46:06 +0000 Subject: [PATCH 0093/1416] No html-like characters --- defaultwelcome/help_inbox_en.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/defaultwelcome/help_inbox_en.md b/defaultwelcome/help_inbox_en.md index 2ae21843f..64eedba69 100644 --- a/defaultwelcome/help_inbox_en.md +++ b/defaultwelcome/help_inbox_en.md @@ -9,12 +9,12 @@ The **buttons** below the top banner allow you to select different timelines. Th The **show/hide** icon allows more timeline buttons to be shown, along with moderator controls. -### <- Left column +### Left column Here you can add **useful links**. This only appears on desktop displays or devices with larger screens. It is similar to a *blogroll*. You can only add or edit links if you have an **administrator** or **editor** role. If you are on mobile then user the **links icon** at the top to read news. -### Right column -> +### Right column RSS feeds can be added in the right column, known as the *newswire*. This only appears on desktop displays or devices with larger screens. You can only add or edit feeds if you have an **administrator** or **editor** role, and incoming feed items can also be moderated. If you are on mobile then user the **newswire icon** at the top to read news. From 2bb116ceed9716f1e7a1983935906fe2d4e9e72a Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 26 Feb 2021 12:48:20 +0000 Subject: [PATCH 0094/1416] No initial title --- defaultwelcome/help_inbox_en.md | 1 - 1 file changed, 1 deletion(-) diff --git a/defaultwelcome/help_inbox_en.md b/defaultwelcome/help_inbox_en.md index 64eedba69..23555331f 100644 --- a/defaultwelcome/help_inbox_en.md +++ b/defaultwelcome/help_inbox_en.md @@ -1,4 +1,3 @@ -### Middle column Incoming posts will appear here, as a chronological timeline. If you send any posts they will also appear here. ### The top banner From 51ff0fb438a77d45c87e6a7ae632676930fc41fa Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 26 Feb 2021 12:58:29 +0000 Subject: [PATCH 0095/1416] Don't remove html, but check for dangerous markup --- webapp_timeline.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/webapp_timeline.py b/webapp_timeline.py index 4022382c6..a1f4e2fb0 100644 --- a/webapp_timeline.py +++ b/webapp_timeline.py @@ -9,7 +9,7 @@ __status__ = "Production" import os import time from shutil import copyfile -from utils import removeHtml +from utils import dangerousMarkup from utils import getConfigParam from utils import getFullDomain from utils import isEditor @@ -72,9 +72,11 @@ def _getHelpForTimeline(baseDir: str, boxName: str) -> str: instanceTitle = 'Epicyon' with open(helpFilename, 'r') as helpFile: helpText = helpFile.read() + if dangerousMarkup(helpText, False): + return '' helpText = helpText.replace('INSTANCE', instanceTitle) return '
\n' + \ - markdownToHtml(removeHtml(helpText)) + '\n' + \ + markdownToHtml(helpText) + '\n' + \ '
\n' return '' From 4b3c5792659a19e3da49c32e1f69967d2634afd2 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 26 Feb 2021 13:11:11 +0000 Subject: [PATCH 0096/1416] Use --- defaultwelcome/help_inbox_en.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/defaultwelcome/help_inbox_en.md b/defaultwelcome/help_inbox_en.md index 23555331f..82b95bb05 100644 --- a/defaultwelcome/help_inbox_en.md +++ b/defaultwelcome/help_inbox_en.md @@ -11,9 +11,9 @@ The **show/hide** icon allows more timeline buttons to be shown, along with mode ### Left column Here you can add **useful links**. This only appears on desktop displays or devices with larger screens. It is similar to a *blogroll*. You can only add or edit links if you have an **administrator** or **editor** role. -If you are on mobile then user the **links icon** at the top to read news. +If you are on mobile then use the **links icon** at the top to read news. ### Right column RSS feeds can be added in the right column, known as the *newswire*. This only appears on desktop displays or devices with larger screens. You can only add or edit feeds if you have an **administrator** or **editor** role, and incoming feed items can also be moderated. -If you are on mobile then user the **newswire icon** at the top to read news. +If you are on mobile then use the **newswire icon** at the top to read news. From 94f0e48072f6d1b780b3de0ce9ea7c4b484bee62 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 26 Feb 2021 13:31:31 +0000 Subject: [PATCH 0097/1416] Show help on shares timeline --- webapp_timeline.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/webapp_timeline.py b/webapp_timeline.py index a1f4e2fb0..cf0e17719 100644 --- a/webapp_timeline.py +++ b/webapp_timeline.py @@ -829,6 +829,7 @@ def _htmlSharesTimeline(translate: {}, pageNumber: int, itemsPerPage: int, ' \n' separatorStr = htmlPostSeparator(baseDir, None) + ctr = 0 for published, item in sharesJson.items(): showContactButton = False if item['actor'] != actor: @@ -840,6 +841,10 @@ def _htmlSharesTimeline(translate: {}, pageNumber: int, itemsPerPage: int, htmlIndividualShare(actor, item, translate, showContactButton, showRemoveButton) timelineStr += separatorStr + ctr += 1 + + if ctr == 0: + timelineStr += _getHelpForTimeline(baseDir, 'tlshares') if not lastPage: timelineStr += \ From 19908a73c45dce80cebac07a10becd9c1bb52753 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 26 Feb 2021 13:38:55 +0000 Subject: [PATCH 0098/1416] Mention dm policy --- defaultwelcome/help_dm_en.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/defaultwelcome/help_dm_en.md b/defaultwelcome/help_dm_en.md index 1846dab1e..2f58489bf 100644 --- a/defaultwelcome/help_dm_en.md +++ b/defaultwelcome/help_dm_en.md @@ -1 +1,3 @@ Direct messages will appear here, as a chronological timeline. + +To avoid spam and improve security, by default you will only be able to receive direct messages *from people that you're following*. You can turn this off within your profile settings if you need to, by selecting the top **banner** and then the **edit** icon. From 786a3f79e35bfb53ac051cf1f9fc4cce48f7b643 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 26 Feb 2021 14:01:42 +0000 Subject: [PATCH 0099/1416] Ensure that default settings are preserved during the welcome screen sequence --- daemon.py | 70 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 43 insertions(+), 27 deletions(-) diff --git a/daemon.py b/daemon.py index 3008469f4..81820505b 100644 --- a/daemon.py +++ b/daemon.py @@ -4717,15 +4717,20 @@ class PubServer(BaseHTTPRequestHandler): nickname, domain) # approve followers - approveFollowers = False - if fields.get('approveFollowers'): - if fields['approveFollowers'] == 'on': - approveFollowers = True - if approveFollowers != \ - actorJson['manuallyApprovesFollowers']: - actorJson['manuallyApprovesFollowers'] = \ - approveFollowers + if checkNameAndBio: + # Default setting created via the welcome screen + actorJson['manuallyApprovesFollowers'] = True actorChanged = True + else: + approveFollowers = False + if fields.get('approveFollowers'): + if fields['approveFollowers'] == 'on': + approveFollowers = True + if approveFollowers != \ + actorJson['manuallyApprovesFollowers']: + actorJson['manuallyApprovesFollowers'] = \ + approveFollowers + actorChanged = True # remove a custom font if fields.get('removeCustomFont'): @@ -4773,15 +4778,21 @@ class PubServer(BaseHTTPRequestHandler): baseDir + '/accounts/' + \ nickname + '@' + domain + \ '/.followDMs' - followDMsActive = False - if fields.get('followDMs'): - if fields['followDMs'] == 'on': - followDMsActive = True - with open(followDMsFilename, 'w+') as fFile: - fFile.write('\n') - if not followDMsActive: - if os.path.isfile(followDMsFilename): - os.remove(followDMsFilename) + if checkNameAndBio: + # initial default setting created via + # the welcome screen + with open(followDMsFilename, 'w+') as fFile: + fFile.write('\n') + else: + followDMsActive = False + if fields.get('followDMs'): + if fields['followDMs'] == 'on': + followDMsActive = True + with open(followDMsFilename, 'w+') as fFile: + fFile.write('\n') + if not followDMsActive: + if os.path.isfile(followDMsFilename): + os.remove(followDMsFilename) # remove Twitter retweets removeTwitterFilename = \ @@ -4822,16 +4833,21 @@ class PubServer(BaseHTTPRequestHandler): os.remove(hideLikeButtonFile) # notify about new Likes - notifyLikesActive = False - if fields.get('notifyLikes'): - if fields['notifyLikes'] == 'on' and \ - not hideLikeButtonActive: - notifyLikesActive = True - with open(notifyLikesFilename, 'w+') as rFile: - rFile.write('\n') - if not notifyLikesActive: - if os.path.isfile(notifyLikesFilename): - os.remove(notifyLikesFilename) + if checkNameAndBio: + # default setting from welcome screen + with open(notifyLikesFilename, 'w+') as rFile: + rFile.write('\n') + else: + notifyLikesActive = False + if fields.get('notifyLikes'): + if fields['notifyLikes'] == 'on' and \ + not hideLikeButtonActive: + notifyLikesActive = True + with open(notifyLikesFilename, 'w+') as rFile: + rFile.write('\n') + if not notifyLikesActive: + if os.path.isfile(notifyLikesFilename): + os.remove(notifyLikesFilename) # this account is a bot if fields.get('isBot'): From 43e3a70d1ec916cbe75be261a26e17d6c5298b01 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 26 Feb 2021 14:09:51 +0000 Subject: [PATCH 0100/1416] Preserve default after welcome screen --- daemon.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/daemon.py b/daemon.py index 81820505b..729b7eafd 100644 --- a/daemon.py +++ b/daemon.py @@ -4050,6 +4050,7 @@ class PubServer(BaseHTTPRequestHandler): postBytesStr = postBytes.decode('utf-8') redirectPath = '' checkNameAndBio = False + onFinalWelcomeScreen = False if 'name="previewAvatar"' in postBytesStr: redirectPath = '/welcome_profile' elif 'name="initialWelcomeScreen"' in postBytesStr: @@ -4061,6 +4062,7 @@ class PubServer(BaseHTTPRequestHandler): redirectPath = '/' + self.server.defaultTimeline welcomeScreenIsComplete(self.server.baseDir, nickname, self.server.domain) + onFinalWelcomeScreen = True # extract all of the text fields into a dict fields = \ @@ -4717,7 +4719,7 @@ class PubServer(BaseHTTPRequestHandler): nickname, domain) # approve followers - if checkNameAndBio: + if onFinalWelcomeScreen: # Default setting created via the welcome screen actorJson['manuallyApprovesFollowers'] = True actorChanged = True @@ -4778,11 +4780,12 @@ class PubServer(BaseHTTPRequestHandler): baseDir + '/accounts/' + \ nickname + '@' + domain + \ '/.followDMs' - if checkNameAndBio: + if onFinalWelcomeScreen: # initial default setting created via # the welcome screen with open(followDMsFilename, 'w+') as fFile: fFile.write('\n') + actorChanged = True else: followDMsActive = False if fields.get('followDMs'): @@ -4833,10 +4836,11 @@ class PubServer(BaseHTTPRequestHandler): os.remove(hideLikeButtonFile) # notify about new Likes - if checkNameAndBio: + if onFinalWelcomeScreen: # default setting from welcome screen with open(notifyLikesFilename, 'w+') as rFile: rFile.write('\n') + actorChanged = True else: notifyLikesActive = False if fields.get('notifyLikes'): From 7dbaaa267acf51a1fbae79bfd30973053c3b7c0a Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 26 Feb 2021 15:20:43 +0000 Subject: [PATCH 0101/1416] Support for markdown images --- tests.py | 6 ++++-- webapp_utils.py | 44 +++++++++++++++++++++++++++++++------------- 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/tests.py b/tests.py index ddab940d4..9fee74c7d 100644 --- a/tests.py +++ b/tests.py @@ -3306,14 +3306,16 @@ def testMarkdownToHtml(): markdown = \ 'This is [a link](https://something.somewhere) to something.\n' + \ - 'And [something else](https://cat.pic).' + 'And [something else](https://cat.pic).\n' + \ + 'Or ![pounce](/cat.jpg).' assert markdownToHtml(markdown) == \ 'This is ' + \ 'a link to something.
' + \ 'And ' + \ - 'something else.' + 'something else.
' + \ + 'Or pounce.' def runAllTests(): diff --git a/webapp_utils.py b/webapp_utils.py index 5c3983bc2..b8519bb90 100644 --- a/webapp_utils.py +++ b/webapp_utils.py @@ -66,31 +66,49 @@ def _markdownEmphasisHtml(markdown: str) -> str: return markdown -def markdownToHtml(markdown: str) -> str: - """Converts markdown formatted text to html +def _markdownReplaceLinks(markdown: str, images=False) -> str: + """Replaces markdown links with html """ - markdown = _markdownEmphasisHtml(markdown) - # replace markdown style links with html links replaceLinks = {} text = markdown - while '[' in text: + startChars = '[' + if images: + startChars = '![' + while startChars in text: if ')' not in text: break - text = text.split('[', 1)[1] - markdownLink = '[' + text.split(')')[0] + ')' + text = text.split(startChars, 1)[1] + markdownLink = startChars + text.split(')')[0] + ')' if ']' not in markdownLink or \ '(' not in markdownLink: text = text.split(')', 1)[1] continue - replaceLinks[markdownLink] = \ - '' + \ - markdownLink.split('[')[1].split(']')[0] + \ - '' + if not images: + replaceLinks[markdownLink] = \ + '' + \ + markdownLink.split(startChars)[1].split(']')[0] + \ + '' + else: + replaceLinks[markdownLink] = \ + '' + \
+                markdownLink.split(startChars)[1].split(']')[0] + \
+                '' text = text.split(')', 1)[1] for mdLink, htmlLink in replaceLinks.items(): markdown = markdown.replace(mdLink, htmlLink) + return markdown + + +def markdownToHtml(markdown: str) -> str: + """Converts markdown formatted text to html + """ + markdown = _markdownEmphasisHtml(markdown) + markdown = _markdownReplaceLinks(markdown, True) + markdown = _markdownReplaceLinks(markdown) # replace headers linesList = markdown.split('\n') From e751eecf1eaef98a28e59eedeafba56deea77221 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 26 Feb 2021 16:02:31 +0000 Subject: [PATCH 0102/1416] Less indentation --- daemon.py | 109 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 56 insertions(+), 53 deletions(-) diff --git a/daemon.py b/daemon.py index 729b7eafd..ad9626272 100644 --- a/daemon.py +++ b/daemon.py @@ -9776,59 +9776,62 @@ class PubServer(BaseHTTPRequestHandler): GETstartTime, GETtimings: {}) -> bool: """Shows an avatar or banner or profile background image """ - if '/users/' in path: - if self._pathIsImage(path): - avatarStr = path.split('/users/')[1] - if '/' in avatarStr and '.temp.' not in path: - avatarNickname = avatarStr.split('/')[0] - avatarFile = avatarStr.split('/')[1] - avatarFileExt = avatarFile.split('.')[-1] - # remove any numbers, eg. avatar123.png becomes avatar.png - if avatarFile.startswith('avatar'): - avatarFile = 'avatar.' + avatarFileExt - elif avatarFile.startswith('banner'): - avatarFile = 'banner.' + avatarFileExt - elif avatarFile.startswith('search_banner'): - avatarFile = 'search_banner.' + avatarFileExt - elif avatarFile.startswith('image'): - avatarFile = 'image.' + avatarFileExt - elif avatarFile.startswith('left_col_image'): - avatarFile = 'left_col_image.' + avatarFileExt - elif avatarFile.startswith('right_col_image'): - avatarFile = 'right_col_image.' + avatarFileExt - avatarFilename = \ - baseDir + '/accounts/' + \ - avatarNickname + '@' + domain + '/' + avatarFile - if os.path.isfile(avatarFilename): - if self._etag_exists(avatarFilename): - # The file has not changed - self._304() - return True - mediaImageType = 'png' - if avatarFile.endswith('.png'): - mediaImageType = 'png' - elif avatarFile.endswith('.jpg'): - mediaImageType = 'jpeg' - elif avatarFile.endswith('.gif'): - mediaImageType = 'gif' - elif avatarFile.endswith('.avif'): - mediaImageType = 'avif' - elif avatarFile.endswith('.svg'): - mediaImageType = 'svg+xml' - else: - mediaImageType = 'webp' - with open(avatarFilename, 'rb') as avFile: - mediaBinary = avFile.read() - self._set_headers_etag(avatarFilename, - 'image/' + mediaImageType, - mediaBinary, None, - self.server.domainFull) - self._write(mediaBinary) - self._benchmarkGETtimings(GETstartTime, GETtimings, - 'icon shown done', - 'avatar background shown') - return True - return False + if '/users/' not in path: + return False + if not self._pathIsImage(path): + return False + avatarStr = path.split('/users/')[1] + if not ('/' in avatarStr and '.temp.' not in path): + return False + avatarNickname = avatarStr.split('/')[0] + avatarFile = avatarStr.split('/')[1] + avatarFileExt = avatarFile.split('.')[-1] + # remove any numbers, eg. avatar123.png becomes avatar.png + if avatarFile.startswith('avatar'): + avatarFile = 'avatar.' + avatarFileExt + elif avatarFile.startswith('banner'): + avatarFile = 'banner.' + avatarFileExt + elif avatarFile.startswith('search_banner'): + avatarFile = 'search_banner.' + avatarFileExt + elif avatarFile.startswith('image'): + avatarFile = 'image.' + avatarFileExt + elif avatarFile.startswith('left_col_image'): + avatarFile = 'left_col_image.' + avatarFileExt + elif avatarFile.startswith('right_col_image'): + avatarFile = 'right_col_image.' + avatarFileExt + avatarFilename = \ + baseDir + '/accounts/' + \ + avatarNickname + '@' + domain + '/' + avatarFile + if not os.path.isfile(avatarFilename): + return False + if self._etag_exists(avatarFilename): + # The file has not changed + self._304() + return True + mediaImageType = 'png' + if avatarFile.endswith('.png'): + mediaImageType = 'png' + elif avatarFile.endswith('.jpg'): + mediaImageType = 'jpeg' + elif avatarFile.endswith('.gif'): + mediaImageType = 'gif' + elif avatarFile.endswith('.avif'): + mediaImageType = 'avif' + elif avatarFile.endswith('.svg'): + mediaImageType = 'svg+xml' + else: + mediaImageType = 'webp' + with open(avatarFilename, 'rb') as avFile: + mediaBinary = avFile.read() + self._set_headers_etag(avatarFilename, + 'image/' + mediaImageType, + mediaBinary, None, + self.server.domainFull) + self._write(mediaBinary) + self._benchmarkGETtimings(GETstartTime, GETtimings, + 'icon shown done', + 'avatar background shown') + return True def _confirmDeleteEvent(self, callingDomain: str, path: str, baseDir: str, httpPrefix: str, cookie: str, From f393e78b14e5260ac08942a57f3e3373255e881d Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 26 Feb 2021 16:06:25 +0000 Subject: [PATCH 0103/1416] Less indentation --- daemon.py | 72 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 38 insertions(+), 34 deletions(-) diff --git a/daemon.py b/daemon.py index ad9626272..8f961b01a 100644 --- a/daemon.py +++ b/daemon.py @@ -9734,41 +9734,45 @@ class PubServer(BaseHTTPRequestHandler): GETstartTime, GETtimings: {}) -> bool: """Show a shared item image """ - if self._pathIsImage(path): - mediaStr = path.split('/sharefiles/')[1] - mediaFilename = \ - baseDir + '/sharefiles/' + mediaStr - if os.path.isfile(mediaFilename): - if self._etag_exists(mediaFilename): - # The file has not changed - self._304() - return True + if not self._pathIsImage(path): + self._404() + return True - mediaFileType = 'png' - if mediaFilename.endswith('.png'): - mediaFileType = 'png' - elif mediaFilename.endswith('.jpg'): - mediaFileType = 'jpeg' - elif mediaFilename.endswith('.webp'): - mediaFileType = 'webp' - elif mediaFilename.endswith('.avif'): - mediaFileType = 'avif' - elif mediaFilename.endswith('.svg'): - mediaFileType = 'svg+xml' - else: - mediaFileType = 'gif' - with open(mediaFilename, 'rb') as avFile: - mediaBinary = avFile.read() - self._set_headers_etag(mediaFilename, - 'image/' + mediaFileType, - mediaBinary, None, - self.server.domainFull) - self._write(mediaBinary) - self._benchmarkGETtimings(GETstartTime, GETtimings, - 'show media done', - 'share files shown') - return True - self._404() + mediaStr = path.split('/sharefiles/')[1] + mediaFilename = \ + baseDir + '/sharefiles/' + mediaStr + if not os.path.isfile(mediaFilename): + self._404() + return True + + if self._etag_exists(mediaFilename): + # The file has not changed + self._304() + return True + + mediaFileType = 'png' + if mediaFilename.endswith('.png'): + mediaFileType = 'png' + elif mediaFilename.endswith('.jpg'): + mediaFileType = 'jpeg' + elif mediaFilename.endswith('.webp'): + mediaFileType = 'webp' + elif mediaFilename.endswith('.avif'): + mediaFileType = 'avif' + elif mediaFilename.endswith('.svg'): + mediaFileType = 'svg+xml' + else: + mediaFileType = 'gif' + with open(mediaFilename, 'rb') as avFile: + mediaBinary = avFile.read() + self._set_headers_etag(mediaFilename, + 'image/' + mediaFileType, + mediaBinary, None, + self.server.domainFull) + self._write(mediaBinary) + self._benchmarkGETtimings(GETstartTime, GETtimings, + 'show media done', + 'share files shown') return True def _showAvatarOrBanner(self, callingDomain: str, path: str, From f75ca8fcaf62ce6ea2f777ad5b95dd0128ab5c41 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 26 Feb 2021 16:07:18 +0000 Subject: [PATCH 0104/1416] Welcome screen background --- daemon.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daemon.py b/daemon.py index 8f961b01a..68b87e7eb 100644 --- a/daemon.py +++ b/daemon.py @@ -9689,7 +9689,7 @@ class PubServer(BaseHTTPRequestHandler): """ imageExtensions = getImageExtensions() for ext in imageExtensions: - for bg in ('follow', 'options', 'login'): + for bg in ('follow', 'options', 'login', 'welcome'): # follow screen background image if path.endswith('/' + bg + '-background.' + ext): bgFilename = \ From f2824118a8ed572ff7227276a0c80ec2e58a0f54 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 26 Feb 2021 16:59:38 +0000 Subject: [PATCH 0105/1416] Function to display help images --- daemon.py | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ utils.py | 2 +- 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/daemon.py b/daemon.py index 68b87e7eb..33a83a923 100644 --- a/daemon.py +++ b/daemon.py @@ -5771,6 +5771,48 @@ class PubServer(BaseHTTPRequestHandler): return self._404() + def _showHelpScreenImage(self, callingDomain: str, path: str, + baseDir: str, + GETstartTime, GETtimings: {}) -> None: + """Shows a help screen image + """ + if not path.endswith('.jpg') and \ + not path.endswith('.png') and \ + not path.endswith('.webp') and \ + not path.endswith('.avif') and \ + not path.endswith('.gif'): + return + mediaStr = path.split('/helpimages/')[1] + if '/' not in mediaStr: + if not self.server.themeName: + theme = 'default' + else: + theme = self.server.themeName + iconFilename = mediaStr + else: + theme = mediaStr.split('/')[0] + iconFilename = mediaStr.split('/')[1] + mediaFilename = \ + baseDir + '/theme/' + theme + '/helpimages/' + iconFilename + if self._etag_exists(mediaFilename): + # The file has not changed + self._304() + return + if os.path.isfile(mediaFilename): + with open(mediaFilename, 'rb') as avFile: + mediaBinary = avFile.read() + mimeType = mediaFileMimeType(mediaFilename) + self._set_headers_etag(mediaFilename, + mimeType, + mediaBinary, None, + self.server.domainFull) + self._write(mediaBinary) + self._benchmarkGETtimings(GETstartTime, GETtimings, + 'show files done', + 'help image shown') + return + self._404() + def _showCachedAvatar(self, callingDomain: str, path: str, baseDir: str, GETstartTime, GETtimings: {}) -> None: @@ -11069,6 +11111,14 @@ class PubServer(BaseHTTPRequestHandler): GETstartTime, GETtimings) return + # help screen images + # Note that this comes before the busy flag to avoid conflicts + if self.path.startswith('/helpimages/'): + self._showHelpScreenImage(callingDomain, self.path, + self.server.baseDir, + GETstartTime, GETtimings) + return + self._benchmarkGETtimings(GETstartTime, GETtimings, 'show files done', 'icon shown done') diff --git a/utils.py b/utils.py index 25499145e..b0594c7ae 100644 --- a/utils.py +++ b/utils.py @@ -1274,7 +1274,7 @@ def _isReservedName(nickname: str) -> bool: 'accounts', 'channels', 'profile', 'u', 'updates', 'repeat', 'announce', 'shares', 'fonts', 'icons', 'avatars', - 'welcome') + 'welcome', 'helpimages') if nickname in reservedNames: return True return False From ce4b415023c7c2dd488385cc71c1d3a13d4ca645 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 26 Feb 2021 17:01:32 +0000 Subject: [PATCH 0106/1416] if there is no theme-specific help image then use the default one --- daemon.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/daemon.py b/daemon.py index 33a83a923..f131949a5 100644 --- a/daemon.py +++ b/daemon.py @@ -5794,6 +5794,10 @@ class PubServer(BaseHTTPRequestHandler): iconFilename = mediaStr.split('/')[1] mediaFilename = \ baseDir + '/theme/' + theme + '/helpimages/' + iconFilename + # if there is no theme-specific help image then use the default one + if not os.path.isfile(mediaFilename): + mediaFilename = \ + baseDir + '/theme/default/helpimages/' + iconFilename if self._etag_exists(mediaFilename): # The file has not changed self._304() From 4f0b73969479e454ccc6503b3dc2b5082e95b9c7 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 26 Feb 2021 17:19:16 +0000 Subject: [PATCH 0107/1416] Welcome header image --- defaultwelcome/welcome_en.md | 1 + epicyon-profile.css | 4 ++++ theme/default/helpimages/welcome.jpg | Bin 0 -> 30044 bytes 3 files changed, 5 insertions(+) create mode 100644 theme/default/helpimages/welcome.jpg diff --git a/defaultwelcome/welcome_en.md b/defaultwelcome/welcome_en.md index 5d942a9a5..1d1e8935f 100644 --- a/defaultwelcome/welcome_en.md +++ b/defaultwelcome/welcome_en.md @@ -1,3 +1,4 @@ +![Welcome image](/helpimages/welcome.jpg) ### Welcome to INSTANCE This is an ActivityPub server designed for easy self-hosting of a few people on low power systems, such as single board computers or old laptops. diff --git a/epicyon-profile.css b/epicyon-profile.css index 384c60893..7a8e15501 100644 --- a/epicyon-profile.css +++ b/epicyon-profile.css @@ -190,6 +190,10 @@ body, html { color: var(--cw-color); } +.markdownImage { + width: 100%; +} + .leftColIcons { width: 100%; background-color: var(--column-left-color); diff --git a/theme/default/helpimages/welcome.jpg b/theme/default/helpimages/welcome.jpg new file mode 100644 index 0000000000000000000000000000000000000000..77e97a3a60f19ab36840ef51420cfd87c9944fe4 GIT binary patch literal 30044 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 literal 0 HcmV?d00001 From 2ad10b07004d6bfa319a3e1f370faa436f26f97b Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 26 Feb 2021 17:38:25 +0000 Subject: [PATCH 0108/1416] Markdown image style --- epicyon-profile.css | 4 ---- epicyon-welcome.css | 8 ++++++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/epicyon-profile.css b/epicyon-profile.css index 7a8e15501..384c60893 100644 --- a/epicyon-profile.css +++ b/epicyon-profile.css @@ -190,10 +190,6 @@ body, html { color: var(--cw-color); } -.markdownImage { - width: 100%; -} - .leftColIcons { width: 100%; background-color: var(--column-left-color); diff --git a/epicyon-welcome.css b/epicyon-welcome.css index 21a2ec8a1..89ccadb2c 100644 --- a/epicyon-welcome.css +++ b/epicyon-welcome.css @@ -149,6 +149,10 @@ img.avatar { width: var(--welcome-avatar-width); } +.container img.markdownImage { + width: 100%; +} + .container.next { float: right; } @@ -192,7 +196,7 @@ span.psw { margin: 8px 0; border: none; cursor: pointer; - width: var(--welcome-button-width); + width: var(--welcome-button-width); font-size: var(--welcome-font-size); font-family: Arial, Helvetica, sans-serif; } @@ -232,7 +236,7 @@ span.psw { margin: 8px 0; border: none; cursor: pointer; - width: var(--welcome-button-width); + width: var(--welcome-button-width); font-size: var(--welcome-font-size-mobile); font-family: Arial, Helvetica, sans-serif; } From 41b8ed8a4db2c45ab6aa452f7473ef8fa4e54e02 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 26 Feb 2021 17:39:20 +0000 Subject: [PATCH 0109/1416] Markdown image style --- epicyon-profile.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/epicyon-profile.css b/epicyon-profile.css index 384c60893..6ef938ec7 100644 --- a/epicyon-profile.css +++ b/epicyon-profile.css @@ -426,6 +426,10 @@ a:focus { background-color: var(--timeline-posts-background-color); } +.container img.markdownImage { + width: 100%; +} + .container img.timelineicon:hover { filter: brightness(var(--icon-brightness-change)); } From c10fcc4f40557f2de6ecceb1448e055f5caf9d7f Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 26 Feb 2021 20:30:51 +0000 Subject: [PATCH 0110/1416] Welcome screen header images --- defaultwelcome/welcome_ar.md | 1 + defaultwelcome/welcome_ca.md | 1 + defaultwelcome/welcome_cy.md | 1 + defaultwelcome/welcome_de.md | 1 + defaultwelcome/welcome_es.md | 1 + defaultwelcome/welcome_fr.md | 1 + defaultwelcome/welcome_ga.md | 1 + defaultwelcome/welcome_hi.md | 1 + defaultwelcome/welcome_it.md | 1 + defaultwelcome/welcome_ja.md | 1 + defaultwelcome/welcome_oc.md | 3 ++- defaultwelcome/welcome_pt.md | 3 ++- defaultwelcome/welcome_ru.md | 1 + defaultwelcome/welcome_zh.md | 1 + theme/debian/helpimages/welcome.jpg | Bin 0 -> 11593 bytes theme/hacker/helpimages/welcome.jpg | Bin 0 -> 15338 bytes theme/henge/helpimages/welcome.jpg | Bin 0 -> 23376 bytes theme/light/helpimages/welcome.jpg | Bin 0 -> 9607 bytes theme/night/helpimages/welcome.jpg | Bin 0 -> 14025 bytes theme/purple/helpimages/welcome.jpg | Bin 0 -> 36979 bytes theme/solidaric/helpimages/welcome.jpg | Bin 0 -> 8453 bytes theme/starlight/helpimages/welcome.jpg | Bin 0 -> 7885 bytes theme/zen/helpimages/welcome.jpg | Bin 0 -> 31738 bytes 23 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 theme/debian/helpimages/welcome.jpg create mode 100644 theme/hacker/helpimages/welcome.jpg create mode 100644 theme/henge/helpimages/welcome.jpg create mode 100644 theme/light/helpimages/welcome.jpg create mode 100644 theme/night/helpimages/welcome.jpg create mode 100644 theme/purple/helpimages/welcome.jpg create mode 100644 theme/solidaric/helpimages/welcome.jpg create mode 100644 theme/starlight/helpimages/welcome.jpg create mode 100644 theme/zen/helpimages/welcome.jpg diff --git a/defaultwelcome/welcome_ar.md b/defaultwelcome/welcome_ar.md index 8e88deb0a..8d7170c4e 100644 --- a/defaultwelcome/welcome_ar.md +++ b/defaultwelcome/welcome_ar.md @@ -1,3 +1,4 @@ +![مرحبا الصورة](/helpimages/welcome.jpg) ### مرحبًا بكم في INSTANCE هذا خادم ActivityPub مصمم للاستضافة الذاتية السهلة لعدد قليل من الأشخاص على أنظمة منخفضة الطاقة ، مثل أجهزة الكمبيوتر ذات اللوحة الواحدة أو أجهزة الكمبيوتر المحمولة القديمة. diff --git a/defaultwelcome/welcome_ca.md b/defaultwelcome/welcome_ca.md index 0721e7e14..ada6129ed 100644 --- a/defaultwelcome/welcome_ca.md +++ b/defaultwelcome/welcome_ca.md @@ -1,3 +1,4 @@ +![Imatge de benvinguda](/helpimages/welcome.jpg) ### Benvingut a INSTANCE Es tracta d’un servidor ActivityPub dissenyat per allotjar fàcilment algunes persones en sistemes de poca potència, com ara ordinadors de placa única o portàtils antics. diff --git a/defaultwelcome/welcome_cy.md b/defaultwelcome/welcome_cy.md index 7596a7927..cb4530faa 100644 --- a/defaultwelcome/welcome_cy.md +++ b/defaultwelcome/welcome_cy.md @@ -1,3 +1,4 @@ +![Delwedd groeso](/helpimages/welcome.jpg) ### Croeso i INSTANCE Gweinydd ActivityPub yw hwn sydd wedi'i gynllunio ar gyfer hunan-letya ychydig o bobl ar systemau pŵer isel yn hawdd, fel cyfrifiaduron bwrdd sengl neu hen gliniaduron. diff --git a/defaultwelcome/welcome_de.md b/defaultwelcome/welcome_de.md index f1dedb95b..c6f8e1ac7 100644 --- a/defaultwelcome/welcome_de.md +++ b/defaultwelcome/welcome_de.md @@ -1,3 +1,4 @@ +![Willkommensbild](/helpimages/welcome.jpg) ### Willkommen bei INSTANCE Dies ist ein ActivityPub-Server, der für das einfache Selbsthosting einiger weniger Personen auf Systemen mit geringem Stromverbrauch wie Single-Board-Computern oder alten Laptops entwickelt wurde. diff --git a/defaultwelcome/welcome_es.md b/defaultwelcome/welcome_es.md index f9ba98454..0c1474dc1 100644 --- a/defaultwelcome/welcome_es.md +++ b/defaultwelcome/welcome_es.md @@ -1,3 +1,4 @@ +![Imagen de bienvenida](/helpimages/welcome.jpg) ### Bienvenido a INSTANCE Este es un servidor ActivityPub diseñado para el autohospedaje sencillo de algunas personas en sistemas de bajo consumo de energía, como computadoras de placa única o laptops antiguas. diff --git a/defaultwelcome/welcome_fr.md b/defaultwelcome/welcome_fr.md index 9fd72437e..7f6610630 100644 --- a/defaultwelcome/welcome_fr.md +++ b/defaultwelcome/welcome_fr.md @@ -1,3 +1,4 @@ +![Image de bienvenue](/helpimages/welcome.jpg) ### Bienvenue à INSTANCE Il s'agit d'un serveur ActivityPub conçu pour l'auto-hébergement facile de quelques personnes sur des systèmes à faible consommation d'énergie, tels que des ordinateurs monocarte ou d'anciens ordinateurs portables. diff --git a/defaultwelcome/welcome_ga.md b/defaultwelcome/welcome_ga.md index c9a11c680..91dc36d64 100644 --- a/defaultwelcome/welcome_ga.md +++ b/defaultwelcome/welcome_ga.md @@ -1,3 +1,4 @@ +![Íomhá fáilte](/helpimages/welcome.jpg) ### Fáilte go INSTANCE Is freastalaí ActivityPub é seo atá deartha chun féin-óstáil éasca a dhéanamh ar chúpla duine ar chórais ísealchumhachta, mar ríomhairí boird aonair nó sean ríomhairí glúine. diff --git a/defaultwelcome/welcome_hi.md b/defaultwelcome/welcome_hi.md index 13923d095..fcffdfabd 100644 --- a/defaultwelcome/welcome_hi.md +++ b/defaultwelcome/welcome_hi.md @@ -1,3 +1,4 @@ +![स्वागत है छवि](/helpimages/welcome.jpg) ### INSTANCE पर आपका स्वागत है यह एक एक्टिविटीपब सर्वर है जो कम पावर सिस्टम पर सिंगल बोर्ड कंप्यूटर या पुराने लैपटॉप जैसे कुछ लोगों की आसान सेल्फ-होस्टिंग के लिए बनाया गया है। diff --git a/defaultwelcome/welcome_it.md b/defaultwelcome/welcome_it.md index 498caf115..b74a1e053 100644 --- a/defaultwelcome/welcome_it.md +++ b/defaultwelcome/welcome_it.md @@ -1,3 +1,4 @@ +![Immagine di benvenuto](/helpimages/welcome.jpg) ### Benvenuto in INSTANCE Questo è un server ActivityPub progettato per un facile self-hosting di poche persone su sistemi a basso consumo, come computer a scheda singola o vecchi laptop. diff --git a/defaultwelcome/welcome_ja.md b/defaultwelcome/welcome_ja.md index 7e21a1821..dd26aa2ba 100644 --- a/defaultwelcome/welcome_ja.md +++ b/defaultwelcome/welcome_ja.md @@ -1,3 +1,4 @@ +![ウェルカムイメージ](/helpimages/welcome.jpg) ### INSTANCEへようこそ これは、シングルボードコンピューターや古いラップトップなどの低電力システムで数人を簡単にセルフホスティングするために設計されたActivityPubサーバーです。 diff --git a/defaultwelcome/welcome_oc.md b/defaultwelcome/welcome_oc.md index 2a90b3a52..520d07387 100644 --- a/defaultwelcome/welcome_oc.md +++ b/defaultwelcome/welcome_oc.md @@ -1,4 +1,5 @@ -# Welcome +![Welcome image](/helpimages/welcome.jpg) +### Welcome Epicyon is an ActivityPub server designed for easy self-hosting of a few people on low power systems, such as single board computers or old laptops. Run your own social network presence the way you want to, and say goodbye to Big Tech. diff --git a/defaultwelcome/welcome_pt.md b/defaultwelcome/welcome_pt.md index f302f5aec..e0193f6a2 100644 --- a/defaultwelcome/welcome_pt.md +++ b/defaultwelcome/welcome_pt.md @@ -1,4 +1,5 @@ -# Bem-vindo a INSTANCE +![Imagem de boas-vindas](/helpimages/welcome.jpg) +### Bem-vindo a INSTANCE Este é um servidor ActivityPub projetado para fácil auto-hospedagem de algumas pessoas em sistemas de baixo consumo de energia, como computadores de placa única ou laptops antigos. Administre sua própria presença na rede social do jeito que você quiser e diga adeus à Big Tech. diff --git a/defaultwelcome/welcome_ru.md b/defaultwelcome/welcome_ru.md index 65c82400d..857581ef4 100644 --- a/defaultwelcome/welcome_ru.md +++ b/defaultwelcome/welcome_ru.md @@ -1,3 +1,4 @@ +![Приветственное изображение](/helpimages/welcome.jpg) ### Добро пожаловать в INSTANCE Это сервер ActivityPub, предназначенный для простого самостоятельного размещения нескольких человек в системах с низким энергопотреблением, таких как одноплатные компьютеры или старые ноутбуки. diff --git a/defaultwelcome/welcome_zh.md b/defaultwelcome/welcome_zh.md index 978734e94..1f9a62db6 100644 --- a/defaultwelcome/welcome_zh.md +++ b/defaultwelcome/welcome_zh.md @@ -1,3 +1,4 @@ +![欢迎图片](/helpimages/welcome.jpg) ### 欢迎来到INSTANCE 这是一个ActivityPub服务器,设计用于在低功耗系统(例如单板计算机或旧笔记本电脑)上轻松实现一些人的自我托管。 diff --git a/theme/debian/helpimages/welcome.jpg b/theme/debian/helpimages/welcome.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2dca20d97c6fbccac09a6cff4d8885106d0687a6 GIT binary patch literal 11593 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 literal 0 HcmV?d00001 diff --git a/theme/hacker/helpimages/welcome.jpg b/theme/hacker/helpimages/welcome.jpg new file mode 100644 index 0000000000000000000000000000000000000000..688320ac4564f68272dec04f966e1759d4875699 GIT binary patch literal 15338 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

2VE{X+9Zv|N8W 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 m7r(jcI8NT-y5bjzW^;M?fE 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 literal 0 HcmV?d00001 diff --git a/theme/purple/helpimages/welcome.jpg b/theme/purple/helpimages/welcome.jpg new file mode 100644 index 0000000000000000000000000000000000000000..328cfa37eb9c00405ee2444952d9ee4ae782c9b5 GIT binary patch literal 36979 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 RqE|4O5Bykrimku-|Jh}QSSA1f literal 0 HcmV?d00001 diff --git a/theme/solidaric/helpimages/welcome.jpg b/theme/solidaric/helpimages/welcome.jpg new file mode 100644 index 0000000000000000000000000000000000000000..02e4eb00601b631c346fd2f37abade576b9d25dc GIT binary patch literal 8453 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 literal 0 HcmV?d00001 diff --git a/theme/starlight/helpimages/welcome.jpg b/theme/starlight/helpimages/welcome.jpg new file mode 100644 index 0000000000000000000000000000000000000000..970e080d314a40b5801a5705771d78bf4edc8fb2 GIT binary patch literal 7885 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�S1I}iSLE%{+uu7GlXi1x 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 literal 0 HcmV?d00001 From 8f3bd705ad8e252fae11107714bb350cc0609bbd Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 26 Feb 2021 20:50:50 +0000 Subject: [PATCH 0111/1416] Welcome screen header images --- theme/pixel/helpimages/welcome.jpg | Bin 0 -> 22930 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 theme/pixel/helpimages/welcome.jpg diff --git a/theme/pixel/helpimages/welcome.jpg b/theme/pixel/helpimages/welcome.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0a5c37cfc153e5a6d416e16ce0c62f130bb6d285 GIT binary patch literal 22930 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 literal 0 HcmV?d00001 From fc4e2fc70219ea0f7ca2e0c0ed7afa3b47ac249d Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 26 Feb 2021 23:00:06 +0000 Subject: [PATCH 0112/1416] Support quotes in markdown --- daemon.py | 2 +- tests.py | 5 +++++ webapp_utils.py | 26 ++++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/daemon.py b/daemon.py index f131949a5..cb1c75e2d 100644 --- a/daemon.py +++ b/daemon.py @@ -5797,7 +5797,7 @@ class PubServer(BaseHTTPRequestHandler): # if there is no theme-specific help image then use the default one if not os.path.isfile(mediaFilename): mediaFilename = \ - baseDir + '/theme/default/helpimages/' + iconFilename + baseDir + '/theme/default/helpimages/' + iconFilename if self._etag_exists(mediaFilename): # The file has not changed self._304() diff --git a/tests.py b/tests.py index 9fee74c7d..db321f23c 100644 --- a/tests.py +++ b/tests.py @@ -3288,6 +3288,11 @@ def testMarkdownToHtml(): markdown = 'This is just plain text' assert markdownToHtml(markdown) == markdown + markdown = 'This is a quotation:\n' + \ + '> Some quote or other' + assert markdownToHtml(markdown) == 'This is a quotation:
' + \ + '

Some quote or other
' + markdown = 'This is **bold**' assert markdownToHtml(markdown) == 'This is bold' diff --git a/webapp_utils.py b/webapp_utils.py index b8519bb90..29c965100 100644 --- a/webapp_utils.py +++ b/webapp_utils.py @@ -66,8 +66,33 @@ def _markdownEmphasisHtml(markdown: str) -> str: return markdown +def _markdownReplaceQuotes(markdown: str) -> str: + """Replaces > quotes with html blockquote + """ + if '> ' not in markdown: + return markdown + lines = markdown.split('\n') + result = '' + for line in lines: + if '> ' not in line: + result += line + '\n' + continue + lineStr = line.strip() + if not lineStr.startswith('> '): + result += line + '\n' + continue + lineStr = lineStr.replace('> ', '', 1).strip() + result += '
' + lineStr + '
\n' + + if result.endswith('\n') and \ + not markdown.endswith('\n'): + result = result[:len(result) -1] + return result + + def _markdownReplaceLinks(markdown: str, images=False) -> str: """Replaces markdown links with html + Optionally replace image links """ replaceLinks = {} text = markdown @@ -106,6 +131,7 @@ def _markdownReplaceLinks(markdown: str, images=False) -> str: def markdownToHtml(markdown: str) -> str: """Converts markdown formatted text to html """ + markdown = _markdownReplaceQuotes(markdown) markdown = _markdownEmphasisHtml(markdown) markdown = _markdownReplaceLinks(markdown, True) markdown = _markdownReplaceLinks(markdown) From b07bc917f4ebbaae900a80490df36a0c60f0a6a2 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 26 Feb 2021 23:13:33 +0000 Subject: [PATCH 0113/1416] Handle multi-line markdown quotes --- tests.py | 7 +++++++ webapp_utils.py | 12 +++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/tests.py b/tests.py index db321f23c..e4dace257 100644 --- a/tests.py +++ b/tests.py @@ -3293,6 +3293,13 @@ def testMarkdownToHtml(): assert markdownToHtml(markdown) == 'This is a quotation:
' + \ '
Some quote or other
' + markdown = 'This is a multi-line quotation:\n' + \ + '> The first line\n' + \ + '> The second line' + assert markdownToHtml(markdown) == \ + 'This is a multi-line quotation:
' + \ + '
The first line The second line
' + markdown = 'This is **bold**' assert markdownToHtml(markdown) == 'This is bold' diff --git a/webapp_utils.py b/webapp_utils.py index 29c965100..7a3fe6b1d 100644 --- a/webapp_utils.py +++ b/webapp_utils.py @@ -73,16 +73,26 @@ def _markdownReplaceQuotes(markdown: str) -> str: return markdown lines = markdown.split('\n') result = '' + prevQuoteLine = None for line in lines: if '> ' not in line: result += line + '\n' + prevQuoteLine = None continue lineStr = line.strip() if not lineStr.startswith('> '): result += line + '\n' + prevQuoteLine = None continue lineStr = lineStr.replace('> ', '', 1).strip() - result += '
' + lineStr + '
\n' + if prevQuoteLine: + newPrevLine = prevQuoteLine.replace('
\n', '') + result = result.replace(prevQuoteLine, newPrevLine) + ' ' + lineStr += '\n' + else: + lineStr = '
' + lineStr + '
\n' + result += lineStr + prevQuoteLine = lineStr if result.endswith('\n') and \ not markdown.endswith('\n'): From 1181ad5858a06eed1addcd613b32e968575d3678 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 26 Feb 2021 23:28:19 +0000 Subject: [PATCH 0114/1416] Remove trailing newline from blockquote --- webapp_utils.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/webapp_utils.py b/webapp_utils.py index 7a3fe6b1d..a0f7d0076 100644 --- a/webapp_utils.py +++ b/webapp_utils.py @@ -94,9 +94,12 @@ def _markdownReplaceQuotes(markdown: str) -> str: result += lineStr prevQuoteLine = lineStr + if '\n' in result: + result = result.replace('\n', '') + if result.endswith('\n') and \ not markdown.endswith('\n'): - result = result[:len(result) -1] + result = result[:len(result) - 1] return result From fc22cb18dd1cd5d6c5d8fe249bcecc0b4984f6aa Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 27 Feb 2021 09:46:36 +0000 Subject: [PATCH 0115/1416] Clean the welcome files --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 034be8abb..be1a6966c 100644 --- a/Makefile +++ b/Makefile @@ -17,6 +17,7 @@ source: clean: rm -f *.*~ *~ *.dot rm -f orgs/*~ + rm -f defaultwelcome/*~ rm -f website/EN/*~ rm -f gemini/EN/*~ rm -f scripts/*~ From 3246fed56604552a9a33cbf125d789d6982b1ee7 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 27 Feb 2021 09:53:54 +0000 Subject: [PATCH 0116/1416] Blogs timeline help --- defaultwelcome/help_tlblogs_en.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 defaultwelcome/help_tlblogs_en.md diff --git a/defaultwelcome/help_tlblogs_en.md b/defaultwelcome/help_tlblogs_en.md new file mode 100644 index 000000000..0636712b4 --- /dev/null +++ b/defaultwelcome/help_tlblogs_en.md @@ -0,0 +1,5 @@ +This timeline contains any blogs written by you or anyone that you're following. + +You can create a new blog post using the **publish** icon at the top of the right column. + +Blog posts are different from ordinary fediverse posts. They use the ActivityPub *Article* type, which is intended for long-form writing. They can also have citations, selected from items in the newswire. From 241391747a521788cba7c00742d7b4d9eafb596e Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 27 Feb 2021 10:10:05 +0000 Subject: [PATCH 0117/1416] Allow theme specific welcome files --- webapp_timeline.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/webapp_timeline.py b/webapp_timeline.py index cf0e17719..be498f826 100644 --- a/webapp_timeline.py +++ b/webapp_timeline.py @@ -55,9 +55,19 @@ def _getHelpForTimeline(baseDir: str, boxName: str) -> str: getConfigParam(baseDir, 'language') if not language: language = 'en' - defaultFilename = \ - baseDir + '/defaultwelcome/' + \ - 'help_' + boxName + '_' + language + '.md' + themeName = \ + getConfigParam(baseDir, 'theme') + defaultFilename = None + if themeName: + defaultFilename = \ + baseDir + '/theme/' + themeName + '/welcome/' + \ + 'help_' + boxName + '_' + language + '.md' + if not os.path.isfile(defaultFilename): + defaultFilename = None + if not defaultFilename: + defaultFilename = \ + baseDir + '/defaultwelcome/' + \ + 'help_' + boxName + '_' + language + '.md' if not os.path.isfile(defaultFilename): defaultFilename = \ baseDir + '/defaultwelcome/help_' + boxName + '_en.md' From 94e03502c5b4d21e7cdfbb49316a3174d56252b5 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 27 Feb 2021 10:27:39 +0000 Subject: [PATCH 0118/1416] Allow theme specific welcome files --- daemon.py | 9 ++++++--- webapp_welcome.py | 14 ++++++++++++-- webapp_welcome_final.py | 15 ++++++++++++--- webapp_welcome_profile.py | 15 ++++++++++++--- 4 files changed, 42 insertions(+), 11 deletions(-) diff --git a/daemon.py b/daemon.py index cb1c75e2d..ef1f8c3cd 100644 --- a/daemon.py +++ b/daemon.py @@ -10800,7 +10800,8 @@ class PubServer(BaseHTTPRequestHandler): msg = \ htmlWelcomeScreen(self.server.baseDir, nickname, self.server.systemLanguage, - self.server.translate) + self.server.translate, + self.server.themeName) msg = msg.encode('utf-8') msglen = len(msg) self._login_headers('text/html', msglen, callingDomain) @@ -10827,7 +10828,8 @@ class PubServer(BaseHTTPRequestHandler): self.server.httpPrefix, self.server.domainFull, self.server.systemLanguage, - self.server.translate) + self.server.translate, + self.server.themeName) msg = msg.encode('utf-8') msglen = len(msg) self._login_headers('text/html', msglen, callingDomain) @@ -10854,7 +10856,8 @@ class PubServer(BaseHTTPRequestHandler): self.server.httpPrefix, self.server.domainFull, self.server.systemLanguage, - self.server.translate) + self.server.translate, + self.server.themeName) msg = msg.encode('utf-8') msglen = len(msg) self._login_headers('text/html', msglen, callingDomain) diff --git a/webapp_welcome.py b/webapp_welcome.py index 77c868707..60d69612b 100644 --- a/webapp_welcome.py +++ b/webapp_welcome.py @@ -41,6 +41,7 @@ def welcomeScreenIsComplete(baseDir: str, def htmlWelcomeScreen(baseDir: str, nickname: str, language: str, translate: {}, + themeName: str, currScreen='welcome') -> str: """Returns the welcome screen """ @@ -53,8 +54,17 @@ def htmlWelcomeScreen(baseDir: str, nickname: str, welcomeText = 'Welcome to Epicyon' welcomeFilename = baseDir + '/accounts/' + currScreen + '.md' if not os.path.isfile(welcomeFilename): - defaultFilename = \ - baseDir + '/defaultwelcome/' + currScreen + '_' + language + '.md' + defaultFilename = None + if themeName: + defaultFilename = \ + baseDir + '/theme/' + themeName + '/welcome/' + \ + 'welcome_' + language + '.md' + if not os.path.isfile(defaultFilename): + defaultFilename = None + if not defaultFilename: + defaultFilename = \ + baseDir + '/defaultwelcome/' + \ + currScreen + '_' + language + '.md' if not os.path.isfile(defaultFilename): defaultFilename = \ baseDir + '/defaultwelcome/' + currScreen + '_en.md' diff --git a/webapp_welcome_final.py b/webapp_welcome_final.py index 2ae2c8996..b1635cd29 100644 --- a/webapp_welcome_final.py +++ b/webapp_welcome_final.py @@ -17,7 +17,8 @@ from webapp_utils import markdownToHtml def htmlWelcomeFinal(baseDir: str, nickname: str, domain: str, httpPrefix: str, domainFull: str, - language: str, translate: {}) -> str: + language: str, translate: {}, + themeName: str) -> str: """Returns the final welcome screen after first login """ # set a custom background for the welcome screen @@ -29,8 +30,16 @@ def htmlWelcomeFinal(baseDir: str, nickname: str, domain: str, finalText = 'Welcome to Epicyon' finalFilename = baseDir + '/accounts/welcome_final.md' if not os.path.isfile(finalFilename): - defaultFilename = \ - baseDir + '/defaultwelcome/final_' + language + '.md' + defaultFilename = None + if themeName: + defaultFilename = \ + baseDir + '/theme/' + themeName + '/welcome/' + \ + 'final_' + language + '.md' + if not os.path.isfile(defaultFilename): + defaultFilename = None + if not defaultFilename: + defaultFilename = \ + baseDir + '/defaultwelcome/final_' + language + '.md' if not os.path.isfile(defaultFilename): defaultFilename = baseDir + '/defaultwelcome/final_en.md' copyfile(defaultFilename, finalFilename) diff --git a/webapp_welcome_profile.py b/webapp_welcome_profile.py index 341ad5b55..fa78dcfce 100644 --- a/webapp_welcome_profile.py +++ b/webapp_welcome_profile.py @@ -20,7 +20,8 @@ from webapp_utils import markdownToHtml def htmlWelcomeProfile(baseDir: str, nickname: str, domain: str, httpPrefix: str, domainFull: str, - language: str, translate: {}) -> str: + language: str, translate: {}, + themeName: str) -> str: """Returns the welcome profile screen to set avatar and bio """ # set a custom background for the welcome screen @@ -32,8 +33,16 @@ def htmlWelcomeProfile(baseDir: str, nickname: str, domain: str, profileText = 'Welcome to Epicyon' profileFilename = baseDir + '/accounts/welcome_profile.md' if not os.path.isfile(profileFilename): - defaultFilename = \ - baseDir + '/defaultwelcome/profile_' + language + '.md' + defaultFilename = None + if themeName: + defaultFilename = \ + baseDir + '/theme/' + themeName + '/welcome/' + \ + 'profile_' + language + '.md' + if not os.path.isfile(defaultFilename): + defaultFilename = None + if not defaultFilename: + defaultFilename = \ + baseDir + '/defaultwelcome/profile_' + language + '.md' if not os.path.isfile(defaultFilename): defaultFilename = baseDir + '/defaultwelcome/profile_en.md' copyfile(defaultFilename, profileFilename) From e4b3a22264bf3981a30b7783259193d84deb4d05 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 27 Feb 2021 11:04:06 +0000 Subject: [PATCH 0119/1416] Custom help text for indymedia themes --- Makefile | 2 ++ theme/indymediaclassic/welcome/final_en.md | 9 +++++++++ theme/indymediaclassic/welcome/help_tlblogs_en.md | 3 +++ theme/indymediaclassic/welcome/welcome_en.md | 7 +++++++ theme/indymediamodern/welcome/final_en.md | 9 +++++++++ theme/indymediamodern/welcome/help_tlblogs_en.md | 3 +++ theme/indymediamodern/welcome/welcome_en.md | 7 +++++++ 7 files changed, 40 insertions(+) create mode 100644 theme/indymediaclassic/welcome/final_en.md create mode 100644 theme/indymediaclassic/welcome/help_tlblogs_en.md create mode 100644 theme/indymediaclassic/welcome/welcome_en.md create mode 100644 theme/indymediamodern/welcome/final_en.md create mode 100644 theme/indymediamodern/welcome/help_tlblogs_en.md create mode 100644 theme/indymediamodern/welcome/welcome_en.md diff --git a/Makefile b/Makefile index be1a6966c..7a54fd9db 100644 --- a/Makefile +++ b/Makefile @@ -18,6 +18,8 @@ clean: rm -f *.*~ *~ *.dot rm -f orgs/*~ rm -f defaultwelcome/*~ + rm -f theme/indymediaclassic/welcome/*~ + rm -f theme/indymediamodern/welcome/*~ rm -f website/EN/*~ rm -f gemini/EN/*~ rm -f scripts/*~ diff --git a/theme/indymediaclassic/welcome/final_en.md b/theme/indymediaclassic/welcome/final_en.md new file mode 100644 index 000000000..035320ba0 --- /dev/null +++ b/theme/indymediaclassic/welcome/final_en.md @@ -0,0 +1,9 @@ +### You are now a journalist! +Welcome onboard the team. This is a moderated news instance, so please ensure that anything you write is in accordance with our [editorial policy](/terms). + +#### Hints +Use the **magnifier** icon 🔍 to search for fediverse handles and follow people. + +Selecting the **banner at the top** of the screen switches between timeline view and your profile. + +The screen will not automatically refresh when articles arrive, so use **F5** or the **Features** button to refresh. diff --git a/theme/indymediaclassic/welcome/help_tlblogs_en.md b/theme/indymediaclassic/welcome/help_tlblogs_en.md new file mode 100644 index 000000000..b5752f41d --- /dev/null +++ b/theme/indymediaclassic/welcome/help_tlblogs_en.md @@ -0,0 +1,3 @@ +This timeline contains any articles published by you or anyone that you're following. + +You can create a new article using the **publish** icon at the top of the newswire column, or on mobile via the newswire icon. diff --git a/theme/indymediaclassic/welcome/welcome_en.md b/theme/indymediaclassic/welcome/welcome_en.md new file mode 100644 index 000000000..05f1e0bba --- /dev/null +++ b/theme/indymediaclassic/welcome/welcome_en.md @@ -0,0 +1,7 @@ +![Welcome image](/helpimages/welcome.jpg) +### Welcome to INSTANCE +This is an ActivityPub server designed for publishing in the Indymedia network. It can run on low power single board computers or old laptops. + +Don't complain about the media. Be the media. + +Now, lets get going... diff --git a/theme/indymediamodern/welcome/final_en.md b/theme/indymediamodern/welcome/final_en.md new file mode 100644 index 000000000..035320ba0 --- /dev/null +++ b/theme/indymediamodern/welcome/final_en.md @@ -0,0 +1,9 @@ +### You are now a journalist! +Welcome onboard the team. This is a moderated news instance, so please ensure that anything you write is in accordance with our [editorial policy](/terms). + +#### Hints +Use the **magnifier** icon 🔍 to search for fediverse handles and follow people. + +Selecting the **banner at the top** of the screen switches between timeline view and your profile. + +The screen will not automatically refresh when articles arrive, so use **F5** or the **Features** button to refresh. diff --git a/theme/indymediamodern/welcome/help_tlblogs_en.md b/theme/indymediamodern/welcome/help_tlblogs_en.md new file mode 100644 index 000000000..b5752f41d --- /dev/null +++ b/theme/indymediamodern/welcome/help_tlblogs_en.md @@ -0,0 +1,3 @@ +This timeline contains any articles published by you or anyone that you're following. + +You can create a new article using the **publish** icon at the top of the newswire column, or on mobile via the newswire icon. diff --git a/theme/indymediamodern/welcome/welcome_en.md b/theme/indymediamodern/welcome/welcome_en.md new file mode 100644 index 000000000..05f1e0bba --- /dev/null +++ b/theme/indymediamodern/welcome/welcome_en.md @@ -0,0 +1,7 @@ +![Welcome image](/helpimages/welcome.jpg) +### Welcome to INSTANCE +This is an ActivityPub server designed for publishing in the Indymedia network. It can run on low power single board computers or old laptops. + +Don't complain about the media. Be the media. + +Now, lets get going... From 99163d66e80ff08c599edc4634e58bb0290f4629 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 27 Feb 2021 11:44:50 +0000 Subject: [PATCH 0120/1416] Defining news themes --- daemon.py | 26 +++++++++++++++++-------- theme.py | 9 +++++++++ theme/indymediaclassic/is_news_instance | 1 + theme/indymediamodern/is_news_instance | 1 + 4 files changed, 29 insertions(+), 8 deletions(-) create mode 100644 theme/indymediaclassic/is_news_instance create mode 100644 theme/indymediamodern/is_news_instance diff --git a/daemon.py b/daemon.py index ef1f8c3cd..7cfc0fc2f 100644 --- a/daemon.py +++ b/daemon.py @@ -239,6 +239,7 @@ from cache import checkForChangedActor from cache import storePersonInCache from cache import getPersonFromCache from httpsig import verifyPostHeaders +from theme import isNewsThemeName from theme import getTextModeBanner from theme import setNewsAvatar from theme import setTheme @@ -4227,6 +4228,11 @@ class PubServer(BaseHTTPRequestHandler): "mediaInstance", self.server.mediaInstance) + # is this a news theme? + if isNewsThemeName(self.server.baseDir, + self.server.themeName): + fields['newsInstance'] = 'on' + # change news instance status if fields.get('newsInstance'): self.server.newsInstance = False @@ -14274,14 +14280,6 @@ def runDaemon(brochMode: bool, httpd.i2pDomain = i2pDomain httpd.mediaInstance = mediaInstance httpd.blogsInstance = blogsInstance - httpd.newsInstance = newsInstance - httpd.defaultTimeline = 'inbox' - if mediaInstance: - httpd.defaultTimeline = 'tlmedia' - if blogsInstance: - httpd.defaultTimeline = 'tlblogs' - if newsInstance: - httpd.defaultTimeline = 'tlfeatures' # load translations dictionary httpd.translate = {} @@ -14445,6 +14443,18 @@ def runDaemon(brochMode: bool, httpd.themeName = getConfigParam(baseDir, 'theme') if not httpd.themeName: httpd.themeName = 'default' + if isNewsThemeName(baseDir, httpd.themeName): + newsInstance = True + + httpd.newsInstance = newsInstance + httpd.defaultTimeline = 'inbox' + if mediaInstance: + httpd.defaultTimeline = 'tlmedia' + if blogsInstance: + httpd.defaultTimeline = 'tlblogs' + if newsInstance: + httpd.defaultTimeline = 'tlfeatures' + setNewsAvatar(baseDir, httpd.themeName, httpPrefix, diff --git a/theme.py b/theme.py index 008d0a7f3..9a4800380 100644 --- a/theme.py +++ b/theme.py @@ -23,6 +23,15 @@ def _getThemeFiles() -> []: 'welcome.css') +def isNewsThemeName(baseDir: str, themeName: str) -> bool: + """Returns true if the given theme is a news instance + """ + themeDir = baseDir + '/theme/' + themeName + if os.path.isfile(themeDir + '/is_news_instance'): + return True + return False + + def getThemesList(baseDir: str) -> []: """Returns the list of available themes Note that these should be capitalized, since they're diff --git a/theme/indymediaclassic/is_news_instance b/theme/indymediaclassic/is_news_instance new file mode 100644 index 000000000..0519ecba6 --- /dev/null +++ b/theme/indymediaclassic/is_news_instance @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/theme/indymediamodern/is_news_instance b/theme/indymediamodern/is_news_instance new file mode 100644 index 000000000..0519ecba6 --- /dev/null +++ b/theme/indymediamodern/is_news_instance @@ -0,0 +1 @@ + \ No newline at end of file From 18272a101fea715b6a0e72333c8188cbc46641e7 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 27 Feb 2021 12:06:02 +0000 Subject: [PATCH 0121/1416] Indymedia title image --- theme/indymediaclassic/helpimages/welcome.jpg | Bin 0 -> 11896 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 theme/indymediaclassic/helpimages/welcome.jpg diff --git a/theme/indymediaclassic/helpimages/welcome.jpg b/theme/indymediaclassic/helpimages/welcome.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3d70dc73138df38cbe7022fd16635967c8c591a8 GIT binary patch literal 11896 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 le(esr@*hB*4_sqY?Jy;vU*?#d0F>}1uePwr Date: Sat, 27 Feb 2021 12:36:14 +0000 Subject: [PATCH 0122/1416] Set theme specific help files when changing theme --- daemon.py | 11 +++++++---- epicyon.py | 3 ++- theme.py | 21 ++++++++++++++++++++- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/daemon.py b/daemon.py index 7cfc0fc2f..0cfd5a2ca 100644 --- a/daemon.py +++ b/daemon.py @@ -3899,7 +3899,8 @@ class PubServer(BaseHTTPRequestHandler): baseDir: str, httpPrefix: str, domain: str, domainFull: str, onionDomain: str, i2pDomain: str, - debug: bool, allowLocalNetworkAccess: bool) -> None: + debug: bool, allowLocalNetworkAccess: bool, + systemLanguage: str) -> None: """Updates your user profile after editing via the Edit button on the profile screen """ @@ -4289,7 +4290,7 @@ class PubServer(BaseHTTPRequestHandler): if fields.get('themeDropdown'): self.server.themeName = fields['themeDropdown'] setTheme(baseDir, self.server.themeName, domain, - allowLocalNetworkAccess) + allowLocalNetworkAccess, systemLanguage) self.server.textModeBanner = \ getTextModeBanner(self.server.baseDir) self.server.iconsCache = {} @@ -4759,7 +4760,8 @@ class PubServer(BaseHTTPRequestHandler): if currTheme: self.server.themeName = currTheme setTheme(baseDir, currTheme, domain, - self.server.allowLocalNetworkAccess) + self.server.allowLocalNetworkAccess, + systemLanguage) self.server.textModeBanner = \ getTextModeBanner(self.server.baseDir) self.server.iconsCache = {} @@ -13543,7 +13545,8 @@ class PubServer(BaseHTTPRequestHandler): self.server.domainFull, self.server.onionDomain, self.server.i2pDomain, self.server.debug, - self.server.allowLocalNetworkAccess) + self.server.allowLocalNetworkAccess, + self.server.systemLanguage) return if authorized and self.path.endswith('/linksdata'): diff --git a/epicyon.py b/epicyon.py index 5b5d01b8b..ea958dd75 100644 --- a/epicyon.py +++ b/epicyon.py @@ -2325,7 +2325,8 @@ if YTDomain: if '.' in YTDomain: args.YTReplacementDomain = YTDomain -if setTheme(baseDir, themeName, domain, args.allowLocalNetworkAccess): +if setTheme(baseDir, themeName, domain, + args.allowLocalNetworkAccess, args.language): print('Theme set to ' + themeName) if __name__ == "__main__": diff --git a/theme.py b/theme.py index 9a4800380..80de1c30d 100644 --- a/theme.py +++ b/theme.py @@ -50,6 +50,24 @@ def getThemesList(baseDir: str) -> []: return themes +def _copyThemeHelpFiles(baseDir: str, themeName: str, + systemLanguage: str) -> None: + """Copies any theme specific help files from the welcome subdirectory + """ + themeDir = baseDir + '/theme/' + themeName + '/welcome' + if not os.path.isdir(themeDir): + themeDir = baseDir + '/defaultwelcome' + for subdir, dirs, files in os.walk(themeDir): + for helpMarkdownFile in files: + if helpMarkdownFile.endswith('_' + systemLanguage + '.md'): + destHelpMarkdownFile = \ + helpMarkdownFile.replace('_' + systemLanguage + '.md', + '.md') + copyfile(themeDir + '/' + helpMarkdownFile, + baseDir + '/accounts/' + destHelpMarkdownFile) + break + + def _setThemeInConfig(baseDir: str, name: str) -> bool: """Sets the theme with the given name within config.json """ @@ -642,7 +660,7 @@ def _setClearCacheFlag(baseDir: str) -> None: def setTheme(baseDir: str, name: str, domain: str, - allowLocalNetworkAccess: bool) -> bool: + allowLocalNetworkAccess: bool, systemLanguage: str) -> bool: """Sets the theme with the given name as the current theme """ result = False @@ -695,6 +713,7 @@ def setTheme(baseDir: str, name: str, domain: str, else: disableGrayscale(baseDir) + _copyThemeHelpFiles(baseDir, name, systemLanguage) _setThemeInConfig(baseDir, name) _setClearCacheFlag(baseDir) return result From bccb79a03810d70cd542023b057ec85479fe4c84 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 27 Feb 2021 12:40:14 +0000 Subject: [PATCH 0123/1416] Default to english --- theme.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/theme.py b/theme.py index 80de1c30d..60e4e4cf2 100644 --- a/theme.py +++ b/theme.py @@ -54,6 +54,8 @@ def _copyThemeHelpFiles(baseDir: str, themeName: str, systemLanguage: str) -> None: """Copies any theme specific help files from the welcome subdirectory """ + if not systemLanguage: + systemLanguage = 'en' themeDir = baseDir + '/theme/' + themeName + '/welcome' if not os.path.isdir(themeDir): themeDir = baseDir + '/defaultwelcome' From 7ceb609a9b0bb54873b22cc9e26b1923345902f0 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 27 Feb 2021 12:46:57 +0000 Subject: [PATCH 0124/1416] Change terminology --- theme/indymediaclassic/welcome/profile_en.md | 2 ++ theme/indymediamodern/welcome/profile_en.md | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 theme/indymediaclassic/welcome/profile_en.md create mode 100644 theme/indymediamodern/welcome/profile_en.md diff --git a/theme/indymediaclassic/welcome/profile_en.md b/theme/indymediaclassic/welcome/profile_en.md new file mode 100644 index 000000000..21cf17613 --- /dev/null +++ b/theme/indymediaclassic/welcome/profile_en.md @@ -0,0 +1,2 @@ +### Journalist Setup +Select your avatar image and add your name and description. Use a small avatar image (eg. 128x128 pixels) so that it's quick to download. diff --git a/theme/indymediamodern/welcome/profile_en.md b/theme/indymediamodern/welcome/profile_en.md new file mode 100644 index 000000000..21cf17613 --- /dev/null +++ b/theme/indymediamodern/welcome/profile_en.md @@ -0,0 +1,2 @@ +### Journalist Setup +Select your avatar image and add your name and description. Use a small avatar image (eg. 128x128 pixels) so that it's quick to download. From e489f576359e21cf43e00ef2576374e6576ffc85 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 27 Feb 2021 13:18:02 +0000 Subject: [PATCH 0125/1416] Indymedia welcome images --- .../indymediaclassic/helpimages/journalist.jpg | Bin 0 -> 21351 bytes theme/indymediaclassic/welcome/final_en.md | 1 + theme/indymediamodern/helpimages/journalist.jpg | Bin 0 -> 21351 bytes theme/indymediamodern/helpimages/welcome.jpg | Bin 0 -> 11896 bytes theme/indymediamodern/welcome/final_en.md | 1 + 5 files changed, 2 insertions(+) create mode 100644 theme/indymediaclassic/helpimages/journalist.jpg create mode 100644 theme/indymediamodern/helpimages/journalist.jpg create mode 100644 theme/indymediamodern/helpimages/welcome.jpg diff --git a/theme/indymediaclassic/helpimages/journalist.jpg b/theme/indymediaclassic/helpimages/journalist.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a9bdd19b80073947cbfb033c5bc5406ceb5c438f GIT binary patch literal 21351 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 Jhf*Cs|JfftPPG64 literal 0 HcmV?d00001 diff --git a/theme/indymediaclassic/welcome/final_en.md b/theme/indymediaclassic/welcome/final_en.md index 035320ba0..2fd063cff 100644 --- a/theme/indymediaclassic/welcome/final_en.md +++ b/theme/indymediaclassic/welcome/final_en.md @@ -1,3 +1,4 @@ +![Journalist image](/helpimages/journalist.jpg) ### You are now a journalist! Welcome onboard the team. This is a moderated news instance, so please ensure that anything you write is in accordance with our [editorial policy](/terms). diff --git a/theme/indymediamodern/helpimages/journalist.jpg b/theme/indymediamodern/helpimages/journalist.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a9bdd19b80073947cbfb033c5bc5406ceb5c438f GIT binary patch literal 21351 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 Jhf*Cs|JfftPPG64 literal 0 HcmV?d00001 diff --git a/theme/indymediamodern/helpimages/welcome.jpg b/theme/indymediamodern/helpimages/welcome.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3d70dc73138df38cbe7022fd16635967c8c591a8 GIT binary patch literal 11896 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 le(esr@*hB*4_sqY?Jy;vU*?#d0F>}1uePwr Date: Sat, 27 Feb 2021 13:24:24 +0000 Subject: [PATCH 0126/1416] Modern title image --- theme/indymediamodern/helpimages/welcome.jpg | Bin 11896 -> 9781 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/theme/indymediamodern/helpimages/welcome.jpg b/theme/indymediamodern/helpimages/welcome.jpg index 3d70dc73138df38cbe7022fd16635967c8c591a8..145d424a52d2d2eb929fd66db45882ad5bc38b72 100644 GIT binary patch delta 8334 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Ð!2xd)$+t`I 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 From 69e952895237b20ef05c1cdc2f775dd684d9f724 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 27 Feb 2021 13:26:32 +0000 Subject: [PATCH 0127/1416] Italics --- theme/indymediaclassic/welcome/welcome_en.md | 2 +- theme/indymediamodern/welcome/welcome_en.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/theme/indymediaclassic/welcome/welcome_en.md b/theme/indymediaclassic/welcome/welcome_en.md index 05f1e0bba..cc812899e 100644 --- a/theme/indymediaclassic/welcome/welcome_en.md +++ b/theme/indymediaclassic/welcome/welcome_en.md @@ -2,6 +2,6 @@ ### Welcome to INSTANCE This is an ActivityPub server designed for publishing in the Indymedia network. It can run on low power single board computers or old laptops. -Don't complain about the media. Be the media. +Don't complain about the media. *Be the media*. Now, lets get going... diff --git a/theme/indymediamodern/welcome/welcome_en.md b/theme/indymediamodern/welcome/welcome_en.md index 05f1e0bba..cc812899e 100644 --- a/theme/indymediamodern/welcome/welcome_en.md +++ b/theme/indymediamodern/welcome/welcome_en.md @@ -2,6 +2,6 @@ ### Welcome to INSTANCE This is an ActivityPub server designed for publishing in the Indymedia network. It can run on low power single board computers or old laptops. -Don't complain about the media. Be the media. +Don't complain about the media. *Be the media*. Now, lets get going... From dacdeca65a0659338a2b99dc4f1f7630e0ff536f Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 27 Feb 2021 14:23:42 +0000 Subject: [PATCH 0128/1416] Starlight welcome screen background --- theme/starlight/welcome_background.jpg | Bin 0 -> 60339 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 theme/starlight/welcome_background.jpg diff --git a/theme/starlight/welcome_background.jpg b/theme/starlight/welcome_background.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f7a3f5dd0d1d8b57f20f350e5d25ae7e5ffcf7c5 GIT binary patch literal 60339 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 Awg3PC literal 0 HcmV?d00001 From dd22c42600e17b6144ab40d0f5876946a6e0bce4 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 27 Feb 2021 14:39:35 +0000 Subject: [PATCH 0129/1416] Debug --- theme.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/theme.py b/theme.py index 60e4e4cf2..a0864eca9 100644 --- a/theme.py +++ b/theme.py @@ -61,12 +61,15 @@ def _copyThemeHelpFiles(baseDir: str, themeName: str, themeDir = baseDir + '/defaultwelcome' for subdir, dirs, files in os.walk(themeDir): for helpMarkdownFile in files: - if helpMarkdownFile.endswith('_' + systemLanguage + '.md'): - destHelpMarkdownFile = \ - helpMarkdownFile.replace('_' + systemLanguage + '.md', - '.md') - copyfile(themeDir + '/' + helpMarkdownFile, - baseDir + '/accounts/' + destHelpMarkdownFile) + if not helpMarkdownFile.endswith('_' + systemLanguage + '.md'): + continue + destHelpMarkdownFile = \ + helpMarkdownFile.replace('_' + systemLanguage + '.md', '.md') + print('Copying theme help: ' + \ + themeDir + '/' + helpMarkdownFile + ' -> ' + \ + baseDir + '/accounts/' + destHelpMarkdownFile) + copyfile(themeDir + '/' + helpMarkdownFile, + baseDir + '/accounts/' + destHelpMarkdownFile) break From d14ac581f76dd57524ebcdd85ab6ba4cf3718c74 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 27 Feb 2021 14:44:47 +0000 Subject: [PATCH 0130/1416] Prepend welcome --- theme.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/theme.py b/theme.py index a0864eca9..de444a90f 100644 --- a/theme.py +++ b/theme.py @@ -65,9 +65,9 @@ def _copyThemeHelpFiles(baseDir: str, themeName: str, continue destHelpMarkdownFile = \ helpMarkdownFile.replace('_' + systemLanguage + '.md', '.md') - print('Copying theme help: ' + \ - themeDir + '/' + helpMarkdownFile + ' -> ' + \ - baseDir + '/accounts/' + destHelpMarkdownFile) + if destHelpMarkdownFile == 'profile.md' or \ + destHelpMarkdownFile == 'final.md': + destHelpMarkdownFile = 'welcome_' + destHelpMarkdownFile copyfile(themeDir + '/' + helpMarkdownFile, baseDir + '/accounts/' + destHelpMarkdownFile) break From 8315a31a017021dd0005fe9267426bae38100063 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 27 Feb 2021 14:51:32 +0000 Subject: [PATCH 0131/1416] Henge welcome background --- theme/henge/theme.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/theme/henge/theme.json b/theme/henge/theme.json index 4f6fce492..8bcaadad6 100644 --- a/theme/henge/theme.json +++ b/theme/henge/theme.json @@ -4,7 +4,7 @@ "time-color": "grey", "event-color": "white", "login-bg-color": "#567726", - "welcome-bg-color": "#567726", + "welcome-bg-color": "#ccc", "login-fg-color": "black", "welcome-fg-color": "black", "options-bg-color": "black", From 71acc88efdc33456a147f6ef42f4fd2b19dcb9ed Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 27 Feb 2021 15:20:24 +0000 Subject: [PATCH 0132/1416] Hacker header --- theme/hacker/helpimages/welcome.jpg | Bin 15338 -> 32240 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/theme/hacker/helpimages/welcome.jpg b/theme/hacker/helpimages/welcome.jpg index 688320ac4564f68272dec04f966e1759d4875699..0724b04c8632e7d529165f86001a3748681097a3 100644 GIT binary patch literal 32240 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 delta 13919 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 C+I!pp From f161c2e232552e22b183d8026f55d09bd1301a2a Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 27 Feb 2021 17:16:40 +0000 Subject: [PATCH 0133/1416] Hacker title --- theme/hacker/helpimages/welcome.jpg | Bin 32240 -> 37062 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/theme/hacker/helpimages/welcome.jpg b/theme/hacker/helpimages/welcome.jpg index 0724b04c8632e7d529165f86001a3748681097a3..f637e45709edee844334dd982194d3ba46f2c7f0 100644 GIT binary patch literal 37062 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 From d0720a1172eec1f5632aed9604653255b347b42e Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 27 Feb 2021 17:39:28 +0000 Subject: [PATCH 0134/1416] Hacker title --- theme/hacker/helpimages/welcome.jpg | Bin 37062 -> 11502 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/theme/hacker/helpimages/welcome.jpg b/theme/hacker/helpimages/welcome.jpg index f637e45709edee844334dd982194d3ba46f2c7f0..939c7b591acc842934aea9ebaa69f2d2fd110180 100644 GIT binary patch literal 11502 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 Date: Sat, 27 Feb 2021 17:45:31 +0000 Subject: [PATCH 0135/1416] Foreground color --- theme/hacker/theme.json | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/theme/hacker/theme.json b/theme/hacker/theme.json index b4ceed266..910dfc77c 100644 --- a/theme/hacker/theme.json +++ b/theme/hacker/theme.json @@ -18,12 +18,12 @@ "main-bg-color-reply": "#030202", "main-bg-color-report": "#050202", "main-header-color-roles": "#1f192d", - "cw-color": "#00ff00", - "main-fg-color": "#00ff00", - "login-fg-color": "#00ff00", - "welcome-fg-color": "#00ff00", - "options-fg-color": "#00ff00", - "column-left-fg-color": "#00ff00", + "cw-color": "#50a746", + "main-fg-color": "#50a746", + "login-fg-color": "#50a746", + "welcome-fg-color": "#50a746", + "options-fg-color": "#50a746", + "column-left-fg-color": "#50a746", "border-color": "#035103", "main-link-color": "#2fff2f", "main-link-color-hover": "#afff2f", @@ -34,14 +34,14 @@ "options-main-visited-color": "#3c8234", "button-selected": "#063200", "button-background-hover": "#a62200", - "button-text-hover": "#00ff00", + "button-text-hover": "#50a746", "publish-button-background": "#062200", "button-background": "#062200", "button-small-background": "#062200", - "button-text": "#00ff00", - "button-selected-text": "#00ff00", - "publish-button-text": "#00ff00", - "button-small-text": "#00ff00", + "button-text": "#50a746", + "button-selected-text": "#50a746", + "publish-button-text": "#50a746", + "button-small-text": "#50a746", "button-corner-radius": "4px", "timeline-border-radius": "4px", "header-font": "'Bedstead'", @@ -59,8 +59,8 @@ "title-text": "black", "title-background": "darkgreen", "gallery-text-color": "green", - "time-color": "#00ff00", - "place-color": "#00ff00", - "event-color": "#00ff00", + "time-color": "#50a746", + "place-color": "#50a746", + "event-color": "#50a746", "image-corners": "0%" } From af333e35822391f72be50e2b06e33a2fb95ea82e Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 27 Feb 2021 18:29:26 +0000 Subject: [PATCH 0136/1416] Hacker theme images --- theme/hacker/banner.png | Bin 46413 -> 18457 bytes theme/hacker/image.png | Bin 150637 -> 3070 bytes theme/hacker/search_banner.png | Bin 46413 -> 18457 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/theme/hacker/banner.png b/theme/hacker/banner.png index 5d181aa526dcd701d3023ceab3de3fa40caefda0..1230967f447b81fa955df701413b23bd3d6ec99b 100644 GIT binary patch literal 18457 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 M07*qoM6N<$g27QUG5`Po literal 46413 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≥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 diff --git a/theme/hacker/search_banner.png b/theme/hacker/search_banner.png index 5d181aa526dcd701d3023ceab3de3fa40caefda0..1230967f447b81fa955df701413b23bd3d6ec99b 100644 GIT binary patch literal 18457 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 M07*qoM6N<$g27QUG5`Po literal 46413 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≥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 Date: Sat, 27 Feb 2021 18:38:32 +0000 Subject: [PATCH 0137/1416] Hacker theme images --- theme/hacker/banner.png | Bin 18457 -> 17635 bytes theme/hacker/search_banner.png | Bin 18457 -> 17635 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/theme/hacker/banner.png b/theme/hacker/banner.png index 1230967f447b81fa955df701413b23bd3d6ec99b..8abfb9f972e715d69d35afa8eedc657daccb634b 100644 GIT binary patch literal 17635 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 O0000002n{0ssI2)TsDK000zjdQ@0+Qek%> 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 M07*qoM6N<$g27QUG5`Po diff --git a/theme/hacker/search_banner.png b/theme/hacker/search_banner.png index 1230967f447b81fa955df701413b23bd3d6ec99b..8abfb9f972e715d69d35afa8eedc657daccb634b 100644 GIT binary patch literal 17635 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 O0000002n{0ssI2)TsDK000zjdQ@0+Qek%> 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 M07*qoM6N<$g27QUG5`Po From 08eb9c4b39e010683659c022e0953533d6b95351 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 27 Feb 2021 18:47:39 +0000 Subject: [PATCH 0138/1416] Hacker colors --- theme/hacker/theme.json | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/theme/hacker/theme.json b/theme/hacker/theme.json index 910dfc77c..7c2b120dd 100644 --- a/theme/hacker/theme.json +++ b/theme/hacker/theme.json @@ -18,14 +18,14 @@ "main-bg-color-reply": "#030202", "main-bg-color-report": "#050202", "main-header-color-roles": "#1f192d", - "cw-color": "#50a746", - "main-fg-color": "#50a746", - "login-fg-color": "#50a746", - "welcome-fg-color": "#50a746", - "options-fg-color": "#50a746", - "column-left-fg-color": "#50a746", + "cw-color": "#9ad791", + "main-fg-color": "#9ad791", + "login-fg-color": "#9ad791", + "welcome-fg-color": "#9ad791", + "options-fg-color": "#9ad791", + "column-left-fg-color": "#9ad791", "border-color": "#035103", - "main-link-color": "#2fff2f", + "main-link-color": "#9ad791", "main-link-color-hover": "#afff2f", "options-main-link-color": "#2fff2f", "options-main-link-color-hover": "#afff2f", @@ -34,14 +34,14 @@ "options-main-visited-color": "#3c8234", "button-selected": "#063200", "button-background-hover": "#a62200", - "button-text-hover": "#50a746", + "button-text-hover": "#9ad791", "publish-button-background": "#062200", "button-background": "#062200", "button-small-background": "#062200", - "button-text": "#50a746", - "button-selected-text": "#50a746", - "publish-button-text": "#50a746", - "button-small-text": "#50a746", + "button-text": "#9ad791", + "button-selected-text": "#9ad791", + "publish-button-text": "#9ad791", + "button-small-text": "#9ad791", "button-corner-radius": "4px", "timeline-border-radius": "4px", "header-font": "'Bedstead'", @@ -59,8 +59,8 @@ "title-text": "black", "title-background": "darkgreen", "gallery-text-color": "green", - "time-color": "#50a746", - "place-color": "#50a746", - "event-color": "#50a746", + "time-color": "#9ad791", + "place-color": "#9ad791", + "event-color": "#9ad791", "image-corners": "0%" } From 60a00378b2bff6db6c1076b360f775ce50b10d21 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 27 Feb 2021 22:30:16 +0000 Subject: [PATCH 0139/1416] Hacker theme icon color --- theme/hacker/icons/add.png | Bin 3069 -> 1362 bytes theme/hacker/icons/avatar_default.png | Bin 47953 -> 13285 bytes theme/hacker/icons/avatar_news.png | Bin 41899 -> 1953 bytes theme/hacker/icons/bookmark_inactive.png | Bin 976 -> 1392 bytes theme/hacker/icons/calendar.png | Bin 6098 -> 1369 bytes theme/hacker/icons/categoriesrss.png | Bin 1393 -> 1394 bytes theme/hacker/icons/delete.png | Bin 3775 -> 1435 bytes theme/hacker/icons/dm.png | Bin 3310 -> 1445 bytes theme/hacker/icons/download.png | Bin 1973 -> 1408 bytes theme/hacker/icons/edit.png | Bin 2519 -> 1436 bytes theme/hacker/icons/like_inactive.png | Bin 3073 -> 1416 bytes theme/hacker/icons/links.png | Bin 7354 -> 2832 bytes theme/hacker/icons/logorss.png | Bin 7738 -> 1522 bytes theme/hacker/icons/logout.png | Bin 5713 -> 1513 bytes theme/hacker/icons/mute.png | Bin 1026 -> 1446 bytes theme/hacker/icons/newpost.png | Bin 3119 -> 1377 bytes theme/hacker/icons/newswire.png | Bin 8200 -> 1497 bytes theme/hacker/icons/pagedown.png | Bin 2723 -> 1505 bytes theme/hacker/icons/pageup.png | Bin 2693 -> 1498 bytes theme/hacker/icons/prev.png | Bin 3509 -> 1440 bytes theme/hacker/icons/publish.png | Bin 5718 -> 1515 bytes theme/hacker/icons/repeat_inactive.png | Bin 4431 -> 1458 bytes theme/hacker/icons/reply.png | Bin 1411 -> 1410 bytes theme/hacker/icons/scope_blog.png | Bin 5718 -> 1516 bytes theme/hacker/icons/scope_dm.png | Bin 3354 -> 1436 bytes theme/hacker/icons/scope_event.png | Bin 6098 -> 1369 bytes theme/hacker/icons/scope_followers.png | Bin 3496 -> 1431 bytes theme/hacker/icons/scope_public.png | Bin 4250 -> 1461 bytes theme/hacker/icons/scope_question.png | Bin 2750 -> 1418 bytes theme/hacker/icons/scope_reminder.png | Bin 1493 -> 1491 bytes theme/hacker/icons/scope_report.png | Bin 3390 -> 1343 bytes theme/hacker/icons/scope_share.png | Bin 5296 -> 1625 bytes theme/hacker/icons/scope_unlisted.png | Bin 3252 -> 1435 bytes theme/hacker/icons/search.png | Bin 3897 -> 1457 bytes theme/hacker/icons/showhide.png | Bin 3509 -> 1439 bytes 35 files changed, 0 insertions(+), 0 deletions(-) diff --git a/theme/hacker/icons/add.png b/theme/hacker/icons/add.png index c5b008fa18b4ec486638ef80be649d0b75693470..3b1e726c0551881199d6900a8f66e84701ff2f34 100644 GIT binary patch delta 1306 zcmV+#1?Bqv7t#ul7=Hl+0001xr{kRf00Q!QR9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3 z004N}?Ur4Z6*g*i#xG3IA`PSPmgnI-G^sG zGN{xQfrNPoN!(XIGmv$X)ZJH{#d96A1G1dUqe=vp_E*-=pwZ{m1B&_*^f$ ze9|&s8e#C|1b^w*;%|wc0?Q*Kex0y%yZS=p*?rD&zFkcjisq}LVz|}W>dy|@lkCSb zn&DK8ZMTBvvBn1EJ+^qDH7dlQG6N;*RB6)KeWQjH6AuOxW^TZ;Yz{_+8;Fsl)o8Lw zkuDB$jYn9_gde%kj$3xTMvlmxu#^eT2#@@*g}BBx)y`cywuzp*b?>FuL1AF07-{Ip z!-kJC>O`$gnQ7|G)27cd>x0@w^}F^9)aatdn}5_=XAf$y2D94*t?fh?GZ5oMAa08Q z3Yr(Q=#&yKa*J6kjE_PYN$O$~IxS*Am8^J4ptC#$WWauh>ALD6^c-y)C#RSm|Xe= zO&XFE7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx6k5c1aNLh~_a1le0HI!Hs@X9H zsG4P@;xRFkT@?eb5HN^7Od}{UQ=dyF6Yv~g_we!cF3PjK&;2>Nm7K`{pGZ7^%XGsc z-XNaZv~yH6ykH@QG+f>{K$3LaarNK#aS&^S@WL!g`u3bvdndwLx^J$OGrY5j4Dbf!$Oo+jT93p+K+ko2ONKr zTr#;zVB}ap1u7)R5B>+gyEXHF6XR}DCyfdH*jG6g%rH-0H-kk0P>Mkf2frr Q^Z)<=07*qoM6N<$f`Aurg8%>k delta 3050 zcmVr~F00(J$R9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3 z004N}<(FG_B&iNX{~1LOftL^rhv!;7gFF1*5RvJ0mF+6u>c7r#CYXo-agKB(%>3Wq z%lyU1t5_37b1ErWKC#5&E1hhwPdUHN#`AkV@xI0X@5asZhJR-$(1z<@t@rblad~^; zv4(5!$4$QP_w{YNhRy6sm)()f0&%#zN`B)pS0`N z{@=U~Lv`re;)56(KDQ+R@@{*N*4kHq-huq+nIF-A z_I?20*LyttfPZDWF{1O~4JRLie;|HYI6N)#?{5Hk`Dr^3kk`m-&1-ixCJ;@xM_Kbg z=b*m^u*Yy-OI*rV=u%Ba(siBilsWu~b!&ob-6*H&0@$$v^qS6*e+Cu=vWKV9Eo&E2f|!_QGxc7IS^tQ?6WC~147Z1=BbNzsOPD8ikfs+B&5li}^MW$Ky&b88bt zBeUVn+-!?ZFKa9*60U?QX5*e#I@S`YH{{8#vG%SxqnLSc%pAHjnQYq+vjjN^E4uRR^M`-!B(;A z2u9f@faXpVhcI_!1lKNTTa(^ETxx6^Ck&WimrRk-qNk7?t+~+%QJH~9^JO>7lBG}I ze%YE|J@8?>qSh7iX{YqKVlXAZ^$pt;l;I7*K79j#(?aJMaUugtt_fSsv%Sr2zJF`X zXRZ0d+HVu*=wr>`YZ0XiY}k}DBG#}R7XTgU%_;^ zUv{F>1fnm}iZJe1J+`B~tM*k0UO_kmTe)`c^BK1~QtKH^%spIttrF*s-$Yhm?MT-} z;g7r!uimavF+yfu4CC`vF@yS`ihmI$<sUlGwXOY#V+R3tc)~S@E zes5wE&nfJ5Ny?wL3fguB66EHDg*~CKrOm{$t7{|Q4sLBMSrobKKJiXEe1B3eb8ley zPN*S(!h-%DlE&J1&~~!(k%BmHwZ7DqOsjK&to30~O@Q#tbRvU4IsdUelL_<7+*_SgP6ibhN(O0TqS&}EXw^0&f{1Er z*E(>lgG}ljdL|ja@O8k^GJi$Gw4CU+X8&w|Hq{F`t;73VK^GNvCsqTEZbvp@4#azOS<=8Cxn8B| zL;%v3e0U367i=xC(9(de$~juRD(OXQ7$^Lq!M}&JPE6Ih(1sn3T7Nq9T;pNZ?WT_x zcD&+l$Meb*xjiDC*C++-1pl|W_ew#?v%j_O$SiO~<^$CR8wt8Zk%%0rHyOI-XK~8H#K|#NY zp0|58Og2&_@;Gw~c_}Q<_5<<6IgHFW2Bkt64gKAPG8MGg+!{x~JbaEQoWD!I#;Nen z>#R#5?SE*ZlYc&~HU9u)-D9>6s8iGc00D(*LqkwWLqi~Na&Km7Y-Iodc$|HaJxIeq z9K~N-OGPUVEu!L(p*mR*6>-!m6rn<>62R|084ld5RI=Bjg z;0K74qm!bGl=#1-&?3fz<9@um_qclp`0Hh+njK?+s()EVI++l%xfLPwiXi$B!2r4? zX6mz|n1bi{x`&UicX6KOeeTcEqvTBn_ypn^rW+RVI`Pz|rE}gVjLf9x=P&u2Zz8&k+Ro3-rd>W+rMX; z{rvzpQ*w{@(&oqj000JJOGiWiCIDanAjEr$Gn3l{9)IKo784mEHJZ?90007nNklymWMWK`m!Ju9x?Faw}L##+k&VGKhoNs6Wv4NAYr5pq>3ZUhW!#QCX z*MqIC&)$r_b8Sq*O#x<;rwzc^4wDCfHe1T6^?aez%`v$qATg4JRkDTvH1AS&n8@hw zN}YG_qPW%3>ij$aT&Y%PD=V?S{jD*VzS$Au5Yt|>dGf-I?%ZVegmVIhp5DQ$*~f`Wd20qhK(o7fjfhf8sj2M4rJ7GN>gi$A zzkeFGWF-yYkcP`S03fN9x|jd>z39j$XbZasP+{mxi!hB|$DRU8s)+8p`mgVd{1|jX z0FhYIenN&=aZZ3wOasta!Vi)(I($vjweHVOWY!hd%!BRiKy&Y{aJJS4H>?7} z{-c diff --git a/theme/hacker/icons/avatar_default.png b/theme/hacker/icons/avatar_default.png index 66c11c47b79a524c5b475c6aa9ddc75b90fbde97..9c50078f576684c859faf273da2b43c297818095 100644 GIT binary patch literal 13285 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 literal 41899 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

\n' + accessKeysForm += \ + '

' + translate['These access keys may be used'] + \ + '

' accessKeysForm += '
\n' From bdd428439e20348227198985c40fd9da704a3b9c Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 29 Apr 2021 21:16:48 +0100 Subject: [PATCH 0859/1416] At least one post for page down --- webapp_timeline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp_timeline.py b/webapp_timeline.py index df42ebed5..9500ffb6e 100644 --- a/webapp_timeline.py +++ b/webapp_timeline.py @@ -749,7 +749,7 @@ def htmlTimeline(cssCache: {}, defaultTimeline: str, str(itemCtr) + ' ' + str(timelineJson['orderedItems'])) # page down arrow - if itemCtr > 2: + if itemCtr > 0: tlStr += textModeSeparator tlStr += \ '
\n' + \ From 4a2137654fbb57119712e15a13cbb81171ce868c Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 30 Apr 2021 10:17:22 +0100 Subject: [PATCH 0860/1416] More descriptive variable name --- posts.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/posts.py b/posts.py index 12d82a505..ccdd3786c 100644 --- a/posts.py +++ b/posts.py @@ -3103,7 +3103,7 @@ def _createBoxIndexed(recentPostsCache: {}, indexFilename = \ baseDir + '/accounts/' + timelineNickname + '@' + domain + \ '/' + indexBoxName + '.index' - postsCtr = 0 + totalPostsCount = 0 postsAddedToTimeline = 0 if os.path.isfile(indexFilename): with open(indexFilename, 'r') as indexFile: @@ -3153,8 +3153,8 @@ def _createBoxIndexed(recentPostsCache: {}, continue # Skip through any posts previous to the current page - if postsCtr < int((pageNumber - 1) * itemsPerPage): - postsCtr += 1 + if totalPostsCount < int((pageNumber - 1) * itemsPerPage): + totalPostsCount += 1 continue # if this is a full path then remove the directories @@ -3176,7 +3176,7 @@ def _createBoxIndexed(recentPostsCache: {}, if _addPostStringToTimeline(url, boxname, postsInBox, boxActor): - postsCtr += 1 + totalPostsCount += 1 postsAddedToTimeline += 1 continue @@ -3192,7 +3192,7 @@ def _createBoxIndexed(recentPostsCache: {}, if _addPostToTimeline(fullPostFilename, boxname, postsInBox, boxActor): postsAddedToTimeline += 1 - postsCtr += 1 + totalPostsCount += 1 else: if timelineNickname != nickname: # if this is the features timeline @@ -3203,7 +3203,7 @@ def _createBoxIndexed(recentPostsCache: {}, if _addPostToTimeline(fullPostFilename, boxname, postsInBox, boxActor): postsAddedToTimeline += 1 - postsCtr += 1 + totalPostsCount += 1 else: print('WARN: features timeline. ' + 'Unable to locate post ' + postUrl) @@ -3211,13 +3211,13 @@ def _createBoxIndexed(recentPostsCache: {}, print('WARN: Unable to locate post ' + postUrl + ' nickname ' + nickname) - if postsCtr < 3: + if totalPostsCount < 3: print('Posts added to json timeline ' + boxname + ': ' + str(postsAddedToTimeline)) # Generate first and last entries within header - if postsCtr > 0: - lastPage = int(postsCtr / itemsPerPage) + if totalPostsCount > 0: + lastPage = int(totalPostsCount / itemsPerPage) if lastPage < 1: lastPage = 1 boxHeader['last'] = \ From 3af7fbeda5aa2784cbadd3992a08dd071e5dced4 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 30 Apr 2021 10:24:56 +0100 Subject: [PATCH 0861/1416] Debug for timeline --- posts.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/posts.py b/posts.py index ccdd3786c..719390761 100644 --- a/posts.py +++ b/posts.py @@ -3193,6 +3193,10 @@ def _createBoxIndexed(recentPostsCache: {}, postsInBox, boxActor): postsAddedToTimeline += 1 totalPostsCount += 1 + else: + print('WARN: Unable to add post ' + postUrl + + ' nickname ' + nickname + + ' timeline ' + boxname) else: if timelineNickname != nickname: # if this is the features timeline @@ -3204,6 +3208,10 @@ def _createBoxIndexed(recentPostsCache: {}, postsInBox, boxActor): postsAddedToTimeline += 1 totalPostsCount += 1 + else: + print('WARN: Unable to add features post ' + + postUrl + ' nickname ' + nickname + + ' timeline ' + boxname) else: print('WARN: features timeline. ' + 'Unable to locate post ' + postUrl) From 6bb57f11f557c74d15b87ee14f7ea6327bdf27e8 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 30 Apr 2021 10:48:39 +0100 Subject: [PATCH 0862/1416] Tidying --- posts.py | 45 ++++++++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/posts.py b/posts.py index 719390761..38fc9c00c 100644 --- a/posts.py +++ b/posts.py @@ -3036,6 +3036,34 @@ def _addPostToTimeline(filePath: str, boxname: str, return False +def _removePostAttributes(postJsonObject: {}, authorized: bool) -> bool: + """ Don't show likes, replies, bookmarks, DMs or shares (announces) to + unauthorized viewers. This makes the timeline less useful to + marketers and other surveillance-oriented organizations. + Returns False if this is a private post + """ + if authorized: + return True + if not postJsonObject.get('object'): + return True + if not isinstance(postJsonObject['object'], dict): + return True + # If it's not a public post then just don't show it + if not isPublicPost(postJsonObject): + return False + # clear the likes + if postJsonObject['object'].get('likes'): + postJsonObject['object']['likes'] = {'items': []} + # remove other collections + removeCollections = ( + 'replies', 'shares', 'bookmarks', 'ignores' + ) + for removeName in removeCollections: + if postJsonObject['object'].get(removeName): + postJsonObject['object'][removeName] = {} + return True + + def _createBoxIndexed(recentPostsCache: {}, session, baseDir: str, boxname: str, nickname: str, domain: str, port: int, httpPrefix: str, @@ -3266,21 +3294,8 @@ def _createBoxIndexed(recentPostsCache: {}, # created by individualPostAsHtml p['hasReplies'] = hasReplies - # Don't show likes, replies, bookmarks, DMs or shares (announces) to - # unauthorized viewers - if not authorized: - if p.get('object'): - if isinstance(p['object'], dict): - if not isPublicPost(p): - continue - if p['object'].get('likes'): - p['object']['likes'] = {'items': []} - removeCollections = { - 'replies', 'shares', 'bookmarks', 'ignores' - } - for removeName in removeCollections: - if p['object'].get(removeName): - p['object'][removeName] = {} + if not _removePostAttributes(p, authorized): + continue boxItems['orderedItems'].append(p) From aed2713c5cf8ce8b12ec15859af4f1a5d4ec37ad Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 30 Apr 2021 12:45:46 +0100 Subject: [PATCH 0863/1416] Test for removing post interactions --- daemon.py | 31 +++---------------------------- posts.py | 40 ++++++++++++++++++++++++---------------- tests.py | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 44 deletions(-) diff --git a/daemon.py b/daemon.py index 668ad4236..ad0a7fee9 100644 --- a/daemon.py +++ b/daemon.py @@ -67,6 +67,7 @@ from person import removeAccount from person import canRemovePost from person import personSnooze from person import personUnsnooze +from posts import removePostInteractions from posts import outboxMessageCreateWrap from posts import getPinnedPostAsJson from posts import pinPost @@ -460,32 +461,6 @@ class PubServer(BaseHTTPRequestHandler): else: print('ERROR: unable to create vote') - def _removePostInteractions(self, postJsonObject: {}) -> None: - """Removes potentially sensitive interactions from a post - This is the type of thing which would be of interest to marketers - or of saleable value to them. eg. Knowing who likes who or what. - """ - if postJsonObject.get('likes'): - postJsonObject['likes'] = {'items': []} - - removeCollections = ( - 'shares', 'replies', 'bookmarks', 'ignores' - ) - for removeName in removeCollections: - if postJsonObject.get(removeName): - postJsonObject[removeName] = {} - - if not postJsonObject.get('object'): - return - if not isinstance(postJsonObject['object'], dict): - return - if postJsonObject['object'].get('likes'): - postJsonObject['object']['likes'] = {'items': []} - - for removeName in removeCollections: - if postJsonObject['object'].get(removeName): - postJsonObject['object'][removeName] = {} - def _requestHTTP(self) -> bool: """Should a http response be given? """ @@ -7676,7 +7651,7 @@ class PubServer(BaseHTTPRequestHandler): self._404() self.server.GETbusy = False return True - self._removePostInteractions(pjo) + removePostInteractions(pjo, True) if self._requestHTTP(): recentPostsCache = \ self.server.recentPostsCache @@ -7803,7 +7778,7 @@ class PubServer(BaseHTTPRequestHandler): self._404() self.server.GETbusy = False return True - self._removePostInteractions(pjo) + removePostInteractions(pjo, True) if self._requestHTTP(): recentPostsCache = \ diff --git a/posts.py b/posts.py index 38fc9c00c..2d85445d6 100644 --- a/posts.py +++ b/posts.py @@ -3036,31 +3036,38 @@ def _addPostToTimeline(filePath: str, boxname: str, return False -def _removePostAttributes(postJsonObject: {}, authorized: bool) -> bool: +def removePostInteractions(postJsonObject: {}, force: bool) -> bool: """ Don't show likes, replies, bookmarks, DMs or shares (announces) to unauthorized viewers. This makes the timeline less useful to marketers and other surveillance-oriented organizations. Returns False if this is a private post """ - if authorized: - return True - if not postJsonObject.get('object'): - return True - if not isinstance(postJsonObject['object'], dict): - return True - # If it's not a public post then just don't show it - if not isPublicPost(postJsonObject): - return False + hasObject = False + if postJsonObject.get('object'): + if isinstance(postJsonObject['object'], dict): + hasObject = True + if hasObject: + postObj = postJsonObject['object'] + if not force: + # If not authorized and it's a private post + # then just don't show it within timelines + if not isPublicPost(postObj): + return False + else: + postObj = postJsonObject + # clear the likes - if postJsonObject['object'].get('likes'): - postJsonObject['object']['likes'] = {'items': []} + if postObj.get('likes'): + postObj['likes'] = { + 'items': [] + } # remove other collections removeCollections = ( 'replies', 'shares', 'bookmarks', 'ignores' ) for removeName in removeCollections: - if postJsonObject['object'].get(removeName): - postJsonObject['object'][removeName] = {} + if postObj.get(removeName): + postObj[removeName] = {} return True @@ -3294,8 +3301,9 @@ def _createBoxIndexed(recentPostsCache: {}, # created by individualPostAsHtml p['hasReplies'] = hasReplies - if not _removePostAttributes(p, authorized): - continue + if not authorized: + if not removePostInteractions(p, False): + continue boxItems['orderedItems'].append(p) diff --git a/tests.py b/tests.py index ddbe4f247..9c9213ce4 100644 --- a/tests.py +++ b/tests.py @@ -21,6 +21,7 @@ from cache import getPersonFromCache from threads import threadWithTrace from daemon import runDaemon from session import createSession +from posts import removePostInteractions from posts import getMentionedPeople from posts import validContentWarning from posts import deleteAllPosts @@ -3591,9 +3592,42 @@ def testUpdateActor(): shutil.rmtree(baseDir + '/.tests') +def testRemovePostInteractions() -> None: + print('testRemovePostInteractions') + postJsonObject = { + "type": "Create", + "object": { + "to": ["#Public"], + "likes": { + "items": ["a", "b", "c"] + }, + "replies": { + "replyStuff": ["a", "b", "c"] + }, + "shares": { + "sharesStuff": ["a", "b", "c"] + }, + "bookmarks": { + "bookmarksStuff": ["a", "b", "c"] + }, + "ignores": { + "ignoresStuff": ["a", "b", "c"] + } + } + } + removePostInteractions(postJsonObject, True) + assert postJsonObject['object']['likes']['items'] == [] + assert postJsonObject['object']['replies'] == {} + assert postJsonObject['object']['shares'] == {} + assert postJsonObject['object']['bookmarks'] == {} + assert postJsonObject['object']['ignores'] == {} + assert not removePostInteractions(postJsonObject, False) + + def runAllTests(): print('Running tests...') testFunctions() + testRemovePostInteractions() testExtractPGPPublicKey() testEmojiImages() testCamelCaseSplit() From 4826f234cceb716f87e6306d2685e5d3d9dcbc51 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 30 Apr 2021 14:24:33 +0100 Subject: [PATCH 0864/1416] Tidying of newswire voting logic --- posts.py | 95 ++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 58 insertions(+), 37 deletions(-) diff --git a/posts.py b/posts.py index 2d85445d6..e54802509 100644 --- a/posts.py +++ b/posts.py @@ -3071,6 +3071,57 @@ def removePostInteractions(postJsonObject: {}, force: bool) -> bool: return True +def _passedNewswireVoting(newswireVotesThreshold: int, + baseDir: str, domain: str, + postFilename: str, + positiveVoting: bool, + votingTimeMins: int) -> bool: + """Returns true if the post has passed through newswire voting + """ + # apply votes within this timeline + if newswireVotesThreshold <= 0: + return True + # note that the presence of an arrival file also indicates + # that this post is moderated + arrivalDate = \ + locateNewsArrival(baseDir, domain, postFilename) + if not arrivalDate: + return True + # how long has elapsed since this post arrived? + currDate = datetime.datetime.utcnow() + timeDiffMins = \ + int((currDate - arrivalDate).total_seconds() / 60) + # has the voting time elapsed? + if timeDiffMins < votingTimeMins: + # voting is still happening, so don't add this + # post to the timeline + return False + # if there a votes file for this post? + votesFilename = \ + locateNewsVotes(baseDir, domain, postFilename) + if not votesFilename: + return True + # load the votes file and count the votes + votesJson = loadJson(votesFilename, 0, 2) + if not votesJson: + return True + if not positiveVoting: + if votesOnNewswireItem(votesJson) >= \ + newswireVotesThreshold: + # Too many veto votes. + # Continue without incrementing + # the posts counter + return False + else: + if votesOnNewswireItem < \ + newswireVotesThreshold: + # Not enough votes. + # Continue without incrementing + # the posts counter + return False + return True + + def _createBoxIndexed(recentPostsCache: {}, session, baseDir: str, boxname: str, nickname: str, domain: str, port: int, httpPrefix: str, @@ -3149,43 +3200,13 @@ def _createBoxIndexed(recentPostsCache: {}, if not postFilename: break - # apply votes within this timeline - if newswireVotesThreshold > 0: - # note that the presence of an arrival file also indicates - # that this post is moderated - arrivalDate = \ - locateNewsArrival(baseDir, domain, postFilename) - if arrivalDate: - # how long has elapsed since this post arrived? - currDate = datetime.datetime.utcnow() - timeDiffMins = \ - int((currDate - arrivalDate).total_seconds() / 60) - # has the voting time elapsed? - if timeDiffMins < votingTimeMins: - # voting is still happening, so don't add this - # post to the timeline - continue - # if there a votes file for this post? - votesFilename = \ - locateNewsVotes(baseDir, domain, postFilename) - if votesFilename: - # load the votes file and count the votes - votesJson = loadJson(votesFilename, 0, 2) - if votesJson: - if not positiveVoting: - if votesOnNewswireItem(votesJson) >= \ - newswireVotesThreshold: - # Too many veto votes. - # Continue without incrementing - # the posts counter - continue - else: - if votesOnNewswireItem < \ - newswireVotesThreshold: - # Not enough votes. - # Continue without incrementing - # the posts counter - continue + # Has this post passed through the newswire voting stage? + if not _passedNewswireVoting(newswireVotesThreshold, + baseDir, domain, + postFilename, + positiveVoting, + votingTimeMins): + continue # Skip through any posts previous to the current page if totalPostsCount < int((pageNumber - 1) * itemsPerPage): From 7fd3b86b98feae3a51bf1a096ad89fb9065acda1 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 30 Apr 2021 16:14:40 +0100 Subject: [PATCH 0865/1416] Create bookmark posts --- webapp_post.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/webapp_post.py b/webapp_post.py index 4b6fdfba3..466ad63db 100644 --- a/webapp_post.py +++ b/webapp_post.py @@ -1262,11 +1262,6 @@ def individualPostAsHtml(allowDownloads: bool, avatarImageInPost = \ '
' + avatarLink + '
\n' - # don't create new html within the bookmarks timeline - # it should already have been created for the inbox - if boxName == 'tlbookmarks' or boxName == 'bookmarks': - return '' - timelinePostBookmark = removeIdEnding(postJsonObject['id']) timelinePostBookmark = timelinePostBookmark.replace('://', '-') timelinePostBookmark = timelinePostBookmark.replace('/', '-') From 4cd6710ca9c9c1ec7d7b81d678c8c8bbb1ba50fc Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 1 May 2021 12:59:33 +0100 Subject: [PATCH 0866/1416] Update default categories --- defaultcategories/en.xml | 794 ++++++++++++++++++++------------------- 1 file changed, 409 insertions(+), 385 deletions(-) diff --git a/defaultcategories/en.xml b/defaultcategories/en.xml index 5ad67f407..a3daa9220 100644 --- a/defaultcategories/en.xml +++ b/defaultcategories/en.xml @@ -4,579 +4,603 @@ #categories retro - retrocomputer A500 atarist commodore teletext Retromeme matariki floppy 8bit atari atari800 trs80 communication floppydisk retrocomputing C64 ansi plan9 80s microcomputing communications omm retrogaming z80 8bitdo retro atari800xl retropie amiga bbcmicro microcomputer bbsing + retrocomputer kommunalwahl 90sretro A500 CreativeCommons atarist vax retroarch commodore teletext Retromeme matariki floppy recommendation 8bit cassette atari atari800 trs80 communication floppydisk retrocomputing C64 bbs ansi plan9 80s microcomputing kommunikation vaxvms retroarcade zdfretro cassette_tapes omm retrogaming z80 8bitdo retro atari800xl retropie commodore64 cassettetapes retrogame amiga bbcmicro microcomputer bbsing commercial - Sun, 07 Mar 2021 20:25:51 UT - - - sport - billiard darts swim motorsport snooker marathon hockey bouldering diving baseball Millwall mma mammal sailing athletics nook dumpsterdiving skating skiing sport climbing football combatsports - - Sun, 07 Mar 2021 20:25:51 UT - - - events - neverforget TuesdayVibe award OONIbday waybackwednesday fridayfilm IndigenousPeoplesDay5 notifications solo throwbackthursday valentinesday adventskalender live Day deepthoughts thingaday screenshotsaturday warmingup thursdaythoughts hackathons thursdaymorning throwback animalsweatersunday TooMuchScreenTime beethoven250thbirthday valentine humanrightsday followfriday wednesdaythought afediversechristmas whydopeopledoshitlikethis wednesdaymotivation cccamp19 lovewhereyoulive PostLikeYouThinkACrabWouldSunday showerthoughts animal beethoven anarchymonday Verkiezingsfestival 100DaysToOffload 0day hackathon ff holiday ipv4flagday christmas livecoding weeknotes LINMOBlive week mothersday concert festival FridayFolklore screenshottuesday animals VerkiezingsfestivalBIJ1 kdenlive dontstarve onthisday insideoutsockday livestream BowieDay morningcrew tzag sunday weekendvibes screenshotsunday cree VerseThursday liverpool waitangiday adayinthelife day ccc InternationalCheetahDay interestingtimes sideprojectsunday birthday sixonsaturday wordoftheday christmaslights meetup FathersDay kidsthesedays - - Sun, 07 Mar 2021 20:25:51 UT - - - politics - hate TakeOurPowerBack redessociais trump Anarchy cia alwaysantifascist sabotage qtibpoc community wageslavery immigration dissent liberation laws fascism farmersrprotest techtuesday skyofmywindow techthursday aws freedomofspeech anarchist prochoice freeexpression RacialHealing fascisme humanrights crime leftists Socialism ukpol FreeKeithLamar Antifascisme copwatch capitalismkills petition BorisJohnson meteorología freedom techdirt ontologicalanarchy union abolitionnow anarchism DefundThePolice earthship repression technews meto legal polizeigewalt dannenröderwald smalltech police nzpolitics greenhousegas antifascists oilwars kommunismus rightorepair bjp ThirdRunway multi testing hierarchy election republicans opinie diversity solidarity techwear sociaalDarwinisme sky_of_my_window mybodymychoice generalstrike fuckBiden neoliberal antipolitics abolition digitalfreedom mayday again hatespeech fascists LateStageOfCapitalism stopchasseacourre ciencia smashturkishfascism afropessimism burntheprisons cyberlaw peerproduction corporations iww freeassange commons choice Riot corporatewatch wageslave uspol frontex communism RemoveThePolice makecapitalismhistory abolishpolice Immigration biometric neoliberalism NeverTrustSimone socialecology wald wroclawskierewolucjonistki MutualAid capitalism technology test prisons wealth conspiracytheories corporatecrime DirectAction communist daretocare KeirStarmer taoteching anarchismus politiikka retrotechnology politics inclusivity government HeroesResist brightgreen poc anarchisme feminist DominicCummings nzpol Bookchin ClemencyNow Inauguration2021 arran techthoughts brexit totalitarianism privatisation TyskySour Labour nonprofitindustrialcomplex death LabourLeaks freethemall green neoliberaal BAME decolonizeyourmind alternative privilege antikapitalisme legalcounsel AbolishPrisonsAbolishPolice surfaceworldblows ecofascism opentechnologyfund popularitycontest SocietalChange facialrecognition cotech corruption hypocrisy anarchy Feminism propaganda dcc endsars celebratingfreedom decolonization digitalrights feminism Lhub HightechProblems problem pentesting polizei neo democracy anarchistki Govts xp powerpolitics 18Source censorshipBook radicaltech saytheirnames witchesagainstwhitesupremacy conspiracy anarchistbookclub redandanarchistskinheads corporate radicaldemocracy PritiPatel oiseau latestagecapitalism racist cancelculture MexicanRevolution elections RussellMaroonShoatz LhubSocial methods commonspub sea white prisoners warrants policebrutality alternativeto techshit borisjohnson Anarchist press Anarchism mutuality whitehouse freedomofexpression censorship CancelCulture decolonize HanauWarKeinEinzelfall keinmenschistillegal emmet decenterwhiteness blackandwhite Biden ChineseAppBan cooperative modi antifa law chip deathtoamerica manipulation ParticipatoryCultureFoundation firetotheprisons consumer britpol financial Capitalism surveillancecapitalism leftist Revolution ukpolitics mdcommunity glenngreenwald JeremyCorbyn blacklivesmatter FreeAlabamaMovement Anarchismus mononeon rentstrike dsa lawandorder migration neoist mutualaid capital multipleexposure humanetechnology AbolishPrison solidaritynotcharity anarchists fascist righttochoice socialcoop apocalypseworld DefundSurveillanceCapitalism platformcapitalism decolonizeconservation anarchistprisoners whistleblowers polizeiproblem UniversalBasicServices fuckcapitalism speech uselection IDPol Antifa deathtofascism lesanarchistes Slavetrade met democracia consumerism ourstreets extremist freespeech kapital neorodiversiteit refugees riot BernieSanders acab ecology SurveillanceCapitalism antifascism freewestpapua hambacherwald sunnytech espressif tech - - Sun, 07 Mar 2021 20:25:51 UT - - - gafam - zuckerberg caringissharing ads apple antitrust SpringerEnteignen deletewhatsapp GoogleDown AppleSearch bankruptBezos googlesearch mycologists youtube Goggle twitterkurds chromebook headset ffs facebook interoperability amazon farcebook boycottinstagram deletewhatsappday amazonring Gafam googleplus soldering degooglisation siri Facebook LeiharbeitAbschaffen advertising monopolies adtech fuckgoogle plottertwitter microsoft dtm twitter skype azure chrome hildebrandt corporateGiant uitkeringen youtubedl degoogled Google youtubers google gis walledgarden GAFCAM dt dotcoms deleteyoutube datafarms Instagram walledgardens agistri offseting appleii fascistbook FuckGoogle degoogle fuschia appleiie deleteinstagram ungoogled ring stopgoogle earrings affordances googledown gafam inspiring killedbygoogle fuckoffgoogle deletefacebook fuckoffgoogleandco office365 turingpi instagram playstore synergistic bigtech whatsapp mytwitteranniversary deleteamazon bluesky - - Sun, 07 Mar 2021 20:25:51 UT - - - people - Melissa harold paul Zachary markdown danielle dylan scott Barbara Kenneth theresa Denise Jesse Adam justin katherine judith Karen Patricia russell juan diane Rebecca donna olivia peter William denise Betty evelyn Christina brittany Jennifer Gregory Wayne Andrychów ethan Ralph Peter americalatina jean laura betty nathan margaret Bryan Virginia Jose Rose eric james david Joshua christine Billy CapitolRiot natalie daniel Jonathan Michael susan George johnny Lauren christina Amy kevin Natalie kenneth noahkathryn Lawrence aaron gregory Amber alexa Robert Edward Patrick Rachel bruce dennis Kayla frank Diane Donna Jack Paul Janice Brenda alexis timothy vincent Alice sarah amy Daniel jeff charlotte carolyn Emma Kyle Sean emily linda Olivia Eugene Donald janet ryan stdavids RichardDWolff bryan Hannah anna doctorow Catherine Alexander Christopher bob doris Anthony Jean diana Beverly frances Sarah margaretthatcher Jordan Anna Ethan Amanda jeremy donald mark matthew julie stephanie Jerry Diana David Linda adam richard henry Isabella elizabeth steven jessica Walter jeffrey Kevin Justin grace PeterGelderloos brandon mary jamesbaldwin sharon nicholas Benjamin amanda Emily Ruth heather albert Julie nancy stephen Cannabis James Megan Raymond michelle Nancy Frances Henry andrew Jessica julia Dorothy LoganGrendel Jason Charles Danielle Brandon jose noamchomsky virginia beverly ronald Bob madison Helen MarkoBogoievski Jeff helen Sophia larry dorothy Dennis monbiot Nicholas Frank jack Stephen Janet Alexis Pamela Jacqueline Dylan roy brenda jesse Roger Jeffrey Brittany Shirley Nathan christopher Carol Susan jason Philip Logan sandra jacob rose isabella Cynthia Joan jackieweaver aldoushuxley Maria martha Randy carl kyle karen raymond alice jerry carol Victoria Steven Douglas Lisa Julia joshua jacqueline Ashley eugene Bruce Albert Austin thomas Evelyn Gary Scott kimberly lawrence jennifer Russell austin logan Laura Chris Teresa Aaron Keith brian marktwain maryanning maria Joseph Andrew Vincent Katherine Joyce lauren Ryan amber alan ralph megan Kathleen sophia Cheryl abigail cynthia john Alan Debra QuickSummary arthurgloria Christine marilyn anthony chris Elizabeth sean Louis Larry christian deborah billy Abigail joesara keith Jeremy zachary ruth Grace teresa Doris benjamin Willie george barbara Charlotte philip randy Margaret Heather Bradley Jacob shirley pamela Matthew Nicole joan judy Kelly Brian melissa Sandra joseph andrea shamelessselfplug Joe Sara robert aaronswartz Bobby emma willie william angela SachaChua samuel tyler Thomas John kroger patricia ashley bobby kelly hannah Carolyn Ann CrimsonRosella gary wayne Marilyn Deborah rms Sharon gare Mary Samuel Mark walter rebecca Madison Juan lisa cheryl janice Christian gerald Timothy roger edward bradley Gerald patrickrachel framalang Kimberly Gabriel Marie PeterHoffmann louis kathleen Arthur Gloria terry Richard jonathan Harold Roy samantha Carl chalice Eric relationships nicole Andrea Judith Terry Stephanie Johnny Angela Noah Kathryn Ronald AskVanta Michelle Theresa gabrielmarie Samantha Judy michael charles Tyler DouglasPFry kayla catherinealexander Martha debra joyce - - Sun, 07 Mar 2021 20:25:51 UT - - - activitypub - followerpower FederatedSocialMedia Fediverse activitypub activertypub pleroma losttoot Rss2Fedi PeerTube devices gofed pixelfedlabs homelab fediblock fediverso lazyfedi federation instances fedilab pixiv mastotips toot fedilabfeature mastodev pixel mastodontips catsofthefediverse mastotip wallaby friendica mastodontip hiveway mastodonart mast megapixels gardenersofmastodon askthefediverse misskey collaboraoffice BlackFedi joinmastodon siskin socialhub followers fediart blocking Pixelfed contentwarnings pixelfed labournettv fediverseplaysjackbox mapeocolaborativo fedihive fedidb block FediMemories Feditip fablab collabathon Fediseminar onlyfedi socialcg sponsorblock tusky TLSmastery contentwarning peertubers imagedescription joinpeertube feditips fedizens Mastodon following epicyon afediversechat peertubeadmin leylableibt collaboration mastomagic YearOfTheFediverse dev fediadmin mastodonhost mond pixeldev timeline socialmedia wedistribute fosstodon instanceblock softwaredevelopment mastodonmonday collaborative isolategab greenmastodon fedireads PeertubeMastodonHost AskFediverse Bookwyrm federated socialhome greenfediverse microblocks fedivers MastodonMondays fediverse imagedescriptions Fedilab mastoadmin smithereen hackerstown blabber FediverseFutures mastodon developingcountries fedi fediplay peertube adblock mastomind lab BlackMastadon lazyfediverse mobilizon lazy gemifedi - - Sun, 07 Mar 2021 20:25:51 UT - - - programming - Easer cpp digitalpreservation programming css objects Python system digitaldivide digitalisierung FrancisBacon2020 dracut gitea mixers webdev proofing gui digital release ada schutzstreifen pypi proofofwork node rustlang ocaml program DigitalSouveräneSchule request_reaction sqlite guile nim uptronics hypocritcal profiles typescript forums vscode publiccode computerscience hackers guidelines vieprivée early adventofcode cgit CommonJS scripting warn git proof ui nocode solid nodejs systemchange trevornoah zinccoop tailwindcss guix raku fedidev c sourcecode publiekecode framaforms WendyLPatrick grep django gmic zim sackthelot gitportal gitlab crusty decoder readability parrot relevance_P1Y kingparrot Leiharbeit programmer trunk haskell OpenSourceHardware Tarifvertrag esm unicode development gerrit frgmntscnr github digitalmarketsact freecodecamp openrc tuskydev threema html5 algorithms PythonJob lisp digitaldefenders forge pleaseshare HirsuteHippo resnetting fourtwenty rakudev adaptation developers libraries drivers animation freecode forgefed javascript fragment cpm code elisp commands patterns eq ECMAScriptModules html rakulang portal terminal rust lowcode request spiritbomb r dramasystem go digitalaudioworkstation esbuild golang clojurescript ruby contractpatch deceptionpatterns obsolescence_programmée computers developer racket forum bugreport mercurial python fontforge indiedev kabelfernsehen alternatives OpenSource Scheibenwischer - - Sun, 07 Mar 2021 20:25:51 UT - - - nature - hiking RedNeckedWallaby reforestation wat marsupial StormBella insect morning trees lichen badger light gecko birds nature teamcapy frogs snow sunrise hambacherforest forestfinance leopardgecko moutains coldwater inaturalist sunset forest australianwildlife capybara goodmorning forestation enlightenment natur deforestation natural birdsarentreal morningwalk insects wildlife afforestation northernlights RainforestAlliance amphibians - - Sun, 07 Mar 2021 20:25:51 UT - - - writing - blog tootfic authors poem cutupmethod pdf blogPages shortstory magazine smallstories blogging smallpoems sciencefiction writing proverbs blogs noblogo otf playwright hedgedoc microfiction interactivestorytelling westernjournal quote icanhazpdf WriteFreely storytelling goodread goodreads creativewriting horror limerick journals zineswap zines shortstories journalists journal poetry - - Sun, 07 Mar 2021 20:25:51 UT - - - gardening - BlagueDeCodeur sporespondence blockade inde mastogarden kinder independant communitygardening deno composting cabbage bundeswehr opensourceseeds onions bordeaux datenschleuder florespondence garden thyme horticulture DailyFlowers acu kinderbijslag permaculture papuamerdeka lag CompanionPlanting gardens independence flowers kale gardening plants devilslettuce fahrräder gardenersworld golden toeslagenaffaire seeds Opensourcegarden - - Sun, 07 Mar 2021 20:25:51 UT - - - hardware - plugandplay purism opennic restauration solarpower PersonalComputer cyberdeck PineCUBE tex keyboards electron screenless homebrewcomputing FarmersTractorRally pinebook modem lowtech datenschutz industrial analogcomputing TrueDelta keyboard screenprinting Pinecil pocketchip oshw ArmWorkstation hardwarehacking laptops electronics teamdatenschutz charm printmaker deck modular larp cybredeck computing laptop solarpunk recycling repairability theatrelighting lenovo fairelectronics librem MacBookProService fuse date ibm 3dprinting electro MechcanicalKeyboards hardware retrohardware pinetab openhardware raspberrypi 3dprinter barcode Quartz64 PlanetComputer jtag pinetime screens pinebookpro 3d PinebookPro 3dprint Handprint modemmanager keyboardio mechanicalkeyboard PineTalk arm ipad FireAlarms PinePower paperComputer amd openpower devopa thinkpad iot repairable raspberrypi4 print analog electronic - - Sun, 07 Mar 2021 20:25:51 UT - - - internet - linkeddata decentralised immersiveweb dotcons i2p sceptic earlyinternet spam firefox redecentralize decentral buster wikipedia rtmp dataprotection decentralization inclusiónsocial decentralize w3c dotConism internetaccess geminispace selfhosted piratenpartij maille meta torrent mailab k9mail data socialism sitejs anticolonial worldbusterssocialclub publicserviceinternet centralisation internetarchaeology WordPress darkages self saferinternetday contentmoderation distributed mydata decentralizedweb mailman router protection rne dataretention bigdata routeros selfhosting communityhosting brave icann selfsustaining hosting discourse weblate PeerToPeer dns openstandards conceptmap nojs ejabberd oauth tic hypercore CDNsAreEvil meshtastic protonmail TubEdu standards yourdataisyourdata internetfreedom gemini webui InternetCrimeFamily wlan internetBanking SmallWeb coopcloud cw internetshutdown godotengine cdn liberapay distributedcoop xmpp semanticweb identicurse socialnetwork selfie website SaferInternetDay content splinternet participation highavailability webstandards mapa mindmapping domains ntp cloudfront socialnetworks metadata disconnect Meme database proton disco cloudfirewall descentralizare icmp videocast jabber cleanuptheweb webbrowsers decentralized wiki cloudron browserextensions ssb darknet cookies Qute darkweb netcat webInstaller map Reddit server browser cloudy IPFS p2p social antisocial tiddlywiki www opendata ilovewikipedia web WebsiteStatus netshutdowns twitch im 9front theserverroom Watomatic datafree domain OpenStreetMap geminiprotocol statistics pirate datacracy filesharing rss openstreetmap ipns mozilla voicemail Nyxt yacy debloattheweb crosspost mail i2pd ipfs internetradio browsers wikidata selfpub decentralizeit ballpointpen netscape mixcloud gmail openculture letthenetwork cyberspace SwitchToXmpp messaging selfies offthegrid enxeñeríasocial cloud ddg internet moderation decentralisation metaverse fox ssbroom serverMeddling missingmaps bravesearch sneakernet NatureNeedsJustice internetarchive godot dweb kmail js mindmap dark beakerbrowser notetoself NetShutdown enigmail onlineharms dot Internet descentralizarea thepiratebay ftp internetshutdowns fixtheweb lazyweb socialweb colonial socialists ebay mozillahubs instantmessaging interoperabilitate webmention Justice4MohamudHassan - - Sun, 07 Mar 2021 20:25:51 UT - - - science - engineering math epidemiology ethnology womeninstem archeology botany STEM biodiversity linguistic anthro supercollider nextgeneration zoology climatology dna geography physics archaeologist generalstreik geology generationidentitaire stemwijzer bioengineering botanical dawkins ineigenersache holo graphTheory meterology regenerative biotech psychology biology generation gene chemistry paleontology oceanography stem nextgenerationinternet biomedical anthropology - - Sun, 07 Mar 2021 20:25:51 UT - - - photos - smartphonephotography nikon 90mm photography wildlifephotography photo photogrpahy tokyocameraclub nikond90 photos macrophotography photographie camera macropod cameras fossphotography myphoto naturephotography picture macro streetphotography photoreference pictures - - Sun, 07 Mar 2021 20:25:51 UT - - - history - musichistory heirloom monarchs holocaust history makeinghistory anarchisthistory NetworkingHistory blackhistory monarch computerhistory - - Sun, 07 Mar 2021 20:25:51 UT - - - places - lapaz luanda asunción nouakchott conakry kyiv moscow saipan gibraltar dublin KlimaGerechtigkeit catalunya dannibleibt avarua hargeisa delhi niamey chișinău freestuff colombo brasília phnompenh mbabane danni belgrade belmopan pyongyang hannover calls ulaanbaatar oranjestad Reykjavik gaborone seattle ndjamena raw singapore kingedwardpoint abidjan nuuk asshole pretoria papeete malé rhetorical robberfly zagreb gitega abudhabi flyingfishcove castries georgetown hagåtña videoFreex cassette oric borikua basseterre hamburg afrika kinshasa suva klimaatverandering valparaíso athens roseau sheffield baku charlotteamalie antananarivo domi pristina MakoYass videocalls santiago sukhumi berlin uptronicsberlin funafuti libreville puertorico ClimateChange hanoi philipsburg tehran banjul prague rawhide andorralavella daw yerevan portauprince videoprojects dakar paramaribo tifariti capetown rigaer94 tirana klima ankara ipswich managua lisbon bishkek amsterdam climatchoas videogames klimaat EastVirginia portonovo santodomingo bangkok texas bucharest kathmandu aden madrid sanjuan vienna kingston kabul damascus stockholm douglas ClassOf2015 willemstad hibernoenglish thehague panamacity RassismusTötet beirut amman newdelhi tórshavn nouméa oslo alofi gustavia paris video cockburntown ottawa classical stepanakert portofspain klimakrise class fsberlin honiara berniememe asmara florida nicosia helsinki taipei tegucigalpa tokyo tashkent larochelle vr MadeInEU sarajevo algiers KlimaKrise nairobi muscat monaco riyadh lusaka wellington bissau juba mariehamn majuro buenosaires ngerulmud dhaka berlinhateigenbedarf guatemalacity washington vatican kuwaitcity Erdmannhausen londonboaters SystemChangeNotClimateChange bern mexicocity bratislava myasstodontownhall bridgetown prince delhipolice crowsnestpass tunis manila stanley matautu copenhagen barcelona lomé videocall budapest ouagadougou mogadishu freetown victoria lora brazzaville portmoresby ashgabat kampala Klimaatalarm elaaiún vilnius ContourDrawing bloemfontein sucre london passalong marseille berniesanders pagopago bradesestate oakland vaduz addis nürnberg naypyidaw CassetteNavigation khartoum baghdad bandar moroni cuirass lehavre portvila kingstown ChrisCrawford reykjavík lofi manama accra windhoek fortworth nukualofa classic ciutatvella tbilisi canberra quito maputo cetinje adams putrajaya ramallah bogotá dodoma harare havana warsaw münster valletta localberlin ljubljana bamako kualalumpur podgorica rabat cotonou plymouth seoul neumünster Portland dushanbe bangui magnifyingglass aotearoa westisland tskhinvali palikir caracas jamestown rome munich freestuffberlin sãotomé jakarta daressalaam sansalvador seo apia essex yaren cairo jerusalem brussels kigali southtarawa beijing minsk montevideo vientiane philips maseru klimaatopwarming hamilton lorawan doha tripoli celtic portlouis lima adamstown deventer weimar abuja fuckalabamapower lilongwe nassau lobamba heathrow nyc fly montreal rawtherapee dili riga assembly lesbos monrovia nursultan Neuzulassung gab sanjosé klimaatrechtvaardigheid marigot islamabad fb malabo tallinn sahara thimphu klimanotstand yaoundé praia bujumbura washingtondc sofia skopje - - Sun, 07 Mar 2021 20:25:51 UT - - - music - musicprodution LaurieAnderson punk punkname ourbeats gas vollgasindiekrise indieweb synthesizer daftpunk indiemusic 20thcenturyjazz steamlinux streetpunk bikepunks bandcamp mymusic musicians jamendo ipod skinheadmusic rap shoegaze mp3 steam indie steampunk indieauthor nazipunksfuckoff Music EnvoieStopHashtagAu81212 thecure posthardcore vaporwave IndustrialMusicForIndustrialPeople Mixtip dubstep synthwave bootstrap oi rave freemusic nowplaying hiphop hardcore experimentalmusic spotify fedimusic musicbrainz eos90D soundcloud frankiegoestohollywood ccmusic typographie dj newwave dorkwave producing experimental musicproduction chiptune lastfm 1 funkwhale eos wp playlist retrosynth NowPlaying libremusicproduction MusicAdvent coinkydink pmbootstrap arianagrande indiecember synth music np bass techno jazz production graphics darkwave mastomusic metal polychromatic funk magnatune fediversemusic cyberpunkmusic cleantechnologies BandcampFriday mixtape - - Sun, 07 Mar 2021 20:25:51 UT - - - conferences - FOSDEM2021 debconf FOSDEM talk fossdem FreedomBoxSummit apconf2020 schmoocon penguicon2021 summit confidenceTricks minidebconf rc3worldleaks penguicon emacsconf MCH2021 ox defcon flossevent conf rC3 rC3World FOSDEM21 conference flossconf apconf rC3one smalltalk C3 config confy - - Sun, 07 Mar 2021 20:25:51 UT - - - food - vitamind cake teamviewer FoodHardship pankow margarine zwartepiet dessert salsa caviar brot theexpanse BellaSpielt cookery pietons Ôtepoti panther food cakecutting skillet teamgodzilla spiel liquor milk bolognese recipe foodporn yeast drinking plate waffle biscuit glaze omelette filet pastry wine woke Caribbeans hamburger juice Amazfish sourdough cagefree nuts gras toast broth batter foodie breadposting spiele ketchup divoc seasoning mayo soup arpanet pan voc imateapot Anglefish potatoes mayonnaise vegan dish avocado spice bakery butterflies butterfly cooking teamhuman yogurt thecandycrystalrainbowcodex crumble cider caffeine butter mastokitchen cook pottery creepypasta mastocook cobbler steak pizza soda fedikitchen aroma oil Miroil angelfish flour cream nutella pie cuisine potse freerange tartar kropotkin tea marinade mushroom entree lfi bread salad beans fresh syrup fermentation mushrooms cookie wordstoliveby curd soysauce lowcarb pudding beer baking peterkropotkin fish foodwaste wheat pot TeamFerment sauerkraut stew weltspiegel chocolate paste wok recipes expanse olive burger candy Steam spanish kitchen coffee bagel teams taste SpieleWinter2020 meat noodle raclette caramel rice eggs grill poutine demoteam lard croissant pasta vegane strawberry foods WaterDrinkers cheese oregano drink muffin LowRefresh foie sauce foodanddrink soy growyourfood vore pandemie cocoa sandwich mousse chili redfish - - Sun, 07 Mar 2021 20:25:51 UT - - - farming - johndeere - - Sun, 07 Mar 2021 20:25:51 UT - - - countries - romania burma lithuania solomon chile Instanz maui fiji tajikistan benin paraguay eeuu icelandtrip senegal ukraine italy brunei nicaragua guyana Pflanzenbestimmung euphoria zambia iceland morocco rojava netherlands swaziland bosnian suriname winningatlife elsalvador russia samoa asl european czech belarus hayabusa2 kyrgyzstan uk abuse translation sanmarino catalonia panama africa japan buyused venezuela gambia freeNukem kuwait barbados papua greece switzerland uae mau nigeria usa angola honduras djibouti laos sierraleone nonprofit britain cambodia ych vietnam neofeud zealios seychelles marshall kazakhstan trailrunning urk estonia tonga stlucia burundi bangladesh egypt mali congo us jordan speedrun grenada israel psychic algeria ghana bosnia translations russian eritrea bhutan hungary Störungsverbot saudi slovenia tig mauikit czechosvlovakia bahamas australia kiribati togo koreanorth poland Überbevölkerung malawi capeverde armenia american hautrauswasgeht bahrain mozambique americanpinemarten beleuchtung southsudan Martesamericana syria micronesia maldives iran indigenous sweden bijîberxwedanarojava ethiopia cuba liberia canada burkina somalia Chile scotland russiaToday vaticancity easttimor austria turkey yemen Bolivia denmark USBased madagascar finland philippines ivorycoast haiti ecuador Portugal azerbaijan gasuk spain albania afghanistan europe mauritania dominica ökonomisierung thailand belize westpapuauprising nerdlife macedonia montenegro thenetherlands qatar mongolia costarica boatingeurope birdsofkenya latvia uzbekistan kabelaufklärung ireland iraq malaysia mexico mauritius dezentralisierung oman chad nz de georgia zimbabwe france serbia lesotho oddmuse tunisia argentina czechia cameroon namibia sudan indonesia colombia worldwildlifeday kryptowährung tuvalu britainology beckychambers turkmenistan tanzania germany neuhier norway comoros auteursrecht guatemala Thailand kosovo andorra wales indiastrikes servus pakistan belgium china antigua life koreasouth newzealand visiticeland einzelfall rwanda luxembourg libya indywales italyisntreal nauru moldova bad eastindiacompany stigmergic palau taiwan kenya trinidad eu botswana fossaudio CuriosidadesVariadas jamaica vanuatu cyprus aminus3 malta Icelandic niger s3 westpapua busse unitedstates myanmar saintvincent guinea nepal peru uganda uruguay india lebanon neurodiversity southafrica croatia europeanunion bolivia chinese dominican srilanka bulgaria slovakia speedrunning gabon psychedelicart stkitts liechtenstein neofeudalism brazil shutdowncanada - - Sun, 07 Mar 2021 20:25:51 UT - - - software - borgbackup app freedombox windows libre nginx postscript freebsd Framasoft invidious drm publicdomain ilovefreesoftware kubernetes nodrm copyleft fossmendations freedoom jami FuckOffZoom quicksy whiteboard free docker freesoftware gimp backups foss matrix dinosaur designjustice thefreethoughtproject filesystems nextcloud translate wechat notmatrix Mosstodon HappyLight openscad uidesign TabOrder searx ikiwiki Linux FreeSoftware rocketchat thanksfreesw outreachy synapse API lyft photoshop nitter virtualbox discord opensource diaspora yunohost oss chickadee littlebigdetails cabal conferencing libreboot mycroft accessibility devops owncast emacs freiesoftware fluffychat writefreely videoconferencing bigbluebutton email chatapps HappyNewYear floss plugins libresoftware softwareengineering mosstodon expandocat deltachat application uifail FOSS GNOMECircle bittorrent fossils penpot vlc zoom tiling FriendofGNOME usability opendesign obnam snap ProprietarySoftwareProblems pandoc blackcappedchickadee cryptpad software libretranslate OwnStream upstream slack Hummingbard Element zrythm gnu CTZN mumble grsync freecad drmfree telegram containers tails blockchain irssi mcclim iso mutt design gameoftrees freetool backup rotonde freetube GNU skydroid thunderbird sysadmin parler apps chat licensing inclusivedesign defectivebydesign metager screenreaders sysadmins ZeroCool LINMOBapps obsproject softwareheritage profanity Tankklappe doomemacs ffmpeg fossandcrafts telesoftware love reboot opensourcegardens switchingsoftware OSM freesw agpl distribute GNOME strafmaatschappij distributedledger mattermost principiadiscordia rocket ghostscript win10 Zoom elemental libreops element inclusive chatty softwareGripe nativeApp MatrixEffect jitsi wordpress SwitchToJami mongodb ux rsync libreoffice crossstitch dino plugin xwiki openoffice container discordia softwaredesign ledger sounddesign glimpse - - Sun, 07 Mar 2021 20:25:51 UT - - - cycling - bicycle cycling bike motorbike thingsonbikes Snowbike cyclist - - Sun, 07 Mar 2021 20:25:51 UT - - - phones - mobileapp fairphone3 téléphone mobian pine fdroid plasmamobile android smartphonepic ubportsqanda linuxmobile sailfish phones fennecfdroid Mobian osmf smartphone ios sms4you smartphones iOS14 keto pinemarten linuxphones openmoko mobilelinux freeyourandroid QWERTYphones sailfishos siskinim monal osmocom Smartphones lineageos molly androiddev plasma phosh BriarProject librem5 ubportsinstaller osm linuxphone pinephone Teracube PinePhone mobile pinephones sms pine64 fairphone ubuntutouch linphone Android linux ubports gnomeonmobile osmand vodafone linuxonmobile iphones postmarketos iOS microg grapheneos phone mobileKüfA - - Sun, 07 Mar 2021 20:25:51 UT - - - security - signalboost repair encrypt letsencrypt messengers BrowserHistory FlexibilizaciónResponsable autoritäreretatismus omemo dataleak messenger password keepassxc cryptography cybersecuritynews solarwinds communityalgorithmictrust infosec gchq wireless repairing IHaveSomethingToHide fotografie passwords IronySec cryptowars supplychainattacks UseAMaskUseTor cyberattack security tor comb e2e bruceschneier vpn itsec openssh openssl cryptoart spyware e2ee backdoor ed25519 torproject cryptomeanscryptography encryption informationsecurity ssh misshaialert cybersec encryptionsist restore FormFactors crypto theObservatory giftofencryption signalapp onionshare onion malware switchtosignal corydoctorow righttorepair cryptographyisoverparty opsec keepass TastySecurity torsocks nsa protonvpn trustissues yubikey nitrokey encrypted openpgp castor9 prismbreak gpgtools gpg fotopiastory equatorial cybersecurity Tor CryptoWars signal noscript trust drugs cryptoparty wire itsecurity cryptocurrency foto pgp cryptomator signalmessenger openvpn datasecurity autorotate regulators leak drugstore encryptiost libresignal securitynow storage tracking cloudflare - - Sun, 07 Mar 2021 20:25:51 UT - - - pandemic - covid19 corona psmeandmywholefamilycaughtcovidfromwork Coronavirus CoronaWarnApp facemasks vaccines vaccine JournalistsSpeakUpForAssange pandemic sayhername internationalproletarianrevolution covidville contacttracing tier4 covid coronavirus masks COVIDrelief virus Lockdown rna codid19 COVID19 YesWeWork ContactTracing COVID coronamaatregelen - - Sun, 07 Mar 2021 20:25:51 UT - - - astronomy - telescope mercury pluto planets galaxy venus mars amateurastronomy uranus nebula astronomy neptune space jupiter blackhole asteroid BackYardAstronomy moon observatory saturn milkyway - - Sun, 07 Mar 2021 20:25:51 UT - - - news - report news flash Wikileaks newsletter newsflash rt bbc goodnews doubledownnews reuters theguardian newsboat journalism SkyNews - - Sun, 07 Mar 2021 20:25:51 UT - - - cats - Cat dailycatpic dxp DailyCatVid katze kotorico kot CatsOfMastodon Leopard catbellies LapCats qualitätskatzen - - Sun, 07 Mar 2021 20:25:51 UT - - - employment - InterviewQuestions jechercheunjob mywork employees hiring ProgrammingJob reproductivework workinprogress bullshitjobs workplace antiwork kreaturworks worklog job DjangoJob teamwork framework hire hirefedi workshop carework nowhiring obs obsolescence work hertfordshire flossjobs jobs sexworker - - Sun, 07 Mar 2021 20:25:51 UT - - - radio - cbradio worldradioday hamr why tootlabradio pouetradio dx macintosh amateurradio radiohost radiokapital localization vantaradio ca radio healthcare listening hamradio FreeAllPoliticalPrisoners card10 fastapi radiobroadcasting radiosurvivor Poecileatricapillus radioshow local radio3 noshame osh audycja hackerpublicradio kosher audycjaradiowa california nowlistening listeningtonow radiobroadcast mastoradio spazradio anonradio kolektywneradio io api - - Sun, 07 Mar 2021 20:25:51 UT - - - indymedia - hs2 visionontv geek tredtionalmedia degeek globleIMC indymediaback pga indymedia networking stupid hs2IMC indymediaIMC network networkmonitoring roadsIMC stupidindivialisam roadstonowhere lifecult omn tv roadstonowhereIMC UKIMC fluffy 4opens openmedianetwork - - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT economics - workercoop cooperatives accounting bank bitcoin noplanetb theWorkshop feministeconomics WealthConcentration valueflows coops valuesovereignty funding platformcoop usebitcoin consommation workercoops economics value business platformcooperatives exoplanets shopping ethicalfunding displacement poplar shop plaintextaccounting crowdfund fairtrade RIPpla bankingCartel rope Bitcoin startups HenryGeorge plant economíasolidaria disablitycrowdfund crowdfunding limitstogrowth companies sharingiscaring techcoops disability micropatronage lgbtcrowdfund monetize smallbusiness intellectualproperty pla kommerzialisierung GitPay gdp deplatforming coop smallbusinesses europeancentralbank whyBitcoin infoshop grow growth limits fuckfoodbanks values banks planetary plannedObsolence planet worldbank + Europe workercoop cooperatives accounting bank bitcoin noplanetb feministeconomics WealthConcentration valueflows coops holochain valuesovereignty funding platformcoop pico usebitcoin shitcoin consommation workercoops economics value business platformcooperatives exoplanets shopping displacement economic poplar shop companyculture plaintextaccounting sovereignty crowdfund oops fairtrade RIPpla bankingCartel rope Bitcoin startups radicalcooperation HenryGeorge plant plausible economíasolidaria disablitycrowdfund crowdfunding limitstogrowth ponzi companies theygrowupfast hermannplatz sharingiscaring techcoops plastikfrei meetcoop disability micropatronage lgbtcrowdfund mehrplatzfürsrad monetize ua cryptocurrencies degrowth a2pico smallbusiness deliveroo intellectualproperty pla kommerzialisierung GitPay Fedigrowth gdp deplatforming coop smallbusinesses europeancentralbank whyBitcoin cryptocurrency infoshop grow growth limits fuckfoodbanks values banks planetary plannedObsolence planet worldbank - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT + + + sport + billiard darts swim motorsport snooker locksport trailrunning marathon hockey bouldering diving baseball Millwall mma mammal sailing athletics nook dumpsterdiving sportsball skating skiing sport climbing football combatsports + + Sat, 01 May 2021 11:58:46 UT + + + events + neverforget TuesdayVibe award daffodilday OONIbday waybackwednesday thursdayvibes fridayfilm sun IndigenousPeoplesDay5 notifications solo throwbackthursday valentinesday adventskalender live Day deepthoughts thingaday screenshotsaturday warmingup thursdaythoughts fridays hackathons thursdaymorning Gesundheitskrise throwback RomaDay assweek animalsweatersunday TooMuchScreenTime beethoven250thbirthday valentine humanrightsday followfriday wednesdaythought afediversechristmas whydopeopledoshitlikethis festivals wednesdaymotivation early MayDay2021 IllustrationDay cccamp19 coding lovewhereyoulive screenshot PostLikeYouThinkACrabWouldSunday showerthoughts BIJ1 worldpenguinday animal ScreenshotSaturday beethoven anarchymonday Verkiezingsfestival FreeAssangeYesterday 100DaysToOffload hackathon ff holiday LURKbirthday punday ipv4flagday christmas livecoding weeknotes LINMOBlive week FlashFictionFriday mothersday koningsdag concert festival FridayFolklore screenshottuesday animals VerkiezingsfestivalBIJ1 fujifilmxt2 kdenlive dontstarve onthisday GlobalMayDay2021 insideoutsockday livestream whiskerswednesday BowieDay morningcrew theskytoday InternationalAsexualityDay tzag TinyTuesday FridaysForFuture sunday Koning weekendvibes screenshotsunday showerthought koningshuis cree VerseThursday liverpool waitangiday adayinthelife goodmorning Caturday day InternationalCheetahDay flatfuckfriday RabbitRoadTrip2021 interestingtimes sideprojectsunday birthday sixonsaturday supdate StPatricksDay2021 koningsdag2021 wordoftheday christmaslights nationallibraryweek meetup FathersDay kidsthesedays + + Sat, 01 May 2021 11:58:46 UT + + + politics + hate conspiracytheory TakeOurPowerBack redessociais trump Anarchy cia socialjustice neoliberalisme workerowned alwaysantifascist sabotage qtibpoc VivotecniaCrueldadAnimal community systemicracism wageslavery immigration dissent liberation laws fascism farmersrprotest techtuesday skyofmywindow techthursday aws freedomofspeech anarchist prochoice freeexpression anticapitalist RacialHealing fascisme humanrights Anarchisme crime leftists Socialism ukpol FreeKeithLamar Antifascisme copwatch capitalismkills petition BorisJohnson meteorología independant freedom techtalk bikesforrefugees techdirt ontologicalanarchy techsit union abolitionnow anarchism DefundThePolice earthship repression legaltech technews Jurastil meto legal meeting polizeigewalt dannenröderwald smalltech police nzpolitics greenhousegas antifascists oilwars kommunismus censored rightorepair control bjp ThirdRunway multi seaslug maidsafe testing hierarchy chehalisrivermutualaidnetwork election republicans opinie diversity solidarity techwear communitycontrol hypocrits slavery sociaalDarwinisme metoo refugeeswelcome Coronariots seashepherd sky_of_my_window mybodymychoice generalstrike fuckBiden call2power neoliberal antipolitics charity abolition digitalfreedom transrightsarehumanrights ScottishElections2021 mayday unionyes again hatespeech fascists LateStageOfCapitalism earth stopchasseacourre solawi ciencia smashturkishfascism afropessimism antivax Electricians burntheprisons qt trumpism cyberlaw bossnapping peerproduction corporations iww pushbacksareillegal til labor commons choice feelthefreedom Riot corporatewatch postcapitalism smalltechnology wageslave uspol frontex communism mutualaidpdx RemoveThePolice makecapitalismhistory abolishpolice nationalisme oist Immigration competition biometric neoliberalism NeverTrustSimone socialecology wald whistleblower wroclawskierewolucjonistki MutualAid capitalism technology test prisons feministhackmeetings wealth supremecourt conspiracytheories corporatecrime DirectAction communist daretocare KeirStarmer NoMoreEmptyPromises censor helmet refugeesgr taoteching technopolice anarchismus politiikka kapitalisme retrotechnology housing decriminalization politics WarCommentary inclusivity gravimetry publicknowledge government neocities HeroesResist greendatacenter SocialDarwinism brightgreen poc anarchisme wayfire feminist DominicCummings nzpol TyskySour: Bookchin informationtechnology ClemencyNow Inauguration2021 arran Revolutionary techthoughts brexit tw totalitarianism privatisation TyskySour Labour nonprofitindustrialcomplex death LabourLeaks riots freethemall bolsonarogenocida green SocialJustice neoliberaal corporateStateTotalitarianism BAME decolonizeyourmind alternative privilege antikapitalisme firejail legalcounsel AbolishPrisonsAbolishPolice despotism earthovershootday palantir DecentraliseThePlanet anti surfaceworldblows ecofascism opentechnologyfund popularitycontest pdxmutualaid LhubTV SocietalChange facialrecognition cotech corruption florespondece hypocrisy anarchy fire colonization Feminism propaganda dcc greenit endsars celebratingfreedom Antillia corporateState decolonization pc digitalrights feminism freepress Lhub HightechProblems farm problem collaboration pentesting polizei neo democracy anarchistki Govts BelarusProtests xp powerpolitics 18Source hungerstrike censorshipBook radicaltech saytheirnames witchesagainstwhitesupremacy gulag digitalmarketsact socialist conspiracy anarchistbookclub redandanarchistskinheads hostileenvironment corporate osint radicaldemocracy PritiPatel oiseau surveillance latestagecapitalism bos racist cancelculture dec MexicanRevolution elections greatgreenwall RussellMaroonShoatz LhubSocial methods Flatseal commonspub sea white governance prisoners warrants policebrutality techshit earthday borisjohnson Anarchist deepspeech press routerfreedom Anarchism mutuality whitehouse haltandcatchfire freedomofexpression censorship CancelCulture decolonize HanauWarKeinEinzelfall druglawreform keinmenschistillegal emmet fascisten decenterwhiteness blackandwhite Biden ChineseAppBan cooperative trespass modi kdecommunity antifa law chip deathtoamerica manipulation ParticipatoryCultureFoundation firetotheprisons consumer PlanetarySocial britpol financial gravimetrie Capitalism surveillancecapitalism leftist Revolution ukpolitics mdcommunity glenngreenwald JeremyCorbyn blacklivesmatter freedomofthepress academicfreedom FreeAlabamaMovement Anarchismus strike mononeon rentstrike evergreen otd dsa informationstechnik lawandorder migration power oiseaux neoist capitalismenumérique mutualaid capital cymru multipleexposure humanetechnology AbolishPrison solidaritynotcharity anarchists fascist righttochoice socialcoop vim apocalypseworld DefundSurveillanceCapitalism feministserver platformcapitalism decolonizeconservation anarchistprisoners whistleblowers polizeiproblem notallmen UniversalBasicServices fuckcapitalism speech uselection IDPol Antifa deathtofascism lesanarchistes Slavetrade met democracia antitrespass drugtesting consumerism greenwashing ourstreets reform MeToo extremist freespeech anticonsumerism kapital neorodiversiteit refugees riot BernieSanders acab ecology yesminister antifascist SurveillanceCapitalism antifascism GlobalCapitalism whitepaper pdx freewestpapua eris hambacherwald powstaniewgetciewarszawskim sunnytech expression feudalism espressif tech + + Sat, 01 May 2021 11:58:46 UT + + + gafam + zuckerberg caringissharing ads apple antitrust SpringerEnteignen deletewhatsapp GoogleDown AppleSearch Floc bankruptBezos googlesearch mycologists bringBunysBack youtube Goggle twitterkurds chromebook fuckfacebook headset ffs AmazonMeansCops facebook 100heads amazon googlevoracle dystopia microsoftgithub farcebook myco boycottinstagram FlocOff deletewhatsappday amazonring Gafam googleplus soldering GoogleForms haggis degooglisation linkedin siri Facebook LeiharbeitAbschaffen advertising monopolies googleanalytics adtech fuckgoogle plottertwitter microsoft deletechrome dtm HeadscarfBan twitter skype azure chrome googledoodles hildebrandt corporateGiant uitkeringen FlocOffGoogle sidewalk nogafam youtubedl degoogled Google youtubers google stemverklaring gis walledgarden GAFCAM dt GooglevsOracle dotcoms deleteyoutube datafarms Instagram walledgardens agistri appleevent offseting appleii fascistbook FuckGoogle degoogle boringdystopia fuschia appleiie deleteinstagram ungoogled ring stopgoogle affordances googledown gafam inspiring killedbygoogle fuckoffgoogle deletefacebook gradschool GoogleIsBad fuckoffgoogleandco office365 lordoftherings turingpi instagram FlocBloc playstore synergistic bigtech boycottamazon whatsapp mytwitteranniversary deleteamazon bluesky + + Sat, 01 May 2021 11:58:46 UT + + + people + Melissa harold paul Zachary markdown JusticiaParaVictoria danielle dylan scott Barbara Kenneth theresa Denise FrankLeech Jesse Adam justin elinorostrom katherine judith Karen Patricia russell Metalang99 juan diane Rebecca donna olivia peter troy William denise Betty evelyn Christina brittany Jennifer Gregory Wayne Andrychów ethan Ralph Peter ecc americalatina jacobites jean laura betty nathan margaret alexanderlukashenko Bryan Virginia Jose Rose eric james david Joshua christine haaland Billy CapitolRiot natalie daniel Jonathan Michael susan George johnny bookmark Lauren christina Amy kevin Natalie kenneth noahkathryn Lawrence aaron gregory Amber alexa Robert Edward Patrick Rachel willemalexander bruce Forms dennis LegalCannabis Kayla frank Diane Donna Jack Paul Janice Brenda alexis timothy vincent Alice sarah amy Daniel jeff charlotte carolyn Emma Kyle Sean emily linda Olivia Eugene Donald janet ryan stdavids RichardDWolff bryan Hannah anna doctorow Catherine Alexander Christopher bob doris Anthony Jean diana Beverly frances Sarah margaretthatcher Jordan Anna Ethan Amanda jeremy donald mark matthew julie stephanie Jerry Diana David Linda adam richard henry RoyalFamily Isabella elizabeth steven jessica Walter jeffrey Kevin Justin grace PeterGelderloos brandon mary jamesbaldwin sharon nicholas Benjamin GeorgeFloyd amanda Emily Ruth heather stephenlawrence albert julianassange Julie nancy stephen Cannabis James Megan Raymond eugenetica michelle Nancy Frances Henry andrew Jessica julia marketing Dorothy LoganGrendel Jason Charles JonathanMorris Danielle Brandon jose noamchomsky virginia beverly obituary ronald Bob madison Helen MarkoBogoievski Jeff helen Sophia larry dorothy Dennis monbiot Nicholas Frank jack Stephen Janet ScottRosenberg Alexis Pamela Jacqueline Dylan roy brenda jesse Roger Jeffrey Brittany Shirley putkevinback Nathan christopher Carol Susan jason Philip Logan sandra jacob rose isabella Cynthia Joan jackieweaver aldoushuxley Maria martha Randy SarahEverard carl kyle karen raymond alice jerry carol RussellBrown Victoria Steven Douglas Lisa Julia joshua jacqueline Ashley assange eugene Bruce Albert Austin thomas Evelyn Gary Scott kimberly lawrence jennifer Russell austin logan Laura Chris Teresa Aaron Keith brian marktwain maryanning LamySafari maria Joseph Andrew Vincent Katherine Joyce lauren Ryan amber davidgraeber alan ralph princephilip megan Kathleen sophia Cheryl abigail cynthia john richardstallman Alan Debra QuickSummary arthurgloria mariadb Christine marilyn anthony chris Elizabeth sean Louis Larry christian deborah billy Abigail joesara AndreaBeste keith Jeremy markkennedy zachary ruth Grace teresa Doris benjamin Willie george barbara scottish Charlotte philip DaveCunliffe randy Margaret Heather Bradley Jacob shirley pamela Matthew Nicole joan judy Kelly savannah Brian melissa Sandra stallman markstone joseph andrea shamelessselfplug Joe Sara robert aaronswartz Bobby emma willie william angela SachaChua samuel Postmarketos tyler Thomas John kroger patricia ashley bobby roses kelly fuckamerica ThomasCahill hannah Carolyn Ann CrimsonRosella gary wayne Marilyn Deborah rms Sharon gare Mary Samuel BreonnaTaylor Mark walter rebecca helendixon Madison Juan lisa cheryl janice Christian gerald Timothy roger edward bradley Gerald patrickrachel framalang Kimberly Gabriel Marie EmmaFerris PeterHoffmann louis kathleen Arthur Gloria terry royals freejeremy Richard jonathan Harold JuliaKitten Roy samantha Carl chalice Eric relationships visuallyimpaired nicole Andrea Judith Terry Stephanie Johnny Angela Noah Kathryn Ronald AskVanta Michelle Theresa gabrielmarie Samantha Judy michael charles Tyler amaryllis DouglasPFry kayla catherinealexander Martha debra JohnMichaelGreer joyce + + Sat, 01 May 2021 11:58:46 UT + + + activitypub + followerpower FederatedSocialMedia Fediverse kazarma activitypub activertypub tootfic pleroma losttoot Rss2Fedi PeerTube devices gofed getfedihired collaborate pixelfedlabs hometown homelab fediblock fediverso lazyfedi federation instances fedilab Wallabag blocks pixiv mastotips toot fedilabfeature mastodev fediversetv pixel mastodontips catsofthefediverse mastotip wallaby MastoDev friendica mastodontip hiveway mastodonart mast Mosstodon megapixels Adblocker DeveloperExperience askthefediverse misskey collaboraoffice activitypub_conf BlackFedi joinmastodon siskin socialhub followers fediart ublockorigin blocking Metatext SocialMediaReimagined Pixelfed contentwarnings pixelfed labournettv fediverseplaysjackbox mapeocolaborativo fedihive greeninstances fedidb block FediMemories Feditip devs fablab fediverseparty collabathon Dev Fediseminar onlyfedi socialcg teamtoot sponsorblock tusky labour contentwarning peertubers imagedescription joinpeertube feditips tootcat fedizens Mastodon following epicyon afediversechat peertubeadmin leylableibt fediversefleamarket mastomagic YearOfTheFediverse dev mastodob fediadmin pleaseboost mastodonhost mond pixeldev timeline socialmedia tips wedistribute fosstodon instanceblock softwaredevelopment freetoot mastodonmonday fedihelp fediWhen collaborative isolategab greenmastodon fedireads networkTimeline PeertubeMastodonHost boost AskFediverse Bookwyrm federated socialhome greenfediverse microblocks collabora fedivers MastodonMondays fediverse imagedescriptions mastobikes gbadev lemmy Fedilab bunsenlabs mastoadmin smithereen hackerstown uadblock blabber FediverseFutures latenighttoots mastodon developingcountries PixelfedDev fedi fediversefriday fediplay widevine peertube fieldlabs mastomind lab BlackMastadon fedeproxy lazyfediverse mobilizon lazy gemifedi + + Sat, 01 May 2021 11:58:46 UT + + + internet + datasette linkeddata selfsufficiency decentralised immersiveweb pep dotcons i2p sceptic earlyinternet Clubhouse spam firefox redecentralize NYCMesh decentral wikipedia rtmp dataprotection decentralization inclusiónsocial decentralize w3c dotConism DutchPolitics internetaccess agnostic geminispace selfhosted piratenpartij DarkPatternsFTC metafilter maille meta torrent mailab geocaching MollyBrown mailfence k9mail nylasmail data socialism basemap sitejs anticolonial VerkehrsswendeJetzt worldbusterssocialclub publicserviceinternet networks online openddata centralisation internetarchaeology WordPress darkages self saferinternetday contentmoderation distributed OperationPanopticon mydata webhosting decentralizedweb mailman natto p2pleft socialdistancing router protection rne dataretention speedtest bigdata routeros greenhosting selfhosting forkawesome communityhosting CriminalJusticeBill brave icann selfsustaining hosting mailart discourse weblate PeerToPeer wikis dns stripe service openstandards nojs ejabberd oauth Anticon tic foxes hypercore CDNsAreEvil meshtastic protonmail TubEdu standards yourdataisyourdata internetfreedom onlineWhiteboard gemini antarctic zeit webui InternetCrimeFamily wlan boilemMashEmStickEmInAStew internetBanking Nature SmallWeb fedwiki ircd coopcloud cw internetshutdown democratic datadetox clearnet cdn liberapay brahmaputra distributedcoop xmpp semanticweb identicurse socialnetwork Disarchive selfie colonialism website SaferInternetDay content splinternet participation highavailability webstandards mapa groenlinks domains ntp centralized cloudfront socialnetworks metadata wikileaks disconnect Meme database socialanxiety proton disco web3 cloudfirewall TLSmastery descentralizare icmp videocast governement jabber cleanuptheweb webbrowsers webhook communications decentralized userdata wiki cloudron bsi browserextensions ssb darknet cookies Qute darkweb netcat webInstaller map Reddit archiv server browser cloudy IPFS p2p social antisocial tiddlywiki www missioncritical corne fortinet opendata ilovewikipedia web WebsiteStatus netshutdowns alttext twitch im darkmode 9front decentralise att jabberspam theserverroom Watomatic datafree domain OpenStreetMap closedweb geminiprotocol statistics BurnermailIO irc pirate plaintext datacracy filesharing rss openstreetmap ipns mozilla twitchbannedrevision voicemail mapbox Nyxt legacyInternet yacy webrtc databases symbiotic debloattheweb crosspost jmap mail i2pd ipfs internetradio bravenewworld browsers wikidata selfpub decentralizeit ballpointpen puredata netscape mixcloud DecolonizeTheInternet gmail openculture letthenetwork cyberspace SwitchToXmpp messaging selfies offthegrid enxeñeríasocial cloud ddg snailmail cleanup internet moderation decentralisation webinar metaverse socialcooling Seattle fox ssbroom pihole serverMeddling missingmaps bravesearch sneakernet NatureNeedsJustice Nextcloud internetarchive dataintegration dweb kmail js metatext adblock dark captcha beakerbrowser openweb NetShutdown enigmail libervia onlineharms gooddata mailinglist kernelupgrade dot Internet descentralizarea thepiratebay internetshutdowns fixtheweb lazyweb atom socialweb colonial firewall Politics socialists ebay mozillahubs instantmessaging publicservice interoperabilitate SolidProject webmention Justice4MohamudHassan cloudflare + + Sat, 01 May 2021 11:58:46 UT + + + programming + Easer cpp digitalpreservation programming css rubyonrails objects Python system digitaldivide digitalisierung FrancisBacon2020 dracut gitea mixers webdev proofing developerexperience gui digital release ada schutzstreifen pypi workaround proofofwork node websocket proofofstake ecosystem rustlang ocaml program DigitalSouveräneSchule request_reaction sqlite guile nim uptronics hypocritcal profiles DeutschlandDigitalSicherBSI typescript forums vscode gitsyncmurder musicforhackers publiccode computerscience hackers guidelines vieprivée adventofcode cgit solidarność CommonJS scripting warn digitalesouveränität DevelopmentBlog anime git proof sourcehut ui nocode solid nodejs systemchange trevornoah zinccoop tailwindcss terminalporn guix raku fedidev c script sourcecode publiekecode framaforms WendyLPatrick DigitalAutonomy grep django gmic zim sackthelot gitportal gitlab crusty decoder readability parrot relevance_P1Y Verkada react kingparrot Leiharbeit programmer trunk haskell OpenSourceHardware CodedBias codelyoko workstation guixhome Tarifvertrag esm penguin unicode development ursulakleguin gerrit frgmntscnr Fagradalsfjall github freecodecamp openrc tuskydev threema html5 algorithms PythonJob lisp digitaldefenders codeberg souveränität forge ursulaleguin pleaseshare HirsuteHippo resnetting frontenddevelopment animatedgif fourtwenty rakudev adaptation developers bug fortran libraries drivers animation freecode forgefed javascript fragment cpm code elisp JardínOpenSource commands patterns eq ECMAScriptModules html vintagecomputers rakulang portal terminal c99 SemillasOpenSource rust programminghumor lowcode request spiritbomb r dramasystem go forges digitalaudioworkstation esbuild golang clojurescript vintage ruby releaseday rustc contractpatch deceptionpatterns obsolescence_programmée computers developer darkpatterns racket sourceforge forum digitalprivacy bugreport mercurial openappecosystem python fontforge indiedev kabelfernsehen OpenSource Scheibenwischer + + Sat, 01 May 2021 11:58:46 UT + + + art + cherrytree oilpaint arttips mastoartist paperart activism CreativeToots theWorkshop Linke subresourceintegrity glitchart Art water ocart resource urban article penandink webcomics CommissionsOpen glassart martialarts watercolours artalley artvsartist2020 circulareconomy abstract artreference commission Earthquakes poe nomadbsd coloringpage dccomics inkscape blink artificalintelligence draw circuitsculpture ttip watercolor proceduralart resources poetesss memes ghibligif subpoena autisticartist barrigòtic art elinks sona animalart krita FreeColouringPage anthroart urbanart sigh queerart deviantart CircusInPlace communityresources pastel fantasyart drawings garten 20thcenturyillustration grafana daria artdeco adultcolouring source collective openstreeetmap cryptoart fantasy collage jordanlynngribbleart linksunten pro links CodeZwart thinkabout fanfic articles PartyPooperPost harmreductionart adhdmeme MastoArtHeader openra demoscene wallpaper generative political agriculture streetart coverart fountainpen stickers partners watercolour economy freeculture fiberart jet labyrinth edu MastoArt particl urbansketchers ParticlV3 creativetoots culture ganart opencl fiberarts polArt ink painting Leitartikel marten opencoop digitalart comic flyingonthewater sartre artwork mandala artificialintelligence b3d politicalcartoon blackart makingcomics glitch politicalprisoner wallpapers railway riso xkcd supportartists drawtober startinblox comics intelligence linkinbio mastoart urbanterror illustration artopencall Hinkley gnuimagemanipulationprogram os studioghibli 2MinuteSketch wireart cartoon oc AccidentalGraffiti eink OriginalCharacter farts poezio webcomic DigitalArt partnership oilpainting kickstarter furryart twinkle DisabledArtist unixstickers pink fursona afriquedusud comicsans inkjet generativeart VaccineApartheid sticker enbyart artbreeder 17maart fart videoart ivalice adultcoloring djmartinpowers arttherapy Cartudy fractal enby TattoosOfTheFediverse colouringpage worldwaterday NFTart signalstickers artschool digitalpainting intel artvsartist maart abstractart drawing sig circular sculpture artist pcbart meme cultureshipnames supertuxkart concretepoetry artwithopensource pinkwug VTMtober commissions pronouns opencallforartists VizierOpLinks commissionsopen fountainpenink MartinVanBeynen peppertop speedpainting animalpainting visionaryart blackartist figureart zine artists heart supportthearts genart urbanfantasy stickerei tree lineart smartcard pixelart alisajart openframeworks networknomicon openrailwaymap politicalpolicing Earthstar JuliaHartleyBrewer fan digitalArt artistsOfMastodon + + Sat, 01 May 2021 11:58:46 UT + + + nature + hiking camping RedNeckedWallaby reforestation wat marsupial StormBella insect morning delightful plankton trees lichen MicroOrganisms badger ProForestation lightweight light gecko birds nature volcano teamcapy butterflies frogs rainforest snow sunrise fossils hambacherforest forestfinance leopardgecko moutains coldwater rocks inaturalist sunset forest LandRestoration australianwildlife forests capybara enlightened waterfall sundaymorning forestation enlightenment natur walking deforestation desert lava natural WoodWideWeb birdsarentreal lichensubscribe morningwalk SpringRockShed insects wildlife afforestation northernlights RainforestAlliance amphibians desertification + + Sat, 01 May 2021 11:58:46 UT + + + writing + blog amwriting authors poem cutupmethod tories story pdf blogPages swap shortstory magazine smallstories blogging smallpoems sciencefiction writing proverbs quotes blogs noblogo otf logo playwright hedgedoc microfiction interactivestorytelling westernjournal quote letterwriting icanhazpdf WriteFreely microblog bulletjournal storytelling goodread goodreads creativewriting horror wordplay limerick journals artjournaling zineswap zines shortstories journalists journal writingcommunity poetry 20thcenturypoetry amwritingfiction + + Sat, 01 May 2021 11:58:46 UT + + + music + LibreMusicChallenge musicprodution KobiRock iea LaurieAnderson ics punk punkname ourbeats gas vollgasindiekrise indieweb cypherpunk synthesizer daftpunk bootstrappable indiemusic cipherpunk 20thcenturyjazz acousticguitar synthpop psychedelicrock steamlinux theCartographer streetpunk hydrapaper bikepunks bandcamp mymusic musicians jamendo ipod skinheadmusic jam rap shoegaze mp3 steam indie steganography steampunk ldjam48 indieauthor composing nazipunksfuckoff Music EnvoieStopHashtagAu81212 psychedelic thecure posthardcore vaporwave IndustrialMusicForIndustrialPeople Mixtip dubstep synthwave bootstrap oi rave freemusic nowplaying hiphop hardcore Musicsoft experimentalmusic nazi cp spotify fedimusic elisamusicplayer funkloch musicbrainz catsWithMusicalTalent eos90D soundcloud frankiegoestohollywood gastropod 20thcenturymusic vinyl rock ccmusic typographie dj newwave dorkwave producing experimental prince musicproduction chiptune loa lastfm tekno ripprince 1 funkwhale 20thcenturyrock eos wp playlist retrosynth NowPlaying libremusicproduction MusicAdvent coinkydink MusicTouring pmbootstrap midi arianagrande indiecember synth guitar blues musiciens listeningtonow music np bass techno musicmonday jazz production graphics darkwave mastomusic metal graphviz tigase polychromatic funk magnatune fediversemusic pegasus punkrock cyberpunkmusic raveculture cleantechnologies ldjam ftp BandcampFriday mixtape MusicsoftDownloader + + Sat, 01 May 2021 11:58:46 UT + + + gardening + seedstarting BlagueDeCodeur sporespondence blockade inde mastogarden kinder communitygardening som deno composting soil sehenswert cabbage bundeswehr opensourceseeds onions lettuce blossoms gardenersofmastodon datenschleuder florespondence cherryblossoms garden thyme flower horticulture DailyFlowers Schlachthofblockade cherryblossom acu kinderbijslag permaculture awesome hens papuamerdeka Auflagen lag CompanionPlanting gardens independence flowers kale gardening plants thegardenpath devilslettuce thegarden fahrräder gardenersworld golden beekeeping toeslagenaffaire seeds Opensourcegarden vegetablegarden + + Sat, 01 May 2021 11:58:46 UT + + + countries + thai romania burma lithuania solomon chile Instanz maui fiji tajikistan benin paraguay eeuu icelandtrip senegal ukraine italy brunei nicaragua guyana Pflanzenbestimmung euphoria zambia iceland morocco rojava netherlands swaziland tts bosnian suriname winningatlife elsalvador russia freeburma samoa romanian asl european czech belarus hayabusa2 bw kyrgyzstan uk abuse translation sanmarino catalonia panama africa west indians unitedkingdom japan Netherlands buyused venezuela gambia freeNukem kuwait barbados papua greece switzerland uae mau nigeria usa angola honduras djibouti laos sierraleone nonprofit britain cambodia ych vietnam esperanto neofeud zealios seychelles marshall kazakhstan estonia tonga stlucia burundi bangladesh egypt nachhaltigkeit japanese mali congo us jordan americangods speedrun grenada israel psychic algeria ghana bosnia translations russian eritrea bhutan armenian hungary Störungsverbot saudi slovenia tig mauikit czechosvlovakia bahamas libadwaita australia kiribati togo koreanorth poland Überbevölkerung malawi capeverde armenia american hautrauswasgeht bahrain mozambique japaneseglare americanpinemarten beleuchtung southsudan Martesamericana syria german micronesia maldives iran indigenous sweden bijîberxwedanarojava ethiopia cuba liberia canada burkina indian somalia Chile scotland russiaToday vaticancity easttimor austria turkey yemen Bolivia denmark USBased java madagascar finland philippines ivorycoast haiti ecuador Portugal azerbaijan gasuk spain albania massachusetts afghanistan rising europe mauritania dominica ökonomisierung thailand belize westpapuauprising nerdlife macedonia montenegro thenetherlands qatar mongolia costarica boatingeurope birdsofkenya latvia uzbekistan kabelaufklärung ireland iraq malaysia mexico investigations mauritius dezentralisierung oman chad nz de georgia zimbabwe france serbia lesotho romani oddmuse tunisia argentina czechia cameroon namibia sudan indonesia lifeboat colombia worldwildlifeday kryptowährung tuvalu britainology beckychambers turkmenistan tanzania germany neuhier norway comoros auteursrecht guatemala Thailand kosovo andorra wales indiastrikes servus pakistan belgium china antigua life koreasouth newzealand visiticeland einzelfall rwanda luxembourg libya indywales italyisntreal nauru moldova bad spanish eastindiacompany northernireland stigmergic palau taiwan kenya trinidad eu botswana sasl fossaudio CuriosidadesVariadas jamaica vanuatu cyprus aminus3 malta Icelandic niger s3 westpapua busse unitedstates myanmar saintvincent guinea nepal peru uganda uruguay india lebanon neurodiversity southafrica croatia europeanunion writerslife bolivia chinese dominican srilanka bulgaria slovakia speedrunning gabon psychedelicart ether stkitts liechtenstein neofeudalism brazil shutdowncanada + + Sat, 01 May 2021 11:58:46 UT + + + hardware + plugandplay peoplefarming purism schematics opennic zomertijd foundation restauration riscv solarpower carbonFootprintSham mietendeckel PersonalComputer cyberdeck PineCUBE tex keyboards electron hibernation schwarmwissen screenless homebrewcomputing FarmersTractorRally pinebook farming modem lowtech biblatex allwinner datenschutz daten pimeroni industrial analogcomputing homer TrueDelta keyboard screenprinting Pinecil raspberrypi3 pocketchip oshw misterfpga ArmWorkstation datensicherheit hardwarehacking mer picodisplay laptops electronics ham teamdatenschutz charm wolnabiblioteka uart panasonic pcb mermay printmaker deck powerpc acoustics ibmcompatible webcams modular larp cybredeck latex emmc ipadproart computing laptop solarpunk isa recycling apparmor repairability theatrelighting lenovo fairelectronics librem TokyoCameraClub MacBookProService pocket box86 JingPad fuse date solarpunkactionweek ibm 3dprinting electro carbon MechcanicalKeyboards hardware m68k retrohardware pinetab sicherheit openhardware raspberrypi datenautobahn webtoprint 3dprinter barcode Quartz64 PlanetComputer jtag ebu itsicherheit pinetime screens pinebookpro 3d batteries PinebookPro 3dprint Handprint modemmanager keyboardio mechanicalkeyboard robot arm lowerdecks ipad FireAlarms PinePower paperComputer amd openpower poweredSpeaker devopa eeepc F9600 rpi4 thinkpad RaspberryPiPico iot dat BeagleV repairable sbc circuitbending raspberrypi4 print displayport akihabara analog electronic + + Sat, 01 May 2021 11:58:46 UT + + + security + zuluCrypt signalboost repair encrypt letsencrypt messengers BrowserHistory FlexibilizaciónResponsable autoritäreretatismus BlacksInCyber omemo autotomy saveanonymity alg dataleak messenger foodinsecurity password keepassxc cryptography cybersecuritynews pipewire cryptolalaland solarwinds communityalgorithmictrust infosec gchq wireless castor repairing IHaveSomethingToHide fotografie passwords gif IronySec cryptowars anonym encryptioncan supplychainattacks UseAMaskUseTor anonymous cyberattack security tor comb e2e bruceschneier vpn BlacksInCybersecurity toreador itsec openssh factorio openssl spyware e2ee backdoor cryptotokens NSAmeansNationalScammingAgency stork conscientiousobjectors ed25519 torproject cryptomeanscryptography encryption 0day informationsecurity ssh misshaialert cybersec encryptionsist restore FormFactors crypto theObservatory autokorrektur giftofencryption kansascity auto signalapp anonymity fotografía onionshare onion autofahrer malware switchtosignal corydoctorow RestoreOurEarth radiorepair righttorepair cryptographyisoverparty opsec keepass encryptionists TastySecurity securitybyobscurity torsocks toronto nsa autorenleben schneier protonvpn trustissues InsecurityByObscurity yubikey nitrokey encrypted openpgp pgpainless ghibli castor9 deletesignal prismbreak gpgtools gpg fotopiastory equatorial sequoiapgp cybersecurity Tor CryptoWars signal noscript redaktor vector trust Torge cryptoparty wire historia itsecurity foto pgp RobinHoodStore cryptomator signalmessenger openvpn datasecurity autorotate regulators leak drugstore encryptiost libresignal doctors securitynow storage tracking + + Sat, 01 May 2021 11:58:46 UT + + + science + engineering math epidemiology stemfie electrochemistry ethnology womeninstem archeology botany STEM biodiversity ocean stemgeenFVD linguistic anthro supercollider nextgeneration zoology climatology SolarSystems dna geography physics archaeologist generalstreik geology ClinicalPsychology generationidentitaire economicanthropology Science SystemicRacism corrosion research stemwijzer bioengineering stemgeenPVV knowledge stemgeenVVD botanical dream dawkins ineigenersache stemgeenVVS holo graphTheory deepdreamgenerator meterology botanicalart JA21 regenerative biotech stemgeenJA21 psychology particles biology pacificocean generation gene fossilhunting badscience chemistry muon paleontology oceanography stem particlephysics nextgenerationinternet biomedical anthropology + + Sat, 01 May 2021 11:58:46 UT + + + photos + smartphonephotography nikon 90mm photography fujifilm wildlifephotography wild photo photogrpahy tokyocameraclub nikond90 photos macrophotography photographie photovoltaik camera macropod cameras fossphotography phonephotography myphoto naturephotography picture macro streetphotography FujinonXF90mm photoreference crop pictures + + Sat, 01 May 2021 11:58:46 UT + + + history + musichistory heirloom monarchs holocaust history arthistory makeinghistory anarchisthistory gaminghistory womenshistorymonth NetworkingHistory blackhistory monarch computerhistory + + Sat, 01 May 2021 11:58:46 UT + + + places + lapaz luanda asunción nouakchott conakry kyiv moscow saipan gibraltar dublin KlimaGerechtigkeit stuff catalunya dannibleibt avarua lilo hargeisa delhi niamey chișinău freestuff colombo brasília phnompenh mbabane danni belgrade rotterdam belmopan pyongyang hannover strawinsky calls ulaanbaatar oranjestad Reykjavik gaborone seattle ndjamena raw singapore kingedwardpoint abidjan nuuk asshole pretoria papeete malé rhetorical robberfly zagreb gitega abudhabi flyingfishcove castries georgetown hagåtña videoFreex oric videofeedback borikua basseterre hamburg afrika kinshasa Schadensersatzforderung suva klimaatverandering valparaíso athens roseau sheffield baku charlotteamalie antananarivo domi pristina bordeaux MakoYass videocalls santiago fsb sukhumi berlin urk uptronicsberlin funafuti libreville puertorico ClimateChange hanoi philipsburg tehran banjul prague rawhide andorralavella daw yerevan portauprince videoprojects dakar paramaribo tifariti capetown rigaer94 dma tirana klima ankara ipswich managua lisbon bishkek amsterdam climatchoas kent klimaat EastVirginia portonovo santodomingo bangkok texas bucharest kathmandu aden madrid sanjuan vienna kingston stuttgart kabul damascus stockholm douglas ClassOf2015 willemstad klimaschutz hibernoenglish thehague panamacity RassismusTötet beirut amman newdelhi tórshavn nouméa oslo alofi gustavia paris cockburntown ottawa classical stepanakert portofspain klimakrise class fsberlin honiara berniememe asmara florida nicosia helsinki taipei tegucigalpa bridge tokyo tashkent larochelle vr gabocom MadeInEU sarajevo algiers KlimaKrise nairobi muscat monaco riyadh flying lusaka wellington bissau juba mariehamn majuro buenosaires ngerulmud dhaka berlinhateigenbedarf guatemalacity washington vatican kuwaitcity Erdmannhausen londonboaters SystemChangeNotClimateChange bern mexicocity bratislava myasstodontownhall bridgetown delhipolice crowsnestpass tunis manila stanley matautu copenhagen barcelona lomé videocall budapest ouagadougou mogadishu PrawnOS freetown victoria lora brazzaville portmoresby ashgabat kampala Klimaatalarm gigabitvoucher kirigami webassembly elaaiún vilnius ContourDrawing bloemfontein gnuassembly sucre london passalong marseille berniesanders pagopago bradesestate oakland vaduz addis nürnberg naypyidaw CassetteNavigation khartoum baghdad bandar moroni cuirass lehavre portvila kingstown ChrisCrawford reykjavík lofi manama accra windhoek fortworth nukualofa classic ciutatvella tbilisi canberra quito maputo cetinje adams putrajaya ramallah solimaske bogotá dodoma harare havana warsaw münster valletta snes localberlin ljubljana bamako kualalumpur podgorica rabat cotonou oranje plymouth seoul neumünster Portland dushanbe bangui aotearoa westisland tskhinvali palikir caracas jamestown rome munich cambridge freestuffberlin sãotomé jakarta daressalaam sansalvador seo apia essex yaren cairo jerusalem brussels kigali southtarawa beijing minsk montevideo vientiane philips maseru klimaatopwarming hamilton lorawan lurk doha klimaatwake tripoli celtic portlouis lima adamstown deventer weimar abuja fuckalabamapower saw lilongwe nassau lobamba bernardhickey heathrow nyc fly montreal rawtherapee dili thesprawl riga assembly lesbos monrovia nursultan Neuzulassung gab sanjosé klimaatrechtvaardigheid marigot islamabad fb malabo tallinn sahara thimphu oranjeklanten klimanotstand yaoundé praia bujumbura strawberries washingtondc sofia skopje + + Sat, 01 May 2021 11:58:46 UT + + + software + beta borgbackup app fossnorth freedombox windows libre nginx postscript freenet freebsd kc Framasoft Flisol2021 invidious drm publicdomain ilovefreesoftware kubernetes openvms luca nodrm copyleft fossmendations freedoom jami betatesting libregraphics FuckOffZoom quicksy whiteboard free docker softwarelibre opensourcehardware interoperability impression3d freesoftware gimp backups foss matrix dinosaur mossad designjustice thefreethoughtproject filesystems nextcloud translate wechat notmatrix gnupg duplicati HappyLight opensourcesoftware agplv3 compression openscad freeganizm uidesign TabOrder searx ikiwiki Linux FreeSoftware userresearch FlisolLibre2021 DisCOElements Audio rocketchat thanksfreesw immers outreachy synapse API lyft freekirtaner photoshop nitter virtualbox ngi4eu discord whisperfish ee vaporware opensource diaspora yunohost oss chickadee appstore dégooglisons littlebigdetails cabal conferencing libreboot musiquelibre mycroft accessibility devops kdeapplications owncast phabricator emacs freiesoftware FLOSSvol moss fluffychat impress writefreely videoconferencing bigbluebutton email ngi chatapps HappyNewYear fossilfriday floss plugins softwaresuite graphic libresoftware softwareengineering mosstodon expandocat deltachat application uifail FOSS lucaapp GNOMECircle rockpro64 bittorrent penpot vlc zoom tiling FriendofGNOME usability winamp opendesign obnam snap ProprietarySoftwareProblems pandoc blackcappedchickadee cryptpad software libretranslate OwnStream upstream maplibre slack Hummingbard Element safenetwork asia SoftwareLibre zrythm gnu CTZN mumble grsync freecad drmfree telegram containers tails blockchain irssi HabKeinWhatsapp mcclim jitsimeet iso mutt librelingo WeAreAlmaLinux tilingwm sri design gameoftrees GnuLinuxAudio freegan freetool backup trueLinuxPhone rotonde freetube GNU speechrecognition skydroid thunderbird sysadmin it sound alternativeto parler apps chat licensing fossasia inclusivedesign defectivebydesign metager screenreaders sysadmins ZeroCool LINMOBapps obsproject softwareheritage profanity Tankklappe doomemacs ffmpeg fossandcrafts GNOME40 telesoftware love reboot opensourcegardens switchingsoftware OSM freesw agpl distribute magnifyingglass GNOME freeganizmniewybacza drive AlmaLinux GreenandBlackCross strafmaatschappij freetillie distributedledger mattermost principiadiscordia blue LinuxPhones rocket ghostscript win10 Zoom elemental flisoltenerife libreops element platforms inclusive ptp chatty lucafail informationwantstobefree softwareGripe nativeApp MatrixEffect culturalibre jitsi flisol dinosaurier wordpress SwitchToJami mongodb ux rsync libreoffice crossstitch dino plugin xwiki openoffice container discordia softwaredesign redeslibres ledger sounddesign chatcontrol alternatives glimpse + + Sat, 01 May 2021 11:58:46 UT + + + conferences + FOSDEM2021 stackconf debconf FOSDEM talk fossdem FreedomBoxSummit apconf2020 schmoocon realtalk penguicon2021 summit confidenceTricks libreplanet confluence minidebconf edw2021 rc3worldleaks StopStalkerAds SeaGL penguicon emacsconf MCH2021 flossconference conferences ox defcon emfcamp flossevent askpinetalk conf defcon201 rC3 rC3World FOSDEM21 conference mozfest flossconf apconf ccc persconferentie GeekBeaconFest rC3one smalltalk C3 config penguicon2022 confy + + Sat, 01 May 2021 11:58:46 UT + + + food + vitamind cake teamviewer FoodHardship pankow margarine zwartepiet dessert foils salsa caviar brot theexpanse BellaSpielt cookery pietons Ôtepoti panther food cakecutting skillet teamgodzilla spiel liquor milk bolognese recipe foodporn yeast drinking VendrediPeanutsNouka plate waffle pansexual biscuit glaze omelette veganismo filet pastry wine woke Caribbeans hamburger juice unauthorizedbread Amazfish sourdough gedankenspiel cagefree nuts gras toast broth batter foodie breadposting spiele ketchup divoc seasoning mayo soup arpanet pan voc imateapot Anglefish potatoes mayonnaise vegan dish avocado spice keto bakery butterfly cooking teamhuman SailfishOS yogurt thecandycrystalrainbowcodex crumble cider caffeine butter mastokitchen triceratops cook pottery creepypasta wastemanagement kitchencounter mastocook cobbler steak pizza vocaloid soda fedikitchen aroma oil Miroil angelfish flour foodsovereignty cream nutella pie cuisine potse meatismurder freerange tartar kropotkin tea marinade cakes mushroom thekitchen entree lfi dominospizza bread salad beans fresh syrup fermentation teamsky mushrooms cookie wordstoliveby curd soysauce lowcarb pudding plantbased beer baking peterkropotkin fish panoptykon spanisch foodwaste wholeGrain wheat pot TeamFerment Wypierdalaj sauerkraut stew weltspiegel chocolate paste soynuevo wok rainbow recipes kitchengarden expanse olive burger mrpotatohead candy Steam kitchen coffee bagel teams taste SpieleWinter2020 meat johannisbeeren noodle raclette caramel rice eggs grill davewiner poutine demoteam lard croissant pasta vegane strawberry foods WaterDrinkers cheese oregano drink muffin bikekitchen krop LowRefresh foie onepiece sauce foodanddrink soy godzilla growyourfood vore wholewheat pandemie cocoa sandwich mousse waste chili redfish + + Sat, 01 May 2021 11:58:46 UT + + + farming + johndeere deer + + Sat, 01 May 2021 11:58:46 UT + + + indymedia + fpga hs2 visionontv geek tredtionalmedia degeek globleIMC indymediaback openfoodnetwork pga indymedia networking stupid hs2IMC indymediaIMC network networkmonitoring roadsIMC stupidindivialisam roadstonowhere lifecult avgeek monitor omn tv roadstonowhereIMC UKIMC fluffy 4opens openmedianetwork + + Sat, 01 May 2021 11:58:46 UT + + + cycling + bicycle cycle bic cycling bike motorbike cyclingtour thingsonbikes openbikesensor Snowbike cyclist + + Sat, 01 May 2021 11:58:46 UT + + + phones + mobileapp fairphone3 téléphone nemomobile manjaro Jingos plasmaDev 5g mobian pine alarmphone fdroid plasmamobile shotonpinephone fairuse android smartphonepic nophone ubportsqanda linuxmobile sailfish phones fennecfdroid Mobian osmf smartphone plasma5 ios selinux mobileGNU PinePhoneOrderDay sms4you mob bp microphone linuxconnexion smartphones iOS14 pinemarten linuxphones openmoko mobilecoin mobilelinux freeyourandroid fair QWERTYphones sailfishos siskinim epic monal android10 osmocom Smartphones WakeMobile lineageos molly androiddev manjarolinux plasma phosh BriarProject librem5 ubportsinstaller osm shotonlibrem5 pinephone Teracube PinePhone mobile pinephones sms pine64 fairphone ubuntutouch linphone Android alpinelinux osmirl linux ubports gnomeonmobile osmand vodafone gnomemobile linuxonmobile iphones postmarketos iOS microg grapheneos recycletechjunkuselinux phone mobileKüfA + + Sat, 01 May 2021 11:58:46 UT + + + pandemic + covid19 coronaPolicies corona justasleepypanda psmeandmywholefamilycaughtcovidfromwork Coronavirus CoronaWarnApp facemasks vaccines pandemics vaccine JournalistsSpeakUpForAssange coranavirus pandemic sayhername internationalproletarianrevolution Zbalermorna covidville ZeroCovid contacttracing SùghAnEòrna tier4 coronapandemie covid pand volodine COVID19NL Moderna coronavirus masks Moderna2 COVIDrelief virus contacttracingapps moderna coronadebat Lockdown rna codid19 COVID19 YesWeWork ContactTracing vol CoronaCrisis COVID coronamaatregelen coronabeleid + + Sat, 01 May 2021 11:58:46 UT + + + books + readinggroup bookstore bookbinding justhollythings bookclub fake earthsea review ebooks docbook book notebook public amreading republicday failbook bookwyrm 5minsketch bookreview reading theLibrary cda netbook audiobooks sketchbook wayfarers fakebook books peerreview bookreviews failbooks sketch ebook wikibooks epub cookbook AnarchoBookClub + + Sat, 01 May 2021 11:58:46 UT + + + bots + mrrobot human bot Militanzverbot nobot botanists humanity militanzverbot humanrobotinteraction therobots humanetechnow verbote humankind + + Sat, 01 May 2021 11:58:46 UT + + + war + ru DonavynCoffey Myanmarmilitarycoup civilwar antiwar bomber coup tank handforth landmine tankies military autonomousweapons army Etankstelle weaponsofmathdestruction conflict navy warplane fort guns Myanmarcoup weapons siege battle WMD wmd airforce forth + + Sat, 01 May 2021 11:58:46 UT + + + astronomy + telescope mercury pluto planets galaxy venus mars amateurastronomy uranus spacex nebula astronomy neptune space jupiter blackhole asteroid BackYardAstronomy moon thehitchhikersguidetothegalaxy observatory asteroidos saturn milkyway spacelarpcafe + + Sat, 01 May 2021 11:58:46 UT + + + other + ageassurance lastpass yolo nothingnew Lastpass extinction MasseyUniversity itscomplicated massextinction misc mining pinside rant Terrassen righttodisassemble nsfw biomass ass Chiacoin assassinfly migrantstruggles PointlessGriping decluttering OCUPACAOCARLOSMARIGHELLA assembler + + Sat, 01 May 2021 11:58:46 UT + + + news + report news flash Wikileaks newsletter nothingnews newsflash newsroom Worldnews rt bbc foxnews News goodnews doubledownnews bbcnews reuters theguardian badReporting newsboat journalism SkyNews lobsters + + Sat, 01 May 2021 11:58:46 UT + + + cats + Cat dailycatpic dxp DailyCatVid Cats katze kotorico kot CatsOfMastodon Catshuis Leopard catbellies LapCats qualitätskatzen + + Sat, 01 May 2021 11:58:46 UT + + + employment + InterviewQuestions bullshit jechercheunjob mywork employees hiring workingfromhome ProgrammingJob reproductivework frame workinprogress bullshitjobs car workplace antiwork kreaturworks worklog sexworkers mainframe remotework remotejobs job DjangoJob teamwork framework hire KDEGear hirefedi workshop illustratorforhire tidyworkshops carework nowhiring KDE KDEGear21 obs workersrights obsolescence KDEFrameworks work hertfordshire flossjobs jobs precariousworkers sexworker + + Sat, 01 May 2021 11:58:46 UT + + + radio + cbradio worldradioday hamr varia why tootlabradio pouetradio dx macintosh amateurradio radiohost radiokapital localization nwr vantaradio ca radio healthcare listening hamradio FreeAllPoliticalPrisoners variabroadcasts card10 fastapi radiobroadcasting radiosurvivor Poecileatricapillus apis radioshow local radio3 noshame osh audycja hackerpublicradio kosher Phosh audycjaradiowa california road nowlistening radiobroadcast radiostation mastoradio broadcasting radiodread amateurr spazradio anonradio kolektywneradio io api + + Sat, 01 May 2021 11:58:46 UT + + + pets + spinning catpics uninstallman ExposureNotifications germanshepherd catofmastodon nin TheRabbitHole verification eurocrats QuestioningTechnology cathedrals Stelleninserat reEducationCamp mastodogs rats catbehaviour digidog Stallman Coolcats petrats governing dogsofmastodon gentrification evening broadcats gattini bunyPosting kitten fostercats cats uninStallman kittens Uninstallman pet dog scotties ageverification Pruning acat caturday catsofmastodon leninismo meow cute mastocat lenin catstodon dogs catsofparkdale mastocats W3CSpecification mastodog notpixiethecat londoninnercitykitties cat blackcat furry petitie dogsofmaston training catcontent UserDomestication + + Sat, 01 May 2021 11:58:46 UT games - appdesign minecraft tetris99 gamestop ageofempires TerraNil runequest dragonfall boardgames computergames fucknintendo gameassets gamestonk FediDesign puzzle indiegames gamedesign shadowrun chess nintendoswitch mud indiegame game 0ad gameart opengameart sign asset ttrpg gamedev freegames guildwars2 bideogames TetrisGore gaming gamemaker gameing nintendo roleplayinggames Gamesphere devilutionx rpg gamespot tetris dosgaming DnD cyber2077 tarot cyberpunk2077 gamesforcats FreeNukum spelunkspoil supermariomaker2 neopets minetest omake guildwars dnd games + appdesign minecraft tetris99 gamestop ageofempires BiophilicDesign videogame ksp TerraNil dungeonmaster AudioGame runequest miniatures dragonfall boardgames computergames fucknintendo fudgedice gameassets gamestonk videogames FediDesign puzzle indiegames gamedesign shadowrun spot godotengine adventuregames chess gamejam nintendoswitch mud indiegame game 0ad dragon playlog gameart opengameart sign asset ttrpg gamedev freegames guildwars2 bideogames TetrisGore gaming gamemaker gameing nintendo roleplayinggames Gamesphere devilutionx rpg gamespot tetris dosgaming DnD cyber2077 godot tarot cyberpunk2077 gamesforcats FreeNukum spelunkspoil boardgaming supermariomaker2 neopets minetest omake guildwars dice dnd games - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT years newyearsresolutions resolutions Year2020 year 1yrago newyear happynewyear 5yrsago newyearseve - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT linux - osdev opensuse linuxisnotanos elementaryos cli viernesdeescritorio shell aves kde Debian11 kdepim thisweekinlinux slackware search bsd tap openwrt distros tmux nixos nix DebianBullseye xfce ubuntubuzz shareyourdesktop personal wireguard linuxaudio usb nixpkgs gtk linuxmint debian trisquel gnome linuxposting console showyourdesktop research windowmanager desktop GuixSystem arch platform ubuntu snowfall gnulinux aur justlinuxthings xubuntu unix fedora centos tuxedocomputers openmandriva gentoo aurora researcher liveusb personalarchive usergroup systemd linuxgaming Debian distro tape destinationlinux LinuxSpotted Squarch gtk3 escritoriognulinux qubesos i3wm kubuntu epr JuiceFS reproducible haiku linuxisnotaplatform clip fall EMMS raspbian netbsd shellmustfall termux btrfs reproduciblebuilds joke artix gtk4 archlinuxarm bash archlinux platforms linuxconfau researchers GNUlinux rhel debianinstaller debianindia linuxisajoke suse linuxconsole + osdev opensuse share linuxisnotanos elementaryos cli buster viernesdeescritorio shell aves kde Debian11 reprobuilds pureos kdepim thisweekinlinux slackware wegmetdemonarchie search bsd tap openwrt falling runbsd distros stapler tmux seashell nixos alpine nix DebianBullseye xfce ubuntubuzz gnutools vaguejoke ack shareyourdesktop personal wireguard whonix hardenedbsd linuxaudio mate usb nixpkgs wordsearch torvalds gtk linuxmint DebianAcademy debian chroot trisquel gnome distrowatch linuxposting fedoraonpinephone console showyourdesktop FuckDeMonarchie windowmanager desktop GuixSystem arch platform ubuntu personalwiki snowfall gnulinux aur justlinuxthings xubuntu kdeframeworks5 unix fedora openbsd centos tuxedocomputers openmandriva gentoo aurora researcher liveusb dee personalarchive usergroup StockOS systemd linuxgaming Debian distro icecat tape puppylinux destinationlinux LinuxSpotted suicide show Squarch computer gtk3 escritoriognulinux qubesos i3wm clipstudiopaint dadjokes kubuntu epr JuiceFS reproducible haiku linuxisnotaplatform clip fall EMMS minicomputer raspbian netbsd DanctNIX termux btrfs reproduciblebuilds gravitationalwaves joke artix gtk4 linuxexpress archlinuxarm bash archlinux hare linuxconfau researchers AuratAzadiMarch gnomebuilder GNUlinux rhel debianinstaller debianindia linuxisajoke tux suse zsh linuxconsole - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT - art - arttips mastoartist paperart CreativeToots Linke subresourceintegrity water resource urban article glassart martialarts artalley artvsartist2020 circulareconomy abstract artreference poe nomadbsd dccomics inkscape artificalintelligence circuitsculpture watercolor resources memes autisticartist barrigòtic art sona animalart krita anthroart urbanart queerart deviantart CircusInPlace pastel drawings adultcolouring source collective openstreeetmap collage jordanlynngribbleart linkedin links thinkabout PartyPooperPost openai harmreductionart MastoArtHeader openra wallpaper ircd political agriculture streetart coverart stickers freeculture fiberart pcb MastoArt particl ParticlV3 groenlinks creativetoots culture ganart opencl fiberarts polArt ink painting Leitartikel marten opencoop digitalart comic sartre artwork openbsd mandala b3d politicalcartoon blackart glitch xkcd comics intelligence linkinbio mastoart urbanterror illustration artopencall gnuimagemanipulationprogram os wireart cartoon oc AccidentalGraffiti eink OriginalCharacter poezio webcomic DigitalArt partnership oilpainting irc furryart twinkle DisabledArtist pink fursona inkjet generativeart sticker enbyart particles artbreeder 17maart djmartinpowers arttherapy fractal enby TattoosOfTheFediverse signalstickers digitalpainting artvsartist abstractart drawing sig circular sculpture artist pcbart meme cultureshipnames concretepoetry artwithopensource pinkwug commissions opencallforartists commissionsopen fountainpenink power peppertop visionaryart blackartist zine artists heart genart stickerei lineart smartcard pixelart alisajart opencollective openrailwaymap circuitbending JuliaHartleyBrewer digitalArt artistsOfMastodon + transport + deutschland deutsch deutschebahn - Sun, 07 Mar 2021 20:25:51 UT - - - crafts - topic_imadethis hackerexchange exchange textile upholstery hackgregator gatos gato hackspacers shack dust3d hackerspaces sanding solvespace sundiy maker knitting hack hacked calligraphy biohacking wip jewelry diy upcycling woodworking 3dcad origami makers quilting hacker quilt weaving 3dmodel tinkering hacking woodwork ceramics embroidery shacks teardown - - Sun, 07 Mar 2021 20:25:51 UT - - - pets - catpics germanshepherd catofmastodon nin TheRabbitHole cathedrals Stelleninserat reEducationCamp mastodogs rats catbehaviour Coolcats petrats dogsofmastodon gentrification broadcats bunyPosting kitten fostercats cats kittens pet dog acat icecat caturday catsofmastodon meow cute mastocat catstodon dogs mastocats notpixiethecat londoninnercitykitties cat furry catcontent UserDomestication desertification - - Sun, 07 Mar 2021 20:25:51 UT - - - war - Myanmarmilitarycoup civilwar antiwar bomber coup tank handforth landmine military autonomousweapons army Etankstelle weaponsofmathdestruction conflict navy warplane fort guns Myanmarcoup weapons siege battle WMD wmd airforce forth - - Sun, 07 Mar 2021 20:25:51 UT - - - legal - eek rma hfgkarlsruhe amro karlsruhe remotelearning SpreekJeUitBekenKleur disinformation GameSphere OnlineHarmsBill laipower gdpr intros Anticritique learning energyflow misinformation peekier mojeek digitalservicesact geekproblem dmca - - Sun, 07 Mar 2021 20:25:51 UT - - - climate - energy renewables clouds openscience renewableenergy amp climateemergency climatechos ClimateAction climate climateracism renewable windenergy coal weatherforecast klimaatcrisis skypack poll fossilfuel globalwarming climatechange weather ragingqueerenergy climatecamp windpower globally globalization climatechoas pollution global parisclimateagreement science fossilfuels Climate sky climatescience energytransition climateaction ClimateCrisis globalviews climatemitigation climatecrisis - - Sun, 07 Mar 2021 20:25:51 UT - - - fiction - ABoringDystopia cyberpunk thehobbit fiction flashfiction genrefiction - - Sun, 07 Mar 2021 20:25:51 UT - - - gender - transparantie transistors broketrans transwomen transformativejustice transparency transcrowdfund esperanto transmission transgender womensart female osi nonbinary vantascape blacktransmagic nb trans nonbinarycommunity transpositivity transphobia transmitter women sri rant estradiol transfer transgenders pointlesslygendered queer genderQuiz gender genderqueerpositivity woman transrights - - Sun, 07 Mar 2021 20:25:51 UT - - - audio - feed audioproduction pulseaudio audi feedbackd audiofeedback audio - - Sun, 07 Mar 2021 20:25:51 UT - - - media - livestreaming ip sustainable mediathek mainstreaming stream trad maistreaming selfsustainable kawaiipunkstreams mainstream streaming weAreAllCrazy streamdeck maiabeyrouti sustainability diymedia submedia theatlantic traditionalmedia videos newsmedia wikimedia mixedmedia railroads documentary streamers tootstream taina ai realmedia media independentmedia theintercept - - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT activism - protestor clearchannel tyrannyofconvenience grassroot FreeLibreOpen g20 rig bekannt farmersprotest protests riseup sflc DanniVive apt reuse stopspyingonus keepiton FSFE20 fsfe softwarefreedom ilovefs ann activist xr SustainableUserFreedom bannerlord seachange directaction eff change openrightsgroup protest icantbreathe JeffreySDukes actiondirecte kroymann HS2 ngo MarcWittmann fsf fsfi StopHS2 grassroots HS2Rebellion antireport ClimateJustice BLM ExtinctionRebellion namechange changeisinyourhands conservancy ngos sp JefferySaunders LiliannePloumen climatechangeadaptation Kolektiva XR freeolabini announcement isolateByoblu annieleonard + rights protestor dutysolicitor roots annonce clearchannel nog20 farright tyrannyofconvenience grassroot nonviolentcommunication FreeLibreOpen g20 JusticeForRapheal rig bekannt farmersprotest animalrights protests riseup sflc DanniVive apt freeassange reuse stopspyingonus keepiton FSFE20 fsfe killthebill softwarefreedom AntiCopyright ilovefs ann activist edrigram xr SustainableUserFreedom bannerlord undercurrents righttoexist seachange directaction mannheim Doulingo politicalactivism wechange eff change openrightsgroup protest icantbreathe JeffreySDukes FSF actiondirecte kroymann protestsupport climatchange HS2 ngo MarcWittmann StandWithTillie fsf fsfi StopHS2 grassroots HS2Rebellion FreeJournalistAssange antireport ClimateJustice BLM ExtinctionRebellion shellmustfall namechange changeisinyourhands weareallassange conservancy ngos sp JefferySaunders GreatGreenWall LiliannePloumen freeassangenow directactiongetsthegoods climatechangeadaptation Kolektiva XR freeolabini announcement isolateByoblu annieleonard - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT + + + crafts + topic_imadethis hackerexchange exchange quilts textile upholstery hackgregator gatos gato hackspacers shack 3dmodeling dust3d hackerspaces tryhackme sanding solvespace sundiy craft papercrafts maker knitting hack hacked calligraphy biohacking wip spacecrafts hacktheplanet jewelry diy textiles projects hackerweekend handicrafts Handicraft upcycling woodworking 3dcad glass origami makers quilting crafting hacker quilt crafts weaving 3dmodel tinkering hacking woodwork ceramics embroidery shacks teardown + + Sat, 01 May 2021 11:58:46 UT + + + seasons + mailspring spring lupin thespinoff Dadvice hiddenServices autumn abolishice namedropping office hooping es pinterest winter ice hpintegrity pingpong PoliceTenSeven santa summer iced summerschool onlyoffice icedipping solstice unicef wintersolstice FederalOffice summerRolls pin homeoffice + + Sat, 01 May 2021 11:58:46 UT + + + legal + commandline eek scanlines rma remote formatie2021 hfgkarlsruhe amro karlsruhe dmc remotelearning tamron SpreekJeUitBekenKleur newnormal line disinformation OnlineHarms GameSphere squeekboard stopline3 OnlineHarmsBill laipower gdpr intros Anticritique energyflow misinformation peekier MovieGeek mojeek digitalservicesact line3 mainline airline permafrost geekproblem dmca + + Sat, 01 May 2021 11:58:46 UT questions - askmastodon askfedi question askmasto askfediverse totallyaskingforafriend ask askfosstodon + checking askmastodon biking questions king lockpicking askfedi askafriend question SocialNetworkingReimagined askmasto askfediverse totallyaskingforafriend ask askfosstodon - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT + + + climate + energy SoilCarbon vampire renewables fuel clouds apollo racisme mitm openscience renewableenergy ClimateMeme amp climateemergency climatechos ClimateAction climate climateracism renewable windenergy ClimateProtection coal mit weatherforecast crisis vampiro klimaatcrisis environment skypack poll fossilfuel earthscience globalwarming climatechange limitededition weather ragingqueerenergy climatecamp windpower sealevelrise globally globalization climatechoas racism CarbonOffsets basecamp exitpoll pollution global parisclimateagreement science fossil OABarcamp21 fossilfuels Climate sky climatescience energytransition climateaction ClimateCrisis warm globalviews headlamp climatemitigation Ruttecrisis climatecrisis + + Sat, 01 May 2021 11:58:46 UT + + + fiction + ABoringDystopia interactivefiction cyberpunk thehobbit fiction nonfiction flashfiction cyberpunk2020 genrefiction + + Sat, 01 May 2021 11:58:46 UT + + + gender + transparantie transistors broketrans internationalwomensday2021 transwomen transformativejustice transcrowdfund sylvanasimons resistance transmission transgender caféLatte transdayofresistance mens vieillesse womensart blacktranslivesmatter female osi nonbinary womensday vantascape van blacktransmagic less nb trans nonbinarycommunity transpositivity transdayofvisibility lgbtqia transphobia transmitter women lgbt womenrock estradiol lgbtq queerartist KCHomelessUnion transfer transgenders pointlesslygendered queer transdayofvisbility genderQuiz gender genderqueerpositivity woman transrights transdayofrevenge + + Sat, 01 May 2021 11:58:46 UT + + + audio + feed audioproduction pulseaudio audi feedbackd audiogames audiofeedback audio auditoriasocial + + Sat, 01 May 2021 11:58:46 UT + + + garbage + Anonymous cumbria documentation no QAnonAnonymous cum u ChanCulture + + Sat, 01 May 2021 11:58:46 UT + + + media + livestreaming ip digitalmedia mustwatch sustainable transparency mediathek mianstreaming mainstreaming stream trad maistreaming selfsustainable kawaiipunkstreams mainstream films streaming weAreAllCrazy video streamdeck puns maiabeyrouti mixed sustainability diymedia film submedia theatlantic traditionalmedia videos Internetradio mediawatch mainstreamining newsmedia audiovideo videosynthesis filmnoir wikimedia mixedmedia railroads documentary streamers gstreamer tootstream taina ai mediawiki realmedia media independentmedia theintercept + + Sat, 01 May 2021 11:58:46 UT birds - RainbowBeeEater pigeon cawbird pigeonlover bird birdwatch birding birdwatching + RainbowBeeEater pigeon cawbird pigeonlover bird birdwatch birding birbposting birdwatching - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT ethics - digitalethics ethics ethicallicense license ethical + digitalethics ethicaltech ethics ethicallicense license ethical - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT disability ableism disabled - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT + + + privacy + whatip PrivacyBook SearchHistory privacyaware dataprivacyday profiling what3words surveillancestate Privacy privacypolicy WhatsApp privacytoolsio makeprivacystick surveillancetech onlineprivacy developertools tools privacyredirect drugpolicy privacymatters policy privacyMatters whatsappprivacypolicy dataprivacy privacywashing privacy privacyinternational hat DataPrivacyDay2020 PrivacyFlaw ev nl WhatsappPrivacy + + Sat, 01 May 2021 11:58:46 UT podcasts - podcasting IntergalacticWasabiHour podcast tilde til postmarketOSpodcast tilderadio tildes podcasts tildeverse smallisbeautiful fertilizers tilvids qtile + podcasting IntergalacticWasabiHour podcast tilde postmarketOSpodcast tilderadio tildes podcasts tildeverse smallisbeautiful fertilizers PineTalk tilvids tildetown qtile - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT + + + philosophy + post minimalism maximalist maximalism digitalminimalism philosophy stoic postmodernism minimalist + + Sat, 01 May 2021 11:58:46 UT + + + religion + atheist neopagan pagan catholic paganism genesis SiddarthaGautama + + Sat, 01 May 2021 11:58:46 UT culture etiquette - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT funding - donate disabilitycrowdfund disabledcrowdfund alledoerferbleiben fundraiser BreakWalledGardens knowledge ngizero zeroknowledge edge led patreon + donate disabilitycrowdfund disabledcrowdfund alledoerferbleiben ethicalfunding mastercard netzfundstück fundraiser BreakWalledGardens ngizero fun oer zeroknowledge edge led zerohedge vkickstarter fungus fungi EntangledLife opencollective patreon - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT identity boomer - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT licenses - commongoods tootle copyright creative common gpl copyrightlaw tragedyofthecommons cc0 creativecommons commongood cc + commongoods creativecommonsrocks tootle CommunitySource copyright creative netcommons common gpl plugplugplug copyrightlaw EthicalSource questioncopyright tragedyofthecommons cc0 creativecommons commongood cc creativetoot - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT political - copservation progress rog house progressivehouse linguisticProgramming + copservation ram progress slaughterhouse rog cops houseless joerogan house straming theGreenhouse teahouse progressivehouse techhouse clubhouse yayagram PDXdefendthehouseless pdxhouseless deephouse linguisticProgramming - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT fashion - brasil fashionistas fashionesta bras fashionista fashion punkwear socks patches feditats zebras + brasil fashionistas fashionesta bras fashionista fashion punkwear earrings socks patches feditats zebras - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT techbros - securedrop einfachredeneben coloredpencil redhat hackernews red reddit redis + redbubble securedrop einfachredeneben coloredpencil redhat hackernews weareredhat red pencil reddit redis infrared redshift - Sun, 07 Mar 2021 20:25:51 UT - - - bots - human bot Militanzverbot botanists humanity militanzverbot humanrobotinteraction - - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT month - april july march chapril october november august june blackherstorymonth december september may feburary jejune january blackhistorymonth month blacktheirstorymonth + april 1may july march chapril marchofrobots2021 october november august june blackherstorymonth december september may feburary jejune january marchofrobots blackhistorymonth march4justice month blacktheirstorymonth - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT welfare - universalcredit welfare credit + universalcredit welfare socialwelfare credit - Sun, 07 Mar 2021 20:25:51 UT - - - books - justhollythings bookclub earthsea ebooks docbook book public amreading republicday failbook bookwyrm bookreview reading theLibrary wayfarers fakebook books bookreviews ebook wikibooks epub cookbook AnarchoBookClub - - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT comedy - laugh farce humour satire irony standup funny humor + laugh farce humour satire irony standup funny humor pun - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT health - medical burnout cannabis medicine run treatment EmotionalFirstAid safeabortion4all maryjane autistic running neurodivergent health motion actuallyautistic meds marijuana mentalhealth H5N8 healthy neurodiverse asperger autismus + medical CoronaApp autism burnout Underunderstood cannabis medicine run treatment EmotionalFirstAid safeabortion4all maryjane organisierung autistic running neurodivergent health motion actuallyautistic meds marijuana suicideprevention mentalhealth H5N8 healthy autismmeme drugs neurodiverse grunge asperger autismus - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT introductions reintroductions newhere firsttoot recommends Introduction Introductions introductons introduction intro introductions - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT facts - funfact didyouknow lifehack + funfact unfa didyouknow lifehack - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT ai - machinelearning + machinelearning openai - Sun, 07 Mar 2021 20:25:51 UT - - - seasons - spring autumn abolishice office winter ice santa summer onlyoffice icedipping solstice unicef wintersolstice summerRolls pin - - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT commons - opennmsgroup open openocd opennms openworlds openinnovation opennmt openweb + opennmsgroup open linkedopenactors openaccess openocd openengiadina opennms ess opensourcing openpublishing openworlds openwashing openinnovation opennmt - Sun, 07 Mar 2021 20:25:51 UT - - - philosophy - minimalism maximalist maximalism digitalminimalism philosophy stoic postmodernism minimalist - - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT education - SchoolForAfrica education teach tutorial + SchoolForAfrica techlearningcollective education teach learning languagelearning tutorial ec - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT scifi - startrekdiscovery startrek bitwarden discover SoftwareJob starwars war babylon5 + startrekdiscovery startrek bitwarden discover SoftwareJob LegDichNieMitSchwarzenKatzenAn starwars ds9 babylon NGIForward war babylon5 - Sun, 07 Mar 2021 20:25:51 UT - - - privacy - SearchHistory privacyaware dataprivacyday profiling surveillancestate Privacy privacypolicy privacytoolsio makeprivacystick surveillancetech developertools tools privacymatters policy whatsappprivacypolicy surveillance dataprivacy privacywashing privacy DataPrivacyDay2020 WhatsappPrivacy - - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT photography - pea landscapephotography landscapeart XSystem darktable hippeastrum landscape + pea landscapephotography landscapeart XSystem darktable peppercarrot speakers hippeastrum landscape - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT microcontroller - e microcontroller troll arduinoide arduino + e microcontroller Chatkontrolle troll arduinoide arduino - Sun, 07 Mar 2021 20:25:51 UT - - - religion - neopagan pagan catholic paganism genesis - - Sun, 07 Mar 2021 20:25:51 UT - - - design - userfriendly - - Sun, 07 Mar 2021 20:25:51 UT - - - other - Lastpass itscomplicated misc biomass ass assassinfly decluttering OCUPACAOCARLOSMARIGHELLA - - Sun, 07 Mar 2021 20:25:51 UT - - - help - mastohelp helpful help - - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT obituaries - tripadvisor rip + lichtenberg tripadvisor rip JavaScriptSucks obit ecmascript raspberripi obituaries ber liberty - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT - garbage - no QAnonAnonymous cum u ChanCulture + design + userfriendly friendly - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT + + + help + mastohelp helpwanted helpful help + + Sat, 01 May 2021 11:58:46 UT + + + travel + travellers travel taxi airtravel + + Sat, 01 May 2021 11:58:46 UT accessibility a11y - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT election Rainbowvote voted vote - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT moderation fedblock - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT entertainment - legallyblonde watching Thundercat makingof entertainment me un nowwatching themandalorian nt + legallyblonde watching Thundercat makingof entertainment me un nowwatching mandalorian themandalorian nt - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT languages lojban gaelic - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT environment - s clim climatechaos + s clim climatechaos climateadaptation - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT + + + organization + conceptmap mindmapping mindmap notetoself pi + + Sat, 01 May 2021 11:58:46 UT microcontrollers esp32c3 esp8266 esp32 - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT scotland glasgow highlands edinburgh loch - Sun, 07 Mar 2021 20:25:51 UT - - - transport - deutsch deutschebahn - - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT agriculture farmers - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT france Macronavirus - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT - travel - travel taxi airtravel + sailing + theBoatyard - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT + + + parenting + dadposting + + Sat, 01 May 2021 11:58:46 UT + + + jewelry + bracelet + + Sat, 01 May 2021 11:58:46 UT architecture concrete - Sun, 07 Mar 2021 20:25:51 UT + Sat, 01 May 2021 11:58:46 UT From fc6e85b6caa05118812a869b03ad948ec571899d Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 3 May 2021 11:05:05 +0100 Subject: [PATCH 0867/1416] Make the display of account and version info within nodeinfo metadata opt-in --- daemon.py | 15 +++++++++++++-- epicyon.py | 24 +++++++++++++++++++++++- metadata.py | 23 +++++++++++++++++++---- tests.py | 18 +++++++++++++++--- 4 files changed, 70 insertions(+), 10 deletions(-) diff --git a/daemon.py b/daemon.py index ad0a7fee9..9a2441a61 100644 --- a/daemon.py +++ b/daemon.py @@ -971,9 +971,15 @@ class PubServer(BaseHTTPRequestHandler): return False if self.server.debug: print('DEBUG: nodeinfo ' + self.path) + + nodeInfoVersion = self.server.projectVersion + if not self.server.showNodeInfoVersion: + nodeInfoVersion = '0.0.0' + info = metaDataNodeInfo(self.server.baseDir, self.server.registration, - self.server.projectVersion) + nodeInfoVersion, + self.server.showNodeInfoAccounts) if info: msg = json.dumps(info).encode('utf-8') msglen = len(msg) @@ -14743,7 +14749,9 @@ def loadTokens(baseDir: str, tokensDict: {}, tokensLookup: {}) -> None: break -def runDaemon(brochMode: bool, +def runDaemon(showNodeInfoAccounts: bool, + showNodeInfoVersion: bool, + brochMode: bool, verifyAllSignatures: bool, sendThreadsTimeoutMins: int, dormantMonths: int, @@ -14812,6 +14820,9 @@ def runDaemon(brochMode: bool, print('serverAddress: ' + str(serverAddress)) return False + httpd.showNodeInfoAccounts = showNodeInfoAccounts + httpd.showNodeInfoVersion = showNodeInfoVersion + # ASCII/ANSI text banner used in shell browsers, such as Lynx httpd.textModeBanner = getTextModeBanner(baseDir) diff --git a/epicyon.py b/epicyon.py index a6d265f25..2384a9421 100644 --- a/epicyon.py +++ b/epicyon.py @@ -322,6 +322,16 @@ parser.add_argument("--brochMode", type=str2bool, nargs='?', const=True, default=False, help="Enable broch mode") +parser.add_argument("--nodeinfoaccounts", + dest='showNodeInfoAccounts', + type=str2bool, nargs='?', + const=True, default=False, + help="Show numbers of accounts within nodeinfo metadata") +parser.add_argument("--nodeinfoversion", + dest='showNodeInfoVersion', + type=str2bool, nargs='?', + const=True, default=False, + help="Show version number within nodeinfo metadata") parser.add_argument("--noKeyPress", dest='noKeyPress', type=str2bool, nargs='?', @@ -2600,6 +2610,16 @@ brochMode = \ if brochMode is not None: args.brochMode = bool(brochMode) +showNodeInfoAccounts = \ + getConfigParam(baseDir, 'showNodeInfoAccounts') +if showNodeInfoAccounts is not None: + args.showNodeInfoAccounts = bool(showNodeInfoAccounts) + +showNodeInfoVersion = \ + getConfigParam(baseDir, 'showNodeInfoVersion') +if showNodeInfoVersion is not None: + args.showNodeInfoVersion = bool(showNodeInfoVersion) + YTDomain = getConfigParam(baseDir, 'youtubedomain') if YTDomain: if '://' in YTDomain: @@ -2614,7 +2634,9 @@ if setTheme(baseDir, themeName, domain, print('Theme set to ' + themeName) if __name__ == "__main__": - runDaemon(args.brochMode, + runDaemon(args.showNodeInfoAccounts, + args.showNodeInfoVersion, + args.brochMode, args.verifyAllSignatures, args.sendThreadsTimeoutMins, args.dormantMonths, diff --git a/metadata.py b/metadata.py index 14db42f3e..4b512bffa 100644 --- a/metadata.py +++ b/metadata.py @@ -12,12 +12,27 @@ from utils import noOfAccounts from utils import noOfActiveAccountsMonthly -def metaDataNodeInfo(baseDir: str, registration: bool, version: str) -> {}: +def metaDataNodeInfo(baseDir: str, registration: bool, version: str, + showAccounts: bool) -> {}: """ /nodeinfo/2.0 endpoint + Also see https://socialhub.activitypub.rocks/t/ + fep-f1d5-nodeinfo-in-fediverse-software/1190/4 + + Note that there are security considerations with this. If an adversary + sees a lot of accounts and "local" posts then the instance may be + considered a higher priority target. + Also exposure of the version number and number of accounts could be + sensitive """ - activeAccounts = noOfAccounts(baseDir) - activeAccountsMonthly = noOfActiveAccountsMonthly(baseDir, 1) - activeAccountsHalfYear = noOfActiveAccountsMonthly(baseDir, 6) + if showAccounts: + activeAccounts = noOfAccounts(baseDir) + activeAccountsMonthly = noOfActiveAccountsMonthly(baseDir, 1) + activeAccountsHalfYear = noOfActiveAccountsMonthly(baseDir, 6) + else: + activeAccounts = 1 + activeAccountsMonthly = 1 + activeAccountsHalfYear = 1 + nodeinfo = { 'openRegistrations': registration, 'protocols': ['activitypub'], diff --git a/tests.py b/tests.py index 9c9213ce4..15bdb9ccf 100644 --- a/tests.py +++ b/tests.py @@ -504,8 +504,12 @@ def createServerAlice(path: str, domain: str, port: int, maxFollowers = 10 verifyAllSignatures = True brochMode = False + showNodeInfoAccounts = True + showNodeInfoVersion = True print('Server running: Alice') - runDaemon(brochMode, + runDaemon(showNodeInfoAccounts, + showNodeInfoVersion, + brochMode, verifyAllSignatures, sendThreadsTimeoutMins, dormantMonths, maxNewswirePosts, @@ -601,8 +605,12 @@ def createServerBob(path: str, domain: str, port: int, maxFollowers = 10 verifyAllSignatures = True brochMode = False + showNodeInfoAccounts = True + showNodeInfoVersion = True print('Server running: Bob') - runDaemon(brochMode, + runDaemon(showNodeInfoAccounts, + showNodeInfoVersion, + brochMode, verifyAllSignatures, sendThreadsTimeoutMins, dormantMonths, maxNewswirePosts, @@ -652,8 +660,12 @@ def createServerEve(path: str, domain: str, port: int, federationList: [], maxFollowers = 10 verifyAllSignatures = True brochMode = False + showNodeInfoAccounts = True + showNodeInfoVersion = True print('Server running: Eve') - runDaemon(brochMode, + runDaemon(showNodeInfoAccounts, + showNodeInfoVersion, + brochMode, verifyAllSignatures, sendThreadsTimeoutMins, dormantMonths, maxNewswirePosts, From 46accb7b40d512afa95775b9614cbb98ca6b6349 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 3 May 2021 11:17:21 +0100 Subject: [PATCH 0868/1416] NodeInfo metadata is unavailable during broch mode --- blocking.py | 7 +++++++ daemon.py | 16 ++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/blocking.py b/blocking.py index ff59f2d4b..08f3f9eb3 100644 --- a/blocking.py +++ b/blocking.py @@ -627,6 +627,13 @@ def outboxUndoMute(baseDir: str, httpPrefix: str, print('DEBUG: post undo mute via c2s - ' + postFilename) +def brochModeIsActive(baseDir: str) -> bool: + """Returns true if broch mode is active + """ + allowFilename = baseDir + '/accounts/allowedinstances.txt' + return os.path.isfile(allowFilename) + + def setBrochMode(baseDir: str, domainFull: str, enabled: bool) -> None: """Broch mode can be used to lock down the instance during a period of time when it is temporarily under attack. diff --git a/daemon.py b/daemon.py index 9a2441a61..4d19cd489 100644 --- a/daemon.py +++ b/daemon.py @@ -110,6 +110,7 @@ from media import attachMedia from blocking import mutePost from blocking import unmutePost from blocking import setBrochMode +from blocking import brochModeIsActive from blocking import addBlock from blocking import removeBlock from blocking import addGlobalBlock @@ -972,14 +973,25 @@ class PubServer(BaseHTTPRequestHandler): if self.server.debug: print('DEBUG: nodeinfo ' + self.path) + # If we are in broch mode then don't show potentially + # sensitive metadata. + # For example, if this or allied instances are being attacked + # then numbers of accounts may be changing as people + # migrate, and that information may be useful to an adversary + brochMode = brochModeIsActive(self.server.baseDir) + nodeInfoVersion = self.server.projectVersion - if not self.server.showNodeInfoVersion: + if not self.server.showNodeInfoVersion or brochMode: nodeInfoVersion = '0.0.0' + showNodeInfoAccounts = self.server.showNodeInfoAccounts + if brochMode: + showNodeInfoAccounts = False + info = metaDataNodeInfo(self.server.baseDir, self.server.registration, nodeInfoVersion, - self.server.showNodeInfoAccounts) + showNodeInfoAccounts) if info: msg = json.dumps(info).encode('utf-8') msglen = len(msg) From 501885f5bb4bb49fccdf8f8ab377644428283054 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 3 May 2021 11:59:28 +0100 Subject: [PATCH 0869/1416] Instance metadata options in profile settings --- daemon.py | 18 ++++++++++++++++++ translations/ar.json | 4 +++- translations/ca.json | 4 +++- translations/cy.json | 4 +++- translations/de.json | 4 +++- translations/en.json | 4 +++- translations/es.json | 4 +++- translations/fr.json | 4 +++- translations/ga.json | 4 +++- translations/hi.json | 4 +++- translations/it.json | 4 +++- translations/ja.json | 4 +++- translations/ku.json | 4 +++- translations/oc.json | 4 +++- translations/pt.json | 4 +++- translations/ru.json | 4 +++- translations/zh.json | 4 +++- webapp_profile.py | 28 ++++++++++++++++++++++++++++ 18 files changed, 94 insertions(+), 16 deletions(-) diff --git a/daemon.py b/daemon.py index 4d19cd489..2c45af8d8 100644 --- a/daemon.py +++ b/daemon.py @@ -4703,6 +4703,24 @@ class PubServer(BaseHTTPRequestHandler): # on all incoming posts if path.startswith('/users/' + adminNickname + '/'): + showNodeInfoAccounts = False + if fields.get('showNodeInfoAccounts'): + if fields['showNodeInfoAccounts'] == 'on': + showNodeInfoAccounts = True + self.server.showNodeInfoAccounts = \ + showNodeInfoAccounts + setConfigParam(baseDir, "showNodeInfoAccounts", + showNodeInfoAccounts) + + showNodeInfoVersion = False + if fields.get('showNodeInfoVersion'): + if fields['showNodeInfoVersion'] == 'on': + showNodeInfoVersion = True + self.server.showNodeInfoVersion = \ + showNodeInfoVersion + setConfigParam(baseDir, "showNodeInfoVersion", + showNodeInfoVersion) + verifyAllSignatures = False if fields.get('verifyallsignatures'): if fields['verifyallsignatures'] == 'on': diff --git a/translations/ar.json b/translations/ar.json index fbd426865..a8ae3f47f 100644 --- a/translations/ar.json +++ b/translations/ar.json @@ -437,5 +437,7 @@ "viewButton": "عرض زر", "enterPetname": "أدخل PETNAME", "enterNotes": "أدخل الملاحظات", - "These access keys may be used": "قد يتم استخدام مفاتيح الوصول هذه، عادة مع مفتاح ALT + SHIFT + مفتاح ALT +" + "These access keys may be used": "قد يتم استخدام مفاتيح الوصول هذه، عادة مع مفتاح ALT + SHIFT + مفتاح ALT +", + "Show numbers of accounts within instance metadata": "إظهار عدد الحسابات داخل البيانات الوصفية للمثيلات", + "Show version number within instance metadata": "إظهار رقم الإصدار داخل البيانات الوصفية للمثيل" } diff --git a/translations/ca.json b/translations/ca.json index 589f5013c..6e8db45ac 100644 --- a/translations/ca.json +++ b/translations/ca.json @@ -437,5 +437,7 @@ "viewButton": "Botó Veure", "enterPetname": "Introduïu PETNAME", "enterNotes": "Introduïu notes", - "These access keys may be used": "Es poden utilitzar aquestes tecles d'accés, típicament amb Alt + Maj + tecla o Alt + clau" + "These access keys may be used": "Es poden utilitzar aquestes tecles d'accés, típicament amb Alt + Maj + tecla o Alt + clau", + "Show numbers of accounts within instance metadata": "Mostra el nombre de comptes a les metadades de la instància", + "Show version number within instance metadata": "Mostra el número de versió a les metadades de la instància" } diff --git a/translations/cy.json b/translations/cy.json index 2a3eb079f..012710f78 100644 --- a/translations/cy.json +++ b/translations/cy.json @@ -437,5 +437,7 @@ "viewButton": "Gweld y botwm", "enterPetname": "Rhowch enw PETName", "enterNotes": "Rhowch nodiadau", - "These access keys may be used": "Gellir defnyddio'r allweddi mynediad hyn, fel arfer gyda ALT + Shift + Allwedd Allwedd neu ALT +" + "These access keys may be used": "Gellir defnyddio'r allweddi mynediad hyn, fel arfer gyda ALT + Shift + Allwedd Allwedd neu ALT +", + "Show numbers of accounts within instance metadata": "Dangos nifer y cyfrifon o fewn metadata", + "Show version number within instance metadata": "Dangos rhif y fersiwn o fewn metadata" } diff --git a/translations/de.json b/translations/de.json index 6c50a2ddd..2ebf7d035 100644 --- a/translations/de.json +++ b/translations/de.json @@ -437,5 +437,7 @@ "viewButton": "Schaltfläche anzeigen", "enterPetname": "Petname eingeben", "enterNotes": "Notizen eingeben", - "These access keys may be used": "Diese Zugriffstasten können verwendet werden, typischerweise mit ALT + SHIFT + -Taste oder ALT + -Taste" + "These access keys may be used": "Diese Zugriffstasten können verwendet werden, typischerweise mit ALT + SHIFT + -Taste oder ALT + -Taste", + "Show numbers of accounts within instance metadata": "Anzahl der Konten in Instanzmetadaten anzeigen", + "Show version number within instance metadata": "Versionsnummer in Instanzmetadaten anzeigen" } diff --git a/translations/en.json b/translations/en.json index 0a5a5c8f2..242f8ef9d 100644 --- a/translations/en.json +++ b/translations/en.json @@ -437,5 +437,7 @@ "viewButton": "View button", "enterPetname": "Enter petname", "enterNotes": "Enter notes", - "These access keys may be used": "These access keys may be used, typically with ALT + SHIFT + key or ALT + key" + "These access keys may be used": "These access keys may be used, typically with ALT + SHIFT + key or ALT + key", + "Show numbers of accounts within instance metadata": "Show numbers of accounts within instance metadata", + "Show version number within instance metadata": "Show version number within instance metadata" } diff --git a/translations/es.json b/translations/es.json index 4c4a8b48f..cdd5b698f 100644 --- a/translations/es.json +++ b/translations/es.json @@ -437,5 +437,7 @@ "viewButton": "Botón de vista", "enterPetname": "Entrar en nombre de pettname", "enterNotes": "Ingresar notas", - "These access keys may be used": "Se pueden usar estas teclas de acceso, típicamente con teclas ALT + MAYÚS + teclas o ALT +" + "These access keys may be used": "Se pueden usar estas teclas de acceso, típicamente con teclas ALT + MAYÚS + teclas o ALT +", + "Show numbers of accounts within instance metadata": "Muestra el número de cuentas dentro de los metadatos de la instancia.", + "Show version number within instance metadata": "Mostrar el número de versión dentro de los metadatos de la instancia" } diff --git a/translations/fr.json b/translations/fr.json index a625f66fb..ad8f62cbf 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -437,5 +437,7 @@ "viewButton": "Bouton d'affichage", "enterPetname": "Entrez PETNAME", "enterNotes": "Faire entrer des notes", - "These access keys may be used": "Ces touches d'accès peuvent être utilisées typiquement avec une touche Alt + Maj + ou Alt +" + "These access keys may be used": "Ces touches d'accès peuvent être utilisées typiquement avec une touche Alt + Maj + ou Alt +", + "Show numbers of accounts within instance metadata": "Afficher le nombre de comptes dans les métadonnées de l'instance", + "Show version number within instance metadata": "Afficher le numéro de version dans les métadonnées de l'instance" } diff --git a/translations/ga.json b/translations/ga.json index 7f06c2759..ebb6d18d4 100644 --- a/translations/ga.json +++ b/translations/ga.json @@ -437,5 +437,7 @@ "viewButton": "Féach an cnaipe", "enterPetname": "Cuir isteach PetName", "enterNotes": "Cuir nótaí isteach", - "These access keys may be used": "Is féidir na heochracha rochtana seo a úsáid, de ghnáth le Alt + Shift + Eochair nó Alt + Eochair" + "These access keys may be used": "Is féidir na heochracha rochtana seo a úsáid, de ghnáth le Alt + Shift + Eochair nó Alt + Eochair", + "Show numbers of accounts within instance metadata": "Taispeáin líon na gcuntas laistigh de mheiteashonraí", + "Show version number within instance metadata": "Taispeáin uimhir an leagain laistigh de mheiteashonraí" } diff --git a/translations/hi.json b/translations/hi.json index be8a7b9f1..9861f5b43 100644 --- a/translations/hi.json +++ b/translations/hi.json @@ -437,5 +437,7 @@ "viewButton": "देखें बटन", "enterPetname": "PETNAME दर्ज करें", "enterNotes": "नोट्स दर्ज करें", - "These access keys may be used": "इन एक्सेस कुंजियों का उपयोग किया जा सकता है, आमतौर पर Alt + Shift + कुंजी या Alt + कुंजी के साथ" + "These access keys may be used": "इन एक्सेस कुंजियों का उपयोग किया जा सकता है, आमतौर पर Alt + Shift + कुंजी या Alt + कुंजी के साथ", + "Show numbers of accounts within instance metadata": "उदाहरण मेटाडेटा के भीतर खातों की संख्या दिखाएं", + "Show version number within instance metadata": "उदाहरण मेटाडेटा के भीतर संस्करण संख्या दिखाएं" } diff --git a/translations/it.json b/translations/it.json index 902b7adfe..be937bc46 100644 --- a/translations/it.json +++ b/translations/it.json @@ -437,5 +437,7 @@ "viewButton": "Visualizza il pulsante", "enterPetname": "Inserisci PetName", "enterNotes": "Inserisci le note", - "These access keys may be used": "Questi tasti di accesso possono essere utilizzati, in genere con tasto ALT + MAIUSC + o ALT + Key" + "These access keys may be used": "Questi tasti di accesso possono essere utilizzati, in genere con tasto ALT + MAIUSC + o ALT + Key", + "Show numbers of accounts within instance metadata": "Mostra il numero di account all'interno dei metadati dell'istanza", + "Show version number within instance metadata": "Mostra il numero di versione nei metadati dell'istanza" } diff --git a/translations/ja.json b/translations/ja.json index 8a14f543e..eca6ac0b0 100644 --- a/translations/ja.json +++ b/translations/ja.json @@ -437,5 +437,7 @@ "viewButton": "ボタンを見る", "enterPetname": "PetNameを入力してください", "enterNotes": "ノートを入力してください", - "These access keys may be used": "これらのアクセスキーは、通常はAlt + Shift +キーまたはAlt +キーを使用して使用できます。" + "These access keys may be used": "これらのアクセスキーは、通常はAlt + Shift +キーまたはAlt +キーを使用して使用できます。", + "Show numbers of accounts within instance metadata": "インスタンスメタデータ内のアカウント数を表示する", + "Show version number within instance metadata": "インスタンスメタデータ内にバージョン番号を表示する" } diff --git a/translations/ku.json b/translations/ku.json index 97dc9cc6a..a25fbbc43 100644 --- a/translations/ku.json +++ b/translations/ku.json @@ -437,5 +437,7 @@ "viewButton": "Bişkoja View", "enterPetname": "Porê binivîse", "enterNotes": "Nîşan binivîse", - "These access keys may be used": "Dibe ku ev keysên gihîştinê bikar bînin, bi gelemperî bi alt + shift + key an alt + key" + "These access keys may be used": "Dibe ku ev keysên gihîştinê bikar bînin, bi gelemperî bi alt + shift + key an alt + key", + "Show numbers of accounts within instance metadata": "Di nav metadata mînakê de hejmarên hesaban nîşan bidin", + "Show version number within instance metadata": "Di nav metadata mînakê de nimreya guhertoyê nîşan bide" } diff --git a/translations/oc.json b/translations/oc.json index b51578212..03e52d742 100644 --- a/translations/oc.json +++ b/translations/oc.json @@ -433,5 +433,7 @@ "viewButton": "View button", "enterPetname": "Enter petname", "enterNotes": "Enter notes", - "These access keys may be used": "These access keys may be used, typically with ALT + SHIFT + key or ALT + key" + "These access keys may be used": "These access keys may be used, typically with ALT + SHIFT + key or ALT + key", + "Show numbers of accounts within instance metadata": "Show numbers of accounts within instance metadata", + "Show version number within instance metadata": "Show version number within instance metadata" } diff --git a/translations/pt.json b/translations/pt.json index 6225a7986..4b2135f08 100644 --- a/translations/pt.json +++ b/translations/pt.json @@ -437,5 +437,7 @@ "viewButton": "Botão de visualização", "enterPetname": "Digite Petname", "enterNotes": "Digite notas", - "These access keys may be used": "Essas teclas de acesso podem ser usadas, normalmente com tecla Alt + Shift + Key ou Alt +" + "These access keys may be used": "Essas teclas de acesso podem ser usadas, normalmente com tecla Alt + Shift + Key ou Alt +", + "Show numbers of accounts within instance metadata": "Mostra o número de contas nos metadados da instância", + "Show version number within instance metadata": "Mostrar o número da versão nos metadados da instância" } diff --git a/translations/ru.json b/translations/ru.json index 460e78fcc..0fa03d6ad 100644 --- a/translations/ru.json +++ b/translations/ru.json @@ -437,5 +437,7 @@ "viewButton": "Кнопка просмотра", "enterPetname": "Введите petname", "enterNotes": "Введите ноты", - "These access keys may be used": "Эти ключевые ключи доступа могут быть использованы, обычно с ALT + Shift + Key или Alt + Key" + "These access keys may be used": "Эти ключевые ключи доступа могут быть использованы, обычно с ALT + Shift + Key или Alt + Key", + "Show numbers of accounts within instance metadata": "Показать количество учетных записей в метаданных экземпляра", + "Show version number within instance metadata": "Показать номер версии в метаданных экземпляра" } diff --git a/translations/zh.json b/translations/zh.json index 54c153c8e..06eaa96ca 100644 --- a/translations/zh.json +++ b/translations/zh.json @@ -437,5 +437,7 @@ "viewButton": "查看按钮", "enterPetname": "进入宠物名", "enterNotes": "输入笔记", - "These access keys may be used": "可以使用这些访问密钥,通常使用Alt + Shift +键或ALT +键" + "These access keys may be used": "可以使用这些访问密钥,通常使用Alt + Shift +键或ALT +键", + "Show numbers of accounts within instance metadata": "显示实例元数据中的帐户数", + "Show version number within instance metadata": "在实例元数据中显示版本号" } diff --git a/webapp_profile.py b/webapp_profile.py index 446fd47f8..59115eab9 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -1350,6 +1350,33 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, instanceStr += \ '

\n' + + nodeInfoStr = \ + translate['Show numbers of accounts within instance metadata'] + if getConfigParam(baseDir, "showNodeInfoAccounts"): + instanceStr += \ + ' ' + \ + nodeInfoStr + '
\n' + else: + instanceStr += \ + ' ' + \ + nodeInfoStr + '
\n' + + nodeInfoStr = \ + translate['Show version number within instance metadata'] + if getConfigParam(baseDir, "showNodeInfoVersion"): + instanceStr += \ + ' ' + \ + nodeInfoStr + '
\n' + else: + instanceStr += \ + ' ' + \ + nodeInfoStr + '
\n' + if getConfigParam(baseDir, "verifyAllSignatures"): instanceStr += \ ' ' + \ translate['Verify all signatures'] + '
\n' + instanceStr += translate['Enabling broch mode'] + '
\n' if getConfigParam(baseDir, "brochMode"): instanceStr += \ From ea588262ef66bd29d3605f1334fd89d676ff5629 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 3 May 2021 23:31:06 +0100 Subject: [PATCH 0870/1416] Bookmarks search --- daemon.py | 38 ++++++++++++++++++++++++++++-- translations/en.json | 2 +- utils.py | 56 ++++++++++++++++++++++++++++++++++++++++++++ webapp_search.py | 11 +++++---- 4 files changed, 100 insertions(+), 7 deletions(-) diff --git a/daemon.py b/daemon.py index 2c45af8d8..fb4893ac4 100644 --- a/daemon.py +++ b/daemon.py @@ -2852,7 +2852,7 @@ class PubServer(BaseHTTPRequestHandler): elif searchStr.startswith('!'): # your post history search nickname = getNicknameFromActor(actorStr) - searchStr = searchStr.replace('!', '').strip() + searchStr = searchStr.replace('!', '', 1).strip() historyStr = \ htmlHistorySearch(self.server.cssCache, self.server.translate, @@ -2874,7 +2874,7 @@ class PubServer(BaseHTTPRequestHandler): self.server.showPublishedDateOnly, self.server.peertubeInstances, self.server.allowLocalNetworkAccess, - self.server.themeName) + self.server.themeName, 'outbox') if historyStr: msg = historyStr.encode('utf-8') msglen = len(msg) @@ -2883,6 +2883,40 @@ class PubServer(BaseHTTPRequestHandler): self._write(msg) self.server.POSTbusy = False return + elif searchStr.startswith('-'): + # bookmark search + nickname = getNicknameFromActor(actorStr) + searchStr = searchStr.replace('-', '', 1).strip() + bookmarksStr = \ + htmlHistorySearch(self.server.cssCache, + self.server.translate, + baseDir, + httpPrefix, + nickname, + domain, + searchStr, + maxPostsInFeed, + pageNumber, + self.server.projectVersion, + self.server.recentPostsCache, + self.server.maxRecentPosts, + self.server.session, + self.server.cachedWebfingers, + self.server.personCache, + port, + self.server.YTReplacementDomain, + self.server.showPublishedDateOnly, + self.server.peertubeInstances, + self.server.allowLocalNetworkAccess, + self.server.themeName, 'bookmarks') + if bookmarksStr: + msg = bookmarksStr.encode('utf-8') + msglen = len(msg) + self._login_headers('text/html', + msglen, callingDomain) + self._write(msg) + self.server.POSTbusy = False + return elif ('@' in searchStr or ('://' in searchStr and hasUsersPath(searchStr))): diff --git a/translations/en.json b/translations/en.json index 242f8ef9d..3997c6488 100644 --- a/translations/en.json +++ b/translations/en.json @@ -90,7 +90,7 @@ "View": "View", "Stop blocking": "Stop blocking", "Enter an emoji name to search for": "Enter an emoji name to search for", - "Enter an address, shared item, !history, #hashtag, *skill or :emoji: to search for": "Enter an address, shared item, !history, #hashtag, *skill or :emoji: to search for", + "Enter an address, shared item, !history, #hashtag, *skill or :emoji: to search for": "Enter an address, shared item, -bookmark, !history, #hashtag, *skill or :emoji: to search for", "Go Back": "◀", "Moderation Information": "Moderation Information", "Suspended accounts": "Suspended accounts", diff --git a/utils.py b/utils.py index 2542e90a0..763997b78 100644 --- a/utils.py +++ b/utils.py @@ -1678,6 +1678,59 @@ def isNewsPost(postJsonObject: {}) -> bool: return postJsonObject.get('news') +def _searchVirtualBoxPosts(baseDir: str, nickname: str, domain: str, + searchStr: str, maxResults: int, + boxName: str) -> []: + """Searches through a virtual box, which is typically an index on the inbox + """ + indexFilename = \ + baseDir + '/accounts/' + nickname + '@' + domain + '/' + \ + boxName + '.index' + if boxName == 'bookmarks': + boxName = 'inbox' + path = baseDir + '/accounts/' + nickname + '@' + domain + '/' + boxName + if not os.path.isdir(path): + return [] + + searchStr = searchStr.lower().strip() + + if '+' in searchStr: + searchWords = searchStr.split('+') + for index in range(len(searchWords)): + searchWords[index] = searchWords[index].strip() + print('SEARCH: ' + str(searchWords)) + else: + searchWords = [searchStr] + + res = [] + with open(indexFilename, 'r') as indexFile: + postFilename = 'start' + while postFilename: + postFilename = indexFile.readline() + if not postFilename: + break + if '.json' not in postFilename: + break + postFilename = path + '/' + postFilename.strip() + if not os.path.isfile(postFilename): + continue + with open(postFilename, 'r') as postFile: + data = postFile.read().lower() + + notFound = False + for keyword in searchWords: + if keyword not in data: + notFound = True + break + if notFound: + continue + + res.append(postFilename) + if len(res) >= maxResults: + return res + return res + + def searchBoxPosts(baseDir: str, nickname: str, domain: str, searchStr: str, maxResults: int, boxName='outbox') -> []: @@ -1686,6 +1739,9 @@ def searchBoxPosts(baseDir: str, nickname: str, domain: str, """ path = baseDir + '/accounts/' + nickname + '@' + domain + '/' + boxName if not os.path.isdir(path): + if os.path.isfile(path + '.index'): + return _searchVirtualBoxPosts(baseDir, nickname, domain, + searchStr, maxResults, boxName) return [] searchStr = searchStr.lower().strip() diff --git a/webapp_search.py b/webapp_search.py index 284c86425..83cd0625d 100644 --- a/webapp_search.py +++ b/webapp_search.py @@ -536,7 +536,7 @@ def htmlHistorySearch(cssCache: {}, translate: {}, baseDir: str, showPublishedDateOnly: bool, peertubeInstances: [], allowLocalNetworkAccess: bool, - themeName: str) -> str: + themeName: str, boxName: str) -> str: """Show a page containing search results for your post history """ if historysearch.startswith('!'): @@ -546,7 +546,7 @@ def htmlHistorySearch(cssCache: {}, translate: {}, baseDir: str, boxFilenames = \ searchBoxPosts(baseDir, nickname, domain, - historysearch, postsPerPage) + historysearch, postsPerPage, boxName) cssFilename = baseDir + '/epicyon-profile.css' if os.path.isfile(baseDir + '/epicyon.css'): @@ -560,10 +560,13 @@ def htmlHistorySearch(cssCache: {}, translate: {}, baseDir: str, # add the page title domainFull = getFullDomain(domain, port) actor = httpPrefix + '://' + domainFull + '/users/' + nickname + historySearchTitle = '🔍 ' + translate['Your Posts'] + if boxName == 'tlbookmarks': + historySearchTitle = '🔍 ' + translate['Bookmarks'] + historySearchForm += \ '

' + \ - translate['Your Posts'] + \ - '

' + historySearchTitle + '

#$JuEb^&F`o1Cy&y9OOK^j`>&HD=P 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 diff --git a/theme/hacker/icons/bookmark_inactive.png b/theme/hacker/icons/bookmark_inactive.png index f031d94d6f6bc822c3e2f46a9c8086bab1dd5221..c96d9ca0f4d271bb67c60b136e4dbbe09110bf78 100644 GIT binary patch delta 1187 zcmV;U1YG;j2k;7zBmwY|B_DrXmgFW3h2L34mVhLL#Bwk{=gbbW{9LeIUDeZ*%uMo- zhca!0g)GVU!&Hay=eHUDz(FN*NNS!-&Jjl{sc^-><9U>QrI_}0AL*LH{fj+3CKx6` zFXye*%fG^|9}nC)=yC4K-a__P*!Hfpg$K0JD+yCDhXwrgIs^yo=ZLW?Au+k zf1L9!%g%1yhi5}FsMHmSgn0-_+*dyUJW&rgVg z^(z1*LT*JdBp?toiBhI$%tizq9e^q-XGwg30I70Ek(@-Z9~nEZ+<3-l`?7N8WyanF z5Gq*=Y>HICN=dPPEIHOtRnerXSxr4?(V8WvtT|`PYm=)cmP{?1nOm{y;>p#so4XgU zg^OSh)RK!8FQtFf%Aq1rMXU<{3d_NV9O=*_A9narj@qz%T58&Iv*xX|+PO=|Hqmpp z?!ELnC=BcrBMlvS*zi$ComgvAW|}(lwCS_V`k;1E{jU82HM*$rCbj(RK@HYmc88#~ zo#JrNoQeVipVIqfkbXy4ZwHix__pra`Qe9_&8I{S>#L{!`re zpU8!U?!O=xfbM&4Ur_7ocdl(>=U2Eije@Ul6r|_ic&y=%apQIUzWrVw{%wGFpm(5m zpm(5mpm(5mp#Mc6{QFSCUlib;Pt`rYM*si;glR)VP)S2WAaHVTW@&6?004NLeUUv# z!$2IxUsHdjMJf(f5Ov5t1FsM;h(1gs zC^1u?OC}TW9AEeF@%1jsv%Js!Il7gc$pD{7Jj;J{!y?`wp4zl@&ilk+R+JRtbK+5h zE=c^yb=l=N&IN}Bo*6dMsd?fsu~=whxs6%TP>CmrBZ{g~zL0TQ;k?CJEmv9dp8SQO zoVK#eb(%wnV-ZV8LWGPeN+`oZlva%t6Dit{dH4q$f0A4>xk_ND z^AmsLZc-=)biUa3$1o7s1sXNm{yw(t#tGnm2ClT0zfuQgK1r{&w8#j1(w)-Q(TC_TK(I z)9mjDhevX+5T3Rb00006P)t-s0001py?_MvlAt1!9|JfF zlR=EG@FyI22uVcgYZk!@q)0_cyEI;wyxWdagud4<+?#LW-CJ+k#d_@WDn*F-bjWWS z9Xsjw+HHlNS45AQUtWMtj?d{?yV-rtaob%@8A|1FHubfY-9pC;Qpz5dkqtjZ+jcI< zjx9D2>!5idw?Ks$YEOSk)Tz>>vFk<+OH4c%ax-&d**1s#h1-UbR;I}YJUxH~O9M55 zneS_%J#X3bHFC_{2|bzMj4KZ^t)DA7q6JcG8Va2q8EVBJeum( zcjxdFH}MIqfS_)f9UH9iy1BTN9&F2k!rXs~#UQ#9#Z016Ba#8fdCiS6M!PR7-^{pL077w43}|qG04pU${8)0tP*u?s zR5h!qYtfn|r>r?=%j=G+CYDSso0(g&>f*`OvzxmYuZ4@?3e%E{h2o`@S}|#b>x$78 zJ!-x9k}F+$<;#CAzsgk`!l$LCEjMf4N~@i_bR7SlyM^w(^g3uDltvml^048fj5-l( zQ)Zev^R(%+%zCGGsJ>F8H*&wGMu*xWmUcgTP=nd*%LT3LL>Ds<<3u2CivR+e7qjS; z5-)O#SuBi0p$uxI3r?p+3(8v=;P?)=;P?)=;P?)=zr-5e;-Qt x7Z@Iqc=D|2=Kufz22e~?MF0Q*CSV}PG|2LkzXUi6;|mcG5+5q795Ist1#cyMbVdLG diff --git a/theme/hacker/icons/calendar.png b/theme/hacker/icons/calendar.png index c70130d9f706e63b7394cf1107f53007d4f00fa3..856674c8aa6b4ae19673f92bcef1bb908c5504bd 100644 GIT binary patch delta 1307 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 diff --git a/theme/hacker/icons/categoriesrss.png b/theme/hacker/icons/categoriesrss.png index a746c2337cd937c11fa347e4c0eef2e686538f06..8085b431d84e5a07b2c656700cd2af0244185b1f 100644 GIT binary patch delta 1092 zcmV-K1iSn33i1k&XMb&j1(xLd$yA5&=eHUDz(FN*NNS!-&Jjl{sc^-><9U>QrI_}0 zAL*LH{fj+3CKx6`FXye*Ykh@XKOVSa(D7;ye$B97j;@K@p{&S^L4QsXc0TQNWfICb z2f4UCr+V<&w>xG3IOm;~o!z<*&xT}BsVf2r^AM7_uYP7A>whGvyRSHHt=nUg61Iu1 zOd!b1>)m~f&jP)Oe2>Cs^&g{8;&Z+1@=42lX@tR-6Qo~@za@SOERT%%b;8o^>I;!) z_c_P;b~R-vny-r5V&4j_g$E>;{a8jboQkpSR?s}w*nqsp77w&Wg&0(3phTT2O&Ysz z)R1E0!C=D74Syt-&B3T}12K}c8cjAS(!~L*@dzR?^CK79am$X^$Pu{{mNLN^ZP-6( z;qNAYrG+`$l8B-|v_f9I>KbV*a_fp!07CQPrd!~o*Ctm@ESXw1 zGq+;Z#gnUNH+L^y3m3s2s3jLGUP`HzLq(tpUlr>sEC(NQq(hH<*x^SxYD4+7)U@Sh z&0A@;bAOkPZKCIH-FxYEP#D-LMjATuu;HVOI#Fv=W|}(lwCS_V`k;1E{jU82HM*$r zCbibtgBq;C>~=wGJJH1q#5fU%+aiF1=EW>JrNoQeVipVIqfkbYy4ZwHix?25L9CM= z>^{i-6t|%MQ{4EU$c2UOzaSTY?t5-uQ0wb=u0L&J=U2Eije@Ul6olvCc&y=%apQIU zzWrVw{;h+zqqn2Cqqn2Cqqn2CqyL2?{QFSCUk2`;PUt})Gynhrgp(ly9uh?=4ptC# z$WWauh>ALD6^c-ylTia8e{*wEbdeJOmlRsWcyQd0clRE5?*O4*W~$jS2B?~4q~b9# zlU)@9uMjYZK1?GhF;kyQCKK=+U-$6w^)AY@ywCkPx|N*C0G~)a%XGsc-XNaZv~yH6ykH@QG+f>{K$3LW_6XR}DC_arywHsjI{daBv8W z6exS$Ud~&q*ZK;(emro;pySmZ{F-6E990;U;WHL&VRGQ!nm$Aam`}Pk^?%C zI}-@<@_Kh4R@nA#G+<#cM&BeHIlf@~mMw3m7bWmeyJi=lo{K$oN+_K{}azyTgrA%Y`y zznlD(7UpbAB8vXd3VHFWYoxKrtt(am2+fO|Zh`N1;g3)CgHi=S-7-5~u*TzbaVUM% zmTb;~b&CG{geX|Q96%z(RwP3L0x^>)Ws1gZM9|RzsDC1Jmc$1LkScd1$w>tJk+JiN zjc1JZT2{`y%-EX%LM4lVO_2&%DJkm5lB0&IiY8UfYU)9Y)+{+?%{g0Mn_M-qWNO*W z+=^8fPp+Qb+`V`$Tm*ZdmRziODWz5p6@e;zRjjYD9DK-;4n6W=hacsr4dv5P)0Uex zZ>81FU4J^ZiJrT4@1@s4VPK~iY3RtqhL1ApM6FGkY3j_=rq43#gW5&)yY>sz=%U7( z)LLf`YOn^g+Xb!dL>Ds<<3u2CivS9m7qjS;5-)O#SuBi?LK#WwViP(oVnCP%u}*rh z`ylsI+=BW~apQj?7Z$qzf?NQ)@40K0--iAFB6^c+HlTia8e{ytEbdeJOmlRsWcyQd0clRE5?*O4uVVc!74rsbTnMuzRM~KB@2P+-SN~T6Ue?=TqHJ$Q>tj8+n zEzVk{##;B}FAV4Pm1VBe97Yn0Sb_u*3Th~$0vmB!by6&(X+PoPkGg(|Tnf3$VB}ap z6&hsM5B>+gyR{0F6JAm{0d&7O&c_H4+69_*$N4^XoaPA-do454hX`Pllch*_2%=NK+^jfcG={rW`PM3-qpey|wmn`T%68tJDo}a0rYR zDSO@L-94SX{d=a>-wyy&a(Nc(>!kny00vM@R7C&)0487{$27?DlfMKw3gip|5*i{@ K7aE_F0R?d-sSpYP diff --git a/theme/hacker/icons/delete.png b/theme/hacker/icons/delete.png index 11977e1be10f10c3a5c1de33cdd7116b138bd8a6..5ac4a3fb7c7119b1d03a4dc4711d672f775edd5e 100644 GIT binary patch delta 1429 zcmV;G1#0@g9h(b~7=Hl+0001xr{kRf00Q)SR9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3 z004N}?Ur4Z6*g*i#xG3IA`PSPmgnI-G^sG zGN{xQfrNPoN!(XIGmv$X)ZJH{w$|-2NeSp=FQrqEm)E=d7@q}t5&0g4&+0!$pTy^S z+2xa#`O*l3FMlUUzZQQ>{1jLo8S(3crQ6jPBG2w~j`Qtm%1|_46&1s+&Q^bR$ev_B zmeCBSVr;t=G>U?E0Q4r zftX2@GDTxHBIxJ`efnlEuKLNCm8v z6!l}tQGY{KMU$##HT9rHYnGg{=A13BO|F_)GPP`GZpEsLCs)sI?q0kWE`mK!ODfM;UdZ)~3ufb>?Z)XPNau?V|c!`vq!rQGer2YOS*eHCTh$?Sj^JqKg@baUu}6 zMF0iOi&=C^i5I!WEEdK`p^PMTu?d|PF(6EXSSLN$eUSSpZbAL0xbZ)c3k%(UK`sE@ z_uRgq*4OV`+r-YVaA_I^U*9MQ&%yCn!yn_u>-v5By*~U~2X9AjM{h@OM{h@OM{h^} z3x7xW_o0Np0Qj??BD^EjS^xk6glR)VP)S2WAaHVTW@&6?004NLeUUv#!$2IxUsI(; zDh^ft1FsM;h(1gsC^1u?OC}TW z9AEeF@%1jsv%Js!Il7gc$pD{7Jj-;$BHkdL+O%}e`@~^ZloaA~;!%SxNc_lk+2uFR z1&0Nm88*_XdEzj!SZHIpjaku9i6@C8imFk*ka1bzyv129S6TC({Dq;MwzAB1ntwxx zV-ZV8LWGPeN+`oZlva%t6Dit{dH4q$f0A4>xk_ND^AqE4QYZ#= zzS#E1Fc8=U8a3PgKDO<~3E+PQuC$iFQU_)}Nw2lE$Pv)94P0EeG_aew*%q^YaK4RCM>j1(w)-Q(TC_TK(I)9mjDhevX+ z5T3Rb00006P)t-s0001py@2+TpdtVO00DGTPE!Ct=GbNc0004EOGiWihy@);00009 za7bBm001r{001r{0eGc9b^rhX2XskIMF-^q8x|8L+|0Pb0001fNkl3 delta 3761 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 diff --git a/theme/hacker/icons/download.png b/theme/hacker/icons/download.png index c31d75b2900e7b1b98e9a0ce19bd3fb072d1bf87..aa9067110fe58252e0e2ccfa7ef436958b732167 100644 GIT binary patch delta 1376 zcmV-m1)uu04}c4h7=Hl+0001xr{kRf00QuOR9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3 z004N}?Ur4Z6*g*i#xG3IOm;~o!z<*&xT}B zsVf2r^AM7_uYP7A>m;eWuQ+Y3yT&o>iE?EEL0(?(?qhrw=tbmv6h5o}7=03->t&Zu zTINe548EKo{eN2gE%8%ed1S<|6P9jQUx+-r&pFPwt0_a#d{xvIn{GE)ctCR5k7YE& zsTkXC1po+{{5+5Kys@#zzClTyN#?C7?o-x{MSvm7EV{ZZol`IA}MJiyWq^KWD zjvA^entxO^tEmSqTC?PoHRo)3ZF1GblBs1gb1PO|Jh^&ybNAx4a1rc*T5_@CrIcDZ zR0OKivcj?$BdhXV}mtF^jft_Ncp(76) zKFX*QwKip@sWVTTKFh2RY8Tb-+AmO}iyCiIYk!?RsKFY{ZWpw+6J5+ej1z&lEdnTL zUd*CXO1#J|X0b3n3S}gzi%saXhyh_5#5(E0?t|Pg-g>Y`1(dccn*%o8vYnJUf1v2@Acu|I(R#JJ9;~MJ9;~MJ9<0%UpT_Q z4}T^61?qF2OjdzVLjV8)glR)VP)S2WAaHVTW@&6?004NLeUUv#!$2IxUsI(;Dh^f< zb;wYiEQpFaY88r5q0|bkI+$Gg1x*@~6ct1FsM;h(1gsC^1u?OC}TW9AEeF z@%1jsv%Js!Il7gc$pD{7Jj-;$BHkdL+O%}e`@~^ZloaA~;!%SxNc_lk+2uFR1&0Nm z88*_XdEzj!SZHIpjaku9i6@C8imFk*ka1bzyv129S6TC({Dq;MwzAB1nnQ?V5r0ca zLWGPeN+`oZlva%t6Dit{dH4q$f0A4>xk_ND^AqE4QYZ#=zS#E1 zFc8=U8a3PgKDO<~3E+PQuC$iFQU_)}Nw2lE$Pv)94P0EeG_arywHsYj1(w)-Q(TC_TK(I)9mjDhevX+5T3Rb z00006P)t-s0001py@2+TpdtVO00DGTPE!Ct=GbNc0004EOGiWihy@);lZ*x)f8_!j z78D6MToYUX003u6L_t(2&&|-W4Zt7_1V9i4B_l8jqrqs5!U&WUh!2=gigb|@DPLV- zy=5!)UVuNrVx~-(g*>4b(jMVZ1co30UEqNxa6mnaioom|DN47caS)*sz7ehxwh$&0 iIz9jLb=M<&l>>{oZ7@veZr}g_3IG5}MNUMnLSTX|pmA~l delta 1929 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 w4aB^>EX>4U6ba`-PAZ2)IW&i+q+U;0vjwC4# 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 diff --git a/theme/hacker/icons/logorss.png b/theme/hacker/icons/logorss.png index 4d9db882cc09899ddd71528b620719c8832fcba9..a8eff40ddec082103de1484a7048c231599ee3e7 100644 GIT binary patch delta 1430 zcmV;H1!?-aJn{>WBYy)QdQ@0+Qek%>aB^>EX>4U6ba`-PAZ2)IW&i+q+U=HGlH4E+ zMgLhvmS9N;iREA(RoOw7p9_9ux@RVts>x>?8?X!)(2=o2|Mhc(A2=vy4^hoiPHDpt zbIe>&@$ERu%4v%$Uq?J2;r_uM?gtE$pp@g*)7k#A(=Bim1%EYtBjojbus=S?=Lqai zLgzp-XT+$qQz)N8!p8$T1l`5tfxigS3a|MrSb0ErGWeeaFXQII-S(-R#Rp1p^`JM}{ zaq}9kl4IaTXvqXInykYD{vXn(LSxL3C))h>73Re=P=7IvNp9w71t2u8IMU_dD?J~R ztAL;`H#-(sw*8RUmCo3jaU=`0prN8XUJJ5z3cy7eTQM0D5ZDrlQlib6jR<~p@F@^- zmdHC0kSaIKlA}lh9OpSU`WUUYtbCZUX90vt5(Ann1*{@AHpGubM+_AejjEc|)HQ2K zl48=7l7FSS`4tn3rk2diEn9K%=<3PMJ$Uw#ISV#N%_&>|yQ8=)^OJAo(7d2j_W<$HFp{v;?L32CN$$t#QI1-54B!GbC$!v3qk;6ncnQa;S zm?&eGI^i^$#6U21VjXm|`$O)5TZr*n-1s6FCc6JYE=+WvkbBSV18Qx4ZR#dr5t^^z zbm}H}{d&gu?C4f;@~Y48+uzIZ)rK#jm(WY-B~*67#)eHPwJ|vL*1Qi7rL>sEEM%8}Fl~PH#!gF7anAqT&&u$x245{-LNB40(07Dv;C~~B-wD!$q4loug_Bwe z9DhI@#a~mUMJf(f5Ov5t1FsM;h(1gs zC^1u?OC}TW9AEeF@%1jsv%Js!Il7gc$$tQ!NIc7Q!y?`wp4zl@&ilk+R+JRtbK+5h zE=c^yb=l=N&IN}Bo*6dMsd?fsu~=whxs6%TP>CmrBZ{g~zL0TQ;k?CJEmv9dp8SQO zoVK#eb(%wnV-ZV8LWGPeN+`oZlva%t6Dit{dH4q$f0A4>xk_Nj1(w)-Q(TC_TK(I z)9mjDhevX+5T3Rb00009P)t-s01N;Ch`oUQzh`+FqvVr09XNmG0vi?;7u!f5egFUf zr%6OXR5;7klED$fFbD+UK?y1$eW(OIp#N4f0x3RF;=HY&R>RF6HqnEQm>s|l&?~S5 zXa#nFfkUm#1ffbsb;&biU;L9TF@(s9{e(!58O{6PD@0;E0rijpgw7+-Zfva0e4E140-}?#keDX%|HQ&&aPnA)@6(M_U2^+uRl}e2G|1Q`h)l%Aa?iP kAiOt-&w2;EO9Ib0Z+rwvkkA_&82|tP07*qoM6N<$g1j)To&W#< literal 7738 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 diff --git a/theme/hacker/icons/logout.png b/theme/hacker/icons/logout.png index 8ae5bee69e7b20ded2f4f684557528620e49e632..901334b0033b05e1270567b2b68b4dd150a540d3 100644 GIT binary patch delta 1212 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 ArvLx| diff --git a/theme/hacker/icons/mute.png b/theme/hacker/icons/mute.png index 6969e74d39c6c9b8a797173aded7797efa00eada..cce158ecf5f7909c56c819dd293b99e27bdf59c3 100644 GIT binary patch delta 1190 zcmV;X1X=rn2&M~=Bmwi0B_DrXmgFW3h2L34mVhLL#Bwk{=gbbW{9LeIUDeZ*%uMo- zhca!01(xLd$yA5&=eHUDz(FN*NNS!-&Jjl{sc^-><9U>QrI_}0AL*LH{fj+3CKx6` zFXye*Ykh@XKOVSa(D7;ye$B97j;@K@p{&S^L4QsXc0TQNWfICb2f2T^J*Rr`*|$4o z|2Svk?N5($YTbutLo%q;6@i3#2ua*mKQoYZlGNQ-oVM0oV+!b0?stVCFRyp^F+L0Q zBJw>7pVfbiK8eruvdbqe^Q936UrvyIE&i7HDX=^;;@1gFx2rEip55mh=iAkkp=iD; zDu!E~t^VwgJ;{D7qZxlr#n^T$XdY{9K;C1E2U?>-3@S5FqE3}2jomkDNHOtXFk$8f zAj{@pRJef{Nm`92n-uBdVAgm95t#Xr3+=dN$7|$>+zCsW;EXoxAGGjylfTl!oNY-& z(H~kNFJ5(xG#0sa#VP=yd2!P%@ZB!_@u_}LsvxLaX2%QGc$|MO4yBLUlFeDLPSKyA z5C!X(14x9}ieyMYAZ8M!OwpK)2s%0dRbBD^^`Rxq5bU z_u{p15$u6laivcj?$B zdhXV}mtF^jft_Ncp(76)KFX*QwKip@sWVTTKFh2RY8Tb-+AmO}iyCiIYn?r)!5YkN z7qqq$UCcm?6M?ub0w`!+%%W3DyvQwPu`oUgWhAMKP3V8Lhyh_5#5(E0?t|Pg-g>Y`1(dccn*%o8vYnJUf1v2@Acu|I(R#J zJ9;~MJ9;~MJ9<0%UpT_Q4<-Bshrpj2=DYzo0004mX+uL$Nkc;*aB^>EX>4Tx0C=2z zkv&MmKpcO?UsI(;Dh^f_arywHsjI{daBv8W6exS$_hQE-gNDN8MbICa(rIHF)G(6tYt)`fExl=kr=)cIreSjen)NGVT6^J;oJ&iQ}M#(P+=+t7PI z8Jy7-_JjiuA&Dq`ts>Zg6saf~C3+lBn?+G3$=~}f+?#LCySLta7weJBt1CjxMGP2>PXxq*O z*>S`MVjVOud)>0vYvfqD6EvA%Y*G9nhwp@clJAD*T%k)8{q8I5i&soz8;jg3p#>l`k56^` zcjxdFH}MIqfS_(SI}TXmbu)1(Jz`5XXMvu^6wY-f>&F0GgtdPan;`*#m`Ri}MPoK1 z_|d_qV&^Q0FAyMA?i422h-AQVUTb5H(bi?lQAbMwxin24Q`6OluR~*zNUs`n@{*>BNtrkD-sDkD-sDkD-sD|D_@PeJJ5y wBtMcqR=f&N00006P)t-s0000cU?9gd$nulI1UL%g3;_%oFBpR)&65NLqA?M2i2wiq diff --git a/theme/hacker/icons/newpost.png b/theme/hacker/icons/newpost.png index d5017855b731773ae5a6b88c63324cee5f428379..aa3aaf6792690baf1eb7a5edc1918ee7fcbca70e 100644 GIT binary patch delta 1370 zcmV-g1*Q707~u+#7=Hl+0001xr{kRf00Q!QR9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3 z004N}?Ur4Z6*g*i#xG3IA`PSPmgnI-G^sG zGN{xQfrNPoN!(XIGmv$X)ZJH{w$@!^4tt_pnLv=2*Sq@|p9Ojm`5uMO>OV%G#OHe1 z<&&2A(g=euCx1x47Jp0p6j&Y^@#}=8+tn8$&+c=M^X+QNP&8i^6~nF0R)2QLo@76k z(F~_zY`YaSk2N+R@3F-Ltx+Kcl^G~er%IE??i)3vn0PRlFmnT_Wpgkp+yI6otwxhg ziga->YdnGo%>2lOcHFY#HF8Amgr!VyMjQ4ITKK!kUw>&~&bB0?=nt)s7q7ZT8jIYz zVikbUytwHW_-+^e_*6eARS?uIv*QJ8JWdyf(noE{<}6sJ=+94xg7wP*BtmROG9(}n zGl^2BXv{_g9UXuwGG|GAfB>m-N0OXGupb#auh@9TXs>1E%*%|u2_RIm7}yl4fR&P> zek?g^sDG+xQq`=c9<*r9l2g{4v*oqPRTE35md(tqSatE_>eGW88RMzi+?Shkxtf?da|3?da|3?da|3?dX5u z2!H=Rl<*gay`LIzRG0<;00D$)LqkwWLqi~Na&Km7Y-Iodc$|HaJxIeq9K~N#r9~1q~8j=(jN5Qq=;KyRs!Nplu2UkH5`~Y!tb5eAX z691PJTEuv8+>dwn9(V5mpNm7K`{pGZ8*bi*RvAfDQ^bk6(4VOEqB;&b9rgDyz?$aUG}H_ioz z1)do;(y4jkFtJ!@W4Vo4(NKvei6e@tQNECIS>e3JSuIyt^Pc>Lp`5m|%ypVWh<{@d zOGrY5j4Dbf!$Oo+jT93p+K+ko2ONKrTr#;zVB}ap1u7)R5B>+gyEXF@<8D$Y26VpI z_Qx;~*aaFj+x|Yb?ZyelN54hX``k!>kkQ~WR zQ^@Cm_cQvYEYN!kbgj9)HTQA)0Dq*ZtHcd(a0rYPD0|)G-NE+W{yo#|?+1rRa<34c zwiN&X00vM@R7C&)0EoSS_L86?00001bW%=J06^y0W&i*H0b)x>L;#2d9Y_EG010qN zS#tmYE+YT{E+YYWr9XB6000McNliruH*5!Og@8w ckzv390Jrt3cl`gGfdBvi07*qoM6N<$f}k0M`v3p{ literal 3119 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 diff --git a/theme/hacker/icons/pageup.png b/theme/hacker/icons/pageup.png index 1b4ce3216d30f7327ad6e580fa8d984ab9e94d3c..06140dfdc79bc634004bcd4d17aedd945bf24eea 100644 GIT binary patch delta 1446 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 W29#8Q35r?(00006*g*i#xG3IA`PSPmgnI-G^sG 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 N002ovPDHLkV1kp3VUGX+ diff --git a/theme/hacker/icons/reply.png b/theme/hacker/icons/reply.png index c0b3fb8f249097272c5c732d19aaf38e51b6115f..1cc0ac4570db2fd7b9f2f3af666ca1b827dceb32 100644 GIT binary patch delta 1126 zcmV-s1eyDT3xW%fBmwe~B|?8~g9Vo4`^i*?@#nW0{=h*cb4Y5QOU@BTDyeYAz~gz8 zeWjT8bsy=P!u^XqJSG?>K`-a6)oXo)T|XYUW6<$x4}Q(CUyiPc+o7z;j6r`+5_UfA zbY&9CI0w17J*Rr`*|$4o|2Svk?N5($YTbutLo%q;6@i3#2ua*mKQn)jb&}NGSDd!i zUE>t?#QjPT2~#n$g}&L<9xfCG8D~MMa6Kdv(=v+vM1S(Wi-R77~5_I&0~!X$a`$@Kx>vHM01DJC8aCd_}_0BYGBj0!h^AxW#zWRoIY9LySzAObT#a-ki!?0AhFkvm~2 z6P(e8{eu?%Zt_=Jn6oX3DEdPy9frGpmtIH zuKfZvx~TCcwbt2#8mz(Wc0p@9(ZvkJI1z~3B7lPC#Vk6d#EaZw77OE}P)3rv*o01t z7!amGtdkz>KFIwPx1j!0-1wi!g@x|FAQyn{dv0G)>+3ytu5DuHSGY8dg0F8Bgy-OR ztl^Jw<8}SM{azpbt%J9tx1+bCx1+bCx1+bC|Aiy``%uDPPiLPNWaoOIlOO{ie^aGJ zDh^fW_e-q_arywHsjI{daBv8W6exS$19UvKPLl)$f3n6Y_y7O^ delta 1127 zcmV-t1ep7R3xf-gBmwi0B|?A4fCZN1`vFy9{P}H$KX6gW9Fm&nl5@nBN-A8@@pxWk z*A&yP_m!?8Jipk(V}M~2v~oULz2;Zg_2Y#*1|6^V;MWNI<>(r?9mY#Go<* zCF)dZ(%5aIh7=PIHne}tjb+Z*`!Dp2e-x}09_J(a;%}MqDfV=ntITpHA_xebIz96 zAy-W-nOZh8w_?@BldESpcQ0NG7r_~*B^N7RN~x7YMW6~_74s`B2On~zLyvse;YT@Y z!}4jVY0J%;x6*%V=Pn(`M9Ds<<3u2CivSihFJ{pxC0^tfvsf6LLK#WwViP(o zVnCP%u}*rh`ylsI+=BW~apQj?7Z$qzf?NQ)@403QM^u~6(_xr15BP>H9AV~VO#zCY`-!g-6cTB)(tJ^2emd2MBx>okXv z#3Gg;LV%1K%Ba9XoK}q#6KUE{c=)4^UnG}It}+-o7Epx>$?=2#!S8O(!hht1n-od_ z-7mKNF#-g4fo9#dzmILZc>)BUfh(=;uQq_0PtxmcEp`M9Yy%h9ZB5<-E_Z;TCtWfm zM+(sN7Ye}p8GTa@7`z4g*4*A&`#607GSpS-1~@nbMvIia?(y#4&ffk#)9UXBPw8@* tSWB1+00006P)t-s0000cU6l+}$r2qJU?( zrkRg?K#nn;c|JzyvHqdxF`$BxJYSS@ivk3zP0MaP3cmu272hNFKd@bT!l-i}8p zo4y>aw_`aTkv;Dil#?XVh(5AcO&McDa24_F%hB05Z$)wi^cFnkkEINscmxW5_jY+1 z)=i=8XThy*Ej*KW^*it$DB%J;&BsvjcQC)k<{6_OT)%RxlO{V2ZfdvgxBR$AZ|R}s z$ipRnDoXeB1?xjj@+N-|w;6u%$exz@t4A7d6aJm*oZaRed$EfpCY(8)Lp_eNM_5=_ zwDz`yrnm)T-7TY;FTNply7LVcRWZrLU_2>Or$Up)el}`wG4f!=levNVk{MWJZop5V zjpk^wh8%h@pl`^P05RXb(6*bmxkiS(?}U|1P)0j(PIF%;|E7O^qiD`mGeq9*Sivt| zRR}j0xz%G8fY3ZK1yQ#{On0EaUJGmhLD^w89I*I$si;EF+zN~Hs(wL>=Zi(!j{<}U zwgt{m00EyU2qp5$tVD>TflqPdf z+(P$XkaG*&8@X?}eTQ0KKL%|R+g0dxP<=r8jSTy2*w*mJd%S*8f9>ghcf&`~N6|;o zN6|;oN6~*r(f>jb{(Z>qZv!&GiD1ZJQvd(~glR)VP)S2WAaHVTW@&6?004NLeUUv# z!$2IxUsI(;Dh^ft1FsM;h(1gs zC^1u?OC}TW9AEeF@%1jsv%Js!Il7gc$pD{7Jj-;$BHkdL+O%}e`@~^ZloaA~;!%Sx zNc_lk+2uFR1&0Nm88*_XdEzj!SZHIpjaku9i6@C8imFk*ka1bzyv129S6TC({Dq;M zwz7ZBb(%wnV-ZV8LWGPeN+`oZlva%t6Dit{dH4q$f0A4>xk_ND z^AqE4QYZ#=zS#E1Fc8=U8a3PgKDO<~3E+PQuC$iFQU_)}Nw2lE$Pv)94P0EeGj1(w)-Q(TC_TK(I z)9mjDhevX+5T3Rb00006P)t-s0001py@2+Tpdyo86*vmz0vi?>82(v&qLZE#xSQ@) AkpKVy literal 5718 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 diff --git a/theme/hacker/icons/scope_followers.png b/theme/hacker/icons/scope_followers.png index dd19c92f510fc147acc957e2eb7a727f094343c4..4f0854aa18d74e9988b62d786a175877b3b2e71a 100644 GIT binary patch delta 1425 zcmV;C1#bGN86*g*i#xG3IOm;~o!z<*&xT}B zsVf2r^AM7_uYP7A>m;eWuQ+Y3yT%&!gkPCJkeAoH`xu`EdJ*{^h0p3gMxVszdfDZZ zmif{MgD)pYzke2gOZ*gA9vSiLgr(cn7b4H@bB^=vYRXVFUlp~*rrQk`9*|u2V;RkG zD#o^3LGxH+1M(hQJkS~yVo;fZ5_PIHY3#mHLyCz9g9$S?fLb;OqrwefNYZLF*`!Dp z2eZZ_h``K`TxiEFJ6) zWs1gZM9|Rzs3LQg#0LnFDt9EwNd)_mvGak*R?fW4*qZ=CC5wSgkqTHTDeA|P zqlT)ACVy4UYU)9Y)+{+?%{g0Mn_M-qWNO*W+=^8fPp+Qb+`V`$Tm*ZdmRziODWz5p z6@e;zRjjYD9DK-;4n6W=hacsr4dv5P)0UexZ>81FT{^ajp1XDLrPo1WV5b;q=*Yu{ zk22~+txcI}>de!o&ob+S+C}xd_6yYLqQ;xlT7PE`YOn^g+Xb!dL>Ds<<3u2CivS9m z7qjS;5-)O#SuBi?LK#WwViP(oVnCP%u}*rh`ylsI+=BW~apQj?7Z$qzf?NQ)@400V4^XP(z+>=l}o#glR)VP)S2WAaHVTW@&6?004NLeUUv#!$2IxUsI(;Dh^f< zb;wYiEQpFaY88r5q0|bkI+$Gg1x*@~6ct1FsM;h(1gsC^1u?OC}TW9AEeF z@%1jsv%Js!Il7gc$pD{7Jj-;$BHkdL+O%}e`@~^ZloaA~;!%SxNc_lk+2uFR1&0Nm z88*_XdEzj!SZHIpjaku9i6@C8imFk*ka1bzyv129S6TC({Dq;MwzAB1nnQ?V5r0ca zLWGPeN+`oZlva%t6Dit{dH4q$f0A4>xk_ND^AqE4QYZ#=zS#E1 zFc8=U8a3PgKDO<~3E+PQuC$iFQU_)}Nw2lE$Pv)94P0EeG_arywHseh})4RCM>j1(w)-Q(TC_TK(I)9mjDhevX+5T3Rb z00006P)t-s0001py@2+TpdtVO00DGTPE!Ct=GbNc0004EOGiWihy@);00009a7bBm z000fw000fw0YWI7cmMzZ2XskIMF-^q8x|P|`t@Ch0001fNklr~F017pFR9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3 z004N}&01}CBP$O5uT{(vN`Me7htG3n2ebUS0_@n1yI<1jAJ6WDGNwS>D_x07)A-+i zC;bPn;GCl%nqrRe!YkyEUBN}V_G`C%h4p*A!ublHpZe+kg?~erN9*^;IL`Qje)+gT z&kbCk`$^lGC!LAT7q35z#<41Ss-T-*Ndcp5%r{90Tu_wB1E56`#`dQxN zw@`Yth~0f<_kU;+oMK*&uSfi5PjimFyAmP+u6Quz+`1wt*9e?_MnrKdQbARS5-LZmQ&io5z7<2X;qd*AH zgQ+ZhnRau%zKmE824%sVu)%WGJw+A%@GZZ1_LmTbh7;1P{Y(Ieu(rS$_;uhbvKNkg zsdLH<9258{u-y6JDi~lPaUE8=;C%!+$=TYtM|q8P;&wOW1w@FCUO^241!RRFAtK%q zT&R$E34bCIMI}j=5`7F&VvHJ1r;2(FDjHQaY1Wc_3Q1B-no`QCWS2c;Oen{!Ipv&7 z!J;J;%vCVHprg9#Yp7CV)tYLqrNMn#XwqWSmRfG5yY4$AfO_oOQ_sB&9&n`*hKx9L zq>)FN@U`h@m@?zknP#5l&e~!1nYCBue$N^o)_>e0%EsvjYv@+JO~EE7Vw{077Z{AI zF#v~l#@UrP1ZT_{XIFNfycY*6#mMPwjDf*0*vaHOcOT6Ck~adn-{sA{V~&ivzrh?C zbq~ya=Isq@y)3!)iy(_aU_dhtu{)y7}m0k z1b>)Es>vf&v2UKV@9e-5CyWFC$$RucyLf8X>OMCH_x&Yg(fUGiL z4O-!a>a^F6$-@l7L85sbf%hr}at&9{m>dknnQN^x`G|@jP1s{hEJDEEVFcq2BgW&H zbcpneNMqmDuv+DtExr9hvHsQO%sLjI5wuos)C<6b7PRaTb_tmHyo^A4Kd^Td7|@n1AEW3NKt?8`AXJdatu_g+^kBc}jt=mMMa}u&+lb z(WfmF(9dc6OMysUB6<2y1AGzw6J{PzxyIY`psRos;(;B)l`@b50IdTrQbjq`7ivv= zthse#AMxT*^_Vvbh&KP6P+Om7WPq3}!vAW1f~kE$c4Y;IgDgyFqirr@r+;uykXzvY zCM-HsZEX`wL?DP*5!fsOL945QGRiqGg-fU?7$f#{&7j4;#~?GUwdt#whS15?^wvTr z&uF33OGowzB_c!`P(a;{nru0fAPHn-7Qs9d0??piQ?p6=i^idr6l~MHM+U)thQfUs z@TnsMUE~q$qHu@`x9rH8OMf^Z6Y?ABqJI{@k$~WmR5zEDLfVk0qPiiex0GA8Oxv0r zC|0EAf`2T{0JiiH^UU6y$kkSRpAF>sjNd@frk5q$6_JA7Q=29zCh`90NdjTYHVT;( z`W96{Ib+@fBJ@qtJvfn!kv0mgh>4oJEe(%u=FxgQn&Hu{7ne;OLVsyZoF!-&flyr0 zF;SkQ0I!V(q?iX%@#N)02u8m2RcK}Qb zIha2-aw{MWIhr*AI@7o(iSwZ>KMJ#rGC6_1@LKvhFKRz*@`iQc6Ttg zsl(3Wgak%G)lw1634f&x1}5wp*#n27;OxFp``u7FK#x1nkJ8Z{%!B^HXHYOTc)a9h zA$xq(+e=pv(6TtgPxuLi|zyJ;g2f*O>811kay$}fSkF&fP%)graK7R`)p)<=TEzPp@3|czt z(lbcut|)j{6rnsND%zRq*Yv7Iu=yd_^>=prja^;rjvgT+J$mFZ)SVHcc}vNEn&msz z>{&1g{oIyq3jN%cZ3_L|mTe0C+?H(${oIxvTZHh6<3z#EW8C8{QOvMJQxklkp(tjV8*-S{iCt)MJp&^h7v2<)L zaxJ!PiB`+oEc?*XS55yX%dO7d72A6?#;G6DBC!_~p6gPZFB$fRz3fe#>5V#@D#@7T z3d%V9Pqw^vXdW6q!L!hzzW~o_=_l|&q9OJR3?-nEaHbuoicw+Mbdiy$r9e%saCOdd zJhcBL*MF3TyA^c)p@yO7B1YZaeXCj#(_-%lb-0~P8JYN2x<6p`ufphdFR-E;SPxjG z=$zMt8im_TDfQu-Z7}b%&~QGbk7Ln_VjLmf7ks)g;u_-YZDC|5xOh*=|5A*OMJvSU z-KhvMw(gZ=Cmmi-4RF%4%Xy9T7-M$@rJIEAXn$gWA#s)z3?V_775;}HJJ`^V!8zE_ zPc-PWu>C?lzoVY?RnvcOxmWs=;uCeusvEn0RG;+c<>ylkd(oei!tW|!`nfH8H2vI` zJ(hlM%N|WXw`Gr|Z`$&BLRfxj&s*$BPWx!=??>Z)I~wac8e27ERSd`M+ z*MB00-Z}F*fzSDk<2OB>zlWVwZchbpmOT#z`t6~Bu7?8qEc>EkWI|@gSoYx@W9^BA zJ?s2lnR*vC6e9L02Xc6od{V|(2hqW9pCQ%$+?CdKk4PN*i`5O*);HGQZSU9XJWqq~ zW9R3|Y0v(Cmakf4U(nyM#wMq~VT~<7e`3QLGlu?#HD(Nb)fyB4zkNPQ`vIjeJTgw< zhQw$W{qpC@*M8ywA3sk#{CVP$))S9z`i~fPgji{5jMVHeQMbp@E$%3{{}=GZmcDz# zS0_??Hc0;mqY}v{dZp120004nlOY2Ye>+ISP!xv$rb>NO9PA+CkfAzR5EXIMDionY zs1;guFuCaqnlvOSE{=k0!NJF3)xpJCR|i)?5PX2RxH>7iNQvhrg%&YhxZIEb-v8&^ za{!@UW}4M84rsb6lU)@^O}R zAovVi=`DYy4$OR#UTbO5BcOj9xVUa<${ujJ0}MVHvMIY#khYM|1Mg=vrYtaU3-qjc zeQVz1^Z`gyuaY;w!67hOpzL*@e|NR_?cX=e{`~;j)pBYbb{_@+000JJ4NFHv0RI60 z0RN!9r<0S}1Rj6m2@4Yw6_iJwtN;K3V@X6oRCwC$nmZE0AP|PLOgb-NWozY8(t9-f z9L37k%1cfiGQ7*Q*8YDy^$sa(iEQ(ow67VZV0_brQLrjeEz?ssBjelG4JmczZ4Ce zQ4lBxR)`4DT#VylwD^-?>I%G>qp-DL)Bpeg000000AOr`rC*vN1!@!}@;<=x qL#HE#Co(k^zFMOc27|%G><5i_r)r%Gsa^m8000O{MNUMnLSTYDr=$k} diff --git a/theme/hacker/icons/scope_public.png b/theme/hacker/icons/scope_public.png index dc8d371b0fc9b769361b80278cf4363501ba0f40..80f7f4af2c7a3bf2c4e18682e66970460e10aa9d 100644 GIT binary patch delta 1429 zcmV;G1#0@5A+-yT7=Hl+0001xr{kRf00QrNR9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3 z004N}?Ur4Z6*g*i#xG3IOm;~o!z<*&xT}B zsVf2r^AM7_uYP7A>m;eWuQ+Y3yT%%JM^`2g-3@S5FqE3}2jomkDNHOtXFk$8f63gabRJef{Nm`92n-uBd zfYo>e5t#Xr3+=dN$7|$>+zCsW;EXoxAGGjylfTl!oPTXeMA08wAunEajWiayb;T+G zp?PuBE%4ng{PC%NP^uuPTV}@#)_9yQ4yBLUlFeDLPSKyA5C!X(14x9}ieyMYAZ8M! zOwpK)2s%0dRbKIcLjjldC3{Of8$4Te0fm$=Yvn9eLRB zQAVApwJ9@Aoq5{yS!R7uyQqHGet{ZY)OeFx>woM)4c1_GyP&n5=wb$9oCw5i5kNun zViuiJ;ze#Ti-qw~C?iQ-Y(l3+3<%R8)=3X`ALM?DTTuTgZv0Q=!b107kPATfJ-08Y z_4PZ~HnH<7T$)C~*Eb5nb8tM?@W;6Ex_;k&uMhv$!Q0W>(c976(c976(c97g!V&&` zD1YHE+<~4;Z?lZl0004mX+uL$Nkc;*aB^>EX>4Tx0C=2zkv&MmKpe$iQ>8^J4ptC# z$WWauh>ALD6^c-y)C#RSm|Xe=O&XFE7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3krMxx z6k5c1aNLh~_a1le0HI!Hs@X9HsG4P@;(swQlU)@9uMjYZK1?GhF;kyQCKK=+U-$6w z^)AY@ywCkPx|N*C0G~)a%XGsc-XNaZv~yH6ykH@QG+f>{K$3LaarNK#aS&^S@WL!g`u3bvdndwLx^J$OMgg0 zgp4XmD8oXOR*e)BDcX;D_y-(+l3X&mN?_zzKm{r!#}EDozq>W_6XR}DCHff7%WN!R;7k?`V-`UHR4i0dkdPS{t6!oK15&pIa_t}9>)WEWSd}HY?Q6DnYP!4 jpDXZEye2QstNi{P!oQF6i^2 delta 4224 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 W&`#}=T|@u?002ovP6b4+LSTX~#|~Nm diff --git a/theme/hacker/icons/scope_question.png b/theme/hacker/icons/scope_question.png index 846d11e21d8177c294fadf1137bdabbbd82a0935..9010c548c4a1742d661f0f04fcb956ae7600a3c1 100644 GIT binary patch delta 1360 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 diff --git a/theme/hacker/icons/scope_reminder.png b/theme/hacker/icons/scope_reminder.png index ac56a4c4f491d525bc5f42d7e0d86e63fdbca193..644071bd0ae49a1313f89138829674aaedb5e97d 100644 GIT binary patch delta 1160 zcmV;31b6$@3)2gbBmwb}B_DrXmgFW3h2L34mVhLL#Bwk{=VS+2elFOquIlbdW|BPQ zp-kIgAq)9_GSy-H@%s$F;h>T^BsI?^=ZGVfRJdZ`@jS}DQcU~0k91Ap{>2_16AY7} zm-E)@C4K-a__P}a(fL4QsXc0TQNWfICb2f2T^J*Rr`*|$4o z|2V~V=tq!sAD#`#pi)9NHFtx+Kcl^G~er%IE??i)3vn0PRlFmnT_ zWpgkp+yI6otwxhgiga->YdnGo%>2lO_PS-S*T}JQC%7^p7;V@;XyLCWf2D;v+meW) zKeR$#yeb!IEOP4#F94x=anmjE-7fs`seVwZAgEhr#|zeYoFRV>rH|T@%~{~5=+Cc$ zg7qr^B*NN?WJo|DW)h`L(U^@0IywMVWX_WK00C0vjwCsWU_UZ;UTfnSqwUMenU@)R z6F{hBF|a980V^d%{aA9;P*u^Ss##4vXwjM_r>r?=%WIRXCYDSso0(g&>f*`OvzxmY zuZ4?X57d&26)%6K)XJe^p^8`){uP#k4>{7IM?UQEqa3xNd|GPSaWs_6@bZe&^aIc7BCR(buB-?x9(hkqO39q1kC z9q1kC9q1kC9q4}%2>(8m@F(E*o#A8ZdIXao10a7>r9~1q~8j=(jN5Qq=;KyRs!Nplu2UkH5`~Y!tb5eAX691PJTEuv8+>dwn9(V5m zpe3JSuIyt^Pc>Lp`5m|%ypVWh+`2;NJ4~+DoQBBLX=jG6cZ`h zk9qh99DkBrGPz1%QH<8D$Y26VpI_Qx;~*aaFj+x|Yb?Zye< ze+I6!mcLR5WlN54hX``k!>kkQ~WRQ^@Cm_cQvYEYN!kbgj9) zHTQA)0Hmp_#0_w82#gdcd)?#R!S>$%J=5&(2Zu*;uMnQL6#xJL22e~?MF0Q*h`j}X a_L86?lfncz3grSD78(HG1BP~!1O?G4aWp9a delta 1162 zcmV;51a=zRd-L)lgz_B zlsPt7fRO)BP!+~sf6nj+E-INrQuADLj<`}ug)15!kE`rYifMoDS30}!{$dYz2g4+& z<#@Gvj<2xmW5TrtZLjv=XAk@7=UM?f zk6UbaeLGq2;n|Q3Ds{yuVID#f@nkt8kmIhnGoCC7<46Q;k`z#h_!$WVdHKAnj`3Nb z7m=@4_^AHf`XD~n(=H#h%%?_ZeAz+zwfMWlPYcT(5x;g=x?Fu0dCu;0j^pcU%1|_) z85P5&&YFXP8zh%~T1I~{+={mCrJ#7Mu>nqxEp8}{3Nfh6K#4k4nl$#hQA3D{2ODbU z#Z*`!Dp2fxN6fLRj0W1)TBvai?3v2rI2Wr8!plpmJxPn|zg!kleM zMA2`p5Erk^MHq|RdSVoS&^)>6F7Q=O{P8J&kg6c4yUdOctZ{!kTx?2@+>)KMV4R{p zb_E6NrvpfYwH3jTfI!S7N|~ZD8xeGL0IG<5?TrltNR>N+Lb0<9Y>HICN=cDFmK-@$RWzw;R#OjJv}VaEYtGs7I^?Q}B~#00=2on_cyjgZ z=I+I7;UYK#wd8+d#Y-u*a;R9S!dJ!k3d_cuY-!UiZ?^eXw%U+BEj4YqS@Tv}?cAl~ znCQ7%_g;D(6b4R;k%o>uZ1^anPUPB@nWoM>ZTc*;-qcR2pUO{Aqmvr%q}DjQslgh| zE*G?p6J5+ej1z&lEdoerUd*CXO1#J|X0b3fg))NF#U^2NTEu`b4Pu>ivwM*H7Pp}O zEpGg8QeP&l2h_3+2ZlO6*ge_OR8Ee>`l;*g;_SrC=ts8uLJ zg-|QB>R@u|7c^-|Qd}Gb*Mfr|i&X~~XI&j!1wrrw#L3Y~(M3x9Us7lhBa=!Bx%{dSd_^Ck2qBDw#7uoo6w~k=U-$6w^)Ak{ywCkP!b-tp zfKMQve`UI15pNJDHZ7g=K5>MVC58B$c-){15JaL3rD0Q*i z#jI?o#M8tvMb#+ZpL1E^yv13q)>-?W{Dq-{wzAB1nj=VI5lavuKt>%ERAC`bt44~6 z4DBa9{KJl4B$rIC3K%&SP=gA|@q_=t?{3ZFf7GO#6iNcUFSh+L3Iun7R>QWxk8Qhk z0tB9cE3MMDH$92^2;CCXm+cz1tyZ~vZY_xA&OVsfg6%i-$)000J1OjJcJ#8oC> c1t6S2Z;_M01UL%h1{e$uCLVYw^OFJv(UC4R-T(jq diff --git a/theme/hacker/icons/scope_report.png b/theme/hacker/icons/scope_report.png index a3e0952a5c239253e33701092e41d8c08874c8d4..4fd8bb0590739931b1c3626f3f61d27489c86ac6 100644 GIT binary patch delta 1336 zcmV-81;_fn8ovsV7=Hl+0001xr{kRf00Q%RR9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3 z004N}?Ur4Z6*g*i#xG3IA`PSPmgnI-G^sG zGN{xQfrNPoN!(XIGmv$X)ZJH{w$@$a9MF;2l?eoSdA+-j@mZi3k?&FXto~#4NqnxC zT|Q}`C@x z8O?Ai#9tDP?>=eb*eOJ?7mS$iirn<2{Si zq(~PBv&JKcz|4vr&5N6Ef$w(Vk5Bc3QUyWXGCN+d#^ZExD1FqHY|espivIkBC|JK7KqACeBtrrM zF_S1|ipFe2(9r>?B6F6+2MCZVcO=P41pAS(^NNjUjP_bq&b-Xnn*c&3i-Ap%3Ro#A z>c^6!hJUJxCRNR9>OqUvEIDP(Ia^+vTs5&|YT3-(id7d+uAbf8y?8BL1bd*CT&#F0 zrB)6Vfhv4etgo;fe8`awJ@R3PALXbG<G$?KWV{0004mX+uL$Nkc;*aB^>EX>4Tx0C=2zkv&MmKpe$iQ>8^J z4ptC#$WWauh>ALD6^c-y)C#RSm|Xe=O&XFE7e~Rh;NZt%)xpJCR|i)?5c~jfb8}L3 zkrMxx6k5c1aNLh~_a1le0HI!Hs@X9HsDGMeq~b9#lU)@9uMjYZK1?GhF;kyQCKK=+ zU-$6w^)AY@ywCkPx|N*C0G~)a%XGsc-XNaZv~yH6ykH@QG+f>{K$3LaarNK#aS&^S@WL!g`u3bvdndwLw|^4 z5lcuygp4XmD8oXOR*e)BDcX;D_y-(+l3X&mN?_zzKm{r!#}EDozq>W_6XR}DCO delta 3373 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 A(f|Me diff --git a/theme/hacker/icons/scope_unlisted.png b/theme/hacker/icons/scope_unlisted.png index 31fd5402bd2400e59d03bdb93cb3fb65e5c1388f..34d5407edb00e5cfb817596f81eebf04f3cde305 100644 GIT binary patch delta 1403 zcmV->1%&#v8Ji1`7=Hl+0001xr{kRf00QxPR9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3 z004N}?Ur4Z6*g*i#xG3IOm;~o!z<*&xT}B zsVf2r^AM7_uYP7A>m;eWuQ+Y3yT&=7OH!^(Ajr$>-F=MD0=$Fza@SOERT%%b;8o^>I;!)_c_P;b~R-vny-r5V$~8> zI2B{tt)O|Vu>pCHEgoo%3Nfh6K#4k4nlyIbs3FC~gTaKE8$d0agHhoIVgxv7G})v` z7YDP(BZ$Dvk6dWSEjwN#N90ae$^>V$VgI0oznlD(7Jue!OCpN?&tJk+JiNjc1JZT2{`y%-EX%LM4lVO_2&%DJkm5 zlB0&Iihm|m&1&jFi`FbTWz9KTUYlGsv1Dr5%-o7q7f-I9-Q2x+EnEb9pq5;$cqye; z4i$kad{wNkupE5Ikq$lbVTT{(s14=QQqz{3HE*TW&RsgTiJrT4@1@s4VPK~iY3Rtq zhL1ApM6FGkY3j_=rq43#gW5&)yY>sz=%U7()PGuM4{ERmv)cu&?L-$d5aUE3Zi@g4 znisR^loBs;i&-p;k3tzq>S7Z*En+~J2C+_hu=^nQQ{003PjTaaA{Q3A|AJfqy6?Gt zL9MUfxweU&U*Xa;3ckKk5T1kMv4%g!jo0=2_IrK!w+`Np-j3dm-j3dm-j3dm{uhq$ z?|(xHe*t%{o>mJ^$^rlY0fcEoLr_UWLm+T+Z)Rz1WdHzpoPCi!NW(xJ#a~mUMJf(f z5Ov5CmrBZ{g~zL0TQ;k?CJEmv9dp8SQOoVK#eb(%wnV}B7# zNJ4~+DoQBBLX=jG6cZ`hk9qh99DkBrGPz1%$%J=5&(2Zu*;uMnQL z6#xJL22e~?MF0Q*h`oUJlAt000004WQchCJA5Cza96qJm>D7PA;F^VHtQjnbB$4dkggVOMd zgAbqRX}PU~ONR({BN9(ok%UHM#%*002ov JPDHLkV1ig@n+5;? delta 3234 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 Date: Sun, 28 Feb 2021 10:22:13 +0000 Subject: [PATCH 0140/1416] Hacker theme banner --- theme/hacker/banner.txt | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/theme/hacker/banner.txt b/theme/hacker/banner.txt index db5cf9014..e26d52719 100644 --- a/theme/hacker/banner.txt +++ b/theme/hacker/banner.txt @@ -1,10 +1,6 @@ - 88888888888 88 - 88 "" - 88 - 88aaaaa 8b,dPPYba, 88 ,adPPYba, 8b d8 ,adPPYba, 8b,dPPYba, - 88""""" 88P' "8a 88 a8" "" `8b d8' a8" "8a 88P' `"8a - 88 88 d8 88 8b `8b d8' 8b d8 88 88 - 88 88b, ,a8" 88 "8a, ,aa `8b,d8' "8a, ,a8" 88 88 - 88888888888 88`YbbdP"' 88 `"Ybbd8"' Y88' `"YbbdP"' 88 88 - 88 d8' - 88 d8' + _____ __ _ __ _ _ E P I C Y O N + |_ _| /_/ | | /_/ _ __ ___ __ _ | |_ (_) __ _ _ _ ___ + | | / _ \ | | / _ \ | '_ ` _ \ / _` | | __| | | / _` | | | | | / _ \ + | | | __/ | | | __/ | | | | | | | (_| | | |_ | | | (_| | | |_| | | __/ + |_| \___| |_| \___| |_| |_| |_| \__,_| \__| |_| \__, | \__,_| \___| + |_| From d4e3fefda1d125b78726c919bdd04580d856c664 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 28 Feb 2021 12:00:47 +0000 Subject: [PATCH 0141/1416] Debug --- daemon.py | 1 + 1 file changed, 1 insertion(+) diff --git a/daemon.py b/daemon.py index 0cfd5a2ca..81f5df727 100644 --- a/daemon.py +++ b/daemon.py @@ -13792,6 +13792,7 @@ class PubServer(BaseHTTPRequestHandler): "editblogpost", "newreminder", "newevent") for currPostType in postTypes: if not authorized: + print('POST was not authorized') break postRedirect = self.server.defaultTimeline From 87ca915e722a81f019f4d0cdf1a62b679df648e8 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 28 Feb 2021 12:04:52 +0000 Subject: [PATCH 0142/1416] Debug --- daemon.py | 1 + 1 file changed, 1 insertion(+) diff --git a/daemon.py b/daemon.py index 81f5df727..fd7aef23d 100644 --- a/daemon.py +++ b/daemon.py @@ -13806,6 +13806,7 @@ class PubServer(BaseHTTPRequestHandler): callingDomain, cookie, authorized) if pageNumber: + print(currPostType + ' post received') nickname = self.path.split('/users/')[1] if '?' in nickname: nickname = nickname.split('?')[0] From 2752bddde15da223d4594cd2d3cb39f22324a886 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 28 Feb 2021 12:25:32 +0000 Subject: [PATCH 0143/1416] Replace semicolons on outgoing posts --- outbox.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/outbox.py b/outbox.py index 11d595c6e..b95a2cd89 100644 --- a/outbox.py +++ b/outbox.py @@ -77,6 +77,13 @@ def postMessageToOutbox(messageJson: {}, postToNickname: str, if messageJson.get('object'): if isinstance(messageJson['object'], dict): if messageJson['object'].get('content'): + # replace all semicolons, because for mysterious + # reasons this appears to create a problem for + # webservers receiving the POST + if ';' in messageJson['object']['content']: + messageJson['object']['content'] = \ + messageJson['object']['content'].replace(';', ',') + if dangerousMarkup(messageJson['object']['content'], allowLocalNetworkAccess): print('POST to outbox contains dangerous markup: ' + From a7095442f453629d68d5848131a35285664089a5 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 28 Feb 2021 12:34:39 +0000 Subject: [PATCH 0144/1416] Escape code --- outbox.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/outbox.py b/outbox.py index b95a2cd89..f45daa74a 100644 --- a/outbox.py +++ b/outbox.py @@ -77,12 +77,10 @@ def postMessageToOutbox(messageJson: {}, postToNickname: str, if messageJson.get('object'): if isinstance(messageJson['object'], dict): if messageJson['object'].get('content'): - # replace all semicolons, because for mysterious - # reasons this appears to create a problem for - # webservers receiving the POST + # semicolons are disliked, so escape them if ';' in messageJson['object']['content']: messageJson['object']['content'] = \ - messageJson['object']['content'].replace(';', ',') + messageJson['object']['content'].replace(';', '%3B') if dangerousMarkup(messageJson['object']['content'], allowLocalNetworkAccess): From 04b061e5c5c7edae258090bf2dce7dfe16ac7fd8 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 28 Feb 2021 13:44:16 +0000 Subject: [PATCH 0145/1416] Spell check message text area --- webapp_create_post.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/webapp_create_post.py b/webapp_create_post.py index 0a682af4d..d43d64ca0 100644 --- a/webapp_create_post.py +++ b/webapp_create_post.py @@ -753,7 +753,8 @@ def htmlNewPost(cssCache: {}, mediaInstance: bool, translate: {}, newPostForm += \ ' \n' + str(messageBoxHeight) + 'px"' + selectedStr + ' spellcheck="true">' + \ + '\n' newPostForm += extraFields + citationsStr + dateAndLocation if not mediaInstance or replyStr: newPostForm += newPostImageSection From 0354674c108e032bb819973b9b488d05235320c4 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 28 Feb 2021 13:52:45 +0000 Subject: [PATCH 0146/1416] Spell checking on text areas --- webapp_profile.py | 41 ++++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/webapp_profile.py b/webapp_profile.py index dc01f0c98..4a1dff572 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -1260,12 +1260,12 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, if instanceDescription: instanceStr += \ ' ' else: instanceStr += \ ' ' + 'style="height:200px" spellcheck="true">' instanceStr += \ ' ' @@ -1306,7 +1306,8 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, moderatorsStr += \ ' ' + '..." style="height:200px" spellcheck="false">' + \ + moderators + '' moderatorsStr += '' editors = '' @@ -1320,7 +1321,8 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, translate['A list of editor nicknames. One per line.'] editorsStr += \ ' ' + 'style="height:200px" spellcheck="false">' + \ + editors + '' editorsStr += '' themes = getThemesList(baseDir) @@ -1369,8 +1371,8 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, peertubeInstancesStr += url + '\n' peertubeStr += \ ' \n' + 'style="height:200px" spellcheck="false">' + \ + peertubeInstancesStr + '\n' instanceTitle = \ getConfigParam(baseDir, 'instanceTitle') @@ -1429,8 +1431,8 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, editProfileForm += \ ' \n' editProfileForm += \ - ' \n' + ' \n' alsoKnownAsStr = '' if actorJson.get('alsoKnownAs'): @@ -1509,7 +1511,8 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, editProfileForm += \ ' \n' + 'style="height:100px" spellcheck="false">' + \ + PGPpubKey + '\n' editProfileForm += '
\n' @@ -1622,7 +1625,7 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, editProfileForm += '
\n' editProfileForm += ' \n' editProfileForm += \ @@ -1631,7 +1634,8 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, editProfileForm += '
\n' editProfileForm += \ ' \n' + 'style="height:200px" spellcheck="false">' + \ + switchStr + '\n' editProfileForm += \ '
' + \ - translate['Danger Zone'] + '\n' + translate['Danger Zone'] + '\n' editProfileForm += '
\n' editProfileForm += '
\n' From c345290354f73d26a3b9be4f0e0db10c72684c4f Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 6 Mar 2021 18:20:10 +0000 Subject: [PATCH 0316/1416] Getting calendar item actor --- webapp_calendar.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/webapp_calendar.py b/webapp_calendar.py index 5851abda6..a5bc1611d 100644 --- a/webapp_calendar.py +++ b/webapp_calendar.py @@ -135,12 +135,6 @@ def _htmlCalendarDay(personCache: {}, cssCache: {}, translate: {}, eventDescription = None eventPlace = None postId = None - # get display name from sending actor - senderName = '' - if eventPost.get('actor'): - actor = eventPost['actor'] - senderName = '' + \ - getDisplayName(baseDir, actor, personCache) + ': ' # get the time place and description for ev in eventPost: if ev['type'] == 'Event': @@ -152,6 +146,15 @@ def _htmlCalendarDay(personCache: {}, cssCache: {}, translate: {}, "%Y-%m-%dT%H:%M:%S%z") eventTime = eventDate.strftime("%H:%M").strip() if ev.get('name'): + # get display name from sending actor + senderName = '' + # if ev.get('actor'): + # actor = ev['actor'] + # senderName = \ + # '' + \ + # getDisplayName(baseDir, actor, + # personCache) + \ + # ': ' eventDescription = senderName + ev['name'].strip() elif ev['type'] == 'Place': if ev.get('name'): From c038d86e22f190b5d37c4bde233879254654235b Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 6 Mar 2021 18:38:36 +0000 Subject: [PATCH 0317/1416] Sender tag for calendar events --- happening.py | 2 ++ webapp_calendar.py | 20 +++++++++++--------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/happening.py b/happening.py index 3c78521be..e13c8270b 100644 --- a/happening.py +++ b/happening.py @@ -233,6 +233,8 @@ def getTodaysEvents(baseDir: str, nickname: str, domain: str, # link to the id so that the event can be # easily deleted tag['postId'] = postId.split('#statuses#')[1] + tag['sender'] = postId.split('#statuses#')[0] + tag['sender'] = tag['sender'].replace('#', '/') postEvent.append(tag) else: # tag is a place diff --git a/webapp_calendar.py b/webapp_calendar.py index a5bc1611d..cf6c72521 100644 --- a/webapp_calendar.py +++ b/webapp_calendar.py @@ -135,6 +135,7 @@ def _htmlCalendarDay(personCache: {}, cssCache: {}, translate: {}, eventDescription = None eventPlace = None postId = None + senderName = '' # get the time place and description for ev in eventPost: if ev['type'] == 'Event': @@ -145,21 +146,22 @@ def _htmlCalendarDay(personCache: {}, cssCache: {}, translate: {}, datetime.strptime(ev['startTime'], "%Y-%m-%dT%H:%M:%S%z") eventTime = eventDate.strftime("%H:%M").strip() - if ev.get('name'): + if ev.get('sender'): # get display name from sending actor - senderName = '' - # if ev.get('actor'): - # actor = ev['actor'] - # senderName = \ - # '' + \ - # getDisplayName(baseDir, actor, - # personCache) + \ - # ': ' + if ev.get('sender'): + senderActor = ev['sender'] + senderName = \ + '' + \ + getDisplayName(baseDir, senderActor, + personCache) + ': ' + if ev.get('name'): eventDescription = senderName + ev['name'].strip() elif ev['type'] == 'Place': if ev.get('name'): eventPlace = ev['name'] + if senderName and eventDescription: + eventDescription = senderName + eventDescription deleteButtonStr = '' if postId: deleteButtonStr = \ From 72ea07ceac55319541c7500cf66aac050035a40e Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 6 Mar 2021 18:41:13 +0000 Subject: [PATCH 0318/1416] Actor link --- webapp_calendar.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp_calendar.py b/webapp_calendar.py index cf6c72521..55a2ad010 100644 --- a/webapp_calendar.py +++ b/webapp_calendar.py @@ -151,7 +151,7 @@ def _htmlCalendarDay(personCache: {}, cssCache: {}, translate: {}, if ev.get('sender'): senderActor = ev['sender'] senderName = \ - '' + \ + '' + \ getDisplayName(baseDir, senderActor, personCache) + ': ' if ev.get('name'): From 4e5c05004ce43312ed25a9b58d959122083b3d19 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 6 Mar 2021 18:44:33 +0000 Subject: [PATCH 0319/1416] Check that display name exists --- webapp_calendar.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/webapp_calendar.py b/webapp_calendar.py index 55a2ad010..89da70f61 100644 --- a/webapp_calendar.py +++ b/webapp_calendar.py @@ -150,10 +150,13 @@ def _htmlCalendarDay(personCache: {}, cssCache: {}, translate: {}, # get display name from sending actor if ev.get('sender'): senderActor = ev['sender'] - senderName = \ - '' + \ + dispName = \ getDisplayName(baseDir, senderActor, - personCache) + ': ' + personCache) + if dispName: + senderName = \ + '' + \ + dispName + ': ' if ev.get('name'): eventDescription = senderName + ev['name'].strip() elif ev['type'] == 'Place': From 4667b455b7ab4a02b739558e931b2d90edd88cf1 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 6 Mar 2021 18:48:16 +0000 Subject: [PATCH 0320/1416] Duplicate prepends --- webapp_calendar.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/webapp_calendar.py b/webapp_calendar.py index 89da70f61..56ea86e5f 100644 --- a/webapp_calendar.py +++ b/webapp_calendar.py @@ -158,13 +158,15 @@ def _htmlCalendarDay(personCache: {}, cssCache: {}, translate: {}, '' + \ dispName + ': ' if ev.get('name'): - eventDescription = senderName + ev['name'].strip() + eventDescription = ev['name'].strip() elif ev['type'] == 'Place': if ev.get('name'): eventPlace = ev['name'] + # prepend a link to the sender of the calendar item if senderName and eventDescription: eventDescription = senderName + eventDescription + deleteButtonStr = '' if postId: deleteButtonStr = \ From 3cd11b73cf1229c5ada478d924e24e220764dd43 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 6 Mar 2021 19:04:41 +0000 Subject: [PATCH 0321/1416] Indicate calendar reminder events --- webapp_calendar.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/webapp_calendar.py b/webapp_calendar.py index 56ea86e5f..829cd577b 100644 --- a/webapp_calendar.py +++ b/webapp_calendar.py @@ -136,6 +136,7 @@ def _htmlCalendarDay(personCache: {}, cssCache: {}, translate: {}, eventPlace = None postId = None senderName = '' + senderActor = None # get the time place and description for ev in eventPost: if ev['type'] == 'Event': @@ -158,14 +159,20 @@ def _htmlCalendarDay(personCache: {}, cssCache: {}, translate: {}, '' + \ dispName + ': ' if ev.get('name'): - eventDescription = ev['name'].strip() + eventDescription = ev['name'].strip() elif ev['type'] == 'Place': if ev.get('name'): eventPlace = ev['name'] # prepend a link to the sender of the calendar item if senderName and eventDescription: - eventDescription = senderName + eventDescription + senderActor2 = senderActor.replace('/users/', '/@') + if senderActor not in eventDescription and \ + senderActor2 not in eventDescription: + eventDescription = senderName + eventDescription + else: + eventDescription = \ + translate['Reminder'] + ': ' + eventDescription deleteButtonStr = '' if postId: From b67063113ed4691c8e31b112d829ee8976c535a9 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 6 Mar 2021 19:41:39 +0000 Subject: [PATCH 0322/1416] Comment --- webapp_calendar.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/webapp_calendar.py b/webapp_calendar.py index 829cd577b..787d64165 100644 --- a/webapp_calendar.py +++ b/webapp_calendar.py @@ -166,6 +166,8 @@ def _htmlCalendarDay(personCache: {}, cssCache: {}, translate: {}, # prepend a link to the sender of the calendar item if senderName and eventDescription: + # if the sender is also mentioned within the event + # description then this is a reminder senderActor2 = senderActor.replace('/users/', '/@') if senderActor not in eventDescription and \ senderActor2 not in eventDescription: From fb096f5d9231e93205ad17aa4a1ba08ddc79dc75 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 6 Mar 2021 20:00:24 +0000 Subject: [PATCH 0323/1416] Set variable --- posts.py | 1 + 1 file changed, 1 insertion(+) diff --git a/posts.py b/posts.py index dbf0dc2fe..a2340eaa1 100644 --- a/posts.py +++ b/posts.py @@ -3148,6 +3148,7 @@ def _createBoxIndexed(recentPostsCache: {}, baseDir + '/accounts/' + timelineNickname + '@' + domain + \ '/' + indexBoxName + '.index' postsCtr = 0 + postsAddedToTimeline = 0 if os.path.isfile(indexFilename): with open(indexFilename, 'r') as indexFile: postsAddedToTimeline = 0 From 2e552bb17cd516aef2faf91fa7bfb4ecff751c34 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 6 Mar 2021 21:32:27 +0000 Subject: [PATCH 0324/1416] Outgoing media posts also go to the media timeline --- daemon.py | 4 +++- outbox.py | 17 ++++++++++++++++- schedule.py | 4 +++- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/daemon.py b/daemon.py index b1c30a742..ccf9b446e 100644 --- a/daemon.py +++ b/daemon.py @@ -1115,7 +1115,9 @@ class PubServer(BaseHTTPRequestHandler): print('Posting to nickname ' + postToNickname) self.postToNickname = postToNickname - return postMessageToOutbox(messageJson, self.postToNickname, + return postMessageToOutbox(self.server.session, + self.server.translate, + messageJson, self.postToNickname, self.server, self.server.baseDir, self.server.httpPrefix, self.server.domain, diff --git a/outbox.py b/outbox.py index 11d595c6e..05b21240e 100644 --- a/outbox.py +++ b/outbox.py @@ -10,6 +10,7 @@ import os from shutil import copyfile from session import createSession from auth import createPassword +from posts import isImageMedia from posts import outboxMessageCreateWrap from posts import savePostToBox from posts import sendToFollowersThread @@ -41,7 +42,8 @@ from shares import outboxShareUpload from shares import outboxUndoShareUpload -def postMessageToOutbox(messageJson: {}, postToNickname: str, +def postMessageToOutbox(session, translate: {}, + messageJson: {}, postToNickname: str, server, baseDir: str, httpPrefix: str, domain: str, domainFull: str, onionDomain: str, i2pDomain: str, port: int, @@ -262,6 +264,19 @@ def postMessageToOutbox(messageJson: {}, postToNickname: str, for boxNameIndex in indexes: if not boxNameIndex: continue + + # should this also go to the media timeline? + if boxNameIndex == 'inbox': + if isImageMedia(session, baseDir, httpPrefix, + postToNickname, domain, + messageJson, + translate, YTReplacementDomain, + allowLocalNetworkAccess, + recentPostsCache): + inboxUpdateIndex('tlmedia', baseDir, + postToNickname + '@' + domain, + savedFilename, debug) + if boxNameIndex == 'inbox' and outboxName == 'tlblogs': continue # avoid duplicates of the message if already going diff --git a/schedule.py b/schedule.py index 5b4616d54..13f2f4586 100644 --- a/schedule.py +++ b/schedule.py @@ -85,7 +85,9 @@ def _updatePostSchedule(baseDir: str, handle: str, httpd, if nickname: httpd.postToNickname = nickname - if not postMessageToOutbox(postJsonObject, nickname, + if not postMessageToOutbox(httpd.session, + httpd.translate, + postJsonObject, nickname, httpd, baseDir, httpd.httpPrefix, httpd.domain, From e9d49c91b0974324a3e16cd246a91b05ee3c9df3 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 6 Mar 2021 23:03:14 +0000 Subject: [PATCH 0325/1416] Check that media file exists --- media.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/media.py b/media.py index eb0df3d43..66b6823e3 100644 --- a/media.py +++ b/media.py @@ -54,6 +54,10 @@ def removeMetaData(imageFilename: str, outputFilename: str) -> None: def _isMedia(imageFilename: str) -> bool: + """Is the given file a media file? + """ + if not os.path.isfile(_isMedia): + return False permittedMedia = getMediaExtensions() for m in permittedMedia: if imageFilename.endswith('.' + m): From dc66f79a3af3170627834d8dfac2135e23a3a45a Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 6 Mar 2021 23:04:58 +0000 Subject: [PATCH 0326/1416] Debug --- media.py | 1 + 1 file changed, 1 insertion(+) diff --git a/media.py b/media.py index 66b6823e3..d644dca97 100644 --- a/media.py +++ b/media.py @@ -57,6 +57,7 @@ def _isMedia(imageFilename: str) -> bool: """Is the given file a media file? """ if not os.path.isfile(_isMedia): + print('Media file does not exist ' + imageFilename) return False permittedMedia = getMediaExtensions() for m in permittedMedia: From ada6680cf97c09accace981f6593eeadebb5860e Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 6 Mar 2021 23:07:54 +0000 Subject: [PATCH 0327/1416] Image filename --- media.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/media.py b/media.py index d644dca97..358c98932 100644 --- a/media.py +++ b/media.py @@ -56,8 +56,8 @@ def removeMetaData(imageFilename: str, outputFilename: str) -> None: def _isMedia(imageFilename: str) -> bool: """Is the given file a media file? """ - if not os.path.isfile(_isMedia): - print('Media file does not exist ' + imageFilename) + if not os.path.isfile(imageFilename): + print('WARN: Media file does not exist ' + imageFilename) return False permittedMedia = getMediaExtensions() for m in permittedMedia: From 6b2f22d562d390a099e3eacd197398dcc9f07c4e Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 6 Mar 2021 23:16:54 +0000 Subject: [PATCH 0328/1416] Check that media file is written --- content.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/content.py b/content.py index c1b2ff418..a0bbab004 100644 --- a/content.py +++ b/content.py @@ -973,9 +973,15 @@ def saveMediaInFormPOST(mediaBytes, debug: bool, os.remove(possibleOtherFormat) fd = open(filename, 'wb') + if not fd: + return None, None fd.write(mediaBytes[startPos:]) fd.close() + if not os.path.isfile(filename): + print('WARN: Media file could not be written to file: ' + filename) + return None, None + return filename, attachmentMediaType From 3e7e64f5d01ef97c45e418cfd1c7b992d07d7264 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 6 Mar 2021 23:19:03 +0000 Subject: [PATCH 0329/1416] Debug --- content.py | 1 + 1 file changed, 1 insertion(+) diff --git a/content.py b/content.py index a0bbab004..32858c926 100644 --- a/content.py +++ b/content.py @@ -981,6 +981,7 @@ def saveMediaInFormPOST(mediaBytes, debug: bool, if not os.path.isfile(filename): print('WARN: Media file could not be written to file: ' + filename) return None, None + print('Uploaded media file written: ' + filename) return filename, attachmentMediaType From c6da9ce269062301dee1cc088d5e1ca574506e5c Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 6 Mar 2021 23:29:44 +0000 Subject: [PATCH 0330/1416] Filename for video --- daemon.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/daemon.py b/daemon.py index ccf9b446e..cfefb8300 100644 --- a/daemon.py +++ b/daemon.py @@ -12673,7 +12673,9 @@ class PubServer(BaseHTTPRequestHandler): postImageFilename) else: if os.path.isfile(filename): - os.rename(filename, filename.replace('.temp', '')) + newFilename = filename.replace('.temp', '') + os.rename(filename, newFilename) + filename = newFilename fields = \ extractTextFieldsInPOST(postBytes, boundary, From 06f324b7d65b3e649afd5d4abbc6f1a26a45ec60 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 7 Mar 2021 10:15:17 +0000 Subject: [PATCH 0331/1416] Mime type detection functions --- webapp_utils.py | 77 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 59 insertions(+), 18 deletions(-) diff --git a/webapp_utils.py b/webapp_utils.py index a0f7d0076..efda6070c 100644 --- a/webapp_utils.py +++ b/webapp_utils.py @@ -785,6 +785,61 @@ def addEmojiToDisplayName(baseDir: str, httpPrefix: str, return displayName +def _isImageMimeType(mimeType: str) -> bool: + """Is the given mime type an image? + """ + imageMimeTypes = ( + 'image/png', + 'image/jpeg', + 'image/webp', + 'image/avif', + 'image/svg+xml', + 'image/gif' + ) + if mimeType in imageMimeTypes: + return True + return False + + +def _isVideoMimeType(mimeType: str) -> bool: + """Is the given mime type a video? + """ + videoMimeTypes = ( + 'video/mp4', + 'video/webm', + 'video/ogv' + ) + if mimeType in videoMimeTypes: + return True + return False + + +def _isAudioMimeType(mimeType: str) -> bool: + """Is the given mime type an audio file? + """ + audioMimeTypes = ( + 'audio/mpeg', + 'audio/ogg' + ) + if mimeType in audioMimeTypes: + return True + return False + + +def _isAttachedImage(attachmentFilename: str) -> bool: + """Is the given attachment filename an image? + """ + if '.' not in attachmentFilename: + return False + imageExt = ( + 'png', 'jpg', 'jpeg', 'webp', 'avif', 'svg', 'gif' + ) + ext = attachmentFilename.split('.')[-1] + if ext in imageExt: + return True + return False + + def getPostAttachmentsAsHtml(postJsonObject: {}, boxName: str, translate: {}, isMuted: bool, avatarLink: str, replyStr: str, announceStr: str, likeStr: str, @@ -810,19 +865,8 @@ def getPostAttachmentsAsHtml(postJsonObject: {}, boxName: str, translate: {}, imageDescription = '' if attach.get('name'): imageDescription = attach['name'].replace('"', "'") - if mediaType == 'image/png' or \ - mediaType == 'image/jpeg' or \ - mediaType == 'image/webp' or \ - mediaType == 'image/avif' or \ - mediaType == 'image/svg+xml' or \ - mediaType == 'image/gif': - if attach['url'].endswith('.png') or \ - attach['url'].endswith('.jpg') or \ - attach['url'].endswith('.jpeg') or \ - attach['url'].endswith('.webp') or \ - attach['url'].endswith('.avif') or \ - attach['url'].endswith('.svg') or \ - attach['url'].endswith('.gif'): + if _isImageMimeType(mediaType): + if _isAttachedImage(attach['url']): if attachmentCtr > 0: attachmentStr += '
' if boxName == 'tlmedia': @@ -862,9 +906,7 @@ def getPostAttachmentsAsHtml(postJsonObject: {}, boxName: str, translate: {}, '" alt="' + imageDescription + '" title="' + \ imageDescription + '" class="attachment">\n' attachmentCtr += 1 - elif (mediaType == 'video/mp4' or - mediaType == 'video/webm' or - mediaType == 'video/ogv'): + elif _isVideoMimeType(mediaType): extension = '.mp4' if attach['url'].endswith('.webm'): extension = '.webm' @@ -923,8 +965,7 @@ def getPostAttachmentsAsHtml(postJsonObject: {}, boxName: str, translate: {}, translate['Your browser does not support the video tag.'] attachmentStr += '' attachmentCtr += 1 - elif (mediaType == 'audio/mpeg' or - mediaType == 'audio/ogg'): + elif _isAudioMimeType(mediaType): extension = '.mp3' if attach['url'].endswith('.ogg'): extension = '.ogg' From ca43402beda7b6e3dab3a7e0f3e4cd3094d5134f Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 7 Mar 2021 10:24:27 +0000 Subject: [PATCH 0332/1416] Tidying --- webapp_utils.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/webapp_utils.py b/webapp_utils.py index efda6070c..4ad922a5f 100644 --- a/webapp_utils.py +++ b/webapp_utils.py @@ -840,6 +840,20 @@ def _isAttachedImage(attachmentFilename: str) -> bool: return False +def _isAttachedVideo(attachmentFilename: str) -> bool: + """Is the given attachment filename a video? + """ + if '.' not in attachmentFilename: + return False + videoExt = ( + 'mp4', 'webm', 'ogv' + ) + ext = attachmentFilename.split('.')[-1] + if ext in videoExt: + return True + return False + + def getPostAttachmentsAsHtml(postJsonObject: {}, boxName: str, translate: {}, isMuted: bool, avatarLink: str, replyStr: str, announceStr: str, likeStr: str, @@ -907,12 +921,8 @@ def getPostAttachmentsAsHtml(postJsonObject: {}, boxName: str, translate: {}, imageDescription + '" class="attachment">\n' attachmentCtr += 1 elif _isVideoMimeType(mediaType): - extension = '.mp4' - if attach['url'].endswith('.webm'): - extension = '.webm' - elif attach['url'].endswith('.ogv'): - extension = '.ogv' - if attach['url'].endswith(extension): + if _isAttachedVideo(attach['url']): + extension = attach['url'].split('.')[-1] if attachmentCtr > 0: attachmentStr += '
' if boxName == 'tlmedia': @@ -926,7 +936,7 @@ def getPostAttachmentsAsHtml(postJsonObject: {}, boxName: str, translate: {}, '" alt="' + imageDescription + \ '" title="' + imageDescription + \ '" class="attachment" type="video/' + \ - extension.replace('.', '') + '">' + extension + '">' idx = 'Your browser does not support the video tag.' galleryStr += translate[idx] galleryStr += ' \n' @@ -960,7 +970,7 @@ def getPostAttachmentsAsHtml(postJsonObject: {}, boxName: str, translate: {}, '' + extension + '">' attachmentStr += \ translate['Your browser does not support the video tag.'] attachmentStr += '' From 3181398df521bc60892e18372efbcd179d4274db Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 7 Mar 2021 10:58:18 +0000 Subject: [PATCH 0333/1416] Allow video and audio in media timeline --- posts.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/posts.py b/posts.py index a2340eaa1..d010d8d23 100644 --- a/posts.py +++ b/posts.py @@ -3055,7 +3055,10 @@ def _addPostStringToTimeline(postStr: str, boxname: str, return False elif boxname == 'tlmedia': if '"Create"' in postStr: - if 'mediaType' not in postStr or 'image/' not in postStr: + if ('mediaType' not in postStr or \ + ('image/' not in postStr and + 'video/' not in postStr and + 'audio/' not in postStr)): return False # add the post to the dictionary postsInBox.append(postStr) From c19a072c97a17b63e2b80286e5e7bb817bd0acb5 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 7 Mar 2021 11:55:06 +0000 Subject: [PATCH 0334/1416] Video style --- epicyon-profile.css | 35 +++++++++++++++++++++++++++++++++++ webapp_utils.py | 6 +++++- 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/epicyon-profile.css b/epicyon-profile.css index 6ef938ec7..aa4dfc68c 100644 --- a/epicyon-profile.css +++ b/epicyon-profile.css @@ -184,6 +184,41 @@ body, html { image-rendering: var(--rendering); } +video { + width: 100%; +} + +figure[data-fullscreen=true] { + max-width: 100%; + width: 100%; + margin: 0; + padding: 0; + max-height: 100%; +} + +figure[data-fullscreen=true] video { + height: auto; +} + +figure[data-fullscreen=true] .controls { + position: absolute; + bottom: 2%; + width: 100%; + z-index: 2147483647; +} +figure[data-fullscreen=true] .controls li { + width: 5%; +} +figure[data-fullscreen=true] .controls .progress { + width: 68%; +} + +figure { + padding-left: 0; + padding-right: 0; + height: auto; +} + .cw { font-style: var(--cw-style); font-weight: var(--cw-weight); diff --git a/webapp_utils.py b/webapp_utils.py index 4ad922a5f..626fb6389 100644 --- a/webapp_utils.py +++ b/webapp_utils.py @@ -930,7 +930,10 @@ def getPostAttachmentsAsHtml(postJsonObject: {}, boxName: str, translate: {}, if not isMuted: galleryStr += ' \n' galleryStr += \ - ' \n' + eventClass = 'calendar__day__event' + if eventIsPublic: + eventClass = 'calendar__day__event__public' if eventTime and eventDescription and eventPlace: calendarStr += \ '' + eventTime + \ - '' + \ + '
' + \ '' + \ eventPlace + '
' + eventDescription + \ '' + deleteButtonStr + '\n' elif eventTime and eventDescription and not eventPlace: calendarStr += \ '' + eventTime + \ - '' + \ + '
' + \ eventDescription + '' + deleteButtonStr + '\n' elif not eventTime and eventDescription and not eventPlace: calendarStr += \ '' + \ - '' + \ + '' + \ eventDescription + '' + deleteButtonStr + '\n' elif not eventTime and eventDescription and eventPlace: calendarStr += \ '' + \ - '' + \ + '' + \ eventPlace + '
' + eventDescription + \ '' + deleteButtonStr + '\n' elif eventTime and not eventDescription and eventPlace: calendarStr += \ '' + eventTime + \ - '' + \ + '
' + \ '' + \ eventPlace + '' + \ deleteButtonStr + '\n' From 6d66bbf9ed04ac4be2b2aac0d3790085256a4f86 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 7 Mar 2021 15:29:08 +0000 Subject: [PATCH 0345/1416] Check for sending to self --- inbox.py | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/inbox.py b/inbox.py index 89bae2036..ccc4adfb2 100644 --- a/inbox.py +++ b/inbox.py @@ -2379,19 +2379,21 @@ def _inboxAfterInitial(recentPostsCache: {}, maxRecentPosts: int, getDomainFromActor(sendingActor) if not sendingActorDomain: return False + sendingToSelf = False + if sendingActorNickname == nickname and \ + sendingActorDomain == domain: + sendingToSelf = True # check that the following file exists - if not os.path.isfile(followingFilename): - print('No following.txt file exists for ' + - nickname + '@' + domain + - ' so not accepting DM from ' + - sendingActorNickname + '@' + - sendingActorDomain) - return False - # get the handle of the DM sender - sendH = \ - sendingActorNickname + '@' + sendingActorDomain + if not sendingToSelf: + if not os.path.isfile(followingFilename): + print('No following.txt file exists for ' + + nickname + '@' + domain + + ' so not accepting DM from ' + + sendingActorNickname + '@' + + sendingActorDomain) + return False # Not sending to yourself - if sendH != nickname + '@' + domain: + if not sendingToSelf: # check the follow if not isFollowingActor(baseDir, nickname, domain, @@ -2406,6 +2408,10 @@ def _inboxAfterInitial(recentPostsCache: {}, maxRecentPosts: int, if not obj.get('inReplyTo'): senderPostId = \ postJsonObject['id'] + # get the handle of the DM sender + sendH = \ + sendingActorNickname + \ + '@' + sendingActorDomain _bounceDM(senderPostId, session, httpPrefix, baseDir, From b2f0f3fe5a8bd15edf9a7a3eada96563e4831c83 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 7 Mar 2021 15:34:29 +0000 Subject: [PATCH 0346/1416] Double underscore --- epicyon-calendar.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epicyon-calendar.css b/epicyon-calendar.css index 214f7a4df..e7345fd7a 100644 --- a/epicyon-calendar.css +++ b/epicyon-calendar.css @@ -146,7 +146,7 @@ a:focus { position: relative; padding: 20px; } -.calendar__day__event_public { +.calendar__day__event__public { color: var(--event-public-color); float: left; font-size: 28px; From 9c63658aa73495fe819349b9d9bee9f73ae244c0 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 7 Mar 2021 15:38:10 +0000 Subject: [PATCH 0347/1416] Events are not public by default --- webapp_calendar.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp_calendar.py b/webapp_calendar.py index f7b1c6084..11a63afc0 100644 --- a/webapp_calendar.py +++ b/webapp_calendar.py @@ -137,7 +137,7 @@ def _htmlCalendarDay(personCache: {}, cssCache: {}, translate: {}, postId = None senderName = '' senderActor = None - eventIsPublic = True + eventIsPublic = False # get the time place and description for ev in eventPost: if ev['type'] == 'Event': From 71dff77f20bd5f579f19509b88409978170ae797 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 7 Mar 2021 17:08:43 +0000 Subject: [PATCH 0348/1416] Calendar item styles for public or private --- epicyon-calendar.css | 8 ++++++++ webapp_calendar.py | 17 ++++++++++++----- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/epicyon-calendar.css b/epicyon-calendar.css index e7345fd7a..a1fb0f9be 100644 --- a/epicyon-calendar.css +++ b/epicyon-calendar.css @@ -138,6 +138,14 @@ a:focus { font-size: 30px; } +.calItem { + background-color: var(--event-background-private); +} + +.calItemPublic { + background-color: var(--event-background); +} + .calendar__day__event { color: var(--event-color); background-color: var(--event-background-private); diff --git a/webapp_calendar.py b/webapp_calendar.py index 11a63afc0..8ba1500cc 100644 --- a/webapp_calendar.py +++ b/webapp_calendar.py @@ -193,34 +193,41 @@ def _htmlCalendarDay(personCache: {}, cssCache: {}, translate: {}, 'icons/delete.png" />\n' eventClass = 'calendar__day__event' + calItemClass = 'calItem' if eventIsPublic: eventClass = 'calendar__day__event__public' + calItemClass = 'calItemPublic' if eventTime and eventDescription and eventPlace: calendarStr += \ - '' + eventTime + \ + '' + \ + '' + eventTime + \ '' + \ '' + \ eventPlace + '
' + eventDescription + \ '' + deleteButtonStr + '\n' elif eventTime and eventDescription and not eventPlace: calendarStr += \ - '' + eventTime + \ + '' + \ + '' + eventTime + \ '' + \ eventDescription + '' + deleteButtonStr + '\n' elif not eventTime and eventDescription and not eventPlace: calendarStr += \ - '' + \ + '' + \ + '' + \ '' + \ eventDescription + '' + deleteButtonStr + '\n' elif not eventTime and eventDescription and eventPlace: calendarStr += \ - '' + \ + '' + \ + '' + \ '' + \ eventPlace + '
' + eventDescription + \ '' + deleteButtonStr + '\n' elif eventTime and not eventDescription and eventPlace: calendarStr += \ - '' + eventTime + \ + '' + \ + '' + eventTime + \ '' + \ '' + \ eventPlace + '' + \ From df50fcc79731f40d423eef826ac73924d127468c Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 7 Mar 2021 17:14:16 +0000 Subject: [PATCH 0349/1416] Define handle variable earlier --- inbox.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/inbox.py b/inbox.py index ccc4adfb2..131647ef9 100644 --- a/inbox.py +++ b/inbox.py @@ -2394,6 +2394,9 @@ def _inboxAfterInitial(recentPostsCache: {}, maxRecentPosts: int, return False # Not sending to yourself if not sendingToSelf: + # get the handle of the DM sender + sendH = \ + sendingActorNickname + '@' + sendingActorDomain # check the follow if not isFollowingActor(baseDir, nickname, domain, @@ -2408,10 +2411,6 @@ def _inboxAfterInitial(recentPostsCache: {}, maxRecentPosts: int, if not obj.get('inReplyTo'): senderPostId = \ postJsonObject['id'] - # get the handle of the DM sender - sendH = \ - sendingActorNickname + \ - '@' + sendingActorDomain _bounceDM(senderPostId, session, httpPrefix, baseDir, From 2c14da9e6825ca8a1c528297fd8456686f0fd0cd Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 7 Mar 2021 18:49:11 +0000 Subject: [PATCH 0350/1416] Extra language --- translations/ku.json | 400 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 400 insertions(+) create mode 100644 translations/ku.json diff --git a/translations/ku.json b/translations/ku.json new file mode 100644 index 000000000..64633d5d2 --- /dev/null +++ b/translations/ku.json @@ -0,0 +1,400 @@ +{ + "SHOW MORE": "ZOREDETIR N SHOWAN DE", + "Your browser does not support the video tag.": "Geroka we nîşana vîdyoyê piştgirî nake.", + "Your browser does not support the audio tag.": "Geroka we nîşana deng piştgirî nake.", + "Show profile": "Profîl nîşan bide", + "Show options for this person": "Ji bo vî kesê vebijarkan nîşan bidin", + "Repeat this post": "Dûbare", + "Undo the repeat": "Dubarekirinê betal bikin", + "Like this post": "Çawa", + "Undo the like": "Berevajî", + "Delete this post": "Jêbirin", + "Delete this event": "Jêbirin", + "Reply to this post": "Bersiv", + "Write your post text below.": "Nûçe nû", + "Write your reply to": "Bersiva xwe binivîsin", + "this post": "ev post", + "Write your report below.": "Rapora xwe li jêr binivîse.", + "This message only goes to moderators, even if it mentions other fediverse addresses.": "Ev peyam tenê ji moderator re diçe, heke ew navnîşanên din ên federatê jî behs bike.", + "Also see": "Her weha bibînin", + "Terms of Service": "Mercên Xizmetê", + "Enter the details for your shared item below.": "Agahdariyên tiştê parvekirî yê xwe li jêr binivîse.", + "Subject or Content Warning (optional)": "Hişyariya Mijar an Naverok (vebijarkî)", + "Write something": "Tiştek binivîse", + "Name of the shared item": "Navê tiştê parvekirî", + "Description of the item being shared": "Danasîna tiştê hatî parve kirin", + "Type of shared item. eg. hat": "Cûreyek tiştê parvekirî. mînak. kûm", + "Category of shared item. eg. clothing": "Kategoriya tiştê parvekirî. mînak. lebas", + "Duration of listing in days": "Demjimara navnîşkirinê bi rojan", + "City or location of the shared item": "Bajar an cîhê tiştê parvekirî", + "Describe a shared item": "Tiştek parvekirî vebêjin", + "Public": "Alenî", + "Visible to anyone": "Ji her kesê re xuya ye", + "Unlisted": "Negirtî", + "Not on public timeline": "Ne li ser dema giştî ye", + "Followers": "Followers", + "Only to followers": "Tenê ji şagirtan re", + "DM": "DM", + "Only to mentioned people": "Tenê ji mirovên navborî re", + "Report": "Nûçe", + "Send to moderators": "Ji moderator re bişînin", + "Search for emoji": "Emoji bigerin", + "Cancel": "✘", + "Submit": "Nermijîn", + "Image description": "Danasîna wêneyê", + "Item image": "Wêneyê hêmanê", + "Type": "Awa", + "Category": "Liq", + "Location": "Cîh", + "Login": "Têkevin", + "Edit": "Weşandin", + "Switch to timeline view": "Dîtina demjimêrê", + "Approve": "Destûrdan", + "Deny": "Înkarkirin", + "Posts": "Sandin", + "Following": "Pêketînî", + "Followers": "Followers", + "Roles": "Rol", + "Skills": "Illsarezayî", + "Shares": "Parve dike", + "Block": "Deste", + "Unfollow": "Unfollow", + "Your browser does not support the audio element.": "Geroka we hêmana deng piştgirî nake.", + "Your browser does not support the video element.": "Geroka we hêmana vîdyoyê piştgirî nake.", + "Create a new post": "Nûçe nû", + "Create a new DM": "DM-ya nû çêbikin", + "Switch to profile view": "Dîtina profîlê", + "Inbox": "Inbox", + "Sent": "Andin", + "Search and follow": "Lêgerîn / şopandin", + "Refresh": "Hênikkirin", + "Nickname or URL. Block using *@domain or nickname@domain": "Nasnav an URL. Bikaranîna *@domain an navnîşa@domain asteng bikin", + "Remove the above item": "Tişta jorîn rakin", + "Remove": "Dûrxistin", + "Suspend the above account nickname": "Nasnavê hesabê jorîn bidin sekinandin", + "Suspend": "Dardekirin", + "Remove a suspension for an account nickname": "Ji bo navnîşek navnîşek hesabek rawestanê hilînin", + "Unsuspend": "Bêserûber kirin", + "Block an account on another instance": "Hesabek li mînakek din asteng bikin", + "Unblock": "Asteng bikin", + "Unblock an account on another instance": "Hesabek li mînakek din vekin", + "Information about current blocks/suspensions": "Agahdarî li ser blokan / rawestandinên heyî", + "Info": "Agahdarî", + "Remove": "Dûrxistin", + "Yes": "Erê", + "No": "Na", + "Delete this post?": "Vê posteyê jê bibe?", + "Follow": "Pêketin", + "Stop following": "Followingopandinê rawestînin", + "Options for": "Vebijarkên ji bo", + "View": "Dîtinî", + "Stop blocking": "Asteng bikin", + "Enter an emoji name to search for": "Ji bo lêgerînê navek emoji binivîse", + "Enter an address, shared item, !history, #hashtag, *skill or :emoji: to search for": "Navnîşanek, hêmanek parvekirî,! Dîrok, #hashtag, * jêhatî an: emoji: lêgerîn", + "Go Back": "◀", + "Moderation Information": "Agahdariya Moderatoriyê", + "Suspended accounts": "Hesabên rawestandî", + "These are currently suspended": "Vana niha têne rawestandin", + "Blocked accounts and hashtags": "Hesab û hashtagên astengkirî", + "These are globally blocked for all accounts on this instance": "Vana li seranserê cîhanê ji bo hemî hesabên li ser vê mînakê têne asteng kirin", + "Any blocks or suspensions made by moderators will be shown here.": "Astengkirin an rawestandinên ku ji hêla moderator ve hatine çêkirin dê li vir werin xuyang kirin.", + "Welcome. Please enter your login details below.": "Bi xêr hatî. Ji kerema xwe hûrguliyên têketina xwe li jêr binivîsin.", + "Welcome. Please login or register a new account.": "Bi xêr hatî. Ji kerema xwe têkevin an hesabek nû tomar bikin.", + "Please enter some credentials": "Ji kerema xwe çend pêbaweriyan binivîsin", + "You will become the admin of this site.": "Hûn ê bibin rêveberê vê malperê.", + "Terms of Service": "Mercên Xizmetê", + "About this Instance": "Li ser vê Mînakê", + "Nickname": "Nasnav", + "Enter Nickname": "Navnîşan bikin", + "Password": "Şîfre", + "Enter Password": "Şifreyê têke", + "Profile for": "Profîl ji bo", + "The files attached below should be no larger than 10MB in total uploaded at once.": "Pelên ku li jêr hatine vegirtin divê bi tevahî di yek carekî de barkirî ji 10 MB mezintir nebin.", + "Avatar image": "Wêneyê Avatar", + "Background image": "Wêneyê paşnavê, ku li pişt avatar te xuya dike", + "Timeline banner image": "Wêneya banner a timeline", + "Approve follower requests": "Daxwazên şopînerê dipejirînin", + "This is a bot account": "Ev hesabek bot e", + "Filtered words": "Gotinên parzûnkirî", + "One per line": "Her rêzek yek", + "Blocked accounts": "Hesabên astengkirî", + "Blocked accounts, one per line, in the form nickname@domain or *@blockeddomain": "Hesabên blokkirî, yek her rêzik, di forma nickname@domain an *@Blockdomain", + "Federation list": "Lîsteya federasyonê", + "Federate only with a defined set of instances. One domain name per line.": "Federasyon tenê bi diyardeyek diyarkirî ya mînakan. Navê navnîşê yek rêzê.", + "If you want to participate within organizations then you can indicate some skills that you have and approximate proficiency levels. This helps organizers to construct teams with an appropriate combination of skills.": "Heke hûn dixwazin di nav rêxistinan de beşdar bibin wê hingê hûn dikarin hin behreyên ku we hene nîşan bikin û astên jêhatîbûnê yên nêzikî jî nîşan bikin. Ev ji organîzatoran re dibe alîkar ku tîmên bi têkeliyek guncan a behreyan çêbikin.", + "A list of moderator nicknames. One per line.": "Navnîşek navên navên moderator. Her rêzek yek.", + "Moderators": "Moderator", + "List of moderator nicknames": "Navnîşê navên navdêr", + "Your bio": "Bîyo te", + "Skill": "Jîrî", + "Copy the text then paste it into your post": "Nivîsarê kopî bikin û paşê li navnîşa xwe bişînin", + "Emoji Search": "Emoji Search", + "No results": "Encam tune", + "Skills search": "Lêgerîna şiyanan", + "Shared Items Search": "Lêgerîna Tiştikên Hevpar", + "Contact": "Têkelî", + "Shared Item": "Tişta Parvekirî", + "Mod": "Navînî", + "Approve follow requests": "Daxwazên şopandinê dipejirînin", + "Page down": "Rûpel daket", + "Page up": "Rûpel", + "Vote": "Deng", + "Replies": "Bersiv dide", + "Media": "Medya", + "This is a group account": "Ev hesabek komê ye", + "Date": "Rojek", + "Time": "Dem", + "Location": "Cîh", + "Calendar": "Salname", + "Sun": "Tav", + "Mon": "Duş", + "Tue": "Sêş", + "Wed": "Çar", + "Thu": "Pên", + "Fri": "În", + "Sat": "Şem", + "January": "Rêbendan", + "February": "Reşemî", + "March": "Adar", + "April": "Avrêl", + "May": "Gulan", + "June": "Pûşper", + "July": "Tîrmeh", + "August": "Tebax", + "September": "Îlon", + "October": "Cotmeh", + "November": "Mijdar", + "December": "Berfanbar", + "Only people I follow can send me DMs": "Tenê kesên ku ez dişopînim dikarin DM ji min re bişînin", + "Logout": "Derkeve", + "Danger Zone": "Qada Xetereyê", + "Deactivate this account": "Vê hesabê deaktîv bikin", + "Snooze": "Snooze", + "Unsnooze": "Betalkirin", + "Donations link": "Zencîreya bexşan", + "Donate": "Bêşdan", + "Change Password": "Îfreyê biguherînin", + "Confirm Password": "di pêşîyê da em sipas dikin", + "Instance Title": "Sernavê Instance", + "Instance Short Description": "Danasîna Kurte ya Nimûne", + "Instance Description": "Danasîna Bûyerê", + "Instance Logo": "Logo-ya Nimûne", + "Bookmark this post": "Viya ji bo dîtina paşê hilînin", + "Undo the bookmark": "Nîşankirin", + "Bookmarks": "nîşankirin", + "Theme": "Mijad", + "Default": "Destçûnî", + "Light": "Sivik", + "Purple": "Mor", + "Hacker": "Hacker", + "HighVis": "SilavVis", + "Question": "Pirs", + "Enter your question": "Pirsa xwe têkevinê", + "Enter the choices for your question below.": "Hilbijarkên ji bo pirsa xwe li jêr binivîse.", + "Ask a question": "Pirsek bipirsin", + "Possible answers": "Bersivên gengaz", + "replying to": "bersivandin", + "replying to themselves": "bersiva xwe didin", + "announces": "îlan dike", + "Previous month": "Meha berê", + "Next month": "Meha bê", + "Get the source code": "Koda çavkaniyê bistînin", + "This is a media instance": "Ev mînakek medyayê ye", + "Mute this post": "Bêdeng", + "Undo mute": "Bêdengiyê betal bike", + "XMPP": "XMPP", + "Matrix": "Matrix", + "Email": "E-nameyê bişînin", + "PGP": "PGP Key", + "PGP Fingerprint": "PGP Şopa tilî", + "This is a scheduled post.": "Ev peyamek plansazkirî ye.", + "Remove scheduled posts": "Mesajên plansazkirî rakin", + "Remove Twitter posts": "Mesajên Twitter-ê hilweşînin", + "Sensitive": "Pêketî", + "Word Replacements": "Veguheztinên Peyvan", + "Happening Today": "Îro", + "Happening This Week": "Nêzda", + "Blog": "Blog", + "Blogs": "Blogs", + "Title": "Nav", + "About the author": "Der barê nivîskar de", + "Edit blog post": "Posta tevnvîsê biguherînin", + "Publicly visible post": "Postê bi gelemperî xuya dike", + "Your Posts": "Mesajên We", + "Git Projects": "Projeyên Git", + "List of project names that you wish to receive git patches for": "Navnîşa navên projeyê ku hûn dixwazin ji bo wan pîneyên git bistînin", + "Show/Hide Buttons": "Nîşan/Veşêrin", + "Custom Font": "Custom Font", + "Remove the custom font": "Ponta xwerû hilînin", + "Lcd": "LCD", + "Blue": "Şîn", + "Zen": "Zen", + "Night": "Şev", + "Starlight": "Ronahiya stêrkan", + "Search banner image": "Wêneyê pankarta lêgerînê", + "Henge": "Henge", + "QR Code": "QR Code", + "Reminder": "Bîranîn", + "Scheduled note to yourself": "Ji xwe re nota plansazkirî", + "Replying to": "Bersiv didin", + "Send to": "Send to", + "Show a list of addresses to send to": "Navnîşek navnîşan nîşan bikin ku bişînin", + "Petname": "Navê pet", + "Ok": "Ok", + "This is nothing less than an utter triumph": "Ev ji serfiraziyek bêkêmasî ne tiştek e", + "Not Found": "Peyda nebû", + "These are not the droids you are looking for": "Ev droîdên ku hûn lê digerin ne", + "Not changed": "Neguherî", + "The contents of your local cache are up to date": "Naveroka cacheya weya herêmî rojane ne", + "Bad Request": "Daxwaza Xerab", + "Better luck next time": "Carek din bextê çêtir", + "Unavailable": "Nediyar", + "The server is busy. Please try again later": "Pêşkêşker mijûl e. Ji kerema xwe paşê dîsa biceribînin", + "Receive calendar events from this account": "Bûyerên salnameyê ji vê hesabê bistînin", + "Grayscale": "Grayscale", + "Liked by": "Ji te hez kirin", + "Solidaric": "Hevgirtin", + "YouTube Replacement Domain": "Domain Replacement YouTube", + "Notes": "Nîşe", + "Allow replies.": "Destûrê bide bersivan.", + "Event": "Bûyer", + "Event name": "Navê bûyerê", + "Events": "Bûyerên", + "Create an event": "Bûyerek çêbikin", + "Describe the event": "Bûyerê vebêjin", + "Start Date": "Dîroka Destpêkê", + "End Date": "Dîroka Dawiyê", + "Categories": "Kategorî", + "This is a private event.": "Ev bûyerek taybet e.", + "Allow anonymous participation.": "Beşdariya bênav destûr bidin.", + "Anyone can join": "Her kes dikare tevlî bibe", + "Apply to join": "Serlêdana tevlîbûnê bikin", + "Invitation only": "Tenê vexwendin", + "Joining": "Tevlêbûn", + "Status of the event": "Rewşa bûyerê", + "Tentative": "Demok", + "Confirmed": "Piştrast kirin", + "Cancelled": "Hat betalkirin", + "Event banner image description": "Danasîna wêneya pankarta bûyerê", + "Banner image": "Wêneyê banner", + "Maximum attendees": "Beşdarên herî zêde", + "Ticket URL": "URL-ya bilêtê", + "Create a new event": "Bûyerek nû çêbikin", + "Moderation policy or code of conduct": "Polîtîkaya moderatoriyê an koda tevgerê", + "Edit event": "Bûyerê biguherînin", + "Notify when posts are liked": "Dema ku şandin têne ecibandin agahdar bikin", + "Don't show the Like button": "Bişkoja Like nîşan nedin", + "Autogenerated Hashtags": "Autogenerated Hashtags", + "Autogenerated Content Warnings": "Hişyariyên Naverokê yên otogenerakirî", + "Indymedia": "Indymedia", + "Indymediaclassic": "Indymedia Klasîk", + "Indymediamodern": "Indymedia Rojane", + "Hashtag Blocked": "Hashtag Blocked", + "This is a blogging instance": "Ev mînakek tevnvîsînê ye", + "Edit Links": "Zencîreyan Biguherîne", + "One link per line. Description followed by the link.": "Her rêzek zencîrek. Danasîn bi lînkê hatî şandin. Divê sernav bi # dest pê bikin", + "Left column image": "Wêneyê stûna çepê", + "Right column image": "Wêneya stûna rast", + "RSS feed for this site": "RSS feed ji bo vê malperê", + "Edit newswire": "Newswire biguherîne", + "Add RSS feed links below.": "Zencîreyên RSS-yên jêrîn. Di destpêk an daviyê de * lê zêde bikin da ku diyar bikin ku pêdivî ye ku xwarinek were moder kirin. Add a! di destpêkê de an diqedîne da ku diyar bike ku divê naveroka xwarinê were neynik kirin.", + "Newswire RSS Feed": "Newswire RSS Feed", + "Nicknames whose blog entries appear on the newswire.": "Navên ku navnîşên wan ên tevnvîsê li ser nûçegihanê têne xuyang kirin.", + "Posts to be approved": "Postên bêne pejirandin", + "Discuss": "Hevaxaftin", + "Moderator Discussion": "Gotûbêja Moderator", + "Vote": "Deng", + "Remove Vote": "Deng rakin", + "This is a news instance": "Ev mînakek nûçeyê ye", + "News": "Nûçe", + "Read more...": "Bêtir bixwînin...", + "Edit News Post": "Nûçeya Nûçeyê Biguherîne", + "A list of editor nicknames. One per line.": "Navnîşek navên navnîşên edîtor. Her rêzek yek.", + "Site Editors": "Edîtorên Malperê", + "Allow news posts": "Destûrê bide nûçegihanan", + "Publish": "Weşandin", + "Publish a news article": "Gotarek nûçe weşandin", + "News tagging rules": "Qanûnên nîşankirina nûçeyan", + "See instructions": "Rêwerzan bibînin", + "Search": "Gerr", + "Newswire": "Newswire", + "Links": "Zencîre", + "Post": "Koz", + "User": "Bikaranîvan", + "Features" : "Taybetmendî", + "Article": "Tişt", + "Create an article": "Gotarek çêbikin", + "Settings": "Mîhengên", + "Citations": "Citations", + "Choose newswire items referenced in your article": "Tiştên newswire yên ku di gotara we de hatine referansandin hilbijêrin", + "RSS feed for your blog": "RSS-ê ji bo tevnvîsa we", + "Create a new shared item": "Tiştek nû ya hevbeş çêbikin", + "Rc3": "Rc3", + "Hashtag origins": "Kokên Hashtag", + "admin": "admin", + "moderator": "moderator", + "editor": "weşanvan", + "delegator": "delege", + "Debian": "Debian", + "Select the edit icon to add RSS feeds": "Îkona guherandinê hilbijêrin da ku RSS-ê zêde bikin", + "Select the edit icon to add web links": "Ji bo zêdekirina girêdanên tevnê îkona guherandinê hilbijêrin", + "Hashtag Categories RSS Feed": "Kategoriyên Hashtag RSS Feed", + "Ask about a shared item.": "Li ser tiştek parvekirî bipirsin.", + "Account Information": "Agahdariya Hesabê", + "This account interacts with the following instances": "Ev hesab bi nimûneyên jêrîn re têkildar dibe", + "News posts are moderated": "Mesajên nûçeyan têne moderator kirin", + "Filter": "Parzûn", + "Filter out words": "Gotinan parzûn bikin", + "Unfilter": "Fîlterkirin", + "Unfilter words": "Gotinên bêfîlter", + "Show Accounts": "Hesaban nîşan bide", + "Peertube Instances": "Mînakên Peertube", + "Show video previews for the following Peertube sites.": "Pêşniyarên vîdyoyê ji bo malperên Peertube yên jêrîn nîşan bidin.", + "Follows you": "Li dû we tê", + "Verify all signatures": "Hemî îmzeyan rast bikin", + "Blocked followers": "Şopînerên bloke kirin", + "Blocked following": "Li pey asteng kirin", + "Receives posts from the following accounts": "Ji hesabên jêrîn şandiyan distîne", + "Sends out posts to the following accounts": "Ji bo hesabên jêrîn şandiyan dişîne", + "Word frequencies": "Frekansên peyvan", + "New account": "Hesabê nû", + "Moved to new account address": "Veguhestin navnîşana hesabê nû", + "Yet another Epicyon Instance": "Dîsa Dîsa Epîyonek Din", + "Other accounts": "Hesabên din ên federasyonê", + "Pin this post to your profile.": "Vê postê bi profîla xwe ve pin bikin.", + "Administered by": "Bi rêve kirin", + "Version": "Awa", + "Skip to timeline": "Derbasî demjimêrê bibin", + "Skip to Newswire": "Skip to Newswire", + "Skip to Links": "Derbarê Zencîreyên Tevne", + "Publish a blog article": "Gotarek blogê belav bikin", + "Featured writer": "Nivîskarê bijare", + "Broch mode": "Moda broşeyê", + "Pixel": "Pixel", + "DM bounce": "Peyam tenê ji hesabên şopandî têne qebûl kirin", + "Next": "Piştî", + "Preview": "Pêşnerîn", + "Linked": "Tevne girêdan", + "hashtag": "hash-tag", + "smile": "kenn", + "wink": "çavqûrçî", + "mentioning": "behs kirin", + "sad face": "rûyê xemgîn", + "thinking emoji": "emojî difikirin", + "laughing": "dikenin", + "gender": "zayendî", + "He/Him": "Ew/Wî", + "She/Her": "Ew/Wê", + "girl": "keç", + "boy": "xort", + "pronoun": "pronav", + "Type of instance": "Cûreyek nimûne", + "Security": "Ewlekarî", + "Enabling broch mode": "Modela broşeyê çalakkirin li dijî êrîşê kelekbûnek demkî peyda dike. Tenê mesajên ji hêla nimûneyên berê ve têne zanîn dê bêne qebûl kirin. Heke neyê vemirandin, ew piştî hefteyek derbas dibe.", + "Instance Settings": "Mîhengên Instance", + "Video Settings": "Vebijarkên Vîdyoyê", + "Filtering and Blocking": "Fîlterkirin û Astengkirin", + "Role Assignment": "Erk Rol", + "Contact Details": "Agahdariyên Têkiliyê", + "Background Images": "Wêneyên Paşê" +} From dca7de50ccd4ce07ef73283c38bb67fb1e9274f9 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 7 Mar 2021 19:29:34 +0000 Subject: [PATCH 0351/1416] Welcome screen translations --- defaultwelcome/final_ku.md | 9 +++++++++ defaultwelcome/profile_ku.md | 2 ++ defaultwelcome/welcome_ku.md | 7 +++++++ 3 files changed, 18 insertions(+) create mode 100644 defaultwelcome/final_ku.md create mode 100644 defaultwelcome/profile_ku.md create mode 100644 defaultwelcome/welcome_ku.md diff --git a/defaultwelcome/final_ku.md b/defaultwelcome/final_ku.md new file mode 100644 index 000000000..957eaa1d7 --- /dev/null +++ b/defaultwelcome/final_ku.md @@ -0,0 +1,9 @@ +### Pîrozbahî! +Hûn niha amade ne ku dest bi karanîna Epicyon bikin. Ev cîhek civakî ya nermkerî ye, ji kerema xwe ji kerema xwe pabendî [mercên karûbarê me](/terms) bin, û kêf bikin. + +#### intsîretan +**îkona** ziravker 🔍 bikar bînin da ku li destanên federatê bigerin û mirovan bişopînin. + +Hilbijartina **pankarta li jor** a switches-ekranê di navbera dîtina demjimêr û profîla we de. + +Dema ku şande tên dîmender dê bixweber nûve nebe, ji ber vê yekê **F5** an bişkoja **Inbox** ji bo nûvekirinê bikar bînin. diff --git a/defaultwelcome/profile_ku.md b/defaultwelcome/profile_ku.md new file mode 100644 index 000000000..00ae7ece3 --- /dev/null +++ b/defaultwelcome/profile_ku.md @@ -0,0 +1,2 @@ +### Sazkirina Hesabê +Wêneya avatar-a xwe hilbijêrin û nav û danasîna xwe lê zêde bikin. Wêneyek avatar-a piçûk bikar bînin (mînak 128x128 pixel) da ku zû were dakêşandin. diff --git a/defaultwelcome/welcome_ku.md b/defaultwelcome/welcome_ku.md new file mode 100644 index 000000000..406a35f4a --- /dev/null +++ b/defaultwelcome/welcome_ku.md @@ -0,0 +1,7 @@ +![Wêneyê xêrhatinê](/helpimages/welcome.jpg) +### Hûn bi xêr hatin BELAV +Ev serverek ActivityPub-ê ye ku ji bo xwe-mêvandariya hêsan a çend kesan li ser pergalên hêza kêm, wekî komputerên yekane an laptopên kevn, hatî çêkirin. + +Hebûna torgiloka xweya civakî bi awayê ku hûn dixwazin bimeşînin, û xatir ji Big Tech dixwazin. + +Naha, ka em biçin... From 1039853451fc1e721182c88fe270a100f1d6d8b5 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 7 Mar 2021 20:26:29 +0000 Subject: [PATCH 0352/1416] Update default categories --- defaultcategories/en.xml | 494 +++++++++++++++++++-------------------- 1 file changed, 244 insertions(+), 250 deletions(-) diff --git a/defaultcategories/en.xml b/defaultcategories/en.xml index d57452917..5ad67f407 100644 --- a/defaultcategories/en.xml +++ b/defaultcategories/en.xml @@ -4,585 +4,579 @@ #categories retro - retrocomputer A500 atarist commodore teletext Retromeme matariki floppy 8bit atari atari800 trs80 floppydisk retrocomputing C64 ansi plan9 80s microcomputing omm retrogaming z80 8bitdo retro retropie amiga bbcmicro microcomputer bbsing + retrocomputer A500 atarist commodore teletext Retromeme matariki floppy 8bit atari atari800 trs80 communication floppydisk retrocomputing C64 ansi plan9 80s microcomputing communications omm retrogaming z80 8bitdo retro atari800xl retropie amiga bbcmicro microcomputer bbsing - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT sport - billiard darts swim motorsport snooker marathon hockey bouldering diving baseball Millwall mma sailing athletics nook dumpsterdiving skating skiing sport football combatsports + billiard darts swim motorsport snooker marathon hockey bouldering diving baseball Millwall mma mammal sailing athletics nook dumpsterdiving skating skiing sport climbing football combatsports - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT events - neverforget award OONIbday waybackwednesday IndigenousPeoplesDay5 notifications solo throwbackthursday valentinesday adventskalender live Day deepthoughts thingaday screenshotsaturday warmingup thursdaythoughts thursdaymorning throwback animalsweatersunday TooMuchScreenTime beethoven250thbirthday valentine humanrightsday followfriday wednesdaythought afediversechristmas whydopeopledoshitlikethis wednesdaymotivation cccamp19 PostLikeYouThinkACrabWouldSunday showerthoughts beethoven anarchymonday Verkiezingsfestival 100DaysToOffload 0day ff holiday ipv4flagday christmas livecoding weeknotes week concert festival FridayFolklore screenshottuesday VerkiezingsfestivalBIJ1 kdenlive dontstarve onthisday insideoutsockday livestream BowieDay tzag sunday weekendvibes screenshotsunday cree VerseThursday liverpool waitangiday adayinthelife day ccc InternationalCheetahDay interestingtimes sideprojectsunday birthday sixonsaturday wordoftheday christmaslights meetup + neverforget TuesdayVibe award OONIbday waybackwednesday fridayfilm IndigenousPeoplesDay5 notifications solo throwbackthursday valentinesday adventskalender live Day deepthoughts thingaday screenshotsaturday warmingup thursdaythoughts hackathons thursdaymorning throwback animalsweatersunday TooMuchScreenTime beethoven250thbirthday valentine humanrightsday followfriday wednesdaythought afediversechristmas whydopeopledoshitlikethis wednesdaymotivation cccamp19 lovewhereyoulive PostLikeYouThinkACrabWouldSunday showerthoughts animal beethoven anarchymonday Verkiezingsfestival 100DaysToOffload 0day hackathon ff holiday ipv4flagday christmas livecoding weeknotes LINMOBlive week mothersday concert festival FridayFolklore screenshottuesday animals VerkiezingsfestivalBIJ1 kdenlive dontstarve onthisday insideoutsockday livestream BowieDay morningcrew tzag sunday weekendvibes screenshotsunday cree VerseThursday liverpool waitangiday adayinthelife day ccc InternationalCheetahDay interestingtimes sideprojectsunday birthday sixonsaturday wordoftheday christmaslights meetup FathersDay kidsthesedays - Thu, 18 Feb 2021 21:34:48 UT - - - gafam - zuckerberg caringissharing ads apple antitrust SpringerEnteignen GoogleDown AppleSearch bankruptBezos googlesearch mycologists youtube Goggle twitterkurds chromebook headset ffs facebook interoperability amazon farcebook boycottinstagram deletewhatsappday amazonring Gafam googleplus degooglisation siri Facebook LeiharbeitAbschaffen advertising monopolies adtech fuckgoogle plottertwitter microsoft dtm twitter skype azure chrome hildebrandt corporateGiant uitkeringen youtubedl degoogled youtubers google gis walledgarden GAFCAM dt dotcoms deleteyoutube datafarms Instagram walledgardens appleii fascistbook FuckGoogle degoogle fuschia appleiie deleteinstagram ungoogled ring stopgoogle earrings affordances googledown gafam inspiring fuckoffgoogle deletefacebook fuckoffgoogleandco office365 instagram playstore bigtech whatsapp deleteamazon bluesky - - Thu, 18 Feb 2021 21:34:48 UT - - - people - Melissa harold paul Zachary markdown danielle dylan scott Barbara Kenneth theresa Denise Jesse Adam justin katherine judith Karen Patricia russell juan diane Rebecca donna olivia peter William denise Betty evelyn Christina brittany Jennifer Gregory Wayne Andrychów ethan Ralph Peter americalatina jean laura betty nathan margaret Bryan Virginia Jose Rose eric james david Joshua christine Billy CapitolRiot natalie daniel Jonathan Michael susan George johnny Lauren christina Amy kevin Natalie kenneth noahkathryn Lawrence aaron gregory Amber alexa Robert Edward Patrick Rachel bruce dennis Kayla frank Diane Donna Jack Paul Janice Brenda alexis timothy vincent Alice sarah amy Daniel jeff charlotte carolyn Emma Kyle Sean emily linda Olivia Eugene Donald janet ryan RichardDWolff bryan Hannah anna doctorow Catherine Alexander Christopher bob doris Anthony Jean diana Beverly frances Sarah margaretthatcher Jordan Anna Ethan Amanda jeremy donald mark matthew julie stephanie Jerry Diana David Linda adam richard henry Isabella elizabeth steven jessica Walter jeffrey Kevin Justin grace PeterGelderloos brandon mary jamesbaldwin sharon nicholas Benjamin amanda Emily Ruth heather albert Julie nancy stephen Cannabis James Megan Raymond michelle Nancy Frances Henry andrew Jessica julia Dorothy Jason Charles Danielle Brandon jose noamchomsky virginia beverly ronald Bob madison Helen MarkoBogoievski Jeff helen Sophia larry dorothy Dennis monbiot Nicholas Frank jack Stephen Janet Alexis Pamela Jacqueline Dylan roy brenda jesse Roger Jeffrey Brittany Shirley Nathan christopher Carol Susan jason Philip Logan sandra jacob rose isabella Cynthia Joan jackieweaver aldoushuxley Maria martha Randy carl kyle karen raymond alice jerry carol Victoria Steven Douglas Lisa Julia joshua jacqueline Ashley eugene Bruce Albert Austin thomas Evelyn Gary Scott kimberly lawrence jennifer Russell austin logan Laura Chris Teresa Aaron Keith brian marktwain maria Joseph Andrew Vincent Katherine Joyce lauren Ryan amber alan ralph megan Kathleen sophia Cheryl abigail cynthia john Alan Debra arthurgloria Christine marilyn anthony chris Elizabeth sean Louis Larry christian deborah billy Abigail joesara keith Jeremy zachary ruth Grace teresa Doris benjamin Willie george barbara Charlotte philip randy Margaret Heather Bradley Jacob shirley pamela Matthew Nicole joan judy Kelly Brian melissa Sandra joseph andrea Joe Sara robert aaronswartz Bobby emma willie william angela SachaChua samuel tyler Thomas John kroger patricia ashley bobby kelly hannah Carolyn Ann CrimsonRosella gary wayne Marilyn Deborah rms Sharon gare Mary Samuel Mark walter rebecca Madison Juan lisa cheryl janice Christian gerald Timothy roger edward bradley Gerald patrickrachel framalang Kimberly Gabriel Marie PeterHoffmann louis kathleen Arthur Gloria terry Richard jonathan Harold Roy samantha Carl Eric relationships nicole Andrea Judith Terry Stephanie Johnny Angela Noah Kathryn Ronald AskVanta Michelle Theresa gabrielmarie Samantha Judy michael charles Tyler DouglasPFry kayla catherinealexander Martha debra joyce - - Thu, 18 Feb 2021 21:34:48 UT - - - activitypub - followerpower FederatedSocialMedia Fediverse activitypub activertypub pleroma losttoot Rss2Fedi PeerTube gofed pixelfedlabs homelab fediblock fediverso lazyfedi federation instances fedilab pixiv mastotips toot fedilabfeature mastodev pixel mastodontips mastotip wallaby friendica mastodontip hiveway mastodonart mast gardenersofmastodon askthefediverse misskey collaboraoffice BlackFedi joinmastodon siskin socialhub followers fediart blocking Pixelfed contentwarnings pixelfed labournettv fediverseplaysjackbox mapeocolaborativo fedihive fedidb block FediMemories Feditip fablab Fediseminar onlyfedi socialcg monal sponsorblock tusky peertubers imagedescription joinpeertube feditips fedizens Mastodon following epicyon afediversechat peertubeadmin collaboration mastomagic YearOfTheFediverse dev fediadmin mastodonhost mond pixeldev timeline socialmedia wedistribute fosstodon instanceblock softwaredevelopment mastodonmonday isolategab greenmastodon fedireads PeertubeMastodonHost AskFediverse Bookwyrm federated socialhome greenfediverse microblocks fedivers MastodonMondays fediverse imagedescriptions Fedilab mastoadmin smithereen hackerstown blabber FediverseFutures mastodon fedi fediplay peertube adblock lab BlackMastadon mobilizon lazy gemifedi - - Thu, 18 Feb 2021 21:34:48 UT - - - programming - Easer cpp digitalpreservation programming css objects Python digitalisierung FrancisBacon2020 gitea mixers webdev gui digital release ada schutzstreifen pypi proofofwork rustlang ocaml program DigitalSouveräneSchule request_reaction penguicon2021 sqlite guile nim uptronics hypocritcal profiles typescript forums vscode publiccode computerscience hackers vieprivée early adventofcode cgit CommonJS scripting warn git ui solid trevornoah zinccoop tailwindcss guix penguicon raku fedidev c sourcecode publiekecode framaforms WendyLPatrick grep django gmic sackthelot gitportal gitlab decoder parrot relevance_P1Y kingparrot Leiharbeit programmer trunk haskell OpenSourceHardware Tarifvertrag unicode development gerrit frgmntscnr github digitalmarketsact freecodecamp openrc tuskydev threema html5 algorithms PythonJob lisp digitaldefenders forge pleaseshare HirsuteHippo resnetting fourtwenty rakudev adaptation developers libraries drivers animation freecode forgefed javascript fragment cpm code elisp commands patterns eq ECMAScriptModules html rakulang portal terminal rust request spiritbomb r dramasystem go esbuild golang clojurescript ruby contractpatch deceptionpatterns obsolescence_programmée computers developer racket forum bugreport mercurial python indiedev kabelfernsehen alternatives OpenSource Scheibenwischer - - Thu, 18 Feb 2021 21:34:48 UT - - - nature - hiking RedNeckedWallaby wat marsupial StormBella morning trees lichen badger light birds nature teamcapy frogs sunrise leopardgecko moutains coldwater inaturalist forest morningcrew australianwildlife capybara goodmorning enlightenment natur deforestation morningwalk RainforestAlliance amphibians - - Thu, 18 Feb 2021 21:34:48 UT - - - writing - blog tootfic authors poem cutupmethod pdf blogPages shortstory magazine smallstories blogging smallpoems sciencefiction writing proverbs blogs noblogo playwright hedgedoc microfiction interactivestorytelling westernjournal quote icanhazpdf WriteFreely storytelling goodread goodreads creativewriting horror limerick journals zineswap zines shortstories journalists journal poetry - - Thu, 18 Feb 2021 21:34:48 UT - - - gardening - BlagueDeCodeur sporespondence blockade inde mastogarden kinder independant communitygardening deno composting cabbage bundeswehr onions bordeaux datenschleuder florespondence garden thyme horticulture DailyFlowers acu kinderbijslag permaculture papuamerdeka lag CompanionPlanting gardens independence flowers kale gardening plants devilslettuce fahrräder golden toeslagenaffaire seeds - - Thu, 18 Feb 2021 21:34:48 UT - - - hardware - plugandplay purism opennic restauration solarpower PersonalComputer cyberdeck PineCUBE keyboards electron screenless homebrewcomputing FarmersTractorRally pinebook modem lowtech datenschutz industrial analogcomputing TrueDelta keyboard screenprinting pocketchip oshw ArmWorkstation daretocare hardwarehacking laptops electronics teamdatenschutz charm printmaker deck larp cybredeck computing laptop solarpunk recycling theatrelighting lenovo fairelectronics MacBookProService fuse ibm 3dprinting MechcanicalKeyboards hardware retrohardware pinetab openhardware raspberrypi 3dprinter barcode Quartz64 PlanetComputer jtag pinetime screens pinebookpro 3d PinebookPro 3dprint modemmanager keyboardio mechanicalkeyboard PineTalk arm ipad FireAlarms PinePower paperComputer amd openpower devopa thinkpad iot raspberrypi4 print electronic - - Thu, 18 Feb 2021 21:34:48 UT - - - internet - linkeddata decentralised immersiveweb dotcons i2p spam firefox redecentralize decentral wikipedia rtmp dataprotection decentralization inclusiónsocial decentralize w3c dotConism selfhosted piratenpartij maille meta torrent mailab k9mail data socialism sitejs anticolonial worldbusterssocialclub publicserviceinternet centralisation internetarchaeology WordPress darkages self saferinternetday contentmoderation distributed mydata decentralizedweb mailman router protection rne dataretention bigdata routeros selfhosting communityhosting brave icann selfsustaining hosting discourse weblate PeerToPeer dns openstandards nojs oauth tic hypercore CDNsAreEvil meshtastic protonmail TubEdu standards yourdataisyourdata internetfreedom gemini webui InternetCrimeFamily wlan internetBanking SmallWeb cw internetshutdown godotengine liberapay distributedcoop xmpp semanticweb socialnetwork selfie website SaferInternetDay content splinternet highavailability zim webstandards mapa domains ntp cloudfront socialnetworks metadata disconnect Meme database proton disco descentralizare icmp videocast jabber cleanuptheweb webbrowsers decentralized wiki cloudron browserextensions ssb darknet cookies Qute darkweb netcat map Reddit server browser cloudy IPFS p2p social antisocial www ilovewikipedia web WebsiteStatus netshutdowns twitch im 9front theserverroom datafree domain OpenStreetMap pirate datacracy filesharing rss openstreetmap ipns mozilla voicemail Nyxt debloattheweb mail i2pd ipfs internetradio browsers wikidata selfpub decentralizeit netscape mixcloud gmail openculture letthenetwork cyberspace messaging selfies offthegrid enxeñeríasocial cloud internet moderation decentralisation ssbroom serverMeddling missingmaps sneakernet NatureNeedsJustice internetarchive godot dweb js dark beakerbrowser openweb NetShutdown onlineharms dot Internet descentralizarea thepiratebay ftp internetshutdowns fixtheweb lazyweb socialweb mozillahubs instantmessaging interoperabilitate webmention Justice4MohamudHassan - - Thu, 18 Feb 2021 21:34:48 UT - - - science - engineering math epidemiology ethnology womeninstem archeology botany STEM biodiversity linguistic anthro supercollider nextgeneration zoology climatology dna geography physics archaeologist generalstreik geology generationidentitaire stemwijzer bioengineering botanical dawkins holo graphTheory meterology biotech psychology biology generation gene chemistry paleontology oceanography stem nextgenerationinternet biomedical anthropology - - Thu, 18 Feb 2021 21:34:48 UT - - - photos - smartphonephotography nikon 90mm photography photo photogrpahy tokyocameraclub photos photographie camera cameras myphoto naturephotography picture streetphotography photoreference - - Thu, 18 Feb 2021 21:34:48 UT - - - places - lapaz luanda asunción nouakchott conakry kyiv moscow saipan gibraltar dublin KlimaGerechtigkeit catalunya dannibleibt avarua hargeisa delhi niamey chișinău freestuff colombo brasília phnompenh mbabane danni belgrade belmopan pyongyang hannover calls ulaanbaatar oranjestad Reykjavik gaborone seattle ndjamena raw singapore kingedwardpoint abidjan nuuk asshole pretoria papeete malé zagreb gitega abudhabi flyingfishcove castries georgetown hagåtña videoFreex cassette oric borikua basseterre hamburg kinshasa suva klimaatverandering valparaíso athens roseau sheffield baku charlotteamalie antananarivo domi pristina MakoYass videocalls santiago sukhumi berlin uptronicsberlin funafuti libreville puertorico ClimateChange hanoi philipsburg tehran banjul prague rawhide andorralavella daw yerevan portauprince videoprojects dakar paramaribo tifariti capetown rigaer94 tirana klima ankara ipswich managua lisbon bishkek amsterdam climatchoas videogames klimaat portonovo santodomingo bangkok texas bucharest kathmandu aden madrid sanjuan vienna kingston kabul damascus stockholm douglas ClassOf2015 willemstad hibernoenglish thehague panamacity RassismusTötet beirut amman newdelhi tórshavn nouméa oslo alofi gustavia paris video cockburntown ottawa classical stepanakert portofspain klimakrise class fsberlin honiara berniememe asmara florida nicosia helsinki taipei tegucigalpa tokyo tashkent larochelle MadeInEU sarajevo algiers KlimaKrise nairobi muscat monaco riyadh lusaka wellington bissau juba mariehamn klimaatcrisis majuro buenosaires ngerulmud dhaka guatemalacity washington vatican kuwaitcity londonboaters SystemChangeNotClimateChange bern mexicocity bratislava myasstodontownhall bridgetown prince delhipolice crowsnestpass tunis manila stanley matautu copenhagen barcelona lomé videocall budapest ouagadougou mogadishu freetown victoria lora brazzaville portmoresby ashgabat kampala elaaiún vilnius bloemfontein sucre london passalong marseille berniesanders pagopago bradesestate oakland vaduz addis nürnberg naypyidaw CassetteNavigation khartoum baghdad bandar moroni cuirass lehavre portvila kingstown ChrisCrawford reykjavík manama accra windhoek fortworth nukualofa classic ciutatvella tbilisi canberra quito maputo cetinje adams putrajaya ramallah bogotá dodoma harare havana warsaw münster valletta localberlin ljubljana bamako kualalumpur podgorica rabat cotonou plymouth seoul Portland dushanbe bangui magnifyingglass aotearoa westisland tskhinvali palikir caracas jamestown rome munich freestuffberlin bass sãotomé jakarta daressalaam sansalvador seo apia essex yaren cairo jerusalem brussels kigali southtarawa beijing minsk montevideo vientiane maseru klimaatopwarming hamilton lorawan doha tripoli celtic portlouis lima adamstown deventer weimar abuja lilongwe nassau lobamba heathrow nyc montreal dili riga assembly lesbos monrovia nursultan Neuzulassung gab sanjosé klimaatrechtvaardigheid marigot islamabad fb malabo tallinn sahara thimphu yaoundé praia bujumbura washingtondc sofia skopje - - Thu, 18 Feb 2021 21:34:48 UT - - - music - musicprodution LaurieAnderson punk ourbeats vollgasindiekrise indieweb synthesizer indiemusic streetpunk bikepunks bandcamp musicians jamendo ipod skinheadmusic rap shoegaze mp3 steam indie steampunk Music EnvoieStopHashtagAu81212 thecure posthardcore vaporwave IndustrialMusicForIndustrialPeople Mixtip dubstep synthwave bootstrap oi rave freemusic nowplaying hiphop hardcore experimentalmusic spotify fedimusic musicbrainz eos90D soundcloud frankiegoestohollywood ccmusic typographie dj newwave dorkwave producing experimental musicproduction chiptune lastfm 1 funkwhale eos wp playlist retrosynth NowPlaying libremusicproduction MusicAdvent coinkydink pmbootstrap arianagrande synth music np techno jazz graphics darkwave mastomusic metal polychromatic funk magnatune fediversemusic cyberpunkmusic BandcampFriday - - Thu, 18 Feb 2021 21:34:48 UT - - - conferences - FOSDEM2021 debconf FOSDEM talk fossdem FreedomBoxSummit apconf2020 schmoocon summit confidenceTricks minidebconf rc3worldleaks emacsconf MCH2021 ox defcon flossevent conf rC3 rC3World FOSDEM21 conference flossconf apconf rC3one smalltalk C3 config confy - - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT politics - TakeOurPowerBack redessociais trump Anarchy cia alwaysantifascist sabotage qtibpoc community wageslavery immigration dissent liberation laws fascism farmersrprotest techtuesday skyofmywindow techthursday aws freedomofspeech anarchist prochoice freeexpression RacialHealing fascisme humanrights crime leftists Socialism ukpol FreeKeithLamar Antifascisme copwatch capitalismkills petition BorisJohnson meteorología freedom techdirt ontologicalanarchy abolitionnow anarchism DefundThePolice earthship repression technews meto legal polizeigewalt smalltech police nzpolitics greenhousegas antifascists oilwars kommunismus bjp ThirdRunway testing hierarchy election republicans opinie diversity solidarity techwear sociaalDarwinisme sky_of_my_window mybodymychoice generalstrike fuckBiden neoliberal antipolitics digitalfreedom mayday hatespeech fascists LateStageOfCapitalism stopchasseacourre ciencia smashturkishfascism afropessimism burntheprisons cyberlaw peerproduction corporations iww freeassange commons choice Riot corporatewatch wageslave uspol frontex communism RemoveThePolice makecapitalismhistory Immigration biometric neoliberalism socialecology wroclawskierewolucjonistki MutualAid capitalism technology test prisons wealth conspiracytheories corporatecrime DirectAction communist KeirStarmer taoteching anarchismus retrotechnology politics inclusivity government HeroesResist brightgreen poc anarchisme feminist DominicCummings nzpol Bookchin ClemencyNow Inauguration2021 arran brexit totalitarianism privatisation TyskySour Labour death freethemall green neoliberaal BAME decolonizeyourmind alternative privilege antikapitalisme AbolishPrisonsAbolishPolice surfaceworldblows ecofascism popularitycontest SocietalChange facialrecognition cotech corruption hypocrisy anarchy esm Feminism propaganda dcc endsars celebratingfreedom decolonization digitalrights feminism HightechProblems pentesting polizei neo democracy anarchistki Govts xp powerpolitics 18Source censorshipBook radicaltech saytheirnames conspiracy anarchistbookclub redandanarchistskinheads radicaldemocracy PritiPatel latestagecapitalism racist cancelculture MexicanRevolution elections RussellMaroonShoatz LhubSocial commonspub sea white prisoners warrants policebrutality techshit borisjohnson Anarchist press Anarchism mutuality whitehouse metager freedomofexpression censorship CancelCulture decolonize HanauWarKeinEinzelfall keinmenschistillegal emmet decenterwhiteness Biden ChineseAppBan cooperative modi antifa law chip deathtoamerica manipulation ParticipatoryCultureFoundation firetotheprisons britpol Capitalism surveillancecapitalism leftist Revolution ukpolitics mdcommunity glenngreenwald JeremyCorbyn blacklivesmatter FreeAlabamaMovement Anarchismus mononeon rentstrike dsa lawandorder migration neoist mutualaid multipleexposure humanetechnology AbolishPrison anarchists fascist righttochoice socialcoop apocalypseworld DefundSurveillanceCapitalism platformcapitalism decolonizeconservation anarchistprisoners whistleblowers polizeiproblem speech uselection IDPol Antifa deathtofascism lesanarchistes Slavetrade met consumerism ourstreets extremist freespeech neorodiversiteit refugees riot BernieSanders acab ecology SurveillanceCapitalism antifascism freewestpapua sunnytech tech + hate TakeOurPowerBack redessociais trump Anarchy cia alwaysantifascist sabotage qtibpoc community wageslavery immigration dissent liberation laws fascism farmersrprotest techtuesday skyofmywindow techthursday aws freedomofspeech anarchist prochoice freeexpression RacialHealing fascisme humanrights crime leftists Socialism ukpol FreeKeithLamar Antifascisme copwatch capitalismkills petition BorisJohnson meteorología freedom techdirt ontologicalanarchy union abolitionnow anarchism DefundThePolice earthship repression technews meto legal polizeigewalt dannenröderwald smalltech police nzpolitics greenhousegas antifascists oilwars kommunismus rightorepair bjp ThirdRunway multi testing hierarchy election republicans opinie diversity solidarity techwear sociaalDarwinisme sky_of_my_window mybodymychoice generalstrike fuckBiden neoliberal antipolitics abolition digitalfreedom mayday again hatespeech fascists LateStageOfCapitalism stopchasseacourre ciencia smashturkishfascism afropessimism burntheprisons cyberlaw peerproduction corporations iww freeassange commons choice Riot corporatewatch wageslave uspol frontex communism RemoveThePolice makecapitalismhistory abolishpolice Immigration biometric neoliberalism NeverTrustSimone socialecology wald wroclawskierewolucjonistki MutualAid capitalism technology test prisons wealth conspiracytheories corporatecrime DirectAction communist daretocare KeirStarmer taoteching anarchismus politiikka retrotechnology politics inclusivity government HeroesResist brightgreen poc anarchisme feminist DominicCummings nzpol Bookchin ClemencyNow Inauguration2021 arran techthoughts brexit totalitarianism privatisation TyskySour Labour nonprofitindustrialcomplex death LabourLeaks freethemall green neoliberaal BAME decolonizeyourmind alternative privilege antikapitalisme legalcounsel AbolishPrisonsAbolishPolice surfaceworldblows ecofascism opentechnologyfund popularitycontest SocietalChange facialrecognition cotech corruption hypocrisy anarchy Feminism propaganda dcc endsars celebratingfreedom decolonization digitalrights feminism Lhub HightechProblems problem pentesting polizei neo democracy anarchistki Govts xp powerpolitics 18Source censorshipBook radicaltech saytheirnames witchesagainstwhitesupremacy conspiracy anarchistbookclub redandanarchistskinheads corporate radicaldemocracy PritiPatel oiseau latestagecapitalism racist cancelculture MexicanRevolution elections RussellMaroonShoatz LhubSocial methods commonspub sea white prisoners warrants policebrutality alternativeto techshit borisjohnson Anarchist press Anarchism mutuality whitehouse freedomofexpression censorship CancelCulture decolonize HanauWarKeinEinzelfall keinmenschistillegal emmet decenterwhiteness blackandwhite Biden ChineseAppBan cooperative modi antifa law chip deathtoamerica manipulation ParticipatoryCultureFoundation firetotheprisons consumer britpol financial Capitalism surveillancecapitalism leftist Revolution ukpolitics mdcommunity glenngreenwald JeremyCorbyn blacklivesmatter FreeAlabamaMovement Anarchismus mononeon rentstrike dsa lawandorder migration neoist mutualaid capital multipleexposure humanetechnology AbolishPrison solidaritynotcharity anarchists fascist righttochoice socialcoop apocalypseworld DefundSurveillanceCapitalism platformcapitalism decolonizeconservation anarchistprisoners whistleblowers polizeiproblem UniversalBasicServices fuckcapitalism speech uselection IDPol Antifa deathtofascism lesanarchistes Slavetrade met democracia consumerism ourstreets extremist freespeech kapital neorodiversiteit refugees riot BernieSanders acab ecology SurveillanceCapitalism antifascism freewestpapua hambacherwald sunnytech espressif tech - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT + + + gafam + zuckerberg caringissharing ads apple antitrust SpringerEnteignen deletewhatsapp GoogleDown AppleSearch bankruptBezos googlesearch mycologists youtube Goggle twitterkurds chromebook headset ffs facebook interoperability amazon farcebook boycottinstagram deletewhatsappday amazonring Gafam googleplus soldering degooglisation siri Facebook LeiharbeitAbschaffen advertising monopolies adtech fuckgoogle plottertwitter microsoft dtm twitter skype azure chrome hildebrandt corporateGiant uitkeringen youtubedl degoogled Google youtubers google gis walledgarden GAFCAM dt dotcoms deleteyoutube datafarms Instagram walledgardens agistri offseting appleii fascistbook FuckGoogle degoogle fuschia appleiie deleteinstagram ungoogled ring stopgoogle earrings affordances googledown gafam inspiring killedbygoogle fuckoffgoogle deletefacebook fuckoffgoogleandco office365 turingpi instagram playstore synergistic bigtech whatsapp mytwitteranniversary deleteamazon bluesky + + Sun, 07 Mar 2021 20:25:51 UT + + + people + Melissa harold paul Zachary markdown danielle dylan scott Barbara Kenneth theresa Denise Jesse Adam justin katherine judith Karen Patricia russell juan diane Rebecca donna olivia peter William denise Betty evelyn Christina brittany Jennifer Gregory Wayne Andrychów ethan Ralph Peter americalatina jean laura betty nathan margaret Bryan Virginia Jose Rose eric james david Joshua christine Billy CapitolRiot natalie daniel Jonathan Michael susan George johnny Lauren christina Amy kevin Natalie kenneth noahkathryn Lawrence aaron gregory Amber alexa Robert Edward Patrick Rachel bruce dennis Kayla frank Diane Donna Jack Paul Janice Brenda alexis timothy vincent Alice sarah amy Daniel jeff charlotte carolyn Emma Kyle Sean emily linda Olivia Eugene Donald janet ryan stdavids RichardDWolff bryan Hannah anna doctorow Catherine Alexander Christopher bob doris Anthony Jean diana Beverly frances Sarah margaretthatcher Jordan Anna Ethan Amanda jeremy donald mark matthew julie stephanie Jerry Diana David Linda adam richard henry Isabella elizabeth steven jessica Walter jeffrey Kevin Justin grace PeterGelderloos brandon mary jamesbaldwin sharon nicholas Benjamin amanda Emily Ruth heather albert Julie nancy stephen Cannabis James Megan Raymond michelle Nancy Frances Henry andrew Jessica julia Dorothy LoganGrendel Jason Charles Danielle Brandon jose noamchomsky virginia beverly ronald Bob madison Helen MarkoBogoievski Jeff helen Sophia larry dorothy Dennis monbiot Nicholas Frank jack Stephen Janet Alexis Pamela Jacqueline Dylan roy brenda jesse Roger Jeffrey Brittany Shirley Nathan christopher Carol Susan jason Philip Logan sandra jacob rose isabella Cynthia Joan jackieweaver aldoushuxley Maria martha Randy carl kyle karen raymond alice jerry carol Victoria Steven Douglas Lisa Julia joshua jacqueline Ashley eugene Bruce Albert Austin thomas Evelyn Gary Scott kimberly lawrence jennifer Russell austin logan Laura Chris Teresa Aaron Keith brian marktwain maryanning maria Joseph Andrew Vincent Katherine Joyce lauren Ryan amber alan ralph megan Kathleen sophia Cheryl abigail cynthia john Alan Debra QuickSummary arthurgloria Christine marilyn anthony chris Elizabeth sean Louis Larry christian deborah billy Abigail joesara keith Jeremy zachary ruth Grace teresa Doris benjamin Willie george barbara Charlotte philip randy Margaret Heather Bradley Jacob shirley pamela Matthew Nicole joan judy Kelly Brian melissa Sandra joseph andrea shamelessselfplug Joe Sara robert aaronswartz Bobby emma willie william angela SachaChua samuel tyler Thomas John kroger patricia ashley bobby kelly hannah Carolyn Ann CrimsonRosella gary wayne Marilyn Deborah rms Sharon gare Mary Samuel Mark walter rebecca Madison Juan lisa cheryl janice Christian gerald Timothy roger edward bradley Gerald patrickrachel framalang Kimberly Gabriel Marie PeterHoffmann louis kathleen Arthur Gloria terry Richard jonathan Harold Roy samantha Carl chalice Eric relationships nicole Andrea Judith Terry Stephanie Johnny Angela Noah Kathryn Ronald AskVanta Michelle Theresa gabrielmarie Samantha Judy michael charles Tyler DouglasPFry kayla catherinealexander Martha debra joyce + + Sun, 07 Mar 2021 20:25:51 UT + + + activitypub + followerpower FederatedSocialMedia Fediverse activitypub activertypub pleroma losttoot Rss2Fedi PeerTube devices gofed pixelfedlabs homelab fediblock fediverso lazyfedi federation instances fedilab pixiv mastotips toot fedilabfeature mastodev pixel mastodontips catsofthefediverse mastotip wallaby friendica mastodontip hiveway mastodonart mast megapixels gardenersofmastodon askthefediverse misskey collaboraoffice BlackFedi joinmastodon siskin socialhub followers fediart blocking Pixelfed contentwarnings pixelfed labournettv fediverseplaysjackbox mapeocolaborativo fedihive fedidb block FediMemories Feditip fablab collabathon Fediseminar onlyfedi socialcg sponsorblock tusky TLSmastery contentwarning peertubers imagedescription joinpeertube feditips fedizens Mastodon following epicyon afediversechat peertubeadmin leylableibt collaboration mastomagic YearOfTheFediverse dev fediadmin mastodonhost mond pixeldev timeline socialmedia wedistribute fosstodon instanceblock softwaredevelopment mastodonmonday collaborative isolategab greenmastodon fedireads PeertubeMastodonHost AskFediverse Bookwyrm federated socialhome greenfediverse microblocks fedivers MastodonMondays fediverse imagedescriptions Fedilab mastoadmin smithereen hackerstown blabber FediverseFutures mastodon developingcountries fedi fediplay peertube adblock mastomind lab BlackMastadon lazyfediverse mobilizon lazy gemifedi + + Sun, 07 Mar 2021 20:25:51 UT + + + programming + Easer cpp digitalpreservation programming css objects Python system digitaldivide digitalisierung FrancisBacon2020 dracut gitea mixers webdev proofing gui digital release ada schutzstreifen pypi proofofwork node rustlang ocaml program DigitalSouveräneSchule request_reaction sqlite guile nim uptronics hypocritcal profiles typescript forums vscode publiccode computerscience hackers guidelines vieprivée early adventofcode cgit CommonJS scripting warn git proof ui nocode solid nodejs systemchange trevornoah zinccoop tailwindcss guix raku fedidev c sourcecode publiekecode framaforms WendyLPatrick grep django gmic zim sackthelot gitportal gitlab crusty decoder readability parrot relevance_P1Y kingparrot Leiharbeit programmer trunk haskell OpenSourceHardware Tarifvertrag esm unicode development gerrit frgmntscnr github digitalmarketsact freecodecamp openrc tuskydev threema html5 algorithms PythonJob lisp digitaldefenders forge pleaseshare HirsuteHippo resnetting fourtwenty rakudev adaptation developers libraries drivers animation freecode forgefed javascript fragment cpm code elisp commands patterns eq ECMAScriptModules html rakulang portal terminal rust lowcode request spiritbomb r dramasystem go digitalaudioworkstation esbuild golang clojurescript ruby contractpatch deceptionpatterns obsolescence_programmée computers developer racket forum bugreport mercurial python fontforge indiedev kabelfernsehen alternatives OpenSource Scheibenwischer + + Sun, 07 Mar 2021 20:25:51 UT + + + nature + hiking RedNeckedWallaby reforestation wat marsupial StormBella insect morning trees lichen badger light gecko birds nature teamcapy frogs snow sunrise hambacherforest forestfinance leopardgecko moutains coldwater inaturalist sunset forest australianwildlife capybara goodmorning forestation enlightenment natur deforestation natural birdsarentreal morningwalk insects wildlife afforestation northernlights RainforestAlliance amphibians + + Sun, 07 Mar 2021 20:25:51 UT + + + writing + blog tootfic authors poem cutupmethod pdf blogPages shortstory magazine smallstories blogging smallpoems sciencefiction writing proverbs blogs noblogo otf playwright hedgedoc microfiction interactivestorytelling westernjournal quote icanhazpdf WriteFreely storytelling goodread goodreads creativewriting horror limerick journals zineswap zines shortstories journalists journal poetry + + Sun, 07 Mar 2021 20:25:51 UT + + + gardening + BlagueDeCodeur sporespondence blockade inde mastogarden kinder independant communitygardening deno composting cabbage bundeswehr opensourceseeds onions bordeaux datenschleuder florespondence garden thyme horticulture DailyFlowers acu kinderbijslag permaculture papuamerdeka lag CompanionPlanting gardens independence flowers kale gardening plants devilslettuce fahrräder gardenersworld golden toeslagenaffaire seeds Opensourcegarden + + Sun, 07 Mar 2021 20:25:51 UT + + + hardware + plugandplay purism opennic restauration solarpower PersonalComputer cyberdeck PineCUBE tex keyboards electron screenless homebrewcomputing FarmersTractorRally pinebook modem lowtech datenschutz industrial analogcomputing TrueDelta keyboard screenprinting Pinecil pocketchip oshw ArmWorkstation hardwarehacking laptops electronics teamdatenschutz charm printmaker deck modular larp cybredeck computing laptop solarpunk recycling repairability theatrelighting lenovo fairelectronics librem MacBookProService fuse date ibm 3dprinting electro MechcanicalKeyboards hardware retrohardware pinetab openhardware raspberrypi 3dprinter barcode Quartz64 PlanetComputer jtag pinetime screens pinebookpro 3d PinebookPro 3dprint Handprint modemmanager keyboardio mechanicalkeyboard PineTalk arm ipad FireAlarms PinePower paperComputer amd openpower devopa thinkpad iot repairable raspberrypi4 print analog electronic + + Sun, 07 Mar 2021 20:25:51 UT + + + internet + linkeddata decentralised immersiveweb dotcons i2p sceptic earlyinternet spam firefox redecentralize decentral buster wikipedia rtmp dataprotection decentralization inclusiónsocial decentralize w3c dotConism internetaccess geminispace selfhosted piratenpartij maille meta torrent mailab k9mail data socialism sitejs anticolonial worldbusterssocialclub publicserviceinternet centralisation internetarchaeology WordPress darkages self saferinternetday contentmoderation distributed mydata decentralizedweb mailman router protection rne dataretention bigdata routeros selfhosting communityhosting brave icann selfsustaining hosting discourse weblate PeerToPeer dns openstandards conceptmap nojs ejabberd oauth tic hypercore CDNsAreEvil meshtastic protonmail TubEdu standards yourdataisyourdata internetfreedom gemini webui InternetCrimeFamily wlan internetBanking SmallWeb coopcloud cw internetshutdown godotengine cdn liberapay distributedcoop xmpp semanticweb identicurse socialnetwork selfie website SaferInternetDay content splinternet participation highavailability webstandards mapa mindmapping domains ntp cloudfront socialnetworks metadata disconnect Meme database proton disco cloudfirewall descentralizare icmp videocast jabber cleanuptheweb webbrowsers decentralized wiki cloudron browserextensions ssb darknet cookies Qute darkweb netcat webInstaller map Reddit server browser cloudy IPFS p2p social antisocial tiddlywiki www opendata ilovewikipedia web WebsiteStatus netshutdowns twitch im 9front theserverroom Watomatic datafree domain OpenStreetMap geminiprotocol statistics pirate datacracy filesharing rss openstreetmap ipns mozilla voicemail Nyxt yacy debloattheweb crosspost mail i2pd ipfs internetradio browsers wikidata selfpub decentralizeit ballpointpen netscape mixcloud gmail openculture letthenetwork cyberspace SwitchToXmpp messaging selfies offthegrid enxeñeríasocial cloud ddg internet moderation decentralisation metaverse fox ssbroom serverMeddling missingmaps bravesearch sneakernet NatureNeedsJustice internetarchive godot dweb kmail js mindmap dark beakerbrowser notetoself NetShutdown enigmail onlineharms dot Internet descentralizarea thepiratebay ftp internetshutdowns fixtheweb lazyweb socialweb colonial socialists ebay mozillahubs instantmessaging interoperabilitate webmention Justice4MohamudHassan + + Sun, 07 Mar 2021 20:25:51 UT + + + science + engineering math epidemiology ethnology womeninstem archeology botany STEM biodiversity linguistic anthro supercollider nextgeneration zoology climatology dna geography physics archaeologist generalstreik geology generationidentitaire stemwijzer bioengineering botanical dawkins ineigenersache holo graphTheory meterology regenerative biotech psychology biology generation gene chemistry paleontology oceanography stem nextgenerationinternet biomedical anthropology + + Sun, 07 Mar 2021 20:25:51 UT + + + photos + smartphonephotography nikon 90mm photography wildlifephotography photo photogrpahy tokyocameraclub nikond90 photos macrophotography photographie camera macropod cameras fossphotography myphoto naturephotography picture macro streetphotography photoreference pictures + + Sun, 07 Mar 2021 20:25:51 UT + + + history + musichistory heirloom monarchs holocaust history makeinghistory anarchisthistory NetworkingHistory blackhistory monarch computerhistory + + Sun, 07 Mar 2021 20:25:51 UT + + + places + lapaz luanda asunción nouakchott conakry kyiv moscow saipan gibraltar dublin KlimaGerechtigkeit catalunya dannibleibt avarua hargeisa delhi niamey chișinău freestuff colombo brasília phnompenh mbabane danni belgrade belmopan pyongyang hannover calls ulaanbaatar oranjestad Reykjavik gaborone seattle ndjamena raw singapore kingedwardpoint abidjan nuuk asshole pretoria papeete malé rhetorical robberfly zagreb gitega abudhabi flyingfishcove castries georgetown hagåtña videoFreex cassette oric borikua basseterre hamburg afrika kinshasa suva klimaatverandering valparaíso athens roseau sheffield baku charlotteamalie antananarivo domi pristina MakoYass videocalls santiago sukhumi berlin uptronicsberlin funafuti libreville puertorico ClimateChange hanoi philipsburg tehran banjul prague rawhide andorralavella daw yerevan portauprince videoprojects dakar paramaribo tifariti capetown rigaer94 tirana klima ankara ipswich managua lisbon bishkek amsterdam climatchoas videogames klimaat EastVirginia portonovo santodomingo bangkok texas bucharest kathmandu aden madrid sanjuan vienna kingston kabul damascus stockholm douglas ClassOf2015 willemstad hibernoenglish thehague panamacity RassismusTötet beirut amman newdelhi tórshavn nouméa oslo alofi gustavia paris video cockburntown ottawa classical stepanakert portofspain klimakrise class fsberlin honiara berniememe asmara florida nicosia helsinki taipei tegucigalpa tokyo tashkent larochelle vr MadeInEU sarajevo algiers KlimaKrise nairobi muscat monaco riyadh lusaka wellington bissau juba mariehamn majuro buenosaires ngerulmud dhaka berlinhateigenbedarf guatemalacity washington vatican kuwaitcity Erdmannhausen londonboaters SystemChangeNotClimateChange bern mexicocity bratislava myasstodontownhall bridgetown prince delhipolice crowsnestpass tunis manila stanley matautu copenhagen barcelona lomé videocall budapest ouagadougou mogadishu freetown victoria lora brazzaville portmoresby ashgabat kampala Klimaatalarm elaaiún vilnius ContourDrawing bloemfontein sucre london passalong marseille berniesanders pagopago bradesestate oakland vaduz addis nürnberg naypyidaw CassetteNavigation khartoum baghdad bandar moroni cuirass lehavre portvila kingstown ChrisCrawford reykjavík lofi manama accra windhoek fortworth nukualofa classic ciutatvella tbilisi canberra quito maputo cetinje adams putrajaya ramallah bogotá dodoma harare havana warsaw münster valletta localberlin ljubljana bamako kualalumpur podgorica rabat cotonou plymouth seoul neumünster Portland dushanbe bangui magnifyingglass aotearoa westisland tskhinvali palikir caracas jamestown rome munich freestuffberlin sãotomé jakarta daressalaam sansalvador seo apia essex yaren cairo jerusalem brussels kigali southtarawa beijing minsk montevideo vientiane philips maseru klimaatopwarming hamilton lorawan doha tripoli celtic portlouis lima adamstown deventer weimar abuja fuckalabamapower lilongwe nassau lobamba heathrow nyc fly montreal rawtherapee dili riga assembly lesbos monrovia nursultan Neuzulassung gab sanjosé klimaatrechtvaardigheid marigot islamabad fb malabo tallinn sahara thimphu klimanotstand yaoundé praia bujumbura washingtondc sofia skopje + + Sun, 07 Mar 2021 20:25:51 UT + + + music + musicprodution LaurieAnderson punk punkname ourbeats gas vollgasindiekrise indieweb synthesizer daftpunk indiemusic 20thcenturyjazz steamlinux streetpunk bikepunks bandcamp mymusic musicians jamendo ipod skinheadmusic rap shoegaze mp3 steam indie steampunk indieauthor nazipunksfuckoff Music EnvoieStopHashtagAu81212 thecure posthardcore vaporwave IndustrialMusicForIndustrialPeople Mixtip dubstep synthwave bootstrap oi rave freemusic nowplaying hiphop hardcore experimentalmusic spotify fedimusic musicbrainz eos90D soundcloud frankiegoestohollywood ccmusic typographie dj newwave dorkwave producing experimental musicproduction chiptune lastfm 1 funkwhale eos wp playlist retrosynth NowPlaying libremusicproduction MusicAdvent coinkydink pmbootstrap arianagrande indiecember synth music np bass techno jazz production graphics darkwave mastomusic metal polychromatic funk magnatune fediversemusic cyberpunkmusic cleantechnologies BandcampFriday mixtape + + Sun, 07 Mar 2021 20:25:51 UT + + + conferences + FOSDEM2021 debconf FOSDEM talk fossdem FreedomBoxSummit apconf2020 schmoocon penguicon2021 summit confidenceTricks minidebconf rc3worldleaks penguicon emacsconf MCH2021 ox defcon flossevent conf rC3 rC3World FOSDEM21 conference flossconf apconf rC3one smalltalk C3 config confy + + Sun, 07 Mar 2021 20:25:51 UT food - vitamind cake teamviewer FoodHardship margarine zwartepiet dessert salsa caviar theexpanse BellaSpielt cookery pietons Ôtepoti panther food skillet teamgodzilla spiel liquor milk bolognese recipe foodporn yeast drinking plate waffle biscuit glaze omelette filet pastry wine Caribbeans hamburger juice Amazfish sourdough cagefree nuts gras toast broth batter foodie spiele ketchup divoc seasoning mayo soup arpanet pan voc imateapot potatoes mayonnaise vegan dish avocado spice bakery butterflies butterfly cooking teamhuman yogurt thecandycrystalrainbowcodex crumble cider caffeine butter sailfishos mastokitchen cook pottery creepypasta mastocook cobbler steak pizza soda fedikitchen aroma oil Miroil angelfish flour cream nutella pie cuisine potse freerange tartar kropotkin tea marinade mushroom entree lfi bread salad beans fresh syrup fermentation mushrooms cookie wordstoliveby curd soysauce pudding beer baking peterkropotkin fish foodwaste wheat pot TeamFerment sauerkraut stew weltspiegel chocolate paste wok recipes expanse olive burger candy spanish kitchen coffee bagel teams taste SpieleWinter2020 meat noodle raclette caramel rice eggs grill poutine demoteam lard croissant pasta vegane strawberry foods WaterDrinkers cheese oregano drink muffin foie sauce foodanddrink soy growyourfood vore pandemie cocoa sandwich mousse chili vinegar + vitamind cake teamviewer FoodHardship pankow margarine zwartepiet dessert salsa caviar brot theexpanse BellaSpielt cookery pietons Ôtepoti panther food cakecutting skillet teamgodzilla spiel liquor milk bolognese recipe foodporn yeast drinking plate waffle biscuit glaze omelette filet pastry wine woke Caribbeans hamburger juice Amazfish sourdough cagefree nuts gras toast broth batter foodie breadposting spiele ketchup divoc seasoning mayo soup arpanet pan voc imateapot Anglefish potatoes mayonnaise vegan dish avocado spice bakery butterflies butterfly cooking teamhuman yogurt thecandycrystalrainbowcodex crumble cider caffeine butter mastokitchen cook pottery creepypasta mastocook cobbler steak pizza soda fedikitchen aroma oil Miroil angelfish flour cream nutella pie cuisine potse freerange tartar kropotkin tea marinade mushroom entree lfi bread salad beans fresh syrup fermentation mushrooms cookie wordstoliveby curd soysauce lowcarb pudding beer baking peterkropotkin fish foodwaste wheat pot TeamFerment sauerkraut stew weltspiegel chocolate paste wok recipes expanse olive burger candy Steam spanish kitchen coffee bagel teams taste SpieleWinter2020 meat noodle raclette caramel rice eggs grill poutine demoteam lard croissant pasta vegane strawberry foods WaterDrinkers cheese oregano drink muffin LowRefresh foie sauce foodanddrink soy growyourfood vore pandemie cocoa sandwich mousse chili redfish - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT farming johndeere - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT countries - romania burma lithuania solomon chile Instanz fiji tajikistan benin paraguay eeuu icelandtrip senegal ukraine italy brunei nicaragua guyana Pflanzenbestimmung euphoria zambia iceland morocco rojava netherlands swaziland bosnian suriname winningatlife elsalvador russia samoa european czech belarus hayabusa2 kyrgyzstan uk abuse translation sanmarino catalonia panama africa japan buyused venezuela gambia freeNukem kuwait barbados papua greece switzerland uae nigeria usa angola honduras djibouti laos sierraleone nonprofit britain cambodia ych vietnam neofeud seychelles marshall kazakhstan trailrunning urk estonia tonga stlucia burundi bangladesh egypt mali congo us jordan speedrun grenada israel psychic algeria ghana bosnia translations russian eritrea bhutan ios hungary Störungsverbot saudi slovenia tig czechosvlovakia bahamas australia kiribati togo koreanorth poland Überbevölkerung malawi capeverde armenia american hautrauswasgeht bahrain mozambique beleuchtung southsudan syria micronesia maldives iran indigenous nonprofitindustrialcomplex sweden bijîberxwedanarojava ethiopia cuba liberia canada burkina somalia Chile scotland russiaToday vaticancity easttimor austria turkey yemen Bolivia denmark USBased madagascar finland philippines ivorycoast haiti ecuador Portugal azerbaijan gasuk spain albania afghanistan europe mauritania dominica ökonomisierung thailand belize westpapuauprising nerdlife macedonia montenegro running thenetherlands qatar mongolia costarica boatingeurope birdsofkenya latvia uzbekistan kabelaufklärung ireland iraq malaysia mexico mauritius dezentralisierung oman chad nz de georgia zimbabwe france serbia lesotho oddmuse tunisia argentina czechia cameroon namibia sudan indonesia colombia kryptowährung tuvalu britainology beckychambers turkmenistan tanzania germany neuhier norway comoros auteursrecht guatemala Thailand kosovo andorra wales servus pakistan belgium china antigua life koreasouth newzealand visiticeland einzelfall rwanda luxembourg libya indywales italyisntreal nauru moldova eastindiacompany palau taiwan kenya trinidad eu botswana CuriosidadesVariadas jamaica vanuatu cyprus aminus3 malta Icelandic niger s3 westpapua busse unitedstates myanmar saintvincent guinea nepal peru uganda uruguay india lebanon neurodiversity southafrica croatia europeanunion bolivia chinese dominican srilanka bulgaria slovakia speedrunning gabon psychedelicart stkitts liechtenstein neofeudalism brazil shutdowncanada + romania burma lithuania solomon chile Instanz maui fiji tajikistan benin paraguay eeuu icelandtrip senegal ukraine italy brunei nicaragua guyana Pflanzenbestimmung euphoria zambia iceland morocco rojava netherlands swaziland bosnian suriname winningatlife elsalvador russia samoa asl european czech belarus hayabusa2 kyrgyzstan uk abuse translation sanmarino catalonia panama africa japan buyused venezuela gambia freeNukem kuwait barbados papua greece switzerland uae mau nigeria usa angola honduras djibouti laos sierraleone nonprofit britain cambodia ych vietnam neofeud zealios seychelles marshall kazakhstan trailrunning urk estonia tonga stlucia burundi bangladesh egypt mali congo us jordan speedrun grenada israel psychic algeria ghana bosnia translations russian eritrea bhutan hungary Störungsverbot saudi slovenia tig mauikit czechosvlovakia bahamas australia kiribati togo koreanorth poland Überbevölkerung malawi capeverde armenia american hautrauswasgeht bahrain mozambique americanpinemarten beleuchtung southsudan Martesamericana syria micronesia maldives iran indigenous sweden bijîberxwedanarojava ethiopia cuba liberia canada burkina somalia Chile scotland russiaToday vaticancity easttimor austria turkey yemen Bolivia denmark USBased madagascar finland philippines ivorycoast haiti ecuador Portugal azerbaijan gasuk spain albania afghanistan europe mauritania dominica ökonomisierung thailand belize westpapuauprising nerdlife macedonia montenegro thenetherlands qatar mongolia costarica boatingeurope birdsofkenya latvia uzbekistan kabelaufklärung ireland iraq malaysia mexico mauritius dezentralisierung oman chad nz de georgia zimbabwe france serbia lesotho oddmuse tunisia argentina czechia cameroon namibia sudan indonesia colombia worldwildlifeday kryptowährung tuvalu britainology beckychambers turkmenistan tanzania germany neuhier norway comoros auteursrecht guatemala Thailand kosovo andorra wales indiastrikes servus pakistan belgium china antigua life koreasouth newzealand visiticeland einzelfall rwanda luxembourg libya indywales italyisntreal nauru moldova bad eastindiacompany stigmergic palau taiwan kenya trinidad eu botswana fossaudio CuriosidadesVariadas jamaica vanuatu cyprus aminus3 malta Icelandic niger s3 westpapua busse unitedstates myanmar saintvincent guinea nepal peru uganda uruguay india lebanon neurodiversity southafrica croatia europeanunion bolivia chinese dominican srilanka bulgaria slovakia speedrunning gabon psychedelicart stkitts liechtenstein neofeudalism brazil shutdowncanada - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT software - borgbackup app freedombox windows libre nginx postscript Framasoft invidious drm publicdomain ilovefreesoftware kubernetes nodrm copyleft fossmendations freedoom jami FuckOffZoom quicksy whiteboard free docker freesoftware gimp backups foss matrix dinosaur designjustice thefreethoughtproject filesystems nextcloud translate wechat opensourceseeds notmatrix HappyLight openscad uidesign TabOrder ikiwiki Linux FreeSoftware rocketchat thanksfreesw outreachy synapse API lyft photoshop nitter virtualbox discord opensource diaspora yunohost oss littlebigdetails cabal conferencing libreboot accessibility devops owncast emacs freiesoftware fluffychat writefreely videoconferencing bigbluebutton email chatapps HappyNewYear floss plugins libresoftware softwareengineering deltachat application uifail FOSS GNOMECircle bittorrent penpot vlc zoom tiling FriendofGNOME usability opendesign obnam snap pandoc cryptpad software libretranslate OwnStream upstream slack Element zrythm gnu CTZN mumble grsync freecad drmfree telegram containers tails blockchain irssi mcclim mutt design gameoftrees backup LinuxSpotted rotonde freetube GNU skydroid thunderbird sysadmin parler apps chat licensing inclusivedesign crosspost defectivebydesign screenreaders ZeroCool LINMOBapps obsproject softwareheritage profanity Tankklappe ffmpeg fossandcrafts lemmy reboot opensourcegardens OSM freesw agpl GNOME strafmaatschappij distributedledger mattermost principiadiscordia rocket ghostscript win10 Zoom elemental libreops element chatty nativeApp MatrixEffect jitsi wordpress ux rsync libreoffice dino plugin xwiki openoffice container discordia ledger sounddesign glimpse + borgbackup app freedombox windows libre nginx postscript freebsd Framasoft invidious drm publicdomain ilovefreesoftware kubernetes nodrm copyleft fossmendations freedoom jami FuckOffZoom quicksy whiteboard free docker freesoftware gimp backups foss matrix dinosaur designjustice thefreethoughtproject filesystems nextcloud translate wechat notmatrix Mosstodon HappyLight openscad uidesign TabOrder searx ikiwiki Linux FreeSoftware rocketchat thanksfreesw outreachy synapse API lyft photoshop nitter virtualbox discord opensource diaspora yunohost oss chickadee littlebigdetails cabal conferencing libreboot mycroft accessibility devops owncast emacs freiesoftware fluffychat writefreely videoconferencing bigbluebutton email chatapps HappyNewYear floss plugins libresoftware softwareengineering mosstodon expandocat deltachat application uifail FOSS GNOMECircle bittorrent fossils penpot vlc zoom tiling FriendofGNOME usability opendesign obnam snap ProprietarySoftwareProblems pandoc blackcappedchickadee cryptpad software libretranslate OwnStream upstream slack Hummingbard Element zrythm gnu CTZN mumble grsync freecad drmfree telegram containers tails blockchain irssi mcclim iso mutt design gameoftrees freetool backup rotonde freetube GNU skydroid thunderbird sysadmin parler apps chat licensing inclusivedesign defectivebydesign metager screenreaders sysadmins ZeroCool LINMOBapps obsproject softwareheritage profanity Tankklappe doomemacs ffmpeg fossandcrafts telesoftware love reboot opensourcegardens switchingsoftware OSM freesw agpl distribute GNOME strafmaatschappij distributedledger mattermost principiadiscordia rocket ghostscript win10 Zoom elemental libreops element inclusive chatty softwareGripe nativeApp MatrixEffect jitsi wordpress SwitchToJami mongodb ux rsync libreoffice crossstitch dino plugin xwiki openoffice container discordia softwaredesign ledger sounddesign glimpse - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT cycling bicycle cycling bike motorbike thingsonbikes Snowbike cyclist - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT phones - mobileapp fairphone3 téléphone mobian pine fdroid plasmamobile android smartphonepic ubportsqanda linuxmobile phones fennecfdroid Mobian osmf smartphone sms4you smartphones iOS14 linuxphones openmoko mobilelinux freeyourandroid QWERTYphones siskinim osmocom Smartphones lineageos molly androiddev plasma phosh BriarProject librem5 ubportsinstaller osm linuxphone pinephone mobile pinephones sms pine64 fairphone ubuntutouch linphone Android ubports osmand vodafone linuxonmobile iphones postmarketos iOS microg grapheneos phone mobileKüfA + mobileapp fairphone3 téléphone mobian pine fdroid plasmamobile android smartphonepic ubportsqanda linuxmobile sailfish phones fennecfdroid Mobian osmf smartphone ios sms4you smartphones iOS14 keto pinemarten linuxphones openmoko mobilelinux freeyourandroid QWERTYphones sailfishos siskinim monal osmocom Smartphones lineageos molly androiddev plasma phosh BriarProject librem5 ubportsinstaller osm linuxphone pinephone Teracube PinePhone mobile pinephones sms pine64 fairphone ubuntutouch linphone Android linux ubports gnomeonmobile osmand vodafone linuxonmobile iphones postmarketos iOS microg grapheneos phone mobileKüfA - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT security - signalboost repair encrypt letsencrypt BrowserHistory autoritäreretatismus omemo dataleak messenger password keepassxc cryptography cybersecuritynews solarwinds communityalgorithmictrust infosec gchq repairing IHaveSomethingToHide fotografie passwords IronySec cryptowars supplychainattacks UseAMaskUseTor cyberattack security tor comb e2e bruceschneier vpn itsec openssh openssl cryptoart spyware e2ee ed25519 torproject encryption informationsecurity ssh misshaialert cybersec encryptionsist FormFactors crypto giftofencryption malware corydoctorow righttorepair cryptographyisoverparty opsec keepass TastySecurity torsocks nsa protonvpn trustissues yubikey nitrokey encrypted openpgp castor9 gpgtools gpg fotopiastory equatorial cybersecurity Tor CryptoWars signal noscript trust drugs wire itsecurity cryptocurrency foto pgp cryptomator signalmessenger openvpn datasecurity autorotate regulators leak drugstore encryptiost securitynow storage tracking cloudflare + signalboost repair encrypt letsencrypt messengers BrowserHistory FlexibilizaciónResponsable autoritäreretatismus omemo dataleak messenger password keepassxc cryptography cybersecuritynews solarwinds communityalgorithmictrust infosec gchq wireless repairing IHaveSomethingToHide fotografie passwords IronySec cryptowars supplychainattacks UseAMaskUseTor cyberattack security tor comb e2e bruceschneier vpn itsec openssh openssl cryptoart spyware e2ee backdoor ed25519 torproject cryptomeanscryptography encryption informationsecurity ssh misshaialert cybersec encryptionsist restore FormFactors crypto theObservatory giftofencryption signalapp onionshare onion malware switchtosignal corydoctorow righttorepair cryptographyisoverparty opsec keepass TastySecurity torsocks nsa protonvpn trustissues yubikey nitrokey encrypted openpgp castor9 prismbreak gpgtools gpg fotopiastory equatorial cybersecurity Tor CryptoWars signal noscript trust drugs cryptoparty wire itsecurity cryptocurrency foto pgp cryptomator signalmessenger openvpn datasecurity autorotate regulators leak drugstore encryptiost libresignal securitynow storage tracking cloudflare - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT pandemic - covid19 corona psmeandmywholefamilycaughtcovidfromwork Coronavirus CoronaWarnApp facemasks vaccines vaccine pandemic sayhername covidville contacttracing tier4 covid coronavirus masks COVIDrelief virus Lockdown rna codid19 COVID19 YesWeWork ContactTracing COVID coronamaatregelen + covid19 corona psmeandmywholefamilycaughtcovidfromwork Coronavirus CoronaWarnApp facemasks vaccines vaccine JournalistsSpeakUpForAssange pandemic sayhername internationalproletarianrevolution covidville contacttracing tier4 covid coronavirus masks COVIDrelief virus Lockdown rna codid19 COVID19 YesWeWork ContactTracing COVID coronamaatregelen - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT astronomy - telescope mercury pluto galaxy venus mars amateurastronomy uranus nebula astronomy neptune space jupiter blackhole asteroid BackYardAstronomy moon observatory saturn milkyway + telescope mercury pluto planets galaxy venus mars amateurastronomy uranus nebula astronomy neptune space jupiter blackhole asteroid BackYardAstronomy moon observatory saturn milkyway - Thu, 18 Feb 2021 21:34:48 UT - - - history - heirloom monarchs holocaust history makeinghistory anarchisthistory NetworkingHistory monarch computerhistory - - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT news report news flash Wikileaks newsletter newsflash rt bbc goodnews doubledownnews reuters theguardian newsboat journalism SkyNews - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT cats - Cat dailycatpic dxp DailyCatVid katze kotorico CatsOfMastodon Leopard catbellies LapCats qualitätskatzen + Cat dailycatpic dxp DailyCatVid katze kotorico kot CatsOfMastodon Leopard catbellies LapCats qualitätskatzen - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT employment - InterviewQuestions jechercheunjob mywork hiring ProgrammingJob reproductivework workinprogress bullshitjobs antiwork kreaturworks worklog job DjangoJob hire hirefedi workshop carework nowhiring obs obsolescence work flossjobs jobs sexworker + InterviewQuestions jechercheunjob mywork employees hiring ProgrammingJob reproductivework workinprogress bullshitjobs workplace antiwork kreaturworks worklog job DjangoJob teamwork framework hire hirefedi workshop carework nowhiring obs obsolescence work hertfordshire flossjobs jobs sexworker - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT radio - cbradio worldradioday hamr why tootlabradio pouetradio dx macintosh amateurradio radiohost radiokapital localization vantaradio ca radio healthcare listening hamradio FreeAllPoliticalPrisoners card10 fastapi radiobroadcasting radiosurvivor radioshow local radio3 noshame osh audycja hackerpublicradio audycjaradiowa california nowlistening listeningtonow radiobroadcast mastoradio spazradio anonradio kolektywneradio io api + cbradio worldradioday hamr why tootlabradio pouetradio dx macintosh amateurradio radiohost radiokapital localization vantaradio ca radio healthcare listening hamradio FreeAllPoliticalPrisoners card10 fastapi radiobroadcasting radiosurvivor Poecileatricapillus radioshow local radio3 noshame osh audycja hackerpublicradio kosher audycjaradiowa california nowlistening listeningtonow radiobroadcast mastoradio spazradio anonradio kolektywneradio io api - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT indymedia hs2 visionontv geek tredtionalmedia degeek globleIMC indymediaback pga indymedia networking stupid hs2IMC indymediaIMC network networkmonitoring roadsIMC stupidindivialisam roadstonowhere lifecult omn tv roadstonowhereIMC UKIMC fluffy 4opens openmedianetwork - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT economics - workercoop bank bitcoin noplanetb theWorkshop feministeconomics WealthConcentration coops valuesovereignty funding platformcoop usebitcoin consommation workercoops economics value business platformcooperatives exoplanets shopping displacement shop plaintextaccounting crowdfund fairtrade RIPpla bankingCartel Bitcoin startups HenryGeorge plant economíasolidaria disablitycrowdfund crowdfunding limitstogrowth companies sharingiscaring techcoops disability micropatronage lgbtcrowdfund monetize smallbusiness pla kommerzialisierung GitPay gdp deplatforming coop smallbusinesses europeancentralbank whyBitcoin infoshop limits values banks planetary plannedObsolence worldbank + workercoop cooperatives accounting bank bitcoin noplanetb theWorkshop feministeconomics WealthConcentration valueflows coops valuesovereignty funding platformcoop usebitcoin consommation workercoops economics value business platformcooperatives exoplanets shopping ethicalfunding displacement poplar shop plaintextaccounting crowdfund fairtrade RIPpla bankingCartel rope Bitcoin startups HenryGeorge plant economíasolidaria disablitycrowdfund crowdfunding limitstogrowth companies sharingiscaring techcoops disability micropatronage lgbtcrowdfund monetize smallbusiness intellectualproperty pla kommerzialisierung GitPay gdp deplatforming coop smallbusinesses europeancentralbank whyBitcoin infoshop grow growth limits fuckfoodbanks values banks planetary plannedObsolence planet worldbank - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT + + + games + appdesign minecraft tetris99 gamestop ageofempires TerraNil runequest dragonfall boardgames computergames fucknintendo gameassets gamestonk FediDesign puzzle indiegames gamedesign shadowrun chess nintendoswitch mud indiegame game 0ad gameart opengameart sign asset ttrpg gamedev freegames guildwars2 bideogames TetrisGore gaming gamemaker gameing nintendo roleplayinggames Gamesphere devilutionx rpg gamespot tetris dosgaming DnD cyber2077 tarot cyberpunk2077 gamesforcats FreeNukum spelunkspoil supermariomaker2 neopets minetest omake guildwars dnd games + + Sun, 07 Mar 2021 20:25:51 UT years newyearsresolutions resolutions Year2020 year 1yrago newyear happynewyear 5yrsago newyearseve - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT linux - osdev opensuse linuxisnotanos elementaryos cli viernesdeescritorio shell kde Debian11 thisweekinlinux slackware bsd openwrt distros tmux nixos nix DebianBullseye ubuntubuzz shareyourdesktop wireguard linuxaudio usb nixpkgs gtk debian trisquel gnome linuxposting console showyourdesktop windowmanager desktop GuixSystem arch platform ubuntu snowfall gnulinux aur justlinuxthings xubuntu unix fedora centos openmandriva gentoo liveusb personalarchive usergroup systemd linuxgaming Debian distro destinationlinux gtk3 escritoriognulinux qubesos i3wm kubuntu epr JuiceFS reproducible haiku linuxisnotaplatform clip fall linux EMMS raspbian netbsd shellmustfall termux btrfs reproduciblebuilds artix gtk4 archlinuxarm bash archlinux platforms linuxconfau GNUlinux rhel debianinstaller debianindia linuxisajoke suse linuxconsole + osdev opensuse linuxisnotanos elementaryos cli viernesdeescritorio shell aves kde Debian11 kdepim thisweekinlinux slackware search bsd tap openwrt distros tmux nixos nix DebianBullseye xfce ubuntubuzz shareyourdesktop personal wireguard linuxaudio usb nixpkgs gtk linuxmint debian trisquel gnome linuxposting console showyourdesktop research windowmanager desktop GuixSystem arch platform ubuntu snowfall gnulinux aur justlinuxthings xubuntu unix fedora centos tuxedocomputers openmandriva gentoo aurora researcher liveusb personalarchive usergroup systemd linuxgaming Debian distro tape destinationlinux LinuxSpotted Squarch gtk3 escritoriognulinux qubesos i3wm kubuntu epr JuiceFS reproducible haiku linuxisnotaplatform clip fall EMMS raspbian netbsd shellmustfall termux btrfs reproduciblebuilds joke artix gtk4 archlinuxarm bash archlinux platforms linuxconfau researchers GNUlinux rhel debianinstaller debianindia linuxisajoke suse linuxconsole - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT art - arttips paperart CreativeToots Linke subresourceintegrity water urban glassart martialarts artalley artvsartist2020 circulareconomy abstract poe nomadbsd dccomics inkscape artificalintelligence circuitsculpture watercolor resources memes autisticartist barrigòtic art sona animalart krita anthroart urbanart queerart deviantart CircusInPlace pastel drawings adultcolouring source openstreeetmap collage jordanlynngribbleart linkedin thinkabout PartyPooperPost openai harmreductionart openra wallpaper political agriculture streetart coverart stickers freeculture fiberart pcb MastoArt particl ParticlV3 groenlinks creativetoots culture ganart opencl fiberarts polArt ink painting Leitartikel opencoop digitalart comic sartre artwork openbsd mandala b3d politicalcartoon glitch xkcd comics mastoart urbanterror illustration artopencall gnuimagemanipulationprogram os wireart cartoon oc AccidentalGraffiti OriginalCharacter webcomic DigitalArt partnership oilpainting irc furryart twinkle DisabledArtist pink fursona inkjet generativeart sticker enbyart particles artbreeder 17maart arttherapy fractal enby TattoosOfTheFediverse signalstickers digitalpainting artvsartist abstractart drawing sig circular sculpture artist pcbart meme cultureshipnames concretepoetry artwithopensource commissions opencallforartists commissionsopen fountainpenink peppertop visionaryart blackartist zine artists heart genart stickerei smartcard pixelart alisajart opencollective openrailwaymap JuliaHartleyBrewer digitalArt artistsOfMastodon + arttips mastoartist paperart CreativeToots Linke subresourceintegrity water resource urban article glassart martialarts artalley artvsartist2020 circulareconomy abstract artreference poe nomadbsd dccomics inkscape artificalintelligence circuitsculpture watercolor resources memes autisticartist barrigòtic art sona animalart krita anthroart urbanart queerart deviantart CircusInPlace pastel drawings adultcolouring source collective openstreeetmap collage jordanlynngribbleart linkedin links thinkabout PartyPooperPost openai harmreductionart MastoArtHeader openra wallpaper ircd political agriculture streetart coverart stickers freeculture fiberart pcb MastoArt particl ParticlV3 groenlinks creativetoots culture ganart opencl fiberarts polArt ink painting Leitartikel marten opencoop digitalart comic sartre artwork openbsd mandala b3d politicalcartoon blackart glitch xkcd comics intelligence linkinbio mastoart urbanterror illustration artopencall gnuimagemanipulationprogram os wireart cartoon oc AccidentalGraffiti eink OriginalCharacter poezio webcomic DigitalArt partnership oilpainting irc furryart twinkle DisabledArtist pink fursona inkjet generativeart sticker enbyart particles artbreeder 17maart djmartinpowers arttherapy fractal enby TattoosOfTheFediverse signalstickers digitalpainting artvsartist abstractart drawing sig circular sculpture artist pcbart meme cultureshipnames concretepoetry artwithopensource pinkwug commissions opencallforartists commissionsopen fountainpenink power peppertop visionaryart blackartist zine artists heart genart stickerei lineart smartcard pixelart alisajart opencollective openrailwaymap circuitbending JuliaHartleyBrewer digitalArt artistsOfMastodon - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT crafts - topic_imadethis hackerexchange textile upholstery hackgregator hackspacers shack dust3d hackerspaces sanding solvespace sundiy maker knitting hack hacked calligraphy biohacking wip jewelry diy upcycling woodworking 3dcad origami makers quilting hacker quilt weaving 3dmodel tinkering hacking woodwork ceramics embroidery shacks teardown + topic_imadethis hackerexchange exchange textile upholstery hackgregator gatos gato hackspacers shack dust3d hackerspaces sanding solvespace sundiy maker knitting hack hacked calligraphy biohacking wip jewelry diy upcycling woodworking 3dcad origami makers quilting hacker quilt weaving 3dmodel tinkering hacking woodwork ceramics embroidery shacks teardown - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT pets - catpics germanshepherd catofmastodon TheRabbitHole reEducationCamp mastodogs rats catbehaviour Coolcats petrats dogsofmastodon gentrification broadcats bunyPosting fostercats cats kittens pet dog acat caturday catsofmastodon meow cute catstodon dogs mastocats notpixiethecat londoninnercitykitties cat furry catcontent UserDomestication + catpics germanshepherd catofmastodon nin TheRabbitHole cathedrals Stelleninserat reEducationCamp mastodogs rats catbehaviour Coolcats petrats dogsofmastodon gentrification broadcats bunyPosting kitten fostercats cats kittens pet dog acat icecat caturday catsofmastodon meow cute mastocat catstodon dogs mastocats notpixiethecat londoninnercitykitties cat furry catcontent UserDomestication desertification - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT war Myanmarmilitarycoup civilwar antiwar bomber coup tank handforth landmine military autonomousweapons army Etankstelle weaponsofmathdestruction conflict navy warplane fort guns Myanmarcoup weapons siege battle WMD wmd airforce forth - Thu, 18 Feb 2021 21:34:48 UT - - - games - minecraft tetris99 gamestop ageofempires TerraNil runequest boardgames computergames fucknintendo gameassets gamestonk FediDesign puzzle gamedesign chess nintendoswitch mud indiegame game 0ad gameart opengameart sign asset ttrpg gamedev freegames guildwars2 bideogames TetrisGore gaming gamemaker gameing nintendo roleplayinggames Gamesphere rpg gamespot tetris dosgaming DnD cyber2077 tarot cyberpunk2077 gamesforcats FreeNukum supermariomaker2 neopets minetest guildwars dnd games - - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT legal - eek rma hfgkarlsruhe amro karlsruhe remotelearning SpreekJeUitBekenKleur GameSphere OnlineHarmsBill laipower gdpr intros Anticritique learning energyflow peekier mojeek digitalservicesact geekproblem dmca + eek rma hfgkarlsruhe amro karlsruhe remotelearning SpreekJeUitBekenKleur disinformation GameSphere OnlineHarmsBill laipower gdpr intros Anticritique learning energyflow misinformation peekier mojeek digitalservicesact geekproblem dmca - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT climate - energy renewables clouds openscience renewableenergy amp climateemergency climatechos ClimateAction climate climateracism windenergy coal weatherforecast skypack poll globalwarming climatechange weather ragingqueerenergy climatecamp windpower globally globalization climatechoas pollution global science fossilfuels Climate sky climatescience climateaction ClimateCrisis climatecrisis + energy renewables clouds openscience renewableenergy amp climateemergency climatechos ClimateAction climate climateracism renewable windenergy coal weatherforecast klimaatcrisis skypack poll fossilfuel globalwarming climatechange weather ragingqueerenergy climatecamp windpower globally globalization climatechoas pollution global parisclimateagreement science fossilfuels Climate sky climatescience energytransition climateaction ClimateCrisis globalviews climatemitigation climatecrisis - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT fiction - ABoringDystopia cyberpunk thehobbit fiction genrefiction + ABoringDystopia cyberpunk thehobbit fiction flashfiction genrefiction - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT gender - transparantie transistors broketrans transwomen transformativejustice transparency transcrowdfund transgender womensart female nonbinary vantascape blacktransmagic trans transpositivity transphobia women sri estradiol transgenders queer genderQuiz gender genderqueerpositivity woman transrights + transparantie transistors broketrans transwomen transformativejustice transparency transcrowdfund esperanto transmission transgender womensart female osi nonbinary vantascape blacktransmagic nb trans nonbinarycommunity transpositivity transphobia transmitter women sri rant estradiol transfer transgenders pointlesslygendered queer genderQuiz gender genderqueerpositivity woman transrights - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT audio - feed audioproduction pulseaudio audi audiofeedback audio + feed audioproduction pulseaudio audi feedbackd audiofeedback audio - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT media - livestreaming mainstreaming stream trad selfsustainable kawaiipunkstreams mainstream streaming weAreAllCrazy maiabeyrouti sustainability diymedia submedia theatlantic traditionalmedia videos newsmedia wikimedia mixedmedia railroads documentary streamers tootstream taina ai realmedia media independentmedia theintercept + livestreaming ip sustainable mediathek mainstreaming stream trad maistreaming selfsustainable kawaiipunkstreams mainstream streaming weAreAllCrazy streamdeck maiabeyrouti sustainability diymedia submedia theatlantic traditionalmedia videos newsmedia wikimedia mixedmedia railroads documentary streamers tootstream taina ai realmedia media independentmedia theintercept - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT activism - protestor clearchannel grassroot FreeLibreOpen g20 rig bekannt farmersprotest protests riseup sflc DanniVive apt reuse stopspyingonus keepiton FSFE20 fsfe softwarefreedom ilovefs ann activist xr SustainableUserFreedom seachange directaction eff change openrightsgroup protest icantbreathe JeffreySDukes actiondirecte kroymann HS2 ngo MarcWittmann fsf fsfi StopHS2 grassroots HS2Rebellion antireport ClimateJustice BLM ExtinctionRebellion changeisinyourhands conservancy ngos sp JefferySaunders LiliannePloumen mongodb climatechangeadaptation Kolektiva XR freeolabini announcement isolateByoblu annieleonard + protestor clearchannel tyrannyofconvenience grassroot FreeLibreOpen g20 rig bekannt farmersprotest protests riseup sflc DanniVive apt reuse stopspyingonus keepiton FSFE20 fsfe softwarefreedom ilovefs ann activist xr SustainableUserFreedom bannerlord seachange directaction eff change openrightsgroup protest icantbreathe JeffreySDukes actiondirecte kroymann HS2 ngo MarcWittmann fsf fsfi StopHS2 grassroots HS2Rebellion antireport ClimateJustice BLM ExtinctionRebellion namechange changeisinyourhands conservancy ngos sp JefferySaunders LiliannePloumen climatechangeadaptation Kolektiva XR freeolabini announcement isolateByoblu annieleonard - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT questions askmastodon askfedi question askmasto askfediverse totallyaskingforafriend ask askfosstodon - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT birds - RainbowBeeEater pigeon cawbird pigeonlover bird birdwatch + RainbowBeeEater pigeon cawbird pigeonlover bird birdwatch birding birdwatching - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT ethics digitalethics ethics ethicallicense license ethical - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT disability ableism disabled - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT podcasts - podcasting IntergalacticWasabiHour podcast tilde til postmarketOSpodcast tilderadio tildes podcasts tildeverse smallisbeautiful fertilizers tilvids + podcasting IntergalacticWasabiHour podcast tilde til postmarketOSpodcast tilderadio tildes podcasts tildeverse smallisbeautiful fertilizers tilvids qtile - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT culture etiquette - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT funding - donate disabilitycrowdfund disabledcrowdfund fundraiser BreakWalledGardens ngizero zeroknowledge edge led patreon + donate disabilitycrowdfund disabledcrowdfund alledoerferbleiben fundraiser BreakWalledGardens knowledge ngizero zeroknowledge edge led patreon - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT identity boomer - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT + + + licenses + commongoods tootle copyright creative common gpl copyrightlaw tragedyofthecommons cc0 creativecommons commongood cc + + Sun, 07 Mar 2021 20:25:51 UT political - copservation rog linguisticProgramming + copservation progress rog house progressivehouse linguisticProgramming - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT fashion brasil fashionistas fashionesta bras fashionista fashion punkwear socks patches feditats zebras - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT techbros securedrop einfachredeneben coloredpencil redhat hackernews red reddit redis - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT + + + bots + human bot Militanzverbot botanists humanity militanzverbot humanrobotinteraction + + Sun, 07 Mar 2021 20:25:51 UT month april july march chapril october november august june blackherstorymonth december september may feburary jejune january blackhistorymonth month blacktheirstorymonth - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT welfare universalcredit welfare credit - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT books - justhollythings bookclub earthsea ebooks docbook book amreading republicday failbook bookwyrm bookreview reading theLibrary wayfarers fakebook books bookreviews ebook epub cookbook AnarchoBookClub + justhollythings bookclub earthsea ebooks docbook book public amreading republicday failbook bookwyrm bookreview reading theLibrary wayfarers fakebook books bookreviews ebook wikibooks epub cookbook AnarchoBookClub - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT comedy laugh farce humour satire irony standup funny humor - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT health - medical burnout cannabis medicine run treatment EmotionalFirstAid safeabortion4all maryjane autistic neurodivergent health motion actuallyautistic meds marijuana mentalhealth healthy neurodiverse asperger autismus + medical burnout cannabis medicine run treatment EmotionalFirstAid safeabortion4all maryjane autistic running neurodivergent health motion actuallyautistic meds marijuana mentalhealth H5N8 healthy neurodiverse asperger autismus - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT + + + introductions + reintroductions newhere firsttoot recommends Introduction Introductions introductons introduction intro introductions + + Sun, 07 Mar 2021 20:25:51 UT facts funfact didyouknow lifehack - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT ai machinelearning - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT seasons - spring autumn abolishice winter ice santa summer onlyoffice icedipping solstice wintersolstice summerRolls pin + spring autumn abolishice office winter ice santa summer onlyoffice icedipping solstice unicef wintersolstice summerRolls pin - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT commons - opennmsgroup open openocd opennms opennmt + opennmsgroup open openocd opennms openworlds openinnovation opennmt openweb - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT philosophy - minimalism maximalist maximalism philosophy stoic postmodernism minimalist + minimalism maximalist maximalism digitalminimalism philosophy stoic postmodernism minimalist - Thu, 18 Feb 2021 21:34:48 UT - - - introductions - newhere firsttoot recommends Introduction Introductions introduction intro introductions - - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT education SchoolForAfrica education teach tutorial - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT scifi - startrekdiscovery startrek discover SoftwareJob starwars war babylon5 + startrekdiscovery startrek bitwarden discover SoftwareJob starwars war babylon5 - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT privacy - SearchHistory privacyaware dataprivacyday profiling surveillancestate Privacy privacypolicy makeprivacystick surveillancetech privacymatters policy whatsappprivacypolicy surveillance dataprivacy privacywashing privacy DataPrivacyDay2020 WhatsappPrivacy + SearchHistory privacyaware dataprivacyday profiling surveillancestate Privacy privacypolicy privacytoolsio makeprivacystick surveillancetech developertools tools privacymatters policy whatsappprivacypolicy surveillance dataprivacy privacywashing privacy DataPrivacyDay2020 WhatsappPrivacy - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT - bots - bot Militanzverbot botanists militanzverbot humanrobotinteraction + photography + pea landscapephotography landscapeart XSystem darktable hippeastrum landscape - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT microcontroller e microcontroller troll arduinoide arduino - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT religion neopagan pagan catholic paganism genesis - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT + + + design + userfriendly + + Sun, 07 Mar 2021 20:25:51 UT + + + other + Lastpass itscomplicated misc biomass ass assassinfly decluttering OCUPACAOCARLOSMARIGHELLA + + Sun, 07 Mar 2021 20:25:51 UT help mastohelp helpful help - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT obituaries tripadvisor rip - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT - licenses - tootle copyright creative common gpl copyrightlaw creativecommons + garbage + no QAnonAnonymous cum u ChanCulture - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT accessibility a11y - Thu, 18 Feb 2021 21:34:48 UT - - - photography - landscapephotography landscapeart darktable landscape - - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT election Rainbowvote voted vote - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT moderation fedblock - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT entertainment legallyblonde watching Thundercat makingof entertainment me un nowwatching themandalorian nt - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT languages lojban gaelic - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT environment s clim climatechaos - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT - #music - trance + microcontrollers + esp32c3 esp8266 esp32 - Thu, 18 Feb 2021 21:34:48 UT - - - garbage - QAnonAnonymous ChanCulture - - Thu, 18 Feb 2021 21:34:48 UT - - - other - itscomplicated misc ass OCUPACAOCARLOSMARIGHELLA - - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT scotland glasgow highlands edinburgh loch - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT transport deutsch deutschebahn - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT agriculture farmers - Thu, 18 Feb 2021 21:34:48 UT - - - #software - flatpak - - Thu, 18 Feb 2021 21:34:48 UT - - - microcontrollers - esp8266 esp32 - - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT france Macronavirus - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT travel travel taxi airtravel - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT architecture concrete - Thu, 18 Feb 2021 21:34:48 UT + Sun, 07 Mar 2021 20:25:51 UT From 9a711264ae117700e26cd43756e9ec8604c83dff Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Mar 2021 10:20:45 +0000 Subject: [PATCH 0353/1416] Translations --- defaultwelcome/help_dm_de.md | 3 +++ defaultwelcome/help_dm_fr.md | 3 +++ defaultwelcome/help_inbox_de.md | 19 +++++++++++++++++++ defaultwelcome/help_inbox_fr.md | 19 +++++++++++++++++++ defaultwelcome/help_outbox_de.md | 1 + defaultwelcome/help_outbox_fr.md | 1 + defaultwelcome/help_tlblogs_de.md | 5 +++++ defaultwelcome/help_tlblogs_fr.md | 5 +++++ defaultwelcome/help_tlbookmarks_de.md | 1 + defaultwelcome/help_tlbookmarks_fr.md | 1 + defaultwelcome/help_tlmedia_de.md | 1 + defaultwelcome/help_tlmedia_fr.md | 1 + defaultwelcome/help_tlshares_de.md | 6 ++++++ defaultwelcome/help_tlshares_fr.md | 6 ++++++ 14 files changed, 72 insertions(+) create mode 100644 defaultwelcome/help_dm_de.md create mode 100644 defaultwelcome/help_dm_fr.md create mode 100644 defaultwelcome/help_inbox_de.md create mode 100644 defaultwelcome/help_inbox_fr.md create mode 100644 defaultwelcome/help_outbox_de.md create mode 100644 defaultwelcome/help_outbox_fr.md create mode 100644 defaultwelcome/help_tlblogs_de.md create mode 100644 defaultwelcome/help_tlblogs_fr.md create mode 100644 defaultwelcome/help_tlbookmarks_de.md create mode 100644 defaultwelcome/help_tlbookmarks_fr.md create mode 100644 defaultwelcome/help_tlmedia_de.md create mode 100644 defaultwelcome/help_tlmedia_fr.md create mode 100644 defaultwelcome/help_tlshares_de.md create mode 100644 defaultwelcome/help_tlshares_fr.md diff --git a/defaultwelcome/help_dm_de.md b/defaultwelcome/help_dm_de.md new file mode 100644 index 000000000..ea9ec03b9 --- /dev/null +++ b/defaultwelcome/help_dm_de.md @@ -0,0 +1,3 @@ +Direktnachrichten werden hier als chronologische Zeitleiste angezeigt. + +Um Spam zu vermeiden und die Sicherheit zu verbessern, können Sie standardmäßig nur Direktnachrichten *von Personen empfangen, denen Sie folgen*. Sie können dies bei Bedarf in Ihren Profileinstellungen deaktivieren, indem Sie das oberste **Banner** und dann das **Bearbeitungssymbol** auswählen. diff --git a/defaultwelcome/help_dm_fr.md b/defaultwelcome/help_dm_fr.md new file mode 100644 index 000000000..0f2611702 --- /dev/null +++ b/defaultwelcome/help_dm_fr.md @@ -0,0 +1,3 @@ +Les messages directs apparaîtront ici, sous forme de chronologie. + +Pour éviter les spams et améliorer la sécurité, vous ne pourrez par défaut recevoir que des messages directs *des personnes que vous suivez*. Vous pouvez désactiver cette option dans les paramètres de votre profil si nécessaire, en sélectionnant la **bannière** supérieure, puis l'icône **modifier**. diff --git a/defaultwelcome/help_inbox_de.md b/defaultwelcome/help_inbox_de.md new file mode 100644 index 000000000..cddaa9182 --- /dev/null +++ b/defaultwelcome/help_inbox_de.md @@ -0,0 +1,19 @@ +Eingehende Beiträge werden hier als chronologische Zeitleiste angezeigt. Wenn Sie Beiträge senden, werden diese auch hier angezeigt. + +### Das oberste Banner +Am oberen Bildschirmrand können Sie das **Banner** auswählen, um zu Ihrem Profil zu wechseln, es zu bearbeiten oder sich abzumelden. + +### Timeline-Schaltflächen und -Symbole +Mit den **Schaltflächen** unter dem oberen Banner können Sie verschiedene Zeitleisten auswählen. Es gibt auch **Symbole** auf der rechten Seite zum **Suchen**, Anzeigen Ihres **Kalenders** oder Erstellen **neuer Beiträge**. + +Mit dem Symbol **Einblenden/Ausblenden** können mehr Timeline-Schaltflächen sowie Moderatorsteuerelemente angezeigt werden. + +### Linke Spalte +Hier können Sie **nützliche Links** hinzufügen. Dies wird nur auf Desktop-Displays oder Geräten mit größeren Bildschirmen angezeigt. Es ist ähnlich wie bei einem *Blogroll*. Sie können Links nur hinzufügen oder bearbeiten, wenn Sie eine **Administrator** - oder **Editor** -Rolle haben. + +Wenn Sie mobil sind, verwenden Sie das **Links-Symbol** oben, um Nachrichten zu lesen. + +### Rechte Spalte +RSS-Feeds können in der rechten Spalte hinzugefügt werden, die als *newswire* bezeichnet wird. Dies wird nur auf Desktop-Displays oder Geräten mit größeren Bildschirmen angezeigt. Sie können Feeds nur hinzufügen oder bearbeiten, wenn Sie eine **Administrator** - oder **Editor** -Rolle haben. Eingehende Feed-Elemente können ebenfalls moderiert werden. + +Wenn Sie mobil sind, verwenden Sie das **Newswire-Symbol** oben, um Nachrichten zu lesen. diff --git a/defaultwelcome/help_inbox_fr.md b/defaultwelcome/help_inbox_fr.md new file mode 100644 index 000000000..2d9c0842c --- /dev/null +++ b/defaultwelcome/help_inbox_fr.md @@ -0,0 +1,19 @@ +Les messages entrants apparaîtront ici, sous forme de chronologie. Si vous envoyez des messages, ils apparaîtront également ici. + +### La bannière du haut +En haut de l'écran, vous pouvez sélectionner la **bannière** pour passer à votre profil, le modifier ou vous déconnecter. + +### Boutons et icônes de la chronologie +Les **boutons** sous la bannière du haut vous permettent de sélectionner différentes chronologies. Il y a aussi des **icônes** sur la droite pour **rechercher**, afficher votre **calendrier** ou créer **de nouveaux messages**. + +L'icône **afficher/masquer** permet d'afficher plus de boutons de chronologie, ainsi que les commandes du modérateur. + +### Colonne de gauche +Ici, vous pouvez ajouter des **liens utiles**. Cela n'apparaît que sur les écrans de bureau ou les appareils avec des écrans plus grands. C'est similaire à un *blogroll*. Vous ne pouvez ajouter ou modifier des liens que si vous avez un rôle **administrateur** ou **éditeur**. + +Si vous êtes sur mobile, utilisez l'icône **liens** en haut pour lire les actualités. + +### Colonne de droite +Les flux RSS peuvent être ajoutés dans la colonne de droite, connue sous le nom de *newswire*. Cela n'apparaît que sur les écrans de bureau ou les appareils avec des écrans plus grands. Vous ne pouvez ajouter ou modifier des flux que si vous avez un rôle **administrateur** ou **rédacteur**, et les éléments de flux entrants peuvent également être modérés. + +Si vous êtes sur mobile, utilisez l'icône **Newswire** en haut pour lire les actualités. diff --git a/defaultwelcome/help_outbox_de.md b/defaultwelcome/help_outbox_de.md new file mode 100644 index 000000000..711f22d6f --- /dev/null +++ b/defaultwelcome/help_outbox_de.md @@ -0,0 +1 @@ +Ihre gesendeten Beiträge werden hier als chronologische Zeitleiste angezeigt. diff --git a/defaultwelcome/help_outbox_fr.md b/defaultwelcome/help_outbox_fr.md new file mode 100644 index 000000000..cd68eda3a --- /dev/null +++ b/defaultwelcome/help_outbox_fr.md @@ -0,0 +1 @@ +Vos messages envoyés apparaîtront ici, sous forme de chronologie. diff --git a/defaultwelcome/help_tlblogs_de.md b/defaultwelcome/help_tlblogs_de.md new file mode 100644 index 000000000..e8f66974a --- /dev/null +++ b/defaultwelcome/help_tlblogs_de.md @@ -0,0 +1,5 @@ +Diese Zeitleiste enthält alle Blogs, die von Ihnen oder anderen Personen, denen Sie folgen, geschrieben wurden. + +Sie können einen neuen Blog-Beitrag mit dem Symbol **Veröffentlichen** oben in der rechten Spalte erstellen. + +Blog-Beiträge unterscheiden sich von normalen Fediverse-Beiträgen. Sie verwenden den Typ ActivityPub *Article*, der für das Schreiben in Langform vorgesehen ist. Sie können auch Zitate haben, die aus Elementen im Newswire ausgewählt wurden. diff --git a/defaultwelcome/help_tlblogs_fr.md b/defaultwelcome/help_tlblogs_fr.md new file mode 100644 index 000000000..c3e890241 --- /dev/null +++ b/defaultwelcome/help_tlblogs_fr.md @@ -0,0 +1,5 @@ +Cette chronologie contient tous les blogs écrits par vous ou par toute personne que vous suivez. + +Vous pouvez créer un nouvel article de blog à l'aide de l'icône **publier** en haut de la colonne de droite. + +Les articles de blog sont différents des articles de fediverse ordinaires. Ils utilisent le type ActivityPub *Article*, qui est destiné à la rédaction longue. Ils peuvent également avoir des citations, sélectionnées parmi les éléments du fil de presse. diff --git a/defaultwelcome/help_tlbookmarks_de.md b/defaultwelcome/help_tlbookmarks_de.md new file mode 100644 index 000000000..e76f4176d --- /dev/null +++ b/defaultwelcome/help_tlbookmarks_de.md @@ -0,0 +1 @@ +Alle mit Lesezeichen versehenen Beiträge werden hier angezeigt. diff --git a/defaultwelcome/help_tlbookmarks_fr.md b/defaultwelcome/help_tlbookmarks_fr.md new file mode 100644 index 000000000..c5aeaf412 --- /dev/null +++ b/defaultwelcome/help_tlbookmarks_fr.md @@ -0,0 +1 @@ +Tous les messages mis en signet apparaissent ici. diff --git a/defaultwelcome/help_tlmedia_de.md b/defaultwelcome/help_tlmedia_de.md new file mode 100644 index 000000000..b0da3e617 --- /dev/null +++ b/defaultwelcome/help_tlmedia_de.md @@ -0,0 +1 @@ +Alle eingehenden Beiträge, die **Bilder**, **Video** oder **Audiodateien** enthalten, werden hier zusammen mit ihren Beschreibungen angezeigt. diff --git a/defaultwelcome/help_tlmedia_fr.md b/defaultwelcome/help_tlmedia_fr.md new file mode 100644 index 000000000..6c1a00287 --- /dev/null +++ b/defaultwelcome/help_tlmedia_fr.md @@ -0,0 +1 @@ +Tous les messages entrants contenant des fichiers **images**, **vidéo** ou **audio** apparaîtront ici, avec leurs descriptions. diff --git a/defaultwelcome/help_tlshares_de.md b/defaultwelcome/help_tlshares_de.md new file mode 100644 index 000000000..d46bd9ae6 --- /dev/null +++ b/defaultwelcome/help_tlshares_de.md @@ -0,0 +1,6 @@ +### Freigegebene Elemente +Dies sind in der Regel physische Objekte oder lokale Dienste, die ohne Verwendung von Geld ausgetauscht oder verschenkt werden. + +Beispielsweise möchten Sie möglicherweise **Ausrüstung** zwischen Mitgliedern eines Sportteams auf derselben Instanz teilen, überschüssige **Kleidung** teilen, **Geräte** teilen, die Sie nicht mehr verwenden, oder Pflanzen und teilen Gartenarbeit **Werkzeuge** zwischen Menschen, die den gleichen Anbauraum nutzen. + +Um Spam zu vermeiden, werden freigegebene Elemente nicht über ActivityPub zusammengeschlossen und sind für Mitglieder derselben Instanz lokal. diff --git a/defaultwelcome/help_tlshares_fr.md b/defaultwelcome/help_tlshares_fr.md new file mode 100644 index 000000000..4702cf0b8 --- /dev/null +++ b/defaultwelcome/help_tlshares_fr.md @@ -0,0 +1,6 @@ +### Éléments partagés +Ce sont généralement des objets physiques ou des services locaux, échangés ou donnés sans utilisation d'argent. + +Par exemple, vous souhaiterez peut-être partager **l'équipement** entre les membres d'une équipe sportive sur la même instance, partager les **vêtements** excédentaires, partager **gadgets** que vous n'utilisez plus, ou partager des plantes et jardinage **outils** entre personnes utilisant le même espace de culture. + +Pour éviter le spam, les éléments partagés ne sont pas fédérés via ActivityPub et sont locaux pour les membres de la même instance. From 9d568290ef618549128e2b368f7b7335d1a74761 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Mar 2021 11:22:43 +0000 Subject: [PATCH 0354/1416] Translations --- defaultwelcome/help_dm_ca.md | 3 +++ defaultwelcome/help_dm_es.md | 3 +++ defaultwelcome/help_dm_it.md | 3 +++ defaultwelcome/help_dm_ku.md | 3 +++ defaultwelcome/help_dm_pt.md | 3 +++ defaultwelcome/help_inbox_ca.md | 19 +++++++++++++++++++ defaultwelcome/help_inbox_es.md | 19 +++++++++++++++++++ defaultwelcome/help_inbox_it.md | 19 +++++++++++++++++++ defaultwelcome/help_inbox_ku.md | 19 +++++++++++++++++++ defaultwelcome/help_inbox_pt.md | 19 +++++++++++++++++++ defaultwelcome/help_outbox_ca.md | 1 + defaultwelcome/help_outbox_es.md | 1 + defaultwelcome/help_outbox_it.md | 1 + defaultwelcome/help_outbox_ku.md | 1 + defaultwelcome/help_outbox_pt.md | 1 + defaultwelcome/help_tlblogs_ca.md | 5 +++++ defaultwelcome/help_tlblogs_es.md | 5 +++++ defaultwelcome/help_tlblogs_it.md | 5 +++++ defaultwelcome/help_tlblogs_ku.md | 5 +++++ defaultwelcome/help_tlblogs_pt.md | 5 +++++ defaultwelcome/help_tlbookmarks_ca.md | 1 + defaultwelcome/help_tlbookmarks_es.md | 1 + defaultwelcome/help_tlbookmarks_it.md | 1 + defaultwelcome/help_tlbookmarks_ku.md | 1 + defaultwelcome/help_tlbookmarks_pt.md | 1 + defaultwelcome/help_tlmedia_ca.md | 1 + defaultwelcome/help_tlmedia_es.md | 1 + defaultwelcome/help_tlmedia_it.md | 1 + defaultwelcome/help_tlmedia_ku.md | 1 + defaultwelcome/help_tlmedia_pt.md | 1 + defaultwelcome/help_tlshares_ca.md | 6 ++++++ defaultwelcome/help_tlshares_es.md | 6 ++++++ defaultwelcome/help_tlshares_it.md | 6 ++++++ defaultwelcome/help_tlshares_ku.md | 6 ++++++ defaultwelcome/help_tlshares_pt.md | 6 ++++++ 35 files changed, 180 insertions(+) create mode 100644 defaultwelcome/help_dm_ca.md create mode 100644 defaultwelcome/help_dm_es.md create mode 100644 defaultwelcome/help_dm_it.md create mode 100644 defaultwelcome/help_dm_ku.md create mode 100644 defaultwelcome/help_dm_pt.md create mode 100644 defaultwelcome/help_inbox_ca.md create mode 100644 defaultwelcome/help_inbox_es.md create mode 100644 defaultwelcome/help_inbox_it.md create mode 100644 defaultwelcome/help_inbox_ku.md create mode 100644 defaultwelcome/help_inbox_pt.md create mode 100644 defaultwelcome/help_outbox_ca.md create mode 100644 defaultwelcome/help_outbox_es.md create mode 100644 defaultwelcome/help_outbox_it.md create mode 100644 defaultwelcome/help_outbox_ku.md create mode 100644 defaultwelcome/help_outbox_pt.md create mode 100644 defaultwelcome/help_tlblogs_ca.md create mode 100644 defaultwelcome/help_tlblogs_es.md create mode 100644 defaultwelcome/help_tlblogs_it.md create mode 100644 defaultwelcome/help_tlblogs_ku.md create mode 100644 defaultwelcome/help_tlblogs_pt.md create mode 100644 defaultwelcome/help_tlbookmarks_ca.md create mode 100644 defaultwelcome/help_tlbookmarks_es.md create mode 100644 defaultwelcome/help_tlbookmarks_it.md create mode 100644 defaultwelcome/help_tlbookmarks_ku.md create mode 100644 defaultwelcome/help_tlbookmarks_pt.md create mode 100644 defaultwelcome/help_tlmedia_ca.md create mode 100644 defaultwelcome/help_tlmedia_es.md create mode 100644 defaultwelcome/help_tlmedia_it.md create mode 100644 defaultwelcome/help_tlmedia_ku.md create mode 100644 defaultwelcome/help_tlmedia_pt.md create mode 100644 defaultwelcome/help_tlshares_ca.md create mode 100644 defaultwelcome/help_tlshares_es.md create mode 100644 defaultwelcome/help_tlshares_it.md create mode 100644 defaultwelcome/help_tlshares_ku.md create mode 100644 defaultwelcome/help_tlshares_pt.md diff --git a/defaultwelcome/help_dm_ca.md b/defaultwelcome/help_dm_ca.md new file mode 100644 index 000000000..2c0386a8b --- /dev/null +++ b/defaultwelcome/help_dm_ca.md @@ -0,0 +1,3 @@ +Els missatges directes apareixeran aquí com a cronologia cronològica. + +Per evitar el correu brossa i millorar la seguretat, de manera predeterminada només podreu rebre missatges directes *de persones que seguiu*. Podeu desactivar aquesta opció a la configuració del vostre perfil, si cal, seleccionant el **bàner superior** i, a continuació, la icona **edita**. diff --git a/defaultwelcome/help_dm_es.md b/defaultwelcome/help_dm_es.md new file mode 100644 index 000000000..03bdf082b --- /dev/null +++ b/defaultwelcome/help_dm_es.md @@ -0,0 +1,3 @@ +Los mensajes directos aparecerán aquí, como una línea de tiempo cronológica. + +Para evitar el spam y mejorar la seguridad, de forma predeterminada, solo podrá recibir mensajes directos *de las personas a las que sigue*. Puede desactivar esto dentro de la configuración de su perfil si es necesario, seleccionando el **banner** superior y luego el icono **editar**. diff --git a/defaultwelcome/help_dm_it.md b/defaultwelcome/help_dm_it.md new file mode 100644 index 000000000..03bdf082b --- /dev/null +++ b/defaultwelcome/help_dm_it.md @@ -0,0 +1,3 @@ +Los mensajes directos aparecerán aquí, como una línea de tiempo cronológica. + +Para evitar el spam y mejorar la seguridad, de forma predeterminada, solo podrá recibir mensajes directos *de las personas a las que sigue*. Puede desactivar esto dentro de la configuración de su perfil si es necesario, seleccionando el **banner** superior y luego el icono **editar**. diff --git a/defaultwelcome/help_dm_ku.md b/defaultwelcome/help_dm_ku.md new file mode 100644 index 000000000..b42081ee6 --- /dev/null +++ b/defaultwelcome/help_dm_ku.md @@ -0,0 +1,3 @@ +Dê peyamên rasterast li vir, wekî demek kronolojîk, xuya bibin. + +Ji bo ku xwe ji spamê nehêlin û ewlehiyê baştir bikin, bi default hûn ê tenê karibin peyamên rasterast ji kesên ku hûn dişopînin bistînin. Heke hûn hewce ne, hûn dikarin vê yekê di nav vesazên profîla xwe de vemirînin, bi hilbijartina jor **banner** û dûv re îkona **edit**. diff --git a/defaultwelcome/help_dm_pt.md b/defaultwelcome/help_dm_pt.md new file mode 100644 index 000000000..e6040f89c --- /dev/null +++ b/defaultwelcome/help_dm_pt.md @@ -0,0 +1,3 @@ +As mensagens diretas aparecerão aqui, como uma linha do tempo cronológica. + +Para evitar spam e melhorar a segurança, por padrão, você só poderá receber mensagens diretas *das pessoas que está seguindo*. Você pode desativar isso nas configurações de seu perfil, se necessário, selecionando o **banner** superior e, em seguida, o ícone **editar**. diff --git a/defaultwelcome/help_inbox_ca.md b/defaultwelcome/help_inbox_ca.md new file mode 100644 index 000000000..cfcf96064 --- /dev/null +++ b/defaultwelcome/help_inbox_ca.md @@ -0,0 +1,19 @@ +Les publicacions entrants apareixeran aquí, com a cronologia cronològica. Si envieu missatges, també apareixeran aquí. + +### El bàner superior +A la part superior de la pantalla, podeu seleccionar el **bàner** per canviar al vostre perfil, editar-lo o tancar la sessió. + +### Botons i icones de la cronologia +Els **botons** que hi ha a sota del bàner superior us permeten seleccionar diferents terminis. També hi ha **icones** a la dreta per **cercar**, veure el vostre **calendari** o crear **noves publicacions**. + +La icona **mostra/amaga** permet mostrar més botons de cronologia, juntament amb controls de moderador. + +### Columna esquerra +Aquí podeu afegir **enllaços útils**. Això només apareix a les pantalles d'escriptori o als dispositius amb pantalles més grans. És similar a un *blogroll*. Només podeu afegir o editar enllaços si teniu un rol d’administrador **o d’editor**. + +Si esteu al mòbil, feu servir la icona d’enllaços a la part superior per llegir les notícies. + +### Columna dreta +Els canals RSS es poden afegir a la columna de la dreta, coneguda com a *newswire*. Això només apareix en pantalles d'escriptori o dispositius amb pantalles més grans. Només podeu afegir o editar feeds si teniu un rol d’administrador **o d’editor** i també es poden moderar els elements de feeds entrants. + +Si esteu al mòbil, utilitzeu la **icona de newswire** a la part superior per llegir les notícies. diff --git a/defaultwelcome/help_inbox_es.md b/defaultwelcome/help_inbox_es.md new file mode 100644 index 000000000..d86e4a9c7 --- /dev/null +++ b/defaultwelcome/help_inbox_es.md @@ -0,0 +1,19 @@ +Las publicaciones entrantes aparecerán aquí, como una línea de tiempo cronológica. Si envía alguna publicación, también aparecerá aquí. + +### El banner superior +En la parte superior de la pantalla, puede seleccionar el **banner** para cambiar a su perfil y editarlo o cerrar la sesión. + +### Botones e íconos de la línea de tiempo +Los **botones** debajo del banner superior le permiten seleccionar diferentes líneas de tiempo. También hay **iconos** a la derecha para **buscar**, ver tu **calendario** o crear **publicaciones nuevas**. + +El icono **mostrar/ocultar** permite que se muestren más botones de la línea de tiempo, junto con los controles del moderador. + +### Columna izquierda +Aquí puede agregar **enlaces útiles**. Esto solo aparece en pantallas de escritorio o dispositivos con pantallas más grandes. Es similar a un *blogroll*. Solo puede agregar o editar enlaces si tiene una función de **administrador** o **editor**. + +Si está en un dispositivo móvil, use el **icono de enlaces** en la parte superior para leer las noticias. + +### Columna derecha +Las fuentes RSS se pueden agregar en la columna de la derecha, conocida como *newswire*. Esto solo aparece en pantallas de escritorio o dispositivos con pantallas más grandes. Solo puede agregar o editar feeds si tiene una función de **administrador** o **editor**, y los elementos entrantes del feed también se pueden moderar. + +Si está en un dispositivo móvil, use el **icono de newswire** en la parte superior para leer las noticias. diff --git a/defaultwelcome/help_inbox_it.md b/defaultwelcome/help_inbox_it.md new file mode 100644 index 000000000..d86e4a9c7 --- /dev/null +++ b/defaultwelcome/help_inbox_it.md @@ -0,0 +1,19 @@ +Las publicaciones entrantes aparecerán aquí, como una línea de tiempo cronológica. Si envía alguna publicación, también aparecerá aquí. + +### El banner superior +En la parte superior de la pantalla, puede seleccionar el **banner** para cambiar a su perfil y editarlo o cerrar la sesión. + +### Botones e íconos de la línea de tiempo +Los **botones** debajo del banner superior le permiten seleccionar diferentes líneas de tiempo. También hay **iconos** a la derecha para **buscar**, ver tu **calendario** o crear **publicaciones nuevas**. + +El icono **mostrar/ocultar** permite que se muestren más botones de la línea de tiempo, junto con los controles del moderador. + +### Columna izquierda +Aquí puede agregar **enlaces útiles**. Esto solo aparece en pantallas de escritorio o dispositivos con pantallas más grandes. Es similar a un *blogroll*. Solo puede agregar o editar enlaces si tiene una función de **administrador** o **editor**. + +Si está en un dispositivo móvil, use el **icono de enlaces** en la parte superior para leer las noticias. + +### Columna derecha +Las fuentes RSS se pueden agregar en la columna de la derecha, conocida como *newswire*. Esto solo aparece en pantallas de escritorio o dispositivos con pantallas más grandes. Solo puede agregar o editar feeds si tiene una función de **administrador** o **editor**, y los elementos entrantes del feed también se pueden moderar. + +Si está en un dispositivo móvil, use el **icono de newswire** en la parte superior para leer las noticias. diff --git a/defaultwelcome/help_inbox_ku.md b/defaultwelcome/help_inbox_ku.md new file mode 100644 index 000000000..72d534fd7 --- /dev/null +++ b/defaultwelcome/help_inbox_ku.md @@ -0,0 +1,19 @@ +Mesajên hatinê dê li vir, wekî demek kronolojîk xuya bikin. Ger hûn şandiyan bişînin ew ê jî li vir xuya bibin. + +### Pankarta jorîn +Li jor li ser ekranê hûn dikarin **pankarta** hilbijêrin da ku hûn profîla xwe veguherînin, û wê sererast bikin an jî derkevin. + +### Bişkojk û îkonên Timeline +Bişkojkên li jêr pankarta jorîn dihêlin hûn demjimêrên cihêreng hilbijêrin. Di heman demê de **îkonên** li rastê **lêgerîn**, dîtina **salnameya xwe** an afirandina **peyamên nû** hene. + +Nîşaneya **nîşan/veşêre** dihêle ku digel pêvekên moderator, bêtir bişkokên demjimêrê werin nîşandin. + +### Stûna çepê +Li vir hûn dikarin **girêdanên bikêr** zêde bikin. Ev tenê li ser dîmenderên sermaseyê an amûrên xwedan ekranên mezintir xuya dike. Ew dişibihe *blogroll*. Tenê heke we roleke **rêveber** an **edîtor** hebe hûn tenê dikarin girêdan lê zêde bikin an biguherînin. + +Heke hûn li ser mobîl in wê hingê ji bo xwendina nûçeyan **îkona girêdan** li jor bikar bînin. + +### Stûna rast +RSS-ê dikarin di stûna rastê de werin zêdekirin, ku wekî *nûçe* tê zanîn. Ev tenê li ser dîmenderên sermaseyê an amûrên xwedan ekranên mezintir xuya dike. Tenê heke we roleke **rêveber** an **edîtor** hebe hûn tenê dikarin pêvekan zêde bikin an biguhezînin, û hêmanên tewra tewra jî dikarin werin moderator kirin. + +Heke hûn li ser mobîl in wê hingê ji bo xwendina nûçeyan li jor îkona **newswire** bikar bînin. diff --git a/defaultwelcome/help_inbox_pt.md b/defaultwelcome/help_inbox_pt.md new file mode 100644 index 000000000..26288b193 --- /dev/null +++ b/defaultwelcome/help_inbox_pt.md @@ -0,0 +1,19 @@ +As postagens recebidas aparecerão aqui, como uma linha do tempo cronológica. Se você enviar alguma postagem, ela também aparecerá aqui. + +### O banner superior +Na parte superior da tela, você pode selecionar o **banner** para alternar para seu perfil e editá-lo ou fazer logout. + +### Botões e ícones da linha do tempo +Os **botões** abaixo do banner superior permitem que você selecione diferentes cronogramas. Também existem **ícones** à direita para **pesquisar**, visualizar sua **agenda** ou criar **novas postagens**. + +O ícone **mostrar / ocultar** permite que mais botões da linha do tempo sejam mostrados, junto com os controles do moderador. + +### Coluna esquerda +Aqui você pode adicionar **links úteis**. Isso só aparece em monitores de desktop ou dispositivos com telas maiores. É semelhante a um *blogroll*. Você só pode adicionar ou editar links se tiver uma função de **administrador** ou **editor**. + +Se você estiver no celular, use o **ícone de links** na parte superior para ler as notícias. + +### Coluna direita +Os feeds RSS podem ser adicionados na coluna da direita, conhecida como *newswire*. Isso só aparece em monitores de desktop ou dispositivos com telas maiores. Você só pode adicionar ou editar feeds se tiver uma função de **administrador** ou **editor**, e os itens de feed recebidos também podem ser moderados. + +Se você estiver no celular, use o **ícone de notícias** na parte superior para ler as notícias. diff --git a/defaultwelcome/help_outbox_ca.md b/defaultwelcome/help_outbox_ca.md new file mode 100644 index 000000000..589d3f385 --- /dev/null +++ b/defaultwelcome/help_outbox_ca.md @@ -0,0 +1 @@ +Les vostres publicacions enviades apareixeran aquí com a cronologia cronològica. diff --git a/defaultwelcome/help_outbox_es.md b/defaultwelcome/help_outbox_es.md new file mode 100644 index 000000000..e3b727621 --- /dev/null +++ b/defaultwelcome/help_outbox_es.md @@ -0,0 +1 @@ +Sus publicaciones enviadas aparecerán aquí, como una línea de tiempo cronológica. diff --git a/defaultwelcome/help_outbox_it.md b/defaultwelcome/help_outbox_it.md new file mode 100644 index 000000000..e3b727621 --- /dev/null +++ b/defaultwelcome/help_outbox_it.md @@ -0,0 +1 @@ +Sus publicaciones enviadas aparecerán aquí, como una línea de tiempo cronológica. diff --git a/defaultwelcome/help_outbox_ku.md b/defaultwelcome/help_outbox_ku.md new file mode 100644 index 000000000..2e3a644ad --- /dev/null +++ b/defaultwelcome/help_outbox_ku.md @@ -0,0 +1 @@ +Mesajên weyên şandî dê li vir, wekî demek kronolojîk, xuya bibin. diff --git a/defaultwelcome/help_outbox_pt.md b/defaultwelcome/help_outbox_pt.md new file mode 100644 index 000000000..959ebf47b --- /dev/null +++ b/defaultwelcome/help_outbox_pt.md @@ -0,0 +1 @@ +Suas postagens enviadas aparecerão aqui, como uma linha do tempo cronológica. diff --git a/defaultwelcome/help_tlblogs_ca.md b/defaultwelcome/help_tlblogs_ca.md new file mode 100644 index 000000000..ac51074e0 --- /dev/null +++ b/defaultwelcome/help_tlblogs_ca.md @@ -0,0 +1,5 @@ +Aquesta cronologia conté els blocs escrits per vosaltres o per qualsevol persona que seguiu. + +Podeu crear una publicació de bloc nova amb la icona de **publicar** a la part superior de la columna dreta. + +Les publicacions de bloc són diferents de les publicacions fediverses ordinàries. Utilitzen el tipus ActivityPub *Article*, destinat a escriure en format llarg. També poden tenir cites, seleccionades entre els elements del newswire. diff --git a/defaultwelcome/help_tlblogs_es.md b/defaultwelcome/help_tlblogs_es.md new file mode 100644 index 000000000..23b9d05f3 --- /dev/null +++ b/defaultwelcome/help_tlblogs_es.md @@ -0,0 +1,5 @@ +Esta línea de tiempo contiene cualquier blog escrito por usted o cualquier persona a la que esté siguiendo. + +Puede crear una nueva publicación de blog usando el ícono **publicar** en la parte superior de la columna de la derecha. + +Las publicaciones de blog son diferentes de las publicaciones normales de fediverse. Usan el tipo ActivityPub *Article*, que está destinado a la escritura de formato largo. También pueden tener citas, seleccionadas de elementos del newswire. diff --git a/defaultwelcome/help_tlblogs_it.md b/defaultwelcome/help_tlblogs_it.md new file mode 100644 index 000000000..23b9d05f3 --- /dev/null +++ b/defaultwelcome/help_tlblogs_it.md @@ -0,0 +1,5 @@ +Esta línea de tiempo contiene cualquier blog escrito por usted o cualquier persona a la que esté siguiendo. + +Puede crear una nueva publicación de blog usando el ícono **publicar** en la parte superior de la columna de la derecha. + +Las publicaciones de blog son diferentes de las publicaciones normales de fediverse. Usan el tipo ActivityPub *Article*, que está destinado a la escritura de formato largo. También pueden tener citas, seleccionadas de elementos del newswire. diff --git a/defaultwelcome/help_tlblogs_ku.md b/defaultwelcome/help_tlblogs_ku.md new file mode 100644 index 000000000..4b811d9c0 --- /dev/null +++ b/defaultwelcome/help_tlblogs_ku.md @@ -0,0 +1,5 @@ +Di vê demjimêrê de tevnvîsên ku hûn an jî kesê ku hûn dişopînin nivîsandî hene. + +Hûn dikarin li jor li ser stûna rastîn îkona **weşandin** bi posta tevnvîsek nû çêbikin. + +Mesajên blogê ji mesajên adetî yên federatê cuda ne. Ew celeb ActivityPub *Article* bikar tînin, ku ji bo nivîsandina dirêj-form tête armanc kirin. Di heman demê de ew dikarin sernavên ku ji nûçeyên tê de ji babetan hatine hilbijartin jî hebin. diff --git a/defaultwelcome/help_tlblogs_pt.md b/defaultwelcome/help_tlblogs_pt.md new file mode 100644 index 000000000..eab6e453b --- /dev/null +++ b/defaultwelcome/help_tlblogs_pt.md @@ -0,0 +1,5 @@ +Esta linha do tempo contém todos os blogs escritos por você ou alguém que você está seguindo. + +Você pode criar uma nova postagem no blog usando o ícone **publicar** na parte superior da coluna direita. + +As postagens do blog são diferentes das postagens comuns do fediverse. Eles usam o tipo ActivityPub *Artigo*, que se destina a redação longa. Eles também podem ter citações, selecionadas de itens no jornal. diff --git a/defaultwelcome/help_tlbookmarks_ca.md b/defaultwelcome/help_tlbookmarks_ca.md new file mode 100644 index 000000000..f27cc9ff3 --- /dev/null +++ b/defaultwelcome/help_tlbookmarks_ca.md @@ -0,0 +1 @@ +Aquí apareixen totes les publicacions marcades. diff --git a/defaultwelcome/help_tlbookmarks_es.md b/defaultwelcome/help_tlbookmarks_es.md new file mode 100644 index 000000000..7554dd08c --- /dev/null +++ b/defaultwelcome/help_tlbookmarks_es.md @@ -0,0 +1 @@ +Todas las publicaciones marcadas aparecen aquí. diff --git a/defaultwelcome/help_tlbookmarks_it.md b/defaultwelcome/help_tlbookmarks_it.md new file mode 100644 index 000000000..7554dd08c --- /dev/null +++ b/defaultwelcome/help_tlbookmarks_it.md @@ -0,0 +1 @@ +Todas las publicaciones marcadas aparecen aquí. diff --git a/defaultwelcome/help_tlbookmarks_ku.md b/defaultwelcome/help_tlbookmarks_ku.md new file mode 100644 index 000000000..5d2754907 --- /dev/null +++ b/defaultwelcome/help_tlbookmarks_ku.md @@ -0,0 +1 @@ +Her postên nîşankirî li vir xuya dike. diff --git a/defaultwelcome/help_tlbookmarks_pt.md b/defaultwelcome/help_tlbookmarks_pt.md new file mode 100644 index 000000000..e0d7a750b --- /dev/null +++ b/defaultwelcome/help_tlbookmarks_pt.md @@ -0,0 +1 @@ +Todas as postagens marcadas aparecem aqui. diff --git a/defaultwelcome/help_tlmedia_ca.md b/defaultwelcome/help_tlmedia_ca.md new file mode 100644 index 000000000..b48ee501e --- /dev/null +++ b/defaultwelcome/help_tlmedia_ca.md @@ -0,0 +1 @@ +Aquí apareixeran totes les publicacions entrants que continguin fitxers amb **imatges**, **vídeo** o **àudio**, juntament amb les seves descripcions. diff --git a/defaultwelcome/help_tlmedia_es.md b/defaultwelcome/help_tlmedia_es.md new file mode 100644 index 000000000..db122c8e4 --- /dev/null +++ b/defaultwelcome/help_tlmedia_es.md @@ -0,0 +1 @@ +Todas las publicaciones entrantes que contengan **imágenes**, **videos** o **archivos de audio** aparecerán aquí, junto con sus descripciones. diff --git a/defaultwelcome/help_tlmedia_it.md b/defaultwelcome/help_tlmedia_it.md new file mode 100644 index 000000000..db122c8e4 --- /dev/null +++ b/defaultwelcome/help_tlmedia_it.md @@ -0,0 +1 @@ +Todas las publicaciones entrantes que contengan **imágenes**, **videos** o **archivos de audio** aparecerán aquí, junto con sus descripciones. diff --git a/defaultwelcome/help_tlmedia_ku.md b/defaultwelcome/help_tlmedia_ku.md new file mode 100644 index 000000000..b8d2b92b8 --- /dev/null +++ b/defaultwelcome/help_tlmedia_ku.md @@ -0,0 +1 @@ +Mesajên hatinê yên ku pelên **nîgar**, **vîdeo** an **bihîstwerû** hene, digel vegotinên wan, dê li vir xuya bibin. diff --git a/defaultwelcome/help_tlmedia_pt.md b/defaultwelcome/help_tlmedia_pt.md new file mode 100644 index 000000000..117979191 --- /dev/null +++ b/defaultwelcome/help_tlmedia_pt.md @@ -0,0 +1 @@ +Todas as postagens recebidas que contenham arquivos de **imagens**, **vídeo** ou **áudio** aparecerão aqui, junto com suas descrições. diff --git a/defaultwelcome/help_tlshares_ca.md b/defaultwelcome/help_tlshares_ca.md new file mode 100644 index 000000000..f24b62281 --- /dev/null +++ b/defaultwelcome/help_tlshares_ca.md @@ -0,0 +1,6 @@ +### Elements compartits +Normalment es tracta d’objectes físics o serveis locals, intercanviats o cedits sense ús de diners. + +Per exemple, és possible que vulgueu compartir **equip** amb membres d’un equip esportiu en la mateixa instància, compartir qualsevol **vestimenta excedent**, compartir **gadgets** que ja no utilitzeu o compartir plantes i **eines** de jardineria entre persones que fan servir el mateix espai de cultiu. + +Per evitar el correu brossa, els elements compartits no estan federats mitjançant ActivityPub i són locals per als membres de la mateixa instància. diff --git a/defaultwelcome/help_tlshares_es.md b/defaultwelcome/help_tlshares_es.md new file mode 100644 index 000000000..494ce5fa2 --- /dev/null +++ b/defaultwelcome/help_tlshares_es.md @@ -0,0 +1,6 @@ +### Elementos compartidos +Por lo general, son objetos físicos o servicios locales, intercambiados o regalados sin usar dinero. + +Por ejemplo, es posible que desee compartir **equipo** entre miembros de un equipo deportivo en la misma instancia, compartir cualquier **ropa** sobrante, compartir **gadgets** que ya no usa o compartir plantas y **herramientas** de jardinería entre personas que utilizan el mismo espacio de cultivo. + +Para evitar el spam, los elementos compartidos no están federados a través de ActivityPub y son locales para los miembros de la misma instancia. diff --git a/defaultwelcome/help_tlshares_it.md b/defaultwelcome/help_tlshares_it.md new file mode 100644 index 000000000..494ce5fa2 --- /dev/null +++ b/defaultwelcome/help_tlshares_it.md @@ -0,0 +1,6 @@ +### Elementos compartidos +Por lo general, son objetos físicos o servicios locales, intercambiados o regalados sin usar dinero. + +Por ejemplo, es posible que desee compartir **equipo** entre miembros de un equipo deportivo en la misma instancia, compartir cualquier **ropa** sobrante, compartir **gadgets** que ya no usa o compartir plantas y **herramientas** de jardinería entre personas que utilizan el mismo espacio de cultivo. + +Para evitar el spam, los elementos compartidos no están federados a través de ActivityPub y son locales para los miembros de la misma instancia. diff --git a/defaultwelcome/help_tlshares_ku.md b/defaultwelcome/help_tlshares_ku.md new file mode 100644 index 000000000..b29a191c8 --- /dev/null +++ b/defaultwelcome/help_tlshares_ku.md @@ -0,0 +1,6 @@ +### Tiştên hevpar +Vana bi gelemperî tiştên fîzîkî an karûbarên herêmî ne, bêyî karanîna drav têne guhertin an têne dayîn. + +Mînakî, dibe ku hûn bixwazin **alavên** di navbera endamên tîmek werzîşê de li ser eynî mînakê parve bikin, cilûbergên zêde parve bikin, **alavên** ên ku hûn êdî naxwazin parve bikin, an nebat û baxçevanî **amûrên** di navbera mirovan de heman cîhê mezinbûnê bikar tînin. + +Ji bo ku spam dernekeve, tiştên parvekirî bi navgîniya ActivityPub nayên federasyon kirin û ji endamên li ser heman mîsalê re herêmî ne. diff --git a/defaultwelcome/help_tlshares_pt.md b/defaultwelcome/help_tlshares_pt.md new file mode 100644 index 000000000..e380e61d5 --- /dev/null +++ b/defaultwelcome/help_tlshares_pt.md @@ -0,0 +1,6 @@ +### Itens compartilhados +Normalmente são objetos físicos ou serviços locais, trocados ou doados sem uso de dinheiro. + +Por exemplo, você pode querer compartilhar **equipamentos** entre membros de uma equipe esportiva na mesma instância, compartilhar qualquer excesso de **roupas**, compartilhar **gadgets** que não está mais usando ou compartilhar plantas e **ferramentas** de jardinagem entre pessoas que usam o mesmo espaço de cultivo. + +Para evitar spam, os itens compartilhados não são federados via ActivityPub e são locais para membros na mesma instância. From 8920db9334a8d4ac85e15d9a8138876e1e127ad6 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Mar 2021 12:09:13 +0000 Subject: [PATCH 0355/1416] Translations --- defaultwelcome/help_dm_hi.md | 3 +++ defaultwelcome/help_dm_ja.md | 3 +++ defaultwelcome/help_dm_zh.md | 3 +++ defaultwelcome/help_inbox_hi.md | 19 +++++++++++++++++++ defaultwelcome/help_inbox_ja.md | 19 +++++++++++++++++++ defaultwelcome/help_inbox_zh.md | 19 +++++++++++++++++++ defaultwelcome/help_outbox_hi.md | 1 + defaultwelcome/help_outbox_ja.md | 1 + defaultwelcome/help_outbox_zh.md | 1 + defaultwelcome/help_tlblogs_hi.md | 5 +++++ defaultwelcome/help_tlblogs_ja.md | 5 +++++ defaultwelcome/help_tlblogs_zh.md | 5 +++++ defaultwelcome/help_tlbookmarks_hi.md | 1 + defaultwelcome/help_tlbookmarks_ja.md | 1 + defaultwelcome/help_tlbookmarks_zh.md | 1 + defaultwelcome/help_tlmedia_hi.md | 1 + defaultwelcome/help_tlmedia_ja.md | 1 + defaultwelcome/help_tlmedia_zh.md | 1 + defaultwelcome/help_tlshares_hi.md | 6 ++++++ defaultwelcome/help_tlshares_ja.md | 6 ++++++ defaultwelcome/help_tlshares_zh.md | 6 ++++++ 21 files changed, 108 insertions(+) create mode 100644 defaultwelcome/help_dm_hi.md create mode 100644 defaultwelcome/help_dm_ja.md create mode 100644 defaultwelcome/help_dm_zh.md create mode 100644 defaultwelcome/help_inbox_hi.md create mode 100644 defaultwelcome/help_inbox_ja.md create mode 100644 defaultwelcome/help_inbox_zh.md create mode 100644 defaultwelcome/help_outbox_hi.md create mode 100644 defaultwelcome/help_outbox_ja.md create mode 100644 defaultwelcome/help_outbox_zh.md create mode 100644 defaultwelcome/help_tlblogs_hi.md create mode 100644 defaultwelcome/help_tlblogs_ja.md create mode 100644 defaultwelcome/help_tlblogs_zh.md create mode 100644 defaultwelcome/help_tlbookmarks_hi.md create mode 100644 defaultwelcome/help_tlbookmarks_ja.md create mode 100644 defaultwelcome/help_tlbookmarks_zh.md create mode 100644 defaultwelcome/help_tlmedia_hi.md create mode 100644 defaultwelcome/help_tlmedia_ja.md create mode 100644 defaultwelcome/help_tlmedia_zh.md create mode 100644 defaultwelcome/help_tlshares_hi.md create mode 100644 defaultwelcome/help_tlshares_ja.md create mode 100644 defaultwelcome/help_tlshares_zh.md diff --git a/defaultwelcome/help_dm_hi.md b/defaultwelcome/help_dm_hi.md new file mode 100644 index 000000000..409e5773d --- /dev/null +++ b/defaultwelcome/help_dm_hi.md @@ -0,0 +1,3 @@ +प्रत्यक्ष संदेश यहां कालानुक्रमिक समय के रूप में दिखाई देंगे। + +स्पैम से बचने और सुरक्षा में सुधार करने के लिए, डिफ़ॉल्ट रूप से आप केवल उन लोगों से सीधे संदेश प्राप्त कर सकेंगे जो आप का अनुसरण कर रहे हैं। आप अपनी प्रोफ़ाइल सेटिंग्स के भीतर इसे बंद कर सकते हैं, अगर आपको ज़रूरत है, तो शीर्ष **बैनर** और फिर **संपादन** आइकन का चयन करके। diff --git a/defaultwelcome/help_dm_ja.md b/defaultwelcome/help_dm_ja.md new file mode 100644 index 000000000..b691e69f4 --- /dev/null +++ b/defaultwelcome/help_dm_ja.md @@ -0,0 +1,3 @@ +ダイレクトメッセージは、時系列のタイムラインとしてここに表示されます。 + +スパムを回避し、セキュリティを向上させるために、デフォルトでは、フォローしているユーザーからの直接メッセージのみを受信できます。 必要に応じて、上部のバナーを選択してから編集アイコンを選択することにより、プロファイル設定内でこれをオフにすることができます。 diff --git a/defaultwelcome/help_dm_zh.md b/defaultwelcome/help_dm_zh.md new file mode 100644 index 000000000..507aaf211 --- /dev/null +++ b/defaultwelcome/help_dm_zh.md @@ -0,0 +1,3 @@ +直接消息将按时间顺序显示在此处。 + +为了避免垃圾邮件并提高安全性,默认情况下,您只能接收来自您所关注人员的直接消息。 您可以根据需要在个人资料设置中将其关闭,方法是选择顶部横幅,然后选择编辑图标。 diff --git a/defaultwelcome/help_inbox_hi.md b/defaultwelcome/help_inbox_hi.md new file mode 100644 index 000000000..52fc3597f --- /dev/null +++ b/defaultwelcome/help_inbox_hi.md @@ -0,0 +1,19 @@ +आने वाली पोस्टें यहां कालानुक्रमिक समय के रूप में दिखाई देंगी। यदि आप कोई पोस्ट भेजते हैं तो वे भी यहाँ दिखाई देंगे। + +### शीर्ष बैनर +स्क्रीन के शीर्ष पर आप अपनी प्रोफ़ाइल पर जाने के लिए **बैनर** का चयन कर सकते हैं, और इसे संपादित या लॉग आउट कर सकते हैं। + +### समयरेखा बटन और आइकन +शीर्ष बैनर के नीचे **बटन** आपको विभिन्न समयसीमाओं का चयन करने की अनुमति देते हैं। **खोज** के दाईं ओर आइकन भी हैं, अपने **कैलेंडर** देखें या **नए पोस्ट** बनाएं। + +मॉडरेटर नियंत्रण के साथ **शो/हाइड** आइकन अधिक टाइमलाइन बटन दिखाने की अनुमति देता है। + +### बाएं स्तंभ +यहां आप **उपयोगी लिंक** जोड़ सकते हैं। यह केवल डेस्कटॉप डिस्प्ले या बड़ी स्क्रीन वाले उपकरणों पर दिखाई देता है। यह एक *ब्लॉगरोल* के समान है। यदि आपके पास **व्यवस्थापक** या **संपादक** भूमिका है, तो आप केवल लिंक जोड़ या संपादित कर सकते हैं। + +अगर आप मोबाइल पर हैं तो समाचार पढ़ने के लिए सबसे ऊपर **लिंक आइकन** का उपयोग करें। + +### दक्षिण पक्ष क़तार +RSS फ़ीड्स को सही कॉलम में जोड़ा जा सकता है, जिसे *newswire* के रूप में जाना जाता है। यह केवल डेस्कटॉप डिस्प्ले या बड़ी स्क्रीन वाले उपकरणों पर दिखाई देता है। आप केवल तभी जोड़ या संपादित कर सकते हैं जब आपके पास **व्यवस्थापक** या **संपादक** भूमिका हो, और आने वाली फ़ीड आइटम भी मॉडरेट की जा सकती हैं। + +यदि आप मोबाइल पर हैं तो समाचार पढ़ने के लिए सबसे ऊपर **newswire आइकन** का उपयोग करें। diff --git a/defaultwelcome/help_inbox_ja.md b/defaultwelcome/help_inbox_ja.md new file mode 100644 index 000000000..344320b0a --- /dev/null +++ b/defaultwelcome/help_inbox_ja.md @@ -0,0 +1,19 @@ +着信投稿は、時系列のタイムラインとしてここに表示されます。投稿を送信すると、ここにも表示されます。 + +### トップバナー +画面の上部で、**バナー**を選択してプロファイルに切り替え、編集またはログアウトできます。 + +###タイムラインのボタンとアイコン +上部のバナーの下にある**ボタン**を使用すると、さまざまなタイムラインを選択できます。 **検索**、**カレンダー**の表示、または**新しい投稿**の作成の右側には**アイコン**もあります。 + +**表示/非表示**アイコンを使用すると、モデレーターコントロールとともに、より多くのタイムラインボタンを表示できます。 + +### 左の列 +ここで**便利なリンク**を追加できます。これは、デスクトップディスプレイまたは大画面のデバイスにのみ表示されます。これは* blogroll *に似ています。リンクを追加または編集できるのは、**管理者**または**編集者**の役割がある場合のみです。 + +モバイルを使用している場合は、上部にある**リンクアイコン**を使用してニュースを読んでください。 + +### 右の列 +RSSフィードは、* newswire *と呼ばれる右側の列に追加できます。これは、デスクトップディスプレイまたは大画面のデバイスにのみ表示されます。フィードを追加または編集できるのは、**管理者**または**編集者**の役割がある場合のみです。また、受信フィードアイテムをモデレートすることもできます。 + +モバイルを使用している場合は、上部にある**ニュースワイヤーアイコン**を使用してニュースを読んでください。 diff --git a/defaultwelcome/help_inbox_zh.md b/defaultwelcome/help_inbox_zh.md new file mode 100644 index 000000000..363a450ae --- /dev/null +++ b/defaultwelcome/help_inbox_zh.md @@ -0,0 +1,19 @@ +收到的帖子将按时间顺序显示在此处。如果您发送任何帖子,它们也会显示在这里。 + +### 最高横幅 +在屏幕顶部,您可以选择横幅以切换到您的个人资料,然后对其进行编辑或注销。 + +### 时间轴按钮和图标 +顶部横幅下方的按钮使您可以选择不同的时间轴。右侧也有图标可以搜索,查看日历或创建新帖子。 + +显示/隐藏图标允许显示更多时间线按钮以及主持人控件。 + +### 左栏 +您可以在此处添加有用的链接。它仅出现在台式机显示器或具有更大屏幕的设备上。它类似于博客卷。如果您具有管理员或编辑者角色,则只能添加或编辑链接。 + +如果您在移动设备上,请使用顶部的链接图标阅读新闻。 + +### 右列 +可以在右侧栏(称为新闻专线)中添加RSS提要。它仅出现在台式机显示器或具有更大屏幕的设备上。如果您具有管理员或编辑者角色,则只能添加或编辑提要,并且传入提要项目也可以被审核。 + +如果您在移动设备上,请使用顶部的新闻专线图标阅读新闻。 diff --git a/defaultwelcome/help_outbox_hi.md b/defaultwelcome/help_outbox_hi.md new file mode 100644 index 000000000..6f8fa7eb4 --- /dev/null +++ b/defaultwelcome/help_outbox_hi.md @@ -0,0 +1 @@ +आपके भेजे गए पोस्ट यहाँ दिखाई देंगे, कालानुक्रमिक समय के रूप में। diff --git a/defaultwelcome/help_outbox_ja.md b/defaultwelcome/help_outbox_ja.md new file mode 100644 index 000000000..1d7eeb3e2 --- /dev/null +++ b/defaultwelcome/help_outbox_ja.md @@ -0,0 +1 @@ +送信した投稿は、時系列のタイムラインとしてここに表示されます。 diff --git a/defaultwelcome/help_outbox_zh.md b/defaultwelcome/help_outbox_zh.md new file mode 100644 index 000000000..2b651b931 --- /dev/null +++ b/defaultwelcome/help_outbox_zh.md @@ -0,0 +1 @@ +您发送的帖子将按时间顺序显示在此处。 diff --git a/defaultwelcome/help_tlblogs_hi.md b/defaultwelcome/help_tlblogs_hi.md new file mode 100644 index 000000000..041abc229 --- /dev/null +++ b/defaultwelcome/help_tlblogs_hi.md @@ -0,0 +1,5 @@ +इस समयावधि में आपके या आपके द्वारा अनुसरण किए जा रहे किसी भी ब्लॉग को शामिल किया गया है। + +आप दाहिने कॉलम के शीर्ष पर **प्रकाशित** आइकन का उपयोग करके एक नया ब्लॉग पोस्ट बना सकते हैं। + +ब्लॉग पोस्ट साधारण फ़ेब्रिवर्स पोस्ट से भिन्न होते हैं। वे एक्टिविटीपब *आर्टिकल* टाइप का उपयोग करते हैं, जो लंबे फॉर्म के लेखन के लिए है। उनके पास प्रशंसा पत्र भी हो सकते हैं, जिन्हें न्यूजवायर में आइटम से चुना गया है। diff --git a/defaultwelcome/help_tlblogs_ja.md b/defaultwelcome/help_tlblogs_ja.md new file mode 100644 index 000000000..08fe92ba2 --- /dev/null +++ b/defaultwelcome/help_tlblogs_ja.md @@ -0,0 +1,5 @@ +このタイムラインには、あなたまたはあなたがフォローしている人が書いたブログが含まれています。 + +右側の列の上部にある**公開**アイコンを使用して、新しいブログ投稿を作成できます。 + +ブログの投稿は、通常の連邦の投稿とは異なります。 長い形式の書き込みを目的としたActivityPub *Article*タイプを使用します。 ニュースワイヤーの項目から選択した引用を含めることもできます。 diff --git a/defaultwelcome/help_tlblogs_zh.md b/defaultwelcome/help_tlblogs_zh.md new file mode 100644 index 000000000..9acaf8bd4 --- /dev/null +++ b/defaultwelcome/help_tlblogs_zh.md @@ -0,0 +1,5 @@ +此时间轴包含您或您关注的任何人撰写的所有博客。 + +您可以使用右列顶部的发布图标来创建新的博客文章。 + +博客文章不同于普通的寓言文章。 他们使用ActivityPub Article类型,该类型旨在用于长篇文章写作。 他们还可以从新闻专栏的文章中选择引文。 diff --git a/defaultwelcome/help_tlbookmarks_hi.md b/defaultwelcome/help_tlbookmarks_hi.md new file mode 100644 index 000000000..966c32547 --- /dev/null +++ b/defaultwelcome/help_tlbookmarks_hi.md @@ -0,0 +1 @@ +कोई भी बुकमार्क किए गए पोस्ट यहाँ दिखाई देते हैं। diff --git a/defaultwelcome/help_tlbookmarks_ja.md b/defaultwelcome/help_tlbookmarks_ja.md new file mode 100644 index 000000000..7eb249ef7 --- /dev/null +++ b/defaultwelcome/help_tlbookmarks_ja.md @@ -0,0 +1 @@ +ブックマークされた投稿はここに表示されます。 diff --git a/defaultwelcome/help_tlbookmarks_zh.md b/defaultwelcome/help_tlbookmarks_zh.md new file mode 100644 index 000000000..70750e5f7 --- /dev/null +++ b/defaultwelcome/help_tlbookmarks_zh.md @@ -0,0 +1 @@ +任何带有书签的帖子都会显示在此处。 diff --git a/defaultwelcome/help_tlmedia_hi.md b/defaultwelcome/help_tlmedia_hi.md new file mode 100644 index 000000000..c0c11e5fa --- /dev/null +++ b/defaultwelcome/help_tlmedia_hi.md @@ -0,0 +1 @@ +कोई भी आने वाली पोस्ट जिसमें **छवियां**, **वीडियो** या **ऑडियो** फाइलें यहां दिखाई देंगी, उनके विवरण के साथ। diff --git a/defaultwelcome/help_tlmedia_ja.md b/defaultwelcome/help_tlmedia_ja.md new file mode 100644 index 000000000..d6f0b40fc --- /dev/null +++ b/defaultwelcome/help_tlmedia_ja.md @@ -0,0 +1 @@ +**画像**、**動画**、または**音声**ファイルを含む受信投稿は、説明とともにここに表示されます。 diff --git a/defaultwelcome/help_tlmedia_zh.md b/defaultwelcome/help_tlmedia_zh.md new file mode 100644 index 000000000..500679b32 --- /dev/null +++ b/defaultwelcome/help_tlmedia_zh.md @@ -0,0 +1 @@ +包含图像,视频或音频文件的所有传入帖子及其说明将显示在此处。 diff --git a/defaultwelcome/help_tlshares_hi.md b/defaultwelcome/help_tlshares_hi.md new file mode 100644 index 000000000..0ab4b88d0 --- /dev/null +++ b/defaultwelcome/help_tlshares_hi.md @@ -0,0 +1,6 @@ +### साझा किए गए आइटम +ये आम तौर पर भौतिक वस्तुएं या स्थानीय सेवाएं हैं, जिनका उपयोग या धन के उपयोग के बिना दिया जाता है। + +उदाहरण के लिए, आप एक ही उदाहरण पर एक स्पोर्ट्स टीम के सदस्यों के बीच **उपकरण** साझा करना चाहते हैं, किसी भी अधिशेष **कपड़े**, शेयर **गैजेट्स** का उपयोग कर सकते हैं जो आप अब उपयोग नहीं कर रहे हैं, या पौधों और साझा करें बागवानी **उपकरण** एक ही बढ़ते स्थान का उपयोग करने वाले लोगों के बीच। + +स्पैम से बचने के लिए, साझा किए गए आइटम एक्टिविटीपब के माध्यम से फेड नहीं किए जाते हैं और एक ही उदाहरण पर सदस्यों के लिए स्थानीय होते हैं। diff --git a/defaultwelcome/help_tlshares_ja.md b/defaultwelcome/help_tlshares_ja.md new file mode 100644 index 000000000..e71b23f32 --- /dev/null +++ b/defaultwelcome/help_tlshares_ja.md @@ -0,0 +1,6 @@ +### 共有アイテム +これらは通常、物理的なオブジェクトまたはローカルサービスであり、お金を使用せずに交換または配布されます。 + +たとえば、同じインスタンスのスポーツチームのメンバー間で**機器**を共有したり、余った**衣類**を共有したり、使用しなくなった**ガジェット**を共有したり、植物を共有したりすることができます。 同じ栽培スペースを使用する人々の間のガーデニング**ツール**。 + +スパムを回避するために、共有アイテムはActivityPubを介してフェデレーションされず、同じインスタンスのメンバーに対してローカルになります。 diff --git a/defaultwelcome/help_tlshares_zh.md b/defaultwelcome/help_tlshares_zh.md new file mode 100644 index 000000000..96a2cfd97 --- /dev/null +++ b/defaultwelcome/help_tlshares_zh.md @@ -0,0 +1,6 @@ +### 共享的项目 +这些通常是实物或本地服务,无需花费即可交换或赠予。 + +例如,您可能想在同一实例的运动队成员之间共享设备,共享任何多余的衣服,共享不再使用的小工具或在使用相同增长空间的人们之间共享植物和园艺工具。 + +为了避免垃圾邮件,共享项不会通过ActivityPub联合,并且对于同一实例的成员而言是本地的。 From 356ae58d4a65b4cfdc80d86ce1f59d8b7bfc19f0 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Mar 2021 12:23:47 +0000 Subject: [PATCH 0356/1416] Translations --- defaultwelcome/help_dm_ar.md | 3 +++ defaultwelcome/help_inbox_ar.md | 19 +++++++++++++++++++ defaultwelcome/help_outbox_ar.md | 1 + defaultwelcome/help_tlblogs_ar.md | 5 +++++ defaultwelcome/help_tlbookmarks_ar.md | 1 + defaultwelcome/help_tlmedia_ar.md | 1 + defaultwelcome/help_tlshares_ar.md | 6 ++++++ 7 files changed, 36 insertions(+) create mode 100644 defaultwelcome/help_dm_ar.md create mode 100644 defaultwelcome/help_inbox_ar.md create mode 100644 defaultwelcome/help_outbox_ar.md create mode 100644 defaultwelcome/help_tlblogs_ar.md create mode 100644 defaultwelcome/help_tlbookmarks_ar.md create mode 100644 defaultwelcome/help_tlmedia_ar.md create mode 100644 defaultwelcome/help_tlshares_ar.md diff --git a/defaultwelcome/help_dm_ar.md b/defaultwelcome/help_dm_ar.md new file mode 100644 index 000000000..ab04f79d0 --- /dev/null +++ b/defaultwelcome/help_dm_ar.md @@ -0,0 +1,3 @@ +ستظهر الرسائل المباشرة هنا ، كجدول زمني زمني. + +لتجنب البريد العشوائي وتحسين الأمان ، ستتمكن افتراضيًا فقط من تلقي الرسائل المباشرة من الأشخاص الذين تتابعهم. يمكنك إيقاف تشغيل هذا ضمن إعدادات ملف التعريف الخاص بك إذا كنت بحاجة إلى ذلك ، عن طريق تحديد الشعار العلوي ثم أيقونة التحرير. diff --git a/defaultwelcome/help_inbox_ar.md b/defaultwelcome/help_inbox_ar.md new file mode 100644 index 000000000..fd2cdaa1d --- /dev/null +++ b/defaultwelcome/help_inbox_ar.md @@ -0,0 +1,19 @@ +ستظهر المشاركات الواردة هنا كجدول زمني زمني. إذا قمت بإرسال أي منشورات فسوف تظهر هنا أيضًا. + +### اللافتة العلوية +في الجزء العلوي من الشاشة ، يمكنك تحديد الشعار للتبديل إلى ملف التعريف الخاص بك وتحريره أو تسجيل الخروج. + +### أزرار وأيقونات الخط الزمني +تسمح لك الأزرار الموجودة أسفل الشعار العلوي بتحديد خطوط زمنية مختلفة. توجد أيضًا رموز على اليمين للبحث أو عرض التقويم الخاص بك أو إنشاء منشورات جديدة. + +تتيح أيقونة إظهار / إخفاء عرض المزيد من أزرار المخطط الزمني ، إلى جانب عناصر تحكم الوسيط. + +### العمود الأيسر +هنا يمكنك إضافة روابط مفيدة. يظهر هذا فقط على شاشات سطح المكتب أو الأجهزة ذات الشاشات الأكبر حجمًا. إنه مشابه لقائمة المدونات. يمكنك فقط إضافة الروابط أو تعديلها إذا كان لديك دور مسؤول أو محرر. + +إذا كنت تستخدم الهاتف المحمول ، فاستخدم رمز الروابط في الأعلى لقراءة الأخبار. + +### العمود الأيمن +يمكن إضافة موجز ويب لـ RSS في العمود الأيمن ، المعروف باسم newswire. يظهر هذا فقط على شاشات سطح المكتب أو الأجهزة ذات الشاشات الأكبر حجمًا. يمكنك فقط إضافة أو تحرير الخلاصات إذا كان لديك دور مسؤول أو محرر ، ويمكن أيضًا الإشراف على عناصر الخلاصة الواردة. + +إذا كنت تستخدم الهاتف المحمول ، فاستخدم رمز الأخبار في الأعلى لقراءة الأخبار. diff --git a/defaultwelcome/help_outbox_ar.md b/defaultwelcome/help_outbox_ar.md new file mode 100644 index 000000000..342d8c679 --- /dev/null +++ b/defaultwelcome/help_outbox_ar.md @@ -0,0 +1 @@ +ستظهر مشاركاتك المرسلة هنا ، كجدول زمني زمني. diff --git a/defaultwelcome/help_tlblogs_ar.md b/defaultwelcome/help_tlblogs_ar.md new file mode 100644 index 000000000..e4a2eefcb --- /dev/null +++ b/defaultwelcome/help_tlblogs_ar.md @@ -0,0 +1,5 @@ +يحتوي هذا المخطط الزمني على أي مدونات كتبتها أنت أو أي شخص تتابعه. + +يمكنك إنشاء منشور مدونة جديد باستخدام رمز النشر أعلى العمود الأيمن. + +تختلف منشورات المدونة عن المشاركات الفدرالية العادية. يستخدمون نوع المقالة ActivityPub ، والمخصص للكتابة الطويلة. يمكن أن يكون لديهم أيضًا اقتباسات ، مختارة من العناصر الموجودة في الأخبار. diff --git a/defaultwelcome/help_tlbookmarks_ar.md b/defaultwelcome/help_tlbookmarks_ar.md new file mode 100644 index 000000000..16bf6bce7 --- /dev/null +++ b/defaultwelcome/help_tlbookmarks_ar.md @@ -0,0 +1 @@ +تظهر أي وظيفة مرجعية هنا. diff --git a/defaultwelcome/help_tlmedia_ar.md b/defaultwelcome/help_tlmedia_ar.md new file mode 100644 index 000000000..a5fdfa678 --- /dev/null +++ b/defaultwelcome/help_tlmedia_ar.md @@ -0,0 +1 @@ +ستظهر هنا أية منشورات واردة تحتوي على صور أو ملفات فيديو أو ملفات صوتية مع أوصافها. diff --git a/defaultwelcome/help_tlshares_ar.md b/defaultwelcome/help_tlshares_ar.md new file mode 100644 index 000000000..4f21b14e6 --- /dev/null +++ b/defaultwelcome/help_tlshares_ar.md @@ -0,0 +1,6 @@ +### العناصر المشتركة +هذه عادة أشياء مادية أو خدمات محلية ، يتم تبادلها أو منحها دون استخدام المال. + +على سبيل المثال ، قد ترغب في مشاركة المعدات بين أعضاء فريق رياضي في نفس الحالة ، أو مشاركة أي فائض من الملابس ، أو مشاركة الأدوات التي لم تعد تستخدمها ، أو مشاركة النباتات وأدوات البستنة بين الأشخاص الذين يستخدمون نفس مساحة النمو. + +لتجنب البريد العشوائي ، لا يتم توحيد العناصر المشتركة عبر ActivityPub وتكون محلية للأعضاء في نفس المثيل. From 438296362dae44b76983fb9635f5964acd2b8a48 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Mar 2021 13:20:54 +0000 Subject: [PATCH 0357/1416] Translations --- defaultwelcome/help_dm_cy.md | 3 +++ defaultwelcome/help_dm_ga.md | 3 +++ defaultwelcome/help_dm_ru.md | 3 +++ defaultwelcome/help_inbox_cy.md | 19 +++++++++++++++++++ defaultwelcome/help_inbox_ga.md | 19 +++++++++++++++++++ defaultwelcome/help_inbox_ru.md | 19 +++++++++++++++++++ defaultwelcome/help_outbox_cy.md | 1 + defaultwelcome/help_outbox_ga.md | 1 + defaultwelcome/help_outbox_ru.md | 1 + defaultwelcome/help_tlblogs_cy.md | 5 +++++ defaultwelcome/help_tlblogs_ga.md | 5 +++++ defaultwelcome/help_tlblogs_ru.md | 5 +++++ defaultwelcome/help_tlbookmarks_cy.md | 1 + defaultwelcome/help_tlbookmarks_ga.md | 1 + defaultwelcome/help_tlbookmarks_ru.md | 1 + defaultwelcome/help_tlmedia_cy.md | 1 + defaultwelcome/help_tlmedia_ga.md | 1 + defaultwelcome/help_tlmedia_ru.md | 1 + defaultwelcome/help_tlshares_cy.md | 6 ++++++ defaultwelcome/help_tlshares_ga.md | 6 ++++++ defaultwelcome/help_tlshares_ru.md | 6 ++++++ 21 files changed, 108 insertions(+) create mode 100644 defaultwelcome/help_dm_cy.md create mode 100644 defaultwelcome/help_dm_ga.md create mode 100644 defaultwelcome/help_dm_ru.md create mode 100644 defaultwelcome/help_inbox_cy.md create mode 100644 defaultwelcome/help_inbox_ga.md create mode 100644 defaultwelcome/help_inbox_ru.md create mode 100644 defaultwelcome/help_outbox_cy.md create mode 100644 defaultwelcome/help_outbox_ga.md create mode 100644 defaultwelcome/help_outbox_ru.md create mode 100644 defaultwelcome/help_tlblogs_cy.md create mode 100644 defaultwelcome/help_tlblogs_ga.md create mode 100644 defaultwelcome/help_tlblogs_ru.md create mode 100644 defaultwelcome/help_tlbookmarks_cy.md create mode 100644 defaultwelcome/help_tlbookmarks_ga.md create mode 100644 defaultwelcome/help_tlbookmarks_ru.md create mode 100644 defaultwelcome/help_tlmedia_cy.md create mode 100644 defaultwelcome/help_tlmedia_ga.md create mode 100644 defaultwelcome/help_tlmedia_ru.md create mode 100644 defaultwelcome/help_tlshares_cy.md create mode 100644 defaultwelcome/help_tlshares_ga.md create mode 100644 defaultwelcome/help_tlshares_ru.md diff --git a/defaultwelcome/help_dm_cy.md b/defaultwelcome/help_dm_cy.md new file mode 100644 index 000000000..ca95d8a5a --- /dev/null +++ b/defaultwelcome/help_dm_cy.md @@ -0,0 +1,3 @@ +Bydd negeseuon uniongyrchol yn ymddangos yma, fel llinell amser gronolegol. + +Er mwyn osgoi sbam a gwella diogelwch, yn ddiofyn dim ond gan bobl rydych chi'n eu dilyn y byddwch chi'n gallu derbyn negeseuon uniongyrchol. Gallwch chi ddiffodd hwn o fewn eich gosodiadau proffil os oes angen, trwy ddewis y faner **uchaf** ac yna'r eicon **golygu**. diff --git a/defaultwelcome/help_dm_ga.md b/defaultwelcome/help_dm_ga.md new file mode 100644 index 000000000..016d1d1fd --- /dev/null +++ b/defaultwelcome/help_dm_ga.md @@ -0,0 +1,3 @@ +Beidh teachtaireachtaí díreacha le feiceáil anseo, mar amlíne croineolaíoch. + +Chun spam a sheachaint agus slándáil a fheabhsú, de réir réamhshocraithe ní bheidh tú in ann ach teachtaireachtaí díreacha *a fháil ó dhaoine atá á leanúint agat*. Is féidir leat é seo a mhúchadh laistigh de do shocruithe próifíle más gá duit, tríd an mbratach **barr** a roghnú agus ansin an deilbhín **edit**. diff --git a/defaultwelcome/help_dm_ru.md b/defaultwelcome/help_dm_ru.md new file mode 100644 index 000000000..c1e95cacd --- /dev/null +++ b/defaultwelcome/help_dm_ru.md @@ -0,0 +1,3 @@ +Личные сообщения будут отображаться здесь в хронологическом порядке. + +Чтобы избежать спама и повысить безопасность, по умолчанию вы сможете получать прямые сообщения только от людей, на которых вы подписаны. Вы можете отключить это в настройках своего профиля, если вам нужно, выбрав верхний **баннер**, а затем значок **изменить**. diff --git a/defaultwelcome/help_inbox_cy.md b/defaultwelcome/help_inbox_cy.md new file mode 100644 index 000000000..088229e99 --- /dev/null +++ b/defaultwelcome/help_inbox_cy.md @@ -0,0 +1,19 @@ +Bydd swyddi sy'n dod i mewn yn ymddangos yma, fel llinell amser gronolegol. Os anfonwch unrhyw bostiadau byddant hefyd yn ymddangos yma. + +### Y faner uchaf +Ar ben y sgrin gallwch ddewis y **faner** i'w newid i'ch proffil, a'i golygu neu allgofnodi. + +### Botymau ac eiconau llinell amser +Mae'r botymau o dan y faner uchaf yn caniatáu ichi ddewis gwahanol linellau amser. Mae yna hefyd **eiconau** ar y dde i **chwilio**, gweld eich **calendr** neu greu **postiadau newydd**. + +Mae'r eicon **dangos/cuddio** yn caniatáu dangos mwy o fotymau llinell amser, ynghyd â rheolyddion safonwr. + +### Colofn chwith +Yma gallwch ychwanegu **dolenni defnyddiol**. Dim ond ar arddangosfeydd bwrdd gwaith neu ddyfeisiau sydd â sgriniau mwy y mae hyn yn ymddangos. Mae'n debyg i * blogroll *. Dim ond os oes gennych rôl **gweinyddwr** neu **golygydd** y gallwch ychwanegu neu olygu dolenni. + +Os ydych chi ar ffôn symudol yna defnyddiwch yr eicon **cysylltiadau** ar y brig i ddarllen newyddion. + +### Colofn dde +Gellir ychwanegu porthwyr RSS yn y golofn dde, a elwir y * newswire *. Dim ond ar arddangosfeydd bwrdd gwaith neu ddyfeisiau sydd â sgriniau mwy y mae hyn yn ymddangos. Dim ond os oes gennych rôl **gweinyddwr** neu **golygydd** y gallwch ychwanegu neu olygu porthwyr, a gellir cymedroli eitemau porthiant sy'n dod i mewn hefyd. + +Os ydych chi ar ffôn symudol yna defnyddiwch yr eicon **newswire** ar y brig i ddarllen newyddion. diff --git a/defaultwelcome/help_inbox_ga.md b/defaultwelcome/help_inbox_ga.md new file mode 100644 index 000000000..fead80c54 --- /dev/null +++ b/defaultwelcome/help_inbox_ga.md @@ -0,0 +1,19 @@ +Beidh poist isteach le feiceáil anseo, mar amlíne croineolaíoch. Má sheolann tú aon phoist beidh siad le feiceáil anseo freisin. + +### An bhratach barr +Ag barr an scáileáin is féidir leat an **meirge** a roghnú le hathrú chuig do phróifíl, agus é a chur in eagar nó logáil amach. + +### Cnaipí agus deilbhíní amlíne +Ligeann na **cnaipí** faoin mbratach barr duit amlínte éagsúla a roghnú. Tá **deilbhíní** ar dheis chun **cuardach** a dhéanamh, féachaint ar do **fhéilire** nó **post nua** a chruthú. + +Ligeann an deilbhín **show/hide** níos mó cnaipí amlíne a thaispeáint, mar aon le rialuithe modhnóra. + +### Colún ar chlé +Anseo is féidir leat **naisc úsáideacha** a chur leis. Ní bhíonn sé seo le feiceáil ach ar thaispeántais deisce nó ar fheistí le scáileáin níos mó. Tá sé cosúil le * blogroll *. Ní féidir leat naisc a chur leis nó a chur in eagar ach má tá ról **riarthóir** nó **eagarthóir** agat. + +Má tá tú soghluaiste, úsáid an deilbhín **naisc** ag an mbarr chun nuacht a léamh. + +### Colún ar dheis +Is féidir fothaí RSS a chur leis sa cholún ar dheis, ar a dtugtar an * newswire *. Ní bhíonn sé seo le feiceáil ach ar thaispeántais deisce nó ar fheistí le scáileáin níos mó. Ní féidir leat fothaí a chur leis nó a chur in eagar ach má tá ról **riarthóir** nó **eagarthóir** agat, agus is féidir earraí beatha atá ag teacht isteach a mhodhnú freisin. + +Má tá tú soghluaiste, bain úsáid as an deilbhín **newswire** ag an mbarr chun nuacht a léamh. diff --git a/defaultwelcome/help_inbox_ru.md b/defaultwelcome/help_inbox_ru.md new file mode 100644 index 000000000..dc52eeca6 --- /dev/null +++ b/defaultwelcome/help_inbox_ru.md @@ -0,0 +1,19 @@ +Входящие сообщения будут отображаться здесь в хронологическом порядке. Если вы отправите какие-либо сообщения, они также появятся здесь. + +### Верхний баннер +В верхней части экрана вы можете выбрать **баннер**, чтобы переключиться на свой профиль, отредактировать его или выйти из системы. + +### Кнопки и значки шкалы времени +**Кнопки** под верхним баннером позволяют выбирать разные временные шкалы. Также есть **значки** справа для **поиска**, просмотра **календаря** или создания **новых сообщений**. + +Значок **показать/скрыть** позволяет отображать больше кнопок временной шкалы вместе с элементами управления модератора. + +### Левый столбец +Здесь вы можете добавить **полезные ссылки**. Это появляется только на настольных дисплеях или устройствах с большими экранами. Это похоже на * блогролл *. Вы можете добавлять или редактировать ссылки только в том случае, если у вас есть роль **администратора** или **редактора**. + +Если вы используете мобильный телефон, используйте **значок ссылок** вверху, чтобы читать новости. + +### Правый столбец +RSS-каналы могут быть добавлены в правый столбец, известный как * лента новостей *. Это появляется только на настольных дисплеях или устройствах с большими экранами. Вы можете добавлять или редактировать каналы только в том случае, если у вас есть роль **администратор** или **редактор**, а входящие элементы канала также можно модерировать. + +Если вы пользуетесь мобильным телефоном, используйте **значок ленты новостей** вверху, чтобы читать новости. diff --git a/defaultwelcome/help_outbox_cy.md b/defaultwelcome/help_outbox_cy.md new file mode 100644 index 000000000..439477edc --- /dev/null +++ b/defaultwelcome/help_outbox_cy.md @@ -0,0 +1 @@ +Bydd eich postiadau a anfonir yn ymddangos yma, fel llinell amser gronolegol. diff --git a/defaultwelcome/help_outbox_ga.md b/defaultwelcome/help_outbox_ga.md new file mode 100644 index 000000000..1dcd60464 --- /dev/null +++ b/defaultwelcome/help_outbox_ga.md @@ -0,0 +1 @@ +Beidh do phoist seolta le feiceáil anseo, mar amlíne croineolaíoch. diff --git a/defaultwelcome/help_outbox_ru.md b/defaultwelcome/help_outbox_ru.md new file mode 100644 index 000000000..e64435836 --- /dev/null +++ b/defaultwelcome/help_outbox_ru.md @@ -0,0 +1 @@ +Отправленные вами сообщения будут отображаться здесь в хронологическом порядке. diff --git a/defaultwelcome/help_tlblogs_cy.md b/defaultwelcome/help_tlblogs_cy.md new file mode 100644 index 000000000..4df66b61c --- /dev/null +++ b/defaultwelcome/help_tlblogs_cy.md @@ -0,0 +1,5 @@ +Mae'r llinell amser hon yn cynnwys unrhyw flogiau a ysgrifennwyd gennych chi neu unrhyw un rydych chi'n eu dilyn. + +Gallwch greu post blog newydd gan ddefnyddio'r eicon **cyhoeddi** ar frig y golofn dde. + +Mae postiadau blog yn wahanol i swyddi bwydo cyffredin. Maent yn defnyddio'r math ActivityPub *Erthygl*, sydd wedi'i fwriadu ar gyfer ysgrifennu ffurf hir. Gallant hefyd gael dyfyniadau, wedi'u dewis o eitemau yn y llif newyddion. diff --git a/defaultwelcome/help_tlblogs_ga.md b/defaultwelcome/help_tlblogs_ga.md new file mode 100644 index 000000000..29f5fefd1 --- /dev/null +++ b/defaultwelcome/help_tlblogs_ga.md @@ -0,0 +1,5 @@ +Cuimsíonn an amlíne seo aon bhlaganna a scríobh tú féin nó aon duine atá á leanúint agat. + +Is féidir leat blagphost nua a chruthú trí úsáid a bhaint as an deilbhín **foilsigh** ag barr an cholúin ar dheis. + +Tá blagphoist difriúil ó ghnáthphoist chothaithe. Úsáideann siad an cineál ActivityPub *Article*, atá beartaithe le haghaidh scríbhneoireachta i bhfoirm fhada. Is féidir leo luanna a bheith acu freisin, a roghnófar as míreanna sa sreang nuachta. diff --git a/defaultwelcome/help_tlblogs_ru.md b/defaultwelcome/help_tlblogs_ru.md new file mode 100644 index 000000000..e3ec9ce1c --- /dev/null +++ b/defaultwelcome/help_tlblogs_ru.md @@ -0,0 +1,5 @@ +Эта шкала времени содержит все блоги, написанные вами или кем-либо, за кем вы следите. + +Вы можете создать новую запись в блоге, используя значок **опубликовать** в верхней части правого столбца. + +Сообщения в блогах отличаются от обычных сообщений Fediverse. Они используют тип ActivityPub *Article*, который предназначен для написания полных форм. У них также могут быть цитаты, выбранные из элементов ленты новостей. diff --git a/defaultwelcome/help_tlbookmarks_cy.md b/defaultwelcome/help_tlbookmarks_cy.md new file mode 100644 index 000000000..585f15c10 --- /dev/null +++ b/defaultwelcome/help_tlbookmarks_cy.md @@ -0,0 +1 @@ +Mae unrhyw bostiadau â nod tudalen yn ymddangos yma. diff --git a/defaultwelcome/help_tlbookmarks_ga.md b/defaultwelcome/help_tlbookmarks_ga.md new file mode 100644 index 000000000..ba50602c9 --- /dev/null +++ b/defaultwelcome/help_tlbookmarks_ga.md @@ -0,0 +1 @@ +Tá aon phoist leabharmharcáilte le feiceáil anseo. diff --git a/defaultwelcome/help_tlbookmarks_ru.md b/defaultwelcome/help_tlbookmarks_ru.md new file mode 100644 index 000000000..5f60be04d --- /dev/null +++ b/defaultwelcome/help_tlbookmarks_ru.md @@ -0,0 +1 @@ +Здесь отображаются все сообщения, отмеченные закладками. diff --git a/defaultwelcome/help_tlmedia_cy.md b/defaultwelcome/help_tlmedia_cy.md new file mode 100644 index 000000000..cc60414a8 --- /dev/null +++ b/defaultwelcome/help_tlmedia_cy.md @@ -0,0 +1 @@ +Bydd unrhyw bostiadau sy'n dod i mewn sy'n cynnwys ffeiliau **delweddau**, **fideo** neu **sain** yn ymddangos yma, ynghyd â'u disgrifiadau. diff --git a/defaultwelcome/help_tlmedia_ga.md b/defaultwelcome/help_tlmedia_ga.md new file mode 100644 index 000000000..155b86285 --- /dev/null +++ b/defaultwelcome/help_tlmedia_ga.md @@ -0,0 +1 @@ +Beidh aon phoist ag teacht isteach ina bhfuil **íomhánna**, **físeán** nó **comhaid** fuaime le feiceáil anseo, mar aon lena gcur síos. diff --git a/defaultwelcome/help_tlmedia_ru.md b/defaultwelcome/help_tlmedia_ru.md new file mode 100644 index 000000000..408f1513f --- /dev/null +++ b/defaultwelcome/help_tlmedia_ru.md @@ -0,0 +1 @@ +Все входящие сообщения, содержащие **изображения**, **видео** или **аудио** файлы, будут отображаться здесь вместе с их описаниями. diff --git a/defaultwelcome/help_tlshares_cy.md b/defaultwelcome/help_tlshares_cy.md new file mode 100644 index 000000000..55e16190d --- /dev/null +++ b/defaultwelcome/help_tlshares_cy.md @@ -0,0 +1,6 @@ +### Eitemau a rennir +Mae'r rhain fel rheol yn wrthrychau corfforol neu wasanaethau lleol, yn cael eu cyfnewid neu eu rhoi i ffwrdd heb ddefnyddio arian. + +Er enghraifft, efallai yr hoffech chi rannu **offer** rhwng aelodau tîm chwaraeon ar yr un achos, rhannu unrhyw ddillad dros ben, rhannu **teclynnau** nad ydych chi'n eu defnyddio mwyach, neu rannu planhigion a garddio **offer** rhwng pobl sy'n defnyddio'r un lle tyfu. + +Er mwyn osgoi sbam, nid yw eitemau a rennir yn cael eu ffedereiddio trwy ActivityPub ac maent yn lleol i aelodau ar yr un achos. diff --git a/defaultwelcome/help_tlshares_ga.md b/defaultwelcome/help_tlshares_ga.md new file mode 100644 index 000000000..f65dadc27 --- /dev/null +++ b/defaultwelcome/help_tlshares_ga.md @@ -0,0 +1,6 @@ +### Míreanna roinnte +Go hiondúil is earraí fisiciúla nó seirbhísí áitiúla iad seo, a mhalartaítear nó a thugtar ar shiúl gan airgead a úsáid. + +Mar shampla, b’fhéidir gur mhaith leat **trealamh** a roinnt idir baill d’fhoireann spóirt ar an gcaoi chéanna, aon éadaí breise a roinnt, **giuirléidí** nach bhfuil á n-úsáid agat a thuilleadh, nó plandaí a roinnt agus garraíodóireacht **uirlisí** idir daoine a úsáideann an spás fáis céanna. + +Chun turscar a sheachaint, ní dhéantar míreanna comhroinnte a chónaidhmeadh trí ActivityPub agus tá siad áitiúil do bhaill ar an gcaoi chéanna. diff --git a/defaultwelcome/help_tlshares_ru.md b/defaultwelcome/help_tlshares_ru.md new file mode 100644 index 000000000..0824caeb9 --- /dev/null +++ b/defaultwelcome/help_tlshares_ru.md @@ -0,0 +1,6 @@ +### Общие элементы +Как правило, это физические объекты или местные услуги, которые можно обменять или передать без использования денег. + +Например, вы можете поделиться **оборудованием** между членами спортивной команды в одном экземпляре, поделиться любой излишней **одеждой**, поделиться **гаджетами**, которые вы больше не используете, или поделиться растениями и садовые **инструменты** между людьми, использующими одно и то же место для выращивания. + +Во избежание спама общие элементы не объединяются через ActivityPub и являются локальными для участников одного и того же экземпляра. From d13777cebd7610c441b3d3431ecb26cd5120e019 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Mar 2021 14:12:33 +0000 Subject: [PATCH 0358/1416] Pentangle emoji --- emoji/26E4.png | Bin 0 -> 17389 bytes emoji/default_emoji.json | 1 + 2 files changed, 1 insertion(+) create mode 100644 emoji/26E4.png diff --git a/emoji/26E4.png b/emoji/26E4.png new file mode 100644 index 0000000000000000000000000000000000000000..aab3dfe9f83a42d07b1ed1ad6ba665165b127795 GIT binary patch literal 17389 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 Date: Mon, 8 Mar 2021 18:47:55 +0000 Subject: [PATCH 0359/1416] Test that all emojis have images --- emoji/002A.png | Bin 0 -> 584 bytes emoji/1F394.png | Bin 0 -> 6874 bytes emoji/1F7D5.png | Bin 0 -> 27086 bytes emoji/20E3.png | Bin 0 -> 177 bytes emoji/2388.png | Bin 0 -> 10885 bytes emoji/2607.png | Bin 0 -> 1736 bytes emoji/261A.png | Bin 0 -> 1520 bytes emoji/2680.png | Bin 0 -> 6642 bytes emoji/26A2.png | Bin 0 -> 14630 bytes emoji/26B3.png | Bin 0 -> 10855 bytes emoji/26E2.png | Bin 0 -> 19773 bytes emoji/26E8.png | Bin 0 -> 13822 bytes emoji/2700.png | Bin 0 -> 2240 bytes emoji/default_emoji.json | 43 +++++++-------------------------------- tests.py | 15 ++++++++++++++ 15 files changed, 22 insertions(+), 36 deletions(-) create mode 100644 emoji/002A.png create mode 100644 emoji/1F394.png create mode 100644 emoji/1F7D5.png create mode 100644 emoji/20E3.png create mode 100644 emoji/2388.png create mode 100644 emoji/2607.png create mode 100644 emoji/261A.png create mode 100644 emoji/2680.png create mode 100644 emoji/26A2.png create mode 100644 emoji/26B3.png create mode 100644 emoji/26E2.png create mode 100644 emoji/26E8.png create mode 100644 emoji/2700.png diff --git a/emoji/002A.png b/emoji/002A.png new file mode 100644 index 0000000000000000000000000000000000000000..9396efc783c78146bbd84b2431f4183e6438c6fa GIT binary patch literal 584 zcmV-O0=NB%P)> zGL*k~p2mfXx^0TNYo5h~i@I#;^5p07;q3J2_4)E%pEHrZbbzy7!P>F9)~LJIsh`G% z@%Qbs(w~R7XY=^*{r>%lxoYqA>wdCao5X?l`tPXG=w^goo%End8ZhX_ckA2&iQnM zk_xFI{FNjBi>+fiv&)6nTkE*0HPUv?gyzoi+tC W_Cz~T4)%Hg0000 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 UYE(fZLjV8(07*qoM6N<$f^`VrHUIzs literal 0 HcmV?d00001 diff --git a/emoji/1F7D5.png b/emoji/1F7D5.png new file mode 100644 index 0000000000000000000000000000000000000000..649ee3316d9471f60a58ed46f5978e9193a0ccf9 GIT binary patch literal 27086 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 literal 0 HcmV?d00001 diff --git a/emoji/20E3.png b/emoji/20E3.png new file mode 100644 index 0000000000000000000000000000000000000000..f3415be0a09d9a082e6b33eb804fbca62e96a8e6 GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xZ3?!EyURMI7Bm#UwT-^(NfJ`(n>GIc);Tlpv zQMQsGzhH)EzE7X{EfM}}1r%}eba4#vIG&s!!P+dgp=)U(YbTdSm&D})26h$KoR?1{ z93u~{SQO~GxXVqnS4%3? zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3;caveK+Mc*+B4*@w02eHaC@bJAhx=B$~`0p)S zlz6BUx`8k30Dxxy&wn5DU;HU4XA@JYx#ev66I*P)^Fy`IpLV}H8}Ik~Cw{!-hW@F_c>kj(-Va#t;CIj_dB>?@AvwQAn2b9oyTy$SKjAB;b#|; z;UR>Nxe}0{ruXq^?biVP6y%Se%=hSj{`4*QzQ50hZ?Vj8jQHWVFSzvW`S5ug|MkY< zb432<7gBZem+8F!&RO-G{mib%OhofrQ8(D`<1)N)5b|(8mia3DOZ;5!SL3VNZYL>U zcG|($bj^9Pa*T^^x$chJ_i?((5ToC|@aX*{QF^Y1;+vmAd5ZdS$CuE;3YA<=zYRHy z!GDg$-TStCzv(J>UXHhV$Hg2U`Qw-Q+l&9^%bcUwI%n%=tQeP9T{8@2PTzSK332Dm zTe<=M_oo9w0VZ@O}9%a7QA9v--=|zsQ<SyeI<{v{%k-buoHnPC2v93&=c!Ov;T}P8lPGaXX)m`^?>s%>ARhnNcoKfojKQd=X-LHB3P1crpZr+SNU8tDaK=<*U?yKRSwS4wiMqzM=dnndN&pZ9ETfeeTWzJR3_H(Rsb}nntjc2Xh&Zz`@M;B*HVKVie zi)))nbw7OWyU)2RAULM$ZKqS?o-KqnOKVg3v-&7`I1n-z-P8NAnqD~iUktgg(N9k^ zbSkm>v|8D*Ov->UY~P7oV^l6C{t|y6#oYfu9{>6=F{auJsa-xVXS|QKj<6Pw_`KG~AO1gGLbU$C%AgPz1a*J6t{#S}}ogNt?ootHk7~$WHiqXR5V3-)XrOT8U5UN2C*f zErv6bS?7SAX%}K0&Y^Alj0F3*!c%oQP2_T?btK4-ojZ`=GUL??A?!VDJ7z20yj^8* zbKpyKyTg|hQFF{uZ{N0@L))iJ`S?;J6@_RV+`96B z>9*mWR-%ILY`O&A6F)~C5x*9VKN)%%9T^&_LB<1~wR8jM)NuPKU+QM4yS0(suCb2= znrzy3_graCXU<+fW%KF7WR0zk;b4RXbDpRT^-OynsZI?+|(Rv6@GZWR~-K5d4*5KN@A zmhGq#zxq5dEsr}Xv1f!>s93NsPOJXT64eAWEXGu5f3CkQk?p|~q=JY#Qa~w&mQ6Z7 zmys4tSa&@;#7c28j*-$v8aXg*96+>$F_;H|U7fl1fO1}8BLkYFdyKeabXQje@4~j! zIbkVzp3+Z&UwWf?xlB2&9jP{^6NFDw71ybdG1qBSb_O3K$O}Fds0n?(XneTuKqje{ zK1&^*PF$$HJyC9Boe)ai43t{)nQ%@6p6=1k@*o0LKB<+~r$#^4B)gsp#$05$&~8jd zDZVV44#f5YQ+42;LjVnxT0F%$s8$e|rUU;mNn1IZpr*BW<^K;@cRWA|o|SkB>WoLRrkwyE919 z8a?2=XpbFRrob5;;L;l!^Ke6aNQ2K>JeDHlnwbW2qf#JL5Mtq^b<9b#2js;m4+2kQ zOopLTJXy^Vpk%I7YD11dIM^q^jS8w6CgMs^in`RGzae8>M?_yqfb2$Kx!P@Z@SXxq zxk0ukA(1AM44bkU>sTOFy_Q2 zY+X(O6B>nmR+(nrDWT}Q2oYxWn*xoiV+l?py&F6UNlObL_li$Bo*0jdpG?r}Hl1ju zy8B>)YtTD^$V|01%7N-c{5as=b03JAiFhUoSwNjgKX(A()xauK`r0)Ga1y=I=E8rs zF~DhoB(Yo=K;Dyu*k>aWp*>2jPY_LsR<1myWQa2`Kor2IMmvFjCnV@1(k0|+kt#&j zq?#R>1E>V$dOzP4F+g90X<}n^pl^_L1Z{va;DB1@!*lkB8Y}!pME3Yq$^^%@=3H)krCHZ6x51?|cYsUjrFLVMSQC}0g0|=rz4`4}` z6En~k=%u$v*o50~iHRZua182Em{6aZkR$KE$~@ZmB{G5wGAfcV(oPwKI7qzW%#`4Z z{uW=3bP51lB=_H_o-1J(W{V^u9n zkPLvd@0HONzzBYy*{6a-J~99nc1% zW0>$op)I<47aRn%!92>EA0VR%M51rV8)^!{-!WqjG6KpG^mCdHi$>73%2Wc)ZcWiX z^KbAbmISy$*^G)2ApZ~^#ekw)IGLx2EbM~LwnzxBNt&G?4H1BjKT#q=l8MwaJ|aUW z&jC|TCcI%;@V!v<$WZ=sY&OCmbQCwT^h)=j7}Wx_(_AgU;{e=(I%qU36_w#Iyu~)E znG_H^dbZUSOa~57w3(O`VKJitPH-(l0GKJCE5Rhys@z!naARM+7*5PwD^^j+di(Gv zUHOt44KHC@I+XADgu>URuH}m2*{v`ja5kkouEG6^}rxN zXd~@Z>uFSc2e>x*aCf<<5`V^yJMssm{j_QUF6=Me`#$nArf>0u*_QGkX09!Y5x77T z7y^#up_)^-M1)G-+sl|H=ni$^v}}h5^Xfy2l49s`*!7kHAip)Q9s8=7U2)m4YVJk{1Sy`X-E z+5Fz8?>5a?c`h&?4Nai12AJt>aG?^!YHlG5Rqs)My(oODNHed|u<(UhL z16lvY;FDB33y8-e;#7$chPEItu1k=nQDxT%)Z8L(5D%q)k?~-+GJr@pb|(T`1#}h{ z1j!g&;zE#=yv;fH5{7HsD+oB_U5Mfu7xyf2tB?9VR26i8Z$YsDpBq@G?eVx{_lEm4 zTm}x@XmqWm-jUU!HH3@etHCx62@qz+>n*8PEHz;SOESV^94*D5F%05xmPG&IT7ZPD zyrEuGM@vCqmnDF%jAs*Iku7Q$S(;zpwiDil%bV$eaPY86`Op~=`zQ3@xA-$qg7<;! zWDH0(LqMZcIF7fIZD10BLY|wWg?Ow1T!tM7b^_OeArz1|NH;{{WbfcgL00b;^dOG;%wfGnK)XZkSCOip8r=tt#4*mxag%Lyr z2)wzLR#TviVn(3U?ayfUWP>LnP5f8hJmyRP?xD1$- zaUy8r1*cJj%TP7yXO4ouX5xGZB-WaTr>wXyx3$=0f(_a2w#bW?2dt0)JjWaksykpR z$V5&U3-ruThywMIUn~feHPJwT93yf&S`1V(!*BI%!r%5_88{T=CyEw5rm9Tu0@gH( z$>J&E29UJ^pSsr7kuQi?f9|3oVyQ&%8H2NDQxnKolDr9%Q3)teF4P0l;_5SMnVMk= zt`l+rCW)eF8iIlt+HFb_%gi0?ytMqq)jXbeRZ;fZYMvm_fl=Y3fwyD)_^dFrhT~E| z#d2+Ab%3u?6{78O+XnZL(^Ycj*RFY+CjJQI_c#u%yMxqV00^f=vVl1kDqVbhUt>N^xJ$+u*gdnM4i8ic6f!U~mLd=)S ze~MeOVLYS#+x?8+Jeq&`0b~K%GzSTPt(f0Y1w^N*Q;Z{bVZmn%CpyYr>>ha88|aj@ zJn9@Qq?tZz7hZc2q9aiGz{+ME+CU*7qO{0)f=g`3hSM$X8dt>*r1>O8d#zRX;0{V@ zty(rTuvB z82IA4^r7vqHYg(pHQ`V2?2pQc`T?px+x#^3XX4mU6{8PwQmE~t_5G+)1aD7vvMUUN zn-`44)|!9WMr`S-WDZ65)2Ah7(}j9n!7-AISQAg7TD8EG(Hd22>>jynR*ZB#mqj9| zg%UGDV^yFIzGp5MS)=RqFS|g9Sc7gvr6NdcD}@pXNOLV4aiOa9@!Kp^&^E>!==7BTXYreJ8}xj%7jb{w3w^$SED&x#wzm(ss)N^UA*@~! zw{#4QxlRBlJnTVez(5SYLAyRmpaxi7)?$*Ef)>^~GlF-z4lf}3%0ixMEy^40iq_7s z((?VU19W#|Ognej$Xo-JCIugGy%{fnN-58p_WayILi)Xn69X*|6!$dRU_dL|ft$(= zN8vs7Id>`+8HVFSmT8j*Ch6Km#(kXbET%xe{L~ z(LcQll0~BMn66z6Bsq-Nv^CO#HV(DEPT@ROq2Ydf!b8xo{8uG7Jd?*prF*9p{LmU3 zg9I-V6LIwEyVSh2M%T&6hq;l|`?}xv^|8!=6>S-ME+LX8yyrsYwLf~#e&nXE_xxr( z%}?HwHue)=jkTkhaJl7=*7LjbG_s!SDsL-I1^$e@q^Y!Pw&h)Pj7ZxEO)CvDfv8Pj zMH}LhRN{CXlaZ#H@=M5W>NM-L0GLv;RGq`S7p|tYuEiV+o`7e@URpMzTl}6ediofb zJdam5+LTOctQHy`qAjyf4+)T>{!pWR zR(}Of0yvR2G$w9J0tX!0^oG^mcGSrRL_pLYgf{YKJ|+<>nu8`n3TZzanS~3^lo1F= z!Vyi{ZbhSgv@=r4)$bKxK7Qy_3`QTHu};iYf)otF5ikv}Lx}|l-}3xCXyI5wgEe1xc1^Tv%iCmtE z-VJ#)9)Bsvbyq4Wq?1ta83VAtsS;}0PAy6FiI2lo8`(0DHx4aH@J4`BwZd${@w;FE z8EJn7!-N@F^$otBQZ5uD`L|PE$v}gy!KOvETHzE3$V4f z)fTjOeeO#05gYC>htob5FyM61(iR(H+Bg9>ytY^G&x?b;lAzucD4x+Hi-=d_QOp2d(#khlWLL@nyP zQIS>6_yMbfD4}V={Fz60z zpy{w)?;!+jss2VInfHfGL$rJs@jGc@==XSx&jbL)PoM}aUD%h?;=|O{fk3ocBYq@+ zV9z{2*5xm^Y^qr#uT^@et7@SY+62h9{6C+gZd;OS*<1q!6lx_X(`?9ux^8)9;0VaZ z9<~^OMB=mLHxYw0=8#*{nxA&T8UVgj8x6zM^(eZorH-cx#$7l= zsEPX}ID>4~(#a9v43w-6+*Uk!4sZ{AFl#GY3y4gC_@?J*&vlPq*E_Z7`-kH_Key>D zIyaakR#lrFFvoC?74BgiRe?6@Dj9@8es_jvVO!A6(YGNJl7X3xfCjRikNXmK)oBo3(a z>?Wk#bmLvOmT+~+;^$OowU+>N0{cdXei-bB=x8eUm7g{^5RhJi5aQL)kub*?>83i_W&^jOEMS2M7j<0hopgOko zO1!LPMg&r`Q}UR`JK^Kp9{uqcuzvj)Nya>A;jK>CPe(hN7T!`wAS>abGHJ6Vq8jy^o6X^!85LiqN7ur z_Q7>X!)g&7C_x6GbquerD7a~AeW(fo)h6aHNd*E9dMzlWc8dZr9 zqM6q;DST`%h(D}O;%q*Hrl#xBf`eWeM>z;}QI_E6kraS6-N)K3s<=}}^&Vy@jbcZ7 z24p+!TY*bA)uqy^TdTxF2P#z3s2UKeZ3ci!j!~Y}8A@2oCQ#JSa`!!jh*%HmnL3dC zcbn~0`Uy>euL3Qe!d!O#SkNDa%0RYU?`kn2<2mo6qf~j^lWz8PbZF&ukxErng(N!c z7S_V<1Y#uDMwjU5BaRZ(ycePbM)0?lLv1R>O$%JG(Tda~#7@9E4wW7L$UFhokpKqZ z39!h3C*-876i=ckb*di=1~h0h8v=jj)F3hKnVr(5p&>ZEG<6SWJm``qyT_&d9L1*WOdG(`P))^!&}?>RZ`Z_C|r;Q^l@l?W@bXIk`} zjzz^Wku~%qph5KLY+!r!%zQsOP&Y6E z!Ru^?7mXvN2_mha(I6XeOUQ?Aa3QE7oqud16wwgzDD^oTmvx>QwLm&4Kb>LYuIU~! z!s}0M{Twa758M&8>g+n|DKxZfI2s#oKHbUMuF0M2fZ-vB-gR06NftgWD!lYqR72IH z$;Oai4OgjaV?a(5BtqO1Hjr&-J8`4Y;>KD)Um1jv-=w3HSaAv1hDUrmE$nHVdwA?c zIXX?P?OmPosuyV?5;_<>fb#BA2mb=ztUz+W$mvu>JFAWY4RenmW0;)=4gu-y{T}La z;~whzai&WYG2y4@OqY2Mb=5D2x)fSKk+J7zaUKM_vMa(4MMo%>&e1P*=d$R7XV89y)~BQE@hb)e)GI3(HB)Thm zI-y0SU#&xnJ-<+p5w$w*Kh!2OJ^QqOXxO3c4zzSdg=pU$ZPw-f5o!&t$}pRbQKIA3 z7PFcOGg4XU2{+0P?z!Pk!Rd79?$J$TF-$d%AYX?)<>-0!QWDLMoXDo#-OKX!F5vau z`S5}Bx8IRKo9aN1`TdC=ovHZw*iK1*Kel6jJ-735Y-b=U+@qae<*Z*Axdrk0>k?V# zc6~+uY4!Nj^h6$OAMXHOzkOHCe;gw#pCBl(`gV}ad_PI{d44i(9n+zRvQA!m%r^ML zR zF{lbK$k;j6fL0gh8=fTz{~!0u%-im86T|yoEafG6&#G;20004mX+uL$Nkc;*aB^>E zX>4Tx0C=2zkv&MmKpe$iTct%R9qb??7_d575EXIMDionYs1;guFuC*#nlvOSE{=k0 z!NHHks)LKOt`4q(Aou~|=H{g6A|?JWDYS_3;J6>}?mh0_0scmXsb<$WplX(pP9}tG zZdC}rB7hJg7{-vqOnpuiQ}7&L_we!cF3z*O&;2=imAuISpFljzbi*RvAfDc|bk6(4 zQC5-^;&b9LgDyz?$aUG}H_kjWYY7*QDULk!Ey()lA#h$5yuo&qkMnXWrgz= zXSGset$XqphV$CWGS_JiB8f#TL4*JqHIz|-g*dGmDJIgipYZSxIDU~_GP%lN;thv3l_Hp_EWT>mu4RCM>j20<- z-Q(S%&ffk#)9UXBQe1MHUeQm900006VoOIv0Eqxi0Gcf=4OIXD010qNS#tmY3ljhU z3ljkVnw%H_000McNlirukXoJ#qFXLaNs58oIa4zm>M$AFrPfHG+4hcarKOUIsjSjTtR z0kTqwxo!^kz>XAvj#wE6Xc(YjfQHtIyn zkkSEKFdg7N;JS$0F9JOXXMg_`n4AVysNYWDteAEe1Gl=% z*4J#LzZ-M?EMN<28okz*KAL1&TSWcYQ(zr15jbvuR-_up_ka?x4mCga7EDJRSDZG# ze_wNq0$YGd3GJR-vkeMa|D?`3fyv?&1#wip&#{T;Bf#bM4;cdUYpkQW2e?VxI#45O zdemxbQ^LDzf!S#uIn|35?(M)GH5Q-|*cS6x6Y!jx9#yX!kXx+g%(ZTp9+w)fNLIQd=Y4a-J zV&Ia5XI=!FvU*_2!v}@z%9|+$R%5hgk6jks!1&Ph>AQS_VUi{g^4hUQ}_HZwSwL_I{VF@!j_g=Yq&M zV6=4{V>7(o0i2UZb81Rfowl`F>Do!3cqCrt0DGk{0(bewnys?Cd?QjA0kGG$ohDBL z=ZI6x4NgtjeDUaSW7Cc_nGaIX$^p3Z>e~I*omZok1Ar9#wo_%54JZdhY!3(^vuHNH zJ7-DCQc>U<(1%g*_H3&eA8*e#+oL}0x1HMm${++V3tME!0Wz&EqFx!`{wm|BRRas| zDR4O=k0TB}^O^<>PS3n1Kfx7w+y>v#@EHDb;S?lv<&>j&a_0#?76@Ts$MqI zN)Kx73-;Z(0P!)9`8GaljEIvQVCJDP(%*{!=uMy*Ros!s09r=Pg~0k4FsE1+AZ<1U zkswi?l3-_^K=leRl~4!}72}ojF0;%4nT0bYq$&Nv6QJyl`X=1@H{7os%pzvkU@}T3 z+2}SY3VzpWP7-DD6mS_R?$=Mjx#wx0j6=uS)Fv#)1Do?Kv&^}eCC*-p;D-JKoM_6Q zP<&uZU$1lRWSnAsV4qHlX?g>26R;_P&WMwZz%*0tqWC~()Og>E$lJC9rzVkPwJb3= zHgK#02cWoObC5%wZdrgRnHB?1+W0mB)5IcB*_)O_g%aGi z28joH31}8^CCJg@a<|AyR^x9PWLaXL{S>lQPzb;q_&W`Odjc9t{m;Od(6!HPc0DqOpZ_o+Fievvz_DbX)dMyasoqk01Gt*rZSW{5AWo%F>Dr}* z`Z23AcGwk>!LQHxk?U)i(!24ui1J9(#D9cO+VWxLFUR=oR{d`w$`Lr1iw%sj!&B7_a%7mZ^zttzMUM|83E1*z+}W3e9G0=H%IJ8RlClU zLAQa_OK}81TXdbbP8JeJg|$Ei08HfWGw;C4N$1zwGp?+ z1MOPr{w>LydK&|>D|4-KTf2ss$<0+-*Sk51-e{T&N6Gw8qXmZlk3ia)tSpUsO~2Yy-bT`2?W-PBXP3^kDid#(vO zc7pX#{E+@TxRDkfxD_QTc-H1q9H&v~mxBS2~y-GeRg3fakDwhUTmG@@>NBakp zjK|+^f47PSI1tmuehbbkq4&nefRpyoO#us#N0XdvHfLsVYNj(KD}OpL%n63`8}?@+ z@QLMX;%wPw`^?19dr1yqk^Q$bfd%M9Jq;CO)Ckb+bFmfn9VvWH2QVk(-Bx7elNyMw zvIn2aJt{*xD*zFdm$0y~GJ-~l~XROh`vbu=DXCN$7@wh(w(mEhX5B`49p=mMY(SY(se8crMz z(vi%A>*D5%Fx~x1c9PGm_MtxVos$inQVO4UTMjH3lryVUAl(Oi%WB@70Uzq^&r&AF zLGH2*wJplUSKxiL3!vQ^@A+Bdp-eW&UHXh#Rh(}__c`w9anuUVA(LAkMNI{uB@Z}x zY*20<dnFhIiq4Ffa`&@e#p-qbl#2X@G$vVS*)hOvJ~O)2KT3Cvub bH5BqcosCnA`GbGc00000NkvXXu0mjf$6b$? literal 0 HcmV?d00001 diff --git a/emoji/2607.png b/emoji/2607.png new file mode 100644 index 0000000000000000000000000000000000000000..5244ea431327a0f82c8373dce9a7e4df5ffa2b7c GIT binary patch literal 1736 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`ol6-Qm|h3?gt)pF_y9#H0gQ|&x|x|7 zSy@qqP~@?2&`dy6fmN1?391Uh0IK2UViFT!VP!#B4P>*xxGXFn^+07zOb7*ViSt>tU(_efS_uh^3lp?7%RD zusPTnff|A2pI6#IHD$RXw@$16eyI&KM@N$bC~j%Wl@u)qbTiNjVBmj!qSe(P{_BOd zp9k;5i)!DWYCXNG{_%n4`+J(xx}^?nQCu`l#?**YQk-S&LOE9lp36s66y?~QY`K3v z*8|~*W3}HJ$JA$CuS#-qg5zP7N49 zuWxBApDoi-FMi{sYJR$KTdjCd*J#zUJFI z8n13@IM{G&sk486r1|8Ey0QWrKOggtXIj1Cq*1V9<#Qv*e@*<)#W(6^a&S3Ln^{IICZ3QimikC^j#Xzj;b^=}ego zi{+Xs#lAh!(%0dzFyVS|K`lB&U`xTf8^93kD+%%oX82>l#`NRg-Eu}t=Yqq5(r=ml zIKQa=)A=dP|NG~RzbZGc1%GvYAR)z*6T$IF{Y897*Tw9X=`WAPexAi*xK)1cLD}nn z|Nd)u={w*BP;n# zZQrlo{(jl2zdN7S+AsP0f$MGm-(wfW?%#UGoOnY9m?8gpx;TbJ9DaM_X>drQ2-^qM zscu$F97PyK83R>B3=Iyv1A*^>2`_~>U3YndxYss5UOfG7>Kw9T~}Ea7@z(4&GDo9v91lXo|!~9OlR#mT6WlF(&A_B(dClK{14o$9In_*DDN+J zazEVp#UWSm%yXGC0ls@8=?X>Xu370YDT=rY8@jvrX_Z6^&H2XREo`a7_>N_HZ&pdy z4NKW&mz>JnttASR+UK^kzBy+iEaEw**6Fn1CiXV2Q!0Gc%@d8RU$JSdEuQ4=7#o%z zD4^v0dO>hNZqWW^5}%5CN(=3GpG$PV=#cr5i^pH(PFlTIVgBE)7HR(D=UJ2g za+H0u`Io_+qUKdRNpA7uB)j}NCcSq*S3i36dd>~&h(#w}2g}^PaJ=1F=y?@eNoCvY zO~-yL`+7<;a#G&T6480bjJCfw2z_X{vDlJn-RG3^uOC_{mU&%znB#hK@duTO#ZQ@J z(oVhOk&+41uv0yp=qs^ts`Y~%CsyuhTi5b=KKHhm!26+hkCdFc@%*;n^Q^h;GiMlg zPulXhVBfXMsGgtPntj4yw$JA@F@IRjvh6?)@4e!4lQncMtM{7JX*{ob94S(h@%f+C zRflzv_xB#~x|E_4u<2m$g|)BlcR7xUgXPao`9v7pkw^3IYBMUPmyzDcqD_df01ys7Aq dyWageX1&iBx2}5T2%N#fj1XjGWCW@~Rt7W&2!P^n^*{zt0Sl5*OdwrAK_+G(i;+QqhgDvj z8?J$wiAkJ?hl35|RAy#Ic2*`nZdSNyEI^$M46H055(t1MfJh|kfJVxSapS1*PUoD?#C}BE_q(EC4bSsD_ad=^OuEbnrjHNvod>|OU)@VOY%^1G!WxtXP#SZ))=Q-9-%2N$e}F7 zt0=((jCwU`UIhv68TlqX=>`HkY^7luW#O7_NqP?YVmuryc>!uJhT?K!TvEcE=90(%jhp_xn|*ZGueZw<-@E$c%fC~%XRK23`?pkXXWB29e+Tj;AN{-d zuc~7kKQOY=JY5_^A`ZX3mKrYYD8lwYgv-Q1^UB@5OW(a)cjfNgyR~tMalvfM#r@948-JO* z%z0@R75ezu*;7;3-LRZ*vxV!&yAzAf9lzv!{@fPH(?S+FM{e=$S#k+{6-w2%)8d5+PuN#jmu+4U{2@=ts;}$f z>;6Ow^M+ZA`qqoK2Yr*Y_Ro2tXd}P+!4XC`+xN)^0X1_!92abxydueO!;d3+jm>Rm z+RG2TQRuuFFSD-4zHa_jzdfDh7gdvXUEvG7+O;`+{?ju};rj9FJ_YtqHrJ?LpS3BK z=h(p;A2;#zhM!)ST=eYVl#`FudU>`1lf^Ngd(XvvO}6u%D0Maj6)c{velF{r5}E+D CedPB5 literal 0 HcmV?d00001 diff --git a/emoji/2680.png b/emoji/2680.png new file mode 100644 index 0000000000000000000000000000000000000000..7ada6e1ad82e811c4bdf09b2de216dd5fd8714a9 GIT binary patch literal 6642 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 JM#|*pe*yWvA)5dI literal 0 HcmV?d00001 diff --git a/emoji/26A2.png b/emoji/26A2.png new file mode 100644 index 0000000000000000000000000000000000000000..167e10dd56534b6d20d2de7037a76961689b8051 GIT binary patch literal 14630 zcmV+>IoZaEP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3^wb{shpr2pd-eFW^waj?EOH<;tkXNcq`kt%id zl)6L~GZ`81#oWx{h&KEG{-0z1^Pm4X-+VPOm6}`5mVaW4&3C@3_W7sXznzWu@B2@D zd(D0Qxp{xV^P|Am@cd`#ulIL;o<4rz{W|08&rN;3;_K@|?)}2|pP*0H_v`ab@^k-}l$g!!NeXFB|dAw=cN# z%g@96$N0}59NzE9e|;gg;C@@q>)&%$J!e0w>oH@|{EDb+Z1;8<-Z;2axWAV9Q}{RW zeYt-cf2!?v;__vu9sHTDIgeM4anUW;-EsSVoo;fA(QjY)>ixt~`dJNyM3_N-iu&V@ zFQJ7MD!!b48+;anf4>)ZKeye_o38T7%kft4xR~Qte*9zp^x}W>$DA`|B4_Knt++3* zxaKzGIsMJMaELoEzol#7w?8lU+fVUBsN%tN&0JYvx8u3QNbV!H!u50DeTlD63OQ5O z>jIdF&raNo3wXe07m~})7VnF5*s?V+5Ap%_q{&( z?Db=?2}h)m$)}2kI?jqQ5kDnXVyLH(VoE8elB!89^&E1{Dd$|WK(3ciVo4>JQfg_X z*HB|kHP=#WZM8Sw0vMQDZl%@MTJPR;KB#l8&igw*8GeKjM;dvQQAZnn5S?FHd+p`b-~Rj;UUM(6 z`RggYue^JWpPEwMF5v_xNj}44J~}*Jaxk zJD-kw_uYr*{>pDA)xYwa|0mBGx$ggm=M1j<-EZG`ZK=-9>#-*bWm6l-KHk%*wESyr zpJ(xli-?c$_;I+KlmKT{%mf#fnL3)8ih@4J+} zCVxlnWlcWKtzB(cDa^$0w-w6t4ZqH1_S$Qu?&EIx_&GAx|?hd)1R5fap`c=fE6#8U!Er+KD;kfy2m0yB4V;ip4^O+gb zQ0j|<@0h_~*eDK+#^Q!8?VQ}sS|g?r%4ubkv#2Jlk-&`e#NN}k6O*QbZ&)h#1Rm|Y zx~tobKE?^Gub6{nD_#i>ea$JBL(#-H$p!sn zR=!^ZQ*JR~%~U!`V#diX9)Ka;H{IW`_WsWO4X9d6?&pt5t0xx;$h6zZ_S4nA|MXNy zkz>~+6bjd>7#lQ-E9NueY{`I6%Qc{`_%v$)30t;nw0bFC8syj+xPVu31{+$2jji0e zZQE_Wt0}H9w($}4$dCvMPd={8AU+f#`S6~8jbG24*?|u>#!&JhiP|+lS|QgnNRDZ4 z#I&;mxsa>tBr%T9BRj&Yl0B64Ot_9%0q%qm{MHu|szwo#oZYO6$OiIG+_n!s#Env6 zCo@&Tj_|ZZ0w4*zmFPAG>47Q+w7O>Zg7;u-0=JdD&04ku5CJdRGy5Qb;`BY)ozmV! zM&AT)c!Ab(HRv^rC zkHVi?^Ewz6OI7@Iya9`w(i03Bn^X?9l)R{(m82xYfuP<&Mqglg6p5I6OZ<1sWemW5 zjYMV2jqC^5`y3&{?x2Gp!~!5Z_s_Z-=A(l2RLjn3<4Cf#7ARgB5kvF&EZEMo4Kd@E zZga=l50xN6R}Alt^@GY}|>fcIcOMs=8If5m!QkVTlLUnK>| zN~xZu{7w3pAM+=rS2~srE}tAQ+BGdTXm{fEG<(x%P#0O66TR;BM(U1yzlniC4XKA% zprp9hb=nw|4!nLOV{*qzpc;UJA1GV~!%dgx%A2Juh+z((?}ngLktz`YfYm}Q=L=vf zZt|8l^tDA*9^VrZX4yeGYG-6BQJ4dAU8yT=1a6W=!d9MSVxhnfmBmv)$a72Fb9?xg z+E%8ao++J3WXe{C!XId6Sw1!J*!x(3L~0$5^9m8d+<^>L1OV9N26`qN!Zd!p3LTaW z6zYv5sB>WwG(f^AAp`bAT3>n2tvW}Mjbgh2Yj3y$k<1+lyz#j1>D%zl=SlRBA+bt-Y&l#ZhECg88}WW#@wv>|8Q1rnqlE4UY^7r7iV&IYAT9pufl zjY5qByTBA6j9kZV?vq$EQ8k^Syh)@yMh6MVh8s_j8>J*3I8VS#0|+J0M+gl{l3Sp% zSn?S}>@FFQbX&4pbRbgJ?j;mW?Ix=^C{c9E(voJw5RdkgNI)I@Vq#gB&q z1&ljB2!|c=l6>U`Qw8HKk=UXX-4u>bkqMOb!Stwq6*>NAF3o}ma5o4$0Gn`|V~8mM zW?KX>aSy;@Qu*H{MPwXw2}mncN7sdZ2Y#etAi4%1k>Rk2)#db^@)p`=4-}4uiiE1k zDvNhHyh9KuuUZv$pJ9|<7v)GR3WxZkR(@m}R1aYV3))bDjFH!Xr(Ldfa}(x-aRsi0 zlHD+ssHwxNP~nVOpdKKw*hL}(9e3;@!m|OU_>e+Kv@frBBZQBI?`0(|00y20Rn0`H z@ve-(a-azfQse5##HlZ^xYF^ps$oA9Qe;^ie5KTs=P(mc=oplgA;V!AAerAywGEqt z8jf-aMGIWdM&cN62qZVRLv88=epLWM*opO#$@mUg1K$G@5!jruL&kcz?3y@6)pL&& zUkCBZQ0L{MY6S!sHnx_5nKyp=gdAdJ!+l$Y%t5g6Q=0{5b}7EXW%F*KddZ!a>F*!xF8AGu;sJKw@8L(>CKSw8atKM| z`*^;+Eb8H3?RhH_SYQ49o6NoZ>*JE<MqW!nINE;t*&Jmg_L3Xzc3KiH!zB0-+yJ72GFcHc~i)Cv@baRl-sq7Ip>o zBCP`J0*%oQ&=%kbmEgAkxmW zY7&u_;G`SdpS7e0@e!M6L#B5rc$n0?6bUxB>mB z6{0n7Be_Hz6GNv~fLWyKwvsO}ngeF~n$XI`D6Zo&lz(s*o&aZ%D|>>A5l7PwNo5b= zffOBHhZNyb*agxlW0BwloiKbjo)E%IP?LprAY3}-k9;wZ=Hvz+MEH62Ae!WOgL(jr zXj4>ZUzb5~uMv2HflyW|CQ#Q_@dTw@!(`BFBR!C?f{wbP?`Q#3043h3++<+;l`0T@ z*!WJdxm{->I3K7&M41hvj-Zewaj(M2)Yi@4(0F7Uv6ESv5(eLixvNwYpl`5rH$~vV zhU`$!2)^q&MLz>!x*oCHh#lw{8WMr*T7WaA8G=YGDjm@_p#jJWXVZq(a1kWQ@BnKd zk@+~BUBTg`hS@B=VRiV8^H2kipJOGnwwlYK?lRhCNp=DL+_;F=fC-e9k8+^6jFy=d zd6U5-#2fKh7x334eb8^GuF{2`YJRQbs=1Yl8abu3C|?;1xr>sx$O1neusFf*4&R0v zW~k3;1BXH`sJcke9fmz7kXA%}*|8vYJ5)p%ZNV0DhqU5l%nq3aq@cW1tOZ#rYAa6c zJ!d1DAqmDMZ9tJs^=>G@2-V$^;zBU$O1GPXJVLT>d0;QHq!4NFTv9ThCfp9jLw&Ky zXapsAg86ud0NUg7gn0|n?buhbW}Tj*nRs(7s*=P+k;V;1q`{5AavHDaO?E)j0aB+N z1$w2n@bj%SN@mywN+67Kq_MN)%8^ zvT{H}B0&X3hhau?AwnWL)FUJ$DvAJvspzA{eNq2KHnVzpC{+q(Sx&j5o2EpPK{M~P z#~xQM8yrrZpB?^@Kq!6pRQi(I#ZvyqGCcmn)WjG+4j#?}=ZFdj$_ws7uOY`L)N)v; z6kJh-4Swa3B8yd7K5p04f&7L!sj|6Yv+RJoGRKtzios*VokJndr&_`|pV~DPlB5uV z0N%ck5WJ_N!^y%KW29tN%%eUDEJoGeCu9~5Ry%Wh38Zusw1^3DH%cSiAMS-e)W2<1 zQox3E4FDQotd_2j6ZK}0LZGI4@zUL8D-4mST;}SUOd4NxodJVKBjFNky`b|*y#ecx zP%VaVl?p^UqLugrexIfDt}Ef!pwxg)1Uf~uQL;k4oWEX8rSB4Y(QODjNp-_isJs9Y z;C^6@M%MTMAj`>TA6QFMD0{Gn3Pj$KnI%)NV4+#M|KPpjty>6f)ujP@TqHnq`Pfa#Q|~*8*g9&zaM)5w zniv2YjK2_DKnIwf8bxqHRw6kG+CVsXE5QYr1_$Q#jz9*J;YSH*R2%q~C+}}{nyOBe zc9>D8I{76+pyZWK#q+Yo+jEfVU6lw?N9pQiH6V#YQ0D#V!wZpT4glv$Qu((;gt<+L= zyubh@%Pv)w=QdJVgZjb}@>#zfRoXX6onRa=>*l$Tr%sc81(=d~Zi40kXn>O>ZN%}U zF#Kkum_Zvfa|jk?Kp?+*BL_8W5@1xawqKwnYWhy?D}@wAs{vr}nR2Eo4S^wssV=Ni zLlgiV)rz_v!Gg!wbdGe$a zFyN$V;J`w2t66b74A`B839QrdB30#Th4Db&0E}d4f*QUnCDtY}5QZ7522f1(eQuA0 zWPu_eYq8x@jdcmzLg~1c*gjyX>}%0!AH#2FA$`L^Mztw{G;)>rI51>XyR58ck|6)& zD6m|B4#i=@M@cfQ&+Th>OWJuOH4Qfe%wUTFr65hWT~HI1VUn4+fbI^6LMQ)`CfXzs zb*lVFCH!ZBI139ycKX>wApO)Xjt7Ih2&T|Y9<6K)4C-VG5`<#J4RGlR9y3(lLr*ia)>=sQSfe zqnA~W;gfc=fM|#h7Zw0G+Qb%?QL1B}Y4D0&2)0G!!x9JViqzE55_jt9EF} zW*fG+c$V5vO*>F<@__90(`8R60@u1Mz8Hmtg;a_#M4SC^FFScV(QUSEU!Aq&oDu88T}eK0 zUfsK=w+*$@>;SB?1+j*_)ONvn{%Nz}B5$34D{1 zRXmFiqZ!Z_kQNuj+zWw@4p-kUgVteb{%< ze)8S*Qrk?8DU%czjtspJLTL{2O@l+LiTZ5Du}mnwc(01u7HL3VF70ew2@|N^MwMC$ z7PF5cp1K4WJk!Od<)R+SQk{tpo0TralTw_LX_UaZw3xNc8f&OTJ zXh~A+@L)B+c#*ojkQ$Ws8GQ_P24}bm^hAgRC|sYy{oeFm(L~;#K_3Nl4Qt*lE4%J> zbqPP$62oI|KLAQKP%^L?rgk*LgPlTQj6#gpVze8qT_l1b-WIOn3}MuB!q@*yT}UyoO(__g8_?u83yw zFdNlelN1U0c2RDNH7KpSh~b$cvT!wQ2clD~0>lzHN+GVMiAynGH1)0&14CXvn+E7Y zYzzIxW?6Z?{h7}eLa>^xc~W?Ypb1o*MDL9wZO1r6siI0@^7(X#oc4Xmdu@TMS}5z% znA&%k6WWOIU_DWiig$g4)z=jHLr@iM0mxWC;DotA(JWqaC;De>Oq?bhUXT4XIks1L z*!2~eBo20Ot4m74>9pHLrM)ZH$9xM$NIlr(s-HJ|^z}Rw2%0s!A!yobLo7WJOB4=b zrCnsT_G0TrRv~2{4>g2hzGAF>CZS#W?Vy` zFH12`R{f!d%zN_?OI2@e_rAMu#`*5dV>CMT?!#w;>~Y}(BqPmd@$>ezZhz{%JGII8 zHxHW6E`0YO2@9{d<5%}GO9Nco`)x53jM4+#G_^9{{j}1y;W~k2k3pijrwE?}m>t%C zl6yFk>&=ljvfdo2$ok0c>$P+3t@6U!eob$Z+x-xpx`?D8qTv|y0fl}K?Iw$IHoYaH zpS0Z(GcqM2eyi6`dVHD;4PNNl>GJqd>v4md}1YD}Iq%X}gDs!N3cCLZ^vr{L zVMgsqCDK^C`h<%HGNc5!F!x%~0kh@lYK($~5d4<9+F@kPf7fQ5W`GJP0%Y7=yX{!K zxNTUjXYE>Gmn|ulM$JRxCOAB2hTP##*=XV&F?Bpzy?AME60)IUFtu6%*rUf= zx=}nBbrfxJmk<^Ac_p>_C+x{sZ3B=x^|syuh;Wq)M&RZ|wVT8%kunr(rBc>QB(f02 zFf6p53JHSOESGa4_q@=v_=&ne_uidG^;s2W?%RaXjJEbWHMd%}H|hrPK}0(rOx$dZ zxS)3hzL7-sb%BzgCbwTD^LGSC4*)_%pCgRIvIhse(6NNV?NN$> z+KN|lLOiz`!R1EcYT8veEzy=X*O<+tjz?puut_^yB|OeE8qqBbx0y_=@ZRRK2Bl}Q zOHPOwE0f8Z^RDpWTC)0An7*R#xJuBFEO!RLs-M$_;hJ92do<}l;)Ce{s2>_ngLvCU z=sHyV$Q5axn#G>JH$&uTI|}zM zdDjkXZ=nV)f@ux`!h)d1+FK-07TJgD4X!VZkP+cYn+#B5GXxfQ)_fokU8=v|1!nA4PmdWayKt5p5Ii`xx7RXdkDT>Sy_;>t_5D4{J zX8U=^ua#5Is;RUzRAj_pAN8)I1h-}((y%Nh&~$^gvyfF14E<;l*Ft~yP>+(}I4}>~ z+$h;ujPZ3|MZIe-w&AK(Mcok>GICMBLFZ63^CG~DZ{?Qo)*V(4hxF?0P%Z^C%kMHG z3_vx_Lww*ctEEU*l{De`{WkC%@yZ&rg0f7_K81ZbNMuvXF%nGE>6Any<(-DJ(ZQgvpPKtAYEcK)=ewHtMHBue zOejK8!ARP7T5IojkyhV&BxE?;2<8by2$PX~Rnj?VdrW=QP|ef`=WOoTZU3=}F?UxW zU~li=z9ZZp>4T-(<=F(y^9w_xNzVrIPbB?rAx~|cKDE1A9q(A(w5YM|s%_k!re;NK z(vcLL?7cRFGQiz6Vsy9e?Ijac_3hkwme+=KG#Z@OGz7(2tv5J?Km-3l88mM&5QVeP zX)EMZ!w-a$<`X1+mttE7vErlGP^scbLpzZ-yw!p)8HNVsCp++wrj5ZOO+sm+f?{TYiac(}lDnUC-G5}S1B2AI7eggg);yQ%MdhQu^xPpJ( zvG~z*!(<92lp7{LP$7vVq_}n1;61LULteJSP2Y%E(#b~>QT`avKcZ=X5=0v7uCPeB zYl8;3JIlr$s3>$SWnw>+J`J8v9rdE9X}b!QqbW6#2N>wSX;~0@S6gW!5|EJ{%e?b8 zV5*LtS?baNAK@Q8k)>i{FiAibtW!(3uc>miHBUOwOqz>Uk*6kTwvJjO0b3vu+5(h) z8x$F3fl$=YfREW@Q|)H!KVUh$e`gBgl-H$?v|o-mA%`gqMkqS9Y=@pzYe3!kJ0v8Ts*x%22Yh$R zuy^dd5rl*QS2*#GMTzgGuokKc)IU!{w&|cFOo|evsV(TPHvI40eYrHBHNdPSvt&(b1MJ_5xLJaY zYFx(FTo6FDbV8l-Q(kAVR?%$3xI;MV-1n|oOZXAgb-26pq{-rZ`D|zj=0?7|3W^9! z(&Y2&fkli0r=h|F0@7|8xy^4U50C+G!>9M;fkvu6P9B8%>&XLRS*^vT^Fh#x(ZM%|KJd8f+HQiLvnt zdP_U``#FP!gULx4&Ot6w$y)E)(4-=wz`YQT9G>t{1S}kLM#M-p=oM?D4o`de{Mghk^>obE?|g z5NqVGwv^Qj-F@Rn;5bbj3qQII=_0-UtQ#sQ7 z%d*gW&9p2cz8Z2CAzU{howR??$~0QZTExRBtS#MHfYOmzUR9XDf`jNxD%?U(DiB^a zL&4Kl^DH2hl3bGyA;w)gv_s7jC&jddj(mZ476q}JR9U1Uzw1y&F21D4tb-^u)ZD?FtIbLDS za&N?}Yj=K$ z3ZjP0po>XUT0_kcJ8##F$m+dO{h;L&x_Y9@WYW-Ux<~UhC4_J?eQKUOxvC=qQ^&Wp zckVTKbm|@dq&&``dFy9bNTfgqRqt8FP%yT}udIP7X!O_-uIG*(!`a=P$+$ZoaDdz1 z(4_R;5>pLQZ>8J~V)y+wuU~bxDzMiC`y$FPav0?wzaDB@TzHbR{uQpFbs`c>C8kVdhUrplPh%m zh%z9%wbPA%0-_u23r#l1Y)_L{O_iz>0;Q;i5r!!eb7ETDxmmeF4|ccnxvL5@&_jnb zo4t3^e2^wQsnH0qf+C?rI-Sg&p@ZXkT*FqM9hD8%i#MQch~8**&cny3#{mV+9yx9- zOQRG>iB7LUx>?s_B_c8t97Mf&8cMhm9ilc@yfa4yHLBB~YH#DfjEaz!yA>{{Un<;V zqt8VS-7r3CT>hwW&_W;%mZ1^EVsE?Fb{$p7=yW`ll|r1ltW6#5G9i)yJ-JZFIUlfzq(8ucUwQd-lmTnq}$ePaKvbIP%vd!k#z zv`%}SaMgwj38tjeK+$Xrgy4(XtGbb|HS)qgDGp`lGMreuDtZ)JOk_ zEChnKEbO`5eDO(=XKnVXkyy#B-tOcfF$*MTcMqOy9h|ciOe%71%2PEnHT|te3k9$d z$rM@IYewe4{kNVuLh02OaM2-`Ww+sTkV<9h=_fXpXA?zd@OUF;#<=QOcAfd2dRjwo z>L!u()G$r*Nq7*c&Pc8CaXJjno5+Ts&3Si0kdO)orapAu3x3Ug0}4X3hTm-DJs_{T z8_y;b^k%*{FFt+MW=qyqA_0se)rY_1kpsB#`I>F0SwrlCQ6Y@sz>J4%4e|5&?l5R^5YnHyTA8H$?0Equ{2cEi5CLRX<0~NcBxLMyY`#7Nw~t zr(TB+xHR$0t;ez)JsYQA=q^!btq`3>C&i!h8VYR8GEj3_+b=MRp~vGV5-@-s2J2R(2Ijf)ug2*^sh1>S0QedU=P^ zHOPp1?)V|>AYMJ*Ml8Xqp5RC4ea13LsHqFKpAk#!=>n^|BbMrl18D#yM8xqq^V7Fr zp4GI^-NAeZQ;QmV%g+Ea}*37gJO<4wz0ogwwrYXY*T*S9Z@rsls=AkTZO zYCb*5BfT{ss~T$KNB1~vHu=6>M$i)s!~n@PWL3DmbWJF0L`MfBa#vovyf-Z5WR0E< z)Vt1-sGDc>@RwBnDdlH8G6nLnMpcY3ac>3U{L4v8$e4^Y6jVhY-NQk>{uCz4Bq>K^8)RrR=S zs>lu$Q%NH6rEauOXMy=i0Bb<;5lA|5785rOZ*`)0Ag1{1(#ZAFuw~Z3M)UAMoe*u_ zBprX}9^&45ZcC&H1wGDAy|I9%7;uL>nbKYh{nDg*Ewr?|d7x>kyG|}hsSo*CrUo(9 z0Tewg=SeU)XwdY)*7gA8NX_eh!Of7nsFGS@OzIu!IUM3=h@1?h>6n`5Q__8UQnx>c zulXf@cMtz&Y_KGg5E!AL2BE7#6Z=s;CrT}aufK%x25A22_`dmaet-QqG6bpeQsu1o zy=hNPRvS{AMSh!ek4zNJQrwAf)oZLyh(sX;H3xYri5L}O>JRGS8QidTIrK~~J*tHw zXOP8@=$&G7l0keboN%jao0^B6@*i1G_G+30ZhD>}eul*Lbt@SOonONhL+xiO79R$X zQ5ZltO$trt`A*`+@6^;`M8l$`m260mtr2l`%k^w9Q`DpA7w8sze`^{Gp?ao953usq zK($V!EZGrpS)|?JFeQk-96c9AliKDU*Sz_zdE}JI*jKD%J!MSnoEoNKC_TgO*}(Yj zt4`GERNfB#z2z%`{hW^rL%qL+|B6O3KX%QIj=RI8UoGDP9^IBN07~`KLt1W})chQ` zy@zsjul>?640E2Bo)`S1%JqT`&|}-rYozM=by8Ql?Ku{Jj}^if?UKJ~fhF(ab$r(9 zkpV?2!chO`eXxtvyLhv(FFeNsl+~d?LGKwvJ#&;KCUB|CzYSxWuOn>VPCY>lo{8ss zn*8e+n?ecB#)YIFam{#*0H!wg};Hh(vL{loAzj7u2_8ccH$KJRB55@l@1}SnM z+4qhYC%of@yjDK|V?Wb%?gndro{=?sd!9kmku<3Bsg2Qk6ZF%2&2Mj3>+j<_&kOt* z6Fk2ko)Ac%gS+3&gZ>`eNpU#Q;o+D#k=ccZu^g++bsRzKYz0OYMXTJ6A z^wd2o<$DfdYB_qyeN4%;M?6sfKCb?6E^fZN`p3opR5!kUHLta%j}7;Kx8H6AHQ)O5 z$AQH+mueVW$?@cd`A80KBB>Ebe&@XIuG9dg3Si0&)$XLTFn(F|YSn^avY=K7pW==PBKK5G+E6o3E3QfR$0QwZZoI zr#{W_=h9<@io=TZiWaW4g( zwwgPj%;6BVAoMt)J7=jK`Je}=U7d_LR2K;by-NiI$Mk6~XWq`vLfexD@uYjO(0(3= zXDhdWBFjw=E6_mcJ>sv2OF$8IoDt%qhrTrPoLrrcJAYWhjxU2y$*)0vvxnv({~Hs3 zHp(xTGylS4-(JqNKROv(!&sZ<0reEKp>EjH@ev(SYIW=B7Hh$lvw50=p%uSsuWIo% zZ6>Gnl$_`uZy=SC=0n@}QGGmWpx{I&KLJ!Uiox+uGt{ZQt0_o5>UR!33Mcga*D+>( z^H6ztsHy{0&;$_MexFJxJ|s<|hkl+TS#b0Wqvz-5_ZRMU?AvAT$)NO5!gqZ6j4m%| zHs3uD0x|a&koJ{%nqR5s$0vQBz>xlMVB72d43El^T&9*Pd@1?ns08p zc6x&CVcgO*dK82C&@_6MAzwaJO)L3B)2#kU)0DY?b&C0XWMhs9r?*W~@3tB$eC;-> zf>^^GRS!gYo+lUeP%k|*5qb3*KkIrN;MNg7?j})9wSPr*YzRoeDb=VMc#V$W=GQy| zv|kTW)oye1?X~5z-1jf>3K{S`qwdZc>KS#oFel{tr(TZ!zdPKy2k|faN%vILpAVgCctekq z((vhX=u#>1=zNW!K2L@o{yBE3w)nDdr!JEok9Lo7toO4W-st&4Man}U@I)t2u7dE2 zOl_&Y;_@zHzXztC)bxrXrN}Q)^zye30o+G2V!59OK#z9D)iK$}y!)iA^gONc+N$fh zWkZ8&N1P)$2u?2daqRb5$Ov7X3tEpgS&~K>^lbR3eGw8f^$gysv}=;u_l4T?nu8>+ zAw9Nfdu~djzjuzFOPSA|qX*PJbJedpZaZS^SLA(tHKg!S@5}r@Aufon_8av-0004m zX+uL$Nkc;*aB^>EX>4Tx0C=2zkv&MmKpe$iTct%R9qb??7_d575EXIMDionYs1;gu zFuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|=H{g6A|?JWDYS_3;J6>}?mh0_0scmX zsb<$WplX(pP9}tGZdC}rB7hJg7{-vqOnpuiQ}7&L_we!cF3z*O&;2=imAuISpFljz zbi*RvAfDc|bk6(4QC5-^;&b9LgDyz?$aUG}H_kjWYY7*QDULk!Ey()lA#h$ z5yuo&qkMnXWrgz=XSGset$XqphV$CWGS_JiB8f#TL4*JqHIz|-g*dGmDJIgipYZSx zIDU~_GP%lN;thv3l_Hp_E zWT>mu4RCM>j20<--Q(S%&ffk#)9UXBQe1MHUeQm900006VoOIv0Q>-N06&3hrvm^0 z010qNS#tmY3ljhU3ljkVnw%H_000McNlirujl@qtaxUDR->`FrLw9}z$T{@_5{Luv13=J# z5K{RF2&pY?wzRw)G7}ufGxORrvq^Tx(n?7*Y9fG03(5 zE_U>+hBoR206%fS@&aW08X~%u%4}cE;Lt{00q}d3Z#o5#&74_c4afia$l~)s#lst7 zPDbJX;K?hF8RUf3D6?`Skw=l2QkmUqXcn6Q4k~0^a-A`A-pc^~bbXT7#6nC<8?_4H zewD-XC48ag>w;h6I~#4t?%vKRJQ90y03f340pJYkz~P3|(9D?gcL4j^s3!yFeaZzo zacqxLnSIGc8^Gg2DI#J4F&d63#`zP`4iPQXl_0Jj0Pbj`)|h$HUrrx=wI$|sa2a&F2dLUNJeakGYooSV01?sJoRWjp z5=j8un^S;RS~D>sTAVd>Qki|$rjvfIchc2p|Ih<;u_Dl0=N6#0t8tPx_S(d+a)ZSbeo7SH7G=XZkcIO>>;9!RAv*# z^S>Sgl=pe+9QEhLc@w&}vu;ecSjQionpoa_q`Wo3Qmjx;8}(|_h1MNT`j}IExTh&a z@0y52Vky7Gd70bXFH!cpi@-L!cU|}3oeFK16&4Y49-VS)>m6)UF{GAQ1dF31UIDkD~A6$BYYF;i+ zIVODSmf4^zH0L)xinHoj2S$jJD|ks&h6-S6QRj?`UVClCP85rXQ$!tY)Rh?oXVr<` zg5`reVA(fbU+k(kq>XwLz$dw!cT$;s+_6cOnpF@$zWjoS7E+l#>_FkN=+(L$_PSZO z%{|F-OtR-;&3fHYGZAfa&h;x~YysGh?FJyWZ4k5D+NjdXgmdwe%P1c!V{gL^n)YD= zJ0FWeh=-gVY$(S&M`vgAEjF$$T*`1EoAy0GJwQD`GcyKtA-#=%-nHhNG>J+P@;GS@ zMFC_@o{Wa$+P;c5YB7~rUBr7fmDw*{0~6a`jWsb=lZsP%Oaq*=@IlY?PP%%m^#E0m ze|vyhuGi)bpo4h^sIuJ=ng=y$ceEM81J3Vj^PuD$GIpAy7VH71mBIM}6y{hELQFVw zHjr^j|GpOMi`5>W9-tne9-wyet{$N3@o1(p>4@<}4mx?5^N*dK2P^7)Ltg$p9^^dp csO>!HKTb#ngo=uOGXMYp07*qoM6N<$g1Oo}TL1t6 literal 0 HcmV?d00001 diff --git a/emoji/26B3.png b/emoji/26B3.png new file mode 100644 index 0000000000000000000000000000000000000000..28ff2d0d92e91e649f8cf5c6d3a2392ecf3b2470 GIT binary patch literal 10855 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 literal 0 HcmV?d00001 diff --git a/emoji/26E2.png b/emoji/26E2.png new file mode 100644 index 0000000000000000000000000000000000000000..ad2a7b89113171452f8c27d0fc3a7592e58d1499 GIT binary patch literal 19773 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
F#A`{=aRO}AD{b8@)t&aBqXZ@{wg-nBKd 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 E0o(SvUH||9 literal 0 HcmV?d00001 diff --git a/emoji/2700.png b/emoji/2700.png new file mode 100644 index 0000000000000000000000000000000000000000..0012f48b7da154c0530a8f9c806234577181dcb8 GIT binary patch literal 2240 zcmZ{l3pf+%AIHsRZgW{?oSCzY&868~HYCaBHrE-^+2~kt%B`}r7;;=nh@_Ou>`XdH zN<{xqk;_Cv!s(E1QWR3TbC|PE&%dYV-}(QZ=e_(s@Avonz3==1Ev3Q zzs*8Yl$S6W85uYne&R&RKkJ{nuX%t#;J5m(g8w&>9LC1R1_py+Fc=&TCz0vlaB6C5 zC=`mtVxrOLuYt0%V1YpJ#r;x(&*y)sD+&L?B|CRjRYo8Xc6L;AbF#9sG6VvVEYay6 zZmLS0hzLtdOBEFr3Gwvwl*Aev8|UVp_w)0U5WKt`5{blOu|YwBMn*;!xo%X>NFMGiHM2^qT1ypbkwyYK-{U1z?eNhB}w2q-uT4pcf@?E73_sscEyWz6zvB z_#2md_`PQ=NR>D>>ycsw4P&91z9rM|9C1uWBe=XP-LK2ck%p`l?|SZGW0 zU0+|{Qi@r)CalWd+*(O7%m8f#hn}{?-=b})bF#!M$a$eOkDBOV73I4;Y}~aqnq9VT z)7Vs~t9{JO;D)2crLwY9r!slb(JURUc2QeqW=5PbuB@yS3WfTj5m{(N`K7W_9Lh#n z@z4+InJ5HtlX4%!_V#AoA{&$6ZOwREaIZ}&#oJAT;G6tlP!de_+SGKt!tK5wdQ*V9#d+J>gCz zjR#wWdtd8jh?nOoR zshkLOJvu0pf5DV5%zr*rIIM)75S<^sPZOgSr{hq+PV_b|B}`=f_AJebtfMz^h`0f4 z4-GU^HP#~OS;O29MOw{_B|QmbcgB+^R+ca3`^%sj1U%%>gF}b2(Wgn96&?SwnmJsO zc~&-((u2tw6N*4F0;a?JK!H7A(*KRk5OaSJ@|ud<8yQ#{D_k?U2eSNN3au2NCf(J- zj4LP*5;^tnIOqPf+qy6%9b8w}yI!;upjed$=AXLKo;Z^_(N`Kj&5NjaeYK2x1xy^8jWdk=Kp-|awn9Udi`Z_$IJlG-1@NQi5KaNV8aX8T{yD& z(tVw6%bis6;LJj1~vyYbFK6fMq#W!7hB8|t@M*B2h zEDgxDPS`bKoIL&tZClbRZPZlmzt)=Ad9!y`SmOb9_$A-Cjg!+kI$B6dyMOtyE@BR2`ZgU_ED>}s;x=wud&TKvT>I7&MU-j=*^CLx7X9Y zm+SmZB4B_z|CpTma+3AC)q|$?U^vUN%jTSW?j+dn%~bgcKd7K?6|7@PKG;Ve3&`^7i)3 zt%~TJjizwnk!WYE}Jy-t&3J-tk9Kx=7Yo98OWa#KYvZ8Z{zlm}45~ z_r%~pQ21b1wUl6!^et#aI&!wryl8`V*8OU+8=hr{Kn&aZRrN=xTIna=ca@*YSE-0( zmGYbL1da757;Zd~Ud#0yP%eU9Y_@#EWi)uc^dP0(I9N#uT>a=WYG`tFq*pU$@2QSS zH`D5@waPU`2G1oeose$AhfM#pF<;BegIXj+-C3G$INBcx-s27CW(O<$?odx0jCCM$ zp^-J-0`U0{XL|HRuDenM?RmcZ>`ByOa}T@lOiC9qlCFujFrdGkBrq|MeWhAc<;3{o z{qXEUMy-uW@D`-{aUZk@o{eV)R6m`K{q(p>H$mqaoB^k2=enQIiJ>MZWe0>D08}=6 z9!Jt{?nN15DxLn5O1MDTk9jS}byaG^dZ6i+;hi^u-Q;S2k)LtK3 zdrZ*d$#y-dD)M686kO#ru;W~W#*KH(7~z%|p{zgH;U>;DVax8LpZ`1;N4mo`yWPou E1E|rUcK`qY literal 0 HcmV?d00001 diff --git a/emoji/default_emoji.json b/emoji/default_emoji.json index 59a231cfc..d4818af2e 100644 --- a/emoji/default_emoji.json +++ b/emoji/default_emoji.json @@ -23,6 +23,8 @@ "atomsymbol": "269B", "autorickshaw": "1F6FA", "babyangel": "1F47C", + "demon": "1F47F", + "devil": "1F47F", "backhandindexpointingup": "1F446", "badminton": "1F3F8", "badger": "1F9A1", @@ -121,14 +123,12 @@ "desktopcomputer": "1F5A5", "diamond": "2666", "dieface1": "2680", - "digitzero": "0030", "dinosaur": "1F995", "dismay": "1F623", "divingmask": "1F93F", "dizzyface": "1F635", "dog": "1F415", "dogface": "1F436", - "dominotilehorizontalback": "1F030", "donut": "1F369", "doublecurlyloop": "27BF", "doubledfemalesign": "26A2", @@ -141,7 +141,6 @@ "ear": "1F442", "earwithhearingaid": "1F9BB", "eat": "1F37D", - "eight": "0038", "eightspokedasterisk": "2733", "ejectbutton": "23CF", "elephant": "1F418", @@ -163,14 +162,12 @@ "filmframes": "1F39E", "filmprojector": "1F4FD", "finish": "1F3C1", - "five": "0035", "flexedbiceps": "1F4AA", "floppydisk": "1F4BE", "football": "26BD", "football2": "1F3C9", "forkandknifewithplate": "1F37D", "fountain": "26F2", - "four": "0034", "framedpicture": "1F5BC", "frogface": "1F438", "frown": "1F626", @@ -192,6 +189,8 @@ "guidedog": "1F9AE", "halloween": "1F383", "wrench": "1F527", + "handgun": "1F52B", + "pistol": "1F52B", "spanner": "1F527", "hammer": "1F528", "hammerandpick": "2692", @@ -207,7 +206,6 @@ "heartanarchy2": "heartanarchy2", "heartexclamation": "2763", "hearttipleft": "1F394", - "heavycircle": "26E3", "hedgehog": "1F994", "helmsymbol": "2388", "hen": "1F414", @@ -232,6 +230,7 @@ "keyboard": "2328", "keyboard2": "1F3B9", "kickscooter": "1F6F4", + "diamondblue": "1F48E", "kiss": "1F48F", "kissing": "1F617", "kissingface": "1F617", @@ -247,7 +246,6 @@ "laughingcat": "1F639", "leafygreen": "1F96C", "leftarrow": "2B05", - "lefthandtelephonereceiver": "1F57B", "leftrightarrow": "2194", "leftspeechbubble": "1F5E8", "leg": "1F9B5", @@ -264,7 +262,6 @@ "loveletter": "1F48C", "loveyougesture": "1F91F", "mahjongreddragon": "1F004", - "mahjongtileeastwind": "1F000", "male": "2642", "mandancing": "1F57A", "maninsuitlevitating": "1F574", @@ -282,15 +279,10 @@ "music": "1F3B5", "nailpolish": "1F485", "network": "E249", - "neuter": "26B2", - "neutralchessking": "1FA00", "noentry": "26D4", - "none": "0039", - "numbersign": "0023", "obutton(bloodtype)": "1F17E", "octopus": "1F419", "om": "1F549", - "one": "0031", "oneo\u2019clock": "1F550", "onion": "1F9C5", "ophiuchus": "26CE", @@ -298,7 +290,6 @@ "orangecircle": "1F7E0", "orca": "1F433", "orthodoxcross": "2626", - "outlinedwhitestar": "269D", "owl": "1F989", "partalternationmark": "303D", "partyingface": "1F973", @@ -350,7 +341,6 @@ "radioactive": "2622", "rainbow": "1F308", "raisedfist": "270A", - "raisedmrsign": "1F16C", "rat": "1F400", "recycle": "267B", "recycling": "267B", @@ -360,18 +350,15 @@ "registered": "00AE", "rescueworkershelmet": "26D1", "reversebutton": "25C0", - "reversedrotatedfloralheartbullet": "2619", "ribbon": "1F380", "rightangerbubble": "1F5EF", "rightarrow": "27A1", "rightarrowcurvingleft": "21A9", "rightarrowcurvingup": "2934", - "rightspeaker": "1F568", "ringedplanet": "1FA90", "robot": "1F916", "rocket": "1F680", "rose": "1F339", - "roundedsymbolforfu": "1F260", "rugby": "1F3C8", "sad": "1F614", "sadcat": "1F63F", @@ -386,7 +373,6 @@ "scissors": "2702", "secret": "1F92B", "selfie": "1F933", - "seven": "0037", "shamrock": "2618", "shark": "1F988", "sheep": "1F411", @@ -397,7 +383,6 @@ "sick": "1F915", "signofthehorns": "1F918", "silly": "1F92A", - "six": "0036", "skate": "1F3BF", "skateboard": "1F6F9", "skier": "26F7", @@ -430,13 +415,11 @@ "stopsign": "1F6D1", "strawberry": "1F353", "studiomicrophone": "1F399", - "stupa": "1F6D3", "sun": "2600", "sunbehindsmallcloud": "1F324", "superhero": "1F9B8", "swim": "1F3CA", "tabletennis": "1F3D3", - "tagspace": "E0020", "tea": "1F372", "telephone": "260E", "tennisball": "1F3BE", @@ -455,13 +438,9 @@ "turtle": "1F422", "twitter": "E040", "birdsite": "E040", - "two": "0032", "umbrellawithraindrops": "2614", "unamusedface": "1F612", - "universalrecyclingsymbol": "2672", - "upperbladescissors": "2701", "upsidedownface": "1F643", - "variationselector16": "FE0F", "victoryhand": "270C", "videocamera": "1F4F9", "violin": "1F3BB", @@ -471,32 +450,23 @@ "waveman": "1F64B-1F3FE-200D-2642-FE0F", "wavewoman": "1F64B-1F3FE-200D-2640-FE0F", "wavydash": "3030", - "westsyriaccross": "2670", "wheelchairsymbol": "267F", "wheelchair": "1F9BD", "wheelofdharma": "2638", "whitecircle": "26AA", - "whitedraughtsman": "26C0", - "whiteflag": "2690", "whiteheart": "1F90D", - "whitelatincross": "1F546", "whitemediumsmallsquare": "25FD", "whitemediumsquare": "25FB", - "whitepennant": "1F3F1", - "whiteshogipiece": "2616", "wiltedflower": "1F940", "wine": "1F377", "winkingfacewithtongue": "1F61C", "worldmap": "1F5FA", "worried": "1F627", "worriedface": "1F61F", - "xiangqiredgeneral": "1FA60", "yawn": "1F971", "yawningface": "1F971", "yoyo": "1FA80", "zebra": "1F993", - "zero": "0030", - "zerowidthjoiner": "200D", "zippermouthface": "1F910", "ghost": "1F47B", "spaceinvader": "1F47E", @@ -759,6 +729,8 @@ "snake": "2695", "battle": "2694", "crown": "1F451", + "shirt": "1F454", + "tshirt": "1F455", "sunflower": "1F33B", "honey": "1F36F", "bee": "1F41D", @@ -766,7 +738,6 @@ "ladybug": "1F41E", "fish": "1F41F", "mobilityscooter": "1F9BC", - "sad": "sad", "globe": "1F30D", "world": "1F30E", "planet": "1F30D", diff --git a/tests.py b/tests.py index 26c8bff6b..baf92a34c 100644 --- a/tests.py +++ b/tests.py @@ -3400,9 +3400,24 @@ def testCamelCaseSplit(): assert camelCaseSplit(testStr) == 'Notcamelcase test' +def testEmojiImages(): + print('testEmojiImages') + emojiFilename = 'emoji/default_emoji.json' + assert os.path.isfile(emojiFilename) + emojiJson = loadJson(emojiFilename) + assert emojiJson + for emojiName, emojiImage in emojiJson.items(): + emojiImageFilename = 'emoji/' + emojiImage + '.png' + if not os.path.isfile(emojiImageFilename): + print('Missing emoji image ' + emojiName + ' ' + + emojiImage + '.png') + assert os.path.isfile(emojiImageFilename) + + def runAllTests(): print('Running tests...') testFunctions() + testEmojiImages() testCamelCaseSplit() testSpeakerReplaceLinks() testExtractTextFieldsInPOST() From c90fc15c1264446d594a702ddc0ccc26aa8c14ef Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Mar 2021 21:07:28 +0000 Subject: [PATCH 0360/1416] Tidying of role functions --- roles.py | 111 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 60 insertions(+), 51 deletions(-) diff --git a/roles.py b/roles.py index d0f05602d..dcdc549ba 100644 --- a/roles.py +++ b/roles.py @@ -18,30 +18,10 @@ from utils import loadJson from utils import saveJson -def clearModeratorStatus(baseDir: str) -> None: - """Removes moderator status from all accounts +def _clearRoleStatus(baseDir: str, role: str) -> None: + """Removes role status from all accounts This could be slow if there are many users, but only happens - rarely when moderators are appointed or removed - """ - directory = os.fsencode(baseDir + '/accounts/') - for f in os.scandir(directory): - f = f.name - filename = os.fsdecode(f) - if filename.endswith(".json") and '@' in filename: - filename = os.path.join(baseDir + '/accounts/', filename) - if '"moderator"' in open(filename).read(): - actorJson = loadJson(filename) - if actorJson: - if actorJson['roles'].get('instance'): - if 'moderator' in actorJson['roles']['instance']: - actorJson['roles']['instance'].remove('moderator') - saveJson(actorJson, filename) - - -def clearEditorStatus(baseDir: str) -> None: - """Removes editor status from all accounts - This could be slow if there are many users, but only happens - rarely when editors are appointed or removed + rarely when roles are appointed or removed """ directory = os.fsencode(baseDir + '/accounts/') for f in os.scandir(directory): @@ -52,59 +32,88 @@ def clearEditorStatus(baseDir: str) -> None: if not filename.endswith(".json"): continue filename = os.path.join(baseDir + '/accounts/', filename) - if '"editor"' not in open(filename).read(): + if '"' + role + '"' not in open(filename).read(): continue actorJson = loadJson(filename) if not actorJson: continue if actorJson['roles'].get('instance'): - if 'editor' in actorJson['roles']['instance']: - actorJson['roles']['instance'].remove('editor') + if role in actorJson['roles']['instance']: + actorJson['roles']['instance'].remove(role) saveJson(actorJson, filename) -def _addModerator(baseDir: str, nickname: str, domain: str) -> None: - """Adds a moderator nickname to the file +def clearEditorStatus(baseDir: str) -> None: + """Removes editor status from all accounts + This could be slow if there are many users, but only happens + rarely when editors are appointed or removed + """ + _clearRoleStatus(baseDir, 'editor') + + +def clearModeratorStatus(baseDir: str) -> None: + """Removes moderator status from all accounts + This could be slow if there are many users, but only happens + rarely when moderators are appointed or removed + """ + _clearRoleStatus(baseDir, 'moderator') + + +def _addRole(baseDir: str, nickname: str, domain: str, + roleFilename: str) -> None: + """Adds a role nickname to the file """ if ':' in domain: domain = domain.split(':')[0] - moderatorsFile = baseDir + '/accounts/moderators.txt' - if os.path.isfile(moderatorsFile): + roleFile = baseDir + '/accounts/' + roleFilename + if os.path.isfile(roleFile): # is this nickname already in the file? - with open(moderatorsFile, "r") as f: + with open(roleFile, "r") as f: lines = f.readlines() - for moderator in lines: - moderator = moderator.strip('\n').strip('\r') - if moderator == nickname: + for roleNickname in lines: + roleNickname = roleNickname.strip('\n').strip('\r') + if roleNickname == nickname: return lines.append(nickname) - with open(moderatorsFile, 'w+') as f: - for moderator in lines: - moderator = moderator.strip('\n').strip('\r') - if len(moderator) > 1: + with open(roleFile, 'w+') as f: + for roleNickname in lines: + roleNickname = roleNickname.strip('\n').strip('\r') + if len(roleNickname) > 1: if os.path.isdir(baseDir + '/accounts/' + - moderator + '@' + domain): - f.write(moderator + '\n') + roleNickname + '@' + domain): + f.write(roleNickname + '\n') else: - with open(moderatorsFile, "w+") as f: + with open(roleFile, "w+") as f: if os.path.isdir(baseDir + '/accounts/' + nickname + '@' + domain): f.write(nickname + '\n') -def _removeModerator(baseDir: str, nickname: str): - """Removes a moderator nickname from the file +def _addModerator(baseDir: str, nickname: str, domain: str) -> None: + """Adds a moderator nickname to the file """ - moderatorsFile = baseDir + '/accounts/moderators.txt' - if not os.path.isfile(moderatorsFile): + _addRole(baseDir, nickname, domain, 'moderators.txt') + + +def _removeRole(baseDir: str, nickname: str, roleFilename: str) -> None: + """Removes a role nickname from the file + """ + roleFile = baseDir + '/accounts/' + roleFilename + if not os.path.isfile(roleFile): return - with open(moderatorsFile, "r") as f: + with open(roleFile, "r") as f: lines = f.readlines() - with open(moderatorsFile, 'w+') as f: - for moderator in lines: - moderator = moderator.strip('\n').strip('\r') - if len(moderator) > 1 and moderator != nickname: - f.write(moderator + '\n') + with open(roleFile, 'w+') as f: + for roleNickname in lines: + roleNickname = roleNickname.strip('\n').strip('\r') + if len(roleNickname) > 1 and roleNickname != nickname: + f.write(roleNickname + '\n') + + +def _removeModerator(baseDir: str, nickname: str) -> None: + """Adds a moderator nickname to the file + """ + _removeRole(baseDir, nickname, 'moderators.txt') def setRole(baseDir: str, nickname: str, domain: str, From d463e62ee5fc7c811f1071bda94ced6692d1d22a Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Mar 2021 21:18:20 +0000 Subject: [PATCH 0361/1416] Tidying --- roles.py | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/roles.py b/roles.py index dcdc549ba..51a43b624 100644 --- a/roles.py +++ b/roles.py @@ -89,12 +89,6 @@ def _addRole(baseDir: str, nickname: str, domain: str, f.write(nickname + '\n') -def _addModerator(baseDir: str, nickname: str, domain: str) -> None: - """Adds a moderator nickname to the file - """ - _addRole(baseDir, nickname, domain, 'moderators.txt') - - def _removeRole(baseDir: str, nickname: str, roleFilename: str) -> None: """Removes a role nickname from the file """ @@ -110,12 +104,6 @@ def _removeRole(baseDir: str, nickname: str, roleFilename: str) -> None: f.write(roleNickname + '\n') -def _removeModerator(baseDir: str, nickname: str) -> None: - """Adds a moderator nickname to the file - """ - _removeRole(baseDir, nickname, 'moderators.txt') - - def setRole(baseDir: str, nickname: str, domain: str, project: str, role: str) -> bool: """Set a person's role within a project @@ -129,12 +117,18 @@ def setRole(baseDir: str, nickname: str, domain: str, if not os.path.isfile(actorFilename): return False + roleFiles = { + "moderator": "moderators.txt", + "editor": "editors.txt" + } + actorJson = loadJson(actorFilename) if actorJson: if role: # add the role - if project == 'instance' and 'role' == 'moderator': - _addModerator(baseDir, nickname, domain) + if project == 'instance': + if roleFiles.get(role): + _addRole(baseDir, nickname, domain, roleFiles[role]) if actorJson['roles'].get(project): if role not in actorJson['roles'][project]: actorJson['roles'][project].append(role) @@ -143,7 +137,7 @@ def setRole(baseDir: str, nickname: str, domain: str, else: # remove the role if project == 'instance': - _removeModerator(baseDir, nickname) + _removeRole(baseDir, nickname, roleFiles[role]) if actorJson['roles'].get(project): actorJson['roles'][project].remove(role) # if the project contains no roles then remove it From 206a56414a6bf292bec3e470abc5d1977577d146 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Mar 2021 21:19:37 +0000 Subject: [PATCH 0362/1416] Check that role file exists --- roles.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/roles.py b/roles.py index 51a43b624..15d381648 100644 --- a/roles.py +++ b/roles.py @@ -137,7 +137,8 @@ def setRole(baseDir: str, nickname: str, domain: str, else: # remove the role if project == 'instance': - _removeRole(baseDir, nickname, roleFiles[role]) + if roleFiles.get(role): + _removeRole(baseDir, nickname, roleFiles[role]) if actorJson['roles'].get(project): actorJson['roles'][project].remove(role) # if the project contains no roles then remove it From 0825990ebaa798f223b21d0b780dbf17190ce96f Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Mar 2021 21:29:41 +0000 Subject: [PATCH 0363/1416] Ensure that the domain is obtained when removing an account --- epicyon.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/epicyon.py b/epicyon.py index b6ce17bd4..6f5731532 100644 --- a/epicyon.py +++ b/epicyon.py @@ -1703,6 +1703,10 @@ if args.rmaccount: if not args.domain or not getConfigParam(baseDir, 'domain'): print('Use the --domain option to set the domain name') sys.exit() + if args.domain: + domain = args.domain + else: + domain = getConfigParam(baseDir, 'domain') configuredDomain = getConfigParam(baseDir, 'domain') if configuredDomain: From 8c809f6f20c014781e09929f689c2b598c274de1 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Mar 2021 21:36:17 +0000 Subject: [PATCH 0364/1416] Extract nickname from login screen if full handle has been given --- webapp_login.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/webapp_login.py b/webapp_login.py index b0e893d08..4ddb42601 100644 --- a/webapp_login.py +++ b/webapp_login.py @@ -37,6 +37,9 @@ def htmlGetLoginCredentials(loginParams: str, if '=' in arg: if arg.split('=', 1)[0] == 'username': nickname = arg.split('=', 1)[1] + if '@' in nickname: + # the full nickname@domain has been entered + nickname = nickname.split('@')[0] elif arg.split('=', 1)[0] == 'password': password = arg.split('=', 1)[1] elif arg.split('=', 1)[0] == 'register': From 93aec5d4d91677accca126be198883bdadf6bf18 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Mar 2021 21:44:44 +0000 Subject: [PATCH 0365/1416] If handle is given at login then check the domain --- daemon.py | 4 +++- webapp_login.py | 7 +++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/daemon.py b/daemon.py index cfefb8300..d4d009d6c 100644 --- a/daemon.py +++ b/daemon.py @@ -1463,7 +1463,9 @@ class PubServer(BaseHTTPRequestHandler): return loginNickname, loginPassword, register = \ - htmlGetLoginCredentials(loginParams, self.server.lastLoginTime) + htmlGetLoginCredentials(loginParams, + self.server.lastLoginTime, + self.server.domain) if loginNickname: if isSystemAccount(loginNickname): print('Invalid username login: ' + loginNickname + diff --git a/webapp_login.py b/webapp_login.py index 4ddb42601..608bb27cb 100644 --- a/webapp_login.py +++ b/webapp_login.py @@ -18,7 +18,8 @@ from theme import getTextModeLogo def htmlGetLoginCredentials(loginParams: str, - lastLoginTime: int) -> (str, str, bool): + lastLoginTime: int, + domain: str) -> (str, str, bool): """Receives login credentials via HTTPServer POST """ if not loginParams.startswith('username='): @@ -39,7 +40,9 @@ def htmlGetLoginCredentials(loginParams: str, nickname = arg.split('=', 1)[1] if '@' in nickname: # the full nickname@domain has been entered - nickname = nickname.split('@')[0] + handleDomain = nickname.split('@')[1].strip() + if handleDomain == domain: + nickname = nickname.split('@')[0] elif arg.split('=', 1)[0] == 'password': password = arg.split('=', 1)[1] elif arg.split('=', 1)[0] == 'register': From a5903579bbd737b14a184df76dbd9373c7d3ee55 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Mar 2021 21:47:55 +0000 Subject: [PATCH 0366/1416] Remove any initial @ from the login nickname/handle --- webapp_login.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/webapp_login.py b/webapp_login.py index 608bb27cb..0b47a2f8c 100644 --- a/webapp_login.py +++ b/webapp_login.py @@ -38,6 +38,8 @@ def htmlGetLoginCredentials(loginParams: str, if '=' in arg: if arg.split('=', 1)[0] == 'username': nickname = arg.split('=', 1)[1] + if nickname.startswith('@'): + nickname = nickname[1:] if '@' in nickname: # the full nickname@domain has been entered handleDomain = nickname.split('@')[1].strip() From ed995be8f03266ca5242bfd45c7c1d9d9910d4cf Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Mar 2021 22:00:33 +0000 Subject: [PATCH 0367/1416] Pronounce javascript files --- speaker.py | 1 + 1 file changed, 1 insertion(+) diff --git a/speaker.py b/speaker.py index 45baf9d96..2cf4a4a46 100644 --- a/speaker.py +++ b/speaker.py @@ -81,6 +81,7 @@ def _speakerPronounce(baseDir: str, sayText: str, translate: {}) -> str: "XMPP": "X-M-P-P", "xmpp": "X-M-P-P", "sql": "S-Q-L", + ".js": ".J-S", "PSQL": "Postgres S-Q-L", "SQL": "S-Q-L", "coop": "co-op", From 72be5162cd8c0ee9cb8a486d5ffad22d7569925c Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Mar 2021 22:02:54 +0000 Subject: [PATCH 0368/1416] Pronounce javascript files --- speaker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/speaker.py b/speaker.py index 2cf4a4a46..06360e5ce 100644 --- a/speaker.py +++ b/speaker.py @@ -81,7 +81,7 @@ def _speakerPronounce(baseDir: str, sayText: str, translate: {}) -> str: "XMPP": "X-M-P-P", "xmpp": "X-M-P-P", "sql": "S-Q-L", - ".js": ".J-S", + ".js": " dot J-S", "PSQL": "Postgres S-Q-L", "SQL": "S-Q-L", "coop": "co-op", From 6c374efdb5604da773e89e755af77d89721614ad Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Mar 2021 22:24:29 +0000 Subject: [PATCH 0369/1416] Translate heart emoji for speaker --- speaker.py | 3 +++ translations/ar.json | 3 ++- translations/ca.json | 3 ++- translations/cy.json | 3 ++- translations/de.json | 3 ++- translations/en.json | 3 ++- translations/es.json | 3 ++- translations/fr.json | 3 ++- translations/ga.json | 3 ++- translations/hi.json | 3 ++- translations/it.json | 3 ++- translations/ja.json | 3 ++- translations/ku.json | 3 ++- translations/oc.json | 3 ++- translations/pt.json | 3 ++- translations/ru.json | 3 ++- translations/zh.json | 3 ++- 17 files changed, 35 insertions(+), 16 deletions(-) diff --git a/speaker.py b/speaker.py index 06360e5ce..2b6ab90cc 100644 --- a/speaker.py +++ b/speaker.py @@ -380,6 +380,9 @@ def _postToSpeakerJson(baseDir: str, nickname: str, domain: str, content = urllib.parse.unquote_plus(postJsonObject['object']['content']) content = html.unescape(content) content = content.replace('

', '').replace('

', ' ') + # replace some emoji before removing html + if ' <3' in content: + content = content.replace(' <3', ' ' + translate['heart']) content = removeHtml(htmlReplaceQuoteMarks(content)) content = speakerReplaceLinks(content, translate, detectedLinks) content = _speakerPronounce(baseDir, content, translate) diff --git a/translations/ar.json b/translations/ar.json index 872bb6f69..1d24ec0a6 100644 --- a/translations/ar.json +++ b/translations/ar.json @@ -396,5 +396,6 @@ "Filtering and Blocking": "التصفية والحظر", "Role Assignment": "تعيين الدور", "Contact Details": "بيانات المتصل", - "Background Images": "صور الخلفية" + "Background Images": "صور الخلفية", + "heart": "قلب" } diff --git a/translations/ca.json b/translations/ca.json index 05fd736f3..85b3ac232 100644 --- a/translations/ca.json +++ b/translations/ca.json @@ -396,5 +396,6 @@ "Filtering and Blocking": "Filtratge i bloqueig", "Role Assignment": "Assignació de funcions", "Contact Details": "Detalls de contacte", - "Background Images": "Imatges de fons" + "Background Images": "Imatges de fons", + "heart": "cor" } diff --git a/translations/cy.json b/translations/cy.json index 43bc66b67..23078b289 100644 --- a/translations/cy.json +++ b/translations/cy.json @@ -396,5 +396,6 @@ "Filtering and Blocking": "Hidlo a Blocio", "Role Assignment": "Aseiniad Rôl", "Background Images": "Delweddau Cefndir", - "Contact Details": "Manylion cyswllt" + "Contact Details": "Manylion cyswllt", + "heart": "galon" } diff --git a/translations/de.json b/translations/de.json index a7e2e6d87..7e159cc44 100644 --- a/translations/de.json +++ b/translations/de.json @@ -396,5 +396,6 @@ "Filtering and Blocking": "Filtern und Blockieren", "Role Assignment": "Rollenzuweisung", "Background Images": "Hintergrundbilder", - "Contact Details": "Kontaktdetails" + "Contact Details": "Kontaktdetails", + "heart": "herz" } diff --git a/translations/en.json b/translations/en.json index 1f5f1a1de..7a683ec94 100644 --- a/translations/en.json +++ b/translations/en.json @@ -396,5 +396,6 @@ "Filtering and Blocking": "Filtering and Blocking", "Role Assignment": "Role Assignment", "Contact Details": "Contact Details", - "Background Images": "Background Images" + "Background Images": "Background Images", + "heart": "heart" } diff --git a/translations/es.json b/translations/es.json index 9414179e0..0709b730e 100644 --- a/translations/es.json +++ b/translations/es.json @@ -396,5 +396,6 @@ "Filtering and Blocking": "Filtrado y bloqueo", "Role Assignment": "Asignación de roles", "Background Images": "Imágenes de fondo", - "Contact Details": "Detalles de contacto" + "Contact Details": "Detalles de contacto", + "heart": "corazón" } diff --git a/translations/fr.json b/translations/fr.json index 3aba51267..a41db9837 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -396,5 +396,6 @@ "Filtering and Blocking": "Filtrage et blocage", "Role Assignment": "Attribution de rôle", "Background Images": "Images d'arrière-plan", - "Contact Details": "Détails du contact" + "Contact Details": "Détails du contact", + "heart": "cœur" } diff --git a/translations/ga.json b/translations/ga.json index cb98b3e88..eb9c3a270 100644 --- a/translations/ga.json +++ b/translations/ga.json @@ -396,5 +396,6 @@ "Filtering and Blocking": "Scagadh agus Blocáil", "Role Assignment": "Sannadh Róil", "Background Images": "Íomhánna Cúlra", - "Contact Details": "Sonraí Teagmhála" + "Contact Details": "Sonraí Teagmhála", + "heart": "chroí" } diff --git a/translations/hi.json b/translations/hi.json index d890c16ba..85415821a 100644 --- a/translations/hi.json +++ b/translations/hi.json @@ -396,5 +396,6 @@ "Filtering and Blocking": "छानना और अवरुद्ध करना", "Role Assignment": "भूमिका असाइनमेंट", "Background Images": "पृष्ठभूमि छवियों", - "Contact Details": "सम्पर्क करने का विवरण" + "Contact Details": "सम्पर्क करने का विवरण", + "heart": "दिल" } diff --git a/translations/it.json b/translations/it.json index be3e43443..07d2527b2 100644 --- a/translations/it.json +++ b/translations/it.json @@ -396,5 +396,6 @@ "Filtering and Blocking": "Filtraggio e blocco", "Role Assignment": "Assegnazione del ruolo", "Background Images": "Immagini di sfondo", - "Contact Details": "Dettagli del contatto" + "Contact Details": "Dettagli del contatto", + "heart": "cuore" } diff --git a/translations/ja.json b/translations/ja.json index d5ef7d006..a84dbd084 100644 --- a/translations/ja.json +++ b/translations/ja.json @@ -396,5 +396,6 @@ "Filtering and Blocking": "フィルタリングとブロッキング", "Role Assignment": "役割の割り当て", "Background Images": "背景画像", - "Contact Details": "連絡先の詳細" + "Contact Details": "連絡先の詳細", + "heart": "ハート" } diff --git a/translations/ku.json b/translations/ku.json index 64633d5d2..5809b110f 100644 --- a/translations/ku.json +++ b/translations/ku.json @@ -396,5 +396,6 @@ "Filtering and Blocking": "Fîlterkirin û Astengkirin", "Role Assignment": "Erk Rol", "Contact Details": "Agahdariyên Têkiliyê", - "Background Images": "Wêneyên Paşê" + "Background Images": "Wêneyên Paşê", + "heart": "dil" } diff --git a/translations/oc.json b/translations/oc.json index f8495c139..454434982 100644 --- a/translations/oc.json +++ b/translations/oc.json @@ -392,5 +392,6 @@ "Filtering and Blocking": "Filtering and Blocking", "Role Assignment": "Role Assignment", "Background Images": "Background Images", - "Contact Details": "Contact Details" + "Contact Details": "Contact Details", + "heart": "heart" } diff --git a/translations/pt.json b/translations/pt.json index 54ffea0d8..a39029135 100644 --- a/translations/pt.json +++ b/translations/pt.json @@ -396,5 +396,6 @@ "Filtering and Blocking": "Filtragem e Bloqueio", "Role Assignment": "Atribuição de Função", "Background Images": "Imagens de fundo", - "Contact Details": "Detalhes do contato" + "Contact Details": "Detalhes do contato", + "heart": "coração" } diff --git a/translations/ru.json b/translations/ru.json index f171d543c..825fdcd46 100644 --- a/translations/ru.json +++ b/translations/ru.json @@ -396,5 +396,6 @@ "Filtering and Blocking": "Фильтрация и блокировка", "Role Assignment": "Назначение ролей", "Background Images": "Фоновые изображения", - "Contact Details": "Контактная информация" + "Contact Details": "Контактная информация", + "heart": "сердце" } diff --git a/translations/zh.json b/translations/zh.json index 493e6e184..443592235 100644 --- a/translations/zh.json +++ b/translations/zh.json @@ -396,5 +396,6 @@ "Filtering and Blocking": "过滤和阻止", "Role Assignment": "角色分配", "Background Images": "背景图片", - "Contact Details": "联系方式" + "Contact Details": "联系方式", + "heart": "心" } From 863f9ff6c0528f55435c22495955bb5fb608e6ae Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 8 Mar 2021 23:03:02 +0000 Subject: [PATCH 0370/1416] Counselor role --- daemon.py | 58 ++++++++++++++++++++++++++++++++++++++++++++ roles.py | 11 ++++++++- translations/ar.json | 4 ++- translations/ca.json | 4 ++- translations/cy.json | 4 ++- translations/de.json | 4 ++- translations/en.json | 4 ++- translations/es.json | 4 ++- translations/fr.json | 4 ++- translations/ga.json | 4 ++- translations/hi.json | 4 ++- translations/it.json | 4 ++- translations/ja.json | 4 ++- translations/ku.json | 4 ++- translations/oc.json | 4 ++- translations/pt.json | 4 ++- translations/ru.json | 4 ++- translations/zh.json | 4 ++- webapp_profile.py | 14 +++++++++++ 19 files changed, 130 insertions(+), 17 deletions(-) diff --git a/daemon.py b/daemon.py index d4d009d6c..5ea50f7ff 100644 --- a/daemon.py +++ b/daemon.py @@ -120,6 +120,7 @@ from blocking import getDomainBlocklist from roles import setRole from roles import clearModeratorStatus from roles import clearEditorStatus +from roles import clearCounselorStatus from blog import htmlBlogPageRSS2 from blog import htmlBlogPageRSS3 from blog import htmlBlogView @@ -4728,6 +4729,63 @@ class PubServer(BaseHTTPRequestHandler): 'instance', 'editor') + # change site counselors list + if fields.get('counselors'): + if path.startswith('/users/' + + adminNickname + '/'): + counselorsFile = \ + baseDir + \ + '/accounts/counselors.txt' + clearCounselorStatus(baseDir) + if ',' in fields['counselors']: + # if the list was given as comma separated + edFile = open(counselorsFile, "w+") + eds = fields['counselors'].split(',') + for edNick in eds: + edNick = edNick.strip() + edDir = baseDir + \ + '/accounts/' + edNick + \ + '@' + domain + if os.path.isdir(edDir): + edFile.write(edNick + '\n') + edFile.close() + eds = fields['counselors'].split(',') + for edNick in eds: + edNick = edNick.strip() + edDir = baseDir + \ + '/accounts/' + edNick + \ + '@' + domain + if os.path.isdir(edDir): + setRole(baseDir, + edNick, domain, + 'instance', 'counselor') + else: + # nicknames on separate lines + edFile = open(counselorsFile, "w+") + eds = fields['counselors'].split('\n') + for edNick in eds: + edNick = edNick.strip() + edDir = \ + baseDir + \ + '/accounts/' + edNick + \ + '@' + domain + if os.path.isdir(edDir): + edFile.write(edNick + '\n') + edFile.close() + eds = fields['counselors'].split('\n') + for edNick in eds: + edNick = edNick.strip() + edDir = \ + baseDir + \ + '/accounts/' + \ + edNick + '@' + \ + domain + if os.path.isdir(edDir): + setRole(baseDir, + edNick, domain, + 'instance', + 'counselor') + # remove scheduled posts if fields.get('removeScheduledPosts'): if fields['removeScheduledPosts'] == 'on': diff --git a/roles.py b/roles.py index 15d381648..a0d055d9d 100644 --- a/roles.py +++ b/roles.py @@ -51,6 +51,14 @@ def clearEditorStatus(baseDir: str) -> None: _clearRoleStatus(baseDir, 'editor') +def clearCounselorStatus(baseDir: str) -> None: + """Removes counselor status from all accounts + This could be slow if there are many users, but only happens + rarely when counselors are appointed or removed + """ + _clearRoleStatus(baseDir, 'editor') + + def clearModeratorStatus(baseDir: str) -> None: """Removes moderator status from all accounts This could be slow if there are many users, but only happens @@ -119,7 +127,8 @@ def setRole(baseDir: str, nickname: str, domain: str, roleFiles = { "moderator": "moderators.txt", - "editor": "editors.txt" + "editor": "editors.txt", + "counselor": "counselors.txt" } actorJson = loadJson(actorFilename) diff --git a/translations/ar.json b/translations/ar.json index 1d24ec0a6..f030124dc 100644 --- a/translations/ar.json +++ b/translations/ar.json @@ -397,5 +397,7 @@ "Role Assignment": "تعيين الدور", "Contact Details": "بيانات المتصل", "Background Images": "صور الخلفية", - "heart": "قلب" + "heart": "قلب", + "counselor": "مستشار", + "Counselors": "المستشارين" } diff --git a/translations/ca.json b/translations/ca.json index 85b3ac232..a0007c55d 100644 --- a/translations/ca.json +++ b/translations/ca.json @@ -397,5 +397,7 @@ "Role Assignment": "Assignació de funcions", "Contact Details": "Detalls de contacte", "Background Images": "Imatges de fons", - "heart": "cor" + "heart": "cor", + "counselor": "conseller", + "Counselors": "Consellers" } diff --git a/translations/cy.json b/translations/cy.json index 23078b289..7ed539a03 100644 --- a/translations/cy.json +++ b/translations/cy.json @@ -397,5 +397,7 @@ "Role Assignment": "Aseiniad Rôl", "Background Images": "Delweddau Cefndir", "Contact Details": "Manylion cyswllt", - "heart": "galon" + "heart": "galon", + "counselor": "cynghorydd", + "Counselors": "Cynghorwyr" } diff --git a/translations/de.json b/translations/de.json index 7e159cc44..435ca103a 100644 --- a/translations/de.json +++ b/translations/de.json @@ -397,5 +397,7 @@ "Role Assignment": "Rollenzuweisung", "Background Images": "Hintergrundbilder", "Contact Details": "Kontaktdetails", - "heart": "herz" + "heart": "herz", + "counselor": "Beraterin", + "Counselors": "Berater" } diff --git a/translations/en.json b/translations/en.json index 7a683ec94..ac5baf042 100644 --- a/translations/en.json +++ b/translations/en.json @@ -397,5 +397,7 @@ "Role Assignment": "Role Assignment", "Contact Details": "Contact Details", "Background Images": "Background Images", - "heart": "heart" + "heart": "heart", + "counselor": "counselor", + "Counselors": "Counselors" } diff --git a/translations/es.json b/translations/es.json index 0709b730e..2660bf339 100644 --- a/translations/es.json +++ b/translations/es.json @@ -397,5 +397,7 @@ "Role Assignment": "Asignación de roles", "Background Images": "Imágenes de fondo", "Contact Details": "Detalles de contacto", - "heart": "corazón" + "heart": "corazón", + "counselor": "Consejera", + "Counselors": "Consejeras" } diff --git a/translations/fr.json b/translations/fr.json index a41db9837..784e6fe2c 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -397,5 +397,7 @@ "Role Assignment": "Attribution de rôle", "Background Images": "Images d'arrière-plan", "Contact Details": "Détails du contact", - "heart": "cœur" + "heart": "cœur", + "counselor": "Conseillère", + "Counselors": "Conseillères" } diff --git a/translations/ga.json b/translations/ga.json index eb9c3a270..3a792e9d9 100644 --- a/translations/ga.json +++ b/translations/ga.json @@ -397,5 +397,7 @@ "Role Assignment": "Sannadh Róil", "Background Images": "Íomhánna Cúlra", "Contact Details": "Sonraí Teagmhála", - "heart": "chroí" + "heart": "chroí", + "counselor": "Comhairleoir", + "Counselors": "Comhairleoirí" } diff --git a/translations/hi.json b/translations/hi.json index 85415821a..70b701f8a 100644 --- a/translations/hi.json +++ b/translations/hi.json @@ -397,5 +397,7 @@ "Role Assignment": "भूमिका असाइनमेंट", "Background Images": "पृष्ठभूमि छवियों", "Contact Details": "सम्पर्क करने का विवरण", - "heart": "दिल" + "heart": "दिल", + "counselor": "काउंसलर", + "Counselors": "सलाहकार" } diff --git a/translations/it.json b/translations/it.json index 07d2527b2..1634f537d 100644 --- a/translations/it.json +++ b/translations/it.json @@ -397,5 +397,7 @@ "Role Assignment": "Assegnazione del ruolo", "Background Images": "Immagini di sfondo", "Contact Details": "Dettagli del contatto", - "heart": "cuore" + "heart": "cuore", + "counselor": "Consulente", + "Counselors": "Consiglieri" } diff --git a/translations/ja.json b/translations/ja.json index a84dbd084..0771a6559 100644 --- a/translations/ja.json +++ b/translations/ja.json @@ -397,5 +397,7 @@ "Role Assignment": "役割の割り当て", "Background Images": "背景画像", "Contact Details": "連絡先の詳細", - "heart": "ハート" + "heart": "ハート", + "counselor": "カウンセラー", + "Counselors": "カウンセラー" } diff --git a/translations/ku.json b/translations/ku.json index 5809b110f..a5a937809 100644 --- a/translations/ku.json +++ b/translations/ku.json @@ -397,5 +397,7 @@ "Role Assignment": "Erk Rol", "Contact Details": "Agahdariyên Têkiliyê", "Background Images": "Wêneyên Paşê", - "heart": "dil" + "heart": "dil", + "counselor": "Pêşnîyarvan", + "Counselors": "Selêwirmendan" } diff --git a/translations/oc.json b/translations/oc.json index 454434982..9921ce049 100644 --- a/translations/oc.json +++ b/translations/oc.json @@ -393,5 +393,7 @@ "Role Assignment": "Role Assignment", "Background Images": "Background Images", "Contact Details": "Contact Details", - "heart": "heart" + "heart": "heart", + "counselor": "Counselors", + "Counselors": "Counselors" } diff --git a/translations/pt.json b/translations/pt.json index a39029135..ab453fba9 100644 --- a/translations/pt.json +++ b/translations/pt.json @@ -397,5 +397,7 @@ "Role Assignment": "Atribuição de Função", "Background Images": "Imagens de fundo", "Contact Details": "Detalhes do contato", - "heart": "coração" + "heart": "coração", + "counselor": "Conselheira", + "Counselors": "Conselheiras" } diff --git a/translations/ru.json b/translations/ru.json index 825fdcd46..8678ff20a 100644 --- a/translations/ru.json +++ b/translations/ru.json @@ -397,5 +397,7 @@ "Role Assignment": "Назначение ролей", "Background Images": "Фоновые изображения", "Contact Details": "Контактная информация", - "heart": "сердце" + "heart": "сердце", + "counselor": "Советник", + "Counselors": "Советники" } diff --git a/translations/zh.json b/translations/zh.json index 443592235..61a5de055 100644 --- a/translations/zh.json +++ b/translations/zh.json @@ -397,5 +397,7 @@ "Role Assignment": "角色分配", "Background Images": "背景图片", "Contact Details": "联系方式", - "heart": "心" + "heart": "心", + "counselor": "顾问", + "Counselors": "辅导员" } diff --git a/webapp_profile.py b/webapp_profile.py index 272719eb5..0b5bb8db1 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -1387,6 +1387,20 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, ' ' + + # counselors + counselors = '' + counselorsFile = baseDir + '/accounts/counselors.txt' + if os.path.isfile(counselorsFile): + with open(counselorsFile, "r") as f: + counselors = f.read() + roleAssignStr += '
\n' + roleAssignStr += \ + ' ' roleAssignStr += '

' if len(boxFilenames) == 0: historySearchForm += \ From 4a351100f8d7aff8241ae6726aea057f94fc7e5f Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 3 May 2021 23:33:12 +0100 Subject: [PATCH 0871/1416] Search results title --- webapp_search.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp_search.py b/webapp_search.py index 83cd0625d..7148e57d2 100644 --- a/webapp_search.py +++ b/webapp_search.py @@ -561,7 +561,7 @@ def htmlHistorySearch(cssCache: {}, translate: {}, baseDir: str, domainFull = getFullDomain(domain, port) actor = httpPrefix + '://' + domainFull + '/users/' + nickname historySearchTitle = '🔍 ' + translate['Your Posts'] - if boxName == 'tlbookmarks': + if boxName == 'bookmarks': historySearchTitle = '🔍 ' + translate['Bookmarks'] historySearchForm += \ From d5c23b4dff5bb73430be7c810b527ee475a57456 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 3 May 2021 23:35:45 +0100 Subject: [PATCH 0872/1416] Consistent terminology --- translations/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/translations/en.json b/translations/en.json index 3997c6488..c8a29aed5 100644 --- a/translations/en.json +++ b/translations/en.json @@ -90,7 +90,7 @@ "View": "View", "Stop blocking": "Stop blocking", "Enter an emoji name to search for": "Enter an emoji name to search for", - "Enter an address, shared item, !history, #hashtag, *skill or :emoji: to search for": "Enter an address, shared item, -bookmark, !history, #hashtag, *skill or :emoji: to search for", + "Enter an address, shared item, !history, #hashtag, *skill or :emoji: to search for": "Enter an address, shared item, -save, !history, #hashtag, *skill or :emoji: to search for", "Go Back": "◀", "Moderation Information": "Moderation Information", "Suspended accounts": "Suspended accounts", From eeeec162977bb95016a39aef7b490a0802ce0b37 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 4 May 2021 10:39:15 +0100 Subject: [PATCH 0873/1416] Include documents within nodeinfo --- daemon.py | 13 +++++++++++++ metadata.py | 9 ++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/daemon.py b/daemon.py index fb4893ac4..9808b2cee 100644 --- a/daemon.py +++ b/daemon.py @@ -988,7 +988,20 @@ class PubServer(BaseHTTPRequestHandler): if brochMode: showNodeInfoAccounts = False + if callingDomain.endswith('.onion') and \ + self.server.onionDomain: + instanceUrl = 'http://' + self.server.onionDomain + elif (callingDomain.endswith('.i2p') and + self.server.i2pDomain): + instanceUrl = 'http://' + self.server.i2pDomain + else: + instanceUrl = \ + self.server.httpPrefix + '://' + self.server.domainFull + + aboutUrl = instanceUrl + '/about' + termsOfServiceUrl = instanceUrl + '/terms' info = metaDataNodeInfo(self.server.baseDir, + aboutUrl, termsOfServiceUrl, self.server.registration, nodeInfoVersion, showNodeInfoAccounts) diff --git a/metadata.py b/metadata.py index 4b512bffa..046461a91 100644 --- a/metadata.py +++ b/metadata.py @@ -12,7 +12,10 @@ from utils import noOfAccounts from utils import noOfActiveAccountsMonthly -def metaDataNodeInfo(baseDir: str, registration: bool, version: str, +def metaDataNodeInfo(baseDir: str, + aboutUrl: str, + termsOfServiceUrl: str, + registration: bool, version: str, showAccounts: bool) -> {}: """ /nodeinfo/2.0 endpoint Also see https://socialhub.activitypub.rocks/t/ @@ -40,6 +43,10 @@ def metaDataNodeInfo(baseDir: str, registration: bool, version: str, 'name': 'epicyon', 'version': version }, + 'documents': { + 'about': aboutUrl, + 'terms': termsOfServiceUrl + }, 'usage': { 'localPosts': 1, 'users': { From 4b82938b7c291e8231287b67678b99506c0ecdec Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 4 May 2021 11:17:06 +0100 Subject: [PATCH 0874/1416] Tidying --- daemon.py | 61 +++++++++++++++++++++++++++++++++++++---------------- metadata.py | 6 +++--- 2 files changed, 46 insertions(+), 21 deletions(-) diff --git a/daemon.py b/daemon.py index 9808b2cee..d4d951794 100644 --- a/daemon.py +++ b/daemon.py @@ -822,7 +822,12 @@ class PubServer(BaseHTTPRequestHandler): authorized: bool, httpPrefix: str, baseDir: str, nickname: str, domain: str, - domainFull: str) -> bool: + domainFull: str, + onionDomain: str, i2pDomain: str, + translate: {}, + registration: bool, + systemLanguage: str, + projectVersion: str) -> bool: """This is a vestigil mastodon API for the purpose of returning an empty result to sites like https://mastopeek.app-dist.eu @@ -900,30 +905,37 @@ class PubServer(BaseHTTPRequestHandler): sendJson = [] sendJsonStr = 'masto API timelines sent' - adminNickname = getConfigParam(self.server.baseDir, 'admin') + adminNickname = getConfigParam(baseDir, 'admin') if adminNickname and path == '/api/v1/instance': instanceDescriptionShort = \ - getConfigParam(self.server.baseDir, + getConfigParam(baseDir, 'instanceDescriptionShort') if not instanceDescriptionShort: instanceDescriptionShort = \ - self.server.translate['Yet another Epicyon Instance'] - instanceDescription = getConfigParam(self.server.baseDir, + translate['Yet another Epicyon Instance'] + instanceDescription = getConfigParam(baseDir, 'instanceDescription') - instanceTitle = getConfigParam(self.server.baseDir, - 'instanceTitle') + instanceTitle = getConfigParam(baseDir, 'instanceTitle') + + if callingDomain.endswith('.onion') and onionDomain: + domainFull = onionDomain + httpPrefix = 'http' + elif (callingDomain.endswith('.i2p') and i2pDomain): + domainFull = i2pDomain + httpPrefix = 'http' + sendJson = \ metaDataInstance(instanceTitle, instanceDescriptionShort, instanceDescription, - self.server.httpPrefix, - self.server.baseDir, + httpPrefix, + baseDir, adminNickname, - self.server.domain, - self.server.domainFull, - self.server.registration, - self.server.systemLanguage, - self.server.projectVersion) + domain, + domainFull, + registration, + systemLanguage, + projectVersion) sendJsonStr = 'masto API instance metadata sent' elif path.startswith('/api/v1/instance/peers'): # This is just a dummy result. @@ -931,7 +943,7 @@ class PubServer(BaseHTTPRequestHandler): # On a large instance you are somewhat lost in the crowd, but on # small instances a full list of peers would convey a lot of # information about the interests of a small number of accounts - sendJson = ['mastodon.social', self.server.domainFull] + sendJson = ['mastodon.social', domainFull] sendJsonStr = 'masto API peers metadata sent' elif path.startswith('/api/v1/instance/activity'): sendJson = [] @@ -962,10 +974,17 @@ class PubServer(BaseHTTPRequestHandler): def _mastoApi(self, path: str, callingDomain: str, authorized: bool, httpPrefix: str, baseDir: str, nickname: str, domain: str, - domainFull: str) -> bool: + domainFull: str, + onionDomain: str, i2pDomain: str, + translate: {}, + registration: bool, + systemLanguage: str, + projectVersion: str) -> bool: return self._mastoApiV1(path, callingDomain, authorized, httpPrefix, baseDir, nickname, domain, - domainFull) + domainFull, onionDomain, i2pDomain, + translate, registration, systemLanguage, + projectVersion) def _nodeinfo(self, callingDomain: str) -> bool: if not self.path.startswith('/nodeinfo/2.0'): @@ -10801,7 +10820,13 @@ class PubServer(BaseHTTPRequestHandler): self.server.baseDir, self.authorizedNickname, self.server.domain, - self.server.domainFull): + self.server.domainFull, + self.server.onionDomain, + self.server.i2pDomain, + self.server.translate, + self.server.registration, + self.server.systemLanguage, + self.server.projectVersion): return self._benchmarkGETtimings(GETstartTime, GETtimings, diff --git a/metadata.py b/metadata.py index 046461a91..c8bee73c1 100644 --- a/metadata.py +++ b/metadata.py @@ -105,13 +105,13 @@ def metaDataInstance(instanceTitle: str, 'id': '1', 'last_status_at': '2019-07-01T10:30:00Z', 'locked': adminActor['manuallyApprovesFollowers'], - 'note': '

Admin of '+domain+'

', + 'note': '

Admin of ' + domain + '

', 'statuses_count': 1, 'url': url, 'username': adminActor['preferredUsername'] }, 'description': instanceDescription, - 'email': 'admin@'+domain, + 'email': 'admin@' + domain, 'languages': [systemLanguage], 'registrations': registration, 'short_description': instanceDescriptionShort, @@ -120,7 +120,7 @@ def metaDataInstance(instanceTitle: str, 'status_count': 1, 'user_count': noOfAccounts(baseDir) }, - 'thumbnail': httpPrefix+'://'+domainFull+'/login.png', + 'thumbnail': httpPrefix + '://' + domainFull + '/login.png', 'title': instanceTitle, 'uri': domainFull, 'urls': {}, From 8b476f745d48cef0ae945e43ef2b40787818de6e Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 4 May 2021 13:04:31 +0100 Subject: [PATCH 0875/1416] Declate before use --- daemon.py | 115 ++++++++++++++---------------------------------------- 1 file changed, 30 insertions(+), 85 deletions(-) diff --git a/daemon.py b/daemon.py index d4d951794..721c9c1ad 100644 --- a/daemon.py +++ b/daemon.py @@ -312,6 +312,20 @@ def saveDomainQrcode(baseDir: str, httpPrefix: str, class PubServer(BaseHTTPRequestHandler): protocol_version = 'HTTP/1.1' + def _getInstalceUrl(self, callingDomain: str) -> str: + """Returns the URL for this instance + """ + if callingDomain.endswith('.onion') and \ + self.server.onionDomain: + instanceUrl = 'http://' + self.server.onionDomain + elif (callingDomain.endswith('.i2p') and + self.server.i2pDomain): + instanceUrl = 'http://' + self.server.i2pDomain + else: + instanceUrl = \ + self.server.httpPrefix + '://' + self.server.domainFull + return instanceUrl + def _getheaderSignatureInput(self): """There are different versions of http signatures with different header styles @@ -1007,16 +1021,7 @@ class PubServer(BaseHTTPRequestHandler): if brochMode: showNodeInfoAccounts = False - if callingDomain.endswith('.onion') and \ - self.server.onionDomain: - instanceUrl = 'http://' + self.server.onionDomain - elif (callingDomain.endswith('.i2p') and - self.server.i2pDomain): - instanceUrl = 'http://' + self.server.i2pDomain - else: - instanceUrl = \ - self.server.httpPrefix + '://' + self.server.domainFull - + instanceUrl = self._getInstalceUrl(callingDomain) aboutUrl = instanceUrl + '/about' termsOfServiceUrl = instanceUrl + '/terms' info = metaDataNodeInfo(self.server.baseDir, @@ -1621,6 +1626,7 @@ class PubServer(BaseHTTPRequestHandler): """ usersPath = path.replace('/moderationaction', '') nickname = usersPath.replace('/users/', '') + actorStr = httpPrefix + '://' + domainFull + usersPath if not isModerator(self.server.baseDir, nickname): if callingDomain.endswith('.onion') and onionDomain: actorStr = 'http://' + onionDomain + usersPath @@ -1631,7 +1637,6 @@ class PubServer(BaseHTTPRequestHandler): self.server.POSTbusy = False return - actorStr = httpPrefix + '://' + domainFull + usersPath length = int(self.headers['Content-length']) try: @@ -6321,12 +6326,7 @@ class PubServer(BaseHTTPRequestHandler): if not self.postToNickname: print('WARN: unable to find nickname in ' + actor) self.server.GETbusy = False - actorAbsolute = \ - httpPrefix + '://' + domainFull + actor - if callingDomain.endswith('.onion') and onionDomain: - actorAbsolute = 'http://' + onionDomain + actor - elif (callingDomain.endswith('.i2p') and i2pDomain): - actorAbsolute = 'http://' + i2pDomain + actor + actorAbsolute = self._getInstalceUrl(callingDomain) + actor actorPathStr = \ actorAbsolute + '/' + timelineStr + \ '?page=' + str(pageNumber) @@ -6368,12 +6368,8 @@ class PubServer(BaseHTTPRequestHandler): if self.server.iconsCache.get('repeat.png'): del self.server.iconsCache['repeat.png'] self._postToOutboxThread(announceJson) - self.server.GETbusy = False - actorAbsolute = httpPrefix + '://' + domainFull + actor - if callingDomain.endswith('.onion') and onionDomain: - actorAbsolute = 'http://' + onionDomain + actor - elif callingDomain.endswith('.i2p') and i2pDomain: - actorAbsolute = 'http://' + i2pDomain + actor + self.server.GETbusy = False + actorAbsolute = self._getInstalceUrl(callingDomain) + actor actorPathStr = \ actorAbsolute + '/' + timelineStr + '?page=' + \ str(pageNumber) + timelineBookmark @@ -6420,11 +6416,7 @@ class PubServer(BaseHTTPRequestHandler): if not self.postToNickname: print('WARN: unable to find nickname in ' + actor) self.server.GETbusy = False - actorAbsolute = httpPrefix + '://' + domainFull + actor - if callingDomain.endswith('.onion') and onionDomain: - actorAbsolute = 'http://' + onionDomain + actor - elif (callingDomain.endswith('.i2p') and i2pDomain): - actorAbsolute = 'http://' + i2pDomain + actor + actorAbsolute = self._getInstalceUrl(callingDomain) + actor actorPathStr = \ actorAbsolute + '/' + timelineStr + '?page=' + \ str(pageNumber) @@ -6463,11 +6455,7 @@ class PubServer(BaseHTTPRequestHandler): del self.server.iconsCache['repeat_inactive.png'] self._postToOutboxThread(newUndoAnnounce) self.server.GETbusy = False - actorAbsolute = httpPrefix + '://' + domainFull + actor - if callingDomain.endswith('.onion') and onionDomain: - actorAbsolute = 'http://' + onionDomain + actor - elif (callingDomain.endswith('.i2p') and i2pDomain): - actorAbsolute = 'http://' + i2pDomain + actor + actorAbsolute = self._getInstalceUrl(callingDomain) + actor actorPathStr = \ actorAbsolute + '/' + timelineStr + '?page=' + \ str(pageNumber) + timelineBookmark @@ -6725,12 +6713,7 @@ class PubServer(BaseHTTPRequestHandler): if not self.postToNickname: print('WARN: unable to find nickname in ' + actor) self.server.GETbusy = False - actorAbsolute = \ - httpPrefix + '://' + domainFull + actor - if callingDomain.endswith('.onion') and onionDomain: - actorAbsolute = 'http://' + onionDomain + actor - elif (callingDomain.endswith('.i2p') and i2pDomain): - actorAbsolute = 'http://' + i2pDomain + actor + actorAbsolute = self._getInstalceUrl(callingDomain) + actor actorPathStr = \ actorAbsolute + '/' + timelineStr + \ '?page=' + str(pageNumber) + timelineBookmark @@ -6780,12 +6763,7 @@ class PubServer(BaseHTTPRequestHandler): # send out the like to followers self._postToOutbox(likeJson, self.server.projectVersion) self.server.GETbusy = False - actorAbsolute = \ - httpPrefix + '://' + domainFull + actor - if callingDomain.endswith('.onion') and onionDomain: - actorAbsolute = 'http://' + onionDomain + actor - elif (callingDomain.endswith('.i2p') and i2pDomain): - actorAbsolute = 'http://' + i2pDomain + actor + actorAbsolute = self._getInstalceUrl(callingDomain) + actor actorPathStr = \ actorAbsolute + '/' + timelineStr + \ '?page=' + str(pageNumber) + timelineBookmark @@ -6832,12 +6810,7 @@ class PubServer(BaseHTTPRequestHandler): if not self.postToNickname: print('WARN: unable to find nickname in ' + actor) self.server.GETbusy = False - actorAbsolute = \ - httpPrefix + '://' + domainFull + actor - if callingDomain.endswith('.onion') and onionDomain: - actorAbsolute = 'http://' + onionDomain + actor - elif (callingDomain.endswith('.i2p') and onionDomain): - actorAbsolute = 'http://' + i2pDomain + actor + actorAbsolute = self._getInstalceUrl(callingDomain) + actor actorPathStr = \ actorAbsolute + '/' + timelineStr + \ '?page=' + str(pageNumber) @@ -6887,11 +6860,7 @@ class PubServer(BaseHTTPRequestHandler): # send out the undo like to followers self._postToOutbox(undoLikeJson, self.server.projectVersion) self.server.GETbusy = False - actorAbsolute = httpPrefix + '://' + domainFull + actor - if callingDomain.endswith('.onion') and onionDomain: - actorAbsolute = 'http://' + onionDomain + actor - elif callingDomain.endswith('.i2p') and i2pDomain: - actorAbsolute = 'http://' + i2pDomain + actor + actorAbsolute = self._getInstalceUrl(callingDomain) + actor actorPathStr = \ actorAbsolute + '/' + timelineStr + \ '?page=' + str(pageNumber) + timelineBookmark @@ -6939,12 +6908,7 @@ class PubServer(BaseHTTPRequestHandler): if not self.postToNickname: print('WARN: unable to find nickname in ' + actor) self.server.GETbusy = False - actorAbsolute = \ - httpPrefix + '://' + domainFull + actor - if callingDomain.endswith('.onion') and onionDomain: - actorAbsolute = 'http://' + onionDomain + actor - elif callingDomain.endswith('.i2p') and i2pDomain: - actorAbsolute = 'http://' + i2pDomain + actor + actorAbsolute = self._getInstalceUrl(callingDomain) + actor actorPathStr = \ actorAbsolute + '/' + timelineStr + \ '?page=' + str(pageNumber) @@ -6983,12 +6947,7 @@ class PubServer(BaseHTTPRequestHandler): del self.server.iconsCache['bookmark.png'] # self._postToOutbox(bookmarkJson, self.server.projectVersion) self.server.GETbusy = False - actorAbsolute = \ - httpPrefix + '://' + domainFull + actor - if callingDomain.endswith('.onion') and onionDomain: - actorAbsolute = 'http://' + onionDomain + actor - elif callingDomain.endswith('.i2p') and i2pDomain: - actorAbsolute = 'http://' + i2pDomain + actor + actorAbsolute = self._getInstalceUrl(callingDomain) + actor actorPathStr = \ actorAbsolute + '/' + timelineStr + \ '?page=' + str(pageNumber) + timelineBookmark @@ -7035,12 +6994,7 @@ class PubServer(BaseHTTPRequestHandler): if not self.postToNickname: print('WARN: unable to find nickname in ' + actor) self.server.GETbusy = False - actorAbsolute = \ - httpPrefix + '://' + domainFull + actor - if callingDomain.endswith('.onion') and onionDomain: - actorAbsolute = 'http://' + onionDomain + actor - elif callingDomain.endswith('.i2p') and i2pDomain: - actorAbsolute = 'http://' + i2pDomain + actor + actorAbsolute = self._getInstalceUrl(callingDomain) + actor actorPathStr = \ actorAbsolute + '/' + timelineStr + \ '?page=' + str(pageNumber) @@ -7079,12 +7033,7 @@ class PubServer(BaseHTTPRequestHandler): del self.server.iconsCache['bookmark_inactive.png'] # self._postToOutbox(undoBookmarkJson, self.server.projectVersion) self.server.GETbusy = False - actorAbsolute = \ - httpPrefix + '://' + domainFull + actor - if callingDomain.endswith('.onion') and onionDomain: - actorAbsolute = 'http://' + onionDomain + actor - elif callingDomain.endswith('.i2p') and i2pDomain: - actorAbsolute = 'http://' + i2pDomain + actor + actorAbsolute = self._getInstalceUrl(callingDomain) + actor actorPathStr = \ actorAbsolute + '/' + timelineStr + \ '?page=' + str(pageNumber) + timelineBookmark @@ -7689,11 +7638,7 @@ class PubServer(BaseHTTPRequestHandler): self.server.GETbusy = False return True actor = path.replace('/skills', '') - actorAbsolute = httpPrefix + '://' + domainFull + actor - if callingDomain.endswith('.onion') and onionDomain: - actorAbsolute = 'http://' + onionDomain + actor - elif callingDomain.endswith('.i2p') and i2pDomain: - actorAbsolute = 'http://' + i2pDomain + actor + actorAbsolute = self._getInstalceUrl(callingDomain) + actor self._redirect_headers(actorAbsolute, cookie, callingDomain) self.server.GETbusy = False return True From fd51d6322d971f058ab27a6023ac3165113491b1 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 4 May 2021 13:23:52 +0100 Subject: [PATCH 0876/1416] Tidying --- daemon.py | 185 +++++------------------------------------------------- 1 file changed, 14 insertions(+), 171 deletions(-) diff --git a/daemon.py b/daemon.py index 721c9c1ad..6724ce694 100644 --- a/daemon.py +++ b/daemon.py @@ -1626,14 +1626,10 @@ class PubServer(BaseHTTPRequestHandler): """ usersPath = path.replace('/moderationaction', '') nickname = usersPath.replace('/users/', '') - actorStr = httpPrefix + '://' + domainFull + usersPath + actorStr = self._getInstalceUrl(callingDomain) + usersPath if not isModerator(self.server.baseDir, nickname): - if callingDomain.endswith('.onion') and onionDomain: - actorStr = 'http://' + onionDomain + usersPath - elif (callingDomain.endswith('.i2p') and i2pDomain): - actorStr = 'http://' + i2pDomain + usersPath - self._redirect_headers(actorStr + '/moderation', - cookie, callingDomain) + self._redirect_headers(actorStr + '/moderation', + cookie, callingDomain) self.server.POSTbusy = False return @@ -1823,10 +1819,6 @@ class PubServer(BaseHTTPRequestHandler): debug, self.server.recentPostsCache) - if callingDomain.endswith('.onion') and onionDomain: - actorStr = 'http://' + onionDomain + usersPath - elif (callingDomain.endswith('.i2p') and i2pDomain): - actorStr = 'http://' + i2pDomain + usersPath self._redirect_headers(actorStr + '/moderation', cookie, callingDomain) self.server.POSTbusy = False @@ -2795,7 +2787,7 @@ class PubServer(BaseHTTPRequestHandler): path = path.split('?page=')[0] usersPath = path.replace('/searchhandle', '') - actorStr = httpPrefix + '://' + domainFull + usersPath + actorStr = self._getInstalceUrl(callingDomain) + usersPath length = int(self.headers['Content-length']) try: searchParams = self.rfile.read(length).decode('utf-8') @@ -2817,10 +2809,6 @@ class PubServer(BaseHTTPRequestHandler): return if 'submitBack=' in searchParams: # go back on search screen - if callingDomain.endswith('.onion') and onionDomain: - actorStr = 'http://' + onionDomain + usersPath - elif (callingDomain.endswith('.i2p') and i2pDomain): - actorStr = 'http://' + i2pDomain + usersPath self._redirect_headers(actorStr + '/' + self.server.defaultTimeline, cookie, callingDomain) @@ -2960,10 +2948,7 @@ class PubServer(BaseHTTPRequestHandler): if searchStr.endswith(':') or \ searchStr.endswith(';') or \ searchStr.endswith('.'): - if callingDomain.endswith('.onion') and onionDomain: - actorStr = 'http://' + onionDomain + usersPath - elif (callingDomain.endswith('.i2p') and i2pDomain): - actorStr = 'http://' + i2pDomain + usersPath + actorStr = self._getInstalceUrl(callingDomain) + usersPath self._redirect_headers(actorStr + '/search', cookie, callingDomain) self.server.POSTbusy = False @@ -3052,10 +3037,7 @@ class PubServer(BaseHTTPRequestHandler): self.server.POSTbusy = False return else: - if callingDomain.endswith('.onion') and onionDomain: - actorStr = 'http://' + onionDomain + usersPath - elif (callingDomain.endswith('.i2p') and i2pDomain): - actorStr = 'http://' + i2pDomain + usersPath + actorStr = self._getInstalceUrl(callingDomain) + usersPath self._redirect_headers(actorStr + '/search', cookie, callingDomain) self.server.POSTbusy = False @@ -3100,10 +3082,7 @@ class PubServer(BaseHTTPRequestHandler): self._write(msg) self.server.POSTbusy = False return - if callingDomain.endswith('.onion') and onionDomain: - actorStr = 'http://' + onionDomain + usersPath - elif callingDomain.endswith('.i2p') and i2pDomain: - actorStr = 'http://' + i2pDomain + usersPath + actorStr = self._getInstalceUrl(callingDomain) + usersPath self._redirect_headers(actorStr + '/' + self.server.defaultTimeline, cookie, callingDomain) @@ -3437,7 +3416,7 @@ class PubServer(BaseHTTPRequestHandler): """ usersPath = path.replace('/linksdata', '') usersPath = usersPath.replace('/editlinks', '') - actorStr = httpPrefix + '://' + domainFull + usersPath + actorStr = self._getInstalceUrl(callingDomain) + usersPath if ' boundary=' in self.headers['Content-type']: boundary = self.headers['Content-type'].split('boundary=')[1] if ';' in boundary: @@ -3449,14 +3428,6 @@ class PubServer(BaseHTTPRequestHandler): if nickname: editor = isEditor(baseDir, nickname) if not nickname or not editor: - if callingDomain.endswith('.onion') and \ - onionDomain: - actorStr = \ - 'http://' + onionDomain + usersPath - elif (callingDomain.endswith('.i2p') and - i2pDomain): - actorStr = \ - 'http://' + i2pDomain + usersPath if not nickname: print('WARN: nickname not found in ' + actorStr) else: @@ -3469,14 +3440,6 @@ class PubServer(BaseHTTPRequestHandler): # check that the POST isn't too large if length > self.server.maxPostLength: - if callingDomain.endswith('.onion') and \ - onionDomain: - actorStr = \ - 'http://' + onionDomain + usersPath - elif (callingDomain.endswith('.i2p') and - i2pDomain): - actorStr = \ - 'http://' + i2pDomain + usersPath print('Maximum links data length exceeded ' + str(length)) self._redirect_headers(actorStr, cookie, callingDomain) self.server.POSTbusy = False @@ -3550,14 +3513,6 @@ class PubServer(BaseHTTPRequestHandler): os.remove(TOSFilename) # redirect back to the default timeline - if callingDomain.endswith('.onion') and \ - onionDomain: - actorStr = \ - 'http://' + onionDomain + usersPath - elif (callingDomain.endswith('.i2p') and - i2pDomain): - actorStr = \ - 'http://' + i2pDomain + usersPath self._redirect_headers(actorStr + '/' + defaultTimeline, cookie, callingDomain) self.server.POSTbusy = False @@ -3590,7 +3545,7 @@ class PubServer(BaseHTTPRequestHandler): self._404() return usersPath = usersPath.split('/tags/')[0] - actorStr = httpPrefix + '://' + domainFull + usersPath + actorStr = self._getInstalceUrl(callingDomain) + usersPath tagScreenStr = actorStr + '/tags/' + hashtag if ' boundary=' in self.headers['Content-type']: boundary = self.headers['Content-type'].split('boundary=')[1] @@ -3603,14 +3558,6 @@ class PubServer(BaseHTTPRequestHandler): if nickname: editor = isEditor(baseDir, nickname) if not hashtag or not editor: - if callingDomain.endswith('.onion') and \ - onionDomain: - actorStr = \ - 'http://' + onionDomain + usersPath - elif (callingDomain.endswith('.i2p') and - i2pDomain): - actorStr = \ - 'http://' + i2pDomain + usersPath if not nickname: print('WARN: nickname not found in ' + actorStr) else: @@ -3623,14 +3570,6 @@ class PubServer(BaseHTTPRequestHandler): # check that the POST isn't too large if length > self.server.maxPostLength: - if callingDomain.endswith('.onion') and \ - onionDomain: - actorStr = \ - 'http://' + onionDomain + usersPath - elif (callingDomain.endswith('.i2p') and - i2pDomain): - actorStr = \ - 'http://' + i2pDomain + usersPath print('Maximum links data length exceeded ' + str(length)) self._redirect_headers(tagScreenStr, cookie, callingDomain) self.server.POSTbusy = False @@ -3673,14 +3612,6 @@ class PubServer(BaseHTTPRequestHandler): os.remove(categoryFilename) # redirect back to the default timeline - if callingDomain.endswith('.onion') and \ - onionDomain: - actorStr = \ - 'http://' + onionDomain + usersPath - elif (callingDomain.endswith('.i2p') and - i2pDomain): - actorStr = \ - 'http://' + i2pDomain + usersPath self._redirect_headers(tagScreenStr, cookie, callingDomain) self.server.POSTbusy = False @@ -3695,7 +3626,7 @@ class PubServer(BaseHTTPRequestHandler): """ usersPath = path.replace('/newswiredata', '') usersPath = usersPath.replace('/editnewswire', '') - actorStr = httpPrefix + '://' + domainFull + usersPath + actorStr = self._getInstalceUrl(callingDomain) + usersPath if ' boundary=' in self.headers['Content-type']: boundary = self.headers['Content-type'].split('boundary=')[1] if ';' in boundary: @@ -3707,14 +3638,6 @@ class PubServer(BaseHTTPRequestHandler): if nickname: moderator = isModerator(baseDir, nickname) if not nickname or not moderator: - if callingDomain.endswith('.onion') and \ - onionDomain: - actorStr = \ - 'http://' + onionDomain + usersPath - elif (callingDomain.endswith('.i2p') and - i2pDomain): - actorStr = \ - 'http://' + i2pDomain + usersPath if not nickname: print('WARN: nickname not found in ' + actorStr) else: @@ -3727,14 +3650,6 @@ class PubServer(BaseHTTPRequestHandler): # check that the POST isn't too large if length > self.server.maxPostLength: - if callingDomain.endswith('.onion') and \ - onionDomain: - actorStr = \ - 'http://' + onionDomain + usersPath - elif (callingDomain.endswith('.i2p') and - i2pDomain): - actorStr = \ - 'http://' + i2pDomain + usersPath print('Maximum newswire data length exceeded ' + str(length)) self._redirect_headers(actorStr, cookie, callingDomain) self.server.POSTbusy = False @@ -3812,14 +3727,6 @@ class PubServer(BaseHTTPRequestHandler): os.remove(newswireTrustedFilename) # redirect back to the default timeline - if callingDomain.endswith('.onion') and \ - onionDomain: - actorStr = \ - 'http://' + onionDomain + usersPath - elif (callingDomain.endswith('.i2p') and - i2pDomain): - actorStr = \ - 'http://' + i2pDomain + usersPath self._redirect_headers(actorStr + '/' + defaultTimeline, cookie, callingDomain) self.server.POSTbusy = False @@ -3835,7 +3742,7 @@ class PubServer(BaseHTTPRequestHandler): update button on the citations screen """ usersPath = path.replace('/citationsdata', '') - actorStr = httpPrefix + '://' + domainFull + usersPath + actorStr = self._getInstalceUrl(callingDomain) + usersPath nickname = getNicknameFromActor(actorStr) citationsFilename = \ @@ -3855,14 +3762,6 @@ class PubServer(BaseHTTPRequestHandler): # check that the POST isn't too large if length > self.server.maxPostLength: - if callingDomain.endswith('.onion') and \ - onionDomain: - actorStr = \ - 'http://' + onionDomain + usersPath - elif (callingDomain.endswith('.i2p') and - i2pDomain): - actorStr = \ - 'http://' + i2pDomain + usersPath print('Maximum citations data length exceeded ' + str(length)) self._redirect_headers(actorStr, cookie, callingDomain) self.server.POSTbusy = False @@ -3915,14 +3814,6 @@ class PubServer(BaseHTTPRequestHandler): citationsFile.close() # redirect back to the default timeline - if callingDomain.endswith('.onion') and \ - onionDomain: - actorStr = \ - 'http://' + onionDomain + usersPath - elif (callingDomain.endswith('.i2p') and - i2pDomain): - actorStr = \ - 'http://' + i2pDomain + usersPath self._redirect_headers(actorStr + '/newblog', cookie, callingDomain) self.server.POSTbusy = False @@ -3937,7 +3828,7 @@ class PubServer(BaseHTTPRequestHandler): """ usersPath = path.replace('/newseditdata', '') usersPath = usersPath.replace('/editnewspost', '') - actorStr = httpPrefix + '://' + domainFull + usersPath + actorStr = self._getInstalceUrl(callingDomain) + usersPath if ' boundary=' in self.headers['Content-type']: boundary = self.headers['Content-type'].split('boundary=')[1] if ';' in boundary: @@ -3949,14 +3840,6 @@ class PubServer(BaseHTTPRequestHandler): if nickname: editorRole = isEditor(baseDir, nickname) if not nickname or not editorRole: - if callingDomain.endswith('.onion') and \ - onionDomain: - actorStr = \ - 'http://' + onionDomain + usersPath - elif (callingDomain.endswith('.i2p') and - i2pDomain): - actorStr = \ - 'http://' + i2pDomain + usersPath if not nickname: print('WARN: nickname not found in ' + actorStr) else: @@ -3974,14 +3857,6 @@ class PubServer(BaseHTTPRequestHandler): # check that the POST isn't too large if length > self.server.maxPostLength: - if callingDomain.endswith('.onion') and \ - onionDomain: - actorStr = \ - 'http://' + onionDomain + usersPath - elif (callingDomain.endswith('.i2p') and - i2pDomain): - actorStr = \ - 'http://' + i2pDomain + usersPath print('Maximum news data length exceeded ' + str(length)) if self.server.newsInstance: self._redirect_headers(actorStr + '/tlfeatures', @@ -4068,14 +3943,6 @@ class PubServer(BaseHTTPRequestHandler): saveJson(postJsonObject, postFilename) # redirect back to the default timeline - if callingDomain.endswith('.onion') and \ - onionDomain: - actorStr = \ - 'http://' + onionDomain + usersPath - elif (callingDomain.endswith('.i2p') and - i2pDomain): - actorStr = \ - 'http://' + i2pDomain + usersPath if self.server.newsInstance: self._redirect_headers(actorStr + '/tlfeatures', cookie, callingDomain) @@ -4096,7 +3963,7 @@ class PubServer(BaseHTTPRequestHandler): """ usersPath = path.replace('/profiledata', '') usersPath = usersPath.replace('/editprofile', '') - actorStr = httpPrefix + '://' + domainFull + usersPath + actorStr = self._getInstalceUrl(callingDomain) + usersPath if ' boundary=' in self.headers['Content-type']: boundary = self.headers['Content-type'].split('boundary=')[1] if ';' in boundary: @@ -4105,14 +3972,6 @@ class PubServer(BaseHTTPRequestHandler): # get the nickname nickname = getNicknameFromActor(actorStr) if not nickname: - if callingDomain.endswith('.onion') and \ - onionDomain: - actorStr = \ - 'http://' + onionDomain + usersPath - elif (callingDomain.endswith('.i2p') and - i2pDomain): - actorStr = \ - 'http://' + i2pDomain + usersPath print('WARN: nickname not found in ' + actorStr) self._redirect_headers(actorStr, cookie, callingDomain) self.server.POSTbusy = False @@ -4122,14 +3981,6 @@ class PubServer(BaseHTTPRequestHandler): # check that the POST isn't too large if length > self.server.maxPostLength: - if callingDomain.endswith('.onion') and \ - onionDomain: - actorStr = \ - 'http://' + onionDomain + usersPath - elif (callingDomain.endswith('.i2p') and - i2pDomain): - actorStr = \ - 'http://' + i2pDomain + usersPath print('Maximum profile data length exceeded ' + str(length)) self._redirect_headers(actorStr, cookie, callingDomain) @@ -5346,14 +5197,6 @@ class PubServer(BaseHTTPRequestHandler): return # redirect back to the profile screen - if callingDomain.endswith('.onion') and \ - onionDomain: - actorStr = \ - 'http://' + onionDomain + usersPath - elif (callingDomain.endswith('.i2p') and - i2pDomain): - actorStr = \ - 'http://' + i2pDomain + usersPath self._redirect_headers(actorStr + redirectPath, cookie, callingDomain) self.server.POSTbusy = False @@ -6368,7 +6211,7 @@ class PubServer(BaseHTTPRequestHandler): if self.server.iconsCache.get('repeat.png'): del self.server.iconsCache['repeat.png'] self._postToOutboxThread(announceJson) - self.server.GETbusy = False + self.server.GETbusy = False actorAbsolute = self._getInstalceUrl(callingDomain) + actor actorPathStr = \ actorAbsolute + '/' + timelineStr + '?page=' + \ From 73f1fea0b05b7db8f20c604864b420cd80c26df4 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 4 May 2021 13:39:19 +0100 Subject: [PATCH 0877/1416] Consistent spelling --- inbox.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inbox.py b/inbox.py index da64d8f54..3f8b5566c 100644 --- a/inbox.py +++ b/inbox.py @@ -2973,7 +2973,7 @@ def runInboxQueue(recentPostsCache: {}, maxRecentPosts: int, if hasValidContext(originalJson): hasJsonSignature = True else: - print('unrecognised @context: ' + + print('unrecognized @context: ' + str(originalJson['@context'])) # strict enforcement of json signatures From c3a91fc574407a2a5c540078651090909365624c Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 4 May 2021 13:51:08 +0100 Subject: [PATCH 0878/1416] Store unknown contexts --- inbox.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/inbox.py b/inbox.py index 3f8b5566c..0ea654c66 100644 --- a/inbox.py +++ b/inbox.py @@ -2973,8 +2973,24 @@ def runInboxQueue(recentPostsCache: {}, maxRecentPosts: int, if hasValidContext(originalJson): hasJsonSignature = True else: + unknownContextsFile = \ + baseDir + '/accounts/unknownContexts.txt' + unknownContext = str(originalJson['@context']) + print('unrecognized @context: ' + - str(originalJson['@context'])) + unknownContext) + + alreadyUnknown = False + if os.path.isfile(unknownContextsFile): + if unknownContext in \ + open(unknownContextsFile).read(): + alreadyUnknown = True + + if not alreadyUnknown: + unknownFile = open(unknownContextsFile, "a+") + if unknownFile: + unknownFile.write(unknownContext + '\n') + unknownFile.close() # strict enforcement of json signatures if not hasJsonSignature: From 857b788ae1c25d65dff4cd81c2428453dd3532b9 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 4 May 2021 14:06:27 +0100 Subject: [PATCH 0879/1416] Record any unknown json sigtaure types --- inbox.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/inbox.py b/inbox.py index 0ea654c66..b35498529 100644 --- a/inbox.py +++ b/inbox.py @@ -2991,6 +2991,24 @@ def runInboxQueue(recentPostsCache: {}, maxRecentPosts: int, if unknownFile: unknownFile.write(unknownContext + '\n') unknownFile.close() + else: + print('Unrecognized jsonld signature type: ' + + jwebsigType) + + unknownSignaturesFile = \ + baseDir + '/accounts/unknownJsonSignatures.txt' + + alreadyUnknown = False + if os.path.isfile(unknownSignaturesFile): + if jwebsigType in \ + open(unknownSignaturesFile).read(): + alreadyUnknown = True + + if not alreadyUnknown: + unknownFile = open(unknownSignaturesFile, "a+") + if unknownFile: + unknownFile.write(jwebsigType + '\n') + unknownFile.close() # strict enforcement of json signatures if not hasJsonSignature: From ae1e0f67faf7cba089b8d728d14a3fae3fa1bb48 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 4 May 2021 14:30:04 +0100 Subject: [PATCH 0880/1416] Consistent square shaped avatar image --- epicyon-profile.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epicyon-profile.css b/epicyon-profile.css index 29978a54f..754bb0bc5 100644 --- a/epicyon-profile.css +++ b/epicyon-profile.css @@ -341,7 +341,7 @@ a:focus { } .profileHeader .title { - border-radius: 50%; + border-radius: 10%; position: absolute; bottom: 100%; left: 25px; From 29c7287f8f9e71efafff6b694b037c3debc0e3e9 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 4 May 2021 15:18:58 +0100 Subject: [PATCH 0881/1416] Rite of passage --- defaultwelcome/final_ar.md | 9 +++++++++ defaultwelcome/final_ca.md | 9 +++++++++ defaultwelcome/final_cy.md | 9 +++++++++ defaultwelcome/final_en.md | 9 +++++++++ defaultwelcome/final_es.md | 9 +++++++++ defaultwelcome/final_fr.md | 9 +++++++++ defaultwelcome/final_ga.md | 9 +++++++++ defaultwelcome/final_hi.md | 9 +++++++++ defaultwelcome/final_it.md | 9 +++++++++ defaultwelcome/final_ja.md | 9 +++++++++ defaultwelcome/final_ku.md | 9 +++++++++ defaultwelcome/final_oc.md | 9 +++++++++ defaultwelcome/final_pt.md | 9 +++++++++ defaultwelcome/final_ru.md | 9 +++++++++ defaultwelcome/final_zh.md | 9 +++++++++ 15 files changed, 135 insertions(+) diff --git a/defaultwelcome/final_ar.md b/defaultwelcome/final_ar.md index 0d663d636..8b0ab6f2e 100644 --- a/defaultwelcome/final_ar.md +++ b/defaultwelcome/final_ar.md @@ -7,3 +7,12 @@ يؤدي تحديد **الشعار في الجزء العلوي** من الشاشة إلى التبديل بين عرض المخطط الزمني وملف التعريف الخاص بك. لن يتم تحديث الشاشة تلقائيًا عند وصول المنشورات ، لذا استخدم **F5** أو زر البريد الوارد للتحديث. + +#### طقوس المرور +تدربك ثقافة الشركة على الرغبة في الحصول على أكبر عدد من المتابعين والإعجابات - للبحث عن الشهرة الشخصية والتفاعلات السطحية التي تثير الغضب لجذب الانتباه. + +لذلك إذا كنت قادمًا من تلك الثقافة ، فيرجى العلم أن هذا نوع مختلف من النظام مع مجموعة مختلفة جدًا من التوقعات. + +ليس من الضروري وجود الكثير من المتابعين ، وغالبًا ما يكون غير مرغوب فيه. قد يحظرك الناس ، ولا بأس بذلك. لا أحد لديه الحق في جمهور. إذا قام شخص ما بحظرك فأنت لا تخضع للرقابة. يمارس الناس فقط حريتهم في الارتباط بمن يرغبون فيه. + +من المتوقع أن تكون معايير السلوك الشخصي أفضل مما هي عليه في أنظمة الشركات. سلوكك له أيضًا عواقب على سمعة هذه الحالة. إذا كنت تتصرف بطريقة متهورة تتعارض مع شروط الخدمة ، فقد يتم تعليق حسابك أو إزالته. diff --git a/defaultwelcome/final_ca.md b/defaultwelcome/final_ca.md index deff371ba..5731d031c 100644 --- a/defaultwelcome/final_ca.md +++ b/defaultwelcome/final_ca.md @@ -7,3 +7,12 @@ Utilitzeu la icona de **lupa** 🔍 per cercar manetes fedivers i seguir les per Si seleccioneu el **bàner a la part superior** de la pantalla es canvia entre la visualització de la línia de temps i el vostre perfil. La pantalla no s'actualitzarà automàticament quan arribin les publicacions, així que utilitzeu **F5** o el botó **Safata d'entrada** per actualitzar. + +#### Ritu de pas +La cultura corporativa us capacita per desitjar el màxim nombre de seguidors i gustos: per buscar fama personal i interaccions poc profundes i indignants per cridar l'atenció. + +Per tant, si proveniu d’aquesta cultura, tingueu en compte que es tracta d’un tipus de sistema diferent amb un conjunt d’expectatives molt diferents. + +No és necessari tenir molts seguidors i sovint no és desitjable. És possible que la gent us bloquegi i això està bé. Ningú no té dret a un públic. Si algú et bloqueja, no et censuraran. La gent només exerceix la seva llibertat per associar-se amb qui vulgui. + +S'espera que els estàndards de comportament personal siguin millors que en els sistemes corporatius. El vostre comportament també té conseqüències per a la reputació d'aquesta instància. Si us comporteu de manera desmesurada que va en contra de les condicions del servei, el vostre compte es pot suspendre o eliminar. diff --git a/defaultwelcome/final_cy.md b/defaultwelcome/final_cy.md index 12211aa7a..e3b866af3 100644 --- a/defaultwelcome/final_cy.md +++ b/defaultwelcome/final_cy.md @@ -7,3 +7,12 @@ Defnyddiwch yr eicon **chwyddwydr** 🔍 i chwilio am ddolenni bwydo a dilyn pob Mae dewis y faner **ar frig** y sgrin yn newid rhwng yr olygfa llinell amser a'ch proffil. Ni fydd y sgrin yn adnewyddu'n awtomatig pan fydd pyst yn cyrraedd, felly defnyddiwch **F5** neu'r botwm **Mewnflwch** i adnewyddu. + +#### Defod y Tocyn +Mae diwylliant corfforaethol yn eich hyfforddi i fod eisiau'r nifer uchaf o ddilynwyr a hoff bethau - i geisio enwogrwydd personol a rhyngweithio bas, sy'n achosi dicter, i fachu sylw. + +Felly os ydych chi'n dod o'r diwylliant hwnnw, byddwch yn ymwybodol bod hon yn fath wahanol o system gyda set wahanol iawn o ddisgwyliadau. + +Nid oes angen cael llawer o ddilynwyr, ac yn aml mae'n annymunol. Efallai y bydd pobl yn eich rhwystro chi, ac mae hynny'n iawn. Nid oes gan neb hawl i gynulleidfa. Os bydd rhywun yn eich blocio yna nid ydych chi'n cael eich sensro. Mae pobl yn arfer eu rhyddid i gysylltu â phwy bynnag maen nhw'n dymuno. + +Disgwylir i safonau ymddygiad personol fod yn well nag yn y systemau corfforaethol. Mae gan eich ymddygiad ganlyniadau i enw da'r achos hwn hefyd. Os ydych chi'n ymddwyn mewn modd anystyriol sy'n mynd yn groes i'r telerau gwasanaeth yna gellir atal neu ddileu eich cyfrif. diff --git a/defaultwelcome/final_en.md b/defaultwelcome/final_en.md index 81aad26cd..c5c8a498e 100644 --- a/defaultwelcome/final_en.md +++ b/defaultwelcome/final_en.md @@ -7,3 +7,12 @@ Use the **magnifier** icon 🔍 to search for fediverse handles and follow peopl Selecting the **banner at the top** of the screen switches between timeline view and your profile. The screen will not automatically refresh when posts arrive, so use **F5** or the **Inbox** button to refresh. + +#### Rite of Passage +Corporate culture trains you to want the maximum number of followers and likes - to seek personal fame and shallow, outrage-inducing interactions to grab attention. + +So if you are coming from that culture, please be aware that this is a different type of system with a very different set of expectations. + +Having a lot of followers is not necessary, and often it's undesirable. People may block you, and that's ok. Nobody has a right to an audience. If someone blocks you then you're not being censored. People are just exercising their freedom to associate with whoever they wish. + +Standards of personal behavior are expected to be better than in the corporate systems. Your behavior also has consequences for the reputation of this instance. If you behave in an inconsiderate manner which goes against the terms of service then your account may be suspended or removed. diff --git a/defaultwelcome/final_es.md b/defaultwelcome/final_es.md index 9050750a9..b6408449d 100644 --- a/defaultwelcome/final_es.md +++ b/defaultwelcome/final_es.md @@ -7,3 +7,12 @@ Utilice el icono de **lupa** 🔍 para buscar identificadores de fediverse y seg Al seleccionar el **banner en la parte superior** de la pantalla, se cambia entre la vista de línea de tiempo y su perfil. La pantalla no se actualizará automáticamente cuando lleguen las publicaciones, así que use **F5** o el botón **Bandeja de entrada** para actualizar. + +#### Rito de paso +La cultura corporativa te entrena para querer el máximo número de seguidores y me gusta, para buscar fama personal e interacciones superficiales e indignantes para llamar la atención. + +Entonces, si viene de esa cultura, tenga en cuenta que este es un tipo diferente de sistema con un conjunto de expectativas muy diferente. + +No es necesario tener muchos seguidores y, a menudo, no es deseable. Es posible que la gente te bloquee, y eso está bien. Nadie tiene derecho a una audiencia. Si alguien te bloquea, no estás siendo censurado. La gente simplemente está ejerciendo su libertad para asociarse con quien quiera. + +Se espera que los estándares de comportamiento personal sean mejores que los de los sistemas corporativos. Su comportamiento también tiene consecuencias para la reputación de esta instancia. Si se comporta de manera desconsiderada que va en contra de los términos de servicio, su cuenta puede ser suspendida o eliminada. diff --git a/defaultwelcome/final_fr.md b/defaultwelcome/final_fr.md index 272133245..fb6c5e768 100644 --- a/defaultwelcome/final_fr.md +++ b/defaultwelcome/final_fr.md @@ -7,3 +7,12 @@ Utilisez l'icône **loupe** 🔍 pour rechercher des poignées fediverse et suiv La sélection de la **bannière en haut** de l'écran bascule entre la vue chronologique et votre profil. L'écran ne s'actualisera pas automatiquement à l'arrivée des messages, utilisez donc **F5** ou le bouton **Boîte de réception** pour actualiser. + +#### Rite de passage +La culture d'entreprise vous entraîne à vouloir le maximum de followers et de likes - à rechercher une renommée personnelle et des interactions superficielles et indignées pour attirer l'attention. + +Donc, si vous venez de cette culture, sachez qu'il s'agit d'un type de système différent avec un ensemble d'attentes très différent. + +Avoir beaucoup d'adeptes n'est pas nécessaire et souvent indésirable. Les gens peuvent vous bloquer, et ce n'est pas grave. Personne n'a droit à une audience. Si quelqu'un vous bloque, vous n'êtes pas censuré. Les gens exercent simplement leur liberté de s'associer avec qui ils veulent. + +On s'attend à ce que les normes de comportement personnel soient meilleures que dans les systèmes d'entreprise. Votre comportement a également des conséquences sur la réputation de cette instance. Si vous vous comportez d'une manière inconsidérée qui va à l'encontre des conditions d'utilisation, votre compte peut être suspendu ou supprimé. diff --git a/defaultwelcome/final_ga.md b/defaultwelcome/final_ga.md index b8c1e576b..4f7995df7 100644 --- a/defaultwelcome/final_ga.md +++ b/defaultwelcome/final_ga.md @@ -7,3 +7,12 @@ Tá tú réidh anois chun Epicyon a úsáid. Is spás sóisialta measartha é se Ag roghnú an bhratach **ag barr** na lasca scáileáin idir amharc amlíne agus do phróifíl. Ní dhéanfaidh an scáileán athnuachan go huathoibríoch nuair a thiocfaidh na poist, mar sin bain úsáid as **F5** nó an cnaipe **Bosca Isteach** chun athnuachan a dhéanamh. + +#### Deasghnáth an Phasáiste +Cuireann an cultúr corparáideach oiliúint ort go dteastaíonn uait an líon is mó leantóirí agus a leithéidí - clú agus cáil phearsanta agus idirghníomhaíochtaí éadomhain, spreagtha a lorg chun aird a tharraingt. + +Mar sin má tá tú ag teacht ón gcultúr sin, bí ar an eolas gur cineál difriúil córais é seo le tacar ionchais an-difriúil. + +Ní gá go leor leantóirí a bheith agat, agus go minic bíonn sé neamh-inmhianaithe. Féadfaidh daoine bac a chur ort, agus tá sé sin ceart go leor. Níl sé de cheart ag aon duine lucht féachana a fháil. Má chuireann duine bac ort níl cinsireacht á dhéanamh ort. Níl ach a saoirse á fheidhmiú ag daoine chun caidreamh a dhéanamh le cibé duine is mian leo. + +Meastar go mbeidh caighdeáin iompraíochta pearsanta níos fearr ná sna córais chorparáideacha. Tá iarmhairtí ag d’iompar freisin ar cháil an cháis seo. Má iompraíonn tú ar bhealach neamhfhreagrach a théann i gcoinne na dtéarmaí seirbhíse ansin féadfar do chuntas a chur ar fionraí nó a bhaint. diff --git a/defaultwelcome/final_hi.md b/defaultwelcome/final_hi.md index 971af274c..81a156b72 100644 --- a/defaultwelcome/final_hi.md +++ b/defaultwelcome/final_hi.md @@ -7,3 +7,12 @@ समय दृश्य और आपकी प्रोफ़ाइल के बीच स्क्रीन स्विच के शीर्ष **पर स्थित** बैनर का चयन करना। पोस्ट आने पर स्क्रीन अपने आप रिफ्रेश नहीं होगी, इसलिए रीफ्रेश करने के लिए **F5** या **इनबॉक्स** बटन का उपयोग करें। + +#### यादगार घटना +कॉरपोरेट कल्चर आपको अधिक से अधिक संख्या में अनुयायियों और पसंदों को प्राप्त करने के लिए प्रशिक्षित करता है - ध्यान आकर्षित करने के लिए व्यक्तिगत प्रसिद्धि और उथले, नाराजगी-उत्प्रेरण बातचीत। + +इसलिए यदि आप उस संस्कृति से आ रहे हैं, तो कृपया ध्यान रखें कि यह एक अलग प्रकार की प्रणाली है जिसमें बहुत अलग अपेक्षाएं हैं। + +बहुत सारे अनुयायी होना आवश्यक नहीं है, और अक्सर यह अवांछनीय है। लोग आपको ब्लॉक कर सकते हैं, और यह ठीक है। किसी को भी एक दर्शक का अधिकार नहीं है। अगर कोई आपको ब्लॉक करता है तो आपको सेंसर नहीं किया जा रहा है। लोग बस अपनी स्वतंत्रता का प्रयोग कर रहे हैं कि वे जो चाहें करें। + +व्यक्तिगत व्यवहार के मानक कॉर्पोरेट सिस्टम की तुलना में बेहतर होने की उम्मीद है। इस उदाहरण की प्रतिष्ठा के लिए आपके व्यवहार के परिणाम भी हैं। यदि आप एक असंगत तरीके से व्यवहार करते हैं जो सेवा की शर्तों के खिलाफ जाता है तो आपका खाता निलंबित या हटाया जा सकता है। diff --git a/defaultwelcome/final_it.md b/defaultwelcome/final_it.md index 818b231f9..4b3eaab34 100644 --- a/defaultwelcome/final_it.md +++ b/defaultwelcome/final_it.md @@ -7,3 +7,12 @@ Usa l'icona **lente d'ingrandimento** 🔍 per cercare gli handle di fediverse e Selezionando il **banner nella parte superiore** dello schermo si passa dalla visualizzazione della sequenza temporale al tuo profilo. La schermata non si aggiornerà automaticamente all'arrivo dei post, quindi utilizza **F5** o il pulsante **Posta in arrivo** per aggiornare. + +#### Rito di passaggio +La cultura aziendale ti insegna a desiderare il numero massimo di follower e Mi piace, a cercare la fama personale e interazioni superficiali e indignate per attirare l'attenzione. + +Quindi, se vieni da quella cultura, tieni presente che questo è un tipo diverso di sistema con un insieme di aspettative molto diverso. + +Avere molti follower non è necessario e spesso è indesiderabile. Le persone potrebbero bloccarti, e va bene. Nessuno ha diritto a un pubblico. Se qualcuno ti blocca, non verrai censurato. Le persone stanno solo esercitando la loro libertà di associarsi con chi desiderano. + +Gli standard di comportamento personale dovrebbero essere migliori rispetto ai sistemi aziendali. Il tuo comportamento ha anche conseguenze sulla reputazione di questa istanza. Se ti comporti in modo sconsiderato che va contro i termini di servizio, il tuo account potrebbe essere sospeso o rimosso. diff --git a/defaultwelcome/final_ja.md b/defaultwelcome/final_ja.md index 40b4e2575..8183dd287 100644 --- a/defaultwelcome/final_ja.md +++ b/defaultwelcome/final_ja.md @@ -7,3 +7,12 @@ 画面の上部にある **バナー** を選択すると、タイムラインビューとプロファイルが切り替わります。 投稿が到着しても画面は自動的に更新されないため、 **F5** または **受信トレイ** ボタンを使用して更新してください。 + +#### 通過儀礼 +企業文化は、最大数のフォロワーや好きな人を求め、個人的な名声と浅い、怒りを誘発する相互作用を求めて注目を集めるように訓練します。 + +したがって、その文化から来ている場合、これは非常に異なる一連の期待を持つ異なるタイプのシステムであることに注意してください。 + +多くのフォロワーを持つ必要はなく、多くの場合、それは望ましくありません。 人々があなたをブロックするかもしれません、そしてそれは大丈夫です。 誰も聴衆に対する権利を持っていません。 誰かがあなたをブロックした場合、あなたは検閲されていません。 人々は、彼らが望む誰とでも交際する自由を行使しているだけです。 + +個人の行動基準は、企業システムよりも優れていると期待されています。 あなたの行動は、このインスタンスの評判にも影響を及ぼします。 利用規約に違反する軽率な行動をとった場合、アカウントが停止または削除される可能性があります。 diff --git a/defaultwelcome/final_ku.md b/defaultwelcome/final_ku.md index 957eaa1d7..5a5914dd2 100644 --- a/defaultwelcome/final_ku.md +++ b/defaultwelcome/final_ku.md @@ -7,3 +7,12 @@ Hûn niha amade ne ku dest bi karanîna Epicyon bikin. Ev cîhek civakî ya nerm Hilbijartina **pankarta li jor** a switches-ekranê di navbera dîtina demjimêr û profîla we de. Dema ku şande tên dîmender dê bixweber nûve nebe, ji ber vê yekê **F5** an bişkoja **Inbox** ji bo nûvekirinê bikar bînin. + +#### Rêûresma Derbasbûnê +Çanda pargîdaniyê we perwerde dike ku hûn jimara herî zêde şopîner û hezên xwe bixwazin - li navdariyek kesane û têkiliyên kûr, hêrs-lêgerîn digerin da ku balê bikişînin. + +Ji ber vê yekê heke hûn ji wê çandê têne, ji kerema xwe hay ji xwe hebin ku ev pergalek celebek cuda ye ku bi bendewariyek pir cûda ye. + +Hebûna gelek şagirtan ne hewce ye, û pir caran ew nexwaze. Mirov dikare we bloke bike, û ew baş e. Mafê kesî tune ku guhdar bike. Ger kesek we bloke bike wê hingê hûn nayên sansur kirin. Mirov tenê azadiya xwe ya ku bi kî bixwaze re têkildar dibe bikar tîne. + +Tê payîn ku standardên tevgera kesane ji pergalên pargîdaniyê çêtir in. Reftara we ji bo navûdengê vê nimûneyê jî encam dide. Heke hûn bi rengek bêhesib tevdigerin ku li dijî şertên karûbarê ye wê hingê dibe ku hesabê we were sekinandin an rakirin. diff --git a/defaultwelcome/final_oc.md b/defaultwelcome/final_oc.md index ef9eb2601..49a17693c 100644 --- a/defaultwelcome/final_oc.md +++ b/defaultwelcome/final_oc.md @@ -7,3 +7,12 @@ Use the **magnifier** icon 🔍 to search for fediverse handles and follow peopl Selecting the **banner at the top** of the screen switches between timeline view and your profile. The screen will not automatically refresh when posts arrive, so use **F5** or the **Inbox** button to refresh. + +#### Rite of Passage +Corporate culture trains you to want the maximum number of followers and likes - to seek personal fame and shallow, outrage-inducing interactions to grab attention. + +So if you are coming from that culture, please be aware that this is a different type of system with a very different set of expectations. + +Having a lot of followers is not necessary, and often it's undesirable. People may block you, and that's ok. Nobody has a right to an audience. If someone blocks you then you're not being censored. People are just exercising their freedom to associate with whoever they wish. + +Standards of personal behavior are expected to be better than in the corporate systems. Your behavior also has consequences for the reputation of this instance. If you behave in an inconsiderate manner which goes against the terms of service then your account may be suspended or removed. diff --git a/defaultwelcome/final_pt.md b/defaultwelcome/final_pt.md index 3f8cdf87b..b96b0a4b3 100644 --- a/defaultwelcome/final_pt.md +++ b/defaultwelcome/final_pt.md @@ -7,3 +7,12 @@ Use o ícone de **lupa** 🔍 para pesquisar as alças do fediverse e seguir pes Selecionar o **banner na parte superior** da tela alterna entre a visualização da linha do tempo e seu perfil. A tela não será atualizada automaticamente quando as postagens chegarem, então use **F5** ou o botão **Caixa de entrada** para atualizar. + +#### Rito de passagem +A cultura corporativa treina você a querer o número máximo de seguidores e curtidas - a buscar fama pessoal e interações superficiais que induzem à indignação para chamar a atenção. + +Portanto, se você vem dessa cultura, saiba que esse é um tipo diferente de sistema, com um conjunto de expectativas muito diferente. + +Não é necessário ter muitos seguidores e, muitas vezes, é indesejável. As pessoas podem bloquear você, e tudo bem. Ninguém tem direito a audiência. Se alguém bloqueia você, você não está sendo censurado. As pessoas estão apenas exercendo sua liberdade de se associar com quem quiserem. + +Espera-se que os padrões de comportamento pessoal sejam melhores do que os sistemas corporativos. Seu comportamento também tem consequências para a reputação desta instância. Se você se comportar de maneira imprudente que vá contra os termos de serviço, sua conta poderá ser suspensa ou removida. diff --git a/defaultwelcome/final_ru.md b/defaultwelcome/final_ru.md index 31e11700f..993edc44b 100644 --- a/defaultwelcome/final_ru.md +++ b/defaultwelcome/final_ru.md @@ -7,3 +7,12 @@ При выборе **баннера вверху** экрана выполняется переключение между представлением временной шкалы и вашим профилем. Экран не обновляется автоматически при поступлении сообщений, поэтому используйте **F5** или кнопку **Входящие** для обновления. + +#### Обряд посвящения +Корпоративная культура учит вас стремиться к максимальному количеству подписчиков и лайков - стремиться к личной славе и поверхностным, вызывающим возмущение взаимодействиям, чтобы привлечь внимание. + +Так что, если вы происходите из этой культуры, имейте в виду, что это другой тип системы с совершенно другим набором ожиданий. + +Не обязательно иметь много подписчиков, а зачастую и нежелательно. Люди могут заблокировать вас, и это нормально. Никто не имеет права на аудиенцию. Если кто-то вас блокирует, значит, вы не подвергаетесь цензуре. Люди просто пользуются своей свободой общаться с кем хотят. + +Ожидается, что стандарты личного поведения будут лучше, чем в корпоративных системах. Ваше поведение также влияет на репутацию этого экземпляра. Если вы ведете себя невнимательно, что противоречит условиям обслуживания, ваша учетная запись может быть приостановлена или удалена. diff --git a/defaultwelcome/final_zh.md b/defaultwelcome/final_zh.md index 1cd50c41b..542ce6a67 100644 --- a/defaultwelcome/final_zh.md +++ b/defaultwelcome/final_zh.md @@ -7,3 +7,12 @@ 选择屏幕顶部的横幅广告可在时间轴视图和个人资料之间切换。 帖子到达时,屏幕不会自动刷新,因此请使用F5或“收件箱”按钮刷新。 + +#### 通行礼 +企业文化训练您想要最大数量的追随者和喜欢的人-寻求个人名望和肤浅,激怒的互动来吸引注意力。 + +因此,如果您来自这种文化,请注意,这是另一种类型的系统,具有不同的期望值。 + +拥有大量的追随者不是必需的,而且通常是不可取的。 人们可能会阻止您,没关系。 没有人有听众的权利。 如果有人阻止了您,那么您将不会受到审查。 人们只是在行使与任何希望的人交往的自由。 + +个人行为标准有望比公司系统更好。 您的行为也会对该实例的声誉产生影响。 如果您的行为举止粗鲁,违反了服务条款,那么您的帐户可能会被暂停或删除。 From fee2d0b47e206022841372617631ca403458e3d3 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 5 May 2021 10:31:35 +0100 Subject: [PATCH 0882/1416] Check that local gpg key exists --- pgp.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pgp.py b/pgp.py index 9b18c8cc3..19a1d0f42 100644 --- a/pgp.py +++ b/pgp.py @@ -362,7 +362,9 @@ def hasLocalPGPkey() -> bool: homeDir = str(Path.home()) gpgDir = homeDir + '/.gnupg' if os.path.isdir(gpgDir): - return True + keyId = _pgpLocalPublicKeyId() + if keyId: + return True return False From 8415c7d3f2aac53a78aac5980db69caf10c3ff19 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 5 May 2021 10:53:00 +0100 Subject: [PATCH 0883/1416] Show pgp public key --- README_commandline.md | 1 + desktop_client.py | 9 +++++++++ pgp.py | 4 ++-- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/README_commandline.md b/README_commandline.md index a01428ca0..f4a175c05 100644 --- a/README_commandline.md +++ b/README_commandline.md @@ -478,6 +478,7 @@ following [page number] Show accounts that you are following followers [page number] Show accounts that are following you approve [handle] Approve a follow request deny [handle] Deny a follow request +pgp Show your PGP public key ``` If you have a GPG key configured on your local system and are sending a direct message to someone who has a PGP key (the exported key, not just the key ID) set as a tag on their profile then it will try to encrypt the message automatically. So under some conditions end-to-end encryption is possible, such that the instance server only sees ciphertext. Conversely, for arriving direct messages if they are PGP encrypted then the desktop client will try to obtain the relevant public key and decrypt. diff --git a/desktop_client.py b/desktop_client.py index 4d3f94ae4..ebc3730f2 100644 --- a/desktop_client.py +++ b/desktop_client.py @@ -45,6 +45,7 @@ from posts import c2sBoxJson from posts import downloadAnnounce from announce import sendAnnounceViaServer from announce import sendUndoAnnounceViaServer +from pgp import pgpLocalPublicKey from pgp import pgpDecrypt from pgp import hasLocalPGPkey from pgp import pgpEncryptToActor @@ -124,6 +125,8 @@ def _desktopHelp() -> None: 'Approve a follow request') print(indent + 'deny [handle] ' + 'Deny a follow request') + print(indent + 'pgp ' + + 'Show your PGP public key') print('') @@ -2324,6 +2327,12 @@ def runDesktopClient(baseDir: str, proxyType: str, httpPrefix: str, _sayCommand(sayStr, sayStr, originalScreenReader, systemLanguage, espeak) print('') + elif commandStr.startswith('pgp') or commandStr.startswith('gpg'): + if not hasLocalPGPkey(): + print('No PGP public key was found') + else: + print(pgpLocalPublicKey()) + print('') elif commandStr.startswith('h'): _desktopHelp() sayStr = 'Press Enter to continue...' diff --git a/pgp.py b/pgp.py index 19a1d0f42..37444c126 100644 --- a/pgp.py +++ b/pgp.py @@ -423,7 +423,7 @@ def _pgpLocalPublicKeyId() -> str: return result.decode('utf-8').replace('"', '').strip() -def _pgpLocalPublicKey() -> str: +def pgpLocalPublicKey() -> str: """Gets the local pgp public key """ keyId = _pgpLocalPublicKeyId() @@ -457,7 +457,7 @@ def pgpPublicKeyUpload(baseDir: str, session, if not test: if debug: print('Getting PGP public key') - PGPpubKey = _pgpLocalPublicKey() + PGPpubKey = pgpLocalPublicKey() if not PGPpubKey: return None PGPpubKeyId = _pgpLocalPublicKeyId() From 61d650c6f7cef10c9b8f185db9ecd2be13c69508 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 5 May 2021 10:57:29 +0100 Subject: [PATCH 0884/1416] Check for public key --- desktop_client.py | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/desktop_client.py b/desktop_client.py index ebc3730f2..6c19a422d 100644 --- a/desktop_client.py +++ b/desktop_client.py @@ -1366,17 +1366,20 @@ def runDesktopClient(baseDir: str, proxyType: str, httpPrefix: str, desktopShown = False while (1): if not pgpKeyUpload: - sayStr = indent + 'Uploading PGP public key' - _sayCommand(sayStr, sayStr, screenreader, - systemLanguage, espeak) - pgpPublicKeyUpload(baseDir, session, - nickname, password, - domain, port, httpPrefix, - cachedWebfingers, personCache, - debug, False) - sayStr = indent + 'PGP public key uploaded' - _sayCommand(sayStr, sayStr, screenreader, - systemLanguage, espeak) + if not hasLocalPGPkey(): + print('No PGP public key was found') + else: + sayStr = indent + 'Uploading PGP public key' + _sayCommand(sayStr, sayStr, screenreader, + systemLanguage, espeak) + pgpPublicKeyUpload(baseDir, session, + nickname, password, + domain, port, httpPrefix, + cachedWebfingers, personCache, + debug, False) + sayStr = indent + 'PGP public key uploaded' + _sayCommand(sayStr, sayStr, screenreader, + systemLanguage, espeak) pgpKeyUpload = True boxJson = c2sBoxJson(baseDir, session, From 60aad9cfd245142015fa7549b81b2656a6be590d Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 5 May 2021 11:13:26 +0100 Subject: [PATCH 0885/1416] Get pgp public key when default keyid is unavailable --- pgp.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pgp.py b/pgp.py index 37444c126..81720f3a3 100644 --- a/pgp.py +++ b/pgp.py @@ -362,7 +362,7 @@ def hasLocalPGPkey() -> bool: homeDir = str(Path.home()) gpgDir = homeDir + '/.gnupg' if os.path.isdir(gpgDir): - keyId = _pgpLocalPublicKeyId() + keyId = pgpLocalPublicKey() if keyId: return True return False @@ -428,7 +428,7 @@ def pgpLocalPublicKey() -> str: """ keyId = _pgpLocalPublicKeyId() if not keyId: - return None + keyId = '' cmdStr = "gpg --armor --export " + keyId proc = subprocess.Popen([cmdStr], stdout=subprocess.PIPE, shell=True) From 0e93c781ccc283cf46c0b8129d6da3e22b5c8e3e Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 5 May 2021 13:08:42 +0100 Subject: [PATCH 0886/1416] Option to have round avatars --- epicyon-blog.css | 3 +++ epicyon-links.css | 3 +++ epicyon-profile.css | 5 ++++- theme/light/theme.json | 1 + theme/night/theme.json | 1 + theme/zen/theme.json | 1 + 6 files changed, 13 insertions(+), 1 deletion(-) diff --git a/epicyon-blog.css b/epicyon-blog.css index 355ca73bd..fc790d702 100644 --- a/epicyon-blog.css +++ b/epicyon-blog.css @@ -1,6 +1,7 @@ @charset "UTF-8"; :root { + --avatar-rounding: 10%; --main-bg-color: #282c37; --link-bg-color: #282c37; --title-color: #999; @@ -795,6 +796,7 @@ div.gallery img { padding: 0px 0px; -ms-transform: translateY(-10%); transform: translateY(-10%); + border-radius: var(--avatar-rounding); } .cwButton { border-radius: var(--button-corner-radius); @@ -1150,6 +1152,7 @@ div.gallery img { padding: 0px 0px; -ms-transform: translateY(-10%); transform: translateY(-10%); + border-radius: var(--avatar-rounding); } .cwButton { border-radius: var(--button-corner-radius); diff --git a/epicyon-links.css b/epicyon-links.css index 328f1ae89..67dcdc7ef 100644 --- a/epicyon-links.css +++ b/epicyon-links.css @@ -1,6 +1,7 @@ @charset "UTF-8"; :root { + --avatar-rounding: 10%; --main-bg-color: #282c37; --link-bg-color: #282c37; --dropdown-fg-color: #dddddd; @@ -1052,6 +1053,7 @@ aside .toggle-inside li { padding: 0px 0px; -ms-transform: translateY(-10%); transform: translateY(-10%); + border-radius: var(--avatar-rounding); } .buttonevent { border-radius: var(--button-corner-radius); @@ -1522,6 +1524,7 @@ aside .toggle-inside li { padding: 0px 0px; -ms-transform: translateY(-10%); transform: translateY(-10%); + border-radius: var(--avatar-rounding); } .buttonevent { border-radius: var(--button-corner-radius); diff --git a/epicyon-profile.css b/epicyon-profile.css index 754bb0bc5..0ee6b0695 100644 --- a/epicyon-profile.css +++ b/epicyon-profile.css @@ -1,6 +1,7 @@ @charset "UTF-8"; :root { + --avatar-rounding: 10%; --timeline-icon-width: 50px; --timeline-icon-width-mobile: 100px; --header-bg-color: #282c37; @@ -341,7 +342,7 @@ a:focus { } .profileHeader .title { - border-radius: 10%; + border-radius: var(--avatar-rounding); position: absolute; bottom: 100%; left: 25px; @@ -1332,6 +1333,7 @@ div.container { padding: 0px 0px; -ms-transform: translateY(-10%); transform: translateY(-10%); + border-radius: var(--avatar-rounding); } .buttonevent { border-radius: var(--button-event-corner-radius); @@ -1975,6 +1977,7 @@ div.container { padding: 0px 0px; -ms-transform: translateY(-10%); transform: translateY(-10%); + border-radius: var(--avatar-rounding); } .buttonevent { border-radius: var(--button-event-corner-radius); diff --git a/theme/light/theme.json b/theme/light/theme.json index 5533d3e65..58abe93eb 100644 --- a/theme/light/theme.json +++ b/theme/light/theme.json @@ -1,4 +1,5 @@ { + "avatar-rounding": "50%", "button-selected": "#999", "button-background": "#bbbbbb", "button-background-hover": "#999", diff --git a/theme/night/theme.json b/theme/night/theme.json index d6001e49a..4335d43ba 100644 --- a/theme/night/theme.json +++ b/theme/night/theme.json @@ -1,4 +1,5 @@ { + "avatar-rounding": "50%", "newswire-publish-icon": "True", "full-width-timeline-buttons": "False", "icons-as-buttons": "False", diff --git a/theme/zen/theme.json b/theme/zen/theme.json index 7eb3b5d86..24892fcb7 100644 --- a/theme/zen/theme.json +++ b/theme/zen/theme.json @@ -1,4 +1,5 @@ { + "avatar-rounding": "50%", "dropdown-bg-color-hover": "#463b35", "cw-color": "#d5c7b7", "main-fg-color": "#d5c7b7", From 05e27a9033c13a36c8d79adf4df042d0cccca642 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 5 May 2021 13:17:41 +0100 Subject: [PATCH 0887/1416] Icons get darker --- theme/light/theme.json | 1 + 1 file changed, 1 insertion(+) diff --git a/theme/light/theme.json b/theme/light/theme.json index 58abe93eb..f74baaf99 100644 --- a/theme/light/theme.json +++ b/theme/light/theme.json @@ -1,5 +1,6 @@ { "avatar-rounding": "50%", + "icon-brightness-change": "80%", "button-selected": "#999", "button-background": "#bbbbbb", "button-background-hover": "#999", From 984158e91641fcc1a88c8bee53e7c9c0ba102eeb Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 5 May 2021 13:51:16 +0100 Subject: [PATCH 0888/1416] Rounded avatar on options screen --- epicyon-options.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/epicyon-options.css b/epicyon-options.css index 49d7b8911..daaee8700 100644 --- a/epicyon-options.css +++ b/epicyon-options.css @@ -1,6 +1,7 @@ @charset "UTF-8"; :root { + --avatar-rounding: 10%; --options-bg-color: #282c37; --options-link-bg-color: transparent; --options-fg-color: #dddddd; @@ -144,6 +145,7 @@ a:focus { } .options img { + border-radius: var(--avatar-rounding); background-color: var(--options-bg-color); width: 15%; } From 23ea5431b204312d0a6aed327367622a140d5359 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 5 May 2021 16:53:34 +0100 Subject: [PATCH 0889/1416] Link background --- theme/light/theme.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/theme/light/theme.json b/theme/light/theme.json index f74baaf99..052d4f3a7 100644 --- a/theme/light/theme.json +++ b/theme/light/theme.json @@ -35,7 +35,7 @@ "timeline-posts-background-color": "#e6ebf0", "header-bg-color": "#e6ebf0", "main-bg-color-dm": "#e3dbf0", - "link-bg-color": "#e6ebf0", + "link-bg-color": "#efebf0", "main-bg-color-reply": "white", "main-bg-color-report": "#e3dbf0", "main-header-color-roles": "#ebebf0", From 2baf7f2a49c89252f24c89e9a9fe6682c86f6abb Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 5 May 2021 19:54:47 +0100 Subject: [PATCH 0890/1416] Separate readme for desktop client --- README_commandline.md | 88 -------------------------------------- README_desktop_client.md | 91 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 88 deletions(-) create mode 100644 README_desktop_client.md diff --git a/README_commandline.md b/README_commandline.md index f4a175c05..af39f363d 100644 --- a/README_commandline.md +++ b/README_commandline.md @@ -418,91 +418,3 @@ To remove a shared item: ``` bash python3 epicyon.py --undoItemName "spanner" --nickname [yournick] --domain [yourdomain] --password [c2s password] ``` - -## Desktop client - -You can install the desktop client with: - -``` bash -./install-desktop-client -``` - -and run it with: - -``` bash -~/epicyon-client -``` - -To run it with text-to-speech via espeak: - -``` bash -~/epicyon-client-tts -``` - -Or if you have picospeaker installed: - -``` bash -~/epicyon-client-pico -``` - -The desktop client has a few commands, which may be more convenient than the web interface for some purposes: - -``` bash -quit Exit from the desktop client -mute Turn off the screen reader -speak Turn on the screen reader -sounds on Turn on notification sounds -sounds off Turn off notification sounds -rp Repeat the last post -like Like the last post -unlike Unlike the last post -bookmark Bookmark the last post -unbookmark Unbookmark the last post -block [post number|handle] Block someone via post number or handle -unblock [handle] Unblock someone -mute Mute the last post -unmute Unmute the last post -reply Reply to the last post -post Create a new post -post to [handle] Create a new direct message -announce/boost Boost the last post -follow [handle] Make a follow request -unfollow [handle] Stop following the give handle -show dm|sent|inbox|replies|bookmarks Show a timeline -next Next page in the timeline -prev Previous page in the timeline -read [post number] Read a post from a timeline -open [post number] Open web links within a timeline post -profile [post number or handle] Show profile for the person who made the given post -following [page number] Show accounts that you are following -followers [page number] Show accounts that are following you -approve [handle] Approve a follow request -deny [handle] Deny a follow request -pgp Show your PGP public key -``` - -If you have a GPG key configured on your local system and are sending a direct message to someone who has a PGP key (the exported key, not just the key ID) set as a tag on their profile then it will try to encrypt the message automatically. So under some conditions end-to-end encryption is possible, such that the instance server only sees ciphertext. Conversely, for arriving direct messages if they are PGP encrypted then the desktop client will try to obtain the relevant public key and decrypt. - -## Speaking your inbox - -It is possible to use text-to-speech to read your inbox as posts arrive. This can be useful if you are not looking at a screen but want to stay ambiently informed of what's happening. - -On Debian based systems you will need to have the **python3-espeak** package installed. - -``` bash -python3 epicyon.py --notifyShowNewPosts --screenreader espeak --desktop yournickname@yourdomain -``` - -Or a quicker version, if you have installed the desktop client as described above. - -``` bash -~/epicyon-client-stream -``` - -Or if you have [picospeaker](https://gitlab.com/ky1e/picospeaker) installed: - -``` bash -python3 epicyon.py --notifyShowNewPosts --screenreader picospeaker --desktop yournickname@yourdomain -``` - -You can also use the **--password** option to provide the password. This will then stay running and incoming posts will be announced as they arrive. diff --git a/README_desktop_client.md b/README_desktop_client.md new file mode 100644 index 000000000..a1ac25fe6 --- /dev/null +++ b/README_desktop_client.md @@ -0,0 +1,91 @@ +# Desktop client + +## Installing and running + +You can install the desktop client with: + +``` bash +./install-desktop-client +``` + +and run it with: + +``` bash +~/epicyon-client +``` + +To run it with text-to-speech via espeak: + +``` bash +~/epicyon-client-tts +``` + +Or if you have picospeaker installed: + +``` bash +~/epicyon-client-pico +``` + +## Commands + +The desktop client has a few commands, which may be more convenient than the web interface for some purposes: + +``` bash +quit Exit from the desktop client +mute Turn off the screen reader +speak Turn on the screen reader +sounds on Turn on notification sounds +sounds off Turn off notification sounds +rp Repeat the last post +like Like the last post +unlike Unlike the last post +bookmark Bookmark the last post +unbookmark Unbookmark the last post +block [post number|handle] Block someone via post number or handle +unblock [handle] Unblock someone +mute Mute the last post +unmute Unmute the last post +reply Reply to the last post +post Create a new post +post to [handle] Create a new direct message +announce/boost Boost the last post +follow [handle] Make a follow request +unfollow [handle] Stop following the give handle +show dm|sent|inbox|replies|bookmarks Show a timeline +next Next page in the timeline +prev Previous page in the timeline +read [post number] Read a post from a timeline +open [post number] Open web links within a timeline post +profile [post number or handle] Show profile for the person who made the given post +following [page number] Show accounts that you are following +followers [page number] Show accounts that are following you +approve [handle] Approve a follow request +deny [handle] Deny a follow request +pgp Show your PGP public key +``` + +If you have a GPG key configured on your local system and are sending a direct message to someone who has a PGP key (the exported key, not just the key ID) set as a tag on their profile then it will try to encrypt the message automatically. So under some conditions end-to-end encryption is possible, such that the instance server only sees ciphertext. Conversely, for arriving direct messages if they are PGP encrypted then the desktop client will try to obtain the relevant public key and decrypt. + +## Speaking your inbox + +It is possible to use text-to-speech to read your inbox as posts arrive. This can be useful if you are not looking at a screen but want to stay ambiently informed of what's happening. + +On Debian based systems you will need to have the **python3-espeak** package installed. + +``` bash +python3 epicyon.py --notifyShowNewPosts --screenreader espeak --desktop yournickname@yourdomain +``` + +Or a quicker version, if you have installed the desktop client as described above. + +``` bash +~/epicyon-client-stream +``` + +Or if you have [picospeaker](https://gitlab.com/ky1e/picospeaker) installed: + +``` bash +python3 epicyon.py --notifyShowNewPosts --screenreader picospeaker --desktop yournickname@yourdomain +``` + +You can also use the **--password** option to provide the password. This will then stay running and incoming posts will be announced as they arrive. From 513b8454eb459c4cd62fb345dbd22c808e0ec056 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 5 May 2021 21:41:30 +0100 Subject: [PATCH 0891/1416] Link hover color --- theme/light/theme.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/theme/light/theme.json b/theme/light/theme.json index 052d4f3a7..89d963ad6 100644 --- a/theme/light/theme.json +++ b/theme/light/theme.json @@ -47,7 +47,7 @@ "column-left-fg-color": "#2d2c37", "border-color": "#c0cdd9", "main-link-color": "#2a2c37", - "main-link-color-hover": "#aa2c37", + "main-link-color-hover": "#777", "options-main-link-color": "#2a2c37", "options-main-link-color-hover": "#aa2c37", "title-color": "#2a2c37", From 29e79a45cd4fbe35939fcf7a510db30e1fdb4b80 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 5 May 2021 21:48:20 +0100 Subject: [PATCH 0892/1416] Link background --- theme/light/theme.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/theme/light/theme.json b/theme/light/theme.json index 89d963ad6..581567633 100644 --- a/theme/light/theme.json +++ b/theme/light/theme.json @@ -35,7 +35,7 @@ "timeline-posts-background-color": "#e6ebf0", "header-bg-color": "#e6ebf0", "main-bg-color-dm": "#e3dbf0", - "link-bg-color": "#efebf0", + "link-bg-color": "#eef4fa", "main-bg-color-reply": "white", "main-bg-color-report": "#e3dbf0", "main-header-color-roles": "#ebebf0", From bf359e122bdcaf7351b69430d89da735028a6d67 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 5 May 2021 21:59:42 +0100 Subject: [PATCH 0893/1416] Reply background --- theme/light/theme.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/theme/light/theme.json b/theme/light/theme.json index 581567633..3e4e10c1e 100644 --- a/theme/light/theme.json +++ b/theme/light/theme.json @@ -34,10 +34,10 @@ "post-bg-color": "#e6ebf0", "timeline-posts-background-color": "#e6ebf0", "header-bg-color": "#e6ebf0", - "main-bg-color-dm": "#e3dbf0", + "main-bg-color-dm": "#dbe2ea", "link-bg-color": "#eef4fa", - "main-bg-color-reply": "white", - "main-bg-color-report": "#e3dbf0", + "main-bg-color-reply": "#eaeced", + "main-bg-color-report": "#dbe2ea", "main-header-color-roles": "#ebebf0", "cw-color": "#777", "main-fg-color": "#2d2c37", From e6be96c492a065c9bfc0def8177644489b3df9e7 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 7 May 2021 13:35:44 +0100 Subject: [PATCH 0894/1416] Unrepeat link --- webapp_post.py | 1 + 1 file changed, 1 insertion(+) diff --git a/webapp_post.py b/webapp_post.py index 466ad63db..ce1f516e4 100644 --- a/webapp_post.py +++ b/webapp_post.py @@ -408,6 +408,7 @@ def _getAnnounceIconHtml(nickname: str, domainFull: str, if announcedByPerson(postJsonObject, nickname, domainFull): announceIcon = 'repeat.png' announceEmoji = '🔁 ' + announceLink = 'unrepeat' if not isPublicRepeat: announceLink = 'unrepeatprivate' announceTitle = translate['Undo the repeat'] From 38c1d6881668ec9c829fcbb495e9742f95abdc39 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 7 May 2021 13:42:01 +0100 Subject: [PATCH 0895/1416] Tidying --- webapp_post.py | 60 +++++++++++++++++++++++++++----------------------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/webapp_post.py b/webapp_post.py index ce1f516e4..4ec743f7f 100644 --- a/webapp_post.py +++ b/webapp_post.py @@ -396,36 +396,42 @@ def _getAnnounceIconHtml(nickname: str, domainFull: str, """Returns html for announce icon/button """ announceStr = '' - if not isModerationPost and showRepeatIcon: - # don't allow announce/repeat of your own posts - announceIcon = 'repeat_inactive.png' - announceLink = 'repeat' - announceEmoji = '' + + if not showRepeatIcon: + return announceStr + + if isModerationPost: + return announceStr + + # don't allow announce/repeat of your own posts + announceIcon = 'repeat_inactive.png' + announceLink = 'repeat' + announceEmoji = '' + if not isPublicRepeat: + announceLink = 'repeatprivate' + announceTitle = translate['Repeat this post'] + + if announcedByPerson(postJsonObject, nickname, domainFull): + announceIcon = 'repeat.png' + announceEmoji = '🔁 ' + announceLink = 'unrepeat' if not isPublicRepeat: - announceLink = 'repeatprivate' - announceTitle = translate['Repeat this post'] + announceLink = 'unrepeatprivate' + announceTitle = translate['Undo the repeat'] - if announcedByPerson(postJsonObject, nickname, domainFull): - announceIcon = 'repeat.png' - announceEmoji = '🔁 ' - announceLink = 'unrepeat' - if not isPublicRepeat: - announceLink = 'unrepeatprivate' - announceTitle = translate['Undo the repeat'] + announceStr = \ + ' \n' - announceStr = \ - ' \n' - - announceStr += \ - ' ' + \ - '' + announceEmoji + translate['Repeat this post'] + \
-            ' |\n' + announceStr += \ + ' ' + \ + '' + announceEmoji + translate['Repeat this post'] + \
+        ' |\n' return announceStr From 469e8304be7e52595f5780489dbed80ffa468edb Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 7 May 2021 14:26:00 +0100 Subject: [PATCH 0896/1416] Check announces --- announce.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/announce.py b/announce.py index 435cd911e..ef946d5a3 100644 --- a/announce.py +++ b/announce.py @@ -76,9 +76,17 @@ def outboxAnnounce(recentPostsCache: {}, def announcedByPerson(postJsonObject: {}, nickname: str, domain: str) -> bool: """Returns True if the given post is announced by the given person """ + if not postJsonObject.get('type'): + return False if not postJsonObject.get('object'): return False - if not isinstance(postJsonObject['object'], dict): + if isinstance(postJsonObject['object'], str): + if postJsonObject['type'] == 'Announce' and \ + postJsonObject.get('actor'): + actorMatch = domain + '/users/' + nickname + if postJsonObject['actor'].endswith(actorMatch): + return True + elif not isinstance(postJsonObject['object'], dict): return False # not to be confused with shared items if not postJsonObject['object'].get('shares'): From 019f885c01a6255a8832a2c869af55740faa9b14 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 7 May 2021 16:58:39 +0100 Subject: [PATCH 0897/1416] Tidying --- utils.py | 109 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 55 insertions(+), 54 deletions(-) diff --git a/utils.py b/utils.py index 763997b78..5b4ef6bd9 100644 --- a/utils.py +++ b/utils.py @@ -1985,63 +1985,64 @@ def updateAnnounceCollection(recentPostsCache: {}, It's shares of posts, not shares of physical objects. """ postJsonObject = loadJson(postFilename) - if postJsonObject: - # remove any cached version of this announce so that the announce - # icon is changed - nickname = getNicknameFromActor(actor) - cachedPostFilename = getCachedPostFilename(baseDir, nickname, domain, - postJsonObject) - if cachedPostFilename: - if os.path.isfile(cachedPostFilename): - os.remove(cachedPostFilename) - removePostFromCache(postJsonObject, recentPostsCache) - - if not postJsonObject.get('object'): - if debug: - pprint(postJsonObject) - print('DEBUG: post ' + postFilename + ' has no object') - return - if not isinstance(postJsonObject['object'], dict): - return - postUrl = removeIdEnding(postJsonObject['id']) + '/shares' - if not postJsonObject['object'].get('shares'): - if debug: - print('DEBUG: Adding initial shares (announcements) to ' + - postUrl) - announcementsJson = { - "@context": "https://www.w3.org/ns/activitystreams", - 'id': postUrl, - 'type': 'Collection', - "totalItems": 1, - 'items': [{ - 'type': 'Announce', - 'actor': actor - }] - } - postJsonObject['object']['shares'] = announcementsJson - else: - if postJsonObject['object']['shares'].get('items'): - sharesItems = postJsonObject['object']['shares']['items'] - for announceItem in sharesItems: - if announceItem.get('actor'): - if announceItem['actor'] == actor: - return - newAnnounce = { - 'type': 'Announce', - 'actor': actor - } - postJsonObject['object']['shares']['items'].append(newAnnounce) - itlen = len(postJsonObject['object']['shares']['items']) - postJsonObject['object']['shares']['totalItems'] = itlen - else: - if debug: - print('DEBUG: shares (announcements) section of post ' + - 'has no items list') + if not postJsonObject: + return + # remove any cached version of this announce so that the announce + # icon is changed + nickname = getNicknameFromActor(actor) + cachedPostFilename = getCachedPostFilename(baseDir, nickname, domain, + postJsonObject) + if cachedPostFilename: + if os.path.isfile(cachedPostFilename): + os.remove(cachedPostFilename) + removePostFromCache(postJsonObject, recentPostsCache) + if not postJsonObject.get('object'): if debug: - print('DEBUG: saving post with shares (announcements) added') pprint(postJsonObject) - saveJson(postJsonObject, postFilename) + print('DEBUG: post ' + postFilename + ' has no object') + return + if not isinstance(postJsonObject['object'], dict): + return + postUrl = removeIdEnding(postJsonObject['id']) + '/shares' + if not postJsonObject['object'].get('shares'): + if debug: + print('DEBUG: Adding initial shares (announcements) to ' + + postUrl) + announcementsJson = { + "@context": "https://www.w3.org/ns/activitystreams", + 'id': postUrl, + 'type': 'Collection', + "totalItems": 1, + 'items': [{ + 'type': 'Announce', + 'actor': actor + }] + } + postJsonObject['object']['shares'] = announcementsJson + else: + if postJsonObject['object']['shares'].get('items'): + sharesItems = postJsonObject['object']['shares']['items'] + for announceItem in sharesItems: + if announceItem.get('actor'): + if announceItem['actor'] == actor: + return + newAnnounce = { + 'type': 'Announce', + 'actor': actor + } + postJsonObject['object']['shares']['items'].append(newAnnounce) + itlen = len(postJsonObject['object']['shares']['items']) + postJsonObject['object']['shares']['totalItems'] = itlen + else: + if debug: + print('DEBUG: shares (announcements) section of post ' + + 'has no items list') + + if debug: + print('DEBUG: saving post with shares (announcements) added') + pprint(postJsonObject) + saveJson(postJsonObject, postFilename) def weekDayOfMonthStart(monthNumber: int, year: int) -> int: From afedb302b0ccd9570c779574abb422622fe36a90 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 7 May 2021 17:56:21 +0100 Subject: [PATCH 0898/1416] Tidying --- announce.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/announce.py b/announce.py index ef946d5a3..5ec2ee386 100644 --- a/announce.py +++ b/announce.py @@ -40,7 +40,7 @@ def outboxAnnounce(recentPostsCache: {}, return False nickname = getNicknameFromActor(messageJson['actor']) if not nickname: - print('WARN: no nickname found in '+messageJson['actor']) + print('WARN: no nickname found in ' + messageJson['actor']) return False domain, port = getDomainFromActor(messageJson['actor']) postFilename = locatePost(baseDir, nickname, domain, @@ -49,7 +49,7 @@ def outboxAnnounce(recentPostsCache: {}, updateAnnounceCollection(recentPostsCache, baseDir, postFilename, messageJson['actor'], domain, debug) return True - if messageJson['type'] == 'Undo': + elif messageJson['type'] == 'Undo': if not isinstance(messageJson['object'], dict): return False if not messageJson['object'].get('type'): @@ -132,7 +132,7 @@ def createAnnounce(session, baseDir: str, federationList: [], '/statuses/' + statusNumber newAnnounce = { "@context": "https://www.w3.org/ns/activitystreams", - 'actor': httpPrefix+'://'+fullDomain+'/users/'+nickname, + 'actor': httpPrefix + '://' + fullDomain + '/users/' + nickname, 'atomUri': atomUriStr, 'cc': [], 'id': newAnnounceId + '/activity', From 7c5317224a971353dc4ff5549a2bf89ae6865350 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 7 May 2021 20:57:13 +0100 Subject: [PATCH 0899/1416] Check that share is added to announce post --- webapp_post.py | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/webapp_post.py b/webapp_post.py index 4ec743f7f..e965f484c 100644 --- a/webapp_post.py +++ b/webapp_post.py @@ -21,6 +21,7 @@ from posts import postIsMuted from posts import getPersonBox from posts import downloadAnnounce from posts import populateRepliesJson +from utils import updateAnnounceCollection from utils import isPGPEncrypted from utils import isDM from utils import rejectPostId @@ -1302,21 +1303,26 @@ def individualPostAsHtml(allowDownloads: bool, return '' postJsonObject = postJsonAnnounce - if isRecentPost(postJsonObject): - announceFilename = \ - locatePost(baseDir, nickname, domain, - postJsonObject['id']) - if announceFilename and postJsonObject.get('actor'): - if not os.path.isfile(announceFilename + '.tts'): - updateSpeaker(baseDir, httpPrefix, - nickname, domain, domainFull, - postJsonObject, personCache, - translate, postJsonObject['actor'], - themeName) - ttsFile = open(announceFilename + '.tts', "w+") - if ttsFile: - ttsFile.write('\n') - ttsFile.close() + announceFilename = \ + locatePost(baseDir, nickname, domain, + postJsonObject['id']) + if announceFilename: + updateAnnounceCollection(recentPostsCache, + baseDir, announceFilename, + postActor, domainFull, False) + + if isRecentPost(postJsonObject): + if postJsonObject.get('actor'): + if not os.path.isfile(announceFilename + '.tts'): + updateSpeaker(baseDir, httpPrefix, + nickname, domain, domainFull, + postJsonObject, personCache, + translate, postJsonObject['actor'], + themeName) + ttsFile = open(announceFilename + '.tts', "w+") + if ttsFile: + ttsFile.write('\n') + ttsFile.close() isAnnounced = True From e70a9b96c591d1094d6a37354b94cdf7a3055eb4 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 7 May 2021 22:10:55 +0100 Subject: [PATCH 0900/1416] Showing announced posts --- announce.py | 31 ++++++------------------------- webapp_post.py | 10 +++++++--- 2 files changed, 13 insertions(+), 28 deletions(-) diff --git a/announce.py b/announce.py index 5ec2ee386..e42addf0d 100644 --- a/announce.py +++ b/announce.py @@ -73,34 +73,15 @@ def outboxAnnounce(recentPostsCache: {}, return False -def announcedByPerson(postJsonObject: {}, nickname: str, domain: str) -> bool: +def announcedByPerson(isAnnounced: bool, postJsonObject: {}, + nickname: str, domainFull: str) -> bool: """Returns True if the given post is announced by the given person """ - if not postJsonObject.get('type'): + if not postJsonObject.get('actor'): return False - if not postJsonObject.get('object'): - return False - if isinstance(postJsonObject['object'], str): - if postJsonObject['type'] == 'Announce' and \ - postJsonObject.get('actor'): - actorMatch = domain + '/users/' + nickname - if postJsonObject['actor'].endswith(actorMatch): - return True - elif not isinstance(postJsonObject['object'], dict): - return False - # not to be confused with shared items - if not postJsonObject['object'].get('shares'): - return False - if not isinstance(postJsonObject['object']['shares'], dict): - return False - if not postJsonObject['object']['shares'].get('items'): - return False - if not isinstance(postJsonObject['object']['shares']['items'], list): - return False - actorMatch = domain + '/users/' + nickname - for item in postJsonObject['object']['shares']['items']: - if item['actor'].endswith(actorMatch): - return True + if isAnnounced and \ + postJsonObject['actor'].endswith(domainFull + '/users/' + nickname): + return True return False diff --git a/webapp_post.py b/webapp_post.py index e965f484c..98fc78074 100644 --- a/webapp_post.py +++ b/webapp_post.py @@ -385,7 +385,8 @@ def _getEditIconHtml(baseDir: str, nickname: str, domainFull: str, return editStr -def _getAnnounceIconHtml(nickname: str, domainFull: str, +def _getAnnounceIconHtml(isAnnounced: bool, + nickname: str, domainFull: str, postJsonObject: {}, isPublicRepeat: bool, isModerationPost: bool, @@ -412,7 +413,8 @@ def _getAnnounceIconHtml(nickname: str, domainFull: str, announceLink = 'repeatprivate' announceTitle = translate['Repeat this post'] - if announcedByPerson(postJsonObject, nickname, domainFull): + if announcedByPerson(isAnnounced, + postJsonObject, nickname, domainFull): announceIcon = 'repeat.png' announceEmoji = '🔁 ' announceLink = 'unrepeat' @@ -1311,6 +1313,7 @@ def individualPostAsHtml(allowDownloads: bool, baseDir, announceFilename, postActor, domainFull, False) + # create a file for use by text-to-speech if isRecentPost(postJsonObject): if postJsonObject.get('actor'): if not os.path.isfile(announceFilename + '.tts'): @@ -1407,7 +1410,8 @@ def individualPostAsHtml(allowDownloads: bool, translate, isEvent) announceStr = \ - _getAnnounceIconHtml(nickname, domainFull, + _getAnnounceIconHtml(isAnnounced, + nickname, domainFull, postJsonObject, isPublicRepeat, isModerationPost, From 539766b74d4d5aec20e275175684f9ba8a6226b2 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 7 May 2021 23:07:26 +0100 Subject: [PATCH 0901/1416] Repeat strings --- webapp_post.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webapp_post.py b/webapp_post.py index 98fc78074..c2031c6f8 100644 --- a/webapp_post.py +++ b/webapp_post.py @@ -432,8 +432,8 @@ def _getAnnounceIconHtml(isAnnounced: bool, announceStr += \ ' ' + \ - '' + announceEmoji + translate['Repeat this post'] + \
+        '<img loading=\n' return announceStr From db3243724dc08e1d44ebd9f1615c46c3be51acb9 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 7 May 2021 23:49:04 +0100 Subject: [PATCH 0902/1416] Detecting announces --- announce.py | 6 +++--- webapp_post.py | 4 +++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/announce.py b/announce.py index e42addf0d..2b9a1cc64 100644 --- a/announce.py +++ b/announce.py @@ -73,14 +73,14 @@ def outboxAnnounce(recentPostsCache: {}, return False -def announcedByPerson(isAnnounced: bool, postJsonObject: {}, +def announcedByPerson(isAnnounced: bool, postActor: str, nickname: str, domainFull: str) -> bool: """Returns True if the given post is announced by the given person """ - if not postJsonObject.get('actor'): + if not postActor: return False if isAnnounced and \ - postJsonObject['actor'].endswith(domainFull + '/users/' + nickname): + postActor.endswith(domainFull + '/users/' + nickname): return True return False diff --git a/webapp_post.py b/webapp_post.py index c2031c6f8..fb91b929f 100644 --- a/webapp_post.py +++ b/webapp_post.py @@ -386,6 +386,7 @@ def _getEditIconHtml(baseDir: str, nickname: str, domainFull: str, def _getAnnounceIconHtml(isAnnounced: bool, + postActor: str, nickname: str, domainFull: str, postJsonObject: {}, isPublicRepeat: bool, @@ -414,7 +415,7 @@ def _getAnnounceIconHtml(isAnnounced: bool, announceTitle = translate['Repeat this post'] if announcedByPerson(isAnnounced, - postJsonObject, nickname, domainFull): + postActor, nickname, domainFull): announceIcon = 'repeat.png' announceEmoji = '🔁 ' announceLink = 'unrepeat' @@ -1411,6 +1412,7 @@ def individualPostAsHtml(allowDownloads: bool, announceStr = \ _getAnnounceIconHtml(isAnnounced, + postActor, nickname, domainFull, postJsonObject, isPublicRepeat, From bba25d8417e39fd4aba292cb296ba5b370f750b9 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 8 May 2021 14:14:52 +0100 Subject: [PATCH 0903/1416] Remove original announce post when unannouncing --- announce.py | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++ daemon.py | 30 +++++++++++++++++++++++++---- outbox.py | 7 +++++++ webapp_post.py | 13 +++++++++++-- 4 files changed, 95 insertions(+), 6 deletions(-) diff --git a/announce.py b/announce.py index 2b9a1cc64..238f25659 100644 --- a/announce.py +++ b/announce.py @@ -6,6 +6,7 @@ __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" +from utils import removeIdEnding from utils import hasUsersPath from utils import getFullDomain from utils import getStatusNumber @@ -334,3 +335,53 @@ def sendUndoAnnounceViaServer(baseDir: str, session, print('DEBUG: c2s POST undo announce success') return unAnnounceJson + + +def outboxUndoAnnounce(recentPostsCache: {}, + baseDir: str, httpPrefix: str, + nickname: str, domain: str, port: int, + messageJson: {}, debug: bool) -> None: + """ When an undo announce is received by the outbox from c2s + """ + if not messageJson.get('type'): + return + if not messageJson['type'] == 'Undo': + return + if not messageJson.get('object'): + return + if not isinstance(messageJson['object'], dict): + if debug: + print('DEBUG: undo like object is not dict') + return + if not messageJson['object'].get('type'): + if debug: + print('DEBUG: undo like - no type') + return + if not messageJson['object']['type'] == 'Announce': + if debug: + print('DEBUG: not a undo announce') + return + if not messageJson['object'].get('object'): + if debug: + print('DEBUG: no object in undo announce') + return + if not isinstance(messageJson['object']['object'], str): + if debug: + print('DEBUG: undo announce object is not string') + return + if debug: + print('DEBUG: c2s undo announce request arrived in outbox') + + messageId = removeIdEnding(messageJson['object']['object']) + if ':' in domain: + domain = domain.split(':')[0] + postFilename = locatePost(baseDir, nickname, domain, messageId) + if not postFilename: + if debug: + print('DEBUG: c2s undo announce post not found in inbox or outbox') + print(messageId) + return True + undoAnnounceCollectionEntry(recentPostsCache, baseDir, postFilename, + messageJson['actor'], domain, debug) + if debug: + print('DEBUG: post undo announce via c2s - ' + postFilename) diff --git a/daemon.py b/daemon.py index 6724ce694..700d26a9d 100644 --- a/daemon.py +++ b/daemon.py @@ -6228,13 +6228,17 @@ class PubServer(BaseHTTPRequestHandler): domain: str, domainFull: str, port: int, onionDomain: str, i2pDomain: str, GETstartTime, GETtimings: {}, - repeatPrivate: bool, debug: bool): + repeatPrivate: bool, debug: bool, + recentPostsCache: {}): """Undo announce/repeat button was pressed """ pageNumber = 1 + + # the post which was referenced by the announce post repeatUrl = path.split('?unrepeat=')[1] if '?' in repeatUrl: repeatUrl = repeatUrl.split('?')[0] + timelineBookmark = '' if '?bm=' in path: timelineBookmark = path.split('?bm=')[1] @@ -6283,11 +6287,11 @@ class PubServer(BaseHTTPRequestHandler): "@context": "https://www.w3.org/ns/activitystreams", 'actor': undoAnnounceActor, 'type': 'Undo', - 'cc': [undoAnnounceActor+'/followers'], + 'cc': [undoAnnounceActor + '/followers'], 'to': [unRepeatToStr], 'object': { 'actor': undoAnnounceActor, - 'cc': [undoAnnounceActor+'/followers'], + 'cc': [undoAnnounceActor + '/followers'], 'object': repeatUrl, 'to': [unRepeatToStr], 'type': 'Announce' @@ -6296,6 +6300,23 @@ class PubServer(BaseHTTPRequestHandler): # clear the icon from the cache so that it gets updated if self.server.iconsCache.get('repeat_inactive.png'): del self.server.iconsCache['repeat_inactive.png'] + + # delete the announce post + if '?unannounce=' in path: + announceUrl = path.split('?unannounce=')[1] + if '?' in announceUrl: + announceUrl = announceUrl.split('?')[0] + postFilename = None + nickname = getNicknameFromActor(announceUrl) + if nickname: + if announceUrl.endswith(domainFull + '/users/' + nickname): + postFilename = \ + locatePost(baseDir, nickname, domain, announceUrl) + if postFilename: + deletePost(baseDir, httpPrefix, + nickname, domain, postFilename, + debug, recentPostsCache) + self._postToOutboxThread(newUndoAnnounce) self.server.GETbusy = False actorAbsolute = self._getInstalceUrl(callingDomain) + actor @@ -11942,7 +11963,8 @@ class PubServer(BaseHTTPRequestHandler): self.server.i2pDomain, GETstartTime, GETtimings, repeatPrivate, - self.server.debug) + self.server.debug, + self.server.recentPostsCache) return self._benchmarkGETtimings(GETstartTime, GETtimings, diff --git a/outbox.py b/outbox.py index 9243c7aa6..8ad268251 100644 --- a/outbox.py +++ b/outbox.py @@ -33,6 +33,7 @@ from media import getMediaPath from media import createMediaDirs from inbox import inboxUpdateIndex from announce import outboxAnnounce +from announce import outboxUndoAnnounce from follow import outboxUndoFollow from roles import outboxDelegate from skills import outboxSkills @@ -483,6 +484,12 @@ def postMessageToOutbox(session, translate: {}, baseDir, httpPrefix, postToNickname, domain, port, messageJson, debug) + if debug: + print('DEBUG: handle any undo announce requests') + outboxUndoAnnounce(recentPostsCache, + baseDir, httpPrefix, + postToNickname, domain, port, + messageJson, debug) if debug: print('DEBUG: handle any bookmark requests') diff --git a/webapp_post.py b/webapp_post.py index fb91b929f..702d3ba03 100644 --- a/webapp_post.py +++ b/webapp_post.py @@ -388,6 +388,7 @@ def _getEditIconHtml(baseDir: str, nickname: str, domainFull: str, def _getAnnounceIconHtml(isAnnounced: bool, postActor: str, nickname: str, domainFull: str, + announceJsonObject: {}, postJsonObject: {}, isPublicRepeat: bool, isModerationPost: bool, @@ -413,6 +414,7 @@ def _getAnnounceIconHtml(isAnnounced: bool, if not isPublicRepeat: announceLink = 'repeatprivate' announceTitle = translate['Repeat this post'] + unannounceLinkStr = '' if announcedByPerson(isAnnounced, postActor, nickname, domainFull): @@ -422,11 +424,15 @@ def _getAnnounceIconHtml(isAnnounced: bool, if not isPublicRepeat: announceLink = 'unrepeatprivate' announceTitle = translate['Undo the repeat'] + if announceJsonObject: + unannounceLinkStr = '?unannounce=' + \ + announceJsonObject['object']['id'] + announceLinkStr = '?' + \ + announceLink + '=' + postJsonObject['object']['id'] + pageNumberParam announceStr = \ ' \n' @@ -1291,7 +1297,9 @@ def individualPostAsHtml(allowDownloads: bool, titleStr = '' galleryStr = '' isAnnounced = False + announceJsonObject = None if postJsonObject['type'] == 'Announce': + announceJsonObject = postJsonObject.copy() postJsonAnnounce = \ downloadAnnounce(session, baseDir, httpPrefix, nickname, domain, postJsonObject, @@ -1414,6 +1422,7 @@ def individualPostAsHtml(allowDownloads: bool, _getAnnounceIconHtml(isAnnounced, postActor, nickname, domainFull, + announceJsonObject, postJsonObject, isPublicRepeat, isModerationPost, From 9f83477dde7c00f83237d1c3e54ada60007fb2c9 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 8 May 2021 14:21:02 +0100 Subject: [PATCH 0904/1416] Announce link --- webapp_post.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp_post.py b/webapp_post.py index 702d3ba03..818759691 100644 --- a/webapp_post.py +++ b/webapp_post.py @@ -426,7 +426,7 @@ def _getAnnounceIconHtml(isAnnounced: bool, announceTitle = translate['Undo the repeat'] if announceJsonObject: unannounceLinkStr = '?unannounce=' + \ - announceJsonObject['object']['id'] + announceJsonObject['id'] announceLinkStr = '?' + \ announceLink + '=' + postJsonObject['object']['id'] + pageNumberParam From fdc683d005eca9d83dd944fd133365c8b38b8b72 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 8 May 2021 14:24:04 +0100 Subject: [PATCH 0905/1416] Remove id ending from announce --- webapp_post.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp_post.py b/webapp_post.py index 818759691..67b843669 100644 --- a/webapp_post.py +++ b/webapp_post.py @@ -426,7 +426,7 @@ def _getAnnounceIconHtml(isAnnounced: bool, announceTitle = translate['Undo the repeat'] if announceJsonObject: unannounceLinkStr = '?unannounce=' + \ - announceJsonObject['id'] + removeIdEnding(announceJsonObject['id']) announceLinkStr = '?' + \ announceLink + '=' + postJsonObject['object']['id'] + pageNumberParam From 8623be69392fec52ae1894f01b8b8a5bd6432948 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 8 May 2021 16:16:58 +0100 Subject: [PATCH 0906/1416] Locating announce --- daemon.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daemon.py b/daemon.py index 700d26a9d..e9746cdfa 100644 --- a/daemon.py +++ b/daemon.py @@ -6309,7 +6309,7 @@ class PubServer(BaseHTTPRequestHandler): postFilename = None nickname = getNicknameFromActor(announceUrl) if nickname: - if announceUrl.endswith(domainFull + '/users/' + nickname): + if domainFull + '/users/' + nickname + '/' in announceUrl: postFilename = \ locatePost(baseDir, nickname, domain, announceUrl) if postFilename: From 89a15fdc733f52390aeb040a7e13434168d560c7 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 8 May 2021 18:13:46 +0100 Subject: [PATCH 0907/1416] Fix actor upgrades --- person.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/person.py b/person.py index d56c0fd5f..a72ca31d7 100644 --- a/person.py +++ b/person.py @@ -35,6 +35,7 @@ from auth import storeBasicCredentials from auth import removePassword from roles import setRole from media import removeMetaData +from utils import getStatusNumber from utils import getFullDomain from utils import validNickname from utils import loadJson @@ -272,12 +273,14 @@ def _createPersonBase(baseDir: str, nickname: str, domain: str, port: int, personId + '/avatar' + \ str(randint(10000000000000, 99999999999999)) + '.png' # nosec + statusNumber, published = getStatusNumber() newPerson = { '@context': [ 'https://www.w3.org/ns/activitystreams', 'https://w3id.org/security/v1', getDefaultPersonContext() ], + 'published': published, 'alsoKnownAs': [], 'attachment': [], 'devices': personId + '/collections/devices', @@ -563,11 +566,17 @@ def personUpgradeActor(baseDir: str, personJson: {}, if not personJson: personJson = loadJson(filename) - if updateActor: - # add a speaker endpoint - if not personJson.get('tts'): - personJson['tts'] = personJson['id'] + '/speaker' + # add a speaker endpoint + if not personJson.get('tts'): + personJson['tts'] = personJson['id'] + '/speaker' + updateActor = True + if not personJson.get('published'): + statusNumber, published = getStatusNumber() + personJson['published'] = published + updateActor = True + + if updateActor: saveJson(personJson, filename) # also update the actor within the cache From c1de82e5c9999e14cc1fa97e05603d6b40c5f845 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 8 May 2021 18:57:57 +0100 Subject: [PATCH 0908/1416] Show joined dates within profile screens --- translations/ar.json | 3 ++- translations/ca.json | 3 ++- translations/cy.json | 3 ++- translations/de.json | 3 ++- translations/en.json | 3 ++- translations/es.json | 3 ++- translations/fr.json | 3 ++- translations/ga.json | 3 ++- translations/hi.json | 3 ++- translations/it.json | 3 ++- translations/ja.json | 3 ++- translations/ku.json | 3 ++- translations/oc.json | 3 ++- translations/pt.json | 3 ++- translations/ru.json | 3 ++- translations/zh.json | 3 ++- webapp_profile.py | 29 +++++++++++++++++++++++++---- 17 files changed, 57 insertions(+), 20 deletions(-) diff --git a/translations/ar.json b/translations/ar.json index a8ae3f47f..a16ebaa19 100644 --- a/translations/ar.json +++ b/translations/ar.json @@ -439,5 +439,6 @@ "enterNotes": "أدخل الملاحظات", "These access keys may be used": "قد يتم استخدام مفاتيح الوصول هذه، عادة مع مفتاح ALT + SHIFT + مفتاح ALT +", "Show numbers of accounts within instance metadata": "إظهار عدد الحسابات داخل البيانات الوصفية للمثيلات", - "Show version number within instance metadata": "إظهار رقم الإصدار داخل البيانات الوصفية للمثيل" + "Show version number within instance metadata": "إظهار رقم الإصدار داخل البيانات الوصفية للمثيل", + "Joined": "تاريخ الانضمام" } diff --git a/translations/ca.json b/translations/ca.json index 6e8db45ac..a1739b8f8 100644 --- a/translations/ca.json +++ b/translations/ca.json @@ -439,5 +439,6 @@ "enterNotes": "Introduïu notes", "These access keys may be used": "Es poden utilitzar aquestes tecles d'accés, típicament amb Alt + Maj + tecla o Alt + clau", "Show numbers of accounts within instance metadata": "Mostra el nombre de comptes a les metadades de la instància", - "Show version number within instance metadata": "Mostra el número de versió a les metadades de la instància" + "Show version number within instance metadata": "Mostra el número de versió a les metadades de la instància", + "Joined": "Data d'unió" } diff --git a/translations/cy.json b/translations/cy.json index 012710f78..06f365df7 100644 --- a/translations/cy.json +++ b/translations/cy.json @@ -439,5 +439,6 @@ "enterNotes": "Rhowch nodiadau", "These access keys may be used": "Gellir defnyddio'r allweddi mynediad hyn, fel arfer gyda ALT + Shift + Allwedd Allwedd neu ALT +", "Show numbers of accounts within instance metadata": "Dangos nifer y cyfrifon o fewn metadata", - "Show version number within instance metadata": "Dangos rhif y fersiwn o fewn metadata" + "Show version number within instance metadata": "Dangos rhif y fersiwn o fewn metadata", + "Joined": "Dyddiad ymuno" } diff --git a/translations/de.json b/translations/de.json index 2ebf7d035..87a610034 100644 --- a/translations/de.json +++ b/translations/de.json @@ -439,5 +439,6 @@ "enterNotes": "Notizen eingeben", "These access keys may be used": "Diese Zugriffstasten können verwendet werden, typischerweise mit ALT + SHIFT + -Taste oder ALT + -Taste", "Show numbers of accounts within instance metadata": "Anzahl der Konten in Instanzmetadaten anzeigen", - "Show version number within instance metadata": "Versionsnummer in Instanzmetadaten anzeigen" + "Show version number within instance metadata": "Versionsnummer in Instanzmetadaten anzeigen", + "Joined": "Verbundenes Datum" } diff --git a/translations/en.json b/translations/en.json index c8a29aed5..93c245167 100644 --- a/translations/en.json +++ b/translations/en.json @@ -439,5 +439,6 @@ "enterNotes": "Enter notes", "These access keys may be used": "These access keys may be used, typically with ALT + SHIFT + key or ALT + key", "Show numbers of accounts within instance metadata": "Show numbers of accounts within instance metadata", - "Show version number within instance metadata": "Show version number within instance metadata" + "Show version number within instance metadata": "Show version number within instance metadata", + "Joined": "Joined" } diff --git a/translations/es.json b/translations/es.json index cdd5b698f..15849bc83 100644 --- a/translations/es.json +++ b/translations/es.json @@ -439,5 +439,6 @@ "enterNotes": "Ingresar notas", "These access keys may be used": "Se pueden usar estas teclas de acceso, típicamente con teclas ALT + MAYÚS + teclas o ALT +", "Show numbers of accounts within instance metadata": "Muestra el número de cuentas dentro de los metadatos de la instancia.", - "Show version number within instance metadata": "Mostrar el número de versión dentro de los metadatos de la instancia" + "Show version number within instance metadata": "Mostrar el número de versión dentro de los metadatos de la instancia", + "Joined": "Fecha unida" } diff --git a/translations/fr.json b/translations/fr.json index ad8f62cbf..6f8d9e7e5 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -439,5 +439,6 @@ "enterNotes": "Faire entrer des notes", "These access keys may be used": "Ces touches d'accès peuvent être utilisées typiquement avec une touche Alt + Maj + ou Alt +", "Show numbers of accounts within instance metadata": "Afficher le nombre de comptes dans les métadonnées de l'instance", - "Show version number within instance metadata": "Afficher le numéro de version dans les métadonnées de l'instance" + "Show version number within instance metadata": "Afficher le numéro de version dans les métadonnées de l'instance", + "Joined": "Joint" } diff --git a/translations/ga.json b/translations/ga.json index ebb6d18d4..2473e9712 100644 --- a/translations/ga.json +++ b/translations/ga.json @@ -439,5 +439,6 @@ "enterNotes": "Cuir nótaí isteach", "These access keys may be used": "Is féidir na heochracha rochtana seo a úsáid, de ghnáth le Alt + Shift + Eochair nó Alt + Eochair", "Show numbers of accounts within instance metadata": "Taispeáin líon na gcuntas laistigh de mheiteashonraí", - "Show version number within instance metadata": "Taispeáin uimhir an leagain laistigh de mheiteashonraí" + "Show version number within instance metadata": "Taispeáin uimhir an leagain laistigh de mheiteashonraí", + "Joined": "Dáta comhcheangailte" } diff --git a/translations/hi.json b/translations/hi.json index 9861f5b43..520c9ce47 100644 --- a/translations/hi.json +++ b/translations/hi.json @@ -439,5 +439,6 @@ "enterNotes": "नोट्स दर्ज करें", "These access keys may be used": "इन एक्सेस कुंजियों का उपयोग किया जा सकता है, आमतौर पर Alt + Shift + कुंजी या Alt + कुंजी के साथ", "Show numbers of accounts within instance metadata": "उदाहरण मेटाडेटा के भीतर खातों की संख्या दिखाएं", - "Show version number within instance metadata": "उदाहरण मेटाडेटा के भीतर संस्करण संख्या दिखाएं" + "Show version number within instance metadata": "उदाहरण मेटाडेटा के भीतर संस्करण संख्या दिखाएं", + "Joined": "दिनांक" } diff --git a/translations/it.json b/translations/it.json index be937bc46..0473de4f0 100644 --- a/translations/it.json +++ b/translations/it.json @@ -439,5 +439,6 @@ "enterNotes": "Inserisci le note", "These access keys may be used": "Questi tasti di accesso possono essere utilizzati, in genere con tasto ALT + MAIUSC + o ALT + Key", "Show numbers of accounts within instance metadata": "Mostra il numero di account all'interno dei metadati dell'istanza", - "Show version number within instance metadata": "Mostra il numero di versione nei metadati dell'istanza" + "Show version number within instance metadata": "Mostra il numero di versione nei metadati dell'istanza", + "Joined": "Unito" } diff --git a/translations/ja.json b/translations/ja.json index eca6ac0b0..972432fe1 100644 --- a/translations/ja.json +++ b/translations/ja.json @@ -439,5 +439,6 @@ "enterNotes": "ノートを入力してください", "These access keys may be used": "これらのアクセスキーは、通常はAlt + Shift +キーまたはAlt +キーを使用して使用できます。", "Show numbers of accounts within instance metadata": "インスタンスメタデータ内のアカウント数を表示する", - "Show version number within instance metadata": "インスタンスメタデータ内にバージョン番号を表示する" + "Show version number within instance metadata": "インスタンスメタデータ内にバージョン番号を表示する", + "Joined": "参加日" } diff --git a/translations/ku.json b/translations/ku.json index a25fbbc43..452a3ea93 100644 --- a/translations/ku.json +++ b/translations/ku.json @@ -439,5 +439,6 @@ "enterNotes": "Nîşan binivîse", "These access keys may be used": "Dibe ku ev keysên gihîştinê bikar bînin, bi gelemperî bi alt + shift + key an alt + key", "Show numbers of accounts within instance metadata": "Di nav metadata mînakê de hejmarên hesaban nîşan bidin", - "Show version number within instance metadata": "Di nav metadata mînakê de nimreya guhertoyê nîşan bide" + "Show version number within instance metadata": "Di nav metadata mînakê de nimreya guhertoyê nîşan bide", + "Joined": "Beşdarbûna Dîrokê" } diff --git a/translations/oc.json b/translations/oc.json index 03e52d742..40ca10e0a 100644 --- a/translations/oc.json +++ b/translations/oc.json @@ -435,5 +435,6 @@ "enterNotes": "Enter notes", "These access keys may be used": "These access keys may be used, typically with ALT + SHIFT + key or ALT + key", "Show numbers of accounts within instance metadata": "Show numbers of accounts within instance metadata", - "Show version number within instance metadata": "Show version number within instance metadata" + "Show version number within instance metadata": "Show version number within instance metadata", + "Joined": "Joined" } diff --git a/translations/pt.json b/translations/pt.json index 4b2135f08..28d1a7f06 100644 --- a/translations/pt.json +++ b/translations/pt.json @@ -439,5 +439,6 @@ "enterNotes": "Digite notas", "These access keys may be used": "Essas teclas de acesso podem ser usadas, normalmente com tecla Alt + Shift + Key ou Alt +", "Show numbers of accounts within instance metadata": "Mostra o número de contas nos metadados da instância", - "Show version number within instance metadata": "Mostrar o número da versão nos metadados da instância" + "Show version number within instance metadata": "Mostrar o número da versão nos metadados da instância", + "Joined": "Data juntada" } diff --git a/translations/ru.json b/translations/ru.json index 0fa03d6ad..55857de58 100644 --- a/translations/ru.json +++ b/translations/ru.json @@ -439,5 +439,6 @@ "enterNotes": "Введите ноты", "These access keys may be used": "Эти ключевые ключи доступа могут быть использованы, обычно с ALT + Shift + Key или Alt + Key", "Show numbers of accounts within instance metadata": "Показать количество учетных записей в метаданных экземпляра", - "Show version number within instance metadata": "Показать номер версии в метаданных экземпляра" + "Show version number within instance metadata": "Показать номер версии в метаданных экземпляра", + "Joined": "Присоединенная дата" } diff --git a/translations/zh.json b/translations/zh.json index 06eaa96ca..c2492f167 100644 --- a/translations/zh.json +++ b/translations/zh.json @@ -439,5 +439,6 @@ "enterNotes": "输入笔记", "These access keys may be used": "可以使用这些访问密钥,通常使用Alt + Shift +键或ALT +键", "Show numbers of accounts within instance metadata": "显示实例元数据中的帐户数", - "Show version number within instance metadata": "在实例元数据中显示版本号" + "Show version number within instance metadata": "在实例元数据中显示版本号", + "Joined": "加入日期" } diff --git a/webapp_profile.py b/webapp_profile.py index 59115eab9..3abdbcb69 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -246,6 +246,11 @@ def htmlProfileAfterSearch(cssCache: {}, if profileJson.get('alsoKnownAs'): alsoKnownAs = profileJson['alsoKnownAs'] + joinedDate = None + if profileJson.get('published'): + if 'T' in profileJson['published']: + joinedDate = profileJson['published'] + profileStr = \ _getProfileHeaderAfterSearch(baseDir, nickname, defaultTimeline, @@ -256,7 +261,8 @@ def htmlProfileAfterSearch(cssCache: {}, profileDescriptionShort, avatarUrl, imageUrl, movedTo, profileJson['id'], - alsoKnownAs, accessKeys) + alsoKnownAs, accessKeys, + joinedDate) domainFull = getFullDomain(domain, port) @@ -335,7 +341,8 @@ def _getProfileHeader(baseDir: str, httpPrefix: str, theme: str, movedTo: str, alsoKnownAs: [], pinnedContent: str, - accessKeys: {}) -> str: + accessKeys: {}, + joinedDate: str) -> str: """The header of the profile screen, containing background image and avatar """ @@ -357,6 +364,10 @@ def _getProfileHeader(baseDir: str, httpPrefix: str, htmlStr += '

' + displayName + '

\n' htmlStr += \ '

@' + nickname + '@' + domainFull + '
\n' + if joinedDate: + htmlStr += \ + '

' + translate['Joined'] + ' ' + \ + joinedDate.split('T')[0] + '
\n' if movedTo: newNickname = getNicknameFromActor(movedTo) newDomain, newPort = getDomainFromActor(movedTo) @@ -417,7 +428,8 @@ def _getProfileHeaderAfterSearch(baseDir: str, avatarUrl: str, imageUrl: str, movedTo: str, actor: str, alsoKnownAs: [], - accessKeys: {}) -> str: + accessKeys: {}, + joinedDate: str) -> str: """The header of a searched for handle, containing background image and avatar """ @@ -440,6 +452,9 @@ def _getProfileHeaderAfterSearch(baseDir: str, htmlStr += '

' + displayName + '

\n' htmlStr += \ '

@' + searchNickname + '@' + searchDomainFull + '
\n' + if joinedDate: + htmlStr += '

' + translate['Joined'] + ' ' + \ + joinedDate.split('T')[0] + '

\n' if followsYou: htmlStr += '

' + translate['Follows you'] + '

\n' if movedTo: @@ -711,6 +726,11 @@ def htmlProfile(rssIconAtTop: bool, if profileJson.get('alsoKnownAs'): alsoKnownAs = profileJson['alsoKnownAs'] + joinedDate = None + if profileJson.get('published'): + if 'T' in profileJson['published']: + joinedDate = profileJson['published'] + avatarUrl = profileJson['icon']['url'] # get pinned post content @@ -730,7 +750,8 @@ def htmlProfile(rssIconAtTop: bool, profileDescriptionShort, loginButton, avatarUrl, theme, movedTo, alsoKnownAs, - pinnedContent, accessKeys) + pinnedContent, accessKeys, + joinedDate) # keyboard navigation userPathStr = '/users/' + nickname From a31191e656d6d0f9366dbb08bd3e8067b96a3b69 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 8 May 2021 19:00:59 +0100 Subject: [PATCH 0909/1416] Not bold --- webapp_profile.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/webapp_profile.py b/webapp_profile.py index 3abdbcb69..8b1ef701d 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -366,8 +366,8 @@ def _getProfileHeader(baseDir: str, httpPrefix: str, '

@' + nickname + '@' + domainFull + '
\n' if joinedDate: htmlStr += \ - '

' + translate['Joined'] + ' ' + \ - joinedDate.split('T')[0] + '
\n' + '

' + translate['Joined'] + ' ' + \ + joinedDate.split('T')[0] + '
\n' if movedTo: newNickname = getNicknameFromActor(movedTo) newDomain, newPort = getDomainFromActor(movedTo) @@ -453,8 +453,8 @@ def _getProfileHeaderAfterSearch(baseDir: str, htmlStr += \ '

@' + searchNickname + '@' + searchDomainFull + '
\n' if joinedDate: - htmlStr += '

' + translate['Joined'] + ' ' + \ - joinedDate.split('T')[0] + '

\n' + htmlStr += '

' + translate['Joined'] + ' ' + \ + joinedDate.split('T')[0] + '

\n' if followsYou: htmlStr += '

' + translate['Follows you'] + '

\n' if movedTo: From 572d338943e148a27475d1eb16de1a941ffd0a0d Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 9 May 2021 10:49:48 +0100 Subject: [PATCH 0910/1416] Pine64 emoji --- emoji/default_emoji.json | 3 ++- emoji/pine64.png | Bin 0 -> 3239 bytes 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 emoji/pine64.png diff --git a/emoji/default_emoji.json b/emoji/default_emoji.json index d4818af2e..3f3052309 100644 --- a/emoji/default_emoji.json +++ b/emoji/default_emoji.json @@ -762,5 +762,6 @@ "talkingemote2": "talkingEmote2", "veryhappyemote": "veryHappyEmote", "worriedemote": "worriedEmote", - "tor": "tor" + "tor": "tor", + "pine64": "pine64" } diff --git a/emoji/pine64.png b/emoji/pine64.png new file mode 100644 index 0000000000000000000000000000000000000000..2a5cc5a00a7f4ae81b6d057b9560329f466fa665 GIT binary patch literal 3239 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 Z_J3*6;3LSS%Ps%_002ovPDHLkV1g=4510S| literal 0 HcmV?d00001 From d8b882c10fe0680e5244750a9f72b4b8c1db9cfb Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 9 May 2021 13:17:55 +0100 Subject: [PATCH 0911/1416] Option to spoof image metadata --- daemon.py | 10 +++++--- media.py | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- person.py | 5 ++-- posts.py | 18 +++++++++----- shares.py | 5 ++-- 5 files changed, 93 insertions(+), 16 deletions(-) diff --git a/daemon.py b/daemon.py index e9746cdfa..6f4e3efd3 100644 --- a/daemon.py +++ b/daemon.py @@ -239,7 +239,7 @@ from content import addHtmlTags from content import extractMediaInFormPOST from content import saveMediaInFormPOST from content import extractTextFieldsInPOST -from media import removeMetaData +from media import processMetaData from cache import checkForChangedActor from cache import storePersonInCache from cache import getPersonFromCache @@ -4075,7 +4075,8 @@ class PubServer(BaseHTTPRequestHandler): os.remove(postImageFilename + '.etag') except BaseException: pass - removeMetaData(filename, postImageFilename) + processMetaData(baseDir, nickname, domain, + filename, postImageFilename) if os.path.isfile(postImageFilename): print('profile update POST ' + mType + ' image or font saved to ' + postImageFilename) @@ -13053,7 +13054,9 @@ class PubServer(BaseHTTPRequestHandler): filename.endswith('.gif'): postImageFilename = filename.replace('.temp', '') print('Removing metadata from ' + postImageFilename) - removeMetaData(filename, postImageFilename) + processMetaData(self.server.baseDir, + nickname, self.server.domain, + filename, postImageFilename) if os.path.isfile(postImageFilename): print('POST media saved to ' + postImageFilename) else: @@ -13307,6 +13310,7 @@ class PubServer(BaseHTTPRequestHandler): postJsonObject['object'] = \ attachMedia(self.server.baseDir, self.server.httpPrefix, + nickname, self.server.domain, self.server.port, postJsonObject['object'], diff --git a/media.py b/media.py index 358c98932..f97b97f3f 100644 --- a/media.py +++ b/media.py @@ -8,6 +8,7 @@ __status__ = "Production" import os import datetime +from random import randint from hashlib import sha1 from auth import createPassword from utils import getFullDomain @@ -37,7 +38,7 @@ def replaceYouTube(postJsonObject: {}, replacementDomain: str) -> None: replacementDomain) -def removeMetaData(imageFilename: str, outputFilename: str) -> None: +def _removeMetaData(imageFilename: str, outputFilename: str) -> None: """Attempts to do this with pure python didn't work well, so better to use a dedicated tool if one is installed """ @@ -53,6 +54,68 @@ def removeMetaData(imageFilename: str, outputFilename: str) -> None: os.system('/usr/bin/mogrify -strip ' + outputFilename) # nosec +def _spoofMetaData(imageFilename: str, outputFilename: str, + spoofFilename: str) -> None: + """Use reference images to spoof the metadata + """ + copyfile(imageFilename, outputFilename) + if not os.path.isfile(outputFilename): + print('ERROR: unable to spoof metadata from ' + imageFilename) + return + if not os.path.isfile(spoofFilename): + print('ERROR: No spoof reference image ' + spoofFilename) + return + if os.path.isfile('/usr/bin/exiftool'): + print('Spoofing metadata in ' + outputFilename + ' using exiftool') + os.system('exiftool -TagsFromFile ' + + spoofFilename + ' ' + outputFilename) # nosec + else: + print('ERROR: exiftool is not installed') + return + + +def processMetaData(baseDir: str, nickname: str, domain: str, + imageFilename: str, outputFilename: str) -> None: + """Handles image metadata. This tries to spoof the metadata + if possible, but otherwise just removes it + """ + accountDir = baseDir + '/accounts/' + nickname + '@' + domain + spoofImagesDir = accountDir + '/ref/images' + if os.path.isdir(spoofImagesDir): + imageTypes = getImageExtensions() + # get the format of the target image + ext = None + for mType in imageTypes: + if outputFilename.endswith('.' + mType): + ext = mType + break + if ext: + spoofList = [] + for subdir, dirs, files in os.walk(baseDir + '/accounts'): + for f in files: + filename = os.path.join(spoofImagesDir, f) + # what is the format of this file? + currExt = None + for mType in imageTypes: + if filename.endswith('.' + mType): + currExt = mType + break + # if this the same format as the target? + if currExt: + if currExt == ext: + spoofList.append(filename) + break + if spoofList: + # choose a reference at random + index = randint(0, len(spoofList)) + spoofFilename = spoofList[index] + _spoofMetaData(imageFilename, outputFilename, + spoofFilename) + return + # if we can't spoof then just remove metadata + _removeMetaData(imageFilename, outputFilename) + + def _isMedia(imageFilename: str) -> bool: """Is the given file a media file? """ @@ -131,7 +194,8 @@ def _updateEtag(mediaFilename: str) -> None: pass -def attachMedia(baseDir: str, httpPrefix: str, domain: str, port: int, +def attachMedia(baseDir: str, httpPrefix: str, + nickname: str, domain: str, port: int, postJson: {}, imageFilename: str, mediaType: str, description: str) -> {}: """Attaches media to a json object post @@ -179,7 +243,8 @@ def attachMedia(baseDir: str, httpPrefix: str, domain: str, port: int, if baseDir: if mediaType.startswith('image/'): - removeMetaData(imageFilename, mediaFilename) + processMetaData(baseDir, nickname, domain, + imageFilename, mediaFilename) else: copyfile(imageFilename, mediaFilename) _updateEtag(mediaFilename) diff --git a/person.py b/person.py index a72ca31d7..c412bc2e3 100644 --- a/person.py +++ b/person.py @@ -34,7 +34,7 @@ from posts import createModeration from auth import storeBasicCredentials from auth import removePassword from roles import setRole -from media import removeMetaData +from media import processMetaData from utils import getStatusNumber from utils import getFullDomain from utils import validNickname @@ -135,7 +135,8 @@ def setProfileImage(baseDir: str, httpPrefix: str, nickname: str, domain: str, '/usr/bin/convert ' + imageFilename + ' -size ' + \ resolution + ' -quality 50 ' + profileFilename subprocess.call(cmd, shell=True) - removeMetaData(profileFilename, profileFilename) + processMetaData(baseDir, nickname, domain, + profileFilename, profileFilename) return True return False diff --git a/posts.py b/posts.py index e54802509..516bfad26 100644 --- a/posts.py +++ b/posts.py @@ -1059,6 +1059,10 @@ def _createPostBase(baseDir: str, nickname: str, domain: str, port: int, idStr = \ httpPrefix + '://' + domain + '/users/' + nickname + \ '/statuses/' + statusNumber + '/replies' + newPostUrl = \ + httpPrefix + '://' + domain + '/@' + nickname + '/'+statusNumber + newPostAttributedTo = \ + httpPrefix + '://' + domain + '/users/' + nickname newPost = { '@context': postContext, 'id': newPostId + '/activity', @@ -1073,8 +1077,8 @@ def _createPostBase(baseDir: str, nickname: str, domain: str, port: int, 'summary': summary, 'inReplyTo': inReplyTo, 'published': published, - 'url': httpPrefix+'://'+domain+'/@'+nickname+'/'+statusNumber, - 'attributedTo': httpPrefix+'://'+domain+'/users/'+nickname, + 'url': newPostUrl, + 'attributedTo': newPostAttributedTo, 'to': toRecipients, 'cc': toCC, 'sensitive': sensitive, @@ -1101,7 +1105,7 @@ def _createPostBase(baseDir: str, nickname: str, domain: str, port: int, } if attachImageFilename: newPost['object'] = \ - attachMedia(baseDir, httpPrefix, domain, port, + attachMedia(baseDir, httpPrefix, nickname, domain, port, newPost['object'], attachImageFilename, mediaType, imageDescription) _appendEventFields(newPost['object'], eventUUID, eventStatus, @@ -1115,6 +1119,8 @@ def _createPostBase(baseDir: str, nickname: str, domain: str, port: int, idStr = \ httpPrefix + '://' + domain + '/users/' + nickname + \ '/statuses/' + statusNumber + '/replies' + newPostUrl = \ + httpPrefix + '://' + domain + '/@' + nickname+'/' + statusNumber newPost = { "@context": postContext, 'id': newPostId, @@ -1122,8 +1128,8 @@ def _createPostBase(baseDir: str, nickname: str, domain: str, port: int, 'summary': summary, 'inReplyTo': inReplyTo, 'published': published, - 'url': httpPrefix+'://'+domain+'/@'+nickname+'/'+statusNumber, - 'attributedTo': httpPrefix+'://'+domain+'/users/'+nickname, + 'url': newPostUrl, + 'attributedTo': httpPrefix + '://' + domain + '/users/' + nickname, 'to': toRecipients, 'cc': toCC, 'sensitive': sensitive, @@ -1149,7 +1155,7 @@ def _createPostBase(baseDir: str, nickname: str, domain: str, port: int, } if attachImageFilename: newPost = \ - attachMedia(baseDir, httpPrefix, domain, port, + attachMedia(baseDir, httpPrefix, nickname, domain, port, newPost, attachImageFilename, mediaType, imageDescription) _appendEventFields(newPost, eventUUID, eventStatus, diff --git a/shares.py b/shares.py index ecf59dfc1..970d19f89 100644 --- a/shares.py +++ b/shares.py @@ -18,7 +18,7 @@ from utils import validNickname from utils import loadJson from utils import saveJson from utils import getImageExtensions -from media import removeMetaData +from media import processMetaData def getValidSharedItemID(displayName: str) -> str: @@ -129,7 +129,8 @@ def addShare(baseDir: str, formats = getImageExtensions() for ext in formats: if imageFilename.endswith('.' + ext): - removeMetaData(imageFilename, itemIDfile + '.' + ext) + processMetaData(baseDir, nickname, domain, + imageFilename, itemIDfile + '.' + ext) if moveImage: os.remove(imageFilename) imageUrl = \ From e87353f378c91d8096a2e7fe4abb63b16756251b Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 9 May 2021 15:05:52 +0100 Subject: [PATCH 0912/1416] Spoof the time on images --- media.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/media.py b/media.py index f97b97f3f..0a3627e61 100644 --- a/media.py +++ b/media.py @@ -69,6 +69,12 @@ def _spoofMetaData(imageFilename: str, outputFilename: str, print('Spoofing metadata in ' + outputFilename + ' using exiftool') os.system('exiftool -TagsFromFile ' + spoofFilename + ' ' + outputFilename) # nosec + currTimeAdjusted = \ + datetime.datetime.utcnow() - \ + datetime.timedelta(minutes=randint(2, 120)) + published = currTimeAdjusted.strftime("%Y:%m:%d %H:%M:%S+00:00") + os.system('exiftool -time:all="' + published + + '" ' + outputFilename) # nosec else: print('ERROR: exiftool is not installed') return From 53fb8b99235b4209947d8bbf5fcc5adc66289791 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 9 May 2021 15:10:34 +0100 Subject: [PATCH 0913/1416] Add artist name to image --- media.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/media.py b/media.py index 0a3627e61..8d550c13b 100644 --- a/media.py +++ b/media.py @@ -54,7 +54,8 @@ def _removeMetaData(imageFilename: str, outputFilename: str) -> None: os.system('/usr/bin/mogrify -strip ' + outputFilename) # nosec -def _spoofMetaData(imageFilename: str, outputFilename: str, +def _spoofMetaData(nickname: str, + imageFilename: str, outputFilename: str, spoofFilename: str) -> None: """Use reference images to spoof the metadata """ @@ -73,8 +74,9 @@ def _spoofMetaData(imageFilename: str, outputFilename: str, datetime.datetime.utcnow() - \ datetime.timedelta(minutes=randint(2, 120)) published = currTimeAdjusted.strftime("%Y:%m:%d %H:%M:%S+00:00") - os.system('exiftool -time:all="' + published + - '" ' + outputFilename) # nosec + os.system('exiftool -artist="' + nickname + '" ' + + '-time:all="' + published + '" ' + + outputFilename) # nosec else: print('ERROR: exiftool is not installed') return @@ -115,7 +117,8 @@ def processMetaData(baseDir: str, nickname: str, domain: str, # choose a reference at random index = randint(0, len(spoofList)) spoofFilename = spoofList[index] - _spoofMetaData(imageFilename, outputFilename, + _spoofMetaData(nickname, + imageFilename, outputFilename, spoofFilename) return # if we can't spoof then just remove metadata From 05f1ada1c19fac6ba01cd11258430259bd090008 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 9 May 2021 20:11:05 +0100 Subject: [PATCH 0914/1416] Spoof gps metadata on images --- daemon.py | 37 +- desktop_client.py | 9 +- epicyon.py | 43 +- inbox.py | 3 +- locations.txt | 4188 +++++++++++++++++++++++++++++++++++++++++++++ media.py | 132 +- newsdaemon.py | 10 +- outbox.py | 5 +- person.py | 6 +- posts.py | 59 +- schedule.py | 3 +- shares.py | 11 +- tests.py | 88 +- 13 files changed, 4456 insertions(+), 138 deletions(-) create mode 100644 locations.txt diff --git a/daemon.py b/daemon.py index 6f4e3efd3..9541bb1cc 100644 --- a/daemon.py +++ b/daemon.py @@ -428,7 +428,7 @@ class PubServer(BaseHTTPRequestHandler): answer, False, False, False, commentsEnabled, attachImageFilename, mediaType, - imageDescription, + imageDescription, self.server.city, inReplyTo, inReplyToAtomUri, subject, @@ -1170,7 +1170,8 @@ class PubServer(BaseHTTPRequestHandler): self.server.debug, self.server.YTReplacementDomain, self.server.showPublishedDateOnly, - self.server.allowLocalNetworkAccess) + self.server.allowLocalNetworkAccess, + self.server.city) def _postToOutboxThread(self, messageJson: {}) -> bool: """Creates a thread to send a post @@ -4075,8 +4076,8 @@ class PubServer(BaseHTTPRequestHandler): os.remove(postImageFilename + '.etag') except BaseException: pass - processMetaData(baseDir, nickname, domain, - filename, postImageFilename) + processMetaData(baseDir, nickname, + filename, postImageFilename, self.server.city) if os.path.isfile(postImageFilename): print('profile update POST ' + mType + ' image or font saved to ' + postImageFilename) @@ -13055,8 +13056,8 @@ class PubServer(BaseHTTPRequestHandler): postImageFilename = filename.replace('.temp', '') print('Removing metadata from ' + postImageFilename) processMetaData(self.server.baseDir, - nickname, self.server.domain, - filename, postImageFilename) + nickname, filename, postImageFilename, + self.server.city) if os.path.isfile(postImageFilename): print('POST media saved to ' + postImageFilename) else: @@ -13171,6 +13172,7 @@ class PubServer(BaseHTTPRequestHandler): False, False, False, commentsEnabled, filename, attachmentMediaType, fields['imageDescription'], + self.server.city, fields['replyTo'], fields['replyTo'], fields['subject'], fields['schedulePost'], fields['eventDate'], fields['eventTime'], @@ -13316,7 +13318,8 @@ class PubServer(BaseHTTPRequestHandler): postJsonObject['object'], filename, attachmentMediaType, - imgDescription) + imgDescription, + self.server.city) replaceYouTube(postJsonObject, self.server.YTReplacementDomain) @@ -13347,6 +13350,7 @@ class PubServer(BaseHTTPRequestHandler): False, False, False, commentsEnabled, filename, attachmentMediaType, fields['imageDescription'], + self.server.city, fields['replyTo'], fields['replyTo'], fields['subject'], @@ -13379,6 +13383,7 @@ class PubServer(BaseHTTPRequestHandler): commentsEnabled, filename, attachmentMediaType, fields['imageDescription'], + self.server.city, fields['replyTo'], fields['replyTo'], fields['subject'], @@ -13431,6 +13436,7 @@ class PubServer(BaseHTTPRequestHandler): False, False, commentsEnabled, filename, attachmentMediaType, fields['imageDescription'], + self.server.city, fields['subject'], fields['schedulePost'], fields['eventDate'], @@ -13468,6 +13474,7 @@ class PubServer(BaseHTTPRequestHandler): commentsEnabled, filename, attachmentMediaType, fields['imageDescription'], + self.server.city, fields['replyTo'], fields['replyTo'], fields['subject'], @@ -13506,6 +13513,7 @@ class PubServer(BaseHTTPRequestHandler): True, False, False, False, filename, attachmentMediaType, fields['imageDescription'], + self.server.city, None, None, fields['subject'], True, fields['schedulePost'], @@ -13538,6 +13546,7 @@ class PubServer(BaseHTTPRequestHandler): True, False, False, True, filename, attachmentMediaType, fields['imageDescription'], + self.server.city, self.server.debug, fields['subject']) if messageJson: if self._postToOutbox(messageJson, __version__, nickname): @@ -13568,6 +13577,7 @@ class PubServer(BaseHTTPRequestHandler): commentsEnabled, filename, attachmentMediaType, fields['imageDescription'], + self.server.city, fields['subject'], int(fields['duration'])) if messageJson: @@ -13603,7 +13613,8 @@ class PubServer(BaseHTTPRequestHandler): fields['category'], fields['location'], durationStr, - self.server.debug) + self.server.debug, + self.server.city) if filename: if os.path.isfile(filename): os.remove(filename) @@ -14665,7 +14676,8 @@ def loadTokens(baseDir: str, tokensDict: {}, tokensLookup: {}) -> None: break -def runDaemon(showNodeInfoAccounts: bool, +def runDaemon(city: str, + showNodeInfoAccounts: bool, showNodeInfoVersion: bool, brochMode: bool, verifyAllSignatures: bool, @@ -14823,6 +14835,13 @@ def runDaemon(showNodeInfoAccounts: bool, print('ERROR: no translations were loaded') sys.exit() + # spoofed city for gps location misdirection + httpd.city = city + cityFilename = baseDir + '/accounts/city.txt' + if os.path.isfile(cityFilename): + with open(cityFilename, 'r') as fp: + httpd.city = fp.read().replace('\n', '') + # For moderated newswire feeds this is the amount of time allowed # for voting after the post arrives httpd.votingTimeMins = votingTimeMins diff --git a/desktop_client.py b/desktop_client.py index 6c19a422d..088120efa 100644 --- a/desktop_client.py +++ b/desktop_client.py @@ -458,6 +458,7 @@ def _desktopReplyToPost(session, postId: str, isArticle = False subject = None commentsEnabled = True + city = 'London' sayStr = 'Sending reply' _sayCommand(sayStr, sayStr, screenreader, systemLanguage, espeak) if sendPostViaServer(__version__, @@ -466,7 +467,7 @@ def _desktopReplyToPost(session, postId: str, toNickname, toDomain, toPort, ccUrl, httpPrefix, replyMessage, followersOnly, commentsEnabled, attach, mediaType, - attachedImageDescription, + attachedImageDescription, city, cachedWebfingers, personCache, isArticle, debug, postId, postId, subject) == 0: sayStr = 'Reply sent' @@ -514,6 +515,7 @@ def _desktopNewPost(session, attach = None mediaType = None attachedImageDescription = None + city = 'London' isArticle = False subject = None commentsEnabled = True @@ -526,7 +528,7 @@ def _desktopNewPost(session, None, '#Public', port, ccUrl, httpPrefix, newMessage, followersOnly, commentsEnabled, attach, mediaType, - attachedImageDescription, + attachedImageDescription, city, cachedWebfingers, personCache, isArticle, debug, None, None, subject) == 0: sayStr = 'Post sent' @@ -1158,6 +1160,7 @@ def _desktopNewDMbase(session, toHandle: str, attach = None mediaType = None attachedImageDescription = None + city = 'London' isArticle = False subject = None commentsEnabled = True @@ -1206,7 +1209,7 @@ def _desktopNewDMbase(session, toHandle: str, toNickname, toDomain, toPort, ccUrl, httpPrefix, newMessage, followersOnly, commentsEnabled, attach, mediaType, - attachedImageDescription, + attachedImageDescription, city, cachedWebfingers, personCache, isArticle, debug, None, None, subject) == 0: sayStr = 'Direct message sent' diff --git a/epicyon.py b/epicyon.py index 2384a9421..63907e75c 100644 --- a/epicyon.py +++ b/epicyon.py @@ -464,6 +464,9 @@ parser.add_argument('--attach', dest='attach', type=str, default=None, help='File to attach to a post') parser.add_argument('--imagedescription', dest='imageDescription', type=str, default=None, help='Description of an attached image') +parser.add_argument('--city', dest='city', type=str, + default='London', + help='Spoofed city for image metadata misdirection') parser.add_argument('--warning', '--warn', '--cwsubject', '--subject', dest='subject', type=str, default=None, help='Subject of content warning') @@ -1110,6 +1113,7 @@ if args.message: followersOnly = args.followersonly clientToServer = args.client attachedImageDescription = args.imageDescription + city = 'London' sendThreads = [] postLog = [] personCache = {} @@ -1130,7 +1134,7 @@ if args.message: toNickname, toDomain, toPort, ccUrl, httpPrefix, sendMessage, followersOnly, args.commentsEnabled, attach, mediaType, - attachedImageDescription, + attachedImageDescription, city, cachedWebfingers, personCache, isArticle, args.debug, replyTo, replyTo, subject) for i in range(10): @@ -1959,8 +1963,9 @@ if args.avatar: if not args.nickname: print('Specify a nickname with --nickname [name]') sys.exit() + city = 'London' if setProfileImage(baseDir, httpPrefix, args.nickname, domain, - port, args.avatar, 'avatar', '128x128'): + port, args.avatar, 'avatar', '128x128', city): print('Avatar added for ' + args.nickname) else: print('Avatar was not added for ' + args.nickname) @@ -1973,8 +1978,10 @@ if args.backgroundImage: if not args.nickname: print('Specify a nickname with --nickname [name]') sys.exit() + city = 'London' if setProfileImage(baseDir, httpPrefix, args.nickname, domain, - port, args.backgroundImage, 'background', '256x256'): + port, args.backgroundImage, 'background', + '256x256', city): print('Background image added for ' + args.nickname) else: print('Background image was not added for ' + args.nickname) @@ -2347,6 +2354,7 @@ if args.unfilterStr: sys.exit() if args.testdata: + city = 'London' nickname = 'testuser567' password = 'boringpassword' print('Generating some test data for user: ' + nickname) @@ -2394,7 +2402,7 @@ if args.testdata: "mechanical", "City", "2 months", - debug) + debug, city) addShare(baseDir, httpPrefix, nickname, domain, port, "witch hat", @@ -2404,7 +2412,7 @@ if args.testdata: "clothing", "City", "3 months", - debug) + debug, city) deleteAllPosts(baseDir, nickname, domain, 'inbox') deleteAllPosts(baseDir, nickname, domain, 'outbox') @@ -2416,6 +2424,7 @@ if args.testdata: testAttachImageFilename = None testMediaType = None testImageDescription = None + testCity = 'London' createPublicPost(baseDir, nickname, domain, port, httpPrefix, "like this is totally just a #test man", @@ -2424,7 +2433,7 @@ if args.testdata: testC2S, testCommentsEnabled, testAttachImageFilename, - testMediaType, testImageDescription) + testMediaType, testImageDescription, testCity) createPublicPost(baseDir, nickname, domain, port, httpPrefix, "Zoiks!!!", testFollowersOnly, @@ -2432,7 +2441,7 @@ if args.testdata: testC2S, testCommentsEnabled, testAttachImageFilename, - testMediaType, testImageDescription) + testMediaType, testImageDescription, testCity) createPublicPost(baseDir, nickname, domain, port, httpPrefix, "Hey scoob we need like a hundred more #milkshakes", testFollowersOnly, @@ -2440,7 +2449,7 @@ if args.testdata: testC2S, testCommentsEnabled, testAttachImageFilename, - testMediaType, testImageDescription) + testMediaType, testImageDescription, testCity) createPublicPost(baseDir, nickname, domain, port, httpPrefix, "Getting kinda spooky around here", testFollowersOnly, @@ -2448,7 +2457,7 @@ if args.testdata: testC2S, testCommentsEnabled, testAttachImageFilename, - testMediaType, testImageDescription, + testMediaType, testImageDescription, testCity, 'someone') createPublicPost(baseDir, nickname, domain, port, httpPrefix, "And they would have gotten away with it too" + @@ -2458,7 +2467,7 @@ if args.testdata: testC2S, testCommentsEnabled, 'img/logo.png', 'image/png', - 'Description of image') + 'Description of image', testCity) createPublicPost(baseDir, nickname, domain, port, httpPrefix, "man these centralized sites are like the worst!", testFollowersOnly, @@ -2466,7 +2475,7 @@ if args.testdata: testC2S, testCommentsEnabled, testAttachImageFilename, - testMediaType, testImageDescription) + testMediaType, testImageDescription, testCity) createPublicPost(baseDir, nickname, domain, port, httpPrefix, "another mystery solved #test", testFollowersOnly, @@ -2474,7 +2483,7 @@ if args.testdata: testC2S, testCommentsEnabled, testAttachImageFilename, - testMediaType, testImageDescription) + testMediaType, testImageDescription, testCity) createPublicPost(baseDir, nickname, domain, port, httpPrefix, "let's go bowling", testFollowersOnly, @@ -2482,7 +2491,7 @@ if args.testdata: testC2S, testCommentsEnabled, testAttachImageFilename, - testMediaType, testImageDescription) + testMediaType, testImageDescription, testCity) domainFull = domain + ':' + str(port) clearFollows(baseDir, nickname, domain) @@ -2620,6 +2629,11 @@ showNodeInfoVersion = \ if showNodeInfoVersion is not None: args.showNodeInfoVersion = bool(showNodeInfoVersion) +city = \ + getConfigParam(baseDir, 'city') +if city is not None: + args.city = city + YTDomain = getConfigParam(baseDir, 'youtubedomain') if YTDomain: if '://' in YTDomain: @@ -2634,7 +2648,8 @@ if setTheme(baseDir, themeName, domain, print('Theme set to ' + themeName) if __name__ == "__main__": - runDaemon(args.showNodeInfoAccounts, + runDaemon(args.city, + args.showNodeInfoAccounts, args.showNodeInfoVersion, args.brochMode, args.verifyAllSignatures, diff --git a/inbox.py b/inbox.py index b35498529..1a6ecc235 100644 --- a/inbox.py +++ b/inbox.py @@ -2183,6 +2183,7 @@ def _bounceDM(senderPostId: str, session, httpPrefix: str, attachImageFilename = None mediaType = None imageDescription = '' + city = 'London' inReplyTo = removeIdEnding(senderPostId) inReplyToAtomUri = None schedulePost = False @@ -2195,7 +2196,7 @@ def _bounceDM(senderPostId: str, session, httpPrefix: str, saveToFile, clientToServer, commentsEnabled, attachImageFilename, mediaType, - imageDescription, + imageDescription, city, inReplyTo, inReplyToAtomUri, subject, debug, schedulePost, eventDate, eventTime, location) diff --git a/locations.txt b/locations.txt new file mode 100644 index 000000000..90d645cbf --- /dev/null +++ b/locations.txt @@ -0,0 +1,4188 @@ +GOROKA, PAPUA NEW GUINEA:-6.08167:145.392 +MADANG, PAPUA NEW GUINEA:-5.20694:145.789 +MOUNT HAGEN, PAPUA NEW GUINEA:-5.82611:144.296 +NADZAB, PAPUA NEW GUINEA:-6.56972:146.726 +PORT MORESBY, PAPUA NEW GUINEA:-9.44333:147.22 +WEWAK, PAPUA NEW GUINEA:-3.58361:143.669 +NARSSARSSUAQ, GREENLAND:61.1611:W45.4275 +NERLERIT INAAT, GREENLAND:70.7394:W22.6458 +GODTHAAB, GREENLAND:64.1908:W51.6781 +JAKOBSHAVN, GREENLAND:69.2333:W51.0667 +KULUSUK, GREENLAND:65.5833:W37.15 +SONDRESTROM, GREENLAND:67.0169:W50.6892 +THULE, GREENLAND:76.5311:W68.7031 +AKUREYRI, ICELAND:65.6597:W18.0725 +EGILSSTADIR, ICELAND:65.2833:W14.4014 +HOFN, ICELAND:64.2956:W15.2272 +HUSAVIK, ICELAND:65.9522:W17.4258 +ISAFJORDUR, ICELAND:66.0581:W23.1353 +KEFLAVIK, ICELAND:63.985:W22.6056 +KOPASKER, ICELAND:66.3136:W16.4611 +PATREKSFJORDUR, ICELAND:65.5558:W23.965 +REYKJAVIK, ICELAND:64.13:W21.9406 +SIGLUFJORDUR, ICELAND:66.1333:W18.9167 +VESTMANNAEYJAR, ICELAND:63.4242:W20.2786 +SAULT SAINTE MARIE, CANADA:46.485:W84.5094 +WINNIPEG, CANADA:50.0564:W97.0325 +HALIFAX, CANADA:44.6397:W63.4994 +ST. ANTHONY, CANADA:51.3917:W56.0844 +TOFINO, CANADA:49.0822:W125.772 +PELLY BAY, CANADA:68.5344:W89.8081 +BAIE COMEAU, CANADA:49.1322:W68.2072 +BAGOTVILLE, CANADA:48.3306:W70.9964 +BAKER LAKE, CANADA:64.2989:W96.0778 +CAMPBELL RIVER, CANADA:49.9508:W125.271 +BRANDON, CANADA:49.91:W99.9519 +CAMBRIDGE BAY, CANADA:69.1081:W105.138 +NANAIMO, CANADA:49.0522:W123.87 +CASTLEGAR, CANADA:49.2964:W117.632 +CHATHAM, CANADA:47.0078:W65.4492 +CHARLO, CANADA:47.9906:W66.3314 +COPPERMINE, CANADA:67.8167:W115.144 +CORONATION, CANADA:52.075:W111.445 +CHILLIWACK, CANADA:49.1528:W121.939 +CLYDE RIVER, CANADA:70.4861:W68.5167 +CORAL HARBOUR, CANADA:50.3319:W115.874 +DAWSON, CANADA:64.0431:W139.128 +BURWASH, CANADA:61.3711:W139.041 +PRINCETON, CANADA:49.4675:W120.512 +DEER LAKE, CANADA:49.2108:W57.3914 +DEASE LAKE, CANADA:58.4222:W130.032 +DAUPHIN, CANADA:51.1008:W100.052 +DAWSON CREEK, CANADA:55.7417:W120.182 +EDMONTON, CANADA:53.6667:W113.467 +EDMONTON, CANADA:53.3097:W113.58 +ESKIMO POINT, CANADA:61.0942:W94.0708 +ESTEVAN, CANADA:49.2103:W102.966 +EDSON, CANADA:53.5789:W116.465 +EUREKA, CANADA:79.9947:W85.8133 +INUVIK, CANADA:68.3042:W133.483 +IQALUIT, CANADA:63.7564:W68.5558 +FREDERICTON, CANADA:45.8694:W66.5317 +FORESTVILLE, CANADA:48.7461:W69.0972 +FLIN FLON, CANADA:54.6781:W101.682 +FORT RESOLUTION, CANADA:61.1808:W113.69 +FORT SIMPSON, CANADA:61.7603:W121.237 +KINGSTON, CANADA:44.2253:W76.5969 +LA GRANDE RIVIERE, CANADA:53.6253:W77.7042 +GASPE, CANADA:48.7753:W64.4786 +GERALDTON, CANADA:49.7783:W86.9394 +ILES DE LA MADELEINE, CANADA:47.4247:W61.7781 +KUUJJUARARAPIK, CANADA:55.2833:W77.7667 +GILLAM, CANADA:56.35:W94.7 +HUDSON BAY, CANADA:52.8167:W102.311 +DRYDEN, CANADA:49.8317:W92.7442 +HOLMAN ISLAND, CANADA:70.7631:W117.806 +GJOA HAVEN, CANADA:68.6356:W95.8497 +HAMILTON, CANADA:43.1731:W79.935 +MONTREAL, CANADA:45.5175:W73.4169 +HAY RIVER, CANADA:60.8397:W115.783 +HALIFAX, CANADA:44.8808:W63.5086 +ATIKOKAN, CANADA:48.7739:W91.6386 +POND INLET, CANADA:72.6833:W77.9667 +ST. JEAN, CANADA:45.2944:W73.2811 +STEPHENVILLE, CANADA:48.5442:W58.55 +KAMLOOPS, CANADA:50.7022:W120.442 +WATERLOO, CANADA:43.4589:W80.3844 +SCHEFFERVILLE, CANADA:54.805:W66.8053 +KINDERSLEY, CANADA:51.5175:W109.181 +TORONTO, CANADA:43.8622:W79.37 +CHAPLEAU, CANADA:47.82:W83.3464 +MEADOW LAKE, CANADA:54.1253:W108.523 +LLOYDMINSTER, CANADA:53.3092:W110.072 +ALERT, CANADA:82.5178:W62.2806 +KELOWNA, CANADA:49.9561:W119.378 +MAYO, CANADA:63.6167:W135.867 +MOOSE JAW, CANADA:50.3303:W105.559 +FORT MCMURRAY, CANADA:56.6533:W111.222 +MOOSONEE, CANADA:51.2911:W80.6078 +MANIWAKI, CANADA:46.2744:W75.99 +MONTREAL, CANADA:45.6797:W74.0386 +NATASHQUAN, CANADA:50.1897:W61.7892 +GATINEAU, CANADA:45.5214:W75.5642 +MATAGAMI, CANADA:49.7617:W77.8028 +OLD CROW, CANADA:67.5706:W139.839 +COLD LAKE, CANADA:54.405:W110.279 +HIGH LEVEL, CANADA:58.6214:W117.165 +OTTAWA, CANADA:45.3225:W75.6692 +PRINCE ALBERT, CANADA:53.2142:W105.673 +PEACE RIVER, CANADA:56.2269:W117.447 +PORTAGE-LA-PRAIRIE, CANADA:49.9028:W98.2747 +PITT MEADOWS, CANADA:49.2161:W122.71 +PICKLE LAKE, CANADA:51.4464:W90.2142 +PORT MENIER, CANADA:49.8364:W64.2886 +PETERBOROUGH, CANADA:44.23:W78.3633 +PRINCE PUPERT, CANADA:54.2861:W130.445 +FORT CHIPEWYAN, CANADA:58.7672:W111.117 +MUSKOKA, CANADA:44.9747:W79.3033 +QUEBEC, CANADA:46.7883:W71.3975 +RED DEER INDUSTRIAL, CANADA:52.1786:W113.893 +WINDSOR, CANADA:42.2756:W82.9556 +WATSON LAKE, CANADA:60.1178:W128.822 +KENORA, CANADA:49.7883:W94.3631 +LETHBRIDGE, CANADA:49.6303:W112.8 +MONCTON, CANADA:46.1122:W64.6786 +NAKINA, CANADA:50.1828:W86.6964 +COMOX, CANADA:49.7108:W124.887 +REGINA, CANADA:50.4319:W104.666 +THUNDER BAY, CANADA:48.3719:W89.3239 +GRANDE PRAIRIE, CANADA:55.1797:W118.885 +YORKTON, CANADA:51.2647:W102.462 +NORTH BATTLEFORD, CANADA:52.7692:W108.244 +GANDER, CANADA:48.9369:W54.5681 +SYDNEY, CANADA:46.1614:W60.0478 +QUESNEL, CANADA:53.0261:W122.51 +RESOLUTE, CANADA:74.7169:W94.9694 +RIVIERE DU LOUP, CANADA:47.7644:W69.5847 +ROBERVAL, CANADA:48.52:W72.2656 +ROCKY MOUNTAIN HOUSE, CANADA:52.4297:W114.904 +RANKIN INLET, CANADA:62.8114:W92.1158 +SUDBURY, CANADA:46.625:W80.7989 +SHERBROOKE, CANADA:45.4381:W71.6906 +ST. JOHN, CANADA:45.3161:W65.8903 +FORT SMITH, CANADA:60.0222:W111.96 +NANISIVIK, CANADA:72.9822:W84.6136 +SUMMERSIDE, CANADA:46.4428:W63.8311 +SACHS HARBOUR, CANADA:71.9939:W125.243 +CAPE DORSET, CANADA:64.23:W76.5267 +THOMPSON, CANADA:55.8011:W97.8642 +TRENTON, CANADA:44.1189:W77.5281 +TIMMINS, CANADA:48.5697:W81.3767 +TORONTO, CANADA:43.6275:W79.3961 +TUKTOYAKTUK, CANADA:69.4333:W133.026 +MONTREAL, CANADA:45.4681:W73.7414 +REPULSE BAY, CANADA:66.5214:W86.2247 +HALL BEACH, CANADA:68.7761:W81.2436 +ROUYN, CANADA:48.2061:W78.8356 +LA RONGE, CANADA:55.1514:W105.262 +VERMILLION, CANADA:53.3558:W110.824 +BROUGHTON ISLAND, CANADA:67.5458:W64.0314 +VAL D'OR, CANADA:48.0533:W77.7828 +QUUJJUAQ, CANADA:58.0961:W68.4269 +NORMAN WELLS, CANADA:65.2825:W126.8 +VANCOUVER, CANADA:49.195:W123.182 +BUFFALO NARROWS, CANADA:55.8419:W108.418 +WIARTON, CANADA:44.7458:W81.1072 +PETAWAWA, CANADA:45.9522:W77.3192 +WINNIPEG, CANADA:49.91:W97.2344 +WABUSH, CANADA:52.9219:W66.8644 +WILLIAMS LAKE, CANADA:52.1831:W122.054 +WRIGLEY, CANADA:63.2094:W123.437 +CRANBROOK, CANADA:49.6103:W115.782 +EDMONTON, CANADA:53.5725:W113.521 +SASKATOON, CANADA:52.1708:W106.7 +MEDICINE HAT, CANADA:50.0189:W110.721 +FORT SAINT JOHN, CANADA:56.2381:W120.74 +SIOUX LOOKOUT, CANADA:50.1144:W91.9042 +PANGNIRTUNG, CANADA:66.145:W65.7136 +EARLTON, CANADA:47.695:W79.8489 +PRINCE GEORGE, CANADA:53.8894:W122.679 +TERRACE, CANADA:54.4664:W128.577 +LONDON, CANADA:43.0356:W81.1539 +ABBOTSFORD, CANADA:49.0253:W122.363 +WHITEHORSE, CANADA:60.7094:W135.068 +NORTH BAY, CANADA:46.3636:W79.4228 +CALGARY, CANADA:51.1139:W114.02 +SMITHERS, CANADA:54.8247:W127.183 +FORT NELSON, CANADA:58.8364:W122.597 +PENTICTON, CANADA:49.4628:W119.602 +CHARLOTTETOWN, CANADA:46.29:W63.1211 +SPENCE BAY, CANADA:69.5467:W93.5767 +VICTORIA, CANADA:48.6469:W123.426 +LYNN LAKE, CANADA:56.8639:W101.076 +SWIFT CURRENT, CANADA:50.2919:W107.691 +CHURCHILL, CANADA:58.7392:W94.065 +GOOSE BAY, CANADA:53.3192:W60.4258 +ST. JOHN'S, CANADA:47.6186:W52.7519 +KAPUSKASING, CANADA:49.4139:W82.4675 +ARMSTRONG, CANADA:50.2903:W88.9097 +MONT JOLI, CANADA:48.6086:W68.2081 +TORONTO, CANADA:43.6772:W79.6306 +TORONTO, CANADA:43.7425:W79.4656 +GORE BAY, CANADA:45.8853:W82.5678 +YELLOWKNIFE, CANADA:62.4628:W114.44 +SLAVE LAKE, CANADA:55.2933:W114.778 +SANDSPIT, CANADA:53.2542:W131.814 +SARNIA, CANADA:42.9994:W82.3089 +PORT HARDY, CANADA:50.6806:W127.367 +WHITECOURT, CANADA:54.1439:W115.787 +SEPT-ILES, CANADA:50.2233:W66.2656 +TESLIN, CANADA:60.1728:W132.743 +GREENWOOD, CANADA:44.9844:W64.9169 +FARO, CANADA:62.2075:W133.376 +FORT MCPHERSON, CANADA:67.4078:W134.86 +BLIDA, ALGERIA:36.5036:2.81417 +BOU SAADA, ALGERIA:35.3325:4.20639 +BEJAJA, ALGERIA:36.7119:5.06972 +ALGIER, ALGERIA:36.6908:3.21528 +DJANET, ALGERIA:24.2925:9.45222 +BOUFARIK, ALGERIA:36.5458:2.87611 +TELERGMA, ALGERIA:36.1086:6.36444 +REGGAN, ALGERIA:26.71:0.285556 +ILLIZI, ALGERIA:26.5733:8.48361 +AIN OUSSERA, ALGERIA:35.5253:2.87861 +SETIF, ALGERIA:36.1781:5.32444 +TAMANRASSET, ALGERIA:22.8108:5.45083 +JIJEL, ALGERIA:36.795:5.87333 +MECHERIA, ALGERIA:33.5358:W0.242222 +RELIZANE, ALGERIA:35.7522:0.626111 +ANNABA, ALGERIA:36.8222:7.80917 +CONSTANTINE, ALGERIA:36.2767:6.62389 +TEBESSA, ALGERIA:35.4314:8.12056 +TILREMPT, ALGERIA:32.9297:3.31222 +TIARET, ALGERIA:35.3411:1.46306 +BOU SFER, ALGERIA:35.7353:W0.805278 +TINDOUF, ALGERIA:27.7003:W8.16694 +ECH-CHELIFF, ALGERIA:36.2125:1.33167 +ORAN, ALGERIA:35.5422:W0.532222 +TLEMCEN, ALGERIA:35.0167:W1.45 +ORAN, ALGERIA:35.6236:W0.621111 +SIDI BEL ABBES, ALGERIA:35.1717:W0.593056 +GHRISS, ALGERIA:35.2075:0.146944 +ADRAR, ALGERIA:27.8375:W0.186389 +BISKRA, ALGERIA:34.7931:5.73806 +EL GOLEA, ALGERIA:30.5711:2.85944 +GHARDAIA, ALGERIA:32.3839:3.79389 +HASSI-MESSAOUD, ALGERIA:31.6728:6.14028 +IN SALAH, ALGERIA:27.2508:2.51194 +TOUGGOURT, ALGERIA:33.0678:6.08861 +LAGHOUAT, ALGERIA:33.7639:2.92722 +TIMIMOUN, ALGERIA:29.2369:0.275833 +OUARGLA, ALGERIA:31.9172:5.41278 +ZARZAITINE, ALGERIA:28.0514:9.64278 +COTONOU, BENIN:6.35722:2.38417 +PARAKOU, BENIN:9.35694:2.60889 +OUAGADOUGOU, BURKINA FASO:12.3531:W1.51222 +BOBO-DIOULASSO, BURKINA FASO:11.16:W4.33083 +ACCRA, GHANA:5.60278:W0.168056 +TAMALE, GHANA:9.56333:W0.863333 +WA, GHANA:10.0825:W2.5075 +SUNYANI, GHANA:7.36167:W2.32861 +TAKORADI, GHANA:4.89333:W1.775 +ABIDJAN, IVORY COAST:5.25972:W3.92639 +BOUAKE, IVORY COAST:7.73861:W5.07361 +DALOA, IVORY COAST:6.7925:W6.47306 +KORHOGO, IVORY COAST:9.38694:W5.55639 +MAN, IVORY COAST:7.27194:W7.58694 +SAN PEDRO, IVORY COAST:4.74667:W6.66056 +YAMOUSSOUKRO, IVORY COAST:6.90306:W5.36583 +ABUJA, NIGERIA:9.00667:7.26306 +AKURE, NIGERIA:7.24667:5.30083 +BENIN, NIGERIA:6.31722:5.59944 +CALABAR, NIGERIA:4.97583:8.34694 +ENUGU, NIGERIA:6.47417:7.56194 +GUSAU, NIGERIA:12.1717:6.69611 +IBADAN, NIGERIA:7.36222:3.97833 +ILORIN, NIGERIA:8.44:4.49389 +JOS, NIGERIA:9.63972:8.86889 +KADUNA, NIGERIA:10.6958:7.32 +KANO, NIGERIA:12.0475:8.52444 +MAIDUGURI, NIGERIA:11.8553:13.0808 +MAKURDI, NIGERIA:7.70361:8.61389 +LAGOS, NIGERIA:6.57722:3.32111 +MINNA, NIGERIA:9.65194:6.46222 +PORT HARTCOURT, NIGERIA:5.01528:6.94944 +SOKOTO, NIGERIA:12.9161:5.20694 +YOLA, NIGERIA:9.26028:12.4297 +ZARIA, NIGERIA:11.13:7.68556 +MARADI, NIGER:13.5025:7.12667 +NIAMEY, NIGER:13.4814:2.18361 +TAHOUA, NIGER:14.8756:5.26528 +AGADEZ, NIGER:16.9647:7.99694 +DIRKOU, NIGER:18.9686:12.8686 +DIFFA, NIGER:13.3728:12.6267 +ZINDER, NIGER:13.7789:8.98361 +TANOUT, NIGER:14.9994:8.76694 +MONASTIR, TUNISIA:35.7581:10.7547 +TUNIS, TUNISIA:36.8508:10.2269 +BIZERTE, TUNISIA:37.2453:9.79139 +REMADA, TUNISIA:32.3061:10.3819 +GAFSA, TUNISIA:34.4219:8.8225 +GABES, TUNISIA:33.8767:10.1033 +BORDJ EL AMRI, TUNISIA:36.7211:9.94306 +DJERBA, TUNISIA:33.875:10.7753 +EL BORMA, TUNISIA:31.7042:9.25444 +SFAX, TUNISIA:34.7178:10.6908 +TOZEUR, TUNISIA:33.9397:8.11056 +NIATOUGOU, TOGO:9.76722:1.09111 +LOME, TOGO:6.16556:1.25389 +ANTWERP, BELGIUM:51.19:4.46278 +BEAUVECHAIN, BELGIUM:50.7586:4.76833 +KLEINE BROGEL, BELGIUM:51.1678:5.47083 +BRUSSELS, BELGIUM:50.9022:4.49861 +BRASSCHAAT, BELGIUM:51.3333:4.5 +BERTRIX, BELGIUM:49.8872:5.22861 +CHARLEROI, BELGIUM:50.4592:4.45361 +CHIEVRES, BELGIUM:50.5758:3.83083 +KOKSIJDE, BELGIUM:51.09:2.65278 +FLORENNES, BELGIUM:50.2436:4.64861 +KORTRIJK-VEVELGEM, BELGIUM:50.8178:3.20833 +LIEGE, BELGIUM:50.6372:5.44306 +OSTEND, BELGIUM:51.1989:2.86222 +ZUTENDAAL, BELGIUM:50.9483:5.59167 +SINT-TRUIDEN, BELGIUM:50.7883:5.19278 +URSEL, BELGIUM:51.1439:3.47417 +WEELDE, BELGIUM:51.395:4.96056 +ZOERSEL, BELGIUM:51.2656:4.75472 +BAUTZEN, GERMANY:51.1933:14.5197 +ALTENBURG, GERMANY:50.9817:12.5061 +DESSAU, GERMANY:51.8319:12.1858 +EISENHUETTENSTADT, GERMANY:52.1972:14.5856 +HERINGSDORF, GERMANY:53.8786:14.1522 +SUHL, GERMANY:51.3081:13.5547 +MUEHLHAUSEN, GERMANY:51.3628:11.9408 +HALLE, GERMANY:51.5519:12.0525 +RIESA, GERMANY:51.2944:13.3589 +RECHLIN-LAERZ, GERMANY:53.3064:12.7531 +STRAUSBERG, GERMANY:52.5797:13.9156 +SCHOENHAGEN, GERMANY:52.2033:13.1586 +COCHSTEDT, GERMANY:51.8558:11.4181 +GOTHA OST, GERMANY:35.4606:W77.9647 +BARTH, GERMANY:54.3381:12.71 +JENA, GERMANY:50.9172:11.7136 +KYRITZ, GERMANY:52.9186:12.4253 +MAGDEBURG, GERMANY:52.0736:11.6264 +NEUBRANDENBURG, GERMANY:51.3281:12.6567 +ROTHENBURG/OL, GERMANY:51.3644:14.9519 +ANKLAM, GERMANY:53.8325:13.6689 +COTTBUS, GERMANY:51.8894:14.5317 +KOETHEN, GERMANY:51.7211:11.9617 +KAMENZ, GERMANY:51.2961:14.1289 +BERLIN, GERMANY:52.38:13.5225 +DRESDEN, GERMANY:51.1325:13.7669 +ERFURT, GERMANY:50.98:10.9581 +FRANKFURT, GERMANY:50.0264:8.54306 +MUENSTER/OSNABRUECK, GERMANY:52.1344:7.68472 +HAMBURG, GERMANY:53.6303:9.98806 +BERLIN, GERMANY:52.4728:13.4039 +COLOGNE, GERMANY:50.8658:7.1425 +DUESSELDORF, GERMANY:51.2894:6.76667 +MUNICH, GERMANY:48.3536:11.7858 +NUERNBERG, GERMANY:49.4986:11.0781 +LEIPZIG, GERMANY:51.4239:12.2361 +SAARBRUECKEN, GERMANY:49.2144:7.10944 +STUTTGART, GERMANY:48.6897:9.22194 +BERLIN, GERMANY:52.5594:13.2875 +HANNOVER, GERMANY:52.4608:9.685 +BREMEN, GERMANY:53.0475:8.78667 +EGELSBACH, GERMANY:49.9608:8.64361 +HAHN, GERMANY:49.9497:7.26389 +MANNHEIM, GERMANY:49.4725:8.51361 +ALLENDORF, GERMANY:51.0353:8.67889 +WORMS, GERMANY:49.6064:8.36833 +MAINZ, GERMANY:49.9689:8.1475 +EISENACH, GERMANY:50.9928:10.4725 +SIEGERLAND, GERMANY:50.7075:8.08194 +HAMBURG, GERMANY:53.5353:9.83528 +KIEL, GERMANY:54.3794:10.145 +LUEBECK, GERMANY:53.8053:10.7192 +AACHEN, GERMANY:50.8228:6.18722 +DAHLEMER BINZ, GERMANY:50.4058:6.52806 +MEINERZHAGEN, GERMANY:51.0994:7.60194 +ARNSBERG, GERMANY:51.4833:7.89917 +KAMP, GERMANY:51.5303:6.53694 +ESSEN, GERMANY:51.4014:6.93583 +MOENCHENGLADBACH, GERMANY:51.2303:6.50444 +PADERBORN, GERMANY:51.6142:8.61611 +STADTLOHN, GERMANY:51.9958:6.84028 +DORTMUND, GERMANY:51.5181:7.61222 +AUGSBURG, GERMANY:48.425:10.9317 +BIBERACH, GERMANY:48.1108:9.76278 +EGGENFELDEN, GERMANY:48.3961:12.7236 +OBERPFAFFENHOFEN, GERMANY:48.0814:11.2833 +STRAUBING, GERMANY:48.9008:12.5181 +VILSHOFEN, GERMANY:48.6364:13.1953 +LEUTKIRCH, GERMANY:47.8589:10.0144 +FRIEDRICHSHAFEN, GERMANY:47.6711:9.51139 +PARCHIM, GERMANY:53.4269:11.7833 +STENDAL, GERMANY:52.6289:11.8197 +AALEN-HEIDENHEIM, GERMANY:48.7778:10.2644 +COBURG, GERMANY:50.2625:10.9958 +BAYREUTH, GERMANY:49.9842:11.6383 +BURG FEUERSTEIN, GERMANY:49.7942:11.1322 +HOF, GERMANY:50.2886:11.8547 +ROSENTHAL, GERMANY:49.8628:11.7878 +HASSFURT, GERMANY:50.0178:10.5294 +KOBLENZ, GERMANY:50.3247:7.53083 +TRIER, GERMANY:49.8633:6.78889 +SPEYER, GERMANY:49.3025:8.45111 +ZWEIBRUECKEN, GERMANY:49.2094:7.40056 +BADEN-BADEN, GERMANY:48.7911:8.18694 +DONAUESCHINGEN, GERMANY:47.9731:8.52222 +FREIBURG, GERMANY:48.0203:7.83361 +KARLSRUHE, GERMANY:48.9822:8.33333 +MENGEN, GERMANY:48.0536:9.37278 +SCHWAEBISCH HALL, GERMANY:49.1181:9.77722 +SOEST, GERMANY:51.6075:13.7378 +BRAUNSCHWEIG, GERMANY:52.3192:10.5561 +KASSEL, GERMANY:51.4083:9.3775 +HILDESHEIM, GERMANY:52.1775:9.94556 +BREMERHAVEN, GERMANY:53.5033:8.57333 +LEMWERDER, GERMANY:53.1431:8.62333 +EMDEN, GERMANY:53.3911:7.22722 +LEER, GERMANY:53.2719:7.44278 +WILHELMSHAVEN, GERMANY:53.5047:8.05333 +BORKUM, GERMANY:53.5953:6.70917 +NORDERNEY, GERMANY:53.7067:7.23 +FLENSBURG, GERMANY:54.7717:9.37806 +RENDSBURG, GERMANY:54.2208:9.60056 +WESTERLAND, GERMANY:54.9131:8.34028 +ARMARI AIR FORCE BASE, ESTONIA:59.2594:24.2044 +KARDLA, ESTONIA:58.9906:22.8306 +KURESSAARE, ESTONIA:58.2297:22.5094 +PARNU, ESTONIA:58.4189:24.4728 +TALLINN-ULEMISTE INTERNATIONAL, ESTONIA:59.4131:24.8328 +TARTU-ULENURME, ESTONIA:58.3072:26.6903 +ENONTEKIO, FINLAND:68.3625:23.4242 +EURA, FINLAND:61.1161:22.2014 +HALLI, FINLAND:61.8558:24.7864 +HELSINKI, FINLAND:60.2544:25.0428 +HELSINKI, FINLAND:60.32:24.9561 +HAMEENKYRO, FINLAND:61.6894:23.0736 +HANKO, FINLAND:59.8486:23.0833 +HYVINKAA, FINLAND:60.6544:24.8811 +KIKALA, FINLAND:60.4625:23.6525 +IMMOLA, FINLAND:61.2492:28.9036 +KITEE, FINLAND:62.1661:30.0736 +IVALO, FINLAND:68.6072:27.4053 +JOENSUU, FINLAND:62.6589:29.6244 +JYVASKYLA, FINLAND:62.3994:25.6781 +KAUHAVA, FINLAND:63.1269:23.0514 +KEMI, FINLAND:65.7817:24.5989 +KAJAANI, FINLAND:64.2853:27.6922 +KAUHAJOKI, FINLAND:62.4625:22.3931 +KRUUNUPYY, FINLAND:63.7211:23.1431 +KEMIJARVI, FINLAND:66.7128:27.1567 +KUUSAMO, FINLAND:65.9875:29.2392 +KITTILA, FINLAND:67.7008:24.8467 +KUOPIO, FINLAND:63.0069:27.7975 +VESIVEHMAA, FINLAND:61.1439:25.6933 +LAPPEENRANTA, FINLAND:61.0444:28.1442 +MARIEHAMN, FINLAND:60.1219:19.8981 +MENKIJARVI, FINLAND:62.9467:23.5189 +MIKKELI, FINLAND:61.6864:27.2017 +NUMMELA, FINLAND:60.3339:24.2964 +OULU, FINLAND:64.93:25.3544 +PIIKAJARVI, FINLAND:61.2456:22.1933 +PORI, FINLAND:61.4617:21.7997 +PUDASJARVI, FINLAND:65.4022:26.9469 +PYHASALMI, FINLAND:63.7317:25.9261 +PATTIJOKI, FINLAND:64.6881:24.6958 +RANTASALMI, FINLAND:62.0653:28.3564 +ROVANIEMI, FINLAND:66.5647:25.8303 +RAYSKALA, FINLAND:60.7447:24.1078 +SAVONLINNA, FINLAND:61.9431:28.945 +SELANPAA, FINLAND:61.0622:26.7986 +SODANKYLA, FINLAND:67.395:26.6189 +TAMPERE, FINLAND:61.4139:23.6042 +TEISKO, FINLAND:61.7733:24.0269 +TURKU, FINLAND:60.5139:22.2628 +UTTI, FINLAND:60.8964:26.9383 +VAASA, FINLAND:63.0511:21.7614 +VARKAUS, FINLAND:62.1711:27.8686 +YLIVIESKA-RAUDASKYLA, FINLAND:64.0603:24.7158 +BELFAST, NORTH IRELAND:54.6575:W6.21583 +ENNISKILLEN, ENGLAND:54.3989:W7.65167 +BELFAST, NORTH IRELAND:54.6181:W5.8725 +LONDONDERRY, NORTH IRELAND:55.0428:W7.16111 +BIRMINGHAM, ENGLAND:52.4536:W1.74778 +COVENTRY, ENGLAND:52.3697:W1.47972 +LEICESTER, ENGLAND:52.6078:W1.03194 +GOLOUCHESTERSHIRE, ENGLAND:51.8942:W2.16722 +NOTTINGHAM, ENGLAND:52.92:W1.07917 +HALFPENNY GREEN, ENGLAND:52.5175:W2.25972 +PAILTON, UK:51.6681:W2.05694 +TURWESTON, UK:52.0408:W1.09556 +MANCHESTER, ENGLAND:53.3536:W2.27472 +WOODFORT, ENGLAND:53.3381:W2.14889 +SANDTOFT, UK:53.5597:W0.858333 +CHIVENOR, ENGLAND:51.0869:W4.15028 +NEWQUAI, ENGLAND:50.4406:W4.99528 +LYNEHAM, UK:51.505:W1.99333 +BOSCOMBE DOWN, ENGLAND:51.1519:W1.74722 +CULDROSE, ENGLAND:50.0858:W5.25556 +ST. ATHAN, UK:51.4047:W3.43556 +YEOVILTON, UK:51.0092:W2.63861 +HAVERFORDWEST, ENGLAND:51.8331:W4.96111 +CARDIFF, WALES:51.3967:W3.34333 +SWANSEA, ENGLAND:51.6053:W4.06778 +BRISTOL, ENGLAND:51.3825:W2.71889 +LIVERPOOL, ENGLAND:53.3336:W2.84972 +LONDON, ENGLAND:51.8744:W0.368333 +PLYMOUTH, ENGLAND:50.4228:W4.10583 +BOURNEMOUTH, ENGLAND:50.78:W1.8425 +SOUTHAMPTON, ENGLAND:50.95:W1.35667 +LASHAM, ENGLAND:51.185:W1.03222 +GUERNSEY, GUERNSEY ISLD.:49.4347:W2.60194 +JERSEY, ENGLAND:49.2078:W2.19528 +SHOREHAM BY SEA, ENGLAND:50.8356:W0.297222 +BIGGIN HILL, ENGLAND:51.3308:0.0325 +LONDON, ENGLAND:51.1481:W0.190278 +LONDON, ENGLAND:51.505:0.0541667 +FARNBOROUGH, ENGLAND:51.2758:W0.776111 +CHALSGROVE, ENGLAND:51.6761:W1.08083 +BLACKBUSHE, ENGLAND:51.3239:W0.8475 +LONDON, ENGALND:51.4775:W0.461389 +SOUTHEND, ENGLAND:51.5714:0.695556 +LYDD, UK:50.9561:0.939167 +MANSTON, ENGLAND:51.3422:1.34611 +BROUGH, ENGLAND:53.7194:W0.566111 +CARLISLE, ENGLAND:54.9375:W2.80917 +BLACKPOOL, ENGLAND:53.7717:W3.02861 +HUMBERSIDE, ENGLAND:53.5744:W0.350833 +BARROW ISLAND, ENGLAND:54.1297:W3.25611 +LEEDS, ENGLAND:53.8658:W1.66056 +WARTON, UK:53.745:W2.88306 +HAWARDEN, ENGLAND:53.1781:W2.97778 +ISLE OF MAN, ENGLAND:54.0833:W4.62389 +NEWCASTLE, ENGLAND:55.0375:W1.69167 +TEESSIDE, ENGLAND:54.5092:W1.42917 +EAST MIDLANDS, ENGLAND:52.8311:W1.32806 +LLANBEDR, ENGLAND:52.8117:W4.12333 +TERNHILL, UK:52.8711:W2.53333 +MONA, UK:53.2583:W4.37333 +SHAWBURY, UK:52.7981:W2.66778 +VALLEY, UK:53.2481:W4.53528 +WOODVALE, UK:53.5814:W3.05528 +WEST FREUGH, UK:54.8511:W4.94778 +KIRKWALL, SCOTLAND:58.9581:W2.905 +SUMBURGH, UK:59.8789:W1.29556 +WICK, UK:58.4586:W3.09278 +ABERDEEN, UK:57.2042:W2.20028 +INVERNESS, UK:57.54:W4.05 +GLASGOW, UK:55.8719:W4.43306 +EDINBURGH, UK:55.95:W3.3725 +ISLAY, UK:55.6819:W6.25667 +PRESTWICK, UK:55.5078:W4.58667 +BENBECULA, UK:57.4811:W7.36278 +SCATSTA, UK:60.4322:W1.29806 +DUNDEE, UK:56.4525:W3.02583 +STORNOWAY, UK:58.2136:W6.32889 +TIREE, UK:56.4992:W6.86917 +LEUCHARS, UK:56.3728:W2.86833 +LOSSIEMOUTH, UK:57.705:W3.33917 +BRACKNELL, ENGLAND:51.3833:W0.783333 +CAMBRIDGE, ENGLAND:52.205:0.175 +PETERBOROUGH, ENGLAND:52.4681:W0.251111 +NORWICH, ENGLAND:52.6758:1.28278 +LONDON, ENGLAND:51.885:0.235 +NORTH WEALD, UK:51.7217:0.154167 +FOWLMERE, ENGLAND:53.3942:W1.38833 +CRANFIELD, ENGLAND:52.0722:W0.616667 +DUNSFOLD, ENGLAND:51.1167:W0.534444 +EXETER, ENGLAND:50.7344:W3.41389 +BRISTOL, ENGLAND:51.5194:W2.59083 +HATFIELD, ENGLAND:51.7667:0.25 +OXFORD, ENGLAND:51.8369:W1.32 +BENSON, ENGLAND:51.6161:W1.09556 +LAKENHEATH, ENGLAND:52.4092:0.560833 +MILDENHALL, ENGLAND:52.3608:0.488333 +WATTISHAM, UK:52.1272:0.955833 +WYTON, UK:52.3572:W0.107778 +FAIRFORD, ENGLAND:51.6819:W1.79 +BRIZE NORTON, ENGLAND:51.7497:W1.58361 +ODIHAM, UK:51.2342:W0.942778 +COSFORD, ENGLAND:52.64:W2.30556 +NORTHOLT, UK:51.5528:W0.418056 +CONINGSBY, ENGLAND:53.0928:W0.165833 +DISHFORTH, ENGLAND:54.1369:W1.42 +LEEMING, ENGLAND:54.2922:W1.535 +CHURCH FENTON, ENGLAND:53.8342:W1.19528 +HONINGTON, ENGLAND:52.3425:0.772778 +COTTESMORE, ENGLAND:52.7356:W0.648611 +SCAMPTON, UK:53.3075:W0.550833 +WITTERING, UK:52.6125:W0.476389 +LINTON-ON-OUSE, ENGLAND:54.0494:W1.25194 +WADDINGTON, UK:53.1661:W0.523611 +TOPCLIFFE, UK:54.2056:W1.38222 +COLTISHALL, ENGLAND:52.7547:1.35722 +CRANWELL, ENGLAND:53.0306:W0.481111 +BARKSTON HEATH, ENGLAND:52.9622:W0.561389 +MARHAM, UK:52.6483:0.550278 +MOUNT PLEASANT, FALKLAND ISLANDS:-51.8228:W58.4472 +AMSTERDAM, NETHERLANDS:52.3086:4.76389 +WEERT, NETHERLANDS:51.2553:5.60139 +MAASTRICHT, NETHERLANDS:50.9114:5.77 +DEELEN, NETHERLANDS:52.0606:5.87306 +DRACHTEN, NETHERLANDS:53.1192:6.12972 +EINDHOVEN, NETHERLANDS:51.45:5.37444 +GRONINGEN, NETHERLANDS:53.1194:6.57944 +GILZE-RIJEN, NETHERLANDS:51.5678:4.93306 +DE KOOY, NETHERLANDS:52.9233:4.78056 +LELYSTAD, NETHERLANDS:52.4603:5.52722 +LEEUWARDEN, NETHERLANDS:53.2286:5.76056 +ROTTERDAM, NETHERLANDS:51.9572:4.44167 +SOESTERBERG, NETHERLANDS:52.1269:5.27639 +ENSCHEDE, NETHERLANDS:52.27:6.87417 +VALKENBURG, NETHERLANDS:52.1697:4.42611 +WOENSDRECHT, NETHERLANDS:51.4489:4.34194 +CORK, IRELAND:51.8428:W8.49194 +GALWAY, IRELAND:53.3014:W8.93917 +DONEGAL, IRELAND:55.0442:W8.34083 +DUBLIN, IRELAND:53.4211:W6.27 +CONNAUGHT, IRELAND:53.9103:W8.81833 +KERRY, IRELAND:52.1808:W9.52361 +CASEMENT, IRELAND:53.3028:W6.44278 +SHANNON, IRELAND:52.7019:W8.92472 +SLIGO, IRELAND:54.28:W8.59917 +WATERFORD, IRELAND:52.1869:W7.08694 +AARHUS, DENMARK:56.3042:10.6194 +BILLUND, DENMARK:55.7403:9.15167 +COPENHAGEN, DENMARK:55.6178:12.6558 +ESBJERG, DENMARK:55.5258:8.55333 +GRONHOLT, DENMARK:55.9411:12.3822 +LINDTORP, DENMARK:56.3967:8.44333 +KARUP, DENMARK:56.2972:9.12444 +LAESO, DENMARK:57.2778:11.0014 +MARIBO, DENMARK:54.6992:11.44 +ODENSE, DENMARK:55.4761:10.3292 +KRUSA-PADBORG, DENMARK:54.8703:9.27917 +COPENHAGEN, DENMARK:55.5856:12.1314 +RONNE, DENMARK:55.0631:14.7594 +SOENDERBORG, DENMARK:54.9642:9.79167 +SINDAL, DENMARK:57.5033:10.2292 +SKRYDSTRUP, DENMARK:55.2253:9.26389 +SKIVE, DENMARK:56.55:9.17278 +THISTED, DENMARK:57.0686:8.705 +VANDEL, DENMARK:55.6969:9.19333 +KOLDING, DENMARK:55.4361:9.33083 +VAGAR, FAROE ISL.:62.0636:W7.27694 +VESTHIMMERLAND, DENMARK:56.8469:9.45861 +STAUNING, DENMARK:55.99:8.35389 +VAERLOSE, DENMARK:55.7672:12.3433 +AALBORG, DENMARK:57.0928:9.84889 +LUXEMBURG, LUXEMBURG:49.6264:6.21139 +ALESUND, NORWAY:62.5603:6.11 +ANDOYA, NORWAY:69.2925:16.1442 +ALTA, NORWAY:69.9769:23.3661 +FORDE, NORWAY:61.3925:5.76417 +BOMOEN, NORWAY:60.6386:6.50139 +BRONNOYSUND, NORWAY:65.4592:12.2136 +BODOE, NORWAY:67.2689:14.3633 +BERGEN, NORWAY:60.2933:5.21806 +BATSFJORD, NORWAY:70.6:29.6925 +KRISTIANSAND, NORWAY:58.2042:8.08528 +DAGLI, NORWAY:60.4167:8.51389 +BARDUFOSS, NORWAY:69.0556:18.5403 +EVENES, NORWAY:68.4911:16.6781 +OSLO, NORWAY:59.8956:10.6169 +FAGERNES, NORWAY:61.0111:9.29306 +FLORO, NORWAY:61.5839:5.025 +OSLO, NORWAY:60.1939:11.1003 +HAMAR, NORWAY:60.8183:11.0672 +HAUGESUND, NORWAY:59.345:5.20833 +HASVIK, NORWAY:70.4867:22.1397 +KRISTIANSUND, NORWAY:63.1117:7.82444 +KJELLER, NORWAY:59.9692:11.0358 +KIRKENES, NORWAY:69.725:29.8875 +LISTA, NORWAY:58.1003:6.625 +MOLDE, NORWAY:62.7461:7.2725 +MOSJOEN, NORWAY:65.7839:13.2147 +BANAK, NORWAY:70.0686:24.9733 +NOTODDEN, NORWAY:59.5656:9.21167 +ORLAND, NORWAY:63.6989:9.60389 +ROROS, NORWAY:62.5783:11.3422 +RYGGE, NORWAY:59.3789:10.7856 +SVALBARD, NORWAY:78.2461:15.4656 +SOGNDAL, NORWAY:61.1561:7.13639 +SKIEN, NORWAY:59.185:9.56694 +STORD, NORWAY:59.7917:5.34083 +SORKJOSEN, NORWAY:69.7869:20.9594 +SVARTNES, NORWAY:70.3553:31.0447 +SANDNESSJOEN, NORWAY:65.9567:12.4689 +TROMSO, NORWAY:69.6833:18.9189 +TORP, NORWAY:59.1867:10.2586 +TRONDHEIM, NORWAY:63.4575:10.9397 +STAVANGER, NORWAY:58.8767:5.63778 +GDANSK, POLAND:54.3775:18.4661 +KRAKOW, POLAND:50.0775:19.7847 +KATOWICE, POLAND:50.2383:19.035 +KOSZALIN, POLAND:54.0422:16.2636 +KATOWICE, POLAND:50.4742:19.08 +LODZ, POLAND:51.7219:19.3981 +MIELEC, POLAND:50.3222:21.4619 +POZNAN, POLAND:52.4211:16.8264 +RZESZOW, POLAND:50.11:22.0189 +SZCZECHIN, POLAND:53.5847:14.9019 +SZCZECHIN, POLAND:53.3919:14.6336 +SLUPSK, POLAND:54.4789:17.1075 +SHAPAJA, PERU:53.7906:15.8281 +WARSAW, POLAND:52.1656:20.9669 +WROCLAW, POLAND:51.1025:16.8858 +ZIELONA GORA, POLAND:52.1386:15.7986 +LINKOEPING, SWEDEN:58.4022:15.5256 +NORRKOEPING, SWEDEN:58.6108:16.1033 +UPPSALA, SWEDEN:59.8972:17.5883 +STOCKHOLM, SWEDEN:59.1808:17.9122 +ANGELHOLM, SWEDEN:56.2958:12.8469 +RONNEBY, SWEDEN:56.2667:15.265 +HASSLOSA, SWEDEN:58.4092:13.2625 +KNISLINGE, SWEDEN:56.1836:14.1322 +MOHOLM, SWEDEN:58.5981:14.1136 +KOSTA, SWEDEN:56.8442:15.4525 +RADA, SWEDEN:58.4981:13.0531 +BYHOLMA, SWEDEN:56.785:13.6017 +GOTHENBORG, SWEDEN:57.6628:12.2797 +JOENKOEPING, SWEDEN:57.7575:14.0686 +FALKOPING, SWEDEN:58.1697:13.5878 +LIDKOPING, SWEDEN:58.4653:13.1742 +GOTHENBORG, SWEDEN:57.7747:11.8703 +SKOVDE, SWEDEN:58.4564:13.9725 +TROLLHATTAN, SWEDEN:58.3181:12.345 +KARLSBORG, SWEDEN:58.5136:14.5069 +SATENAS, SWEDEN:58.4264:12.7142 +GIMO, SWEDEN:60.1328:18.105 +STOCKHOLM, SWEDEN:59.4186:17.8906 +KARLSKOGA, SWEDEN:59.3458:14.4958 +MORA, SWEDEN:60.9578:14.5111 +STOCKHOLM, SWEDEN:58.7886:16.9119 +STRANGNAS, SWEDEN:59.3139:17.1092 +ARVIKA, SWEDEN:59.6758:12.6392 +BJORKVIK, SWEDEN:58.7908:16.5708 +EMMABODA, SWEDEN:56.6106:15.6047 +LJUNGBY, SWEDEN:56.9503:13.9217 +KRISTIANSTAD, SWEDEN:55.9217:14.0853 +LANDSKRONA, SWEDEN:55.9447:12.8608 +OSKARSHAMN, SWEDEN:57.3503:16.4978 +ANDERSTORP, SWEDEN:57.2642:13.5992 +KALKMAR, SWEDEN:56.6853:16.2875 +MALMOE, SWEDEN:55.53:13.3714 +HALMSTAD, SWEDEN:56.6911:12.82 +HAGSHULT, SWEDEN:57.2922:14.1372 +VAXJO, SWEDEN:56.9289:14.7278 +HALLVIKEN, SWEDEN:63.7383:15.4583 +HEDE, SWEDEN:62.4089:13.7472 +SVEG, SWEDEN:62.0478:14.4228 +FARILA, SWEDEN:61.8981:15.7053 +GALLIVARE, SWEDEN:67.1322:20.8144 +HUDIKSVALL, SWEDEN:61.7681:17.0806 +KUBBE, SWEDEN:63.6336:17.9397 +JOKKMOKK, SWEDEN:66.4961:20.1469 +KRAMFORS, SWEDEN:63.0483:17.7686 +LYCKSELE, SWEDEN:64.5481:18.7161 +OPTAND, SWEDEN:63.1286:14.8028 +SUNDSVALL, SWEDEN:62.5281:17.4439 +ORNSKOLDSVIK, SWEDEN:63.4083:18.99 +PITEA, SWEDEN:65.3994:21.2653 +KIRUNA, SWEDEN:67.8219:20.3367 +ORSA, SWEDEN:61.19:14.7125 +SKELLEFTEA, SWEDEN:64.6247:21.0767 +SATTNA, SWEDEN:62.4811:17.0028 +UMEA, SWEDEN:63.7917:20.2825 +VILHELMINA, SWEDEN:64.5789:16.8333 +ARVIDSJAUR, SWEDEN:65.59:19.2817 +OREBRO, SWEDEN:59.2236:15.0378 +HAGFORS, SWEDEN:60.02:13.5789 +VASTERAS, SWEDEN:59.5894:16.6336 +LULEA, SWEDEN:65.5436:22.1219 +OSTERSUND, SWEDEN:63.1939:14.5019 +VIDSEL, SWEDEN:65.8753:20.1497 +HEDEN, SWEDEN:65.8361:21.4714 +ARBOGA, SWEDEN:59.3864:15.9239 +STOCKHOLM, SWEDEN:59.6519:17.9186 +STOCKHOLM, SWEDEN:59.3542:17.9414 +BORLANGE, SWEDEN:60.4219:15.515 +HULTSFRED, SWEDEN:57.5256:15.8239 +GAVLE, SWEDEN:60.5933:16.9514 +LINKOEPING, SWEDEN:58.4061:15.6803 +NORRKOEPING, SWEDEN:58.5861:16.2506 +TORSBY, SWEDEN:60.1575:12.9911 +ESKILSTUNA, SWEDEN:59.3508:16.7083 +VISBY, SWEDEN:57.6628:18.3461 +AMSELE, SWEDEN:64.5706:19.3142 +MOHED, SWEDEN:64.9608:17.6964 +IDRE, SWEDEN:61.8686:12.6906 +FALLFORS, SWEDEN:65.1064:20.7606 +KALIXFORS, SWEDEN:67.7647:20.2572 +HEMAVAN, SWEDEN:65.8061:15.0828 +SPANGDAHLEM, GERMANY:49.9725:6.6925 +RAMSTEIN, GERMANY:49.4375:7.60139 +BAMBERG, GERMANY:49.9203:10.9142 +BAUMHOLDER, GERMANY:49.65:7.3 +GIEBELSTADT, GERMANY:49.6481:9.96639 +BRUECKEBURG, GERMANY:52.2783:9.08194 +CELLE, GERMANY:52.5911:10.0219 +RHEINE-BRENTLANGE, GERMANY:52.2911:7.38694 +FRITZLAR, GERMANY:51.1144:9.28583 +ITZEHOE, GERMANY:53.9944:9.57833 +LAUPHEIM, GERMANY:48.2203:9.91 +MENDIG, GERMANY:50.3658:7.315 +NIEDERSTETTEN, GERMANY:49.3917:9.95806 +ROTH, GERMANY:49.2175:11.1006 +FASSBERG, GERMANY:52.9192:10.1836 +COTTBUS, GERMANY:51.7678:14.2919 +GRAFENWOEHR, GERMANY:49.6994:11.9411 +HANAU, GERMANY:50.1692:8.96139 +HEIDELBERG, GERMANY:49.3933:8.65194 +HOHENFELS, GERMANY:49.2181:11.8361 +KITZINGEN, GERMANY:49.7431:10.2006 +EGGEBECK, GERMANY:54.6247:9.34139 +NORDHOLZ, GERMANY:53.7675:8.65833 +DIEPHOLZ, GERMANY:52.5853:8.34056 +GEILENKIRCHEN, GERMANY:50.9608:6.0425 +HOHN, GERMANY:54.3119:9.53806 +JEVER, GERMANY:53.5333:7.88861 +LAAGE, GERMANY:53.9181:12.2792 +NOERVENICH, GERMANY:50.8311:6.65806 +HOPSTEN, GERMANY:52.3386:7.54111 +PRESCHEN, GERMANY:51.6636:14.6336 +SCHLESWIG, GERMANY:54.4592:9.51611 +WITTMUNDHAFEN, GERMANY:53.5478:7.66722 +NEUBRANDENBURG, GERMANY:53.6019:13.3058 +WUNSTORF, GERMANY:52.4572:9.42694 +VILSECK, GERMANY:49.6336:11.7672 +COLEMAN, GERMANY:49.5633:8.46333 +WIESBADEN, GERMANY:50.0497:8.32528 +LANDSBERG, GERMANY:48.0706:10.9058 +BUECHEL, GERMANY:50.1736:7.06333 +ERDING, GERMANY:48.3222:11.9486 +FUERSTENFELDBRUCK, GERMANY:48.2056:11.2669 +HOLZDORF, GERMANY:51.7678:13.1675 +INGOLSTADT, GERMANY:48.7156:11.5339 +LECHFELD, GERMANY:48.1861:10.8622 +MEMMINGEN, GERMANY:47.9886:10.2394 +NEUBURG, GERMANY:48.7108:11.2111 +LAARBRUCH, GERMANY:51.6017:6.1425 +GUETERSLOH, GERMANY:51.9228:8.30611 +BRUEGGEN, GERMANY:51.1997:6.13194 +ALEXANDER BAY, SOUTH AFRICA:-28.575:16.5333 +AGGENEYS, SOUTH AFRICA:-29.2817:18.8136 +ARNOT POWER STATION, SOUTH AFRICA:-25.9436:29.81 +BRAKPAN, SOUTH AFRICA:-26.2386:28.3017 +BISHO, SOUTH AFRICA:-32.8969:27.2789 +BLOEMFONTEIN, SOUTH AFRICA:-29.0925:26.3022 +BETHLEHEM, SOUTH AFRICA:-28.2483:28.3361 +BOTHAVILLE, SOUTH AFRICA:-27.3667:26.6292 +CARLETONVILLE, SOUTH AFRICA:-26.3694:27.35 +CAPE TOWN, SOUTH AFRICA:-33.9647:18.6017 +CALVINIA, SOUTH AFRICA:-31.5003:19.7258 +DE AAR, SOUTH AFRICA:-30.6367:23.92 +DWAALBOOM, SOUTH AFRICA:-24.805:26.8317 +DUNDEE, SOUTH AFRICA:-28.1825:30.2244 +DURBAN, SOUTH AFRICA:-29.97:30.9503 +EAST LONDON, SOUTH AFRICA:-33.0356:27.8258 +ERMELO, SOUTH AFRICA:-26.4953:29.98 +ELLISRAS, SOUTH AFRICA:-23.7261:27.6875 +FICKSBURG, SOUTH AFRICA:-28.8231:27.9089 +JOHANNESBURG, SOUTH AFRICA:-25.9861:28.14 +GEORGE, SOUTH AFRICA:-34.0053:22.3789 +GIYANI, SOUTH AFRICA:-23.2836:30.6497 +JOHANNESBURG, SOUTH AFRICA:-26.2425:28.1511 +GRAHAMSTOWN, SOUTH AFRICA:-33.2847:26.4981 +GREYTOWN, SOUTH AFRICA:-29.1219:30.5867 +HARMONY, SOUTH AFRICA:-28.0786:26.8611 +PULLENSHOPE, SOUTH AFRICA:-25.9794:29.6186 +HEIDELBERG, SOUTH AFRICA:-26.5061:28.3939 +HEIBRON, SOUTH AFRICA:-27.2783:27.9958 +HARRISMITH, SOUTH AFRICA:-28.235:29.1061 +HOEDSPRUIT, SOUTH AFRICA:-24.3686:31.0486 +HENDRIK VERWOERDDAM, SOUTH AFRICA:-30.5619:25.5281 +JOHANNESBURG, SOUTH AFRICA:-26.1392:28.2458 +KLERKSDORP, SOUTH AFRICA:-26.8708:26.7178 +KOMATI POWER STATION, SOUTH AFRICA:-26.0933:29.4547 +KRIEL, SOUTH AFRICA:-26.2517:29.1944 +KIMBERLEY, SOUTH AFRICA:-28.8028:24.765 +KOMATIPOORT, SOUTH AFRICA:-25.4406:31.9297 +KRUGERSDORP, SOUTH AFRICA:-26.0808:27.7256 +KROONSTAD, SOUTH AFRICA:-27.6606:27.3156 +KURUMAN, SOUTH AFRICA:-27.4567:23.4114 +KLEINSEE, SOUTH AFRICA:-29.6883:17.0939 +JOHANNESBURG, SOUTH AFRICA:-25.9383:27.9261 +LADYBRAND, SOUTH AFRICA:-29.1811:27.4531 +LICHTENBURG, SOUTH AFRICA:-26.1756:26.1844 +LOUIS TRICHARDT, SOUTH AFRICA:-23.1597:29.6964 +LANGEBAANWEG, SOUTH AFRICA:-32.9689:18.1603 +LADYSMITH, SOUTH AFRICA:-28.5817:29.7497 +MIDDELBURG, SOUTH AFRICA:-25.6847:29.44 +MARGATE, SOUTH AFRICA:-30.8572:30.3428 +MARBLE HALL, SOUTH AFRICA:-24.9889:29.2831 +MAJUBA POWER STATION, SOUTH AFRICA:-27.0792:29.7783 +MAFIKENG, SOUTH AFRICA:-25.7528:25.6119 +MMABATHO, SOUTH AFRICA:-25.7983:25.5478 +MALALANE, SOUTH AFRICA:-25.4733:31.5656 +MESSINA, SOUTH AFRICA:-22.3558:29.9864 +MKUZE, SOUTH AFRICA:-27.6258:32.0442 +NEWCASTLE, SOUTH AFRICA:-27.7706:29.9767 +NELSPRUIT, SOUTH AFRICA:-25.5006:30.9133 +NYLSTROOM, SOUTH AFRICA:-24.6858:28.4347 +OVERBERG, SOUTH AFRICA:-34.5553:20.2503 +OUDTSHOORN, SOUTH AFRICA:-33.6069:22.1889 +PIETERSBURG, SOUTH AFRICA:-23.8453:29.4586 +PORT ELIZABETH, SOUTH AFRICA:-33.9847:25.6172 +PLETTENBERG BAY, SOUTH AFRICA:-34.0903:23.3278 +PHALABORWA, SOUTH AFRICA:-23.9369:31.1553 +PIETERSBURG, SOUTH AFRICA:-23.9258:29.4842 +PORT SAINT JOHNS, SOUTH AFRICA:-31.6058:29.5197 +PIETERMARITZBURG, SOUTH AFRICA:-29.6489:30.3986 +PILANESBERG, SOUTH AFRICA:-25.3336:27.1733 +POTGIETERSRUS, SOUTH AFRICA:-24.2303:28.9836 +POMFRET, SOUTH AFRICA:-25.8469:23.5378 +POTCHEFSTROOM, SOUTH AFRICA:-26.6708:27.0817 +PARYS, SOUTH AFRICA:-26.8892:27.5033 +QUEENSTOWN, SOUTH AFRICA:-31.92:26.8819 +RICHARD'S BAY, SOUTH AFRICA:-28.7408:32.0919 +RUSTENBURG, SOUTH AFRICA:-25.6442:27.2711 +ROBERTSON, SOUTH AFRICA:-33.8119:19.9028 +SPRINGBOK, SOUTH AFRICA:-29.6892:17.9394 +SECUNDA, SOUTH AFRICA:-26.5239:29.17 +SALDANHA, SOUTH AFRICA:-32.9639:17.9692 +SPRINGS, SOUTH AFRICA:-26.2483:28.3975 +SWARTKOP, SOUTH AFRICA:-25.8094:28.1644 +SISHEN, SOUTH AFRICA:-27.6483:22.9992 +SACE, SOUTH AFRICA:-25.9614:29.2086 +SKUKUZA, SOUTH AFRICA:-24.9608:31.5886 +TOMMY'S FIELD, SOUTH AFRICA:-28.26:22.9931 +THOHOYANDOU, SOUTH AFRICA:-23.0786:30.3833 +THABA NCHU, BOPHUTHATSWANA:-29.3192:26.8233 +BLOEMFONTEIN, SOUTH AFRICA:-29.0328:26.1575 +TUTUKA, SOUTH AFRICA:-26.7764:29.3386 +TZANEEN, SOUTH AFRICA:-23.8242:30.3292 +ULUNDI, SOUTH AFRICA:-28.3206:31.4164 +UPINGTON, SOUTH AFRICA:-28.4008:21.2606 +UMTATA, SOUTH AFRICA:-31.5478:28.6742 +VRYBURG, SOUTH AFRICA:-26.9822:24.7286 +DURBAN, SOUTH AFRICA:-29.7706:31.0583 +VANDERBIJLPARK, SOUTH AFRICA:-26.6922:27.7778 +VREDENDAL, SOUTH AFRICA:-31.6408:18.5447 +VEREENIGING, SOUTH AFRICA:-26.5661:27.9606 +VRYHEID, SOUTH AFRICA:-27.7867:30.7953 +PRETORIA, SOUTH AFRICA:-25.6536:28.2242 +WITBANK, SOUTH AFRICA:-25.8322:29.1919 +WATERKLOOF, SOUTH AFRICA:-25.83:28.2225 +WELKOM, SOUTH AFRICA:-27.9978:26.6694 +WESSELSBRUNN, SOUTH AFRICA:-27.8472:26.3497 +YSTERPLAAT, SOUTH AFRICA:-33.9:18.4981 +ZEERUST, SOUTH AFRICA:-25.5989:26.0422 +FRANCISTOWN, BOTSWANA:-21.1594:27.4744 +JWANENG, BOTSWANA:-24.6022:24.6908 +KASANE, BOTSWANA:-17.8328:25.1622 +MAUN, BOTSWANA:-19.9725:23.4308 +ORAPA, BOTSWANA:-21.2664:25.3203 +GABERONE, BOTSWANA:-24.555:25.9181 +SELEBI-PHIKWE, BOTSWANA:-22.0583:27.8286 +BRAZZAVILLE, CONGO:-4.25167:15.2528 +IMPFONDO, CONGO:1.58944:18.0469 +MAKOUA, CONGO:-0.0213889:15.5753 +OWANDO, CONGO:-0.531111:15.95 +OUESSO, CONGO:1.61583:16.0378 +MAKABANA, CONGO:-3.48333:12.6167 +LOUDIMA, CONGO:-4.20778:12.6608 +POINTE-NOIRE, CONGO:-4.81333:11.8858 +MANZINI, SWAZILAND:-26.5289:31.3075 +BANGUI, CENTRAL AFRICAN REP.:4.39833:18.5186 +BANGASSOU, CENTRAL AFRICAN REP.:4.78444:22.7814 +BIRAO, CENTRAL AFRICAN REP.:10.2361:22.7172 +BAMBARI, CENTRAL AFRICAN REP.:5.84694:20.6494 +N'DELE, CENTRAL AFRICAN REP.:8.42667:20.635 +BOUAR, CENTRAL AFRICAN REP.:5.95806:15.6375 +BRIA, CENTRAL AFRICAN REP.:6.52806:21.9889 +BERBERATI, CENTRAL AFRICAN REP.:4.22139:15.7861 +YALINGA, CENTRAL AFRICAN REP.:45.1542:W89.1108 +BATA, EQUATORIAL GUINEA:1.90528:9.80556 +MALABO, EQUATORIAL GUINEA:3.75528:8.70861 +WIDE AWAKE, ACORES:-7.96944:W14.3936 +PLAISANCE, MAURITIUS:-20.43:57.6833 +RODRIGUEZ ISLAND, MAURITIUS:-19.7578:63.3619 +DIEGO GARCIA ISLAND, DIEGO GARCIA ISLAND:-7.31306:72.4108 +TIKO, CAMEROON:4.08917:9.36028 +DOUALA, CAMEROON:4.00583:9.71944 +BATOURI, CAMEROON:4.47306:14.3636 +MAROUA, CAMEROON:10.4514:14.2572 +FOUMBAN, CAMEROON:5.63667:10.7506 +N'GAOUNDERE, CAMEROON:7.35694:13.5592 +GAROUA, CAMEROON:9.33583:13.37 +BAFOUSSAM, CAMEROON:5.53694:10.3542 +BAMENDA, CAMEROON:6.03917:10.1225 +YAOUNDE, CAMEROON:3.83528:11.5236 +KASOMPE, ZAMBIA:-12.5728:27.8939 +KALABO, ZAMBIA:-14.9975:22.6475 +LIVINGSTONE, ZAMBIA:-17.8217:25.8225 +LUSAKA, ZAMBIA:-15.3306:28.4525 +MANSA, ZAMBIA:-11.1381:28.875 +MFUWE, ZAMBIA:-13.2586:31.9364 +MONGU, ZAMBIA:-15.2544:23.1622 +MUFULIRA, ZAMBIA:-12.5647:28.2986 +NDOLA, ZAMBIA:-12.9981:28.6647 +SOUTHDOWNS, ZAMBIA:-12.9003:28.1497 +ZAMBEZI, ZAMBIA:-13.5386:23.1097 +MORONI, COMOROS ISLANDS:-11.5336:43.2717 +MOHELI, COMOROS ISLANDS:-12.2981:43.7664 +MORONI, COMOROS ISLANDS:-11.7106:43.2436 +ANJOUAN, COMOROS ISLANDS:-12.1317:44.4303 +DZAOUDZI, MAYOTTE ISLAND:-12.8047:45.2811 +ST.-DENIS, REUNION ISLAND:-20.8869:55.5103 +ST.-PIERRE, REUNION ISLAND:-21.3208:55.4247 +ANTANANARIVO, MADAGASCAR:-18.7967:47.4786 +MIANDRIVAZO, MADAGASCAR:-19.5628:45.4508 +SAINTE MARIE, MADAGASCAR:-17.0939:49.8158 +TOAMASINA, MADAGASCAR:-18.1094:49.3925 +MORONDAVA, MADAGASCAR:-20.2847:44.3175 +ANTSIRANANA, MADAGASCAR:-12.3492:49.2917 +MANANARA, MADAGASCAR:-16.1639:49.7736 +ANDAPA, MADAGASCAR:-14.6517:49.6206 +AMBILOBE, MADAGASCAR:-13.1883:48.9878 +ANTALAHA, MADAGASCAR:-14.9992:50.32 +ANALALAVA, MADAGASCAR:-14.6294:47.7636 +MAHAJANGA, MADAGASCAR:-15.6672:46.3517 +NOSY-BE, MADAGASCAR:-13.3122:48.3139 +BESALAMPY, MADAGASCAR:-16.7419:44.4814 +MAROANTSETRA, MADAGASCAR:-15.4367:49.6883 +SAMBAVA, MADAGASCAR:-14.2786:50.1747 +VOHEMAR, MADAGASCAR:-13.3758:50.0028 +ANTSOHIHY, MADAGASCAR:-14.8986:47.9939 +AMPAMPAMENA, MADAGASCAR:-13.4847:48.6325 +TOLAGNARO, MADAGASCAR:-25.0381:46.9561 +FIANARANTSOA, MADAGASCAR:-21.4414:47.1117 +FARAFANGANA, MADAGASCAR:-22.8053:47.8206 +MANAKARA, MADAGASCAR:-22.1197:48.0217 +MANANJARY, MADAGASCAR:-21.2017:48.3581 +MOROMBE, MADAGASCAR:-21.7536:43.3753 +TOLIARA, MADAGASCAR:-23.3833:43.7283 +M'BANZA-CONGO, ANGOLA:-6.26972:14.2469 +BENGUELA, ANGOLA:-12.6089:13.4036 +CABINDA, ANGOLA:-5.59694:12.1883 +CHITATO, ANGOLA:-7.3575:20.8036 +CAMAXILO, ANGOLA:-8.37361:18.9236 +CAZOMBO, ANGOLA:-11.8936:22.9161 +N'GIVA, ANGOLA:-17.0447:15.6869 +HUAMBO, ANGOLA:-12.8086:15.7603 +KUITO, ANGOLA:-12.4044:16.9472 +LOBITO, ANGOLA:-12.3711:13.5364 +LUANDA, ANGOLA:-8.85833:13.2311 +MALANJE, ANGOLA:-9.525:16.3122 +MENONGUE, ANGOLA:-14.6575:17.7197 +MOCAMEDES, ANGOLA:-15.2611:12.1467 +NEGAGE, ANGOLA:-7.75444:15.2875 +PORTO AMBOIM, ANGOLA:-10.7219:13.7653 +SAURIMO, ANGOLA:-9.68889:20.4317 +SOYO, ANGOLA:-6.14083:12.3717 +TOTO, ANGOLA:-7.14722:14.2481 +LUENA, ANGOLA:-11.7681:19.8975 +UIGE, ANGOLA:-7.60306:15.0278 +XANGONGO, ANGOLA:-16.7553:14.9653 +OYEM, GABON:1.54111:11.5808 +OKONDJA, GABON:-0.665278:13.6731 +LAMBARENE, GABON:-0.704167:10.2456 +BITAM, GABON:2.07556:11.4931 +MOANDA, GABON:-1.5375:13.2692 +PORT GENTIL, GABON:-0.711667:8.75417 +OMBOUE HOSPIAL, GABON:-1.57472:9.26278 +MAKOKOU, GABON:0.579167:12.8908 +LIBREVILLE, GABON:0.458333:9.41222 +MITZIC, GABON:0.775556:11.5525 +FRANCEVILLE, GABON:-1.65611:13.4378 +LASTOURVILLE, GABON:-0.826389:12.7467 +TCHIBANGA, GABON:-2.88889:10.9194 +PRINCIPE, SAO TOME & PRINCIPE:1.66278:7.41167 +SAO TOME, SAO TOME & PRINCIPE:0.378056:6.71194 +BEIRA, MOZAMBIQUE:-19.7964:34.9075 +CUAMBA, MOZAMBIQUE:-14.82:36.5319 +CHIMOIO, MOZAMBIQUE:-19.1511:33.4289 +ESTIMA, MOZAMBIQUE:-15.7342:32.7567 +INHAMBANE, MOZAMBIQUE:-23.8764:35.4083 +LICHINGA, MOZAMBIQUE:-13.2739:35.2661 +LUMBO, MOZAMBIQUE:-15.0331:40.6717 +MAPUTO, MOZAMBIQUE:-25.9208:32.5725 +MUEDA, MOZAMBIQUE:-11.6728:39.5631 +MOCIMBOA DA PRAIA, MOZAMBIQUE:-11.3617:40.3547 +MARRUPA, MOZAMBIQUE:-13.225:37.5519 +NACALA, MOZAMBIQUE:-14.4881:40.7122 +NAMPULA, MOZAMBIQUE:-15.1056:39.2817 +PEMBA, MOZAMBIQUE:-12.9867:40.5222 +QUELIMANE, MOZAMBIQUE:-17.8556:36.8692 +SONGO, MOZAMBIQUE:-15.6025:32.7731 +TETE, MOZAMBIQUE:-16.1047:33.64 +ULONGWE, MOZAMBIQUE:-14.7044:34.3522 +VILANKULU, MOZAMBIQUE:-22.0183:35.3131 +ALPHONSE, SEYCHELLES:-7.00472:52.7261 +DESROCHES, SEYCHELLES:-5.69583:53.6544 +FARQUHAR, SEYCHELLES:-10.1094:51.1761 +MAHE, SEYCHELLES:-4.67417:55.5217 +PRASLIN, SEYCHELLES:-4.31917:55.6914 +COETIVY, SEYCHELLES:-7.16417:56.2639 +SARH, CHAD:9.15111:18.3794 +ABECHE, CHAD:13.8469:20.8442 +MOUNDOU, CHAD:8.62028:16.0683 +N'DJAMENA, CHAD:12.1336:15.0339 +PALA, CHAD:9.37917:14.9258 +FAYA-LARGEAU, CHAD:17.9169:19.1108 +BULAWAYO, ZIMBABWE:-20.0172:28.6178 +HARARE, ZIMBABWE:-17.7514:30.9244 +CHIREDZI, ZIMBABWE:-21.0081:31.5783 +VICTORIA FALLS, ZIMBABWE:-18.0961:25.8392 +MUTARE, ZIMBABWE:-18.9775:32.4506 +HARARE, ZIMBABWE:-17.9317:31.0928 +KARIBA, ZIMBABWE:-16.5197:28.8847 +MUTOKO, ZIMBABWE:-17.4317:32.1844 +MUTARE, ZIMBABWE:-18.9975:32.6272 +MASVINGO, ZIMBABWE:-20.0553:30.8589 +ZVISHAVANE, ZIMBABWE:-20.2894:30.0883 +GWERT, ZIMBABWE:-19.4367:29.8617 +HWANGE NATIONAL PARK, ZIMBABWE:-18.6297:27.0208 +ZISCO, ZIMBABWE:-19.0286:29.7219 +BLANTYRE, MALAWI:-15.6789:34.9739 +KARONGA, MALAWI:-9.95333:33.8928 +KASUNGU, MALAWI:-13.0144:33.4683 +MANGOCHI, MALAWI:30.8378:W85.1817 +MZUZU, MALAWI:-11.4447:34.0117 +MASERU, LESOTHO:-29.4622:27.5525 +MASERU, LESOTHO:-29.3039:27.5033 +KINSHASA, ZAIRE:-4.38556:15.4444 +KINSHASA, ZAIRE:-4.32472:15.3283 +MUANDA, ZAIRE:-5.93083:12.3517 +KITONA BASE, ZAIRE:-5.91806:12.4475 +MATADI, ZAIRE:-5.79944:13.4408 +BANDOUNDU, ZAIRE:-3.31111:17.3817 +KIKWIT, ZAIRE:-5.03556:18.7856 +MBANDAKA, ZAIRE:0.0225:18.2886 +GBADOLITE, ZAIRE:4.25306:20.9753 +GEMENA, ZAIRE:3.23528:19.7711 +KOTAKOLI, ZAIRE:4.1575:21.6508 +LISALA, ZAIRE:2.17056:21.4967 +KISANGANI, ZAIRE:0.5175:25.155 +ISIRO, ZAIRE:2.8275:27.5881 +BUNIA, ZAIRE:1.56556:30.2208 +BUTA ZEGA, ZAIRE:2.81778:24.7939 +BUKAVU/KAVUMU, ZAIRE:-2.30889:28.8086 +GOMA, ZAIRE:-1.67056:29.2383 +KINDU, ZAIRE:-2.91917:25.9153 +LUBUMASHI, ZAIRE:-11.5911:27.5308 +KOLWEZI, ZAIRE:-10.7658:25.5056 +KALEMIE, ZAIRE:-5.87556:29.25 +KAMINA BASE, ZAIRE:-8.64194:25.2528 +LUENA, ZAIRE:-9.46944:25.7589 +KANANGA, ZAIRE:-5.9:22.4692 +MBUJI-MAYI, ZAIRE:-6.12111:23.5689 +BAMAKO, MALI:12.5333:W7.94972 +GAO, MALI:16.2483:W0.00527778 +KAYES, MALI:14.4311:W11.4394 +MOPTI, MALI:14.5128:W4.07944 +NIORO, MALI:15.2386:W9.57639 +TOMBOUCTOU, MALI:16.7303:W3.0075 +TESSALIT, MALI:20.2461:0.980833 +BANJUL, GAMBIA:13.3378:W16.6519 +FUERTEVENTURA, CANARY ISLANDS:28.4525:W13.8636 +HIERRO, CANARY ISLANDS:27.8147:W17.8869 +SANTA CRUZ DE LA PALMA, SPAIN:28.6264:W17.7556 +GRAN CANARIA, CANARY ISLANDS:27.9317:W15.3864 +LANZEROTE, CANARY ISLANDS:28.9453:W13.605 +TENERIFE, CANARY ISLANDS:28.0444:W16.5722 +TENERIFE, CANARY ISLANDS:28.4825:W16.3414 +MELILLA, SPANISH NORTH AFRICA:35.2797:W2.95611 +HASTINGS, SIERRA LEONE:8.39444:W13.1283 +FREETOWN, SIERRA LEONE:8.61639:W13.1953 +CUFAR, GUINEA BISSAU:11.2881:W15.1806 +BISSAU, GUINEA BISSAU:11.8947:W15.6536 +MONROVIA, LIBERIA:6.28889:W10.7586 +MONROVIA, LIBERIA:6.23361:W10.3622 +AGADIR, MOROCCO:30.3811:W9.54611 +TAN TAN, MOROCCO:28.4481:W11.1611 +FEZ, MOROCCO:33.9272:W4.97778 +IFRANE, MOROCCO:33.5053:W5.15278 +ER-RACHIDIA, MOROCCO:31.9489:W4.40056 +MEKNES, MOROCCO:33.8789:W5.515 +NADOR, MOROCCO:35.1533:W2.92 +OUJDA, MOROCCO:34.7869:W1.92389 +CASABLANCA, MOROCCO:33.5533:W7.66139 +RABAT, MOROCCO:34.0514:W6.75139 +SIDI IFINI, MOROCCO:29.3689:W10.18 +ESSADOUIRA, MOROCCO:31.4039:W9.68472 +CASABLANCA, MOROCCO:33.3678:W7.58778 +MARRAKECH, MOROCCO:31.6067:W8.03611 +KENTIRA, MOROCCO:34.2989:W6.59583 +OUARZAZATE, MOROCCO:30.9389:W6.90917 +AL HOCIEMA, MOROCCO:35.1769:W3.83944 +TETOUAN, MOROCCO:35.5942:W5.32 +TANGER, MOROCCO:35.7267:W5.91667 +ZIGUINCHOR, SENEGAL:12.5556:W16.2817 +KOLDA, SENEGAL:12.88:W14.9553 +CAP SKIRING, SENEGAL:12.41:W16.7461 +KAOLACK, SENEGAL:14.1467:W16.0511 +DAKAR, SENEGAL:14.7394:W17.49 +ST. LOUIS, SENEGAL:16.0497:W16.4611 +BAKEL, SENEGAL:14.8472:W12.4681 +KEDOUGOU, SENEGAL:12.5722:W12.2203 +TAMBACOUNDA, SENEGAL:13.7367:W13.6531 +AIOUN EL ATROUSS, MAURITANIA:16.7111:W9.63778 +TIDJIKJA, MAURITANIA:18.5703:W11.4231 +KIFFA, MAURITANIA:16.5897:W11.4061 +NEMA, MAURITANIA:16.6219:W7.31444 +KAEDI, MAURITANIA:16.1594:W13.5075 +NOUAKSCHOTT, MAURITANIA:18.0978:W15.9478 +SELIBABI, MAURITANIA:15.1794:W12.2072 +ATAR, MAURITANIA:20.5067:W13.0431 +NOUADHIBOU, MAURITANIA:20.9283:W17.0311 +BIR MOGHREIN, MAURITANIA:25.2367:W11.5886 +FIRA, GUINEA:10.3506:W13.5692 +FARANAH, GUINEA:10.0356:W10.7697 +LABE, GUINEA:11.3261:W12.2869 +MACENTA, GUINEA:8.48111:W9.52583 +N'ZEREKORE, GUINEA:7.80583:W8.70167 +AMILCAR CABRAL, CAPE VERDE ISLANDS:16.7414:W22.9494 +BOA VISTA, CAPE VERDE ISLANDS:16.1367:W22.8889 +FRANCISCO MENDEZ, CAPE VERDE ISLANDS:14.9244:W23.4933 +MAIO, CAPE VERDE ISLANDS:15.1558:W23.2136 +SAO NOCOLAU ISLAND, CAPE VERDE ISLANDS:16.5883:W24.2844 +SAO VICENTE ISLAND, CAPE VERDE ISLANDS:16.8339:W25.0567 +ADDIS ABABA, ETHIOPIA:8.97694:38.8 +ADDIS ABABA, ETHIOPIA:9.00361:38.7256 +BAHAR DAR, ETHIOPIA:11.6081:37.3214 +DIRE DAWA, ETHIOPIA:9.625:41.8542 +GAMBELLA, ETHIOPIA:8.12833:34.5633 +GONDAR, ETHIOPIA:12.5183:37.4322 +DEBRE ZEIT, ETHIOPIA:8.71556:39.0081 +JIMMA, ETHIOPIA:7.66583:36.8164 +LALIBELLA, ETHIOPIA:11.9747:38.9797 +MAKALE, ETHIOPIA:13.4672:39.5333 +BUJUMBURA, BURUNDI:-3.32389:29.3183 +BAIDOA, SOMALIA:3.09861:43.6242 +HARGEISA, SOMALIA:9.51806:44.0886 +BERBERA, SOMALIA:10.3892:44.9408 +KISMAYU, SOMALIA:-0.377222:42.4592 +MOGADISHU, SOMALIA:2.01361:45.3047 +EL ARISH, EGYPT:31.0733:33.8358 +ASYUT, EGYPT:27.0464:31.0119 +ALEXANDRIA, EGYPT:31.1839:29.9489 +ABU SIMBEL, EGYPT:22.3758:31.6117 +CAIRO, EGYPT:30.1219:31.4056 +CAIRO, EGYPT:30.1161:30.9153 +EMBABA, EGYPT:30.0744:31.1919 +HURGHADA, EGYPT:27.1839:33.7983 +EL-GORA, EGYPT:31.0689:34.1292 +LUXOR, EGYPT:25.6708:32.7064 +MERSA-MATRUH, EGYPT:31.3253:27.2217 +PORT SAID, EGYPT:31.2794:32.24 +ST. CATHERINE, EGYPT:28.6853:34.0625 +ASWAN, EGYPT:23.9642:32.8197 +EL-TOR, EGYPT:28.2089:33.6453 +ELDORET, KENYA:0.404167:35.2381 +GARISSA, KENYA:-0.463333:39.6481 +ISIOLO, KENYA:0.339167:37.5908 +KAKAMEGA, KENYA:0.271111:34.7872 +KISUMU, KENYA:-0.0861111:34.7289 +KITALE, KENYA:0.971944:34.9583 +LOKICHOGGIO, KENYA:4.20417:34.3481 +LODWAR, KENYA:3.12194:35.6086 +LAMU, KENYA:-2.25222:40.9131 +LOYANGALANI, KENYA:2.76306:36.7183 +MANDERA, KENYA:3.93361:41.8442 +MARSABIT, KENYA:2.345:37.9992 +MERU, KENYA:0.230278:38.1703 +MALINDI, KENYA:-3.22917:40.1017 +MOMBASA, KENYA:-4.03472:39.5942 +MOYALE LOWER, KENYA:3.46972:39.1014 +NYERI, KENYA:-0.368889:36.98 +NAIVASHA, KENYA:-0.787778:36.4333 +NAIROBI, KENYA:-1.32167:36.8147 +NANYUKI, KENYA:-0.0608333:37.0386 +NAIROBI, KENYA:-1.27722:36.8622 +WAJIR, KENYA:1.73306:40.0914 +BUATTIFEL, LIBYA:28.7953:22.0808 +GIALLO, LIBYA:28.6383:21.4378 +GHAT, LIBYA:25.1456:10.1425 +KUFRA, LIBYA:24.1786:23.3139 +BENGHAZI, LIBYA:32.0967:20.2694 +EL BEIDA, LIBYA:32.7886:21.9642 +SEBHA, LIBYA:26.9869:14.4725 +TRIPOLI, LIBYA:32.6633:13.1589 +MARSA BREGA, LIBYA:30.3781:19.5764 +RAS LANOUF V 40, LIBYA:30.5:18.5269 +HON, LIBYA:29.11:15.9656 +DAHRA, LIBYA:29.4697:17.9311 +GHADAMES, LIBYA:30.1517:9.71528 +ZELLA 74, LIBYA:28.59:17.2942 +GISENYI, RWANDA:-1.67694:29.2586 +KIGALI, RWANDA:-1.96861:30.1394 +KAMEMBE, RWANDA:-2.46222:28.9078 +DONGOLA, SUDAN:19.1536:30.43 +DAMAZIN, SUDAN:11.7858:34.3364 +EL FASHER, SUDAN:13.615:25.3247 +KASSALA, SUDAN:15.3858:36.3281 +NYALA, SUDAN:12.0536:24.9553 +EL OBEID, SUDAN:13.1531:30.2325 +JUBA, SUDAN:4.87194:31.6011 +MALAKAL, SUDAN:9.55861:31.6525 +PORT SUDAN, SUDAN:19.5764:37.2158 +KHARTOUM, SUDAN:15.5894:32.5531 +WAU, SUDAN:7.72556:27.9794 +ARUSHA, TANZANIA:-3.36778:36.6333 +DAR ES SALAAM, TANZANIA:-6.87806:39.2025 +DODOMA, TANZANIA:-6.17028:35.7525 +IRINGA, TANZANIA:-7.66861:35.7519 +KILIMANJARO, TANZANIA:-3.42917:37.0744 +LAKE MANYARA, TANZANIA:-3.37611:35.8181 +MWADUI, TANZANIA:-3.51417:33.6189 +MOSHI, TANZANIA:-3.36278:37.3233 +MTWARA, TANZANIA:-10.3389:40.1817 +MWANZA, TANZANIA:-2.44444:32.9325 +NGERENGERE, TANZANIA:-6.71722:38.1536 +PEMBA, TANZANIA:-5.25722:39.8114 +TANGA, TANZANIA:-5.09222:39.0711 +ZANZIBAR, TANZANIA:-6.22194:39.2247 +ENTEBBE, UGANDA:0.0422222:32.4433 +GULU, UGANDA:2.80556:32.2717 +SOROTI, UGANDA:1.7275:33.6228 +ABILENE, USA:32.4111:W99.6817 +NANTUCKET, USA:41.2528:W70.06 +WACO, USA:31.6111:W97.2303 +ATLANTIC CITY, USA:39.4575:W74.5769 +ARDMORE, USA:34.3031:W97.0194 +CAMP SPRINGS, USA:38.8106:W76.8669 +ALEXANDRIA, USA:31.3272:W92.5483 +BUSH FIELD, USA:33.3697:W81.9644 +AKRON, USA:41.0375:W81.4667 +ALBANY, USA:42.7481:W73.8028 +ALICE, USA:27.7408:W98.0269 +AMARILLO, USA:35.2192:W101.706 +ANNISTON, USA:33.5881:W85.8581 +ANDERSEN, USA:34.495:W82.7092 +ALTOONA, USA:40.2964:W78.32 +ABERDEEN, USA:39.4661:W76.1694 +LOUISIANA, USA:30.0375:W91.8839 +WATERTOWN, USA:43.9917:W76.0217 +ATLANTA, USA:33.6403:W84.4269 +AUGUSTA, USA:44.3206:W69.7972 +AUSTIN, USA:30.1944:W97.6697 +MARYSVILLE, USA:39.1358:W121.436 +SHREVEPORT, USA:32.5017:W93.6625 +BOCA RATON, USA:26.3783:W80.1075 +BAUDETTE, USA:48.7283:W94.6122 +WINDSOR LOCKS, USA:41.9389:W72.6831 +STRATFORD, USA:41.1633:W73.1261 +BEDFORD, USA:42.4697:W71.2889 +SEATTLE, USA:47.5297:W122.302 +BAKERSFIELD, USA:35.4333:W119.057 +MOBILE, USA:30.6264:W88.0678 +BANGOR, USA:44.8072:W68.8281 +BIRMINGHAM, USA:33.5628:W86.7533 +EL PASO, USA:31.8494:W106.38 +BILOXI, USA:30.4108:W88.9236 +BUCKLEY, USA:39.7017:W104.751 +BELLINGHAM, USA:48.7925:W122.537 +BELLEVILLE, USA:38.545:W89.835 +NASHVILLE, USA:36.1244:W86.6781 +BOISE, USA:43.5642:W116.223 +BOSTON, USA:42.3642:W71.005 +BEAUMONT, USA:29.9508:W94.0206 +BROWNSVILLE, USA:25.9067:W97.4258 +BATON ROUGE, USA:30.5331:W91.1494 +BURLINGTON, USA:44.4717:W73.1531 +BUFFALO, USA:42.9403:W78.7319 +BURBANK, USA:34.2006:W118.359 +BALTIMORE, USA:39.1753:W76.6683 +BLYTHEVILLE, USA:35.9642:W89.9433 +FORT IRWIN, USA:35.2803:W116.63 +COLOMBIA, USA:33.9386:W81.1194 +CARIBOU, USA:46.8714:W68.0178 +COLOMBUS, USA:33.6439:W88.4436 +CEDAR CITY, USA:37.7008:W113.099 +CHILDRESS, USA:34.4336:W100.288 +CHICOPEE FALLS, USA:42.1981:W72.5342 +CRESTVIEW, USA:30.7786:W86.5219 +BRYAN, USA:30.7156:W96.3311 +CHATTANOOGA, USA:35.0353:W85.2036 +CHARLESTON, USA:32.8986:W80.0403 +CHICO, USA:39.7953:W121.858 +CLEVELAND, USA:41.4117:W81.8497 +COLLEGE STATION, USA:30.5883:W96.3636 +CHARLOTTE, USA:35.2139:W80.9431 +COLUMBUS, USA:39.9978:W82.8917 +CARLSBAD, USA:32.3372:W104.263 +WACO, USA:31.6378:W97.0739 +COCO BEACH, USA:28.2347:W80.61 +COLORADO SPRINGS, USA:38.8056:W104.7 +COTULLA, USA:28.4581:W99.22 +COLUMBIA, USA:38.8181:W92.2194 +CASPER, USA:42.9078:W106.464 +CORPUS CHRISTI, USA:27.7703:W97.5011 +CUTBANK, USA:48.6083:W112.376 +CINCINNATI, USA:39.0461:W84.6619 +CLOVIS, USA:34.3825:W103.322 +CALEXICO, USA:32.6694:W115.513 +CONROE, USA:30.3517:W95.4144 +CHEYENNE, USA:41.1556:W104.812 +DALLAS, USA:32.8469:W96.8517 +DAYTON, USA:39.9022:W84.2192 +WASHINGTON, USA:38.8519:W77.0375 +DENVER, USA:39.8583:W104.667 +DETROIT, USA:42.4092:W83.0097 +DALLAS-FORT WORTH, USA:32.8964:W97.0375 +DOTHAN, USA:31.3211:W85.4494 +DALHART, USA:36.0225:W102.547 +DEL RIO, USA:29.3594:W100.778 +DULUTH, USA:46.8419:W92.1936 +TUCSON, USA:32.1664:W110.883 +DOVER, USA:39.13:W75.4664 +WEST CHICAGO, USA:41.9078:W88.2486 +DERIDDER, USA:30.8317:W93.3397 +DURANGO, USA:37.1514:W107.754 +DEL RIO, USA:29.3728:W100.926 +DES MOINES, USA:41.5339:W93.6625 +DETROIT, USA:42.2122:W83.3533 +DOUGLAS, USA:31.4689:W109.604 +ABILENE, USA:32.4206:W99.8544 +ELIZABETH CITY, USA:36.2606:W76.1744 +EDWARDS AFB, USA:34.9053:W117.884 +HOUSTON, USA:29.6072:W95.1586 +EAGLE PASS, USA:28.7:W100.479 +ELKINS, USA:38.8894:W79.8569 +EL DORADO, USA:33.2208:W92.8131 +EL PASO, USA:31.8067:W106.378 +ENID, USA:36.3397:W97.9161 +WENDOVER, USA:40.7186:W114.031 +ALEXANDRIA, USA:31.3947:W92.2956 +NEW BERN, USA:35.0728:W77.0428 +NEWARK, USA:40.6922:W74.1686 +KEY WEST, USA:24.5561:W81.7594 +FORT EUSTIS, USA:37.1325:W76.6086 +FRESNO, USA:36.7761:W119.718 +FORT CARSON, USA:38.6783:W104.756 +DAYTON, USA:39.8261:W84.0483 +FORT HUACHUCA, USA:31.5883:W110.344 +FORT LAUDERDALE, USA:26.0725:W80.1525 +FLORENCE, USA:34.1853:W79.7239 +FORT LEAVENWORTH, USA:39.3683:W94.9144 +FORT MEADE, USA:39.0853:W76.7592 +FALMOUTH, USA:41.6583:W70.5214 +FARMINGTON, USA:36.7411:W108.23 +FORT MYERS, USA:26.5864:W81.8631 +FORT DODGE, USA:42.5514:W94.1925 +TOPEKA, USA:38.9508:W95.6636 +WEST HAMPTON BEACH, USA:40.8436:W72.6317 +FORT RILEY, USA:39.055:W96.7644 +FORT SILL, USA:34.6497:W98.4019 +FORT SMITH, USA:35.3364:W94.3672 +FORT KNOX, USA:37.9069:W85.9719 +FORT WORTH, USA:32.8197:W97.3622 +FORT LAUDERDALE, USA:26.1972:W80.1706 +FAYETTEVILLE, USA:36.005:W94.17 +GAGE, USA:36.2953:W99.7764 +GARDEN CITY, USA:37.9275:W100.724 +SPOKANE, USA:47.6197:W117.534 +GRAND FORKS, USA:47.9492:W97.1761 +LONGVIEW, USA:32.3847:W94.7114 +GALVESTON, USA:29.2653:W94.8603 +GRANTS, USA:35.1653:W107.901 +GAINESVILLE, USA:29.69:W82.2717 +GREEN BAY, USA:44.485:W88.1294 +FORT LEWIS, USA:47.0792:W122.581 +KILLEEN, USA:31.0672:W97.8289 +GRAND RAPIDS, USA:42.8808:W85.5228 +GOLDSBORO, USA:35.3392:W77.9606 +FORT DRUM, USA:44.0556:W75.7194 +GREAT FALLS, USA:47.4819:W111.371 +PERU, USA:40.6481:W86.1519 +GREENVILE, USA:33.0678:W96.0653 +GRANDVIEW, USA:38.8433:W94.5606 +GREENWOOD, USA:33.4942:W90.0844 +HOBART, USA:34.9911:W99.0511 +HARTFORD, USA:41.7361:W72.65 +HAWTHORNE, USA:33.9228:W118.335 +HIBBING, USA:47.3864:W92.8389 +OGDEN, USA:41.1239:W111.973 +HICKORY, USA:35.7411:W81.3894 +HELENA, USA:46.6067:W111.983 +FORT HOOD, USA:31.1386:W97.7144 +ALAMOGORDO, USA:32.8525:W106.106 +HOBBS, USA:32.6875:W103.217 +HURON, USA:44.385:W98.2283 +HOPKINSVILLE, USA:36.6683:W87.4961 +HOUSTON, USA:29.6453:W95.2789 +WHITE PLAINS, USA:41.0669:W73.7075 +HARLINGEN, USA:26.2283:W97.6542 +HARRISON, USA:36.2614:W93.1547 +MARY ESTHER, USA:30.4278:W86.6892 +HOMESTEAD, USA:25.4883:W80.3836 +HOUGHTON LAKE, USA:44.3597:W84.6711 +REDSTONE, USA:34.6786:W86.6847 +TERRE HAUTE, USA:39.4514:W87.3075 +HOULTON, USA:46.1231:W67.7919 +HAVRE, USA:48.5428:W109.762 +HOLLYWOOD, USA:26.0014:W80.2403 +WICHITA, USA:37.6228:W97.2672 +WASHINGTON, USA:38.9444:W77.4556 +NIAGARA FALLS, USA:43.1072:W78.9461 +HOUSTON, USA:29.9803:W95.3397 +WICHITA, USA:37.6497:W97.4331 +KANKAKEE, USA:41.0714:W87.8461 +KIRTLAND A.F.B., USA:35.04:W106.609 +WILMINGTON, USA:39.6786:W75.6064 +WILMINGTON, USA:34.2706:W77.9025 +INDIANAPOLIS, USA:39.7172:W86.2942 +WINK, USA:31.7794:W103.201 +INTERNATIONAL FALLS, USA:48.5661:W93.4031 +INDIAN SPRINGS, USA:36.5869:W115.673 +WINSTON-SALEM, USA:36.1336:W80.2219 +IMPERIAL, USA:32.8342:W115.579 +WILLIAMSPORT, USA:41.2419:W76.9211 +WILLISTON, USA:48.1778:W103.642 +ISLIP, USA:40.795:W73.1 +JACKSON, USA:32.3111:W90.0758 +JACKSONVILLE, USA:30.4939:W81.6878 +JONESBORO, USA:35.8317:W90.6461 +NEW YORK, USA:40.6397:W73.7789 +LANSING, USA:42.7786:W84.5872 +LAS VEGAS, USA:36.0803:W115.152 +LOS ANGELES, USA:33.9425:W118.408 +LUBBOCK, USA:33.6636:W101.823 +LAKE CHARLES, USA:30.1261:W93.2233 +COLUMBUS, USA:39.8136:W82.9278 +HAMPTON, USA:37.0828:W76.3603 +LUFKIN, USA:31.2339:W94.75 +LAFAYETTE, USA:30.2053:W91.9875 +NEW YORK, USA:40.7772:W73.8725 +LONG BEACH, USA:33.8175:W118.151 +WRIGHT, USA:31.8889:W81.5622 +LITTLE ROCK, USA:34.7294:W92.2242 +WEST PALM BEACH, USA:26.5928:W80.085 +LINCOLN, USA:40.8508:W96.7592 +LOUISVILLE, USA:38.2278:W85.6636 +LAREDO, USA:27.5436:W99.4614 +JACKSONVILLE, USA:34.9181:W92.1464 +FORT BENNING, USA:32.3372:W84.9911 +LAS VEGAS, USA:36.2361:W115.034 +ALTUS, USA:34.6669:W99.2667 +PHOENIX, USA:33.535:W112.383 +CINCINNATI, USA:39.1033:W84.4186 +MIDLAND, USA:31.9425:W102.202 +SACRAMENTO, USA:38.6675:W121.401 +TAMPA, USA:27.8492:W82.5211 +KANSAS CITY, USA:39.2975:W94.7139 +MACON, USA:32.6928:W83.6492 +ORLANDO, USA:28.4289:W81.3158 +HARRISBURG, USA:40.1933:W76.7633 +CHICAGO, USA:41.7858:W87.7522 +MEMPHIS, USA:35.0422:W89.9767 +MERCED, USA:37.3803:W120.568 +MCALLEN, USA:26.1758:W98.2386 +MARIETTA, USA:33.9153:W84.5161 +SACRAMENTO, USA:38.5539:W121.297 +MIAMI, USA:25.7931:W80.2906 +MINOT, USA:48.4156:W101.357 +MILLVILLE, USA:39.3678:W75.0722 +MILWAUKEE, USA:42.9472:W87.8964 +JACKSON, USA:35.5997:W88.9156 +MUSKOGEE, USA:35.6575:W95.3614 +MELBOURNE, USA:28.1025:W80.645 +MCALESTER, USA:34.8822:W95.7833 +MILLINOCKET, USA:45.6478:W68.6856 +MONROE, USA:32.5108:W92.0375 +MACKMINNVILLE, USA:45.1944:W123.136 +MACON, USA:45.1264:W87.6383 +MOBILE, USA:30.6914:W88.2428 +MODESTO, USA:37.6256:W120.954 +MINOT, USA:48.2592:W101.28 +MONTPELIER, USA:44.2033:W72.5622 +MARQUETTE, USA:46.5339:W87.5617 +MADISON, USA:43.1397:W89.3375 +MINNEAPOLIS, USA:44.8803:W93.2167 +MASSENA, USA:44.9358:W74.8453 +NEW ORLEANS, USA:29.9933:W90.2578 +MOUNT CLEMENS, USA:42.6128:W82.8317 +MUIR, USA:40.4347:W76.5692 +MOUNTAIN HOME, USA:43.0433:W115.872 +GRANT COUNTY AIRPORT, USA:47.2075:W119.32 +MINERAL WELLS, USA:32.7814:W98.06 +MONTGOMERY, USA:32.3792:W86.3625 +MYRTLE BEACH, USA:33.6797:W78.9283 +BEAUFORT, USA:32.4772:W80.7231 +NEW ORLEANS, USA:29.8253:W90.035 +JACKSONVILLE, USA:34.7083:W77.4394 +LAKEHURST, USA:40.0333:W74.3533 +FALLON, USA:39.4164:W118.701 +NORFOLK, USA:36.9375:W76.2892 +PATUXENT RIVER, USA:38.2858:W76.4117 +CHINA, USA:35.6878:W117.691 +JACKSONVILLE, USA:30.2358:W81.6806 +EL CENTRO, USA:32.8292:W115.672 +CHERRY POINT, USA:34.9025:W76.8808 +MIRAMAR, USA:32.8683:W117.143 +LEMOORE, USA:36.3328:W119.952 +MERIDIAN, USA:32.5519:W88.5556 +PORT ANGELES, USA:48.1414:W123.414 +PENSACOLA, USA:30.3525:W87.3186 +MILLINGTON, USA:35.3567:W89.8703 +KINGSVILLE, USA:27.5072:W97.8097 +KEY WEST, USA:24.5758:W81.6889 +MILTON, USA:30.7242:W87.0219 +POINT MUGU, USA:34.1203:W119.121 +TUSTIN, USA:33.7061:W117.827 +OCEANA, USA:36.8206:W76.0333 +MOUNTAIN VIEW, USA:37.415:W122.048 +WHIDBEY ISLAND, USA:48.3517:W122.656 +TWENTY NINE PALMS, USA:34.2961:W116.162 +WILLOW GROVE, USA:40.1997:W75.1481 +QUANTICO, USA:38.5017:W77.3053 +JACKSONVILLE, USA:30.2186:W81.8764 +SAN DIEGO, USA:32.6992:W117.215 +OAKLAND, USA:37.7211:W122.221 +OMAHA, USA:41.1183:W95.9125 +OGDENSBURG, USA:44.6819:W75.4656 +OKLAHOMA CITY, USA:35.3931:W97.6006 +NOGALES, USA:31.4175:W110.848 +OMAHA, USA:41.3025:W95.8936 +ONTARIO, USA:34.0558:W117.601 +MIAMI, USA:25.9069:W80.2783 +CHICAGO, USA:41.9794:W87.9044 +NORFOLK, USA:36.8944:W76.2011 +ORLANDO, USA:28.5453:W81.3328 +OSCODA, USA:44.4514:W83.3939 +EVERETT, USA:47.9061:W122.281 +PANAMA CITY, USA:30.0697:W85.5764 +PINE BLUFF, USA:34.1747:W91.9344 +PLATTSBURGH, USA:44.6508:W73.4681 +WEST PALM BEACH, USA:26.6831:W80.0956 +PORTLAND, USA:45.5886:W122.597 +NEWPORT NEWS, USA:37.1317:W76.4928 +PHILADELPHIA, USA:39.8719:W75.2411 +PORT HURON, USA:42.9108:W82.5286 +PHOENIX, USA:33.4342:W112.008 +ST. PETERSBURG, USA:27.9106:W82.6872 +PITTSBURGH (PENNSYLVA), USA:40.4914:W80.2328 +PEMBINA, USA:48.9425:W97.2408 +PALMDALE, USA:34.6292:W118.084 +PONCA CITY, USA:36.7306:W97.0997 +PHILADELPHIA, USA:40.0819:W75.0106 +PRINCETON, USA:45.5597:W93.6081 +PENSACOLA, USA:30.4731:W87.1872 +FAYETTEVILLE, USA:35.1708:W79.0144 +FORT POLK, USA:31.0447:W93.1914 +PRESQUE ISLE, USA:46.6889:W68.0447 +PRESCOTT, USA:34.6544:W112.419 +PALM SPRINGS, USA:33.8294:W116.507 +PALACIOS, USA:28.7275:W96.2508 +PUEBLO MEMORIAL, USA:38.2889:W104.496 +PROVIDENCE, USA:41.7239:W71.4281 +PORTLAND, USA:43.6461:W70.3086 +RIVERSIDE, USA:33.9517:W117.445 +ROBINSON, USA:34.85:W92.3 +RAPID CITY, USA:44.145:W103.103 +RED RIVER, USA:47.9608:W97.4011 +RALEIGH-DURHAM, USA:35.8775:W78.7872 +RICHMOND, USA:37.505:W77.3194 +RANCHO MURIETA, USA:38.4886:W121.102 +RIVERSIDE, USA:33.8806:W117.259 +ROME, USA:43.2336:W75.4069 +SAN ANTONIO, USA:29.5294:W98.2789 +RENO, USA:39.4983:W119.768 +ROCHESTER, USA:43.1186:W77.6722 +ROSWELL, USA:33.3014:W104.531 +FORT MYERS, USA:26.5361:W81.755 +SACRAMENTO, USA:38.5125:W121.493 +SANTA FE, USA:35.6167:W106.088 +SAN DIEGO, USA:32.7333:W117.189 +SAN ANTONIO, USA:29.5336:W98.4697 +SAVANNAH, USA:32.1275:W81.2019 +GWINN, USA:46.3536:W87.3958 +SANTA BARBARA, USA:32.6083:W82.3686 +SALISBURY, USA:38.3403:W75.5103 +STOCKTON, USA:37.8942:W121.239 +SEATTLE, USA:47.4489:W122.309 +SELMA, USA:32.3439:W86.9878 +SPOKANE, USA:47.6828:W117.322 +SAN FRANCISCO, USA:37.6189:W122.375 +SMITHFIELD, USA:41.9206:W71.4911 +SHREVEPORT, USA:32.4464:W93.8256 +SAN JOSE, USA:37.3617:W121.929 +SAN ANGELO, USA:31.3575:W100.496 +SPOKANE, USA:47.615:W117.656 +SAN ANTONIO, USA:29.3842:W98.5808 +SANDUSKY, USA:41.4333:W82.6522 +SALT LAKE CITY, USA:40.7883:W111.978 +SACRAMENTO, USA:38.6953:W121.591 +SANTA ANA, USA:33.6756:W117.868 +SAN LUIS, USA:45.7725:W122.862 +ST. PETERSBURG, USA:27.765:W82.6269 +WICHITA FALLS, USA:33.9886:W98.4917 +SUMTER, USA:33.9728:W80.4728 +ST. LOUIS, USA:38.7475:W90.3597 +FAIRFIELD, USA:38.2625:W121.927 +SIOUX CITY, USA:42.4025:W96.3842 +HUNTER AAF, USA:32.01:W81.1456 +NEWBURGH, USA:41.5039:W74.1047 +SYRACUSE, USA:43.1111:W76.1061 +KNOBNOSTER, USA:38.7303:W93.5478 +FORT LEONARDWOOD, USA:37.7414:W92.1406 +TUCUMCARI, USA:35.1828:W103.603 +TACOMA, USA:47.1375:W122.476 +TRUTH OR CONSEQUENCES, USA:33.2369:W107.272 +TETERBORO, USA:40.8497:W74.0608 +OKLAHOMA CITY, USA:35.4147:W97.3864 +TALLAHASSEE, USA:30.3964:W84.3503 +KENDALL-TAMIAMI, USA:25.6478:W80.4328 +MIAMI, USA:25.8617:W80.8969 +TONOPAH, USA:37.7944:W116.779 +TAMPA, USA:27.9753:W82.5331 +TRENTON, USA:40.2767:W74.8133 +TULSA, USA:36.1983:W95.8881 +TUCSON, USA:32.1161:W110.941 +TEXARKANA, USA:33.4536:W93.9908 +TYLER, USA:32.3539:W95.4022 +KNOXVILLE, USA:35.8122:W83.9928 +CHICAGO, USA:42.4219:W87.8678 +VALDOSTA, USA:30.9678:W83.1928 +LOMPOC, USA:34.7294:W120.577 +VICTORVILLE, USA:34.5931:W117.379 +VALPARAISO, USA:30.4831:W86.5253 +VERO BEACH, USA:27.6556:W80.4178 +WALLOPS ISLAND, USA:37.94:W75.4664 +MACON, USA:32.64:W83.5917 +WRIGHTSTOWN, USA:40.0156:W74.5936 +WHITE SANDS, USA:32.3414:W106.403 +WILDWOOD, USA:39.0083:W74.9081 +DETROIT, USA:42.2378:W83.5303 +YOUNGSTOWN, USA:41.2606:W80.6789 +YUMA, USA:32.6564:W114.606 +ZUNI PUEBLO, USA:35.0833:W108.792 +TIRANA, ALBANIA:41.4147:19.7206 +BOURGAS, BULGARIA:42.5689:27.5139 +GORNA ORECHOVICA, BULGARIA:43.1514:25.7128 +PLOVDIV, BULGARIA:42.0678:24.8508 +SOFIA, BULGARIA:42.695:23.4061 +STARA ZAGORA, BULGARIA:42.3767:25.655 +VARNA, BULGARIA:43.2319:27.825 +LARNACA, CYPRUS:34.875:33.6247 +PAPHOS, CYPRUS:34.7178:32.4856 +AKROTIRI, CYPRUS:34.5903:32.9878 +DUBROVNIK, CROATIA:42.5611:18.2681 +CEPIN, CROATIA:45.5419:18.6361 +OSIJEK, CROATIA:45.4625:18.8114 +PULA, CROATIA:44.8933:13.9219 +GROBNIK, CROATIA:45.3794:14.5036 +RIJEKA, CROATIA:45.2167:14.57 +SPLIT, CROATIA:43.5389:16.2978 +VARAZDIN, CROATIA:46.2947:16.3811 +ZAGREB, CROATIA:45.7428:16.0686 +ZADAR, CROATIA:44.1081:15.3467 +UDBINA, CROATIA:44.5575:15.7742 +ALBACETE, SPAIN:38.9483:W1.86333 +ALICANTE, SPAIN:38.2819:W0.558056 +ALMERIA, SPAIN:36.8439:W2.37 +AVILES, SPAIN:43.5633:W6.03444 +CORDOBA, SPAIN:37.8419:W4.84861 +BILBAO, SPAIN:43.3008:W2.91056 +BURGOS, SPAIN:42.3575:W3.62056 +BARCELONA, SPAIN:41.2969:2.07833 +BADAJOZ, SPAIN:38.8911:W6.82111 +LA CORUNA, SPAIN:43.3019:W8.37722 +GRANADA, SPAIN:37.1331:W3.63556 +GERONA, SPAIN:41.9008:2.76028 +GRANADA, SPAIN:37.1886:W3.77722 +MADRID, SPAIN:40.2939:W3.72361 +IBIZA, SPAIN:38.8728:1.37306 +JEREZ, SPAIN:36.7444:W6.06 +MURCIA, SPAIN:37.7747:W0.812222 +LEON, SPAIN:42.5889:W5.65556 +MADRID, SPAIN:40.4722:W3.56083 +MALAGA, SPAIN:36.6736:W4.49889 +MENORCA, SPAIN:39.8625:4.21861 +MADRID, SPAIN:40.4167:W3.5 +SEVILLA, SPAIN:37.1747:W5.61583 +OCANA, SPAIN:39.9375:W3.50333 +PALMA DE MALLORCA, SPAIN:39.55:2.73333 +PAMPLONA, SPAIN:42.77:W1.64611 +MURCIA, SPAIN:37.9511:W1.23028 +REUS, SPAIN:41.1472:1.16694 +ROTA, SPAIN:36.645:W6.34944 +SALAMANCA, SPAIN:40.9519:W5.50194 +SON BONET, SPAIN:39.5989:2.70278 +PALMA DE MALLORCA, SPAIN:39.5517:2.73861 +SAN LUIS, SPAIN:39.8622:4.25833 +SAN SEBASTIAN, SPAIN:43.3564:W1.79056 +SANTIAGO, SPAIN:42.8961:W8.415 +SEO DE URGEL, SPAIN:42.3386:1.40917 +MADRID, SPAIN:40.4867:W3.45806 +VALENCIA, SPAIN:39.4892:W0.481389 +VALLADOLID, SPAIN:41.7061:W4.85194 +MADRID, SPAIN:40.3706:W3.785 +VITORIA, SPAIN:42.8828:W2.72444 +VIGO, SPAIN:42.2317:W8.62667 +SANTANDER, SPAIN:43.4269:W3.82 +ZARAGOZA, SPAIN:41.6661:W1.04139 +SEVILLA, SPAIN:37.4178:W5.89306 +CALAIS, FRANCE:50.9619:1.95472 +PERONNE, FRANCE:49.8689:3.02778 +NANGIS, FRANCE:48.5936:3.005 +BAGNOLE-DE-L'ORNE, FRANCE:48.5458:W0.387222 +ALBERT, FRANCE:49.9714:2.69972 +LE TOURQUET, FRANCE:50.5147:1.62722 +VALENCIENNES, FRANCE:50.3256:3.46111 +AMIENS, FRANCE:49.8714:2.38639 +AGEN, FRANCE:44.1747:0.590556 +CAZAUX, FRANCE:44.5333:W1.125 +BORDEAUX, FRANCE:44.8283:W0.715556 +BERGERAC, FRANCE:44.8253:0.518611 +TOULOUSE, FRANCE:43.5456:1.3675 +COGNAC, FRANCE:45.6583:W0.3175 +POITIERS, FRANCE:46.5875:0.306667 +MONTLUCON-GUERET, FRANCE:46.2244:2.36306 +LIMOGES, FRANCE:45.8628:1.17944 +MONT-DE-MARSAN, FRANCE:43.9117:W0.5075 +NIORT, FRANCE:46.3111:W0.401389 +TOULOUSE, FRANCE:43.6289:1.36361 +PAU, FRANCE:43.38:W0.418611 +LA ROCHELLE, FRANCE:43.4489:1.26333 +TARBES, FRANCE:43.1786:W0.00638889 +ANGOULEME, FRANCE:45.7292:0.221389 +BRIVE, FRANCE:45.1508:1.46917 +PERIGUEUX, FRANCE:45.1981:0.815556 +BIARRITZ-BAYONNE, FRANCE:43.4683:W1.52306 +CAHORS, FRANCE:44.3511:1.47528 +ST.-GIRONS, FRANCE:43.0075:1.10306 +ARCACHON, FRANCE:44.5964:W1.11083 +ALBI, FRANCE:43.9136:2.11306 +CASTRES, FRANCE:43.5561:2.28917 +TOULOUSE, FRANCE:43.5861:1.49917 +MILLAU, FRANCE:43.99:3.18306 +RODEZ, FRANCE:44.4078:2.4825 +USSEL, FRANCE:45.5347:2.42389 +VILLENEUVE-SUR-LOT, FRANCE:44.3969:0.758889 +ROYAN, FRANCE:45.6281:W0.9725 +MIMIZAN, FRANCE:44.1461:W1.17444 +AIRE-SUR-L'ADOUR, FRANCE:43.7094:W0.245278 +MONTAUBAN, FRANCE:44.0256:1.37778 +AUCH, FRANCE:43.6878:0.601667 +LIBOURNE, FRANCE:44.9822:W0.134722 +PAMIERS, FRANCE:43.0906:1.69583 +MARMANDE, FRANCE:44.4989:0.200278 +ROCHEFORT, FRANCE:45.8878:W0.983056 +OUESSANT, FRANCE:48.4628:W5.06389 +PONTIVY, FRANCE:48.0583:W2.92167 +GUISCRIFF-SCAER, FRANCE:48.0525:W3.66444 +ILE D'YEU, FRANCE:46.7186:W2.39111 +ANCENIS, FRANCE:47.4081:W1.1775 +BRIENNE-LE CHATEAU, FRANCE:48.4297:4.48111 +COLMAR, FRANCE:48.1097:7.35889 +BEAUNE, FRANCE:47.0058:4.89333 +DOLE, FRANCE:47.0389:5.42722 +JOIGNY, FRANCE:47.9922:3.39222 +VERDUN, FRANCE:49.1222:5.46889 +AUBENAS-VALS-LANAS, FRANCE:44.5442:4.37194 +LE PUY, FRANCE:45.0794:3.76472 +ST.-FLOUR, FRANCE:45.0764:2.99361 +BOURG, FRANCE:46.2008:5.29194 +VILEFRANCE, FRANCE:45.9164:4.64056 +MOULINS, FRANCE:46.5344:3.42361 +CASSAGNES-BEGHONES, FRANCE:44.1775:2.515 +TOULOUSE, FRANCE:43.5689:1.48083 +METZ, FRANCE:48.9822:6.25361 +BASTIA, CORSE ISL.:42.5539:9.48333 +CALVI, CORSE ISL.:42.5306:8.79306 +FIGARI, CORSE ISL.:41.5006:9.09778 +AJACCIO, CORSE ISL.:41.9236:8.80278 +PROPRIANO, FRANCE:41.6631:8.89028 +SOLENZARA, CORSE ISL.:41.9242:9.40583 +CORTE, FRANCE:42.2936:9.19306 +AUXERRE, FRANCE:47.85:3.49694 +CHAMBERY, FRANCE:45.6378:5.88 +CLERMONT FERRAND, FRANCE:45.7864:3.16917 +BOURGES, FRANCE:47.0581:2.37028 +CHAMBERY, FRANCE:45.5608:5.97556 +CHALON, FRANCE:46.8258:4.8175 +ANNEMASSE, FRANCE:46.1919:6.26833 +LYON, FRANCE:45.7261:5.09083 +MACON, FRANCE:46.295:4.79556 +ST.-YAN, FRANCE:46.4125:4.01306 +ROANNE, FRANCE:46.0583:4.00139 +ANNECY, FRANCE:45.9292:6.09861 +GRENOBLE, FRANCE:45.3628:5.32917 +MONTLUCON, FRANCE:46.3525:2.57028 +VALENCE, FRANCE:44.9214:4.96972 +VICHY, FRANCE:46.1694:3.40361 +AURILLAC, FRANCE:44.8914:2.42194 +CHATEAUROUX, FRANCE:46.8619:1.73056 +LYON, FRANCE:45.7281:4.94472 +AIX-LES-MILLES, FRANCE:43.5053:5.36778 +LE LUC, FRANCE:43.3844:6.38694 +CANNES, FRANCE:43.5419:6.95333 +ST.-ETIENNE, FRANCE:45.5403:4.29639 +ISTRES, FRANCE:43.5225:4.92361 +CARCASSONNE, FRANCE:43.2158:2.30611 +MARSEILLE, FRANCE:43.4356:5.21361 +NICE, FRANCE:43.6606:7.2175 +ORANGE, FRANCE:44.1403:4.86667 +PERPIGNAN, FRANCE:42.7403:2.87056 +LE CASTELLET, FRANCE:43.2525:5.785 +ALES, FRANCE:44.0694:4.14194 +MONTPELLIER, FRANCE:43.5761:3.96278 +BEZIERS, FRANCE:43.3239:3.35556 +AVIGNON, FRANCE:43.9072:4.90167 +SALON, FRANCE:43.6064:5.10917 +LEZIGNAN-CORBIERES, FRANCE:43.1758:2.73417 +MENDE, FRANCE:44.5019:3.53278 +CARPENTRAS, FRANCE:44.0297:5.07806 +AVORD, FRANCE:47.0533:2.6325 +BEAUVAIS, FRANCE:49.4544:2.11278 +CHATEAUDUN, FRANCE:48.0581:1.37639 +SAUMUR, FRANCE:47.2567:W0.115 +EVREUX, FRANCE:49.0286:1.21972 +LE HAVRE, FRANCE:49.5339:0.0880556 +ABBEVILLE, FRANCE:50.1433:1.83167 +ORLEANS, FRANCE:47.9878:1.76056 +CHALONS, FRANCE:48.7758:4.18444 +ROUEN, FRANCE:49.3842:1.17472 +TOURS, FRANCE:47.4322:0.7275 +CHOLET, FRANCE:47.0819:W0.876944 +LAVAL, FRANCE:48.0311:W0.742778 +ORLEANS, FRANCE:47.8969:2.16333 +PARIS, FRANCE:48.9694:2.44139 +CREIL, FRANCE:49.2533:2.51889 +PARIS, FRANCE:49.0128:2.55 +COULOMMIERS, FRANCE:48.8375:3.01611 +MELUN, FRANCE:48.6047:2.67111 +TOUSSOUS-LE-NOBLE, FRANCE:48.7517:2.10611 +PARIS, FRANCE:48.7253:2.35944 +PONTOISE, FRANCE:49.0964:2.04083 +VILLACOUBLAY, FRANCE:48.7742:2.20139 +BRETIGNY-SUR-ORGE, FRANCE:48.5967:2.33139 +REIMS, FRANCE:49.2078:4.15667 +TROYES, FRANCE:48.3228:4.01778 +LUNEVILLE, FRANCE:48.5972:6.54472 +ETAIN, FRANCE:49.2267:5.67194 +AUTUN, FRANCE:46.9664:4.26028 +NEVERS, FRANCE:47.0011:3.11444 +CAMBRAI, FRANCE:50.2217:3.15417 +MAUBEUGE, FRANCE:50.3103:4.03306 +BESANCON-LA-VEZE, FRANCE:47.2083:6.08306 +PHALSBOURG, FRANCE:48.7661:7.20028 +LILLE, FRANCE:50.5617:3.08944 +MERVILLE, FRANCE:50.6183:2.64222 +CHARLEVILLE, FRANCE:49.7839:4.64694 +VESOUL-FROTEY, FRANCE:47.6375:6.20389 +ANGERS, FRANCE:47.4972:W0.5725 +BREST, FRANCE:48.4478:W4.41833 +CHERBOURG, FRANCE:49.65:W1.47028 +DINARD, FRANCE:48.5878:W2.08 +LA BAULE, FRANCE:47.2894:W2.34639 +GRANVILLE, FRANCE:48.8831:W1.56417 +DEAUVILLE, FRANCE:49.3653:0.154167 +LORIENT, FRANCE:47.7606:W3.44 +LA ROCHE-SUR-YON, FRANCE:46.7019:W1.37861 +LANDIVISIAU, FRANCE:48.53:W4.15139 +CAEN, FRANCE:49.1733:W0.45 +LANVEDOC, FRANCE:48.2817:W4.445 +LE MANS, FRANCE:47.9486:0.201667 +RENNES, FRANCE:48.0694:W1.73472 +LANNION, FRANCE:48.7542:W3.47139 +QUIMPER, FRANCE:47.9747:W4.16778 +NANTES, FRANCE:47.1531:W1.61056 +ST.-BRIEUC ARMOR, FRANCE:48.5378:W2.85444 +MORLAIX, FRANCE:48.6031:W3.81556 +VANNES, FRANCE:47.7231:W2.71833 +ST.-NAZAIRE, FRANCE:47.3119:W2.14917 +MULHOUSE, FRANCE:47.5894:7.52972 +COLMAR, FRANCE:47.9219:7.39944 +DIJON, FRANCE:47.2689:5.09 +METZ, FRANCE:49.0717:6.13167 +EPINAL, FRANCE:48.3247:6.06972 +HAGUENAU, FRANCE:48.7933:7.81611 +ST.-DIZIER, FRANCE:48.6358:4.89917 +TOUL, FRANCE:48.78:5.97972 +MONTBELIARD, FRANCE:47.4869:6.7925 +NANCY, FRANCE:48.6919:6.23028 +NANCY, FRANCE:48.5831:5.955 +PONTARLIER, FRANCE:46.9044:6.32694 +REIMS, FRANCE:49.31:4.05 +STRASSBOURG, FRANCE:48.5381:7.62806 +LUXEUIL, FRANCE:47.7831:6.36389 +CUERS, FRANCE:43.2478:6.12667 +HYERES, FRANCE:43.0972:6.14583 +NIMES, FRANCE:43.7572:4.41611 +MIQUELON, FRANCE:47.0953:W56.3803 +ST.-PIERRE, ST. PIERRE & MIQUELON:46.7625:W56.1753 +AMBERIEU, FRANCE:45.9872:5.32833 +APT, FRANCE:44.0567:5.49528 +DAMBLAIN, FRANCE:48.0847:5.665 +CAMBRAI, FRANCE:50.1414:3.26306 +BROYE-LES-PESMES, FRANCE:47.335:5.51361 +LURE, FRANCE:47.7044:6.54583 +ST.-SIMON, FRANCE:49.7583:3.21194 +ANDRAVIDA, GREECE:37.9206:21.2925 +AGRINION, GREECE:38.6019:21.3511 +ALEXANDROUPOLIS, GREECE:40.8558:25.9561 +ATHENS, GREECE:37.8878:23.7317 +ALEXANDRIA, GREECE:40.6511:22.4886 +NEA ANGHIALOS, GREECE:39.2194:22.7942 +ELEFSIS, GREECE:38.0636:23.5558 +CHIOS, GREECE:38.3431:26.1406 +IOANNINA, GREECE:39.6964:20.8225 +HERAKLION, GREECE:35.3394:25.1803 +KASTORIA, GREECE:40.4494:21.2761 +KITHIRA, GREECE:36.2742:23.0169 +KEFFALLINIA, GREECE:38.1197:20.5006 +KALAMATA, GREECE:37.0683:22.0256 +KAVALA, GREECE:40.9722:24.3417 +KOS, GREECE:36.7933:27.0917 +KARPATHOS, GREECE:35.4214:27.1458 +KERKYRA/CORFU, GREECE:39.6019:19.9117 +KASOS, GREECE:35.4211:26.91 +KAVALA, GREECE:40.9131:24.6192 +KOZANI, GREECE:40.2861:21.8408 +LEROS, GREECE:37.1847:26.8003 +LIMNOS, GREECE:39.9169:25.2361 +LARISSA, GREECE:39.65:22.4653 +MEGARA, GREECE:37.9811:23.3653 +MYKONOS, GREECE:37.435:25.3481 +MARATHON, GREECE:38.145:24.0142 +MYTILINI, GREECE:39.0567:26.5983 +PREVEZA, GREECE:38.9253:20.7653 +RHODOS, GREECE:36.3831:28.1089 +RHODOS, GREECE:36.4053:28.0861 +PATRAS, GREECE:38.1511:21.4256 +CHANIA, GREECE:35.5317:24.1494 +SKIATHOS, GREECE:39.1769:23.5036 +SAMOS, GREECE:37.69:26.9117 +SYROS, GREECE:37.4228:24.9508 +SPARTI, GREECE:36.9733:22.5261 +SANTORINI, GREECE:36.4003:25.4786 +SITIA, GREECE:35.2136:26.0975 +STEFANOVIKION, GREECE:39.48:22.7672 +SKIROS, GREECE:38.9675:24.4872 +TANAGRA, GREECE:38.3397:23.5647 +KASTELI, GREECE:35.1869:25.3267 +TRIPOLIS, GREECE:37.5308:22.405 +THESSALONIKI, GREECE:40.5197:22.9708 +DEKELIA, GREECE:38.1089:23.7836 +ZAKYNTHOS, GREECE:37.75:20.8819 +BUDAPEST, HUNGARY:47.4367:19.2556 +DEBRECEN, HUNGARY:47.4889:21.6153 +GODOLLO, HUNGARY:47.5708:19.3386 +KECSKEMET, HUNGARY:46.9175:19.7492 +KAPOSVAR, HUNGARY:46.3892:17.7314 +NYIRREGYHAZA, HUNGARY:47.9839:21.6922 +OCSENY, HUNGARY:46.3039:18.7692 +PAPA, HUNGARY:47.3639:17.5008 +AZENTKILYSZABADJA, HUNGARY:47.0778:17.9683 +SIOFOK, HUNGARY:46.8581:18.0956 +SARMELLEK, HUNGARY:46.6864:17.1589 +SZOLNOK, HUNGARY:47.1228:20.2353 +TASZAR, HUNGARY:46.3931:17.9172 +TOKOL, HUNGARY:47.3453:18.9808 +AMENDOLA, ITALY:41.5386:15.7133 +CROTONE, ITALY:38.9972:17.08 +BARI, ITALY:41.1383:16.7606 +FOGGIA, ITALY:41.4328:15.535 +GROTTAGLIE, ITALY:40.5161:17.4022 +LECCE, ITALY:40.2386:18.1331 +PESCARA, ITALY:42.4314:14.1808 +BRINDISI, ITALY:40.6575:17.9469 +GIOIA DEL COLLE, ITALY:40.7678:16.9333 +LAMEZIA, ITALY:38.9064:16.2422 +CATANIA, ITALY:37.4667:15.0661 +LAMPEDUSA, ITALY:35.4978:12.6181 +PANTELLERIA, ITALY:36.8164:11.9686 +PALERMO, ITALY:38.1758:13.0908 +PALERMO, ITALY:38.1108:13.3133 +REGGIO CALABRIA, ITALY:38.0711:15.6514 +TRAPANI, ITALY:37.9125:12.4881 +SIGONELLA, ITALY:37.4014:14.9222 +ALGHERO, ITALY:40.6319:8.29056 +DECIMOMANNU, ITALY:39.3542:8.97222 +CAGLIARI, ITALY:39.2514:9.05417 +OLBIA, ITALY:40.8986:9.5175 +TORTOLI, ITALY:39.9186:9.68278 +ROME, ITALY:40.4167:12.3333 +TURIN, ITALY:45.0861:7.60306 +MILANO, ITALY:45.5397:9.20222 +MILANO, ITALY:45.6314:8.72778 +BERGAMO, ITALY:45.6739:9.70417 +TORINO, ITALY:45.2006:7.64944 +ALBENGA, ITALY:44.0506:8.12722 +GENOA, ITALY:44.4119:8.84167 +MILAN, ITALY:45.4453:9.27694 +CAMERI, ITALY:45.5294:8.66917 +PARMA, ITALY:44.8244:10.2961 +PIACENZA, ITALY:44.9131:9.72333 +AOSTA, ITALY:45.7383:7.36778 +LEVALDIGI, ITALY:44.5464:7.62222 +AVIANO, ITALY:46.0317:12.5964 +BOLZANO, ITALY:46.4606:11.3261 +CERVIA, ITALY:44.2236:12.3061 +BOLOGNA, ITALY:44.5342:11.2903 +TREVISO, ITALY:45.6486:12.1953 +RIVOLTO, ITALY:45.9806:13.0544 +FORLI, ITALY:44.1947:12.07 +GHEDI, ITALY:45.4319:10.2675 +VERONA, ITALY:45.4719:10.9278 +MONTICHIARI, ITALY:45.4289:10.3306 +RONCHI DE LEGIONARI, ITALY:45.8278:13.4664 +RIMINI, ITALY:44.0203:12.6119 +TREVISO, ITALY:45.6844:12.0861 +VICENZA, ITALY:45.5742:11.5306 +PADOVA, ITALY:45.3956:11.8478 +VILLAFRANCA, ITALY:45.3956:10.8883 +VENICE, ITALY:45.505:12.3517 +SIENA, ITALY:43.2572:11.2542 +ROME, ITALY:41.7992:12.5947 +PRATICA DI MARE, ITALY:41.6536:12.4444 +ROME, ITALY:41.8128:12.2531 +GUIDONIA, ITALY:41.9903:12.7408 +SALERNO, ITALY:40.6203:14.9111 +MARINA DI CAMPO, ITALY:42.7603:10.2394 +LATINA, ITALY:41.5422:12.9089 +GRAZZANISE, ITALY:41.0608:14.0819 +NAPLES, ITALY:40.8858:14.2906 +PISA, ITALY:43.6839:10.3925 +FIRENZE, ITALY:43.8097:11.205 +GROSSETO, ITALY:42.7608:11.0722 +ROME, ITALY:41.9519:12.4989 +VITERBO, ITALY:42.4303:12.0642 +PERUGIA, ITALY:43.0958:12.5131 +CERKLJE, SLOVENIA:45.8997:15.53 +LJUBLIANA, SLOVENIA:46.2236:14.4575 +MARIBOR, SLOVENIA:46.4797:15.6861 +PORTOROZ, SLOVENIA:45.4733:13.6147 +SLOVENJ GRADEC, SLOVENIA:46.4719:15.1169 +CESKE BUDEJOVICE, CZECH REPUBLIC:48.9461:14.4272 +CHOTEBOR, CZECH REPUBLIC:49.6844:15.6761 +CASLAV, CZECH REPUBLIC:49.9394:15.3817 +HRADEC KRALOVE, CZECH REPUBLIC:50.2531:15.845 +PRAHA, CZECH REPUBLIC:50.1211:14.5436 +KUNOVICE, CZECH REPUBLIC:49.0294:17.4397 +KARLOVY VARY, CZECH REPUBLIC:50.2028:12.9147 +LINE, CZECH REPUBLIC:49.675:13.2744 +MNICHOVO HRADISTE, CZECH REPUBLIC:50.54:15.0064 +OSTRAVA, CZECH REPUBLIC:49.6964:18.1111 +NAMEST, CZECH REPUBLIC:49.1658:16.1247 +PARDUBICE, CZECH REPUBLIC:50.0133:15.7386 +PRIBRAM, CZECH REPUBLIC:49.7186:14.0969 +PREROV, CZECH REPUBLIC:49.4258:17.4047 +PRAGUE, CZECH REPUBLIC:50.1008:14.26 +SOBESLAV, CZECH REPUBLIC:49.2447:14.7136 +TURANY, CZECH REPUBLIC:49.1511:16.6942 +VODOCHODY, CZECH REPUBLIC:50.2164:14.3956 +TEL-AVIV, ISRAEL:32.0094:34.8767 +BEER-SHEBA, ISRAEL:31.2869:34.7228 +TEL-NOF, ISRAEL:31.8394:34.8217 +EYN-SHEMER, ISRAEL:32.4408:35.0061 +ELAT, ISRAEL:29.5611:34.96 +EYN-YAHAV, ISRAEL:30.6231:35.2019 +HAIFA, ISRAEL:32.8111:35.0439 +HAZTOR, ISRAEL:31.7625:34.7272 +ROSH PINA, ISRAEL:32.9808:35.5717 +JERUSALEM, ISRAEL:31.8667:35.2167 +TEL-AVIV FIR/CTA/UTA, ISRAEL:31.2286:35.1908 +MEGIDO AIRSTRIP, ISRAEL:32.5986:35.2283 +METZADA, ISRAEL:31.3281:35.3883 +NEVATIM, ISRAEL:31.2083:35.0122 +OVDA, ISRAEL:29.94:34.9358 +RAMAT DAVID, ISRAEL:32.6603:35.1822 +RAMON, ISRAEL:30.7761:34.6667 +TEL-AVIV, ISRAEL:32.1144:34.7819 +MALTA, MALTA:35.8572:14.4775 +MALTA ACC, MALTA:35.9167:14.4167 +WIENER NEUSTADT OST, AUSTRIA:47.8433:16.26 +WELS, AUSTRIA:48.1831:14.0408 +GRAZ, AUSTRIA:47:15.4333 +INNSBRUCK, AUSTRIA:47.26:11.3439 +KLAGENFURT, AUSTRIA:46.65:14.3333 +LINZ, AUSTRIA:48.2333:14.1833 +VIENNA, AUSTRIA:48:16.5 +SALZBURG, AUSTRIA:47.7931:13.0042 +VIENNA, AUSTRIA:48.1103:16.5697 +GRAZ, AUSTRIA:46.9908:15.4394 +KLAGENFURT, AUSTRIA:46.6425:14.3375 +LINZ, AUSTRIA:48.2331:14.1875 +LANGENLEBARN, AUSTRIA:48.3208:16.1117 +ZELTWEG, AUSTRIA:47.2028:14.7442 +ALVERCA, ACORES:38.8831:W9.03 +SANTA MARIA (ISLAND), ACORES:36.9714:W25.1706 +BRAGANCA, ACORES:41.8683:W6.71194 +BEJA (MADEIRA), ACORES:38.0789:W7.93222 +BRAGA, ACORES:41.5869:W8.445 +COIMBA, ACORES:40.1572:W8.47 +CASCAIS, ACORES:38.725:W9.355 +COVILHA, ACORES:40.2647:W7.47972 +EVORA, ACORES:38.5333:W7.88944 +FLORES (FLORES ISL.), ACORES:39.455:W31.1311 +FARO, ACORES:37.0142:W7.96583 +GRACIOSA ISLAND, ACORES:39.0919:W28.0297 +HORTA, ACORES:38.5197:W28.7158 +ESPINHO, PORTUGAL:40.9742:W8.64528 +LAJES (TERCEIRA ISLAND), ACORES:38.7642:W27.0933 +LISBON, PORTUGAL:38.7167:W9.15583 +MONTE REAL, ACORES:39.8311:W8.88722 +MONTIJO, ACORES:38.7036:W9.03583 +OVAR, PORTUGAL:40.9158:W8.64583 +PONTA DELGADA, ACORES:37.7411:W25.6978 +PICO, ACORES:38.5544:W28.4397 +PORTIMAO, ACORES:37.1492:W8.58389 +PORTO, ACORES:41.2481:W8.68139 +PORTO SANTO, MADEIRA:33.0733:W16.3497 +LISBON, PORTUGAL:38.7811:W9.13583 +SAO JORGE ISLAND, ACORES:38.6653:W28.1756 +SINTRA, ACORES:38.8308:W9.33944 +TANCOS, ACORES:39.475:W8.36444 +VILA REAL, ACORES:41.2742:W7.72028 +VISEU, ACORES:40.7253:W7.88889 +BANJA LUKA, BOSNIA-HERCEGOVINA:44.9414:17.2975 +MOSTAR, BOSNIA-HERCEGOVINA:43.2828:17.8458 +SARAJEVO, BOSNIA-HERCEGOVINA:43.8244:18.3314 +ARAD, ROMANIA:46.1764:21.2619 +BACAU, ROMANIA:46.5219:26.9103 +BAIA MARE, ROMANIA:47.6583:23.47 +BUCHAREST, ROMANIA:44.5031:26.1019 +CONSTANTA, ROMANIA:44.3622:28.4883 +CLUJ-NAPOCA, ROMANIA:46.785:23.6861 +CARANSEBES, ROMANIA:45.42:22.2533 +CRAIOVA, ROMANIA:44.3181:23.8886 +IASI, ROMANIA:47.1789:27.62 +ORADEA, ROMANIA:47.0253:21.9025 +BUCHAREST, ROMANIA:44.5736:26.1033 +SIBIU, ROMANIA:45.7856:24.0911 +SATU MARE, ROMANIA:47.7033:22.8856 +SUCEAVA, ROMANIA:47.6875:26.3539 +TULCEA, ROMANIA:45.0622:28.7142 +TIRGU MURES, ROMANIA:46.4675:24.4125 +TIMISOARA, ROMANIA:45.81:21.3378 +ZURICH AREA, SWITZERLAND:46.6136:7.67778 +LES EPLATURES, SWITZERLAND:47.0836:6.79278 +GENEVA, SWITZERLAND:46.2381:6.10889 +SAANEN, SWITZERLAND:46.4875:7.25083 +SION, SWITZERLAND:46.2194:7.32667 +ALPNACH, SWITZERLAND:46.9439:8.28417 +ULRICHEN, SWITZERLAND:46.5011:8.29556 +DUBENDORF, SWITZERLAND:47.3986:8.64806 +EMMEN, SWITZERLAND:47.0922:8.305 +MOLLIS, SWITZERLAND:47.0786:9.06472 +INTERLAKEN, SWITZERLAND:46.6764:7.87917 +TURTMANN, SWITZERLAND:46.3039:7.71444 +MEIRINGEN, SWITZERLAND:46.7433:8.11 +RARON, SWITZERLAND:46.3036:7.82333 +PAYERNE, SWITZERLAND:46.8431:6.915 +BUOCHS, SWITZERLAND:46.9747:8.39889 +ZURICH, SWITZERLAND:47.3833:8.56667 +LUGANO, SWITZERLAND:46.0042:8.91056 +BERN, SWITZERLAND:46.9139:7.49694 +GRENCHEN, SWITZERLAND:47.1814:7.41694 +ZURICH, SWITZERLAND:47.4647:8.54917 +ALTENRHEIN, SWITZERLAND:47.485:9.56056 +SAMEDAN, SWITZERLAND:46.5325:9.88278 +ANKARA ACC/FIR/FIC, TURKEY:40:32 +ANKARA, TURKEY:39.9347:32.7406 +ANKARA, TURKEY:40.1281:32.995 +ANKARA, TURKEY:39.9497:32.6886 +ANKARA, TURKEY:40.0789:32.5656 +ADANA, TURKEY:36.9819:35.2803 +ADANA, TURKEY:37.0019:35.4258 +AFYON, TURKEY:38.7261:30.6011 +ANTALYA, TURKEY:36.9014:30.7917 +GAZIANTEP, TURKEY:36.9481:37.4792 +ISKENDERUN, TURKEY:36.5733:36.1539 +KASTAMONU, TURKEY:41.3139:33.7958 +KONYA, TURKEY:37.9789:32.5617 +MERZIFON, TURKEY:40.8292:35.5219 +SAMSUN, TURKEY:41.2764:36.3036 +SIVAS, TURKEY:39.8136:36.9033 +ZONGULDAK, TURKEY:41.5158:32.0997 +MALATYA, TURKEY:38.4358:38.0917 +KAYSERI, TURKEY:38.7703:35.4953 +SIVRIHISAR, TURKEY:39.4514:31.3653 +TOKAT, TURKEY:40.305:36.3678 +EREGLI, TURKEY:41.2544:31.415 +DENIZLI, TURKEY:37.785:29.7011 +NEVSEHIR, TURKEY:38.7717:34.5342 +ISTANBUL, TURKEY:40.9767:28.8211 +AYDIN, TURKEY:37.8158:27.8861 +BURSA, TURKEY:40.2317:29.0092 +BALIKESIR, TURKEY:39.6189:27.9247 +BANDIRMA, TURKEY:40.3178:27.9775 +CANAKKALE, TURKEY:40.1375:26.4267 +ESKISEHIR, TURKEY:39.7839:30.5819 +IZMIR, TURKEY:38.2922:27.1569 +IZMIR, TURKEY:38.3192:27.1597 +IZMIR, TURKEY:38.5131:27.01 +ISPARTA, TURKEY:37.7853:30.5817 +KUTAHYA, TURKEY:39.4267:30.0164 +USAK, TURKEY:38.6811:29.4714 +YALOVA, TURKEY:40.6833:29.3786 +TOPEL, TURKEY:40.735:30.0831 +YENISEHIR, TURKEY:40.255:29.5625 +DALAMAN, TURKEY:36.7131:28.7925 +AKHISAR, TURKEY:38.8086:27.8336 +CORLU, TURKEY:41.1381:27.9189 +ISTANBUL, TURKEY:40.9928:29.2164 +ESKISSEHIR, TURKEY:39.8097:30.5194 +ELAZIG, TURKEY:38.6067:39.2914 +DIYABAKIR, TURKEY:37.8936:40.2006 +ERZINCAN, TURKEY:39.71:39.5261 +ERZURUM, TURKEY:39.9564:41.17 +KARS, TURKEY:40.5622:43.115 +TRABZON, TURKEY:40.995:39.7897 +SANLIURFA, TURKEY:37.0919:38.8461 +VAN, TURKEY:38.4681:43.3322 +BATMAN, TURKEY:37.9289:41.1161 +MUS, TURKEY:38.7544:41.6611 +SIIRT, TURKEY:37.9786:41.8403 +NINIOP, TURKEY:42.0189:35.0792 +IZMIR, TURKEY:38.5175:26.9772 +IZMIR, TURKEY:37.9506:27.3289 +SALTSY, MOLDOVA:47.8378:27.7811 +KICHINAU FIR/ACC/COM, MOLDOVA:46.9278:28.9314 +OHRID, FORMER MACEDONIA:41.1797:20.7422 +SKOPJE, FORMER MACEDONIA:41.9614:21.6214 +GIBRALTAR, GIBRALTAR:36.1508:W5.34944 +BEOGRAD, YUGOSLAVIA:44.8183:20.3089 +PODGORICA, YUGOSLAVIA:42.3592:19.2517 +PRISTINA, YUGOSLAVIA:42.5728:21.0358 +TIVAT, YUGOSLAVIA:42.4044:18.7231 +VRSAC, YUGOSLAVIA:45.1467:21.3097 +BRATISLAVA, SLOVAKIA:48.17:17.2125 +KOSICE, SLOVAKIA:48.6631:21.2411 +MALACKY, SLOVAKIA:48.4019:17.1183 +PIESTANY, SLOVAKIA:48.625:17.8283 +SLIAC, SLOVAKIA:48.6378:19.1339 +TRENCIN, SLOVAKIA:48.865:17.9922 +POPRAD, SLOVAKIA:49.0733:20.2408 +ZILINA, SLOVAKIA:49.2317:18.6136 +NORTH CAICOS, TURKS & CAICOS I.:21.9172:W71.9394 +PROVIDENCIALES, TURKS & CAICOS I.:21.7736:W72.2658 +SOUTH CAICOS, TURKS & CAICOS I.:21.5156:W71.5283 +SAMANA, DOMINICAN REPUBLIC:19.1986:W69.43 +BARAHONA, DOMINICAN REPUBLIC:18.2514:W71.1203 +CABO ROJO, DOMINICAN REPUBLIC:17.9289:W71.6447 +CONSTANZA, DOMINICAN REPUBLIC:18.9081:W70.72 +SANTO DOMINGO, DOMINICAN REPUBLIC:18.4711:W69.9689 +LA ROMANA, DOMINICAN REPUBLIC:18.4519:W68.9117 +PUNTA CANA, DOMINICAN REPUBLIC:18.5672:W68.3633 +PUERTO PLATA, DOMINICAN REPUBLIC:19.7572:W70.5697 +SANTO DOMINGO, DOMINICAN REPUBLIC:18.4294:W69.6686 +SAN ISIDORO, DOMINICAN REPUBLIC:18.5036:W69.7617 +SANTIAGO, DOMINICAN REPUBLIC:19.4092:W70.6164 +BANANERA, GUATEMALA:15.4733:W88.8372 +COBAN, GUATEMALA:15.4689:W90.4067 +GUATEMALA CITY, GUATEMALA:14.5831:W90.5275 +PUERTO BARRIOS, GUATEMALA:15.7308:W88.5836 +POPTUN, GUATEMALA:16.3261:W89.4169 +QUEZALTENANGO, GUATEMALA:14.8653:W91.5019 +RETALHULEU, ARGENTINA:14.5208:W91.6972 +SAN JOSE, GUATEMALA:13.9361:W90.8358 +ISLAS DEL CISNE, HONDURAS:17.4072:W83.9325 +LA CEIBA, HONDURAS:15.7422:W86.8533 +SAN PEDRO SULA, HONDURAS:15.4525:W87.9233 +GUANAJA, HONDURAS:16.4453:W85.9064 +PUERTO LEMPIRA, HONDURAS:15.2608:W83.7814 +ROATAN, HONDURAS:16.3167:W86.5225 +TELA, HONDURAS:15.7758:W87.4756 +TEGUCIGALPA, HONDURAS:14.0608:W87.2169 +TRUJILLO, HONDURAS:15.9267:W85.9381 +OCHO RIOS, JAMAICA:18.4042:W76.9689 +KINGSTON, JAMAICA:17.9356:W76.7875 +MONTEGO BAY, JAMAICA:18.5036:W77.9133 +PORT ANTONIO, JAMAICA:18.1986:W76.5344 +KINGSTON, JAMAICA:17.9883:W76.8236 +ACAPULCO, MEXICO:16.7567:W99.7533 +MONTERREY, MEXICO:25.8656:W100.237 +AGUASCALIENTES, MEXICO:21.7053:W102.318 +BAHIAS DEHUATULCO, MEXICO:15.7747:W96.2608 +CUERNAVACA, MEXICO:18.835:W99.2619 +CIUDAD ACUNA, BRAZIL:29.3319:W100.981 +CIUDAD DEL CARMEN, MEXICO:18.6536:W91.7989 +NUEVO CASAS GRANDES, MEXICO:30.3972:W107.875 +CHILPANCINGO, MEXICO:17.5736:W99.5142 +CULIACAN, MEXICO:24.7644:W107.474 +CHETUMAL, MEXICO:18.5044:W88.3267 +CIUDAD OBREGON, MEXICO:27.3925:W109.833 +CAMPECHE, MEXICO:19.8167:W90.5003 +CIUDAD JUAREZ, MEXICO:31.6361:W106.429 +CHIHUAHUA, MEXICO:28.7028:W105.964 +CIUDAD VICTORIA, MEXICO:23.7039:W98.9564 +CELAYA, MEXICO:20.5458:W100.886 +COZUMEL, MEXICO:20.5222:W86.9256 +CIUDAD MANTE, MEXICO:22.7403:W99.0181 +DURANGO, MEXICO:24.1242:W104.528 +TEPIC, MEXICO:21.4194:W104.843 +ENSENADA, MEXICO:31.7953:W116.602 +GUADALAJARA, MEXICO:20.5217:W103.311 +GUAYMAS, MEXICO:27.9689:W110.925 +TEHUACAN, MEXICO:18.4969:W97.4197 +HERMOSILLO, MEXICO:29.0958:W111.048 +COLIMA, MEXICO:19.2769:W103.577 +ISLA MUJERES, MEXICO:21.245:W86.7397 +SALTILLO, MEXICO:25.5494:W100.929 +IZTEPEC, MEXICO:16.4492:W95.0936 +JALAPA, MEXICO:19.475:W96.7975 +LAZARD CARDENAS, MEXICO:18.0017:W102.22 +LOS MOCHIS, MEXICO:25.685:W109.081 +DEL BAJIO, MEXICO:20.9933:W101.481 +LA PAZ, MEXICO:24.0725:W110.362 +LORETO, MEXICO:25.9892:W111.348 +MATAMOROS, MEXICO:25.7697:W97.5253 +MERIDA, MEXICO:20.9369:W89.6575 +MEXICALI, MEXICO:32.6306:W115.241 +MORELIA, MEXICO:19.8497:W101.025 +MINATITLAN, MEXICO:18.1033:W94.5806 +MONCLOVA, MEXICO:26.9556:W101.47 +MEXICO CITY, MEXICO:19.4361:W99.0719 +MONTERREY, MEXICO:25.7783:W100.107 +MAZATLAN, MEXICO:23.1611:W106.266 +NOGALES, MEXICO:31.2258:W110.976 +NUEVO LAREDO, MEXICO:27.4439:W99.5703 +OAXACA, MEXICO:16.9997:W96.7264 +POZA RICO, MEXICO:20.6025:W97.4608 +PUEBLA, MEXICO:19.1581:W98.3714 +PACHUCA, MEXICO:20.0772:W98.7822 +PUNTA PENASCO, MEXICO:31.3517:W113.526 +PIEDRAS NEGRAS, MEXICO:28.6272:W100.535 +URUAPAN, MEXICO:19.3967:W102.039 +PUERTO VALLARTA, MEXICO:20.68:W105.254 +PUERTO ESCONDIDO, MEXICO:15.8767:W97.0889 +QUERETARO, MEXICO:20.6239:W100.369 +REYNOSA, MEXICO:26.0089:W98.2283 +SAN JOSE DEL CABO, MEXICO:23.1517:W109.721 +SAN FILIPE, MEXICO:30.93:W114.809 +SAN LUIS POTOSI, MEXICO:22.2542:W100.931 +TLAXCALA, MEXICO:19.5364:W98.1733 +TORREON, MEXICO:25.5681:W103.411 +TUXTLA GUTIERREZ, MEXICO:16.7694:W93.3414 +TIJUANA, MEXICO:32.5408:W116.97 +TAMPICO, MEXICO:22.2964:W97.8658 +TAMUIN, MEXICO:22.0381:W98.8064 +TOLUCA, MEXICO:19.3369:W99.5658 +TAPACHULA, MEXICO:14.7942:W92.37 +TUXPAN, MEXICO:19.5983:W103.372 +CANCUN, MEXICO:21.0364:W86.8769 +VILLAHERMOSA, MEXICO:17.9969:W92.8172 +VERA CRUZ, MEXICO:19.1453:W96.1869 +ZACATECAS, MEXICO:22.8969:W102.687 +ZIHUATANEJO, MEXICO:17.6014:W101.46 +ZAMORA, MEXICO:20.045:W102.276 +MANZANILLO, MEXICO:19.1447:W104.559 +ZAPOPAN, MEXICO:20.7558:W103.465 +BLUEFIELDS, NICARAGUA:11.9889:W83.7742 +LOS BRASILES, NICARAGUA:12.1894:W86.3539 +LEON, NICARAGUA:12.4278:W86.9022 +MANAGUA, NICARAGUA:12.1411:W86.1681 +PUERTO CABEZAS, NICARAGUA:14.0469:W83.3867 +BOCAS DEL TORO, PANAMA:9.34083:W82.2508 +CHANGUINOLA, PANAMA:9.45861:W82.5167 +DAVID, PANAMA:8.39083:W82.4347 +HOWARD, PANAMA:8.91444:W79.5994 +JAQUE, PANAMA:7.51722:W78.1567 +LA PALMA, PANAMA:8.40667:W78.1417 +PANAMA, PANAMA:8.97333:W79.5556 +SANTIAGO, PANAMA:8.08556:W80.945 +PANAMA CITY, PANAMA:9.07111:W79.3833 +BUENOS AIRES, COSTA RICA:9.16694:W83.3325 +BARRA DEL COLORADO, COSTA RICA:10.7686:W83.5858 +COTO 47, COSTA RICA:8.60111:W82.97 +CABO VELAS, COSTA RICA:10.3556:W85.8528 +EL CARMEN, COSTA RICA:10.2019:W83.4719 +FINCA 10, COSTA RICA:8.91611:W83.5072 +FINCA 63, COSTA RICA:8.6525:W83.0653 +GOLFITO, COSTA RICA:8.65389:W83.1819 +GUAPILES, COSTA RICA:10.2172:W83.7947 +LIBERIA, COSTA RICA:10.5931:W85.5442 +LOS CHILES, COSTA RICA:11.0353:W84.7061 +LIMON, COSTA RICA:9.95778:W83.0219 +NOSARA BEACH, COSTA RICA:9.97639:W85.6528 +SAN JOSE, COSTA RICA:9.99361:W84.2086 +PANDORA, COSTA RICA:9.73194:W82.9831 +PALMAR SUR, COSTA RICA:8.95083:W83.4683 +SAN JOSE, COSTA RICA:9.95722:W84.1419 +QUEPOS, COSTA RICA:9.44306:W84.1297 +SANTA CLARA, COSTA RICA:10.2883:W83.7136 +SAN VITO DE JABA, COSTA RICA:8.82611:W82.9589 +SAN SALVADOR, EL SALVADOR:13.4406:W89.0558 +SAN SALVADOR, EL SALVADOR:13.7:W89.12 +CAP HAITIEN, HAITI:19.7325:W72.1947 +PORT-AU-PRINCE, HAITI:18.58:W72.2925 +BARACOA PLAYA, CUBA:20.3656:W74.5064 +BAYAMO, CUBA:20.3964:W76.6214 +CIEGO DE AVILA, CUBA:22.0269:W78.7894 +CAIBARIEN, CUBA:22.5064:W79.4697 +CUNAGUA, CUBA:22.4611:W78.3286 +CIENFUEGOS, CUBA:22.15:W80.4142 +CAYO, CUBA:21.6161:W81.5456 +CAMAGUEY, CUBA:21.4203:W77.8475 +SANTIAGO DE CUBA, CUBA:19.97:W75.8356 +FLORIDA, CUBA:21.4997:W78.2028 +GUANTANAMO, CUBA:19.9064:W75.2069 +GUANTANAMO, CUBA:20.0853:W75.1583 +HAVANA, CUBA:22.9892:W82.4092 +HOLGUIN, CUBA:20.7856:W76.315 +LA COLOMA, CUBA:22.3358:W83.6419 +MANAGUA, CUBA:22.9697:W82.2747 +MARIEL, CUBA:23.0072:W82.7675 +MOA, CUBA:20.6542:W74.9217 +MANZANILLO, CUBA:20.2881:W77.0892 +NICARO, CUBA:20.6886:W75.5314 +NUEVA GERONA, CUBA:21.8347:W82.7839 +BARACOA PLAYA, CUBA:23.0328:W82.5794 +PINAR DEL RIO NORTE, CUBA:22.4211:W83.6775 +SAN ANTONIO DE BANOS, CUBA:22.8714:W82.5092 +SANTA CLARA, CUBA:22.4919:W79.9436 +SAN JULIAN, CUBA:22.0953:W84.1519 +SANTA LUCIA, CUBA:21.5094:W77.0175 +SIGUANEA, CUBA:21.6425:W82.955 +SANCTI SPIRITUS, CUBA:21.9706:W79.4422 +TRINIDAD, CUBA:21.7883:W79.9972 +VARADERO, CUBA:23.0344:W81.4353 +LAS TUNAS, CUBA:20.9878:W76.9358 +CAYMAN BARAC, CAYMAN ISLANDS:19.6867:W79.8828 +GEORGETOWN, CAYMAN ISLANDS:19.2928:W81.3575 +CLARENCE BAIN, BAHAMAS:24.2875:W77.6844 +ANDROS TOWN, BAHAMAS:24.6978:W77.7956 +CONGO TOWN, BAHAMAS:24.1586:W77.5897 +MARSH HARBOR, BAHAMAS:26.5114:W77.0833 +SAN ANDROS, BAHAMAS:25.0536:W78.0489 +SPRING POINT, BAHAMAS:22.4417:W73.9708 +SANDY POINT, BAHAMAS:26.0044:W77.3953 +TREASURE CAY, BAHAMAS:26.7453:W77.3911 +CHUB CAY, BAHAMAS:25.4169:W77.8808 +BULLOCKS HARBOUR, BAHAMAS:25.7381:W77.84 +ALICE TOWN, BAHAMAS:25.6997:W79.2644 +ARTHUR'S TOWN, BAHAMAS:24.6292:W75.6736 +NEW BIGHT, BAHAMAS:24.315:W75.4539 +COLONEL HILL, BAHAMAS:22.7456:W74.1822 +GREAT EXUMA, BAHAMAS:23.5625:W75.8778 +NORTH ELEUTHERA, BAHAMAS:25.4756:W76.6811 +GOVERNOR'S HARBOR, BAHAMAS:25.2844:W76.3308 +NORMAN'S CAY, BAHAMAS:24.5944:W76.8319 +ROCK SOUND, BAHAMAS:24.8917:W76.1775 +STANIEL CAY, BAHAMAS:24.1689:W76.4389 +FREEPORT, BAHAMAS:26.5586:W78.6953 +WEST END, BAHAMAS:26.6861:W78.9775 +MATTHEW TOWN, BAHAMAS:20.975:W73.6667 +DEAD MAN'S CAY, BAHAMAS:23.1789:W75.0933 +STELLA MARIS, BAHAMAS:23.5828:W75.2686 +MAYAGUANA, BAHAMAS:22.3794:W73.0133 +NASSAU, BAHAMAS:25.0389:W77.4661 +DUNCAN TOWN, BAHAMAS:22.1817:W75.7294 +COCKBURN TOWN, BAHAMAS:24.0631:W74.5239 +BELIZE CITY, BELIZE:17.5389:W88.3081 +AITUTAKI, COOK ISLANDS:-18.825:W159.774 +AVARUA, COOK ISLANDS:-21.2025:W159.806 +NANDI, FIJI:-17.7544:177.443 +NAUSORI, FIJI:-18.0431:178.559 +LAMBASA, FIJI:-16.4667:179.34 +TONGATAPU, TONGA:-21.2408:W175.15 +HA'APAI, TONGA:-19.7769:W174.341 +VAVA'U, TONGA:-18.5853:W173.963 +FUNAFUTI, TUVALU ISLAND:-8.51667:179.217 +TARAWA, KIRIBATI:1.38139:173.147 +TABITEUEA NORTH, KIRIBATI:-1.22361:174.776 +ALOFI, NEW ZEALAND:-19.08:W169.926 +WALLIS, WALLIS & FUTUNA:-13.2381:W176.199 +FALEOLO, SAMOA:-13.8297:W172.008 +PAGO PAGO, SAMOA:-14.3308:W170.71 +RURUTU, FRENCH POLYNESIA:-22.4339:W151.361 +TUBUAI, FRENCH POLYNESIA:-23.3653:W149.524 +ANAA, FRENCH POLYNESIA:-17.3525:W145.51 +FANGATAU, FRENCH POLYNESIA:-15.8197:W140.887 +TIKEHAU, FRENCH POLYNESIA:-15.1194:W148.231 +REAO, FRENCH POLYNESIA:-18.4658:W136.439 +FAKARAVA, FRENCH POLYNESIA:-16.0544:W145.657 +MANIHI, FRENCH POLYNESIA:-14.4367:W146.07 +TOTEGEGIE, FRENCH POLYNESIA:-23.0797:W134.89 +KAUKURA ATOLL, TUAMOTU ISLANDS:-15.6633:W146.885 +MAKEMO, FRENCH POLYNESIA:-16.5847:W143.657 +NAPUKA ISLAND, FRENCH POLYNESIA:-14.1767:W141.267 +PUKA PUKA, FRENCH POLYNESIA:-14.8094:W138.813 +TAKAPOTO, FRENCH POLYNESIA:-14.7125:W145.253 +ARUTUA, TUAMOTU ISLANDS:-15.2481:W146.616 +MATAIVA, FRENCH POLYNESIA:-14.8681:W148.717 +TUREIA, FRENCH POLYNESIA:-20.7833:W138.568 +TAKAROA, FRENCH POLYNESIA:-14.4556:W145.024 +NUKU HIVA, FRENCH POLYNESIA:-8.79556:W140.229 +HIVA-OA, FRENCH POLYNESIA:-9.76861:W139.011 +BORA BORA, FRENCH POLYNESIA:-16.4442:W151.751 +RANGIROA, FRENCH POLYNESIA:-14.9542:W147.661 +HUAHINE ISLAND, FRENCH POLYNESIA:-16.6872:W151.022 +MOOREA, FRENCH POLYNESIA:-17.4897:W149.762 +HAO ISLAND, TUAMOTU ISLANDS:-18.0747:W140.946 +MAUPITI, FRENCH POLYNESIA:-16.4264:W152.244 +RAIATEA ISLAND, FRENCH POLYNESIA:-16.7228:W151.466 +MURUROA, FRENCH POLYNESIA:-21.8083:W138.794 +SANTO, VANUATU:-15.5011:167.222 +PORT-VILA, VANUATU:-17.6992:168.32 +KONE, NEW CALEDONIA:-21.0533:164.838 +KOUMAC, NEW CALEDONIA:-20.5461:164.256 +LIFOU, NEW CALEDONIA:-20.7747:167.24 +NOUMEA, NEW CALEDONIA:-22.2581:166.473 +MARE, NEW CALEDONIA:-21.4817:168.037 +TOUHO, NEW CALEDONIA:-20.7911:165.259 +OUVEA, NEW CALEDONIA:-20.6406:166.573 +NOUMEA, NEW CALEDONIA:-22.0144:166.213 +AUCKLAND, NEW ZEALAND:-37.0081:174.792 +TAUPO, NEW ZEALAND:-38.7397:176.084 +ARDMORE, NEW ZEALAND:-37.0297:174.973 +CHRISTCHURCH, NEW ZEALAND:-43.4892:172.532 +CHATHAM ISLAND, NEW ZEALAND:-43.81:W176.457 +DUNEDIN, NEW ZEALAND:-45.9281:170.198 +GISBORNE, NEW ZEALAND:-38.6633:177.978 +GLENTANNER, NEW ZEALAND:-43.9067:170.128 +HOKITIKA, NEW ZEALAND:-42.7136:170.985 +HAMILTON, NEW ZEALAND:-37.8664:175.332 +HASTINGS, NEW ZEALAND:-39.6467:176.767 +KERIKERI, NEW ZEALAND:-35.2628:173.912 +KAITAIA, NEW ZEALAND:-35.07:173.285 +ALEXANDRA, NEW ZEALAND:-45.2117:169.373 +MOUNT COOK, NEW ZEALAND:-43.765:170.133 +MANAPOURI, NEW ZEALAND:-45.5331:167.65 +MASTERTON, NEW ZEALAND:-40.9733:175.634 +NEW PLYMOUTH, NEW ZEALAND:-39.0086:174.179 +NELSON, NEW ZEALAND:-41.2983:173.221 +INVERCARGILL, NEW ZEALAND:-46.4122:168.313 +OHAKEA, NEW ZEALAND:-40.2058:175.388 +OAMARU, NEW ZEALAND:-44.97:171.082 +PALMERSTON NORTH, NEW ZEALAND:-40.3206:175.617 +PARAPARAUMU, NEW ZEALAND:-40.9047:174.989 +QUEENSTOWN INTERNATIONAL, NEW ZEALAND:-45.0211:168.739 +ROTORUA, NEW ZEALAND:-38.1092:176.317 +WAIOURU, NEW ZEALAND:-39.4464:175.658 +STEPHEN'S ISLAND, NEW ZEALAND:-89.9997:0 +TAURANGA, NEW ZEALAND:-37.6719:176.196 +TIMARU, NEW ZEALAND:-44.3028:171.225 +PUKAKI, NEW ZEALAND:-44.235:170.118 +WOODBOURNE, NEW ZEALAND:-41.5183:173.87 +WEYDON, NEW ZEALAND:-77.8833:166.65 +WANAKA, NEW ZEALAND:-44.7253:169.243 +WIGRAM, NEW ZEALAND:-43.5511:172.553 +WHAKATANE, NEW ZEALAND:-37.9206:176.914 +WELLINGTON, NEW ZEALAND:-41.3272:174.805 +WAIROA, NEW ZEALAND:-39.0069:177.407 +WHENUAPAI, NEW ZEALAND:-36.7878:174.63 +WHANGAREI, NEW ZEALAND:-35.7683:174.365 +WESTPORT, NEW ZEALAND:-41.7381:171.581 +WANGANUI, NEW ZEALAND:-39.9622:175.025 +HERAT, AFGHANISTAN:34.2097:62.2278 +JALALABAD, AFGHANISTAN:34.3992:70.4994 +KABUL, AFGHANISTAN:34.5658:69.2122 +KANDAHAR, AFGHANISTAN:31.5058:65.8478 +MAIMAMA, AFGHANISTAN:35.9342:64.7592 +MAZAR-I-SHARIF, AFGHANISTAN:36.7069:67.2092 +SHINDAND, AFGHANISTAN:33.3911:62.2608 +SHEBERGHAN, AFGHANISTAN:36.7503:65.9122 +TALUQAN, AFGHANISTAN:36.775:69.5325 +KUNDUZ, AFGHANISTAN:36.665:68.9108 +BAHRAIN, BAHRAIN:26.2708:50.6336 +BAHRAIN, BAHRAIN:25.9183:50.5906 +ABHA, SAUDI ARABIA:18.24:42.6556 +AL-AHSA, SAUDI ARABIA:25.2842:49.4861 +EL-BAHA, SAUDI ARABIA:20.2961:41.6342 +BISHA, SAUDI ARABIA:19.9839:42.6228 +ABQAIQ, SAUDI ARABIA:25.9114:49.5914 +DAMMAM, SAUDI ARABIA:26.4711:49.7978 +DHAHRAN, SAUDI ARABIA:26.2653:50.1519 +GIZAN, SAUDI ARABIA:16.9011:42.5858 +GASSIM, SAUDI ARABIA:26.3028:43.7744 +GURIAT, SAUDI ARABIA:31.4108:37.2789 +HAIL, SAUDI ARABIA:27.4378:41.6861 +JUBAIL, SAUDI ARABIA:27.0389:49.405 +JEDDAH, SAUDI ARABIA:21.3481:39.1728 +JEDDAH, SAUDI ARABIA:21.6794:39.1564 +KING KHALID MIL.CITY, SAUDI ARABIA:27.9008:45.5281 +MADINAH, SAUDI ARABIA:24.5533:39.705 +NEJRAN, SAUDI ARABIA:17.6114:44.4192 +HAFR AL-BATIN, SAUDI ARABIA:28.335:46.125 +PETROLINE 3, SAUDI ARABIA:25.1744:47.4883 +PETROLINE 6, SAUDI ARABIA:24.7103:44.9644 +PETROLINE 10, SAUDI ARABIA:24.1072:41.0358 +RABIGH, SAUDI ARABIA:22.7025:39.0697 +RAFHA, SAUDI ARABIA:29.6264:43.4906 +RIYADH, SAUDI ARABIA:24.9575:46.6986 +RASH MISHAB, SAUDI ARABIA:28.0794:48.6108 +ARAR, SAUDI ARABIA:30.9072:41.1383 +RAS TANURA, SAUDI ARABIA:26.7231:50.0306 +SHARURAH, SAUDI ARABIA:17.4667:47.1211 +AL-JOUF, SAUDI ARABIA:29.785:40.1 +SULAYEL, SAUDI ARABIA:20.4647:45.6194 +TABUK, SAUDI ARABIA:28.3653:36.6189 +TAIF, SAUDI ARABIA:21.4833:40.5442 +THUMAMAH, SAUDI ARABIA:25.2142:46.6406 +RAS TANAJIB, SAUDI ARABIA:27.8689:48.7683 +TURAIF, SAUDI ARABIA:31.6925:38.7311 +WADI-AL-DAWASIR, SAUDI ARABIA:20.5042:45.1994 +WEJH, SAUDI ARABIA:26.1975:36.4761 +YENBO, SAUDI ARABIA:24.1442:38.0633 +ABADAN, IRAN:30.365:48.2331 +DEZFUL, IRAN:32.4344:48.3975 +AGHAJARI, IRAN:30.7453:49.6761 +GACHSARAN, IRAN:30.3375:50.8278 +MASJED SOLEIMAN, IRAN:32.0022:49.2706 +OMIDYEH, IRAN:30.835:49.5347 +BANDAR MAHSHAHR, IRAN:30.5561:49.1517 +AHWAZ, IRAN:31.3372:48.7619 +ABUMUSA I., IRAN:25.8758:55.0328 +BUSHEHR, IRAN:28.9447:50.8344 +BASTAK, IRAN:27.2125:54.3183 +GOLBANDI, IRAN:27.4839:52.6183 +KISH ISLAND, IRAN:26.5267:53.9817 +BANDAR LENGEH, IRAN:26.5317:54.8217 +KHARK ISLAND, IRAN:29.2592:50.3239 +SIRI ISLAND, IRAN:25.9094:54.5392 +LAVAN ISLAND, IRAN:26.81:53.3564 +BAKHTARAN, IRAN:34.3464:47.1564 +ABDANAN, IRAN:32.9344:47.4833 +ILAM, IRAN:33.5856:46.4053 +KHORRAM ABAD, IRAN:33.4364:48.2858 +SANANDAJ, IRAN:35.2469:47.0069 +DARAN, IRAN:32.9294:51.5608 +ESFAHAN, IRAN:32.5669:51.6914 +ESFAHAN, IRAN:32.7506:51.8617 +SEPAH, IRAN:32.6208:51.6967 +RASHT, IRAN:37.3253:49.6056 +HAMADAN, IRAN:34.8681:48.5522 +ARAK, IRAN:34.1403:49.8483 +TEHERAN, IRAN:35.7028:51.475 +TEHERAN, IRAN:35.6447:51.3806 +TEHERAN, IRAN:35.6892:51.3133 +GHAZVIN, IRAN:36.2414:50.0475 +SEMNAN, IRAN:35.5908:53.495 +BANDAR ABBAS, IRAN:27.2181:56.3778 +JIROFT, IRAN:28.7267:57.67 +KERMAN, IRAN:30.2611:56.9567 +BAM, IRAN:29.0839:58.4503 +BANDAR ABBAS, IRAN:27.1581:56.1722 +GHESHM I., IRAN:26.755:55.9019 +RAFSANJAN, IRAN:30.2978:56.0519 +SIRJAN, IRAN:29.5508:55.6725 +BIRJAND, IRAN:32.8956:59.2756 +SARAKHS, IRAN:36.5011:61.0647 +EMAM SHAHR, IRAN:36.4236:55.1058 +BOJNORD, IRAN:37.4931:57.3006 +TABAS, IRAN:33.6678:56.8925 +SHAHR ABAD, IRAN:37.6278:56.1731 +KALALEH, IRAN:37.3831:55.4519 +GORGAN, IRAN:36.9092:54.4017 +MAHMOOD ABAD, IRAN:34.1692:51.3175 +NOSHAHR, IRAN:36.6633:51.4647 +RAMSAR, IRAN:36.9097:50.6794 +DASHT-E-NAZ, IRAN:36.6436:53.1883 +DARAB, IRAN:28.7214:54.4411 +FASA, IRAN:28.8919:53.7228 +JAHROM, IRAN:28.5864:53.5789 +LAR, IRAN:27.6736:54.3814 +ZARGHAN, IRAN:29.7542:52.6942 +LAMERD, IRAN:27.3708:53.1892 +SHIRAZ, IRAN:29.5392:52.5894 +ARDABIL, IRAN:38.3261:48.4242 +MARAGHEH, IRAN:37.3486:46.1261 +PARSABAD, IRAN:39.6036:47.8811 +TABRIZ, IRAN:38.1328:46.2347 +ZANJAN, IRAN:36.7742:48.3597 +YAZD, IRAN:31.9047:54.2764 +ZABOL, IRAN:31.0969:61.5439 +CHAH BAHAR, IRAN:25.4433:60.3819 +ZAHEDAN, IRAN:29.4761:60.9058 +IRAN SHAHR, IRAN:27.2364:60.72 +JASK, IRAN:25.6533:57.7992 +AMMAN, JORDAN:31.7225:35.9931 +AMMAN, JORDAN:31.9725:35.9914 +AQABA, JORDAN:29.6114:35.0181 +JERUSALEM, JORDAN:31.8647:35.2192 +MAFRAQ, JORDAN:32.3561:36.2592 +KUWAIT, KUWAIT:29.2267:47.98 +BEIRUT, LEBANON:33.8133:35.4886 +KLEIAT, LEBANON:34.5892:36.0111 +ABU DHABI, UNITED ARAB EMIRATES:24.4328:54.6511 +ABU DHABI, UNITED ARAB EMIRATES:24.4283:54.4581 +AL HAMRA, UNITED ARAB EMIRATES:24.0736:52.4633 +JEBEL DHANA, UNITED ARAB EMIRATES:24.1872:52.6139 +AL AIN, UNITED ARAB EMIRATES:24.2617:55.6092 +ABU DHABI, UNITED ARAB EMIRATES:24.2481:54.5475 +ARZANA, UNITED ARAB EMIRATES:24.7803:52.5597 +DAS ISLAND, UNITED ARAB EMIRATES:25.1461:52.8736 +ZIRKU, UNITED ARAB EMIRATES:24.8614:53.0778 +DUBAI, UNITED ARAB EMIRATES:25.2547:55.3642 +FUJEIRAH, UNITED ARAB EMIRATES:25.1122:56.3239 +RAS AL KHAIMAH, UNITED ARAB EMIRATES:25.6133:55.9386 +SHARJAH, UNITED ARAB EMIRATES:25.3283:55.5169 +KHASAB, OMAN:26.1711:56.2406 +MASIRAH, OMAN:20.6753:58.8903 +MUSCAT, OMAN:23.5931:58.2844 +SALALAH, OMAN:17.0386:54.0911 +SAIQ, OMAN:23.0667:57.65 +THUMRAIT, OMAN:17.6658:54.0244 +BANNU, PAKISTAN:32.9719:70.5247 +BAHAWALPURE, PAKISTAN:29.3469:71.7114 +CHITRAL, PAKISTAN:35.8864:71.8006 +DALBANDIN, PAKISTAN:28.8747:64.4044 +DERA GHAZI KHAN, PAKISTAN:29.9611:70.4856 +DERA ISMAIL KHAN, PAKISTAN:31.9092:70.8964 +FAISALABAD, PAKISTAN:31.365:72.9953 +GWADAR, PAKISTAN:25.2331:62.3294 +GILGIT, PAKISTAN:35.9186:74.3336 +JACOBSBAD, PAKISTAN:28.2842:68.4494 +JIWANI, PAKISTAN:25.0678:61.8053 +KARACHI, PAKISTAN:24.9064:67.1606 +HYDERABAD, PAKISTAN:25.3181:68.3661 +KHUZDHAR, PAKISTAN:27.7925:66.6428 +KHARAN, PAKISTAN:28.5944:65.4247 +LAHORE, PAKISTAN:31.5214:74.4033 +LAHORE, PAKISTAN:31.4947:74.3461 +MANGLA, PAKISTAN:33.05:73.6383 +MUZAFFARABAD, PAKISTAN:34.3383:73.5083 +MIANWALI, PAKISTAN:32.5631:71.5706 +MOENJODARO, PAKISTAN:27.335:68.1428 +MIR PUR KHAS, PAKISTAN:25.6825:69.0728 +MIRANSHAH, PAKISTAN:33.0125:70.0642 +KARACHI, PAKISTAN:24.8933:66.9386 +MULTAN, PAKISTAN:30.2031:71.4189 +NAWABSHAH, PAKISTAN:26.2192:68.39 +NAUSHKI, PAKISTAN:29.5378:66.0222 +OKARA, PAKISTAN:30.7408:73.3575 +ORMARA, PAKISTAN:25.2731:64.5883 +PARACHINAR, PAKISTAN:33.9025:70.0714 +PANJGUR, PAKISTAN:26.9544:64.1325 +PASNI, PAKISTAN:25.2836:63.3328 +PESHAWAR, PAKISTAN:33.9939:71.5144 +QASIM, PAKISTAN:33.5611:73.0319 +QUETTA, PAKISTAN:30.2511:66.9375 +RAHIM YAR KHAN, PAKISTAN:28.3853:70.2797 +ISLAMABAD, PAKISTAN:33.6164:73.0992 +SHOREKOTE, PAKISTAN:30.7581:72.2825 +RISALPUR, PAKISTAN:34.0811:71.9725 +RAWALA KOT, PAKISTAN:33.8492:73.7978 +SKARDU, PAKISTAN:35.3347:75.5364 +SUKKUR, PAKISTAN:27.7219:68.7917 +SARGODHA, PAKISTAN:32.0486:72.665 +SAIDU SHARIF, PAKISTAN:34.8131:72.3519 +SUI, PAKISTAN:28.645:69.1767 +SAHIWAL, PAKISTAN:31.8894:72.3092 +TERBELA, PAKISTAN:33.9861:72.6114 +TALHAR, PAKISTAN:24.8414:68.8383 +TURBO, COLOMBIA:25.9861:63.03 +WANA, PAKISTAN:32.3053:69.5694 +ZHOB, PAKISTAN:31.3583:69.4633 +BAGHDAD, IRAQ:33.2619:44.2339 +BASRAH, IRAQ:30.5486:47.6622 +ALEPPO, SYRIA:36.1806:37.2242 +DAMASCUS, SYRIA:33.4114:36.5156 +DEIRE ZOR, SYRIA:35.2853:40.1758 +KAMISHLI, SYRIA:37.0236:41.1944 +LATAKIA, SYRIA:35.4008:35.9486 +PALMYRA, SYRIA:34.5572:38.3167 +DOHA, QATAR:25.2611:51.565 +PALMER, USA:61.5947:W149.089 +BARTER ISLAND, USA:70.1339:W143.577 +BETHEL, USA:60.7797:W161.838 +DELTA JUNCTION, USA:63.9944:W145.721 +BIG MOUNTAIN, USA:59.3617:W155.257 +BARROW, USA:71.2853:W156.766 +BETTLES, USA:66.9153:W151.528 +COLD BAY, USA:55.2056:W162.724 +CLEAR MEWS, USA:64.3011:W149.12 +CORDOVA, USA:60.4917:W145.477 +CAPE ROMANZOF, USA:61.7803:W166.039 +ADAK ISLAND, USA:51.8778:W176.646 +DILLINGHAM, USA:59.0453:W158.503 +KODIAK, USA:57.75:W152.494 +UNALASKA, USA:53.9:W166.543 +ANCHORAGE, USA:61.2511:W149.806 +CAPE NEWENHAM, USA:58.6472:W162.061 +FAIRBANKS, USA:64.6656:W147.101 +KENAI, USA:60.5731:W151.245 +FAIRBANKS, USA:64.815:W147.856 +FORT WAINWRIGHT, USA:64.8375:W147.614 +FORT RICHARDSON, USA:61.2661:W149.653 +GALENA, USA:64.7361:W156.937 +GULKANA, USA:62.1547:W145.456 +SKAGWAY, USA:59.46:W135.316 +HOMER, USA:59.6456:W151.476 +ILIAMNA, USA:59.7536:W154.911 +INDIAN MOUNTAINS, USA:65.9928:W153.704 +JUNEAU, USA:58.3547:W134.576 +KING SALMON, USA:58.6767:W156.649 +KETCHIKAN, USA:55.3556:W131.714 +CAPE LISBURNE, USA:68.875:W166.11 +MCGRATH, USA:62.9528:W155.606 +MIDDLETON ISLAND, USA:59.4497:W146.309 +ANCHORAGE, USA:61.2142:W149.846 +ANCHORAGE, USA:61.1742:W149.996 +ANNETTE ISLAND, USA:55.0422:W131.572 +NOME, USA:64.5119:W165.445 +NORTHWAY, USA:62.9611:W141.929 +KOTZEBUE, USA:66.8844:W162.598 +POINT BARROW, USA:56.5783:W169.661 +PORT MOLLER, USA:59.0111:W161.819 +DEADHORSE, USA:70.1947:W148.465 +SITKA, USA:57.0469:W135.361 +ST. PAUL ISLAND, USA:57.1672:W170.22 +SPARREVOHN, USA:61.0972:W155.574 +SHEMYA, USA:52.7122:174.114 +TANANA, USA:65.1742:W152.109 +TIN CITY, USA:65.5631:W167.922 +TALKEETNA, USA:62.3203:W150.094 +TATALINA, USA:62.8942:W155.976 +UNALAKLEET, USA:63.8883:W160.799 +VALDEZ, USA:61.1339:W146.248 +FORT WAINWRIGHT, USA:70.6133:W159.86 +YAKUTAT, USA:59.5031:W139.66 +CANTON ISLAND, PHOENIX ISL.:-2.76667:W0 +FORT YUKON, USA:66.5714:W145.25 +ROTA, MARIANA ISLANDS:14.1744:145.243 +SAIPAN, MARIANA ISLANDS:15.1194:145.729 +TYPHOON WARNING CTR, MARIANA ISLANDS:13.5:144.833 +ANDERSEN, MARIANA ISLANDS:13.5839:144.93 +AGANA, MARIANA ISLANDS:13.4839:144.797 +WEST TINIAN, MARIANA ISLANDS:14.9978:145.619 +BARKING SANDS, USA:22.0217:W159.787 +DILLINGHAM, USA:21.5792:W158.21 +WHEELER AFB., USA:21.4833:W158.039 +HANA, USA:20.7956:W156.014 +LAHANIA-KAPALUA, USA:20.9628:W156.674 +KONA, USA:19.7386:W156.046 +LIHUE, USA:21.9761:W159.339 +MOLOKAI, USA:21.1528:W157.096 +KAMUELA, USA:20.0011:W155.668 +KANEOHE BAY, USA:21.4492:W157.768 +HONOLULU, USA:21.3158:W157.927 +LANAI, USA:20.7856:W156.951 +KAHULUI, USA:20.8986:W156.431 +BRADSHAW FIELD, USA:19.76:W155.554 +HILO, USA:19.7203:W155.049 +OPOLU, USA:20.265:W155.86 +JOHNSTON ISLAND, JOHNSTON ATOLL:16.7286:W169.534 +ENIWETOK ISLAND, MARSHALL ISLANDS:11.3408:162.328 +MAJURO, MARSHALL ISLANDS:7.06472:171.272 +KWAJALEIN, MARSHALL ISLANDS:9.39667:167.471 +KWAJALEIN, MARSHALL ISLANDS:8.72:167.731 +KIRITIMATI, KIRIBATI:1.98611:W157.35 +MIDWAY, MIDWAY ISLAND:28.2014:W177.381 +OLIKTOK POINT, USA:70.4994:W149.879 +POINT LAY, USA:69.7328:W163.005 +CHUUK, MICRONESIA:7.46167:151.843 +POHNPEI, MICRONESIA:6.985:158.209 +BABELTHUAP, PALAU ISLAND:7.3675:134.544 +KOSRAE, MICRONESIA:5.35667:162.958 +YAP, MICRONESIA:9.49861:138.082 +CHINMEN, TAIWAN:24.4319:118.359 +PINGTUNG, TAIWAN:22.6722:120.462 +LONGTANG, TAIWAN:24.855:121.237 +FENGNIN, TAIWAN:22.7567:121.093 +GREEN ISLAND, TAIWAN:22.6744:121.458 +TAOYUAN, TAIWAN:25.0556:121.243 +KAOHSIUNG, TAIWAN:22.5753:120.351 +CHIAYI, TAIWAN:23.4617:120.393 +CHUNG, TAIWAN:24.1861:120.654 +LANYU, TAIWAN:22.0294:121.527 +CHINGCHUAKANG, TAIWAN:24.2644:120.621 +MATSU, TAIWAN:26.2239:120.002 +TAINAN, TAIWAN:22.9503:120.206 +HSINCHU, TAIWAN:24.8178:120.939 +MAKUNG, TAIWAN:23.5686:119.628 +TAITUNG, TAIWAN:22.7931:121.182 +TSOYING, TAIWAN:22.7047:120.281 +PINGTUNG, TAIWAN:22.7:120.482 +TAIPEI, TAIWAN:25.0694:121.552 +TAIPEI, TAIWAN:25.08:121.232 +WANG AN, TAIWAN:23.3708:119.494 +HUALIEN, TAIWAN:24.0231:121.618 +TOKYO, JAPAN:35.7647:140.386 +MATSUMOTO, JAPAN:36.1667:137.923 +HYAKURI, JAPAN:36.1808:140.415 +MINAMI TORI SHIMA, JAPAN:24.2894:153.979 +IWOJIMA, JAPAN:24.7839:141.322 +NANKI-SHIRAHAMA, JAPAN:33.6622:135.364 +KOHNAN, JAPAN:34.5908:133.933 +OBIHIRO, JAPAN:42.7333:143.217 +SAPPORO, JAPAN:42.775:141.692 +HAKODATE, JAPAN:41.77:140.822 +CHITOSE, JAPAN:42.7944:141.666 +MEMANBETSU, JAPAN:43.8806:144.164 +NAKASHIBETSU, JAPAN:43.5772:144.96 +SAPPORO, JAPAN:43.1161:141.38 +TOKACHI, JAPAN:42.8903:143.158 +WAKKANAI, JAPAN:45.4039:141.801 +IKI, JAPAN:33.7489:129.785 +YAMAGUCHI, JAPAN:33.93:131.279 +TSUSHIMA, JAPAN:34.2847:129.33 +MONBETSU, JAPAN:44.3039:143.404 +ASAHIKAWA, JAPAN:43.6708:142.447 +RISHIRI ISLAND, JAPAN:45.2419:141.186 +ASHIYA, JAPAN:33.8831:130.653 +YAKUSHIMA, JAPAN:30.3856:130.659 +FUKUE, JAPAN:32.6661:128.833 +FUKUOKA, JAPAN:33.5864:130.45 +TANEGASHIMA, JAPAN:30.5467:130.95 +KAGOSHIMA, JAPAN:31.8033:130.719 +MIYAZAKI, JAPAN:31.8769:131.448 +NYUTABARU, JAPAN:32.0836:131.452 +OITA, JAPAN:33.4794:131.737 +KITAKYUSHU, JAPAN:33.8361:130.947 +KUMAMOTO, JAPAN:32.8372:130.855 +NAGASAKI, JAPAN:32.9225:129.923 +KANOYA, JAPAN:31.3675:130.845 +TSUIKI, JAPAN:33.6853:131.041 +AMAMI, JAPAN:28.4306:129.712 +OKIERABU, JAPAN:27.4253:128.701 +TOKUNOSHIMA, JAPAN:27.8361:128.881 +FUKUI, JAPAN:36.1428:136.224 +GIFU, JAPAN:35.3942:136.869 +HAMAMATSU, JAPAN:34.75:137.703 +KANAZAWA, JAPAN:36.3936:136.408 +NAGOYA, JAPAN:35.255:136.924 +OKI ISLAND, JAPAN:36.1811:133.325 +TOYAMA, JAPAN:36.6483:137.187 +YAIZU, JAPAN:34.8125:138.298 +HIROSHIMA, JAPAN:34.4353:132.922 +OKAYAMA, JAPAN:34.7569:133.856 +IZUMO, JAPAN:35.4136:132.89 +HOFU, JAPAN:34.0344:131.549 +MIHO, JAPAN:35.4922:133.236 +IWAKUNI, JAPAN:34.1436:132.236 +KOCHI, JAPAN:33.5444:133.671 +MATSUYAMA, JAPAN:33.8272:132.7 +OSAKA, JAPAN:34.7853:135.438 +TOTTORI, JAPAN:35.53:134.166 +TOKUSHIMA, JAPAN:34.1328:134.606 +TAKAMATSU, JAPAN:34.2139:134.016 +OSAKA, JAPAN:34.5961:135.603 +OZUKI, JAPAN:34.0453:131.052 +AOMORI, JAPAN:40.7344:140.691 +YAMAGATA, JAPAN:38.4117:140.371 +HACHINOE, JAPAN:40.5564:141.466 +HANAMAKI, JAPAN:39.4308:141.136 +AKITA, JAPAN:39.6156:140.219 +MISAWA, JAPAN:40.7031:141.368 +SENDAI, JAPAN:38.1394:140.917 +MATSUSHIMA, JAPAN:38.4047:141.219 +SHONAI, JAPAN:38.8117:139.787 +ATSUGI, JAPAN:35.4544:139.45 +TATEYAMA, JAPAN:34.9869:139.829 +TOKYO, JAPAN:35.6717:139.528 +HACHIJOJIMA, JAPAN:33.115:139.786 +IRUMA, JAPAN:35.8414:139.41 +KISARAZU, JAPAN:35.3981:139.91 +SHIMOFUSA, JAPAN:35.7989:140.011 +OSHIMA, JAPAN:34.7844:139.361 +MIYAKE JIMA, JAPAN:34.0719:139.56 +ZAMA, JAPAN:35.5136:139.394 +TOKYO, JAPAN:35.5522:139.779 +YOKOTA, JAPAN:35.7483:139.348 +KWANGJU, KOREA:35.1256:126.81 +KUNSAN, KOREA:35.9036:126.616 +MOKPO, KOREA:34.7589:126.38 +JHUNJU, KOREA:35.8783:127.119 +YEOSU, KOREA:34.8397:127.615 +CHUNCHON, KOREA:37.8836:127.718 +SOKCH'O, KOREA:38.1475:128.601 +KANGNUNG, KOREA:37.7533:128.944 +WONJU, KOREA:37.4381:127.96 +YANGKU, KOREA:38.0611:128.669 +CHEJU, KOREA:33.5111:126.493 +CHINHAE, KOREA:35.1411:128.696 +KIMHAE, KOREA:35.1794:128.938 +BUSAN, KOREA:35.1708:129.129 +SACHON, KOREA:35.0883:128.07 +ULSAN, KOREA:35.5933:129.352 +PYONGTAEK, KOREA:36.9606:127.033 +SEOUL EAST, KOREA:37.4458:127.114 +OSAN, KOREA:37.0906:127.029 +SEOUL, KOREA:37.5581:126.791 +SUWON, KOREA:37.2392:127.007 +POHANG, KOREA:35.9878:129.42 +KYUNGJU, KOREA:35.8564:129.211 +TAEGU, KOREA:35.8939:128.659 +CHONGJU, KOREA:36.7164:127.499 +YECHON, KOREA:36.6317:128.355 +NAHA, JAPAN:26.1956:127.646 +IEJIMA, JAPAN:26.7286:127.762 +KADENA, JAPAN:26.3556:127.767 +ISHIGAKI, JAPAN:24.3444:124.187 +KUMEJIMA, JAPAN:26.3633:126.714 +MINAMI DAITO, JAPAN:25.8464:131.263 +MIYAKO, JAPAN:24.7828:125.295 +KITADAITO, JAPAN:25.9478:131.321 +SHIMOJISHIMA, JAPAN:24.8267:125.145 +YORON, JAPAN:27.0439:128.401 +FUTEMA, JAPAN:26.2742:127.756 +YONAGUNI JIMA, JAPAN:24.4669:122.978 +MANILA, PHILIPPINES:14.5086:121.019 +CUBI NAS, PHILIPPINES:6.10556:125.236 +CEBU, PHILIPPINES:7.16472:124.21 +LADAG, PHILIPPINES:8.41444:124.611 +MANILA, PHILIPPINES:7.61722:124.059 +LEGAZPI, PHILIPPINES:7.82778:123.46 +ROMBLON, PHILIPPINES:6.05806:125.096 +SANGLEY POINT, PHILIPPINES:9.75778:125.481 +ZAMBOANGA, PHILIPPINES:6.92222:122.059 +BAGUIO, PHILIPPINES:16.375:120.619 +DAET, PHILIPPINES:14.1292:122.98 +FLORIDABLANCA, PHILIPPINES:14.9864:120.493 +LINGAYEN, PHILIPPINES:16.0347:120.241 +SAN JOSE, PHILIPPINES:12.3614:121.046 +IBA, PHILIPPINES:15.3256:119.969 +LIPA, PHILIPPINES:13.955:121.125 +MAMBURAO, PHILIPPINES:13.2081:120.605 +NAGA, PHILIPPINES:13.5853:123.271 +BASCO, PHILIPPINES:20.4517:121.98 +JOSE PANGANIBAN, PHILIPPINES:14.2928:122.646 +VIGAN, PHILIPPINES:17.5536:120.357 +SAN FERNANDO, PHILIPPINES:16.5956:120.303 +TUGUEGARAO, PHILIPPINES:17.6381:121.731 +VIRAC, PHILIPPINES:13.5775:124.206 +MARINDUQUE, PHILIPPINES:13.3611:121.825 +CAUAYAN, PHILIPPINES:16.9297:121.753 +BAGABAG, PHILIPPINES:16.6189:121.252 +TACLOBAN, PHILIPPINES:11.2272:125.028 +BACOLOD, PHILIPPINES:10.6425:122.929 +CALBAYOG, PHILIPPINES:12.0725:124.545 +DUMAGUETE, PHILIPPINES:9.33417:123.302 +CATARMAN, PHILIPPINES:12.5022:124.636 +GUIUAN, PHILIPPINES:11.0356:125.743 +ILOILO, PHILIPPINES:10.7131:122.545 +KALIBO, PHILIPPINES:11.6811:122.378 +MASBATE, PHILIPPINES:10.3075:123.979 +ORMOC, PHILIPPINES:11.0558:124.566 +PUERTO PRINCESA, PHILIPPINES:9.74194:118.759 +ROXAS, PHILIPPINES:11.5975:122.753 +SAN JOSE, PHILIPPINES:10.7661:121.932 +CONCORDIA, ARGENTINA:-31.2969:W57.9964 +GUALEGUAYCHU, ARGENTINA:-33.0058:W58.6131 +PUNTA INDIO, ARGENTINA:-35.3478:W57.2939 +JUNIN, ARGENTINA:-34.5458:W60.9306 +PARANA, ARGENTINA:-31.7947:W60.4803 +ROSARIO, ARGENTINA:-32.9033:W60.7844 +SANTA FE, ARGENTINA:-31.7117:W60.8117 +BUENOS AIRES, ARGENTINA:-34.5592:W58.4156 +LA CUMBRE, ARGENTINA:-31.0067:W64.5325 +CORDOBA, ARGENTINA:-31.3236:W64.2078 +GOBERNADOR GORDILLO, ARGENTINA:-30.3453:W66.2936 +BUENOS AIRES, ARGENTINA:-34.5006:W58.6042 +SAN FERNANDO, ARGENTINA:-34.4531:W58.5894 +JOSE C. PAZ, ARGENTINA:-34.5606:W58.7894 +LA PLATA, ARGENTINA:-34.9722:W57.8944 +MORON, ARGENTINA:-34.6761:W58.6425 +EL PALOMAR, ARGENTINA:-34.6097:W58.6125 +SAN JUSTO, ARGENTINA:-34.7314:W58.5994 +CHOSMADAL, ARGENTINA:-37.4444:W70.2222 +FUERTE GRAL ROCA, ARGENTINA:-39.0006:W67.6203 +MENDOZA, ARGENTINA:-32.8317:W68.7928 +MALARGUE, ARGENTINA:-35.4839:W69.5825 +MENDOZA, ARGENTINA:-32.8658:W68.8722 +SAN RAFAEL, ARGENTINA:-34.5881:W68.4025 +CATAMARCA, ARGENTINA:-28.5956:W65.7517 +SANTIAGO DEL ESTERO, ARGENTINA:-27.7656:W64.31 +TINOGASTA, ARGENTINA:-28.0375:W67.5803 +LA RIOJA, ARGENTINA:-29.3814:W66.7958 +CHILECITO, ARGENTINA:-29.2239:W67.4389 +TUCUMAN, ARGENTINA:-26.8408:W65.1047 +SAN JULIAN, ARGENTINA:-31.5714:W68.4181 +RIO CUARTO, ARGENTINA:-33.0856:W64.2614 +VILLA DOLORES, ARGENTINA:-31.9411:W65.1422 +LABOULAYE, ARGENTINA:-34.1353:W63.3622 +MARCOS JUAREZ, ARGENTINA:-32.6836:W62.1578 +VILLA REYNOLDS, ARGENTINA:-33.7297:W65.3872 +SAN LUIS, ARGENTINA:-33.2731:W66.3564 +CORRIENTES, ARGENTINA:-27.4453:W58.7617 +RESISTENCIA, ARGENTINA:-27.4497:W59.0561 +FORMOSA, ARGENTINA:-26.2125:W58.2281 +IGUAZU FALLS, ARGENTINA:-25.7375:W54.4731 +PASO DE LOS LIBRES, ARGENTINA:-29.6892:W57.1519 +MONTE CASEROS, ARGENTINA:-30.2717:W57.64 +POSADAS, ARGENTINA:-27.3858:W55.9706 +PRESIDENCIA R.S.PENA, ARGENTINA:-26.7564:W60.4931 +SALTA, ARGENTINA:-24.8558:W65.4861 +JUJUY, ARGENTINA:-24.3928:W65.0978 +ORAN, ARGENTINA:-23.1528:W64.3292 +LA QUIACA, ARGENTINA:-22.1622:W65.5697 +TARTAGAL, ARGENTINA:-22.6197:W63.7936 +GOYA, ARGENTINA:-29.1058:W59.2186 +LAS LOMITAS, ARGENTINA:-24.7211:W60.5486 +MERCEDES, ARGENTINA:-29.2231:W58.0881 +OBERA, ARGENTINA:-27.5181:W55.1239 +RECONQUISTA, ARGENTINA:-29.21:W59.6908 +CURUZU CUATIA, ARGENTINA:-29.7706:W57.9789 +EL BOLSON, ARGENTINA:-41.9431:W71.5322 +COMODORO RIVADAVIA, ARGENTINA:-45.785:W67.4656 +EL MAITEN, ARGENTINA:-42.0306:W71.1697 +ESQUEL, ARGENTINA:-42.9078:W71.1394 +LAS HERAS, ARGENTINA:-46.5383:W68.9658 +TRELEW, ARGENTINA:-43.2103:W65.2703 +VIEDMA, ARGENTINA:-40.8692:W63.0003 +PUERTO MADRYN, ARGENTINA:-42.7589:W65.1025 +LAGO ARGENTINO, ARGENTINA:-50.3353:W72.2483 +MARAMBIO BASE, ANTARCTICA:-64.2383:W56.6308 +PUERTO DESEADO, ARGENTINA:-47.7353:W65.9039 +RIO GRANDE, ARGENTINA:-53.7775:W67.7492 +RIO GALLEGOS, ARGENTINA:-51.6086:W69.3125 +USHUAIA, ARGENTINA:-54.8431:W68.2956 +SAN JULIAN, ARGENTINA:-49.3067:W67.8025 +JOSE DE SAN MARTIN, ARGENTINA:-44.0481:W70.4592 +RIO TURBIO, ARGENTINA:-51.6064:W72.2167 +SANTA CRUZ, ARGENTINA:-50.0164:W68.5792 +BAHIA BLANCA, ARGENTINA:-38.7247:W62.1692 +COLONEL SUAREZ, ARGENTINA:-37.4461:W61.8892 +DOLORES, ARGENTINA:-36.3203:W57.7217 +OLAVARRIA, ARGENTINA:-36.8908:W60.2161 +GENERAL PICO, ARGENTINA:-35.6961:W63.7581 +TRES ARROYOS, ARGENTINA:-38.3867:W60.3294 +BOLIVAR, ARGENTINA:-36.1869:W61.0761 +SANTA TERESITA, ARGENTINA:-36.5422:W56.7217 +MAR DEL PLATA, ARGENTINA:-37.9342:W57.5733 +NEUQUEN, ARGENTINA:-38.9489:W68.1556 +NECOCHEA, ARGENTINA:-38.4894:W58.8158 +PEHUAJO, ARGENTINA:-35.8456:W61.8578 +SANTA ROSA, ARGENTINA:-36.5881:W64.2753 +SAN CARLOS DE BARILOCH, ARGENTINA:-41.1511:W71.1575 +TANDIL, ARGENTINA:-37.2372:W59.2278 +VILLA GESELL, ARGENTINA:-37.2353:W57.0292 +CUTRALCO, ARGENTINA:-38.9394:W69.2644 +SAN MARTIN DES ANDES, ARGENTINA:-40.0753:W71.1372 +CONCEICAO DO ARAGUAIA, BRAZIL:-8.34833:W49.3014 +RIO DE JANEIRO, BRAZIL:-22.875:W43.3844 +AMAPA, BRAZIL:2.07667:W50.8622 +ARARACUARA, BRAZIL:-21.8119:W48.1328 +ARACAJU, BRAZIL:-10.9839:W37.0703 +ASSIS, BRAZIL:-22.6383:W50.4558 +ALTA FLORESTA, BRAZIL:-9.86583:W56.1061 +ARACATUBA, BRAZIL:-21.1411:W50.4247 +TEODORO SAMPAIO, BRAZIL:-22.5256:W52.9719 +BELEM, BRAZIL:-1.37917:W48.4761 +BAGE, BRAZIL:-31.3903:W54.1122 +BELO HORIZONTE, BRAZIL:-19.8517:W43.9503 +CURITIBA, BRAZIL:-25.405:W49.2319 +BARBACENA, BRAZIL:-21.2669:W43.7608 +BRASILIA, BRAZIL:-15.8625:W47.9125 +BAURU, BRAZIL:-22.345:W49.0536 +BOA VISTA, BRAZIL:2.84611:W60.69 +BARRA DO GARCAS, BRAZIL:-15.8611:W52.3889 +CASCAVEL, BRAZIL:-25.0003:W53.5006 +ITAITUBA, BRAZIL:-9.33389:W54.9653 +BELO HORIZONTE, BRAZIL:-19.6336:W43.9686 +CAMPO GRANDE, BRAZIL:-20.4686:W54.6725 +CHAPECO, BRAZIL:-27.1342:W52.6564 +CAROLINA, BRAZIL:-7.32028:W47.4586 +CRICIUMA, BRAZIL:-28.7256:W49.4247 +PORTO ALEGRE, BRAZIL:-29.9458:W51.1444 +CAMPOS, BRAZIL:-21.6983:W41.3017 +CORUMBA, BRAZIL:-19.0117:W57.6728 +CURITIBA, BRAZIL:-25.5283:W49.1756 +CARAVELAS, BRAZIL:-17.6522:W39.2531 +CAXIAS DO SUL, BRAZIL:-29.1969:W51.1875 +CUIABA, BRAZIL:-15.6528:W56.1167 +CRUIZIRO DO SUL, BRAZIL:-7.6:W72.7694 +PRESIDENT PRUDENTE, BRAZIL:-22.175:W51.4244 +MANAUS, BRAZIL:-3.03861:W60.0497 +JACARE-ACANGA, BRAZIL:-6.23306:W57.7767 +SAO PEDRO DA ALDEIA, BRAZIL:-22.8128:W42.0925 +FRANCA, BRAZIL:-20.5919:W47.3828 +FOZ DO IGUACU, BRAZIL:-25.5961:W54.4869 +FLORIANOPOLIS, BRAZIL:-27.6725:W48.5478 +FERNANDO DO NORONHA, BRAZIL:-3.85472:W32.4233 +FRONTEIRA, BRAZIL:-20.2783:W49.1872 +ALPINOPOLIS, BRAZIL:-20.7028:W46.335 +FORTALEZA, BRAZIL:-3.77611:W38.5325 +RIO DE JANEIRO, BRAZIL:-22.8089:W43.2436 +GUAJARA-MIRIM, BRAZIL:-10.7861:W65.2847 +GOIANIA, BRAZIL:-16.6311:W49.2222 +SAO PAULO, BRAZIL:-23.4322:W46.4692 +PONTA GROSSA, BRAZIL:-25.1844:W50.1439 +GUARATINGUETA, BRAZIL:-22.7914:W45.2047 +ALTAMIRA, BRAZIL:-3.25389:W52.2539 +ITAITUBA, BRAZIL:-3.12722:W58.4811 +ITAITUBA, BRAZIL:-4.24222:W56.0006 +ILHEUS, BRAZIL:-14.8158:W39.0331 +IPATINGA, BRAZIL:-19.4706:W42.4875 +ITUMBIARA, BRAZIL:-18.4444:W49.2133 +IMPERATRIZ, BRAZIL:-5.53111:W47.46 +BELEM, BRAZIL:-1.41389:W48.4606 +JUIZ DE FORA, BRAZIL:-21.7914:W43.3867 +JOAO PESSOA, BRAZIL:-7.26972:W35.8961 +JOINVILLE, BRAZIL:-26.2247:W48.7972 +CAMPINAS, BRAZIL:-23.0081:W47.1344 +LAJES, BRAZIL:-27.7819:W50.2814 +LINS, BRAZIL:-21.6639:W49.7303 +LONDRINA, BRAZIL:-23.3336:W51.13 +BOM JESUS DA LAPA, BRAZIL:-13.2619:W43.4081 +LAGOA SANTA, BRAZIL:-19.6614:W43.8964 +MARABA, BRAZIL:-5.36833:W49.1378 +ALMEIRIM, BRAZIL:-0.889722:W52.6022 +MARINGA, BRAZIL:-23.4397:W51.9069 +MONTES CLAROS, BRAZIL:-16.7067:W43.8189 +MARILIA, BRAZIL:-22.1967:W49.9264 +MANAUS, BRAZIL:-3.14556:W59.9861 +MACEIO, BRAZIL:-9.51028:W35.7933 +MACAPA, BRAZIL:0.0505556:W51.0719 +MOCORD, BRAZIL:-5.20167:W37.3642 +SAO PAULO, BRAZIL:-23.5089:W46.6375 +MANICORE, BRAZIL:-5.81139:W61.2786 +NAVEGANTES, BRAZIL:-26.88:W48.6514 +SANTO ANGELO, BRAZIL:-28.2817:W54.1689 +NATAL, BRAZIL:-5.91111:W35.2478 +OIOIAPOQUE, BRAZIL:3.85528:W51.7967 +PORTO ALEGRE, BRAZIL:-29.9942:W51.1714 +PARNAIBA, BRAZIL:-2.89361:W41.7319 +POCOS DE CALDAS, BRAZIL:-21.8428:W46.5678 +PASSO FUNDO, BRAZIL:-28.2439:W52.3264 +PELOTAS, BRAZIL:-31.7183:W52.3275 +PETROLINA, BRAZIL:-9.36389:W40.5639 +PORTO NACIONAL, BRAZIL:-10.7192:W48.3997 +PONTA PORA, BRAZIL:-22.5494:W55.7025 +PORTO VELHO, BRAZIL:-8.70917:W63.9022 +VITORIA DA CONQUISTA, BRAZIL:-14.8625:W40.8631 +RIO BRANCO, BRAZIL:-9.86889:W67.8936 +RECIFE, BRAZIL:-8.12639:W34.9233 +RIO GRANDE, BRAZIL:-32.0825:W52.1664 +RIO DE JANEIRO, BRAZIL:-22.9103:W43.1631 +RIBEIRAO PRETO, BRAZIL:-21.1342:W47.7742 +RIO DE JANEIRO, BRAZIL:-22.9322:W43.7189 +SAO JOSE DOS CAMPOS, BRAZIL:-23.2292:W45.8614 +SAO LUIS, BRAZIL:-2.58861:W44.2364 +SANTAREM, BRAZIL:-29.7111:W53.6881 +SAO PAULO, BRAZIL:-23.6267:W46.6553 +SAO JOSE DO RIO PRETO, BRAZIL:-20.8164:W49.4064 +SANTOS, BRAZIL:-23.925:W46.2875 +SALVADOR, BRAZIL:-12.9108:W38.3308 +ORIXIMINA, BRAZIL:-1.48944:W56.3967 +TERESINA, BRAZIL:-5.05972:W42.8233 +TEFE, BRAZIL:-3.38278:W64.7239 +TARAUACA, BRAZIL:-8.155:W70.7831 +TELEMACO BORBA, BRAZIL:-24.3175:W50.6514 +OBIDOS TIRIOS, BRAZIL:2.22333:W55.9458 +TABATINGA, BRAZIL:-4.25556:W69.9356 +TUCURUI, BRAZIL:-3.785:W49.7194 +SAO GABRIEL, BRAZIL:-0.148333:W66.9856 +PAULO ALFONSO, BRAZIL:-9.40083:W38.2506 +URUGUAIANA, BRAZIL:-29.7819:W57.0381 +UBERLANDIA, BRAZIL:-18.8828:W48.2256 +CASTILHO, BRAZIL:-20.7769:W51.5647 +UBERABA, BRAZIL:-19.765:W47.9647 +VARGINHA, BRAZIL:-21.59:W45.4733 +VILHENA, BRAZIL:-12.6942:W60.0981 +VITORIA, BRAZIL:-20.2556:W40.2889 +IAUARETE, BRAZIL:0.6075:W69.1858 +PIRACUNUNGA, BRAZIL:-21.9853:W47.3381 +ANCUD, CHILE:-41.9061:W73.7967 +ALTO PALENA, CHILE:-43.6153:W71.8069 +ARICA, CHILE:-18.3483:W70.3386 +BALMACEDA, CHILE:-45.9158:W71.6892 +SANTIAGO, CHILE:-33.5617:W70.6883 +CHILE CHICO, CHILE:-46.5817:W71.6975 +CALAMA, CHILE:-22.4986:W68.9042 +CHILLAN, CHILE:-36.5828:W72.0317 +PUNTA ARENAS, CHILE:-53.0028:W70.8547 +COYHAIQUE, CHILE:-45.5942:W72.1061 +IQUIQUE, CHILE:-20.535:W70.1811 +SANTIAGO, CHILE:-33.3928:W70.7856 +ANTOFAGASTA, CHILE:-23.4444:W70.445 +PORVENIR, CHILE:-53.2536:W70.3192 +LOS ANGELES, CHILE:-37.4017:W72.4256 +PUERTO WILLIAMS, CHILE:-54.9308:W67.6261 +COPIAPO, CHILE:-27.2961:W70.4136 +CURICO, CHILE:-34.9669:W71.2169 +CONCEPCION, CHILE:-36.7725:W73.0631 +EASTER ISLAND, CHILE:-27.1647:W109.422 +OSORNO, CHILE:-40.6114:W73.0603 +VALLENAR, CHILE:-28.5975:W70.7592 +RANCAGUA, CHILE:-34.1736:W70.7756 +ISLA REY JORGE, ANTARCTICA:-62.1908:W58.9867 +LA SERENA, CHILE:-29.9164:W71.1911 +SANTO DOMINGO, CHILE:-33.6567:W71.6156 +CASTRO, CHILE:-42.4908:W73.7744 +SANTIAGO, CHILE:-33.4564:W70.5467 +TEMUCO, CHILE:-38.7686:W72.6358 +PUERTO MONTT, CHILE:-41.4386:W73.0939 +SANTIAGO, CHILE:-33.4933:W70.6975 +CHAITEN, CHILE:-42.9331:W72.6992 +VALDIVIA, CHILE:-39.6497:W73.0861 +AMBATO, ECUADOR:-1.2125:W78.5742 +CLEMENTIA, ECUADOR:-1.70611:W79.3789 +COCA, ECUADOR:-0.462778:W76.9864 +CUENCA, ECUADOR:-2.88944:W78.9842 +GALAPAGOS, GALAPAGOS I. (ECUADOR:-0.453611:W90.2658 +GUAYAQUIL, ECUADOR:-2.15778:W79.8839 +GUALAQUIZA, ECUADOR:-3.42333:W78.5731 +IBARRA, ECUADOR:0.338333:W78.1364 +LAGO AGRIO, ECUADOR:0.0922222:W76.8692 +LA JULIA, ECUADOR:-1.70417:W79.5522 +LOMA LARGA, ECUADOR:-1.50139:W79.4808 +LATACUNGA, ECUADOR:-0.906667:W78.6156 +MACARA, ECUADOR:-4.38028:W79.9406 +MACAS, ECUADOR:-2.29917:W78.1206 +MACHALA, ECUADOR:-3.26889:W79.9617 +MONTALVO, ECUADOR:-2.06694:W76.9753 +MANTA, ECUADOR:-0.945556:W80.6781 +MARAGROSA, ECUADOR:-2.85083:W79.8036 +MARTINICA, ECUADOR:-1.73972:W79.6217 +PEDERNALES, ECUADOR:0.0730556:W80.0522 +PORTOVIEJO, ECUADOR:-1.04139:W80.4719 +QUITO, ECUADOR:-0.141111:W78.4881 +RIOBAMBA, ECUADOR:-1.65361:W78.6561 +SANTA ROSA, ECUADOR:-3.43528:W79.9778 +SALINAS, ECUADOR:-2.20472:W80.9886 +SANTO DOMINGO, ECUADOR:-0.248056:W79.2144 +SAN CRISTOBAL, ECUADOR:-0.909722:W89.6158 +TAURA, ECUADOR:-2.26083:W79.6892 +TENA, ECUADOR:-0.986667:W77.8194 +TARAPOA, ECUADOR:-0.122778:W76.3375 +TULCAN, ECUADOR:0.809444:W77.7081 +STANLEY, FALKLAND ISLANDS:-51.6856:W57.7775 +ASUNCION, PARAGUAY:-25.2397:W57.5189 +AYOLAS, PARAGUAY:-27.3706:W56.8539 +CONCEPTION, PARAGUAY:-23.4417:W57.4269 +FILADELFIA, PARAGUAY:-22.3597:W60.0536 +ITAIPU, PARAGUAY:-25.4075:W54.6194 +MARISCAL ESTIGARRIBIA, PARAGUAY:-22.0447:W60.6217 +PILAR, PARAGUAY:-26.8814:W58.3178 +ARMENIA, COLOMBIA:4.45361:W75.7653 +PUERTO ASIS, COLOMBIA:0.505:W76.5008 +EL BANCO, COLOMBIA:9.04528:W73.9747 +BUCARAMANGA, COLOMBIA:7.12639:W73.1847 +BOGOTA, COLOMBIA:4.70139:W74.1469 +BARRANQUILLA, COLOMBIA:10.8894:W74.7806 +BAHIA SOLANO, COLOMBIA:6.20278:W77.3944 +BUENAVENTURA, COLOMBIA:3.81944:W76.9897 +CUCUTA, COLOMBIA:7.9275:W72.5114 +CONDOTO, COLOMBIA:5.07167:W76.6764 +CARTAGENA, COLOMBIA:10.4422:W75.5128 +CALI, COLOMBIA:3.54306:W76.3814 +TUMACO, COLOMBIA:1.81417:W78.7492 +COROZAL, COLOMBIA:9.3325:W75.2856 +BARRANCABERMEJA, COLOMBIA:7.02417:W73.8067 +FLORENCIA, COLOMBIA:1.59028:W75.5639 +GIRARDOT, COLOMBIA:4.27611:W74.7967 +CARTAGO, COLOMBIA:4.75806:W75.9556 +GUAPI, COLOMBIA:2.57:W77.8983 +GUAYMARAL, COLOMBIA:4.81222:W74.0647 +IBAGUE, COLOMBIA:4.42139:W75.1331 +IPIALES, COLOMBIA:0.861667:W77.6717 +CAREPA, COLOMBIA:7.81194:W76.7164 +LA MINA, COLOMBIA:11.2325:W72.49 +LETICIA, COLOMBIA:-4.19306:W69.9425 +MEDELLIN, COLOMBIA:6.22:W75.5906 +MAGANGUE, COLOMBIA:9.28333:W74.8394 +MONTERIA, COLOMBIA:8.82361:W75.8258 +MITU, COLOMBIA:1.25361:W70.2336 +MANIZALES, COLOMBIA:5.02972:W75.465 +NEIVA, COLOMBIA:2.95:W75.2939 +OCANA, COLOMBIA:8.31472:W73.3583 +OTU, COLOMBIA:7.01028:W74.7153 +PUERTO BOLIVAR, COLOMBIA:12.2214:W71.9847 +PUERTO CARRENO, COLOMBIA:6.18444:W67.4931 +PEREIRA, COLOMBIA:4.8125:W75.7394 +PITALITO, COLOMBIA:1.85833:W76.0858 +POPAYAN, COLOMBIA:2.45417:W76.61 +PASTO, COLOMBIA:1.39639:W77.2908 +PROVIDENCIA, COLOMBIA:13.3569:W81.3583 +MARIQUITA, COLOMBIA:5.2125:W74.8836 +RIO NEGRO, COLOMBIA:6.16444:W75.4231 +RIO HACHA, COLOMBIA:11.5261:W72.9258 +SARAVENA, COLOMBIA:6.95806:W71.855 +SAN JOSE DEL GUAVIARE, COLOMBIA:2.57944:W72.6392 +SANTA MARTA, COLOMBIA:11.1194:W74.2306 +SAN ANDRES ISLAND, COLOMBIA:12.5833:W81.7111 +SAN VINCENTE DE CAGUAN, COLOMBIA:2.15194:W74.7661 +TRINIDAD, COLOMBIA:5.43028:W71.6581 +TAME, COLOMBIA:6.45083:W71.76 +TURBO, COLOMBIA:8.07444:W76.7411 +ARAUCA, COLOMBIA:7.06861:W70.7367 +QUIBDO, COLOMBIA:5.69056:W76.6411 +TULUA, COLOMBIA:4.08833:W76.235 +VALLEDUPAR, COLOMBIA:10.435:W73.2494 +VILLAVICENCIO, COLOMBIA:4.16778:W73.6136 +EL-YOPAL, COLOMBIA:5.31889:W72.3839 +APOLO, BOLIVIA:-14.7394:W68.4108 +ASCENSION DE GUARAYOS, BOLIVIA:-15.7192:W63.0922 +BERMEJO, BOLIVIA:-22.7694:W64.315 +CAMIRI, BOLIVIA:-20.0069:W63.5275 +COCHABAMBA, BOLIVIA:-17.4208:W66.1769 +CHAPACURA, BOLIVIA:-16.99:W65.1414 +CHARANA, BOLIVIA:-17.5939:W69.4342 +COBIJA, BOLIVIA:-11.0403:W68.7828 +CONCEPTION, BOLIVIA:-16.1433:W62.0258 +GUAYARAMERIN, BOLIVIA:-10.8217:W65.3458 +SAN JOAQUIN, BOLIVIA:-13.0528:W64.6617 +LA PAZ, BOLIVIA:-16.5131:W68.1922 +MAGDALENA, BOLIVIA:-13.2536:W64.0628 +ORURO, BOLIVIA:-17.9633:W67.0761 +POTOSI, BOLIVIA:-19.5433:W65.7239 +PUERTO SUAREZ, BOLIVIA:-18.9753:W57.8206 +SAN RAMON, BOLIVIA:-13.2636:W64.6053 +ROBORE, BOLIVIA:-18.3281:W59.7661 +RIBERALTA, BOLIVIA:-11.0103:W66.0733 +RURRENABAQUE, BOLIVIA:-14.4283:W67.5014 +REYES, BOLIVIA:-14.3061:W67.3536 +SANTA ANA, BOLIVIA:-13.7619:W65.435 +SAN BORJA, BOLIVIA:-14.8575:W66.7375 +SAN IGNACIO DE VELASCO, BOLIVIA:-16.3844:W60.9628 +SAN IGNACIO DE MOXOS, BOLIVIA:-14.9656:W65.6336 +SUCRE, BOLIVIA:-19.0069:W65.2889 +SAN MATHIAS, BOLIVIA:-16.3386:W58.4017 +TARIJA, BOLIVIA:-21.5556:W64.7008 +TRINIDAD, BOLIVIA:-14.8194:W64.9183 +SANTA CRUZ, BOLIVIA:-17.6447:W63.1353 +ZANDERY, SURINAM:5.45278:W55.1878 +PARAMARIBO, SURINAM:5.81083:W55.1906 +CAYENNE, FRENCH GUYANA:4.81972:W52.3603 +ST.-GEORGES OYAPOCK, FRENCH GUYANA:3.8975:W51.8039 +CIRO ALEGRIA, PERU:-4.6075:W77.9408 +ANDOAS, PERU:-2.795:W76.4661 +ATALAYA, PERU:-10.7289:W73.7664 +MOYOBAMBA, PERU:-6.01889:W76.9883 +CABALLOCOCHA, PERU:-3.91667:W70.5081 +IBERIA, PERU:-11.4114:W69.4886 +PUCALLPA, PERU:-8.37778:W74.5742 +CHIMBOTE, PERU:-9.15083:W78.5236 +PUERTO ESPERANZA, PERU:-9.76806:W70.7064 +MOQUEGUA, PERU:-17.1789:W70.9306 +TINGO MARIA, PERU:-9.29:W76.0058 +CHICLAYO, PERU:-6.78722:W79.8281 +AYACUCHO, PERU:-13.1547:W74.2042 +ANDAHUAYLAS, PERU:-13.7064:W73.3503 +ANTA, PERU:-9.34722:W77.5983 +LIMA, PERU:-12.0217:W77.1142 +JUANJUI, PERU:-7.16944:W76.7278 +JAUJA, PERU:-11.7831:W75.4733 +JULIACA, PERU:-15.4669:W70.1581 +SAN JUAN, PERU:-15.3575:W75.1356 +CAJAMARCA, PERU:-7.13639:W78.49 +ILO, PERU:-17.695:W71.3439 +LAS PALMAS, PERU:-12.1606:W76.9989 +TUMBES, PERU:-3.5525:W80.3808 +YURIMAGUAS, PERU:-5.89389:W76.1183 +HUANUCO, PERU:-9.87806:W76.2042 +COLLIQUE, PERU:-11.9286:W77.0611 +CHACHAPOYAS, PERU:-6.20167:W77.8558 +IQUITOS, PERU:-3.78472:W73.3086 +AREQUIPA, PERU:-16.3408:W71.5831 +SAN RAMON, PERU:-11.1286:W75.3503 +TRUJILLO, PERU:-8.08472:W79.1094 +PISCO, PERU:-13.7447:W76.2203 +TARAPOTO, PERU:-6.50861:W76.3731 +TACNA, PERU:-18.0533:W70.2758 +TALARA, PERU:-4.54972:W81.2239 +PUERTO MALDONADO, PERU:-12.6136:W69.2289 +PIURA, PERU:-5.20556:W80.6164 +TALARA, PERU:-4.57639:W81.2539 +NAZCA, PERU:-14.8539:W74.9614 +CUZCO, PERU:-13.5356:W71.9386 +MONTEVIDEO, URUGUAY:-34.7892:W56.2644 +ARTIGAS, URUGUAY:-30.4006:W56.5078 +COLONIA, URUGUAY:-34.4564:W57.7706 +DURAZNO, URUGUAY:-33.3586:W56.4992 +MALDONADO, URUGUAY:-34.855:W55.0942 +MELO, URUGUAY:-32.3378:W54.2167 +MONTEVIDEO, URUGUAY:-34.8378:W56.0303 +PUNTA DEL ESTE, URUGUAY:-34.9136:W54.9206 +PAYSANDU, URUGUAY:-32.365:W58.0611 +RIVERA, URUGUAY:-30.9744:W55.4761 +SALTO, URUGUAY:-31.4397:W57.9906 +TACUAREMBO, URUGUAY:-31.7489:W55.9256 +ACARIGUA, VENEZUELA:9.55333:W69.2378 +ANACO, VENEZUELA:9.42917:W64.4708 +SAN FERNANDO DEATABAPO, VENEZUELA:4.05167:W67.7008 +BARCELONA, VENEZUELA:10.1069:W64.6889 +BARINAS, VENEZUELA:8.61944:W70.2206 +MARACAIBO, VENEZUELA:10.1833:W67.5572 +BARQUISIMETO, VENEZUELA:10.0425:W69.3583 +MARACAY, VENEZUELA:10.2497:W67.6492 +CIUDAD BOLIVAR, VENEZUELA:8.12194:W63.5369 +CAICARA DE ORINOCO, VENEZUELA:7.62583:W66.1647 +SAN CARLOS, VENEZUELA:9.64889:W68.5753 +CALABOZO, VENEZUELA:8.92444:W67.4169 +CANAIMA, VENEZUELA:6.23194:W62.8542 +CARORA, VENEZUELA:10.1756:W70.065 +CARUPANO, VENEZUELA:10.66:W63.2617 +CORO, VENEZUELA:11.4147:W69.6808 +CARACAS, VENEZUELA:10.2861:W66.8158 +CUMANA, VENEZUELA:10.4503:W64.1303 +CARRIZAL, VENEZUELA:9.37194:W66.9228 +EL DORADO, VENEZUELA:6.715:W61.6389 +ELORZA, VENEZUELA:7.05972:W69.4967 +GUASDUALITO, VENEZUELA:7.21083:W70.7564 +GUIRIA, VENEZUELA:10.5739:W62.3125 +GUANARE, VENEZUELA:9.02694:W69.755 +HIGUEROTE, VENEZUELA:10.4622:W66.0925 +ISLA DE COCHE, VENEZUELA:10.7942:W63.9814 +PARAGUANA, VENEZUELA:11.7808:W70.1517 +SAN JUAN DE LOS MORROS, VENEZUELA:9.90694:W67.3794 +LA FRIA, VENEZUELA:8.23917:W72.2708 +LA ORCHILA, VENEZUELA:11.8086:W66.1792 +MARACAIBO, VENEZUELA:10.5581:W71.7278 +MERIDA, VENEZUELA:8.58194:W71.1608 +PORLAMAR, VENEZUELA:10.9125:W63.9664 +CARACAS, VENEZUELA:10.6031:W66.9906 +MATURIN, VENEZUELA:9.74917:W63.1522 +PUERTO AYACUCHO, VENEZUELA:5.61972:W67.6058 +PUERTO CABELLO, VENEZUELA:10.4803:W68.0728 +SAN CRISTOBAL, VENEZUELA:7.80111:W72.2028 +GUAYANA, VENEZUELA:8.28833:W62.7603 +PALMARITO, VENEZUELA:7.57556:W70.1742 +SAN ANTONIO, VENEZUELA:7.85222:W72.4347 +SANTA BARBARA, VENEZUELA:7.80333:W71.1656 +SANTO DOMINGO, VENEZUELA:7.565:W72.035 +SAN FELIPE, VENEZUELA:10.2786:W68.755 +SAN FERNANDO DE APURE, VENEZUELA:7.8825:W67.4436 +SAN TOME, VENEZUELA:8.945:W64.1508 +SANTA BARBARA, VENEZUELA:8.97444:W71.9431 +TUCUPITA, VENEZUELA:9.08889:W62.0942 +TUMEREMO, VENEZUELA:7.24917:W61.5289 +VALENCIA, VENEZUELA:10.1581:W67.9267 +MERIDA, VENEZUELA:8.62417:W71.6728 +VALERA, VENEZUELA:9.34056:W70.5839 +VALLE DE LA PASCUA, VENEZUELA:9.22194:W65.9933 +KAMARANG, GUYANA:5.86528:W60.6142 +LINDEN, GUYANA:5.96583:W58.2703 +LETHEM, GUYANA:3.3725:W59.7892 +ANTIGUA, LEEWARD ISLANDS:17.1367:W61.7925 +BRIDGETOWN, BARBADOS:13.0744:W59.4922 +CANEFIELD, DOMINICA:15.3367:W61.3919 +DOMINICA, DOMINICA:15.5469:W61.3 +FORT-DE-FRANCE, ANTILLES:14.5908:W61.0031 +ST. MARTIN, ANTILLES:18.0997:W63.0469 +ST.-BARTHELEMY, ANTILLES:17.9:W62.85 +GRAND-BOURG, ANTILLES:15.8686:W61.27 +POINTE-A-PITRE, ANTILLES:16.2653:W61.5317 +POINT SALINES, GRENADA:12.0042:W61.7861 +ST. THOMAS, VIRGIN ISL.:18.3372:W64.9733 +ST. CRIOX ISLAND, VIRGIN ISL.:17.7017:W64.7983 +AGUADILLA, PUERTO RICO:18.4947:W67.1294 +FAJARDO, PUERTO RICO:18.3089:W65.6617 +SAN JUAN, PUERTO RICO:18.4567:W66.0981 +MAYAGUEZ, PUERTO RICO:18.2556:W67.1483 +ROOSEVELT ROADS, PUERTO RICO:18.245:W65.6433 +PONCE, PUERTO RICO:18.0081:W66.5628 +SAN JUAN, PUERTO RICO:18.4392:W66.0017 +BASSE TERRE, ST. KITTS & NEVIS:17.3111:W62.7186 +CHARLESTOWN, ST. KITTS & NEVIS:17.2056:W62.5897 +CASTRIES, ST. LUCIA ISLAND:14.02:W60.9928 +HEWANDORRA, ST. LUCIA ISLAND:13.7331:W60.9525 +ORANJESTAD, ARUBA:12.5014:W70.015 +KRALENDIJK, ANTILLES:12.1308:W68.2683 +WILLEMSTAD, ANTILLES:12.1886:W68.9597 +ORANJESTAD, ANTILLES:17.4964:W62.9792 +PHILIPSBURG, ANTILLES:18.0408:W63.1089 +THE VALLEY, ANGUILLA ISL.:18.2047:W63.055 +PLYMOUTH, MONTSERRAT ISLAND:33.5869:W80.2086 +SCARBOROUGH, TRINIDAD & TOBAGO:11.1494:W60.8319 +PORT-OF-SPAIN, TRINIDAD & TOBAGO:10.5953:W61.3372 +ROADTOWN/BEEF ISLAND, VIRGIN ISL.:18.4447:W64.5428 +BEQUIA, ST.VINCENT/GRENADINES:12.9883:W61.2619 +CANOUAN ISLAND, ST.VINCENT/GRENADINES:12.6989:W61.3422 +MUSTIQUE, ST.VINCENT/GRENADINES:12.8875:W61.18 +KINGSTOWN, ST.VINCENT/GRENADINES:13.1442:W61.2108 +ALMA-ATA, KAZAKHSTAN:43.3519:77.0403 +BALKHASH, RUSSIA:46.8942:75.0047 +TSELINOGRAD, RUSSIA:51.0222:71.4672 +BISHKEK, RUSSIA:43.0617:74.4783 +OSH, RUSSIA:40.6089:72.7931 +CHIMKENT, RUSSIA:42.3644:69.4792 +DZHEZKAZGAN, RUSSIA:47.7083:67.7333 +URALSK, RUSSIA:51.1517:51.5456 +SEMIPLATINSK, RUSSIA:50.3511:80.2342 +SHEVCHENKO, RUSSIA:43.86:51.0919 +AKTYUBINSK, RUSSIA:50.245:57.2033 +KUSTANAY, RUSSIA:53.2064:63.5508 +BAKU, RUSSIA:40.4675:50.0467 +ALDAN, RUSSIA:34.8042:W96.6711 +YAKUTSK, RUSSIA:62.0931:129.771 +POLYARNY, RUSSIA:66.4167:112.05 +YEREVAN, RUSSIA:40.1483:44.3967 +TBILISI, GEORGIA:41.6692:44.9547 +SUKHUMI, GEORGIA:42.8581:41.1281 +BLAGOVESCHENSK, RUSSIA:50.4217:127.41 +KHABAROVSK, RUSSIA:48.5278:135.188 +ANADYR, RUSSIA:64.7347:177.741 +PROVIDENIYA BAY, RUSSIA:64.38:W173.247 +MAGADAN, RUSSIA:59.91:150.717 +PEVEK, RUSSIA:67.5:171 +PETROPAVLOVSK, RUSSIA:53.1664:158.453 +OKHA, RUSSIA:53.515:142.888 +YUZHNO-SAKHALINSK, RUSSIA:46.8886:142.717 +VLADIVOSTOK, RUSSIA:43.3989:132.151 +CHITA, RUSSIA:52.0261:113.305 +BRATSK, RUSSIA:56.3708:101.699 +IRKUTSK, RUSSIA:52.2669:104.395 +ULAN-UDE, RUSSIA:51.8067:107.438 +KIEV, RUSSIA:50.345:30.895 +DONETSK, RUSSIA:48.0733:37.74 +DNEPROPETROVSK, RUSSIA:48.3567:35.1017 +SIMFEROPOL, RUSSIA:45.0386:33.9831 +KHARKOV, RUSSIA:49.3589:26.9339 +KIEV, RUSSIA:50.4017:30.4517 +LVOV, RUSSIA:49.8125:23.9561 +CHERNOVTSK, RUSSIA:48.26:25.9817 +ODESSA, RUSSIA:46.4269:30.6781 +ST. PETERSBURG, RUSSIA:59.8:30.265 +MURMANSK, RUSSIA:68.7817:32.7506 +GOMEL, RUSSIA:52.5269:31.0167 +VITEBSK, RUSSIA:55.1667:30.1333 +KALININGRAD, RUSSIA:54.89:20.5925 +MINSK, RUSSIA:53.8644:27.5394 +MINSK 2, RUSSIA:53.8822:28.0306 +ABAKAN, RUSSIA:53.74:91.385 +BARNAUL, RUSSIA:53.3639:83.5419 +KEMOROVO, RUSSIA:55.2697:86.1069 +OMSK, RUSSIA:54.9669:73.31 +KRASNODAR, RUSSIA:45.035:39.1717 +MAKHACHKALA, RUSSIA:42.8167:47.6522 +MINERALNYE VODY, RUSSIA:44.225:43.0817 +STAVROPOL, RUSSIA:45.1092:42.1128 +ROSTOV, RUSSIA:47.2581:39.8178 +SOCHI, RUSSIA:43.4458:39.9475 +ASTRAKHAN, RUSSIA:46.2833:48.0061 +VOLGOGRAD, RUSSIA:48.7822:44.3447 +CHELYABINSK, RUSSIA:55.3033:61.5067 +MAGNETIOGORSK, RUSSIA:53.3933:58.76 +SALEKHARD, RUSSIA:66.59:66.6103 +NIZHNEVARTOVSK, RUSSIA:60.95:76.4667 +PERM, RUSSIA:57.9167:56.0256 +SURGUT, RUSSIA:61.25:73.5 +SVERDLOVSK, RUSSIA:56.7414:60.8036 +TOBOLSK, RUSSIA:37.1322:W92.0839 +KURGAN, RUSSIA:55.475:65.4147 +ASHKHABAD, RUSSIA:37.9917:58.3633 +KRASNOVODSK, RUSSIA:40.0333:52.9833 +CHARDZHOU, RUSSIA:39.0833:63.6133 +DUSHANBE, RUSSIA:38.5433:68.825 +NUKUS, RUSSIA:42.4864:59.6225 +BUKHARA, RUSSIA:39.775:64.48 +SAMARKAND, RUSSIA:39.7006:66.9847 +TERMEZ, RUSSIA:37.2864:67.3083 +TASHKENT, UZBEKISTAN:41.2572:69.2817 +BRYANSK, RUSSIA:53.2142:34.1764 +MOSCOW, RUSSIA:55.9717:37.415 +TVER, RUSSIA:56.8247:35.7575 +VORONEZH, RUSSIA:51.8142:39.2297 +MOSCOW, RUSSIA:55.5914:37.2614 +SYKTYVKAR, RUSSIA:61.6475:50.8456 +KAZAN, RUSSIA:55.6078:49.2772 +ORENBURG, RUSSIA:51.7956:55.4567 +PENZA, RUSSIA:28.9542:W98.5197 +UFA, RUSSIA:54.5575:55.8742 +SAMARA, RUSSIA:53.5053:50.1644 +AHMEDABAD, INDIA:23.0747:72.6317 +AKOLA, INDIA:20.6989:77.0564 +AURANGABAD, INDIA:19.8631:75.3981 +BOMBAY, INDIA:19.0886:72.8678 +BILASPUR, INDIA:21.9886:82.1111 +BHUJ, INDIA:23.2878:69.67 +BELGAUM, INDIA:15.8592:74.6181 +BARODA, INDIA:22.3361:73.2261 +BHOPAL, INDIA:23.285:77.3372 +BHAUNAGAR, INDIA:21.7519:72.185 +DAMAN, INDIA:20.435:72.8436 +DEESA, INDIA:24.2678:72.2053 +GOA, INDIA:15.3806:73.8331 +INDORE, INDIA:22.7217:75.8008 +JABALPUR, INDIA:23.1778:80.0519 +BOMBAY, INDIA:19.0981:72.8339 +JAMNAGAR, INDIA:22.4664:70.0114 +KANDLA, INDIA:23.1125:70.1003 +KHAJURAHO, INDIA:24.8194:79.9192 +KOLHAPUR, INDIA:16.6639:74.2881 +KESHOD, INDIA:21.3167:70.27 +NAGPUR, INDIA:21.0919:79.0469 +NASIK ROAD, INDIA:19.9625:73.8069 +PUNE, INDIA:18.5819:73.9194 +PORBANDAR, INDIA:21.6494:69.6564 +RAJKOT, INDIA:22.3092:70.7794 +RAIPUR, INDIA:21.1803:81.7386 +SHOLAPUR, INDIA:17.6278:75.9347 +SURAT, INDIA:21.115:72.7428 +UDAIPUR, INDIA:24.6175:73.9128 +COLOMBO, SRI LANKA:7.18111:79.8836 +ANURADHAPURA, SRI LANKA:8.30111:80.4281 +BATTICALOA, SRI LANKA:7.70556:81.6778 +COLOMBO, SRI LANKA:6.82194:79.8861 +GALOYA, SRI LANKA:7.3375:81.6256 +JAFFNA, SRI LANKA:9.79222:80.07 +TRINCIOMALEE, SRI LANKA:8.53889:81.1814 +WIRAWILA, SRI LANKA:6.25444:81.235 +BATTAMBANG, CAMBODIA:13.0956:103.224 +KOMPONG CHNANG, CAMBODIA:12.255:104.564 +PHNOM-PENH, CAMBODIA:11.5464:104.844 +SIEM-REAP, CAMBODIA:13.4106:103.813 +STUNG TRENG, CAMBODIA:13.5314:106.014 +ALONG, INDIA:28.1747:94.8019 +AGARTALA, INDIA:23.8889:91.2408 +AIZWAL, INDIA:23.7461:92.8031 +BAGHDOGRA, INDIA:26.6814:88.3281 +BALURGHAT, INDIA:25.2608:88.7956 +BOKARO, INDIA:23.6433:86.1486 +BHUBANESWAR, INDIA:20.2442:85.8178 +CALCUTTA, INDIA:22.6547:88.4467 +COOCH-BEHAR, INDIA:26.3303:89.4669 +DHANBAD, INDIA:23.8339:86.425 +DEPARIZO, INDIA:27.9889:94.2233 +GORAKHPUR, INDIA:26.7394:83.4494 +GAUHATI, INDIA:26.1061:91.5847 +GAYA, INDIA:24.7481:84.9425 +HIRAKUD, INDIA:21.5792:84.0061 +IMPHAL, INDIA:24.7597:93.8969 +JHARSUGUDA, INDIA:21.9133:84.0503 +JEYPORE, INDIA:18.8797:82.5519 +JAMSHEDPUR, INDIA:22.8119:86.1675 +JORHAT, INDIA:26.7306:94.1756 +KAMALPUR, INDIA:24.135:91.8106 +KAILASHAHAR, INDIA:24.3083:92.0075 +SILCHAR, INDIA:24.9128:92.9786 +LILABARI, INDIA:27.2906:94.0967 +MOHANBARI, INDIA:27.4833:95.0175 +MAZUFFARPUR, INDIA:26.12:85.3131 +NAWAPARA, INDIA:20.87:82.5194 +PASIGHAT, INDIA:28.0661:95.3356 +PANAGARH, INDIA:23.4744:87.4278 +PATINA, INDIA:25.5906:85.0878 +PURNEA, INDIA:25.76:87.4092 +RANCHI, INDIA:23.3147:85.3214 +ROURKELA, INDIA:22.2564:84.8144 +UTKELA, INDIA:20.0975:83.1833 +ZERO, INDIA:27.5881:93.8283 +COX'S BAZAR, BANGLADESH:21.4519:91.9642 +CHITTAGONG, BANGLADESH:22.2494:91.8131 +ISHURDI, BANGLADESH:24.1525:89.0494 +JESSORE, BANGLADESH:23.1836:89.1608 +RAJSHAHI, BANGLADESH:24.4369:88.6164 +SAIDPUR, BANGLADESH:25.7592:88.9086 +SYLHET OSMANI, BANGLADESH:24.9628:91.8672 +DHAKA, BANGLADESH:23.7783:90.3825 +DHAKA, BANGLADESH:23.8433:90.3978 +HONG KONG, HONG KONG:22.3089:113.914 +SEK KONG, HONG KONG:22.4364:114.08 +AGRA, INDIA:27.1556:77.9608 +ALLAHABAD, INDIA:25.4389:81.7342 +AMRITSAR, INDIA:31.7075:74.7992 +BIKANER, INDIA:28.0725:73.2067 +BAKSHI KA TALAB, INDIA:26.9883:80.8931 +VARANASI, INDIA:25.4519:82.8589 +KULU, INDIA:31.8817:77.1844 +BHATINDA, INDIA:30.27:74.7556 +BHIWANI, INDIA:28.8375:76.1775 +BAREILLY, INDIA:28.4222:79.4497 +CHANDIGARH, INDIA:30.6733:76.7883 +KANPUR, INDIA:26.4042:80.41 +DELHI, INDIA:28.5842:77.2053 +DEHRA DUN, INDIA:30.1872:78.18 +DELHI, INDIA:28.5664:77.1031 +GUNA, INDIA:24.6544:77.3472 +GWALIOR, INDIA:26.2939:78.2275 +HISSAR, INDIA:29.1806:75.7531 +JHANSI, INDIA:25.4897:78.5594 +JODHPUR, INDIA:26.2514:73.0481 +JAIPUR, INDIA:26.8239:75.8097 +JAISALMER, INDIA:26.8892:70.8644 +JAMMU, INDIA:32.6897:74.8381 +KANPUR, INDIA:26.4411:80.3633 +KOTA, INDIA:25.1606:75.8447 +LUDHIAHA, INDIA:30.8544:75.9511 +LEH, INDIA:34.1356:77.5456 +LUCKNOW, INDIA:26.7606:80.8864 +PATHANKOT, INDIA:32.2336:75.6344 +PATIALA, INDIA:30.315:76.3633 +NAINITAL, INDIA:29.0331:79.4736 +RAIBARELLI, INDIA:26.2503:81.3806 +SHIMLA, INDIA:31.0817:77.0581 +SAHARANPUR, INDIA:29.9942:77.4242 +SRINAGAR, INDIA:33.9867:74.7736 +BANE HOUEI SAY, LAOS:20.2572:100.437 +LUANG PRABANG, LAOS:19.8972:102.161 +PAKSE, LAOS:15.1319:105.781 +PHONG SAVANH, LAOS:19.4547:103.218 +SAVANNAKHET, LAOS:16.5564:104.759 +VIENTIANE, LAOS:17.9881:102.563 +MACAU, MACAU:22.1494:113.591 +BHAIRAWA, NEPAL:27.5056:83.4161 +CHANDRAGARHI, NEPAL:26.5706:88.0794 +JANAKPUR, NEPAL:26.7086:85.9222 +KATHMANDU, NEPAL:27.6964:85.3592 +NEPALGUNJ, NEPAL:28.1036:81.6669 +POKHARA, NEPAL:28.2003:83.9811 +SIMARA, NEPAL:27.1594:84.98 +BIRATNAGAR, NEPAL:26.4833:87.2636 +AGATTI ISLAND, INDIA:10.8233:72.1756 +BANGALORE, INDIA:12.9497:77.6681 +BIDAR, INDIA:17.9078:77.4858 +VIJAYAWADA, INDIA:16.5303:80.7967 +COIMBATORE, INDIA:11.0314:77.0439 +CALICUT, INDIA:11.1356:75.9547 +CUDDAPAH, INDIA:14.5097:78.7728 +CARNICOBAR, INDIA:9.15306:92.8192 +DUNDIGUL, INDIA:17.6292:78.4033 +HYDERABAD, INDIA:17.4522:78.4611 +MADURAI, INDIA:9.83444:78.0933 +MANGALORE, INDIA:12.96:74.8925 +MADRAS, INDIA:12.9942:80.1803 +NAGARJUNSAGAR, INDIA:16.5408:79.3178 +PORT BLAIR, INDIA:11.6456:92.7331 +RAJAHMUNDRY, INDIA:17.1094:81.8183 +SALEM, INDIA:11.7819:78.0653 +TANJORE, INDIA:10.7197:79.1036 +TIRUPETI, INDIA:13.6319:79.5431 +TIRUCHCHIRAPPALLI, INDIA:10.7653:78.7089 +TRIVANDRUM, INDIA:8.48194:76.9181 +TAMBARAM, INDIA:12.9067:80.1211 +WARANGAL, INDIA:17.9181:79.5986 +PARO, BHUTAN:27.4031:89.4258 +MALE, MALDIVES:4.19167:73.5289 +BANGKOK, THAILAND:13.9125:100.607 +NAKHON PATHOM, THAILAND:14.1019:99.9169 +LOP BURI, THAILAND:14.8744:100.663 +RAYONG, THAILAND:12.6797:101.005 +PRACHIN BURI, THAILAND:13.7686:102.315 +CHIANG RAI, THAILAND:19.4972:100.286 +LAMPANG, THAILAND:18.2719:99.5039 +PHRAE, THAILAND:18.1319:100.164 +PRACHUAP KHIRI KHAN, THAILAND:12.6339:99.9508 +NAKHON SAWAN, THAILAND:15.2772:100.296 +PHETCHABUN, THAILAND:16.8208:101.254 +TAK, THAILAND:16.6997:98.545 +NAKHON SAWAN, THAILAND:15.6728:100.137 +PHITSANULOK, THAILAND:16.7828:100.279 +UTTARADIT, THAILAND:17.6736:100.235 +TAK, THAILAND:17.2342:99.0578 +NARATHIWAT, THAILAND:6.51972:101.743 +KRBI, THAILAND:8.09889:98.9861 +SONGKHLA, THAILAND:7.18639:100.608 +PATTANI, THAILAND:6.78528:101.153 +SURAT THANI, THAILAND:9.54778:100.062 +NAKHON SI THAMMARAT, THAILAND:8.47111:99.9556 +PHUKET, THAILAND:8.11306:98.3167 +RANONG, THAILAND:9.7775:98.5853 +SONGKHLA, THAILAND:6.93306:100.393 +TRANG, THAILAND:7.50861:99.6164 +YA LA, THAILAND:6.52667:101.242 +UDON THANI, THAILAND:17.3864:102.788 +SAKON NAKHON, THAILAND:17.195:104.119 +SURIN, THAILAND:14.8692:103.489 +LOEI, THAILAND:17.4389:101.722 +NAKHON RATCHASIMA, THAILAND:14.9342:102.079 +NAKHON PHANOM, THAILAND:17.4125:104.777 +NAKHON PHANOM, THAILAND:17.3836:104.643 +DANANG, VIET NAM:16.0439:108.199 +HANOI, VIET NAM:21.2217:105.806 +NHATRANG, VIET NAM:12.2181:109.2 +HO CHI MINH CITY, VIET NAM:10.82:106.662 +BAGAN, MYANMAR:21.1819:94.9292 +BANMAW, MYANMAR:24.2689:97.2461 +COCO ISLAND, MYANMAR:14.1414:93.3683 +DAWEI, MYANMAR:14.0981:98.2017 +HEHO, MYANMAR:20.7431:96.7917 +KENGTUNG, MYANMAR:21.3006:99.6367 +KALAY, MYANMAR:23.1886:94.0508 +KYAUKPYU, MYANMAR:19.4267:93.5344 +KAWTHOUNG, MYANMAR:10.0492:98.5378 +LOIKAW, MYANMAR:19.6922:97.2147 +LASHIO, MYANMAR:22.9775:97.7522 +LANYWA, MYANMAR:20.9403:94.8225 +MANDALAY, MYANMAR:21.7019:95.9778 +MYEIK, MYANMAR:12.4433:98.6211 +MYITKYINA, MYANMAR:25.3825:97.3528 +MAWLAMYINE, MYANMAR:16.4447:97.6606 +MOMEIK, MYANMAR:23.0925:96.645 +MONG HSAT, MYANMAR:20.5167:99.2567 +NAMPONG, MYANMAR:25.3542:97.295 +NAMSANG, MYANMAR:20.89:97.7361 +HPA-AN, MYANMAR:16.8944:97.6753 +PATHEIN, MYANMAR:16.8128:94.7753 +PUTAO, MYANMAR:27.3297:97.4261 +PYAY, MYANMAR:18.8244:95.2658 +SHANTE, MYANMAR:20.9417:95.9144 +SITTWE, MYANMAR:20.1325:92.8725 +THANDWE, MYANMAR:18.4606:94.2994 +TACHILEK, MYANMAR:20.4836:99.9353 +TAUNGOO, MYANMAR:19.0311:96.4014 +YANGON, MYANMAR:16.9072:96.1331 +UJUNG PANDANG, INDONESIA:-5.06167:119.554 +PONGGALUKU, INDONESIA:-4.31667:122.467 +MASAMBA, INDONESIA:-2.55778:120.324 +SOROAKO, INDONESIA:-2.52944:121.357 +MAKALE, INDONESIA:-3.045:119.822 +KENDARI, INDONESIA:-4.08222:122.417 +BIAK, INDONESIA:-1.19:136.108 +NABIRE, INDONESIA:-3.36806:135.496 +TIMIKA, INDONESIA:-4.52806:136.887 +JAYAPURA, INDONESIA:-2.57694:140.516 +WAMENA, INDONESIA:-4.09611:138.952 +MERAUKE, INDONESIA:-8.52028:140.418 +GORONTALO, INDONESIA:0.636667:122.852 +TAHUNA, INDONESIA:3.68306:125.528 +PALU, INDONESIA:-0.918333:119.909 +MANADO, INDONESIA:1.54917:124.926 +POSO, INDONESIA:-1.41667:120.657 +TERNATE, INDONESIA:0.831944:127.381 +LUWUK, INDONESIA:-1.03889:122.772 +LANGGUR, INDONESIA:-5.66139:132.731 +AMBON, INDONESIA:-3.70889:128.09 +KAIMANA, INDONESIA:-3.64389:133.695 +MANOKWARI, INDONESIA:-0.88:134.05 +SORONG, INDONESIA:-0.925833:131.12 +BINTULU, MALAYSIA:3.17222:113.044 +KUCHING, MALAYSIA:1.48472:110.346 +MARUDI, MALAYSIA:4.17806:114.331 +MIRI, MALAYSIA:4.325:113.988 +SIBU, MALAYSIA:2.26389:111.983 +LAHAD DATU, MALAYSIA:5.03222:118.324 +KOTA KINABALU, MALAYSIA:5.93722:116.051 +LABUAN, MALAYSIA:5.30056:115.25 +TAWAU, MALAYSIA:4.31333:118.122 +BRUNEI, BRUNEI:4.94556:114.928 +SABANG, INDONESIA:5.87389:95.3394 +TASIKMALAYA, INDONESIA:-7.34556:108.246 +MADIUN, INDONESIA:-7.61583:111.434 +MALANG, INDONESIA:-7.92611:112.714 +PEKANBARU, INDONESIA:0.461111:101.444 +DUMAI, INDONESIA:1.60917:101.433 +TANGERANG, INDONESIA:-6.29306:106.57 +BANDUNG, INDONESIA:-6.90056:107.576 +CIREBON, INDONESIA:-6.75583:108.539 +JAKARTA, INDONESIA:-6.26639:106.891 +JAKARTA, INDONESIA:-6.12556:106.656 +YOGYAKARTA, INDONESIA:-7.78806:110.432 +CILACAP, INDONESIA:-7.645:109.034 +JAKARTA, INDONESIA:-6.33694:106.764 +SEMARANG, INDONESIA:-6.97306:110.375 +TANJUNG KARANG, INDONESIA:-5.24222:105.179 +BATAM, INDONESIA:1.12083:104.119 +TANJUNG PANDAN, INDONESIA:-2.74556:107.755 +PANGKAL PINANG, INDONESIA:-2.16278:106.139 +TANJUNG PINANG, INDONESIA:0.9225:104.532 +SINGKEP, INDONESIA:-0.479167:104.579 +GUNUNG SITOLI, INDONESIA:1.16639:97.7028 +PADANG SIDEMPUAN, INDONESIA:1.39917:99.4319 +PADANG, INDONESIA:-0.876111:100.352 +MEDAN, INDONESIA:3.55806:98.6717 +SIBOLGA, INDONESIA:1.55472:98.8903 +NANGAPINOH, INDONESIA:-0.348611:111.748 +KETAPANG, INDONESIA:-1.81639:109.963 +NATUNA, INDONESIA:3.90861:108.388 +PONTIANAK, INDONESIA:-0.150556:109.404 +PUTUSIBAU, INDONESIA:0.835833:112.936 +SINTANG, INDONESIA:0.0636111:111.475 +JAMBI, INDONESIA:-1.63778:103.644 +BENGKULU, INDONESIA:-3.86389:102.341 +PALEMBANG, INDONESIA:-2.89778:104.701 +PENDORO, INDONESIA:-3.28583:103.879 +RENGAT, INDONESIA:-0.352778:102.335 +MUKO MUKO, INDONESIA:-2.54222:101.088 +LHOK SUKON, INDONESIA:5.06944:97.2592 +WHOK SEUMAWE, INDONESIA:5.22667:96.9503 +BANDA ACEH, INDONESIA:5.52333:95.4203 +KLUANG, MALAYSIA:2.04139:103.307 +PULAU PIOMAN, MALAYSIA:2.81806:104.16 +ALOR SETAR, MALAYSIA:6.19389:100.403 +BUTTERWORTH, MALAYSIA:5.46583:100.391 +KOTA BAHRU, MALAYSIA:6.16639:102.294 +KUANTAN, MALAYSIA:3.77528:103.209 +KERTEH, MALAYSIA:4.53722:103.426 +SIMPANG, MALAYSIA:3.11222:101.703 +IPOH, MALAYSIA:4.56778:101.092 +JOHOR BAHRU, MALAYSIA:1.64111:103.669 +KUALA LUMPUR, MALAYSIA:2.74556:101.71 +PULAU, MALAYSIA:6.32972:99.7286 +MALACCA, MALAYSIA:2.26333:102.251 +KUALA TERENGGANU, MALAYSIA:5.3825:103.103 +PENANG, MALAYSIA:5.29694:100.277 +SUAI, EAST TIMOR:-9.30306:125.287 +BAUCAU, WEST TIMOR:-8.48528:126.399 +BANJARMASIN, INDONESIA:-3.44194:114.761 +BATU LICIN, INDONESIA:-3.4125:115.996 +PANGKALAN BUN, INDONESIA:-2.705:111.673 +PALANGKARAYA, INDONESIA:-2.225:113.943 +SAMPIT, INDONESIA:-2.50111:112.977 +MAUMERE, INDONESIA:-8.64056:122.237 +ENDE, INDONESIA:-8.84889:121.662 +RUTENG, INDONESIA:-8.59556:120.478 +KUPANG, INDONESIA:-10.1714:123.671 +LABUHAN BAJO, INDONESIA:-8.48611:119.889 +TANJUNG REDEP, INDONESIA:2.15444:117.432 +BALIKPAPAN, INDONESIA:-1.26806:116.894 +TARAKEN, INDONESIA:3.32639:117.566 +SAMARINDA, INDONESIA:-0.484444:117.157 +TANJUNG SANTAN, INDONESIA:-0.0930556:117.439 +MATARAM, INDONESIA:-8.56056:116.094 +BIMA, INDONESIA:-8.53944:118.687 +DENPASAR, INDONESIA:-8.74833:115.167 +SUMBAWA, INDONESIA:-8.48889:117.412 +WAIKABUBAK, INDONESIA:-9.40944:119.246 +WAINGAPU, INDONESIA:-9.67:120.304 +SURABAYA, INDONESIA:-7.37972:112.787 +SOLO CITY, INDONESIA:-7.51583:110.757 +SEMBAWANG, SINGAPORE:1.42361:103.811 +PAYA LEBAR, SINGAPORE:1.36028:103.909 +TENGAH, SINGAPORE:1.38722:103.709 +SINGAPORE, SINGAPORE:1.41694:103.867 +SINGAPORE, SINGAPORE:1.35556:103.987 +BRISBANE, AUSTRALIA:-27.5703:153.008 +AMBERLEY, AUSTRALIA:-10.9508:142.459 +ALICE SPRINGS, AUSTRALIA:-23.8069:133.902 +BRISBANE, AUSTRALIA:-27.3842:153.118 +COOLANGATTA, AUSTRALIA:-28.1644:153.505 +CAIRNS, AUSTRALIA:-16.8858:145.755 +CHARLIEVILLE, AUSTRALIA:-26.4133:146.262 +MOUNT ISA, AUSTRALIA:-20.6639:139.489 +MAROOCHYDORE, AUSTRALIA:-26.6033:153.091 +MACKAY, AUSTRALIA:-21.1717:149.18 +OAKEY, AUSTRALIA:-27.4114:151.735 +PROSSERPINE, AUSTRALIA:-20.495:148.552 +ROCKHAMPTON, AUSTRALIA:-23.3819:150.475 +TOWNSVILLE, AUSTRALIA:-19.2525:146.765 +WEIPA, AUSTRALIA:-12.6786:141.925 +AVALON, AUSTRALIA:-38.0394:144.469 +ALBURY, AUSTRALIA:-36.0678:146.958 +MELBOURNE, AUSTRALIA:-37.7281:144.902 +EAST SALE, AUSTRALIA:-38.0989:147.149 +HOBART, AUSTRALIA:-42.8361:147.51 +LAUNCESTON, AUSTRALIA:-41.5453:147.214 +MELBOURNE, AUSTRALIA:-37.9758:145.102 +MELBOURNE, AUSTRALIA:-37.6733:144.843 +POINT COOK, AUSTRALIA:-37.9322:144.753 +ADELAIDE, AUSTRALIA:-34.945:138.531 +ARGYLE, AUSTRALIA:-32.5069:137.717 +EDINBURGH, AUSTRALIA:-34.7025:138.621 +PERTH, AUSTRALIA:-32.0972:115.881 +KARRATHA, AUSTRALIA:-20.7122:116.773 +KALGOORLIE, AUSTRALIA:-30.7894:121.462 +KUNUNURRA, AUSTRALIA:-15.7781:128.707 +LEARMONTH, AUSTRALIA:-22.2356:114.089 +PORT HEDLAND, AUSTRALIA:-20.3778:118.626 +ADELAIDE, AUSTRALIA:-34.7933:138.633 +PERTH, AUSTRALIA:-31.9403:115.967 +WOOMERA, AUSTRALIA:-31.1442:136.817 +CHRISTMAS ISLAND, CHRISTMAS ISLAND:-10.4506:105.69 +SYDNEY, AUSTRALIA:-33.9244:150.988 +CANBERRA, AUSTRALIA:-35.3083:149.194 +COFF'S HARBOUR, AUSTRALIA:-30.3206:153.116 +CAMDEN, AUSTRALIA:-34.0403:150.687 +DUBBO, AUSTRALIA:-32.2167:148.575 +NORFOLK ISLAND, AUSTRALIA:-29.0414:167.939 +RICHMOND, AUSTRALIA:-33.6006:150.781 +SYDNEY, AUSTRALIA:-33.9461:151.177 +TAMWORTH, AUSTRALIA:-31.0839:150.847 +WAGGA WAGGA, AUSTRALIA:-35.1653:147.466 +BEIJING, CHINA:40.08:116.584 +HUHHOT, CHINA:40.8533:111.822 +HAILAR, CHINA:49.205:119.825 +SHIJIAZHUANG, CHINA:38.2806:114.696 +TIANJIN, CHINA:39.1239:117.346 +TAIYUAN, CHINA:37.7467:112.629 +GUANGZHOU, CHINA:23.1842:113.266 +CHANGCHA, CHINA:28.1889:113.219 +GUILIN, CHINA:25.2178:110.039 +NANNING, CHINA:22.6081:108.172 +SHANTOU, CHINA:23.4:116.683 +SHENZHEN, CHINA:22.6394:113.812 +ZHENGZHOU, CHINA:34.5194:113.841 +WUHAN, CHINA:30.7836:114.208 +TICHANG, CHINA:30.5522:111.469 +PYONGYANG, KOREA:39.0333:125.783 +LANZHOU, CHINA:36.5167:103.622 +XI'AN, CHINA:34.4458:108.752 +ULAN BATOR, MONGOLIA:47.8431:106.766 +JINGHONGGASA, CHINA:21.975:100.76 +KUNMING, CHINA:24.9922:102.743 +XIAMEN, CHINA:24.5439:118.127 +NANCHANG, CHINA:28.6:115.917 +FUZHOU, CHINA:25.9333:119.662 +HANGZHOU, CHINA:30.2283:120.432 +NINBO, CHINA:29.8247:121.465 +NANJING, CHINA:31.74:118.86 +HEFEI, CHINA:31.78:117.298 +QINGDAO, CHINA:36.2625:120.375 +SHANGHAI, CHINA:31.1978:121.336 +YANTAI, CHINA:37.4017:121.372 +CHONGQING, CHINA:29.7189:106.641 +CHENGDU, CHINA:30.5783:103.947 +XICHANG, CHINA:27.9886:102.184 +KASHI, CHINA:39.5433:76.0217 +HOTAN, CHINA:37.0378:79.8658 +URUMQI, CHINA:43.9069:87.4742 +HARBIN, CHINA:45.6233:126.25 +JIAMUSI, CHINA:46.8433:130.465 +MUDANJIANG, CHINA:44.5239:129.569 +DALIAN, CHINA:38.9656:121.538 +YANJI, CHINA:42.8817:129.448 diff --git a/media.py b/media.py index 8d550c13b..0c50284b9 100644 --- a/media.py +++ b/media.py @@ -54,76 +54,105 @@ def _removeMetaData(imageFilename: str, outputFilename: str) -> None: os.system('/usr/bin/mogrify -strip ' + outputFilename) # nosec -def _spoofMetaData(nickname: str, - imageFilename: str, outputFilename: str, - spoofFilename: str) -> None: +def spoofGeolocation(baseDir: str, + city: str, currTime, + citiesList: []) -> (float, float, str, str): + """Given a city and the current time spoofs the location + for an image + returns latitude, longitude, N/S, E/W + """ + locationsFilename = baseDir + '/custom_locations.txt' + if not os.path.isfile(locationsFilename): + locationsFilename = baseDir + '/locations.txt' + variance = 0.2 + default_latitude = 51.5069 + default_longitude = -0.1114 + default_latdirection = 'N' + default_longdirection = 'E' + + if citiesList: + cities = citiesList + else: + if not os.path.isfile(locationsFilename): + return (default_latitude, default_longitude, + default_latdirection, default_longdirection) + cities = [] + with open(locationsFilename, "r") as f: + cities = f.readlines() + + city = city.lower() + for cityName in cities: + if city in cityName.lower(): + latitude = cityName.split(':')[1] + longitude = cityName.split(':')[2] + latdirection = 'N' + longdirection = 'E' + if 'S' in latitude: + latdirection = 'S' + latitude = latitude.replace('S', '') + if 'W' in longitude: + longdirection = 'W' + longitude = longitude.replace('W', '') + # add some randomness + fraction = randint(0, 100000) / 100000 + fraction = fraction * fraction + latitude = float(latitude) + \ + (fraction * variance) - (variance / 2.0) + latitude = int(latitude * 10000) / 10000.0 + fraction = randint(0, 100000) / 100000 + fraction = fraction * fraction + longitude = float(longitude) + \ + (fraction * variance) - (variance / 2.0) + longitude = int(longitude * 10000) / 10000.0 + return latitude, longitude, latdirection, longdirection + + return (default_latitude, default_longitude, + default_latdirection, default_longdirection) + + +def _spoofMetaData(baseDir: str, nickname: str, + outputFilename: str, spoofCity: str) -> None: """Use reference images to spoof the metadata """ - copyfile(imageFilename, outputFilename) if not os.path.isfile(outputFilename): - print('ERROR: unable to spoof metadata from ' + imageFilename) - return - if not os.path.isfile(spoofFilename): - print('ERROR: No spoof reference image ' + spoofFilename) + print('ERROR: unable to spoof metadata within ' + outputFilename) return if os.path.isfile('/usr/bin/exiftool'): print('Spoofing metadata in ' + outputFilename + ' using exiftool') - os.system('exiftool -TagsFromFile ' + - spoofFilename + ' ' + outputFilename) # nosec currTimeAdjusted = \ datetime.datetime.utcnow() - \ datetime.timedelta(minutes=randint(2, 120)) published = currTimeAdjusted.strftime("%Y:%m:%d %H:%M:%S+00:00") + (latitude, longitude, latitudeRef, longitudeRef) = \ + spoofGeolocation(baseDir, spoofCity, currTimeAdjusted, None) os.system('exiftool -artist="' + nickname + '" ' + - '-time:all="' + published + '" ' + + '-DateTimeOriginal="' + published + '" ' + + '-FileModifyDate="' + published + '" ' + + '-CreateDate="' + published + '" ' + + '-GPSLongitudeRef=' + longitudeRef + ' ' + + '-GPSAltitude=0 ' + + '-GPSLongitude=' + str(longitude) + ' ' + + '-GPSLatitudeRef=' + latitudeRef + ' ' + + '-GPSLatitude=' + str(latitude) + ' ' + + '-Comment="" ' + outputFilename) # nosec else: print('ERROR: exiftool is not installed') return -def processMetaData(baseDir: str, nickname: str, domain: str, - imageFilename: str, outputFilename: str) -> None: +def processMetaData(baseDir: str, nickname: str, + imageFilename: str, outputFilename: str, + city: str) -> None: """Handles image metadata. This tries to spoof the metadata if possible, but otherwise just removes it """ - accountDir = baseDir + '/accounts/' + nickname + '@' + domain - spoofImagesDir = accountDir + '/ref/images' - if os.path.isdir(spoofImagesDir): - imageTypes = getImageExtensions() - # get the format of the target image - ext = None - for mType in imageTypes: - if outputFilename.endswith('.' + mType): - ext = mType - break - if ext: - spoofList = [] - for subdir, dirs, files in os.walk(baseDir + '/accounts'): - for f in files: - filename = os.path.join(spoofImagesDir, f) - # what is the format of this file? - currExt = None - for mType in imageTypes: - if filename.endswith('.' + mType): - currExt = mType - break - # if this the same format as the target? - if currExt: - if currExt == ext: - spoofList.append(filename) - break - if spoofList: - # choose a reference at random - index = randint(0, len(spoofList)) - spoofFilename = spoofList[index] - _spoofMetaData(nickname, - imageFilename, outputFilename, - spoofFilename) - return - # if we can't spoof then just remove metadata + # first remove the metadata _removeMetaData(imageFilename, outputFilename) + # now add some spoofed data to misdirect surveillance capitalists + _spoofMetaData(baseDir, nickname, outputFilename, city) + def _isMedia(imageFilename: str) -> bool: """Is the given file a media file? @@ -206,7 +235,8 @@ def _updateEtag(mediaFilename: str) -> None: def attachMedia(baseDir: str, httpPrefix: str, nickname: str, domain: str, port: int, postJson: {}, imageFilename: str, - mediaType: str, description: str) -> {}: + mediaType: str, description: str, + city: str) -> {}: """Attaches media to a json object post The description can be None """ @@ -252,8 +282,8 @@ def attachMedia(baseDir: str, httpPrefix: str, if baseDir: if mediaType.startswith('image/'): - processMetaData(baseDir, nickname, domain, - imageFilename, mediaFilename) + processMetaData(baseDir, nickname, + imageFilename, mediaFilename, city) else: copyfile(imageFilename, mediaFilename) _updateEtag(mediaFilename) diff --git a/newsdaemon.py b/newsdaemon.py index a32628428..ad43836cf 100644 --- a/newsdaemon.py +++ b/newsdaemon.py @@ -527,11 +527,17 @@ def _convertRSStoActivityPub(baseDir: str, httpPrefix: str, # NOTE: the id when the post is created will not be # consistent (it's based on the current time, not the # published time), so we change that later + saveToFile = False + attachImageFilename = None + mediaType = None + imageDescription = None + city = 'London' blog = createNewsPost(baseDir, domain, port, httpPrefix, rssDescription, - followersOnly, False, - None, None, None, + followersOnly, saveToFile, + attachImageFilename, mediaType, + imageDescription, city, rssTitle) if not blog: continue diff --git a/outbox.py b/outbox.py index 8ad268251..8da8fa6d2 100644 --- a/outbox.py +++ b/outbox.py @@ -176,7 +176,8 @@ def postMessageToOutbox(session, translate: {}, proxyType: str, version: str, debug: bool, YTReplacementDomain: str, showPublishedDateOnly: bool, - allowLocalNetworkAccess: bool) -> bool: + allowLocalNetworkAccess: bool, + city: str) -> bool: """post is received by the outbox Client to server message post https://www.w3.org/TR/activitypub/#client-to-server-outbox-delivery @@ -545,7 +546,7 @@ def postMessageToOutbox(session, translate: {}, print('DEBUG: handle share uploads') outboxShareUpload(baseDir, httpPrefix, postToNickname, domain, - port, messageJson, debug) + port, messageJson, debug, city) if debug: print('DEBUG: handle undo share uploads') diff --git a/person.py b/person.py index c412bc2e3..3f1b271f8 100644 --- a/person.py +++ b/person.py @@ -74,7 +74,7 @@ def generateRSAKey() -> (str, str): def setProfileImage(baseDir: str, httpPrefix: str, nickname: str, domain: str, port: int, imageFilename: str, imageType: str, - resolution: str) -> bool: + resolution: str, city: str) -> bool: """Saves the given image file as an avatar or background image for the given person """ @@ -135,8 +135,8 @@ def setProfileImage(baseDir: str, httpPrefix: str, nickname: str, domain: str, '/usr/bin/convert ' + imageFilename + ' -size ' + \ resolution + ' -quality 50 ' + profileFilename subprocess.call(cmd, shell=True) - processMetaData(baseDir, nickname, domain, - profileFilename, profileFilename) + processMetaData(baseDir, nickname, + profileFilename, profileFilename, city) return True return False diff --git a/posts.py b/posts.py index 516bfad26..401e82037 100644 --- a/posts.py +++ b/posts.py @@ -867,7 +867,7 @@ def _createPostBase(baseDir: str, nickname: str, domain: str, port: int, followersOnly: bool, saveToFile: bool, clientToServer: bool, commentsEnabled: bool, attachImageFilename: str, - mediaType: str, imageDescription: str, + mediaType: str, imageDescription: str, city: str, isModerationReport: bool, isArticle: bool, inReplyTo=None, @@ -1107,7 +1107,7 @@ def _createPostBase(baseDir: str, nickname: str, domain: str, port: int, newPost['object'] = \ attachMedia(baseDir, httpPrefix, nickname, domain, port, newPost['object'], attachImageFilename, - mediaType, imageDescription) + mediaType, imageDescription, city) _appendEventFields(newPost['object'], eventUUID, eventStatus, anonymousParticipationEnabled, repliesModerationOption, @@ -1157,7 +1157,7 @@ def _createPostBase(baseDir: str, nickname: str, domain: str, port: int, newPost = \ attachMedia(baseDir, httpPrefix, nickname, domain, port, newPost, attachImageFilename, - mediaType, imageDescription) + mediaType, imageDescription, city) _appendEventFields(newPost, eventUUID, eventStatus, anonymousParticipationEnabled, repliesModerationOption, @@ -1397,7 +1397,7 @@ def createPublicPost(baseDir: str, content: str, followersOnly: bool, saveToFile: bool, clientToServer: bool, commentsEnabled: bool, attachImageFilename: str, mediaType: str, - imageDescription: str, + imageDescription: str, city: str, inReplyTo=None, inReplyToAtomUri=None, subject=None, schedulePost=False, eventDate=None, eventTime=None, location=None, @@ -1423,7 +1423,7 @@ def createPublicPost(baseDir: str, httpPrefix, content, followersOnly, saveToFile, clientToServer, commentsEnabled, attachImageFilename, mediaType, - imageDescription, + imageDescription, city, isModerationReport, isArticle, inReplyTo, inReplyToAtomUri, subject, schedulePost, eventDate, eventTime, location, @@ -1470,7 +1470,7 @@ def createBlogPost(baseDir: str, content: str, followersOnly: bool, saveToFile: bool, clientToServer: bool, commentsEnabled: bool, attachImageFilename: str, mediaType: str, - imageDescription: str, + imageDescription: str, city: str, inReplyTo=None, inReplyToAtomUri=None, subject=None, schedulePost=False, eventDate=None, eventTime=None, location=None) -> {}: @@ -1480,7 +1480,7 @@ def createBlogPost(baseDir: str, content, followersOnly, saveToFile, clientToServer, commentsEnabled, attachImageFilename, mediaType, - imageDescription, + imageDescription, city, inReplyTo, inReplyToAtomUri, subject, schedulePost, eventDate, eventTime, location, True) @@ -1495,7 +1495,7 @@ def createNewsPost(baseDir: str, domain: str, port: int, httpPrefix: str, content: str, followersOnly: bool, saveToFile: bool, attachImageFilename: str, mediaType: str, - imageDescription: str, + imageDescription: str, city: str, subject: str) -> {}: clientToServer = False inReplyTo = None @@ -1510,7 +1510,7 @@ def createNewsPost(baseDir: str, content, followersOnly, saveToFile, clientToServer, False, attachImageFilename, mediaType, - imageDescription, + imageDescription, city, inReplyTo, inReplyToAtomUri, subject, schedulePost, eventDate, eventTime, location, True) @@ -1524,7 +1524,7 @@ def createQuestionPost(baseDir: str, followersOnly: bool, saveToFile: bool, clientToServer: bool, commentsEnabled: bool, attachImageFilename: str, mediaType: str, - imageDescription: str, + imageDescription: str, city: str, subject: str, durationDays: int) -> {}: """Question post with multiple choice options """ @@ -1537,7 +1537,7 @@ def createQuestionPost(baseDir: str, httpPrefix, content, followersOnly, saveToFile, clientToServer, commentsEnabled, attachImageFilename, mediaType, - imageDescription, + imageDescription, city, False, False, None, None, subject, False, None, None, None, None, None, None, None, None, @@ -1568,7 +1568,7 @@ def createUnlistedPost(baseDir: str, content: str, followersOnly: bool, saveToFile: bool, clientToServer: bool, commentsEnabled: bool, attachImageFilename: str, mediaType: str, - imageDescription: str, + imageDescription: str, city: str, inReplyTo=None, inReplyToAtomUri=None, subject=None, schedulePost=False, eventDate=None, eventTime=None, location=None) -> {}: @@ -1582,8 +1582,9 @@ def createUnlistedPost(baseDir: str, httpPrefix, content, followersOnly, saveToFile, clientToServer, commentsEnabled, attachImageFilename, mediaType, - imageDescription, - False, False, inReplyTo, inReplyToAtomUri, subject, + imageDescription, city, + False, False, + inReplyTo, inReplyToAtomUri, subject, schedulePost, eventDate, eventTime, location, None, None, None, None, None, None, None, None, None, None) @@ -1596,7 +1597,7 @@ def createFollowersOnlyPost(baseDir: str, saveToFile: bool, clientToServer: bool, commentsEnabled: bool, attachImageFilename: str, mediaType: str, - imageDescription: str, + imageDescription: str, city: str, inReplyTo=None, inReplyToAtomUri=None, subject=None, schedulePost=False, eventDate=None, eventTime=None, @@ -1611,8 +1612,9 @@ def createFollowersOnlyPost(baseDir: str, httpPrefix, content, followersOnly, saveToFile, clientToServer, commentsEnabled, attachImageFilename, mediaType, - imageDescription, - False, False, inReplyTo, inReplyToAtomUri, subject, + imageDescription, city, + False, False, + inReplyTo, inReplyToAtomUri, subject, schedulePost, eventDate, eventTime, location, None, None, None, None, None, None, None, None, None, None) @@ -1625,7 +1627,7 @@ def createEventPost(baseDir: str, saveToFile: bool, clientToServer: bool, commentsEnabled: bool, attachImageFilename: str, mediaType: str, - imageDescription: str, + imageDescription: str, city: str, subject=None, schedulePost=False, eventDate=None, eventTime=None, location=None, category=None, joinMode=None, @@ -1658,7 +1660,7 @@ def createEventPost(baseDir: str, httpPrefix, content, followersOnly, saveToFile, clientToServer, commentsEnabled, attachImageFilename, mediaType, - imageDescription, + imageDescription, city, False, False, None, None, subject, schedulePost, eventDate, eventTime, location, eventUUID, category, joinMode, @@ -1710,7 +1712,7 @@ def createDirectMessagePost(baseDir: str, saveToFile: bool, clientToServer: bool, commentsEnabled: bool, attachImageFilename: str, mediaType: str, - imageDescription: str, + imageDescription: str, city: str, inReplyTo=None, inReplyToAtomUri=None, subject=None, debug=False, schedulePost=False, @@ -1733,8 +1735,9 @@ def createDirectMessagePost(baseDir: str, httpPrefix, content, followersOnly, saveToFile, clientToServer, commentsEnabled, attachImageFilename, mediaType, - imageDescription, - False, False, inReplyTo, inReplyToAtomUri, subject, + imageDescription, city, + False, False, + inReplyTo, inReplyToAtomUri, subject, schedulePost, eventDate, eventTime, location, None, None, None, None, None, None, None, None, None, None) @@ -1754,7 +1757,7 @@ def createReportPost(baseDir: str, content: str, followersOnly: bool, saveToFile: bool, clientToServer: bool, commentsEnabled: bool, attachImageFilename: str, mediaType: str, - imageDescription: str, + imageDescription: str, city: str, debug: bool, subject=None) -> {}: """Send a report to moderators """ @@ -1823,7 +1826,7 @@ def createReportPost(baseDir: str, httpPrefix, content, followersOnly, saveToFile, clientToServer, commentsEnabled, attachImageFilename, mediaType, - imageDescription, + imageDescription, city, True, False, None, None, subject, False, None, None, None, None, None, None, None, None, @@ -1908,7 +1911,7 @@ def sendPost(projectVersion: str, saveToFile: bool, clientToServer: bool, commentsEnabled: bool, attachImageFilename: str, mediaType: str, - imageDescription: str, + imageDescription: str, city: str, federationList: [], sendThreads: [], postLog: [], cachedWebfingers: {}, personCache: {}, isArticle: bool, @@ -1967,7 +1970,7 @@ def sendPost(projectVersion: str, followersOnly, saveToFile, clientToServer, commentsEnabled, attachImageFilename, mediaType, - imageDescription, + imageDescription, city, False, isArticle, inReplyTo, inReplyToAtomUri, subject, False, None, None, None, None, None, @@ -2029,7 +2032,7 @@ def sendPostViaServer(projectVersion: str, httpPrefix: str, content: str, followersOnly: bool, commentsEnabled: bool, attachImageFilename: str, mediaType: str, - imageDescription: str, + imageDescription: str, city: str, cachedWebfingers: {}, personCache: {}, isArticle: bool, debug=False, inReplyTo=None, inReplyToAtomUri=None, subject=None) -> int: @@ -2106,7 +2109,7 @@ def sendPostViaServer(projectVersion: str, followersOnly, saveToFile, clientToServer, commentsEnabled, attachImageFilename, mediaType, - imageDescription, + imageDescription, city, False, isArticle, inReplyTo, inReplyToAtomUri, subject, False, None, None, None, None, None, diff --git a/schedule.py b/schedule.py index 13f2f4586..7790b98c1 100644 --- a/schedule.py +++ b/schedule.py @@ -108,7 +108,8 @@ def _updatePostSchedule(baseDir: str, handle: str, httpd, httpd.debug, httpd.YTReplacementDomain, httpd.showPublishedDateOnly, - httpd.allowLocalNetworkAccess): + httpd.allowLocalNetworkAccess, + httpd.city): indexLines.remove(line) os.remove(postFilename) continue diff --git a/shares.py b/shares.py index 970d19f89..8a2e45926 100644 --- a/shares.py +++ b/shares.py @@ -73,7 +73,7 @@ def addShare(baseDir: str, httpPrefix: str, nickname: str, domain: str, port: int, displayName: str, summary: str, imageFilename: str, itemType: str, itemCategory: str, location: str, - duration: str, debug: bool) -> None: + duration: str, debug: bool, city: str) -> None: """Adds a new share """ sharesFilename = baseDir + '/accounts/' + \ @@ -129,8 +129,9 @@ def addShare(baseDir: str, formats = getImageExtensions() for ext in formats: if imageFilename.endswith('.' + ext): - processMetaData(baseDir, nickname, domain, - imageFilename, itemIDfile + '.' + ext) + processMetaData(baseDir, nickname, + imageFilename, itemIDfile + '.' + ext, + city) if moveImage: os.remove(imageFilename) imageUrl = \ @@ -513,7 +514,7 @@ def sendUndoShareViaServer(baseDir: str, session, def outboxShareUpload(baseDir: str, httpPrefix: str, nickname: str, domain: str, port: int, - messageJson: {}, debug: bool) -> None: + messageJson: {}, debug: bool, city: str) -> None: """ When a shared item is received by the outbox from c2s """ if not messageJson.get('type'): @@ -565,7 +566,7 @@ def outboxShareUpload(baseDir: str, httpPrefix: str, messageJson['object']['itemCategory'], messageJson['object']['location'], messageJson['object']['duration'], - debug) + debug, city) if debug: print('DEBUG: shared item received via c2s') diff --git a/tests.py b/tests.py index 15bdb9ccf..19315a810 100644 --- a/tests.py +++ b/tests.py @@ -10,6 +10,7 @@ import time import os import shutil import json +import datetime from time import gmtime, strftime from pprint import pprint from httpsig import signPostHeaders @@ -75,6 +76,7 @@ from like import likePost from like import sendLikeViaServer from announce import announcePublic from announce import sendAnnounceViaServer +from media import spoofGeolocation from media import getMediaPath from media import getAttachmentMediaType from delete import sendDeleteViaServer @@ -463,6 +465,7 @@ def createServerAlice(path: str, domain: str, port: int, testAttachImageFilename = None testMediaType = None testImageDescription = None + testCity = 'London' createPublicPost(path, nickname, domain, port, httpPrefix, "No wise fish would go anywhere without a porpoise", testFollowersOnly, @@ -471,7 +474,7 @@ def createServerAlice(path: str, domain: str, port: int, testCommentsEnabled, testAttachImageFilename, testMediaType, - testImageDescription) + testImageDescription, testCity) createPublicPost(path, nickname, domain, port, httpPrefix, "Curiouser and curiouser!", testFollowersOnly, @@ -480,7 +483,7 @@ def createServerAlice(path: str, domain: str, port: int, testCommentsEnabled, testAttachImageFilename, testMediaType, - testImageDescription) + testImageDescription, testCity) createPublicPost(path, nickname, domain, port, httpPrefix, "In the gardens of memory, in the palace " + "of dreams, that is where you and I shall meet", @@ -490,7 +493,7 @@ def createServerAlice(path: str, domain: str, port: int, testCommentsEnabled, testAttachImageFilename, testMediaType, - testImageDescription) + testImageDescription, testCity) global testServerAliceRunning testServerAliceRunning = True maxMentions = 10 @@ -506,8 +509,10 @@ def createServerAlice(path: str, domain: str, port: int, brochMode = False showNodeInfoAccounts = True showNodeInfoVersion = True + city = 'London' print('Server running: Alice') - runDaemon(showNodeInfoAccounts, + runDaemon(city, + showNodeInfoAccounts, showNodeInfoVersion, brochMode, verifyAllSignatures, @@ -564,6 +569,7 @@ def createServerBob(path: str, domain: str, port: int, testAttachImageFilename = None testImageDescription = None testMediaType = None + testCity = 'London' createPublicPost(path, nickname, domain, port, httpPrefix, "It's your life, live it your way.", testFollowersOnly, @@ -572,7 +578,7 @@ def createServerBob(path: str, domain: str, port: int, testCommentsEnabled, testAttachImageFilename, testMediaType, - testImageDescription) + testImageDescription, testCity) createPublicPost(path, nickname, domain, port, httpPrefix, "One of the things I've realised is that " + "I am very simple", @@ -582,7 +588,7 @@ def createServerBob(path: str, domain: str, port: int, testCommentsEnabled, testAttachImageFilename, testMediaType, - testImageDescription) + testImageDescription, testCity) createPublicPost(path, nickname, domain, port, httpPrefix, "Quantum physics is a bit of a passion of mine", testFollowersOnly, @@ -591,7 +597,7 @@ def createServerBob(path: str, domain: str, port: int, testCommentsEnabled, testAttachImageFilename, testMediaType, - testImageDescription) + testImageDescription, testCity) global testServerBobRunning testServerBobRunning = True maxMentions = 10 @@ -607,8 +613,10 @@ def createServerBob(path: str, domain: str, port: int, brochMode = False showNodeInfoAccounts = True showNodeInfoVersion = True + city = 'London' print('Server running: Bob') - runDaemon(showNodeInfoAccounts, + runDaemon(city, + showNodeInfoAccounts, showNodeInfoVersion, brochMode, verifyAllSignatures, @@ -662,8 +670,10 @@ def createServerEve(path: str, domain: str, port: int, federationList: [], brochMode = False showNodeInfoAccounts = True showNodeInfoVersion = True + city = 'London' print('Server running: Eve') - runDaemon(showNodeInfoAccounts, + runDaemon(city, + showNodeInfoAccounts, showNodeInfoVersion, brochMode, verifyAllSignatures, @@ -768,6 +778,7 @@ def testPostMessageBetweenServers(): mediaType = getAttachmentMediaType(attachedImageFilename) attachedImageDescription = 'Logo' isArticle = False + city = 'London' # nothing in Alice's outbox outboxPath = aliceDir + '/accounts/alice@' + aliceDomain + '/outbox' assert len([name for name in os.listdir(outboxPath) @@ -782,7 +793,7 @@ def testPostMessageBetweenServers(): followersOnly, saveToFile, clientToServer, True, attachedImageFilename, mediaType, - attachedImageDescription, federationList, + attachedImageDescription, city, federationList, aliceSendThreads, alicePostLog, aliceCachedWebfingers, alicePersonCache, isArticle, inReplyTo, inReplyToAtomUri, subject) @@ -1085,13 +1096,14 @@ def testFollowBetweenServers(): aliceCachedWebfingers = {} alicePostLog = [] isArticle = False + city = 'London' sendResult = \ sendPost(__version__, sessionAlice, aliceDir, 'alice', aliceDomain, alicePort, 'bob', bobDomain, bobPort, ccUrl, httpPrefix, 'Alice message', followersOnly, saveToFile, clientToServer, True, - None, None, None, federationList, + None, None, None, city, federationList, aliceSendThreads, alicePostLog, aliceCachedWebfingers, alicePersonCache, isArticle, inReplyTo, inReplyToAtomUri, subject) @@ -1390,7 +1402,7 @@ def testCreatePerson(): createPublicPost(baseDir, nickname, domain, port, httpPrefix, "G'day world!", False, True, clientToServer, True, None, None, None, None, - 'Not suitable for Vogons') + 'Not suitable for Vogons', 'London') os.chdir(currDir) shutil.rmtree(baseDir) @@ -1593,6 +1605,7 @@ def testClientToServer(): attachedImageFilename = baseDir + '/img/logo.png' mediaType = getAttachmentMediaType(attachedImageFilename) attachedImageDescription = 'Logo' + city = 'London' isArticle = False cachedWebfingers = {} personCache = {} @@ -1611,7 +1624,7 @@ def testClientToServer(): httpPrefix, 'Sent from my ActivityPub client', followersOnly, True, attachedImageFilename, mediaType, - attachedImageDescription, + attachedImageDescription, city, cachedWebfingers, personCache, isArticle, True, None, None, None) print('sendResult: ' + str(sendResult)) @@ -2822,11 +2835,21 @@ def testReplyToPublicPost() -> None: port = 443 httpPrefix = 'https' postId = httpPrefix + '://rat.site/users/ninjarodent/statuses/63746173435' + content = "@ninjarodent@rat.site This is a test." + followersOnly = False + saveToFile = False + clientToServer = False + commentsEnabled = True + attachImageFilename = None + mediaType = None + imageDescription = 'Some description' + city = 'London' reply = \ createPublicPost(baseDir, nickname, domain, port, httpPrefix, - "@ninjarodent@rat.site This is a test.", - False, False, False, True, - None, None, False, postId) + content, followersOnly, saveToFile, + clientToServer, commentsEnabled, + attachImageFilename, mediaType, + imageDescription, city, postId) # print(str(reply)) assert reply['object']['content'] == \ '

' + \ @@ -3244,11 +3267,20 @@ def testLinksWithinPost() -> None: httpPrefix = 'https' content = 'This is a test post with links.\n\n' + \ 'ftp://ftp.ncdc.noaa.gov/pub/data/ghcn/v4/\n\nhttps://freedombone.net' + followersOnly = False + saveToFile = False + clientToServer = False + commentsEnabled = True + mediaType = None + imageDescription = None + city = 'London' + postJsonObject = \ createPublicPost(baseDir, nickname, domain, port, httpPrefix, - content, - False, False, False, True, - None, None, False, None) + content, followersOnly, saveToFile, + clientToServer, commentsEnabled, + mediaType, imageDescription, city, + False, None) assert postJsonObject['object']['content'] == \ '

This is a test post with links.

' + \ '
None: assert not removePostInteractions(postJsonObject, False) +def testSpoofGeolocation() -> None: + print('testSpoofGeolocation') + citiesList = [ + 'NEW YORK, USA:40.6397:W73.7789', + 'LOS ANGELES, USA:33.9425:W118.408', + 'HOUSTON, USA:29.9803:W95.3397' + ] + currTime = datetime.datetime.utcnow() + coords = spoofGeolocation('', 'los angeles', currTime, citiesList) + assert coords[0] >= 33.9425 - 0.1 + assert coords[0] <= 33.9425 + 0.1 + assert coords[1] >= 118.408 - 0.1 + assert coords[1] <= 118.408 + 0.1 + assert coords[2] == 'N' + assert coords[3] == 'W' + + def runAllTests(): print('Running tests...') testFunctions() + testSpoofGeolocation() testRemovePostInteractions() testExtractPGPPublicKey() testEmojiImages() From 67ab24db90e59bed92defd236a47187d4f5e5502 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 9 May 2021 20:29:53 +0100 Subject: [PATCH 0915/1416] Default geolocation --- desktop_client.py | 6 +++--- epicyon.py | 12 ++++++------ inbox.py | 2 +- media.py | 6 +++--- newsdaemon.py | 2 +- tests.py | 29 ++++++++++++++++++----------- 6 files changed, 32 insertions(+), 25 deletions(-) diff --git a/desktop_client.py b/desktop_client.py index 088120efa..de1ad92b0 100644 --- a/desktop_client.py +++ b/desktop_client.py @@ -458,7 +458,7 @@ def _desktopReplyToPost(session, postId: str, isArticle = False subject = None commentsEnabled = True - city = 'London' + city = 'London, England' sayStr = 'Sending reply' _sayCommand(sayStr, sayStr, screenreader, systemLanguage, espeak) if sendPostViaServer(__version__, @@ -515,7 +515,7 @@ def _desktopNewPost(session, attach = None mediaType = None attachedImageDescription = None - city = 'London' + city = 'London, England' isArticle = False subject = None commentsEnabled = True @@ -1160,7 +1160,7 @@ def _desktopNewDMbase(session, toHandle: str, attach = None mediaType = None attachedImageDescription = None - city = 'London' + city = 'London, England' isArticle = False subject = None commentsEnabled = True diff --git a/epicyon.py b/epicyon.py index 63907e75c..c7c6a4438 100644 --- a/epicyon.py +++ b/epicyon.py @@ -465,7 +465,7 @@ parser.add_argument('--attach', dest='attach', type=str, parser.add_argument('--imagedescription', dest='imageDescription', type=str, default=None, help='Description of an attached image') parser.add_argument('--city', dest='city', type=str, - default='London', + default='London, England', help='Spoofed city for image metadata misdirection') parser.add_argument('--warning', '--warn', '--cwsubject', '--subject', dest='subject', type=str, default=None, @@ -1113,7 +1113,7 @@ if args.message: followersOnly = args.followersonly clientToServer = args.client attachedImageDescription = args.imageDescription - city = 'London' + city = 'London, England' sendThreads = [] postLog = [] personCache = {} @@ -1963,7 +1963,7 @@ if args.avatar: if not args.nickname: print('Specify a nickname with --nickname [name]') sys.exit() - city = 'London' + city = 'London, England' if setProfileImage(baseDir, httpPrefix, args.nickname, domain, port, args.avatar, 'avatar', '128x128', city): print('Avatar added for ' + args.nickname) @@ -1978,7 +1978,7 @@ if args.backgroundImage: if not args.nickname: print('Specify a nickname with --nickname [name]') sys.exit() - city = 'London' + city = 'London, England' if setProfileImage(baseDir, httpPrefix, args.nickname, domain, port, args.backgroundImage, 'background', '256x256', city): @@ -2354,7 +2354,7 @@ if args.unfilterStr: sys.exit() if args.testdata: - city = 'London' + city = 'London, England' nickname = 'testuser567' password = 'boringpassword' print('Generating some test data for user: ' + nickname) @@ -2424,7 +2424,7 @@ if args.testdata: testAttachImageFilename = None testMediaType = None testImageDescription = None - testCity = 'London' + testCity = 'London, England' createPublicPost(baseDir, nickname, domain, port, httpPrefix, "like this is totally just a #test man", diff --git a/inbox.py b/inbox.py index 1a6ecc235..825e06df3 100644 --- a/inbox.py +++ b/inbox.py @@ -2183,7 +2183,7 @@ def _bounceDM(senderPostId: str, session, httpPrefix: str, attachImageFilename = None mediaType = None imageDescription = '' - city = 'London' + city = 'London, England' inReplyTo = removeIdEnding(senderPostId) inReplyToAtomUri = None schedulePost = False diff --git a/media.py b/media.py index 0c50284b9..fb90b07d0 100644 --- a/media.py +++ b/media.py @@ -65,10 +65,10 @@ def spoofGeolocation(baseDir: str, if not os.path.isfile(locationsFilename): locationsFilename = baseDir + '/locations.txt' variance = 0.2 - default_latitude = 51.5069 - default_longitude = -0.1114 + default_latitude = 51.8744 + default_longitude = 0.368333 default_latdirection = 'N' - default_longdirection = 'E' + default_longdirection = 'W' if citiesList: cities = citiesList diff --git a/newsdaemon.py b/newsdaemon.py index ad43836cf..e4484beea 100644 --- a/newsdaemon.py +++ b/newsdaemon.py @@ -531,7 +531,7 @@ def _convertRSStoActivityPub(baseDir: str, httpPrefix: str, attachImageFilename = None mediaType = None imageDescription = None - city = 'London' + city = 'London, England' blog = createNewsPost(baseDir, domain, port, httpPrefix, rssDescription, diff --git a/tests.py b/tests.py index 19315a810..39a4a0299 100644 --- a/tests.py +++ b/tests.py @@ -465,7 +465,7 @@ def createServerAlice(path: str, domain: str, port: int, testAttachImageFilename = None testMediaType = None testImageDescription = None - testCity = 'London' + testCity = 'London, England' createPublicPost(path, nickname, domain, port, httpPrefix, "No wise fish would go anywhere without a porpoise", testFollowersOnly, @@ -509,7 +509,7 @@ def createServerAlice(path: str, domain: str, port: int, brochMode = False showNodeInfoAccounts = True showNodeInfoVersion = True - city = 'London' + city = 'London, England' print('Server running: Alice') runDaemon(city, showNodeInfoAccounts, @@ -569,7 +569,7 @@ def createServerBob(path: str, domain: str, port: int, testAttachImageFilename = None testImageDescription = None testMediaType = None - testCity = 'London' + testCity = 'London, England' createPublicPost(path, nickname, domain, port, httpPrefix, "It's your life, live it your way.", testFollowersOnly, @@ -613,7 +613,7 @@ def createServerBob(path: str, domain: str, port: int, brochMode = False showNodeInfoAccounts = True showNodeInfoVersion = True - city = 'London' + city = 'London, England' print('Server running: Bob') runDaemon(city, showNodeInfoAccounts, @@ -670,7 +670,7 @@ def createServerEve(path: str, domain: str, port: int, federationList: [], brochMode = False showNodeInfoAccounts = True showNodeInfoVersion = True - city = 'London' + city = 'London, England' print('Server running: Eve') runDaemon(city, showNodeInfoAccounts, @@ -778,7 +778,7 @@ def testPostMessageBetweenServers(): mediaType = getAttachmentMediaType(attachedImageFilename) attachedImageDescription = 'Logo' isArticle = False - city = 'London' + city = 'London, England' # nothing in Alice's outbox outboxPath = aliceDir + '/accounts/alice@' + aliceDomain + '/outbox' assert len([name for name in os.listdir(outboxPath) @@ -1096,7 +1096,7 @@ def testFollowBetweenServers(): aliceCachedWebfingers = {} alicePostLog = [] isArticle = False - city = 'London' + city = 'London, England' sendResult = \ sendPost(__version__, sessionAlice, aliceDir, 'alice', aliceDomain, alicePort, @@ -1402,7 +1402,7 @@ def testCreatePerson(): createPublicPost(baseDir, nickname, domain, port, httpPrefix, "G'day world!", False, True, clientToServer, True, None, None, None, None, - 'Not suitable for Vogons', 'London') + 'Not suitable for Vogons', 'London, England') os.chdir(currDir) shutil.rmtree(baseDir) @@ -1605,7 +1605,7 @@ def testClientToServer(): attachedImageFilename = baseDir + '/img/logo.png' mediaType = getAttachmentMediaType(attachedImageFilename) attachedImageDescription = 'Logo' - city = 'London' + city = 'London, England' isArticle = False cachedWebfingers = {} personCache = {} @@ -2843,7 +2843,7 @@ def testReplyToPublicPost() -> None: attachImageFilename = None mediaType = None imageDescription = 'Some description' - city = 'London' + city = 'London, England' reply = \ createPublicPost(baseDir, nickname, domain, port, httpPrefix, content, followersOnly, saveToFile, @@ -3273,7 +3273,7 @@ def testLinksWithinPost() -> None: commentsEnabled = True mediaType = None imageDescription = None - city = 'London' + city = 'London, England' postJsonObject = \ createPublicPost(baseDir, nickname, domain, port, httpPrefix, @@ -3683,6 +3683,13 @@ def testSpoofGeolocation() -> None: assert coords[1] <= 118.408 + 0.1 assert coords[2] == 'N' assert coords[3] == 'W' + coords = spoofGeolocation('', 'unknown', currTime, citiesList) + assert coords[0] >= 51.8744 - 0.1 + assert coords[0] <= 51.8744 + 0.1 + assert coords[1] >= 0.368333 - 0.1 + assert coords[1] <= 0.368333 + 0.1 + assert coords[2] == 'N' + assert coords[3] == 'W' def runAllTests(): From f22e6ee20a3db034ff1b106b903632dec69097da Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 9 May 2021 22:21:45 +0100 Subject: [PATCH 0916/1416] Dropdown for spoofed city --- daemon.py | 419 +++++++++++++++++++++++++------------------ translations/ar.json | 3 +- translations/ca.json | 3 +- translations/cy.json | 3 +- translations/de.json | 3 +- translations/en.json | 3 +- translations/es.json | 3 +- translations/fr.json | 3 +- translations/ga.json | 3 +- translations/hi.json | 3 +- translations/it.json | 3 +- translations/ja.json | 3 +- translations/ku.json | 3 +- translations/oc.json | 3 +- translations/pt.json | 3 +- translations/ru.json | 3 +- translations/zh.json | 3 +- webapp_profile.py | 36 +++- 18 files changed, 308 insertions(+), 195 deletions(-) diff --git a/daemon.py b/daemon.py index 9541bb1cc..4fd957396 100644 --- a/daemon.py +++ b/daemon.py @@ -312,6 +312,18 @@ def saveDomainQrcode(baseDir: str, httpPrefix: str, class PubServer(BaseHTTPRequestHandler): protocol_version = 'HTTP/1.1' + def _getSpoofedCity(self, baseDir: str, nickname: str, domain: str) -> str: + """Returns the name of the city to use as a GPS spoofing location for + image metadata + """ + city = self.server.city + cityFilename = baseDir + '/accounts/' + \ + nickname + '@' + domain + '/city.txt' + if os.path.isfile(cityFilename): + with open(cityFilename, 'r') as fp: + city = fp.read().replace('\n', '') + return city + def _getInstalceUrl(self, callingDomain: str) -> str: """Returns the URL for this instance """ @@ -420,6 +432,9 @@ class PubServer(BaseHTTPRequestHandler): eventDate = None eventTime = None location = None + city = self._getSpoofedCity(self.server.baseDir, + nickname, self.server.domain) + messageJson = \ createPublicPost(self.server.baseDir, nickname, @@ -428,7 +443,7 @@ class PubServer(BaseHTTPRequestHandler): answer, False, False, False, commentsEnabled, attachImageFilename, mediaType, - imageDescription, self.server.city, + imageDescription, city, inReplyTo, inReplyToAtomUri, subject, @@ -1144,9 +1159,13 @@ class PubServer(BaseHTTPRequestHandler): Client to server message post https://www.w3.org/TR/activitypub/#client-to-server-outbox-delivery """ + city = self.server.city + if postToNickname: print('Posting to nickname ' + postToNickname) self.postToNickname = postToNickname + city = self._getSpoofedCity(self.server.baseDir, + postToNickname, self.server.domain) return postMessageToOutbox(self.server.session, self.server.translate, @@ -1171,7 +1190,7 @@ class PubServer(BaseHTTPRequestHandler): self.server.YTReplacementDomain, self.server.showPublishedDateOnly, self.server.allowLocalNetworkAccess, - self.server.city) + city) def _postToOutboxThread(self, messageJson: {}) -> bool: """Creates a thread to send a post @@ -4076,8 +4095,11 @@ class PubServer(BaseHTTPRequestHandler): os.remove(postImageFilename + '.etag') except BaseException: pass + + city = self._getSpoofedCity(baseDir, nickname, domain) + processMetaData(baseDir, nickname, - filename, postImageFilename, self.server.city) + filename, postImageFilename, city) if os.path.isfile(postImageFilename): print('profile update POST ' + mType + ' image or font saved to ' + postImageFilename) @@ -4228,6 +4250,13 @@ class PubServer(BaseHTTPRequestHandler): nickname, pwd) + # change city + if fields.get('cityDropdown'): + cityFilename = baseDir + '/accounts/' + \ + nickname + '@' + domain + '/city.txt' + with open(cityFilename, 'w+') as fp: + fp.write(fields['cityDropdown']) + # change displayed name if fields.get('displayNickname'): if fields['displayNickname'] != actorJson['name']: @@ -4246,118 +4275,175 @@ class PubServer(BaseHTTPRequestHandler): if checkNameAndBio: redirectPath = 'previewAvatar' - # change media instance status - if fields.get('mediaInstance'): - self.server.mediaInstance = False - self.server.defaultTimeline = 'inbox' - if fields['mediaInstance'] == 'on': - self.server.mediaInstance = True - self.server.blogsInstance = False - self.server.newsInstance = False - self.server.defaultTimeline = 'tlmedia' - setConfigParam(baseDir, - "mediaInstance", - self.server.mediaInstance) - setConfigParam(baseDir, - "blogsInstance", - self.server.blogsInstance) - setConfigParam(baseDir, - "newsInstance", - self.server.newsInstance) - else: - if self.server.mediaInstance: + if nickname == adminNickname: + # change media instance status + if fields.get('mediaInstance'): self.server.mediaInstance = False self.server.defaultTimeline = 'inbox' + if fields['mediaInstance'] == 'on': + self.server.mediaInstance = True + self.server.blogsInstance = False + self.server.newsInstance = False + self.server.defaultTimeline = 'tlmedia' setConfigParam(baseDir, "mediaInstance", self.server.mediaInstance) - - # is this a news theme? - if isNewsThemeName(self.server.baseDir, - self.server.themeName): - fields['newsInstance'] = 'on' - - # change news instance status - if fields.get('newsInstance'): - self.server.newsInstance = False - self.server.defaultTimeline = 'inbox' - if fields['newsInstance'] == 'on': - self.server.newsInstance = True - self.server.blogsInstance = False - self.server.mediaInstance = False - self.server.defaultTimeline = 'tlfeatures' - setConfigParam(baseDir, - "mediaInstance", - self.server.mediaInstance) - setConfigParam(baseDir, - "blogsInstance", - self.server.blogsInstance) - setConfigParam(baseDir, - "newsInstance", - self.server.newsInstance) - else: - if self.server.newsInstance: - self.server.newsInstance = False - self.server.defaultTimeline = 'inbox' - setConfigParam(baseDir, - "newsInstance", - self.server.mediaInstance) - - # change blog instance status - if fields.get('blogsInstance'): - self.server.blogsInstance = False - self.server.defaultTimeline = 'inbox' - if fields['blogsInstance'] == 'on': - self.server.blogsInstance = True - self.server.mediaInstance = False - self.server.newsInstance = False - self.server.defaultTimeline = 'tlblogs' - setConfigParam(baseDir, - "blogsInstance", - self.server.blogsInstance) - setConfigParam(baseDir, - "mediaInstance", - self.server.mediaInstance) - setConfigParam(baseDir, - "newsInstance", - self.server.newsInstance) - else: - if self.server.blogsInstance: - self.server.blogsInstance = False - self.server.defaultTimeline = 'inbox' setConfigParam(baseDir, "blogsInstance", self.server.blogsInstance) + setConfigParam(baseDir, + "newsInstance", + self.server.newsInstance) + else: + if self.server.mediaInstance: + self.server.mediaInstance = False + self.server.defaultTimeline = 'inbox' + setConfigParam(baseDir, + "mediaInstance", + self.server.mediaInstance) - # change theme - if fields.get('themeDropdown'): - self.server.themeName = fields['themeDropdown'] - setTheme(baseDir, self.server.themeName, domain, - allowLocalNetworkAccess, systemLanguage) - self.server.textModeBanner = \ - getTextModeBanner(self.server.baseDir) - self.server.iconsCache = {} - self.server.fontsCache = {} - self.server.showPublishAsIcon = \ - getConfigParam(self.server.baseDir, - 'showPublishAsIcon') - self.server.fullWidthTimelineButtonHeader = \ - getConfigParam(self.server.baseDir, - 'fullWidthTimelineButtonHeader') - self.server.iconsAsButtons = \ - getConfigParam(self.server.baseDir, - 'iconsAsButtons') - self.server.rssIconAtTop = \ - getConfigParam(self.server.baseDir, - 'rssIconAtTop') - self.server.publishButtonAtTop = \ - getConfigParam(self.server.baseDir, - 'publishButtonAtTop') - setNewsAvatar(baseDir, - fields['themeDropdown'], - httpPrefix, - domain, - domainFull) + # is this a news theme? + if isNewsThemeName(self.server.baseDir, + self.server.themeName): + fields['newsInstance'] = 'on' + + # change news instance status + if fields.get('newsInstance'): + self.server.newsInstance = False + self.server.defaultTimeline = 'inbox' + if fields['newsInstance'] == 'on': + self.server.newsInstance = True + self.server.blogsInstance = False + self.server.mediaInstance = False + self.server.defaultTimeline = 'tlfeatures' + setConfigParam(baseDir, + "mediaInstance", + self.server.mediaInstance) + setConfigParam(baseDir, + "blogsInstance", + self.server.blogsInstance) + setConfigParam(baseDir, + "newsInstance", + self.server.newsInstance) + else: + if self.server.newsInstance: + self.server.newsInstance = False + self.server.defaultTimeline = 'inbox' + setConfigParam(baseDir, + "newsInstance", + self.server.mediaInstance) + + # change blog instance status + if fields.get('blogsInstance'): + self.server.blogsInstance = False + self.server.defaultTimeline = 'inbox' + if fields['blogsInstance'] == 'on': + self.server.blogsInstance = True + self.server.mediaInstance = False + self.server.newsInstance = False + self.server.defaultTimeline = 'tlblogs' + setConfigParam(baseDir, + "blogsInstance", + self.server.blogsInstance) + setConfigParam(baseDir, + "mediaInstance", + self.server.mediaInstance) + setConfigParam(baseDir, + "newsInstance", + self.server.newsInstance) + else: + if self.server.blogsInstance: + self.server.blogsInstance = False + self.server.defaultTimeline = 'inbox' + setConfigParam(baseDir, + "blogsInstance", + self.server.blogsInstance) + + # change theme + if fields.get('themeDropdown'): + self.server.themeName = fields['themeDropdown'] + setTheme(baseDir, self.server.themeName, domain, + allowLocalNetworkAccess, systemLanguage) + self.server.textModeBanner = \ + getTextModeBanner(self.server.baseDir) + self.server.iconsCache = {} + self.server.fontsCache = {} + self.server.showPublishAsIcon = \ + getConfigParam(self.server.baseDir, + 'showPublishAsIcon') + self.server.fullWidthTimelineButtonHeader = \ + getConfigParam(self.server.baseDir, + 'fullWidthTimelineButtonHeader') + self.server.iconsAsButtons = \ + getConfigParam(self.server.baseDir, + 'iconsAsButtons') + self.server.rssIconAtTop = \ + getConfigParam(self.server.baseDir, + 'rssIconAtTop') + self.server.publishButtonAtTop = \ + getConfigParam(self.server.baseDir, + 'publishButtonAtTop') + setNewsAvatar(baseDir, + fields['themeDropdown'], + httpPrefix, + domain, + domainFull) + + # change instance title + if fields.get('instanceTitle'): + currInstanceTitle = \ + getConfigParam(baseDir, 'instanceTitle') + if fields['instanceTitle'] != currInstanceTitle: + setConfigParam(baseDir, 'instanceTitle', + fields['instanceTitle']) + + # change YouTube alternate domain + if fields.get('ytdomain'): + currYTDomain = self.server.YTReplacementDomain + if fields['ytdomain'] != currYTDomain: + newYTDomain = fields['ytdomain'] + if '://' in newYTDomain: + newYTDomain = newYTDomain.split('://')[1] + if '/' in newYTDomain: + newYTDomain = newYTDomain.split('/')[0] + if '.' in newYTDomain: + setConfigParam(baseDir, + 'youtubedomain', + newYTDomain) + self.server.YTReplacementDomain = \ + newYTDomain + else: + setConfigParam(baseDir, + 'youtubedomain', '') + self.server.YTReplacementDomain = None + + # change instance description + currInstanceDescriptionShort = \ + getConfigParam(baseDir, + 'instanceDescriptionShort') + if fields.get('instanceDescriptionShort'): + if fields['instanceDescriptionShort'] != \ + currInstanceDescriptionShort: + iDesc = fields['instanceDescriptionShort'] + setConfigParam(baseDir, + 'instanceDescriptionShort', + iDesc) + else: + if currInstanceDescriptionShort: + setConfigParam(baseDir, + 'instanceDescriptionShort', '') + currInstanceDescription = \ + getConfigParam(baseDir, 'instanceDescription') + if fields.get('instanceDescription'): + if fields['instanceDescription'] != \ + currInstanceDescription: + setConfigParam(baseDir, + 'instanceDescription', + fields['instanceDescription']) + else: + if currInstanceDescription: + setConfigParam(baseDir, + 'instanceDescription', '') # change email address currentEmailAddress = getEmailAddress(actorJson) @@ -4538,62 +4624,6 @@ class PubServer(BaseHTTPRequestHandler): del actorJson['alsoKnownAs'] actorChanged = True - # change instance title - if fields.get('instanceTitle'): - currInstanceTitle = \ - getConfigParam(baseDir, 'instanceTitle') - if fields['instanceTitle'] != currInstanceTitle: - setConfigParam(baseDir, 'instanceTitle', - fields['instanceTitle']) - - # change YouTube alternate domain - if fields.get('ytdomain'): - currYTDomain = self.server.YTReplacementDomain - if fields['ytdomain'] != currYTDomain: - newYTDomain = fields['ytdomain'] - if '://' in newYTDomain: - newYTDomain = newYTDomain.split('://')[1] - if '/' in newYTDomain: - newYTDomain = newYTDomain.split('/')[0] - if '.' in newYTDomain: - setConfigParam(baseDir, - 'youtubedomain', - newYTDomain) - self.server.YTReplacementDomain = \ - newYTDomain - else: - setConfigParam(baseDir, - 'youtubedomain', '') - self.server.YTReplacementDomain = None - - # change instance description - currInstanceDescriptionShort = \ - getConfigParam(baseDir, - 'instanceDescriptionShort') - if fields.get('instanceDescriptionShort'): - if fields['instanceDescriptionShort'] != \ - currInstanceDescriptionShort: - iDesc = fields['instanceDescriptionShort'] - setConfigParam(baseDir, - 'instanceDescriptionShort', - iDesc) - else: - if currInstanceDescriptionShort: - setConfigParam(baseDir, - 'instanceDescriptionShort', '') - currInstanceDescription = \ - getConfigParam(baseDir, 'instanceDescription') - if fields.get('instanceDescription'): - if fields['instanceDescription'] != \ - currInstanceDescription: - setConfigParam(baseDir, - 'instanceDescription', - fields['instanceDescription']) - else: - if currInstanceDescription: - setConfigParam(baseDir, - 'instanceDescription', '') - # change user bio if fields.get('bio'): if fields['bio'] != actorJson['summary']: @@ -10295,6 +10325,11 @@ class PubServer(BaseHTTPRequestHandler): """ if '/users/' in path and path.endswith('/editprofile'): peertubeInstances = self.server.peertubeInstances + nickname = getNicknameFromActor(path) + if nickname: + city = self._getSpoofedCity(baseDir, nickname, domain) + else: + city = self.server.city msg = htmlEditProfile(self.server.cssCache, translate, baseDir, @@ -10304,7 +10339,8 @@ class PubServer(BaseHTTPRequestHandler): self.server.defaultTimeline, self.server.themeName, peertubeInstances, - self.server.textModeBanner).encode('utf-8') + self.server.textModeBanner, + city).encode('utf-8') if msg: msglen = len(msg) self._set_headers('text/html', msglen, @@ -13055,9 +13091,11 @@ class PubServer(BaseHTTPRequestHandler): filename.endswith('.gif'): postImageFilename = filename.replace('.temp', '') print('Removing metadata from ' + postImageFilename) + city = self._getSpoofedCity(self.server.baseDir, + nickname, self.server.domain) processMetaData(self.server.baseDir, nickname, filename, postImageFilename, - self.server.city) + city) if os.path.isfile(postImageFilename): print('POST media saved to ' + postImageFilename) else: @@ -13162,6 +13200,8 @@ class PubServer(BaseHTTPRequestHandler): nickname, self.server.domain) return 1 + city = self._getSpoofedCity(self.server.baseDir, + nickname, self.server.domain) messageJson = \ createPublicPost(self.server.baseDir, nickname, @@ -13172,7 +13212,7 @@ class PubServer(BaseHTTPRequestHandler): False, False, False, commentsEnabled, filename, attachmentMediaType, fields['imageDescription'], - self.server.city, + city, fields['replyTo'], fields['replyTo'], fields['subject'], fields['schedulePost'], fields['eventDate'], fields['eventTime'], @@ -13309,6 +13349,9 @@ class PubServer(BaseHTTPRequestHandler): imgDescription = fields['imageDescription'] if filename: + city = self._getSpoofedCity(self.server.baseDir, + nickname, + self.server.domain) postJsonObject['object'] = \ attachMedia(self.server.baseDir, self.server.httpPrefix, @@ -13319,7 +13362,7 @@ class PubServer(BaseHTTPRequestHandler): filename, attachmentMediaType, imgDescription, - self.server.city) + city) replaceYouTube(postJsonObject, self.server.YTReplacementDomain) @@ -13341,6 +13384,9 @@ class PubServer(BaseHTTPRequestHandler): str(fields['postUrl'])) return -1 elif postType == 'newunlisted': + city = self._getSpoofedCity(self.server.baseDir, + nickname, + self.server.domain) messageJson = \ createUnlistedPost(self.server.baseDir, nickname, @@ -13350,7 +13396,7 @@ class PubServer(BaseHTTPRequestHandler): False, False, False, commentsEnabled, filename, attachmentMediaType, fields['imageDescription'], - self.server.city, + city, fields['replyTo'], fields['replyTo'], fields['subject'], @@ -13372,6 +13418,9 @@ class PubServer(BaseHTTPRequestHandler): else: return -1 elif postType == 'newfollowers': + city = self._getSpoofedCity(self.server.baseDir, + nickname, + self.server.domain) messageJson = \ createFollowersOnlyPost(self.server.baseDir, nickname, @@ -13383,7 +13432,7 @@ class PubServer(BaseHTTPRequestHandler): commentsEnabled, filename, attachmentMediaType, fields['imageDescription'], - self.server.city, + city, fields['replyTo'], fields['replyTo'], fields['subject'], @@ -13425,6 +13474,9 @@ class PubServer(BaseHTTPRequestHandler): maximumAttendeeCapacity = \ int(fields['maximumAttendeeCapacity']) + city = self._getSpoofedCity(self.server.baseDir, + nickname, + self.server.domain) messageJson = \ createEventPost(self.server.baseDir, nickname, @@ -13436,7 +13488,7 @@ class PubServer(BaseHTTPRequestHandler): False, False, commentsEnabled, filename, attachmentMediaType, fields['imageDescription'], - self.server.city, + city, fields['subject'], fields['schedulePost'], fields['eventDate'], @@ -13462,6 +13514,9 @@ class PubServer(BaseHTTPRequestHandler): messageJson = None print('A DM was posted') if '@' in mentionsStr: + city = self._getSpoofedCity(self.server.baseDir, + nickname, + self.server.domain) messageJson = \ createDirectMessagePost(self.server.baseDir, nickname, @@ -13474,7 +13529,7 @@ class PubServer(BaseHTTPRequestHandler): commentsEnabled, filename, attachmentMediaType, fields['imageDescription'], - self.server.city, + city, fields['replyTo'], fields['replyTo'], fields['subject'], @@ -13503,6 +13558,9 @@ class PubServer(BaseHTTPRequestHandler): print('A reminder was posted for ' + handle) if '@' + handle not in mentionsStr: mentionsStr = '@' + handle + ' ' + mentionsStr + city = self._getSpoofedCity(self.server.baseDir, + nickname, + self.server.domain) messageJson = \ createDirectMessagePost(self.server.baseDir, nickname, @@ -13513,7 +13571,7 @@ class PubServer(BaseHTTPRequestHandler): True, False, False, False, filename, attachmentMediaType, fields['imageDescription'], - self.server.city, + city, None, None, fields['subject'], True, fields['schedulePost'], @@ -13537,6 +13595,9 @@ class PubServer(BaseHTTPRequestHandler): # and not accounts being reported we disable any # included fediverse addresses by replacing '@' with '-at-' fields['message'] = fields['message'].replace('@', '-at-') + city = self._getSpoofedCity(self.server.baseDir, + nickname, + self.server.domain) messageJson = \ createReportPost(self.server.baseDir, nickname, @@ -13546,7 +13607,7 @@ class PubServer(BaseHTTPRequestHandler): True, False, False, True, filename, attachmentMediaType, fields['imageDescription'], - self.server.city, + city, self.server.debug, fields['subject']) if messageJson: if self._postToOutbox(messageJson, __version__, nickname): @@ -13566,6 +13627,9 @@ class PubServer(BaseHTTPRequestHandler): str(questionCtr)]) if not qOptions: return -1 + city = self._getSpoofedCity(self.server.baseDir, + nickname, + self.server.domain) messageJson = \ createQuestionPost(self.server.baseDir, nickname, @@ -13577,7 +13641,7 @@ class PubServer(BaseHTTPRequestHandler): commentsEnabled, filename, attachmentMediaType, fields['imageDescription'], - self.server.city, + city, fields['subject'], int(fields['duration'])) if messageJson: @@ -13602,6 +13666,9 @@ class PubServer(BaseHTTPRequestHandler): if durationStr: if ' ' not in durationStr: durationStr = durationStr + ' days' + city = self._getSpoofedCity(self.server.baseDir, + nickname, + self.server.domain) addShare(self.server.baseDir, self.server.httpPrefix, nickname, @@ -13614,7 +13681,7 @@ class PubServer(BaseHTTPRequestHandler): fields['location'], durationStr, self.server.debug, - self.server.city) + city) if filename: if os.path.isfile(filename): os.remove(filename) @@ -14837,10 +14904,6 @@ def runDaemon(city: str, # spoofed city for gps location misdirection httpd.city = city - cityFilename = baseDir + '/accounts/city.txt' - if os.path.isfile(cityFilename): - with open(cityFilename, 'r') as fp: - httpd.city = fp.read().replace('\n', '') # For moderated newswire feeds this is the amount of time allowed # for voting after the post arrives diff --git a/translations/ar.json b/translations/ar.json index a16ebaa19..29042f88f 100644 --- a/translations/ar.json +++ b/translations/ar.json @@ -440,5 +440,6 @@ "These access keys may be used": "قد يتم استخدام مفاتيح الوصول هذه، عادة مع مفتاح ALT + SHIFT + مفتاح ALT +", "Show numbers of accounts within instance metadata": "إظهار عدد الحسابات داخل البيانات الوصفية للمثيلات", "Show version number within instance metadata": "إظهار رقم الإصدار داخل البيانات الوصفية للمثيل", - "Joined": "تاريخ الانضمام" + "Joined": "تاريخ الانضمام", + "City for spoofed GPS image metadata": "مدينة للبيانات الوصفية لصور GPS المخادعة" } diff --git a/translations/ca.json b/translations/ca.json index a1739b8f8..f16675caf 100644 --- a/translations/ca.json +++ b/translations/ca.json @@ -440,5 +440,6 @@ "These access keys may be used": "Es poden utilitzar aquestes tecles d'accés, típicament amb Alt + Maj + tecla o Alt + clau", "Show numbers of accounts within instance metadata": "Mostra el nombre de comptes a les metadades de la instància", "Show version number within instance metadata": "Mostra el número de versió a les metadades de la instància", - "Joined": "Data d'unió" + "Joined": "Data d'unió", + "City for spoofed GPS image metadata": "Ciutat per a metadades d'imatges GPS falsificades" } diff --git a/translations/cy.json b/translations/cy.json index 06f365df7..dde27f918 100644 --- a/translations/cy.json +++ b/translations/cy.json @@ -440,5 +440,6 @@ "These access keys may be used": "Gellir defnyddio'r allweddi mynediad hyn, fel arfer gyda ALT + Shift + Allwedd Allwedd neu ALT +", "Show numbers of accounts within instance metadata": "Dangos nifer y cyfrifon o fewn metadata", "Show version number within instance metadata": "Dangos rhif y fersiwn o fewn metadata", - "Joined": "Dyddiad ymuno" + "Joined": "Dyddiad ymuno", + "City for spoofed GPS image metadata": "Dinas ar gyfer metadata delwedd GPS spoofed" } diff --git a/translations/de.json b/translations/de.json index 87a610034..e4f00a856 100644 --- a/translations/de.json +++ b/translations/de.json @@ -440,5 +440,6 @@ "These access keys may be used": "Diese Zugriffstasten können verwendet werden, typischerweise mit ALT + SHIFT + -Taste oder ALT + -Taste", "Show numbers of accounts within instance metadata": "Anzahl der Konten in Instanzmetadaten anzeigen", "Show version number within instance metadata": "Versionsnummer in Instanzmetadaten anzeigen", - "Joined": "Verbundenes Datum" + "Joined": "Verbundenes Datum", + "City for spoofed GPS image metadata": "Stadt für gefälschte GPS-Bildmetadaten" } diff --git a/translations/en.json b/translations/en.json index 93c245167..387101a1e 100644 --- a/translations/en.json +++ b/translations/en.json @@ -440,5 +440,6 @@ "These access keys may be used": "These access keys may be used, typically with ALT + SHIFT + key or ALT + key", "Show numbers of accounts within instance metadata": "Show numbers of accounts within instance metadata", "Show version number within instance metadata": "Show version number within instance metadata", - "Joined": "Joined" + "Joined": "Joined", + "City for spoofed GPS image metadata": "City for spoofed GPS image metadata" } diff --git a/translations/es.json b/translations/es.json index 15849bc83..bded71c6b 100644 --- a/translations/es.json +++ b/translations/es.json @@ -440,5 +440,6 @@ "These access keys may be used": "Se pueden usar estas teclas de acceso, típicamente con teclas ALT + MAYÚS + teclas o ALT +", "Show numbers of accounts within instance metadata": "Muestra el número de cuentas dentro de los metadatos de la instancia.", "Show version number within instance metadata": "Mostrar el número de versión dentro de los metadatos de la instancia", - "Joined": "Fecha unida" + "Joined": "Fecha unida", + "City for spoofed GPS image metadata": "Ciudad para metadatos de imagen GPS falsificados" } diff --git a/translations/fr.json b/translations/fr.json index 6f8d9e7e5..9f73c5ee2 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -440,5 +440,6 @@ "These access keys may be used": "Ces touches d'accès peuvent être utilisées typiquement avec une touche Alt + Maj + ou Alt +", "Show numbers of accounts within instance metadata": "Afficher le nombre de comptes dans les métadonnées de l'instance", "Show version number within instance metadata": "Afficher le numéro de version dans les métadonnées de l'instance", - "Joined": "Joint" + "Joined": "Joint", + "City for spoofed GPS image metadata": "Ville pour les métadonnées d'image GPS falsifiées" } diff --git a/translations/ga.json b/translations/ga.json index 2473e9712..be92f6613 100644 --- a/translations/ga.json +++ b/translations/ga.json @@ -440,5 +440,6 @@ "These access keys may be used": "Is féidir na heochracha rochtana seo a úsáid, de ghnáth le Alt + Shift + Eochair nó Alt + Eochair", "Show numbers of accounts within instance metadata": "Taispeáin líon na gcuntas laistigh de mheiteashonraí", "Show version number within instance metadata": "Taispeáin uimhir an leagain laistigh de mheiteashonraí", - "Joined": "Dáta comhcheangailte" + "Joined": "Dáta comhcheangailte", + "City for spoofed GPS image metadata": "Cathair le haghaidh meiteashonraí íomhá GPS spoofed" } diff --git a/translations/hi.json b/translations/hi.json index 520c9ce47..d2f1df28f 100644 --- a/translations/hi.json +++ b/translations/hi.json @@ -440,5 +440,6 @@ "These access keys may be used": "इन एक्सेस कुंजियों का उपयोग किया जा सकता है, आमतौर पर Alt + Shift + कुंजी या Alt + कुंजी के साथ", "Show numbers of accounts within instance metadata": "उदाहरण मेटाडेटा के भीतर खातों की संख्या दिखाएं", "Show version number within instance metadata": "उदाहरण मेटाडेटा के भीतर संस्करण संख्या दिखाएं", - "Joined": "दिनांक" + "Joined": "दिनांक", + "City for spoofed GPS image metadata": "स्पूफ जीपीएस जीपीएस मेटाडेटा के लिए शहर" } diff --git a/translations/it.json b/translations/it.json index 0473de4f0..95f68e575 100644 --- a/translations/it.json +++ b/translations/it.json @@ -440,5 +440,6 @@ "These access keys may be used": "Questi tasti di accesso possono essere utilizzati, in genere con tasto ALT + MAIUSC + o ALT + Key", "Show numbers of accounts within instance metadata": "Mostra il numero di account all'interno dei metadati dell'istanza", "Show version number within instance metadata": "Mostra il numero di versione nei metadati dell'istanza", - "Joined": "Unito" + "Joined": "Unito", + "City for spoofed GPS image metadata": "Città per metadati di immagini GPS falsificate" } diff --git a/translations/ja.json b/translations/ja.json index 972432fe1..44aa8f38c 100644 --- a/translations/ja.json +++ b/translations/ja.json @@ -440,5 +440,6 @@ "These access keys may be used": "これらのアクセスキーは、通常はAlt + Shift +キーまたはAlt +キーを使用して使用できます。", "Show numbers of accounts within instance metadata": "インスタンスメタデータ内のアカウント数を表示する", "Show version number within instance metadata": "インスタンスメタデータ内にバージョン番号を表示する", - "Joined": "参加日" + "Joined": "参加日", + "City for spoofed GPS image metadata": "なりすましGPS画像メタデータの都市" } diff --git a/translations/ku.json b/translations/ku.json index 452a3ea93..3f1295df3 100644 --- a/translations/ku.json +++ b/translations/ku.json @@ -440,5 +440,6 @@ "These access keys may be used": "Dibe ku ev keysên gihîştinê bikar bînin, bi gelemperî bi alt + shift + key an alt + key", "Show numbers of accounts within instance metadata": "Di nav metadata mînakê de hejmarên hesaban nîşan bidin", "Show version number within instance metadata": "Di nav metadata mînakê de nimreya guhertoyê nîşan bide", - "Joined": "Beşdarbûna Dîrokê" + "Joined": "Beşdarbûna Dîrokê", + "City for spoofed GPS image metadata": "Bajar ji bo metadata wêneya GPS ya xapînok" } diff --git a/translations/oc.json b/translations/oc.json index 40ca10e0a..47b3ca685 100644 --- a/translations/oc.json +++ b/translations/oc.json @@ -436,5 +436,6 @@ "These access keys may be used": "These access keys may be used, typically with ALT + SHIFT + key or ALT + key", "Show numbers of accounts within instance metadata": "Show numbers of accounts within instance metadata", "Show version number within instance metadata": "Show version number within instance metadata", - "Joined": "Joined" + "Joined": "Joined", + "City for spoofed GPS image metadata": "City for spoofed GPS image metadata" } diff --git a/translations/pt.json b/translations/pt.json index 28d1a7f06..a139c9f3d 100644 --- a/translations/pt.json +++ b/translations/pt.json @@ -440,5 +440,6 @@ "These access keys may be used": "Essas teclas de acesso podem ser usadas, normalmente com tecla Alt + Shift + Key ou Alt +", "Show numbers of accounts within instance metadata": "Mostra o número de contas nos metadados da instância", "Show version number within instance metadata": "Mostrar o número da versão nos metadados da instância", - "Joined": "Data juntada" + "Joined": "Data juntada", + "City for spoofed GPS image metadata": "Cidade para metadados de imagem GPS falsificados" } diff --git a/translations/ru.json b/translations/ru.json index 55857de58..1d2b79ecc 100644 --- a/translations/ru.json +++ b/translations/ru.json @@ -440,5 +440,6 @@ "These access keys may be used": "Эти ключевые ключи доступа могут быть использованы, обычно с ALT + Shift + Key или Alt + Key", "Show numbers of accounts within instance metadata": "Показать количество учетных записей в метаданных экземпляра", "Show version number within instance metadata": "Показать номер версии в метаданных экземпляра", - "Joined": "Присоединенная дата" + "Joined": "Присоединенная дата", + "City for spoofed GPS image metadata": "Город для поддельных метаданных изображения GPS" } diff --git a/translations/zh.json b/translations/zh.json index c2492f167..cb3996ace 100644 --- a/translations/zh.json +++ b/translations/zh.json @@ -440,5 +440,6 @@ "These access keys may be used": "可以使用这些访问密钥,通常使用Alt + Shift +键或ALT +键", "Show numbers of accounts within instance metadata": "显示实例元数据中的帐户数", "Show version number within instance metadata": "在实例元数据中显示版本号", - "Joined": "加入日期" + "Joined": "加入日期", + "City for spoofed GPS image metadata": "欺骗性GPS影像元数据的城市" } diff --git a/webapp_profile.py b/webapp_profile.py index 8b1ef701d..28db953dd 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -1068,7 +1068,7 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, domain: str, port: int, httpPrefix: str, defaultTimeline: str, theme: str, peertubeInstances: [], - textModeBanner: str) -> str: + textModeBanner: str, city: str) -> str: """Shows the edit profile screen """ imageFormats = getImageFormats() @@ -1770,6 +1770,40 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, editProfileForm += '

' + \ translate['Filtering and Blocking'] + '\n' editProfileForm += '
\n' + + editProfileForm += \ + '
\n' + + cityFilename = baseDir + '/accounts/' + \ + nickname + '@' + domain + '/city.txt' + if os.path.isfile(cityFilename): + with open(cityFilename, 'r') as fp: + city = fp.read().replace('\n', '') + locationsFilename = baseDir + '/custom_locations.txt' + if not os.path.isfile(locationsFilename): + locationsFilename = baseDir + '/locations.txt' + cities = [] + with open(locationsFilename, "r") as f: + cities = f.readlines() + editProfileForm += '
\n' + editProfileForm += \ ' \n' From 45ff85c6de31048834634abde48f78a88be92ab1 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 9 May 2021 22:58:29 +0100 Subject: [PATCH 0917/1416] Sort cities --- webapp_profile.py | 1 + 1 file changed, 1 insertion(+) diff --git a/webapp_profile.py b/webapp_profile.py index 28db953dd..e02201a46 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -1787,6 +1787,7 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, cities = [] with open(locationsFilename, "r") as f: cities = f.readlines() + cities.sort() editProfileForm += ' \n' + occupationName = '' + if actorJson.get('occupationName'): + occupationName = actorJson['occupationName'] + + editProfileForm += '
\n' + editProfileForm += \ + ' \n' + alsoKnownAsStr = '' if actorJson.get('alsoKnownAs'): alsoKnownAs = actorJson['alsoKnownAs'] From 68fe0ed4f8958439efdedf90fa9fb26c0a2dfb90 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 12 May 2021 19:31:41 +0100 Subject: [PATCH 0945/1416] Show occupation on profile screen --- daemon.py | 6 ++++-- webapp_profile.py | 17 ++++++++++++++--- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/daemon.py b/daemon.py index ee039a1db..bee3c8291 100644 --- a/daemon.py +++ b/daemon.py @@ -4596,8 +4596,10 @@ class PubServer(BaseHTTPRequestHandler): if actorJson.get('occupationName'): occupationName = actorJson['occupationName'] if fields.get('occupationName'): - if actorJson['occupationName'] != fields['occupationName']: - actorJson['occupationName'] = fields['occupationName'] + if actorJson['occupationName'] != \ + fields['occupationName']: + actorJson['occupationName'] = \ + fields['occupationName'] actorChanged = True else: if occupationName: diff --git a/webapp_profile.py b/webapp_profile.py index cfc61ec9a..e5b569978 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -343,7 +343,8 @@ def _getProfileHeader(baseDir: str, httpPrefix: str, alsoKnownAs: [], pinnedContent: str, accessKeys: {}, - joinedDate: str) -> str: + joinedDate: str, + occupationName: str) -> str: """The header of the profile screen, containing background image and avatar """ @@ -362,7 +363,14 @@ def _getProfileHeader(baseDir: str, httpPrefix: str, translate['Switch to timeline view'] + '">\n' + \ '
\n' - htmlStr += '

' + displayName + '

\n' + + occupationStr = '' + if occupationName: + occupationStr += \ + ' ' + occupationName + '
\n' + + htmlStr += '

' + displayName + '

\n' + occupationStr + htmlStr += \ '

@' + nickname + '@' + domainFull + '
\n' if joinedDate: @@ -731,6 +739,9 @@ def htmlProfile(rssIconAtTop: bool, if profileJson.get('published'): if 'T' in profileJson['published']: joinedDate = profileJson['published'] + occupationName = None + if profileJson.get('occupationName'): + occupationName = profileJson['occupationName'] avatarUrl = profileJson['icon']['url'] @@ -752,7 +763,7 @@ def htmlProfile(rssIconAtTop: bool, loginButton, avatarUrl, theme, movedTo, alsoKnownAs, pinnedContent, accessKeys, - joinedDate) + joinedDate, occupationName) # keyboard navigation userPathStr = '/users/' + nickname From 802136dfba410518e4f41a1abee337aedbf4ee9a Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 12 May 2021 19:34:49 +0100 Subject: [PATCH 0946/1416] Use variable --- daemon.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daemon.py b/daemon.py index bee3c8291..56af36ce8 100644 --- a/daemon.py +++ b/daemon.py @@ -4596,7 +4596,7 @@ class PubServer(BaseHTTPRequestHandler): if actorJson.get('occupationName'): occupationName = actorJson['occupationName'] if fields.get('occupationName'): - if actorJson['occupationName'] != \ + if occupationName != \ fields['occupationName']: actorJson['occupationName'] = \ fields['occupationName'] From f1e2f696e8174066f0690a67c4bdc2e029b4bfa0 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 12 May 2021 19:37:30 +0100 Subject: [PATCH 0947/1416] Remove any html from occupation --- daemon.py | 1 + 1 file changed, 1 insertion(+) diff --git a/daemon.py b/daemon.py index 56af36ce8..fd3211fb3 100644 --- a/daemon.py +++ b/daemon.py @@ -4596,6 +4596,7 @@ class PubServer(BaseHTTPRequestHandler): if actorJson.get('occupationName'): occupationName = actorJson['occupationName'] if fields.get('occupationName'): + fields['occupationName'] = removeHtml(fields['occupationName']) if occupationName != \ fields['occupationName']: actorJson['occupationName'] = \ From 4a49ec40e121464a1a7db41f3f30dcb9427b00e2 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 12 May 2021 19:37:58 +0100 Subject: [PATCH 0948/1416] Line length --- daemon.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/daemon.py b/daemon.py index fd3211fb3..d72c34d61 100644 --- a/daemon.py +++ b/daemon.py @@ -4596,7 +4596,8 @@ class PubServer(BaseHTTPRequestHandler): if actorJson.get('occupationName'): occupationName = actorJson['occupationName'] if fields.get('occupationName'): - fields['occupationName'] = removeHtml(fields['occupationName']) + fields['occupationName'] = \ + removeHtml(fields['occupationName']) if occupationName != \ fields['occupationName']: actorJson['occupationName'] = \ From 0f0818994ea4b869f609388ac88b3feab66739b6 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 13 May 2021 12:14:14 +0100 Subject: [PATCH 0949/1416] More standard occupation property --- daemon.py | 9 +++++---- person.py | 28 ++++++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/daemon.py b/daemon.py index d72c34d61..7f820f302 100644 --- a/daemon.py +++ b/daemon.py @@ -4593,19 +4593,20 @@ class PubServer(BaseHTTPRequestHandler): # Other accounts (alsoKnownAs) occupationName = "" - if actorJson.get('occupationName'): - occupationName = actorJson['occupationName'] + if actorJson.get('hasOccupation'): + if actorJson['hasOccupation'].get('name'): + occupationName = actorJson['hasOccupation']['name'] if fields.get('occupationName'): fields['occupationName'] = \ removeHtml(fields['occupationName']) if occupationName != \ fields['occupationName']: - actorJson['occupationName'] = \ + actorJson['hasOccupation']['name'] = \ fields['occupationName'] actorChanged = True else: if occupationName: - actorJson['occupationName'] = '' + actorJson['hasOccupation']['name'] = '' actorChanged = True # Other accounts (alsoKnownAs) diff --git a/person.py b/person.py index 389a36026..4a7ac3c24 100644 --- a/person.py +++ b/person.py @@ -219,7 +219,8 @@ def getDefaultPersonContext() -> str: 'schema': 'http://schema.org#', 'suspended': 'toot:suspended', 'toot': 'http://joinmastodon.org/ns#', - 'value': 'schema:value' + 'value': 'schema:value', + 'Occupation': 'schema:Occupation' } @@ -296,7 +297,11 @@ def _createPersonBase(baseDir: str, nickname: str, domain: str, port: int, 'tts': personId + '/speaker', 'shares': personId + '/shares', 'orgSchema': None, - 'occupation': "", + 'hasOccupation': { + '@type': 'Occupation', + 'name': "", + 'skills': "", + }, 'skills': {}, 'roles': {}, 'availability': None, @@ -578,7 +583,26 @@ def personUpgradeActor(baseDir: str, personJson: {}, personJson['published'] = published updateActor = True + occupationName = '' + if personJson.get('occupation'): + occupationName = personJson['occupation'] + del personJson['occupation'] + + if not personJson.get('hasOccupation'): + personJson['hasOccupation'] = { + '@type': 'Occupation', + 'name': occupationName, + 'skills': "", + }, + updateActor = True + if updateActor: + personJson['@context'] = [ + 'https://www.w3.org/ns/activitystreams', + 'https://w3id.org/security/v1', + getDefaultPersonContext() + ], + saveJson(personJson, filename) # also update the actor within the cache From 31bed2bdc54ce4b976b4233b07969d5621f528e1 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 13 May 2021 12:19:31 +0100 Subject: [PATCH 0950/1416] Tidying --- daemon.py | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/daemon.py b/daemon.py index 7f820f302..a91879a98 100644 --- a/daemon.py +++ b/daemon.py @@ -4154,22 +4154,6 @@ class PubServer(BaseHTTPRequestHandler): # which isn't implemented in Epicyon actorJson['discoverable'] = True actorChanged = True - if not actorJson['@context'][2].get('orgSchema'): - actorJson['@context'][2]['orgSchema'] = \ - 'toot:orgSchema' - actorChanged = True - if not actorJson['@context'][2].get('skills'): - actorJson['@context'][2]['skills'] = 'toot:skills' - actorChanged = True - if not actorJson['@context'][2].get('shares'): - actorJson['@context'][2]['shares'] = 'toot:shares' - actorChanged = True - if not actorJson['@context'][2].get('roles'): - actorJson['@context'][2]['roles'] = 'toot:roles' - actorChanged = True - if not actorJson['@context'][2].get('availability'): - actorJson['@context'][2]['availaibility'] = \ - 'toot:availability' if actorJson.get('capabilityAcquisitionEndpoint'): del actorJson['capabilityAcquisitionEndpoint'] actorChanged = True From e126d1ab1f3b38cb4ed2a8d657d323b59ecc1567 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 13 May 2021 12:26:05 +0100 Subject: [PATCH 0951/1416] Stray comma --- person.py | 23 +---------------------- 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/person.py b/person.py index 4a7ac3c24..786dc570b 100644 --- a/person.py +++ b/person.py @@ -141,26 +141,6 @@ def setProfileImage(baseDir: str, httpPrefix: str, nickname: str, domain: str, return False -def setOrganizationScheme(baseDir: str, nickname: str, domain: str, - schema: str) -> bool: - """Set the organization schema within which a person exists - This will define how roles, skills and availability are assembled - into organizations - """ - # avoid giant strings - if len(schema) > 256: - return False - actorFilename = baseDir + '/accounts/' + nickname + '@' + domain + '.json' - if not os.path.isfile(actorFilename): - return False - - actorJson = loadJson(actorFilename) - if actorJson: - actorJson['orgSchema'] = schema - saveJson(actorJson, actorFilename) - return True - - def _accountExists(baseDir: str, nickname: str, domain: str) -> bool: """Returns true if the given account exists """ @@ -296,7 +276,6 @@ def _createPersonBase(baseDir: str, nickname: str, domain: str, port: int, 'following': personId + '/following', 'tts': personId + '/speaker', 'shares': personId + '/shares', - 'orgSchema': None, 'hasOccupation': { '@type': 'Occupation', 'name': "", @@ -593,7 +572,7 @@ def personUpgradeActor(baseDir: str, personJson: {}, '@type': 'Occupation', 'name': occupationName, 'skills': "", - }, + } updateActor = True if updateActor: From 62d90006710783770e5e4d5f4bf9e24496f24f5f Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 13 May 2021 12:27:29 +0100 Subject: [PATCH 0952/1416] Remove occupation name --- person.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/person.py b/person.py index 786dc570b..60c064ae6 100644 --- a/person.py +++ b/person.py @@ -563,6 +563,9 @@ def personUpgradeActor(baseDir: str, personJson: {}, updateActor = True occupationName = '' + if personJson.get('occupationName'): + occupationName = personJson['occupationName'] + del personJson['occupationName'] if personJson.get('occupation'): occupationName = personJson['occupation'] del personJson['occupation'] From ccd02acfeb9a691267879c2620aa1d4f3a4ed261 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 13 May 2021 12:35:36 +0100 Subject: [PATCH 0953/1416] Show occupation name --- webapp_profile.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/webapp_profile.py b/webapp_profile.py index e5b569978..ae42753a0 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -740,8 +740,9 @@ def htmlProfile(rssIconAtTop: bool, if 'T' in profileJson['published']: joinedDate = profileJson['published'] occupationName = None - if profileJson.get('occupationName'): - occupationName = profileJson['occupationName'] + if profileJson.get('hasOccupation'): + if profileJson['hasOccupation'].get('name'): + occupationName = profileJson['hasOccupation']['name'] avatarUrl = profileJson['icon']['url'] @@ -1601,8 +1602,9 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, editProfileForm += ' accept="' + imageFormats + '">\n' occupationName = '' - if actorJson.get('occupationName'): - occupationName = actorJson['occupationName'] + if actorJson.get('hasOccupation'): + if actorJson['hasOccupation'].get('name'): + occupationName = actorJson['hasOccupation']['name'] editProfileForm += '
\n' From 0cc86dc1311196289b3ef3d3c0b11abe74849ea0 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 13 May 2021 14:27:35 +0100 Subject: [PATCH 0954/1416] More standards compliant representation of skills --- daemon.py | 31 +++++++++------ person.py | 12 ++++-- skills.py | 101 +++++++++++++++++++++++++++++++++++++++++------ webapp_search.py | 16 +++++--- webapp_utils.py | 17 +++----- 5 files changed, 132 insertions(+), 45 deletions(-) diff --git a/daemon.py b/daemon.py index a91879a98..05c9eb297 100644 --- a/daemon.py +++ b/daemon.py @@ -98,6 +98,11 @@ from follow import getFollowingFeed from follow import sendFollowRequest from follow import unfollowAccount from follow import createInitialLastSeen +from skills import getSkillsFromString +from skills import noOfActorSkills +from skills import actorHasSkill +from skills import actorSkillValue +from skills import setActorSkillLevel from auth import authorize from auth import createPassword from auth import createBasicAuthHeader @@ -4191,7 +4196,7 @@ class PubServer(BaseHTTPRequestHandler): # set skill levels skillCtr = 1 - newSkills = {} + actorSkillsCtr = noOfActorSkills(actorJson) while skillCtr < 10: skillName = \ fields.get('skillName' + str(skillCtr)) @@ -4206,21 +4211,20 @@ class PubServer(BaseHTTPRequestHandler): if not skillValue: skillCtr += 1 continue - if not actorJson['skills'].get(skillName): + if not actorHasSkill(actorJson, skillName): actorChanged = True else: - if actorJson['skills'][skillName] != \ + if actorSkillValue(actorJson, skillName) != \ int(skillValue): actorChanged = True - newSkills[skillName] = int(skillValue) + setActorSkillLevel(actorJson, skillName, skillValue) skillsStr = self.server.translate['Skills'] setHashtagCategory(baseDir, skillName, skillsStr.lower()) skillCtr += 1 - if len(actorJson['skills'].items()) != \ - len(newSkills.items()): + if noOfActorSkills(actorJson) != \ + actorSkillsCtr: actorChanged = True - actorJson['skills'] = newSkills # change password if fields.get('password'): @@ -7461,7 +7465,7 @@ class PubServer(BaseHTTPRequestHandler): if os.path.isfile(actorFilename): actorJson = loadJson(actorFilename) if actorJson: - if actorJson.get('skills'): + if noOfActorSkills(actorJson) > 0: if self._requestHTTP(): getPerson = \ personLookup(domain, @@ -7486,6 +7490,9 @@ class PubServer(BaseHTTPRequestHandler): if self.server.keyShortcuts.get(nickname): accessKeys = \ self.server.keyShortcuts[nickname] + actorSkillsStr = \ + actorJson['hasOccupation']['skills'] + skills = getSkillsFromString(actorSkillsStr) msg = \ htmlProfile(self.server.rssIconAtTop, self.server.cssCache, @@ -7509,8 +7516,7 @@ class PubServer(BaseHTTPRequestHandler): allowLocalNetworkAccess, self.server.textModeBanner, self.server.debug, - accessKeys, - actorJson['skills'], + accessKeys, skills, None, None) msg = msg.encode('utf-8') msglen = len(msg) @@ -7523,7 +7529,10 @@ class PubServer(BaseHTTPRequestHandler): 'show skills') else: if self._fetchAuthenticated(): - msg = json.dumps(actorJson['skills'], + actorSkillsStr = \ + actorJson['hasOccupation']['skills'] + skills = getSkillsFromString(actorSkillsStr) + msg = json.dumps(skills, ensure_ascii=False) msg = msg.encode('utf-8') msglen = len(msg) diff --git a/person.py b/person.py index 60c064ae6..c029a81ec 100644 --- a/person.py +++ b/person.py @@ -279,9 +279,8 @@ def _createPersonBase(baseDir: str, nickname: str, domain: str, port: int, 'hasOccupation': { '@type': 'Occupation', 'name': "", - 'skills': "", + 'skills': "" }, - 'skills': {}, 'roles': {}, 'availability': None, 'icon': { @@ -317,7 +316,8 @@ def _createPersonBase(baseDir: str, nickname: str, domain: str, port: int, del newPerson['outbox'] del newPerson['icon'] del newPerson['image'] - del newPerson['skills'] + if newPerson.get('skills'): + del newPerson['skills'] del newPerson['shares'] del newPerson['roles'] del newPerson['tag'] @@ -574,10 +574,14 @@ def personUpgradeActor(baseDir: str, personJson: {}, personJson['hasOccupation'] = { '@type': 'Occupation', 'name': occupationName, - 'skills': "", + 'skills': "" } updateActor = True + if personJson.get('skills'): + del personJson['skills'] + updateActor = True + if updateActor: personJson['@context'] = [ 'https://www.w3.org/ns/activitystreams', diff --git a/skills.py b/skills.py index 0609bfd5a..00d258d09 100644 --- a/skills.py +++ b/skills.py @@ -15,7 +15,89 @@ from utils import getFullDomain from utils import getNicknameFromActor from utils import getDomainFromActor from utils import loadJson -from utils import saveJson + + +def _setSkillsFromDict(actorJson: {}, skills: {}) -> None: + """Converts a dict containing skills to a string + """ + skillsStr = '' + for name, value in skills.items(): + if skillsStr: + skillsStr += ', ' + skillsStr += name + ':' + str(value) + return skillsStr + + +def getSkillsFromString(skillsStr: str) -> {}: + """Returns a dict of skills from a string + """ + skillsList = skillsStr.split(',') + skills = {} + for skill in skillsList: + if ':' not in skill: + continue + name = skill.split(':')[0].strip().lower() + valueStr = skill.split(':')[1] + if not valueStr.isdigit(): + continue + skills[name] = int(valueStr) + return skills + + +def actorHasSkill(actorJson: {}, skillName: str) -> bool: + """Returns true if the actor has the given skill + """ + skills = getSkillsFromString(actorJson['hasOccupation']['skills']) + if not skills: + return False + return skills.get(skillName.lower()) + + +def actorSkillValue(actorJson: {}, skillName: str) -> int: + """Returns The skill level from an actor + """ + skills = getSkillsFromString(actorJson['hasOccupation']['skills']) + if not skills: + return 0 + skillName = skillName.lower() + if skills.get(skillName): + return skills[skillName] + return 0 + + +def noOfActorSkills(actorJson: {}) -> int: + """Returns the number of skills that an actor has + """ + if actorJson.get('hasOccupation'): + skillsList = actorJson['hasOccupation']['skills'].split(',') + if skillsList: + return int(skillsList) + return 0 + + +def setActorSkillLevel(actorJson: {}, + skill: str, skillLevelPercent: int) -> bool: + """Set a skill level for a person + Setting skill level to zero removes it + """ + if skillLevelPercent < 0 or skillLevelPercent > 100: + return False + + if actorJson: + if not actorJson.get('hasOccupation'): + actorJson['hasOccupation'] = { + '@type': 'Occupation', + 'name': '', + 'skills': '' + } + skills = getSkillsFromString(actorJson['hasOccupation']['skills']) + if skillLevelPercent > 0: + skills[skill] = skillLevelPercent + else: + if skills.get(skill): + del skills[skill] + _setSkillsFromDict(actorJson, skills) + return True def setSkillLevel(baseDir: str, nickname: str, domain: str, @@ -30,15 +112,8 @@ def setSkillLevel(baseDir: str, nickname: str, domain: str, return False actorJson = loadJson(actorFilename) - if actorJson: - if not actorJson.get('skills'): - actorJson['skills'] = {} - if skillLevelPercent > 0: - actorJson['skills'][skill] = skillLevelPercent - else: - del actorJson['skills'][skill] - saveJson(actorJson, actorFilename) - return True + return setActorSkillLevel(actorJson, + skill, skillLevelPercent) def getSkills(baseDir: str, nickname: str, domain: str) -> []: @@ -50,9 +125,9 @@ def getSkills(baseDir: str, nickname: str, domain: str) -> []: actorJson = loadJson(actorFilename) if actorJson: - if not actorJson.get('skills'): + if not actorJson.get('hasOccupation'): return None - return actorJson['skills'] + return getSkillsFromString(actorJson['hasOccupation']['skills']) return None @@ -112,7 +187,7 @@ def sendSkillViaServer(baseDir: str, session, nickname: str, password: str, newSkillJson = { 'type': 'Skill', 'actor': actor, - 'object': '"'+skillStr+'"', + 'object': '"' + skillStr + '"', 'to': [toUrl], 'cc': [ccUrl] } diff --git a/webapp_search.py b/webapp_search.py index 7148e57d2..131d019a3 100644 --- a/webapp_search.py +++ b/webapp_search.py @@ -20,6 +20,8 @@ from utils import locatePost from utils import isPublicPost from utils import firstParagraphFromString from utils import searchBoxPosts +from skills import noOfActorSkills +from skills import getSkillsFromString from categories import getHashtagCategory from feeds import rss2TagHeader from feeds import rss2TagFooter @@ -414,11 +416,13 @@ def htmlSkillsSearch(actor: str, actorJson = loadJson(actorFilename) if actorJson: if actorJson.get('id') and \ - actorJson.get('skills') and \ + noOfActorSkills(actorJson) > 0 and \ actorJson.get('name') and \ actorJson.get('icon'): actor = actorJson['id'] - for skillName, skillLevel in actorJson['skills'].items(): + actorSkillsStr = actorJson['hasOccupation']['skills'] + skills = getSkillsFromString(actorSkillsStr) + for skillName, skillLevel in skills.items(): skillName = skillName.lower() if not (skillName in skillsearch or skillsearch in skillName): @@ -453,12 +457,14 @@ def htmlSkillsSearch(actor: str, if cachedActorJson.get('actor'): actorJson = cachedActorJson['actor'] if actorJson.get('id') and \ - actorJson.get('skills') and \ + noOfActorSkills(actorJson) > 0 and \ actorJson.get('name') and \ actorJson.get('icon'): actor = actorJson['id'] - for skillName, skillLevel in \ - actorJson['skills'].items(): + actorSkillsStr = \ + actorJson['hasOccupation']['skills'] + skills = getSkillsFromString(actorSkillsStr) + for skillName, skillLevel in skills.items(): skillName = skillName.lower() if not (skillName in skillsearch or skillsearch in skillName): diff --git a/webapp_utils.py b/webapp_utils.py index 65c68b87f..ba812dccb 100644 --- a/webapp_utils.py +++ b/webapp_utils.py @@ -720,18 +720,11 @@ def htmlHeaderWithPersonMarkup(cssFilename: str, instanceTitle: str, return htmlStr skillsMarkup = '' - if actorJson.get('skills'): - skillsStr = '' - for skillName, skillValue in actorJson['skills'].items(): - if skillsStr: - skillsStr += ', ' + skillName - else: - skillsStr += skillName - if skillsStr: - occupationStr = '' - if actorJson.get('occupationName'): - occupationName = actorJson['occupationName'] - occupationStr = ' "name": "' + occupationName + '",\n' + if actorJson.get('hasOccupation'): + skillsStr = actorJson['hasOccupation']['skills'] + if actorJson['hasOccupation'].get('name'): + occupationName = actorJson['hasOccupation']['name'] + occupationStr = ' "name": "' + occupationName + '",\n' skillsMarkup = \ ' "hasOccupation": {\n' + \ ' "@type": "Occupation",\n' + \ From 94675dd67355f9dbeb265dca61efde1b3cde9933 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 13 May 2021 14:29:27 +0100 Subject: [PATCH 0955/1416] Length --- skills.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skills.py b/skills.py index 00d258d09..5a6ac7870 100644 --- a/skills.py +++ b/skills.py @@ -71,7 +71,7 @@ def noOfActorSkills(actorJson: {}) -> int: if actorJson.get('hasOccupation'): skillsList = actorJson['hasOccupation']['skills'].split(',') if skillsList: - return int(skillsList) + return len(skillsList) return 0 From 40ed35c239223f7a2edca1dd8f0fe37571d7acc0 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 13 May 2021 14:31:42 +0100 Subject: [PATCH 0956/1416] Skill value --- daemon.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daemon.py b/daemon.py index 05c9eb297..9f4fdf87a 100644 --- a/daemon.py +++ b/daemon.py @@ -4217,7 +4217,7 @@ class PubServer(BaseHTTPRequestHandler): if actorSkillValue(actorJson, skillName) != \ int(skillValue): actorChanged = True - setActorSkillLevel(actorJson, skillName, skillValue) + setActorSkillLevel(actorJson, skillName, int(skillValue)) skillsStr = self.server.translate['Skills'] setHashtagCategory(baseDir, skillName, skillsStr.lower()) From 57015d6000303053b94272816e2db498dc22b61e Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 13 May 2021 15:13:27 +0100 Subject: [PATCH 0957/1416] Unit tests for skills functions --- daemon.py | 3 ++- skills.py | 58 ++++++++++++++++++++++++++++++------------------------- tests.py | 25 ++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 27 deletions(-) diff --git a/daemon.py b/daemon.py index 9f4fdf87a..82ada2b1f 100644 --- a/daemon.py +++ b/daemon.py @@ -4217,7 +4217,8 @@ class PubServer(BaseHTTPRequestHandler): if actorSkillValue(actorJson, skillName) != \ int(skillValue): actorChanged = True - setActorSkillLevel(actorJson, skillName, int(skillValue)) + setActorSkillLevel(actorJson, + skillName, int(skillValue)) skillsStr = self.server.translate['Skills'] setHashtagCategory(baseDir, skillName, skillsStr.lower()) diff --git a/skills.py b/skills.py index 5a6ac7870..0c13d4165 100644 --- a/skills.py +++ b/skills.py @@ -17,14 +17,16 @@ from utils import getDomainFromActor from utils import loadJson -def _setSkillsFromDict(actorJson: {}, skills: {}) -> None: +def setSkillsFromDict(actorJson: {}, skillsDict: {}) -> str: """Converts a dict containing skills to a string + Returns the string version of the dictionary """ skillsStr = '' - for name, value in skills.items(): + for name, value in skillsDict.items(): if skillsStr: skillsStr += ', ' skillsStr += name + ':' + str(value) + actorJson['hasOccupation']['skills'] = skillsStr return skillsStr @@ -32,7 +34,7 @@ def getSkillsFromString(skillsStr: str) -> {}: """Returns a dict of skills from a string """ skillsList = skillsStr.split(',') - skills = {} + skillsDict = {} for skill in skillsList: if ':' not in skill: continue @@ -40,28 +42,30 @@ def getSkillsFromString(skillsStr: str) -> {}: valueStr = skill.split(':')[1] if not valueStr.isdigit(): continue - skills[name] = int(valueStr) - return skills + skillsDict[name] = int(valueStr) + return skillsDict def actorHasSkill(actorJson: {}, skillName: str) -> bool: """Returns true if the actor has the given skill """ - skills = getSkillsFromString(actorJson['hasOccupation']['skills']) - if not skills: + skillsDict = \ + getSkillsFromString(actorJson['hasOccupation']['skills']) + if not skillsDict: return False - return skills.get(skillName.lower()) + return skillsDict.get(skillName.lower()) def actorSkillValue(actorJson: {}, skillName: str) -> int: """Returns The skill level from an actor """ - skills = getSkillsFromString(actorJson['hasOccupation']['skills']) - if not skills: + skillsDict = \ + getSkillsFromString(actorJson['hasOccupation']['skills']) + if not skillsDict: return 0 skillName = skillName.lower() - if skills.get(skillName): - return skills[skillName] + if skillsDict.get(skillName): + return skillsDict[skillName] return 0 @@ -83,20 +87,22 @@ def setActorSkillLevel(actorJson: {}, if skillLevelPercent < 0 or skillLevelPercent > 100: return False - if actorJson: - if not actorJson.get('hasOccupation'): - actorJson['hasOccupation'] = { - '@type': 'Occupation', - 'name': '', - 'skills': '' - } - skills = getSkillsFromString(actorJson['hasOccupation']['skills']) - if skillLevelPercent > 0: - skills[skill] = skillLevelPercent - else: - if skills.get(skill): - del skills[skill] - _setSkillsFromDict(actorJson, skills) + if not actorJson: + return True + if not actorJson.get('hasOccupation'): + actorJson['hasOccupation'] = { + '@type': 'Occupation', + 'name': '', + 'skills': '' + } + skillsDict = \ + getSkillsFromString(actorJson['hasOccupation']['skills']) + if skillLevelPercent > 0: + skillsDict[skill] = skillLevelPercent + else: + if skillsDict.get(skill): + del skillsDict[skill] + setSkillsFromDict(actorJson, skillsDict) return True diff --git a/tests.py b/tests.py index 541eb52af..e4b2300d0 100644 --- a/tests.py +++ b/tests.py @@ -67,6 +67,8 @@ from person import setDisplayNickname from person import setBio # from person import generateRSAKey from skills import setSkillLevel +from skills import setSkillsFromDict +from skills import getSkillsFromString from roles import setRole from roles import outboxDelegate from auth import constantTimeStringCheck @@ -3731,9 +3733,32 @@ def testSpoofGeolocation() -> None: kmlFile.close() +def testSkills() -> None: + print('testSkills') + actorJson = { + 'hasOccupation': { + '@type': 'Occupation', + 'name': "", + 'skills': "" + } + } + skillsDict = { + 'bakery': 40, + 'gardening': 70 + } + setSkillsFromDict(actorJson, skillsDict) + assert actorJson['hasOccupation']['skills'] + skillsDict = getSkillsFromString(actorJson['hasOccupation']['skills']) + assert skillsDict.get('bakery') + assert skillsDict.get('gardening') + assert skillsDict['bakery'] == 40 + assert skillsDict['gardening'] == 70 + + def runAllTests(): print('Running tests...') testFunctions() + testSkills() testSpoofGeolocation() testRemovePostInteractions() testExtractPGPPublicKey() From 7e48beb0fe813f04b8829964a0b31eb7c2b4b1be Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 13 May 2021 20:58:16 +0100 Subject: [PATCH 0958/1416] Remove role delegation The keeps the handling of roles very simple --- README_commandline.md | 46 ------- city.py | 5 +- daemon.py | 26 ++-- epicyon.py | 111 +---------------- outbox.py | 7 +- person.py | 40 ++++-- roles.py | 281 ++++++++---------------------------------- tests.py | 104 ++++------------ webapp_profile.py | 20 ++- 9 files changed, 140 insertions(+), 500 deletions(-) diff --git a/README_commandline.md b/README_commandline.md index af39f363d..9529671b9 100644 --- a/README_commandline.md +++ b/README_commandline.md @@ -310,52 +310,6 @@ python3 epicyon.py --domainmax 1000 --accountmax 200 With these settings you're going to be receiving no more than 200 messages for any given account within a day. -## Delegated roles - -Within an organization you may want to define different roles and for some projects to be delegated. By default the first account added to the system will be the admin, and be assigned *moderator* and *delegator* roles under a project called *instance*. The admin can then delegate a person to other projects with: - -``` bash -python3 epicyon.py --nickname [admin nickname] --domain [mydomain] \ - --delegate [person nickname] \ - --project [project name] --role [title] \ - --password [c2s password] -``` - -The other person could also be made a delegator, but they will only be able to delegate further within projects which they're assigned to. By design, this creates a restricted organizational hierarchy. For example: - -``` bash -python3 epicyon.py --nickname [admin nickname] --domain [mydomain] \ - --delegate [person nickname] \ - --project [project name] --role delegator \ - --password [c2s password] -``` - -A delegated role can also be removed. - -``` bash -python3 epicyon.py --nickname [admin nickname] --domain [mydomain] \ - --undelegate [person nickname] \ - --project [project name] \ - --password [c2s password] -``` - -This extends the ActivityPub client-to-server protocol to include activities called *Delegate* and *Role*. The JSON looks like: - -``` json -{ 'type': 'Delegate', - 'actor': https://somedomain/users/admin, - 'object': { - 'type': 'Role', - 'actor': https://'+somedomain+'/users/'+other, - 'object': 'otherproject;otherrole', - 'to': [], - 'cc': [] - }, - 'to': [], - 'cc': []} -``` - -Projects and roles are only scoped within a single instance. There presently are not enough security mechanisms to support multi-instance distributed organizations. ## Assigning skills diff --git a/city.py b/city.py index d34142908..3ea9983b7 100644 --- a/city.py +++ b/city.py @@ -128,7 +128,7 @@ def _getCityPulse(currTimeOfDay, decoySeed: int) -> (float, float): def spoofGeolocation(baseDir: str, city: str, currTime, decoySeed: int, - citiesList: []) -> (float, float, str, str, + citiesList: []) -> (float, float, str, str, \ str, str, int): """Given a city and the current time spoofs the location for an image @@ -150,7 +150,8 @@ def spoofGeolocation(baseDir: str, else: if not os.path.isfile(locationsFilename): return (default_latitude, default_longitude, - default_latdirection, default_longdirection) + default_latdirection, default_longdirection, + "", "", 0) cities = [] with open(locationsFilename, "r") as f: cities = f.readlines() diff --git a/daemon.py b/daemon.py index 82ada2b1f..023790a9c 100644 --- a/daemon.py +++ b/daemon.py @@ -124,6 +124,7 @@ from blocking import isBlockedHashtag from blocking import isBlockedDomain from blocking import getDomainBlocklist from roles import setRole +from roles import getRolesFromString from roles import clearModeratorStatus from roles import clearEditorStatus from roles import clearCounselorStatus @@ -4732,7 +4733,7 @@ class PubServer(BaseHTTPRequestHandler): if os.path.isdir(modDir): setRole(baseDir, modNick, domain, - 'instance', 'moderator') + 'moderator') else: # nicknames on separate lines modFile = open(moderatorsFile, "w+") @@ -4757,7 +4758,6 @@ class PubServer(BaseHTTPRequestHandler): if os.path.isdir(modDir): setRole(baseDir, modNick, domain, - 'instance', 'moderator') # change site editors list @@ -4789,7 +4789,7 @@ class PubServer(BaseHTTPRequestHandler): if os.path.isdir(edDir): setRole(baseDir, edNick, domain, - 'instance', 'editor') + 'editor') else: # nicknames on separate lines edFile = open(editorsFile, "w+") @@ -4814,7 +4814,6 @@ class PubServer(BaseHTTPRequestHandler): if os.path.isdir(edDir): setRole(baseDir, edNick, domain, - 'instance', 'editor') # change site counselors list @@ -4846,7 +4845,7 @@ class PubServer(BaseHTTPRequestHandler): if os.path.isdir(edDir): setRole(baseDir, edNick, domain, - 'instance', 'counselor') + 'counselor') else: # nicknames on separate lines edFile = open(counselorsFile, "w+") @@ -4871,7 +4870,6 @@ class PubServer(BaseHTTPRequestHandler): if os.path.isdir(edDir): setRole(baseDir, edNick, domain, - 'instance', 'counselor') # remove scheduled posts @@ -7376,7 +7374,7 @@ class PubServer(BaseHTTPRequestHandler): if not actorJson: return False - if actorJson.get('roles'): + if actorJson.get('affiliation'): if self._requestHTTP(): getPerson = \ personLookup(domain, path.replace('/roles', ''), @@ -7397,6 +7395,10 @@ class PubServer(BaseHTTPRequestHandler): if self.server.keyShortcuts.get(nickname): accessKeys = self.server.keyShortcuts[nickname] + rolesList = [] + if actorJson.get('affiliation'): + actorRolesStr = actorJson['affiliation']['roleName'] + rolesList = getRolesFromString(actorRolesStr) msg = \ htmlProfile(self.server.rssIconAtTop, self.server.cssCache, @@ -7420,8 +7422,7 @@ class PubServer(BaseHTTPRequestHandler): self.server.allowLocalNetworkAccess, self.server.textModeBanner, self.server.debug, - accessKeys, - actorJson['roles'], + accessKeys, rolesList, None, None) msg = msg.encode('utf-8') msglen = len(msg) @@ -7433,7 +7434,12 @@ class PubServer(BaseHTTPRequestHandler): 'show roles') else: if self._fetchAuthenticated(): - msg = json.dumps(actorJson['roles'], + rolesList = [] + if actorJson.get('affiliation'): + actorRolesStr = actorJson['affiliation']['roleName'] + rolesList = getRolesFromString(actorRolesStr) + + msg = json.dumps(rolesList, ensure_ascii=False) msg = msg.encode('utf-8') msglen = len(msg) diff --git a/epicyon.py b/epicyon.py index c7c6a4438..ab5997893 100644 --- a/epicyon.py +++ b/epicyon.py @@ -74,7 +74,6 @@ from media import getAttachmentMediaType from delete import sendDeleteViaServer from like import sendLikeViaServer from like import sendUndoLikeViaServer -from roles import sendRoleViaServer from skills import sendSkillViaServer from availability import setAvailability from availability import sendAvailabilityViaServer @@ -495,9 +494,6 @@ parser.add_argument('--maxEmoji', '--maxemoji', dest='maxEmoji', help='Maximum number of emoji within a post') parser.add_argument('--role', dest='role', type=str, default=None, help='Set a role for a person') -parser.add_argument('--organization', '--project', dest='project', - type=str, default=None, - help='Set a project for a person') parser.add_argument('--skill', dest='skill', type=str, default=None, help='Set a skill for a person') parser.add_argument('--level', dest='skillLevelPercent', type=int, @@ -518,11 +514,6 @@ parser.add_argument('--mute', dest='mute', type=str, default=None, help='Mute a particular post URL') parser.add_argument('--unmute', dest='unmute', type=str, default=None, help='Unmute a particular post URL') -parser.add_argument('--delegate', dest='delegate', type=str, default=None, - help='Address of an account to delegate a role to') -parser.add_argument('--undodelegate', '--undelegate', dest='undelegate', - type=str, default=None, - help='Removes a delegated role for the given address') parser.add_argument('--filter', dest='filterStr', type=str, default=None, help='Adds a word or phrase which if present will ' + 'cause a message to be ignored') @@ -1987,24 +1978,6 @@ if args.backgroundImage: print('Background image was not added for ' + args.nickname) sys.exit() -if args.project: - if not args.delegate and not args.undelegate: - if not nickname: - print('No nickname given') - sys.exit() - - if args.role.lower() == 'none' or \ - args.role.lower() == 'remove' or \ - args.role.lower() == 'delete': - args.role = None - if args.role: - if setRole(baseDir, nickname, domain, args.project, args.role): - print('Role within ' + args.project + ' set to ' + args.role) - else: - if setRole(baseDir, nickname, domain, args.project, None): - print('Left ' + args.project) - sys.exit() - if args.skill: if not nickname: print('Specify a nickname with the --nickname option') @@ -2218,86 +2191,6 @@ if args.unmute: time.sleep(1) sys.exit() -if args.delegate: - if not nickname: - print('Specify a nickname with the --nickname option') - sys.exit() - - if not args.password: - args.password = getpass.getpass('Password: ') - if not args.password: - print('Specify a password with the --password option') - sys.exit() - args.password = args.password.replace('\n', '') - - if not args.project: - print('Specify a project with the --project option') - sys.exit() - - if not args.role: - print('Specify a role with the --role option') - sys.exit() - - if '@' in args.delegate: - delegatedNickname = args.delegate.split('@')[0] - args.delegate = blockedActor - - session = createSession(proxyType) - personCache = {} - cachedWebfingers = {} - print('Sending delegation for ' + args.delegate + - ' with role ' + args.role + ' in project ' + args.project) - - sendRoleViaServer(baseDir, session, - nickname, args.password, - domain, port, - httpPrefix, args.delegate, - args.project, args.role, - cachedWebfingers, personCache, - True, __version__) - for i in range(10): - # TODO detect send success/fail - time.sleep(1) - sys.exit() - -if args.undelegate: - if not nickname: - print('Specify a nickname with the --nickname option') - sys.exit() - - if not args.password: - args.password = getpass.getpass('Password: ') - if not args.password: - print('Specify a password with the --password option') - sys.exit() - args.password = args.password.replace('\n', '') - - if not args.project: - print('Specify a project with the --project option') - sys.exit() - - if '@' in args.undelegate: - delegatedNickname = args.undelegate.split('@')[0] - args.undelegate = blockedActor - - session = createSession(proxyType) - personCache = {} - cachedWebfingers = {} - print('Sending delegation removal for ' + args.undelegate + - ' from role ' + args.role + ' in project ' + args.project) - - sendRoleViaServer(baseDir, session, - nickname, args.password, - domain, port, - httpPrefix, args.delegate, - args.project, None, - cachedWebfingers, personCache, - True, __version__) - for i in range(10): - # TODO detect send success/fail - time.sleep(1) - sys.exit() - if args.unblock: if not nickname: print('Specify a nickname with the --nickname option') @@ -2388,9 +2281,7 @@ if args.testdata: True, False, 'likewhateveryouwantscoob') setSkillLevel(baseDir, nickname, domain, 'testing', 60) setSkillLevel(baseDir, nickname, domain, 'typing', 50) - setRole(baseDir, nickname, domain, 'instance', 'admin') - setRole(baseDir, nickname, domain, 'epicyon', 'hacker') - setRole(baseDir, nickname, domain, 'someproject', 'assistant') + setRole(baseDir, nickname, domain, 'admin') setAvailability(baseDir, nickname, domain, 'busy') addShare(baseDir, diff --git a/outbox.py b/outbox.py index 8da8fa6d2..8f5562d62 100644 --- a/outbox.py +++ b/outbox.py @@ -35,7 +35,6 @@ from inbox import inboxUpdateIndex from announce import outboxAnnounce from announce import outboxUndoAnnounce from follow import outboxUndoFollow -from roles import outboxDelegate from skills import outboxSkills from availability import outboxAvailability from like import outboxLike @@ -313,7 +312,7 @@ def postMessageToOutbox(session, translate: {}, permittedOutboxTypes = ('Create', 'Announce', 'Like', 'Follow', 'Undo', 'Update', 'Add', 'Remove', 'Block', 'Delete', - 'Delegate', 'Skill', 'Add', 'Remove', 'Event', + 'Skill', 'Add', 'Remove', 'Event', 'Ignore') if messageJson['type'] not in permittedOutboxTypes: if debug: @@ -461,10 +460,6 @@ def postMessageToOutbox(session, translate: {}, print('DEBUG: handle any unfollow requests') outboxUndoFollow(baseDir, messageJson, debug) - if debug: - print('DEBUG: handle delegation requests') - outboxDelegate(baseDir, postToNickname, messageJson, debug) - if debug: print('DEBUG: handle skills changes requests') outboxSkills(baseDir, postToNickname, messageJson, debug) diff --git a/person.py b/person.py index c029a81ec..c6ca823e3 100644 --- a/person.py +++ b/person.py @@ -200,7 +200,9 @@ def getDefaultPersonContext() -> str: 'suspended': 'toot:suspended', 'toot': 'http://joinmastodon.org/ns#', 'value': 'schema:value', - 'Occupation': 'schema:Occupation' + 'Occupation': 'schema:Occupation', + 'OrganizationRole': 'schema:OrganizationRole', + 'WebSite': 'schema:Project' } @@ -281,7 +283,15 @@ def _createPersonBase(baseDir: str, nickname: str, domain: str, port: int, 'name': "", 'skills': "" }, - 'roles': {}, + "affiliation": { + "@type": "OrganizationRole", + "roleName": "", + "affiliation": { + "@type": "WebSite", + "url": httpPrefix + '://' + domain + }, + "startDate": published + }, 'availability': None, 'icon': { 'mediaType': 'image/png', @@ -319,7 +329,8 @@ def _createPersonBase(baseDir: str, nickname: str, domain: str, port: int, if newPerson.get('skills'): del newPerson['skills'] del newPerson['shares'] - del newPerson['roles'] + if newPerson.get('roles'): + del newPerson['roles'] del newPerson['tag'] del newPerson['availability'] del newPerson['followers'] @@ -463,10 +474,9 @@ def createPerson(baseDir: str, nickname: str, domain: str, port: int, if nickname != 'news': # print(nickname+' becomes the instance admin and a moderator') setConfigParam(baseDir, 'admin', nickname) - setRole(baseDir, nickname, domain, 'instance', 'admin') - setRole(baseDir, nickname, domain, 'instance', 'moderator') - setRole(baseDir, nickname, domain, 'instance', 'editor') - setRole(baseDir, nickname, domain, 'instance', 'delegator') + setRole(baseDir, nickname, domain, 'admin') + setRole(baseDir, nickname, domain, 'moderator') + setRole(baseDir, nickname, domain, 'editor') if not os.path.isdir(baseDir + '/accounts'): os.mkdir(baseDir + '/accounts') @@ -582,6 +592,22 @@ def personUpgradeActor(baseDir: str, personJson: {}, del personJson['skills'] updateActor = True + if not personJson.get('affiliation'): + personJson['affiliation'] = { + "@type": "OrganizationRole", + "roleName": "", + "affiliation": { + "@type": "WebSite", + "url": personJson['id'].split('/users/')[0] + }, + "startDate": published + } + updateActor = True + + if personJson.get('roles'): + del personJson['roles'] + updateActor = True + if updateActor: personJson['@context'] = [ 'https://www.w3.org/ns/activitystreams', diff --git a/roles.py b/roles.py index f198fe7f0..0ce857d49 100644 --- a/roles.py +++ b/roles.py @@ -37,10 +37,13 @@ def _clearRoleStatus(baseDir: str, role: str) -> None: actorJson = loadJson(filename) if not actorJson: continue - if actorJson['roles'].get('instance'): - if role in actorJson['roles']['instance']: - actorJson['roles']['instance'].remove(role) - saveJson(actorJson, filename) + if not actorJson.get('affiliation'): + continue + rolesList = \ + getRolesFromString(actorJson['affiliation']['roleName']) + if role in rolesList: + rolesList.remove(role) + saveJson(actorJson, filename) def clearEditorStatus(baseDir: str) -> None: @@ -112,13 +115,35 @@ def _removeRole(baseDir: str, nickname: str, roleFilename: str) -> None: f.write(roleNickname + '\n') +def setRolesFromList(actorJson: {}, rolesList: []) -> None: + """Sets roles from a list + """ + rolesStr = '' + for roleName in rolesList: + if rolesStr: + rolesStr += ', ' + rolesStr += roleName.lower() + if actorJson.get('affiliation'): + actorJson['affiliation']['roleName'] = rolesStr + + +def getRolesFromString(rolesStr: str) -> []: + """Returns a list of roles from a string + """ + rolesList = rolesStr.split(',') + rolesResult = [] + for roleName in rolesList: + rolesResult.append(roleName.strip().lower()) + return rolesResult + + def setRole(baseDir: str, nickname: str, domain: str, - project: str, role: str) -> bool: - """Set a person's role within a project + role: str) -> bool: + """Set a person's role Setting the role to an empty string or None will remove it """ # avoid giant strings - if len(role) > 128 or len(project) > 128: + if len(role) > 128: return False actorFilename = baseDir + '/accounts/' + \ nickname + '@' + domain + '.json' @@ -133,230 +158,28 @@ def setRole(baseDir: str, nickname: str, domain: str, actorJson = loadJson(actorFilename) if actorJson: + if not actorJson.get('affiliation'): + return False + rolesList = \ + getRolesFromString(actorJson['affiliation']['roleName']) + actorChanged = False if role: # add the role - if project == 'instance': - if roleFiles.get(role): - _addRole(baseDir, nickname, domain, roleFiles[role]) - if actorJson['roles'].get(project): - if role not in actorJson['roles'][project]: - actorJson['roles'][project].append(role) - else: - actorJson['roles'][project] = [role] + if roleFiles.get(role): + _addRole(baseDir, nickname, domain, roleFiles[role]) + if role not in rolesList: + rolesList.append(role) + rolesList.sort() + setRolesFromList(actorJson, rolesList) + actorChanged = True else: # remove the role - if project == 'instance': - if roleFiles.get(role): - _removeRole(baseDir, nickname, roleFiles[role]) - if actorJson['roles'].get(project): - actorJson['roles'][project].remove(role) - # if the project contains no roles then remove it - if len(actorJson['roles'][project]) == 0: - del actorJson['roles'][project] - saveJson(actorJson, actorFilename) + if roleFiles.get(role): + _removeRole(baseDir, nickname, roleFiles[role]) + if role in rolesList: + rolesList.remove(role) + setRolesFromList(actorJson, rolesList) + actorChanged = True + if actorChanged: + saveJson(actorJson, actorFilename) return True - - -def _getRoles(baseDir: str, nickname: str, domain: str, - project: str) -> []: - """Returns the roles for a given person on a given project - """ - actorFilename = baseDir + '/accounts/' + \ - nickname + '@' + domain + '.json' - if not os.path.isfile(actorFilename): - return False - - actorJson = loadJson(actorFilename) - if actorJson: - if not actorJson.get('roles'): - return None - if not actorJson['roles'].get(project): - return None - return actorJson['roles'][project] - return None - - -def outboxDelegate(baseDir: str, authenticatedNickname: str, - messageJson: {}, debug: bool) -> bool: - """Handles receiving a delegation request - """ - if not messageJson.get('type'): - return False - if not messageJson['type'] == 'Delegate': - return False - if not messageJson.get('object'): - return False - if not isinstance(messageJson['object'], dict): - return False - if not messageJson['object'].get('type'): - return False - if not messageJson['object']['type'] == 'Role': - return False - if not messageJson['object'].get('object'): - return False - if not messageJson['object'].get('actor'): - return False - if not isinstance(messageJson['object']['object'], str): - return False - if ';' not in messageJson['object']['object']: - print('WARN: No ; separator between project and role') - return False - - delegatorNickname = getNicknameFromActor(messageJson['actor']) - if delegatorNickname != authenticatedNickname: - return - domain, port = getDomainFromActor(messageJson['actor']) - project = messageJson['object']['object'].split(';')[0].strip() - - # instance delegators can delagate to other projects - # than their own - canDelegate = False - delegatorRoles = _getRoles(baseDir, delegatorNickname, - domain, 'instance') - if delegatorRoles: - if 'delegator' in delegatorRoles: - canDelegate = True - - if not canDelegate: - canDelegate = True - # non-instance delegators can only delegate within their project - delegatorRoles = _getRoles(baseDir, delegatorNickname, - domain, project) - if delegatorRoles: - if 'delegator' not in delegatorRoles: - return False - else: - return False - - if not canDelegate: - return False - nickname = getNicknameFromActor(messageJson['object']['actor']) - if not nickname: - print('WARN: unable to find nickname in ' + - messageJson['object']['actor']) - return False - role = \ - messageJson['object']['object'].split(';')[1].strip().lower() - - if not role: - setRole(baseDir, nickname, domain, project, None) - return True - - # what roles is this person already assigned to? - existingRoles = _getRoles(baseDir, nickname, domain, project) - if existingRoles: - if role in existingRoles: - if debug: - print(nickname + '@' + domain + - ' is already assigned to the role ' + - role + ' within the project ' + project) - return False - setRole(baseDir, nickname, domain, project, role) - if debug: - print(nickname + '@' + domain + - ' assigned to the role ' + role + - ' within the project ' + project) - return True - - -def sendRoleViaServer(baseDir: str, session, - delegatorNickname: str, password: str, - delegatorDomain: str, delegatorPort: int, - httpPrefix: str, nickname: str, - project: str, role: str, - cachedWebfingers: {}, personCache: {}, - debug: bool, projectVersion: str) -> {}: - """A delegator creates a role for a person via c2s - Setting role to an empty string or None removes the role - """ - if not session: - print('WARN: No session for sendRoleViaServer') - return 6 - - delegatorDomainFull = getFullDomain(delegatorDomain, delegatorPort) - - toUrl = \ - httpPrefix + '://' + delegatorDomainFull + '/users/' + nickname - ccUrl = \ - httpPrefix + '://' + delegatorDomainFull + '/users/' + \ - delegatorNickname + '/followers' - - if role: - roleStr = project.lower() + ';' + role.lower() - else: - roleStr = project.lower() + ';' - actor = \ - httpPrefix + '://' + delegatorDomainFull + \ - '/users/' + delegatorNickname - delegateActor = \ - httpPrefix + '://' + delegatorDomainFull + '/users/' + nickname - newRoleJson = { - 'type': 'Delegate', - 'actor': actor, - 'object': { - 'type': 'Role', - 'actor': delegateActor, - 'object': roleStr, - 'to': [toUrl], - 'cc': [ccUrl] - }, - 'to': [toUrl], - 'cc': [ccUrl] - } - - handle = \ - httpPrefix + '://' + delegatorDomainFull + '/@' + delegatorNickname - - # lookup the inbox for the To handle - wfRequest = webfingerHandle(session, handle, httpPrefix, - cachedWebfingers, - delegatorDomain, projectVersion, debug) - if not wfRequest: - if debug: - print('DEBUG: role webfinger failed for ' + handle) - return 1 - if not isinstance(wfRequest, dict): - print('WARN: role webfinger for ' + handle + - ' did not return a dict. ' + str(wfRequest)) - return 1 - - postToBox = 'outbox' - - # get the actor inbox for the To handle - (inboxUrl, pubKeyId, pubKey, - fromPersonId, sharedInbox, - avatarUrl, displayName) = getPersonBox(baseDir, session, - wfRequest, personCache, - projectVersion, httpPrefix, - delegatorNickname, - delegatorDomain, postToBox, - 765672) - - if not inboxUrl: - if debug: - print('DEBUG: role no ' + postToBox + - ' was found for ' + handle) - return 3 - if not fromPersonId: - if debug: - print('DEBUG: role no actor was found for ' + handle) - return 4 - - authHeader = createBasicAuthHeader(delegatorNickname, password) - - headers = { - 'host': delegatorDomain, - 'Content-type': 'application/json', - 'Authorization': authHeader - } - postResult = \ - postJson(session, newRoleJson, [], inboxUrl, headers, 30, True) - if not postResult: - if debug: - print('DEBUG: POST role failed for c2s to ' + inboxUrl) -# return 5 - - if debug: - print('DEBUG: c2s POST role success') - - return newRoleJson diff --git a/tests.py b/tests.py index e4b2300d0..1b53f0f2e 100644 --- a/tests.py +++ b/tests.py @@ -69,8 +69,9 @@ from person import setBio from skills import setSkillLevel from skills import setSkillsFromDict from skills import getSkillsFromString +from roles import setRolesFromList +from roles import getRolesFromString from roles import setRole -from roles import outboxDelegate from auth import constantTimeStringCheck from auth import createBasicAuthHeader from auth import authorizeBasic @@ -454,7 +455,7 @@ def createServerAlice(path: str, domain: str, port: int, deleteAllPosts(path, nickname, domain, 'inbox') deleteAllPosts(path, nickname, domain, 'outbox') assert setSkillLevel(path, nickname, domain, 'hacking', 90) - assert setRole(path, nickname, domain, 'someproject', 'guru') + assert setRole(path, nickname, domain, 'guru') if hasFollows: followPerson(path, nickname, domain, 'bob', bobAddress, federationList, False) @@ -558,8 +559,6 @@ def createServerBob(path: str, domain: str, port: int, False, password) deleteAllPosts(path, nickname, domain, 'inbox') deleteAllPosts(path, nickname, domain, 'outbox') - assert setRole(path, nickname, domain, 'bandname', 'bass player') - assert setRole(path, nickname, domain, 'bandname', 'publicist') if hasFollows: followPerson(path, nickname, domain, 'alice', aliceAddress, federationList, False) @@ -1411,80 +1410,6 @@ def testCreatePerson(): shutil.rmtree(baseDir) -def testDelegateRoles(): - print('testDelegateRoles') - currDir = os.getcwd() - nickname = 'test382' - nicknameDelegated = 'test383' - domain = 'badgerdomain.com' - password = 'mypass' - port = 80 - httpPrefix = 'https' - baseDir = currDir + '/.tests_delegaterole' - if os.path.isdir(baseDir): - shutil.rmtree(baseDir) - os.mkdir(baseDir) - os.chdir(baseDir) - - privateKeyPem, publicKeyPem, person, wfEndpoint = \ - createPerson(baseDir, nickname, domain, port, - httpPrefix, True, False, password) - privateKeyPem, publicKeyPem, person, wfEndpoint = \ - createPerson(baseDir, nicknameDelegated, domain, port, - httpPrefix, True, False, 'insecure') - - httpPrefix = 'http' - project = 'artechoke' - role = 'delegator' - actorDelegated = \ - httpPrefix + '://' + domain + '/users/' + nicknameDelegated - newRoleJson = { - 'type': 'Delegate', - 'actor': httpPrefix + '://' + domain + '/users/' + nickname, - 'object': { - 'type': 'Role', - 'actor': actorDelegated, - 'object': project + ';' + role, - 'to': [], - 'cc': [] - }, - 'to': [], - 'cc': [] - } - - assert outboxDelegate(baseDir, nickname, newRoleJson, False) - # second time delegation has already happened so should return false - assert outboxDelegate(baseDir, nickname, newRoleJson, False) is False - - assert '"delegator"' in open(baseDir + '/accounts/' + nickname + - '@' + domain + '.json').read() - assert '"delegator"' in open(baseDir + '/accounts/' + nicknameDelegated + - '@' + domain + '.json').read() - - newRoleJson = { - 'type': 'Delegate', - 'actor': httpPrefix + '://' + domain + '/users/' + nicknameDelegated, - 'object': { - 'type': 'Role', - 'actor': httpPrefix + '://' + domain + '/users/' + nickname, - 'object': 'otherproject;otherrole', - 'to': [], - 'cc': [] - }, - 'to': [], - 'cc': [] - } - - # non-delegators cannot assign roles - assert outboxDelegate(baseDir, nicknameDelegated, - newRoleJson, False) is False - assert '"otherrole"' not in open(baseDir + '/accounts/' + - nickname + '@' + domain + '.json').read() - - os.chdir(currDir) - shutil.rmtree(baseDir) - - def testAuthentication(): print('testAuthentication') currDir = os.getcwd() @@ -3755,9 +3680,31 @@ def testSkills() -> None: assert skillsDict['gardening'] == 70 +def testRoles() -> None: + print('testRoles') + actorJson = { + 'affiliation': { + "@type": "OrganizationRole", + "roleName": "", + "affiliation": { + "@type": "WebSite", + "url": "https://testinstance.org" + }, + "startDate": "date goes here" + } + } + testRolesList = ["admin", "moderator"] + setRolesFromList(actorJson, testRolesList) + assert actorJson['affiliation']['roleName'] + rolesList = getRolesFromString(actorJson['affiliation']['roleName']) + assert 'admin' in rolesList + assert 'moderator' in rolesList + + def runAllTests(): print('Running tests...') testFunctions() + testRoles() testSkills() testSpoofGeolocation() testRemovePostInteractions() @@ -3812,5 +3759,4 @@ def runAllTests(): testNoOfFollowersOnDomain() testFollows() testGroupFollowers() - testDelegateRoles() print('Tests succeeded\n') diff --git a/webapp_profile.py b/webapp_profile.py index ae42753a0..8b91ba5d6 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -1027,20 +1027,18 @@ def _htmlProfileFollowing(translate: {}, baseDir: str, httpPrefix: str, def _htmlProfileRoles(translate: {}, nickname: str, domain: str, - rolesJson: {}) -> str: + rolesList: []) -> str: """Shows roles on the profile screen """ profileStr = '' - for project, rolesList in rolesJson.items(): - profileStr += \ - '

\n

' + project + \ - '

\n
\n' - for role in rolesList: - if translate.get(role): - profileStr += '

' + translate[role] + '

\n' - else: - profileStr += '

' + role + '

\n' - profileStr += '
\n' + profileStr += \ + '
\n
\n' + for role in rolesList: + if translate.get(role): + profileStr += '

' + translate[role] + '

\n' + else: + profileStr += '

' + role + '

\n' + profileStr += '
\n' if len(profileStr) == 0: profileStr += \ '

@' + nickname + '@' + domain + ' has no roles assigned

\n' From e58e7ce05945e4e870577e82215b3792fbb23143 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 13 May 2021 21:00:40 +0100 Subject: [PATCH 0959/1416] Published date --- person.py | 1 + 1 file changed, 1 insertion(+) diff --git a/person.py b/person.py index c6ca823e3..2dc42214c 100644 --- a/person.py +++ b/person.py @@ -593,6 +593,7 @@ def personUpgradeActor(baseDir: str, personJson: {}, updateActor = True if not personJson.get('affiliation'): + statusNumber, published = getStatusNumber() personJson['affiliation'] = { "@type": "OrganizationRole", "roleName": "", From 0b19087c88400fc2acab8df57608dbfd225ed997 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 13 May 2021 21:16:43 +0100 Subject: [PATCH 0960/1416] Fix unit tests --- city.py | 2 +- person.py | 6 +++++- roles.py | 7 ------- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/city.py b/city.py index 3ea9983b7..004b2b328 100644 --- a/city.py +++ b/city.py @@ -128,7 +128,7 @@ def _getCityPulse(currTimeOfDay, decoySeed: int) -> (float, float): def spoofGeolocation(baseDir: str, city: str, currTime, decoySeed: int, - citiesList: []) -> (float, float, str, str, \ + citiesList: []) -> (float, float, str, str, str, str, int): """Given a city and the current time spoofs the location for an image diff --git a/person.py b/person.py index 2dc42214c..6c28c13a5 100644 --- a/person.py +++ b/person.py @@ -593,10 +593,14 @@ def personUpgradeActor(baseDir: str, personJson: {}, updateActor = True if not personJson.get('affiliation'): + rolesStr = '' + adminName = getConfigParam(baseDir, 'admin') + if personJson['id'].endswith('/users/' + adminName): + rolesStr = 'admin' statusNumber, published = getStatusNumber() personJson['affiliation'] = { "@type": "OrganizationRole", - "roleName": "", + "roleName": rolesStr, "affiliation": { "@type": "WebSite", "url": personJson['id'].split('/users/')[0] diff --git a/roles.py b/roles.py index 0ce857d49..1eba0fa10 100644 --- a/roles.py +++ b/roles.py @@ -7,13 +7,6 @@ __email__ = "bob@freedombone.net" __status__ = "Production" import os -from webfinger import webfingerHandle -from auth import createBasicAuthHeader -from posts import getPersonBox -from session import postJson -from utils import getFullDomain -from utils import getNicknameFromActor -from utils import getDomainFromActor from utils import loadJson from utils import saveJson From ba0ec266d7d5fa4fcafee48a62ed0c2e3e6af0db Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 13 May 2021 21:21:37 +0100 Subject: [PATCH 0961/1416] Comments --- person.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/person.py b/person.py index 6c28c13a5..7195d70a9 100644 --- a/person.py +++ b/person.py @@ -580,6 +580,8 @@ def personUpgradeActor(baseDir: str, personJson: {}, occupationName = personJson['occupation'] del personJson['occupation'] + # if the older skills format is being used then switch + # to the new one if not personJson.get('hasOccupation'): personJson['hasOccupation'] = { '@type': 'Occupation', @@ -588,15 +590,18 @@ def personUpgradeActor(baseDir: str, personJson: {}, } updateActor = True + # remove the old skills format if personJson.get('skills'): del personJson['skills'] updateActor = True + # if the older roles format is being used then switch + # to the new one if not personJson.get('affiliation'): rolesStr = '' adminName = getConfigParam(baseDir, 'admin') if personJson['id'].endswith('/users/' + adminName): - rolesStr = 'admin' + rolesStr = 'admin, moderator, editor' statusNumber, published = getStatusNumber() personJson['affiliation'] = { "@type": "OrganizationRole", @@ -609,6 +614,16 @@ def personUpgradeActor(baseDir: str, personJson: {}, } updateActor = True + # if no roles are defined then ensure that the admin + # roles are configured + if not personJson['affiliation']['roleName']: + adminName = getConfigParam(baseDir, 'admin') + if personJson['id'].endswith('/users/' + adminName): + personJson['affiliation']['roleName'] = \ + 'admin, moderator, editor' + updateActor = True + + # remove the old roles format if personJson.get('roles'): del personJson['roles'] updateActor = True From 5458aca79412a85958badbc4c7abcf3df41ec9e4 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 14 May 2021 12:27:08 +0100 Subject: [PATCH 0962/1416] Accessibility metadata on login screen --- daemon.py | 11 +++++++++-- webapp_login.py | 12 +++++++++--- webapp_utils.py | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 5 deletions(-) diff --git a/daemon.py b/daemon.py index 023790a9c..3ef9c713c 100644 --- a/daemon.py +++ b/daemon.py @@ -10572,7 +10572,11 @@ class PubServer(BaseHTTPRequestHandler): msg = \ htmlLogin(self.server.cssCache, self.server.translate, - self.server.baseDir, False).encode('utf-8') + self.server.baseDir, + self.server.httpPrefix, + self.server.domainFull, + self.server.systemLanguage, + False).encode('utf-8') msglen = len(msg) self._logout_headers('text/html', msglen, callingDomain) self._write(msg) @@ -11677,7 +11681,10 @@ class PubServer(BaseHTTPRequestHandler): # request basic auth msg = htmlLogin(self.server.cssCache, self.server.translate, - self.server.baseDir).encode('utf-8') + self.server.baseDir, + self.server.httpPrefix, + self.server.domainFull, + self.server.systemLanguage).encode('utf-8') msglen = len(msg) self._login_headers('text/html', msglen, callingDomain) self._write(msg) diff --git a/webapp_login.py b/webapp_login.py index 9e5fa6206..c549d75f4 100644 --- a/webapp_login.py +++ b/webapp_login.py @@ -11,7 +11,7 @@ import time from shutil import copyfile from utils import getConfigParam from utils import noOfAccounts -from webapp_utils import htmlHeaderWithExternalStyle +from webapp_utils import htmlHeaderWithWebsiteMarkup from webapp_utils import htmlFooter from webapp_utils import htmlKeyboardNavigation from theme import getTextModeLogo @@ -51,7 +51,10 @@ def htmlGetLoginCredentials(loginParams: str, def htmlLogin(cssCache: {}, translate: {}, - baseDir: str, autocomplete=True) -> str: + baseDir: str, + httpPrefix: str, domain: str, + systemLanguage: str, + autocomplete=True) -> str: """Shows the login screen """ accounts = noOfAccounts(baseDir) @@ -145,7 +148,10 @@ def htmlLogin(cssCache: {}, translate: {}, instanceTitle = \ getConfigParam(baseDir, 'instanceTitle') - loginForm = htmlHeaderWithExternalStyle(cssFilename, instanceTitle) + loginForm = \ + htmlHeaderWithWebsiteMarkup(cssFilename, instanceTitle, + httpPrefix, domain, + systemLanguage) loginForm += '
\n' loginForm += '\n' loginForm += '
\n' diff --git a/webapp_utils.py b/webapp_utils.py index ba812dccb..5c6c257cb 100644 --- a/webapp_utils.py +++ b/webapp_utils.py @@ -748,6 +748,44 @@ def htmlHeaderWithPersonMarkup(cssFilename: str, instanceTitle: str, return htmlStr +def htmlHeaderWithWebsiteMarkup(cssFilename: str, instanceTitle: str, + httpPrefix: str, domain: str, + systemLanguage: str) -> str: + """html header which includes website markup + https://schema.org/WebSite + """ + htmlStr = htmlHeaderWithExternalStyle(cssFilename, instanceTitle, + systemLanguage) + + licenseUrl = 'https://www.gnu.org/licenses/agpl-3.0.en.html' + websiteMarkup = \ + ' \n' + htmlStr = htmlStr.replace('\n', '\n' + websiteMarkup) + return htmlStr + + def htmlFooter() -> str: htmlStr = ' \n' htmlStr += '\n' From 02d78be5f995c1dae18dded022b7f91d726793a1 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 14 May 2021 12:29:20 +0100 Subject: [PATCH 0963/1416] Extra comma --- webapp_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp_utils.py b/webapp_utils.py index 5c6c257cb..a7fc83301 100644 --- a/webapp_utils.py +++ b/webapp_utils.py @@ -779,7 +779,7 @@ def htmlHeaderWithWebsiteMarkup(cssFilename: str, instanceTitle: str, ' "encodingFormat" : [\n' + \ ' "text/html", "image/png", "image/webp",\n' + \ ' "image/jpeg", "image/gif", "text/css"\n' + \ - ' ],\n' + \ + ' ]\n' + \ ' }\n' + \ ' \n' htmlStr = htmlStr.replace('\n', '\n' + websiteMarkup) From 91736b547f4c30050b6017854cc5f6439e80ac45 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 14 May 2021 12:30:05 +0100 Subject: [PATCH 0964/1416] Remove spaces --- webapp_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp_utils.py b/webapp_utils.py index a7fc83301..04d19962e 100644 --- a/webapp_utils.py +++ b/webapp_utils.py @@ -770,7 +770,7 @@ def htmlHeaderWithWebsiteMarkup(cssFilename: str, instanceTitle: str, ' "genre": "https://en.wikipedia.org/wiki/Fediverse",\n' + \ ' "accessMode": ["textual", "visual"],\n' + \ ' "accessModeSufficient": ["textual"],\n' + \ - ' "accessibilityAPI" : [ "ARIA" ],\n' + \ + ' "accessibilityAPI" : ["ARIA"],\n' + \ ' "accessibilityControl" : [\n' + \ ' "fullKeyboardControl",\n' + \ ' "fullTouchControl",\n' + \ From 80203466b66b2066a368954859d6833552577c92 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 14 May 2021 12:56:23 +0100 Subject: [PATCH 0965/1416] Include metadata on about screen --- daemon.py | 9 ++++++--- webapp_about.py | 10 +++++++--- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/daemon.py b/daemon.py index 3ef9c713c..1b616ddf6 100644 --- a/daemon.py +++ b/daemon.py @@ -11206,13 +11206,15 @@ class PubServer(BaseHTTPRequestHandler): htmlAbout(self.server.cssCache, self.server.baseDir, 'http', self.server.onionDomain, - None, self.server.translate) + None, self.server.translate, + self.server.systemLanguage) elif callingDomain.endswith('.i2p'): msg = \ htmlAbout(self.server.cssCache, self.server.baseDir, 'http', self.server.i2pDomain, - None, self.server.translate) + None, self.server.translate, + self.server.systemLanguage) else: msg = \ htmlAbout(self.server.cssCache, @@ -11220,7 +11222,8 @@ class PubServer(BaseHTTPRequestHandler): self.server.httpPrefix, self.server.domainFull, self.server.onionDomain, - self.server.translate) + self.server.translate, + self.server.systemLanguage) msg = msg.encode('utf-8') msglen = len(msg) self._login_headers('text/html', msglen, callingDomain) diff --git a/webapp_about.py b/webapp_about.py index 4f9b5f8bb..3a617232a 100644 --- a/webapp_about.py +++ b/webapp_about.py @@ -9,13 +9,14 @@ __status__ = "Production" import os from shutil import copyfile from utils import getConfigParam -from webapp_utils import htmlHeaderWithExternalStyle +from webapp_utils import htmlHeaderWithWebsiteMarkup from webapp_utils import htmlFooter from webapp_utils import markdownToHtml def htmlAbout(cssCache: {}, baseDir: str, httpPrefix: str, - domainFull: str, onionDomain: str, translate: {}) -> str: + domainFull: str, onionDomain: str, translate: {}, + systemLanguage: str) -> str: """Show the about screen """ adminNickname = getConfigParam(baseDir, 'admin') @@ -40,7 +41,10 @@ def htmlAbout(cssCache: {}, baseDir: str, httpPrefix: str, instanceTitle = \ getConfigParam(baseDir, 'instanceTitle') - aboutForm = htmlHeaderWithExternalStyle(cssFilename, instanceTitle) + aboutForm = \ + htmlHeaderWithWebsiteMarkup(cssFilename, instanceTitle, + httpPrefix, domainFull, + systemLanguage) aboutForm += '
' + aboutText + '
' if onionDomain: aboutForm += \ From 76ea1f6a29be3a52baedbb3f150813e1ff2b1b55 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 14 May 2021 13:24:21 +0100 Subject: [PATCH 0966/1416] Add website url --- webapp_utils.py | 1 + 1 file changed, 1 insertion(+) diff --git a/webapp_utils.py b/webapp_utils.py index 04d19962e..6fdfbe1ea 100644 --- a/webapp_utils.py +++ b/webapp_utils.py @@ -764,6 +764,7 @@ def htmlHeaderWithWebsiteMarkup(cssFilename: str, instanceTitle: str, ' "@context" : "http://schema.org",\n' + \ ' "@type" : "WebSite",\n' + \ ' "name": "' + instanceTitle + '",\n' + \ + ' "url": "' + httpPrefix + '://' + domain + '",\n' + \ ' "license": "' + licenseUrl + '",\n' + \ ' "inLanguage": "' + systemLanguage + '",\n' + \ ' "isAccessibleForFree": true,\n' + \ From 1ebb8a5d66ebede904ca92195ec9a6054e2eb2ec Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 14 May 2021 13:48:19 +0100 Subject: [PATCH 0967/1416] Website metadata --- website/EN/index.html | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/website/EN/index.html b/website/EN/index.html index 98e6e9b34..cd667bfe8 100644 --- a/website/EN/index.html +++ b/website/EN/index.html @@ -1,6 +1,23 @@ + From 2c70942481376f83a541585411a59b58422484c3 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 14 May 2021 18:41:05 +0100 Subject: [PATCH 0968/1416] Convert skills to a list --- daemon.py | 8 ++++---- person.py | 4 ++-- skills.py | 23 ++++++++++++++--------- tests.py | 2 +- webapp_search.py | 8 ++++---- webapp_utils.py | 4 ++-- website/EN/index.html | 2 +- 7 files changed, 28 insertions(+), 23 deletions(-) diff --git a/daemon.py b/daemon.py index 1b616ddf6..cd84224ba 100644 --- a/daemon.py +++ b/daemon.py @@ -7497,9 +7497,9 @@ class PubServer(BaseHTTPRequestHandler): if self.server.keyShortcuts.get(nickname): accessKeys = \ self.server.keyShortcuts[nickname] - actorSkillsStr = \ + actorSkillsList = \ actorJson['hasOccupation']['skills'] - skills = getSkillsFromString(actorSkillsStr) + skills = getSkillsFromString(actorSkillsList) msg = \ htmlProfile(self.server.rssIconAtTop, self.server.cssCache, @@ -7536,9 +7536,9 @@ class PubServer(BaseHTTPRequestHandler): 'show skills') else: if self._fetchAuthenticated(): - actorSkillsStr = \ + actorSkillsList = \ actorJson['hasOccupation']['skills'] - skills = getSkillsFromString(actorSkillsStr) + skills = getSkillsFromString(actorSkillsList) msg = json.dumps(skills, ensure_ascii=False) msg = msg.encode('utf-8') diff --git a/person.py b/person.py index 7195d70a9..8259d6e16 100644 --- a/person.py +++ b/person.py @@ -281,7 +281,7 @@ def _createPersonBase(baseDir: str, nickname: str, domain: str, port: int, 'hasOccupation': { '@type': 'Occupation', 'name': "", - 'skills': "" + 'skills': [] }, "affiliation": { "@type": "OrganizationRole", @@ -586,7 +586,7 @@ def personUpgradeActor(baseDir: str, personJson: {}, personJson['hasOccupation'] = { '@type': 'Occupation', 'name': occupationName, - 'skills': "" + 'skills': [] } updateActor = True diff --git a/skills.py b/skills.py index 0c13d4165..1e193599a 100644 --- a/skills.py +++ b/skills.py @@ -17,23 +17,24 @@ from utils import getDomainFromActor from utils import loadJson -def setSkillsFromDict(actorJson: {}, skillsDict: {}) -> str: +def setSkillsFromDict(actorJson: {}, skillsDict: {}) -> []: """Converts a dict containing skills to a string Returns the string version of the dictionary """ - skillsStr = '' + skillsList = [] for name, value in skillsDict.items(): - if skillsStr: - skillsStr += ', ' - skillsStr += name + ':' + str(value) - actorJson['hasOccupation']['skills'] = skillsStr - return skillsStr + skillsList.append(name + ':' + str(value)) + actorJson['hasOccupation']['skills'] = skillsList + return skillsList def getSkillsFromString(skillsStr: str) -> {}: """Returns a dict of skills from a string """ - skillsList = skillsStr.split(',') + if isinstance(skillsStr, list): + skillsList = skillsStr + else: + skillsList = skillsStr.split(',') skillsDict = {} for skill in skillsList: if ':' not in skill: @@ -73,7 +74,11 @@ def noOfActorSkills(actorJson: {}) -> int: """Returns the number of skills that an actor has """ if actorJson.get('hasOccupation'): - skillsList = actorJson['hasOccupation']['skills'].split(',') + skillsStr = actorJson['hasOccupation']['skills'] + if isinstance(skillsStr, list): + skillsList = skillsStr + else: + skillsList = skillsStr.split(',') if skillsList: return len(skillsList) return 0 diff --git a/tests.py b/tests.py index 1b53f0f2e..58da3cb07 100644 --- a/tests.py +++ b/tests.py @@ -3664,7 +3664,7 @@ def testSkills() -> None: 'hasOccupation': { '@type': 'Occupation', 'name': "", - 'skills': "" + 'skills': [] } } skillsDict = { diff --git a/webapp_search.py b/webapp_search.py index 131d019a3..da5c61b1d 100644 --- a/webapp_search.py +++ b/webapp_search.py @@ -420,8 +420,8 @@ def htmlSkillsSearch(actor: str, actorJson.get('name') and \ actorJson.get('icon'): actor = actorJson['id'] - actorSkillsStr = actorJson['hasOccupation']['skills'] - skills = getSkillsFromString(actorSkillsStr) + actorSkillsList = actorJson['hasOccupation']['skills'] + skills = getSkillsFromString(actorSkillsList) for skillName, skillLevel in skills.items(): skillName = skillName.lower() if not (skillName in skillsearch or @@ -461,9 +461,9 @@ def htmlSkillsSearch(actor: str, actorJson.get('name') and \ actorJson.get('icon'): actor = actorJson['id'] - actorSkillsStr = \ + actorSkillsList = \ actorJson['hasOccupation']['skills'] - skills = getSkillsFromString(actorSkillsStr) + skills = getSkillsFromString(actorSkillsList) for skillName, skillLevel in skills.items(): skillName = skillName.lower() if not (skillName in skillsearch or diff --git a/webapp_utils.py b/webapp_utils.py index 6fdfbe1ea..36635d879 100644 --- a/webapp_utils.py +++ b/webapp_utils.py @@ -721,7 +721,7 @@ def htmlHeaderWithPersonMarkup(cssFilename: str, instanceTitle: str, skillsMarkup = '' if actorJson.get('hasOccupation'): - skillsStr = actorJson['hasOccupation']['skills'] + skillsList = actorJson['hasOccupation']['skills'] if actorJson['hasOccupation'].get('name'): occupationName = actorJson['hasOccupation']['name'] occupationStr = ' "name": "' + occupationName + '",\n' @@ -729,7 +729,7 @@ def htmlHeaderWithPersonMarkup(cssFilename: str, instanceTitle: str, ' "hasOccupation": {\n' + \ ' "@type": "Occupation",\n' + \ occupationStr + \ - ' "skills": "' + skillsStr + '"\n' + \ + ' "skills": ' + str(skillsList) + '\n' + \ ' "},\n' personMarkup = \ diff --git a/website/EN/index.html b/website/EN/index.html index cd667bfe8..8ccea5135 100644 --- a/website/EN/index.html +++ b/website/EN/index.html @@ -14,7 +14,7 @@ "email": "bob@freedombone.net", "url": "https://epicyon.freedombone.net/users/bob" }, - "applicationCategory" : "server, software, fediverse, activitypub, self-hosting", + "applicationCategory" : ["server", "software", "bash", "debian", "linux", "self-hosting"], "downloadUrl" : "https://epicyon.net/epicyon.tar.gz" } From e44ed60ffc156d1b7c183bfcc6be31919bb3e6ab Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 14 May 2021 18:56:26 +0100 Subject: [PATCH 0969/1416] roleName becomes a list --- daemon.py | 11 ++++++----- person.py | 10 +++++----- roles.py | 12 +++++------- tests.py | 2 +- 4 files changed, 17 insertions(+), 18 deletions(-) diff --git a/daemon.py b/daemon.py index cd84224ba..aca43eac9 100644 --- a/daemon.py +++ b/daemon.py @@ -124,7 +124,6 @@ from blocking import isBlockedHashtag from blocking import isBlockedDomain from blocking import getDomainBlocklist from roles import setRole -from roles import getRolesFromString from roles import clearModeratorStatus from roles import clearEditorStatus from roles import clearCounselorStatus @@ -7397,8 +7396,9 @@ class PubServer(BaseHTTPRequestHandler): rolesList = [] if actorJson.get('affiliation'): - actorRolesStr = actorJson['affiliation']['roleName'] - rolesList = getRolesFromString(actorRolesStr) + if isinstance(actorJson['affiliation']['roleName'], + list): + rolesList = actorJson['affiliation']['roleName'] msg = \ htmlProfile(self.server.rssIconAtTop, self.server.cssCache, @@ -7436,8 +7436,9 @@ class PubServer(BaseHTTPRequestHandler): if self._fetchAuthenticated(): rolesList = [] if actorJson.get('affiliation'): - actorRolesStr = actorJson['affiliation']['roleName'] - rolesList = getRolesFromString(actorRolesStr) + if isinstance(actorJson['affiliation']['roleName'], + list): + rolesList = actorJson['affiliation']['roleName'] msg = json.dumps(rolesList, ensure_ascii=False) diff --git a/person.py b/person.py index 8259d6e16..f97f0750e 100644 --- a/person.py +++ b/person.py @@ -285,7 +285,7 @@ def _createPersonBase(baseDir: str, nickname: str, domain: str, port: int, }, "affiliation": { "@type": "OrganizationRole", - "roleName": "", + "roleName": [], "affiliation": { "@type": "WebSite", "url": httpPrefix + '://' + domain @@ -598,14 +598,14 @@ def personUpgradeActor(baseDir: str, personJson: {}, # if the older roles format is being used then switch # to the new one if not personJson.get('affiliation'): - rolesStr = '' + rolesList = [] adminName = getConfigParam(baseDir, 'admin') if personJson['id'].endswith('/users/' + adminName): - rolesStr = 'admin, moderator, editor' + rolesList = ["admin", "moderator", "editor"] statusNumber, published = getStatusNumber() personJson['affiliation'] = { "@type": "OrganizationRole", - "roleName": rolesStr, + "roleName": rolesList, "affiliation": { "@type": "WebSite", "url": personJson['id'].split('/users/')[0] @@ -620,7 +620,7 @@ def personUpgradeActor(baseDir: str, personJson: {}, adminName = getConfigParam(baseDir, 'admin') if personJson['id'].endswith('/users/' + adminName): personJson['affiliation']['roleName'] = \ - 'admin, moderator, editor' + ["admin", "moderator", "editor"] updateActor = True # remove the old roles format diff --git a/roles.py b/roles.py index 1eba0fa10..2c4d25e0c 100644 --- a/roles.py +++ b/roles.py @@ -111,19 +111,17 @@ def _removeRole(baseDir: str, nickname: str, roleFilename: str) -> None: def setRolesFromList(actorJson: {}, rolesList: []) -> None: """Sets roles from a list """ - rolesStr = '' - for roleName in rolesList: - if rolesStr: - rolesStr += ', ' - rolesStr += roleName.lower() if actorJson.get('affiliation'): - actorJson['affiliation']['roleName'] = rolesStr + actorJson['affiliation']['roleName'] = rolesList.copy() def getRolesFromString(rolesStr: str) -> []: """Returns a list of roles from a string """ - rolesList = rolesStr.split(',') + if isinstance(rolesStr, list): + rolesList = rolesStr + else: + rolesList = rolesStr.split(',') rolesResult = [] for roleName in rolesList: rolesResult.append(roleName.strip().lower()) diff --git a/tests.py b/tests.py index 58da3cb07..42c6c4087 100644 --- a/tests.py +++ b/tests.py @@ -3685,7 +3685,7 @@ def testRoles() -> None: actorJson = { 'affiliation': { "@type": "OrganizationRole", - "roleName": "", + "roleName": [], "affiliation": { "@type": "WebSite", "url": "https://testinstance.org" From 2306d8d393f733531c19cad3531a95c5198555ba Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 14 May 2021 19:02:58 +0100 Subject: [PATCH 0970/1416] Convert strings to lists --- person.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/person.py b/person.py index f97f0750e..0a2a29633 100644 --- a/person.py +++ b/person.py @@ -590,6 +590,11 @@ def personUpgradeActor(baseDir: str, personJson: {}, } updateActor = True + if isinstance(personJson['hasOccupation']['skills'], str): + skillsList = personJson['hasOccupation']['skills'].split(', ') + personJson['hasOccupation']['skills'] = skillsList + updateActor = True + # remove the old skills format if personJson.get('skills'): del personJson['skills'] @@ -614,6 +619,11 @@ def personUpgradeActor(baseDir: str, personJson: {}, } updateActor = True + if isinstance(personJson['affiliation']['roleName'], str): + rolesList = personJson['affiliation']['roleName'].split(', ') + personJson['affiliation']['roleName'] = rolesList + updateActor = True + # if no roles are defined then ensure that the admin # roles are configured if not personJson['affiliation']['roleName']: From ef5b5d78692a25ee9e86decc27866e8b24e7c22d Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 14 May 2021 21:02:55 +0100 Subject: [PATCH 0971/1416] Change function name --- daemon.py | 6 +++--- skills.py | 20 ++++++++++---------- tests.py | 4 ++-- webapp_search.py | 6 +++--- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/daemon.py b/daemon.py index aca43eac9..68b8c8acf 100644 --- a/daemon.py +++ b/daemon.py @@ -98,7 +98,7 @@ from follow import getFollowingFeed from follow import sendFollowRequest from follow import unfollowAccount from follow import createInitialLastSeen -from skills import getSkillsFromString +from skills import getSkillsFromList from skills import noOfActorSkills from skills import actorHasSkill from skills import actorSkillValue @@ -7500,7 +7500,7 @@ class PubServer(BaseHTTPRequestHandler): self.server.keyShortcuts[nickname] actorSkillsList = \ actorJson['hasOccupation']['skills'] - skills = getSkillsFromString(actorSkillsList) + skills = getSkillsFromList(actorSkillsList) msg = \ htmlProfile(self.server.rssIconAtTop, self.server.cssCache, @@ -7539,7 +7539,7 @@ class PubServer(BaseHTTPRequestHandler): if self._fetchAuthenticated(): actorSkillsList = \ actorJson['hasOccupation']['skills'] - skills = getSkillsFromString(actorSkillsList) + skills = getSkillsFromList(actorSkillsList) msg = json.dumps(skills, ensure_ascii=False) msg = msg.encode('utf-8') diff --git a/skills.py b/skills.py index 1e193599a..8105cc5c0 100644 --- a/skills.py +++ b/skills.py @@ -28,15 +28,15 @@ def setSkillsFromDict(actorJson: {}, skillsDict: {}) -> []: return skillsList -def getSkillsFromString(skillsStr: str) -> {}: - """Returns a dict of skills from a string +def getSkillsFromList(skillsList: []) -> {}: + """Returns a dict of skills from a list """ - if isinstance(skillsStr, list): - skillsList = skillsStr + if isinstance(skillsList, list): + skillsList2 = skillsList else: - skillsList = skillsStr.split(',') + skillsList2 = skillsList.split(',') skillsDict = {} - for skill in skillsList: + for skill in skillsList2: if ':' not in skill: continue name = skill.split(':')[0].strip().lower() @@ -51,7 +51,7 @@ def actorHasSkill(actorJson: {}, skillName: str) -> bool: """Returns true if the actor has the given skill """ skillsDict = \ - getSkillsFromString(actorJson['hasOccupation']['skills']) + getSkillsFromList(actorJson['hasOccupation']['skills']) if not skillsDict: return False return skillsDict.get(skillName.lower()) @@ -61,7 +61,7 @@ def actorSkillValue(actorJson: {}, skillName: str) -> int: """Returns The skill level from an actor """ skillsDict = \ - getSkillsFromString(actorJson['hasOccupation']['skills']) + getSkillsFromList(actorJson['hasOccupation']['skills']) if not skillsDict: return 0 skillName = skillName.lower() @@ -101,7 +101,7 @@ def setActorSkillLevel(actorJson: {}, 'skills': '' } skillsDict = \ - getSkillsFromString(actorJson['hasOccupation']['skills']) + getSkillsFromList(actorJson['hasOccupation']['skills']) if skillLevelPercent > 0: skillsDict[skill] = skillLevelPercent else: @@ -138,7 +138,7 @@ def getSkills(baseDir: str, nickname: str, domain: str) -> []: if actorJson: if not actorJson.get('hasOccupation'): return None - return getSkillsFromString(actorJson['hasOccupation']['skills']) + return getSkillsFromList(actorJson['hasOccupation']['skills']) return None diff --git a/tests.py b/tests.py index 42c6c4087..20983ce2e 100644 --- a/tests.py +++ b/tests.py @@ -68,7 +68,7 @@ from person import setBio # from person import generateRSAKey from skills import setSkillLevel from skills import setSkillsFromDict -from skills import getSkillsFromString +from skills import getSkillsFromList from roles import setRolesFromList from roles import getRolesFromString from roles import setRole @@ -3673,7 +3673,7 @@ def testSkills() -> None: } setSkillsFromDict(actorJson, skillsDict) assert actorJson['hasOccupation']['skills'] - skillsDict = getSkillsFromString(actorJson['hasOccupation']['skills']) + skillsDict = getSkillsFromList(actorJson['hasOccupation']['skills']) assert skillsDict.get('bakery') assert skillsDict.get('gardening') assert skillsDict['bakery'] == 40 diff --git a/webapp_search.py b/webapp_search.py index da5c61b1d..33e9b6de5 100644 --- a/webapp_search.py +++ b/webapp_search.py @@ -21,7 +21,7 @@ from utils import isPublicPost from utils import firstParagraphFromString from utils import searchBoxPosts from skills import noOfActorSkills -from skills import getSkillsFromString +from skills import getSkillsFromList from categories import getHashtagCategory from feeds import rss2TagHeader from feeds import rss2TagFooter @@ -421,7 +421,7 @@ def htmlSkillsSearch(actor: str, actorJson.get('icon'): actor = actorJson['id'] actorSkillsList = actorJson['hasOccupation']['skills'] - skills = getSkillsFromString(actorSkillsList) + skills = getSkillsFromList(actorSkillsList) for skillName, skillLevel in skills.items(): skillName = skillName.lower() if not (skillName in skillsearch or @@ -463,7 +463,7 @@ def htmlSkillsSearch(actor: str, actor = actorJson['id'] actorSkillsList = \ actorJson['hasOccupation']['skills'] - skills = getSkillsFromString(actorSkillsList) + skills = getSkillsFromList(actorSkillsList) for skillName, skillLevel in skills.items(): skillName = skillName.lower() if not (skillName in skillsearch or From 4e354c344f63c237edaa19349e2e35fa25f870cd Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 14 May 2021 21:07:44 +0100 Subject: [PATCH 0972/1416] Change function name --- roles.py | 16 ++++++++-------- tests.py | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/roles.py b/roles.py index 2c4d25e0c..3a59d21c3 100644 --- a/roles.py +++ b/roles.py @@ -33,7 +33,7 @@ def _clearRoleStatus(baseDir: str, role: str) -> None: if not actorJson.get('affiliation'): continue rolesList = \ - getRolesFromString(actorJson['affiliation']['roleName']) + getRolesFromList(actorJson['affiliation']['roleName']) if role in rolesList: rolesList.remove(role) saveJson(actorJson, filename) @@ -115,15 +115,15 @@ def setRolesFromList(actorJson: {}, rolesList: []) -> None: actorJson['affiliation']['roleName'] = rolesList.copy() -def getRolesFromString(rolesStr: str) -> []: - """Returns a list of roles from a string +def getRolesFromList(rolesList: []) -> []: + """Returns a list of roles from a list """ - if isinstance(rolesStr, list): - rolesList = rolesStr + if isinstance(rolesList, list): + rolesList2 = rolesList else: - rolesList = rolesStr.split(',') + rolesList2 = rolesList.split(',') rolesResult = [] - for roleName in rolesList: + for roleName in rolesList2: rolesResult.append(roleName.strip().lower()) return rolesResult @@ -152,7 +152,7 @@ def setRole(baseDir: str, nickname: str, domain: str, if not actorJson.get('affiliation'): return False rolesList = \ - getRolesFromString(actorJson['affiliation']['roleName']) + getRolesFromList(actorJson['affiliation']['roleName']) actorChanged = False if role: # add the role diff --git a/tests.py b/tests.py index 20983ce2e..4a3d84fe3 100644 --- a/tests.py +++ b/tests.py @@ -70,7 +70,7 @@ from skills import setSkillLevel from skills import setSkillsFromDict from skills import getSkillsFromList from roles import setRolesFromList -from roles import getRolesFromString +from roles import getRolesFromList from roles import setRole from auth import constantTimeStringCheck from auth import createBasicAuthHeader @@ -3696,7 +3696,7 @@ def testRoles() -> None: testRolesList = ["admin", "moderator"] setRolesFromList(actorJson, testRolesList) assert actorJson['affiliation']['roleName'] - rolesList = getRolesFromString(actorJson['affiliation']['roleName']) + rolesList = getRolesFromList(actorJson['affiliation']['roleName']) assert 'admin' in rolesList assert 'moderator' in rolesList From 145b8a620b561cfb2aed3ba52516f3aa0c9e3dd6 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 15 May 2021 10:08:01 +0100 Subject: [PATCH 0973/1416] Social networking category --- webapp_utils.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/webapp_utils.py b/webapp_utils.py index 36635d879..00fc3cace 100644 --- a/webapp_utils.py +++ b/webapp_utils.py @@ -758,6 +758,10 @@ def htmlHeaderWithWebsiteMarkup(cssFilename: str, instanceTitle: str, systemLanguage) licenseUrl = 'https://www.gnu.org/licenses/agpl-3.0.en.html' + + # social networking category + genreUrl = 'http://vocab.getty.edu/aat/300312270' + websiteMarkup = \ ' \n' + htmlStr = htmlStr.replace('\n', '\n' + blogMarkup) + return htmlStr + + def htmlFooter() -> str: htmlStr = ' \n' htmlStr += '\n' From dbd9acbc9dca75586360f4c5cdabf71052dd6ba8 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 15 May 2021 20:43:42 +0100 Subject: [PATCH 0976/1416] Get the first line --- blog.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/blog.py b/blog.py index 2320412a3..29b8106f5 100644 --- a/blog.py +++ b/blog.py @@ -388,6 +388,8 @@ def _getSnippetFromBlogContent(postJsonObject: {}) -> str: if '

' in content: content = content.split('

', 1)[0] content = removeHtml(content) + if '\n' in content: + content = content.split('\n')[0] if len(content) >= 256: content = content[:252] + '...' return content From 7b1a1e858556ac875bea0686c1e95a565d0d75f4 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 15 May 2021 20:45:55 +0100 Subject: [PATCH 0977/1416] Don't use raw blog content --- blog.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/blog.py b/blog.py index 29b8106f5..0866842d7 100644 --- a/blog.py +++ b/blog.py @@ -381,8 +381,6 @@ def _getSnippetFromBlogContent(postJsonObject: {}) -> str: """Returns a snippet of text from the blog post as a preview """ content = postJsonObject['object']['content'] - if len(content) < 256: - return removeHtml(content) if '

' in content: content = content.split('

', 1)[1] if '

' in content: From 648666d741a41eb63f799a988fcad8396d3f51cb Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 16 May 2021 10:20:24 +0100 Subject: [PATCH 0978/1416] Include spoofed city within person metadata --- daemon.py | 22 ++++++++++++++++------ webapp_profile.py | 5 +++-- webapp_utils.py | 23 ++++++++++++++++++++--- 3 files changed, 39 insertions(+), 11 deletions(-) diff --git a/daemon.py b/daemon.py index c1fc8bc24..b54fd2b07 100644 --- a/daemon.py +++ b/daemon.py @@ -7399,6 +7399,7 @@ class PubServer(BaseHTTPRequestHandler): if isinstance(actorJson['affiliation']['roleName'], list): rolesList = actorJson['affiliation']['roleName'] + city = self._getSpoofedCity(baseDir, nickname, domain) msg = \ htmlProfile(self.server.rssIconAtTop, self.server.cssCache, @@ -7422,7 +7423,7 @@ class PubServer(BaseHTTPRequestHandler): self.server.allowLocalNetworkAccess, self.server.textModeBanner, self.server.debug, - accessKeys, rolesList, + accessKeys, city, rolesList, None, None) msg = msg.encode('utf-8') msglen = len(msg) @@ -7501,6 +7502,8 @@ class PubServer(BaseHTTPRequestHandler): actorSkillsList = \ actorJson['hasOccupation']['skills'] skills = getSkillsFromList(actorSkillsList) + city = self._getSpoofedCity(baseDir, + nickname, domain) msg = \ htmlProfile(self.server.rssIconAtTop, self.server.cssCache, @@ -7524,7 +7527,7 @@ class PubServer(BaseHTTPRequestHandler): allowLocalNetworkAccess, self.server.textModeBanner, self.server.debug, - accessKeys, skills, + accessKeys, city, skills, None, None) msg = msg.encode('utf-8') msglen = len(msg) @@ -9398,6 +9401,7 @@ class PubServer(BaseHTTPRequestHandler): accessKeys = \ self.server.keyShortcuts[nickname] + city = self._getSpoofedCity(baseDir, nickname, domain) msg = \ htmlProfile(self.server.rssIconAtTop, self.server.cssCache, @@ -9422,7 +9426,7 @@ class PubServer(BaseHTTPRequestHandler): self.server.allowLocalNetworkAccess, self.server.textModeBanner, self.server.debug, - accessKeys, + accessKeys, city, shares, pageNumber, sharesPerPage) msg = msg.encode('utf-8') @@ -9500,6 +9504,7 @@ class PubServer(BaseHTTPRequestHandler): return True accessKeys = self.server.accessKeys + city = None if '/users/' in path: nickname = path.split('/users/')[1] if '/' in nickname: @@ -9508,6 +9513,7 @@ class PubServer(BaseHTTPRequestHandler): accessKeys = \ self.server.keyShortcuts[nickname] + city = self._getSpoofedCity(baseDir, nickname, domain) msg = \ htmlProfile(self.server.rssIconAtTop, self.server.cssCache, @@ -9532,7 +9538,7 @@ class PubServer(BaseHTTPRequestHandler): self.server.allowLocalNetworkAccess, self.server.textModeBanner, self.server.debug, - accessKeys, + accessKeys, city, following, pageNumber, followsPerPage).encode('utf-8') @@ -9609,6 +9615,7 @@ class PubServer(BaseHTTPRequestHandler): return True accessKeys = self.server.accessKeys + city = None if '/users/' in path: nickname = path.split('/users/')[1] if '/' in nickname: @@ -9617,6 +9624,7 @@ class PubServer(BaseHTTPRequestHandler): accessKeys = \ self.server.keyShortcuts[nickname] + city = self._getSpoofedCity(baseDir, nickname, domain) msg = \ htmlProfile(self.server.rssIconAtTop, self.server.cssCache, @@ -9642,7 +9650,7 @@ class PubServer(BaseHTTPRequestHandler): self.server.allowLocalNetworkAccess, self.server.textModeBanner, self.server.debug, - accessKeys, + accessKeys, city, followers, pageNumber, followsPerPage).encode('utf-8') @@ -9742,6 +9750,7 @@ class PubServer(BaseHTTPRequestHandler): return True accessKeys = self.server.accessKeys + city = None if '/users/' in path: nickname = path.split('/users/')[1] if '/' in nickname: @@ -9750,6 +9759,7 @@ class PubServer(BaseHTTPRequestHandler): accessKeys = \ self.server.keyShortcuts[nickname] + city = self._getSpoofedCity(baseDir, nickname, domain) msg = \ htmlProfile(self.server.rssIconAtTop, self.server.cssCache, @@ -9775,7 +9785,7 @@ class PubServer(BaseHTTPRequestHandler): self.server.allowLocalNetworkAccess, self.server.textModeBanner, self.server.debug, - accessKeys, + accessKeys, city, None, None).encode('utf-8') msglen = len(msg) self._set_headers('text/html', msglen, diff --git a/webapp_profile.py b/webapp_profile.py index 8b91ba5d6..5a8baffa4 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -520,7 +520,7 @@ def htmlProfile(rssIconAtTop: bool, peertubeInstances: [], allowLocalNetworkAccess: bool, textModeBanner: str, - debug: bool, accessKeys: {}, + debug: bool, accessKeys: {}, city: str, extraJson=None, pageNumber=None, maxItemsPerPage=None) -> str: """Show the profile page as html @@ -901,7 +901,8 @@ def htmlProfile(rssIconAtTop: bool, instanceTitle = \ getConfigParam(baseDir, 'instanceTitle') profileStr = \ - htmlHeaderWithPersonMarkup(cssFilename, instanceTitle, profileJson) + \ + htmlHeaderWithPersonMarkup(cssFilename, instanceTitle, + profileJson, city) + \ profileStr + htmlFooter() return profileStr diff --git a/webapp_utils.py b/webapp_utils.py index c4676e64f..68143c004 100644 --- a/webapp_utils.py +++ b/webapp_utils.py @@ -711,7 +711,8 @@ def htmlHeaderWithExternalStyle(cssFilename: str, instanceTitle: str, def htmlHeaderWithPersonMarkup(cssFilename: str, instanceTitle: str, - actorJson: {}, lang='en') -> str: + actorJson: {}, city: str, + lang='en') -> str: """html header which includes person markup https://schema.org/Person """ @@ -731,7 +732,23 @@ def htmlHeaderWithPersonMarkup(cssFilename: str, instanceTitle: str, occupationStr + \ ' "skills": ' + str(skillsList) + '\n' + \ ' "},\n' - + cityMarkup = '' + if city: + city = city.lower().title() + addComma = '' + countryMarkup = '' + if ',' in city: + country = city.split(',', 1)[1].strip().title() + city = city.split(',', 1)[0] + countryMarkup = \ + ' "addressCountry": "' + country + '"' + addComma = ',' + cityMarkup = \ + ' "address": {\n' + \ + ' "@type": "PostalAddress",\n' + \ + ' "addressLocality": "' + city + '"' + addComma + '\n' + \ + countryMarkup + \ + ' },' personMarkup = \ ' \n' From bd7bfd780ebf3d09d782749d67f9e9f89b637a26 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 16 May 2021 10:23:34 +0100 Subject: [PATCH 0979/1416] Newline --- webapp_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp_utils.py b/webapp_utils.py index 68143c004..39e59ab68 100644 --- a/webapp_utils.py +++ b/webapp_utils.py @@ -741,7 +741,7 @@ def htmlHeaderWithPersonMarkup(cssFilename: str, instanceTitle: str, country = city.split(',', 1)[1].strip().title() city = city.split(',', 1)[0] countryMarkup = \ - ' "addressCountry": "' + country + '"' + ' "addressCountry": "' + country + '"\n' addComma = ',' cityMarkup = \ ' "address": {\n' + \ From 18aba190a9ea8a273b4b4d278e039818d5d6dad8 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 16 May 2021 10:26:07 +0100 Subject: [PATCH 0980/1416] Newline --- webapp_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp_utils.py b/webapp_utils.py index 39e59ab68..2b9e43269 100644 --- a/webapp_utils.py +++ b/webapp_utils.py @@ -748,7 +748,7 @@ def htmlHeaderWithPersonMarkup(cssFilename: str, instanceTitle: str, ' "@type": "PostalAddress",\n' + \ ' "addressLocality": "' + city + '"' + addComma + '\n' + \ countryMarkup + \ - ' },' + ' },\n' personMarkup = \ ' \n' From da07855e973e86c8bc1f4a223fc431dac471cf81 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 17 May 2021 17:13:56 +0100 Subject: [PATCH 1018/1416] Artist role --- daemon.py | 57 ++++++++++++++++++++++++++++++++++++++++++++ roles.py | 13 +++++++++- tests.py | 1 + translations/ar.json | 3 ++- translations/ca.json | 3 ++- translations/cy.json | 3 ++- translations/de.json | 3 ++- translations/en.json | 3 ++- translations/es.json | 3 ++- translations/fr.json | 3 ++- translations/ga.json | 3 ++- translations/hi.json | 3 ++- translations/it.json | 3 ++- translations/ja.json | 3 ++- translations/ku.json | 3 ++- translations/oc.json | 3 ++- translations/pt.json | 3 ++- translations/ru.json | 3 ++- translations/zh.json | 3 ++- webapp_profile.py | 15 ++++++++++++ 20 files changed, 117 insertions(+), 17 deletions(-) diff --git a/daemon.py b/daemon.py index 491eeb781..a75dca7cf 100644 --- a/daemon.py +++ b/daemon.py @@ -128,6 +128,7 @@ from roles import setRole from roles import clearModeratorStatus from roles import clearEditorStatus from roles import clearCounselorStatus +from roles import clearArtistStatus from blog import htmlBlogPageRSS2 from blog import htmlBlogPageRSS3 from blog import htmlBlogView @@ -4872,6 +4873,62 @@ class PubServer(BaseHTTPRequestHandler): edNick, domain, 'counselor') + # change site artists list + if fields.get('artists'): + if path.startswith('/users/' + + adminNickname + '/'): + artistsFile = \ + baseDir + \ + '/accounts/artists.txt' + clearArtistStatus(baseDir) + if ',' in fields['artists']: + # if the list was given as comma separated + edFile = open(artistsFile, "w+") + eds = fields['artists'].split(',') + for edNick in eds: + edNick = edNick.strip() + edDir = baseDir + \ + '/accounts/' + edNick + \ + '@' + domain + if os.path.isdir(edDir): + edFile.write(edNick + '\n') + edFile.close() + eds = fields['artists'].split(',') + for edNick in eds: + edNick = edNick.strip() + edDir = baseDir + \ + '/accounts/' + edNick + \ + '@' + domain + if os.path.isdir(edDir): + setRole(baseDir, + edNick, domain, + 'artist') + else: + # nicknames on separate lines + edFile = open(artistsFile, "w+") + eds = fields['artists'].split('\n') + for edNick in eds: + edNick = edNick.strip() + edDir = \ + baseDir + \ + '/accounts/' + edNick + \ + '@' + domain + if os.path.isdir(edDir): + edFile.write(edNick + '\n') + edFile.close() + eds = fields['artists'].split('\n') + for edNick in eds: + edNick = edNick.strip() + edDir = \ + baseDir + \ + '/accounts/' + \ + edNick + '@' + \ + domain + if os.path.isdir(edDir): + setRole(baseDir, + edNick, domain, + 'artist') + # remove scheduled posts if fields.get('removeScheduledPosts'): if fields['removeScheduledPosts'] == 'on': diff --git a/roles.py b/roles.py index 9e2672af2..a3d139971 100644 --- a/roles.py +++ b/roles.py @@ -54,6 +54,14 @@ def clearCounselorStatus(baseDir: str) -> None: _clearRoleStatus(baseDir, 'editor') +def clearArtistStatus(baseDir: str) -> None: + """Removes artist status from all accounts + This could be slow if there are many users, but only happens + rarely when artists are appointed or removed + """ + _clearRoleStatus(baseDir, 'artist') + + def clearModeratorStatus(baseDir: str) -> None: """Removes moderator status from all accounts This could be slow if there are many users, but only happens @@ -126,6 +134,8 @@ def _setActorRole(actorJson: {}, roleName: str) -> bool: category = '27-3041.00' elif 'counselor' in roleName: category = '23-1022.00' + elif 'artist' in roleName: + category = '27-1024.00' if not category: return False @@ -225,7 +235,8 @@ def setRole(baseDir: str, nickname: str, domain: str, roleFiles = { "moderator": "moderators.txt", "editor": "editors.txt", - "counselor": "counselors.txt" + "counselor": "counselors.txt", + "artist": "artists.txt" } actorJson = loadJson(actorFilename) diff --git a/tests.py b/tests.py index 6155b42eb..fc4ae487f 100644 --- a/tests.py +++ b/tests.py @@ -3706,6 +3706,7 @@ def testRoles() -> None: assert actorHasRole(actorJson, "moderator") assert not actorHasRole(actorJson, "editor") assert not actorHasRole(actorJson, "counselor") + assert not actorHasRole(actorJson, "artist") def runAllTests(): diff --git a/translations/ar.json b/translations/ar.json index e06f1bf25..840867db3 100644 --- a/translations/ar.json +++ b/translations/ar.json @@ -442,5 +442,6 @@ "Show version number within instance metadata": "إظهار رقم الإصدار داخل البيانات الوصفية للمثيل", "Joined": "تاريخ الانضمام", "City for spoofed GPS image metadata": "مدينة للبيانات الوصفية لصور GPS المخادعة", - "Occupation": "الاحتلال" + "Occupation": "الاحتلال", + "Artists": "الفنانين" } diff --git a/translations/ca.json b/translations/ca.json index b7fbfdc6a..f1c1fca10 100644 --- a/translations/ca.json +++ b/translations/ca.json @@ -442,5 +442,6 @@ "Show version number within instance metadata": "Mostra el número de versió a les metadades de la instància", "Joined": "Data d'unió", "City for spoofed GPS image metadata": "Ciutat per a metadades d'imatges GPS falsificades", - "Occupation": "Ocupació" + "Occupation": "Ocupació", + "Artists": "Artistes" } diff --git a/translations/cy.json b/translations/cy.json index 03a6dc09d..40b5fe58b 100644 --- a/translations/cy.json +++ b/translations/cy.json @@ -442,5 +442,6 @@ "Show version number within instance metadata": "Dangos rhif y fersiwn o fewn metadata", "Joined": "Dyddiad ymuno", "City for spoofed GPS image metadata": "Dinas ar gyfer metadata delwedd GPS spoofed", - "Occupation": "Ngalwedigaeth" + "Occupation": "Ngalwedigaeth", + "Artists": "Artistiaid" } diff --git a/translations/de.json b/translations/de.json index f193a603e..e41a714ad 100644 --- a/translations/de.json +++ b/translations/de.json @@ -442,5 +442,6 @@ "Show version number within instance metadata": "Versionsnummer in Instanzmetadaten anzeigen", "Joined": "Verbundenes Datum", "City for spoofed GPS image metadata": "Stadt für gefälschte GPS-Bildmetadaten", - "Occupation": "Besetzung" + "Occupation": "Besetzung", + "Artists": "Künstler" } diff --git a/translations/en.json b/translations/en.json index 3216f1d53..59d1dbe25 100644 --- a/translations/en.json +++ b/translations/en.json @@ -442,5 +442,6 @@ "Show version number within instance metadata": "Show version number within instance metadata", "Joined": "Joined", "City for spoofed GPS image metadata": "City for spoofed GPS image metadata", - "Occupation": "Occupation" + "Occupation": "Occupation", + "Artists": "Artists" } diff --git a/translations/es.json b/translations/es.json index b966a4777..9c0a37375 100644 --- a/translations/es.json +++ b/translations/es.json @@ -442,5 +442,6 @@ "Show version number within instance metadata": "Mostrar el número de versión dentro de los metadatos de la instancia", "Joined": "Fecha unida", "City for spoofed GPS image metadata": "Ciudad para metadatos de imagen GPS falsificados", - "Occupation": "Ocupación" + "Occupation": "Ocupación", + "Artists": "Artistas" } diff --git a/translations/fr.json b/translations/fr.json index 197c319fa..da8960e5f 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -442,5 +442,6 @@ "Show version number within instance metadata": "Afficher le numéro de version dans les métadonnées de l'instance", "Joined": "Joint", "City for spoofed GPS image metadata": "Ville pour les métadonnées d'image GPS falsifiées", - "Occupation": "Occupation" + "Occupation": "Occupation", + "Artists": "Artistes" } diff --git a/translations/ga.json b/translations/ga.json index 549abadce..eb408a367 100644 --- a/translations/ga.json +++ b/translations/ga.json @@ -442,5 +442,6 @@ "Show version number within instance metadata": "Taispeáin uimhir an leagain laistigh de mheiteashonraí", "Joined": "Dáta comhcheangailte", "City for spoofed GPS image metadata": "Cathair le haghaidh meiteashonraí íomhá GPS spoofed", - "Occupation": "Slí bheatha" + "Occupation": "Slí bheatha", + "Artists": "Ealaíontóirí" } diff --git a/translations/hi.json b/translations/hi.json index 8d42d418c..50d671084 100644 --- a/translations/hi.json +++ b/translations/hi.json @@ -442,5 +442,6 @@ "Show version number within instance metadata": "उदाहरण मेटाडेटा के भीतर संस्करण संख्या दिखाएं", "Joined": "दिनांक", "City for spoofed GPS image metadata": "स्पूफ जीपीएस जीपीएस मेटाडेटा के लिए शहर", - "Occupation": "व्यवसाय" + "Occupation": "व्यवसाय", + "Artists": "कलाकार की" } diff --git a/translations/it.json b/translations/it.json index 3557bbd26..a3c118e9a 100644 --- a/translations/it.json +++ b/translations/it.json @@ -442,5 +442,6 @@ "Show version number within instance metadata": "Mostra il numero di versione nei metadati dell'istanza", "Joined": "Unito", "City for spoofed GPS image metadata": "Città per metadati di immagini GPS falsificate", - "Occupation": "Occupazione" + "Occupation": "Occupazione", + "Artists": "Artiste" } diff --git a/translations/ja.json b/translations/ja.json index 04de4d1fd..efa074b6c 100644 --- a/translations/ja.json +++ b/translations/ja.json @@ -442,5 +442,6 @@ "Show version number within instance metadata": "インスタンスメタデータ内にバージョン番号を表示する", "Joined": "参加日", "City for spoofed GPS image metadata": "なりすましGPS画像メタデータの都市", - "Occupation": "職業" + "Occupation": "職業", + "Artists": "アーティスト" } diff --git a/translations/ku.json b/translations/ku.json index bb69bf5e2..02c086a7a 100644 --- a/translations/ku.json +++ b/translations/ku.json @@ -442,5 +442,6 @@ "Show version number within instance metadata": "Di nav metadata mînakê de nimreya guhertoyê nîşan bide", "Joined": "Beşdarbûna Dîrokê", "City for spoofed GPS image metadata": "Bajar ji bo metadata wêneya GPS ya xapînok", - "Occupation": "Sinet" + "Occupation": "Sinet", + "Artists": "Hunermend" } diff --git a/translations/oc.json b/translations/oc.json index f9d2fe53b..518eae8fb 100644 --- a/translations/oc.json +++ b/translations/oc.json @@ -438,5 +438,6 @@ "Show version number within instance metadata": "Show version number within instance metadata", "Joined": "Joined", "City for spoofed GPS image metadata": "City for spoofed GPS image metadata", - "Occupation": "Occupation" + "Occupation": "Occupation", + "Artists": "Artists" } diff --git a/translations/pt.json b/translations/pt.json index 956805c99..b879a81e4 100644 --- a/translations/pt.json +++ b/translations/pt.json @@ -442,5 +442,6 @@ "Show version number within instance metadata": "Mostrar o número da versão nos metadados da instância", "Joined": "Data juntada", "City for spoofed GPS image metadata": "Cidade para metadados de imagem GPS falsificados", - "Occupation": "Ocupação" + "Occupation": "Ocupação", + "Artists": "Artistas" } diff --git a/translations/ru.json b/translations/ru.json index 6a29ea88b..2c69993fe 100644 --- a/translations/ru.json +++ b/translations/ru.json @@ -442,5 +442,6 @@ "Show version number within instance metadata": "Показать номер версии в метаданных экземпляра", "Joined": "Присоединенная дата", "City for spoofed GPS image metadata": "Город для поддельных метаданных изображения GPS", - "Occupation": "Занятие" + "Occupation": "Занятие", + "Artists": "Художники" } diff --git a/translations/zh.json b/translations/zh.json index 80222724e..04d1893dc 100644 --- a/translations/zh.json +++ b/translations/zh.json @@ -442,5 +442,6 @@ "Show version number within instance metadata": "在实例元数据中显示版本号", "Joined": "加入日期", "City for spoofed GPS image metadata": "欺骗性GPS影像元数据的城市", - "Occupation": "职业" + "Occupation": "职业", + "Artists": "艺人" } diff --git a/webapp_profile.py b/webapp_profile.py index 5ec33c1c9..33e9cbf01 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -1500,6 +1500,21 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, counselors + '' roleAssignStr += '
\n' + # artists + artists = '' + artistsFile = baseDir + '/accounts/artists.txt' + if os.path.isfile(artistsFile): + with open(artistsFile, "r") as f: + artists = f.read() + roleAssignStr += '
\n' + roleAssignStr += \ + ' ' + roleAssignStr += ' \n' + # Video section peertubeStr = '
' + \ translate['Video Settings'] + '\n' From 46687f8b6d45a476da39cee8695462e625d50590 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 17 May 2021 17:16:15 +0100 Subject: [PATCH 1019/1416] Roles section in profile --- webapp_profile.py | 1 - 1 file changed, 1 deletion(-) diff --git a/webapp_profile.py b/webapp_profile.py index 33e9cbf01..5abbea6af 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -1498,7 +1498,6 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, 'placeholder="" ' + \ 'style="height:200px" spellcheck="false">' + \ counselors + '' - roleAssignStr += '
\n' # artists artists = '' From 7a78f8e7d869fdb7ab8c8cce52e1dac76dadc6ed Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 17 May 2021 18:52:33 +0100 Subject: [PATCH 1020/1416] Graphic design section on edit profile screen --- daemon.py | 103 ++++++++++++++++++++++++------------------- translations/ar.json | 3 +- translations/ca.json | 3 +- translations/cy.json | 3 +- translations/de.json | 3 +- translations/en.json | 3 +- translations/es.json | 3 +- translations/fr.json | 3 +- translations/ga.json | 3 +- translations/hi.json | 3 +- translations/it.json | 3 +- translations/ja.json | 3 +- translations/ku.json | 3 +- translations/oc.json | 3 +- translations/pt.json | 3 +- translations/ru.json | 3 +- translations/zh.json | 3 +- utils.py | 28 ++++++++++++ webapp_profile.py | 80 ++++++++++++++++++--------------- 19 files changed, 162 insertions(+), 97 deletions(-) diff --git a/daemon.py b/daemon.py index a75dca7cf..b3c939fcc 100644 --- a/daemon.py +++ b/daemon.py @@ -214,6 +214,7 @@ from utils import hasUsersPath from utils import getFullDomain from utils import removeHtml from utils import isEditor +from utils import isArtist from utils import getImageExtensions from utils import mediaFileMimeType from utils import getCSS @@ -4269,6 +4270,38 @@ class PubServer(BaseHTTPRequestHandler): if checkNameAndBio: redirectPath = 'previewAvatar' + if nickname == adminNickname or \ + isArtist(baseDir, nickname): + # change theme + if fields.get('themeDropdown'): + self.server.themeName = fields['themeDropdown'] + setTheme(baseDir, self.server.themeName, domain, + allowLocalNetworkAccess, systemLanguage) + self.server.textModeBanner = \ + getTextModeBanner(self.server.baseDir) + self.server.iconsCache = {} + self.server.fontsCache = {} + self.server.showPublishAsIcon = \ + getConfigParam(self.server.baseDir, + 'showPublishAsIcon') + self.server.fullWidthTimelineButtonHeader = \ + getConfigParam(self.server.baseDir, + 'fullWidthTimelineButtonHeader') + self.server.iconsAsButtons = \ + getConfigParam(self.server.baseDir, + 'iconsAsButtons') + self.server.rssIconAtTop = \ + getConfigParam(self.server.baseDir, + 'rssIconAtTop') + self.server.publishButtonAtTop = \ + getConfigParam(self.server.baseDir, + 'publishButtonAtTop') + setNewsAvatar(baseDir, + fields['themeDropdown'], + httpPrefix, + domain, + domainFull) + if nickname == adminNickname: # change media instance status if fields.get('mediaInstance'): @@ -4353,36 +4386,6 @@ class PubServer(BaseHTTPRequestHandler): "blogsInstance", self.server.blogsInstance) - # change theme - if fields.get('themeDropdown'): - self.server.themeName = fields['themeDropdown'] - setTheme(baseDir, self.server.themeName, domain, - allowLocalNetworkAccess, systemLanguage) - self.server.textModeBanner = \ - getTextModeBanner(self.server.baseDir) - self.server.iconsCache = {} - self.server.fontsCache = {} - self.server.showPublishAsIcon = \ - getConfigParam(self.server.baseDir, - 'showPublishAsIcon') - self.server.fullWidthTimelineButtonHeader = \ - getConfigParam(self.server.baseDir, - 'fullWidthTimelineButtonHeader') - self.server.iconsAsButtons = \ - getConfigParam(self.server.baseDir, - 'iconsAsButtons') - self.server.rssIconAtTop = \ - getConfigParam(self.server.baseDir, - 'rssIconAtTop') - self.server.publishButtonAtTop = \ - getConfigParam(self.server.baseDir, - 'publishButtonAtTop') - setNewsAvatar(baseDir, - fields['themeDropdown'], - httpPrefix, - domain, - domainFull) - # change instance title if fields.get('instanceTitle'): currInstanceTitle = \ @@ -4953,7 +4956,10 @@ class PubServer(BaseHTTPRequestHandler): # remove a custom font if fields.get('removeCustomFont'): - if fields['removeCustomFont'] == 'on': + if (fields['removeCustomFont'] == 'on' and + (isArtist(baseDir, nickname) or + path.startswith('/users/' + + adminNickname + '/'))): fontExt = ('woff', 'woff2', 'otf', 'ttf') for ext in fontExt: if os.path.isfile(baseDir + @@ -4969,28 +4975,30 @@ class PubServer(BaseHTTPRequestHandler): currTheme = getTheme(baseDir) if currTheme: self.server.themeName = currTheme + allowLocalNetworkAccess = \ + self.server.allowLocalNetworkAccess setTheme(baseDir, currTheme, domain, - self.server.allowLocalNetworkAccess, + allowLocalNetworkAccess, systemLanguage) self.server.textModeBanner = \ - getTextModeBanner(self.server.baseDir) + getTextModeBanner(baseDir) self.server.iconsCache = {} self.server.fontsCache = {} self.server.showPublishAsIcon = \ - getConfigParam(self.server.baseDir, + getConfigParam(baseDir, 'showPublishAsIcon') self.server.fullWidthTimelineButtonHeader = \ - getConfigParam(self.server.baseDir, + getConfigParam(baseDir, 'fullWidthTimeline' + 'ButtonHeader') self.server.iconsAsButtons = \ - getConfigParam(self.server.baseDir, + getConfigParam(baseDir, 'iconsAsButtons') self.server.rssIconAtTop = \ - getConfigParam(self.server.baseDir, + getConfigParam(baseDir, 'rssIconAtTop') self.server.publishButtonAtTop = \ - getConfigParam(self.server.baseDir, + getConfigParam(baseDir, 'publishButtonAtTop') # only receive DMs from accounts you follow @@ -5090,14 +5098,17 @@ class PubServer(BaseHTTPRequestHandler): actorChanged = True # grayscale theme - grayscale = False - if fields.get('grayscale'): - if fields['grayscale'] == 'on': - grayscale = True - if grayscale: - enableGrayscale(baseDir) - else: - disableGrayscale(baseDir) + if path.startswith('/users/' + + adminNickname + '/') or \ + isArtist(baseDir, nickname): + grayscale = False + if fields.get('grayscale'): + if fields['grayscale'] == 'on': + grayscale = True + if grayscale: + enableGrayscale(baseDir) + else: + disableGrayscale(baseDir) # save filtered words list filterFilename = \ diff --git a/translations/ar.json b/translations/ar.json index 840867db3..3c148225a 100644 --- a/translations/ar.json +++ b/translations/ar.json @@ -443,5 +443,6 @@ "Joined": "تاريخ الانضمام", "City for spoofed GPS image metadata": "مدينة للبيانات الوصفية لصور GPS المخادعة", "Occupation": "الاحتلال", - "Artists": "الفنانين" + "Artists": "الفنانين", + "Graphic Design": "التصميم الجرافيكي" } diff --git a/translations/ca.json b/translations/ca.json index f1c1fca10..ac083d8b0 100644 --- a/translations/ca.json +++ b/translations/ca.json @@ -443,5 +443,6 @@ "Joined": "Data d'unió", "City for spoofed GPS image metadata": "Ciutat per a metadades d'imatges GPS falsificades", "Occupation": "Ocupació", - "Artists": "Artistes" + "Artists": "Artistes", + "Graphic Design": "Disseny gràfic" } diff --git a/translations/cy.json b/translations/cy.json index 40b5fe58b..92be8ccfc 100644 --- a/translations/cy.json +++ b/translations/cy.json @@ -443,5 +443,6 @@ "Joined": "Dyddiad ymuno", "City for spoofed GPS image metadata": "Dinas ar gyfer metadata delwedd GPS spoofed", "Occupation": "Ngalwedigaeth", - "Artists": "Artistiaid" + "Artists": "Artistiaid", + "Graphic Design": "Dylunio Graffig" } diff --git a/translations/de.json b/translations/de.json index e41a714ad..9d21db01f 100644 --- a/translations/de.json +++ b/translations/de.json @@ -443,5 +443,6 @@ "Joined": "Verbundenes Datum", "City for spoofed GPS image metadata": "Stadt für gefälschte GPS-Bildmetadaten", "Occupation": "Besetzung", - "Artists": "Künstler" + "Artists": "Künstler", + "Graphic Design": "Grafikdesign" } diff --git a/translations/en.json b/translations/en.json index 59d1dbe25..f7b950842 100644 --- a/translations/en.json +++ b/translations/en.json @@ -443,5 +443,6 @@ "Joined": "Joined", "City for spoofed GPS image metadata": "City for spoofed GPS image metadata", "Occupation": "Occupation", - "Artists": "Artists" + "Artists": "Artists", + "Graphic Design": "Graphic Design" } diff --git a/translations/es.json b/translations/es.json index 9c0a37375..9f79db640 100644 --- a/translations/es.json +++ b/translations/es.json @@ -443,5 +443,6 @@ "Joined": "Fecha unida", "City for spoofed GPS image metadata": "Ciudad para metadatos de imagen GPS falsificados", "Occupation": "Ocupación", - "Artists": "Artistas" + "Artists": "Artistas", + "Graphic Design": "Diseño gráfico" } diff --git a/translations/fr.json b/translations/fr.json index da8960e5f..bdc6e3280 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -443,5 +443,6 @@ "Joined": "Joint", "City for spoofed GPS image metadata": "Ville pour les métadonnées d'image GPS falsifiées", "Occupation": "Occupation", - "Artists": "Artistes" + "Artists": "Artistes", + "Graphic Design": "Conception graphique" } diff --git a/translations/ga.json b/translations/ga.json index eb408a367..2755d94a0 100644 --- a/translations/ga.json +++ b/translations/ga.json @@ -443,5 +443,6 @@ "Joined": "Dáta comhcheangailte", "City for spoofed GPS image metadata": "Cathair le haghaidh meiteashonraí íomhá GPS spoofed", "Occupation": "Slí bheatha", - "Artists": "Ealaíontóirí" + "Artists": "Ealaíontóirí", + "Graphic Design": "Dearadh grafach" } diff --git a/translations/hi.json b/translations/hi.json index 50d671084..77cd7bb76 100644 --- a/translations/hi.json +++ b/translations/hi.json @@ -443,5 +443,6 @@ "Joined": "दिनांक", "City for spoofed GPS image metadata": "स्पूफ जीपीएस जीपीएस मेटाडेटा के लिए शहर", "Occupation": "व्यवसाय", - "Artists": "कलाकार की" + "Artists": "कलाकार की", + "Graphic Design": "ग्राफ़िक डिज़ाइन" } diff --git a/translations/it.json b/translations/it.json index a3c118e9a..cd8b2cd25 100644 --- a/translations/it.json +++ b/translations/it.json @@ -443,5 +443,6 @@ "Joined": "Unito", "City for spoofed GPS image metadata": "Città per metadati di immagini GPS falsificate", "Occupation": "Occupazione", - "Artists": "Artiste" + "Artists": "Artiste", + "Graphic Design": "Graphic design" } diff --git a/translations/ja.json b/translations/ja.json index efa074b6c..25935464c 100644 --- a/translations/ja.json +++ b/translations/ja.json @@ -443,5 +443,6 @@ "Joined": "参加日", "City for spoofed GPS image metadata": "なりすましGPS画像メタデータの都市", "Occupation": "職業", - "Artists": "アーティスト" + "Artists": "アーティスト", + "Graphic Design": "グラフィックデザイン" } diff --git a/translations/ku.json b/translations/ku.json index 02c086a7a..b4dd76fc2 100644 --- a/translations/ku.json +++ b/translations/ku.json @@ -443,5 +443,6 @@ "Joined": "Beşdarbûna Dîrokê", "City for spoofed GPS image metadata": "Bajar ji bo metadata wêneya GPS ya xapînok", "Occupation": "Sinet", - "Artists": "Hunermend" + "Artists": "Hunermend", + "Graphic Design": "Sêwirana grafîkî" } diff --git a/translations/oc.json b/translations/oc.json index 518eae8fb..b57a869f4 100644 --- a/translations/oc.json +++ b/translations/oc.json @@ -439,5 +439,6 @@ "Joined": "Joined", "City for spoofed GPS image metadata": "City for spoofed GPS image metadata", "Occupation": "Occupation", - "Artists": "Artists" + "Artists": "Artists", + "Graphic Design": "Graphic Design" } diff --git a/translations/pt.json b/translations/pt.json index b879a81e4..aa3508853 100644 --- a/translations/pt.json +++ b/translations/pt.json @@ -443,5 +443,6 @@ "Joined": "Data juntada", "City for spoofed GPS image metadata": "Cidade para metadados de imagem GPS falsificados", "Occupation": "Ocupação", - "Artists": "Artistas" + "Artists": "Artistas", + "Graphic Design": "Design gráfico" } diff --git a/translations/ru.json b/translations/ru.json index 2c69993fe..6aad20e8f 100644 --- a/translations/ru.json +++ b/translations/ru.json @@ -443,5 +443,6 @@ "Joined": "Присоединенная дата", "City for spoofed GPS image metadata": "Город для поддельных метаданных изображения GPS", "Occupation": "Занятие", - "Artists": "Художники" + "Artists": "Художники", + "Graphic Design": "Графический дизайн" } diff --git a/translations/zh.json b/translations/zh.json index 04d1893dc..81287ecc1 100644 --- a/translations/zh.json +++ b/translations/zh.json @@ -443,5 +443,6 @@ "Joined": "加入日期", "City for spoofed GPS image metadata": "欺骗性GPS影像元数据的城市", "Occupation": "职业", - "Artists": "艺人" + "Artists": "艺人", + "Graphic Design": "平面设计" } diff --git a/utils.py b/utils.py index c478158d7..0a54a3148 100644 --- a/utils.py +++ b/utils.py @@ -194,6 +194,34 @@ def isEditor(baseDir: str, nickname: str) -> bool: return False +def isArtist(baseDir: str, nickname: str) -> bool: + """Returns true if the given nickname is an artist + """ + artistsFile = baseDir + '/accounts/artists.txt' + + if not os.path.isfile(artistsFile): + adminName = getConfigParam(baseDir, 'admin') + if not adminName: + return False + if adminName == nickname: + return True + return False + + with open(artistsFile, "r") as f: + lines = f.readlines() + if len(lines) == 0: + adminName = getConfigParam(baseDir, 'admin') + if not adminName: + return False + if adminName == nickname: + return True + for artist in lines: + artist = artist.strip('\n').strip('\r') + if artist == nickname: + return True + return False + + def getImageExtensions() -> []: """Returns a list of the possible image file extensions """ diff --git a/webapp_profile.py b/webapp_profile.py index 5abbea6af..71a4e32df 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -12,6 +12,7 @@ from utils import getOccupationName from utils import getLockedAccount from utils import hasUsersPath from utils import getFullDomain +from utils import isArtist from utils import isDormant from utils import getNicknameFromActor from utils import getDomainFromActor @@ -1292,6 +1293,49 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, peertubeStr = '' adminNickname = getConfigParam(baseDir, 'admin') + + if isArtist(baseDir, nickname) or \ + path.startswith('/users/' + str(adminNickname) + '/'): + graphicsStr = '
' + \ + translate['Graphic Design'] + '\n' + graphicsStr += '
' + + # Themes section + themes = getThemesList(baseDir) + themesDropdown += '

\n' + grayscaleFilename = \ + baseDir + '/accounts/.grayscale' + grayscale = '' + if os.path.isfile(grayscaleFilename): + grayscale = 'checked' + themesDropdown += \ + ' ' + translate['Grayscale'] + '
' + themesDropdown += '
' + if os.path.isfile(baseDir + '/fonts/custom.woff') or \ + os.path.isfile(baseDir + '/fonts/custom.woff2') or \ + os.path.isfile(baseDir + '/fonts/custom.otf') or \ + os.path.isfile(baseDir + '/fonts/custom.ttf'): + themesDropdown += \ + ' ' + \ + translate['Remove the custom font'] + '
' + themeName = getConfigParam(baseDir, 'theme') + themesDropdown = \ + themesDropdown.replace('
\n' + if adminNickname: if path.startswith('/users/' + adminNickname + '/'): # Instance details section @@ -1346,40 +1390,6 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, '
\n' - # Themes section - themes = getThemesList(baseDir) - themesDropdown += '

\n' - grayscaleFilename = \ - baseDir + '/accounts/.grayscale' - grayscale = '' - if os.path.isfile(grayscaleFilename): - grayscale = 'checked' - themesDropdown += \ - ' ' + translate['Grayscale'] + '
' - themesDropdown += '
' - if os.path.isfile(baseDir + '/fonts/custom.woff') or \ - os.path.isfile(baseDir + '/fonts/custom.woff2') or \ - os.path.isfile(baseDir + '/fonts/custom.otf') or \ - os.path.isfile(baseDir + '/fonts/custom.ttf'): - themesDropdown += \ - ' ' + \ - translate['Remove the custom font'] + '
' - themeName = getConfigParam(baseDir, 'theme') - themesDropdown = \ - themesDropdown.replace('

' if os.path.isfile(baseDir + '/accounts/newpost.txt'): - with open(baseDir + '/accounts/newpost.txt', 'r') as file: - editBlogText = '

' + file.read() + '

' + newPostStr = readWholeFile(baseDir + '/accounts/newpost.txt') + if newPostStr: + editBlogText = '

' + newPostStr + '

' cssFilename = baseDir + '/epicyon-profile.css' if os.path.isfile(baseDir + '/epicyon.css'): diff --git a/bookmarks.py b/bookmarks.py index 3858d22e7..f5f55fe96 100644 --- a/bookmarks.py +++ b/bookmarks.py @@ -25,6 +25,7 @@ from utils import saveJson from posts import getPersonBox from session import postJson from storage import storeValue +from storage import readWholeFile def undoBookmarksCollectionEntry(recentPostsCache: {}, @@ -59,10 +60,9 @@ def undoBookmarksCollectionEntry(recentPostsCache: {}, bookmarkIndex = bookmarkIndex.replace('\n', '').replace('\r', '') if bookmarkIndex not in open(bookmarksIndexFilename).read(): return - indexStr = '' - with open(bookmarksIndexFilename, 'r') as indexFile: - indexStr = indexFile.read().replace(bookmarkIndex + '\n', '') - storeValue(bookmarksIndexFilename, indexStr, 'writeonly') + indexStr = readWholeFile(bookmarksIndexFilename) + indexStr = indexStr.replace(bookmarkIndex + '\n', '') + storeValue(bookmarksIndexFilename, indexStr, 'writeonly') if not postJsonObject.get('type'): return diff --git a/categories.py b/categories.py index 67c65ba15..32247ccf2 100644 --- a/categories.py +++ b/categories.py @@ -10,6 +10,7 @@ __module_group__ = "RSS Feeds" import os import datetime from storage import storeValue +from storage import readWholeFile def getHashtagCategory(baseDir: str, hashtag: str) -> str: @@ -24,10 +25,9 @@ def getHashtagCategory(baseDir: str, hashtag: str) -> str: if not os.path.isfile(categoryFilename): return '' - with open(categoryFilename, 'r') as fp: - categoryStr = fp.read() - if categoryStr: - return categoryStr + categoryStr = readWholeFile(categoryFilename) + if categoryStr: + return categoryStr return '' @@ -53,12 +53,10 @@ def getHashtagCategories(baseDir: str, hashtag = f.split('.')[0] if len(hashtag) > maxTagLength: continue - with open(categoryFilename, 'r') as fp: - categoryStr = fp.read() - - if not categoryStr: - continue - + categoryStr = readWholeFile(categoryFilename) + if not categoryStr: + continue + if categoryStr: if category: # only return a dictionary for a specific category if categoryStr != category: diff --git a/city.py b/city.py index 1726966d3..12d5ba570 100644 --- a/city.py +++ b/city.py @@ -12,6 +12,7 @@ import datetime import random import math from random import randint +from storage import readWholeFile # states which the simulated city dweller can be in PERSON_SLEEP = 0 @@ -294,8 +295,7 @@ def getSpoofedCity(city: str, baseDir: str, nickname: str, domain: str) -> str: cityFilename = baseDir + '/accounts/' + \ nickname + '@' + domain + '/city.txt' if os.path.isfile(cityFilename): - with open(cityFilename, 'r') as fp: - city = fp.read().replace('\n', '') + city = readWholeFile(cityFilename).replace('\n', '') return city diff --git a/content.py b/content.py index 22ba06f0b..89821b983 100644 --- a/content.py +++ b/content.py @@ -19,6 +19,7 @@ from utils import dangerousMarkup from utils import isPGPEncrypted from utils import containsPGPPublicKey from petnames import getPetName +from storage import readWholeFile def removeHtmlTag(htmlStr: str, tag: str) -> str: @@ -169,8 +170,9 @@ def dangerousCSS(filename: str, allowLocalNetworkAccess: bool) -> bool: if not os.path.isfile(filename): return False - with open(filename, 'r') as fp: - content = fp.read().lower() + content = readWholeFile(filename) + if content: + content = content.lower() cssMatches = ('behavior:', ':expression', '?php', '.php', 'google', 'regexp', 'localhost', diff --git a/daemon.py b/daemon.py index 32ee60d6e..6ca766959 100644 --- a/daemon.py +++ b/daemon.py @@ -301,6 +301,7 @@ from speaker import getSSMLbox from city import getSpoofedCity import os from storage import storeValue +from storage import readWholeFile # maximum number of posts to list in outbox feed @@ -665,11 +666,7 @@ class PubServer(BaseHTTPRequestHandler): # self.send_header('Cache-Control', 'public, max-age=86400') etag = None if os.path.isfile(mediaFilename + '.etag'): - try: - with open(mediaFilename + '.etag', 'r') as etagFile: - etag = etagFile.read() - except BaseException: - pass + etag = readWholeFile(mediaFilename + '.etag') if not etag: etag = sha1(data).hexdigest() # nosec storeValue(mediaFilename + '.etag', etag, 'writeonly') @@ -690,12 +687,7 @@ class PubServer(BaseHTTPRequestHandler): oldEtag = self.headers['If-None-Match'] if os.path.isfile(mediaFilename + '.etag'): # load the etag from file - currEtag = '' - try: - with open(mediaFilename, 'r') as etagFile: - currEtag = etagFile.read() - except BaseException: - pass + currEtag = readWholeFile(mediaFilename) if oldEtag == currEtag: # The file has not changed return True @@ -1532,12 +1524,7 @@ class PubServer(BaseHTTPRequestHandler): loginNickname + '@' + domain + '/.salt' salt = createPassword(32) if os.path.isfile(saltFilename): - try: - with open(saltFilename, 'r') as fp: - salt = fp.read() - except Exception as e: - print('WARN: Unable to read salt for ' + - loginNickname + ' ' + str(e)) + salt = readWholeFile(saltFilename) else: storeValue(saltFilename, salt, 'writeonly') @@ -13108,11 +13095,7 @@ class PubServer(BaseHTTPRequestHandler): fileLength = os.path.getsize(mediaFilename) mediaTagFilename = mediaFilename + '.etag' if os.path.isfile(mediaTagFilename): - try: - with open(mediaTagFilename, 'r') as etagFile: - etag = etagFile.read() - except BaseException: - pass + etag = readWholeFile(mediaTagFilename) else: with open(mediaFilename, 'rb') as avFile: mediaBinary = avFile.read() @@ -14856,13 +14839,7 @@ def loadTokens(baseDir: str, tokensDict: {}, tokensLookup: {}) -> None: if not os.path.isfile(tokenFilename): continue nickname = handle.split('@')[0] - token = None - try: - with open(tokenFilename, 'r') as fp: - token = fp.read() - except Exception as e: - print('WARN: Unable to read token for ' + - nickname + ' ' + str(e)) + token = readWholeFile(tokenFilename) if not token: continue tokensDict[nickname] = token diff --git a/desktop_client.py b/desktop_client.py index ee7fccf83..d1dc12fbd 100644 --- a/desktop_client.py +++ b/desktop_client.py @@ -57,6 +57,7 @@ from bookmarks import sendUndoBookmarkViaServer from delete import sendDeleteViaServer from person import getActorJson from storage import storeValue +from storage import readWholeFile def _desktopHelp() -> None: @@ -284,10 +285,9 @@ def _desktopShowBanner() -> None: bannerFilename = 'theme/' + bannerTheme + '/banner.txt' if not os.path.isfile(bannerFilename): return - with open(bannerFilename, 'r') as bannerFile: - banner = bannerFile.read() - if banner: - print(banner + '\n') + banner = readWholeFile(bannerFilename) + if banner: + print(banner + '\n') def _desktopWaitForCmd(timeout: int, debug: bool) -> str: diff --git a/follow.py b/follow.py index 9eb158491..1387c2c8a 100644 --- a/follow.py +++ b/follow.py @@ -31,6 +31,8 @@ from auth import createBasicAuthHeader from session import getJson from session import postJson from storage import storeValue +from storage import readWholeFile +from storage import readFileLines def createInitialLastSeen(baseDir: str, httpPrefix: str) -> None: @@ -49,8 +51,8 @@ def createInitialLastSeen(baseDir: str, httpPrefix: str) -> None: lastSeenDir = accountDir + '/lastseen' if not os.path.isdir(lastSeenDir): os.mkdir(lastSeenDir) - with open(followingFilename, 'r') as fp: - followingHandles = fp.readlines() + followingHandles = readFileLines(followingFilename) + if followingHandles: for handle in followingHandles: if '#' in handle: continue @@ -214,9 +216,7 @@ def isFollowerOfPerson(baseDir: str, nickname: str, domain: str, alreadyFollowing = False - followersStr = '' - with open(followersFile, 'r') as fpFollowers: - followersStr = fpFollowers.read() + followersStr = readWholeFile(followersFile) if handle in followersStr: alreadyFollowing = True @@ -556,9 +556,7 @@ def _storeFollowRequest(baseDir: str, if os.path.isfile(followersFilename): alreadyFollowing = False - followersStr = '' - with open(followersFilename, 'r') as fpFollowers: - followersStr = fpFollowers.read() + followersStr = readWholeFile(followersFilename) if approveHandle in followersStr: alreadyFollowing = True diff --git a/followingCalendar.py b/followingCalendar.py index 3b4665dbe..24cd9da12 100644 --- a/followingCalendar.py +++ b/followingCalendar.py @@ -8,6 +8,7 @@ __status__ = "Production" __module_group__ = "Calendar" import os +from storage import readWholeFile from storage import storeValue @@ -29,9 +30,8 @@ def receivingCalendarEvents(baseDir: str, nickname: str, domain: str, if not os.path.isfile(followingFilename): return False # create a new calendar file from the following file - with open(followingFilename, 'r') as followingFile: - followingHandles = followingFile.read() - storeValue(calendarFilename, followingHandles, 'writeonly') + followingHandles = readWholeFile(followingFilename) + storeValue(calendarFilename, followingHandles, 'writeonly') return handle + '\n' in open(calendarFilename).read() @@ -66,14 +66,11 @@ def _receiveCalendarEvents(baseDir: str, nickname: str, domain: str, followingHandles = '' if os.path.isfile(calendarFilename): print('Calendar file exists') - with open(calendarFilename, 'r') as calendarFile: - followingHandles = calendarFile.read() + followingHandles = readWholeFile(calendarFilename) else: # create a new calendar file from the following file print('Creating calendar file ' + calendarFilename) - followingHandles = '' - with open(followingFilename, 'r') as followingFile: - followingHandles = followingFile.read() + followingHandles = readWholeFile(followingFilename) if add: storeValue(calendarFilename, followingHandles + handle, 'write') diff --git a/happening.py b/happening.py index 1bc8685a5..efb5c7c3f 100644 --- a/happening.py +++ b/happening.py @@ -17,6 +17,7 @@ from utils import loadJson from utils import saveJson from utils import locatePost from storage import storeValue +from storage import readWholeFile def _validUuid(testUuid: str, version=4): @@ -35,9 +36,9 @@ def _removeEventFromTimeline(eventId: str, tlEventsFilename: str) -> None: """ if eventId + '\n' not in open(tlEventsFilename).read(): return - with open(tlEventsFilename, 'r') as fp: - eventsTimeline = fp.read().replace(eventId + '\n', '') - storeValue(tlEventsFilename, eventsTimeline, 'writeonly') + eventsTimeline = readWholeFile(tlEventsFilename) + eventsTimeline = eventsTimeline.replace(eventId + '\n', '') + storeValue(tlEventsFilename, eventsTimeline, 'writeonly') def saveEventPost(baseDir: str, handle: str, postId: str, diff --git a/inbox.py b/inbox.py index e80fc9071..033f6b0d5 100644 --- a/inbox.py +++ b/inbox.py @@ -84,6 +84,7 @@ from context import hasValidContext from speaker import updateSpeaker from announce import isSelfAnnounce from storage import storeValue +from storage import readWholeFile def storeHashTags(baseDir: str, nickname: str, postJsonObject: {}) -> None: @@ -1879,10 +1880,9 @@ def _likeNotify(baseDir: str, domain: str, onionDomain: str, # was there a previous like notification? if os.path.isfile(prevLikeFile): # is it the same as the current notification ? - with open(prevLikeFile, 'r') as fp: - prevLikeStr = fp.read() - if prevLikeStr == likeStr: - return + prevLikeStr = readWholeFile(prevLikeFile) + if prevLikeStr == likeStr: + return storeValue(prevLikeFile, likeStr, 'writeonly') storeValue(likeFile, likeStr, 'writeonly') @@ -2108,8 +2108,8 @@ def _updateLastSeen(baseDir: str, handle: str, actor: str) -> None: daysSinceEpoch = (currTime - datetime.datetime(1970, 1, 1)).days # has the value changed? if os.path.isfile(lastSeenFilename): - with open(lastSeenFilename, 'r') as lastSeenFile: - daysSinceEpochFile = lastSeenFile.read() + daysSinceEpochFile = readWholeFile(lastSeenFilename) + if daysSinceEpochFile: if int(daysSinceEpochFile) == daysSinceEpoch: # value hasn't changed, so we can save writing anything to file return diff --git a/manualapprove.py b/manualapprove.py index 7e97543b4..9c7fdd558 100644 --- a/manualapprove.py +++ b/manualapprove.py @@ -12,6 +12,7 @@ from follow import followedAccountAccepts from follow import followedAccountRejects from follow import removeFromFollowRequests from utils import loadJson +from storage import readWholeFile from storage import storeValue @@ -96,9 +97,7 @@ def manualApproveFollowRequest(session, baseDir: str, return # is the handle in the requests file? - approveFollowsStr = '' - with open(approveFollowsFilename, 'r') as fpFollowers: - approveFollowsStr = fpFollowers.read() + approveFollowsStr = readWholeFile(approveFollowsFilename) exists = False approveHandleFull = approveHandle if approveHandle in approveFollowsStr: diff --git a/media.py b/media.py index 5530f60f5..0182222ba 100644 --- a/media.py +++ b/media.py @@ -21,6 +21,7 @@ from shutil import copyfile from shutil import rmtree from shutil import move from city import spoofGeolocation +from storage import readWholeFile from storage import storeValue @@ -70,8 +71,10 @@ def _spoofMetaData(baseDir: str, nickname: str, domain: str, baseDir + '/accounts/' + nickname + '@' + domain + '/decoyseed' decoySeed = 63725 if os.path.isfile(decoySeedFilename): - with open(decoySeedFilename, 'r') as fp: - decoySeed = int(fp.read()) + decoySeedStr = readWholeFile(decoySeedFilename) + if decoySeedStr: + if decoySeedStr.isdigit(): + decoySeed = int(decoySeedStr) else: decoySeed = randint(10000, 10000000000000000) decoySeedStr = str(decoySeed) diff --git a/newsdaemon.py b/newsdaemon.py index c816417dd..8c43b0b55 100644 --- a/newsdaemon.py +++ b/newsdaemon.py @@ -34,6 +34,7 @@ from utils import clearFromPostCaches from utils import dangerousMarkup from inbox import storeHashTags from session import createSession +from storage import readWholeFile from storage import storeValue @@ -398,9 +399,8 @@ def _createNewsMirror(baseDir: str, domain: str, # remove the corresponding index entries if removals: - indexContent = '' - with open(mirrorIndexFilename, 'r') as indexFile: - indexContent = indexFile.read() + indexContent = readWholeFile(mirrorIndexFilename) + if indexContent: for removePostId in removals: indexContent = \ indexContent.replace(removePostId + '\n', '') diff --git a/newswire.py b/newswire.py index 51c773994..8a877d07f 100644 --- a/newswire.py +++ b/newswire.py @@ -29,6 +29,8 @@ from utils import removeHtml from blocking import isBlockedDomain from blocking import isBlockedHashtag from filters import isFiltered +from storage import readWholeFile +from storage import readFileLines def _removeCDATA(text: str) -> str: @@ -219,8 +221,8 @@ def loadHashtagCategories(baseDir: str, language: str) -> None: if not os.path.isfile(hashtagCategoriesFilename): return - with open(hashtagCategoriesFilename, 'r') as fp: - xmlStr = fp.read() + xmlStr = readWholeFile(hashtagCategoriesFilename) + if xmlStr: _xml2StrToHashtagCategories(baseDir, xmlStr, 1024, True) @@ -1014,9 +1016,7 @@ def getDictFromNewswire(session, baseDir: str, domain: str, maxPostsPerSource = 5 # add rss feeds - rssFeed = [] - with open(subscriptionsFilename, 'r') as fp: - rssFeed = fp.readlines() + rssFeed = readFileLines(subscriptionsFilename) result = {} for url in rssFeed: url = url.strip() diff --git a/person.py b/person.py index f9052ff86..eaca21988 100644 --- a/person.py +++ b/person.py @@ -52,6 +52,7 @@ from session import createSession from session import getJson from webfinger import webfingerHandle from pprint import pprint +from storage import readWholeFile from storage import storeValue @@ -1121,9 +1122,7 @@ def isPersonSnoozed(baseDir: str, nickname: str, domain: str, replaceStr = line break if replaceStr: - content = None - with open(snoozedFilename, 'r') as snoozedFile: - content = snoozedFile.read().replace(replaceStr, '') + content = readWholeFile(snoozedFilename).replace(replaceStr, '') if content: storeValue(snoozedFilename, content, 'writeonly') @@ -1168,9 +1167,7 @@ def personUnsnooze(baseDir: str, nickname: str, domain: str, replaceStr = line break if replaceStr: - content = None - with open(snoozedFilename, 'r') as snoozedFile: - content = snoozedFile.read().replace(replaceStr, '') + content = readWholeFile(snoozedFilename).replace(replaceStr, '') if content: storeValue(snoozedFilename, content, 'writeonly') diff --git a/petnames.py b/petnames.py index 52ece3c3f..7d4ffd4f5 100644 --- a/petnames.py +++ b/petnames.py @@ -7,6 +7,7 @@ __email__ = "bob@freedombone.net" __status__ = "Production" import os +from storage import readWholeFile from storage import storeValue @@ -28,8 +29,8 @@ def setPetName(baseDir: str, nickname: str, domain: str, # does this entry already exist? if os.path.isfile(petnamesFilename): - with open(petnamesFilename, 'r') as petnamesFile: - petnamesStr = petnamesFile.read() + petnamesStr = readWholeFile(petnamesFilename) + if petnamesStr: if entry in petnamesStr: return True if ' ' + handle + '\n' in petnamesStr: @@ -65,8 +66,8 @@ def getPetName(baseDir: str, nickname: str, domain: str, if not os.path.isfile(petnamesFilename): return '' - with open(petnamesFilename, 'r') as petnamesFile: - petnamesStr = petnamesFile.read() + petnamesStr = readWholeFile(petnamesFilename) + if petnamesStr: if ' ' + handle + '\n' in petnamesStr: petnamesList = petnamesStr.split('\n') for pet in petnamesList: @@ -86,8 +87,8 @@ def _getPetNameHandle(baseDir: str, nickname: str, domain: str, if not os.path.isfile(petnamesFilename): return '' - with open(petnamesFilename, 'r') as petnamesFile: - petnamesStr = petnamesFile.read() + petnamesStr = readWholeFile(petnamesFilename) + if petnamesStr: if petname + ' ' in petnamesStr: petnamesList = petnamesStr.split('\n') for pet in petnamesList: diff --git a/posts.py b/posts.py index 05291fedf..e7d0c6328 100644 --- a/posts.py +++ b/posts.py @@ -72,6 +72,7 @@ from git import convertPostToPatch from linked_data_sig import generateJsonSignature from petnames import resolvePetnames from storage import storeValue +from storage import readWholeFile def isModerator(baseDir: str, nickname: str) -> bool: @@ -3022,9 +3023,8 @@ def _addPostToTimeline(filePath: str, boxname: str, postsInBox: [], boxActor: str) -> bool: """ Reads a post from file and decides whether it is valid """ - with open(filePath, 'r') as postFile: - postStr = postFile.read() - + postStr = readWholeFile(filePath) + if postStr: if filePath.endswith('.json'): repliesFilename = filePath.replace('.json', '.replies') if os.path.isfile(repliesFilename): @@ -3715,9 +3715,7 @@ def getPublicPostDomainsBlocked(session, baseDir: str, return [] # read the blocked domains as a single string - blockedStr = '' - with open(blockingFilename, 'r') as fp: - blockedStr = fp.read() + blockedStr = readWholeFile(blockingFilename) blockedDomains = [] for domainName in postDomains: @@ -3766,8 +3764,7 @@ def checkDomains(session, baseDir: str, updateFollowerWarnings = False followerWarningStr = '' if os.path.isfile(followerWarningFilename): - with open(followerWarningFilename, 'r') as fp: - followerWarningStr = fp.read() + followerWarningStr = readWholeFile(followerWarningFilename) if singleCheck: # checks a single random non-mutual diff --git a/speaker.py b/speaker.py index a04ef3709..c1d61042d 100644 --- a/speaker.py +++ b/speaker.py @@ -22,6 +22,8 @@ from utils import loadJson from utils import saveJson from utils import isPGPEncrypted from content import htmlReplaceQuoteMarks +from storage import readFileLines +from storage import readWholeFile speakerRemoveChars = ('.\n', '. ', ',', ';', '?', '!') @@ -135,8 +137,8 @@ def _speakerPronounce(baseDir: str, sayText: str, translate: {}) -> str: ")": "," } if os.path.isfile(pronounceFilename): - with open(pronounceFilename, 'r') as fp: - pronounceList = fp.readlines() + pronounceList = readFileLines(pronounceFilename) + if pronounceList: for conversion in pronounceList: separator = None if '->' in conversion: @@ -494,8 +496,8 @@ def _postToSpeakerJson(baseDir: str, httpPrefix: str, accountsDir = baseDir + '/accounts/' + nickname + '@' + domainFull approveFollowsFilename = accountsDir + '/followrequests.txt' if os.path.isfile(approveFollowsFilename): - with open(approveFollowsFilename, 'r') as fp: - follows = fp.readlines() + follows = readFileLines(approveFollowsFilename) + if follows: if len(follows) > 0: followRequestsExist = True for i in range(len(follows)): @@ -512,8 +514,7 @@ def _postToSpeakerJson(baseDir: str, httpPrefix: str, likedBy = '' likeFilename = accountsDir + '/.newLike' if os.path.isfile(likeFilename): - with open(likeFilename, 'r') as fp: - likedBy = fp.read() + likedBy = readWholeFile(likeFilename) calendarFilename = accountsDir + '/.newCalendar' postCal = os.path.isfile(calendarFilename) shareFilename = accountsDir + '/.newShare' diff --git a/storage.py b/storage.py index 0417796f0..d78d35648 100644 --- a/storage.py +++ b/storage.py @@ -54,3 +54,19 @@ def storeValue(filename: str, lineStr: str, storeType: str) -> bool: print('WARN: Unable to prepend to ' + filename + ' ' + str(e)) return False + + +def readWholeFile(filename: str) -> str: + """Returns the entire contents of a file + """ + with open(filename, 'r') as fp: + return fp.read() + return '' + + +def readFileLines(filename: str) -> []: + """Returns a list of lines from a file + """ + with open(filename, 'r') as fp: + return fp.readlines() + return [] diff --git a/theme.py b/theme.py index 5fa2bac01..600faadbf 100644 --- a/theme.py +++ b/theme.py @@ -17,6 +17,7 @@ from shutil import unpack_archive from shutil import rmtree from content import dangerousCSS from storage import storeValue +from storage import readWholeFile def importTheme(baseDir: str, filename: str) -> bool: @@ -35,9 +36,9 @@ def importTheme(baseDir: str, filename: str) -> bool: print('WARN: ' + themeFile + ' missing from imported theme') return False - newThemeName = None - with open(tempThemeDir + '/name.txt', 'r') as fp: - newThemeName = fp.read().replace('\n', '').replace('\r', '') + newThemeName = readWholeFile(tempThemeDir + '/name.txt') + if newThemeName: + newThemeName = newThemeName.replace('\n', '').replace('\r', '') if len(newThemeName) > 20: print('WARN: Imported theme name is too long') return False @@ -327,8 +328,8 @@ def _setThemeFromDict(baseDir: str, name: str, if not os.path.isfile(templateFilename): continue - with open(templateFilename, 'r') as cssfile: - css = cssfile.read() + css = readWholeFile(templateFilename) + if css: for paramName, paramValue in themeParams.items(): if paramName == 'newswire-publish-icon': if paramValue.lower() == 'true': @@ -385,8 +386,8 @@ def _setBackgroundFormat(baseDir: str, name: str, cssFilename = baseDir + '/' + backgroundType + '.css' if not os.path.isfile(cssFilename): return - with open(cssFilename, 'r') as cssfile: - css = cssfile.read() + css = readWholeFile(cssFilename) + if css: css = css.replace('background.jpg', 'background.' + extension) storeValue(cssFilename, css, 'writeonly') @@ -399,8 +400,8 @@ def enableGrayscale(baseDir: str) -> None: templateFilename = baseDir + '/' + filename if not os.path.isfile(templateFilename): continue - with open(templateFilename, 'r') as cssfile: - css = cssfile.read() + css = readWholeFile(templateFilename) + if css: if 'grayscale' not in css: css = \ css.replace('body, html {', @@ -420,8 +421,8 @@ def disableGrayscale(baseDir: str) -> None: templateFilename = baseDir + '/' + filename if not os.path.isfile(templateFilename): continue - with open(templateFilename, 'r') as cssfile: - css = cssfile.read() + css = readWholeFile(templateFilename) + if css: if 'grayscale' in css: css = \ css.replace('\n filter: grayscale(100%);', '') @@ -456,8 +457,8 @@ def _setCustomFont(baseDir: str): templateFilename = baseDir + '/' + filename if not os.path.isfile(templateFilename): continue - with open(templateFilename, 'r') as cssfile: - css = cssfile.read() + css = readWholeFile(templateFilename) + if css: css = \ setCSSparam(css, "*src", "url('./fonts/custom." + @@ -540,10 +541,9 @@ def getTextModeBanner(baseDir: str) -> str: """ textModeBannerFilename = baseDir + '/accounts/banner.txt' if os.path.isfile(textModeBannerFilename): - with open(textModeBannerFilename, 'r') as fp: - bannerStr = fp.read() - if bannerStr: - return bannerStr.replace('\n', '
') + bannerStr = readWholeFile(textModeBannerFilename) + if bannerStr: + return bannerStr.replace('\n', '
') return None @@ -554,10 +554,9 @@ def getTextModeLogo(baseDir: str) -> str: if not os.path.isfile(textModeLogoFilename): textModeLogoFilename = baseDir + '/img/logo.txt' - with open(textModeLogoFilename, 'r') as fp: - logoStr = fp.read() - if logoStr: - return logoStr.replace('\n', '
') + logoStr = readWholeFile(textModeLogoFilename) + if logoStr: + return logoStr.replace('\n', '
') return None diff --git a/utils.py b/utils.py index 85d24364e..41abdba78 100644 --- a/utils.py +++ b/utils.py @@ -19,6 +19,7 @@ from followingCalendar import addPersonToCalendar from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import hashes from storage import storeValue +from storage import readWholeFile # posts containing these strings will always get screened out, # both incoming and outgoing. @@ -163,8 +164,8 @@ def isDormant(baseDir: str, nickname: str, domain: str, actor: str, if not os.path.isfile(lastSeenFilename): return False - with open(lastSeenFilename, 'r') as lastSeenFile: - daysSinceEpochStr = lastSeenFile.read() + daysSinceEpochStr = readWholeFile(lastSeenFilename) + if daysSinceEpochStr: daysSinceEpoch = int(daysSinceEpochStr) currTime = datetime.datetime.utcnow() currDaysSinceEpoch = (currTime - datetime.datetime(1970, 1, 1)).days @@ -506,8 +507,8 @@ def loadJson(filename: str, delaySec=2, maxTries=5) -> {}: tries = 0 while tries < maxTries: try: - with open(filename, 'r') as fp: - data = fp.read() + data = readWholeFile(filename) + if data: jsonObject = json.loads(data) break except BaseException: @@ -527,14 +528,13 @@ def loadJsonOnionify(filename: str, domain: str, onionDomain: str, tries = 0 while tries < 5: try: - with open(filename, 'r') as fp: - data = fp.read() - if data: - data = data.replace(domain, onionDomain) - data = data.replace('https:', 'http:') - print('*****data: ' + data) - jsonObject = json.loads(data) - break + data = readWholeFile(filename) + if data: + data = data.replace(domain, onionDomain) + data = data.replace('https:', 'http:') + print('*****data: ' + data) + jsonObject = json.loads(data) + break except BaseException: print('WARN: loadJson exception') if delaySec > 0: @@ -942,14 +942,13 @@ def _setDefaultPetName(baseDir: str, nickname: str, domain: str, storeValue(petnamesFilename, petnameLookupEntry, 'writeonly') return - with open(petnamesFilename, 'r') as petnamesFile: - petnamesStr = petnamesFile.read() - if petnamesStr: - petnamesList = petnamesStr.split('\n') - for pet in petnamesList: - if pet.startswith(followNickname + ' '): - # petname already exists - return + petnamesStr = readWholeFile(petnamesFilename) + if petnamesStr: + petnamesList = petnamesStr.split('\n') + for pet in petnamesList: + if pet.startswith(followNickname + ' '): + # petname already exists + return # petname doesn't already exist storeValue(petnamesFilename, petnameLookupEntry, 'append') @@ -1094,13 +1093,12 @@ def locateNewsArrival(baseDir: str, domain: str, accountDir = baseDir + '/accounts/news@' + domain + '/' postFilename = accountDir + 'outbox/' + postUrl if os.path.isfile(postFilename): - with open(postFilename, 'r') as arrivalFile: - arrival = arrivalFile.read() - if arrival: - arrivalDate = \ - datetime.datetime.strptime(arrival, - "%Y-%m-%dT%H:%M:%SZ") - return arrivalDate + arrival = readWholeFile(postFilename) + if arrival: + arrivalDate = \ + datetime.datetime.strptime(arrival, + "%Y-%m-%dT%H:%M:%SZ") + return arrivalDate return None @@ -1488,8 +1486,8 @@ def noOfActiveAccountsMonthly(baseDir: str, months: int) -> bool: lastUsedFilename = \ baseDir + '/accounts/' + account + '/.lastUsed' if os.path.isfile(lastUsedFilename): - with open(lastUsedFilename, 'r') as lastUsedFile: - lastUsed = lastUsedFile.read() + lastUsed = readWholeFile(lastUsedFilename) + if lastUsed: if lastUsed.isdigit(): timeDiff = (currTime - int(lastUsed)) if timeDiff < monthSeconds: @@ -1645,8 +1643,8 @@ def getCSS(baseDir: str, cssFilename: str, cssCache: {}) -> str: # file hasn't changed, so return the version in the cache return cssCache[cssFilename][1] - with open(cssFilename, 'r') as fpCSS: - css = fpCSS.read() + css = readWholeFile(cssFilename) + if css: if cssCache.get(cssFilename): # alter the cache contents cssCache[cssFilename][0] = lastModified @@ -1756,9 +1754,8 @@ def _searchVirtualBoxPosts(baseDir: str, nickname: str, domain: str, postFilename = path + '/' + postFilename.strip() if not os.path.isfile(postFilename): continue - with open(postFilename, 'r') as postFile: - data = postFile.read().lower() - + data = readWholeFile(postFilename).lower() + if data: notFound = False for keyword in searchWords: if keyword not in data: @@ -1799,9 +1796,8 @@ def searchBoxPosts(baseDir: str, nickname: str, domain: str, for root, dirs, fnames in os.walk(path): for fname in fnames: filePath = os.path.join(root, fname) - with open(filePath, 'r') as postFile: - data = postFile.read().lower() - + data = readWholeFile(filePath).lower() + if data: notFound = False for keyword in searchWords: if keyword not in data: diff --git a/webapp_about.py b/webapp_about.py index 233d052f7..a9f468007 100644 --- a/webapp_about.py +++ b/webapp_about.py @@ -13,6 +13,7 @@ from utils import getConfigParam from webapp_utils import htmlHeaderWithWebsiteMarkup from webapp_utils import htmlFooter from webapp_utils import markdownToHtml +from storage import readWholeFile def htmlAbout(cssCache: {}, baseDir: str, httpPrefix: str, @@ -32,8 +33,9 @@ def htmlAbout(cssCache: {}, baseDir: str, httpPrefix: str, aboutText = 'Information about this instance goes here.' if os.path.isfile(baseDir + '/accounts/about.md'): - with open(baseDir + '/accounts/about.md', 'r') as aboutFile: - aboutText = markdownToHtml(aboutFile.read()) + aboutText = readWholeFile(baseDir + '/accounts/about.md') + if aboutText: + aboutText = markdownToHtml(aboutText) aboutForm = '' cssFilename = baseDir + '/epicyon-profile.css' diff --git a/webapp_column_left.py b/webapp_column_left.py index 5428650f0..5fc2cfe82 100644 --- a/webapp_column_left.py +++ b/webapp_column_left.py @@ -18,6 +18,7 @@ from webapp_utils import headerButtonsFrontScreen from webapp_utils import htmlHeaderWithExternalStyle from webapp_utils import htmlFooter from webapp_utils import getBannerFile +from storage import readWholeFile def _linksExist(baseDir: str) -> bool: @@ -403,8 +404,7 @@ def htmlEditLinks(cssCache: {}, translate: {}, baseDir: str, path: str, linksFilename = baseDir + '/accounts/links.txt' linksStr = '' if os.path.isfile(linksFilename): - with open(linksFilename, 'r') as fp: - linksStr = fp.read() + linksStr = readWholeFile(linksFilename) editLinksForm += \ '
' @@ -426,8 +426,7 @@ def htmlEditLinks(cssCache: {}, translate: {}, baseDir: str, path: str, aboutFilename = baseDir + '/accounts/about.md' aboutStr = '' if os.path.isfile(aboutFilename): - with open(aboutFilename, 'r') as fp: - aboutStr = fp.read() + aboutStr = readWholeFile(aboutFilename) editLinksForm += \ '
' @@ -445,8 +444,7 @@ def htmlEditLinks(cssCache: {}, translate: {}, baseDir: str, path: str, TOSFilename = baseDir + '/accounts/tos.md' TOSStr = '' if os.path.isfile(TOSFilename): - with open(TOSFilename, 'r') as fp: - TOSStr = fp.read() + TOSStr = readWholeFile(TOSFilename) editLinksForm += \ '
' diff --git a/webapp_column_right.py b/webapp_column_right.py index 0d194c1b0..6a5664630 100644 --- a/webapp_column_right.py +++ b/webapp_column_right.py @@ -24,6 +24,7 @@ from webapp_utils import htmlFooter from webapp_utils import getBannerFile from webapp_utils import htmlPostSeparator from webapp_utils import headerButtonsFrontScreen +from storage import readWholeFile def _votesIndicator(totalVotes: int, positiveVoting: bool) -> str: @@ -576,8 +577,7 @@ def htmlEditNewswire(cssCache: {}, translate: {}, baseDir: str, path: str, newswireFilename = baseDir + '/accounts/newswire.txt' newswireStr = '' if os.path.isfile(newswireFilename): - with open(newswireFilename, 'r') as fp: - newswireStr = fp.read() + newswireStr = readWholeFile(newswireFilename) editNewswireForm += \ '
' @@ -595,8 +595,7 @@ def htmlEditNewswire(cssCache: {}, translate: {}, baseDir: str, path: str, filterFilename = \ baseDir + '/accounts/news@' + domain + '/filters.txt' if os.path.isfile(filterFilename): - with open(filterFilename, 'r') as filterfile: - filterStr = filterfile.read() + filterStr = readWholeFile(filterFilename) editNewswireForm += \ '
' @@ -426,7 +426,8 @@ def htmlEditLinks(cssCache: {}, translate: {}, baseDir: str, path: str, aboutFilename = baseDir + '/accounts/about.md' aboutStr = '' if os.path.isfile(aboutFilename): - aboutStr = readWholeFile(aboutFilename) + with open(aboutFilename, 'r') as fp: + aboutStr = fp.read() editLinksForm += \ '
' @@ -444,7 +445,8 @@ def htmlEditLinks(cssCache: {}, translate: {}, baseDir: str, path: str, TOSFilename = baseDir + '/accounts/tos.md' TOSStr = '' if os.path.isfile(TOSFilename): - TOSStr = readWholeFile(TOSFilename) + with open(TOSFilename, 'r') as fp: + TOSStr = fp.read() editLinksForm += \ '
' diff --git a/webapp_column_right.py b/webapp_column_right.py index 6a5664630..0d194c1b0 100644 --- a/webapp_column_right.py +++ b/webapp_column_right.py @@ -24,7 +24,6 @@ from webapp_utils import htmlFooter from webapp_utils import getBannerFile from webapp_utils import htmlPostSeparator from webapp_utils import headerButtonsFrontScreen -from storage import readWholeFile def _votesIndicator(totalVotes: int, positiveVoting: bool) -> str: @@ -577,7 +576,8 @@ def htmlEditNewswire(cssCache: {}, translate: {}, baseDir: str, path: str, newswireFilename = baseDir + '/accounts/newswire.txt' newswireStr = '' if os.path.isfile(newswireFilename): - newswireStr = readWholeFile(newswireFilename) + with open(newswireFilename, 'r') as fp: + newswireStr = fp.read() editNewswireForm += \ '
' @@ -595,7 +595,8 @@ def htmlEditNewswire(cssCache: {}, translate: {}, baseDir: str, path: str, filterFilename = \ baseDir + '/accounts/news@' + domain + '/filters.txt' if os.path.isfile(filterFilename): - filterStr = readWholeFile(filterFilename) + with open(filterFilename, 'r') as filterfile: + filterStr = filterfile.read() editNewswireForm += \ '
\n' galleryStr += '
\n' galleryStr += ' ' + avatarLink + '\n' From 80f43a728a428761436311a251998d9d38d0c0a7 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 22 Jun 2021 13:42:52 +0100 Subject: [PATCH 1235/1416] Spaces --- acceptreject.py | 10 +++++----- announce.py | 3 ++- auth.py | 2 +- availability.py | 4 ++-- bookmarks.py | 6 +++--- cache.py | 6 +++--- content.py | 8 ++++---- epicyon.py | 2 +- inbox.py | 2 +- person.py | 2 +- posts.py | 12 ++++++------ tests.py | 4 ++-- utils.py | 6 +++--- webapp_headerbuttons.py | 2 +- webapp_profile.py | 4 ++-- 15 files changed, 37 insertions(+), 36 deletions(-) diff --git a/acceptreject.py b/acceptreject.py index 9ce38ca9f..5bbba45ec 100644 --- a/acceptreject.py +++ b/acceptreject.py @@ -38,7 +38,7 @@ def _createAcceptReject(baseDir: str, federationList: [], newAccept = { "@context": "https://www.w3.org/ns/activitystreams", 'type': acceptType, - 'actor': httpPrefix+'://' + domain + '/users/' + nickname, + 'actor': httpPrefix + '://' + domain + '/users/' + nickname, 'to': [toUrl], 'cc': [], 'object': objectJson @@ -120,9 +120,9 @@ def _acceptFollow(baseDir: str, domain: str, messageJson: {}, print('DEBUG: unrecognized actor ' + thisActor) return else: - if not '/' + acceptedDomain+'/users/' + nickname in thisActor: + if not '/' + acceptedDomain + '/users/' + nickname in thisActor: if debug: - print('Expected: /' + acceptedDomain+'/users/' + nickname) + print('Expected: /' + acceptedDomain + '/users/' + nickname) print('Actual: ' + thisActor) print('DEBUG: unrecognized actor ' + thisActor) return @@ -134,7 +134,7 @@ def _acceptFollow(baseDir: str, domain: str, messageJson: {}, return followedDomainFull = followedDomain if port: - followedDomainFull = followedDomain+':' + str(port) + followedDomainFull = followedDomain + ':' + str(port) followedNickname = getNicknameFromActor(followedActor) if not followedNickname: print('DEBUG: no nickname found within Follow activity object ' + @@ -168,7 +168,7 @@ def _acceptFollow(baseDir: str, domain: str, messageJson: {}, else: if debug: print('DEBUG: Unable to create follow - ' + - nickname + '@' + acceptedDomain+' -> ' + + nickname + '@' + acceptedDomain + ' -> ' + followedNickname + '@' + followedDomain) diff --git a/announce.py b/announce.py index 97c9d4fb1..0f41fb0f1 100644 --- a/announce.py +++ b/announce.py @@ -198,9 +198,10 @@ def sendAnnounceViaServer(baseDir: str, session, statusNumber, published = getStatusNumber() newAnnounceId = httpPrefix + '://' + fromDomainFull + '/users/' + \ fromNickname + '/statuses/' + statusNumber + actorStr = httpPrefix + '://' + fromDomainFull + '/users/' + fromNickname newAnnounceJson = { "@context": "https://www.w3.org/ns/activitystreams", - 'actor': httpPrefix+'://'+fromDomainFull+'/users/'+fromNickname, + 'actor': actorStr, 'atomUri': newAnnounceId, 'cc': [ccUrl], 'id': newAnnounceId + '/activity', diff --git a/auth.py b/auth.py index a73d4c3f3..42cf25fa2 100644 --- a/auth.py +++ b/auth.py @@ -134,7 +134,7 @@ def authorizeBasic(baseDir: str, path: str, authHeader: str, providedPassword = plain.split(':')[1] passfile = open(passwordFile, "r") for line in passfile: - if line.startswith(nickname+':'): + if line.startswith(nickname + ':'): storedPassword = \ line.split(':')[1].replace('\n', '').replace('\r', '') success = _verifyPassword(storedPassword, providedPassword) diff --git a/availability.py b/availability.py index 9df2173bd..3cedea24a 100644 --- a/availability.py +++ b/availability.py @@ -95,8 +95,8 @@ def sendAvailabilityViaServer(baseDir: str, session, newAvailabilityJson = { 'type': 'Availability', - 'actor': httpPrefix+'://'+domainFull+'/users/'+nickname, - 'object': '"'+status+'"', + 'actor': httpPrefix + '://' + domainFull + '/users/' + nickname, + 'object': '"' + status + '"', 'to': [toUrl], 'cc': [ccUrl] } diff --git a/bookmarks.py b/bookmarks.py index 9eece3f02..a2b595d91 100644 --- a/bookmarks.py +++ b/bookmarks.py @@ -243,7 +243,7 @@ def bookmark(recentPostsCache: {}, newBookmarkJson = { "@context": "https://www.w3.org/ns/activitystreams", 'type': 'Bookmark', - 'actor': httpPrefix+'://'+fullDomain+'/users/'+nickname, + 'actor': httpPrefix + '://' + fullDomain + '/users/' + nickname, 'object': objectUrl } if ccList: @@ -302,10 +302,10 @@ def undoBookmark(recentPostsCache: {}, newUndoBookmarkJson = { "@context": "https://www.w3.org/ns/activitystreams", 'type': 'Undo', - 'actor': httpPrefix+'://'+fullDomain+'/users/'+nickname, + 'actor': httpPrefix + '://' + fullDomain + '/users/' + nickname, 'object': { 'type': 'Bookmark', - 'actor': httpPrefix+'://'+fullDomain+'/users/'+nickname, + 'actor': httpPrefix + '://' + fullDomain + '/users/' + nickname, 'object': objectUrl } } diff --git a/cache.py b/cache.py index bf9e5a351..96608524e 100644 --- a/cache.py +++ b/cache.py @@ -20,7 +20,7 @@ def _removePersonFromCache(baseDir: str, personUrl: str, """Removes an actor from the cache """ cacheFilename = baseDir + '/cache/actors/' + \ - personUrl.replace('/', '#')+'.json' + personUrl.replace('/', '#') + '.json' if os.path.isfile(cacheFilename): try: os.remove(cacheFilename) @@ -70,7 +70,7 @@ def storePersonInCache(baseDir: str, personUrl: str, return if os.path.isdir(baseDir + '/cache/actors'): cacheFilename = baseDir + '/cache/actors/' + \ - personUrl.replace('/', '#')+'.json' + personUrl.replace('/', '#') + '.json' if not os.path.isfile(cacheFilename): saveJson(personJson, cacheFilename) @@ -84,7 +84,7 @@ def getPersonFromCache(baseDir: str, personUrl: str, personCache: {}, if not personCache.get(personUrl): # does the person exist as a cached file? cacheFilename = baseDir + '/cache/actors/' + \ - personUrl.replace('/', '#')+'.json' + personUrl.replace('/', '#') + '.json' actorFilename = getFileCaseInsensitive(cacheFilename) if actorFilename: personJson = loadJson(actorFilename) diff --git a/content.py b/content.py index 22ba06f0b..79d8b4dd0 100644 --- a/content.py +++ b/content.py @@ -306,7 +306,7 @@ def _addMusicTag(content: str, tag: str) -> str: musicSites = ('soundcloud.com', 'bandcamp.com') musicSiteFound = False for site in musicSites: - if site+'/' in content: + if site + '/' in content: musicSiteFound = True break if not musicSiteFound: @@ -458,7 +458,7 @@ def _addEmoji(baseDir: str, wordStr: str, 'type': 'Image', 'url': emojiUrl }, - 'name': ':'+emoji+':', + 'name': ':' + emoji + ':', "updated": fileLastModified(emojiFilename), "id": emojiUrl.replace('.png', ''), 'type': 'Emoji' @@ -820,7 +820,7 @@ def addHtmlTags(baseDir: str, httpPrefix: str, continue elif ':' in wordStr: wordStr2 = wordStr.split(':')[1] -# print('TAG: emoji located - '+wordStr) +# print('TAG: emoji located - ' + wordStr) if not emojiDict: # emoji.json is generated so that it can be customized and # the changes will be retained even if default_emoji.json @@ -830,7 +830,7 @@ def addHtmlTags(baseDir: str, httpPrefix: str, baseDir + '/emoji/emoji.json') emojiDict = loadJson(baseDir + '/emoji/emoji.json') -# print('TAG: looking up emoji for :'+wordStr2+':') +# print('TAG: looking up emoji for :' + wordStr2 + ':') _addEmoji(baseDir, ':' + wordStr2 + ':', httpPrefix, originalDomain, replaceEmoji, hashtags, emojiDict) diff --git a/epicyon.py b/epicyon.py index a36e4af93..34baebdff 100644 --- a/epicyon.py +++ b/epicyon.py @@ -1092,7 +1092,7 @@ if args.message: toDomain = 'public' toPort = port - # ccUrl=httpPrefix+'://'+domain+'/users/'+nickname+'/followers' + # ccUrl = httpPrefix + '://' + domain + '/users/' + nickname + '/followers' ccUrl = None sendMessage = args.message followersOnly = args.followersonly diff --git a/inbox.py b/inbox.py index 4fdc8ce04..a87a15f53 100644 --- a/inbox.py +++ b/inbox.py @@ -506,7 +506,7 @@ def _inboxPostRecipientsAdd(baseDir: str, httpPrefix: str, toList: [], if domainMatch in recipient: # get the handle for the local account nickname = recipient.split(domainMatch)[1] - handle = nickname+'@'+domain + handle = nickname + '@' + domain if os.path.isdir(baseDir + '/accounts/' + handle): recipientsDict[handle] = None else: diff --git a/person.py b/person.py index 401a4c00b..44468e4de 100644 --- a/person.py +++ b/person.py @@ -131,7 +131,7 @@ def setProfileImage(baseDir: str, httpPrefix: str, nickname: str, domain: str, personJson[iconFilenameBase]['mediaType'] = mediaType personJson[iconFilenameBase]['url'] = \ httpPrefix + '://' + fullDomain + '/users/' + \ - nickname + '/'+iconFilename + nickname + '/' + iconFilename saveJson(personJson, personFilename) cmd = \ diff --git a/posts.py b/posts.py index a5b562d4b..0788f4a60 100644 --- a/posts.py +++ b/posts.py @@ -1060,7 +1060,7 @@ def _createPostBase(baseDir: str, nickname: str, domain: str, port: int, httpPrefix + '://' + domain + '/users/' + nickname + \ '/statuses/' + statusNumber + '/replies' newPostUrl = \ - httpPrefix + '://' + domain + '/@' + nickname + '/'+statusNumber + httpPrefix + '://' + domain + '/@' + nickname + '/' + statusNumber newPostAttributedTo = \ httpPrefix + '://' + domain + '/users/' + nickname newPost = { @@ -1120,7 +1120,7 @@ def _createPostBase(baseDir: str, nickname: str, domain: str, port: int, httpPrefix + '://' + domain + '/users/' + nickname + \ '/statuses/' + statusNumber + '/replies' newPostUrl = \ - httpPrefix + '://' + domain + '/@' + nickname+'/' + statusNumber + httpPrefix + '://' + domain + '/@' + nickname + '/' + statusNumber newPost = { "@context": postContext, 'id': newPostId, @@ -2896,7 +2896,7 @@ def createModeration(baseDir: str, nickname: str, domain: str, port: int, pageNumber = 1 pageStr = '?page=' + str(pageNumber) - boxUrl = httpPrefix+'://'+domain+'/users/'+nickname+'/'+boxname + boxUrl = httpPrefix + '://' + domain + '/users/' + nickname + '/' + boxname boxHeader = { '@context': 'https://www.w3.org/ns/activitystreams', 'first': boxUrl + '?page=true', @@ -3849,8 +3849,8 @@ def populateRepliesJson(baseDir: str, nickname: str, domain: str, searchFilename = \ baseDir + \ '/accounts/' + nickname + '@' + \ - domain+'/' + \ - boxname+'/' + \ + domain + '/' + \ + boxname + '/' + \ messageId2.replace('/', '#') + '.json' if os.path.isfile(searchFilename): if authorized or \ @@ -3877,7 +3877,7 @@ def populateRepliesJson(baseDir: str, nickname: str, domain: str, searchFilename = \ baseDir + \ '/accounts/inbox@' + \ - domain+'/inbox/' + \ + domain + '/inbox/' + \ messageId2.replace('/', '#') + '.json' if os.path.isfile(searchFilename): if authorized or \ diff --git a/tests.py b/tests.py index 58ca52853..b5e8c9b01 100644 --- a/tests.py +++ b/tests.py @@ -2045,7 +2045,7 @@ def _testAddEmoji(): tags.append(tag) content = contentModified contentModified = replaceEmojiFromTags(content, tags, 'content') - # print('contentModified: '+contentModified) + # print('contentModified: ' + contentModified) assert contentModified == '

Emoji 🍋 🍓 🍌

' os.chdir(baseDirOriginal) @@ -2124,7 +2124,7 @@ def _testRecentPostsCache(): htmlStr = '' for i in range(5): postJsonObject = { - "id": "https://somesite.whatever/users/someuser/statuses/"+str(i) + "id": "https://somesite.whatever/users/someuser/statuses/" + str(i) } updateRecentPostsCache(recentPostsCache, maxRecentPosts, postJsonObject, htmlStr) diff --git a/utils.py b/utils.py index 311d0e70f..47a1b392f 100644 --- a/utils.py +++ b/utils.py @@ -1563,10 +1563,10 @@ def getCachedPostFilename(baseDir: str, nickname: str, domain: str, """ cachedPostDir = getCachedPostDirectory(baseDir, nickname, domain) if not os.path.isdir(cachedPostDir): - # print('ERROR: invalid html cache directory '+cachedPostDir) + # print('ERROR: invalid html cache directory ' + cachedPostDir) return None if '@' not in cachedPostDir: - # print('ERROR: invalid html cache directory '+cachedPostDir) + # print('ERROR: invalid html cache directory ' + cachedPostDir) return None cachedPostId = removeIdEnding(postJsonObject['id']) cachedPostFilename = cachedPostDir + '/' + cachedPostId.replace('/', '#') @@ -1866,7 +1866,7 @@ def undoLikesCollectionEntry(recentPostsCache: {}, if not postJsonObject.get('object'): if debug: pprint(postJsonObject) - print('DEBUG: post '+objectUrl+' has no object') + print('DEBUG: post ' + objectUrl + ' has no object') return if not isinstance(postJsonObject['object'], dict): return diff --git a/webapp_headerbuttons.py b/webapp_headerbuttons.py index 61c239c1c..825dcc302 100644 --- a/webapp_headerbuttons.py +++ b/webapp_headerbuttons.py @@ -116,7 +116,7 @@ def headerButtonsTimeline(defaultTimeline: str, tlStr += \ '' if not featuresHeader: diff --git a/webapp_profile.py b/webapp_profile.py index 5a08d2659..d73a0601f 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -534,7 +534,7 @@ def htmlProfile(rssIconAtTop: bool, if xmppAddress: donateSection += \ '

' + translate['XMPP'] + ': '+xmppAddress + '

\n' + xmppAddress + '">' + xmppAddress + '

\n' if matrixAddress: donateSection += \ '

' + translate['Matrix'] + ': ' + matrixAddress + '

\n' @@ -1675,7 +1675,7 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, translate['Matrix'] + '
\n' editProfileForm += \ ' \n' + matrixAddress + '">\n' editProfileForm += '
\n' editProfileForm += \ From 939e053e5b7fd36929b42cecda12a895ba32ba55 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 22 Jun 2021 16:45:59 +0100 Subject: [PATCH 1236/1416] Function to check that activitypub posts have an object dictionary --- acceptreject.py | 3 +- announce.py | 5 +- blocking.py | 125 ++++++++++++------------- bookmarks.py | 21 +---- daemon.py | 44 ++++----- desktop_client.py | 36 +++----- follow.py | 5 +- git.py | 5 +- happening.py | 5 +- inbox.py | 227 +++++++++++++++++++--------------------------- like.py | 9 +- newswire.py | 9 +- outbox.py | 33 +++---- posts.py | 41 +++------ question.py | 9 +- schedule.py | 8 +- shares.py | 9 +- speaker.py | 5 +- utils.py | 53 ++++------- webapp_profile.py | 3 +- 20 files changed, 274 insertions(+), 381 deletions(-) diff --git a/acceptreject.py b/acceptreject.py index 5bbba45ec..fe88202ed 100644 --- a/acceptreject.py +++ b/acceptreject.py @@ -15,6 +15,7 @@ from utils import getDomainFromActor from utils import getNicknameFromActor from utils import domainPermitted from utils import followPerson +from utils import hasObjectDict def _createAcceptReject(baseDir: str, federationList: [], @@ -73,7 +74,7 @@ def _acceptFollow(baseDir: str, domain: str, messageJson: {}, federationList: [], debug: bool) -> None: """Receiving a follow Accept activity """ - if not messageJson.get('object'): + if not hasObjectDict(messageJson): return if not messageJson['object'].get('type'): return diff --git a/announce.py b/announce.py index 0f41fb0f1..0d61efb8a 100644 --- a/announce.py +++ b/announce.py @@ -7,6 +7,7 @@ __email__ = "bob@freedombone.net" __status__ = "Production" __module_group__ = "ActivityPub" +from utils import hasObjectDict from utils import removeIdEnding from utils import hasUsersPath from utils import getFullDomain @@ -356,9 +357,7 @@ def outboxUndoAnnounce(recentPostsCache: {}, return if not messageJson['type'] == 'Undo': return - if not messageJson.get('object'): - return - if not isinstance(messageJson['object'], dict): + if not hasObjectDict(messageJson): if debug: print('DEBUG: undo like object is not dict') return diff --git a/blocking.py b/blocking.py index 1ef3bed20..af139a8c3 100644 --- a/blocking.py +++ b/blocking.py @@ -11,6 +11,7 @@ import os import json import time from datetime import datetime +from utils import hasObjectDict from utils import isAccountDir from utils import getCachedPostFilename from utils import loadJson @@ -372,11 +373,7 @@ def outboxUndoBlock(baseDir: str, httpPrefix: str, if debug: print('DEBUG: not an undo block') return - if not messageJson.get('object'): - if debug: - print('DEBUG: no object in undo block') - return - if not isinstance(messageJson['object'], dict): + if not hasObjectDict(messageJson): if debug: print('DEBUG: undo block object is not string') return @@ -444,41 +441,40 @@ def mutePost(baseDir: str, nickname: str, domain: str, port: int, if not postJsonObject: return - if postJsonObject.get('object'): - if isinstance(postJsonObject['object'], dict): - domainFull = getFullDomain(domain, port) - actor = httpPrefix + '://' + domainFull + '/users/' + nickname - # does this post have ignores on it from differenent actors? - if not postJsonObject['object'].get('ignores'): - if debug: - print('DEBUG: Adding initial mute to ' + postId) - ignoresJson = { - "@context": "https://www.w3.org/ns/activitystreams", - 'id': postId, - 'type': 'Collection', - "totalItems": 1, - 'items': [{ - 'type': 'Ignore', - 'actor': actor - }] - } - postJsonObject['object']['ignores'] = ignoresJson - else: - if not postJsonObject['object']['ignores'].get('items'): - postJsonObject['object']['ignores']['items'] = [] - itemsList = postJsonObject['object']['ignores']['items'] - for ignoresItem in itemsList: - if ignoresItem.get('actor'): - if ignoresItem['actor'] == actor: - return - newIgnore = { + if hasObjectDict(postJsonObject): + domainFull = getFullDomain(domain, port) + actor = httpPrefix + '://' + domainFull + '/users/' + nickname + # does this post have ignores on it from differenent actors? + if not postJsonObject['object'].get('ignores'): + if debug: + print('DEBUG: Adding initial mute to ' + postId) + ignoresJson = { + "@context": "https://www.w3.org/ns/activitystreams", + 'id': postId, + 'type': 'Collection', + "totalItems": 1, + 'items': [{ 'type': 'Ignore', 'actor': actor - } - igIt = len(itemsList) - itemsList.append(newIgnore) - postJsonObject['object']['ignores']['totalItems'] = igIt - saveJson(postJsonObject, postFilename) + }] + } + postJsonObject['object']['ignores'] = ignoresJson + else: + if not postJsonObject['object']['ignores'].get('items'): + postJsonObject['object']['ignores']['items'] = [] + itemsList = postJsonObject['object']['ignores']['items'] + for ignoresItem in itemsList: + if ignoresItem.get('actor'): + if ignoresItem['actor'] == actor: + return + newIgnore = { + 'type': 'Ignore', + 'actor': actor + } + igIt = len(itemsList) + itemsList.append(newIgnore) + postJsonObject['object']['ignores']['totalItems'] = igIt + saveJson(postJsonObject, postFilename) # remove cached post so that the muted version gets recreated # without its content text and/or image @@ -525,31 +521,30 @@ def unmutePost(baseDir: str, nickname: str, domain: str, port: int, os.remove(muteFilename) print('UNMUTE: ' + muteFilename + ' file removed') - if postJsonObject.get('object'): - if isinstance(postJsonObject['object'], dict): - if postJsonObject['object'].get('ignores'): - domainFull = getFullDomain(domain, port) - actor = httpPrefix + '://' + domainFull + '/users/' + nickname - totalItems = 0 - if postJsonObject['object']['ignores'].get('totalItems'): - totalItems = \ - postJsonObject['object']['ignores']['totalItems'] - itemsList = postJsonObject['object']['ignores']['items'] - for ignoresItem in itemsList: - if ignoresItem.get('actor'): - if ignoresItem['actor'] == actor: - if debug: - print('DEBUG: mute was removed for ' + actor) - itemsList.remove(ignoresItem) - break - if totalItems == 1: - if debug: - print('DEBUG: mute was removed from post') - del postJsonObject['object']['ignores'] - else: - igItLen = len(postJsonObject['object']['ignores']['items']) - postJsonObject['object']['ignores']['totalItems'] = igItLen - saveJson(postJsonObject, postFilename) + if hasObjectDict(postJsonObject): + if postJsonObject['object'].get('ignores'): + domainFull = getFullDomain(domain, port) + actor = httpPrefix + '://' + domainFull + '/users/' + nickname + totalItems = 0 + if postJsonObject['object']['ignores'].get('totalItems'): + totalItems = \ + postJsonObject['object']['ignores']['totalItems'] + itemsList = postJsonObject['object']['ignores']['items'] + for ignoresItem in itemsList: + if ignoresItem.get('actor'): + if ignoresItem['actor'] == actor: + if debug: + print('DEBUG: mute was removed for ' + actor) + itemsList.remove(ignoresItem) + break + if totalItems == 1: + if debug: + print('DEBUG: mute was removed from post') + del postJsonObject['object']['ignores'] + else: + igItLen = len(postJsonObject['object']['ignores']['items']) + postJsonObject['object']['ignores']['totalItems'] = igItLen + saveJson(postJsonObject, postFilename) # remove cached post so that the muted version gets recreated # with its content text and/or image @@ -646,9 +641,7 @@ def outboxUndoMute(baseDir: str, httpPrefix: str, return if not messageJson['type'] == 'Undo': return - if not messageJson.get('object'): - return - if not isinstance(messageJson['object'], dict): + if not hasObjectDict(messageJson): return if not messageJson['object'].get('type'): return diff --git a/bookmarks.py b/bookmarks.py index a2b595d91..2e4de3c19 100644 --- a/bookmarks.py +++ b/bookmarks.py @@ -22,6 +22,7 @@ from utils import locatePost from utils import getCachedPostFilename from utils import loadJson from utils import saveJson +from utils import hasObjectDict from posts import getPersonBox from session import postJson @@ -68,13 +69,11 @@ def undoBookmarksCollectionEntry(recentPostsCache: {}, return if postJsonObject['type'] != 'Create': return - if not postJsonObject.get('object'): + if not hasObjectDict(postJsonObject): if debug: print('DEBUG: bookmarked post has no object ' + str(postJsonObject)) return - if not isinstance(postJsonObject['object'], dict): - return if not postJsonObject['object'].get('bookmarks'): return if not isinstance(postJsonObject['object']['bookmarks'], dict): @@ -123,9 +122,7 @@ def bookmarkedByPerson(postJsonObject: {}, nickname: str, domain: str) -> bool: def _noOfBookmarks(postJsonObject: {}) -> int: """Returns the number of bookmarks ona given post """ - if not postJsonObject.get('object'): - return 0 - if not isinstance(postJsonObject['object'], dict): + if not hasObjectDict(postJsonObject): return 0 if not postJsonObject['object'].get('bookmarks'): return 0 @@ -527,7 +524,7 @@ def outboxBookmark(recentPostsCache: {}, if debug: print('DEBUG: no actor in bookmark Add') return - if not messageJson.get('object'): + if not hasObjectDict(messageJson): if debug: print('DEBUG: no object in bookmark Add') return @@ -535,10 +532,6 @@ def outboxBookmark(recentPostsCache: {}, if debug: print('DEBUG: no target in bookmark Add') return - if not isinstance(messageJson['object'], dict): - if debug: - print('DEBUG: bookmark Add object is not dict') - return if not messageJson['object'].get('type'): if debug: print('DEBUG: no object type in bookmark Add') @@ -596,7 +589,7 @@ def outboxUndoBookmark(recentPostsCache: {}, if debug: print('DEBUG: no actor in unbookmark Remove') return - if not messageJson.get('object'): + if not hasObjectDict(messageJson): if debug: print('DEBUG: no object in unbookmark Remove') return @@ -604,10 +597,6 @@ def outboxUndoBookmark(recentPostsCache: {}, if debug: print('DEBUG: no target in unbookmark Remove') return - if not isinstance(messageJson['object'], dict): - if debug: - print('DEBUG: unbookmark Remove object is not dict') - return if not messageJson['object'].get('type'): if debug: print('DEBUG: no object type in bookmark Remove') diff --git a/daemon.py b/daemon.py index 63393695f..b0a71aa35 100644 --- a/daemon.py +++ b/daemon.py @@ -208,6 +208,7 @@ from shares import addShare from shares import removeShare from shares import expireShares from categories import setHashtagCategory +from utils import hasObjectDict from utils import userAgentDomain from utils import isLocalNetworkAddress from utils import permittedDir @@ -1173,28 +1174,27 @@ class PubServer(BaseHTTPRequestHandler): self.server.POSTbusy = False return 3 - if messageJson.get('object'): - if isinstance(messageJson['object'], dict): - stringFields = ( - 'id', 'actor', 'type', 'content', 'published', - 'summary', 'url', 'attributedTo' - ) - for checkField in stringFields: - if not messageJson['object'].get(checkField): - continue - if not isinstance(messageJson['object'][checkField], str): - self._400() - self.server.POSTbusy = False - return 3 - # check that some fields are lists - listFields = ('to', 'cc', 'attachment') - for checkField in listFields: - if not messageJson['object'].get(checkField): - continue - if not isinstance(messageJson['object'][checkField], list): - self._400() - self.server.POSTbusy = False - return 3 + if hasObjectDict(messageJson): + stringFields = ( + 'id', 'actor', 'type', 'content', 'published', + 'summary', 'url', 'attributedTo' + ) + for checkField in stringFields: + if not messageJson['object'].get(checkField): + continue + if not isinstance(messageJson['object'][checkField], str): + self._400() + self.server.POSTbusy = False + return 3 + # check that some fields are lists + listFields = ('to', 'cc', 'attachment') + for checkField in listFields: + if not messageJson['object'].get(checkField): + continue + if not isinstance(messageJson['object'][checkField], list): + self._400() + self.server.POSTbusy = False + return 3 # actor should look like a url if '://' not in messageJson['actor'] or \ diff --git a/desktop_client.py b/desktop_client.py index d27e3d6b3..6382c4d1b 100644 --- a/desktop_client.py +++ b/desktop_client.py @@ -16,6 +16,7 @@ import webbrowser import urllib.parse from pathlib import Path from random import randint +from utils import hasObjectDict from utils import getFullDomain from utils import isDM from utils import loadTranslationsFromFile @@ -207,14 +208,13 @@ def _postIsToYou(actor: str, postJsonObject: {}) -> bool: if not toYourActor and postJsonObject.get('cc'): if actor in postJsonObject['cc']: toYourActor = True - if not toYourActor and postJsonObject.get('object'): - if isinstance(postJsonObject['object'], dict): - if postJsonObject['object'].get('to'): - if actor in postJsonObject['object']['to']: - toYourActor = True - if not toYourActor and postJsonObject['object'].get('cc'): - if actor in postJsonObject['object']['cc']: - toYourActor = True + if not toYourActor and hasObjectDict(postJsonObject): + if postJsonObject['object'].get('to'): + if actor in postJsonObject['object']['to']: + toYourActor = True + if not toYourActor and postJsonObject['object'].get('cc'): + if actor in postJsonObject['object']['cc']: + toYourActor = True return toYourActor @@ -606,9 +606,7 @@ def _getImageDescription(postJsonObject: {}) -> str: def _showLikesOnPost(postJsonObject: {}, maxLikes: int) -> None: """Shows the likes on a post """ - if not postJsonObject.get('object'): - return - if not isinstance(postJsonObject['object'], dict): + if not hasObjectDict(postJsonObject): return if not postJsonObject['object'].get('likes'): return @@ -630,9 +628,7 @@ def _showLikesOnPost(postJsonObject: {}, maxLikes: int) -> None: def _showRepliesOnPost(postJsonObject: {}, maxReplies: int) -> None: """Shows the replies on a post """ - if not postJsonObject.get('object'): - return - if not isinstance(postJsonObject['object'], dict): + if not hasObjectDict(postJsonObject): return if not postJsonObject['object'].get('replies'): return @@ -693,7 +689,7 @@ def _readLocalBoxPost(session, nickname: str, domain: str, allowLocalNetworkAccess, recentPostsCache, False) if postJsonObject2: - if postJsonObject2.get('object'): + if hasObjectDict(postJsonObject2): if postJsonObject2['object'].get('attributedTo') and \ postJsonObject2['object'].get('content'): actor = postJsonObject2['object']['attributedTo'] @@ -879,7 +875,7 @@ def _desktopGetBoxPostObject(boxJson: {}, index: int) -> {}: if ctr == index: return postJsonObject continue - if not isinstance(postJsonObject['object'], dict): + if not hasObjectDict(postJsonObject): continue if not postJsonObject['object'].get('published'): continue @@ -991,9 +987,7 @@ def _desktopShowBox(indent: str, ctr += 1 continue - if not postJsonObject.get('object'): - continue - if not isinstance(postJsonObject['object'], dict): + if not hasObjectDict(postJsonObject): continue if not postJsonObject['object'].get('published'): continue @@ -1888,7 +1882,7 @@ def runDesktopClient(baseDir: str, proxyType: str, httpPrefix: str, if postJsonObject: if postJsonObject.get('id') and \ postJsonObject.get('object'): - if isinstance(postJsonObject['object'], dict): + if hasObjectDict(postJsonObject): if postJsonObject['object'].get('attributedTo'): blockActor = \ postJsonObject['object']['attributedTo'] @@ -1932,7 +1926,7 @@ def runDesktopClient(baseDir: str, proxyType: str, httpPrefix: str, if postJsonObject and not blockActor: if postJsonObject.get('id') and \ postJsonObject.get('object'): - if isinstance(postJsonObject['object'], dict): + if hasObjectDict(postJsonObject): if postJsonObject['object'].get('attributedTo'): blockActor = \ postJsonObject['object']['attributedTo'] diff --git a/follow.py b/follow.py index b635c25c3..a26b2372c 100644 --- a/follow.py +++ b/follow.py @@ -9,6 +9,7 @@ __module_group__ = "ActivityPub" from pprint import pprint import os +from utils import hasObjectDict from utils import hasUsersPath from utils import getFullDomain from utils import isSystemAccount @@ -1391,9 +1392,7 @@ def outboxUndoFollow(baseDir: str, messageJson: {}, debug: bool) -> None: return if not messageJson['type'] == 'Undo': return - if not messageJson.get('object'): - return - if not isinstance(messageJson['object'], dict): + if not hasObjectDict(messageJson): return if not messageJson['object'].get('type'): return diff --git a/git.py b/git.py index 71fdc1442..00f2c9a23 100644 --- a/git.py +++ b/git.py @@ -9,6 +9,7 @@ __module_group__ = "ActivityPub" import os import html +from utils import hasObjectDict def _gitFormatContent(content: str) -> str: @@ -113,9 +114,7 @@ def convertPostToPatch(baseDir: str, nickname: str, domain: str, """Detects whether the given post contains a patch and if so then converts it to a Patch ActivityPub type """ - if not postJsonObject.get('object'): - return False - if not isinstance(postJsonObject['object'], dict): + if not hasObjectDict(postJsonObject): return False if not postJsonObject['object'].get('type'): return False diff --git a/happening.py b/happening.py index 028da1416..28c9d6552 100644 --- a/happening.py +++ b/happening.py @@ -16,6 +16,7 @@ from utils import isPublicPost from utils import loadJson from utils import saveJson from utils import locatePost +from utils import hasObjectDict def _validUuid(testUuid: str, version=4): @@ -155,9 +156,7 @@ def _isHappeningPost(postJsonObject: {}) -> bool: """ if not postJsonObject: return False - if not postJsonObject.get('object'): - return False - if not isinstance(postJsonObject['object'], dict): + if not hasObjectDict(postJsonObject): return False if not postJsonObject['object'].get('tag'): return False diff --git a/inbox.py b/inbox.py index a87a15f53..0b1035b12 100644 --- a/inbox.py +++ b/inbox.py @@ -13,6 +13,7 @@ import datetime import time import random from linked_data_sig import verifyJsonSignature +from utils import hasObjectDict from utils import dmAllowedFromDomain from utils import isRecentPost from utils import getConfigParam @@ -91,9 +92,7 @@ def storeHashTags(baseDir: str, nickname: str, postJsonObject: {}) -> None: """ if not isPublicPost(postJsonObject): return - if not postJsonObject.get('object'): - return - if not isinstance(postJsonObject['object'], dict): + if not hasObjectDict(postJsonObject): return if not postJsonObject['object'].get('tag'): return @@ -331,10 +330,8 @@ def inboxPermittedMessage(domain: str, messageJson: {}, alwaysAllowedTypes = ('Follow', 'Join', 'Like', 'Delete', 'Announce') if messageJson['type'] not in alwaysAllowedTypes: - if not messageJson.get('object'): + if not hasObjectDict(messageJson): return True - if not isinstance(messageJson['object'], dict): - return False if messageJson['object'].get('inReplyTo'): inReplyTo = messageJson['object']['inReplyTo'] if not isinstance(inReplyTo, str): @@ -390,40 +387,39 @@ def savePostToInboxQueue(baseDir: str, httpPrefix: str, return None postDomain = getFullDomain(postDomain, postPort) - if postJsonObject.get('object'): - if isinstance(postJsonObject['object'], dict): - if postJsonObject['object'].get('inReplyTo'): - if isinstance(postJsonObject['object']['inReplyTo'], str): - inReplyTo = \ - postJsonObject['object']['inReplyTo'] - replyDomain, replyPort = \ - getDomainFromActor(inReplyTo) - if isBlockedDomain(baseDir, replyDomain, blockedCache): - if debug: - print('WARN: post contains reply from ' + - str(actor) + - ' to a blocked domain: ' + replyDomain) - return None - else: - replyNickname = \ - getNicknameFromActor(inReplyTo) - if replyNickname and replyDomain: - if isBlocked(baseDir, nickname, domain, - replyNickname, replyDomain, - blockedCache): - if debug: - print('WARN: post contains reply from ' + - str(actor) + - ' to a blocked account: ' + - replyNickname + '@' + replyDomain) - return None - if postJsonObject['object'].get('content'): - if isinstance(postJsonObject['object']['content'], str): - if isFiltered(baseDir, nickname, domain, - postJsonObject['object']['content']): - if debug: - print('WARN: post was filtered out due to content') - return None + if hasObjectDict(postJsonObject): + if postJsonObject['object'].get('inReplyTo'): + if isinstance(postJsonObject['object']['inReplyTo'], str): + inReplyTo = \ + postJsonObject['object']['inReplyTo'] + replyDomain, replyPort = \ + getDomainFromActor(inReplyTo) + if isBlockedDomain(baseDir, replyDomain, blockedCache): + if debug: + print('WARN: post contains reply from ' + + str(actor) + + ' to a blocked domain: ' + replyDomain) + return None + else: + replyNickname = \ + getNicknameFromActor(inReplyTo) + if replyNickname and replyDomain: + if isBlocked(baseDir, nickname, domain, + replyNickname, replyDomain, + blockedCache): + if debug: + print('WARN: post contains reply from ' + + str(actor) + + ' to a blocked account: ' + + replyNickname + '@' + replyDomain) + return None + if postJsonObject['object'].get('content'): + if isinstance(postJsonObject['object']['content'], str): + if isFiltered(baseDir, nickname, domain, + postJsonObject['object']['content']): + if debug: + print('WARN: post was filtered out due to content') + return None originalPostId = None if postJsonObject.get('id'): if not isinstance(postJsonObject['id'], str): @@ -550,51 +546,50 @@ def _inboxPostRecipients(baseDir: str, postJsonObject: {}, # first get any specific people which the post is addressed to followerRecipients = False - if postJsonObject.get('object'): - if isinstance(postJsonObject['object'], dict): - if postJsonObject['object'].get('to'): - if isinstance(postJsonObject['object']['to'], list): - recipientsList = postJsonObject['object']['to'] - else: - recipientsList = [postJsonObject['object']['to']] - if debug: - print('DEBUG: resolving "to"') - includesFollowers, recipientsDict = \ - _inboxPostRecipientsAdd(baseDir, httpPrefix, - recipientsList, - recipientsDict, - domainMatch, domainBase, - actor, debug) - if includesFollowers: - followerRecipients = True + if hasObjectDict(postJsonObject): + if postJsonObject['object'].get('to'): + if isinstance(postJsonObject['object']['to'], list): + recipientsList = postJsonObject['object']['to'] else: - if debug: - print('DEBUG: inbox post has no "to"') - - if postJsonObject['object'].get('cc'): - if isinstance(postJsonObject['object']['cc'], list): - recipientsList = postJsonObject['object']['cc'] - else: - recipientsList = [postJsonObject['object']['cc']] - includesFollowers, recipientsDict = \ - _inboxPostRecipientsAdd(baseDir, httpPrefix, - recipientsList, - recipientsDict, - domainMatch, domainBase, - actor, debug) - if includesFollowers: - followerRecipients = True - else: - if debug: - print('DEBUG: inbox post has no cc') + recipientsList = [postJsonObject['object']['to']] + if debug: + print('DEBUG: resolving "to"') + includesFollowers, recipientsDict = \ + _inboxPostRecipientsAdd(baseDir, httpPrefix, + recipientsList, + recipientsDict, + domainMatch, domainBase, + actor, debug) + if includesFollowers: + followerRecipients = True else: if debug: - if isinstance(postJsonObject['object'], str): - if '/statuses/' in postJsonObject['object']: - print('DEBUG: inbox item is a link to a post') - else: - if '/users/' in postJsonObject['object']: - print('DEBUG: inbox item is a link to an actor') + print('DEBUG: inbox post has no "to"') + + if postJsonObject['object'].get('cc'): + if isinstance(postJsonObject['object']['cc'], list): + recipientsList = postJsonObject['object']['cc'] + else: + recipientsList = [postJsonObject['object']['cc']] + includesFollowers, recipientsDict = \ + _inboxPostRecipientsAdd(baseDir, httpPrefix, + recipientsList, + recipientsDict, + domainMatch, domainBase, + actor, debug) + if includesFollowers: + followerRecipients = True + else: + if debug: + print('DEBUG: inbox post has no cc') + else: + if debug and postJsonObject.get('object'): + if isinstance(postJsonObject['object'], str): + if '/statuses/' in postJsonObject['object']: + print('DEBUG: inbox item is a link to a post') + else: + if '/users/' in postJsonObject['object']: + print('DEBUG: inbox item is a link to an actor') if postJsonObject.get('to'): if isinstance(postJsonObject['to'], list): @@ -709,14 +704,10 @@ def _receiveUndo(session, baseDir: str, httpPrefix: str, if debug: print('DEBUG: "users" or "profile" missing from actor') return False - if not messageJson.get('object'): + if not hasObjectDict(messageJson): if debug: print('DEBUG: ' + messageJson['type'] + ' has no object') return False - if not isinstance(messageJson['object'], dict): - if debug: - print('DEBUG: ' + messageJson['type'] + ' object is not a dict') - return False if not messageJson['object'].get('type'): if debug: print('DEBUG: ' + messageJson['type'] + ' has no object type') @@ -884,14 +875,10 @@ def _receiveUpdate(recentPostsCache: {}, session, baseDir: str, if debug: print('DEBUG: ' + messageJson['type'] + ' has no actor') return False - if not messageJson.get('object'): + if not hasObjectDict(messageJson): if debug: print('DEBUG: ' + messageJson['type'] + ' has no object') return False - if not isinstance(messageJson['object'], dict): - if debug: - print('DEBUG: ' + messageJson['type'] + ' object is not a dict') - return False if not messageJson['object'].get('type'): if debug: print('DEBUG: ' + messageJson['type'] + ' object has no type') @@ -1031,9 +1018,7 @@ def _receiveUndoLike(recentPostsCache: {}, return False if not messageJson.get('actor'): return False - if not messageJson.get('object'): - return False - if not isinstance(messageJson['object'], dict): + if not hasObjectDict(messageJson): return False if not messageJson['object'].get('type'): return False @@ -1095,7 +1080,7 @@ def _receiveBookmark(recentPostsCache: {}, if debug: print('DEBUG: no actor in inbox bookmark Add') return False - if not messageJson.get('object'): + if not hasObjectDict(messageJson): if debug: print('DEBUG: no object in inbox bookmark Add') return False @@ -1103,10 +1088,6 @@ def _receiveBookmark(recentPostsCache: {}, if debug: print('DEBUG: no target in inbox bookmark Add') return False - if not isinstance(messageJson['object'], dict): - if debug: - print('DEBUG: inbox bookmark Add object is not string') - return False if not messageJson['object'].get('type'): if debug: print('DEBUG: no object type in inbox bookmark Add') @@ -1174,7 +1155,7 @@ def _receiveUndoBookmark(recentPostsCache: {}, if debug: print('DEBUG: no actor in inbox undo bookmark Remove') return False - if not messageJson.get('object'): + if not hasObjectDict(messageJson): if debug: print('DEBUG: no object in inbox undo bookmark Remove') return False @@ -1182,10 +1163,6 @@ def _receiveUndoBookmark(recentPostsCache: {}, if debug: print('DEBUG: no target in inbox undo bookmark Remove') return False - if not isinstance(messageJson['object'], dict): - if debug: - print('DEBUG: inbox Remove bookmark object is not dict') - return False if not messageJson['object'].get('type'): if debug: print('DEBUG: no object type in inbox bookmark Remove') @@ -1439,12 +1416,11 @@ def _receiveAnnounce(recentPostsCache: {}, if isinstance(postJsonObject['attributedTo'], str): lookupActor = postJsonObject['attributedTo'] else: - if postJsonObject.get('object'): - if isinstance(postJsonObject['object'], dict): - if postJsonObject['object'].get('attributedTo'): - attrib = postJsonObject['object']['attributedTo'] - if isinstance(attrib, str): - lookupActor = attrib + if hasObjectDict(postJsonObject): + if postJsonObject['object'].get('attributedTo'): + attrib = postJsonObject['object']['attributedTo'] + if isinstance(attrib, str): + lookupActor = attrib if lookupActor: if hasUsersPath(lookupActor): if '/statuses/' in lookupActor: @@ -1497,9 +1473,7 @@ def _receiveUndoAnnounce(recentPostsCache: {}, return False if not messageJson.get('actor'): return False - if not messageJson.get('object'): - return False - if not isinstance(messageJson['object'], dict): + if not hasObjectDict(messageJson): return False if not messageJson['object'].get('object'): return False @@ -1548,9 +1522,9 @@ def jsonPostAllowsComments(postJsonObject: {}) -> bool: if 'commentsEnabled' in postJsonObject: return postJsonObject['commentsEnabled'] if postJsonObject.get('object'): - if not isinstance(postJsonObject['object'], dict): + if not hasObjectDict(postJsonObject): return False - if 'commentsEnabled' in postJsonObject['object']: + elif 'commentsEnabled' in postJsonObject['object']: return postJsonObject['object']['commentsEnabled'] return True @@ -1571,9 +1545,7 @@ def populateReplies(baseDir: str, httpPrefix: str, domain: str, """ if not messageJson.get('id'): return False - if not messageJson.get('object'): - return False - if not isinstance(messageJson['object'], dict): + if not hasObjectDict(messageJson): return False if not messageJson['object'].get('inReplyTo'): return False @@ -1666,9 +1638,7 @@ def _validPostContent(baseDir: str, nickname: str, domain: str, Check for hellthreads Check number of tags is reasonable """ - if not messageJson.get('object'): - return True - if not isinstance(messageJson['object'], dict): + if not hasObjectDict(messageJson): return True if not messageJson['object'].get('content'): return True @@ -1756,10 +1726,7 @@ def _obtainAvatarForReplyPost(session, baseDir: str, httpPrefix: str, """Tries to obtain the actor for the person being replied to so that their avatar can later be shown """ - if not postJsonObject.get('object'): - return - - if not isinstance(postJsonObject['object'], dict): + if not hasObjectDict(postJsonObject): return if not postJsonObject['object'].get('inReplyTo'): @@ -1821,9 +1788,7 @@ def _alreadyLiked(baseDir: str, nickname: str, domain: str, postJsonObject = loadJson(postFilename, 1) if not postJsonObject: return False - if not postJsonObject.get('object'): - return False - if not isinstance(postJsonObject['object'], dict): + if not hasObjectDict(postJsonObject): return False if not postJsonObject['object'].get('likes'): return False @@ -2039,9 +2004,7 @@ def _inboxUpdateCalendar(baseDir: str, handle: str, """ if not postJsonObject.get('actor'): return - if not postJsonObject.get('object'): - return - if not isinstance(postJsonObject['object'], dict): + if not hasObjectDict(postJsonObject): return if not postJsonObject['object'].get('tag'): return diff --git a/like.py b/like.py index 7e5d51374..4c95ad7dd 100644 --- a/like.py +++ b/like.py @@ -7,6 +7,7 @@ __email__ = "bob@freedombone.net" __status__ = "Production" __module_group__ = "ActivityPub" +from utils import hasObjectDict from utils import hasUsersPath from utils import getFullDomain from utils import removeIdEnding @@ -38,9 +39,7 @@ def likedByPerson(postJsonObject: {}, nickname: str, domain: str) -> bool: def noOfLikes(postJsonObject: {}) -> int: """Returns the number of likes ona given post """ - if not postJsonObject.get('object'): - return 0 - if not isinstance(postJsonObject['object'], dict): + if not hasObjectDict(postJsonObject): return 0 if not postJsonObject['object'].get('likes'): return 0 @@ -354,9 +353,7 @@ def outboxUndoLike(recentPostsCache: {}, return if not messageJson['type'] == 'Undo': return - if not messageJson.get('object'): - return - if not isinstance(messageJson['object'], dict): + if not hasObjectDict(messageJson): if debug: print('DEBUG: undo like object is not dict') return diff --git a/newswire.py b/newswire.py index 51c773994..12daecf28 100644 --- a/newswire.py +++ b/newswire.py @@ -18,6 +18,7 @@ from datetime import timezone from collections import OrderedDict from utils import validPostDate from categories import setHashtagCategory +from utils import hasObjectDict from utils import firstParagraphFromString from utils import isPublicPost from utils import locatePost @@ -839,9 +840,7 @@ def _isNewswireBlogPost(postJsonObject: {}) -> bool: """ if not postJsonObject: return False - if not postJsonObject.get('object'): - return False - if not isinstance(postJsonObject['object'], dict): + if not hasObjectDict(postJsonObject): return False if postJsonObject['object'].get('summary') and \ postJsonObject['object'].get('url') and \ @@ -854,9 +853,7 @@ def _isNewswireBlogPost(postJsonObject: {}) -> bool: def _getHashtagsFromPost(postJsonObject: {}) -> []: """Returns a list of any hashtags within a post """ - if not postJsonObject.get('object'): - return [] - if not isinstance(postJsonObject['object'], dict): + if not hasObjectDict(postJsonObject): return [] if not postJsonObject['object'].get('tag'): return [] diff --git a/outbox.py b/outbox.py index 84d3a873c..dae0e8be8 100644 --- a/outbox.py +++ b/outbox.py @@ -16,6 +16,7 @@ from posts import outboxMessageCreateWrap from posts import savePostToBox from posts import sendToFollowersThread from posts import sendToNamedAddresses +from utils import hasObjectDict from utils import getLocalNetworkAddresses from utils import getFullDomain from utils import removeIdEnding @@ -62,9 +63,7 @@ def _outboxPersonReceiveUpdate(recentPostsCache: {}, print("messageJson['type'] " + messageJson['type']) if messageJson['type'] != 'Update': return - if not messageJson.get('object'): - return - if not isinstance(messageJson['object'], dict): + if not hasObjectDict(messageJson): if debug: print('DEBUG: c2s actor update object is not dict') return @@ -199,14 +198,13 @@ def postMessageToOutbox(session, translate: {}, # check that the outgoing post doesn't contain any markup # which can be used to implement exploits - if messageJson.get('object'): - if isinstance(messageJson['object'], dict): - if messageJson['object'].get('content'): - if dangerousMarkup(messageJson['object']['content'], - allowLocalNetworkAccess): - print('POST to outbox contains dangerous markup: ' + - str(messageJson)) - return False + if hasObjectDict(messageJson): + if messageJson['object'].get('content'): + if dangerousMarkup(messageJson['object']['content'], + allowLocalNetworkAccess): + print('POST to outbox contains dangerous markup: ' + + str(messageJson)) + return False if messageJson['type'] == 'Create': if not (messageJson.get('id') and @@ -335,13 +333,12 @@ def postMessageToOutbox(session, translate: {}, # if this is a blog post or an event then save to its own box if messageJson['type'] == 'Create': - if messageJson.get('object'): - if isinstance(messageJson['object'], dict): - if messageJson['object'].get('type'): - if messageJson['object']['type'] == 'Article': - outboxName = 'tlblogs' - elif messageJson['object']['type'] == 'Event': - outboxName = 'tlevents' + if hasObjectDict(messageJson): + if messageJson['object'].get('type'): + if messageJson['object']['type'] == 'Article': + outboxName = 'tlblogs' + elif messageJson['object']['type'] == 'Event': + outboxName = 'tlevents' savedFilename = \ savePostToBox(baseDir, diff --git a/posts.py b/posts.py index 0788f4a60..1cf12f793 100644 --- a/posts.py +++ b/posts.py @@ -32,6 +32,7 @@ from session import postImage from webfinger import webfingerHandle from httpsig import createSignedHeader from siteactive import siteIsActive +from utils import hasObjectDict from utils import rejectPostId from utils import removeInvalidChars from utils import fileLastModified @@ -361,11 +362,7 @@ def _getPosts(session, outboxUrl: str, maxPosts: int, if debug: print('Not Create type') continue - if not item.get('object'): - if debug: - print('No object') - continue - if not isinstance(item['object'], dict): + if not hasObjectDict(item): if debug: print('item object is not a dict') continue @@ -561,9 +558,7 @@ def getPostDomains(session, outboxUrl: str, maxPosts: int, i += 1 if i > maxPosts: break - if not item.get('object'): - continue - if not isinstance(item['object'], dict): + if not hasObjectDict(item): continue if item['object'].get('content'): _updateWordFrequency(item['object']['content'], @@ -618,9 +613,7 @@ def _getPostsForBlockedDomains(baseDir: str, i += 1 if i > maxPosts: break - if not item.get('object'): - continue - if not isinstance(item['object'], dict): + if not hasObjectDict(item): continue if item['object'].get('inReplyTo'): if isinstance(item['object']['inReplyTo'], str): @@ -699,10 +692,9 @@ def savePostToBox(baseDir: str, httpPrefix: str, postId: str, httpPrefix + '://' + originalDomain + '/users/' + nickname + \ '/statuses/' + statusNumber postJsonObject['id'] = postId + '/activity' - if postJsonObject.get('object'): - if isinstance(postJsonObject['object'], dict): - postJsonObject['object']['id'] = postId - postJsonObject['object']['atomUri'] = postId + if hasObjectDict(postJsonObject): + postJsonObject['object']['id'] = postId + postJsonObject['object']['atomUri'] = postId boxDir = createPersonDir(nickname, domain, baseDir, boxname) filename = boxDir + '/' + postId.replace('/', '#') + '.json' @@ -2391,7 +2383,7 @@ def addToField(activityType: str, postJsonObject: {}, toAddress = toAddress.split('/statuses/')[0] postJsonObject['to'] = [toAddress] toFieldAdded = True - elif isinstance(postJsonObject['object'], dict): + elif hasObjectDict(postJsonObject): # add a to field to bookmark add or remove if postJsonObject.get('type') and \ postJsonObject.get('actor') and \ @@ -2590,9 +2582,7 @@ def _sendingProfileUpdate(postJsonObject: {}) -> bool: """ if postJsonObject['type'] != 'Update': return False - if not postJsonObject.get('object'): - return False - if not isinstance(postJsonObject['object'], dict): + if not hasObjectDict(postJsonObject): return False if not postJsonObject['object'].get('type'): return False @@ -2970,9 +2960,7 @@ def isImageMedia(session, baseDir: str, httpPrefix: str, postJsonObject = postJsonAnnounce if postJsonObject['type'] != 'Create': return False - if not postJsonObject.get('object'): - return False - if not isinstance(postJsonObject['object'], dict): + if not hasObjectDict(postJsonObject): return False if postJsonObject['object'].get('moderationStatus'): return False @@ -3057,9 +3045,8 @@ def removePostInteractions(postJsonObject: {}, force: bool) -> bool: Returns False if this is a private post """ hasObject = False - if postJsonObject.get('object'): - if isinstance(postJsonObject['object'], dict): - hasObject = True + if hasObjectDict(postJsonObject): + hasObject = True if hasObject: postObj = postJsonObject['object'] if not force: @@ -3921,9 +3908,7 @@ def downloadAnnounce(session, baseDir: str, httpPrefix: str, recentPostsCache: {}, debug: bool) -> {}: """Download the post referenced by an announce """ - if not postJsonObject.get('object'): - return None - if not isinstance(postJsonObject['object'], str): + if not hasObjectDict(postJsonObject): return None # ignore self-boosts if postJsonObject['actor'] in postJsonObject['object']: diff --git a/question.py b/question.py index bdf09aa9e..9008cbd56 100644 --- a/question.py +++ b/question.py @@ -11,6 +11,7 @@ import os from utils import locatePost from utils import loadJson from utils import saveJson +from utils import hasObjectDict def questionUpdateVotes(baseDir: str, nickname: str, domain: str, @@ -18,9 +19,7 @@ def questionUpdateVotes(baseDir: str, nickname: str, domain: str, """ For a given reply update the votes on a question Returns the question json object if the vote totals were changed """ - if not replyJson.get('object'): - return None - if not isinstance(replyJson['object'], dict): + if not hasObjectDict(replyJson): return None if not replyJson['object'].get('inReplyTo'): return None @@ -37,9 +36,7 @@ def questionUpdateVotes(baseDir: str, nickname: str, domain: str, questionJson = loadJson(questionPostFilename) if not questionJson: return None - if not questionJson.get('object'): - return None - if not isinstance(questionJson['object'], dict): + if not hasObjectDict(questionJson): return None if not questionJson['object'].get('type'): return None diff --git a/schedule.py b/schedule.py index 5a8275bb5..4aaaa026d 100644 --- a/schedule.py +++ b/schedule.py @@ -10,6 +10,7 @@ __module_group__ = "Calendar" import os import time import datetime +from utils import hasObjectDict from utils import getStatusNumber from utils import loadJson from outbox import postMessageToOutbox @@ -77,10 +78,9 @@ def _updatePostSchedule(baseDir: str, handle: str, httpd, statusNumber, published = getStatusNumber() if postJsonObject.get('published'): postJsonObject['published'] = published - if postJsonObject.get('object'): - if isinstance(postJsonObject['object'], dict): - if postJsonObject['object'].get('published'): - postJsonObject['published'] = published + if hasObjectDict(postJsonObject): + if postJsonObject['object'].get('published'): + postJsonObject['published'] = published print('Sending scheduled post ' + postId) diff --git a/shares.py b/shares.py index 59e960b1f..c906a4a23 100644 --- a/shares.py +++ b/shares.py @@ -19,6 +19,7 @@ from utils import validNickname from utils import loadJson from utils import saveJson from utils import getImageExtensions +from utils import hasObjectDict from media import processMetaData @@ -524,9 +525,7 @@ def outboxShareUpload(baseDir: str, httpPrefix: str, return if not messageJson['type'] == 'Add': return - if not messageJson.get('object'): - return - if not isinstance(messageJson['object'], dict): + if not hasObjectDict(messageJson): return if not messageJson['object'].get('type'): if debug: @@ -583,9 +582,7 @@ def outboxUndoShareUpload(baseDir: str, httpPrefix: str, return if not messageJson['type'] == 'Remove': return - if not messageJson.get('object'): - return - if not isinstance(messageJson['object'], dict): + if not hasObjectDict(messageJson): return if not messageJson['object'].get('type'): if debug: diff --git a/speaker.py b/speaker.py index a04ef3709..dc77f0207 100644 --- a/speaker.py +++ b/speaker.py @@ -21,6 +21,7 @@ from utils import removeHtml from utils import loadJson from utils import saveJson from utils import isPGPEncrypted +from utils import hasObjectDict from content import htmlReplaceQuoteMarks speakerRemoveChars = ('.\n', '. ', ',', ';', '?', '!') @@ -407,9 +408,7 @@ def _postToSpeakerJson(baseDir: str, httpPrefix: str, NOTE: There currently appears to be no standardized json format for speech synthesis """ - if not postJsonObject.get('object'): - return - if not isinstance(postJsonObject['object'], dict): + if not hasObjectDict(postJsonObject): return if not postJsonObject['object'].get('content'): return diff --git a/utils.py b/utils.py index 47a1b392f..94234eecc 100644 --- a/utils.py +++ b/utils.py @@ -1231,9 +1231,7 @@ def _isReplyToBlogPost(baseDir: str, nickname: str, domain: str, postJsonObject: str): """Is the given post a reply to a blog post? """ - if not postJsonObject.get('object'): - return False - if not isinstance(postJsonObject['object'], dict): + if not hasObjectDict(postJsonObject): return False if not postJsonObject['object'].get('inReplyTo'): return False @@ -1525,9 +1523,7 @@ def isPublicPost(postJsonObject: {}) -> bool: return False if postJsonObject['type'] != 'Create': return False - if not postJsonObject.get('object'): - return False - if not isinstance(postJsonObject['object'], dict): + if not hasObjectDict(postJsonObject): return False if not postJsonObject['object'].get('to'): return False @@ -1675,9 +1671,7 @@ def isEventPost(messageJson: {}) -> bool: return False if not messageJson.get('actor'): return False - if not messageJson.get('object'): - return False - if not isinstance(messageJson['object'], dict): + if not hasObjectDict(messageJson): return False if not messageJson['object'].get('type'): return False @@ -1708,9 +1702,7 @@ def isBlogPost(postJsonObject: {}) -> bool: """ if postJsonObject['type'] != 'Create': return False - if not postJsonObject.get('object'): - return False - if not isinstance(postJsonObject['object'], dict): + if not hasObjectDict(postJsonObject): return False if not postJsonObject['object'].get('type'): return False @@ -1863,13 +1855,11 @@ def undoLikesCollectionEntry(recentPostsCache: {}, return if postJsonObject['type'] != 'Create': return - if not postJsonObject.get('object'): + if not hasObjectDict(postJsonObject): if debug: pprint(postJsonObject) print('DEBUG: post ' + objectUrl + ' has no object') return - if not isinstance(postJsonObject['object'], dict): - return if not postJsonObject['object'].get('likes'): return if not isinstance(postJsonObject['object']['likes'], dict): @@ -1918,13 +1908,11 @@ def updateLikesCollection(recentPostsCache: {}, if os.path.isfile(cachedPostFilename): os.remove(cachedPostFilename) - if not postJsonObject.get('object'): + if not hasObjectDict(postJsonObject): if debug: pprint(postJsonObject) print('DEBUG: post ' + objectUrl + ' has no object') return - if not isinstance(postJsonObject['object'], dict): - return if not objectUrl.endswith('/likes'): objectUrl = objectUrl + '/likes' if not postJsonObject['object'].get('likes'): @@ -1987,13 +1975,11 @@ def undoAnnounceCollectionEntry(recentPostsCache: {}, return if postJsonObject['type'] != 'Create': return - if not postJsonObject.get('object'): + if not hasObjectDict(postJsonObject): if debug: pprint(postJsonObject) print('DEBUG: post has no object') return - if not isinstance(postJsonObject['object'], dict): - return if not postJsonObject['object'].get('shares'): return if not postJsonObject['object']['shares'].get('items'): @@ -2045,13 +2031,11 @@ def updateAnnounceCollection(recentPostsCache: {}, os.remove(cachedPostFilename) removePostFromCache(postJsonObject, recentPostsCache) - if not postJsonObject.get('object'): + if not hasObjectDict(postJsonObject): if debug: pprint(postJsonObject) print('DEBUG: post ' + postFilename + ' has no object') return - if not isinstance(postJsonObject['object'], dict): - return postUrl = removeIdEnding(postJsonObject['id']) + '/shares' if not postJsonObject['object'].get('shares'): if debug: @@ -2129,9 +2113,7 @@ def mediaFileMimeType(filename: str) -> str: def isRecentPost(postJsonObject: {}, maxDays=3) -> bool: """ Is the given post recent? """ - if not postJsonObject.get('object'): - return False - if not isinstance(postJsonObject['object'], dict): + if not hasObjectDict(postJsonObject): return False if not postJsonObject['object'].get('published'): return False @@ -2206,9 +2188,7 @@ def isDM(postJsonObject: {}) -> bool: """ if postJsonObject['type'] != 'Create': return False - if not postJsonObject.get('object'): - return False - if not isinstance(postJsonObject['object'], dict): + if not hasObjectDict(postJsonObject): return False if postJsonObject['object']['type'] != 'Note' and \ postJsonObject['object']['type'] != 'Patch' and \ @@ -2234,9 +2214,7 @@ def isReply(postJsonObject: {}, actor: str) -> bool: """ if postJsonObject['type'] != 'Create': return False - if not postJsonObject.get('object'): - return False - if not isinstance(postJsonObject['object'], dict): + if not hasObjectDict(postJsonObject): return False if postJsonObject['object'].get('moderationStatus'): return False @@ -2456,3 +2434,12 @@ def userAgentDomain(userAgent: str, debug: bool) -> str: if debug: print('User-Agent Domain: ' + agentDomain) return agentDomain + + +def hasObjectDict(postJsonObject: {}) -> bool: + """Returns true if the given post has an object dict + """ + if postJsonObject.get('object'): + if isinstance(postJsonObject['object'], dict): + return True + return False diff --git a/webapp_profile.py b/webapp_profile.py index d73a0601f..fcaff60c8 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -9,6 +9,7 @@ __module_group__ = "Web Interface" import os from pprint import pprint +from utils import hasObjectDict from utils import getOccupationName from utils import getLockedAccount from utils import getFullDomain @@ -230,7 +231,7 @@ def htmlProfileAfterSearch(cssCache: {}, continue if item['type'] != 'Create': continue - if not item.get('object'): + if not hasObjectDict(item): continue profileStr += \ From ffd0e15fa267b2ea7c1ffb08d7f8625b8bfda606 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 22 Jun 2021 17:11:18 +0100 Subject: [PATCH 1237/1416] Ignore broken pipe on write --- daemon.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/daemon.py b/daemon.py index b0a71aa35..e177ca23a 100644 --- a/daemon.py +++ b/daemon.py @@ -820,6 +820,8 @@ class PubServer(BaseHTTPRequestHandler): try: self.wfile.write(msg) return True + except BrokenPipeError as e: + break except Exception as e: print('ERROR: _write error ' + str(tries) + ' ' + str(e)) time.sleep(0.5) From 9510ac8bf851ff39a743c26b9ff43a3f90e6c58b Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 22 Jun 2021 20:43:03 +0100 Subject: [PATCH 1238/1416] Equality check --- announce.py | 36 ++++++++++++++++++------------------ outbox.py | 2 +- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/announce.py b/announce.py index 0d61efb8a..1660827e6 100644 --- a/announce.py +++ b/announce.py @@ -27,6 +27,24 @@ from webfinger import webfingerHandle from auth import createBasicAuthHeader +def isSelfAnnounce(postJsonObject: {}) -> bool: + """Is the given post a self announce? + """ + if not postJsonObject.get('actor'): + return False + if not postJsonObject.get('type'): + return False + if postJsonObject['type'] != 'Announce': + return False + if not postJsonObject.get('object'): + return False + if not isinstance(postJsonObject['actor'], str): + return False + if not isinstance(postJsonObject['object'], str): + return False + return postJsonObject['actor'] in postJsonObject['object'] + + def outboxAnnounce(recentPostsCache: {}, baseDir: str, messageJson: {}, debug: bool) -> bool: """ Adds or removes announce entries from the shares collection @@ -393,21 +411,3 @@ def outboxUndoAnnounce(recentPostsCache: {}, messageJson['actor'], domain, debug) if debug: print('DEBUG: post undo announce via c2s - ' + postFilename) - - -def isSelfAnnounce(postJsonObject: {}) -> bool: - """Is the given post a self announce? - """ - if not postJsonObject.get('actor'): - return False - if not postJsonObject.get('type'): - return False - if postJsonObject['type'] != 'Announce': - return False - if not postJsonObject.get('object'): - return False - if not isinstance(postJsonObject['actor'], str): - return False - if not isinstance(postJsonObject['object'], str): - return False - return postJsonObject['actor'] in postJsonObject['object'] diff --git a/outbox.py b/outbox.py index dae0e8be8..bf2e21cea 100644 --- a/outbox.py +++ b/outbox.py @@ -402,7 +402,7 @@ def postMessageToOutbox(session, translate: {}, continue # avoid duplicates of the message if already going # back to the inbox of the same account - if selfActor not in messageJson['to']: + if messageJson['to'] != selfActor: # show sent post within the inbox, # as is the typical convention inboxUpdateIndex(boxNameIndex, baseDir, From 214511db01242dc7ebb9bdc74acdff204124d9cf Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 22 Jun 2021 21:30:27 +0100 Subject: [PATCH 1239/1416] Over-zealous function use --- outbox.py | 1 + posts.py | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/outbox.py b/outbox.py index bf2e21cea..415b61cb6 100644 --- a/outbox.py +++ b/outbox.py @@ -400,6 +400,7 @@ def postMessageToOutbox(session, translate: {}, if boxNameIndex == 'inbox' and outboxName == 'tlblogs': continue + # avoid duplicates of the message if already going # back to the inbox of the same account if messageJson['to'] != selfActor: diff --git a/posts.py b/posts.py index 1cf12f793..38d57a7db 100644 --- a/posts.py +++ b/posts.py @@ -3908,7 +3908,9 @@ def downloadAnnounce(session, baseDir: str, httpPrefix: str, recentPostsCache: {}, debug: bool) -> {}: """Download the post referenced by an announce """ - if not hasObjectDict(postJsonObject): + if not postJsonObject.get('object'): + return None + if not isinstance(postJsonObject['object'], str): return None # ignore self-boosts if postJsonObject['actor'] in postJsonObject['object']: From fff61b9812860e698a2995a67083ff5323be7180 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 22 Jun 2021 21:42:39 +0100 Subject: [PATCH 1240/1416] to is a list --- outbox.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/outbox.py b/outbox.py index 415b61cb6..9a23041b5 100644 --- a/outbox.py +++ b/outbox.py @@ -403,7 +403,7 @@ def postMessageToOutbox(session, translate: {}, # avoid duplicates of the message if already going # back to the inbox of the same account - if messageJson['to'] != selfActor: + if selfActor not in messageJson['to']: # show sent post within the inbox, # as is the typical convention inboxUpdateIndex(boxNameIndex, baseDir, From 7c0b0fb1953bd638cb7e72d0fe82b399f9c17087 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 22 Jun 2021 21:51:16 +0100 Subject: [PATCH 1241/1416] Debug message for broken pipe --- daemon.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/daemon.py b/daemon.py index e177ca23a..b530f9901 100644 --- a/daemon.py +++ b/daemon.py @@ -821,6 +821,8 @@ class PubServer(BaseHTTPRequestHandler): self.wfile.write(msg) return True except BrokenPipeError as e: + if self.server.debug: + print('ERROR: _write error ' + str(tries) + ' ' + str(e)) break except Exception as e: print('ERROR: _write error ' + str(tries) + ' ' + str(e)) From e0aac3c6a39fcf9abdf157f1c86398af88505aef Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 23 Jun 2021 22:31:50 +0100 Subject: [PATCH 1242/1416] Separate function for extracting domain name --- announce.py | 7 +++---- blocking.py | 19 +++++++------------ bookmarks.py | 7 +++---- content.py | 4 ++-- delete.py | 4 ++-- domainhandler.py | 17 +++++++++++++++++ epicyon.py | 3 ++- follow.py | 16 ++++++---------- followingCalendar.py | 4 ++-- inbox.py | 29 +++++++++++------------------ like.py | 7 +++---- manualapprove.py | 5 +++-- person.py | 10 ++++------ posts.py | 8 ++++---- roles.py | 4 ++-- shares.py | 9 +++------ utils.py | 18 +++++++++--------- webapp_calendar.py | 5 ++--- webapp_column_left.py | 9 +++------ webapp_column_right.py | 5 ++--- webfinger.py | 10 +++------- 21 files changed, 93 insertions(+), 107 deletions(-) create mode 100644 domainhandler.py diff --git a/announce.py b/announce.py index 1660827e6..f39732979 100644 --- a/announce.py +++ b/announce.py @@ -7,6 +7,7 @@ __email__ = "bob@freedombone.net" __status__ = "Production" __module_group__ = "ActivityPub" +from domainhandler import removeDomainPort from utils import hasObjectDict from utils import removeIdEnding from utils import hasUsersPath @@ -128,8 +129,7 @@ def createAnnounce(session, baseDir: str, federationList: [], if not urlPermitted(objectUrl, federationList): return None - if ':' in domain: - domain = domain.split(':')[0] + domain = removeDomainPort(domain) fullDomain = getFullDomain(domain, port) statusNumber, published = getStatusNumber() @@ -399,8 +399,7 @@ def outboxUndoAnnounce(recentPostsCache: {}, print('DEBUG: c2s undo announce request arrived in outbox') messageId = removeIdEnding(messageJson['object']['object']) - if ':' in domain: - domain = domain.split(':')[0] + domain = removeDomainPort(domain) postFilename = locatePost(baseDir, nickname, domain, messageId) if not postFilename: if debug: diff --git a/blocking.py b/blocking.py index af139a8c3..e7020608e 100644 --- a/blocking.py +++ b/blocking.py @@ -11,6 +11,7 @@ import os import json import time from datetime import datetime +from domainhandler import removeDomainPort from utils import hasObjectDict from utils import isAccountDir from utils import getCachedPostFilename @@ -58,8 +59,7 @@ def addBlock(baseDir: str, nickname: str, domain: str, blockNickname: str, blockDomain: str) -> bool: """Block the given account """ - if ':' in domain: - domain = domain.split(':')[0] + domain = removeDomainPort(domain) blockingFilename = baseDir + '/accounts/' + \ nickname + '@' + domain + '/blocking.txt' blockHandle = blockNickname + '@' + blockDomain @@ -111,8 +111,7 @@ def removeBlock(baseDir: str, nickname: str, domain: str, unblockNickname: str, unblockDomain: str) -> bool: """Unblock the given account """ - if ':' in domain: - domain = domain.split(':')[0] + domain = removeDomainPort(domain) unblockingFilename = baseDir + '/accounts/' + \ nickname + '@' + domain + '/blocking.txt' unblockHandle = unblockNickname + '@' + unblockDomain @@ -338,8 +337,7 @@ def outboxBlock(baseDir: str, httpPrefix: str, if debug: print('DEBUG: c2s block object has no nickname') return - if ':' in domain: - domain = domain.split(':')[0] + domain = removeDomainPort(domain) postFilename = locatePost(baseDir, nickname, domain, messageId) if not postFilename: if debug: @@ -406,8 +404,7 @@ def outboxUndoBlock(baseDir: str, httpPrefix: str, if debug: print('DEBUG: c2s undo block object has no nickname') return - if ':' in domain: - domain = domain.split(':')[0] + domain = removeDomainPort(domain) postFilename = locatePost(baseDir, nickname, domain, messageId) if not postFilename: if debug: @@ -605,8 +602,7 @@ def outboxMute(baseDir: str, httpPrefix: str, if debug: print('DEBUG: c2s mute object has no nickname') return - if ':' in domain: - domain = domain.split(':')[0] + domain = removeDomainPort(domain) postFilename = locatePost(baseDir, nickname, domain, messageId) if not postFilename: if debug: @@ -663,8 +659,7 @@ def outboxUndoMute(baseDir: str, httpPrefix: str, if debug: print('DEBUG: c2s undo mute object has no nickname') return - if ':' in domain: - domain = domain.split(':')[0] + domain = removeDomainPort(domain) postFilename = locatePost(baseDir, nickname, domain, messageId) if not postFilename: if debug: diff --git a/bookmarks.py b/bookmarks.py index 2e4de3c19..414f748bd 100644 --- a/bookmarks.py +++ b/bookmarks.py @@ -11,6 +11,7 @@ import os from pprint import pprint from webfinger import webfingerHandle from auth import createBasicAuthHeader +from domainhandler import removeDomainPort from utils import hasUsersPath from utils import getFullDomain from utils import removeIdEnding @@ -560,8 +561,7 @@ def outboxBookmark(recentPostsCache: {}, print('DEBUG: c2s bookmark Add request arrived in outbox') messageUrl = removeIdEnding(messageJson['object']['url']) - if ':' in domain: - domain = domain.split(':')[0] + domain = removeDomainPort(domain) postFilename = locatePost(baseDir, nickname, domain, messageUrl) if not postFilename: if debug: @@ -625,8 +625,7 @@ def outboxUndoBookmark(recentPostsCache: {}, print('DEBUG: c2s unbookmark Remove request arrived in outbox') messageUrl = removeIdEnding(messageJson['object']['url']) - if ':' in domain: - domain = domain.split(':')[0] + domain = removeDomainPort(domain) postFilename = locatePost(baseDir, nickname, domain, messageUrl) if not postFilename: if debug: diff --git a/content.py b/content.py index 79d8b4dd0..5760841a2 100644 --- a/content.py +++ b/content.py @@ -10,6 +10,7 @@ import os import email.parser import urllib.parse from shutil import copyfile +from domainhandler import removeDomainPort from utils import isValidLanguage from utils import getImageExtensions from utils import loadJson @@ -772,8 +773,7 @@ def addHtmlTags(baseDir: str, httpPrefix: str, replaceEmoji = {} emojiDict = {} originalDomain = domain - if ':' in domain: - domain = domain.split(':')[0] + domain = removeDomainPort(domain) followingFilename = baseDir + '/accounts/' + \ nickname + '@' + domain + '/following.txt' diff --git a/delete.py b/delete.py index 05ceb051d..b51d5c7a0 100644 --- a/delete.py +++ b/delete.py @@ -9,6 +9,7 @@ __module_group__ = "ActivityPub" import os from datetime import datetime +from domainhandler import removeDomainPort from utils import hasUsersPath from utils import getFullDomain from utils import removeIdEnding @@ -154,8 +155,7 @@ def outboxDelete(baseDir: str, httpPrefix: str, "wasn't created by you (nickname does not match)") return deleteDomain, deletePort = getDomainFromActor(messageId) - if ':' in domain: - domain = domain.split(':')[0] + domain = removeDomainPort(domain) if deleteDomain != domain: if debug: print("DEBUG: you can't delete a post which " + diff --git a/domainhandler.py b/domainhandler.py new file mode 100644 index 000000000..316330ba1 --- /dev/null +++ b/domainhandler.py @@ -0,0 +1,17 @@ +__filename__ = "domainhandler.py" +__author__ = "Bob Mottram" +__license__ = "AGPL3+" +__version__ = "1.2.0" +__maintainer__ = "Bob Mottram" +__email__ = "bob@freedombone.net" +__status__ = "Production" +__module_group__ = "Core" + + +def removeDomainPort(domain: str) -> str: + """If the domain has a port appended then remove it + eg. mydomain.com:80 becomes mydomain.com + """ + if ':' in domain: + domain = domain.split(':')[0] + return domain diff --git a/epicyon.py b/epicyon.py index 34baebdff..ddea2e485 100644 --- a/epicyon.py +++ b/epicyon.py @@ -61,6 +61,7 @@ from tests import testUpdateActor from tests import runAllTests from auth import storeBasicCredentials from auth import createPassword +from domainhandler import removeDomainPort from utils import hasUsersPath from utils import getFullDomain from utils import setConfigParam @@ -1081,7 +1082,7 @@ if args.message: toPort = 443 if ':' in toDomain: toPort = toDomain.split(':')[1] - toDomain = toDomain.split(':')[0] + toDomain = removeDomainPort(toDomain) else: if args.sendto.endswith('followers'): toNickname = None diff --git a/follow.py b/follow.py index a26b2372c..2745c8ec5 100644 --- a/follow.py +++ b/follow.py @@ -9,6 +9,7 @@ __module_group__ = "ActivityPub" from pprint import pprint import os +from domainhandler import removeDomainPort from utils import hasObjectDict from utils import hasUsersPath from utils import getFullDomain @@ -153,8 +154,7 @@ def isFollowingActor(baseDir: str, """Is the given nickname following the given actor? The actor can also be a handle: nickname@domain """ - if ':' in domain: - domain = domain.split(':')[0] + domain = removeDomainPort(domain) handle = nickname + '@' + domain if not os.path.isdir(baseDir + '/accounts/' + handle): return False @@ -205,8 +205,7 @@ def isFollowerOfPerson(baseDir: str, nickname: str, domain: str, followerNickname: str, followerDomain: str) -> bool: """is the given nickname a follower of followerNickname? """ - if ':' in domain: - domain = domain.split(':')[0] + domain = removeDomainPort(domain) followersFile = baseDir + '/accounts/' + \ nickname + '@' + domain + '/followers.txt' if not os.path.isfile(followersFile): @@ -243,8 +242,7 @@ def unfollowAccount(baseDir: str, nickname: str, domain: str, debug: bool = False) -> bool: """Removes a person to the follow list """ - if ':' in domain: - domain = domain.split(':')[0] + domain = removeDomainPort(domain) handle = nickname + '@' + domain handleToUnfollow = followNickname + '@' + followDomain if not os.path.isdir(baseDir + '/accounts'): @@ -433,8 +431,7 @@ def getFollowingFeed(baseDir: str, domain: str, port: int, path: str, } handleDomain = domain - if ':' in handleDomain: - handleDomain = domain.split(':')[0] + handleDomain = removeDomainPort(handleDomain) handle = nickname + '@' + handleDomain filename = baseDir + '/accounts/' + handle + '/' + followFile + '.txt' if not os.path.isfile(filename): @@ -493,8 +490,7 @@ def _followApprovalRequired(baseDir: str, nicknameToFollow: str, return False manuallyApproveFollows = False - if ':' in domainToFollow: - domainToFollow = domainToFollow.split(':')[0] + domainToFollow = removeDomainPort(domainToFollow) actorFilename = baseDir + '/accounts/' + \ nicknameToFollow + '@' + domainToFollow + '.json' if os.path.isfile(actorFilename): diff --git a/followingCalendar.py b/followingCalendar.py index 650687e14..68bef2973 100644 --- a/followingCalendar.py +++ b/followingCalendar.py @@ -8,6 +8,7 @@ __status__ = "Production" __module_group__ = "Calendar" import os +from domainhandler import removeDomainPort def receivingCalendarEvents(baseDir: str, nickname: str, domain: str, @@ -43,8 +44,7 @@ def _receiveCalendarEvents(baseDir: str, nickname: str, domain: str, indicating whether to receive calendar events from that account """ # check that a following file exists - if ':' in domain: - domain = domain.split(':')[0] + domain = removeDomainPort(domain) followingFilename = baseDir + '/accounts/' + \ nickname + '@' + domain + '/following.txt' if not os.path.isfile(followingFilename): diff --git a/inbox.py b/inbox.py index 0b1035b12..160271d00 100644 --- a/inbox.py +++ b/inbox.py @@ -13,6 +13,7 @@ import datetime import time import random from linked_data_sig import verifyJsonSignature +from domainhandler import removeDomainPort from utils import hasObjectDict from utils import dmAllowedFromDomain from utils import isRecentPost @@ -186,8 +187,7 @@ def _inboxStorePostToHtmlCache(recentPostsCache: {}, maxRecentPosts: int, def validInbox(baseDir: str, nickname: str, domain: str) -> bool: """Checks whether files were correctly saved to the inbox """ - if ':' in domain: - domain = domain.split(':')[0] + domain = removeDomainPort(domain) inboxDir = baseDir + '/accounts/' + nickname + '@' + domain + '/inbox' if not os.path.isdir(inboxDir): return True @@ -209,8 +209,7 @@ def validInboxFilenames(baseDir: str, nickname: str, domain: str, """Used by unit tests to check that the port number gets appended to domain names within saved post filenames """ - if ':' in domain: - domain = domain.split(':')[0] + domain = removeDomainPort(domain) inboxDir = baseDir + '/accounts/' + nickname + '@' + domain + '/inbox' if not os.path.isdir(inboxDir): return True @@ -358,8 +357,7 @@ def savePostToInboxQueue(baseDir: str, httpPrefix: str, str(len(messageBytes)) + ' bytes') return None originalDomain = domain - if ':' in domain: - domain = domain.split(':')[0] + domain = removeDomainPort(domain) # block at the ealiest stage possible, which means the data # isn't written to file @@ -536,8 +534,7 @@ def _inboxPostRecipients(baseDir: str, postJsonObject: {}, print('WARNING: inbox post has no actor') return recipientsDict, recipientsDictFollowers - if ':' in domain: - domain = domain.split(':')[0] + domain = removeDomainPort(domain) domainBase = domain domain = getFullDomain(domain, port) domainMatch = '/' + domain + '/users/' @@ -1124,8 +1121,7 @@ def _receiveBookmark(recentPostsCache: {}, print('DEBUG: c2s inbox bookmark Add request arrived in outbox') messageUrl = removeIdEnding(messageJson['object']['url']) - if ':' in domain: - domain = domain.split(':')[0] + domain = removeDomainPort(domain) postFilename = locatePost(baseDir, nickname, domain, messageUrl) if not postFilename: if debug: @@ -1200,8 +1196,7 @@ def _receiveUndoBookmark(recentPostsCache: {}, 'request arrived in outbox') messageUrl = removeIdEnding(messageJson['object']['url']) - if ':' in domain: - domain = domain.split(':')[0] + domain = removeDomainPort(domain) postFilename = locatePost(baseDir, nickname, domain, messageUrl) if not postFilename: if debug: @@ -1975,8 +1970,7 @@ def _sendToGroupMembers(session, baseDir: str, handle: str, port: int, # set subject if not postJsonObject['object'].get('summary'): postJsonObject['object']['summary'] = 'General Discussion' - if ':' in domain: - domain = domain.split(':')[0] + domain = removeDomainPort(domain) with open(followersFile, 'r') as groupMembers: for memberHandle in groupMembers: if memberHandle != handle: @@ -1987,7 +1981,7 @@ def _sendToGroupMembers(session, baseDir: str, handle: str, port: int, memberPortStr = memberDomain.split(':')[1] if memberPortStr.isdigit(): memberPort = int(memberPortStr) - memberDomain = memberDomain.split(':')[0] + memberDomain = removeDomainPort(memberDomain) sendSignedJson(postJsonObject, session, baseDir, nickname, domain, port, memberNickname, memberDomain, memberPort, cc, @@ -2078,8 +2072,7 @@ def _updateLastSeen(baseDir: str, handle: str, actor: str) -> None: return nickname = handle.split('@')[0] domain = handle.split('@')[1] - if ':' in domain: - domain = domain.split(':')[0] + domain = removeDomainPort(domain) accountPath = baseDir + '/accounts/' + nickname + '@' + domain if not os.path.isdir(accountPath): return @@ -2133,7 +2126,7 @@ def _bounceDM(senderPostId: str, session, httpPrefix: str, senderPortStr = senderDomain.split(':')[1] if senderPortStr.isdigit(): senderPort = int(senderPortStr) - senderDomain = senderDomain.split(':')[0] + senderDomain = removeDomainPort(senderDomain) cc = [] # create the bounce DM diff --git a/like.py b/like.py index 4c95ad7dd..ee42afead 100644 --- a/like.py +++ b/like.py @@ -7,6 +7,7 @@ __email__ = "bob@freedombone.net" __status__ = "Production" __module_group__ = "ActivityPub" +from domainhandler import removeDomainPort from utils import hasObjectDict from utils import hasUsersPath from utils import getFullDomain @@ -327,8 +328,7 @@ def outboxLike(recentPostsCache: {}, print('DEBUG: c2s like request arrived in outbox') messageId = removeIdEnding(messageJson['object']) - if ':' in domain: - domain = domain.split(':')[0] + domain = removeDomainPort(domain) postFilename = locatePost(baseDir, nickname, domain, messageId) if not postFilename: if debug: @@ -377,8 +377,7 @@ def outboxUndoLike(recentPostsCache: {}, print('DEBUG: c2s undo like request arrived in outbox') messageId = removeIdEnding(messageJson['object']['object']) - if ':' in domain: - domain = domain.split(':')[0] + domain = removeDomainPort(domain) postFilename = locatePost(baseDir, nickname, domain, messageId) if not postFilename: if debug: diff --git a/manualapprove.py b/manualapprove.py index dccc65320..58de975b5 100644 --- a/manualapprove.py +++ b/manualapprove.py @@ -12,6 +12,7 @@ from follow import followedAccountAccepts from follow import followedAccountRejects from follow import removeFromFollowRequests from utils import loadJson +from domainhandler import removeDomainPort def manualDenyFollowRequest(session, baseDir: str, @@ -50,7 +51,7 @@ def manualDenyFollowRequest(session, baseDir: str, denyPort = port if ':' in denyDomain: denyPort = denyDomain.split(':')[1] - denyDomain = denyDomain.split(':')[0] + denyDomain = removeDomainPort(denyDomain) followedAccountRejects(session, baseDir, httpPrefix, nickname, domain, port, denyNickname, denyDomain, denyPort, @@ -159,7 +160,7 @@ def manualApproveFollowRequest(session, baseDir: str, approvePort = port2 if ':' in approveDomain: approvePort = approveDomain.split(':')[1] - approveDomain = approveDomain.split(':')[0] + approveDomain = removeDomainPort(approveDomain) print('Manual follow accept: Sending Accept for ' + handle + ' follow request from ' + approveNickname + '@' + approveDomain) diff --git a/person.py b/person.py index 44468e4de..97263f526 100644 --- a/person.py +++ b/person.py @@ -38,6 +38,7 @@ from roles import setRole from roles import setRolesFromList from roles import getActorRolesList from media import processMetaData +from domainhandler import removeDomainPort from utils import getStatusNumber from utils import getFullDomain from utils import validNickname @@ -93,8 +94,7 @@ def setProfileImage(baseDir: str, httpPrefix: str, nickname: str, domain: str, if imageFilename.startswith('~/'): imageFilename = imageFilename.replace('~/', str(Path.home()) + '/') - if ':' in domain: - domain = domain.split(':')[0] + domain = removeDomainPort(domain) fullDomain = getFullDomain(domain, port) handle = nickname + '@' + domain @@ -147,8 +147,7 @@ def setProfileImage(baseDir: str, httpPrefix: str, nickname: str, domain: str, def _accountExists(baseDir: str, nickname: str, domain: str) -> bool: """Returns true if the given account exists """ - if ':' in domain: - domain = domain.split(':')[0] + domain = removeDomainPort(domain) return os.path.isdir(baseDir + '/accounts/' + nickname + '@' + domain) or \ os.path.isdir(baseDir + '/deactivated/' + nickname + '@' + domain) @@ -720,8 +719,7 @@ def personLookup(domain: str, path: str, baseDir: str) -> {}: return None if not isSharedInbox and not validNickname(domain, nickname): return None - if ':' in domain: - domain = domain.split(':')[0] + domain = removeDomainPort(domain) handle = nickname + '@' + domain filename = baseDir + '/accounts/' + handle + '.json' if not os.path.isfile(filename): diff --git a/posts.py b/posts.py index 38d57a7db..e10fba5a9 100644 --- a/posts.py +++ b/posts.py @@ -32,6 +32,7 @@ from session import postImage from webfinger import webfingerHandle from httpsig import createSignedHeader from siteactive import siteIsActive +from domainhandler import removeDomainPort from utils import hasObjectDict from utils import rejectPostId from utils import removeInvalidChars @@ -683,8 +684,7 @@ def savePostToBox(baseDir: str, httpPrefix: str, postId: str, boxname != 'scheduled': return None originalDomain = domain - if ':' in domain: - domain = domain.split(':')[0] + domain = removeDomainPort(domain) if not postId: statusNumber, published = getStatusNumber() @@ -1689,7 +1689,7 @@ def getMentionedPeople(baseDir: str, httpPrefix: str, mentionedNickname = handle.split('@')[0] mentionedDomain = handle.split('@')[1].strip('\n').strip('\r') if ':' in mentionedDomain: - mentionedDomain = mentionedDomain.split(':')[0] + mentionedDomain = removeDomainPort(mentionedDomain) if not validNickname(mentionedDomain, mentionedNickname): continue actor = \ @@ -2666,7 +2666,7 @@ def sendToFollowers(session, baseDir: str, toDomain = followerHandles[index].split('@')[1] if ':' in toDomain: toPort = toDomain.split(':')[1] - toDomain = toDomain.split(':')[0] + toDomain = removeDomainPort(toDomain) cc = '' diff --git a/roles.py b/roles.py index a3d139971..121dcf7b8 100644 --- a/roles.py +++ b/roles.py @@ -10,6 +10,7 @@ import os from utils import loadJson from utils import saveJson from utils import getStatusNumber +from domainhandler import removeDomainPort def _clearRoleStatus(baseDir: str, role: str) -> None: @@ -75,8 +76,7 @@ def _addRole(baseDir: str, nickname: str, domain: str, """Adds a role nickname to the file. This is a file containing the nicknames of accounts having this role """ - if ':' in domain: - domain = domain.split(':')[0] + domain = removeDomainPort(domain) roleFile = baseDir + '/accounts/' + roleFilename if os.path.isfile(roleFile): # is this nickname already in the file? diff --git a/shares.py b/shares.py index c906a4a23..488a276fb 100644 --- a/shares.py +++ b/shares.py @@ -20,6 +20,7 @@ from utils import loadJson from utils import saveJson from utils import getImageExtensions from utils import hasObjectDict +from domainhandler import removeDomainPort from media import processMetaData @@ -187,9 +188,7 @@ def expireShares(baseDir: str) -> None: def _expireSharesForAccount(baseDir: str, nickname: str, domain: str) -> None: """Removes expired items from shares for a particular account """ - handleDomain = domain - if ':' in handleDomain: - handleDomain = domain.split(':')[0] + handleDomain = removeDomainPort(domain) handle = nickname + '@' + handleDomain sharesFilename = baseDir + '/accounts/' + handle + '/shares.json' if os.path.isfile(sharesFilename): @@ -250,9 +249,7 @@ def getSharesFeedForPerson(baseDir: str, domain = getFullDomain(domain, port) - handleDomain = domain - if ':' in handleDomain: - handleDomain = domain.split(':')[0] + handleDomain = removeDomainPort(domain) handle = nickname + '@' + handleDomain sharesFilename = baseDir + '/accounts/' + handle + '/shares.json' diff --git a/utils.py b/utils.py index 94234eecc..869ec539c 100644 --- a/utils.py +++ b/utils.py @@ -15,6 +15,7 @@ import json import idna import locale from pprint import pprint +from domainhandler import removeDomainPort from followingCalendar import addPersonToCalendar from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import hashes @@ -417,8 +418,7 @@ def getFollowersOfPerson(baseDir: str, Used by the shared inbox to know who to send incoming mail to """ followers = [] - if ':' in domain: - domain = domain.split(':')[0] + domain = removeDomainPort(domain) handle = nickname + '@' + domain if not os.path.isdir(baseDir + '/accounts/' + handle): return followers @@ -645,8 +645,7 @@ def createInboxQueueDir(nickname: str, domain: str, baseDir: str) -> str: def domainPermitted(domain: str, federationList: []): if len(federationList) == 0: return True - if ':' in domain: - domain = domain.split(':')[0] + domain = removeDomainPort(domain) if domain in federationList: return True return False @@ -923,7 +922,7 @@ def getDomainFromActor(actor: str) -> (str, int): if not portStr.isdigit(): return None, None port = int(portStr) - domain = domain.split(':')[0] + domain = removeDomainPort(domain) return domain, port @@ -932,8 +931,7 @@ def _setDefaultPetName(baseDir: str, nickname: str, domain: str, """Sets a default petname This helps especially when using onion or i2p address """ - if ':' in domain: - domain = domain.split(':')[0] + domain = removeDomainPort(domain) userPath = baseDir + '/accounts/' + nickname + '@' + domain petnamesFilename = userPath + '/petnames.txt' @@ -975,7 +973,8 @@ def followPerson(baseDir: str, nickname: str, domain: str, print('DEBUG: follow of domain ' + followDomain) if ':' in domain: - handle = nickname + '@' + domain.split(':')[0] + domainOnly = removeDomainPort(domain) + handle = nickname + '@' + domainOnly else: handle = nickname + '@' + domain @@ -984,7 +983,8 @@ def followPerson(baseDir: str, nickname: str, domain: str, return False if ':' in followDomain: - handleToFollow = followNickname + '@' + followDomain.split(':')[0] + followDomainOnly = removeDomainPort(followDomain) + handleToFollow = followNickname + '@' + followDomainOnly else: handleToFollow = followNickname + '@' + followDomain diff --git a/webapp_calendar.py b/webapp_calendar.py index 486f8c061..9937d5b7f 100644 --- a/webapp_calendar.py +++ b/webapp_calendar.py @@ -18,6 +18,7 @@ from utils import getDomainFromActor from utils import locatePost from utils import loadJson from utils import weekDayOfMonthStart +from domainhandler import removeDomainPort from happening import getTodaysEvents from happening import getCalendarEvents from webapp_utils import htmlHeaderWithExternalStyle @@ -247,9 +248,7 @@ def htmlCalendar(personCache: {}, cssCache: {}, translate: {}, textModeBanner: str, accessKeys: {}) -> str: """Show the calendar for a person """ - domain = domainFull - if ':' in domainFull: - domain = domainFull.split(':')[0] + domain = removeDomainPort(domainFull) monthNumber = 0 dayNumber = None diff --git a/webapp_column_left.py b/webapp_column_left.py index 5428650f0..6a63126db 100644 --- a/webapp_column_left.py +++ b/webapp_column_left.py @@ -11,6 +11,7 @@ import os from utils import getConfigParam from utils import getNicknameFromActor from utils import isEditor +from domainhandler import removeDomainPort from webapp_utils import sharesTimelineJson from webapp_utils import htmlPostSeparator from webapp_utils import getLeftImageFile @@ -76,9 +77,7 @@ def getLeftColumnContent(baseDir: str, nickname: str, domainFull: str, htmlStr = '' separatorStr = htmlPostSeparator(baseDir, 'left') - domain = domainFull - if ':' in domain: - domain = domain.split(':') + domain = removeDomainPort(domainFull) editImageClass = '' if showHeaderImage: @@ -298,9 +297,7 @@ def htmlLinksMobile(cssCache: {}, baseDir: str, else: editor = isEditor(baseDir, nickname) - domain = domainFull - if ':' in domain: - domain = domain.split(':')[0] + domain = removeDomainPort(domainFull) instanceTitle = \ getConfigParam(baseDir, 'instanceTitle') diff --git a/webapp_column_right.py b/webapp_column_right.py index 0d194c1b0..15c95c40a 100644 --- a/webapp_column_right.py +++ b/webapp_column_right.py @@ -17,6 +17,7 @@ from utils import votesOnNewswireItem from utils import getNicknameFromActor from utils import isEditor from utils import getConfigParam +from domainhandler import removeDomainPort from posts import isModerator from webapp_utils import getRightImageFile from webapp_utils import htmlHeaderWithExternalStyle @@ -58,9 +59,7 @@ def getRightColumnContent(baseDir: str, nickname: str, domainFull: str, """ htmlStr = '' - domain = domainFull - if ':' in domain: - domain = domain.split(':') + domain = removeDomainPort(domainFull) if authorized: # only show the publish button if logged in, otherwise replace it with diff --git a/webfinger.py b/webfinger.py index 6235eb429..c774a0c85 100644 --- a/webfinger.py +++ b/webfinger.py @@ -17,6 +17,7 @@ from utils import loadJson from utils import loadJsonOnionify from utils import saveJson from utils import getProtocolPrefixes +from domainhandler import removeDomainPort def _parseHandle(handle: str) -> (str, str): @@ -53,13 +54,8 @@ def webfingerHandle(session, handle: str, httpPrefix: str, nickname, domain = _parseHandle(handle) if not nickname: return None - wfDomain = domain - if ':' in wfDomain: - # wfPortStr=wfDomain.split(':')[1] - # if wfPortStr.isdigit(): - # wfPort=int(wfPortStr) - # if wfPort==80 or wfPort==443: - wfDomain = wfDomain.split(':')[0] + wfDomain = removeDomainPort(domain) + wf = getWebfingerFromCache(nickname + '@' + wfDomain, cachedWebfingers) if wf: From bb09f2a6558d2efe6511c25bac96722164097cc6 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 23 Jun 2021 22:44:31 +0100 Subject: [PATCH 1243/1416] Function to extract port number from domain --- domainhandler.py | 10 ++++++++++ epicyon.py | 3 ++- inbox.py | 11 ++++------- manualapprove.py | 9 ++++----- posts.py | 3 ++- utils.py | 6 ++---- 6 files changed, 24 insertions(+), 18 deletions(-) diff --git a/domainhandler.py b/domainhandler.py index 316330ba1..f66a4032e 100644 --- a/domainhandler.py +++ b/domainhandler.py @@ -15,3 +15,13 @@ def removeDomainPort(domain: str) -> str: if ':' in domain: domain = domain.split(':')[0] return domain + + +def getPortFromDomain(domain: str) -> int: + """If the domain has a port number appended then return it + """ + if ':' in domain: + portStr = domain.split(':')[1] + if portStr.isdigit(): + return int(portStr) + return None diff --git a/epicyon.py b/epicyon.py index ddea2e485..6e4abafdb 100644 --- a/epicyon.py +++ b/epicyon.py @@ -62,6 +62,7 @@ from tests import runAllTests from auth import storeBasicCredentials from auth import createPassword from domainhandler import removeDomainPort +from domainhandler import getPortFromDomain from utils import hasUsersPath from utils import getFullDomain from utils import setConfigParam @@ -1081,7 +1082,7 @@ if args.message: toDomain = toDomain.replace('\n', '').replace('\r', '') toPort = 443 if ':' in toDomain: - toPort = toDomain.split(':')[1] + toPort = getPortFromDomain(toDomain) toDomain = removeDomainPort(toDomain) else: if args.sendto.endswith('followers'): diff --git a/inbox.py b/inbox.py index 160271d00..81ab531c2 100644 --- a/inbox.py +++ b/inbox.py @@ -14,6 +14,7 @@ import time import random from linked_data_sig import verifyJsonSignature from domainhandler import removeDomainPort +from domainhandler import getPortFromDomain from utils import hasObjectDict from utils import dmAllowedFromDomain from utils import isRecentPost @@ -1978,9 +1979,7 @@ def _sendToGroupMembers(session, baseDir: str, handle: str, port: int, memberDomain = memberHandle.split('@')[1] memberPort = port if ':' in memberDomain: - memberPortStr = memberDomain.split(':')[1] - if memberPortStr.isdigit(): - memberPort = int(memberPortStr) + memberPort = getPortFromDomain(memberDomain) memberDomain = removeDomainPort(memberDomain) sendSignedJson(postJsonObject, session, baseDir, nickname, domain, port, @@ -2123,10 +2122,8 @@ def _bounceDM(senderPostId: str, session, httpPrefix: str, senderDomain = sendingHandle.split('@')[1] senderPort = port if ':' in senderDomain: - senderPortStr = senderDomain.split(':')[1] - if senderPortStr.isdigit(): - senderPort = int(senderPortStr) - senderDomain = removeDomainPort(senderDomain) + senderPort = getPortFromDomain(senderDomain) + senderDomain = removeDomainPort(senderDomain) cc = [] # create the bounce DM diff --git a/manualapprove.py b/manualapprove.py index 58de975b5..91c78ffac 100644 --- a/manualapprove.py +++ b/manualapprove.py @@ -13,6 +13,7 @@ from follow import followedAccountRejects from follow import removeFromFollowRequests from utils import loadJson from domainhandler import removeDomainPort +from domainhandler import getPortFromDomain def manualDenyFollowRequest(session, baseDir: str, @@ -50,7 +51,7 @@ def manualDenyFollowRequest(session, baseDir: str, denyHandle.split('@')[1].replace('\n', '').replace('\r', '') denyPort = port if ':' in denyDomain: - denyPort = denyDomain.split(':')[1] + denyPort = getPortFromDomain(denyDomain) denyDomain = removeDomainPort(denyDomain) followedAccountRejects(session, baseDir, httpPrefix, nickname, domain, port, @@ -142,9 +143,7 @@ def manualApproveFollowRequest(session, baseDir: str, handleOfFollowRequester.replace('\r', '') port2 = port if ':' in handleOfFollowRequester: - port2Str = handleOfFollowRequester.split(':')[1] - if port2Str.isdigit(): - port2 = int(port2Str) + port2 = getPortFromDomain(handleOfFollowRequester) requestsDir = accountDir + '/requests' followActivityfilename = \ requestsDir + '/' + handleOfFollowRequester + '.follow' @@ -159,7 +158,7 @@ def manualApproveFollowRequest(session, baseDir: str, approveDomain.replace('\r', '') approvePort = port2 if ':' in approveDomain: - approvePort = approveDomain.split(':')[1] + approvePort = getPortFromDomain(approveDomain) approveDomain = removeDomainPort(approveDomain) print('Manual follow accept: Sending Accept for ' + handle + ' follow request from ' + diff --git a/posts.py b/posts.py index e10fba5a9..a749a3bd3 100644 --- a/posts.py +++ b/posts.py @@ -33,6 +33,7 @@ from webfinger import webfingerHandle from httpsig import createSignedHeader from siteactive import siteIsActive from domainhandler import removeDomainPort +from domainhandler import getPortFromDomain from utils import hasObjectDict from utils import rejectPostId from utils import removeInvalidChars @@ -2665,7 +2666,7 @@ def sendToFollowers(session, baseDir: str, index = 0 toDomain = followerHandles[index].split('@')[1] if ':' in toDomain: - toPort = toDomain.split(':')[1] + toPort = getPortFromDomain(toDomain) toDomain = removeDomainPort(toDomain) cc = '' diff --git a/utils.py b/utils.py index 869ec539c..b62320365 100644 --- a/utils.py +++ b/utils.py @@ -16,6 +16,7 @@ import idna import locale from pprint import pprint from domainhandler import removeDomainPort +from domainhandler import getPortFromDomain from followingCalendar import addPersonToCalendar from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import hashes @@ -918,10 +919,7 @@ def getDomainFromActor(actor: str) -> (str, int): if '/' in actor: domain = domain.split('/')[0] if ':' in domain: - portStr = domain.split(':')[1] - if not portStr.isdigit(): - return None, None - port = int(portStr) + port = getPortFromDomain(domain) domain = removeDomainPort(domain) return domain, port From d2d31d12a6e96551ccb315d5fc54f9451cfcfc89 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 23 Jun 2021 22:46:25 +0100 Subject: [PATCH 1244/1416] Domains could potentially be decentralised identifiers --- domainhandler.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/domainhandler.py b/domainhandler.py index f66a4032e..9725c37b0 100644 --- a/domainhandler.py +++ b/domainhandler.py @@ -13,6 +13,8 @@ def removeDomainPort(domain: str) -> str: eg. mydomain.com:80 becomes mydomain.com """ if ':' in domain: + if domain.startswith('did:'): + return domain domain = domain.split(':')[0] return domain @@ -21,6 +23,8 @@ def getPortFromDomain(domain: str) -> int: """If the domain has a port number appended then return it """ if ':' in domain: + if domain.startswith('did:'): + return None portStr = domain.split(':')[1] if portStr.isdigit(): return int(portStr) From 517740bbd6d71f11e225cf04af078d4667c5a76a Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 23 Jun 2021 22:48:01 +0100 Subject: [PATCH 1245/1416] Comment --- domainhandler.py | 1 + 1 file changed, 1 insertion(+) diff --git a/domainhandler.py b/domainhandler.py index 9725c37b0..b7875b32a 100644 --- a/domainhandler.py +++ b/domainhandler.py @@ -21,6 +21,7 @@ def removeDomainPort(domain: str) -> str: def getPortFromDomain(domain: str) -> int: """If the domain has a port number appended then return it + eg. mydomain.com:80 returns 80 """ if ':' in domain: if domain.startswith('did:'): From 59840fc35ea1507a73298506cab82a4cec3acd7d Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 24 Jun 2021 20:10:23 +0100 Subject: [PATCH 1246/1416] Tidying --- utils.py | 62 +++++++++++++++++++++----------------------------------- 1 file changed, 23 insertions(+), 39 deletions(-) diff --git a/utils.py b/utils.py index b62320365..357fb01bf 100644 --- a/utils.py +++ b/utils.py @@ -755,52 +755,36 @@ def getGenderFromBio(baseDir: str, actor: str, personCache: {}, pronounStr = translate['pronoun'].lower() else: pronounStr = 'pronoun' + actorJson = None if personCache[actor].get('actor'): - # is gender defined as a profile tag? - if personCache[actor]['actor'].get('attachment'): - tagsList = personCache[actor]['actor']['attachment'] - if isinstance(tagsList, list): - for tag in tagsList: - if not isinstance(tag, dict): - continue - if not tag.get('name') or not tag.get('value'): - continue - if tag['name'].lower() == \ - translate['gender'].lower(): - bioFound = tag['value'] - break - elif tag['name'].lower().startswith(pronounStr): - bioFound = tag['value'] - break - # if not then use the bio - if not bioFound and personCache[actor]['actor'].get('summary'): - bioFound = personCache[actor]['actor']['summary'] + actorJson = personCache[actor]['actor'] else: # Try to obtain from the cached actors cachedActorFilename = \ baseDir + '/cache/actors/' + (actor.replace('/', '#')) + '.json' if os.path.isfile(cachedActorFilename): actorJson = loadJson(cachedActorFilename, 1) - if actorJson: - # is gender defined as a profile tag? - if actorJson.get('attachment'): - tagsList = actorJson['attachment'] - if isinstance(tagsList, list): - for tag in tagsList: - if not isinstance(tag, dict): - continue - if not tag.get('name') or not tag.get('value'): - continue - if tag['name'].lower() == \ - translate['gender'].lower(): - bioFound = tag['value'] - break - elif tag['name'].lower().startswith(pronounStr): - bioFound = tag['value'] - break - # if not then use the bio - if not bioFound and actorJson.get('summary'): - bioFound = actorJson['summary'] + if not actorJson: + return None + # is gender defined as a profile tag? + if actorJson.get('attachment'): + tagsList = actorJson['attachment'] + if isinstance(tagsList, list): + for tag in tagsList: + if not isinstance(tag, dict): + continue + if not tag.get('name') or not tag.get('value'): + continue + if tag['name'].lower() == \ + translate['gender'].lower(): + bioFound = tag['value'] + break + elif tag['name'].lower().startswith(pronounStr): + bioFound = tag['value'] + break + # if not then use the bio + if not bioFound and actorJson.get('summary'): + bioFound = actorJson['summary'] if not bioFound: return None gender = 'They/Them' From b0a91c2dc157cec6727b8508cfb3dbfde3eb6643 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 24 Jun 2021 20:25:39 +0100 Subject: [PATCH 1247/1416] Tidying --- utils.py | 59 ++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 40 insertions(+), 19 deletions(-) diff --git a/utils.py b/utils.py index 357fb01bf..17bea3e9a 100644 --- a/utils.py +++ b/utils.py @@ -742,14 +742,36 @@ def getDisplayName(baseDir: str, actor: str, personCache: {}) -> str: return nameFound +def _genderFromString(translate: {}, text: str) -> str: + gender = None + textOrig = text + text = text.lower() + if translate['He/Him'].lower() in text or \ + translate['boy'].lower() in text: + gender = 'He/Him' + elif (translate['She/Her'].lower() in text or + translate['girl'].lower() in text): + gender = 'She/Her' + elif 'him' in text or 'male' in text: + gender = 'He/Him' + elif 'her' in text or 'she' in text or \ + 'fem' in text or 'woman' in text: + gender = 'She/Her' + elif 'man' in text or 'He' in textOrig: + gender = 'He/Him' + return gender + + def getGenderFromBio(baseDir: str, actor: str, personCache: {}, translate: {}) -> str: """Tries to ascertain gender from bio description + This is for use by text-to-speech for pitch setting """ + defaultGender = 'They/Them' if '/statuses/' in actor: actor = actor.split('/statuses/')[0] if not personCache.get(actor): - return None + return defaultGender bioFound = None if translate: pronounStr = translate['pronoun'].lower() @@ -765,11 +787,12 @@ def getGenderFromBio(baseDir: str, actor: str, personCache: {}, if os.path.isfile(cachedActorFilename): actorJson = loadJson(cachedActorFilename, 1) if not actorJson: - return None + return defaultGender # is gender defined as a profile tag? if actorJson.get('attachment'): tagsList = actorJson['attachment'] if isinstance(tagsList, list): + # look for a gender field name for tag in tagsList: if not isinstance(tag, dict): continue @@ -782,27 +805,25 @@ def getGenderFromBio(baseDir: str, actor: str, personCache: {}, elif tag['name'].lower().startswith(pronounStr): bioFound = tag['value'] break + # the field name could be anything, + # just look at the value + if not bioFound: + for tag in tagsList: + if not isinstance(tag, dict): + continue + if not tag.get('name') or not tag.get('value'): + continue + gender = _genderFromString(translate, tag['value']) + if gender: + return gender # if not then use the bio if not bioFound and actorJson.get('summary'): bioFound = actorJson['summary'] if not bioFound: - return None - gender = 'They/Them' - bioFoundOrig = bioFound - bioFound = bioFound.lower() - if translate['He/Him'].lower() in bioFound or \ - translate['boy'].lower() in bioFound: - gender = 'He/Him' - elif (translate['She/Her'].lower() in bioFound or - translate['girl'].lower() in bioFound): - gender = 'She/Her' - elif 'him' in bioFound or 'male' in bioFound: - gender = 'He/Him' - elif 'her' in bioFound or 'she' in bioFound or \ - 'fem' in bioFound or 'woman' in bioFound: - gender = 'She/Her' - elif 'man' in bioFound or 'He' in bioFoundOrig: - gender = 'He/Him' + return defaultGender + gender = _genderFromString(translate, bioFound) + if not gender: + gender = defaultGender return gender From c8b8663725d799cc6f2f2c8e9cefd44364d56841 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 24 Jun 2021 20:28:26 +0100 Subject: [PATCH 1248/1416] Comment --- utils.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/utils.py b/utils.py index 17bea3e9a..d6376029b 100644 --- a/utils.py +++ b/utils.py @@ -743,6 +743,8 @@ def getDisplayName(baseDir: str, actor: str, personCache: {}) -> str: def _genderFromString(translate: {}, text: str) -> str: + """Given some text, does it contain a gender description? + """ gender = None textOrig = text text = text.lower() From d90336239eb201117b2570cdf416ac073b545166 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 24 Jun 2021 20:55:29 +0100 Subject: [PATCH 1249/1416] Tidying --- utils.py | 97 ++++++++++++++++++-------------------------------------- 1 file changed, 31 insertions(+), 66 deletions(-) diff --git a/utils.py b/utils.py index d6376029b..be6ef4923 100644 --- a/utils.py +++ b/utils.py @@ -834,56 +834,34 @@ def getNicknameFromActor(actor: str) -> str: """ if actor.startswith('@'): actor = actor[1:] - if '/users/' not in actor: - if '/profile/' in actor: - nickStr = actor.split('/profile/')[1].replace('@', '') + usersPaths = ('/users/', '/profile/', '/channel/', '/accounts/', '/u/') + for possiblePath in usersPaths: + if possiblePath in actor: + nickStr = actor.split(possiblePath)[1].replace('@', '') if '/' not in nickStr: return nickStr else: return nickStr.split('/')[0] - elif '/channel/' in actor: - nickStr = actor.split('/channel/')[1].replace('@', '') - if '/' not in nickStr: - return nickStr - else: - return nickStr.split('/')[0] - elif '/accounts/' in actor: - nickStr = actor.split('/accounts/')[1].replace('@', '') - if '/' not in nickStr: - return nickStr - else: - return nickStr.split('/')[0] - elif '/u/' in actor: - nickStr = actor.split('/u/')[1].replace('@', '') - if '/' not in nickStr: - return nickStr - else: - return nickStr.split('/')[0] - elif '/@' in actor: - # https://domain/@nick - nickStr = actor.split('/@')[1] - if '/' in nickStr: - nickStr = nickStr.split('/')[0] - return nickStr - elif '@' in actor: - nickStr = actor.split('@')[0] - return nickStr - elif '://' in actor: - domain = actor.split('://')[1] - if '/' in domain: - domain = domain.split('/')[0] - if '://' + domain + '/' not in actor: - return None - nickStr = actor.split('://' + domain + '/')[1] - if '/' in nickStr or '.' in nickStr: - return None - return nickStr - return None - nickStr = actor.split('/users/')[1].replace('@', '') - if '/' not in nickStr: + if '/@' in actor: + # https://domain/@nick + nickStr = actor.split('/@')[1] + if '/' in nickStr: + nickStr = nickStr.split('/')[0] return nickStr - else: - return nickStr.split('/')[0] + elif '@' in actor: + nickStr = actor.split('@')[0] + return nickStr + elif '://' in actor: + domain = actor.split('://')[1] + if '/' in domain: + domain = domain.split('/')[0] + if '://' + domain + '/' not in actor: + return None + nickStr = actor.split('://' + domain + '/')[1] + if '/' in nickStr or '.' in nickStr: + return None + return nickStr + return None def getDomainFromActor(actor: str) -> (str, int): @@ -893,27 +871,14 @@ def getDomainFromActor(actor: str) -> (str, int): actor = actor[1:] port = None prefixes = getProtocolPrefixes() - if '/profile/' in actor: - domain = actor.split('/profile/')[0] - for prefix in prefixes: - domain = domain.replace(prefix, '') - elif '/accounts/' in actor: - domain = actor.split('/accounts/')[0] - for prefix in prefixes: - domain = domain.replace(prefix, '') - elif '/channel/' in actor: - domain = actor.split('/channel/')[0] - for prefix in prefixes: - domain = domain.replace(prefix, '') - elif '/users/' in actor: - domain = actor.split('/users/')[0] - for prefix in prefixes: - domain = domain.replace(prefix, '') - elif '/u/' in actor: - domain = actor.split('/u/')[0] - for prefix in prefixes: - domain = domain.replace(prefix, '') - elif '/@' in actor: + usersPaths = ('/users/', '/profile/', '/accounts/', '/channel/', '/u/') + for possiblePath in usersPaths: + if possiblePath in actor: + domain = actor.split(possiblePath)[0] + for prefix in prefixes: + domain = domain.replace(prefix, '') + break + if '/@' in actor: domain = actor.split('/@')[0] for prefix in prefixes: domain = domain.replace(prefix, '') From 6f8060932c530ed30ed028f3f68b79f5d2d24b20 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 25 Jun 2021 10:51:54 +0100 Subject: [PATCH 1250/1416] Alternative field for indicating no replies --- inbox.py | 22 ++++------------------ posts.py | 2 ++ tests.py | 10 ++++++++++ utils.py | 38 +++++++++++++++----------------------- webapp_post.py | 3 +++ 5 files changed, 34 insertions(+), 41 deletions(-) diff --git a/inbox.py b/inbox.py index 81ab531c2..1f5c86e18 100644 --- a/inbox.py +++ b/inbox.py @@ -1517,11 +1517,15 @@ def jsonPostAllowsComments(postJsonObject: {}) -> bool: """ if 'commentsEnabled' in postJsonObject: return postJsonObject['commentsEnabled'] + if 'rejectReplies' in postJsonObject: + return not postJsonObject['rejectReplies'] if postJsonObject.get('object'): if not hasObjectDict(postJsonObject): return False elif 'commentsEnabled' in postJsonObject['object']: return postJsonObject['object']['commentsEnabled'] + elif 'rejectReplies' in postJsonObject['object']: + return not postJsonObject['object']['rejectReplies'] return True @@ -1576,24 +1580,6 @@ def populateReplies(baseDir: str, httpPrefix: str, domain: str, print('DEBUG: post may have expired - ' + replyTo) return False -# TODO store replies collection -# replyItem = { -# "type": "Document", -# "url": replyTo -# } -# if not messageJson['object'].get('replies'): -# messageJson['object']['replies'] = { -# "items": [replyItem] -# } -# else: -# found = False -# for item in messageJson['object']['replies']['items']: -# if item['url'] == replyTo: -# found = True -# break -# if not found: -# messageJson['object']['replies']['items'].append(replyItem) -# if not _postAllowsComments(postFilename): if debug: print('DEBUG: post does not allow comments - ' + replyTo) diff --git a/posts.py b/posts.py index a749a3bd3..41713a7cc 100644 --- a/posts.py +++ b/posts.py @@ -1078,6 +1078,7 @@ def _createPostBase(baseDir: str, nickname: str, domain: str, port: int, 'atomUri': newPostId, 'inReplyToAtomUri': inReplyToAtomUri, 'commentsEnabled': commentsEnabled, + 'rejectReplies': not commentsEnabled, 'mediaType': 'text/html', 'content': content, 'contentMap': { @@ -1129,6 +1130,7 @@ def _createPostBase(baseDir: str, nickname: str, domain: str, port: int, 'atomUri': newPostId, 'inReplyToAtomUri': inReplyToAtomUri, 'commentsEnabled': commentsEnabled, + 'rejectReplies': not commentsEnabled, 'mediaType': 'text/html', 'content': content, 'contentMap': { diff --git a/tests.py b/tests.py index b5e8c9b01..19cd9861c 100644 --- a/tests.py +++ b/tests.py @@ -2359,6 +2359,16 @@ def _testJsonPostAllowsComments(): "commentsEnabled": False } assert not jsonPostAllowsComments(postJsonObject) + postJsonObject = { + "id": "123", + "rejectReplies": False + } + assert jsonPostAllowsComments(postJsonObject) + postJsonObject = { + "id": "123", + "rejectReplies": True + } + assert not jsonPostAllowsComments(postJsonObject) postJsonObject = { "id": "123", "commentsEnabled": True diff --git a/utils.py b/utils.py index be6ef4923..f8ba2307f 100644 --- a/utils.py +++ b/utils.py @@ -1159,10 +1159,6 @@ def _removeAttachment(baseDir: str, httpPrefix: str, domain: str, return if not postJson['attachment'][0].get('url'): return -# if port: -# if port != 80 and port != 443: -# if ':' not in domain: -# domain = domain + ':' + str(port) attachmentUrl = postJson['attachment'][0]['url'] if not attachmentUrl: return @@ -1457,18 +1453,21 @@ def noOfActiveAccountsMonthly(baseDir: str, months: int) -> bool: monthSeconds = int(60*60*24*30*months) for subdir, dirs, files in os.walk(baseDir + '/accounts'): for account in dirs: - if '@' in account: - if not account.startswith('inbox@') and \ - not account.startswith('news@'): - lastUsedFilename = \ - baseDir + '/accounts/' + account + '/.lastUsed' - if os.path.isfile(lastUsedFilename): - with open(lastUsedFilename, 'r') as lastUsedFile: - lastUsed = lastUsedFile.read() - if lastUsed.isdigit(): - timeDiff = (currTime - int(lastUsed)) - if timeDiff < monthSeconds: - accountCtr += 1 + if '@' not in account: + continue + if account.startswith('inbox@') or \ + account.startswith('news@'): + continue + lastUsedFilename = \ + baseDir + '/accounts/' + account + '/.lastUsed' + if not os.path.isfile(lastUsedFilename): + continue + with open(lastUsedFilename, 'r') as lastUsedFile: + lastUsed = lastUsedFile.read() + if lastUsed.isdigit(): + timeDiff = (currTime - int(lastUsed)) + if timeDiff < monthSeconds: + accountCtr += 1 break return accountCtr @@ -1794,13 +1793,6 @@ def getFileCaseInsensitive(path: str) -> str: if path != path.lower(): if os.path.isfile(path.lower()): return path.lower() - # directory, filename = os.path.split(path) - # directory, filename = (directory or '.'), filename.lower() - # for f in os.listdir(directory): - # if f.lower() == filename: - # newpath = os.path.join(directory, f) - # if os.path.isfile(newpath): - # return newpath return None diff --git a/webapp_post.py b/webapp_post.py index b4bf0a33e..f3957205c 100644 --- a/webapp_post.py +++ b/webapp_post.py @@ -1401,6 +1401,9 @@ def individualPostAsHtml(allowDownloads: bool, if 'commentsEnabled' in postJsonObject['object']: if postJsonObject['object']['commentsEnabled'] is False: commentsEnabled = False + elif 'rejectReplies' in postJsonObject['object']: + if postJsonObject['object']['rejectReplies']: + commentsEnabled = False replyStr = _getReplyIconHtml(nickname, isPublicRepeat, showIcons, commentsEnabled, From b8e1868b9eab5617106c5d71978ce40f6240bfe2 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 25 Jun 2021 12:54:04 +0100 Subject: [PATCH 1251/1416] Tidying --- webapp_calendar.py | 1 - 1 file changed, 1 deletion(-) diff --git a/webapp_calendar.py b/webapp_calendar.py index 9937d5b7f..740cf514c 100644 --- a/webapp_calendar.py +++ b/webapp_calendar.py @@ -459,7 +459,6 @@ def htmlCalendar(personCache: {}, cssCache: {}, translate: {}, htmlHideFromScreenReader('←') + ' ' + translate['Previous month'] navLinks[prevMonthStr] = calActor + '/calendar?year=' + str(prevYear) + \ '?month=' + str(prevMonthNumber) - # TODO navAccessKeys = { } screenReaderCal = \ From 662483c499449ccd42f8f2b9bceed8f285627425 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 25 Jun 2021 15:33:16 +0100 Subject: [PATCH 1252/1416] Move function --- person.py | 30 ++++++++++++++++++++++++++++++ webapp_post.py | 2 +- webapp_profile.py | 2 +- webapp_utils.py | 30 +----------------------------- 4 files changed, 33 insertions(+), 31 deletions(-) diff --git a/person.py b/person.py index 97263f526..e148397e2 100644 --- a/person.py +++ b/person.py @@ -49,10 +49,12 @@ from utils import getConfigParam from utils import refreshNewswire from utils import getProtocolPrefixes from utils import hasUsersPath +from utils import getImageExtensions from session import createSession from session import getJson from webfinger import webfingerHandle from pprint import pprint +from cache import getPersonFromCache def generateRSAKey() -> (str, str): @@ -1347,3 +1349,31 @@ def getActorJson(hostDomain: str, handle: str, http: bool, gnunet: bool, pprint(personJson) return personJson, asHeader return None, None + + +def getPersonAvatarUrl(baseDir: str, personUrl: str, personCache: {}, + allowDownloads: bool) -> str: + """Returns the avatar url for the person + """ + personJson = \ + getPersonFromCache(baseDir, personUrl, personCache, allowDownloads) + if not personJson: + return None + + # get from locally stored image + if not personJson.get('id'): + return None + actorStr = personJson['id'].replace('/', '-') + avatarImagePath = baseDir + '/cache/avatars/' + actorStr + + imageExtension = getImageExtensions() + for ext in imageExtension: + if os.path.isfile(avatarImagePath + '.' + ext): + return '/avatars/' + actorStr + '.' + ext + elif os.path.isfile(avatarImagePath.lower() + '.' + ext): + return '/avatars/' + actorStr.lower() + '.' + ext + + if personJson.get('icon'): + if personJson['icon'].get('url'): + return personJson['icon']['url'] + return None diff --git a/webapp_post.py b/webapp_post.py index f3957205c..fa1317344 100644 --- a/webapp_post.py +++ b/webapp_post.py @@ -52,9 +52,9 @@ from content import removeLongWords from content import getMentionsFromHtml from content import switchWords from person import isPersonSnoozed +from person import getPersonAvatarUrl from announce import announcedByPerson from webapp_utils import getAvatarImageUrl -from webapp_utils import getPersonAvatarUrl from webapp_utils import updateAvatarImageCache from webapp_utils import loadIndividualPostAsHtmlFromCache from webapp_utils import addEmojiToDisplayName diff --git a/webapp_profile.py b/webapp_profile.py index fcaff60c8..4b47bbe36 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -26,6 +26,7 @@ from skills import getSkills from theme import getThemesList from person import personBoxJson from person import getActorJson +from person import getPersonAvatarUrl from webfinger import webfingerHandle from posts import parseUserFeed from posts import getPersonBox @@ -45,7 +46,6 @@ from webapp_frontscreen import htmlFrontScreen from webapp_utils import htmlKeyboardNavigation from webapp_utils import htmlHideFromScreenReader from webapp_utils import scheduledPostsExist -from webapp_utils import getPersonAvatarUrl from webapp_utils import htmlHeaderWithExternalStyle from webapp_utils import htmlHeaderWithPersonMarkup from webapp_utils import htmlFooter diff --git a/webapp_utils.py b/webapp_utils.py index 79163cf19..9300ab3f1 100644 --- a/webapp_utils.py +++ b/webapp_utils.py @@ -16,10 +16,10 @@ from utils import getProtocolPrefixes from utils import loadJson from utils import getCachedPostFilename from utils import getConfigParam -from cache import getPersonFromCache from cache import storePersonInCache from content import addHtmlTags from content import replaceEmojiFromTags +from person import getPersonAvatarUrl def _markdownEmphasisHtml(markdown: str) -> str: @@ -533,34 +533,6 @@ def updateAvatarImageCache(session, baseDir: str, httpPrefix: str, return avatarImageFilename.replace(baseDir + '/cache', '') -def getPersonAvatarUrl(baseDir: str, personUrl: str, personCache: {}, - allowDownloads: bool) -> str: - """Returns the avatar url for the person - """ - personJson = \ - getPersonFromCache(baseDir, personUrl, personCache, allowDownloads) - if not personJson: - return None - - # get from locally stored image - if not personJson.get('id'): - return None - actorStr = personJson['id'].replace('/', '-') - avatarImagePath = baseDir + '/cache/avatars/' + actorStr - - imageExtension = getImageExtensions() - for ext in imageExtension: - if os.path.isfile(avatarImagePath + '.' + ext): - return '/avatars/' + actorStr + '.' + ext - elif os.path.isfile(avatarImagePath.lower() + '.' + ext): - return '/avatars/' + actorStr.lower() + '.' + ext - - if personJson.get('icon'): - if personJson['icon'].get('url'): - return personJson['icon']['url'] - return None - - def scheduledPostsExist(baseDir: str, nickname: str, domain: str) -> bool: """Returns true if there are posts scheduled to be delivered """ From bf20e507cd25fb2562224b5231fd9a396731b581 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 25 Jun 2021 15:38:31 +0100 Subject: [PATCH 1253/1416] Move markdown functions to a separate module --- markdown.py | 168 ++++++++++++++++++++++++++++++++++++++ tests.py | 2 +- webapp_about.py | 2 +- webapp_timeline.py | 2 +- webapp_tos.py | 2 +- webapp_utils.py | 160 ------------------------------------ webapp_welcome.py | 2 +- webapp_welcome_final.py | 2 +- webapp_welcome_profile.py | 2 +- 9 files changed, 175 insertions(+), 167 deletions(-) create mode 100644 markdown.py diff --git a/markdown.py b/markdown.py new file mode 100644 index 000000000..67d99b426 --- /dev/null +++ b/markdown.py @@ -0,0 +1,168 @@ +__filename__ = "markdown.py" +__author__ = "Bob Mottram" +__license__ = "AGPL3+" +__version__ = "1.2.0" +__maintainer__ = "Bob Mottram" +__email__ = "bob@freedombone.net" +__status__ = "Production" +__module_group__ = "Web Interface" + + +def _markdownEmphasisHtml(markdown: str) -> str: + """Add italics and bold html markup to the given markdown + """ + replacements = { + ' **': ' ', + '** ': ' ', + '**.': '
.', + '**:': '
:', + '**;': ';', + '**,': '
,', + '**\n': '\n', + ' *': ' ', + '* ': ' ', + '*.': '.', + '*:': '
:', + '*;': ';', + '*,': ',', + '*\n': '\n', + ' _': '
    ', + '_ ': '
', + '_.': '.', + '_:': ':', + '_;': ';', + '_,': ',', + '_\n': '\n' + } + for md, html in replacements.items(): + markdown = markdown.replace(md, html) + + if markdown.startswith('**'): + markdown = markdown[2:] + '' + elif markdown.startswith('*'): + markdown = markdown[1:] + '' + elif markdown.startswith('_'): + markdown = markdown[1:] + '
    ' + + if markdown.endswith('**'): + markdown = markdown[:len(markdown) - 2] + '' + elif markdown.endswith('*'): + markdown = markdown[:len(markdown) - 1] + '' + elif markdown.endswith('_'): + markdown = markdown[:len(markdown) - 1] + '
' + return markdown + + +def _markdownReplaceQuotes(markdown: str) -> str: + """Replaces > quotes with html blockquote + """ + if '> ' not in markdown: + return markdown + lines = markdown.split('\n') + result = '' + prevQuoteLine = None + for line in lines: + if '> ' not in line: + result += line + '\n' + prevQuoteLine = None + continue + lineStr = line.strip() + if not lineStr.startswith('> '): + result += line + '\n' + prevQuoteLine = None + continue + lineStr = lineStr.replace('> ', '', 1).strip() + if prevQuoteLine: + newPrevLine = prevQuoteLine.replace('\n', '') + result = result.replace(prevQuoteLine, newPrevLine) + ' ' + lineStr += '\n' + else: + lineStr = '
' + lineStr + '
\n' + result += lineStr + prevQuoteLine = lineStr + + if '\n' in result: + result = result.replace('\n', '') + + if result.endswith('\n') and \ + not markdown.endswith('\n'): + result = result[:len(result) - 1] + return result + + +def _markdownReplaceLinks(markdown: str, images: bool = False) -> str: + """Replaces markdown links with html + Optionally replace image links + """ + replaceLinks = {} + text = markdown + startChars = '[' + if images: + startChars = '![' + while startChars in text: + if ')' not in text: + break + text = text.split(startChars, 1)[1] + markdownLink = startChars + text.split(')')[0] + ')' + if ']' not in markdownLink or \ + '(' not in markdownLink: + text = text.split(')', 1)[1] + continue + if not images: + replaceLinks[markdownLink] = \ + '' + \ + markdownLink.split(startChars)[1].split(']')[0] + \ + '' + else: + replaceLinks[markdownLink] = \ + '' + \
+                markdownLink.split(startChars)[1].split(']')[0] + \
+                '' + text = text.split(')', 1)[1] + for mdLink, htmlLink in replaceLinks.items(): + markdown = markdown.replace(mdLink, htmlLink) + return markdown + + +def markdownToHtml(markdown: str) -> str: + """Converts markdown formatted text to html + """ + markdown = _markdownReplaceQuotes(markdown) + markdown = _markdownEmphasisHtml(markdown) + markdown = _markdownReplaceLinks(markdown, True) + markdown = _markdownReplaceLinks(markdown) + + # replace headers + linesList = markdown.split('\n') + htmlStr = '' + ctr = 0 + for line in linesList: + if ctr > 0: + htmlStr += '
' + if line.startswith('#####'): + line = line.replace('#####', '').strip() + line = '
' + line + '
' + ctr = -1 + elif line.startswith('####'): + line = line.replace('####', '').strip() + line = '

' + line + '

' + ctr = -1 + elif line.startswith('###'): + line = line.replace('###', '').strip() + line = '

' + line + '

' + ctr = -1 + elif line.startswith('##'): + line = line.replace('##', '').strip() + line = '

' + line + '

' + ctr = -1 + elif line.startswith('#'): + line = line.replace('#', '').strip() + line = '

' + line + '

' + ctr = -1 + htmlStr += line + ctr += 1 + return htmlStr diff --git a/tests.py b/tests.py index 19cd9861c..2095436e6 100644 --- a/tests.py +++ b/tests.py @@ -115,8 +115,8 @@ from newswire import parseFeedDate from mastoapiv1 import getMastoApiV1IdFromNickname from mastoapiv1 import getNicknameFromMastoApiV1Id from webapp_post import prepareHtmlPostNickname -from webapp_utils import markdownToHtml from speaker import speakerReplaceLinks +from markdown import markdownToHtml testServerAliceRunning = False testServerBobRunning = False diff --git a/webapp_about.py b/webapp_about.py index 233d052f7..607e08a6d 100644 --- a/webapp_about.py +++ b/webapp_about.py @@ -12,7 +12,7 @@ from shutil import copyfile from utils import getConfigParam from webapp_utils import htmlHeaderWithWebsiteMarkup from webapp_utils import htmlFooter -from webapp_utils import markdownToHtml +from markdown import markdownToHtml def htmlAbout(cssCache: {}, baseDir: str, httpPrefix: str, diff --git a/webapp_timeline.py b/webapp_timeline.py index 8f4cb9d8e..471c1ede6 100644 --- a/webapp_timeline.py +++ b/webapp_timeline.py @@ -17,7 +17,7 @@ from utils import isEditor from utils import removeIdEnding from follow import followerApprovalActive from person import isPersonSnoozed -from webapp_utils import markdownToHtml +from markdown import markdownToHtml from webapp_utils import htmlKeyboardNavigation from webapp_utils import htmlHideFromScreenReader from webapp_utils import htmlPostSeparator diff --git a/webapp_tos.py b/webapp_tos.py index 3fe7c7f3d..119c853bf 100644 --- a/webapp_tos.py +++ b/webapp_tos.py @@ -12,7 +12,7 @@ from shutil import copyfile from utils import getConfigParam from webapp_utils import htmlHeaderWithExternalStyle from webapp_utils import htmlFooter -from webapp_utils import markdownToHtml +from markdown import markdownToHtml def htmlTermsOfService(cssCache: {}, baseDir: str, diff --git a/webapp_utils.py b/webapp_utils.py index 9300ab3f1..cae6289aa 100644 --- a/webapp_utils.py +++ b/webapp_utils.py @@ -22,166 +22,6 @@ from content import replaceEmojiFromTags from person import getPersonAvatarUrl -def _markdownEmphasisHtml(markdown: str) -> str: - """Add italics and bold html markup to the given markdown - """ - replacements = { - ' **': ' ', - '** ': ' ', - '**.': '
.', - '**:': ':', - '**;': ';', - '**,': ',', - '**\n': '\n', - ' *': ' ', - '* ': ' ', - '*.': '.', - '*:': ':', - '*;': ';', - '*,': ',', - '*\n': '\n', - ' _': '
    ', - '_ ': '
', - '_.': '.', - '_:': ':', - '_;': ';', - '_,': ',', - '_\n': '\n' - } - for md, html in replacements.items(): - markdown = markdown.replace(md, html) - - if markdown.startswith('**'): - markdown = markdown[2:] + '' - elif markdown.startswith('*'): - markdown = markdown[1:] + '' - elif markdown.startswith('_'): - markdown = markdown[1:] + '
    ' - - if markdown.endswith('**'): - markdown = markdown[:len(markdown) - 2] + '' - elif markdown.endswith('*'): - markdown = markdown[:len(markdown) - 1] + '' - elif markdown.endswith('_'): - markdown = markdown[:len(markdown) - 1] + '
' - return markdown - - -def _markdownReplaceQuotes(markdown: str) -> str: - """Replaces > quotes with html blockquote - """ - if '> ' not in markdown: - return markdown - lines = markdown.split('\n') - result = '' - prevQuoteLine = None - for line in lines: - if '> ' not in line: - result += line + '\n' - prevQuoteLine = None - continue - lineStr = line.strip() - if not lineStr.startswith('> '): - result += line + '\n' - prevQuoteLine = None - continue - lineStr = lineStr.replace('> ', '', 1).strip() - if prevQuoteLine: - newPrevLine = prevQuoteLine.replace('\n', '') - result = result.replace(prevQuoteLine, newPrevLine) + ' ' - lineStr += '\n' - else: - lineStr = '
' + lineStr + '
\n' - result += lineStr - prevQuoteLine = lineStr - - if '\n' in result: - result = result.replace('\n', '') - - if result.endswith('\n') and \ - not markdown.endswith('\n'): - result = result[:len(result) - 1] - return result - - -def _markdownReplaceLinks(markdown: str, images: bool = False) -> str: - """Replaces markdown links with html - Optionally replace image links - """ - replaceLinks = {} - text = markdown - startChars = '[' - if images: - startChars = '![' - while startChars in text: - if ')' not in text: - break - text = text.split(startChars, 1)[1] - markdownLink = startChars + text.split(')')[0] + ')' - if ']' not in markdownLink or \ - '(' not in markdownLink: - text = text.split(')', 1)[1] - continue - if not images: - replaceLinks[markdownLink] = \ - '' + \ - markdownLink.split(startChars)[1].split(']')[0] + \ - '' - else: - replaceLinks[markdownLink] = \ - '' + \
-                markdownLink.split(startChars)[1].split(']')[0] + \
-                '' - text = text.split(')', 1)[1] - for mdLink, htmlLink in replaceLinks.items(): - markdown = markdown.replace(mdLink, htmlLink) - return markdown - - -def markdownToHtml(markdown: str) -> str: - """Converts markdown formatted text to html - """ - markdown = _markdownReplaceQuotes(markdown) - markdown = _markdownEmphasisHtml(markdown) - markdown = _markdownReplaceLinks(markdown, True) - markdown = _markdownReplaceLinks(markdown) - - # replace headers - linesList = markdown.split('\n') - htmlStr = '' - ctr = 0 - for line in linesList: - if ctr > 0: - htmlStr += '
' - if line.startswith('#####'): - line = line.replace('#####', '').strip() - line = '
' + line + '
' - ctr = -1 - elif line.startswith('####'): - line = line.replace('####', '').strip() - line = '

' + line + '

' - ctr = -1 - elif line.startswith('###'): - line = line.replace('###', '').strip() - line = '

' + line + '

' - ctr = -1 - elif line.startswith('##'): - line = line.replace('##', '').strip() - line = '

' + line + '

' - ctr = -1 - elif line.startswith('#'): - line = line.replace('#', '').strip() - line = '

' + line + '

' - ctr = -1 - htmlStr += line - ctr += 1 - return htmlStr - - def getBrokenLinkSubstitute() -> str: """Returns html used to show a default image if the link to an image is broken diff --git a/webapp_welcome.py b/webapp_welcome.py index 7fd59b7ae..c1e804a82 100644 --- a/webapp_welcome.py +++ b/webapp_welcome.py @@ -13,7 +13,7 @@ from utils import getConfigParam from utils import removeHtml from webapp_utils import htmlHeaderWithExternalStyle from webapp_utils import htmlFooter -from webapp_utils import markdownToHtml +from markdown import markdownToHtml def isWelcomeScreenComplete(baseDir: str, nickname: str, domain: str) -> bool: diff --git a/webapp_welcome_final.py b/webapp_welcome_final.py index e3586aa72..01349aa28 100644 --- a/webapp_welcome_final.py +++ b/webapp_welcome_final.py @@ -13,7 +13,7 @@ from utils import removeHtml from utils import getConfigParam from webapp_utils import htmlHeaderWithExternalStyle from webapp_utils import htmlFooter -from webapp_utils import markdownToHtml +from markdown import markdownToHtml def htmlWelcomeFinal(baseDir: str, nickname: str, domain: str, diff --git a/webapp_welcome_profile.py b/webapp_welcome_profile.py index d734587c8..990c88fe2 100644 --- a/webapp_welcome_profile.py +++ b/webapp_welcome_profile.py @@ -16,7 +16,7 @@ from utils import getImageExtensions from utils import getImageFormats from webapp_utils import htmlHeaderWithExternalStyle from webapp_utils import htmlFooter -from webapp_utils import markdownToHtml +from markdown import markdownToHtml def htmlWelcomeProfile(baseDir: str, nickname: str, domain: str, From d1426a2afd7707633d57c6e1c0fc482626b3eaa3 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 25 Jun 2021 16:41:31 +0100 Subject: [PATCH 1254/1416] Separate module for minimal button --- daemon.py | 4 ++-- webapp_minimalbutton.py | 40 ++++++++++++++++++++++++++++++++++++++++ webapp_utils.py | 30 ------------------------------ 3 files changed, 42 insertions(+), 32 deletions(-) create mode 100644 webapp_minimalbutton.py diff --git a/daemon.py b/daemon.py index b530f9901..ac58b8369 100644 --- a/daemon.py +++ b/daemon.py @@ -139,8 +139,8 @@ from blog import htmlBlogView from blog import htmlBlogPage from blog import htmlBlogPost from blog import htmlEditBlog -from webapp_utils import setMinimal -from webapp_utils import isMinimal +from webapp_minimalbutton import setMinimal +from webapp_minimalbutton import isMinimal from webapp_utils import getAvatarImageUrl from webapp_utils import htmlHashtagBlocked from webapp_utils import htmlFollowingList diff --git a/webapp_minimalbutton.py b/webapp_minimalbutton.py new file mode 100644 index 000000000..3b1815f36 --- /dev/null +++ b/webapp_minimalbutton.py @@ -0,0 +1,40 @@ +__filename__ = "webapp_minimalbutton.py" +__author__ = "Bob Mottram" +__license__ = "AGPL3+" +__version__ = "1.2.0" +__maintainer__ = "Bob Mottram" +__email__ = "bob@freedombone.net" +__status__ = "Production" +__module_group__ = "Web Interface" + +import os + + +def isMinimal(baseDir: str, domain: str, nickname: str) -> bool: + """Returns true if minimal buttons should be shown + for the given account + """ + accountDir = baseDir + '/accounts/' + \ + nickname + '@' + domain + if not os.path.isdir(accountDir): + return True + minimalFilename = accountDir + '/.notminimal' + if os.path.isfile(minimalFilename): + return False + return True + + +def setMinimal(baseDir: str, domain: str, nickname: str, + minimal: bool) -> None: + """Sets whether an account should display minimal buttons + """ + accountDir = baseDir + '/accounts/' + nickname + '@' + domain + if not os.path.isdir(accountDir): + return + minimalFilename = accountDir + '/.notminimal' + minimalFileExists = os.path.isfile(minimalFilename) + if minimal and minimalFileExists: + os.remove(minimalFilename) + elif not minimal and not minimalFileExists: + with open(minimalFilename, 'w+') as fp: + fp.write('\n') diff --git a/webapp_utils.py b/webapp_utils.py index cae6289aa..22d6fb787 100644 --- a/webapp_utils.py +++ b/webapp_utils.py @@ -1171,33 +1171,3 @@ def htmlKeyboardNavigation(banner: str, links: {}, accessKeys: {}, str(title) + '\n' htmlStr += '
\n' return htmlStr - - -def isMinimal(baseDir: str, domain: str, nickname: str) -> bool: - """Returns true if minimal buttons should be shown - for the given account - """ - accountDir = baseDir + '/accounts/' + \ - nickname + '@' + domain - if not os.path.isdir(accountDir): - return True - minimalFilename = accountDir + '/.notminimal' - if os.path.isfile(minimalFilename): - return False - return True - - -def setMinimal(baseDir: str, domain: str, nickname: str, - minimal: bool) -> None: - """Sets whether an account should display minimal buttons - """ - accountDir = baseDir + '/accounts/' + nickname + '@' + domain - if not os.path.isdir(accountDir): - return - minimalFilename = accountDir + '/.notminimal' - minimalFileExists = os.path.isfile(minimalFilename) - if minimal and minimalFileExists: - os.remove(minimalFilename) - elif not minimal and not minimalFileExists: - with open(minimalFilename, 'w+') as fp: - fp.write('\n') From 7e324702cec529c4c9a33341535c2ec1917ce939 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 25 Jun 2021 17:10:09 +0100 Subject: [PATCH 1255/1416] Module groups --- blocking.py | 2 +- content.py | 1 + daemon.py | 1 + git.py | 2 +- happening.py | 2 +- mastoapiv1.py | 2 +- pyjsonld.py | 1 + tests.py | 3 +++ utils.py | 1 + 9 files changed, 11 insertions(+), 4 deletions(-) diff --git a/blocking.py b/blocking.py index e7020608e..0c81fcd8a 100644 --- a/blocking.py +++ b/blocking.py @@ -5,7 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" -__module_group__ = "ActivityPub" +__module_group__ = "Core" import os import json diff --git a/content.py b/content.py index 5760841a2..be1eec89d 100644 --- a/content.py +++ b/content.py @@ -5,6 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" +__module_group__ = "Core" import os import email.parser diff --git a/daemon.py b/daemon.py index ac58b8369..e180512bf 100644 --- a/daemon.py +++ b/daemon.py @@ -5,6 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" +__module_group__ = "Core" from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer, HTTPServer import sys diff --git a/git.py b/git.py index 00f2c9a23..2dcea4d31 100644 --- a/git.py +++ b/git.py @@ -5,7 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" -__module_group__ = "ActivityPub" +__module_group__ = "Core" import os import html diff --git a/happening.py b/happening.py index 28c9d6552..b5606e0e7 100644 --- a/happening.py +++ b/happening.py @@ -5,7 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" -__module_group__ = "Calendar" +__module_group__ = "Core" import os from uuid import UUID diff --git a/mastoapiv1.py b/mastoapiv1.py index 0a0e48ac0..51d6da9cb 100644 --- a/mastoapiv1.py +++ b/mastoapiv1.py @@ -5,7 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" -__module_group__ = "Metadata" +__module_group__ = "Core" import os from utils import loadJson diff --git a/pyjsonld.py b/pyjsonld.py index 6bdfd78c5..042f199ac 100644 --- a/pyjsonld.py +++ b/pyjsonld.py @@ -15,6 +15,7 @@ JSON-LD. __copyright__ = 'Copyright (c) 2011-2014 Digital Bazaar, Inc.' __license__ = 'New BSD license' __version__ = '0.6.8' +__module_group__ = "ActivityPub" __all__ = [ 'compact', 'expand', 'flatten', 'frame', 'link', 'from_rdf', 'to_rdf', diff --git a/tests.py b/tests.py index 2095436e6..9fccab36b 100644 --- a/tests.py +++ b/tests.py @@ -5,6 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" +__module_group__ = "Testing" import time import os @@ -3959,6 +3960,8 @@ def _testUserAgentDomain() -> None: def runAllTests(): print('Running tests...') + _testFunctions() + return updateDefaultThemesList(os.getcwd()) _testFunctions() _testUserAgentDomain() diff --git a/utils.py b/utils.py index f8ba2307f..5fc58d025 100644 --- a/utils.py +++ b/utils.py @@ -5,6 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" +__module_group__ = "Core" import os import re From 2c09f48367f121c4c6e91a46c8bd1b6810e66107 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 25 Jun 2021 17:41:18 +0100 Subject: [PATCH 1256/1416] Tidying --- tests.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests.py b/tests.py index 9fccab36b..40098610f 100644 --- a/tests.py +++ b/tests.py @@ -3960,8 +3960,6 @@ def _testUserAgentDomain() -> None: def runAllTests(): print('Running tests...') - _testFunctions() - return updateDefaultThemesList(os.getcwd()) _testFunctions() _testUserAgentDomain() From d7ad3733ffdceffea85047b7677ae1005f0a8ced Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 25 Jun 2021 19:02:05 +0100 Subject: [PATCH 1257/1416] Checking account directories --- blog.py | 19 ++++--------------- migrate.py | 7 ++----- theme.py | 7 ++----- utils.py | 7 ++----- webapp_moderation.py | 7 ++----- webapp_search.py | 13 +++---------- 6 files changed, 15 insertions(+), 45 deletions(-) diff --git a/blog.py b/blog.py index 0822aa64a..cbb2574c8 100644 --- a/blog.py +++ b/blog.py @@ -16,6 +16,7 @@ from webapp_utils import htmlHeaderWithBlogMarkup from webapp_utils import htmlFooter from webapp_utils import getPostAttachmentsAsHtml from webapp_media import addEmbeddedElements +from utils import isAccountDir from utils import removeHtml from utils import getConfigParam from utils import getFullDomain @@ -643,11 +644,7 @@ def _noOfBlogAccounts(baseDir: str) -> int: ctr = 0 for subdir, dirs, files in os.walk(baseDir + '/accounts'): for acct in dirs: - if '@' not in acct: - continue - if acct.startswith('inbox@'): - continue - elif acct.startswith('news@'): + if not isAccountDir(acct): continue accountDir = os.path.join(baseDir + '/accounts', acct) blogsIndex = accountDir + '/tlblogs.index' @@ -662,11 +659,7 @@ def _singleBlogAccountNickname(baseDir: str) -> str: """ for subdir, dirs, files in os.walk(baseDir + '/accounts'): for acct in dirs: - if '@' not in acct: - continue - if acct.startswith('inbox@'): - continue - elif acct.startswith('news@'): + if not isAccountDir(acct): continue accountDir = os.path.join(baseDir + '/accounts', acct) blogsIndex = accountDir + '/tlblogs.index' @@ -704,11 +697,7 @@ def htmlBlogView(authorized: bool, for subdir, dirs, files in os.walk(baseDir + '/accounts'): for acct in dirs: - if '@' not in acct: - continue - if acct.startswith('inbox@'): - continue - elif acct.startswith('news@'): + if not isAccountDir(acct): continue accountDir = os.path.join(baseDir + '/accounts', acct) blogsIndex = accountDir + '/tlblogs.index' diff --git a/migrate.py b/migrate.py index 4cca4b0e8..b36002a41 100644 --- a/migrate.py +++ b/migrate.py @@ -8,6 +8,7 @@ __status__ = "Production" __module_group__ = "Core" import os +from utils import isAccountDir from utils import getNicknameFromActor from utils import getDomainFromActor from webfinger import webfingerHandle @@ -186,11 +187,7 @@ def migrateAccounts(baseDir: str, session, ctr = 0 for subdir, dirs, files in os.walk(baseDir + '/accounts'): for handle in dirs: - if '@' not in handle: - continue - if handle.startswith('inbox@'): - continue - if handle.startswith('news@'): + if not isAccountDir(handle): continue nickname = handle.split('@')[0] domain = handle.split('@')[1] diff --git a/theme.py b/theme.py index def0348ce..4223bb121 100644 --- a/theme.py +++ b/theme.py @@ -7,6 +7,7 @@ __email__ = "bob@freedombone.net" __status__ = "Production" import os +from utils import isAccountDir from utils import loadJson from utils import saveJson from utils import getImageExtensions @@ -623,11 +624,7 @@ def _setThemeImages(baseDir: str, name: str) -> None: for subdir, dirs, files in os.walk(baseDir + '/accounts'): for acct in dirs: - if '@' not in acct: - continue - if acct.startswith('inbox@'): - continue - elif acct.startswith('news@'): + if not isAccountDir(acct): continue accountDir = \ os.path.join(baseDir + '/accounts', acct) diff --git a/utils.py b/utils.py index 5fc58d025..33454cf14 100644 --- a/utils.py +++ b/utils.py @@ -5,7 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" -__module_group__ = "Core" +__module_group__ = "ActivityPu" import os import re @@ -1454,10 +1454,7 @@ def noOfActiveAccountsMonthly(baseDir: str, months: int) -> bool: monthSeconds = int(60*60*24*30*months) for subdir, dirs, files in os.walk(baseDir + '/accounts'): for account in dirs: - if '@' not in account: - continue - if account.startswith('inbox@') or \ - account.startswith('news@'): + if not isAccountDir(account): continue lastUsedFilename = \ baseDir + '/accounts/' + account + '/.lastUsed' diff --git a/webapp_moderation.py b/webapp_moderation.py index 4e79f9f4d..01bddd2ad 100644 --- a/webapp_moderation.py +++ b/webapp_moderation.py @@ -8,6 +8,7 @@ __status__ = "Production" __module_group__ = "Web Interface" import os +from utils import isAccountDir from utils import getFullDomain from utils import isEditor from utils import loadJson @@ -270,11 +271,7 @@ def htmlModerationInfo(cssCache: {}, translate: {}, accounts = [] for subdir, dirs, files in os.walk(baseDir + '/accounts'): for acct in dirs: - if '@' not in acct: - continue - if acct.startswith('inbox@'): - continue - elif acct.startswith('news@'): + if not isAccountDir(acct): continue accounts.append(acct) break diff --git a/webapp_search.py b/webapp_search.py index e6beb6c18..22221ea1c 100644 --- a/webapp_search.py +++ b/webapp_search.py @@ -11,6 +11,7 @@ import os from shutil import copyfile import urllib.parse from datetime import datetime +from utils import isAccountDir from utils import getConfigParam from utils import getFullDomain from utils import isEditor @@ -407,11 +408,7 @@ def htmlSkillsSearch(actor: str, for f in files: if not f.endswith('.json'): continue - if '@' not in f: - continue - if f.startswith('inbox@'): - continue - elif f.startswith('news@'): + if not isAccountDir(f): continue actorFilename = os.path.join(subdir, f) actorJson = loadJson(actorFilename) @@ -446,11 +443,7 @@ def htmlSkillsSearch(actor: str, for f in files: if not f.endswith('.json'): continue - if '@' not in f: - continue - if f.startswith('inbox@'): - continue - elif f.startswith('news@'): + if not isAccountDir(f): continue actorFilename = os.path.join(subdir, f) cachedActorJson = loadJson(actorFilename) From a194ada54385c3ac452d855745147b99f5677992 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 26 Jun 2021 12:16:41 +0100 Subject: [PATCH 1258/1416] Module groups --- availability.py | 2 +- blog.py | 7 ++++++ cache.py | 2 +- city.py | 2 +- daemon.py | 2 +- devices.py | 1 + filters.py | 1 + git.py | 2 +- mastoapiv1.py | 2 +- petnames.py | 1 + pyjsonld.py | 2 +- roles.py | 1 + siteactive.py | 1 + skills.py | 1 + socnet.py | 1 + speaker.py | 1 + theme.py | 1 + threads.py | 1 + utils.py | 52 +++++++++++++++++++++++++++++++++++++++++- webapp_calendar.py | 2 +- webapp_confirm.py | 2 +- webapp_profile.py | 2 +- webapp_search.py | 2 +- webapp_utils.py | 56 ---------------------------------------------- 24 files changed, 79 insertions(+), 68 deletions(-) diff --git a/availability.py b/availability.py index 3cedea24a..32e63481b 100644 --- a/availability.py +++ b/availability.py @@ -5,7 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" -__module_group__ = "Core" +__module_group__ = "Profile Metadata" import os from webfinger import webfingerHandle diff --git a/blog.py b/blog.py index cbb2574c8..ef8aed4c5 100644 --- a/blog.py +++ b/blog.py @@ -26,6 +26,7 @@ from utils import getDomainFromActor from utils import locatePost from utils import loadJson from utils import firstParagraphFromString +from utils import getActorPropertyUrl from posts import createBlogsTimeline from newswire import rss2Header from newswire import rss2Footer @@ -884,3 +885,9 @@ def pathContainsBlogLink(baseDir: str, messageId = httpPrefix + '://' + domainFull + \ '/users/' + nickname + '/statuses/' + userEnding2[1] return locatePost(baseDir, nickname, domain, messageId), nickname + + +def getBlogAddress(actorJson: {}) -> str: + """Returns blog address for the given actor + """ + return getActorPropertyUrl(actorJson, 'Blog') diff --git a/cache.py b/cache.py index 96608524e..8d6291316 100644 --- a/cache.py +++ b/cache.py @@ -5,7 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" -__module_group__ = "ActivityPub" +__module_group__ = "Core" import os import datetime diff --git a/city.py b/city.py index 1726966d3..8a31a7801 100644 --- a/city.py +++ b/city.py @@ -5,7 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" -__module_group__ = "Spoofing" +__module_group__ = "Metadata" import os import datetime diff --git a/daemon.py b/daemon.py index e180512bf..69795fab2 100644 --- a/daemon.py +++ b/daemon.py @@ -140,13 +140,13 @@ from blog import htmlBlogView from blog import htmlBlogPage from blog import htmlBlogPost from blog import htmlEditBlog +from blog import getBlogAddress from webapp_minimalbutton import setMinimal from webapp_minimalbutton import isMinimal from webapp_utils import getAvatarImageUrl from webapp_utils import htmlHashtagBlocked from webapp_utils import htmlFollowingList from webapp_utils import setBlogAddress -from webapp_utils import getBlogAddress from webapp_calendar import htmlCalendarDeleteConfirm from webapp_calendar import htmlCalendar from webapp_about import htmlAbout diff --git a/devices.py b/devices.py index 0f0ef44a9..0ec994cd5 100644 --- a/devices.py +++ b/devices.py @@ -5,6 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" +__module_group__ = "Security" # REST API overview # diff --git a/filters.py b/filters.py index 67ca4d98d..fef1ed171 100644 --- a/filters.py +++ b/filters.py @@ -5,6 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" +__module_group__ = "Moderation" import os diff --git a/git.py b/git.py index 2dcea4d31..d198d4c93 100644 --- a/git.py +++ b/git.py @@ -5,7 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" -__module_group__ = "Core" +__module_group__ = "Profile Metadata" import os import html diff --git a/mastoapiv1.py b/mastoapiv1.py index 51d6da9cb..bd0d9c131 100644 --- a/mastoapiv1.py +++ b/mastoapiv1.py @@ -5,7 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" -__module_group__ = "Core" +__module_group__ = "API" import os from utils import loadJson diff --git a/petnames.py b/petnames.py index 21c46095a..2378c9047 100644 --- a/petnames.py +++ b/petnames.py @@ -5,6 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" +__module_group__ = "Core" import os diff --git a/pyjsonld.py b/pyjsonld.py index 042f199ac..18bfbcd79 100644 --- a/pyjsonld.py +++ b/pyjsonld.py @@ -15,7 +15,7 @@ JSON-LD. __copyright__ = 'Copyright (c) 2011-2014 Digital Bazaar, Inc.' __license__ = 'New BSD license' __version__ = '0.6.8' -__module_group__ = "ActivityPub" +__module_group__ = "Security" __all__ = [ 'compact', 'expand', 'flatten', 'frame', 'link', 'from_rdf', 'to_rdf', diff --git a/roles.py b/roles.py index 121dcf7b8..7f9010c67 100644 --- a/roles.py +++ b/roles.py @@ -5,6 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" +__module_group__ = "Profile Metadata" import os from utils import loadJson diff --git a/siteactive.py b/siteactive.py index ca530bf49..c5e96f821 100644 --- a/siteactive.py +++ b/siteactive.py @@ -6,6 +6,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" +__module_group__ = "Core" import http.client from urllib.parse import urlparse diff --git a/skills.py b/skills.py index dae7d567b..3d5d3f92b 100644 --- a/skills.py +++ b/skills.py @@ -5,6 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" +__module_group__ = "Profile Metadata" import os from webfinger import webfingerHandle diff --git a/socnet.py b/socnet.py index 30450c1ff..4ae5d3e1c 100644 --- a/socnet.py +++ b/socnet.py @@ -5,6 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" +__module_group__ = "Moderation" from session import createSession from webfinger import webfingerHandle diff --git a/speaker.py b/speaker.py index dc77f0207..20df16543 100644 --- a/speaker.py +++ b/speaker.py @@ -5,6 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" +__module_group__ = "Client" import os import html diff --git a/theme.py b/theme.py index 4223bb121..a700d9706 100644 --- a/theme.py +++ b/theme.py @@ -5,6 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" +__module_group__ = "Web Interface" import os from utils import isAccountDir diff --git a/threads.py b/threads.py index c07de0821..0c734c485 100644 --- a/threads.py +++ b/threads.py @@ -5,6 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" +__module_group__ = "Core" import threading import sys diff --git a/utils.py b/utils.py index 33454cf14..5562aa794 100644 --- a/utils.py +++ b/utils.py @@ -5,7 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" -__module_group__ = "ActivityPu" +__module_group__ = "Core" import os import re @@ -2403,3 +2403,53 @@ def hasObjectDict(postJsonObject: {}) -> bool: if isinstance(postJsonObject['object'], dict): return True return False + + +def getAltPath(actor: str, domainFull: str, callingDomain: str) -> str: + """Returns alternate path from the actor + eg. https://clearnetdomain/path becomes http://oniondomain/path + """ + postActor = actor + if callingDomain not in actor and domainFull in actor: + if callingDomain.endswith('.onion') or \ + callingDomain.endswith('.i2p'): + postActor = \ + 'http://' + callingDomain + actor.split(domainFull)[1] + print('Changed POST domain from ' + actor + ' to ' + postActor) + return postActor + + +def getActorPropertyUrl(actorJson: {}, propertyName: str) -> str: + """Returns a url property from an actor + """ + if not actorJson.get('attachment'): + return '' + propertyName = propertyName.lower() + for propertyValue in actorJson['attachment']: + if not propertyValue.get('name'): + continue + if not propertyValue['name'].lower().startswith(propertyName): + continue + if not propertyValue.get('type'): + continue + if not propertyValue.get('value'): + continue + if propertyValue['type'] != 'PropertyValue': + continue + propertyValue['value'] = propertyValue['value'].strip() + prefixes = getProtocolPrefixes() + prefixFound = False + for prefix in prefixes: + if propertyValue['value'].startswith(prefix): + prefixFound = True + break + if not prefixFound: + continue + if '.' not in propertyValue['value']: + continue + if ' ' in propertyValue['value']: + continue + if ',' in propertyValue['value']: + continue + return propertyValue['value'] + return '' diff --git a/webapp_calendar.py b/webapp_calendar.py index 740cf514c..14dbec8ca 100644 --- a/webapp_calendar.py +++ b/webapp_calendar.py @@ -18,12 +18,12 @@ from utils import getDomainFromActor from utils import locatePost from utils import loadJson from utils import weekDayOfMonthStart +from utils import getAltPath from domainhandler import removeDomainPort from happening import getTodaysEvents from happening import getCalendarEvents from webapp_utils import htmlHeaderWithExternalStyle from webapp_utils import htmlFooter -from webapp_utils import getAltPath from webapp_utils import htmlHideFromScreenReader from webapp_utils import htmlKeyboardNavigation diff --git a/webapp_confirm.py b/webapp_confirm.py index 9d9847dfb..69f0cc576 100644 --- a/webapp_confirm.py +++ b/webapp_confirm.py @@ -15,7 +15,7 @@ from utils import getDomainFromActor from utils import locatePost from utils import loadJson from utils import getConfigParam -from webapp_utils import getAltPath +from utils import getAltPath from webapp_utils import htmlHeaderWithExternalStyle from webapp_utils import htmlFooter from webapp_post import individualPostAsHtml diff --git a/webapp_profile.py b/webapp_profile.py index 4b47bbe36..ca6d6e9fb 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -52,7 +52,7 @@ from webapp_utils import htmlFooter from webapp_utils import addEmojiToDisplayName from webapp_utils import getBannerFile from webapp_utils import htmlPostSeparator -from webapp_utils import getBlogAddress +from blog import getBlogAddress from webapp_post import individualPostAsHtml from webapp_timeline import htmlIndividualShare diff --git a/webapp_search.py b/webapp_search.py index 22221ea1c..892e3f52d 100644 --- a/webapp_search.py +++ b/webapp_search.py @@ -22,13 +22,13 @@ from utils import locatePost from utils import isPublicPost from utils import firstParagraphFromString from utils import searchBoxPosts +from utils import getAltPath from skills import noOfActorSkills from skills import getSkillsFromList from categories import getHashtagCategory from feeds import rss2TagHeader from feeds import rss2TagFooter from webapp_utils import htmlKeyboardNavigation -from webapp_utils import getAltPath from webapp_utils import htmlHeaderWithExternalStyle from webapp_utils import htmlFooter from webapp_utils import getSearchBannerFile diff --git a/webapp_utils.py b/webapp_utils.py index 22d6fb787..5bf49b8ce 100644 --- a/webapp_utils.py +++ b/webapp_utils.py @@ -150,20 +150,6 @@ def headerButtonsFrontScreen(translate: {}, return headerStr -def getAltPath(actor: str, domainFull: str, callingDomain: str) -> str: - """Returns alternate path from the actor - eg. https://clearnetdomain/path becomes http://oniondomain/path - """ - postActor = actor - if callingDomain not in actor and domainFull in actor: - if callingDomain.endswith('.onion') or \ - callingDomain.endswith('.i2p'): - postActor = \ - 'http://' + callingDomain + actor.split(domainFull)[1] - print('Changed POST domain from ' + actor + ' to ' + postActor) - return postActor - - def getContentWarningButton(postID: str, translate: {}, content: str) -> str: """Returns the markup for a content warning button @@ -174,48 +160,6 @@ def getContentWarningButton(postID: str, translate: {}, '
\n' -def _getActorPropertyUrl(actorJson: {}, propertyName: str) -> str: - """Returns a url property from an actor - """ - if not actorJson.get('attachment'): - return '' - propertyName = propertyName.lower() - for propertyValue in actorJson['attachment']: - if not propertyValue.get('name'): - continue - if not propertyValue['name'].lower().startswith(propertyName): - continue - if not propertyValue.get('type'): - continue - if not propertyValue.get('value'): - continue - if propertyValue['type'] != 'PropertyValue': - continue - propertyValue['value'] = propertyValue['value'].strip() - prefixes = getProtocolPrefixes() - prefixFound = False - for prefix in prefixes: - if propertyValue['value'].startswith(prefix): - prefixFound = True - break - if not prefixFound: - continue - if '.' not in propertyValue['value']: - continue - if ' ' in propertyValue['value']: - continue - if ',' in propertyValue['value']: - continue - return propertyValue['value'] - return '' - - -def getBlogAddress(actorJson: {}) -> str: - """Returns blog address for the given actor - """ - return _getActorPropertyUrl(actorJson, 'Blog') - - def _setActorPropertyUrl(actorJson: {}, propertyName: str, url: str) -> None: """Sets a url for the given actor property """ From c41d1e8b7a035bc45d45227ea4e6ba2093051d32 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 26 Jun 2021 12:27:14 +0100 Subject: [PATCH 1259/1416] Module groups --- newsdaemon.py | 2 +- newswire.py | 2 +- speaker.py | 2 +- webapp_accesskeys.py | 2 +- webapp_column_left.py | 2 +- webapp_column_right.py | 2 +- webapp_frontscreen.py | 2 +- webapp_headerbuttons.py | 2 +- webapp_media.py | 2 +- webapp_minimalbutton.py | 2 +- webapp_moderation.py | 2 +- webapp_welcome.py | 2 +- webapp_welcome_final.py | 2 +- webapp_welcome_profile.py | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/newsdaemon.py b/newsdaemon.py index 79431c794..fda1debc6 100644 --- a/newsdaemon.py +++ b/newsdaemon.py @@ -5,7 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" -__module_group__ = "RSS Feeds" +__module_group__ = "Web Interface Columns" # Example hashtag logic: # diff --git a/newswire.py b/newswire.py index 12daecf28..57b37eb69 100644 --- a/newswire.py +++ b/newswire.py @@ -5,7 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" -__module_group__ = "RSS Feeds" +__module_group__ = "Web Interface Columns" import os import json diff --git a/speaker.py b/speaker.py index 20df16543..2d8d788d1 100644 --- a/speaker.py +++ b/speaker.py @@ -5,7 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" -__module_group__ = "Client" +__module_group__ = "Accessibility" import os import html diff --git a/webapp_accesskeys.py b/webapp_accesskeys.py index 9813a5d46..c901a59c1 100644 --- a/webapp_accesskeys.py +++ b/webapp_accesskeys.py @@ -5,7 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" -__module_group__ = "Web Interface" +__module_group__ = "Accessibility" import os from utils import isAccountDir diff --git a/webapp_column_left.py b/webapp_column_left.py index 6a63126db..b3111b9a2 100644 --- a/webapp_column_left.py +++ b/webapp_column_left.py @@ -5,7 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" -__module_group__ = "Web Interface" +__module_group__ = "Web Interface Columns" import os from utils import getConfigParam diff --git a/webapp_column_right.py b/webapp_column_right.py index 15c95c40a..17d1a0acf 100644 --- a/webapp_column_right.py +++ b/webapp_column_right.py @@ -5,7 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" -__module_group__ = "Web Interface" +__module_group__ = "Web Interface Columns" import os from datetime import datetime diff --git a/webapp_frontscreen.py b/webapp_frontscreen.py index d6e397d10..585489077 100644 --- a/webapp_frontscreen.py +++ b/webapp_frontscreen.py @@ -5,7 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" -__module_group__ = "Web Interface" +__module_group__ = "Timeline" import os from utils import isSystemAccount diff --git a/webapp_headerbuttons.py b/webapp_headerbuttons.py index 825dcc302..99ab01290 100644 --- a/webapp_headerbuttons.py +++ b/webapp_headerbuttons.py @@ -5,7 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" -__module_group__ = "Web Interface" +__module_group__ = "Timeline" import os diff --git a/webapp_media.py b/webapp_media.py index fe6217041..4d5ff6366 100644 --- a/webapp_media.py +++ b/webapp_media.py @@ -5,7 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" -__module_group__ = "Web Interface" +__module_group__ = "Timeline" import os diff --git a/webapp_minimalbutton.py b/webapp_minimalbutton.py index 3b1815f36..3c293528a 100644 --- a/webapp_minimalbutton.py +++ b/webapp_minimalbutton.py @@ -5,7 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" -__module_group__ = "Web Interface" +__module_group__ = "Timeline" import os diff --git a/webapp_moderation.py b/webapp_moderation.py index 01bddd2ad..7a2c696e7 100644 --- a/webapp_moderation.py +++ b/webapp_moderation.py @@ -5,7 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" -__module_group__ = "Web Interface" +__module_group__ = "Moderation" import os from utils import isAccountDir diff --git a/webapp_welcome.py b/webapp_welcome.py index c1e804a82..0e970fc5b 100644 --- a/webapp_welcome.py +++ b/webapp_welcome.py @@ -5,7 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" -__module_group__ = "Web Interface" +__module_group__ = "Onboarding" import os from shutil import copyfile diff --git a/webapp_welcome_final.py b/webapp_welcome_final.py index 01349aa28..0b6491c47 100644 --- a/webapp_welcome_final.py +++ b/webapp_welcome_final.py @@ -5,7 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" -__module_group__ = "Web Interface" +__module_group__ = "Onboarding" import os from shutil import copyfile diff --git a/webapp_welcome_profile.py b/webapp_welcome_profile.py index 990c88fe2..1362aa344 100644 --- a/webapp_welcome_profile.py +++ b/webapp_welcome_profile.py @@ -5,7 +5,7 @@ __version__ = "1.2.0" __maintainer__ = "Bob Mottram" __email__ = "bob@freedombone.net" __status__ = "Production" -__module_group__ = "Web Interface" +__module_group__ = "Onboarding" import os from shutil import copyfile From 0ae0208260899e25ff431b11eb7c57cea1234dc7 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 26 Jun 2021 14:46:22 +0100 Subject: [PATCH 1260/1416] Separate group diagrams --- tests.py | 139 +++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 94 insertions(+), 45 deletions(-) diff --git a/tests.py b/tests.py index 40098610f..55bd01b1c 100644 --- a/tests.py +++ b/tests.py @@ -2890,6 +2890,89 @@ def _functionArgsMatch(callArgs: [], funcArgs: []): return callArgsCtr >= funcArgsCtr +def _moduleInGroups(modName: str, includeGroups: [], modGroups: {}) -> bool: + """Is the given module within the included groups list? + """ + for groupName in includeGroups: + if modName in modGroups[groupName]: + return True + return False + + +def _diagramGroups(includeGroups: [], + modules: {}, modGroups: {}, + maxModuleCalls: int) -> None: + """Draws a dot diagram containing only the given module groups + """ + callGraphStr = 'digraph EpicyonGroups {\n\n' + callGraphStr += ' graph [fontsize=10 fontname="Verdana" compound=true];\n' + callGraphStr += ' node [fontsize=10 fontname="Verdana"];\n\n' + excludeModulesFromDiagram = ( + 'setup', 'tests', '__init__' + ) + # colors of modules nodes + for modName, modProperties in modules.items(): + if modName in excludeModulesFromDiagram: + continue + if not _moduleInGroups(modName, includeGroups, modGroups): + continue + if not modProperties.get('calls'): + callGraphStr += ' "' + modName + \ + '" [fillcolor=yellow style=filled];\n' + continue + if len(modProperties['calls']) <= int(maxModuleCalls / 8): + callGraphStr += ' "' + modName + \ + '" [fillcolor=green style=filled];\n' + elif len(modProperties['calls']) < int(maxModuleCalls / 4): + callGraphStr += ' "' + modName + \ + '" [fillcolor=orange style=filled];\n' + else: + callGraphStr += ' "' + modName + \ + '" [fillcolor=red style=filled];\n' + callGraphStr += '\n' + # connections between modules + for modName, modProperties in modules.items(): + if modName in excludeModulesFromDiagram: + continue + if not _moduleInGroups(modName, includeGroups, modGroups): + continue + if not modProperties.get('calls'): + continue + for modCall in modProperties['calls']: + if modCall in excludeModulesFromDiagram: + continue + if not _moduleInGroups(modCall, includeGroups, modGroups): + continue + callGraphStr += ' "' + modName + '" -> "' + modCall + '";\n' + # module groups/clusters + clusterCtr = 1 + for groupName, groupModules in modGroups.items(): + if groupName not in includeGroups: + continue + callGraphStr += '\n' + callGraphStr += \ + ' subgraph cluster_' + str(clusterCtr) + ' {\n' + callGraphStr += ' node [style=filled];\n' + for modName in groupModules: + if modName not in excludeModulesFromDiagram: + callGraphStr += ' ' + modName + ';\n' + callGraphStr += ' label = "' + groupName + '";\n' + callGraphStr += ' color = blue;\n' + callGraphStr += ' }\n' + clusterCtr += 1 + callGraphStr += '\n}\n' + filename = 'epicyon_groups' + for groupName in includeGroups: + filename += '_' + groupName.replace(' ', '-') + filename += '.dot' + with open(filename, 'w+') as fp: + fp.write(callGraphStr) + print('Graph saved to ' + filename) + print('Plot using: ' + + 'sfdp -x -Goverlap=false -Goverlap_scaling=2 ' + + '-Gsep=+100 -Tx11 epicyon_modules.dot') + + def _testFunctions(): print('testFunctions') function = {} @@ -3139,51 +3222,17 @@ def _testFunctions(): else: modules[modName]['calls'] = [modCall] lineCtr += 1 - callGraphStr = 'digraph EpicyonModules {\n\n' - callGraphStr += ' graph [fontsize=10 fontname="Verdana" compound=true];\n' - callGraphStr += ' node [shape=record fontsize=10 fontname="Verdana"];\n\n' - # colors of modules nodes - for modName, modProperties in modules.items(): - if not modProperties.get('calls'): - callGraphStr += ' "' + modName + \ - '" [fillcolor=yellow style=filled];\n' - continue - if len(modProperties['calls']) <= int(maxModuleCalls / 8): - callGraphStr += ' "' + modName + \ - '" [fillcolor=green style=filled];\n' - elif len(modProperties['calls']) < int(maxModuleCalls / 4): - callGraphStr += ' "' + modName + \ - '" [fillcolor=orange style=filled];\n' - else: - callGraphStr += ' "' + modName + \ - '" [fillcolor=red style=filled];\n' - callGraphStr += '\n' - # connections between modules - for modName, modProperties in modules.items(): - if not modProperties.get('calls'): - continue - for modCall in modProperties['calls']: - callGraphStr += ' "' + modName + '" -> "' + modCall + '";\n' - # module groups/clusters - clusterCtr = 1 - for groupName, groupModules in modGroups.items(): - callGraphStr += '\n' - callGraphStr += \ - ' subgraph cluster_' + str(clusterCtr) + ' {\n' - callGraphStr += ' node [style=filled];\n' - for modName in groupModules: - callGraphStr += ' ' + modName + ';\n' - callGraphStr += ' label = "' + groupName + '";\n' - callGraphStr += ' color = blue;\n' - callGraphStr += ' }\n' - clusterCtr += 1 - callGraphStr += '\n}\n' - with open('epicyon_modules.dot', 'w+') as fp: - fp.write(callGraphStr) - print('Modules call graph saved to epicyon_modules.dot') - print('Plot using: ' + - 'sfdp -x -Goverlap=false -Goverlap_scaling=2 ' + - '-Gsep=+100 -Tx11 epicyon_modules.dot') + + _diagramGroups(['Commandline Interface', 'ActivityPub', 'Core'], + modules, modGroups, maxModuleCalls) + _diagramGroups(['Timeline', 'Core'], + modules, modGroups, maxModuleCalls) + _diagramGroups(['Web Interface', 'Core'], + modules, modGroups, maxModuleCalls) + _diagramGroups(['Web Interface Columns', 'Core'], + modules, modGroups, maxModuleCalls) + _diagramGroups(['Core'], + modules, modGroups, maxModuleCalls) callGraphStr = 'digraph Epicyon {\n\n' callGraphStr += ' size="8,6"; ratio=fill;\n' From c37f3ac004fe1f61d057e02abb4051ab449efb4a Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 26 Jun 2021 15:21:24 +0100 Subject: [PATCH 1261/1416] Extra architecture graphs --- announce.py | 2 +- blocking.py | 2 +- bookmarks.py | 2 +- content.py | 2 +- delete.py | 2 +- domainhandler.py | 32 -------------------------------- epicyon.py | 4 ++-- follow.py | 2 +- followingCalendar.py | 15 +++++++++++++-- inbox.py | 4 ++-- like.py | 2 +- manualapprove.py | 4 ++-- person.py | 2 +- posts.py | 4 ++-- roles.py | 2 +- shares.py | 2 +- tests.py | 22 +++++++++++++++------- utils.py | 26 ++++++++++++++++++++++++-- webapp_calendar.py | 2 +- webapp_column_left.py | 2 +- webapp_column_right.py | 2 +- webfinger.py | 2 +- 22 files changed, 74 insertions(+), 65 deletions(-) delete mode 100644 domainhandler.py diff --git a/announce.py b/announce.py index f39732979..814728c15 100644 --- a/announce.py +++ b/announce.py @@ -7,7 +7,7 @@ __email__ = "bob@freedombone.net" __status__ = "Production" __module_group__ = "ActivityPub" -from domainhandler import removeDomainPort +from utils import removeDomainPort from utils import hasObjectDict from utils import removeIdEnding from utils import hasUsersPath diff --git a/blocking.py b/blocking.py index 0c81fcd8a..128209aaa 100644 --- a/blocking.py +++ b/blocking.py @@ -11,7 +11,7 @@ import os import json import time from datetime import datetime -from domainhandler import removeDomainPort +from utils import removeDomainPort from utils import hasObjectDict from utils import isAccountDir from utils import getCachedPostFilename diff --git a/bookmarks.py b/bookmarks.py index 414f748bd..5cee25bc1 100644 --- a/bookmarks.py +++ b/bookmarks.py @@ -11,7 +11,7 @@ import os from pprint import pprint from webfinger import webfingerHandle from auth import createBasicAuthHeader -from domainhandler import removeDomainPort +from utils import removeDomainPort from utils import hasUsersPath from utils import getFullDomain from utils import removeIdEnding diff --git a/content.py b/content.py index be1eec89d..85f233767 100644 --- a/content.py +++ b/content.py @@ -11,7 +11,7 @@ import os import email.parser import urllib.parse from shutil import copyfile -from domainhandler import removeDomainPort +from utils import removeDomainPort from utils import isValidLanguage from utils import getImageExtensions from utils import loadJson diff --git a/delete.py b/delete.py index b51d5c7a0..834e8c46e 100644 --- a/delete.py +++ b/delete.py @@ -9,7 +9,7 @@ __module_group__ = "ActivityPub" import os from datetime import datetime -from domainhandler import removeDomainPort +from utils import removeDomainPort from utils import hasUsersPath from utils import getFullDomain from utils import removeIdEnding diff --git a/domainhandler.py b/domainhandler.py deleted file mode 100644 index b7875b32a..000000000 --- a/domainhandler.py +++ /dev/null @@ -1,32 +0,0 @@ -__filename__ = "domainhandler.py" -__author__ = "Bob Mottram" -__license__ = "AGPL3+" -__version__ = "1.2.0" -__maintainer__ = "Bob Mottram" -__email__ = "bob@freedombone.net" -__status__ = "Production" -__module_group__ = "Core" - - -def removeDomainPort(domain: str) -> str: - """If the domain has a port appended then remove it - eg. mydomain.com:80 becomes mydomain.com - """ - if ':' in domain: - if domain.startswith('did:'): - return domain - domain = domain.split(':')[0] - return domain - - -def getPortFromDomain(domain: str) -> int: - """If the domain has a port number appended then return it - eg. mydomain.com:80 returns 80 - """ - if ':' in domain: - if domain.startswith('did:'): - return None - portStr = domain.split(':')[1] - if portStr.isdigit(): - return int(portStr) - return None diff --git a/epicyon.py b/epicyon.py index 6e4abafdb..aa3966cea 100644 --- a/epicyon.py +++ b/epicyon.py @@ -61,8 +61,8 @@ from tests import testUpdateActor from tests import runAllTests from auth import storeBasicCredentials from auth import createPassword -from domainhandler import removeDomainPort -from domainhandler import getPortFromDomain +from utils import removeDomainPort +from utils import getPortFromDomain from utils import hasUsersPath from utils import getFullDomain from utils import setConfigParam diff --git a/follow.py b/follow.py index 2745c8ec5..096394dd4 100644 --- a/follow.py +++ b/follow.py @@ -9,7 +9,7 @@ __module_group__ = "ActivityPub" from pprint import pprint import os -from domainhandler import removeDomainPort +from utils import removeDomainPort from utils import hasObjectDict from utils import hasUsersPath from utils import getFullDomain diff --git a/followingCalendar.py b/followingCalendar.py index 68bef2973..af38b10b0 100644 --- a/followingCalendar.py +++ b/followingCalendar.py @@ -8,7 +8,18 @@ __status__ = "Production" __module_group__ = "Calendar" import os -from domainhandler import removeDomainPort + + +def _portDomainRemove(domain: str) -> str: + """If the domain has a port appended then remove it + eg. mydomain.com:80 becomes mydomain.com + same as removeDomainPort in utils.py + """ + if ':' in domain: + if domain.startswith('did:'): + return domain + domain = domain.split(':')[0] + return domain def receivingCalendarEvents(baseDir: str, nickname: str, domain: str, @@ -44,7 +55,7 @@ def _receiveCalendarEvents(baseDir: str, nickname: str, domain: str, indicating whether to receive calendar events from that account """ # check that a following file exists - domain = removeDomainPort(domain) + domain = _portDomainRemove(domain) followingFilename = baseDir + '/accounts/' + \ nickname + '@' + domain + '/following.txt' if not os.path.isfile(followingFilename): diff --git a/inbox.py b/inbox.py index 1f5c86e18..cbc5f2da6 100644 --- a/inbox.py +++ b/inbox.py @@ -13,8 +13,8 @@ import datetime import time import random from linked_data_sig import verifyJsonSignature -from domainhandler import removeDomainPort -from domainhandler import getPortFromDomain +from utils import removeDomainPort +from utils import getPortFromDomain from utils import hasObjectDict from utils import dmAllowedFromDomain from utils import isRecentPost diff --git a/like.py b/like.py index ee42afead..ad0bff5da 100644 --- a/like.py +++ b/like.py @@ -7,7 +7,7 @@ __email__ = "bob@freedombone.net" __status__ = "Production" __module_group__ = "ActivityPub" -from domainhandler import removeDomainPort +from utils import removeDomainPort from utils import hasObjectDict from utils import hasUsersPath from utils import getFullDomain diff --git a/manualapprove.py b/manualapprove.py index 91c78ffac..91948a344 100644 --- a/manualapprove.py +++ b/manualapprove.py @@ -12,8 +12,8 @@ from follow import followedAccountAccepts from follow import followedAccountRejects from follow import removeFromFollowRequests from utils import loadJson -from domainhandler import removeDomainPort -from domainhandler import getPortFromDomain +from utils import removeDomainPort +from utils import getPortFromDomain def manualDenyFollowRequest(session, baseDir: str, diff --git a/person.py b/person.py index e148397e2..2f5b357c2 100644 --- a/person.py +++ b/person.py @@ -38,7 +38,7 @@ from roles import setRole from roles import setRolesFromList from roles import getActorRolesList from media import processMetaData -from domainhandler import removeDomainPort +from utils import removeDomainPort from utils import getStatusNumber from utils import getFullDomain from utils import validNickname diff --git a/posts.py b/posts.py index 41713a7cc..230b7d72f 100644 --- a/posts.py +++ b/posts.py @@ -32,8 +32,8 @@ from session import postImage from webfinger import webfingerHandle from httpsig import createSignedHeader from siteactive import siteIsActive -from domainhandler import removeDomainPort -from domainhandler import getPortFromDomain +from utils import removeDomainPort +from utils import getPortFromDomain from utils import hasObjectDict from utils import rejectPostId from utils import removeInvalidChars diff --git a/roles.py b/roles.py index 7f9010c67..7fb00e38a 100644 --- a/roles.py +++ b/roles.py @@ -11,7 +11,7 @@ import os from utils import loadJson from utils import saveJson from utils import getStatusNumber -from domainhandler import removeDomainPort +from utils import removeDomainPort def _clearRoleStatus(baseDir: str, role: str) -> None: diff --git a/shares.py b/shares.py index 488a276fb..2a2261c7c 100644 --- a/shares.py +++ b/shares.py @@ -20,7 +20,7 @@ from utils import loadJson from utils import saveJson from utils import getImageExtensions from utils import hasObjectDict -from domainhandler import removeDomainPort +from utils import removeDomainPort from media import processMetaData diff --git a/tests.py b/tests.py index 55bd01b1c..d16baa84c 100644 --- a/tests.py +++ b/tests.py @@ -2900,6 +2900,7 @@ def _moduleInGroups(modName: str, includeGroups: [], modGroups: {}) -> bool: def _diagramGroups(includeGroups: [], + excludeExtraModules: [], modules: {}, modGroups: {}, maxModuleCalls: int) -> None: """Draws a dot diagram containing only the given module groups @@ -2907,9 +2908,10 @@ def _diagramGroups(includeGroups: [], callGraphStr = 'digraph EpicyonGroups {\n\n' callGraphStr += ' graph [fontsize=10 fontname="Verdana" compound=true];\n' callGraphStr += ' node [fontsize=10 fontname="Verdana"];\n\n' - excludeModulesFromDiagram = ( + excludeModulesFromDiagram = [ 'setup', 'tests', '__init__' - ) + ] + excludeModulesFromDiagram += excludeExtraModules # colors of modules nodes for modName, modProperties in modules.items(): if modName in excludeModulesFromDiagram: @@ -3223,15 +3225,21 @@ def _testFunctions(): modules[modName]['calls'] = [modCall] lineCtr += 1 - _diagramGroups(['Commandline Interface', 'ActivityPub', 'Core'], + _diagramGroups(['Commandline Interface', 'ActivityPub'], ['utils'], modules, modGroups, maxModuleCalls) - _diagramGroups(['Timeline', 'Core'], + _diagramGroups(['Commandline Interface', 'Core'], ['utils'], modules, modGroups, maxModuleCalls) - _diagramGroups(['Web Interface', 'Core'], + _diagramGroups(['Timeline', 'Core'], ['utils'], modules, modGroups, maxModuleCalls) - _diagramGroups(['Web Interface Columns', 'Core'], + _diagramGroups(['Web Interface', 'Core'], ['utils'], modules, modGroups, maxModuleCalls) - _diagramGroups(['Core'], + _diagramGroups(['Web Interface Columns', 'Core'], ['utils'], + modules, modGroups, maxModuleCalls) + _diagramGroups(['Core'], [], + modules, modGroups, maxModuleCalls) + _diagramGroups(['ActivityPub'], [], + modules, modGroups, maxModuleCalls) + _diagramGroups(['ActivityPub', 'Core'], ['utils'], modules, modGroups, maxModuleCalls) callGraphStr = 'digraph Epicyon {\n\n' diff --git a/utils.py b/utils.py index 5562aa794..c2a79642f 100644 --- a/utils.py +++ b/utils.py @@ -16,8 +16,6 @@ import json import idna import locale from pprint import pprint -from domainhandler import removeDomainPort -from domainhandler import getPortFromDomain from followingCalendar import addPersonToCalendar from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import hashes @@ -2453,3 +2451,27 @@ def getActorPropertyUrl(actorJson: {}, propertyName: str) -> str: continue return propertyValue['value'] return '' + + +def removeDomainPort(domain: str) -> str: + """If the domain has a port appended then remove it + eg. mydomain.com:80 becomes mydomain.com + """ + if ':' in domain: + if domain.startswith('did:'): + return domain + domain = domain.split(':')[0] + return domain + + +def getPortFromDomain(domain: str) -> int: + """If the domain has a port number appended then return it + eg. mydomain.com:80 returns 80 + """ + if ':' in domain: + if domain.startswith('did:'): + return None + portStr = domain.split(':')[1] + if portStr.isdigit(): + return int(portStr) + return None diff --git a/webapp_calendar.py b/webapp_calendar.py index 14dbec8ca..65cdb7de0 100644 --- a/webapp_calendar.py +++ b/webapp_calendar.py @@ -19,7 +19,7 @@ from utils import locatePost from utils import loadJson from utils import weekDayOfMonthStart from utils import getAltPath -from domainhandler import removeDomainPort +from utils import removeDomainPort from happening import getTodaysEvents from happening import getCalendarEvents from webapp_utils import htmlHeaderWithExternalStyle diff --git a/webapp_column_left.py b/webapp_column_left.py index b3111b9a2..eea4ace02 100644 --- a/webapp_column_left.py +++ b/webapp_column_left.py @@ -11,7 +11,7 @@ import os from utils import getConfigParam from utils import getNicknameFromActor from utils import isEditor -from domainhandler import removeDomainPort +from utils import removeDomainPort from webapp_utils import sharesTimelineJson from webapp_utils import htmlPostSeparator from webapp_utils import getLeftImageFile diff --git a/webapp_column_right.py b/webapp_column_right.py index 17d1a0acf..3ea61e1c9 100644 --- a/webapp_column_right.py +++ b/webapp_column_right.py @@ -17,7 +17,7 @@ from utils import votesOnNewswireItem from utils import getNicknameFromActor from utils import isEditor from utils import getConfigParam -from domainhandler import removeDomainPort +from utils import removeDomainPort from posts import isModerator from webapp_utils import getRightImageFile from webapp_utils import htmlHeaderWithExternalStyle diff --git a/webfinger.py b/webfinger.py index c774a0c85..c82a5199c 100644 --- a/webfinger.py +++ b/webfinger.py @@ -17,7 +17,7 @@ from utils import loadJson from utils import loadJsonOnionify from utils import saveJson from utils import getProtocolPrefixes -from domainhandler import removeDomainPort +from utils import removeDomainPort def _parseHandle(handle: str) -> (str, str): From 5d81337ac463b0bfba6241e68a87eec8796910da Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 26 Jun 2021 16:57:25 +0100 Subject: [PATCH 1262/1416] Diagrams --- tests.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tests.py b/tests.py index d16baa84c..72b6cb741 100644 --- a/tests.py +++ b/tests.py @@ -2909,7 +2909,7 @@ def _diagramGroups(includeGroups: [], callGraphStr += ' graph [fontsize=10 fontname="Verdana" compound=true];\n' callGraphStr += ' node [fontsize=10 fontname="Verdana"];\n\n' excludeModulesFromDiagram = [ - 'setup', 'tests', '__init__' + 'setup', 'tests', '__init__', 'pyjsonld' ] excludeModulesFromDiagram += excludeExtraModules # colors of modules nodes @@ -3241,6 +3241,12 @@ def _testFunctions(): modules, modGroups, maxModuleCalls) _diagramGroups(['ActivityPub', 'Core'], ['utils'], modules, modGroups, maxModuleCalls) + _diagramGroups(['ActivityPub', 'Security'], ['utils'], + modules, modGroups, maxModuleCalls) + _diagramGroups(['Core', 'Security'], ['utils'], + modules, modGroups, maxModuleCalls) + _diagramGroups(['Timeline', 'Security'], ['utils'], + modules, modGroups, maxModuleCalls) callGraphStr = 'digraph Epicyon {\n\n' callGraphStr += ' size="8,6"; ratio=fill;\n' From 139cffa0d5a9f3e6a7ccb66e936bce9ac660f369 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 26 Jun 2021 20:01:48 +0100 Subject: [PATCH 1263/1416] Show function line lengths --- shares.py | 39 ++++++++++++++++++++++----------------- tests.py | 29 +++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 17 deletions(-) diff --git a/shares.py b/shares.py index 2a2261c7c..b9fac2e41 100644 --- a/shares.py +++ b/shares.py @@ -72,6 +72,27 @@ def removeShare(baseDir: str, nickname: str, domain: str, '" does not exist in ' + sharesFilename) +def _addShareDurationSec(duration: str, published: str) -> int: + """Returns the duration for the shared item in seconds + """ + if ' ' not in duration: + return 0 + durationList = duration.split(' ') + if not durationList[0].isdigit(): + return 0 + if 'hour' in durationList[1]: + return published + (int(durationList[0]) * 60 * 60) + if 'day' in durationList[1]: + return published + (int(durationList[0]) * 60 * 60 * 24) + if 'week' in durationList[1]: + return published + (int(durationList[0]) * 60 * 60 * 24 * 7) + if 'month' in durationList[1]: + return published + (int(durationList[0]) * 60 * 60 * 24 * 30) + if 'year' in durationList[1]: + return published + (int(durationList[0]) * 60 * 60 * 24 * 365) + return 0 + + def addShare(baseDir: str, httpPrefix: str, nickname: str, domain: str, port: int, displayName: str, summary: str, imageFilename: str, @@ -86,24 +107,8 @@ def addShare(baseDir: str, sharesJson = loadJson(sharesFilename) duration = duration.lower() - durationSec = 0 published = int(time.time()) - if ' ' in duration: - durationList = duration.split(' ') - if durationList[0].isdigit(): - if 'hour' in durationList[1]: - durationSec = published + (int(durationList[0]) * 60 * 60) - if 'day' in durationList[1]: - durationSec = published + (int(durationList[0]) * 60 * 60 * 24) - if 'week' in durationList[1]: - durationSec = \ - published + (int(durationList[0]) * 60 * 60 * 24 * 7) - if 'month' in durationList[1]: - durationSec = \ - published + (int(durationList[0]) * 60 * 60 * 24 * 30) - if 'year' in durationList[1]: - durationSec = \ - published + (int(durationList[0]) * 60 * 60 * 24 * 365) + durationSec = _addShareDurationSec(duration, published) itemID = getValidSharedItemID(displayName) diff --git a/tests.py b/tests.py index 72b6cb741..7ccfbd7e1 100644 --- a/tests.py +++ b/tests.py @@ -2981,6 +2981,7 @@ def _testFunctions(): functionProperties = {} modules = {} modGroups = {} + methodLOC = [] for subdir, dirs, files in os.walk('.'): for sourceFile in files: @@ -2997,6 +2998,9 @@ def _testFunctions(): with open(sourceFile, "r") as f: lines = f.readlines() modules[modName]['lines'] = lines + lineCount = 0 + prevLine = 'start' + methodName = '' for line in lines: if '__module_group__' in line: if '=' in line: @@ -3010,7 +3014,27 @@ def _testFunctions(): if modName not in modGroups[groupName]: modGroups[groupName].append(modName) if not line.strip().startswith('def '): + if lineCount > 0: + lineCount += 1 + if len(prevLine.strip()) == 0 and \ + len(line.strip()) == 0 and \ + lineCount > 2: + lineCount -= 2 + if lineCount > 80: + locStr = str(lineCount) + ';' + methodName + if lineCount < 1000: + locStr = '0' + locStr + if lineCount < 100: + locStr = '0' + locStr + if lineCount < 10: + locStr = '0' + locStr + if locStr not in methodLOC: + methodLOC.append(locStr) + lineCount = 0 + prevLine = line continue + prevLine = line + lineCount = 1 methodName = line.split('def ', 1)[1].split('(')[0] methodArgs = \ sourceStr.split('def ' + methodName + '(')[1] @@ -3029,6 +3053,11 @@ def _testFunctions(): } break + print('LOC counts:') + methodLOC.sort() + for locStr in methodLOC: + print(locStr.split(';')[0] + ' ' + locStr.split(';')[1]) + excludeFuncArgs = [ 'pyjsonld' ] From c5815a2564bb38061588147ab6305b678da5c6ca Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 26 Jun 2021 22:29:49 +0100 Subject: [PATCH 1264/1416] Tidying --- posts.py | 42 +++++++++++++++++++++++++++--------------- tests.py | 14 ++++++++++++++ 2 files changed, 41 insertions(+), 15 deletions(-) diff --git a/posts.py b/posts.py index 230b7d72f..22bb0cf4a 100644 --- a/posts.py +++ b/posts.py @@ -852,6 +852,30 @@ def _addAutoCW(baseDir: str, nickname: str, domain: str, return newSubject +def _createPostCWFromReply(baseDir: str, nickname: str, domain: str, + inReplyTo: str, + sensitive: bool, summary: str) -> (bool, str): + """If this is a reply and the original post has a CW + then use the same CW + """ + if inReplyTo and not sensitive: + # locate the post which this is a reply to and check if + # it has a content warning. If it does then reproduce + # the same warning + replyPostFilename = \ + locatePost(baseDir, nickname, domain, inReplyTo) + if replyPostFilename: + replyToJson = loadJson(replyPostFilename) + if replyToJson: + if replyToJson.get('object'): + if replyToJson['object'].get('sensitive'): + if replyToJson['object']['sensitive']: + sensitive = True + if replyToJson['object'].get('summary'): + summary = replyToJson['object']['summary'] + return sensitive, summary + + def _createPostBase(baseDir: str, nickname: str, domain: str, port: int, toUrl: str, ccUrl: str, httpPrefix: str, content: str, followersOnly: bool, saveToFile: bool, @@ -952,21 +976,9 @@ def _createPostBase(baseDir: str, nickname: str, domain: str, port: int, _updateHashtagsIndex(baseDir, tag, newPostId) # print('Content tags: ' + str(tags)) - if inReplyTo and not sensitive: - # locate the post which this is a reply to and check if - # it has a content warning. If it does then reproduce - # the same warning - replyPostFilename = \ - locatePost(baseDir, nickname, domain, inReplyTo) - if replyPostFilename: - replyToJson = loadJson(replyPostFilename) - if replyToJson: - if replyToJson.get('object'): - if replyToJson['object'].get('sensitive'): - if replyToJson['object']['sensitive']: - sensitive = True - if replyToJson['object'].get('summary'): - summary = replyToJson['object']['summary'] + sensitive, summary = \ + _createPostCWFromReply(baseDir, nickname, domain, + inReplyTo, sensitive, summary) # get the ending date and time endDateStr = None diff --git a/tests.py b/tests.py index 7ccfbd7e1..cefa769d7 100644 --- a/tests.py +++ b/tests.py @@ -3016,6 +3016,7 @@ def _testFunctions(): if not line.strip().startswith('def '): if lineCount > 0: lineCount += 1 + # add LOC count for this function if len(prevLine.strip()) == 0 and \ len(line.strip()) == 0 and \ lineCount > 2: @@ -3051,6 +3052,19 @@ def _testFunctions(): "module": modName, "calledInModule": [] } + # LOC count for the last function + if lineCount > 2: + lineCount -= 2 + if lineCount > 80: + locStr = str(lineCount) + ';' + methodName + if lineCount < 1000: + locStr = '0' + locStr + if lineCount < 100: + locStr = '0' + locStr + if lineCount < 10: + locStr = '0' + locStr + if locStr not in methodLOC: + methodLOC.append(locStr) break print('LOC counts:') From a21fa28587d3404666ee167140c3b61c3a518288 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 27 Jun 2021 11:19:14 +0100 Subject: [PATCH 1265/1416] Roadmap --- README_roadmap.md | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/README_roadmap.md b/README_roadmap.md index 62b2ba3ba..bfc0ddc4f 100644 --- a/README_roadmap.md +++ b/README_roadmap.md @@ -1,22 +1,24 @@ -# Roadman +# Roadmap ## UX - * Change animation on buttons (themeable?) + * Minimize button shows different icons or highlighting + * Layout of buttons on person options screen -## Teams +## Groups - * Test groups + * Unit test for group creation * Groups can be defined as having particular roles/skills - * Templates for different group organizations -## Events +## Questions - * Events timeline - * Events appear on calendar - * Check compatibility with Mobilizon + * Still not implemented ideally + * Instance-only questions + * Active polls screen? + * Questions more integrated into overall organization ## Code - * Modularize daemon - * Move modules out of the daemon - * Make comment notes linking daemon functions to webinterface \ No newline at end of file + * More unit test coverage + * Break up large functions into smaller ones + * Architecture diagrams + * Code documentation? From 29cb994b31dbcefa0531fbf2170165f5fe1152e4 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 27 Jun 2021 12:48:03 +0100 Subject: [PATCH 1266/1416] cwtch address in profile --- cwtch.py | 92 ++++++++++++++++++++++++++++++++++++++++ daemon.py | 18 +++++++- webapp_person_options.py | 4 ++ webapp_profile.py | 14 +++++- 4 files changed, 126 insertions(+), 2 deletions(-) create mode 100644 cwtch.py diff --git a/cwtch.py b/cwtch.py new file mode 100644 index 000000000..9619067f1 --- /dev/null +++ b/cwtch.py @@ -0,0 +1,92 @@ +__filename__ = "cwtch.py" +__author__ = "Bob Mottram" +__license__ = "AGPL3+" +__version__ = "1.2.0" +__maintainer__ = "Bob Mottram" +__email__ = "bob@freedombone.net" +__status__ = "Production" +__module_group__ = "Profile Metadata" + +import re + + +def getCwtchAddress(actorJson: {}) -> str: + """Returns cwtch address for the given actor + """ + if not actorJson.get('attachment'): + return '' + for propertyValue in actorJson['attachment']: + if not propertyValue.get('name'): + continue + if not propertyValue['name'].lower().startswith('cwtch'): + continue + if not propertyValue.get('type'): + continue + if not propertyValue.get('value'): + continue + if propertyValue['type'] != 'PropertyValue': + continue + propertyValue['value'] = propertyValue['value'].strip() + if len(propertyValue['value']) < 2: + continue + if '"' in propertyValue['value']: + continue + if ' ' in propertyValue['value']: + continue + if ',' in propertyValue['value']: + continue + if '.' in propertyValue['value']: + continue + return propertyValue['value'] + return '' + + +def setCwtchAddress(actorJson: {}, cwtchAddress: str) -> None: + """Sets an cwtch address for the given actor + """ + notCwtchAddress = False + + if len(cwtchAddress) < 56: + notCwtchAddress = True + if cwtchAddress != cwtchAddress.lower(): + notCwtchAddress = True + if not re.match("^[a-z0-9]*$", cwtchAddress): + notCwtchAddress = True + + if not actorJson.get('attachment'): + actorJson['attachment'] = [] + + # remove any existing value + propertyFound = None + for propertyValue in actorJson['attachment']: + if not propertyValue.get('name'): + continue + if not propertyValue.get('type'): + continue + if not propertyValue['name'].lower().startswith('cwtch'): + continue + propertyFound = propertyValue + break + if propertyFound: + actorJson['attachment'].remove(propertyFound) + if notCwtchAddress: + return + + for propertyValue in actorJson['attachment']: + if not propertyValue.get('name'): + continue + if not propertyValue.get('type'): + continue + if not propertyValue['name'].lower().startswith('cwtch'): + continue + if propertyValue['type'] != 'PropertyValue': + continue + propertyValue['value'] = cwtchAddress + return + + newCwtchAddress = { + "name": "Cwtch", + "type": "PropertyValue", + "value": cwtchAddress + } + actorJson['attachment'].append(newCwtchAddress) diff --git a/daemon.py b/daemon.py index 69795fab2..b3904bf63 100644 --- a/daemon.py +++ b/daemon.py @@ -44,6 +44,8 @@ from briar import getBriarAddress from briar import setBriarAddress from jami import getJamiAddress from jami import setJamiAddress +from cwtch import getCwtchAddress +from cwtch import setCwtchAddress from matrix import getMatrixAddress from matrix import setMatrixAddress from donate import getDonationUrl @@ -4517,6 +4519,18 @@ class PubServer(BaseHTTPRequestHandler): setJamiAddress(actorJson, '') actorChanged = True + # change cwtch address + currentCwtchAddress = getCwtchAddress(actorJson) + if fields.get('cwtchAddress'): + if fields['cwtchAddress'] != currentCwtchAddress: + setCwtchAddress(actorJson, + fields['cwtchAddress']) + actorChanged = True + else: + if currentCwtchAddress: + setCwtchAddress(actorJson, '') + actorChanged = True + # change PGP public key currentPGPpubKey = getPGPpubKey(actorJson) if fields.get('pgp'): @@ -5811,6 +5825,7 @@ class PubServer(BaseHTTPRequestHandler): toxAddress = None briarAddress = None jamiAddress = None + cwtchAddress = None ssbAddress = None emailAddress = None lockedAccount = False @@ -5832,6 +5847,7 @@ class PubServer(BaseHTTPRequestHandler): toxAddress = getToxAddress(actorJson) briarAddress = getBriarAddress(actorJson) jamiAddress = getJamiAddress(actorJson) + cwtchAddress = getCwtchAddress(actorJson) emailAddress = getEmailAddress(actorJson) PGPpubKey = getPGPpubKey(actorJson) PGPfingerprint = getPGPfingerprint(actorJson) @@ -5866,7 +5882,7 @@ class PubServer(BaseHTTPRequestHandler): xmppAddress, matrixAddress, ssbAddress, blogAddress, toxAddress, briarAddress, - jamiAddress, + jamiAddress, cwtchAddress, PGPpubKey, PGPfingerprint, emailAddress, self.server.dormantMonths, diff --git a/webapp_person_options.py b/webapp_person_options.py index 026182d8f..35ac8708e 100644 --- a/webapp_person_options.py +++ b/webapp_person_options.py @@ -45,6 +45,7 @@ def htmlPersonOptions(defaultTimeline: str, toxAddress: str, briarAddress: str, jamiAddress: str, + cwtchAddress: str, PGPpubKey: str, PGPfingerprint: str, emailAddress: str, @@ -214,6 +215,9 @@ def htmlPersonOptions(defaultTimeline: str, if jamiAddress: optionsStr += \ '

Jami: ' + removeHtml(jamiAddress) + '

\n' + if cwtchAddress: + optionsStr += \ + '

Cwtch: ' + removeHtml(cwtchAddress) + '

\n' if PGPfingerprint: optionsStr += '

PGP: ' + \ removeHtml(PGPfingerprint).replace('\n', '
') + '

\n' diff --git a/webapp_profile.py b/webapp_profile.py index ca6d6e9fb..28247ded8 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -40,6 +40,7 @@ from pgp import getPGPpubKey from tox import getToxAddress from briar import getBriarAddress from jami import getJamiAddress +from cwtch import getCwtchAddress from filters import isFiltered from follow import isFollowerOfPerson from webapp_frontscreen import htmlFrontScreen @@ -517,9 +518,10 @@ def htmlProfile(rssIconAtTop: bool, toxAddress = getToxAddress(profileJson) briarAddress = getBriarAddress(profileJson) jamiAddress = getJamiAddress(profileJson) + cwtchAddress = getCwtchAddress(profileJson) if donateUrl or xmppAddress or matrixAddress or \ ssbAddress or toxAddress or briarAddress or \ - jamiAddress or PGPpubKey or \ + jamiAddress or cwtchAddress or PGPpubKey or \ PGPfingerprint or emailAddress: donateSection = '
\n' donateSection += '
\n' @@ -560,6 +562,10 @@ def htmlProfile(rssIconAtTop: bool, donateSection += \ '

Jami:

\n' + if cwtchAddress: + donateSection += \ + '

Cwtch:

\n' if PGPfingerprint: donateSection += \ '

PGP: ' + \ @@ -1063,6 +1069,7 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, toxAddress = getToxAddress(actorJson) briarAddress = getBriarAddress(actorJson) jamiAddress = getJamiAddress(actorJson) + cwtchAddress = getCwtchAddress(actorJson) emailAddress = getEmailAddress(actorJson) PGPpubKey = getPGPpubKey(actorJson) PGPfingerprint = getPGPfingerprint(actorJson) @@ -1698,6 +1705,11 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, ' \n' + editProfileForm += '
\n' + editProfileForm += \ + ' \n' + editProfileForm += \ '
\n' From 810f4986c96ac28d5908163004f8b5bf9b9306bb Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 27 Jun 2021 15:58:54 +0100 Subject: [PATCH 1267/1416] Simplify the main new post construction function --- posts.py | 301 +++++++++++++++++++++++++++---------------------------- 1 file changed, 145 insertions(+), 156 deletions(-) diff --git a/posts.py b/posts.py index 22bb0cf4a..4376684d9 100644 --- a/posts.py +++ b/posts.py @@ -762,50 +762,6 @@ def _addSchedulePost(baseDir: str, nickname: str, domain: str, scheduleFile.write(indexStr + '\n') -def _appendEventFields(newPost: {}, - eventUUID: str, eventStatus: str, - anonymousParticipationEnabled: bool, - repliesModerationOption: str, - category: str, - joinMode: str, - eventDateStr: str, - endDateStr: str, - location: str, - maximumAttendeeCapacity: int, - ticketUrl: str, - subject: str) -> None: - """Appends Mobilizon-type event fields to a post - """ - if not eventUUID: - return - - # add attributes for Mobilizon-type events - newPost['uuid'] = eventUUID - if eventStatus: - newPost['ical:status'] = eventStatus - if anonymousParticipationEnabled: - newPost['anonymousParticipationEnabled'] = \ - anonymousParticipationEnabled - if repliesModerationOption: - newPost['repliesModerationOption'] = repliesModerationOption - if category: - newPost['category'] = category - if joinMode: - newPost['joinMode'] = joinMode - newPost['startTime'] = eventDateStr - newPost['endTime'] = endDateStr - if location: - newPost['location'] = location - if maximumAttendeeCapacity: - newPost['maximumAttendeeCapacity'] = maximumAttendeeCapacity - if ticketUrl: - newPost['ticketUrl'] = ticketUrl - if subject: - newPost['name'] = subject - newPost['summary'] = None - newPost['sensitive'] = False - - def validContentWarning(cw: str) -> str: """Returns a validated content warning """ @@ -876,6 +832,131 @@ def _createPostCWFromReply(baseDir: str, nickname: str, domain: str, return sensitive, summary +def _createPostS2S(baseDir: str, nickname: str, domain: str, port: int, + httpPrefix: str, content: str, statusNumber: str, + published: str, newPostId: str, postContext: {}, + toRecipients: [], toCC: [], inReplyTo: str, + sensitive: bool, commentsEnabled: bool, + tags: {}, attachImageFilename: str, + mediaType: str, imageDescription: str, city: str, + postObjectType: str, summary: str, + inReplyToAtomUri: str) -> {}: + """Creates a new server-to-server post + """ + actorUrl = httpPrefix + '://' + domain + '/users/' + nickname + idStr = \ + httpPrefix + '://' + domain + '/users/' + nickname + \ + '/statuses/' + statusNumber + '/replies' + newPostUrl = \ + httpPrefix + '://' + domain + '/@' + nickname + '/' + statusNumber + newPostAttributedTo = \ + httpPrefix + '://' + domain + '/users/' + nickname + newPost = { + '@context': postContext, + 'id': newPostId + '/activity', + 'type': 'Create', + 'actor': actorUrl, + 'published': published, + 'to': toRecipients, + 'cc': toCC, + 'object': { + 'id': newPostId, + 'type': postObjectType, + 'summary': summary, + 'inReplyTo': inReplyTo, + 'published': published, + 'url': newPostUrl, + 'attributedTo': newPostAttributedTo, + 'to': toRecipients, + 'cc': toCC, + 'sensitive': sensitive, + 'atomUri': newPostId, + 'inReplyToAtomUri': inReplyToAtomUri, + 'commentsEnabled': commentsEnabled, + 'rejectReplies': not commentsEnabled, + 'mediaType': 'text/html', + 'content': content, + 'contentMap': { + 'en': content + }, + 'attachment': [], + 'tag': tags, + 'replies': { + 'id': idStr, + 'type': 'Collection', + 'first': { + 'type': 'CollectionPage', + 'partOf': idStr, + 'items': [] + } + } + } + } + if attachImageFilename: + newPost['object'] = \ + attachMedia(baseDir, httpPrefix, nickname, domain, port, + newPost['object'], attachImageFilename, + mediaType, imageDescription, city) + return newPost + + +def _createPostC2S(baseDir: str, nickname: str, domain: str, port: int, + httpPrefix: str, content: str, statusNumber: str, + published: str, newPostId: str, postContext: {}, + toRecipients: [], toCC: [], inReplyTo: str, + sensitive: bool, commentsEnabled: bool, + tags: {}, attachImageFilename: str, + mediaType: str, imageDescription: str, city: str, + postObjectType: str, summary: str, + inReplyToAtomUri: str) -> {}: + """Creates a new client-to-server post + """ + idStr = \ + httpPrefix + '://' + domain + '/users/' + nickname + \ + '/statuses/' + statusNumber + '/replies' + newPostUrl = \ + httpPrefix + '://' + domain + '/@' + nickname + '/' + statusNumber + newPost = { + "@context": postContext, + 'id': newPostId, + 'type': postObjectType, + 'summary': summary, + 'inReplyTo': inReplyTo, + 'published': published, + 'url': newPostUrl, + 'attributedTo': httpPrefix + '://' + domain + '/users/' + nickname, + 'to': toRecipients, + 'cc': toCC, + 'sensitive': sensitive, + 'atomUri': newPostId, + 'inReplyToAtomUri': inReplyToAtomUri, + 'commentsEnabled': commentsEnabled, + 'rejectReplies': not commentsEnabled, + 'mediaType': 'text/html', + 'content': content, + 'contentMap': { + 'en': content + }, + 'attachment': [], + 'tag': tags, + 'replies': { + 'id': idStr, + 'type': 'Collection', + 'first': { + 'type': 'CollectionPage', + 'partOf': idStr, + 'items': [] + } + } + } + if attachImageFilename: + newPost = \ + attachMedia(baseDir, httpPrefix, nickname, domain, port, + newPost, attachImageFilename, + mediaType, imageDescription, city) + return newPost + + def _createPostBase(baseDir: str, nickname: str, domain: str, port: int, toUrl: str, ccUrl: str, httpPrefix: str, content: str, followersOnly: bool, saveToFile: bool, @@ -1059,119 +1140,27 @@ def _createPostBase(baseDir: str, nickname: str, domain: str, port: int, postObjectType = 'Article' if not clientToServer: - actorUrl = httpPrefix + '://' + domain + '/users/' + nickname - - idStr = \ - httpPrefix + '://' + domain + '/users/' + nickname + \ - '/statuses/' + statusNumber + '/replies' - newPostUrl = \ - httpPrefix + '://' + domain + '/@' + nickname + '/' + statusNumber - newPostAttributedTo = \ - httpPrefix + '://' + domain + '/users/' + nickname - newPost = { - '@context': postContext, - 'id': newPostId + '/activity', - 'type': 'Create', - 'actor': actorUrl, - 'published': published, - 'to': toRecipients, - 'cc': toCC, - 'object': { - 'id': newPostId, - 'type': postObjectType, - 'summary': summary, - 'inReplyTo': inReplyTo, - 'published': published, - 'url': newPostUrl, - 'attributedTo': newPostAttributedTo, - 'to': toRecipients, - 'cc': toCC, - 'sensitive': sensitive, - 'atomUri': newPostId, - 'inReplyToAtomUri': inReplyToAtomUri, - 'commentsEnabled': commentsEnabled, - 'rejectReplies': not commentsEnabled, - 'mediaType': 'text/html', - 'content': content, - 'contentMap': { - 'en': content - }, - 'attachment': [], - 'tag': tags, - 'replies': { - 'id': idStr, - 'type': 'Collection', - 'first': { - 'type': 'CollectionPage', - 'partOf': idStr, - 'items': [] - } - } - } - } - if attachImageFilename: - newPost['object'] = \ - attachMedia(baseDir, httpPrefix, nickname, domain, port, - newPost['object'], attachImageFilename, - mediaType, imageDescription, city) - _appendEventFields(newPost['object'], eventUUID, eventStatus, - anonymousParticipationEnabled, - repliesModerationOption, - category, joinMode, - eventDateStr, endDateStr, - location, maximumAttendeeCapacity, - ticketUrl, subject) + newPost = \ + _createPostS2S(baseDir, nickname, domain, port, + httpPrefix, content, statusNumber, + published, newPostId, postContext, + toRecipients, toCC, inReplyTo, + sensitive, commentsEnabled, + tags, attachImageFilename, + mediaType, imageDescription, city, + postObjectType, summary, + inReplyToAtomUri) else: - idStr = \ - httpPrefix + '://' + domain + '/users/' + nickname + \ - '/statuses/' + statusNumber + '/replies' - newPostUrl = \ - httpPrefix + '://' + domain + '/@' + nickname + '/' + statusNumber - newPost = { - "@context": postContext, - 'id': newPostId, - 'type': postObjectType, - 'summary': summary, - 'inReplyTo': inReplyTo, - 'published': published, - 'url': newPostUrl, - 'attributedTo': httpPrefix + '://' + domain + '/users/' + nickname, - 'to': toRecipients, - 'cc': toCC, - 'sensitive': sensitive, - 'atomUri': newPostId, - 'inReplyToAtomUri': inReplyToAtomUri, - 'commentsEnabled': commentsEnabled, - 'rejectReplies': not commentsEnabled, - 'mediaType': 'text/html', - 'content': content, - 'contentMap': { - 'en': content - }, - 'attachment': [], - 'tag': tags, - 'replies': { - 'id': idStr, - 'type': 'Collection', - 'first': { - 'type': 'CollectionPage', - 'partOf': idStr, - 'items': [] - } - } - } - if attachImageFilename: - newPost = \ - attachMedia(baseDir, httpPrefix, nickname, domain, port, - newPost, attachImageFilename, - mediaType, imageDescription, city) - _appendEventFields(newPost, eventUUID, eventStatus, - anonymousParticipationEnabled, - repliesModerationOption, - category, joinMode, - eventDateStr, endDateStr, - location, maximumAttendeeCapacity, - ticketUrl, subject) + newPost = \ + _createPostC2S(baseDir, nickname, domain, port, + httpPrefix, content, statusNumber, + published, newPostId, postContext, + toRecipients, toCC, inReplyTo, + sensitive, commentsEnabled, + tags, attachImageFilename, + mediaType, imageDescription, city, + postObjectType, summary, + inReplyToAtomUri) if ccUrl: if len(ccUrl) > 0: newPost['cc'] = [ccUrl] From 3d67188634f80f63a04a3cc61a37b17218165c19 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 27 Jun 2021 15:59:45 +0100 Subject: [PATCH 1268/1416] tags is a list --- posts.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/posts.py b/posts.py index 4376684d9..c887e149e 100644 --- a/posts.py +++ b/posts.py @@ -837,7 +837,7 @@ def _createPostS2S(baseDir: str, nickname: str, domain: str, port: int, published: str, newPostId: str, postContext: {}, toRecipients: [], toCC: [], inReplyTo: str, sensitive: bool, commentsEnabled: bool, - tags: {}, attachImageFilename: str, + tags: [], attachImageFilename: str, mediaType: str, imageDescription: str, city: str, postObjectType: str, summary: str, inReplyToAtomUri: str) -> {}: @@ -905,7 +905,7 @@ def _createPostC2S(baseDir: str, nickname: str, domain: str, port: int, published: str, newPostId: str, postContext: {}, toRecipients: [], toCC: [], inReplyTo: str, sensitive: bool, commentsEnabled: bool, - tags: {}, attachImageFilename: str, + tags: [], attachImageFilename: str, mediaType: str, imageDescription: str, city: str, postObjectType: str, summary: str, inReplyToAtomUri: str) -> {}: From 8d4879818a116c0e4ebd5709a6429b5da846900e Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 27 Jun 2021 16:48:02 +0100 Subject: [PATCH 1269/1416] Separate function for adding place and time to new post --- posts.py | 110 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 63 insertions(+), 47 deletions(-) diff --git a/posts.py b/posts.py index c887e149e..ab14d9276 100644 --- a/posts.py +++ b/posts.py @@ -957,6 +957,64 @@ def _createPostC2S(baseDir: str, nickname: str, domain: str, port: int, return newPost +def _createPostPlaceAndTime(eventDate: str, endDate: str, + eventTime: str, endTime: str, + summary: str, content: str, + schedulePost: bool, + eventUUID: str, + location: str, + tags: []) -> str: + """Adds a place and time to the tags on a new post + """ + endDateStr = None + if endDate: + eventName = summary + if not eventName: + eventName = content + endDateStr = endDate + if endTime: + if endTime.endswith('Z'): + endDateStr = endDate + 'T' + endTime + else: + endDateStr = endDate + 'T' + endTime + \ + ':00' + strftime("%z", gmtime()) + else: + endDateStr = endDate + 'T12:00:00Z' + + # get the starting date and time + eventDateStr = None + if eventDate: + eventName = summary + if not eventName: + eventName = content + eventDateStr = eventDate + if eventTime: + if eventTime.endswith('Z'): + eventDateStr = eventDate + 'T' + eventTime + else: + eventDateStr = eventDate + 'T' + eventTime + \ + ':00' + strftime("%z", gmtime()) + else: + eventDateStr = eventDate + 'T12:00:00Z' + if not endDateStr: + endDateStr = eventDateStr + if not schedulePost and not eventUUID: + tags.append({ + "@context": "https://www.w3.org/ns/activitystreams", + "type": "Event", + "name": eventName, + "startTime": eventDateStr, + "endTime": endDateStr + }) + if location and not eventUUID: + tags.append({ + "@context": "https://www.w3.org/ns/activitystreams", + "type": "Place", + "name": location + }) + return eventDateStr + + def _createPostBase(baseDir: str, nickname: str, domain: str, port: int, toUrl: str, ccUrl: str, httpPrefix: str, content: str, followersOnly: bool, saveToFile: bool, @@ -1061,53 +1119,11 @@ def _createPostBase(baseDir: str, nickname: str, domain: str, port: int, _createPostCWFromReply(baseDir, nickname, domain, inReplyTo, sensitive, summary) - # get the ending date and time - endDateStr = None - if endDate: - eventName = summary - if not eventName: - eventName = content - endDateStr = endDate - if endTime: - if endTime.endswith('Z'): - endDateStr = endDate + 'T' + endTime - else: - endDateStr = endDate + 'T' + endTime + \ - ':00' + strftime("%z", gmtime()) - else: - endDateStr = endDate + 'T12:00:00Z' - - # get the starting date and time - eventDateStr = None - if eventDate: - eventName = summary - if not eventName: - eventName = content - eventDateStr = eventDate - if eventTime: - if eventTime.endswith('Z'): - eventDateStr = eventDate + 'T' + eventTime - else: - eventDateStr = eventDate + 'T' + eventTime + \ - ':00' + strftime("%z", gmtime()) - else: - eventDateStr = eventDate + 'T12:00:00Z' - if not endDateStr: - endDateStr = eventDateStr - if not schedulePost and not eventUUID: - tags.append({ - "@context": "https://www.w3.org/ns/activitystreams", - "type": "Event", - "name": eventName, - "startTime": eventDateStr, - "endTime": endDateStr - }) - if location and not eventUUID: - tags.append({ - "@context": "https://www.w3.org/ns/activitystreams", - "type": "Place", - "name": location - }) + eventDateStr = \ + _createPostPlaceAndTime(eventDate, endDate, + eventTime, endTime, + summary, content, schedulePost, + eventUUID, location, tags) postContext = [ 'https://www.w3.org/ns/activitystreams', From 9907ad65f17180b061c92cd0dcabdcc2a753d255 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 27 Jun 2021 17:12:10 +0100 Subject: [PATCH 1270/1416] Moderation report for new post --- posts.py | 70 ++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 45 insertions(+), 25 deletions(-) diff --git a/posts.py b/posts.py index ab14d9276..8280ccc8c 100644 --- a/posts.py +++ b/posts.py @@ -1015,6 +1015,49 @@ def _createPostPlaceAndTime(eventDate: str, endDate: str, return eventDateStr +def _createPostMentions(ccUrl: str, newPost: {}, + toRecipients: [], tags: []) -> None: + """Updates mentions for a new post + """ + if not ccUrl: + return + if len(ccUrl) == 0: + return + newPost['cc'] = [ccUrl] + if newPost.get('object'): + newPost['object']['cc'] = [ccUrl] + + # if this is a public post then include any mentions in cc + toCC = newPost['object']['cc'] + if len(toRecipients) != 1: + return + if toRecipients[0].endswith('#Public') and \ + ccUrl.endswith('/followers'): + for tag in tags: + if tag['type'] != 'Mention': + continue + if tag['href'] not in toCC: + newPost['object']['cc'].append(tag['href']) + + +def _createPostModReport(baseDir: str, + isModerationReport: bool, newPost: {}, + newPostId: str) -> None: + """ if this is a moderation report then add a status + """ + if not isModerationReport: + return + # add status + if newPost.get('object'): + newPost['object']['moderationStatus'] = 'pending' + else: + newPost['moderationStatus'] = 'pending' + # save to index file + moderationIndexFile = baseDir + '/accounts/moderation.txt' + with open(moderationIndexFile, 'a+') as modFile: + modFile.write(newPostId + '\n') + + def _createPostBase(baseDir: str, nickname: str, domain: str, port: int, toUrl: str, ccUrl: str, httpPrefix: str, content: str, followersOnly: bool, saveToFile: bool, @@ -1177,33 +1220,10 @@ def _createPostBase(baseDir: str, nickname: str, domain: str, port: int, mediaType, imageDescription, city, postObjectType, summary, inReplyToAtomUri) - if ccUrl: - if len(ccUrl) > 0: - newPost['cc'] = [ccUrl] - if newPost.get('object'): - newPost['object']['cc'] = [ccUrl] - # if this is a public post then include any mentions in cc - toCC = newPost['object']['cc'] - if len(toRecipients) == 1: - if toRecipients[0].endswith('#Public') and \ - ccUrl.endswith('/followers'): - for tag in tags: - if tag['type'] == 'Mention': - if tag['href'] not in toCC: - toCC.append(tag['href']) + _createPostMentions(ccUrl, newPost, toRecipients, tags) - # if this is a moderation report then add a status - if isModerationReport: - # add status - if newPost.get('object'): - newPost['object']['moderationStatus'] = 'pending' - else: - newPost['moderationStatus'] = 'pending' - # save to index file - moderationIndexFile = baseDir + '/accounts/moderation.txt' - with open(moderationIndexFile, 'a+') as modFile: - modFile.write(newPostId + '\n') + _createPostModReport(baseDir, isModerationReport, newPost, newPostId) # If a patch has been posted - i.e. the output from # git format-patch - then convert the activitypub type From cc4918f08167b309bf05967c1dff4f1d825ba6c4 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 27 Jun 2021 17:17:43 +0100 Subject: [PATCH 1271/1416] Create default variables --- webapp_profile.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/webapp_profile.py b/webapp_profile.py index 28247ded8..721deabd0 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -1054,6 +1054,8 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, ssbAddress = '' blogAddress = '' toxAddress = '' + jamiAddress = '' + cwtchAddress = '' briarAddress = '' manuallyApprovesFollowers = '' movedTo = '' From de56a843cb037b8045134aa8e893b5fa20b3cbba Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 27 Jun 2021 17:22:55 +0100 Subject: [PATCH 1272/1416] Fewer lines --- webapp_profile.py | 32 ++++++++------------------------ 1 file changed, 8 insertions(+), 24 deletions(-) diff --git a/webapp_profile.py b/webapp_profile.py index 721deabd0..3439a4fd7 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -1034,31 +1034,15 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, bannerFile, bannerFilename = \ getBannerFile(baseDir, nickname, domain, theme) - isBot = '' - isGroup = '' - followDMs = '' - removeTwitter = '' - notifyLikes = '' - hideLikeButton = '' - mediaInstanceStr = '' - blogsInstanceStr = '' - newsInstanceStr = '' displayNickname = nickname - bioStr = '' - donateUrl = '' - emailAddress = '' - PGPpubKey = '' - PGPfingerprint = '' - xmppAddress = '' - matrixAddress = '' - ssbAddress = '' - blogAddress = '' - toxAddress = '' - jamiAddress = '' - cwtchAddress = '' - briarAddress = '' - manuallyApprovesFollowers = '' - movedTo = '' + isBot = isGroup = followDMs = removeTwitter = '' + notifyLikes = hideLikeButton = mediaInstanceStr = '' + blogsInstanceStr = newsInstanceStr = movedTo = '' + bioStr = donateUrl = emailAddress = PGPpubKey = '' + PGPfingerprint = xmppAddress = matrixAddress = '' + ssbAddress = blogAddress = toxAddress = jamiAddress = '' + cwtchAddress = briarAddress = manuallyApprovesFollowers = '' + actorJson = loadJson(actorFilename) if actorJson: if actorJson.get('movedTo'): From 48240a38bbf4262191114a0868f3550f906e3f3e Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 27 Jun 2021 17:24:12 +0100 Subject: [PATCH 1273/1416] Fewer lines --- webapp_profile.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/webapp_profile.py b/webapp_profile.py index 3439a4fd7..60b285c29 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -1096,22 +1096,19 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, if mediaInstance: if mediaInstance is True: mediaInstanceStr = 'checked' - blogsInstanceStr = '' - newsInstanceStr = '' + blogsInstanceStr = newsInstanceStr = '' newsInstance = getConfigParam(baseDir, "newsInstance") if newsInstance: if newsInstance is True: newsInstanceStr = 'checked' - blogsInstanceStr = '' - mediaInstanceStr = '' + blogsInstanceStr = mediaInstanceStr = '' blogsInstance = getConfigParam(baseDir, "blogsInstance") if blogsInstance: if blogsInstance is True: blogsInstanceStr = 'checked' - mediaInstanceStr = '' - newsInstanceStr = '' + mediaInstanceStr = newsInstanceStr = '' filterStr = '' filterFilename = \ From f62dc618184cdf4d34d1408e2ca02c90ff38ed41 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 27 Jun 2021 18:59:46 +0100 Subject: [PATCH 1274/1416] Themes dropdown function --- webapp_profile.py | 87 +++++++++++++++++++++++++---------------------- 1 file changed, 47 insertions(+), 40 deletions(-) diff --git a/webapp_profile.py b/webapp_profile.py index 60b285c29..a56ebd0a3 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -1008,6 +1008,52 @@ def _htmlProfileShares(actor: str, translate: {}, return profileStr +def _grayscaleEnabled(baseDir: str) -> bool: + """Is grayscale UI enabled? + """ + return os.path.isfile(baseDir + '/accounts/.grayscale') + + +def _htmlThemesDropdown(baseDir: str, translate: {}) -> str: + """Returns the html for theme selection dropdown + """ + # Themes section + themes = getThemesList(baseDir) + themesDropdown = '
\n' + grayscale = '' + if _grayscaleEnabled(baseDir): + grayscale = 'checked' + themesDropdown += \ + ' ' + translate['Grayscale'] + '
' + themesDropdown += '
' + if os.path.isfile(baseDir + '/fonts/custom.woff') or \ + os.path.isfile(baseDir + '/fonts/custom.woff2') or \ + os.path.isfile(baseDir + '/fonts/custom.otf') or \ + os.path.isfile(baseDir + '/fonts/custom.ttf'): + themesDropdown += \ + ' ' + \ + translate['Remove the custom font'] + '
' + themeName = getConfigParam(baseDir, 'theme') + themesDropdown = \ + themesDropdown.replace('

' + \ translate['Graphic Design'] + '\n' graphicsStr += '
' - - # Themes section - themes = getThemesList(baseDir) - themesDropdown += '
\n' - grayscaleFilename = \ - baseDir + '/accounts/.grayscale' - grayscale = '' - if os.path.isfile(grayscaleFilename): - grayscale = 'checked' - themesDropdown += \ - ' ' + translate['Grayscale'] + '
' - themesDropdown += '
' - if os.path.isfile(baseDir + '/fonts/custom.woff') or \ - os.path.isfile(baseDir + '/fonts/custom.woff2') or \ - os.path.isfile(baseDir + '/fonts/custom.otf') or \ - os.path.isfile(baseDir + '/fonts/custom.ttf'): - themesDropdown += \ - ' ' + \ - translate['Remove the custom font'] + '
' - themeName = getConfigParam(baseDir, 'theme') - themesDropdown = \ - themesDropdown.replace('
\n' + + editProfileForm = '
' + \ + translate['Skills'] + '\n' + editProfileForm += '
\n' + editProfileForm += \ + '
\n' + idx = 'If you want to participate within organizations then you ' + \ + 'can indicate some skills that you have and approximate ' + \ + 'proficiency levels. This helps organizers to construct ' + \ + 'teams with an appropriate combination of skills.' + editProfileForm += ' \n' + editProfileForm += skillsStr + return editProfileForm + + def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, domain: str, port: int, httpPrefix: str, defaultTimeline: str, theme: str, @@ -1503,33 +1550,6 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, with open(gitProjectsFilename, 'r') as gitProjectsFile: gitProjectsStr = gitProjectsFile.read() - skills = getSkills(baseDir, nickname, domain) - skillsStr = '' - skillCtr = 1 - if skills: - for skillDesc, skillValue in skills.items(): - if isFiltered(baseDir, nickname, domain, skillDesc): - continue - skillsStr += \ - '

' - skillsStr += \ - '

' - skillCtr += 1 - - skillsStr += \ - '

' - skillsStr += \ - '

' - skillsStr += '
\n' - cssFilename = baseDir + '/epicyon-profile.css' if os.path.isfile(baseDir + '/epicyon.css'): cssFilename = baseDir + '/epicyon.css' @@ -1930,6 +1950,7 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, editProfileForm += '
\n' + # git projects section editProfileForm += '
' + \ translate['Git Projects'] + '\n' editProfileForm += '
\n' @@ -1945,19 +1966,9 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, editProfileForm += '
\n' # Skills section - editProfileForm += '
' + \ - translate['Skills'] + '\n' - editProfileForm += '
\n' editProfileForm += \ - '
\n' - idx = 'If you want to participate within organizations then you ' + \ - 'can indicate some skills that you have and approximate ' + \ - 'proficiency levels. This helps organizers to construct ' + \ - 'teams with an appropriate combination of skills.' - editProfileForm += ' \n' - editProfileForm += skillsStr + _htmlEditProfileSkills(baseDir, nickname, domain, translate) + editProfileForm += roleAssignStr + peertubeStr + graphicsStr + instanceStr # danger zone section From aaa71b542e35fe0a6acabba89c31067183b22b26 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 27 Jun 2021 20:33:07 +0100 Subject: [PATCH 1279/1416] Function for git projects section of edit profile screen --- webapp_profile.py | 48 +++++++++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/webapp_profile.py b/webapp_profile.py index fb5992eb3..8d6b46c22 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -1386,6 +1386,33 @@ def _htmlEditProfileSkills(baseDir: str, nickname: str, domain: str, return editProfileForm +def _htmlEditProfileGitProjects(baseDir: str, nickname: str, domain: str, + translate: {}) -> str: + """git projects section of edit profile screen + """ + gitProjectsStr = '' + gitProjectsFilename = \ + baseDir + '/accounts/' + \ + nickname + '@' + domain + '/gitprojects.txt' + if os.path.isfile(gitProjectsFilename): + with open(gitProjectsFilename, 'r') as gitProjectsFile: + gitProjectsStr = gitProjectsFile.read() + + editProfileForm = '
' + \ + translate['Git Projects'] + '\n' + editProfileForm += '
\n' + idx = 'List of project names that you wish to receive git patches for' + editProfileForm += \ + ' \n' + editProfileForm += \ + ' \n' + editProfileForm += '
\n' + return editProfileForm + + def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, domain: str, port: int, httpPrefix: str, defaultTimeline: str, theme: str, @@ -1542,14 +1569,6 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, with open(allowedInstancesFilename, 'r') as allowedInstancesFile: allowedInstancesStr = allowedInstancesFile.read() - gitProjectsStr = '' - gitProjectsFilename = \ - baseDir + '/accounts/' + \ - nickname + '@' + domain + '/gitprojects.txt' - if os.path.isfile(gitProjectsFilename): - with open(gitProjectsFilename, 'r') as gitProjectsFile: - gitProjectsStr = gitProjectsFile.read() - cssFilename = baseDir + '/epicyon-profile.css' if os.path.isfile(baseDir + '/epicyon.css'): cssFilename = baseDir + '/epicyon.css' @@ -1951,19 +1970,8 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, editProfileForm += '
\n' # git projects section - editProfileForm += '
' + \ - translate['Git Projects'] + '\n' - editProfileForm += '
\n' - idx = 'List of project names that you wish to receive git patches for' editProfileForm += \ - ' \n' - editProfileForm += \ - ' \n' - - editProfileForm += '
\n' + _htmlEditProfileGitProjects(baseDir, nickname, domain, translate) # Skills section editProfileForm += \ From 6a8148d703fbbbd8990c3883f977cd4aa69afbb3 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 27 Jun 2021 20:44:57 +0100 Subject: [PATCH 1280/1416] Function for filtering section of edit profile screen --- webapp_profile.py | 337 ++++++++++++++++++++++++---------------------- 1 file changed, 173 insertions(+), 164 deletions(-) diff --git a/webapp_profile.py b/webapp_profile.py index 8d6b46c22..2f1a5fe5d 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -1413,6 +1413,178 @@ def _htmlEditProfileGitProjects(baseDir: str, nickname: str, domain: str, return editProfileForm +def _htmlEditProfileFiltering(baseDir: str, nickname: str, domain: str, + translate: {}) -> str: + """Filtering and blocking section of edit profile screen + """ + filterStr = '' + filterFilename = \ + baseDir + '/accounts/' + nickname + '@' + domain + '/filters.txt' + if os.path.isfile(filterFilename): + with open(filterFilename, 'r') as filterfile: + filterStr = filterfile.read() + + switchStr = '' + switchFilename = \ + baseDir + '/accounts/' + \ + nickname + '@' + domain + '/replacewords.txt' + if os.path.isfile(switchFilename): + with open(switchFilename, 'r') as switchfile: + switchStr = switchfile.read() + + autoTags = '' + autoTagsFilename = \ + baseDir + '/accounts/' + \ + nickname + '@' + domain + '/autotags.txt' + if os.path.isfile(autoTagsFilename): + with open(autoTagsFilename, 'r') as autoTagsFile: + autoTags = autoTagsFile.read() + + autoCW = '' + autoCWFilename = \ + baseDir + '/accounts/' + \ + nickname + '@' + domain + '/autocw.txt' + if os.path.isfile(autoCWFilename): + with open(autoCWFilename, 'r') as autoCWFile: + autoCW = autoCWFile.read() + + blockedStr = '' + blockedFilename = \ + baseDir + '/accounts/' + \ + nickname + '@' + domain + '/blocking.txt' + if os.path.isfile(blockedFilename): + with open(blockedFilename, 'r') as blockedfile: + blockedStr = blockedfile.read() + + dmAllowedInstancesStr = '' + dmAllowedInstancesFilename = \ + baseDir + '/accounts/' + \ + nickname + '@' + domain + '/dmAllowedInstances.txt' + if os.path.isfile(dmAllowedInstancesFilename): + with open(dmAllowedInstancesFilename, 'r') as dmAllowedInstancesFile: + dmAllowedInstancesStr = dmAllowedInstancesFile.read() + + allowedInstancesStr = '' + allowedInstancesFilename = \ + baseDir + '/accounts/' + \ + nickname + '@' + domain + '/allowedinstances.txt' + if os.path.isfile(allowedInstancesFilename): + with open(allowedInstancesFilename, 'r') as allowedInstancesFile: + allowedInstancesStr = allowedInstancesFile.read() + + editProfileForm = '
' + \ + translate['Filtering and Blocking'] + '\n' + editProfileForm += '
\n' + + editProfileForm += \ + '
\n' + + cityFilename = baseDir + '/accounts/' + \ + nickname + '@' + domain + '/city.txt' + if os.path.isfile(cityFilename): + with open(cityFilename, 'r') as fp: + city = fp.read().replace('\n', '') + locationsFilename = baseDir + '/custom_locations.txt' + if not os.path.isfile(locationsFilename): + locationsFilename = baseDir + '/locations.txt' + cities = [] + with open(locationsFilename, "r") as f: + cities = f.readlines() + cities.sort() + editProfileForm += '
\n' + + editProfileForm += \ + ' \n' + editProfileForm += '
\n' + editProfileForm += ' \n' + + editProfileForm += \ + '
\n' + editProfileForm += '
\n' + editProfileForm += \ + ' \n' + + editProfileForm += \ + '
\n' + editProfileForm += '
\n' + editProfileForm += \ + ' \n' + + editProfileForm += \ + '
\n' + editProfileForm += '
\n' + editProfileForm += \ + ' \n' + + editProfileForm += \ + '
\n' + idx = 'Blocked accounts, one per line, in the form ' + \ + 'nickname@domain or *@blockeddomain' + editProfileForm += \ + '
\n' + editProfileForm += \ + ' \n' + + editProfileForm += \ + '
\n' + idx = 'Direct messages are always allowed from these instances.' + editProfileForm += \ + '
\n' + editProfileForm += \ + ' \n' + + editProfileForm += \ + '
\n' + idx = 'Federate only with a defined set of instances. ' + \ + 'One domain name per line.' + editProfileForm += \ + '
\n' + editProfileForm += \ + ' \n' + + editProfileForm += '
\n' + return editProfileForm + + def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, domain: str, port: int, httpPrefix: str, defaultTimeline: str, theme: str, @@ -1514,61 +1686,6 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, blogsInstanceStr = 'checked' mediaInstanceStr = newsInstanceStr = '' - filterStr = '' - filterFilename = \ - baseDir + '/accounts/' + nickname + '@' + domain + '/filters.txt' - if os.path.isfile(filterFilename): - with open(filterFilename, 'r') as filterfile: - filterStr = filterfile.read() - - switchStr = '' - switchFilename = \ - baseDir + '/accounts/' + \ - nickname + '@' + domain + '/replacewords.txt' - if os.path.isfile(switchFilename): - with open(switchFilename, 'r') as switchfile: - switchStr = switchfile.read() - - autoTags = '' - autoTagsFilename = \ - baseDir + '/accounts/' + \ - nickname + '@' + domain + '/autotags.txt' - if os.path.isfile(autoTagsFilename): - with open(autoTagsFilename, 'r') as autoTagsFile: - autoTags = autoTagsFile.read() - - autoCW = '' - autoCWFilename = \ - baseDir + '/accounts/' + \ - nickname + '@' + domain + '/autocw.txt' - if os.path.isfile(autoCWFilename): - with open(autoCWFilename, 'r') as autoCWFile: - autoCW = autoCWFile.read() - - blockedStr = '' - blockedFilename = \ - baseDir + '/accounts/' + \ - nickname + '@' + domain + '/blocking.txt' - if os.path.isfile(blockedFilename): - with open(blockedFilename, 'r') as blockedfile: - blockedStr = blockedfile.read() - - dmAllowedInstancesStr = '' - dmAllowedInstancesFilename = \ - baseDir + '/accounts/' + \ - nickname + '@' + domain + '/dmAllowedInstances.txt' - if os.path.isfile(dmAllowedInstancesFilename): - with open(dmAllowedInstancesFilename, 'r') as dmAllowedInstancesFile: - dmAllowedInstancesStr = dmAllowedInstancesFile.read() - - allowedInstancesStr = '' - allowedInstancesFilename = \ - baseDir + '/accounts/' + \ - nickname + '@' + domain + '/allowedinstances.txt' - if os.path.isfile(allowedInstancesFilename): - with open(allowedInstancesFilename, 'r') as allowedInstancesFile: - allowedInstancesStr = allowedInstancesFile.read() - cssFilename = baseDir + '/epicyon-profile.css' if os.path.isfile(baseDir + '/epicyon.css'): cssFilename = baseDir + '/epicyon.css' @@ -1858,116 +1975,8 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, editProfileForm += '
\n' # Filtering and blocking section - editProfileForm += '
' + \ - translate['Filtering and Blocking'] + '\n' - editProfileForm += '
\n' - editProfileForm += \ - '
\n' - - cityFilename = baseDir + '/accounts/' + \ - nickname + '@' + domain + '/city.txt' - if os.path.isfile(cityFilename): - with open(cityFilename, 'r') as fp: - city = fp.read().replace('\n', '') - locationsFilename = baseDir + '/custom_locations.txt' - if not os.path.isfile(locationsFilename): - locationsFilename = baseDir + '/locations.txt' - cities = [] - with open(locationsFilename, "r") as f: - cities = f.readlines() - cities.sort() - editProfileForm += '
\n' - - editProfileForm += \ - ' \n' - editProfileForm += '
\n' - editProfileForm += ' \n' - - editProfileForm += \ - '
\n' - editProfileForm += '
\n' - editProfileForm += \ - ' \n' - - editProfileForm += \ - '
\n' - editProfileForm += '
\n' - editProfileForm += \ - ' \n' - - editProfileForm += \ - '
\n' - editProfileForm += '
\n' - editProfileForm += \ - ' \n' - - editProfileForm += \ - '
\n' - idx = 'Blocked accounts, one per line, in the form ' + \ - 'nickname@domain or *@blockeddomain' - editProfileForm += \ - '
\n' - editProfileForm += \ - ' \n' - - editProfileForm += \ - '
\n' - idx = 'Direct messages are always allowed from these instances.' - editProfileForm += \ - '
\n' - editProfileForm += \ - ' \n' - - editProfileForm += \ - '
\n' - idx = 'Federate only with a defined set of instances. ' + \ - 'One domain name per line.' - editProfileForm += \ - '
\n' - editProfileForm += \ - ' \n' - - editProfileForm += '
\n' + _htmlEditProfileFiltering(baseDir, nickname, domain, translate) # git projects section editProfileForm += \ From 4be19bba4a5aff0dcc2bb97c38dc327a20b43c0c Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 27 Jun 2021 20:54:36 +0100 Subject: [PATCH 1281/1416] Function for changing password on edit profile screen --- webapp_profile.py | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/webapp_profile.py b/webapp_profile.py index 2f1a5fe5d..848c131db 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -1585,6 +1585,26 @@ def _htmlEditProfileFiltering(baseDir: str, nickname: str, domain: str, return editProfileForm +def _htmlEditProfileChangePassword(translate: {}) -> str: + """Change password section of edit profile screen + """ + editProfileForm = '
' + \ + translate['Change Password'] + '\n' + editProfileForm += '
\n' + editProfileForm += \ + '
\n' + editProfileForm += '
\n' + editProfileForm += \ + '
\n' + editProfileForm += \ + ' \n' + editProfileForm += '
\n' + return editProfileForm + + def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, domain: str, port: int, httpPrefix: str, defaultTimeline: str, theme: str, @@ -1959,20 +1979,8 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, editProfileForm += '
\n' # Change password - editProfileForm += '
' + \ - translate['Change Password'] + '\n' - editProfileForm += '
\n' editProfileForm += \ - '
\n' - editProfileForm += '
\n' - editProfileForm += \ - '
\n' - editProfileForm += \ - ' \n' - editProfileForm += '
\n' + _htmlEditProfileChangePassword(translate) # Filtering and blocking section editProfileForm += \ From 59f0eea000608525a3c2d2c01440f4a2631bec35 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 27 Jun 2021 21:01:43 +0100 Subject: [PATCH 1282/1416] Function for background images on edit profile screen --- webapp_profile.py | 89 +++++++++++++++++++++++++---------------------- 1 file changed, 48 insertions(+), 41 deletions(-) diff --git a/webapp_profile.py b/webapp_profile.py index 848c131db..b548e9524 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -1605,6 +1605,52 @@ def _htmlEditProfileChangePassword(translate: {}) -> str: return editProfileForm +def _htmlEditProfileBackground(newsInstance: bool, translate: {}) -> str: + """Background images section of edit profile screen + """ + editProfileForm = '
' + \ + translate['Background Images'] + '\n' + editProfileForm += '
\n' + idx = 'The files attached below should be no larger than ' + \ + '10MB in total uploaded at once.' + editProfileForm += \ + '

\n' + + if not newsInstance: + imageFormats = getImageFormats() + editProfileForm += \ + ' \n' + editProfileForm += ' \n' + + editProfileForm += '
\n' + editProfileForm += ' \n' + + editProfileForm += '
\n' + editProfileForm += ' \n' + + editProfileForm += '
\n' + editProfileForm += ' \n' + + editProfileForm += '
\n' + editProfileForm += ' \n' + + editProfileForm += '
\n' + return editProfileForm + + def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, domain: str, port: int, httpPrefix: str, defaultTimeline: str, theme: str, @@ -1938,49 +1984,10 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, editProfileForm += '
\n' # Customize images and banners - editProfileForm += '
' + \ - translate['Background Images'] + '\n' - editProfileForm += '
\n' - idx = 'The files attached below should be no larger than ' + \ - '10MB in total uploaded at once.' - editProfileForm += \ - '

\n' - - if not newsInstance: - editProfileForm += \ - ' \n' - editProfileForm += ' \n' - - editProfileForm += '
\n' - editProfileForm += ' \n' - - editProfileForm += '
\n' - editProfileForm += ' \n' - - editProfileForm += '
\n' - editProfileForm += ' \n' - - editProfileForm += '
\n' - editProfileForm += ' \n' - - editProfileForm += '
\n' + editProfileForm += _htmlEditProfileBackground(newsInstance, translate) # Change password - editProfileForm += \ - _htmlEditProfileChangePassword(translate) + editProfileForm += _htmlEditProfileChangePassword(translate) # Filtering and blocking section editProfileForm += \ From d2381eb389a65b8bf45f79228e22481f840ef8e1 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 27 Jun 2021 21:11:41 +0100 Subject: [PATCH 1283/1416] Function for contact info on edit profile screen --- webapp_profile.py | 147 +++++++++++++++++++++++++++------------------- 1 file changed, 88 insertions(+), 59 deletions(-) diff --git a/webapp_profile.py b/webapp_profile.py index b548e9524..27fb2e562 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -1651,6 +1651,88 @@ def _htmlEditProfileBackground(newsInstance: bool, translate: {}) -> str: return editProfileForm +def _htmlEditProfileContactInfo(nickname: str, + emailAddress: str, + xmppAddress: str, + matrixAddress: str, + ssbAddress: str, + toxAddress: str, + briarAddress: str, + jamiAddress: str, + cwtchAddress: str, + PGPfingerprint: str, + PGPpubKey: str, + translate: {}) -> str: + """Contact Information section of edit profile screen + """ + editProfileForm = '
' + \ + translate['Contact Details'] + '\n' + editProfileForm += '
' + editProfileForm += '
\n' + editProfileForm += \ + ' \n' + editProfileForm += \ + '
\n' + editProfileForm += \ + ' \n' + editProfileForm += '
\n' + editProfileForm += \ + ' \n' + + editProfileForm += '
\n' + editProfileForm += \ + ' \n' + + editProfileForm += '
\n' + editProfileForm += \ + ' \n' + + editProfileForm += '
\n' + editProfileForm += \ + ' \n' + + editProfileForm += '
\n' + editProfileForm += \ + ' \n' + + editProfileForm += '
\n' + editProfileForm += \ + ' \n' + + editProfileForm += \ + '
\n' + editProfileForm += \ + ' \n' + editProfileForm += \ + '
\n' + editProfileForm += \ + ' \n' + editProfileForm += '
\n' + editProfileForm += '
\n' + return editProfileForm + + +def _htmlEditProfileOptions(translate: {}) -> str: + """option checkboxes section of edit profile screen + """ + + def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, domain: str, port: int, httpPrefix: str, defaultTimeline: str, theme: str, @@ -1922,66 +2004,13 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, editProfileForm += '
\n' # Contact information - editProfileForm += '
' + \ - translate['Contact Details'] + '\n' - editProfileForm += '
' - editProfileForm += '
\n' editProfileForm += \ - ' \n' - editProfileForm += \ - '
\n' - editProfileForm += \ - ' \n' - editProfileForm += '
\n' - editProfileForm += \ - ' \n' - - editProfileForm += '
\n' - editProfileForm += \ - ' \n' - - editProfileForm += '
\n' - editProfileForm += \ - ' \n' - - editProfileForm += '
\n' - editProfileForm += \ - ' \n' - - editProfileForm += '
\n' - editProfileForm += \ - ' \n' - - editProfileForm += '
\n' - editProfileForm += \ - ' \n' - - editProfileForm += \ - '
\n' - editProfileForm += \ - ' \n' - editProfileForm += \ - '
\n' - editProfileForm += \ - ' \n' - editProfileForm += '
\n' - editProfileForm += '
\n' + _htmlEditProfileContactInfo(nickname, emailAddress, + xmppAddress, matrixAddress, + ssbAddress, toxAddress, + briarAddress, jamiAddress, + cwtchAddress, PGPfingerprint, + PGPpubKey, translate) # Customize images and banners editProfileForm += _htmlEditProfileBackground(newsInstance, translate) From a96094235fae4faf8b96b113f9003a278a9474f6 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 27 Jun 2021 21:18:15 +0100 Subject: [PATCH 1284/1416] Function for checkboxes on edit profile screen --- webapp_profile.py | 69 ++++++++++++++++++++++++++--------------------- 1 file changed, 39 insertions(+), 30 deletions(-) diff --git a/webapp_profile.py b/webapp_profile.py index 27fb2e562..785ab5a16 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -1728,9 +1728,44 @@ def _htmlEditProfileContactInfo(nickname: str, return editProfileForm -def _htmlEditProfileOptions(translate: {}) -> str: +def _htmlEditProfileOptions(manuallyApprovesFollowers: str, + isBot: str, isGroup: str, + followDMs: str, removeTwitter: str, + notifyLikes: str, hideLikeButton: str, + translate: {}) -> str: """option checkboxes section of edit profile screen """ + editProfileForm = '
\n' + editProfileForm += \ + ' ' + translate['Approve follower requests'] + '
\n' + editProfileForm += \ + ' ' + translate['This is a bot account'] + '
\n' + editProfileForm += \ + ' ' + \ + translate['This is a group account'] + '
\n' + editProfileForm += \ + ' ' + \ + translate['Only people I follow can send me DMs'] + '
\n' + editProfileForm += \ + ' ' + \ + translate['Remove Twitter posts'] + '
\n' + editProfileForm += \ + ' ' + \ + translate['Notify when posts are liked'] + '
\n' + editProfileForm += \ + ' ' + \ + translate["Don't show the Like button"] + '
\n' + editProfileForm += '
\n' + return editProfileForm def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, @@ -1972,36 +2007,10 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, editProfileForm += '
\n' # Option checkboxes - editProfileForm += '
\n' editProfileForm += \ - ' ' + translate['Approve follower requests'] + '
\n' - editProfileForm += \ - ' ' + translate['This is a bot account'] + '
\n' - editProfileForm += \ - ' ' + \ - translate['This is a group account'] + '
\n' - editProfileForm += \ - ' ' + \ - translate['Only people I follow can send me DMs'] + '
\n' - editProfileForm += \ - ' ' + \ - translate['Remove Twitter posts'] + '
\n' - editProfileForm += \ - ' ' + \ - translate['Notify when posts are liked'] + '
\n' - editProfileForm += \ - ' ' + \ - translate["Don't show the Like button"] + '
\n' - editProfileForm += '
\n' + _htmlEditProfileOptions(manuallyApprovesFollowers, + isBot, isGroup, followDMs, removeTwitter, + notifyLikes, hideLikeButton, translate) # Contact information editProfileForm += \ From 7d639023ac07560d6a1bbed95d4f69f1c0412dd7 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 27 Jun 2021 21:30:39 +0100 Subject: [PATCH 1285/1416] Function for main info on edit profile screen --- webapp_profile.py | 132 +++++++++++++++++++++++++--------------------- 1 file changed, 73 insertions(+), 59 deletions(-) diff --git a/webapp_profile.py b/webapp_profile.py index 785ab5a16..0c68e9d33 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -1768,6 +1768,76 @@ def _htmlEditProfileOptions(manuallyApprovesFollowers: str, return editProfileForm +def _htmlEditProfileMain(displayNickname: str, bioStr: str, + movedTo: str, donateUrl: str, + blogAddress: str, actorJson: {}, + translate: {}) -> str: + """main info on edit profile screen + """ + imageFormats = getImageFormats() + + editProfileForm = '
\n' + editProfileForm += ' \n' + editProfileForm += \ + '
\n' + editProfileForm += \ + ' \n' + editProfileForm += \ + ' \n' + editProfileForm += \ + ' \n' + editProfileForm += \ + ' \n' + + occupationName = '' + if actorJson.get('hasOccupation'): + occupationName = getOccupationName(actorJson) + + editProfileForm += '
\n' + editProfileForm += \ + ' \n' + + alsoKnownAsStr = '' + if actorJson.get('alsoKnownAs'): + alsoKnownAs = actorJson['alsoKnownAs'] + ctr = 0 + for altActor in alsoKnownAs: + if ctr > 0: + alsoKnownAsStr += ', ' + ctr += 1 + alsoKnownAsStr += altActor + + editProfileForm += '
\n' + editProfileForm += \ + ' \n' + + editProfileForm += '
\n' + editProfileForm += \ + ' \n' + editProfileForm += '
\n' + editProfileForm += \ + ' \n' + editProfileForm += '
\n' + editProfileForm += \ + ' \n' + editProfileForm += '
\n' + return editProfileForm + + def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, domain: str, port: int, httpPrefix: str, defaultTimeline: str, theme: str, @@ -1776,7 +1846,6 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, accessKeys: {}) -> str: """Shows the edit profile screen """ - imageFormats = getImageFormats() path = path.replace('/inbox', '').replace('/outbox', '') path = path.replace('/shares', '') nickname = getNicknameFromActor(path) @@ -1946,65 +2015,10 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, translate['Remove scheduled posts'] + '
\n' editProfileForm += '
\n' - editProfileForm += '
\n' - editProfileForm += ' \n' + # main info editProfileForm += \ - '
\n' - editProfileForm += \ - ' \n' - editProfileForm += \ - ' \n' - editProfileForm += \ - ' \n' - editProfileForm += \ - ' \n' - - occupationName = '' - if actorJson.get('hasOccupation'): - occupationName = getOccupationName(actorJson) - - editProfileForm += '
\n' - editProfileForm += \ - ' \n' - - alsoKnownAsStr = '' - if actorJson.get('alsoKnownAs'): - alsoKnownAs = actorJson['alsoKnownAs'] - ctr = 0 - for altActor in alsoKnownAs: - if ctr > 0: - alsoKnownAsStr += ', ' - ctr += 1 - alsoKnownAsStr += altActor - - editProfileForm += '
\n' - editProfileForm += \ - ' \n' - - editProfileForm += '
\n' - editProfileForm += \ - ' \n' - editProfileForm += '
\n' - editProfileForm += \ - ' \n' - editProfileForm += '
\n' - editProfileForm += \ - ' \n' - editProfileForm += '
\n' + _htmlEditProfileMain(displayNickname, bioStr, movedTo, donateUrl, + blogAddress, actorJson, translate) # Option checkboxes editProfileForm += \ From 4ad0e7b6b2779958481e5b4d22180884a282f489 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 27 Jun 2021 21:38:41 +0100 Subject: [PATCH 1286/1416] Function for top banner on edit profile screen --- webapp_profile.py | 67 ++++++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 27 deletions(-) diff --git a/webapp_profile.py b/webapp_profile.py index 0c68e9d33..3ffcfdca9 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -1838,6 +1838,43 @@ def _htmlEditProfileMain(displayNickname: str, bioStr: str, return editProfileForm +def _htmlEditProfileTopBanner(baseDir: str, + nickname: str, domain: str, domainFull: str, + defaultTimeline: str, bannerFile: str, + path: str, accessKeys: {}, translate: {}) -> str: + """top banner on edit profile screen + """ + editProfileForm = \ + '' + editProfileForm += '\n' + + editProfileForm += \ + '
\n' + editProfileForm += '
\n' + editProfileForm += \ + '

' + translate['Profile for'] + \ + ' ' + nickname + '@' + domainFull + '

' + editProfileForm += '
\n' + editProfileForm += \ + '
\n' + \ + ' \n' + \ + '
\n' + editProfileForm += '
\n' + + if scheduledPostsExist(baseDir, nickname, domain): + editProfileForm += '
\n' + editProfileForm += \ + ' ' + \ + translate['Remove scheduled posts'] + '
\n' + editProfileForm += '
\n' + return editProfileForm + + def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, domain: str, port: int, httpPrefix: str, defaultTimeline: str, theme: str, @@ -1987,33 +2024,9 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, # top banner editProfileForm += \ - '' - editProfileForm += '\n' - - editProfileForm += \ - '\n' - editProfileForm += '
\n' - editProfileForm += \ - '

' + translate['Profile for'] + \ - ' ' + nickname + '@' + domainFull + '

' - editProfileForm += '
\n' - editProfileForm += \ - '
\n' + \ - ' \n' + \ - '
\n' - editProfileForm += '
\n' - - if scheduledPostsExist(baseDir, nickname, domain): - editProfileForm += '
\n' - editProfileForm += \ - ' ' + \ - translate['Remove scheduled posts'] + '
\n' - editProfileForm += '
\n' + _htmlEditProfileTopBanner(baseDir, nickname, domain, domainFull, + defaultTimeline, bannerFile, + path, accessKeys, translate) # main info editProfileForm += \ From 58a67db88a1b3a71f5a4d5ae2414eb6830eec68e Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 27 Jun 2021 22:40:12 +0100 Subject: [PATCH 1287/1416] Function for new post button --- webapp_timeline.py | 186 ++++++++++++++++++++++++--------------------- 1 file changed, 99 insertions(+), 87 deletions(-) diff --git a/webapp_timeline.py b/webapp_timeline.py index 471c1ede6..d6fd2afde 100644 --- a/webapp_timeline.py +++ b/webapp_timeline.py @@ -93,6 +93,102 @@ def _getHelpForTimeline(baseDir: str, boxName: str) -> str: return '' +def _htmlTimelineNewPost(manuallyApproveFollowers: bool, + boxName: str, iconsAsButtons: bool, + usersPath: str, translate: {}) -> str: + """Returns html for the new post button + """ + newPostButtonStr = '' + if boxName == 'dm': + if not iconsAsButtons: + newPostButtonStr += \ + '| ' + translate['Create a new DM'] + \
+                '\n' + else: + newPostButtonStr += \ + '' + \ + '' + elif (boxName == 'tlblogs' or + boxName == 'tlnews' or + boxName == 'tlfeatures'): + if not iconsAsButtons: + newPostButtonStr += \ + '| ' + \
+                translate['Create a new post'] + \
+                '\n' + else: + newPostButtonStr += \ + '' + \ + '' + elif boxName == 'tlevents': + if not iconsAsButtons: + newPostButtonStr += \ + '| ' + \
+                translate['Create a new event'] + \
+                '\n' + else: + newPostButtonStr += \ + '' + \ + '' + elif boxName == 'tlshares': + if not iconsAsButtons: + newPostButtonStr += \ + '| ' + \
+                translate['Create a new shared item'] + \
+                '\n' + else: + newPostButtonStr += \ + '' + \ + '' + else: + if not manuallyApproveFollowers: + if not iconsAsButtons: + newPostButtonStr += \ + '| ' + \
+                    translate['Create a new post'] + \
+                    '\n' + else: + newPostButtonStr += \ + '' + \ + '' + else: + if not iconsAsButtons: + newPostButtonStr += \ + '| ' + translate['Create a new post'] + \
+                    '\n' + else: + newPostButtonStr += \ + '' + \ + '' + return newPostButtonStr + + def htmlTimeline(cssCache: {}, defaultTimeline: str, recentPostsCache: {}, maxRecentPosts: int, translate: {}, pageNumber: int, @@ -331,93 +427,9 @@ def htmlTimeline(cssCache: {}, defaultTimeline: str, newPostButtonStr += '
' # what screen to go to when a new post is created - if boxName == 'dm': - if not iconsAsButtons: - newPostButtonStr += \ - '| ' + translate['Create a new DM'] + \
-                '\n' - else: - newPostButtonStr += \ - '' + \ - '' - elif (boxName == 'tlblogs' or - boxName == 'tlnews' or - boxName == 'tlfeatures'): - if not iconsAsButtons: - newPostButtonStr += \ - '| ' + \
-                translate['Create a new post'] + \
-                '\n' - else: - newPostButtonStr += \ - '' + \ - '' - elif boxName == 'tlevents': - if not iconsAsButtons: - newPostButtonStr += \ - '| ' + \
-                translate['Create a new event'] + \
-                '\n' - else: - newPostButtonStr += \ - '' + \ - '' - elif boxName == 'tlshares': - if not iconsAsButtons: - newPostButtonStr += \ - '| ' + \
-                translate['Create a new shared item'] + \
-                '\n' - else: - newPostButtonStr += \ - '' + \ - '' - else: - if not manuallyApproveFollowers: - if not iconsAsButtons: - newPostButtonStr += \ - '| ' + \
-                    translate['Create a new post'] + \
-                    '\n' - else: - newPostButtonStr += \ - '' + \ - '' - else: - if not iconsAsButtons: - newPostButtonStr += \ - '| ' + translate['Create a new post'] + \
-                    '\n' - else: - newPostButtonStr += \ - '' + \ - '' + newPostButtonStr += \ + _htmlTimelineNewPost(manuallyApproveFollowers, boxName, + iconsAsButtons, usersPath, translate) # keyboard navigation calendarStr = translate['Calendar'] From e3ce8712268b7fc04c11f34b08d1f0cd75b4607f Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 27 Jun 2021 23:01:58 +0100 Subject: [PATCH 1288/1416] Moderation buttons function --- webapp_timeline.py | 156 ++++++++++++++++++++++++--------------------- 1 file changed, 84 insertions(+), 72 deletions(-) diff --git a/webapp_timeline.py b/webapp_timeline.py index d6fd2afde..0e44d93ea 100644 --- a/webapp_timeline.py +++ b/webapp_timeline.py @@ -189,6 +189,87 @@ def _htmlTimelineNewPost(manuallyApproveFollowers: bool, return newPostButtonStr +def _htmlTimelineModerationButtons(moderator: bool, boxName: str, + nickname: str, moderationActionStr: str, + translate: {}) -> str: + """Returns html for the moderation screen buttons + """ + tlStr = '' + if moderator and boxName == 'moderation': + tlStr += \ + '' + tlStr += '
\n' + idx = 'Nickname or URL. Block using *@domain or nickname@domain' + tlStr += \ + ' ' + translate[idx] + '
\n' + if moderationActionStr: + tlStr += '
\n' + else: + tlStr += '
\n' + + tlStr += \ + ' \n' + tlStr += \ + ' \n' + + tlStr += \ + ' \n' + tlStr += \ + ' \n' + + tlStr += \ + ' \n' + tlStr += \ + ' \n' + + tlStr += \ + ' \n' + tlStr += \ + ' \n' + + tlStr += '
\n\n' + return tlStr + + def htmlTimeline(cssCache: {}, defaultTimeline: str, recentPostsCache: {}, maxRecentPosts: int, translate: {}, pageNumber: int, @@ -575,78 +656,9 @@ def htmlTimeline(cssCache: {}, defaultTimeline: str, tlStr += '
\n' # second row of buttons for moderator actions - if moderator and boxName == 'moderation': - tlStr += \ - '
' - tlStr += '
\n' - idx = 'Nickname or URL. Block using *@domain or nickname@domain' - tlStr += \ - ' ' + translate[idx] + '
\n' - if moderationActionStr: - tlStr += '
\n' - else: - tlStr += '
\n' - - tlStr += \ - ' \n' - tlStr += \ - ' \n' - - tlStr += \ - ' \n' - tlStr += \ - ' \n' - - tlStr += \ - ' \n' - tlStr += \ - ' \n' - - tlStr += \ - ' \n' - tlStr += \ - ' \n' - - tlStr += '
\n
\n' + tlStr += \ + _htmlTimelineModerationButtons(moderator, boxName, nickname, + moderationActionStr, translate) _logTimelineTiming(enableTimingLog, timelineStartTime, boxName, '6') From db9d74aacfa67ebdb31e1fb45c1dba3073cf7785 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 27 Jun 2021 23:14:48 +0100 Subject: [PATCH 1289/1416] Keyboard navigation function --- webapp_timeline.py | 151 ++++++++++++++++++++++++--------------------- 1 file changed, 79 insertions(+), 72 deletions(-) diff --git a/webapp_timeline.py b/webapp_timeline.py index 0e44d93ea..b7cda0e3d 100644 --- a/webapp_timeline.py +++ b/webapp_timeline.py @@ -270,6 +270,81 @@ def _htmlTimelineModerationButtons(moderator: bool, boxName: str, return tlStr +def _htmlTimelineKeyboard(moderator: bool, textModeBanner: str, usersPath: str, + nickname: str, newCalendarEvent: bool, + newDM: bool, newReply: bool, newShare: bool, + followApprovals: bool, + accessKeys: {}, translate: {}) -> str: + """Returns html for timeline keyboard navigation + """ + calendarStr = translate['Calendar'] + if newCalendarEvent: + calendarStr = '' + calendarStr + '' + dmStr = translate['DM'] + if newDM: + dmStr = '' + dmStr + '' + repliesStr = translate['Replies'] + if newReply: + repliesStr = '' + repliesStr + '' + sharesStr = translate['Shares'] + if newShare: + sharesStr = '' + sharesStr + '' + menuProfile = \ + htmlHideFromScreenReader('👤') + ' ' + \ + translate['Switch to profile view'] + menuInbox = \ + htmlHideFromScreenReader('📥') + ' ' + translate['Inbox'] + menuOutbox = \ + htmlHideFromScreenReader('📤') + ' ' + translate['Sent'] + menuSearch = \ + htmlHideFromScreenReader('🔍') + ' ' + \ + translate['Search and follow'] + menuCalendar = \ + htmlHideFromScreenReader('📅') + ' ' + calendarStr + menuDM = \ + htmlHideFromScreenReader('📩') + ' ' + dmStr + menuReplies = \ + htmlHideFromScreenReader('📨') + ' ' + repliesStr + menuBookmarks = \ + htmlHideFromScreenReader('🔖') + ' ' + translate['Bookmarks'] + menuShares = \ + htmlHideFromScreenReader('🤝') + ' ' + sharesStr + menuBlogs = \ + htmlHideFromScreenReader('📝') + ' ' + translate['Blogs'] + menuNewswire = \ + htmlHideFromScreenReader('📰') + ' ' + translate['Newswire'] + menuLinks = \ + htmlHideFromScreenReader('🔗') + ' ' + translate['Links'] + menuNewPost = \ + htmlHideFromScreenReader('➕') + ' ' + translate['Create a new post'] + menuModeration = \ + htmlHideFromScreenReader('⚡️') + ' ' + translate['Mod'] + navLinks = { + menuProfile: '/users/' + nickname, + menuInbox: usersPath + '/inbox#timelineposts', + menuSearch: usersPath + '/search', + menuNewPost: usersPath + '/newpost', + menuCalendar: usersPath + '/calendar', + menuDM: usersPath + '/dm#timelineposts', + menuReplies: usersPath + '/tlreplies#timelineposts', + menuOutbox: usersPath + '/outbox#timelineposts', + menuBookmarks: usersPath + '/tlbookmarks#timelineposts', + menuShares: usersPath + '/tlshares#timelineposts', + menuBlogs: usersPath + '/tlblogs#timelineposts', + menuNewswire: usersPath + '/newswiremobile', + menuLinks: usersPath + '/linksmobile' + } + navAccessKeys = {} + for variableName, key in accessKeys.items(): + if not locals().get(variableName): + continue + navAccessKeys[locals()[variableName]] = key + if moderator: + navLinks[menuModeration] = usersPath + '/moderation#modtimeline' + return htmlKeyboardNavigation(textModeBanner, navLinks, navAccessKeys, + None, usersPath, translate, followApprovals) + + def htmlTimeline(cssCache: {}, defaultTimeline: str, recentPostsCache: {}, maxRecentPosts: int, translate: {}, pageNumber: int, @@ -513,78 +588,10 @@ def htmlTimeline(cssCache: {}, defaultTimeline: str, iconsAsButtons, usersPath, translate) # keyboard navigation - calendarStr = translate['Calendar'] - if newCalendarEvent: - calendarStr = '' + calendarStr + '' - dmStr = translate['DM'] - if newDM: - dmStr = '' + dmStr + '' - repliesStr = translate['Replies'] - if newReply: - repliesStr = '' + repliesStr + '' - sharesStr = translate['Shares'] - if newShare: - sharesStr = '' + sharesStr + '' - menuProfile = \ - htmlHideFromScreenReader('👤') + ' ' + \ - translate['Switch to profile view'] - menuInbox = \ - htmlHideFromScreenReader('📥') + ' ' + translate['Inbox'] - menuOutbox = \ - htmlHideFromScreenReader('📤') + ' ' + translate['Sent'] - menuSearch = \ - htmlHideFromScreenReader('🔍') + ' ' + \ - translate['Search and follow'] - menuCalendar = \ - htmlHideFromScreenReader('📅') + ' ' + calendarStr - menuDM = \ - htmlHideFromScreenReader('📩') + ' ' + dmStr - menuReplies = \ - htmlHideFromScreenReader('📨') + ' ' + repliesStr - menuBookmarks = \ - htmlHideFromScreenReader('🔖') + ' ' + \ - translate['Bookmarks'] - menuShares = \ - htmlHideFromScreenReader('🤝') + ' ' + sharesStr -# menuEvents = \ -# htmlHideFromScreenReader('🎫') + ' ' + translate['Events'] - menuBlogs = \ - htmlHideFromScreenReader('📝') + ' ' + translate['Blogs'] - menuNewswire = \ - htmlHideFromScreenReader('📰') + ' ' + translate['Newswire'] - menuLinks = \ - htmlHideFromScreenReader('🔗') + ' ' + translate['Links'] - menuNewPost = \ - htmlHideFromScreenReader('➕') + ' ' + \ - translate['Create a new post'] - menuModeration = \ - htmlHideFromScreenReader('⚡️') + ' ' + \ - translate['Mod'] - navLinks = { - menuProfile: '/users/' + nickname, - menuInbox: usersPath + '/inbox#timelineposts', - menuSearch: usersPath + '/search', - menuNewPost: usersPath + '/newpost', - menuCalendar: usersPath + '/calendar', - menuDM: usersPath + '/dm#timelineposts', - menuReplies: usersPath + '/tlreplies#timelineposts', - menuOutbox: usersPath + '/outbox#timelineposts', - menuBookmarks: usersPath + '/tlbookmarks#timelineposts', - menuShares: usersPath + '/tlshares#timelineposts', - menuBlogs: usersPath + '/tlblogs#timelineposts', - menuNewswire: usersPath + '/newswiremobile', - menuLinks: usersPath + '/linksmobile' - } - navAccessKeys = {} - for variableName, key in accessKeys.items(): - if not locals().get(variableName): - continue - navAccessKeys[locals()[variableName]] = key - if moderator: - navLinks[menuModeration] = usersPath + '/moderation#modtimeline' - tlStr += htmlKeyboardNavigation(textModeBanner, navLinks, navAccessKeys, - None, usersPath, translate, - followApprovals) + tlStr += \ + _htmlTimelineKeyboard(moderator, textModeBanner, usersPath, nickname, + newCalendarEvent, newDM, newReply, newShare, + followApprovals, accessKeys, translate) # banner and row of buttons tlStr += \ From 89666d93ba2862c61b9bf3f7e139c616b9796c1b Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 28 Jun 2021 10:35:48 +0100 Subject: [PATCH 1290/1416] Architecture diagrams --- architecture/epicyon_groups_ActivityPub.png | Bin 0 -> 54415 bytes .../epicyon_groups_ActivityPub_Core.png | Bin 0 -> 167284 bytes .../epicyon_groups_ActivityPub_Security.png | Bin 0 -> 98340 bytes ...roups_Commandline-Interface_ActivityPub.png | Bin 0 -> 77396 bytes ...icyon_groups_Commandline-Interface_Core.png | Bin 0 -> 55560 bytes architecture/epicyon_groups_Core.png | Bin 0 -> 64046 bytes architecture/epicyon_groups_Core_Security.png | Bin 0 -> 69865 bytes architecture/epicyon_groups_Timeline_Core.png | Bin 0 -> 135827 bytes .../epicyon_groups_Timeline_Security.png | Bin 0 -> 82295 bytes ...icyon_groups_Web-Interface-Columns_Core.png | Bin 0 -> 86194 bytes .../epicyon_groups_Web-Interface_Core.png | Bin 0 -> 165553 bytes architecture/groups_Timeline_Security.png | Bin 0 -> 82295 bytes scripts/architecture | 12 ++++++++++++ 13 files changed, 12 insertions(+) create mode 100644 architecture/epicyon_groups_ActivityPub.png create mode 100644 architecture/epicyon_groups_ActivityPub_Core.png create mode 100644 architecture/epicyon_groups_ActivityPub_Security.png create mode 100644 architecture/epicyon_groups_Commandline-Interface_ActivityPub.png create mode 100644 architecture/epicyon_groups_Commandline-Interface_Core.png create mode 100644 architecture/epicyon_groups_Core.png create mode 100644 architecture/epicyon_groups_Core_Security.png create mode 100644 architecture/epicyon_groups_Timeline_Core.png create mode 100644 architecture/epicyon_groups_Timeline_Security.png create mode 100644 architecture/epicyon_groups_Web-Interface-Columns_Core.png create mode 100644 architecture/epicyon_groups_Web-Interface_Core.png create mode 100644 architecture/groups_Timeline_Security.png create mode 100755 scripts/architecture diff --git a/architecture/epicyon_groups_ActivityPub.png b/architecture/epicyon_groups_ActivityPub.png new file mode 100644 index 0000000000000000000000000000000000000000..d8928af1c6722f93c14d0f369fe31bfb81c53dd4 GIT binary patch literal 54415 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℘4$@C|2}>6herZ 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 U4yK*#p}?}N>+aV3)n79l>h($ literal 0 HcmV?d00001 diff --git a/architecture/epicyon_groups_ActivityPub_Core.png b/architecture/epicyon_groups_ActivityPub_Core.png new file mode 100644 index 0000000000000000000000000000000000000000..4dfb426e51bf93dcc49e43b42cb09bad8e84c013 GIT binary patch literal 167284 zcmd3OWmHvb*exL-(xP;zh=_DZhk>GkprCZ8^d>jm64D|9QYr{4Asy0l=J^PFBAAAEjSsAPoaCs*;Od=xPzvu-kl@9vys? zlGQ65t^eLd5he8C|H;Q;A9LUM=kqk0x4P=zTtCja1z*lA3)x+k`2GFcxXzzXX`wam zpi?WSx*NKVW<@T^G^5Bu(S!Kk>od)zV3|0=9BDs?J82nQ2%uN+Anx$_zrW{2TES=J zHkI42tJ}ya9{*jmY>S2Iyflk^xZJJJLcx*1x@4>W<-CN{~jZE zY{=f${8otWp|7frOXK)#V&TDBHFG_$h{G>(c6N68B(a#oLwB!O)=NE{e>W;E{DWL< zPoAOdTxXKp-Mje1B{pB|J=E1{G2>p+l5RVf#l+r}uT>?qwmwK#Oi|F#peq^o6o)IJ zV7ZIsm?5*1R2b2OArkK?F4s z*Gx%E`%R!r;Ohq!pc!vrDQ=`dj&Ubh{~*PQCN938J?#mC3H?=NIEIx!s_Su`h>8=dhL@O%TdRc;J<>fxS6^RWw%xB8FKokvRa8_|0arTW zIG|0EqpPCQlo}!Rz}dO9grk(*q$|0j)OI>3G;}6PmgyopdvJu*{>N`6)D&if|8r#) z$A^0i63&q|H8&ub`1tsYOij1O+}5yjy-qwisffOP`^M(MjBKw>^^uTJLfC9utg@0) zUD1Hfa2DTc**uff?gZ|O7cZPojxdC$PfvW#%=ui<8NyQ)^v&qK{d{MZW=VL2^l{wo z?(UUw*)KYk;i4%qF@0HLcVrY|{-!_n2mz1VO3}d2JVSy2edk#CuzvBdTMD6ypF z;gT=4eC>0TvLvxOuI#n7weH7z^T>_Mr${A5Mn+EOKx`cyVCL(HcxGT5^u{V&Mx2JN z)Ux}QRVwSQQHCGu$ZW*sF(o($L8*S=@QrdzZD2; zeS1I`cNO(xppja)z1V8_XR#Ii=vT+-R*o+-;o_@$13B8SUccU4%>1&sH=lwV85h?= zCVl8#KPj?$6xU(mdAyaf)g#BVF&W65jN12~4s+>}#H7=t`EPm2!7Zb!4<@H|tH;7fPUoKRlmkuTa3Wgk+<>{>A(E?`yft#*ipX@>=wB zGI<@^ilJBAhi$4msCC_MT3T8btjfyFJc%c+=RMT+|EJ^^R?u6cPTWsCPWmri>d`Q_ zuvi!=6X2;ndmd2f7{Ie$L;BF>cPeS zAG_hTnsK~;yJ(`-H4YATPR_L4+{pZV{%hB+eay;A%gPGv=~058eERh1-Pf;g-n^k( zTVWt2n4O(_b#!p5R#FxadL*j7X}6fL1AI6 zf`Y#bB~7A=bKbxAg)~xr^yr4Cr_`N0cg|5!DLs99$JUk)3sN7-Jyu;^-DzUtQx~8E zeEH7PEgv5wV#Qjd2W{piiAiBL>o|Hl4286TAbC(&a znU@I(a<=+>MNf;GNBWI~D866BvQML}^Csub!oOQOsol&=EApPf(V7~?ixsUeCZ_P5 zFnaXVQ@tm2G_&~ON(2FIZ>!#Zzwq8L^}hVQ%Tia8cjKJDI;}h?u^#<3R#}cQy?5_k z+tEvzLrxBkkd6f50^>F+q`I&E9yLlceWdir&ViLu%`hv@u$`PVhm;#j%ZEErUjd7A zkE&e=)44LIB=E#L^ZWD4@1#-*nhsiml5X2+id|B_*Tz$B`r-3E`+ni8!-CxqQ$eB4 z-y44OuDJL$v)5r1^vGP(E+(hdk#FIZ;w=)9_ia7%(3RdnSe&C=B40&OO(O4j$jKU* z)D6N9Lr>M!oaW0lv~iLoWnj}Gd`tK7RI4}6TXJ(E^U7NO=c_la=^0{m%Cm)UrcU2& zmhG){L*plkdwU-3cV{Rv@9(V0t&LSyG6r3;iW;>xtq&l{(kgp-ouNYH7hH==3E)2#)_5fpT<99>VcnzB~CHZCSJQ~)pn zD$YGQIm6pS_(E30GCRkXS_;%xLV|0Ud_?v|P&Ay0d8Mw)0mKY-xv%uo($XSdzPx2=nWZZiTcGLWB$VR5Nhl|! zUWdu7%1F=0w|IZPS&g9SIX-b+rOe)^nzMQ#ZhYC-DRTL-+`^M4a`l=*Y3m&aw3>f> zQob)Q|6AFo=cUHfQQV)l6D0ufGiq+bVevzHdcM<&8%B>C>!zeHDoq5XgG!4o z?uue2m^|X=(f`(0@`ag5^)v{H*R5(pb zD=H+$T$i}UJWjNQvd8^d+kGuw5Dk3bE~WXkvUWyMk1Y4B{CFI%mvPh66@&Hl+7b8q zjuF5Y4ULU^<+nud{~Jy-rGVoEJ537mOgiY4l$G}s7roRWJPU1lwQEY z^n4rdE2eyYy}O5Nbgjcly*pd0q4qTz8`Mh=*#g)p$P>=ag=qS^YZA&0T$H*KSf! z&GE|Q(ZATW8F;{q8Waak-Ks=IsRREA>7%&To(GtmK59|kyYwgu-c!6u&n}zgJLsK{ zs}j~f>VLsifA`Td@>uy&|I9C6-(==|eNg^FuHdJo5EYk3L$sIY%Of|8A+1^MhCRVZ z=mD0u=}Wo^fz!LHSm7rkzlI7ps*n4=#9y~~P0IaK;ossPH4O}8>UC05$NM`WYK2A= zW=lQ1cyYX80+XdZ*s2p!&!Q5g7HX*V_C|c8%)M~~v_$+9a;k$DdNVlMW2W6OnUQE?D(nt%Vjv|OUx6#HK-y-z(69{{&A37}mh+<=M@fEe7d*=F5Na0^>zz~b0 zC7KWu8@mOqJ%4@Wc^bE3<5~S$(T?Dy2h>_;{13`+VZX)M#g|Ws&vmz~eY$Ee!a5!2 zvL&DXFyXF@j6W=<(A0E<^xV5Z=1W_8S32F2*2%vQjz8VIFSO1OH~(f~EL)uCa0M@2 zA!%{#^Na`*vR69D|6xi|0!^Js;$;^7+6`A4?3%O0)o6>)4!ChIi#ln2DWA|dH&)C# zSyQCP$%~p1L2=nd(YBMYt^2I|g;L=@u+M(?g^wBCd(%5%9PX8QdOPZ6hDl{YpnKJP|;FsJs{b1O3L zPA+Sem|tF=UMlHd{7-zBw5c61=%-fq6j7D)zE9Nh(0E6kYt2)QAxGLVg*gAgo*rv1 z&En9T_4s_ot>=_Dl=;R4a#wO|D{shpsj{(Uv!IxNqKEma`0f>@+YP>IqmgjuJ=yE> zI@C@o~>%^=NWv&4@J|w)E>h&iPD2kGsR=)M|5ezG*>tv+ck$xOd?<`e~2v ze+=qgc>z!d?y}!!0rEF=`X}Y$C1xg~aP>COjy(qLH8LpoIq!$Ll1}23YzjtG#*~8< zE(O(@(JGHLG+K>SwVE<*s?NyOI1hS1@>1<1_4nCO#HFgQ7?`&mjEQ}$qB6JkIqms> zXeP=jH9b9G{CKB?m|iM0<^zYmsE8E01`k>O(F-Wg1^+dD^;IYIWvI)NUl>;_sHf5oo!A;n8fT-OIl*lkj_g>C4t;8_%@HjPLM~c37cHHP(PQw~qV99Y^|N7O(xS6jX!Q1iP1N zPu);YEVmbqtSo_-=YH35j*P;~zlnDK`Sa&L`umfASP9#VwI{mG*QC}sa%sjU)>>mR z`Ka5QDfQe|O7txw$4(OnnYkzFDGwPvnR`)DG}H8vY>RpRJ_;MLR15koFk#}`k+geNE@WE!C|dz-VRS~*unJ9&v$6Ybe@h_u%ORk)QpB@}%uK8C1cIycd* zb~p(COTS7vGPm}i6Q=|>YQ0l@ZMXca=wC9K_LL^zCUAHVJE&r{>Z8=h! z*FDSy&Enyb(By78E@$?mpBE-B>JgKZ{wC7LGcX4ieuO+w~P1lHAz)?FjgDZ?} zdqaYkQpDZp$P3GFsV~mw;Kb%6YU_N>(GB#4#TG-6?=6NB>QpF+dA<5Y5_ilfIvYjM zqa?L|$ikp1Rx^a-H#^~}aA#^PUAL(+>>N|svCQy9aB>RI~2N**r-^pZZLcj?^~mx{vt!wJyB>FSs(c-eTy_$lNLHF;KG`Jz zXvP9O97*xz!Gig?;mV`VVKtsYCi>IGX%XJk-dZC!+b-*ot>flW>=LU@6&%l(;wp)+ zU(6+UE*Xon!SNF1pX>6`G?Vb(?t8V7P<|{i5mD;*nck<($Ja#bL~Px31be_?!t@4v zE*@s>*F;qFX_P?jQi~&#%>=2p8-wVHy&lgxV@l1d-qp4aZkngku!vAL(H0Q`o`%B_ z&7Ud)1buAFYWMq=KIPud>F&)1Cmgx8eSurjRVZW-4ya*h+YYpi`e@R_`E6-Blh zUcPM7-}iI3L)%Me73=z0=TrCU7`24A_jPen!$)MrB43ne<_Ua1kCvT^Efr@@^~tmi zRGT18qQXHlh^9CiEf1j35I0_UJJ{lH)}LA=wniXV}u(Vi(Ae&E7xnz`I&=IcvV$C(S8;l^AydL`@RzG$(_SK}=w`vE zFzbi3)n!W<^9gqqft`z6*Nrc&1Dkr%jJiWu_>Z$X*e0s+VrT7gcwVJ!_ zdnJ7Q)e3>a%Jnq%@DW7?1=4TdI`;5_tN#^yqny4`GW7TN14De?Hv7J?@Ei*5qVnVk z){ioVw`pk&!?YSYI;$iUnV&y@%+AJJ4|jQ=M|XxtPEKx#AuIFPYB9nky+BPtA~;*0 zMkGlA3oz~|^)YT-P&s}7_@*~)4MC~6eZ3F0?V8x=lZ!t{3^o<@57To}9dFk~|9Q1QzRNkZz`Ds}bs*t`iH4!^$Fx_ve6N**Jtt}59$ zO-9yip6w=+Ov)&xC&YZ@Z^IuS^y0$^$8Z;!hZHDtyc3Y&8UOFnvU5Jx88(o)P^YU%c6+FcwXcjE!~(y18t^%)lNB0BpaeBz8_|c1+VyZYHOCqXey`}yw6~KHD@J9a=&TR=U8r}_uMPo zh<;?X*JZl8VoFoG&=aIuNerW;qDm)Zr6nN&FN^=I`2w97y5FgL>|Zz}dRvqsMkFaF zEkhObv0KK*tdLX47L-4P2tu~w^=sGLDvHlEG&Ej}T4!WswYw!{O#dheDdGbK);}Pi zpO7szHPt8eW`=1J$eXU)c5A(iw6wvE1{W`1_Me#0!@CtCt*jQRFVlwKDkaLliA}x z3Kd_kpi=7%wO_@4oiwxiP}_@YT_pEBW_3vS5qdF*Qd@W2t;Vku%`A)^ zZA;KxW!)@URF5@c@3QYoxr@8{{Ti7F8M>vPZjwvysK3>}n^MCRC2E``j&8E#o8JF6 z>q(mO8RK1!3M|t`1%6oa$g#1c_isu`G4$z>%@IHK8=q==)sw)Prj&A5dc@vB*x^C} zEN%7*Tka{fd-t9NyKu}n@Y6nY8Te=3aVfjAH&{bk`yr@1jg5_L9#tPd{_?kf=lWIL z&(AM7JbWiP=cJ%)z=eBj#X6>-7f@TPBxYnfDgDybt3g9U8U}`j@qC8(!XqeLYHf#Z zz7owUcTs5k!3XzN*fYw02{c}q5H6ihlZ;;)F5j+szRE7jUA1cfh^3j&uKiwrQUR&q zO%565veI%*BJa4@%vF;79fEw=GDsY5aEchn?LorjyW?Pss2Nu~shnxGX4E@e04W9#CfI_d}hcUXj#(R&}H zRN%`DQtrEPxqZS8T-@AJSNyF$4)+=4k)J>B*#7d>D;XG(RL--2I7dRlDkiocM=r$4 zxtun~`aCs>iG5M;oHS@IdUNgZFa+_F<1T9u$E*j($zM6Xj?vW;S-iFDRf_&bZT7jj zCjVPqMc>w;c5q_NL*dZ|%4#>9u^Pz_frZHfK6Y?(0o5E)(Qnz$A!6xF=o2k1c_*i0 zv^n-TD;wK<+|uUOmaSM)bLe#Z*|+Q=Yv*vfySp!6zWhTJ)wj@pwtP8wx3}&&QQ6AQ z@CX6LemuZwCw&SOWkuQgL+i?I71-T}yz|MT6~}!`Kb?j(tfXcNbV$?=)Z(u@Ql0Ep zdjTLX2v2{6u-Pbqa z`vubphs7TYaZB&tzdub#xKYnSMG+A%V4CmJW^%kXcT)d!&W`!=y%}d6yj})MvZMWr z&r4QXrXwUf>q@A;l6}NvRcDF{#4`!#bLDORvSHpvv;T$dy3V8(vkL*)C%yLCCMM}< z(uZW@+yg+hqe0j&gHM;2&6@xE^QT&tN@fbvr=Y|a)W^p-j~U zai*zR^O3Gu^Ez=$cAg?cc*FM(a@5CrUMDj<;?~Wj?cTx1IlqXvNN9Ly+BHQY($X#? z2>#!>Lm^E<$6ZiffpgEy&PIVm3Qc!!Z;wIDAqeEPHRHa%zOi9-PO7P?DFE*XmMkq5 z!6#+7ck31oz-@=skurtAEa?nZ@~GamZ)_=-;ZKNS+G~I7Qiku5{zB;H!=Gf>)u(HA zztnPksjB1g+#rIhWYdSpa^KsIb$6Z)6j5SCC0BEZ-L~}eUclB8J`!{MP-6cE_n+zS zo6Ew&vCGSr`T6-G&g&NfNf|GJzzW~6v$y}&)|Q%^o7-sx(tU-GC5XdGH-xyk!(kOE znVA)}v=VO(s=O6N&B_OK5ecy+K9YtC;^O5jR)@K~jrJtzy^ znW|sJ*FG*jb)3sXBg;72yR2|(c9-3~+spD;EX+ZK0Rlu=ST3yKIUA7A(I#U=Xw zD_5?Vld4NAdvln+2Q@v}ee?eD&hmIJah~2u2;-IA@@t~mRRl{cDhw73BZAXcfQq-Y zx6fpxcp8jXc^DZPJyKT2z47eXRhXKQaKp5y_qUjpJj_iEuY~HW?r<-s{M3)D<}lCb z_uDq-z%3`4DK{R6M3`KA(P{pN>!#g*5h9PdN&24`AmqNHBAcY-sCZY_{Gp=sk&Kzy zC-msAU(al=4#SLR&8(}-zDqI|w0vnPIy0CM*d0}jHGDET{H2;z?*Uf0w76a* z(0P?2Le2iwEc~^dQXLL`6l%w$D;h((>xn@FkV+YtBo5 z`0zo?YkE6tckN6fQ4*>WuHBT%Z&rvXHniHGjLPHfdNIkra3AZ*)2Deh<5D{-!?Lcf zUopR7pec%)@GhbJW{?*N1r7$L3*D&%Fe!NJhFKl^pjl#l3J-5@ult@HjKxj;U@W#Z zQBRhCe6X!{R}(e1=5K)=Qq2)fHHq`uZ~G3%4$m?%omkNP@g@W1l|=X9?Txz8-@hGp z*2W{+W^qPzpY@YDNy@=ki!WZ#OV$Dq!pKR@5r}-$y_}Ry_W1sL<)4LeaOA6n^efC! z;~tm|%=}4s<9q75;v4@+doAk7e5KM2(@*$JQqI~s2VDv2>AJmm$Igx)6#Xp99;bz# z=iXS1%{!Lwuv9y#0`%8cO2#)wh`Kgb2F48@78@LVAhE_4+bb6nWq)3ysdp53UiPb> zT!vQb7v|mTpb=U2P5dw^h=KvAUTL|-0Qcw5pRth8UH#MpySa~9TU(h~>Ca9$?k|pP z4579kNG$)jsut!^#mEieZS@1a>bLhi=K02uwC?o&QeW}N>pyTwwEpLc6DgC#uh9;e zxh6F)Z<-ZpEWpgukMX9*{_l%0o9T+UHFO5zLujbdO_--*7l-Jil00EFV1b{qQ!^2D z{;lC|q1E-83_X`N-;JW1j~sk@7gyW_(oQHh@_xTyv1w7az^fFDNLR z&JkDJ?^9|YNU)Wh_Du#sE$kja8w*t;vq-$%>^U8;ZO5}`&mL;W{7C&LCDW3`+;@4w zOkfI^2n0BAv>d$!49ISx1{+8cjQUqc%X`bwHm;b}hmcT}8RZTO@3p7W?w^}z9n6B^ z6il##gvULjXWL#Ik_u11nX7aBK*WtF$YnJAh}0c7y-Pk$TFCGTjeMM-PrPuK(NLk8 z|MQ}hqdB58XTk?>rynQtUy1(InarQuD8O|a1`8?7cZRnIO;a`|P9$26aSv?Aru_rG zp(f9=sn=}jC0nEeEU(yI4$-o0Jb#??ApG_}p>mI26$HL;M)7cUiP6HSsHooyy@665 z`#%WHAhsXgyBCy_8M}ih#+ugF+-p?_+-qDe5hNDE-gxbX9U?gnHM2FM$2seq1=PD| zIa4%wRp=)C-?0SpPk*I_nf6iW@`bGI?Ah<{ZZ}KjzA??&fBW`=O^v44!e}{0-Rs7+ z^3hJ|lRd>`*E#kVXF?`a5b=8GuAkG=FkX6fJa47ddu2VE*%L&60epVIgEnRqIE94ZI^mx7sriJ?4T;xnLsQ^F>$stK-t#eCw<{ zRMi=^Kr-ez_+YXW_Z>pypYyEe)hM$>nneE9{l9N~(ohh~J<~p(kmqUm!O4rOR=-w@ z|M+aW&h?m2${EQ~@2uXIrp5vjW z#3^DbI%(2b;g{5hmEyCltFnBO*PE>>%=C5b;%e1_wXffG9(lJvLS6$I;J-nb&nF1m zn6$m-vK*_3w;C>ftgL(+tROIIPZs{TeYo768W^s^m5~HPpQgbTr~VvmIdk)CZK~X+ z9gEk0Jn7d9E16=LZHSq&3oK*5kyxE+#kT1!s7D#s+pgBHmODR4NJyqX^D#=k)EURH zIoucwJYwHfDf@o>h)hZv)hj)KP=>KRsh||b8hj2xfS|Wn%v`{N^QCJ4g{rPs43E?a z&aE1kY|3f#dda5`+(zR+ox%LLloFTg{>+CiPR#Kddd!wBnoY6EQV6C9X83>hEE`d0 z3JV4MzvwE0*9N&u82ABY7IXMj^Y*464LFSa2*^ynzr6_?r(2$PKLN^9nhVT=>4mM0 zW?N&jv`bz)nk}_RMUvcjG;o38HiHNc>X!6dp4HLfVT&6MpFjJI)-dU@#g)9tv&`4) z%EyiT&f-JC&O+ljc@+We(CN{D)>2UVsr*j&?bsQZMyq8$ttJ{+WjxSbr1X4NNSuDSz%P_O*?(h6sXHtmPBO zwQHBSxWd3#lXuYyH=)>SN^k#Wq7&Pd0zwNkM`x8nqDRtq++U;);`t7n77H0U%25kLnn7Yj(63Wb zQ@agVS-J**AE+=hrwim0siWV@Qv1JIlvLA|v~^aJugw||G@Zuf#=^%vHh&;RY-!6g z=V-$DNmi_n=9{mM6C2 zU?yVdlw8*CI%{(Ats7P+w*rGLX;5S3Wh_2fg=Va%()kt3l`?S-?+0%g&?1^Bqi?vI zqp^51czU8nwRz({1+5E}X3hTL@KH%yt|_wBo=3lWGswUYz$PlH?v`9=2s9DwLDA9C z_VWLAFYhL@94D{=ou#E+n3uJ4Ck^z2NX0y1|J0^lZ7bQhw>lw~>vo|NTOskA0t}xU zjs!?C#V+~EXT)u74EIXsy`}QicGPp1bM@K^vB?>!JJ#RT$MZVjz(N?dL|$BcB8~e; zZ!!x=Ok_Ad7(dCkn|+{?qxB8SFV?T|YOkc+orc*H!Js@KRgD=>@Hhd-Z?2S*kf^A=ky;j;f|zPDbRRw>f#pN6BJ?7D0Rd6K zwtLU_X3ot-#-=n+9@almeIo4aW>I(^#-{Lh-Ds?+cxkzZ=Ei99=o{{q5`Z@m=;KJm$hojQ?I0%V@GBB? z!#p`9xwovWY|L?bdU|27fDLikL5@K-yo`*z5zDO&cs~`w2MCapMo&RO!C<~Ik!G=_ ztrtafRl@Jzzr}QGu++rW`I_S{GH5Ys>EWw-6PfxSw2{b_;T6;qEAYm~zr)db&b@rc zv7{uNka3|eliI^=`-9iXF)`SXh`39=A)!->n>mmF?bZ|oqzo6XU+<&;32iyn+Z!u@ zn6?fGB#pQeClG!LeSQ6N=guMG42b?}@Z` z(_`t=$B#AEXfM5w%tre;s?xmMBV?r!i_0!q-<{X5Wq za=v}9Wl${mOXBCn#YO!3QHWQdNiA({TUFIqnDJ|hk;9-xfan+e;ssEox`T?)(9p~L z{5@_`pb>&J0Y3uzznwFzp*{Ze=~IMIz$Jlt037h#`STFDlO8;?2U4xdayM>xmlP`` ziBV8f%gW0W12z7=*e5qUsQ&MmI^y%^YbsxKI`WO%)QT->&CJX|9E?m%Y!{tRoF-9} zd+-3REA{PL?~#!av90Po#4iMk1S@#!_HElTE%?*q@;KVHv0Xl=|_6&f%&~i4~cER+};oG9_6qvJ00+Kl>~6( zVz$0vL}%Je3i@2Ct{Y3Bq%p0nt>K!wW@Zbvx@&a90pS_>`8@}BVq|X*A8f346?6!y zA~detEC+5g+O>lq`~b5cBhi(SZpmYH2P)N2BSU7Dmw=*UW%?@Z)PZmXUzP4=(yyIn zH*1Eq?SglCpwQ71Uy=Nhs*n*4>dBciXMiB5r=|J7e}4(2lnUJ^&Q%g$K7M=)pc(Wr zh+s${k=3R13`e8S0|H=2<)1uxRgw%rw>BOL>=8U-mAVE$$U?*&eoa(za%L6H^F|f? zF=&crmT7T=w@0nQnNQd2=z6)+O5Lm-Bo0`6KW*tt^72N446#P75ny)(64e~sY&OVqu9tw;4hvB-Tnv}FxM*%Elz_nv z%b;w-WG7_U3yX;S95$Z)^ljFzZ|}m$BQ~oey_%APevGH3kfz_{`%*s^#h(L-C4D5> z7D5S24mJb2)p;993Ke*!pOka-0X~D4SFT%nVktJ#YnR}wF*Wr_qeOI_(Q z8z)1t^;!+S22Or`>9#V|o@n&mm+>(7OJR;4LTRF-CTxpz*+Z)ZRTLW6XyZc;y zj^;uM@Toxk0g_be-g2&r%pJ5Gvv%yV|59AsKdh~#tsMrlAuwqk_zc@8fNH$9^NY5A zE74{lLNIv%7iA-x+0*G5I!#?qgzLI;IL~EPv>G;9?|{PisW_pApVDjWZdT;Dc-kayOMZFGRV$z!Fdy=9eI2zHtDLN00Zk-HhXt0u+&O)A z{qT3inCp%S}iKb7VJvL8M1_4No}vzU`nu5 zidth_Zo6kNicw_r4n7NX^{_e;9X*#k5WX+*h4Mzyz`cUOWfEgaiE7=2EEUxpiK^thr29PWb3?!KCZ|9WA|fb& zw!7>4Yf6tEO(Yq1Q;HDa;Y9(yFfh0TlGX2D-F|RM1GE_D@;gFKC(Q}bImd?P@^Vbi z>%R+rI04)Ys0zzZI4xFsTtR%bq{X%mqW6fQ+?5(C1NrK6&j{$Xv`=eYe2+WY^6}5 zk?Wb6F?tytJxY+UFdPe59MssKS>tY+6XI;eHdkkc&2*);HkTLI=)GOUwj~E#($B8@ zs{s}P--Hr$>x}vi`xLe_%`hs1NzVmnwc=gIV8O!VLz|kKo(=}{tCUo-zyB%ljt*I; z^kB$DDe+w;z#rOue^Vo%^hl znuhJnilpvGmt!W^DlN;_1G%o)l;m|`LBSuxv-I@zOOjVdpy%Fx@Zg2cNvG03#^)%Z zi;|K_;48~D@B2L6Nx8^z;X=)@(ueD~ARc3ZmCzO}^7gfO)V!#P z8vxvH!F(a1i2idS*S5G6w1dGyGs*-ZD+8d*j-(>fv({ztGu zt-hNgoJ!#5QoeBm3(;bh2cs==$^r%pOerZTd#9?&%tZf~!-tAMQ`?&GBLnxbW`n7q$?)gBJmzM_! z{=W8iSwPFV;4KpZYfn=cy?UMjo{NhMz(_l|8Wfxp;kTV?P=14d<4w-Tk3nE51yV8y ze9vuXS$})6&vLwqF|)4~tex?o8VqQo89__Kpvx{@diXjzx*imCgdpy2G&3W*2=I+< z&nOxI+#tMx`x~=*1a_u{75~*ApD2+-CMO5gCz%7)Liherw+h9jk9S#+UkaygvII`l z0oe&9kks?W@f)8JFzuWHZIzomZ&p_hu|ZPdi}cT&2Oma(Mav`yIZ!hJUza{1ZJLm@$xfsbNueRC}iGc z(jIp+Lm}x4SttRqoZo@Xve0cbb*Gqdwj5_ z4nzRNqbq>dx>IG9m6hv3tcRsTxDt{uW%l#Pp)apk4;2`J07J1FLneq|!>lCm0!@Sk z^4u6i85jrh+Rw=&w-0N$H2+}MXl8!i&94C@eE4@mgA4>jGaThXt`^ki4fLm#A-H%X z$N|6@K>R}0=%P=A+0GDsVv5^pnWOc;O$ z*yMmdL4M@-I(Ek^^Zet`8p;x1tB4-Z^kp6 z#y>nD${(}@8(UNihwA1idVJ#uGp-C|jO}}ph%M4MkGYE;wzahA!ND@bR)!d(p=bg{ zY=Q)>OzLF08!9sSjvN)TGr4+AC;Bo zsre(x!`TgTL7J5Lx%-U4rZx(aAVZ7L`d9na41a4e3dRXy0!-4 z4$dDN@r7t zG#=DK%MPb}0-0Qcpk{;4AP>hzVW88@?3Flva*R3VUJLy*mpxpBqBsYQ31kG|EXe6F zfRiJz%5ac!dXe8E@Nn}jthdDeOR;~@tERTu< zIN=;6)HsRyo~_^5ShMc7bSWuBbV%bAjz^{ik6>6dba9{Fs8- zeI5ID0P$pY$(RAun9HoJd~g7?YHyAn*lx9)R1*|N7r<(8I1vZX!H7feLu53D9Itg; z>W_+zZHE7Cvnm!NZqdI82?0oI|Fg`V4ctX@Ft^x2yVx=O>3Hg6 z?pqIGXAlV#j#|QrTabNr;hbYdxlwSTKWGJTj-jc-Wvc}$9!%*DcS@>_4|Z0xoCb{@ zmVZXU>5dnm>ql>H+ExGfl95|lS`07=nvGVJntZ{LgVcX$gpf3AydL`w9VeX4=P4=cp&vPeLcUwid|U%{ zdT_Bz+l&sb&jT~s44?zX?O2po#hip-iLorPt4bg70q8$%R%nFlln$ zG^q8h)L&-QG@w2&L&1LOLJ+UG_!@I&gH9}C>rrC;c1Y!bIZeK=10UN~JR2Xg4+3TIo;tG+L7&$P!!!>OC8r6svAy6Zo}+0-7HERO>j z$+I3616LgqSoxe=kmS9epK?f@9NIH5GLC-@1E^I1a1P)PGMLNfoL*g3fFt31%LQFm zHH)+Gn1W}Gn^xi(8KvB5;9RcVT>CeOwT2jC+R!gwc%-DH&Ru&Fgd9LFGJjgcLg;%z zZ3N=**T5I%J0VoF5cncuV(=zfKF&9IL3}8@o8)8P0qK|x=Ci^v+sme%iBCR13Er4) zj!sO>auU4Rf&vVA*9Qmh-h&61bgSH3^5sEk7qOl4zdCk?79=rTa4YD+70SS^8GSno zrW8h?DWTEPltt!!22fbw2bKM>Fi@F4;g&^#1eWIv6oV_-J;S4bi z?}d6Qo9FHIeSI;2hxKf1A`%klK^IdJf4Lrn08g;r6m~^JTl&O!pZrwqR7GVa$dU5m zl$g1W1QBs@%Cl$RI|*Vxt~r0|BK;5;JfJpwkdNm_j&1{LdCjf;z};N}0Qe*Ez0s=f3z-mND2oV&icWQYC zf@VE4&kg5v%ALZX+)ls_ZA>-Nil8pQa|BGky<|m}0`?I2@--7PD$bl|-R~iZ2vk*7 zAwgSUlJz6}vP4~Xcht&o$yTqT^yKvPZ6KOK5fQ55uP>bTz0;Si84F1>IWr>zFt5xF z!wow+4?xLWwrxiSTb113^3LOPhy?(~)bWC5XN}ulvm#sf@sSUoVbjFI0%06a^Y-Ru zU2UxoWMwZrtDw2*gPVweZKdmWOOm*7TPzP7A0GuXGxL}SMtgI%O*VvztJG=bjRx6M z@-Ynv**IVlbYTG!E}N0UHag)9qIG~aK0!n{vpP9B6+Y|6(bd&OTxO?FUr;B)KIug|NirB{ZESkS8@=F*ohhP1_S zP{T70kT*jx-wmaC=X80JLM$m9P*QUKLDg8^R=;_-Kf(lFpRPIZ%;S7bAgD(&Fw(J*w zu)|XTnt+2o8^~eQ(a|w@f9d8^q$Y8wgaQb;(1x6Fmrd>d$SCLh7ByLCIb0kD#b*l$ zgYD+beZ+|Yuc2;ar*CESA}D}?fdQe&qINSikgek4;u^)4pPVWzWfP(7-YQo5_~;@Q z%!E?P+qahnx|g=05M&&6G&ZuX6bC+dbv0_|BoMb;TukhJ_p|TM1fkc0-3DaNq6rpq z|KF5MObS)*d+@-Ei;z8l?*f5)1Wjc}egdOsf%~4FgoMOZrL@!Io(EhmTXV+1Bca#l zJFRFShce+A0;1?u21M?Ms`3^VwgR5H0T^FuWg_K*nkJ;Q8rXed*FV6vOv#TB-_7jf zclh;4$ZDtox~bXsw?4ZSUr+znHm4?XO}rSIah3Ad2|)ZSKi5X`MLnD>NYO|Zu$0VtD!W6<-+>C zQ?>a_3M#PhJ3Bk)xHMh?J$;;dm!v3_u+BmtUj7hhn!{3m*rhu!zJF3?gV8UPflJ^J z2H4vTeI?_{6o+n=1dy`{ptwjSg$^PBJRmVKasBsiBLK<O%LSZCqx6s21R6rIyTG<*!msnXFTO*Xnb-EDQ=T~aPqjS%p`E1q_Fr$8b zzX)lVic~f(NCL#OQd(O2{o`X6c(h3?0CVXa-Re$Q4Dd_Wb12Hp&CNAIv?E?)NJ?-B ze=jssPE1Nd9u+YZL+z_a0t$x-WF5lLsyq%}T(ZW0@=1vmO6V;JHk6~IG2D~6?AcQ{ zb3f`-y7IxrU%r1Uv#%#t|2AJ#>iJ-toC~K16{4>^{8?a126YVSiN1J5JyjlVo6zf= zikDxU=g2K7$x!<6;7O(miL9)wyN8EvsSZ@+)))?1s4TW9)LSqrIjjtw*VNRskl?)O z%mPZ)4B%M&8a>|crM8CPX^Iyb3A$k908+YqqDU01?c;a1@ZeW1fHRz$TWbPYcNly_ zbX08Y+t0S%flfVGV#5qSLkx5M7!tc6-)R$Nd z#hqxE^(fgwF@TkN4G$>jt#GlgkqFm?umW+1PAo}b*2wn_|LqfnmzRaCM_K@HA)+K` zG)=v|(cpbhf&%4`^6T3(L74GUA^H$3UtUQ`b6Z;o1czy9a2J35&N-bf_%Y&!uRhwL z2iIfLkgdNdL`aI)aeSU(GrxY_DR9TX{d2|p0IX?5?Ji^CojHfZ-_OCpPl?y2^JTo` zZQ`#25QJ>K0!8sY$C$Yw9lWn*cVqgg0_$lWr^z}zxbt?%BseeX~10bb$j}a-WnwtncikLuW=>o>ryn(;~}T{ntTRsyf=y1jW1saz5LMVN%rH z-FIf%mpcIW-oGf)}e zjs&bnM2ZXv>y*Qpr4^vl**Z8h3=bzjLKXn9hQT}{sC{@4qa;41y!hi&J-qic5fSo4 zC1}#h>GHI6!q)AOB)v@`l&9nn%_hZThZZt+4leSkc=$R4qqvh1h!n^PS#IsGL0#Bz zk;K_5ZGfXdA0sU;E`|pX1wd@5!&<(+I&lW}{FV@~0rp34vGO@_=khW^#mTX|c5}B2 z;4ad=xVgEXe9=h)0?rGu^e+yA0v&GQQo)x8T};5B;WSLW z`ogaoVQXX~GVdcOBG8Z;magGi09*&$l%-Qi$HT(|LdT!tN`dd^bKRo<5!@y~1cbf= zolq55d3_lvuBUw?AI@|nP~U%vg*@~IGiTld z8J%g1Ra}X)k%9UIB@x808UT}s(g`Ye!?$mQfZLpwf4*~)xfl(W8$&>M&}1bfB^w8m zXw{$+4FVE}HjxUQ$3TBZP%QJy;PWN`DCZe8K7#@i92^V}z(O9-f;@mL=GxQ$MblLVRJk?XLr9l& zNGl>C-7T#Mh|)+1N~v^rhm;~Ik^<5#(j_6?Eg@3UB@N%4_kF+n>w2$n&hzZOXU|%* zX3c1n#S?hXNJlDwz>o#w!JT6{`<+L?Y82VNYl*3izUb5d$P>J*;z2A5WYNj!7DO~t zi1_1#EaKU)Fi2J%vht?VQ1~mEcmIn=bO~v-_rD6!Q((Cr5)s`8}Ps7 zCtv;jyA^&8F7m_eU!MS&14!x0frZh93;^s-cpxI00ZKxuM&aurnVZIo{YS9rN28L8 zA?1_@qF2~$|27DUny03ckio0g(UL_qMG1NWrf&wRe1%}&n<-hw18LK6|L=k}Degm_I zu>fK4dtKeg7iE%HeaUyuL~WEvk)RNr5!ZU=8>e=$0ZKZo9OTNf%W@B#9S>F>1NK$} zatwJ#2nq_qsd9k02IVt<=p>uIsrjTpi}T|0vc~h2_sw*r$>`T7!XhGjpaIWmu(`3Q zS!FYyy3=$`XJcan7mzZL32W0;>~MF;ez@(tGgss+x9A7YKte>+3<(7|Q4oe_B3Aqr z;Y31SKnPY}>LS^Iwl_9_jsWN>ojXzn$->of)Af^5V;L~eiTMUdxFj5#kL!Oigu@Cz z6nsy#LAZV(aSPO9cfRy@g3cghwhA1bY8deyq_Pz79{Buxghn_JMaSM_xm|%_Zf=gG zJmDN8Lj|0sTu=qOy1Iti*#}J^Sx)4A3+oD|27KX}>8v>LN`Q9Gr&V+P577?k5|WUH z9C#B1Vn}T^R2NWpf%6N^(1gwY5m_98-8;DM2=%~!d0{jYMf$lK<-LzRAwEF>}q*FN;9^%7`w%1ltH~z~${CPEyvf%t=|`59AfkfNfEm14U`gN|CmHr73m}g; zd~ODaZ1HFWBameaxTv76n&m9ch&I{eBL(4(g`b}^Yv^Ql8IT`rqv{vDi}Da2klZfR z>(pre{(e%zbk4!xSt8leUP@pULz!fk=99HvP5&;i8X+}aw8N?iU3*)brQNYH?QR}qq)v~_mw z=7O7XLkQZ%Bpeus&BJ96*}x zPeNR9Z+b5;gF358l+KU{}S>A6*)O{z(v2| zgdx-62SGS_v^@H7@+lx$q=ltl1oyrLpl6U9pOBCc)ER}&;xaejU716!dI6Lx+=-5& zzn=EYHh5@zTJ|I06m~;4p#y*kNF&9P2`QH;hz!J(losuduw`wE;SMnXxR8DK1F#ff zJeNkX|9{u)+I|hhA!Flq`ui+y1WQ-O%0z-Mmq=rrM=nk zJYK2)?N^mzST|syfv)KRC4tf86XL*xuy6ToSk36mq4ni*|m!oc6Oo*3JRw8 z0$1VmR=)j}3_Yghzyg`+<^WFGoO&9)w)UK>eg{s)SM>~32x!$BdW;QYg}Sl8D*%sL z(0O%VnHX@l#=W>*4%lc=3Avdf=0X6A;@gR{^Wip;VRO4#GY+V17E`?nJKbshg}3y@a31;Puq+uim2-S2W5Ji`Rv^j;SmSmp`;=V7V>LqbSElKWpNEO3-| ztNpawa}Do?EaX0XsoYD0Fad#h?a1AJwf`}IHzcAkZt+JF%EWgb0-sb?>D2k-$CpSc zQK0VO?B;fx_J#vz0Pz?3yJ=}3g9jmOuiGpv#1s^m&5)J=wIY)>6vJgC+3d*@*U;cK zEyxap3IPGZ$NSHzfzA=2ALhGr`*tbtgW%=#5M&hi)cg!0r~2XKZ(6$J2GVpCyTqp} z{bs5OKd?{e0L)W@Fit7%YCE0e4OvX4=jlG&ko3UTUIoMl z40tT42cS+1ZjFl&$KgQ0!vb3b$t@vVQ~;+HAg^S7UVG>;@b@O2%fC%sWO{brus$@C z71Di{t<71W2O&=*dplRJ437zz8O~+4*EoE6pjVLm6s%o9i*%~Eo2{*_(hOZxRMbZf zT@AdV7mOcnBdIL!t5b7GBBO6B!+-w(8(v&+T^E{nh2G9Gu&@Nft>AF}?+wT&l$Dei zfSgtS;CuazG4bvLPhm;GTBl_d6-%F8<}#%HP%Wk4w*#xDVlZTS2fhk`E`covZXj-8 z(?lqkPCLVCybDkT=(_-TL)l&gqN1W2-(Ks&BV_+;>ly{U2&@7N`~;{>pu<`oZbf9V zdWK$NGtIh64~T|Gi>*P(Jph{;Qn$O)Tx)biHL3sn{8&NX0XX@DtcCa&G|8@hm2MmCu)WCXh@%L}0GZ)?7 zteFEin8;fZ?n?mN9iaQsDK$pfm?*g`AV9`#RQo(#8U^?ve?U;}_P6ieb$|p20%Kbl zNvE*WKT;vtxBI&Vp^|BI&v|GcqTFa#Z80-_(0?Z@u5yjoi6P)$6!{$unedP5Dl6y9 zZg&acJEiMoTR~#~wEFGyC!=0bAOwM{ZSUY93pidSl zDE{=BTov}bv6d^*REl?;6|&;#CQ2y0!)C}RIu~lj&t+~pxTJCRygRN$X_>G<9WHIF z@j_(6py^hx+XCR{6oMr(*@c=mQ4>mG>jNcGUmK zDLc&${qIg2E#Uj7jJ9fbbfM^G1G$eN%fw^FN|_RXk$OW>hWS^MB<@w95i zyMq?r{(A(^oJC`rf^6A`_OBWlIAaA`tH6fkK+K0jBHI^|Y!Va_QsJ^=2t|jkyoy|5 zhZQ`#Av?=z8XT%Y^6|_++Ul>#RKBtNN#Uhd4v>68*zI%9Z2IwLteN-x$|>(N zwXc>+fC<_MfPz3v-w%na@j4bH2q76UNDqTb0C4DF`2NXsi{R%R}se#A&Y!CZJ;H}q4QlnBQFqZpAO zK;1t%Y0D!(7Mr;cBPAv9Yu4iA=Usk_L0?EJ#GT`#cGI9dQVRF(H;lK-3yT4>VYLAY zxh*;M_<3X+PYg&|15R_%)v-$50)j~yFhZN_7w@CB7=JfzcI*yJVKt3y3+~orJFpB; zvmE_;^X=QWlauwzrX?#tgQ+BP`+)!o_-i>J`;Y~5IvRJ`!=3VY^EU&?%pM>q(uf*z zTQzT5sG=f^mB7!2lXISRyfJEUkAoH)trDZhgNqCic?z!|PBV;sRA*z`m0Y2}Yq*0p zj3tLk;aAa2RVrc`;HdF{hwUSqcKE<2FIDIpvvY9h88=GZnXPF9+&5Wi$y|3er|K%l zFIt45k5=iR$*PUlO%_ltpW%wq_454ejoh8)qZwNs)c&Bhb}Y`$2SQ1OE$U;^R&me1B0LcvZ{VPn9Q^wp;->!@t>1s85~J-2S{`E_ zf7ufeO>46{c@lDrTdZPkuEz>Ps7D2JyBPe$3}3z6`MN{R}y<% z|gvy;64&=Mx5QOe=3}QG_v*E2!~gFf>Zwt!;cYDB>;BtIPzx=UJi7 z&xasJw3{B8dlw3o4<|CgPLVeW>6d$zN%ntR1XB z`FpR+>E%~~XEzGnYz;B`(K>x)jSs5v^RzX}dR{6*YGyf+LyM#W0fm$)IY8!S4%Q|} zMH}S#2T&$iT3$ZteGtAj|B{nyIu(iNSXo)OcsCTO@Gu@G-0uTIlvO>wnZ23<)DXa= zCDz&AH&;!SNi&MxWX$5%S}^TxpFXsw5Jqfbd~y=}VyLwInQ3RRy#N;qYxRKR*C$;& zKxp0!pQrn~E)-TBjb*lH-SWauZmWFviRE`M3Y=vWG1;@_(9i(cmeL*6*OG7AvUi{D zFIROgRSWn%@p?4yMnfx4CvIwOf&`PZiw-nAb~wa0g-&WLinbo#LqD zH)2u}BQnBK@`BKvP_&1u=gnI$45x5ww?rpV!oR3jI6tnhb6Z+pSB8Sh2#<6JIL>rK z!9(Y8f~i%um4{S-!A)u9Smt>z=8FUb?#Ml9;Znj$>|lJ1FZ#sokH~U8I=7J+0+6@R zXKL@{{{baY$f)RXDL9OOB@6uc)$r(XfZxEKFoi_iZ&X_axe+z#b!a*T6Aq&mx6>LV zIDr8!04sGD7j2P@Bftz%Q1B}o^|?26b7=C}H^!rP&n)mf<)*W^rB4rowPt}rcBu5VtP+Z4d70%bECWcbJ4xeHWh*Ou;N+)0Gap8R@)-1Dt zSgZcalgj(T)V!_pNV21%>MpSJHvq3{i)CxV`htWtN%$qxxyw%H!fS>qeKyaq)7}RH zN{R1kdIT)AErzmkv$Pd4@NdZ_@xFY96Xy-m7)S`|_*Qxu{%Bwc3cOa@O2J8c--tZ{qz8{lX9K`!WcF6+2@ei*=&=%-O@in_WtGU6Xu^(m!R(&M`f$ z(R=Al`_Fn>?rl<1CM&XWKa8ZK+^)&$s)l_GoG4r)KiOx5JrJnKA_y zmcy0UpT!(I+S<_cXM`wonMsgDjjSTU^5M^sHNCZ%^RBG*fGiby6!==uV0+Y%|kotXDp&-j`7dzpVRD#=7zo zQebx|dE5g}y>{~mYI5;7T^llF3T03QeZ8aTOw-?YkFoQ;=)!_pf6`k_S9wsp02j)^ z3bi13xjZJll-qY$erK?ru;NsW5xipT^mC)ef8-=u`R&``_J5mT0C84jH3-E1L{{3V z#2vXATNo{9EZ#S~JQ%u)aL(Diz`WhPYFQ9<-QMyy|-aS|b3l zzt`7)0w`C3vcFM*$WT*{UTT#D8XDT^pI9|RH(HRXKn?)b)5(=4LcpVUo?tIg@j2s> zVlFW-d&+nCG=0YSRU-OFlXsiGj?ZP>09jG1dfM%dtdXN z^Cx1NTEg47owM*0m?Ipo|FSDYUBm(TTR_{#ge)Y$Qjp}T-d-~%!Z1hE(EoX1`13-b zBH-%^~GHzgEjuhB%Ib&?gO&ElTU$hLWP$gmO;0K#v zsA#Krj-1oLK$N(9gq!T)t#DnfU7Py+-f3rciCw(gYdZDHk+8ZA3#|iJ0okYUaX!ba zd+!U#e3W;*8$|4Pv8Gq_RN7QlD&Ft~_(%)shFIo>5f*rNZBkX_=~m>le=3u^7G&yx+bJY++dLYkd(dSdxq?KLQM1HSnO+#XZ1I}V)SZ~wniwN-Mz!(vTyb`1~~O)w)m_!=idwp-0+t__}^lcrQ!AFS=aoISdy+~vGZB;@-{jXyVDbI z1`;Cp7$Ra~|LADK{{DWX#u$q4#B_8~B_%u76gEMdivZ5R<$Sd)06`szp|3w<9`%l+ zhZktK9AFtCp1~otySLh!Xlcr=%JZV$4Bdve^Sp?u>x%c5FSDKESA%R`up97MPwJvV zQUJ8|(@!g2J$AI~6p^IrKhb2~d%hiSh ztfm0rF0E}U)e&q7FFK+U_>wZU2$w7FkuwkuQbo{2BtCdNyKWcq6Zh`Zaz|xRmn|f= z9#cK(h)`gLBxUImXQzV8o&FZ8n=A|KoPQ0@D8?5);(gMjc`u*U2ArKTFe|BwZHNbj z#s2#lMaT1e8W-^$2BTOL>ZB}J-0L?XBgEaFL1Z)9>MNJLK)&XE-i*7$!ZKW^W|Oa3 z(t+KFEliMupY+ugSDnhth-&$3t7V&|)mU-6kXI87NKxK0Q@d%tfUJ2=O+x@X`Q~Et zHZX`sJ^qxS>tZ#lF!(OE07F<3Rkc+Dp3 zoS3zCpBvwC$w`>ZA@jSe9q=kYp~N8#1-W^54Lsy&GyEp80}>9PQ>F*tH6X<{!1yo; z3X*eExCl_=!)?o^nQsfSBmOP^#GGUXKEmg0XnZoqu~Al<`HM}X^Z6vn^n}& zY9LD#ifMGS;q@=+t{u5!PKyJ-(NXE31{>ko;(A}Lnxu<$h zspn2t3UjIW%!|RJu_s0L0)i#;7sEWqV@Q*%^Qf(JEwb2L! z310syjROe#_4C?2*#0?bYEt}1{FD?l8Hv+j92~a}pC7S$kb0+`ib29{)9{cd5J`(N z)cZj_;7O6j9aQaNGrm$b8VZ{hah@4A-B%=~zvk0G%3{Ac$x~%20V92gpVvBNSXUR% z?s(C!I|_2np$hxeD+D8U^*0pbk~M{WuIi`r0y%C&pafk`B&g)dU-aP++uu!3`T3$< z-DIa5qrq%W+19OtV>g5yb-^@LVTgmQm*l2l zm`^g2fzHxmK0^ZNY35b|R1uwE<U< zrw`M=^LFv?_CsUi^y#o+AXbsid1*Fh41}>fZ+rY9!YOjU6=EWMzdluPSBl__M|Lv+ zDM*D5r=Gz`HSVAVR4|U6XvyHfHq2G>0(Gx^-4{yrC(T>C4e$ z)#=^~*YiE2GVy}rlHkad38E;g+-|eiz9$Gi75)r13CeF% zRYq1GPnDVkOoxGbsKni~-GwS@eX-?8ob89V#BQ&K2V2MF{26JQ!5HQ-)QYXVL=@){9>J;N|hN}z={LPv&<(;3O{^qMLQ}G zpJ!KV5=ZDqvhtC7Q(fZrNm;8RB?)7a%v5`UI9x|*}iGA#L1yvEwu7?(wgBb)rE7}3 z$#htu1#05-CyQS>0?@>fF9%&i3nLx)T?LUZI*r3zHZ{ZEoABo&HqLqq4VMQHaZS?f z;SY8s8>kLP82;Gt?&DDL{wv)}dPL8?#Z$I4N?=tx0Zt|G*%Vxce{cu5)J5-cYmKpv z#}R%hA~v~aQfW2vunO%i;jz5-wxP^4=l9Ad3$VxRhgHNv5ko9UeC?1$K6H4vUq;F3&_P#`L-$XVqo^EhC zVKk_ys&-_>VOBfL^{3JvPh`8K_wt+zdef_{4#G1B8}uoDzbLM-^ktos9R1G3vB}8i^q2qY;y_K47lJ~)hdZCo zqNj?r%8IJIR%4(JXE6iqdn}&d1;hEzFltZph0+JP^Zu>(Jw1u9K9$dZyN@&M9tJ>y z2h>}dOh_hNHiVF|=zaQkwwt55d=!LFpKF|Mz8g?dRsCjl04iE8xG<$p<^2S;-iVr7 z5_YQxT}d6Tf-*W^j_5z|j`5M0*BL*cm2~>u&(kKn8T7v1%@e2bRv81RCTHb7 z9~Tarw!rfhe?!^`feryFQqK4cVe~Dh< zi3Iu}4EmqeOf)np%xHd+=$tMOtY_$Ze`5X92&usNtk88ETC}FfzT;YcFq`TLlKLTT zeRS|0)kmjP;?X*0ctGpdp{&B;*_i7~Il51zR};f*eJ>vhx+e}Pzu2n9M@pl$EcrkW zRBYrFBq@zqz<*Et*{v_x#8+2WAjF!t>LZ}x!Fy`*^o+L4ead{UN0P5d8Esf6tf~64 z4;ogAhW|iCTG)M!b=Zbnyl2lzY>&#WX%v?~oBzUQ?RvN&4+>?-h`LY6TYnzR{@(X~ zVkdUVZuqg=zT1GsObhlOo0q}YqAAcpSRlyx9|hlo_>bVV`)62kL4gUL%?Y@*Zt{jDRhVa%lwi74#hMX0 zGvLSU9vv*h#kfBG3}COfw>RFo0aL=8TEVz=fqXM-ID3L>-9W+TKEGr-I5EWM@K2?HU&v|YS!J4a`yjR& zukT^SkK{4yVXxN~AS?P1`ICE>Q>&Z+3-v9+oFkT9mJ(h0IJQtyG4#K@o$fG*Ih7wj z%q*FfDUb1%wtv9{p(-;CDnav&P7MX zf~6iBMM*yizHOcSsi-r=ewQ2E64Xtfk*)e6SGJbc4Z;iS(1gpKlq zGc*^{$8$ap<`<=j4oJR<=U12KQe=N;5PpuEO~E2<`|)KbwO4et*~N5M@DWXDnDYF_ zAXJCDGQ2`!Ji6AWquO-~Y>sbO99Zbq3wzO=dtL1Sd&e-KU-*Yqoutb;L!C-qQeB+P zJMFqo^Ap+sLfF3k_ZZc36_ly~GsYW!1mzL)twHP4{XivS5#lSZv-dleht?WDoeBmO zV*Y2jt_46`!I_#1xUhoUr!tl~rOs{Bj&EKab-%215cnWVifyF)j!m6AIu%r)U#!JI zm?nGONY|(`@hULk9zubhxniZS)$HMXfy4M)op-|qKi%bXtB-CZ@*|~i@x^_GMon}L z0d$he6R&u=#A3wnTuhwh>XSfIUCQ;b_`}ZX&3B!q4Hc6`y`w*WB*mH|JBG%lN&ove zJz)?&{!CSnCz;+xweUM#I5=U(`9<*Y%cXyj@w!PdFKLBs5toYYUGG)#Q`#;Jd(ocVAgDKamT0V-`d6wey{G5m zFB?W9LJJ=3;&yTGYsM>e8`3{lIPvuU>oe(pTw)47xi#Ef zpXjB>m55iU4m?tKrKC>IdnB_ASLBb4B2W1?GBOCK z8_yPwnG?^i;=d1e;a3XkfdR3NUtGigBy8m=Kv8A18K`;azd;dO;4SsbEs2;8J@rUH zFGRUQkC(9bFlV5g#1BMS_SF(MXC1G(qB$<161#LQ)Zq}Q2 z?NIK%k@0MRle4#N-JNcNBc9^`5J#H(RY}audt9?rndC2Poz$xB#!kQ3-hAFt-;ySf z*Y&^{Z-uLQ%XJUeR74$L=g>GQgqfzk``z+mfxwt|jI*^)J*ey?<@o`f1RwO;{C67e z_Mv#U8*p2_t3l9Qro1%zCv(iU^XQR%&`IKnqu2=2(MnhF$!bFa*E!qD1%A^vKN`M_ zB6j{yh#|riy>)RKf18%=3?f0=Zn7Y)r_G05sxKDlD3`G94l?rj@J?_q&YHK}xQB4# zB{Z7$QV8~r7e*5p?9M5Pup5T@oq=p4x4)63FG+kdk zQjv?OaeZ}= zS|^oYWcSv(@;VGbWN3{5;%y$RzZkz2=O~{ovp@NAN`|dgHvP)I_9$lwC*h8#Sn#Xx^Qk zG1dGlJA4C~ZQ=tDq zp-tg%lVZV&bW?<|qV_@A#lj(h$`0x$H5s{CpN#`cRDp-Gsx)gOlb++-eZq5kVg5uk zE(uV&Y`W}DWdwI6&(ZSNqJ==8Cp5qAEumtU7#LW#XdLEj=qm61ye76Xu|4DZ-`ybO zHaFs+FXFFIpj_>x@uLXq_T8WR?A|j2UlV>wNv*JZIvY3YEr@edVtLwL(@HbCw)gmdBC@Wx4xv5;TJM zCYejFiVT?I7z+gIKJz8o4lnv;_&hn3J+Sn#%U<*=*8{)#N))d3u&w{s0-zX=GQ>y` z1e=VK?8wjx%W|LW??vl;)EjUo6zm+ikGC+y==j)x<4E&q!0O`xK7W>-h8e<3DYE9T z?&BVMin$RerHTZiAwE4{7IJbj3Lm14T>~?dqLh;gNr5kqW_V1L60vf6s-iJC6+nL@3qY!LUA-fp>a4VZq|`$+EH$ z=***J0W>7Tjra%=bixPGA>Jdy4tQT~(0s`zLRnx998?QobfvH=_)L$9!cib1C9Qcb zblm8Xd~<%%`E}RX^tUa3SFTcy0xFO68ZKV^DM>{0ZL9$9HiWSB?s#ONEuHu$!%M|M zTc1O2cNA@CHgP}v3Pz=h;6?|=IgGJC)eQ{rf*$y_wmv{e>*`W{(YP0iB`@DP+X+UF z&$MuCP`i&_@>0Ry-Pk;6d6QpI0BS!J1X$Pl8Qk|VGiuKAe`9J(DkK%@;(_ocdevEi zrjE0)gy~%pxU0&A!VpZfZAFIYoSy&1U_tV9Pp!Z3Hdcm)ONJ$Z#1`U2*0y63y(Jj? z2KT<7y})C^o10r>>rDC->|*R@D_@xx0;qR=x!t8OTS<#Txctvtr-S^acM=#=q;K*& zl!+@9Irs(y$nv>-S=H@mokp!W7Dz}ZqG2>6+quD*rz{$%<4ZUa6IEPx{L&%MslKYL z%x&NO@sIIw^3ywiyYiVz_t3d#Y1YQbLq$=(%wrmE;7=x_WqJDM(fGy1A}FjG9b3yU zn~SG>QLfh-Uz8x4SkP=5u)gb|*b~>Ali{>fOf>OvTl1A#)-tRFE1)sgp+%8fiKTRY z(5IQ07$5)llU?v8G?FOoJo01X=OX{|;lFFX{h5yF0Rvtjks@#5&2yIkqWg=SSjVL# zzKPRbm=7uj%Je23$=^I5r83XEKR#adaK>v*GQuCL*%^yR4pUZ%CD+np(ee)(xnOc# z4JRjOi#-SF@h6eYBYx(_vaQLOqbkdpp9tOeDyCj(4OJ3}o)}-=l2!j_b9f`rxmMp0 zwOSzjzt*8P7yK0t^)cS36rQvg_%@FF-5rW)BRH)0?<;`GFPKDw!!8Wh!U13f^Sb1g zo$^Vw>NUmazS)lTwHEEv@#t$5)u>1+Pu7b zuBn(kaeR&0gNn#|hLfZc46dvn z<8gR)VYBT)TZ_r{Tmx&s!tC%ZZv;1*KkXW7i=ldOz6~1V$1yoX5D|YE57Dbt)+rog z9`rgUOlfVbf2IzvztJOl(FXDT6GpMHc6_GONu^Vt;ZRWYHH>|)`ObLYjC<1-C8I@_ z!2rD198uVPP=~Up_xc~f-r=gOgWGh&0klv4 zr1GcSzkj8?J3`cmxvRY8-Gc)4*jz-PWT(~5=M*iMPA*4VyNu6{T}2(a7Et{$SA`IB zAq)nzAzIU?Wo8J1f5{|;I`Kh4MK^GU$B1$kl@-JXPnSU%x(i}9Ov2wq7+e(Ymnt#KuUXo1g`kt3LfbQz(|!KP}d? zFIb5M@0s)jetW;@U6VkAhQcu&D!(kWy>}-Rtj+~I#l00Bs=l9EGrpI8k8*fd3sMuB zoc=@{`S%YbDhN~M*-*y)+rRbAARUIz^9l;u8pk~r{(=+30NOJxtxV*AqRc}Lualjl zB5<-tYbWuayceV)D=Vv`r`I|>ta0R{sMsmmB=NQZvuS2>Qo1l$9px{~9mBbC<3@Dl zV{p9$E5?mC)iCo&Ts%t0h(;HFZfuMUI`<0>szWHOt*zrIqN1yX2=1`_y8>8kk9wTKWxV&bPyvP|#4lEdge zVPWC)r@5-p7q4Eu!U&T?H8nM*q@rqpH@{3flMHvR%&S){`}_MbadAQ5@;KY%Lk~7) z`GWmDJx?!IyA;ICF?~OX?NXl z!XVm3$0P`Ez-jqZbtkLuyc}WdZL<4UPXKekBeYD0q|8&7_ex9|V=10T za3=HgR6NFrsm;1%j6zA*3rtFkFN2RB6i#4Mb3Po1{Z1G<9?I>p{W_9m2-SDUFU!tx z`w3%jP`1K5tLK{-I;E77p5GPTQAxP-!}Pkq#3nAw%CFSB+F_lO^B+vwJr)?xelysD6eSA*B_>!Hbm)4!A2c3&5W%$oAKGPDZJ z@r@7jZrWGaZ~S@9uT#O>@x<(P1AmG+*c451MIeL5C z;%@)fRK+Arovq3T(|!Drb0NM9Ka6+GqVtzEA4C{SAP_^+HxJQl{c?6Su&}m<1wv1Y>qb#^>7Rl- zUDw?7a70NvSR4>B*G!$im)yJSDf4|% z5vM^EBup~$9>gkDg2a>m`$~4 zU($tyT}m3<>kb;I$M6WpuDZA zIeE?|zwtg@pWGgSCeNf)=h%|Ax2IP}0dvyK!OG}i*RyM`BGS{>PtbQ$#XIn6LuluB zEOuYHpKniP-dp7}mP1^zo}mp_oF%4(BJdI@nFQ{TK`#?E*L@)&iqE3oI(uba>g1#q z8*vHnrl04E*PmVBN^M^%TQ4ImD!`Kf^$oK${d)zESu{CGrU)8A0^ zGKqZ25>!d}BPR)}Tq6_SH`)l(kZ8-INeYZcUsri?vs|+?^YA+6UrUt)1sO4C_>457G7A$0Ue+e z$aZ%H1q`UYXs@0JC^yP6-30fyMX=%kI~6dWX@HgKA=@CO}AtTrtN{k zje(I71sboQEBgUV`~kB@1R_2@es_QW0R;Jl<>edD?+fnENO$(#qrDcqBs}Znt1ge? zq&DsosnpJzKy>hg(JXkWhLakY$jlS-ISwVc`e_=i8R8fR(=LT_*y9PL<M9~%;?X$D9FG~HOPuRaNbC&yz zp0L`FyMl7}liQEY2pPa(V8sr0ZPDOvmIY&^F)%RJ<{HGn0cG5gIy%2S_bvQ+OKM%FKJ4CL3-@pUJ?`R8tn;ttZ;z8 z>FkX>3frSKw|+P7h?cgIziIppSISQ};^v<}e@-Kic_bK^``ufyuMi1z+O%!su z&xEkJ`@(Qzl^sEk7HZHyosm)N(ALx6AFL)t|3`O4#$66)a-)!qlm13?@5|;w^HQ4~ zNk;T`Ss0D<8_L?kPJcVKKvN zq7E{_lYiUTjc4~&y*Yv+lg0}Me+#=)xjK=BxR{5$Snj@FFQk(T)U7aQw0cTP`iQLA zb1m1U;L`{~DpgUe!1?6zWT&)x;#a^mX!zF_N6^NW@-t3U_dGvusQ4Z)4VAo+x^TV_ z`aFqdUvn!U1ixcS-<&Zr7WJ)OiU0O{v`sm3h0X}udy5~m9^4i01%1s;Q6bXG&%Uby z^#jhnNxjCurkz0c_$o_i0!b%`w*jnxIb`?{_}ah+%IY+wdG2edQI zYq@b8h!aBJ6p~T^1D&FSlDaxEFptyIMCE?04kI>TPNhMuBQ`|IR?x@Ufjt<^XFwpJ z7j>}8S{phx@j(`d^ddnj7bR;ijwXyuw>@@D2z;+^N*q`C(uJTlizBS5FbXCL!4q{_ zS!eGy41D2sJu&{mKFlb=c4KL$)bHcK7ySGBQ(9WIH`@7Pam#Zhp9D!M-LLbQavO5Op1a&&?vPVq1vD)o z*V%as-jwiO8R>ZPz^~C4VGXDehV6_N7jm!Xh<`C*#6xpf&?)W;S{BNwi+!`fgn+w( z4sPjA1=8T^o6RqRFu7ye0nn=u39}J}*We89uin0;&Dc!%d-1+Q=hXL#QkY<(s|llZ zxQ%xavxT+T>+}Ot(vm2>ju;oJbe-NJ!7>3D>xFC(xFxkpp5wPm-q%hU8CsyYVz)8Q8K+ZV08kSJf!EfI+&R6Htiw>rCINCHMEODKaX`O<2dH`3!cxxOHs!B;7m ztMPj=u@h)&K_d|jQ+oj0wav`vbN&5h`^R1c*;XzzFCLYWvc$@9L5mZF3SUOuZR+g& zTuOjn8dm&_VC^0145|{L#8T>a9ACF+lyNk%Z#&JW+5kP&8Gr(d;7Uzyw+ zl$j71M%8R>7C&GPxIF*2w4C5nkW73tCq$(){*8Y6iPVkVVAX;wiA)s1!1l_#5uz%d z{GXQ}44cQYa&N%s!}R@8PgmtfkDj{O@Zx2Kd*vIzhYaOBrWtc-5S|f-X)Z`-N~C4r zM2V3ij01W2MH6Qka!=@q1ZSAt-Cb#@`fqqnyh_O!Zw)B3ibGX{!L!gEfpQW1Oy%A# za$(^Z>qRo_&;vDzv|k*TQ)rdD-|3=p57kL8E52<2krO6Y>gd$oFX2H=JEKek7lHA3 zitc2&8*ZW-p2aShRaB;1=e#MIn9zsDhlk6D&KqEM zL2x5KDU_G6nTjVysx6(KVVRIjrs;0ZHj;pi#E4VmGkEW&n~6h8wVre{bMF`9;wJ>G z1F5NY7oCmYaP01NrY(S6?DfsmYQk6ms5LtS?NK`}zPP^`jP7ANmbg^Wy`1wD2c5U0KV`6^TN^*b7E0i*GlhmYQx&xMw!sMW(h1 zicJwcLR_-7+Bhe$y{K;!5=Gtw4Lp(5)+si$F^xGzB7o-mKbpQfp6kBEe7#AcAl&=1{`rJf)m9W_*LIiQAXj#uAX3`SXdRkn z3!X-V4TBof`t0m%%eU7KE*KW=`7}3o%UAu=A<|ky_-{^E3#ZHuDDRMh0nlV!{QF+4 z4us#SZ|@dQ$IhPXX=4Tc@d!uwCt-H;$1m98v|vW&oV}+ODGGfDs^XsHn}~V8Yp27Y z6gL(NnnW%D22*A`LWi5TRGj9udOGd4SLBxe0Vh^3^`TG8CGx6BFbNeT) zTqeW*e`~v7G!cs^b1p7!wJ*XK{L0z5@;{BthBs1hcBwx&60a!IvMw%@8l9;IUNLeh z;)pL7tN~B@DSv-Fd=?01eZZmNvgb+U#q|=7r)Jo)%M9H_iid9egB6a!cPTlZCBwsYfxF!$2WB1nF(^=pee)W!L(J>U1 zY|P&D!*@?o!M678{9z!2cykCEEb6k`wS9Y0_u1(mK@`BXZf@%p=XCWEZ>Ey) zrKk`3DIQD95=RY5a{0Ew)#c@fou#f1w2MnhoQcQ?c4|0bVA323#RQBpnU5XQ(8<8! zc%HeJb?N2HujdV70x5VFatD=mP~WA0crZS)eT3)G{rg7`aWJ$U1(~vp*0m3z&4;a7 zU%!5h)Z53nqrGAEN?c7Lu7W9I$8Y`z3C+R3BDOqH|69a6Q}$`Z12-WHxPr$PmFvK`FI6wA4NC} zy?ws<=FQv*mpr)MumAM+SL)2+(G-L0SRHc1OE;NH39XkG*kcOgHckX!v_XUS@H8)Y zhwN%TpMyREhqtq9h}Za^vZuVu&eSX&(U`r@sqRVX=fFaa;LF!A$JSb)YwTH!Tw*{e zuxk#ffuS%x9bG;u{HwQbOUN>4QpCC*@_|n_QlVZVX+;yV?i;zGt8wt1)B-l#pc-{N z4b{*~>6SGO*kYAnNYxBG?CJ1u1_e`_%s`!&UC?Y%x*J|j4I*`v@F-o69h++yDUU(4 zfKu=;No>SEgd^xf-HG<3xZwk`3)K)VS_7;0RfJlQe6@xk9^1Y_nmMJ z*U;3&K)HUxo8pFsYf#sBc8y&Z7Gjp7o>5i%ae3zoMacTZy-$)-Gr19>VuBn}eBM4- zis=a@F;TO|U^YzObFeHQ2~<)!+UKEkMUg0!^YLkGYXteLF>04kb`~xtbHhd3WO+5m zw(w3W&19~ngx_TluHs0lY|kKu?YKJX(U|5#5@=w(7*DgZ@Fg&(|ERM()n19XlbFF z7PcR`PK`e>#6XB}l3wT7*mZoX9V#k^n>Vd+kueLT)3|te94sy_Ml+}Zmu9O!IT&8b z$==7>CNs6r(La79!Y%ldgUhJexWR_KwsCq+$23T^!hQQYN*}0|7`r z+|iQI;8jZA4vO=GO&k$0;w*53(I+O2RSy~%48(aaDg(UN6*an^M@&(XlJj$6yd^$- zYJT1TbDSlNs>|WTp>`GiDY@cmGdJ}iqUKvf*4l-3C)srZNPi-$4aE`kQ{D`YzkX zL;AvOa2v;JOQ?yo5HG?t-;dy%(z$J$Hf@4U>1jWBKkd$`)ir&VQ-X4X5L=3}e0G+nf?l;Wt!Es{C_8>NZDo4vpJ4%e!NlpKsJ!M>k7WMk6{lmFf z2{{4R0c4OzU}R(@%yDVQo;}MqN9Ac;`8k-F)EL?lVfBrpV&MJ|WF+PAqm-1AdI~GU z(B;Vu-}r}fDH4x}#&14HVRo(}Shh}9{}qSHk9~PY-A?bcc~M4Y;}Ze#3Qq8nn4ZYd z6BYu%P0z?!vbJ`vHutJ1pfO|I11={{7{H%9A$Ir3$0UCRc0!&%l?Qdar*&NE)X$QzDS`IzWh3R&%DQ-PQjdRy)l1jZ)Cl94!xzJv*Auz= z>d=vV6BFp`5ACyIJ>JEvq24(VxKZ(oa=^FtxINdHgZ@1Fo~wvE803bW>`?J$B%z%=qg9A%B$ovMJol*T_i=8;^uL=7Z)eY|p!oJ7kW%f9vWh!qoHr>9eE;^%4MX=+=nm#|Rp7x7n=&?f?dp*g z^%Utg@cX#SbnvwQxIe>Lb^RtjErvFx@pw^5NuUMm2eyX^BObqO|0cu@Y$Q!uaZ{s$^nd$EV~ckmkAr8FMgu%X-6zWt|RVa0A#E z<0rt<<|3TuS35(2AC%&fY5%T_^Lj9Ioj>kN9%Z+@uT37$`bTc&{WfjjJf2%)ze4|G z@|nOEI%Ay}r=X=bnEovckpmqklJ!rLLcS?9M?_e-m&6x6?$crN{rxpcS}>q&hhJ!V>4Gn3lo->#YumdM zx4lg)8G8Ic2S)HACyxBWY|~Ywdteu#yhyor?N+z>l110EXYLq67(neysV3d@mGbl3 z=HJYfUk{KdfuJ9=g0wc$zEP2Gfsvgw0$LFPjOr%2-#(-S9aor*0O@Lrj4nVp%+IQ( zU=D+i?c(XF54$_#>!-DZhrggI+qThe<2!>rtp-fppPD*8{d0-@${u@4g7)6k5`$vs zBHV8l*CC9;2tuT>bxzur{ ziSAX%Iow-QNTC5{CM4nOOQ{wTkdsFFgHx@FL!ei+sgpu!V=qg1&?V}^_V(UH2HZEe zU|x7608M=fLxiVjp0?jY)13gzx&9mOWnJlx$eB>0Y-%X(C8k?ITy_1s{i(y-4|hal z1k+3Po6FEd{S-J!t$R6Eurevbf$z6C7Pa0sDyf5gW6z&ohD-mgX489nHA)l$Wh5htingy40I7@0umCkqNsP7|!${T8DHtpYp1P2jbd&kC z4zH{^SF3cb^nr#|`*ni6?Tw2NUv8r3(n2zj$KdI%X&=W#xTmM;k|^6k-gSVGX3!ny z;aFmNRz;Qz2$Kry8We$f7%0Z22j^iemLkmRUj&aPhPIM<6e(!3AJsinopuWTez9 zs}(JY8{V0VqocZ0Wrm1Bh8m$^tA7Q8XAfJSlpUxM;C1B2ZR6dvE#VnE7%Funxih&< zJ4XeHkN56cr+%=6gaf_Vngd}&9~^@Z2qi&O!j6+sepPj+v~&sN+23a71;^}Eoiv1L z@0|%sr**s=N>S--;}n=?AZ6f=pKr@wR+<1x!WM2Ae8)F|$XZ2rnmfaM4pi723|0a1 z_Yv@B&3~$snMc)UkF2DoQ?TqL6|JMrl#=oWAKC?q?@`|Dl22a7hF$5koneA-=Hq>V z{rhu`;5mYrf?`-NC&IS+pz_f}X>cNQ!whQ;e7{$}G%n1*KnZXE#wU;c*5H78@m}3< zlm9?Qh#8QM*ovROb}1-`z%M-rkCI$5KVXb7*PNZz*(Ma@({MUORybF?XBu{l<``tW z4?FZo^H0yZy5!B?Vv^+Pz(5M_Q%z(R<%5GI`44U*cBhgGuS}>o3$pZi^6E;gTiulB z#7A4#QR`YkJ+nK0+a=q+!M?{a#l~4W$b!iKU;eyM{CgBt8d9H0w9(vPc~(~=)KeL- zg4M!r3cPiE3Y+lNs@$494i{oQD-YLDAHTC~?Z+=70#Yxbg!PB(V8&82{w0lY{cCg(d!6eO>eTukWx zu1sz*H@8xciCf#B%ZW)y6avlouNbP~-m*n;ucU@^Z(Xwk5~uM@{ym|3qM>CVqd839 z%C~9Uxz2iE)G1K~z`RkwEU`&dOzu=d1bHHMO2T!w>P@u5Rhc<-xnPQ{79vNYI zR&~o{|IbazVkI=ABO}RRv@xiz7?4(wI^J+u4&tuU@M&*(aB%g+w5%Ng#IblgGvTfIIy zZL%nfv9*H9=|~F=%UKRqE~YlQfqeZ9K?}`GJT4oQ;{fBM4-kgX2dbb#T&K6rg#UeX zd@IEqobX90VPq6P(j_27+G-kIDv3wy)W%E=Y)nRV-A6vuZ_<#D4UA-7JsOjr^FYNN zD6f=I*fa8p+8Fl>2L}gR9@&G;0v~U0(sz(|aVdbGlT#P>mV6*bHp|x!&YtWK7&8;30PdKHI9VekS)&Q8ghTJeLW8+t| z`ob(cN`7K55L$o)WZ0`5xNbTYoGP;%0CH*(Urh zHiYPSj#eKm4w{={(+Wr@4x-bh4u|Gp>!-eSG}7cuFqLjG_*J|0ykwh+C>0gYvnsar zy&~a88nn(PgA7S^40(37zelKhDZ?LENuH6H5h%85zjv>yfc!CF6E_uA3pMidFs_bU z0YM9;b>~xn3#}si8vVTet0P;uxJ=M3l^(^R^rkfqFjnOdqN8V*<-MFyP>D}eMsp-iT zxzccii-k9rUrypjJT+`oE^eN`-_6+h_}&OP$mc{Md+cY{K~w9!5>IfMLgzRa+i)%C z%2#h2YS(Y68`^}Fy_8BDdW)Jv!GOYEoBb#MKyColWXFN|ogyN!f|4;Zwco^PU9U9V z^YB=BVMCi^*{}Z2!O3Y)KBLFN>m1d!ubN7}A1+%R%K@ilhWhq?L&G3lh1w5e`%}{f zR7k4B3JfmjB}91;@?7~gExviZ*S1|*$}2mQ=X)fguA4eUnf`|@f114)jbQS7o4MD`8$*y7&Bn<& z>CS+d^dvd1!lvwSb5O1NC_8F(ScSl6(P;O~7Cyc|1NFCrBee_I)E{eDGcta>Nt)if? z{V4sUYPN{ME{>s#Unx4DcU@k;d8-~Ew;g=S0Vdm?ibA#Sj_gG=_sz@iE+HUctn3f6 zz{pC)Pk+U&JgCKw5?LL*^wh$FF*`fE-|7!{vSvz~j|V^cFv0a`m!FOozkgGmvFE(S zcR8kH^b;rB_Yy&Cqe*{KK{78F*}WAZ_BtE9f(O5n+VvuQLNk zr6cz|A`O{EQ*iP?EiLxq`rfPdBlp*QHwVSh^$Rk5;HME}kGiFkL$#OokiZ&Ut0Gg= zJ}NC?IZj@2+|0A7)<^QelirIxTL(PJvh?BxzViUpM)H;$(TkB&!ig&eu+^5`-)ABE zB9P#>*^ipn_3lP?czJk5^axJfsW%&C++DQLVAh!6&9pCmdu8xv-`J0(OBi*M<@3e_?f31CU5WCq;Hm6E1B*GymDCXWhMQok* zNC1JY^lZaO&vw)Ygj6H(TiT(as*pqde+?31At?Y|B5I8KSru@~+Zz9);LeOJ!x;^Y z4Fxn7IDTPVZ=nz2$I%lf%078`l973&%+p~8N(-_ebkQ*gYkQBhQ%J&J+T4eZhYJZf zsHPWRD2^X(jiS3UVimZ#LPYfaF(0{;Z|_G|bsc=A^q68$eRdp+1D7^=1m#0!(#tz(%ympJ{)vC}g<~VzpbOyl`HL5mpFbZi z2}9l_Wt)uQPHA{rBNfD23Sbw+8yE1=0p5J=lBjst*JpY~cUZ>uVzYy#WpvBm)r~Fx z{_bPhDLkR^j^;*5@$E0nNtv|QH*QE~>P*R-U{B2IdNg=|19uY@3&LR`JK&;6|$T3=eT_I37P}<;mCI-+vm>sMl43IS$07d;b}+95d{R`Ig$- ziSeQ$S}T$8cAIr+>kK;NzVhZb#b{o+uAQ2q?#>=L=A>~liS65nubaS!zDi9yzh84P zz-|jcz<}C`zIoHV`cnwRlm=M}n{W*xckv0D6x#UrIStv+RzY}Q3HY8Dk*-j-61SIP zgUkptgtrIvkz@@6!%EMgotRfRiX4jo)FT7GE}z(p0|Y9-R=ArXOZsw(-H!T9f7V&| zSuyFI71ek2geZ@d8JX6`iEqv&J4m#s;|ro;q6W&#_ASvX25*jDH}>0Je0?|(^g z>S0^o3+B&bqxsFj!2v-*t)rt`fbzbY3x16pGLmCYf<(xG0~moV=L`YOIzl>uIbsPC z5au^GK)37I^M~l5k2*USCapqv)jB@T|LWDNJ@9A&&i8382dpw+dIWLObKbFkI4zNG znqn=y)=7ajfGb#MW@88S{WxCwN=kd~4OU$dJDeY~?Mf_pCMdx^uN&id)b&*KI%$S* zV`F{sH>zz0V#BIKpRJC+K?8S)pmBA-SJ5^av1_ObAQeUClfj)Qe# ze!eU<=*@lK4TOqCx~ze)NPV&&4b5wsTjPPATg#{VaAu1uc%!sEI>=3lbnXM^OYK$3L9_a*21_VEC?oKOlOy!C?p&I_1xf~{gSf__RL z^<=_~pYVk^ZAmU2SmM`HN~!7T?<-pVvV4iu=k)&D6^K=@Dag6HqdPIOQ=8g`f_~%V zDKq^Y6yefS>nKhzZ)BsaGT@#{ZEa)`eK+y4n?|MamsZ8rW*P4ZH6)bO#V#HHA4Z<= znCN2gzUE?Up`IWg1}o&?ITCOI>-Ro@ARJ3_zncWopAoZq@+Odb@fiO)F(+qpnk#;T zDDj8I7o0)r5){VkDs9R>iQhvlChm>H9Ju&<02lSJ14fbpCI*k5JQ)xA==PUrq;ov# z@Bep9NX?foD5UL`I zaLgjXz|PUrlZ2BFkB+uMw~qA?2}f(IgzB5hC&od^IUzD^8U3g?kU2<21cZgDu|}hC z?|l&;q29_XZ?5_=MIjF8D_K}P8N5VCLNf%^eGT1&_#*|VegS{Y0QMzP0muaL$am|r zS#6Md?NEVP1z^)J`}>oi1P5$}>D;`sGKT-n<6W?kjERdwQZfVH*Jd;td!Vd)^k^OQ zG)kkYIV1SJv#&1J^dtrmmCV9ot;!Cu_mRaEH z)4L~L%aKelRA(4<06R_;_<)FsTIlXwlUGBjX=xfFS04=zbAfKhX2n+}k#vryPBDs# zisIhShe&S|i)9w_L)uV$FmK(u8A)>I0GMIH9*?}&g3x1f;URn(uYjbYlY1V-XcVFh zEXO%`c^M$&y25us3A|V^Zd!^q8KyWb zG8%@y5%)0-unI~0dM5BW7&IUWX5GJ~w?k8bm7@aKYXc^4kof8ZujHS1>}+i>qE!5^ zssJ*MC;Al>oD;ACE_t^^orD9ZO#m}Kfa{W@etxRTu+c9kk14{8j8hOItjl-@3;0D=u$S5Nx z3uvq-pxNSqGubx!{*xW1u*k^(4OVsdf>c}XrVr6*Kf zf2XIXNB%c@Nd_<>P{YE-|Bwk4gAW2zx_+lGnV89&NAwC*6#PsceU)pdacMcYK2%kP4XNH(2zCV)cOPb|^4bU5O$% zWr6c26=}>1_Mx(KNB*|FQ#-9(h2cxkv2F--Al0nW>33Sy#a~n^EUc~j2`WUOpFz7* zrl3mnEVg6~jEr1EZK#9RvIZAy!|C^rcO}`E?GR%Pq^6-^?)grDHP8$^S2nE3boEk7 zK6`oNz*Tt;^Cd?JC$%x1V!PwEsGP~;F0OjE zC%%yA5pc5Sjw){=lyscd%Xh5m$6Q?rO|~u%YtK?F87&2&6bVO$OYbyq3H`boFET1n zB?xcZR(MQQ!&8z>46MsTtL#~8zny$CG;j3m&ftLIw@0Y?SH6pAes4`BAj{GZt!DPX zZfWTRVHP?Nm7i{$Geo+Q*GT>8ZQyN>xIU3#(8L2kE>wd^bOdmYdCQm=+>4EpE{{v&2(H|ncUkk;@#EH_-NkiBu7j_0L#&j`(W7d3Ew)m> z!K##~hOD~PK3~O{G(--_y)ZT8DKixbq64v(q^E^#g(Fo5%g(Ia9FlcWM?L7ic7WBw z(Mf~{z%?wM&Vu@z6ZSVd8%Fp7^kz7qiU$9v>dUu3Fn|1W9)XAJ@*tja7pA*>2P4haiO1%DWTaTdYyIVCi@*}Wf-oz~zwI_ZX zPDGx4{*s@ED+{%SgI{t078Q(ftVz4le4pg&z%E)%M@I*7A_A69YWw#Kez?6eNBcy_UdEAKTQ{7Ds^<&@WwzS^D&xe_LdMArbW=ASj^VL)Vz*+Z&Q#SYvL~8*Y2Hl#+R+q7Cp1ysXgFyO$32Iqjmp?^< z0&OEQpte%tZp8s$IrI<}5Fr=jvDK??88W~`Ko<>V-li=I^83!Clb{1T)`#jQt2Xy| z_T!PWWRqc`;W`tq5cLxIV=4-n#hIKeiq6i?SbWZz?>+lV{{3$GSBQY`o62WW3%*3= zG=Ny>)zio=F1R=JN;5R{!5sHv8HPi4cIKdg!RhY~I_eLq4F@aaN?4Ytn+}5RU2U&0 z#7J2xetGNQ@~^LIUvUf1Ts2mOm~-E|z#J%LiT0v&>H0JCErY=`=jHB zqX6gK;I!Uw=drn|sxRJ{<<=MgD?dPk&6OFUBmsUqgI^3D;*0o~+x$KL(mVUnf9XOm zFZ~d~#U8=Fk?G1so=tfr znSTIUSRD|bvf~K-JXkj<1b=Mwa*Q1i04X)@ zNVtsVLjt@+VA{`M~a{|Uv!e_aG|qUPeT8&o`}0T{@aDyw?7>@ zSW+!fSXY;JiBp;diCUNiLi#hLnKCDaWk{4MJTw=-er2lVXO0eYabbY^fc3VFp`qb(08eN$;kh_v)E@_pms-N)tuyaq`^>oBxvbwn3P zuAs0mHciyd!mQWqi>2=y8yb{Apu@vh058VI&hGufLJw3CGiZxO6>B!31G*32x>9F? zZu0Q(cq2j@+Z-S6-SqSsFW zcKY~$KY#wD5Fa_Ec6~ep3pB;FL(9MFit@WT)0PCIr!9 z6b<>zj|lpKR)rv9hYx2%#^L>SLLJb}A;>%-J3LXlV&(3>;{qf92jo~rMMs++I`kB< zN~Wyy`X1%)47hj?x3ZN;RU!nI=p>##ot0C{@h+)oK+Z1;w09)d5V#MDd%)H3P%g~R zKhNn9a2`&;7v$J6 z3$JZbCESM^V2U?y54lE02HUs4(4o4eYrZ7F|@X7zD( zk1EkfW-W*MZTHK{I8*qdcVIvZj^C)EuB(QC)aW)bGmCieKoz$Q`zDo~(AC+^vaEAD zpUCe6>bPgI2|*r^gdno&;(BpdD5Ha_sm@x}ns5|(hcWqcP7FJhsBm7N`}b!F2Bpbq zX^-)!5&ZaMe7wcH(`+5Yj>uSy08I^*+e4@}N8P(IU{lw$_;}0Od;WiJOTGXP3fJnT zB_vqyr5?DBhot&<*%>mA$0RMM?gTePPiPjr0ZEfIIV~Z_&O||M)LlV8+)~%wJvw(r zx<-rX>9h|Tc#@5XEskj6OOuFIhgyN%Oefz(JS{6rA8iU&wwt@VBU%m2Kg0K3cr67Yve!yX}k(nbTBm|9r-_Vftik-Rn zRiLCe>SORtATD)f2s51_6b#y^c1{Z-vNpFej&d=GZUe|8rRp)0Pq znzufaH0L_S59J5CIA&ldc)M6@9l+wy7$bE1U%RLtA}3|>rgk2AfbQE_sa6WF32MiCLkc1Ha#ceDK4zb_ zsd70`5-QrY2T={E>ZSnq7-Y&7RcHAc+}s9S*®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

BSXsXzHltUcL7}9zDAFC_C-R;Qy$3#Af+y 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

)xVWodB-=fOY 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 ClYhtn literal 0 HcmV?d00001 diff --git a/architecture/epicyon_groups_ActivityPub_Security.png b/architecture/epicyon_groups_ActivityPub_Security.png new file mode 100644 index 0000000000000000000000000000000000000000..c68653ec09234fbc720e49d0b7389a3b5866d698 GIT binary patch literal 98340 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 qZxDN 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 B|F!@C literal 0 HcmV?d00001 diff --git a/architecture/epicyon_groups_Commandline-Interface_ActivityPub.png b/architecture/epicyon_groups_Commandline-Interface_ActivityPub.png new file mode 100644 index 0000000000000000000000000000000000000000..5aabb8f9dc91314682b3deca9874a2f1343eed03 GIT binary patch literal 77396 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 F{T~CiTWkOT literal 0 HcmV?d00001 diff --git a/architecture/epicyon_groups_Commandline-Interface_Core.png b/architecture/epicyon_groups_Commandline-Interface_Core.png new file mode 100644 index 0000000000000000000000000000000000000000..5fdd5bd0e52294b310a9ad46d8eb45b79f0f7fb5 GIT binary patch literal 55560 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πlSYyn_5Cs+X1m84$7SA zAE#cN@S;hVX0}vgS31vVD|$3vIA3o6=%WCSAA4EpNSR#h*SBz!zHQYUJt^ZkUl_c( zm(_rzoIswd#I7r;M1ca47a)sxP2DLAHNY1{@Bwhjq3HNvC9N;p zMT>o~F7<0l1#YY^+QZvOO{keV|6aL1FtP1`iJD)EoTS>J!oVj-L*;ukci3MR*5s1g zOFH-1w4O9U)T;vcz*}vtXqDO~{HNCQwsSN3mODy98PP+?R|QHio#9W)#S`XYt7*c__FUCrNuSzs$=f z8(?Pq#7y=l##U4P!Udzavqi^7+j2P2JKn=V{p^|_5mUI2pPw2Si{yiKg-sD2p8rH% zXlQ+aa_vqM+5a}DtG@F);6DtMKqD{qC6CJV*HW zQWK;;tkB*5i{q1lglCdzP!#bCBP1cC>P)-MS2H9|nVrX?)9Cr&~dyxemy~7s5G4#a}ulx;wIxoe?C1vsr1 z|KpkCQF9i~f_s=ia!eNGkD!-uA8!*@T|^^A4%qY`B!_3Ty;X^5(%&aWgv?5dKfMz* zE&fKxm?^f>Cq=|YIM8{TJe}L;Y_i!)JCM$}>U!$I<;Rao+~jgn&qOCr?KbL5JXKY8 z_@(Un{4Or(TjoA8CQ`&jTM&j+n=fu(FG51t4}iSjDX21Psdcj{ZP5mS1pF0K;n>vM z`I12{r|3*wK>bHej+`6eHx+ueU!vo`$-Ip$Kl^e6+Q=B-$yrU)=fSFB>V9>CtopYz zCe$d5$;#KA&=Wx}#m>g|4SuNMk&*Ede4xu-G7QKheD}vNch6W9D|b3gMc{C*Dn%+ z9iD3JT{__@GwO;7D-s8|_Vi8FZ*_G;1k@L4Z}g|@W9*r_t=H2#HjcEpOLKkE*Q93Q zFMJSwXlTzdXEx{>9p=}?A;d&qs6Wcv@dRfArjMMu8|UIb7a`|F+#XC>5MYI51CH#? zh1tX6mndEQ8B+9}cBLeRn!57UvUAiD9PSNyB&dy<_OwYg;nCF zIfz6bX9WpQ4dFD4P2g_=sEtNq7&CmxPHJfYvH*07Z%#h1821Q;KCYB$d8ZW(J99k^ z5A_K?#Y65HQKrsvO8#?lQdVm0_In7jsO8E%TVV8EI{Tj2cvMzavX=-8s{MM{8RsJ( z9_&m*<2zUHY*KcLTw%Zap|STb$QY@DHh8R9#IZY9R{n`gOBd@a)#CA50yi7~&>ml> zt+G$^$AX@Yz(4K;mq`k;Yprke0^>i>7I*{HszSt775_p60Y&puD|~E_^5dR?9`aVr zIS-E$(42I3m%Vr3PH0T@MUfG#HY&OF+jolX>DKDBw>p~fx=yw12=zi4p^uVS-P?rGdYnitin1N7f0@nUIhZV=DqXUPcqsU-eF zNvvn3FikSvm-|4<2AK4jhmD2r5_IK{nN z1t+-99#)Sirc@I>?Rwsv+h=c)>k#0Kklbu|iKmxbUmUfIl)v_v^X$8;dCv$*@@?^JN*c|b-)n0Jq17H69XJz^=y!p{qdfQ7$onAs z7f;P8?$pGL{bd+2u5fCgDQ^f-zSuO5CThhoM4NiYj%0vMje8~th2TWjQ$LNkHLH&f zrIu#}Y#BBwE8BRmKyS}a%ytB%{1{{2;tNUl1eyb!#Wg5lPOxBvewP%Y$38YjugP&s z;>TGT5BURa@+0%Di=ku#r!^Z5ztVjLEGl!wR~RJv-h&r{Cxo`0!fW@hH!!720H z#mVN7``j)W3y=CK3@&4xO<~Ssj<{q1!( zOIMKK`__-C2!P>luC5LQ*>dETiQCjqi~d^Q!hh9@L#?-6$}$tkW;v;&r#=yRwO)|B z!SX}#82x5`*y~egaK=JrjqUx~NpqCb>}8}UeT;)DiIF_WRmrf^5S?^d@r{v3E#EI# zpx{OcT~zqU-!9`Wwg2DCEYC*23)_RHc*Z5u8UU-XyYxY{Y__Ew7!rFv=ba}}QB`=* z&S;yB!2v-wC-7|xO&j^_dEK(BGsB4%K5!;_%#E2SN-xj8?qArEF7` z+}zW%xYu6YXY6A8e}G17{`&PEjv%V6E1C zclT?tnMI9}0+s}7xucLCh)D;mb*jU@`uC7a_~YZ7Bh0Q$UnF0b>eS5ZP5I;oiqnYu z_N*1M&;P^|vnLn(mZ0W14Q-5Mnt+z2#^+8M#EFy`-X1%l9zJwG-Nj0V|9u$i!(lK+ zK?xV;1snLYbM$w*O>{hkdQa@xI?&kC!?QaSNQd_p*qysF>rAJ+ENEk8SBV*k{hIf9 zFrI94L21StQExIHqdA!ichp%PG{^;n`8n+9(Kw}d1pp&HPV3r%o%av)-Chwj9R0Md zhO$)VpS{0SB6RSn3h}pw{X}&LiKQrIsS9c@>uVX;_0Wu{3<+t5yZ<3g8hB`b>x&vkaU7`4h#q%pHUF(dnD=S<5XPOCMZ zC>YD1B7xl+f<2FsmMK|4k}zmIut>c3i;PolZyJ^96T_#0+N6FnpKDKPDX8emz1!DW zfns=M4WN6w3seSatcj8_h?O2iASxB@@rU-^U8CRM+&vScdkN4uibV}?jZ3^)owC84 zoJFx*fOZ9DV*TVm+D{0=>_m{Qe+Qw_Ljg|d&^{od-n%nJugzaPIb^Vx?TYr}pFsZ`68e&hH%4Z4U%y5>eP0{Nc{(F^;2lN;xqX{<7|8jw~rGU~$y& z{LH=oCg7|@06D#!_H^(1oJ|;}dH7s#)uH^F1T*~l3asL8E6fXDyGWM2J!g8v=k zm|^&;V{f1Je!K$S#jB9mJ=$yVEVf5MaD3uxRh3RYLtu0$msg5eihn}# zH*g{b$!YT{2+tvN!lUshhg&}GMRxYn|t)d)$b)Du?m3*a^*f=v;?WmLT zWK8?o^Wf{XZiOEc!}_9y#?CevIhH90=m;BWu34V^wgovA>eH*oV2Z?vMW~c}?G1?h z_Hk{CP4&4F(>v-XUXR9`uk$Xr!%0w*UyDh4n-45TZNVjwz%)YF^!a{j4Dp=@Cwf0z z_pf)272w*J?S3(oR!gFgG*a(S&&#O3K*)(BA|iVIHMY{y$Bpu~^#)rj*Lu4gc1ymH zpVDe8b<9TScck-xLG_Z-q;QOjq)hf>ZPdd;PSD$)lA3Dp(H_(oSY*il7Jf8YqC+Ii zn!AM+-#is7&0D=x9?Vpt^ml(lP`HNXwSD5|ALc8*^5LFSj0oec*3f!6d@;`+x?O0< zY>_T^`^s(ndxPvrEf$QN?E#TpA`6^itZQkv!wGCVk(1)zzkk;zI-lj{h^H<2%pW|< z%Ig4(-=nVqg!QRYr#!*(%{vqo6FL_M|HAOcp)sj@{$%{z!tBbtXX)$ll6)pWrFCq6g2uUWjfz8~Q4ifzR?xn=bp9-jSZj|_xA>>B#4iIz$fl|Smkg_-t2`5m|DbX) zCB^{{@o35PIQWuiG_ybf@nktw9>SwEO5!8cHMdLnxiqr_l}&qpOn`uQ+pcFTT7+`0ycL-5+^uWr_-)j% zua&==4{ZJT(Kn~-o~#%|X(kirNa@Ye`3Kb#+CMcec-p$x-uE*06%d7Cs5F zAyx4Gir@F`j|QbrQXtZe=(yIJl{vPhwemu3nH%<)wrR255xi}|M1sCKXyCiXCsYtI+ej{Pe>-1MGl;z&@+^IANsyuxK!`NHt?)D@$7=`Q38v_J6LD)q=F-Ic_2enlflsZ z919s~D``#9ma)=_isqDHdFm@~+aH4@Qk&z2>>ECYyYrv_soKIl>9re+DcP+VtS%dp zCIHh=X6a|Rtu_!?arb+N`yOvLV%<~^Czp1!^=Eu(%8t~p4#8Ojc202pPUtf3CwK_G z{(6p*-qCG|$BP6bh^te5t?zziYi+fW_dVr|&h#sP!$xetjAnllM4G0sAunf?Bl(P1mhPH)O~>w&LSiB3--enji zv+{C>&j@Kx#!U8|W9z;@>x_XWo;god+kjI+3pc%#B&YXmwBKYZ){J8{`sVXSCWhRJ ze1^qm;&k^E#jPE3CL{;aR|6Z-wExorP@Flm*h5De9_Xw(uUch%vFg0lHT}pFJ{|I3 zz))w{ytX{HR!qjWrCk28iu!n-)j}B^>6G6a$4-jTE#_vF?+lXHeNwpsA{YJ{k*Ef} zM}o7t)=O*Xze+!p@gXa}_mE@WX8t-}sMFxwj=1}rArWm?YHc^0O1Fo5U5jX4)RXJc zdHA7haQ^bdHn{T$lP@7q`&M0j_{`qQz|P$ilib2_+1I{}XgYg)hUV6HS`~QjlOo-t zVAH-TQ7bTum;sP^Y<@+{=I@(6)lH@@@~Vh`py1#Aw{0x zHPR3Ea@)~!o?C=EF^>Yljmq&@jfDZLf5~=XFth7dd2g)+6gbU6T>wp zyaX@j(Y)?@?KIm|na&~T8+PTK!eHtM-;v~n&fFC)lIPZbGm?WsJJ(iG@_> zUJbQBdiagK=DTSnj;GEx_kW4rb?-1;KgN{8?dk9T|Hs|S^84zlnu6%STtTg#q%Ju| zvCrr>X1`1Jv1L9|sONie|6L+ysz!LLS+Gugy;aTHqo0@IV*un zUH;3(9h=Q@M)Dqc9g6{#@A_`#uj}V5NpMfdzYvV?&6X=(8|{nYyi;~dt$XjXnZ&(A z+}G4{^l(j=MFj%8bd$#fD~T9VFxaD&ZJ3-~SI6ISE`D1$y?Sbvy<0@K>t;d6?NqK3 zH;&&Yyte$(S>3?EoGU4G^-9x{J~?KY(^1}&9+n%?{y*s$#L zfWPYIo&3JAj4Jh2Po9^LT5|ugPmd*LQZTCpROF_w!=!YgXH2i^KhH|} z@lc`euEV}2B@*AE<=bkX>0nN6O01ZJ@s~R&!StHd6MbYshxoUf@-gntT z@8nExzT~8h(16zyN7Y+IWcat@YsJ;*j7h4UySQHP1e?5F^XBR%seE_&$=@x!*ZW$# z?4G`iHXWOW=z`>M4hM*?>Ht6q1fh{)r5&NL6PVKO<2p35nGSGSlH9b~>et({~4`&ael zH<^Q};>R-7#5LOs96DcRY(7U{7cdKO8fG!6;$}&sScavA77AX-r*iMbjnD7HEOXZSInh5m3*;&rSy>J9yoKs zVQnR10NxlMuJeU>-D2Ekb@}Li;mH$|n|W@1vuDG-Nma5@LruBynkwv8%;6VPl(%dtxW+(6#!kZ{NW;Ue zv&CvZHyzU!-L}UE)fpId<=6{ymH2P7@M{`c8-x!3Tfd&4ImP=i|4#2xO~w=TS0mlG zMcN%j8|21QFRP5}{OhFXGb6L1E)H%R8Ko7Q^IbP;q^f$MFn)t&Q!YB%iqh!r!vy8n zu#Thy=U+-MO@Ffvg*PWi{<;Ra9+mwQRjz)1L$hpmoAr#E#P#@DIzyBAa=Co>{mmZs z?(;9yC)cXaL`NqXYw_y|rSQs9pb@_J^60G@a0KyJ&rZk}EoPo8hIB!V4$zCO=nXyp5uuQR~Eg zfPwI7!D(>AaBpvANx{jON1lwq2mnrFb4Xo7AH`ZSvWQ0tK>RW~r+3 zDxagrR6Wf;;EkfAXe(3x)C(GiPPC=#Z7*tl<0{dRX;Cg}!*$fsnrW3M-*=mE)t39rZwHJ+lY&NOE@ zCJzzTUd;S7_W+spV(`HI3AVx7DDg6LfZ>ENqL5XFdxxdW`R2o;u0<> zRZ}(wBy5nt9l0s==%adgn6Mwu!641lM}MdIk2?H(*7RHb^0T2_b(O_ja(j`flQ#Z( z_Y=?hj>_E&q^i;7S40@c9;2E4hSKfiuKww+4WU!3yE32ZLy$Kd`iDu`0_IEN{vDiD zCyLjg?Hv5|D}KjfP4$blUOk8vY+D6Q+^o2m+1Uf547!RMCi===!8|60he_KW-TGld zvOR8z%HrhJ=2L}F#I5&s)OWDWOp#2|mu6?lzRmCcx$Whh#f#}H29-0>8gb$ibkByL zvxz&M8F*lPMQr!Ox)&#Qt@42H)mD2o(rC>#qddOYLi_Aj`J8`wX-oY`v+VgjnFB&# zoxk3!PI-9t$xeaoOl#x+bg~SOMzwZ+xPFj3paX%AE4h<*`r6A{jTE_`=@W z=g1Ui+R~+jXz`n79?vdaNv|D$gJ@PF+yEjB+$(WE(gcCODd%I~xSBb)m|s%;yYE^3 z^JUvMgJ_XIz-+?#pT4_zfyfg;>p#}jTCx86=L_|)9wez9cBnfZa`|DGxQ}+%#MZ%E z`?G#kJhhy^z5Zf1pWfp)UjA(&D%S7avkFP<$wQ@ zR|)|<67n=$)8^ATkLj8RL%3v3ahX)juiprnGUBIFerve2e`+IUuf^ykhJVF#fuR0R77I5GfKy{i zzb{BzLYr$8${9mxG3vm8e$K|E z5PF&+XyuAcbw`VF(ap2r8M^0QZ>0C9Or4gobL?iMI`2Qaq%V6v|E#g`3$bX8OR%e^ zl`iHroZ5x%^jx!cb7vNZe{Gn_zPpIkXZn38iq&?n9z*@U5s3VVv+Xy`VbUX~tZ?pm95nv^*4^2IiTuXJZ(%bEdNav= zmjUwK1UX;w0pzS)SNjJfiCI~lg*k55L@1`mTE;I4GdL1E& zbrNBU%BN3n&+8Pzm2`h*asg+I{!Gpj8y2TI_NSM8>V4(@a7kth-Pj{+2lxB=`xh)- zSJiuKva~;Z{k<$h%1&ObTw~Q7+}2VOV@AF2OPsv_-Nw)S%V(Do2b<2i8!@J*3jPQ9 z#BetvSx~vR*u4@>L9DhH~#Q4brMf? zq!(Ir65#eeC(v!37ucJ<)Mjn7Y`7HZ^lFmjQ%42A?s+|eIyxt{$c{2E&{fuA%CDk4 zQ_7O@b5C)P692S-!ePOIdgJA(>4EM_Es?5t*~Lh zbpfrbGqOYA4~fL{OE{j-W#Ecajpg>gtSO&(D^BzneO`ZmA%8r z#1|AO{faLKdOH|MPwGeFWtB5-9Rz$e5PjuUwsMh|J^JyfeS|;JBzK5V~d-sBlDg2-i*AmVZ>T8>QVM+0mH83`-$>yXO+-} z^i{1|PJHc4cMXl1DTA08h=dxm0Yn~Y+GtwWNqua2N>=d(0;N!CiS~n z`1CWxO`w?=z#762L;6Q?*Qy>F^=A$$DP{}j?tORD3RQ>dUl|D*=6@5gXJlY_^5=Uh z(DQAHjr@?;MGiY#<*t%W@1>3T&a3ihj{uW0<5xPB3gw>jTJ4VU)R%83YSIQR!%@7q z?Nt?fTeg`fEtNm=J8#&^;MucK1~W0)Dj%)7qZA}(E-%JtF)tBx@9b_O5a{H>t&<9X zvDw6&e8kvxe9~<`a3L`AZME=vxBgwj^UOi=j4~dJPTjIz#Ek^OOIypb7k=%1baTTx zb#l+A`TWQa*Ln)|ra#9D;R&p*tr0g5zA$aa^H;9mp$te1SAEOy&-8r96c1Z49*$Cv zPvHQxPv@jIAV6VBPY=Sx&bPX|s7C~sSRKR_tk2)%{`XtCLeN?Si8I$w>v)Crt2=+? zciiqL%J6kf<=6N~#%f$*K6K=axH@wel#Vw&Od$1SvNyYSNb`rvhFN1trE%VRau4Io zx5<6D<$8eS$n~Tu@N`NsH|_5x@OLSQXE1iS$fi$~U1VH)Al53rO<7B+o3%UT#LSl- zL=MW`8lGjc^$|RtyvpcW_m0Lw&~m4j-Z~Lyzi{eHnjvUIF*aHeDK}hrtCZdDv8^(W zx*$i8x~-&OzB`ke#pczQp`{wp(zQAD)ZPznP3!zc zeK#2^j^8y@D+=p=qgW&qHFS#qzyT%Qw2R8)FBi8NmQ`kch?QsSwwbOfU0(@;;;Dq* z{&~mbO)Ufx5Q@{NR`xx6g#O5yn2|oU{0z^d%KXZ`ygNQpC!o=i3B~+X%2RLC$SJsE* zl)uax%wUi0w5n=lMqKggeP=T07v#XkbN^m?xY^n@#<(pLpuZU}Fw5W8Dldq9Jew{g6{ zl(?FCCFPtdFcZvflEE&E&QmL@ctru;&E4;H}&s{@B zW}nx6Z%Z!}-OQQ_Yd)!S?ONuALYFk^YwY|uS=nSB8p^I$4uyyaT2QlG_3mJkF7Q3~ z-AIy^FmNj2fA0N0$b>A3gpmvx;*}29SPTCPY%Dn#+AG4nOtPrE%*6Ronurh$sJzs; z%3$3A6}~8v^s{S^T0x4CaCzhrv6OYl!ZdsJw|GBYkWDKI==Y}9iBm;^WfIZ40Qr8? z@5_R)9Bap#Ep=Xb#f)2EJnz*+RZmeEyNkUs{>XFc-_S0td`qoKQ5A1JG3JV^J?Gbl z-iJ}AaJM`+6xS(sxqjH<(_N<3cFTjYCtP>J{qw?M!AOXOh`7@#i(hPvHq>P<4(>ny zQ*yQ>&|KhCM;kw_wLdXYVS(+0q@#KA_#fQcsX%OW>Gm}#3-OpOG@p!{g_cPb*_Mxs zO5gw3VBqi*YZu$jboWnuP90P0b*yr1rc=R#fELt>`WO413y20`jl# z;>cf0x}>Z0YapQV$v#CT%wb9qf_l00v5R2hP9r)1-pf=YTEw^R!iC4IUV3Z!<1UBw ze$ZElTE?C%jbf-%WHVw9sQAns!kcK*SQtROMTbFwdqArN^)sJMY#^C}n)~xBwQr~$ z9(#zaz#KTT8kZiH@{}2Pk=g7rF7xl_n>TqXOkUx!Wu0-D#+vK_dBFAuPz35=AT>b+ zFIqI0>O^%8XtZ$&c3^}2XeTmLmIOexN z{aa7@wP`xarG)#NzzewTbzo=>PM4h+y>^+JnqIur@8pb|MuiZnKEdK|{CJNP53wU` zThijs8d)EsE_f=qOl|+j+ATV9mE4b+x>sRUg8Z&j)W!U(eJVui1{{(K?SqKT3qar( zacG9!Ig1^x4A0NK@ox^*Z+Px9SZa>cceU$fh#M*lBUu`3RVB=jHD84}q@4Sy6{zc& zzh4+PVsxdH-lj|LNtWm@_>OD@7n4x)-)3&{))h(>;-?C*El6*C=Waw!K|#bF@P<{( zGZ(QU<^7{GF=K5-_;uUK7fQe*1~IEyHD|{_3bgfl<8>5;iG_(T?ZNl|*o@redeZI7 zY({a8ROL%yPIv6`YWuyOOI1ZllJ?Kv$1DG3k=|VUd&}Kj>g~Y92-0Y_P*O4?z@Wa& zE!TV6Yan4zGla%girGkyW07xClbxR;ymV>C#o0WkoU(tQB)h7@sl~@bsnWU4?*S_g zy(IluLkSuiCEW0cm=Iih^Qqd`N(T3G!q$|7JLB~;P2@ZNiD^)3Jh-xDw&9DSecbN; zu|Htl~t%P~CL6u&HEPIT>gvY8f*4`y(T#?N{;LX<&ic+eI@(&lCoL~W}o77 z)B`k5RL3dzkTrYls*$H0cRi#M_Vl@{?amGf;_}D2x+4uwPQKsoZDIKnN=M@IZd?m; zZmw7c>2?ru3J*8D@j+BIXToX>%)%QS5Gog z(vUc9+8yZgmn=Ws{(Fpp=4*zE2CK$}^ET~viPdK?9?mI*vDzSE4$`3%q3`?pAEhKw?8`nqCtw9p>Cz- zSD)|QDxObo@%t@)`@SB-@~_dswvznt(#xX2o9mC{R%N`-Rx&u0-)vLy)GgM3cVDfN zPf)wB>=Z6|QS%(CjcTxx_4dH^kGQy8J#=-~&R_VXM1Hk>Kt2p7B zBY2RB8@8bC-W`=~%qt`vV)y?_`_gc(+VEQ?LzE<;B1Fc>P%Aj7ha++^XKk!j-tz}*qzk}ezmtm!=^Wn#RWE&%ooy{7`;L&|auP!~e18^tYX!tPS zZ7!aK|C#Ht&7H&UCLG|8IZf@Mrmn__B(NG`=-8H3D;I!%OW5aO+>&rSLoS0U49CSa z-JGixDl3bQL#D%lp~2*Ae=gB~6cqA!Dm*4as_{%?8v%U@4qXg7a+K#%ArlzU7;V=| zktgHRd2t#oe_^Iw?wc>JgOwrt^3v-@oS$wmT4n9s0v4xL;%o)a&=2wuVGm%99r#Zkog^CC^%l+$=S^zQ`;-a*;fo5A?WUZ|x4QC*->4CiEFk#>E8 zgJy7iya5_N`Cqxk2+lj&2ZPXn%s-^d(3z>u3diS*nA!^8=?-28flVU%t3S8@U|#Ug zUbk~a`%|r_XQ7%Y!M~CS&rU)4jsqdj;ioJjSg}P=Huq7*3gsK(x#;LW~J^eeVw| zlyQ?>?AL^pVTs)uX1*Kpmnpar;)I{kNRa0$3FkbDxv@cn)^tQ&2pnTS-zYn)60x0( zN(d9<;D6Mj@3Bau)OZ&Kjwbxgpx3+kU6y?ZG>+5pSEbNtmsA-0VV)nq12U*Ox=}99 z9oL|&0!id(pREnO84c#vj*bYt{<7*PoDCOU-QDxiLBx1`B_JI)Oikx?-*69zdWn;V z0$0Efp1JU7NfI8@;Cntch<%^2Axn6ks z2;tX`Gni1`BCM-0K)p!As|YF6p&;%g6VR;O1CC^T!Kdk$x(X+I&MSwzIC10d5m56- zTey_M8tg@2*~?xcoURQ51jLiiz4fSeb9Jq^--Y+X&%fJH^xz}a1o1FdpMPPPH!iCV zYbPv92>Wrpt8SxtUKn{NTz9iPJu!bPyXlTs}P(PXgHcQ>F*;z5GNLqle>u1;Hlu+m-HR=(2@WR%{ZoWVjTwoDG|jCN!?PSv|BjD8HC&ytf9sD{Ole55LM?0;>|*~7m!A$ zROB&kXr80q!ywp`8#k47oXwta@|NX)tSrJQaT_v2h!$BcJnbB?6lo=dY~{SA@x{EY zlUppY;|~)CP$-kMGARofu(3FuXS=@ z>2YSKa#3VisKWe&N!nEi{A@O9X~P*uk=p8NQuZB}Ug^$ga4I*N9%g>m35H+sp?6D= z*(b(EvBYz6FEYlSb7bHyKx}0uulyYm9#FJmwP-sVpQpfGoXts%c0-!LjTWsZM4;UR z!g;YuNb>ppIF%0!wUTz>{BQ#kb`^;dQ034cgCnjOg0=)Y0(_3a$7d^G34O4R*H=zq z5EsRES%$X1egqyqyPhTlklg+fvrG(vhV^)-I5n%GFisLTsS+M}b6VQb4pz)i-V(te zblKU4FA&sl8;#O?p_lu^%UPqg-InbFAnwiM*uO$S=2<7PDP^B8vFoLN63bg`;I zm~6m_!E5;LjoMyIBjU=2mp=*+3H*+ygZtz{-p&IY|ww^QkPkz2iLUeR>8slLWhK3$!yrfmOGX%y!yGOo_gKm|*K8AyG#|!J-~K-M=`hnS^8Xzt z3k+SzyC0ni=d`++>1+G)r3iEzK!^N@2jUdOo_RpXgajH}R_H#AfPpr*3XK88md8-S z!dX~-Lu`V{q7#9XzFzk$^8^tUF#v)SDh_q?Zx*$u4Md=mh%eb?IDx5U3 z0}HeGbtkf)iBtI&nG4gq=R8y(=$aCyhrMrGMiS{5oyh)J(wb%QEbjRq^|PojszYo-W9cU5D52q=>LPyq2oak`_@;#%1t2gnmgGTb z#n)T3Ck}vKe+SbPIBI3Yk_lsPeT=F=93m~jt;+X*Ki=CoRfMoH(4i%i0~ctxbu9}H zKuj*5Upf53yXwj!2yD#aWS&KceqZ=wavG18uyI2dt^jSL0EU1SqIAJ5wLXk4pk*m} zE^Y(o6xpr)C&!4&3jIAkueAmC6DM?L9JMUO;w^{;XLxSL*A|Cc26XSB^3i7(E!O&n zZf%HA3dF2z0C_q@Py+~&E3BzsDfYX=&2Z8E#6|JG#Gu2FfuaztLL_xznVFfT1^B*A z;}VW`&@=#!_yGArNp|ZbAEpJNt_Y*G8Vqsp;yVtNBbd&^MMUV@#~p-j7#?sro(2^b z+h0Ie0l@uf>F7RU8t;XRIPd)I?2`r@RUbav4j3TUBvw8IQV3a`qfVAe@|4i=X~U&g zp{MWy2k=liq{+m>7$NHAXilIwR#vUhhiV$t!kIE}~E|y3>{(B%;-G>Mr zM)+?)v+mN2V>lj5d}Y}GqPr@2b9aL2a9s*e;jdW!d5GFoSme+Yqi`t)O8TSVzP6Coi?q-1tR^dq7_ zMshR{u3JZm%S_D}F|h^{9YR4K^7LV$dw($_qybCWg8+&5$K4dg&j@AMG05QAcb_pP z(!cln^k@wE;b{xqNfWdr;RE{R`l2~ESn^{Sr8b3f4H`OZbE^>92})`ifK^=a>=%QqkMKbG`pU^szy};6r#@gpgE0H(|wOeIlG+PjJ%NW9Tn&{t}(` z3&Rnd%I=Z0_mDIT!#)XG{!MuQ!f~oJuQ{++P;C&EJ5rFi6;DWBYCl&ciiAjkE1fA$ zmPa8N&x`kOg>x&&h#p88VU9^KW*`Q9!shGwF`f>t_)(Wvv~i!aB9`jai2b#VQdbuz za{y==+g&F$!LTSh+tLZ#UJ>vtfq~W_2Q@TUhH!28jlW8)!Kr~rr%FzUDTk*=LeNYL z(fkUE0?E;y_t-R0MF+k8@jH*@oLCH@*TyU%yFcDRY%5qe;Pe>D5VeYyLKi3I=mo!GrQ3;7~Kn!v!U7 z5RM$s*+8%D8aON{ro~Ht5UOEXzgz8#48}jF_*G9t;qdccpfS8K`G>9VL{OwlvSzMOXt(qZE)FVUZl z&;ex~mP-jY#x|+;^VL^;HGF~6ktjb9a)ps&NjgskwpgB}^zFAF!!~qsO$4-g&&=fEj)By2frv}4O?fu&WqW`|KQ ztGKMQ`4I@8^Ek(kb{DZBmLM7XGUx6{S)@A&WNb>sh%5R2thHEo1m6PA$Ndx=>eFZD94Fd5S~{UBTomk zI|-x74^9&wgiLu~6KM=ykId4|NB#CO4LQ_1*_lMlDN)0#=IybQ_qnPh5~o@UQGnQ% zUja$SkuRcNbaC|x=TvSTnVA9H~>%|uBcLKlMXi$#72x2yugy78YCKBilJ1X;w{;f_^Y+`D7( zE!9g*Xrkjp;ip$rPPkHp?EzT841SMa&`3Vf;zk_^TPG>$2S{9GbOO3>FhD-%wyO-j zV-6j9aY^ofvdnWcvRY!+;Xg*{S2g>2=G+e(4)JmXI)zw9UKRC;Tz@kd@z$gwPQ|i8ts^pj*s=Y}_W;S?{ z`}v{-$b2Wg2A#)71b!fQdyHaUU*bn0PxH8|oACcGaZ%Ew_os#F^j?f3LK7SkIp&CP z1g?TTLD&=j>3kjX#hTDWhvJa(%xuO9l+%3f%hQjb+4RgSU2v?+={2$q0*3|lKpjaG zFeGJff6F2ReSl-8KSh-QSs0rp0#^ep{&UdjJWlS9#GV8hC|{HhEoP9^V*j-Gp+@+N znVBIFR$^y+rk0LLY(T6(9uSji z>3RLvmxw|N=k!@{fkbucU_(LIE6c_80Bw5`!h{yWqCAH0gy6h&K7mIXv&SQiQPhyX zhssuc%<*J1@5{>JoD{u~A%Mb6|pRci;V;cVFuLXMWNxF2F=NOE>a7<`}eKiVGFkU_Z0wCtB z7zGoMM`{yvyZZVo3W`T%@|@jW-A2>S?>(*(ee6-LgCc=D!@nAlKLh9ocx+MwnGN03 zKgyawi;sgTDMJX^t8c-nJk3cm@eq7j&+DqIsc{^s->ZgUz})`hj+_7VkybS z1gC4b_{8a3E@IHoP{8S_EwGGFKLI}ys0g$}26ytKT73g8QEs=)##4H%Y40w`Jdm4u zHS)M#5}&s&f&YUC4Kqw_I8WS(S$=_{_b-lbE{WtdKdrU0a3hP_e}ZJM@}2T+^DYz8 zVL)4m6N_20Fy_gVVFe{ymYEQG&AG*s8qXi@H#U~aQ1Ojnq!-NgTAaUE>c(y?`_6gy z+Z(>yNDK2ZkiKL$_0w6Z?*p03^l62f4JB7`!&1tzwnOh7t7_ig7Be+1q*lo@y^3dIgwU+{X9v&X`#cu45~O2wsI%7L z(bvjQJ#gmztxJuOzNWR)#cuNJV-2K9Nd_!QNkU$d4-b&$<-)*~3_gld8K9Pfuz?lq2V;ijGxzEeQ*fB(26R}6~`CS zwN68K$hNBYN`~b{@QKA<>f#9xHgFdyh{@a#J74F)s~mH@I*eoXr_WB~mVe8}(s_Av z^a2Kf(xv-Y_rj>}F&FDLqkpD0`0&^4>lp?oJxqJC$@83> zRoAb)cKr3Qb2?y8HB_T%ShOUZ_-Hg-hl1uIAmxwBmPmA%fa`~Eh-J+ir2gISum8Djs!Qz>nZ2!J(p2J5!BO;=T6Mxjyu%VN!4X6 z1{%0u$F|IVQR-naaADY+QdH8p#OJeR$1T{ZHr4ZuxQJa(VG3-2B!-6gl*2bCou#n4 z1~8;<1#S|ML{pJC9;5OTR_Y10hMyj0+$Y=aJN9|H_0JUN8?uL29?l*zxj$y?nsm6| zoq(}rmP-CYkJu93mIDTs-iX)>Q@vfnH%o+F>SvgFY`IDxy+_z3zz04O24uVU?745* zvI9yB*SqOdVw~-yTOCIzZ}d@OGSzb3`Or(7)Qj=XIR22D8*sMLJn8WF_kRO@{b<3B zB<)N=jknoxm8Yp8kttwcZKRf;AItQ;h+6E%-NlKP1UZM4JL5xle$R^JmMt9w4%RNE z02ui$cE|j9vwHU%Z&Ieyk@P~W0##096=i03e^$Qx9(eh9J?i@0iZw|L6{lk5{lkzI z*5dQ5b@`8MvJnjm=!{&4Q33JvQTnuQN!$S}Lh)|RgxDUQbG24ri;}ByompSHXWu`0 z!hxpSjp4~Fy=$W?m*1)$<*5%Yc45EjvmpS$MIAu&0!`aEa9aHju(-Es8>;lJj^s^i zFM1U<-Jf!9cUju)98!t_pDn-9CSAd+h3LXLK^M#msptbM`2bVmY@?Nb1I4X#j}Nuv zZG~R5x$#k~lKlAg6l)`TX)WHGM1Ru1XEqFu${tH{p6bn;$Tjj02;g45^*>EAWH36f z4WghvMCjB$J#k$gO+2GRC9U~a@+X#>$iO$6L;e?NQ1o)==^Z;_L68ZQa-o$UDXkmt z2+T9vTO0C9UiVSzg&4IXJUsR6bv^yau?RuYoenedAFHc*+?P%SvPjX+&8-#ty<(l4 z3!Lf&)spAq4KYfGneC>iGN5(dEKG4FJe}DN5K!u+G6Q*Go{!&ac|Ly_v3%STY(n-? zqn=HJc9cKT$NIgQUlkj{p@bGSyBL)Ba00$^x&2$PM1XPfZG$}oX&_=5_Ch1&p-}wp zR1X)wm34=W2pSi+np*bgV`skR=2D$5wC|TE_=yDp{Q`y+-bT9)iK&jXPO%3w>earx z8OX1;Sqo4Ve=(_ z^>_u!cORj93ih+0=tUGfGz6+2QcCuhswkUpMSuCu*OR?uJM{KGRAiFgm3l7m;1O^j zXP!GsbqjPmy>e0q`i;{0P6h(2PS&lb97>a(%ZV(;#$_D09ejNu8ZFkDy_Z>fWgptn zze0|e*K1u6L$MKol_2akfBC`gkfDX^{4*6kK1o-`Z@#~UOw@6$FpB+bYMl5ShfP;b zD_BsAG#A4;Pcc9ndZx>xqeR_ddZ|2Q@y&jNah9kM&gOL~nn{XD{}=3Evy21qMaG$9 zM^x=2CNXmKSSL#>sK2CZ_HWx8o2W#UsD)6z2@QJJImMM_WB!>k#%c=IQuXQwixMu= z2|rRY>P_>Y;7UT+7w66#pkWQQTKK)t=9>^P+LS5ad~?N7IzuHfMKjIHb!+3yo{Kcc zmBV+?!hfhNb0W`tith5B<{k6DS)$aEcJwBTnHoPHjhfCCa;-PJM9 z9JNLy1kFvye-6%G<9~gt(KuFZV0`CrUG?UMv#Hr0Fi3Y}QD(bbRwf$B=n#(tu>N{u z9cI$;+?DywcJol(9OfH8ZVa!_ko_I=QS5l$2J3^PWz{(1FG9&R^zONB34t=ccDcKI z{;-4{(m2yhH!HXD?^T=I>o!~cKiZnSc6Tm1&-A@NYhof=zG}%p%}7N8I`mD{_aP`=Ze{`BQdp=_z_C!&|iE|%n&Y&EpDM_m~2DdQ))gn^tC?E>9p5ULR{ zkVeb*%;XOi^|mB;#c;3D*4-ft-Ep!;XnLKE1EBSTeH)Q6;cNc+R?_m*=Zf3V&N7Zh z?<7yUdw#E1)_)EGgE%TKe)+#oZ$MPG?#?+Hb~Wts)*BnIOBr=116GoU^$YBG1E&5W zb+EzrjHNwOoG`qxJUEeyCi$K?X}A2GJfc$n)sl=cGV#vr zpct3=L>^<=%N4Ro4|bbT?z+J>GpnLSv#8RhC+@UJ-t5=LN$0n#Nb5%iP@slY-&o5-<02G}6J?+xG!XK;HEoByKYeJVx@DPG=(eAU#G!1R z0czggaDUqjlO_p`9M}N(AH8tn)>|@0k1>|t-TT~^CO_fj7#S4z+h+nUWZKoW`g7|> zx4WB_iL$|I*X245Z-B^~pT+|pG6LaBJ^xY$h zCbd-jSKj_>1>p)U{%}slSc%(QUu;g8rv4*6)jxlC@izY}y_{c2ncS5)EW$Crv~wR9 zcxm@F(-N+zpC)Nep6QcpZ!$7PVfOrDLB9K5UN#5m^-)UhB)2}s(b1uA$45y_f zk#VoA4?7DivqOqmIXr zOapa|6&*u~m=|8xujXLwJ38iBB`g)_uL~@P~@L>A0UVf z=&Kx%y0n#LXy_&QE`Dy93{;Y67nh^F@mC;$0*HS$`bU_#2JHZOh3IS2*AVqgfEn2Y zOK{{)!3)klYvbH(Nz?sCx@nQ&UB<nE!4U%VS@x`agCSs^gJXRYgK-?BQrb8c@uxeeakbG z291FoPR=*)tAvkSdiyVrtoOE99sLrS292Hm;JHe_uC$U$4{K2w`W-zaV;w7Hyi*>9 zhpJBw>@SqK7n0HvOS@X>?PId*^RD_mI^>7ng<4&{rm>+*d}RuHuJKx|gfNaRI@*C) z|FN2#Op^4`$9w}RR~EF-+e?;?Hl?VstZaG+oY_g$o;34~S}ng>Ovc`!NH#L$j~b)b_LdZ zRpYkn5LmPB>>Vj3jCo-%M!qZ@ZsJ@?iUgyOaak16326#|Jpyu)HIY-gbv% zGRxD!W>of%#Q=jN?RRSb?T-b|6;Z}+H+;{ir(U_u?C-H}$C%}ur2mpBukHP>$#Fge zjEA6^^0Sm-t95arfzocY0W?R;wz4v5|NiRV@=25ooT;eT+WM@qgAMilmZ7Kg5ueQw zcoW}Nh!O0mXiM%Y-x_I1H(s~)Qm$Q?ZwmA!E%ND|!h~5(_|XH8k8?c!)pBtNIkNf{ zQp?YvdF)`b|LLsSeA4#FxlqrQ_uR<}&57}Ehog0Rzh(!;3J-5?ac~r2tW$Nv@chbV zoaoG!Pp_DNDjPDsEyLw$@NC*U%d@b$y!y&tf7`;rEdK018d;}6f@Qcnz^d@PSd?;} zO+2!u+@niGP-fOp`rg0gtI6%l&kNPrT&b!`J+^?1Bo*wL+?x4uJ7#91g6rOaJ(CqK zEMuvpp;Z)t2N!LA_h$=6CH)hmzC0c-RU#Ju=*5f60Z!L=^wdf^7ONB2Hr|eG&ojq1=CwjZ3&vb*=0~=rX$}G+{=bVQW21Vn zUsY2||IH1O7t{;e=yH^nb1WivM0)Jua6BX)(})K$qnUDdC(nB2?ftCZV+N`$p3E54 z1u0KasQQ)mgg0q*j)t3enTu$qpWl{ac+)V>uJ_}w7Fy=)#iAR1OyLvvtX)Sk7Z$%I zm3SMiyRKC!^}cmn~TReJHNaMm?G5fC{ zgzika%QdJ7$SUom)}EW=9e=kyf?%Qz4J(?SB862O!@dNGw8cjkn{HmX&@0VTbeo-{ zozBX=b!Op%^X{QxG6;%=@@imTXn}-0#TsfLlqc}!0Oh%feZ5S9=O!|3Nph;o)?X~M z+G(%;__`$X;)KcB39hh#ucYe<0?fhgj2AbY!h3J&C--Y*c!Dpq*p*S+`MQTKLp!t3 zJ92KW$EaXrtst5wWie6pyhdZ>7jo;erKg>8B9aF&@h~BJfYGHQdplX-x6FI@3U_dy zi4*C$n=0#7SYBLgUsdX6F!WT%OIety&^zAPGi8xI4Mr{yzKKdjH{hf!2kjpW{)pvUi+&FNCM>0pEn) zZ~HYGo*Vo^R08h{x6fI-T$nn2;2F#8K?Bx4>jBn6*^-+G0V?Zd^`@Azq9P;T zF5pW?vvNQ?g%E*IRpX9~dVj3jYi<1bjUSV-Cr#r|d^z`~_(s<5!nH}!%kRU@<@i{| zc6qNVmfU_Sq+#>rh@FN;Q*@8gcT#fe1~fvQ$DDgkOod+E{MU1S-CvM=CnD~jZz*oK zr_2^`T3zoLnYf@b^TVM1QV#Ri+^yO2$f4W*!*z(d)NRs#A0l9$!(1D$W-4XH=AU;W z>x+J0(yHo|CaC8Bwqf(6JNLEsi0y2@C1|doa`XA}KegPJ_!RSo)JT54R$(&Y6j9~c z7xhZF^ViFkY%c49V}(1Ywn6g2*MH*6k-{_A1-^XPyX*7?Zy7DT_C~L-!5-^2Bu<|{ zs2#gi*%m`?^F(FJpvXu&ZiGIV_DHqaeyRTe+Nd?#V!PgRfS$zN==g|v>+stbV@V3E z7=N{A*fO=RcY8}N&iqV%_Ka-ur$fUX{msoDRWccOake+ijX!^av|CyQ+C+v64_G)2 z7?D}Anb5mTW3l-mKJ7k{Hksnyk0X$TBP zN~TE=w-S?nZzrUoNhyxiU#D6uwxIsEo_l}#mJ_3LV`tA>yO2>iYUa;U;m7Rv((`Ki zL;U48OVED_3OcCCo+5Fpf7v-}bcWDO8nf}V&3pRp^_(Df(g4s57emiA?uaR;MpCN$ z?WOu`=auKGk1S(Ert9~{N`9*k+{>zkk@uKyQWlMw%(BdFV_Ob0(`jih|4M~cSWTBz zpXEIL;O^-@5;~r1@?;O6oR)smbk?7wYWPS9xq8vJ`$bkBM*=^kwZCTj^Pw^2&)brG zic7vxY}qREwB7zEg&&=ef52vbi1V4oc@au-p}5RVVcEBDb$7mx82l?~r8ci5@>fFC zZKb)aVtwOvdEt6@vHAt3@?7H$DjOU5Y{OOmeocjR(qm1=&spk=U6>No#r0R!`N#W9 ziumF92zz`nI-WsnEbXv``fe*_uBx=rvd`_F;a?aEEA{Ir80;f496cB|2vZJ5m{K#k;yLA3#>TQs6@q%HIa^$wJnsT zM3-Ze%fhRWu5GX}X=9({ zB>HI=>D%5!E~@*LdG)?|p9V4(j|;E~=`Ysz`4u(Kv^fXfNzK1NfdABqBgCr~7 zzODZkRV)gjN7l>RKq3bQ&k?z(5s zDjW8x{|g8D+W|6biCIu!i)x4YaML0EcP8wu@6}wZrWG_tn3;;1VkcDJ+IKgifjyh6=yS{7CW6G!%`$OF zf|+KzV$0ikMld61nj-!A(`ufEKg|v8o(1=K2a6a|tVh3X?>f-rN zhaBEmsT=2%bq@Ga4D?BqL^#m^kNP+QuSa0OobjjqFF!a_y#z7a7b{_@u0d7t@rqE zx?GTZL-+6|`7rsz>MK*=bvI4x+=^4U*uBw*JXykVKxnytS?G8vt&&P`Z9&^P%bLb5 z9pgPN{iBt`H#Ll8{6BsanEYYXInK}tr`#xvXaD`-aq=NkSoP~-$@=;?JiMCY8(f1z zli#-ue~MF$|HXFHg5j!z0B9pbH`TdrUl`9RaK~sSrB1))KJ@(FUmEU&d?{TDw?oZ& zTt=7fT&tbmA34pJ0oIXoW_T0NpGH9iK@)dq`@tU3S895N;;{P*YGq}v<$emK(C>+@ z-h)D=t6a@bErf2w`sL@_VlI;9I1RId<@*MMwg3oh|zkh?d6=F6+#pcO` zigxwly>1<_)(RUNc^>~vJ(-ozSGekCL5*H;u~bsvog<(`j}*Pm&0GBTnsZvM=3VFA z?QEBhGyJ4D7rIT~(QNCG#BZ5;FwcZ8c1)Y!ic_@c-bm=3`UURu$jThXC$gWtc_YWm zOJmu3;`^JyMt(VzLXA;Rp4tf89ZZl*R=zgKK*K64fA#8NH7lKpgr5Y5jF*q^+ScZV zYV4aQ|2!FSpCOFZy$;6uN*-s~zZXz=uW3`@FE7M6UmL2CdXbfdZO8)9>eF=Kk@ld` zU%%$h^iyOTlm{nOj0Z{7_*2|9bLO_?&M;{{X#$gbHP9AVN_FQMz&Xv6in~LrB>r#1 zw)(LT^Xfad+a9&66=Z&A&>H?UXFmQvNCa}W}K(X*X==WvT!M->FDcgMsIj^W2S3p@$eCe?%I1~cFl35VcDga_gH)LZoI&BjA`+!V!Fa*BVC0E*DtthV03)mdyB@%{OWP zm9VL9lkC`}vbw8R>Hg!R@$lG#ou_68!YSfJt<*B#Mc3N1^v?(uv?RWq^w!nZ-uFLU zb|>`duRW#7&rj&Pqm8i-6dUCoUF!vu6Icj)JzF-@&4yuQt{nNrkE2*#4k%ZG&@GP z<@D?Ckx{4GdnN?d2v+=TgCw}?ujJ&Em!(v%a_{>jvHsc?r(iWFLw$q7EaJ>N&WG1y zn=71T<+j$7Cw6^zNzY&3|7G6%#L1JIT3Yg&U!0w%kELdfACvKTYHs%3`&3ajLi;iJp7PSu(?f~?V^&totZlX@xB0eNwSOHM z`JTr%)=E}BFK(};E#oTPH8|&b{=$Xo;W=7H#x70uy8RqXyR`K50=gzfG2ZmG(>*II z>v_r`$G=TB62X`V+nl`LUB@5xvOttmL4NzY{;*T0=jOuJ^Rth4`4<=7{mHrtR&afr z{B6+{&(D36HDjU@PK|J7^zP}APxh*)!q|=Sg+qRIqEwIT{OX3Uq0uAkbS)*&Py*)8 zSvfh+q1^G(F_i@ z{<^jG%8>I=%}!5Q)|QrwE1sFNt54s9vnC)gHn+}EVQtl_K)z`ZU8Sq%M9LzcLBKfgg=%h`1Cj)44>e~WCCW4#xAJFZ1r6(P2G3dMu?$lhtmFtMf}zgP1Rnq5d8i5$^Yl&qm2GPzu*74z!sUAv1xg^bc-|z{wOP| KDdfnT-1}eW)sxEL%C=G5`0p5=XBKzm_jK>oHG8-|Q}1%^&WrMz;L>NQ0>= zH%={s@do}BH)~o{2r+hc&RcQ3|18llLTTib-?R7sXT>FnO3KQgM~ZaK&CSu6nVAWw z`B0|*XF?l4e+Eaxo0SCrd+XAcbV(mRi#D9!n-k=n(R6ZNUZS@gCxhO-<7n&Xz@v-d z?=Zmsw^Nu3@}56SYj!3b$`;-}X}Voz(r9L774+=v*nFb$VX~+zD=M?3grKZp53i)8 z#LUq#s?PPtVn@`~6z5BXSAt@s&#C*RFC^5|)k$e+!X_sTxeTjtqNAhvgoR(0mGSQF z?+1(N!NUCioe=Kk=ER4t?(P@O%@=ap!mg`odUx+KGBaZo6&2m!;tEn@t^Xkg9>?EM3wjGu!!FIPW`)6&ukUNre0-9)*?@sfoxz&~+HS`QvXH8eKyDJNksb%US4d{ znSFk*y=6)fGT1}Sa3tQzla*LniKR~i2(R9n|3WM+uc1Noc(x&|q=d`&bhk4!JY4o* zYla^VpUb$G1YQ|7R^H5vfmJOz^M3Z84G|Gh^38{MtG#bu;#2X=!+%Ab7cot|*RKoS zy0vk51F~#}7)h~FyhwWKYcGlE72Mr#g%Hyd;p5}?q)T4?HB~c~+CE$P5MNDAjnAwF zRa;m0xv!6CVPS!oPFO;M*6;ZD=OA2ivxg6ZJ?8wV_E&pfJb(V2hbV%-W1KlOG&JSd zOj`QS+~DA3_?Q1m7X~skqmQT>@qt@+1T$#<2eS2lIQjqYk1HBLgVf_LeE(j-#N?Wa zii(zrNwmY*`>cir+Un}+!m=`Kl-|92fuWgYWyF@2mMEE%zrV~aEYM*`4UCMw3=NUp zx^-)9wDjul-@k(-Sm3NnQOFUvzuwrePnGZ@gZvQjI~H`QtaREPx^7%tGBT}b$`ul< zho>5clP}N5f{se=ULip%B#qGKh(py}JRqD;Q3-abGZqNZV|xA~iqQM_R+I@354D6R zUkCvWIu#X_Qr_uE54B}K-m?yyNXg;%CXL}3*hKR!&oPuHo9U_c_HWCV4-S7}NW_y% zQ0YM*z>pC}rJ*Gk>$Q{`5nt2G)A2tILzfW^;6(9oB-TD%!Q(Nh3#`gzIW5s!%-0EX zKR%`wG(#ywU41#2qxfZbm^>sTgxh%yYNsI@QhobVbqh2YIXLj@vvZtRTd~%{+NoLN z%<_$+8Bx=y@fkNtBcoi@qsRWWGk#x6jkM53@EQJ$a-YVfgsIChSm2$}=4kt>UTF3%(wdd{2*QU?j^d}2+B)7;jnRQc| zt@f}IllIQ&K`L@HwQe_GM6<`UW*LpWKin-YO?II-(sR@k+15LrA5)Ada%py z=E=U%2~+2|JV`Ga7%*n?BCT3T>Tn)od3hO!E*|Qz01{h18ziI_mX`ch^D=6wBBbp; z2a7g|cvvo?_fR`11~Rc_@|&0V$TwOWWb#@UH|#f!8?X3zA9O4$$H&ISF+P=th*58W z9=KUl>9K7>urWr=tC5CRu=ywzJ@%bmD}BrGkkY^v8Ipihqnh$JI9|KEPOfh4oV?AE zfr02*OR#A^=tyr&$HT(HNpz@na%mANE&hMjyE{`G$>5%(o zfNPn_;YM+p(@*mm6UgD}E67hzHqiT@lJ+%vGddhR-oz?@P$Vy%CAS_+9Y7zT>mr&Y zcx$m+Q|fbOlV9AMH|$RZVbw9ns!Mv`m6Qa{{a*L{*(d!g))wjw>fTDh*Sj#|urfQ#C3CXlkG%$3){b!N)WK=Gy5G%x@LMm?1hVHNifmKw?@=_rcPLu+{=0KXA)Pg zUJZ_Jqqf}S`S<;ii;EU&SA>Z$u3RB0)@spPlW}Y#L1C}BSY4BjuDeO2$B{S?2YWWt zfxNnUZ1+mCm@|{wx9$qvtbpeO&nKy=P)3*WHpf2_GBPsCb^_XPzxr?KNK5XLa=j$J z;_{S4Ozo=Bl@@)D%Tk0y9YwkYLD5i53I44h0O_G3S01ahQ#o)u{bodh3az*^ zI-JjczU2z?0{0xZpENIE1*7Y5N8Uwmp$ecGnYr`vY~9_oa4a?g?J33%RzSV}-7$0n z%ofssqhBXK=G;ygP}>+gm&{yzqNP#3_?h?te^KbD=^2A^f)-9x3CaK?8GpVbqvI5F zBZ9XV_4`u!Hg3$xGX)f1yh;V+0(T@tSxM2qa4~eLqwS2Qe;Jd+Bj`&Lz!(sLvOqgM zE|^-%-UUd5P$V%(w#fQ5tAUjgs3l zyy({Gh3K))Cx2y8mC`GC*d#7KY8O*A!Uvq$*k+idMD$`KJ;*5wVgGyc;;JeNmpn2J zL+YPo0rDt^Oey?dm~PK~q{&b(&>HX=R{#D8&*Z5Zlk*#$CTMAX67$w=%n}2w_O_q( zH2ubhbxyRWm;>Z3)F`$mbHY?D=BNuaGyIloEgmR$IX}va=sTzobUyT*TO&5Z5gBW1 z+x^N#@`EeghSXtDVsxFM#5h!|sH&pLa2m~0q49-$B57Xgzw=BGrC*3|M>=xHY4F$7 zRzit;%@gw5532Mry6PPWy6ev!aoo@xPYe3L&z*ZPqSyo8d(6x(y`S2u6?d(l@*m4N zDnT>mX7^e?Luvr+zfeh1VnH7`y-pM0-Rn*_Vw1RCdot9ngZhAWiofw;h@-IImh!V*19{y^NEm%*cmZ+xx)J1sAj1J*koLm8nPJZd%wslV$`e`)i;aiHL?O^T@ z1vqF?Ez-}p`ACjndHSG^QPFY_BIh9C@dCV1Jg8dSdCU=qj;n8zi^NB$ba;Y}v1AxW zx{X;;YtwD~8S?C?w|$?IVMoSaAVt@q8X#>ZZ{p&sq>d@{KUW^J6^dsa&bb-s7mfw= zhj>dKo}lv2)^``QOshoEHu9LaWgnzo6%>fa4M5W>6RN3~jNw^UVOg`X#K_Yr%AtW8 zbM_`QrGmaPBjb2`&DOCUlEX)GdnNdNXY_*p?579C%P6i~9YGZqNc!@RA48&|2sbx3 z%`7c3jEszW{o!9Zs;_yp&{o)I-4@TF1d+Tf#*G^?ckd>yp3{lD2fcWK@yTPG zh>fklM+!dYum@h{43}5eJhIyR+;x?KnFEi;MbvaH8|#hMfp$z(#Ft#<_!LPKH#Z>w z!?76|W$Yuo4?g7{)#{e~{Q2|C;NULr9dFYs+=eF0v$K&(bZ~}H50$(?J&y0G+8)l%x96Jt z78Vx+pJQORj*L{b3*3ZU*-3Hk7#H|FF+rnx{)gB1biE+CP%ry6)a7z56x$u9Tm|{H zl1|T;M0E43tCxg@YnrF;>FfW)(x*rJU44BWz>u8gThK}#)Kk_xo6h>2x;Y|lEu z2WCk5%>x5CKRZE)hS=ABYD@00ex!9`2Fs$wFv>Xzh+kE95v?WgaXCR#BZ=7kyx5L3 z+MwutExcfK=+0fey?5^2qpbY!A@1$lh@Kub<9c^O)Igo9O)t%F@%Cr%5uOjkEY)m0 z-{4tpzHtF+<4Hgh_;_Vyyg*B^xcT72Dn$UP4!d4RNMTXw9a!P~%1Yjmle_z4fqG}k z%a<2`UW&MFP~5zE(`jRb-MH2XO(l=4qoZSOtc?B=5p5`Jmqkke8a1C8s;8$XD7u&0 z2M?(*KC4y_AAWW?bgC5+G^>|IBJEC7gG zdwK|98-fc83i4%y1qCU@jxCGJ$`s-CZVCuE!-x0IUA}yoBusv7wo!a~W@ce)D;kJk z>-X=M6%-U?JFO$Doso{0uKecBn`AzBu16f46-GQSqXwQER?MLtDzkXbc4BK!)m-GE z?s6oGcx9l461={Wre>;?`xiCWvwF0^H|o!2VPvMjCPcZ+vMjh+ZOG{7tMzDj~4 z$So+4%hJjOrjl}I~lIj{ZADB7bkOW_gH2dwdKg?!tXRM)BDDio<8GNW3e@Kl4x4d zz_XJBODM!${r!qSi}~$GZm2uYez4KZvb@<*6$)Wy@HS76!+B@^cF@b0mQx=cwKx)~ z#of71&(8SWHby!PEwq7dg9=4ktX~$Q#}S;B#hAov8XXV-S|+JEJlfzS6 z>GPvHS^<;AXQoctkuiu!AfGnO^>INg=h-lN6}5=k6$X18Uw2m2W66`|B%4ENWgj4AUnxlO&AKds(UH zjWF@EXU`n%b<-8=y#H_@``XqfPb=k1egFP_1}3OqRLqLekWS2eF3UKdCyDhfqFa}yH@ms;ngooUzp>Ir-k8lQXr@FO{hd5Fjdx)TFLT3=ru zA`ikTWE92-kedG-EycmZlXZ6HZ?oVBV70RpBW*EV>l`Dg0rfmPC#Ql_?8+M`eCTF{ zdg0nGq9G_JjLe^R$M8@Ss38}{2yGncjpcktcUd4wP<+N&mA3?VC#1F_g}nzJw_h$8jAkGoIm~7uU`?d z5J2D}{-N2HIzv%GTq4ko9hBmtAGW-z)2${Xc`Zbq0{ zv{FvnB81XM88@6c#XJENpCYnwrFx9g&C(4C0{G z`1p?0hsbILq!Ah>hJ;*d>+ED^VnP@9*aDd{7*tp&exUvh5P8?2>w|6;7 zm>EHfd>*Jx>=dyiS+}_q8s*W^wb&_hC}lwAzzdcY2uYVmS2QyEy*7;9_`sOYbH}Xq z)2CK|Q#wTy?Ck6*CL7Riz8^b(bo1xw)78;oc-<}3?qy`+3YxRqDQtCUM8p@6ueEe_ zF+im{JUTMpTmI_g>PjxgWVv|@Il;hsAG!3dE+y!EtzW)ifI{rKlBl2JJNoJ4M@m!Q zT`XBSxrO=p0GrWr2jZda7FAE?t^w#0d3Gw&boSTCz|gQ2;sqeI-*QC!+L|q* zPIwzZf4kNJvb~g1(h3=Ejk) z_6A*3Q`5wzFF62d6S%D6;#ak`wc#W>0ZsrWMF;56lO|qs|49)!DHAjEZjApahVYZw zHW1J&Tz_a3>T#5qHeZWpRUcZ^mXI z=g%K%NpHb#-@e7BrcPTM9arBQD>LnkV^&1EIa_!o+ zm};8Dfvw+rbD;4<{S#8{f+{}<3`s@hnM}Nl4oE&EB-jv|xvtLivz|$H1QUB~rOzLD)pv0u{3bR6F3s@O1 zjcOh*th_c=P**3s^>{k8!m`ueZ#F+g+=HhtT`~f=wsn*);8Y~K3o@Pss?5EcO8zB$`?72XUu_-EKFA&0&P4;~o(!b*UHJN#8MS8g}V zdU}4c9jn9w&ES%W&o3cQAD^1Z>Bwq#cnkhf7NAF0h*ct&h!Y^(r)x;CK2h@Khn;O<&kS;Fe<(Dl@USq(H)_D(6s&A* zm71EGC@x?AzWAhOd#*Xd*x0yhU?4V$>%J@iVp!T8kY69Ub?a<>bpK_DocvuqJ==#3 z;5;UK|6a>VtoZn7Le`=p8N$E%<~0YgVAnA+P@K z-8)0yt)U^ES6{7Q!)>86K|Q?A#3bgm$Kv*LH0qI~<2r;jcY00{@Kt5jcss`iz*nRw z4i1i?Z=R-pe=di$TTFg*e0#6Ma?*K!Rb53*ZG_^7x3{-Hdmkq!XK=Jv3~bS4<->^8 znVZ{N!kkxTYEKEhmQ_c;*D@Tz8()&RhsudS_tJjS(| z)z0_3*?D;Kp|lP`Kl(a27>A052Be-M7HaR)DjqwU* zZj**OR2Po4*mut}4v$HC6eABT>P-Ze6!H!Lo~#T999Z;$!)DX2{wGxfsNPv+7g z4YunJe|}5kT;AH!05L8X%FOLO$s*VRvWRv)Ev?KyNXJk|71q`o6fY$uB*a4PBcu~c z@QJN4_iv)sGd0a2X|##srm%jEmS(c1da}Qc`Z~kp~_0 z8t}M#-+LoAFPNPSZxAD~J%S2>ppe=IAFK(X`wP{8$YZ%NQp6`HDF5gYm-oRIw^ARQ zka;U6pezLT8PeAS{DcL!fsz1nqq3eV6jgkHNgzBh+`LIl|nP}9&X)cr^&uWGI{=IQK96R)uU&Os~bP4WKydxI)lQWL*Fcenid)7htOQY#9K zwY5ouLqcA`V^&LlW@a(~flJM-+cM6aDAHwvGFksbI0mpKw54n+6VKZYrD$$h<>j#~ zWXcilH=I2@3LsNHc8!BC&WeG7aSYvgkZDQ4e5S0qE-ET2zq#(?oU<1#R93-<-zdn! zA*8@y=ey$l%*yv)JMonmiVt-lWm(1j@9zNqGbXgH|S!jypuw7j$=2WHm6*&9b(7)e0V3G@al zdwZ4Jw{JgP>L5((=}mqQG}GX!hmG7dsDtP-NQJp_MFqwz$i*flfhsA2T0N2_hiwRT z%FmAxbtMX77dU%qL@NE+1c44 zVQ}1UJl-fqG+WrQi2jw04ZJ5$o|G6?ziVFw=I^uxFgo4l<0v{&dN;;ewdxczZ>VilDP0iFNwxiNC|{(fRp7^V0n17ocg`4thZq zLOA=#*w_-hg)xdBwXuBw!vtm^zKnmcAqF$T%-sCB^HPWTVq2K!LNFElGV8l2B;oGa z!JOsFw?qW}&iY^Y`R;ti<`WY7z9A90PUfL&UUJz1&KZa=ltLt;Zwd;IJn9-w@yGy; zAr~|rNHM6^2LtL>U`rG|nQIyWYVfVM_q(~uFQZ0pA)2dKb-|d>Se>e{#D?CR_GnGV z*jNo>Y5CW$nRg!_*pzmrUFU{UWo2gO)E}G)=;`1=%BbG=@85s7Q<);kdEdZbApA0C zVN;Wd!;(P0Y6Bq1d#imR641&ZC2s@#kdTzLoB8DCm|ffg`fL%{I9861>Hrx1*8F%) zn~-+Byt%2S|K4~|yESQPV?zZ}ba=uS@HktAff|JL&{tp3YLLbNh-bv!yggkC8VChF zy(WCh^8CCEstX*KVX2DTTzSrY52% zd9w|W&CwWuMFZ&02TFiX_p3rrPfrVgG#Z1nbhDy~jQ9DeS7mkebucpSc~scx0(K@t zA(&*n0pk*Z?QS2phq&hs0}VCxz)SjPg&#!kPk8|1fgalUA``?)5`uU0n!lG?exodUgTDgDDj%CYhWLH3aY&QC-yMF7&o z?H89mgLVh{Ye;c1r##c3Tql^1EdXnFzw4WV2Sj90=W-p8LVgaj+2&wvzlf#bJw3f3 z$ElACz+UbsC|m;Lk*x&m37^>&h)JkA$GtUS@fr#`@)Zu|6q1ec67UgT4LyuU~|9 z#?ermJH5@pGlXQMLrN(!64VH@I{@;^Yif`INKkqLfoXkiX_!^_RxzStgtRAV@y zrTXorCG`@6;>;)u7-xZ{AQBK@a74ZWNrVEbwxX}E1cVL=8QD-i{%&|UUc=ru z&SXiSTfoDdz-Q^?X#0wMRjh@%b74DzMCyu76?j2x>QmKy~f2KsnfzoWf< z_)NV=4qz=r7zO0&mi}Dws+ikGkiLl*7Obrn^qTX-CE}h8X?k#EI+0O6DBjR&8DO{% zIJ&=ALv^(fG*PF+9dn>=pWEB9A}G0KA3R7yDSk;#60(WIFQc(>Oq9*aJUsLSs)R%u zz-NRN00|ozAHVTbqBJZfX6!d%OjML#cIUShm%TrK@?aEm2m}Sg8(B^XD%VBD#D-wI zuzKSF(4f}fRRSN1xULesdHZ&_p+2-MsMpIuOsY(aFw3_vOp45^{B+WZ@5_95`{@7Su0 zyWybd+gEQrVn9_{_g=}$;Zwj14n#;S@I#=9I4JN+l!w#u-n|PC4SjZT=Hc@6X)Y)g zf=8k;|E5zbu%Y;cSj%050t?kFzokVcZM(cs6&@oiE2{*oKq2OuIxu?mD{MSG(LjIa zZS1SB17bZt>h~W4$S;(Eh$b{wt_*=V&t+D5algq|6!!XK_;scX-#uI?icn`s#qcZ- zYU>N?fKmX}0a}(dFrf9xX(4cRrUmjs*Tf`!zfXajazURbydqlHx#?cuCcZs1}tfMx2v-z!|5swDzY7c&6xG3>Oqr>BS? z{I->ag)H=T1ng!nb;gjR5C$-y4PM#cbe$^_HlRBOM}HajOMLxWS5J=u+5_0p%&6tX zMOj3;6BQAOEh=I^`yqW{cbV5|VmRs~@`FvfN?t1nLL`vf|C=;zW?{kfw2hJq+!NtB zUve11Ma=zuXfnC?>^l+DzY7u4wTvvM#5fO1r3-U>@M@$REK}3gtu3WjY z(@F2&GBZO5G2RA+ISSN0+$3#qFrYxm>FB&NquI&_Cmv}jt*z+ftZFh3ALhY)oDT!U z24XpXe|Pr=7grmUg`Ix?b8@60dV7ndrl!tsY=k58hLBORoewv80r)s7fc*r-9}Dbi z#PWi4XaTqpm!2LCoedKU3(OvcwPdllq@)n&Fy^3RhlYjShQNr7j7*W3RiyU|0zLQ9 zToYZInA?zr&H}JD`@YaQb)MH4D6kWPVDOp*w*HQzW9j=PJ7{{ycd@U$;9&eNJ!!Rf`6p@5Iy+x^tQEizBR6b zE(q=TbH4k8P-QUm_4T>0J4(XVZy80-^|rL21_uWNo8B%$698121+2fEz~9=&<|VWN zW*CM9VO>$+p3qI!P-M6s#H;Z}A7KF310WkJv5@(mAN@c^lc%SrcR>4O5*IgGE8L`k z;Y9~GDAK^g=eM_sfw2Ma!Vd7RX@l`cFlxVmX9`elKKIjI9i2dgy+ly)c7Plk4J`pC zk#0Hk03iJ`H%E_v7VrVe@^VX6{rt|DBX&V>zq?bt1WI(QN?z&4rU(j|-iPtR(CFw6 z5LP*!(sra+wFcoLYF4`cxfh~jZ#V1{A>aXy9-6}?WKJVKo}7}~5E(Xkw(#{SOwW(n z!-UEL49y3nrO|an(?x7q`}d#@<;o_pBI}t0^b<1;ey9Or8m}Tr=2wF^xa^FepPUXscDs*@0#T8DdcH z&W*^(r$8WKma{||1jTZo!qkujXkOrF z2FqrVh>7`p14NB^7iJgAn$NF*z;wI$*%=8`6tDeNM(|@n^hDGSfWX1g?9>3EkZ%Ko z6a4ZeHWV~4qd_Z$yA`g;JUQTKS)d$MH?18&zH^%ESIyIbF$7C^RWXgnxYARdg`!o2`qv&!bZzke^0GJ+MncH`hWSs0iymyq!dp#Abdm!T*++|;9HZC!)BZEqcgd6xY$UTJU340RKrt@P5qzWJIEWpj9LGPMm zO{pVH*k1#PK7rlEA6pj2OmQva{q2CMCetL?(E6d5OQgB<=*zKSbt<+@it%*383k~n@qw`)dLg0!g7mQnC^3c5>)$Zi#D;OB_hpd&4L&_(Z@M`5 zL5ewOO@?Vp03Z*y>bJ{%kM?Zx*-kS0Be%yZFrYC}@C|;MnP___R6qOzrlZK9EiAcJ zmGrv0xwS(Z9&GgSAh>#q0I)G}V>4Lj)^uJlyYlRC0UNd9zzLFlaoWC|8PC{lu*O`EHpqd6e{z@hXKCF) zQVbf(LiL!*@bO{kT{$@n7|?)FeRi}$6?sKSWlf0~(08!(`C-oY=3g_w`ZuBO1K_cZ z+t%-RS_+U65nGUwhg{M^%A8J-@AA^Md&x$IhA!rP*Vfl3_CI04=`HN7bl>3QMDB$l z*Hz%665O^TA%%NHMH4G!P&-j5a&q$Il$6&0+)XL3tPCtIEEeMH`^ z3vUNtP8-SyqddZ?lkno}Q+)wzfv*F`#@Rx3y3$ zudb^?Rs~7qb|Re(`g(4DertEP>Y4~KsBGbooMs?5uT55SN*yheXEF101GWOI5;1q3 zeoYD?c03GagGiaOqU`bPV&-T9W5iKRT}=(xj&uLE3>zC8^_44lUP>`6i7KRIWPzYY zEWjId02F}=KHAymSHO30aG(g7--lnLoW21pyV*aNG;-I zrb}FUADSkDB%rNRP*LU7)>1>z!07DdP^JAdv&WB#;*^2_80NrfmRDB?!>)sTzOcOf zdt^j)Y4Xc6=&r{Xfn6AIQjYb8qRi&}zLY zMxnmBs}vI4B`K1Ry;tO4EAPe>`c7W!f$r^R>hHZ8^i1(iw*Ib-)zcr>{r&>|ADQ

FDSpf@)sTc6 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�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 Ia{BuJ0bHw2@&Et; literal 0 HcmV?d00001 diff --git a/architecture/epicyon_groups_Core_Security.png b/architecture/epicyon_groups_Core_Security.png new file mode 100644 index 0000000000000000000000000000000000000000..5cdf37b915483d6850c743bbf9eb85345371154a GIT binary patch literal 69865 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 literal 0 HcmV?d00001 diff --git a/architecture/epicyon_groups_Timeline_Core.png b/architecture/epicyon_groups_Timeline_Core.png new file mode 100644 index 0000000000000000000000000000000000000000..50f67dd04887016808b8f8a420afdff8f81dcb2f GIT binary patch literal 135827 zcmYiO1zcA9(=`qgN=Qi~EmA5aDJ_Bm(u$OHigY(9AxI+v(xMwbsn`owA}d-Zjc=C@3g+vNBRnQBW`_P*6|}u`u8(S8)5X z;C~o~a?(;Lm&iY#sxzZeQ0P%)r6g2clh!9(TvbgbFSidr?BU;jfR@Hsteh_MOj+tW ziQ1#vg&{GIdP&uW^D4VHy9+B~pYLf}W}i-1WU=P>1_T9=J#d$Oh#mRx;kESP)(=y3 zcE1^~T)CnsBbL7=G~AIS$g`Vl+!lZ8uzAW~uFXNt@c(>d)>}HF{y(4FVV|39B+ zDxmrW{r^9b_^;yrKi{<<&3Q}?Ki)U`$CCffojW3NAt51l<=QB!&!4O4=-|EXUrA3- zZz|Gpa})ge^Jhx?eyM0LKME5Q)BR+{?uFlnILa?x$ho<>`8g>})V@$qz>A5AVev{a zF){hGaX_p)rAm`ID{tdc5--pEP*T#T*X!u?bZ&00f8HrAE$yTH*SR4N4-ew&*L&uz z(9qGhcXouVt4A!E85z^-D_*}wsj9A4avl5hi9Tm2)tS`K&+mr@TT1)Qn>RmpE)whJ z>D8WAd|kaxhKB z2M1rXtedYS6`PZj6E2J@ zXLo=9S9f=QeZ^PGWGVp+fx)e@f%D4bCvz1M5d;?(7c3KB?QR{cVBz2he;G?=R|pWy zY(G!1$hoj6_;He7^gB2>I6-?#m44vp2NkBuzF&Uy#9{pR%afhm-NxZz@|Q>MR(C#T z`Ba|dyBu1ydU?3G&ehl)uJzLNXymH-`uY}VuwB8#OdVWe{&#$RTCDol38RX-CQ!7V zK7D9qm7969sJOUT!mqZnzHcIOWwL96;;;3%%T#Km!PJDts@Up=7|<8ahhJ8 z+U+Xu#>~^8^%LpHVH6g^H{{H^c8ygDB%8^UeG?bLV zrKJLI-n_YjfiVkTefctL$>Am|E0&Fo&HnViQ;Q;d1nDVr_nEG)qKOI9!otFb*x09# zQnIq|GJ7W{Sk+Zk=gsR}=#G89kEMPm=9}ab+xg@5p|Em$!s|*=Wm?TeZ|COQ`V+j9 zO{abI*S{O9gJjz0@o$c&8g0IA5LJbuS#x~Y^Z7GF_r}Dbp3g+LozK^+n3#}*4%*5y zb90jV`t*>BSFTLwv4_u#0^zstdKkR;wqv9{H(OpA(&n({^8&(~Mv<^x+>F35SPWnwtw+FEgM zZ|~-buixq(q%&oS`_z@+pK`51D~;}qu>E{YrpRx;-x?ky9^EYTLXp3BZ=}yPCGxA- z7s~FL-T}{RVJt<~uWF*czNNDeX_lTlR#*-Ey6+)fZt?x{zCvf1{Z|O1$Qwy>^V@J? zs;a8Wy1JXkw6{4q4|B5Vp28PgYdj$AiPR62e@7{_?S>>B6xgZflXVxyB62U zUQ&CTTaV8zR8qB17%f&(wM&&nE9P{0*-$obY*;QbJtShk&CjW7u-oWJE? z>(@>KLluG6=G6FQRMtwF22);)rIq#lUXJCJ^)(kB3)-pTF?A2-rB(y4ZysWu4OC`a zG!5)~B$iEa?)%}pxX#pcrwTh^y0NUC_kDo3QL+g+*%gNlH@&vDhF$FC$$-`&8WHVK)>4t{@q#|H)fM*(WG4T8G76 ztgPACg>&;}(YS+E+0ryptMF0pKLLrBLW{QPCZNdQ5t~?9FUreHQZyou09cmUA>q#E zj4fp#`sU4&)v3T%V+M#Ok4Wg?D<)Rf=YH1c=F_l z$eT1_MAQw z3;wOqt_^&bpUA?n7PXGMyzjm+`i-ticnBUgk-rCv8BrcwM zcIIjC;LzIM{^irB*Jo#E7pC`{9;m7`h*EZvND3wbav~Ipo;TYb&?AMB|;G?OKP-I8wU?iRPUT!#xo!XYJfB`PYaIjmRP=Uq^cvJIMG<`X%&+pMgg3JSK$ z3O;??-5=)TJA6FnCeYB(K#7~}^nH!bF(Rm#@%i)T3SAZh13dv@-Q=XCGy;r?fM_!_ zGbvs{2nDICD$vR;)8||$7Y!pyZS~I&qxt!HUM&2=q9UpsVdwRaW*$I&kjTP$ybBLMz`Zw( ze{HnX<}WrGZ~Tv>yU=Xr7Z=^#f6Xr}M5U%GDJq6%4u_t$418rKbRx(cbS3Kj9UTH! zI>ZxI8Wg1cCrNS1j#z1Fem*iTPTJYIWU27W{rz1R(`*AtbSfOT{YmfLySH@y_h0(k^8?bGr$PD) zIxhEM$DI)0#KgepLlVky`GKP&FZ^r@N_}-6gyEw+GkR)Nu`y6o_~YiA*U=#lH!TW~ zuCx|0W(B7c8oGBydvo&M=I;K|A{GGw3l~>Uof#_w136k|zpS^n*ozX&o40SjgID`u zGbLtkZ_j%7uEh?&Y0(WjI=URSyZC{AtE;cN3*4YdNo+l(>zhJdEdVW`(YBikB^sCRK$li4)+$7oZLCn7}(m@_8A&{ zQ8i?BvXIk`{O^^NkNq^v5UF||v%nEc{;l|TK{9g6&z?0db|z|;TGLnz=P|+k88wF+ z{Ll!Bh%l>rjfzXb^_o`H{W=|;(r}&*YD-54$KSHSmiF|x~ zZe7a%J5GhCb@Y85aA603r<9&Nxz^g+3b<^$H7)TzI{I5)9>!|LUzg>cH*lP^rI65f zA4EE|E!amzM>p2{VMe?FFlhpS5E;X`dbJmlz|hbzC_LQSw&q!;qLj2WF&UZZbP*_q z*sc}FLaQ-;B4Xm>leK)!T5r+8!NFpS;cz*Qa(_9_>JMp>fqnUU;%I1ST}O61J3DZr z^z7_m)gFh1K9}AHn-lFdUZ*0Wvbkz^$wGb+KZYh285#MY)OsQ-D@*_HWcB()B{}58 z;|SW$54WF{ZC0$k?El)SdHmv^Bs+TwaFKw-IVvGxRrBf7r+{yRBAuiVnshPE1>=UB^66^KP6 zaH;PXjCh$rPQWX4!u$Oxv%4iL zE1RB?!S~Ux<<(E3>({5_YiGV^=glrA+AP9x4%d7}t~AL7uC(h1NWGzaz3#VoR5DMV z816210>w4@p#d2gXr?^{k?1QjQxbAoHFj+63kJw3G-}4@xBOH0JB(@s-s<%5FXrmv z!{xzja%^nuz0HY4fB!2$rp=<$puD8c=njP;f!qZ-%yTL&%X89TPv@=kg*UN2#l_s!C)i zM-u>r>Q8|II>ayokO64kTYQ?fo;1lDfHqzydua|!T?tZ}Qc?-*fsOSi`)i_U5AE%_ zLGFZ734~kZmA}o-s|Y^W7^Biz6og71srC>EA!DD-&aYt*6dWPGj{@CfXWXItp4BKX zdNv87zlR>6`n7P*+n4_-HYbLIUs%hpH61Il0>DL}4kCTyp5YY)>bSZ4mY-&j+TW+n z(W#8(tUY^AdRMIg0?tN;1JT8$;tw@we0$GvS=s$y{hKZ}Q2BLIa`Ga>U)N&UU;I|r z^ZNC}s5vMk#AvqZowh?KUnnKtH4v3w+C}~Xus~W=9gJFdZvP^OR)RLYu<#3xL8JI3 zp@f74hWc$Jvg}dN_IN-?HA&NXHN9t&gOvOXuqXeK>&-o*-(2o{FQE>?I8?NL;8F2! zU7Y^i-EO9fPE3@GpcO4!{hp2dq2PN(0`m589JB`eC-~I&>wGRx^~5gE9N-Ah>zLxS z8=Bq`$KSVO5cN3VEo)e0xpm9$bh9#ov*xIQ$44@bLkGDk$v}L*G9d){&1Ffrf|A~j zk84kQ{1u&aTcSBwACb)0tuC8+OZ8F2jT;>Um#ad=d;zG<@nP*{CzVZAeOI#Z%0#6A za5$sUVsil8#^oL0B8npbj~a!>*l-jk(8G((``>QQHS^fbO8t(YQ_|4**vq8LC3bOS z1fVYsO#`L3x0g+);zI~$&7bKugw3QgDc8~O@FXd+Kw>YYUY@b&d2U~YJMQ>+&u`4S zG7Qj`N+$&ivdpC3_bQuKF;-mrFLM02qM+cnuf+&KCoT$?+p3CJ$s~vHw=>;^$W% zP(nY{w);go?mT8CpCWQYPfzbld$d{?Gyp)o-EQ%2fhkYPhY!(QCf!(g%(@1)wBdN_ zp<&IRA5JY*A5Pxl!TxAKqFvO z{`E0H*n(ODWKjKNZkd~#cchA^`kb%n0ZLm}@2f3#CChnwR`q7Q12e2Wkj}dWhqI~< z#8=r)+g-P438sjZMr91!Cgp zmOB)u=iNH+?HMTR=JxgwbzQdrL5D>Oomd1#wdqN?WU>z%3B1w z@e)2iJzVM%{yYCQ(Yi0vyR!qJ)NSMEFwh6bjnNoTdf>afbks!dysyJt`I-4o1dtI# z1YjH zlR-!*;q-59Y6wR~(Ei$Rk=Lm+1pkX|+KmKpA2A@GjEsy(S9|#I;YV?wnqCv+#T?_Lxj1DAOpqdaqT@4~wRAQDKMhj^^?XA)Gp{573v2yk2* z>Rj$a%CTj^etS?|@1FJeeI#_>pJ%)7w6e5zbuCV~Oql>!1B{3_c6UciRJ!aAy|6Lh zj{hiNLkpi}R#lDvdkv}dcwk1kzk$@n^I4F2ogOSeD`C^CN#e5@;)1OCB1eom-4bG$F7#j;8$xmPd**|CfTwPELF_)%#@71q>Seu~9rPj+cO4aoJ3YfH1<% zQ&t?#(JTT&`$aupcYUfhwWmiJL5VNzL{N=UrceaMu3*%O9Q-kI{5zR!Q*->*Wy&iK z^qO5K-!O$v0u~DNGm*n_hm_%Eh;?^`)0$&?CLDqV2)MHaPMBl#*HZ}@*H@bbNx`47PNztxAd5n?B-Al%MY zlze74EC2o;8ykZViKyjj{eo~RxVsBQh#pWJPWd3#)W7nve+V{p)n1<*n??Z&NSn=? zQ|rz0C0ZyaGe>j#aF9Pel`b}*(u0D74S~9W@%LZy^P;cT)3f&h6}Tbhc^`60xb|c) z|4*q69i-e}QVyA-sJOW1PJyWoXmTr~KkvffFGA|8mx0RbR5LYYKAiO61l2NgdGYts zb@m;LjFQq)D@&?sSxO!7sXtdC{jMqcr zZSU?Hwa2oD&v1z1V8TCQR1dnUFQC7~QT75^?=Cc3Y`zkDuS7&_$~ zyy%>b&nXos?b)T?pLM}Rr*~H9jcduV*x7+6; z8bEO8k5R-uhedhN(V-j)xFu%Yw2=Q1ou)=W{27^07D^#>ZiSh^iVjzPN0BD zh9fWsoCMCVuWt5NNcmb`B^DmuLbA)`Okq0*PX#0Lel())AINoG-yH8Q5!2Fk(Oqm| z0?p>|^z?-HONateIXgSs(%O1cL?mf_-4ajw4gx6G%!3%q^+z_GFHVMQ`!bd2z=%f# zfKAo*+lH&=Y9Q(;#JxoXCLD=NC!DF^MAiPC=2K`y5#kqRX5j&5sa~;wVLVVd0XX*5 z;^N|)%liQo+kZu~D=$hh?_2C~Xl-4&!4D$lxLxm}!Rv4$aPSph1zQwG zEQd}T;1xC=o(X^kE}hu;@_PV{aHFCTjRJjCCDDBn7*_<+x(7|2Z@Pf*N~M#aO%IKy z9eQT);42f5WP9r){r`STYFKww zxk2-c2lz*TD*y*V!p08C1GJXbefg$o$43burUasUkquV`*>{(^%`VQ4;T7EvH**DV zAnZVka9=+X=P{HkG+9PysVu3U@24&=4mH@wkQ~v6L>+hRS0EuH+W|=ChHm>s4lqQp zD}m3#6}s98@I)Tdj_GfiDGdDlL(7HpXooX_boTuU0;mY%^5_adz_&ev7PoI5=3crU z8+^#kfRhBYa*n{~$PZ4+`Qp&$G7b@JipfGi3-SNm%et|#F&8B3<1orcVCpCGTg^h_ ze^y3shVYXkfDEp9d4$Fc!%X16s8K(wqwmy$A|z%}oUb|EoU6yAGY0wek5Uy%QL?hL zn*hV=NECvb9$tAFT33uCXd?#nX*kZXn@oRBh%xvS1?JN@8`Tr}AtWa}+K z!5bmJ8j=JZj+(_U3>;;VLbJy=pLRDdK`5hj?YT4POpTwfNN+t3<*HzenzNj$N&faM z^Qo3rTQKQe3LewYUMA>Ayakpc+z9EAkU)h4x{hF>n3xz;3A+a9u8~R?PT-sKaQ5}q zr93X1+W%#t!vj%@^pPK98zN_0jq(Y+?|=>>4KM(wkIf6tL)*TU2`q*GUq0llPgWx*@c4*8yy?_8%UrTB)cy3HADp){?v+xCI#ssfD|JfE~a-cV|TWig!_qR&SS0W z*;#6!AS>yaHZzNfm-QKOlZJ5T&35HUo@d*0K+zpSsSZ89DxOo3g$VhB4Y8|V^n827 zOlfB!j`KQ|@auRUy)SZcAz>VH3FR*o4N6bty)S7*6S^b`e$6?KmhTS(0jAs6e}U0~1{${`Cb;AVp6(eka2 z{2K$M;zd(F$+EH|vY=OgjM>bGa1xaR#Z)>}MCx&#Es=X6ZYmJpj7So?YAB-OFlk+1 zXQsFZXUN6f0g7b)E0`3B<`r-xfJ%L`1^Y4KDp2-@033v~OnINOr+V&SL*YWDbSgp< z)GRW^Lz(*>hIAba^?%L5%nuFYUI)?)@7vOYHG^n4;FN!$iW2r3a5!y&1#p4N0OkSo zH2Po47C0;^J`Sa*2WC+Q4GC$T(JU6rH_U60ul8lg!OR(914&8L|1g3uN)LDj#Vime zlYuN1AY}zkYidB$Um@887SJLh@}s0_XGY9Y5y(6`IiW_?80u{VbsZPKzcYagZOxxaH9?GTSPwf1!_Q^r%EX6=m0_6rnQ?E1N&Bh?* zVaNi&Bo+QlRkaBbktLQl5H0iulNKt}+!SQ??=hQND;_+St^eBvaJ<3L*XFrDs18@X z1w?LpH9No1c|!|Swi$p$rU_^|j*@z$T z?c29;r(vDZxc4|iV4pPc4QopRRzR;3sG$B=rIKo2a3Y6p0%*%dGaHnS$v%1V*=DK+ z+J9gA{Jb%<{6}QOM^Q}e#k@LO&oEN3xFgu0Le6*kM z(+SjH>E!gGl$3W0zT0~T4j|V+a*0Vve-VhEL7pb$A`I7lUIrX@NXf8<0Mizjn#Z*- zXj+%eU~HDn;dh%V_+~-fJrj=8zunnh-nE7`mS~)84D9r0L%)IP74b6C4{{X z4Wynrcn85C^&ngCgIk7(DzMlLMhZB&4E}d-;+T`VQl*TXV&s!5wA$sxxhDk6*whs9;6Ra|VBBo#M((j&?3As%ynNhq zw-dA~aa_C8(59Z0R?6t8*2US9xWh_D91#^&`{qPtyr@SBh_$3=;7(ZnDL{qNUx?G2 z{G_5JH6JIVpuhz70-WM;`j|qpPz;RYOKhgP035&^H-tFhmAJt@xGu(XT?ox)Bpfm$A&PF*U(CV|yxu>mCHe|i<>K?V?^C(h3NV27YgBg`BIVT>#+sXNLx z;7%H~MBYRh2Zo5Sa*!s|_T^n|=OHrfg@A+BV5ymp$~l z-p3}0oujRt^biJucVXg$0@kui@J9}H{8{Jc@>~b zWC;eikX$VE^q=Z0fNrCJ|9)lQ{QA9kdGP+g(}NX-^vulE9it(-uBHi|uiw9~=1kNE z72|H|;vjw?5OYY3ow2D4wHe=HA*kI2!02=cJg|?BWqYagtG1UIEnQu3A8=KW>M$o< z*CZz=Un=j)1u>bj`|rHoxpTE>Mkge+9c|BHO#L-1V{22mncbtI;O# z^pzA86pCtn2+O&uE-y~^{!XRB_Yn6TUN6U1;>sW3ePkg4m~@^!{Vf1p%<{~{Af%@e z-!4LA2Ma9hOxQ~Sc&GI_vqJ(=;k?n7rShe0DaGSH3>zV|9gw^r30&Vwzmoq~^}U=F z$G>7Z^|}!I7R2wA*C7pzMv+Fr2+nbC>0}!SGfilV!@3^1y-cz^CAKpU!M1G$MIRIz zIuCqi0h%B<`AfcK0AV#S8%2B#&6$L|zDl&c!(hobVv+X>cl$ z7{Qcc8&}#DgaIKDQA4_HG|Cb55jf&>y;^VR^g%Gt1WV1e?{x5@DoBPV8ZtF`B`j0^ zo3KvRk!8#+@`L~!a&C(uHbA_3XxL$c-&IP}-3mu65rvYY@xxb1{QLtLzZ8fXEq(}& z<^tGKpP?Tk-o`s(7LcjM_H?ZqI}0DPolU!#~W1|>x6xg`NFDW>Z>b2Y{5U<4zY<{d8!Fdu}~ zKhIX%hIDZ_UWfyd0C&TE_3BmR8weScrgig&&XE8CgP51oQ{T5m%n&3afR_A6M*4#A z1>^c5hszgYUmSs%h(tSnc2oLRA1;_K_rUXV-W+cQBc%N`D*8YEsugcjdmbClV+M-g z7_?jY{Che0#=I{qesv;-{l|Mo6ud95gTwZp$FPrpOd%loSEbah%vA5TrBt6h==6Mv zortG6^1}#o%5yjDUy$`UDPS&lRM!lwF>ygaV>*%mtRuA1HjL}j!@kZ`qhfB*K)pzXu$9Np>!P=W|I z0p^-kQc}{oub3GPzZe5w-U51h&vk2hS34dK!W0G!Cew9q0EC0!l)$8Ofqat*`2og2 zhbd3#xIGSp_i@}Ugb@NCq!Zm~xn((Cwq3T5oNdzmsGkdCEwy2fGSDZ2fjd$81-~MXZPlsBLoT_f{kTfbG%5!Q9e%ubBl<|JRm(F zHypsZ+Fkw&oX2u89GVi?$`K%~oQYf}S*Jp=3Me{?lUO$pU+Yt$lt#=blYtP5zP zp76Ucz;l2z1LD?z82-Q_!Z@B?$)YM;gY3sdY*3Io{>bzO9H?!$$6df8BzOH_UKJG! zgXp)2g$38T(C^=;fndbtzJpxj41V4Ygn|c{KlA~i8<#79d;vMuH3?knBFG|I) zPWJoTo~x;W1j`5KKcs)9$+XB02;ugc-em$zVvF4OUjfD$ImR>40y#c7i!2`7fDJu_ z7DCx-PI?{cd{sy^wG9CGrBCGYY!_S$6vPglix9`J`}`;bSq^|50?Wy&c(67oHNVPa z&p<%|?1Y2c4pfc%AEA#@Q$Urxdk8)GnTpCx`8tf=$2Nd!?tp;ksrGO|&n6a}1gB_p zxj#pR^Mj90;XUh&B20v{+ zZ|6|1or0aR)R`FAzQCRJFDn2+`{xh4!0dBd{g&wpfCUS{+*v|VLsl@&f;OMxI*Sby zCX@rFFjDEypVsvRv+GuU%*n}NrZUpuAcsOj#!xT;X@0#b6@CaKrMZm_uRbeXul?tU z)wb?@>h}E!cvas)0fVKW2fL*n<4(-c?~w5ZxPj<*hzYZ(?wI#}eguq}qvpu)OFN>F z%wtHniVcw=53m@PiQnKxL-!B^I^ybSmg%fW??pz4!HT1glCRovVGJz%KB;pCREr#>f{>hB&t+ClMOSf4{!A0o4ng|?XHFcx@c*oVM_ z=F1Dr3!F6qnCAI?Cpm5fo(0vZa2Y|h+hvKEUeSC(UO18QK)?RbBHT|4v=MknE3?B;1mMg z0ns%^Kj7?xiFo9hYwO9zT&wI&|s_ZzvI5cs(-&5h|vEw4*g+S z5m_R>dv{k`PgB!vTAU*Y-l7_%2Hub=z4vV&o* zlurTOABY!-*IQg%k#%)-bGl0?FkEBPEWA=V5k6x173O!y*yLABX8xb{bO zcK7)B_)@w}5<8u>=cH6rdhJTtIXPibYO8D?B$z_Y1x#SK4i1=M-5WN0z>M#@ASN<5 zMQ%DT@9XE!Xo;PR#}~*p3)fk4|B7XyO3#8l2+`hok4~>oQeHJRHAlzCZj(lvhjZ@^ zBF15Vz6@wD_(X70)cBY%%0F8asGSk0J;np5y}askwLB80xM1UhCzS^K{)wHBA3X{% ztMUo?^$-Nu02ZVkJ%ZqSdZ&g4wOs80wBK7+0e}MMAZzI`wteB%&MrTM z5mq$eO^}gDnLDAN&NT|}H*gNzJUoK16$rtl273;;%=zBU1RsB+=4-5MY@Z7YgJ=7K zF{B%l?_~e-pRhYA-Q7NDnCcGf>Cta!Y&55$ePpV}?_5a(6_QtT@(P5gJgkAitHC0d zgadmqH|#C}K1WAINq~n9oDbIXp2EVJgapU&vEcj?xw4v?qTTjNwRfi}F^b~S$^<-S z@p^jt0Tgpk==uX|YgBl3ND7#_H9$*523hculnru}wnE7elIVYXd;GBYM?y-fqM@-Y z=##TdaU5_=LPq*j>**7dM@-Kbp5K4f?fFoqDDH;Y#ygfbqNHyO-nhDX5KG* z<5|cVC(6K}QA7?rd3ag^mOl&tX|j&cvj%TfF7=)&aj!(Rtxv!i$$L=}n8?LA-onqZ=EW>3$iW$KhsX zLBVy9d9b&E>}$m7y59yZUJvL5@DH~>@N(QYBQvweyq_8Rzuc=Q*F0P{7({uZjWRM6 ztZh!V_oO_8t^E8}sHx;4#JrZ1BOf3uAkgyOg@uW-?Bi7J54~_){}UxJ>55)7(veoo zi@!N0?W{|?u#f-Nyu*@vMx?bSFCvb7CN0e|B;;0}Iwybw%;dg6Lq*oHY&H0xYkUWS z1v(TK!Jfe2#pCcV6CZm_QVw-nNV}4&aP)}(8so;5N$*Li;)qWkrJH-9YqFl6BBJhl z`mmf=Y%_JCEka6o93Y>^W4?XS`{A}zW(av|u6;rrm>sZ3*A1FVR!;5~4DQw&y;<2X`Dzszv!zdLg`OmJWr&FO%8W!0^Yydpn*(%bUUl7Gla-sEGSz-1 zURA3@mr1ivY%iCn6qEVNN(6%Sf@6yw?l>#vvwVUB&J@m{C#JNv}#sTqi<%^G2LKEzK!&GtPfdt8}9EL(ChG8u>)L zw)V8LGHZAsVq)Pv5i5H@l}Jl>Ad?(DSC8+AWm-XxqSL-om>eiACVu|duH?CQVH@&r zJutfY3?pw?l26_c&!EVHCYqDO2402~Oq0Q30~aPTI#F^ciVZfGAF6m0;-4x>ycrn_ zhNmQe5}I+)&3$BFUXsPri{X^IF}(oI8~=zA75u z{tzkpBd3t^p3saI-}08w?4E!xEpNVjHn>hS&i}E+IjX5RBF*SD99c&E_>ltE{2nfK zC9i-}9xd$|0&_Uz8r0Ot0tx7tg@qH7l9Dh`9dvcYq$9{wo|{nLJk(|-xPy{Fe+xJ))@Zk{%_XIl$fd^uE=!AepT)^XzFwdTqB z{{4lX%69*uf|b?8VMwFOq0XG+Lluk1MwkPeO z{D6J>2TETj?0u7! z4S8lE50CzS>&&=D3H49t*RhK+A0Dl&eHJ^EcE^rHCpmL~N)Z}H3bd!@OoD4VOh68pxzFG1^hAI)IaTwZwaTaCBGhEcVi*flu$ z6vbbt-L>PVns^=l;QsaPxxRzu)0eLzde38YBqlEJHp7ozXu zgQ4w6=od(^)F;QefOw+3#oLPhune>T+jQVd3V?(0!+KY!?`fZ{P?CmUj>at8pIOVY zSsf?3vW=|M0wCPJiPN%2puK>Yb>e~Y-*u+C8XtFI2}L$hDD2wq-qDlT9;*ocIfk zQ4JLY_Su6EEt?OTT>d`N_9TG8u0pN%Iq2dkJ4xb}V|7>uhGP9wXo3T~GltzMIlEy&Gc!IEZjk^w#ND4C!=r?tlJNC+}S1_nDz`$=Ta`vZ<-~7V}r)d-rsf zVXqdv!UO7KYGPu)R^wME5(`N%PeG^i+9Pa_V>9r1jA5X5_m&RFTVd)@6buJXSKAU* zw8S@z`qjT0D5KvoR3>jG3p;e~5A(p{CCtOz!)dF{$+hYtV`6^6e%;YYcD_dSD^io^ z&zoF5csi`jBKuqES1$sWjE09W)~}Q(ANowJZ*+EzYJoe5e!6eeakQ=NGT{VLS?aG7 zVfi#X2U>G+Vu4tGOL{(vLvPsFP|4&a75-q3%^0r6?)Ki!_oowoSzpx}>f}fIq9m-Y z=RqEY*VW?t-71QBY=$@6WN}xlFr2 zFV?2$DJ&wlWLr=&`=Gdr@?dF*-Q3M7^K_?LR&YJNY&;wuTCiAp$w6s*@0^qJ0jT>M z+{RcijpwP@BLjOc3S>XBIqBEZ&7X_kJUml9rU0pKy_^bZ$Omh~!b%#Ey@TOvVc&kW`C3tqSOn zzZ-}z$a=ahy1cfgP->kV6teb6TiXSetsX-&1NuXWHqF-F*|`8BkNgt6fptOK*SeFF z@`WR17!+^p=6;WU!=Vzx6x%&8jp%%wUv}R*o-gDD%oeKFmGrPs8(}zr_$nrn{HLMup_MD%^Iy?=ibEy+}@VQg~(~{qCtaR!34W5r;UP7?I$Y1u5FpAhg zDB1ILqx8(I*XQV{mhPFF>f7O8x&z_a0e9cb4D9b&<3D{9qpxZHCgwFBN98QHx9G<3 zxa(Y4g0S>F$!-0k8^H9C4G5>Tp&!njhdD}5W;Il9>#Ff=Z?NMA=Q7>IaF=c@xF6JG z)@|N?+xLT|j2P~VzD~>5Ez|B9$|ObdjV}%5jspv@){udC#5X11E-!EEO@qYE(Jp`g z(?WfB!bQ*F$W{y$m5igJrQ?&tPh83?ei#z@x|ssSQWjCs=r2kJ*w=>KioC1+g0BJf zFn~JomE)vojZxQag+ZK?|A?k4EPW!-3_uCbg&0i4I<1cvMvtzJR@@Ao%^6@Gm|b1< zoqT}il$qdgF@6W_{hJRJ&+2fgWtGw<@V&KipN|5uw1P4jQfZrJHu&)Gp z0%ko(R$0YKSh24Z-KFvm&|DcMt#JO?Un#)I_+U7%r~0&;K#yff4_b4iyf`~EKJA{t zp*2gnI6mriN=g}c5@C6wGLKvrEC<+)yv69^$fr zl3`%$|aY*wc+mNRjCBNtGHpXfe*^L3D#a@&Rz+QxiEu4 zxkA0r8C0hAwz-_5m*&LDazd1->u2AcKam)+r~2opcc~5}%`=kgP{cVZ*SUY|@V!BH z*x`{C3Y}L)YMPp|hK3C7v0lHyXMUoqd$Yb??QxjB-G~W3M=do5E()H2t0^`9p9<2N zOIo$u!UEHhH()I2Ek2yQ<9;C-+e+C-GVkpO8e|0cNyZXIX>#6M@ z8V$)@E|hh@^}7e`V*j@bz!h1+M5|0OR5g$KVvTHd9wEnC-$7A z?I*?6s|6P1j4X|t69pD=0EzAcsk_(bD?ibpMofu1r9HZTqX^k zQ|nNB+eotgAXm2h^PyrmWy{>Qj9+kd;DUShyf>>q(%fWY3++r4 z*q!o894WPdCj$vpv%fZWvioA-`AgO(P~h&YzV$lQALD0dQKFQIQw+?uKp!6;?SY3X z3(dOoisM_uVfs3~veF7W4I@6r;sSZ&4>D8?=8Pp>H*DRot(fWv1%JfRFKlCttk_=T zmFBah#^uB{ZjBER`nfv&v^fBtp9pIC)IAU5prreDzOW}?yZS*OQ!yE^jEk3&)TAxF zapai2tE=!X{4O_`FGU}=Z(=1 z>@WB`g;4aWTth*906}q8Q;aGYx|TC9+7|iG-!`Q!EH$a?^gWsqG*0rA6Dj& zM_X=B`E-Ykm9FGGz1OGzDQO}5X;O1tY8`cMtZj05Jq(3lrq~io9sL>mim$4yh6aWB z`5rNjx8Cb}iG=1kS43rW+}7n^v%JhS@1^VQFEE!hl~0y{&7_zTd3qVObWO}gSlK`x zx}h4*pJ|fStC7i1^S(hG)<*eK6+d`hR?FiGwxrGL=;8WZhV}BS#={EQ7h{gRHj}>2 z8<*1HRQIV4lrhS#kN(6Vi12~Y4$G^bQE&0;J3AkQkl8;~km%c;MztKn7%MUVQ%N5B zn6ER@C!o?pDS_WASTXb2sMI4a%CIC+4>GXE_^rnL|6=PY`+cp#@KUJG5uAC_XRJoT z>W7Mj65i^bxr+WOU7BcQ*LW%Wu^yPnIFtg`Yz*IxB=UzHF3#Lw>2+&o^jGhfX17zd zhDlxNj3@4Qo^z{wBO1tKPr~*+!p6tYn_|U&z|NwW<$9*UVAjQ^nynVC^>a1-_HivZ zn!RHa$?61j+_LYNBkapb*~0uqZi>og-ZIM5KCAW=#G~XbkQr&MueV+7xPd`HQFmKU zuOds;(~S3NN8xiuIbAfIH=0`PtDH6ZuptDyB)1gKYOh^EGl8>29`+zKdc5^y_lYwb zF8u=A_Nn%P?|}#V+h-UU_|z@M-}+nbV2q)mM*gP8?M@Xp1Gr<;J0O_M^lW{vBG(>_ zG5Y*oUjbXXT%v>5H($(d{UQR(yZ5^Fw8z`r+kZ=a037E3N!{25D zx!J!abUs_XNQ+Azcil$gw?ZQzU=Jjqf`JXsM8!S~Uux2n(;hxaG;`W>7fne?$UKH*-Rv8cOh1QwtW4?5GbuWqkQ?GfJP9{Iim{U5$&0LIO z7X}NKBZUE?9?tf&{sJ~rkEfSE;*-Z=tq$_c%rda(kYN#p^s?sL!VDCjy2o}NOT@#J z9`-xR%6QY=90XuZHFoua1*UNn_dM_8kh6cz)#_yMd!zk?%7lp)4V{mYpDGNOmN!VV z$c#m(IsQHVTLGI%F4Mi2Wb9f}PGN7azL#=qCrSS7dd-u7?di8Ht#WQT^}KY~?fDNC zTJ+b`G2kySQ5>e#5p3MY$+9k#7MF~dt@KjRUQ8Eub>>m&5O z$h+#RuFv-l4otg}G%Y93IPvi*PxhmiM@g@dD35Z#5gac^zpGZ4>hlWw8h2lbl?CkM zDa71){(-;qGc0ewLx`I2#98)mKJ&T(Ma3(jbTuO00M&2m^aZ$SbsWl8>S?2C53Q8@ z)6I#;E6e&}8JzcKpcyaaHoPNj97Fiu+*P-Zyc>t7koaUEpHrAbDv?v>+UF&z(Mt8k zG)d;r$D}~;8ai|FU}BN3U+?=QF`gA3y)qyEPP*jfdGstl)2|PMiO}Npg%-PFSC{3< z-&(1#=oou0u!nnpSiSJg(=)R+-q{$qp=K<$^twii9aV@1hn(~G#DtD{^c6ITI|i`7 zxVPNz7t}x~b19=NVID#-E9(&rWZ|HA|U|w9^c*XwK3!~3WUTIiS=Z26mYld9re1~1?BDiHp z_3p2!Z%<25JPH}@`TqP0`-_MBs|N<2Tap@E$kblwF=o9pPw2kpTl|jcw@d4tsd)H#$c_8zc@NrSt>^Eh%uTyYUluh* z{%$Cb9AceA*`2t#EFg+gDVMaRCAadFX=QUV21e(%tx`s`E1kojcPVG9v0GYt3OZsb zCcg*!`#$+oZY_4lbu2M4B1{5bEwA@bygfBuR503z;peQ^uJMdVMaPU3@X`IPMAe%BeG8OycI6m$6NulY(rH(c)pOQ9$kl2nrLI18SNu1Dt)p7QjJ=}tJa+f+dB(#0e}ftZWBUN=*z`%Anynm)YoE7 z!lCOS+{@fQ65aozwef1a%I%qX$Q54_xk5XxqoX6`4Ew8EKVQjucQPp|1+X{b4zOnc zRmy19N3ULM4gZ>P9-1^>oANZ{NnfpxUW$m@=VG@Xu&-Yad#|j|zLKD#j*ZmN9BlMI z%M9;}#b#5OsIZ-W{pRulUA%S!7(_5E4#7-0t=N3qetY&&LdnY~@!TdyW>ex-$rohj zI-(s+R-B2X8nnXttTL!XUul@bzlZl#J#q++;rI<(8L~~jPac)IZZm*G!l)6p2VHT-x!p9zO@(Jgz(_|-&#Boj}kfBkfl;1cvMcr>qOO@ zM_d+GSNAQ3e_w1HIm;0Ve&Cmput)RQbKmg~P^opcg5f|6|7}I)^DXpSZwZ#jqu&WK zKl?7*V1<`}j){xWMJ*)N=)UhCEkS>s5vy8PY0Wuzq`(RNH_hYa^x{XY9}MYfVz5pa zg1-O!Za?=MFN2*3>nUTfFoiAFAv|Kh1m5IJ6@_@5q=(w+N1I9=(!<}#^L*!^l<-dKki)uUrdQ2{gDW_@oVb| z{Y!7rH*c8T_uV_zN5r2N=!+rGiNfD`(#KpQ`JQpK)LP+fbHw%s#=<*R%G~r+1?uk$ zy!L`Fe_Dqz%05Zllf5|GRYD$+BhoMH`<;IM4!ShcyF_x1o;00Gk{=Z^5Ke-(xHJvc z`4h{c`#lfLE#3>3O9;_#H(g-k)xP?egRXhicRu(t{#$rjTKTK0of`X#ruSlx55i(t zIp5P>o0a(T*81l>DPC^7c$&p9hv#4pb_AWc+9)r|#l@-39e|U!xTs0OnP$@uZiYq0 z_PjFap}+4j^g6851io1(etGt#So1Fz1+ILmSTe(}kb(w_tB(n8y^mlFY`wi{PnItD z4pH?wB%sgMPu&_Sa&0(nKYQ;oGidv2s&W;Pd+nl&*^f)7z z7>iAMrU9(y@tRz-@v`Bw^Fy}(kEZjE=X!tRzCFqc*?aFz_8u7_GBV=WWRsPVy=8AQ zLb5m6n?%SgBO`y*bi$M^gByvH?O*YkCUl&1&uPClo*Y13Q$UZ2P& zt}g4JijqphLsLx_-QF8p;I~W_*=9rtP6~oiFYfJ>H1e~@S@ejgt|w-YDq!I2f29hR zO+-ORJV7}!R6C6{o7&70o=E=Z+n=R?fQ)n}V+%gA)aHkD4J^+g7wbwGPsXV$gcWQL($7*XA=Q5eusn z&<)1)CNcU&;Kmkcy;*_h16OCO_aV(G#mq)KZ8xL8MQeve;azvdHrWCu&5qgHhf1{v_Xhbf|BujSZJe}6$Ui|7JslbQZy!w?4Rq9ozXd^iNY-m<0uASDT3*g zk~Z-$KnVO%=<@H(!Y6 z=;Bx&nvqkB1nHsKKJYD+M?klqC z45*IwM;mNEr;4b+j#7X!?($3T;U^!_HV_L$hbC^7oc!;yXwqvrx`#-r2j*lV`^F?Z znZsXu`Pxj6`D$8!K=a^JtxF|M%dv~yY&|+A9#d6a(DiRj zc#4+e6hxyt0SDBYnzimF)B0>G52KdmB>moM+@NCiz1L$2yg4-h6-y0MO%U{^8XcBn zNUO}~F4VrKZn9)X5+$0v(Z$|L$bC~(+1LEmOCZ#~1Y6Sl0LpSZGjjK&eh2-#i1a(% z)qXe0eSM9CLz&(|J#62Zr*-GOUMREr%5C0Ubz2^FF`N{ENjDnxDh;>IEq1 z4f%UUZo}|$2emDZWyHj(rhl404I<*^AhTPo7WO_^Qcd=Q^ay5o6wd#>B>MG@RW&U{ zk}#czFE%WWU- zY`$P^K32{B=jS|T%4n*U-Yw)!Q1*ySVr2H(=hK$mj8t=v!Q=kvK;?ab&Qh&I8vUBj=6sVS zW4G^~e(6!9=g6@*I*X7FNbXvp4SYo*tN|m7_bmxW(3V==LMN8R6@tv`XDif~b5Y-; zJgqd*vNq33+k2=wgWm6l3Ue1$AZ=9D`2o@c(QL#8F@B|ScYe~SsB<*2%+@MP=rdxoTh^MBO>EE0q{5O{(uH(CyRWetv(Q zPx$N#uNKsv6?09{dZ>PeYqcgHni)no5UY%Omvpzy|AGT#5%qonH<+g?W{R)vou`!o z%Z&1of2N8s#7`5)S;obYNrk{jc7^_Z3JSH?G^Ri2@s(dUJLsXv#jxtKEYvH#*1yX9 zcT*)%j2JSAQ)Y~>G*aI!Vuwgp%umQ`*#Hhi80NdUI;;scK^#Jme*NAWr;J?y4gk6` zBR4m!j+k6o)3lgnhQ$V1x~L(Tub8s=B2Qhyt;)RcYDU8%avSe|n*>c&fSH1XWC&)c z$-kK}hMf+T_`GDLyyxtX2xUFTtf zqd)i|UsLEkT;7QyCzu9w*IaP5`M)q=yXMwdMwv>Z%pK}Ie^EzEyZUco=bSRP3tQ?o zaj)hqv_q=YB3`GwIRW0WB~ksOalMJMIrtj@14zifJN z@Dob%1_oY4m)N-3Y3q;mq0h~-o*td&K&17!qt$wBxe;3})#vu_K(sqv@H;96RxSB- zu7cM%nm!kV5qRMt==9I^?N+FqSO3*&1O>e_r4+D*Bw%f!?(bFhgN!kQibB`_GR1|5 z1b?Az3=aqT`(JJJjbcaOXS^Oy#a7Em|Lk(+=<1sIxxq{(isp!R^#TKP?3;jX`dF-3 z2Cc3dW7kOw6SKPfmr{;&o+f9W2sqo5WnhNyJcP2CigA=34| zr?=iyA9Ijq6eh-NNwCnxQQLwgM|>&!EEf3gy`!~P!0r)rH&gj8JOeQ%PRVk6&qBDA{W(7}=C?xI-JW%8- zdr6t#Pb;W2=SG+re{Euge2F|Y|AwV>OpEK$AHTDM#gw2*u3B3{r*v3Q^EQX4I2K$zbOF z)w7zis)iRIYs@fE6uwVbUbxh#Yk$)GM}F$vsZ$W|Xtx{``JCR>m0>9hpZQneX$`Gr zEAI-X?$`cK^vOaBp&V@dH)B`LuhG76B&PRox%6)ERYw2Tyg&bYYyXz`d3Uf{_<#06 zZGnfP$K%&~cRkwWMi}1d6H{nLa{gWG!#T>k^KIf|LKfSnHkRLY*I1u+u;{x(Uvlp> z@7%<;F@Mxz%X`1K*nNux3OIdsvt%X^pTy)CTbLoslm-T1;e@>tB7F8tyK>IAA_PI1wCJ#m_-RE6TS(;R3DV1+Yn3;sNW!WONg(@>Rw{Tj@y&KzC+Z5Z7;-ck&>wU6l$*VtP z=gdQ5-U?o#`$*2pG_+DOni^N@?U-9j#S8l_EI;LTIqJMlj4Jg0<0CWd{2JOD$}GSn zS4}uIF}yqx6!T;3zagA99B=QPIc{f6S^2%|+^+8)HKSjfw95&(OgZL%{<`_;gmimF zEBO**dt%gUwUhJBON;7wX8R?w++5GfMvI|6sGRG5MA;DY$lh5ve?mm9WMZmr@?r~J zAK45wBPnN|dStwVc`H&)jqm|uXF7y1|G`)vGz8M2@*x0Z5bqDuew{CdK0-QkF)d%O zPmN@}`QNaJwEjqxOO(0h-!oo5(zcfs7(!^(NTi8}%OcXAj!cMc@#9tP_Gj$a11DlE zH2ZAMU<1DNh5{THdCI{|PgyTT6BXyTGQt{B7uAFYmNXzQ*F?Q-OGOP`>G_rUSPCWh zJ7e-dF9Cpf@4cj~H~bkcWvu+p(9nxXG6*%}u;1{(0wuZJ;R|e&v5(!WcT-qbGya4_ z<;BAe!L7W*(>JK)bJq*BNKQ zrj0JPb~ZmkpZM33-7K;Lg<0_UlbWy|x_cUCT)wzbD(1aujlbo_Vveq?^ARK4;P`6JdYQ zquW@vTsJVN#L@1O%CB@J%E)|rgD>IzvEsDo;Z9SX5H7{T^ULhEw?71Zd~T)N2%ko@ zJ^HgvU_5W3nO8j`SHzu^vp@UFl;Kx2L-FXq;+L}WC*_3bcS)>Zmi#c;eRw|I@8!!A zXaooTX>(Kf=kH+l>2p=igHg-ilU6(`WD@!s61EUY`&)KtVMV@{my{ur-f7srUAxRj zoW~A{7P6=-ybO)X8E*)R@{>S|e>atd080n;HH~C4rK);TqB1{A@W|LjAgViZLeC#9 zf8NV>HP3aw)!2kK-0N+^#f6w=eYz-Gr)x7+$r`h6me91O3e&NV31L)O1%CW?`ZUT_ z=_S6JXnjTb$A6ubBZz)bUb~UE(8#x4A0H<0Q`ihI9V?3UM5OQqaGKyo7_1#PXAjE! z3v@)BpLLs;>o(g;vTk*~7`|O0?H(R;g%+Y=}&$tQNQ2{$vaqV(~U56LYX7K6YQ{O|s?u$Y}Ne_gEuV>}=2*KYyq}W|xL}AW;1{ zypr_a?kp!rscWuIuiHA}_+p!gd{q=0PiUQEwa%pc+ViE47i0G_!{#o;0^}^Jqs5jw zIcqG~pX}T;7b&eCHoSH;AoO$MdX&y}w7)1=k#@Uvy5~JUzHQ-5M7)CY`Zo~%W znlg>Ikv0#iD2~@<)m`t3;w`lXP=2X0e)ojqEm|cDf{G>KOp?s{E1%Q&aUxB7EC$3*g_BX4-kx*BEeAs!Jv zIy*Jyn%+_V-&&L#!PT3v`)1*lezewpC-ZL?DYXaX`Df;1em=c7_U0Do_ZG`oWfktcA-TVr;Vn3Hd`4OL zJ&~G5GF0>K_p3RA4y-uNA8E*!WM!n^es3MT#%<#GcgRHSQKRb4Eh7?=KO%FoSvSG; zd?MG~<>Gs=Ud-_9{jNU-%JJys8w^0W# zuR{n&4CMo>fE`Ty0$o zMW5voZiua8)K6@q77!gtx!V=o6ANM43W$NV{g*X$$I1QQ!(o?K+T~BsFoteT)#<-p zZ1!)Tp}U!;{P`)9yZJh+*yJYq_HX95V|LjMk5;coO2H`MRr-Mm zOKrZnBLbi7i@uz!nW%nhJg(~$9fSp?TXyehd$(A9U%yOUzFZ$$m?Z0$0%uc6NlCk< zR(^_jjCkeHOI>_3oKnp^HABM%71{?6E>6k=_+-e?oob^XoFDiXT;D`V!JI>TqdN8%{{ z&LbB{eZ}afTq~H7JpHjPe9tkLUgA`7j@`RZCbAku5}`Q43p4W$bku@ltzAZBzo9Q& z;*dz+80G&hr?V?LWK4&Rksi%({)~$DHL{xBIACFyi zBi|uLdhlRpN+IEc{|$w|zm?O$(b3;k;||00r_h478Bb>9GHyv{m5EapyPO$bs`h+sv z`mL?91Kt09OMX!Xt$+CPG{mb)&y1FcPZTVFCB1l5j4}N(iAWcd;dv5;PZ0MVy3Y?! z<S5xb~s8ZkaRn6An(FuffnD+}PhA`0!$m{Z=>1OZwudEkMp> zeqdB}qU`8Td2Zs%Pnr0yn_4nXAE zrMsNu>7ox2{_sHE^CEgpx+n`l0i#Qe;MV0)_)UM&pstA zd_Ck%n%8Y?LXo>>iViJQOXDEs+3BIZsxnX!r=H=USHD$MJrLqzm7p$?AVW&W4@>qf z{HZY_h1B)?70ruHfubD)T9(Slj!^Si{sn#tck2lGHgg+R-}?$%(tQ5RjTef?y9)^q zyn`I$oRQln6fX0%e?^9wl`ZgXXESXdTN3j0%0#~K+~0T3yTf3=ST9wf|5N&5y*>MM zNeb&5N2k>>Ga*MdEoG%QJ}6>smZQnXVG0LJ_0FEJY23*l|JlPNVi}pLtI+RFpsx2< zER?TL_b$_{@0dJVn=Bm%ZTA0;HdX)acIP}Uex0{iLM}YdU4|ptwq4lclnvW-R4Vju z8=f)Cf<(J^cJbqfj5#Li`jp=Ezv|kQ3=-59ESb*|ay={9>uq`-jD+^?5c=J`!tVI& z--hbz>r8JYHLf}GHM>7pYq{)y-_qh~WCzu`y4Co!|H!rzPjRs6$bXHquRe^l-Opy& z?l`}1`1z$%SlY;ZC;zeIusvNh70T~rRF8usLKBoPB1AWSrwtCm3Xus``PvahcjI(DJ0*Tx(3bY*7>6l)#Rg+@&aEmg*>+ezog>SASzUH-=>i6-Yi zS^2UYfqmRQyUS+QCCMtBt;jkYUlaY0TntNqw*FRRi;pWpH6~Fgsy^b zCbqIz>M)I7nw02!vA%Ahe7N^F_stPGkhCMl&|oMFNH>o=d{QSWew1u;7*u_v&$Gt3 z+Di=mFP3gK2M#~^0U5e9qE2-wywt#dqhn9LXa;WfpwHFZULRsDMpWZ5cxkc|2Lxik@S ze7E6dp|pw~@+2;Uw9&q}ceyi1FYhkWeU2wRJSuo|hE3@+gA_f|wwfO^cxey4?-HLA zW=;SG4M7eH#lU4yNuY{u?p<6YkCgN^Ox{UGn-aq~S5b6b>q8%kBUb=MBb(lPVqgTo z{zxNaR-1hHm=PxFLn0$FVal6{p;Q}GK?ES1Qq7R2_F;2UW!ii7Xyh_@JLv_c1c$@p zzEA$QOtIIm*2BE#b47jVSaY1_dBzfjyujWMb#V%TvF{bNvYnWmAb-r;+fh(67ZM%1* z^;q&Wg*7&Qsj1KpEflBX!ne*h89F7&EdPX|><)+tV$uvF$iSfUH!X3&&^rtll2g48KMr}( z77&wZ)zb|*xZU>cgeWcpZ-isZw6-NWpSjI8Z)%FxDwb{R^@dK_eF|FBDSt9k349mf z=SBl~@yh+RQ^gm7f9!@RahO)D>5($4r?fk?=|8l#7wZF~WgQ*tK9)LPW%N# zze32fN-M4JUL|cM>&w#f*Y~hKtu5%;32Lb%5o-GQ{bJQEefzQ%)G2OW)v`?vE(@(w zvO{sI`b~7`N4xi7?F|mIN=ZxGvg^Ek2!1S7R2rcyxL7!NikB+MgR#&j|HM7%HB}^4 zV?9>NEd)&2(MLeWED5-p%N2i-{Cfj8j+~M8_CD6MfcF7p*UuN)zKp;ieh-{PE=>b_ z{B6+ORk}lJlkn{GaGzAj&L>ReJ`yCqLx%N8msa^**42 zfw~_6sFw6UCkX9D8tG;8yNR?PYp@=R=>A25u#ZyXAd&Kz^i=ukHeN-AJVvUgy7Q?e1XC=X2Gp9yWpkHpZF2S^iS_l<^LU|HMR|pZk`EI}zGw zBCA$`uLpNCRa{aV@SjNa z;s}tE%QM;iI`iRM9xr=u)V5@tZ{SPuxG_(WVCk?cGXi*!QN;n~VQ6DXZy&+Yki3)t zbeW_1TrrcWJyqt5L2gYpZTSl8$xMELam`j*R{k_cLUh}fKX_T=PflLZ`4* zTZ8#Vgu~9pMnAAN04%Chq64`QkNc00O2D|Aa%ckI7jSR-2x=Q?S7pVjsPohl`peJP z7bnFH+Vw8MvIH_R|IQh8Z8UpbSCEtt9a0Ols@U}P&oLeo+qrh#X!aq*d*(<$H$kp4 zZtgi;e;RoCCO^2kfCQN!1nu}pEY7gX=Eq|q1U(QyDf;s}39-<{n{0IpaCD@pw+L69 zeIJv>@DL+c6#3vl{Lkf*j~`6|To`IO1F*+;Bx-r@`7$Jysvqm<1=EQUAZ6E4#2Lrq zT>H^A*p3g)&FR}$Aho{OBSFPH>;Lj4R=;W{j@G3>hZ!N5tbF|p|M^@`9JzS4StOt{ z1YwIzm*^_L-T5(=k;-9|nvG9eKWF!3AYxM!vniXX&BH^CFEP%Br@W~-6uF=&htk&T zaL710D(F!-fOrZjjN*aPeQw$&f3VcH`YVMg8qSjS?d?dotzjr1(QyW^n3b-8yC6a# zuWf2ls+m6lGLp9#Ih0hDp*aqeY8>Ec518{EZH^Klwg>=1flG+lGc}b2-&d#30yZR% z24Hw#cxMf6FBn%3Iy!+xg!qGbcU9Fd);xR*y)apGUzl5Vb@y5~8hXC-caPo|r%V^` zi>#n(=x26Xjwj&fC5$4MoLB_=1EI?R%&VErKaIgYhkyIbze^@DNi%~-(Z=xl-!&Nt z_$Q@=ci*Z4+&@+1ZsHF+zcWwU)vg24hXqJro z4a4#x7j(wio3B z7je&OU}9DRTFV=#+x@Un;fz8@g1x{B)I7Lqpy1sPX9B;n_#xsA0p0duJ(f3-DSG%d zEfC14nN%6z@`8e4D2V1Bcly2H(0d>DNQk<3zQ)Ys_Fn+t77(^-qN175jRkZB9KQiA zyh1{M@=SD7rKV2gHpenv1J^J`CMXatl=#q4RNv!GdZ@Mc-J>TMkOL%vp2L$hyNvM+XwXVOb>P6`d}&$gFiq~(CW(h`Q>y&LiBI$N5sU(0wIP+9at$M z&&6IWkAVCiBz7ET{z)CrbU_IMZ_(n<&OKsYXRA3bZ1hw#v^%xlym3_JjC|VTl~20` zU{>7f3T1O|Z>;ulzo_31TQ&;?jsor^7C+K`CfxZ~7X?q>(;J+bXuOf6{yP$uHkt?e zo}({XDF7}IotO~!J52^jL%oe2NQdd%OuD!vNc1ZwfB#{JPJYhgVr5;?W{s6Q2;4JE z9ObZ0ank0!XGN06!OafBUxNN+LGzAfXW^|Y9}$wRm`V5G2l-D&u*sr}v7d9@^RMz$SW}5DifQg7*P4QSHF> zphmnJvo8O`z^{voomarLeYU^9KLYyP7%~Gaw7Ku_q=g)p2o%gvOD|XmZtu7?Pz(JM z#<}pr^04{*7$J{PRTaj=NW>(ip`p>Z_>CEIfH~DE66YCc4BaTVD^4{ znbsn^D$|?Oyit5cJ{-dWojUV1c^DzEI~7+@Q24)W!0*fNBkz*(9Ki?zlKa*tPzzp+ zW(#w|RR&!<*TWSlP#OGn{((BuMti(9t`7XrakAkC0YwiHmw zXXmhg;Yj$1K`V?-xB+;Q;$8<)byfHJ1yG}gufJ3xy>JnhdiiJb^I*`O;kR_-N$;s} z9zRST0NF;Ch&AEgkb^HnBOhv0hdDCpWkf5jzfZ|Yy+YRxbA>}wA3B+ z=39%)2`K6CsqkT|y|tSv@&{lO=zh0M*MGw3adw^{lQdj_>V}4f9TQQozlyZNu~fq7 znh?`h*)0wUPoBzm8@)c-SMEpBz$onj4dex&zmlsiU&)$3(kTh0zoVLL2)yBL-b>uW zl&;i~vf}Po#lK$@rBZ(E5i#-dECtJ)^?$T9V!+`5#mVOf3K1YyzF+d_$`N8BP?Q6_ z_b2eRlf++m;?VL;6@^E6KC&l^uYJM!DZlE+&SR-Gjx@`eci2G7kXF+8I4}%IT{v*e z7vEc(h`+?9#H3^pSC%F1QMKPgV~-#(m$EZ>KJ{iMWtm4}S=_VO_H#Z+XrI~dRSv-e zdI~;Sa8hmVKb5JsnwoAbPfF*G7qVxtN=5tV_KV{BFRkP9`yc0SsN#9)7`VG%-s?%g zhgO**K6j;vS4KERz(*y+y|xl4ArERrewq2w{q&^I4=0w zlxAwg$qfi7x?%0SpFL)=RHl)6sSF1{jNJ=@qnDbOyY=70)ol=p9a15@Xc2)T0FU5U zgQ=?iiHU?3msLV4Du6qB!;uLo4SJK&&Etv4cVS;1CtyNuu9m^$l%|)E?xm=xrEgkm zE+=43m_ib=*$+99-Ex<(9B)XXzAD{j4n0|8Uemh{J+91_SAjQ|>`qCt1!U!4dkOM@ zioCH_7bio?yM7UC@PxCpG~hmJ-g8+V`jsq))(e8>{0Q8xpQ2u3xe(?|wI3pZ?oX-O zq+FeI4}d%1s1iAzbK5_msqn3tu+vYDBi}>)J{nrj*QQ$kHry5$^_d#8*D%4$oP)M8 zN9R!Qxwvb+)a6B)6C$E0lz?PVfE~pZAA)~`+N>a6ok-qRvAscyJt08)R-1BqxKMsN(|-MGmf)^S+^4# zG++{x%7rQ;M$3R6l_cizk@g|D(DC^knKwHw%8RANoWfj$Lc!5V8~UGV2Qds$VzwR- zU4tp$7h8$w59cuhNu1j76QGl zTSr0^Oep%-8uic3iA>BAoSmH!vuV>U{vafN`wYY?a;yIWp0;>Vzpv)d@X$yk@pzN{ z>V5%bVLyF4YR+Vv{)mQ?IK2rmOB3<`ObA3L`k6!5? z=+8>*HCRNwDZO$-Ps=<_I=KIP!;0zj&ASLjwm_F7G0Usf?sv)omuRKoZ+!2=2c zr=VG{_driTf5}W=15^sP!8c#{a9I_T*vfDsq; zbl`pVn)l4kf-4rO7aTRLn)z>K_`r(vML5Y|JdGhn+`Pk-)o35D$M!T7KJdFN`N%}w z*3mfiE6rh~8APAS@EJD_4m1JFqZ`(61S=hJY5?oY4Q4mML1X}a;tO|l`ys^2RMgb= zlLg2ie`eM#)mZxQA{NGR++@=2exmgd*Sy`zcpL<%Mw!k8&Lg!vkm*#W4ID1A?Naqn~P zx_YFzdZ4apYZ*=Cr!glsJ2k9*%EA(`(a_2f`L(msi3x>G^_0(c8W8a>w0W?8^L8Ho zGL~ZS`B~w3_282)VTB3E4#;W9Pyo8arAFsUEQ%wd;uwV$CtEzLUGBha6fhfOGoD@I zaKWe!j&Xg#sFSyXQ4AlZ8zshI;iczc1E*&L z>Oh$Jl2ewJ#e<7&3_LvXu5NCHaCEW@1p7IX#Vdn`xi^knP&Dvblq2m9NIOZ*{N-TY z13_W{A>mfWo1oISM&n$nMM=}j#!<^XY|qh;9Rr>B({?Xz1lAsA zWf9R9q)lHc40!Jlvk|x~&bjiz?@6GQnSjYBM1=wr3qwOg5pcn%rE{qQ3(M8pJ1FDf zl9d3$7HTMgtQRVHKW+K=NJgl;RoO|f#Uh8a#HqdGlrf;Xmr|w??agoj=_5jQ2XxL_ z0B^zd4cR4J%lQzEFmoi;6Cwf*#A4hWxrdmc{rfj)+f%z@7EYyCaEt1e>o5cI$kpAw z&rS%2aN_Z$5lJ{KV7Q}^6M0OlP6%P+@b37*l6yq^Hc)?F$yeJiW^^rN$ z3+-Z_Ck7@KNR>Y@+()rvvFCH-|8BCJ)lG84yz&$+#O|#1{(4>4 z&lb)7e=Puy8DoGr?rco?yQfdIPA#-M$*hQYcT^{u2t?g*6U;&_gGJ7lqkELgiuK1S zgdC>hAn$$L<$v*{TZf*$Bj73>03x+O0tb?fhPE~v`ke*s?yj)d*l54go;YtMITVl; z;L(JkVm{gbR<^OyiA6=_4#Sz0OG`_zfbNB!iozI7u1ruq%r&?k9m(NQOAVwZKMCYTsj%+of(T6$uFz?6KE=^SD^7MD9*{t*T3?$9>z~`Eso)qb3;ij)=Oh zLxM%nH#{5(ByMn2A1~KkfqEZtmA+EBjz}surCggk3+R;UtqZm32~2HwStY5iZ`P(u z-o1{vODeR~P8zIMQluCyFDfzrRxRzlsD#AE=B6TW2vSA9txLWp1|iee&Ad%z329Tg4|pnDZ4b721Px1^@Vsyobpn;x9xQpHdNwRS}TFJ z|545xRyYX01#CV=<>XMp?aN#F0VIyH;Vj>RRXhPx(V*Rw0ZfO`ECgo2c@v$V#~@3hC3u&nGX65*o4Eg6$V*CzJ$-`E0v6O zVueKAl@uJvzN&Z?WrtJXe8Wkt&`z*VDV+j@5C1I_!GNqNnZ+9HA0IzIcTkphyry0I z*hKm6i8e``)h$U_4P4GdJ+^Sba2P5+H3)RX+T+=aZ(X(mKb=@QNs|*%n2-r$gi4~g zqV8azF`enj%{RwX%NX=xRJUHKxr-koG4w#xLXh|7Ld`h(fF94fF%L2P-`KrIkP=r-L}HR$V1MG z#j!6UUN)!3>9MFFMrHH!4ZR)Nc_m3lDvF(~fi03HLYA7IGW$vz8HZXZwNO<7@=7Kk zRrXarP2yAsQz=Y5DmpNWPGNoRalFZ|rk;k>+By;y+dwZ3>Aqo9T-ZA{pno{`Tpr_U z!ELbqt^i3hFQk$Sn^kj!jZ4U!FSD*81<-oX@eC#7qss?$4Db`3ea7M-%Q*%^iBJ&w zW2ZADBqV&w7LJ7w@cWP1Wl28>2N0xt*mWm>SpE%B%>F`K3YxKT{@h+$&hu{PX%v6d z4&D^EPv+)*;}1?g7AXN+dbeY~aMl5Vu6h%2MlRufFfc!#fiTvCi~%eezWr#<;NUZi zU3wFE$qs0(g|A~706^ZEt`z-U{og=q^YtcIqf5CI1a>VrCZddyZ5t?lh!x`S?ciWJ=4 z>*+pF;9!77VVH9ykRc1Ndb9tUKYy<7>gw83`x6QQW(`@SlX_8XfYY`$Y=V0NVi4OV zo0zDm)*Tblq`lW*Ui0twfsEnFDMehfGEO;0>?GgYmX>{ncW84VzgU}hw0@GionYk$ zUHXC+$8Y%nQ%SK}sHn#^e`bFE1enhC-iOc5Z1&ejriz7H8Z8;q2*}M<gF8T8c&h#IkM__T#l%(@85qxh2v{9$pX;7^8g1)x^nDcwa( zT?*hO!7=8NPVr65=ZMeAiCR=_F)@>knO*hs_g(^8e185Tl{cO>vqm9Vuc;fb?nL4( zy8U^Vbmql4F@eX#iVsFRtgi3~1sxaoetY<#PyO^nAV|RX84uvIU7rFrZGKEo*+kFHL3la<@7sR}MeflfT!@Lb!7hRq;hS*S zbyaO13eMW2?S~!x0KJdRTm0mi65VDaXxZwOdyUh>+v5-&cB@vh!vq5(lo7=#M3f?q zt#3!g0F{bBO@WPFE--!(ObyWGv;k%tB99Mj!TS-k1QVZ12a1yd7AF0gAd;5_;^WE(|x3H`KdvNQ4ZOG!9i0}eNUq*k`f)?xr8V% zLS4I%|9nA^*Uku`*gw8*tspcCN=k(D^Vq-6xa4cX{k~t5rdhdwmJItwHCETi145Fq&EeL?FS1IwmCziLTb9|d-k z!MWmndhXQKB@xg# ztC-~GFBlTl)e%tR78V}mEdRm{Uc{N5)z(4r^-WAc6%*5`Z*XGgnS*=J&9#=1zK~W` z^+6IaqIGl#>+0$(p1bl|isZ0!b2C49U?3VTk?(=;SHBCdikO%fD+3)}44i+oA3p{lq1aMGO9mmamAZLB^rW_woE*s- zJ<|Y#^!Y__25D4$#I}|t+MaD4hV^k zi(?k3=SAR>m6ZV?AO}Tv+GcHCZS9`be`gQChn8(2Q&dzG;m@}cc=fB{>oC}O^Mj2d zC?CLo>0dweY$kl#FE9NNC_;U>U?LN!6?jtkr>rbuMhCbJ19hrd(hO~yT+-DRS<;F` z$R28HFr5}gBFrEb7Z(xp-4Nk}Z;Iz=VH3c^|NQany4>aLx;ZljxkRyYJeXZAf`QN% zzMOXNu-u7(=%<_8-CCx3%ywiwqodIh2d$yt!W{`N4yPSX%+RwL{h}rF2u!%Z`cV|R zEaJ}%G<9`}R)cP(?4Qpga`Q$%sheN>WHn#-@yPCUQs6D)Q4KN>|4JNPuoRg3Par8Z zQ5JR*gmMVzKf>7=0Pa~8&8A?w0$;w)VU`1qqG-Sa1NCiYW+t}Y`hz~`Gl&tGF{t8! z!xzF97~%Q{hKrzIfZdyvm&YB2hp=_2uEyJOsI$6Ho~ihdAxpPy;Z6tiRjHWYmNaJX|*;Cw{* ze89NuiaI4HgZnSWJ2)9xrKKz|Bn;Bvr`(+1YszF-Lz6(9d=YE19#-^smGP(#GPRs}atun%Hj-6r$( zRf6cRN5}jQZWFW6%tO0(!HERw!K2^430zES6w5H z;>MYXdI2eF>U2~SOiT#?$-#CiGwc2b##{uXq$*FIq@F+RoOoALQ`Xv=32v^yz5^qv z(t_4kA;~Bl>Ks$vJK^8HihiTJoA}?Ea54U*<(Z)I0H#Y1YHUWxsSa}M>5$+D*+yB$ zf=eeMuMd?N?`8G5`%6D!=r&;o+#J?KDsuEn^yD1Xx?V>7WtNmQA%g)`U_nH$f2EB} zNWl9zHdg*W-h0OvclIAYl%70cv$wO`b*Htpr3ASv3`_hz762$SWNF8gYX{EccLoo~ z=G>&bCxjn_Dx*3y{ir{&v#Y(vn4MQ}s*1~|pxoUXpP40}+zaBZAF&cSzwm|9g}k=5 zsGMAHH#g=zVq!(0Y(TAf-n928B8o?#{w~1SQV#A9bFnip4wgX}#)H4Jd2;xSC#9r!9BeSnhUc_bP(^fpC>gN$zTRs9u+u=ukQVO4JE-j;R@2pMlvD$E@ zaC!uDeSf9c_srP%;|uY9D}kXnios2Z19Q+6fRTY`n+sUmLFTDcJcTGFK+MbI_MFSp z)AI-}@WTh{dAN2>PH|-Xxj>heo2k`#_G|(iD#n1536>1VTjsyd*eGrZhck@lZe*LNj6liFHY**-2ynF6A07!ld+hMxU;9eG@DcMbz z4R__s-MXD~bXjSV$7{8D)Qf&n7!Bk>yu3rJUX&X{uK^C>X8LSQ3!Di+uaN@yQZT*o z({r+{>iq^6uK&&HypWI(pMUEQsW)(pNlVY$zHOee`&o)`^IiZN+Qh^J!mxChHYgXC z9Z!oMM;Z*iwZad9X#IGxw~!O_FsxmhDMY3v8$ zc@fcqy}GMcS0E~bgt)k!ogJJ2=AGclV&X$xu{hc|hXzoFPZ zAu!`KSsLnLDcjGhp&tGNN1)0kLa zZ;|@Z$jG?K^k8G(F|?%x2Or?wOwjy2IR6Rg=>e zZBNPzN(Lj+N!Y8ZbSNkbt0!ciKcD|x3CBJ%vNRfIR4?R%b>FJU64+sb+60ReX+mwe0unayHIE?S^ z?Uh$l6ay|D%$#<2ci|K){O}EM6$I|fK43UAQPGnMZmeKpA7R3?4HrDPT{*Yy{DR%M232B2eKO$X znXBtmk6AH{EBvZFyAi6rw2v7I=I*i7w6Yj^7=4dt|W+(8V~s&4Ct z=YBqkLRMJ)DhUX0dkbjLY;y^T2n+MSJaY`Z{K+bPwJ!)8D`4vLDF78`!3f&Pdh63I z!rITs$Ot^E20#)7_Kg3{wa6Ft%${of`FTPn;f2%v{j=Zm=bX1-AdJ9<(L*T^EL}j~ zbCKM9gK%#F_asYbBaB!HAd<7SP)srR??@$jdSpR4*1sT^ef1=!ruS9LR1|5tFP09M z%-=kGvvI=}^;b4rc%i2{>@Nh!X9=-?h*L+bO1G@Ii~YvN#-R~^!lw3yhcIsfVr@i# z1?v(V7T4;n`Ao3pimsu%1?KgrzkdBfct|1)O(2pQo{iLkpu*gPuIt1E5_ zDF&}mDAdgBnwe=SD4?F6p7vpXFsf26o|=UF!`PT|e0*H!LAl*?r^2Qt=)pePZjmdt zKbUs+5y!(j6BYkg{pl-o-8VPG;P3yR@k>b$%) zCoAM{H1+iEgHPOd1WOB*+w6z=)9nkkMW>oRZAaQJWv@KoSnsOTcU)n(tkcaJ^+LWZ)th3va$kZ zGzeoQ)AO7d6Jy}xfrb|H!FNyI^8jIb9DW1znyad+8XFr6zWjWrJ3m$JR94j)Us_tq z^Ts}9O3_32AtXscDpEAa6qTtWr2&$>*d z0}fTZf4>{LhEqn-QO?s{tTR<76!ELfZE?Q-%!K|ud-iPF)>_vJ2Vl>VlmWee_;`EQ z7fh0CV6@GNALA~bKfn8K-%Wpqzyfo`9x>YkKVm8QSlSGgEy`299?`4oE(r@=-4;K;`fop!Wt?@Hp)59bvmh;RvfDn?C<^#@Vx4_}vRygQ z`R1xfy(67E3}xY*ESuDCu>~*CVVgwx`}Yr?#m*%wy?x!&Ou$r6JZC`uStmPqdX=<^+i+HVlhBaAR2^SNbR6Y3-0c`z0kQ_)gB#8hST*%m=<65mEo@cf0ltUmCla-X6E5S-wY)=}VTpncOj6 zSxIRfOQq)6+CBn55t2UkPge>x*|cd4)*Kgps+e*YKJyOs8#`Cu?xl`;^CNcDC6^82 zqljtX-WxX(11##<`*u7uGGSIs6<%o*uVOf>(P&s;g=^QYu>oxwW3SbWOs7sgu^{ut z>C=%2MYE=MO+EYnAPw)}rpfc}h2Xkz6 znS|u^vgGAs&l>+<)1&7sE*)BTXtB<~f>HAJy7r8B3b@oDcKm2)>F*KaDfmYYb z9zEJaj|w8%7ug4&hDSUShzX3?lWQ*`8J3YP{SAKa7Mt)IQ19kgS$R$OyT=~gEOyUk z+HNS#Vc@Cm=$4HvpeGm@UAgkzLHcW3a-!JiBenn&f<(#6%Nn4s-!1l8TZ?>!mQQQu zhEXbyUa#Jz@7Q~DEsS#@JK18@1>)=T(#w@E*el9h%eQ!S#B#yVw3|0Rr^+Jr!X~Z1 z|G~(f=;B?zy`#XWYtkC-jC3r0TwHvQNnT=fsF?k`?)ov@ulw1whrpPS+in93rNuXA zr}$~AN9;tGXeMC<;D(7GhN*O-OqBMURIRsyFhtd%bM0xAzSiLx_cqiV`)0X#amb5R zckr~_yLV5g;)(F@tu{HU+ue1Psl|19)+hdR_^_j1%j$0qNlT3u>6kLVu6U!j5}!4j z?3l}T)Qm$G<6e|RtiLZ-46zHe&!|zOSfe@vD7Yp z%Tw0ENw>GK$PfPPr+9ts{oLHD#{BWsfcSpe+Htwnk6;^k)?$UAeBZuXGe77I9$X>z znp1;_nG9*HgaeMKq<;TedUbI^+4NEdAH1tP`#)S5C9ASVn%sJa7O6 zhVyajhi8q|wK2=Y`oFKs8|Jdf<5S9-)8|*}o12#`U%B!WYoKR_4-eqWN8(DCO71oz z`XHJ50P*P{<9Ea95;(!cNHd=@D=@DL)0U=BpDuPThDIAUu})1IXk~SA@x~s>^)169 z9udvPaE!J&L$QmCUNrOaH4?c9V1nCNmfx33gfrH2@ZiBAy+>b38CBakc z4jnp_O{E}4-C-`cUb9*)-7cSDFR4LYu;NaQc}o0#8U54|`~aV1SMQANjh$QkHrxqk z1&Dsbf93|IKAe?5?)pu8rf9O*W8S=ZmIQ*08%J{{_&?p z_WhMT`lzT38uIJsPxV9heHy~QbrFPYa>?o{Xxb{)+rIzw==!R8EImd4VR@O@H$fA^ z=TGKc6>2?Aw@-X?6tH_#+0J{rczEE)0NO0-{jy*FJuWOXzq@cA=tptLI2l=4zJC-# zcSO>D91wPPcEvAVsE6hrnAY#w_3Mt#&N~tl8+*9v7?t?;=+pr&6pTGJ?)j5v&xnH^ z7se--{2uasl1%2h$4{SjYkmFEfi^Jz#q4aG0Oq}D7To#3ab5;1!02b{N#q%;u;;BPE+^`f&d_c(PH}Tn7yrqz0`?2+>=X*PAV3KAReK zr0_v7CCr=6yFY(cpQwe45bQZy-mVXEIy~RQ(4)pu`7tB9Pg@R}Hfxp(CyS+l>@y6x zb*pvq_*twlRDP`fcdb(Ims@2AUg@x4(d3S*Vh_T1~Bdr%~Z(tT(WZPEXEE#|!lCij97+d(-~s z1^8mCZG9u0_l2Xdw10KmT|tZMg4*r4H}WnPu<-HQ*y+?)-1%xYM>b_YI>wAueqFbO zFGSKgDId0>^0qWZSX=)Wy9DQIYDy&0@t0XNi5{Eu8^ww%lNNIJVnNF1&(DyWln@_3 zIdSA_Bud-Zv zsB+?zi{=!4#V|P{laOf;;AFD?LDJg|$}U#C_r@4V#B^GBYP$B~Xc9wWgpnjAiU4oFuOZ;@y9L30#Gc9-N#`$!jpiZ9wtfW3x!j zFzAF;PwC(xLx*;EDSJUlQdOnt(M{O#sR(%0n3u6Q$h7l4eY$FN{4&P01JRG{FL`aE zJhJB=heu}~FHf}|75jYUvy~&c;Q;mHo}~y|gt;ioK@z!sn1^7Yg7)njsHOG(;G{pM zd9!$2AR%>Q<4Bwfr{-w|=qT+n^$QJErW=Oa#A4e_E^!DZ3c_0@(B#IOF6~{5vexGt zPxbaT#Mx$8^|9r{VZq(++}UCH@ZmZeZ7FrcGAY3Xigf_=_8A!&VH0GfL#KEvGcPX# zsseFVAP3nOo4oqhA+zo(jJL{y4tRtk{V%8dDX9qd`0qS(_DMi_kj}2L^-nDI#C&vP zP(y9_vf~vj?RBB$q*E`0kA8LA3}7Nv2xoMgT)*%k-STKe#B~srSQ7*88N+ngBtHs( zBKvJiF+*Iiy>SE-FWxl#KBu`(a_NPy2GP;cV!fbPP>!KmVEjpP#vYT?e?~+^jQ08% zR`B)`*_GXxZEBvz$Z^W#O#@lemHVZnXmoW{Vw3yXV}W^Qn4;CY)Gyjl|o|cu(Vu>~o zf?a6`jvbrn-IX8n6ivYFL}FDmxjijls!8^Vd71-B_^TcS~>Q}vdws%s|^M#K= z>dwl&`B^r4y-s$v-1vt?WA8`Xk{cP4%SgbPiED@jCB-W02eCP3CzW&87UT#FRdwv3VnWbM!XfPQ;UZ#Y5saF@adSo zXr?zjEOvX`U1czr^|Nebb;w>~tD~)bnk~uDzT8LuUvLe_hRJHsq%VwllO`oh>vF&< zZfTakG)umPGvfG$oB4Y(mYvulqTLYYNog<)0AK0ZmK# ziFkKlyafH3I93}?4(DeM8$E}sm7ue^#co9xjbeP|6N;6H@e`_LiT-p{G6`tSJP}RfG z-62$zCK0F(jeJtOVQtm4w03vw>+O5%_op=rmi$)EhB{~hdCr_SPmyCMA}|mn$|?@< z%ENbbxtf&t@$1qZnG@Ep*LSEjtm(blH998bxIPHoztND#dS=dGk_j0|qS&qocgG;Yf9>Q)>r^t*BVRn4x>>`t|UL)v2PmCJ~#gU*9-7`^1ek z`9EblIp6tMUh_ES@yf=HA1~k4*;r|b9L~B~!u$@FkXYK-?1J@#u+fL19;lWy{*z#vh)txAzP4 z3pb9H6kN~E?5PuZ=+Gor*EqGYSY9nuhyeo)43wr$y_Zo3V zPnSBE?6q}9^qi<{{Xv7K)oi}Ba}Iqk<<->#H-{eI+Pq?1bB!h;^8rMkPveU3S|WaM z*~Bi?wN+DQ59;vR*d;*1;v%@ndX8`d6sTBJ zO({TuRsr(qPZRC29|>`B&X10c6u=0xGfuo*`h>#AZXC{4SCS0KrN38*?J%&MV98Bq zaf@Ugk4;LNe`&eVA+@zeoRipjyZ7wr45dk}8XrHj>n_u#k{Q*vzWHoX?lovfrtjnB zABSJC>1j-05iy%~iU1S!H>##U&R0G$m z_KwlHF*!KX!2zGSKuf3?S3u>gch>pfyf_XLk&0A>OiuAv2`a!fDhRBZ12i!dDQHfS zI^_qRz4fPA`#%L(+?~u+;GZr_)NKp5`7||RzsgTFuGZ8ORt7R4&oH^XZaiC!{-_dE zLaW}&gVh9=g}FF!%P%jGZ^6nW;&OdPd%1epnq7>0mJRsIz}y7ggtRX*7GoPsLqBk@ zg-CGr>`sBLknPT&?|P(H&z`A49abhahxD0WShuXY;{R$71Tq}=sY@#0*JTT5i%w(K z+KVMLa9J%!Q|e&mNkT{uFgt{Cs=FMjt9*jc1S|nE0e%D^RGeU#4{V?KLMS7buU@Tm zB;IDc6{MBK<;=TxJHpCL^cMQv-Mdre`?YJ=PAAy-DP)jfhu~G(3kn0iT;0g1Iqh@F zt5-udi@(SJwc-a?2`Ssb$|lR!-aFdfa^AdtONM!Rc$Cw@NI^bq*f1n>oFcDvB%kW< zn&n$?*eNG3Z)Yh{0yL0#M-Cy~9h!5#ACfRHO^m41J&Y^N%FxXLa-f=a2Y~SAJln)W`q*VB& zfhQJtY=nUbtlQjuw9S8od{-Wu$N(fHde?7=>`TZO7r|K9RXK9jU1Ippmd5-Ssh--H zcZIo0RJLqe2|9kKNQLUYrgzQaRrBJWlSTy`hUF#H2nPG*%bJ>+j3vVm0khgpMk9=u%_6_J&nFQ=-iiogpH&F_EWD?N&0=de)s;C0>H z+$d{8o;{m~>)!LR{*McjCtq3;Xf112_#z)8S=#rPuHfQ>P`r@p5@yPz>M5rc3YSLq z?`#|F9vQqoQr6qbC~*G?*$=-wb$qUbjqXL1#EAQ(uyDXb>osm}-R)EvEx;M0U&2%; zR5lrn`11$@gE_NjPlUz8I2d3u5duaS*@#Krofa%uP?7kirY6W#gVk<(c&JAK=wkn5 zeN)vw*?%eJcIUD@f3lU8vyY2L$H@qK~CvP*w&NlU-GxS?_U>BsjFA>dNf ze!N;QC$>|A1g7;nsMDtpVKu$HZsOFbfdy^n@j(E4x;L9NC}n`Gf|BK5pvjjSNn=9v zuZtpY;0iAF-=V)JPopZw!63rsn!CC%!ocY|(id0c8Djx_6b?(+eTola#kA?u)klsz zjMCz9{Zs7=V+hNvE1oA-b>9q`a%0QX($Z4oZPD;YSpqiQpZgY(M5@PR>Y{h=TpV97 zEse4MF~0D(HR&6~ay2Cdv2M>|9p&%Fg|oW&QdsJ{NR^(WqgU2zY~k+%#2g%C;v%<8 znibQ{wB^p7DMSETLZ(H}A@4}b$x)Z@E-tnP-cOq`Bh_)J+9uh^SySP?)eHsCEFLz7 z$R)$W)uve2uFCN^Yx$lW((B6JLlF_V(5Acj8B~8C2D}LldbL~-6Q1VFO8OCWlyvPL zB9^qe%Uu6kEPk5=&SEl>5U(}Ik3Ye@i$-{By{#=xjYntud@LSjb-_B5GT9t}EOZD; zf9IE1SBzTH#dlhr)6j!9y76pV>SJ^peYy#{@A2{xMDXEoe5X#IUhCzhB=fVd^5~4{ zt}@>X&En)8($m5!H(A_!yRO2!V4-_Q_x0<$-CR~^bG0BbFzwKxryDm8+K?PNTDh?D z#S4l*MI&b_2ZCdkgPy~hHM$S4aG>77&Z|Qo0WhX}?}37c;XQNmq%Te^3?!_J$;i&0 zR6Nx~$*p`tMUK`#i-YDrsxv%gY3LDd{u=#Y_H2bVRHPzZxQ4dt)vIG)pLBQ7CV)h&&;+LW2NY)rmkl2VD=s#U2E&xX=fRPowp zMWl2BgXxNwdL%z(E=^8OP5{;tv7wNfNLXP+EjHv~-_Q3~RxP~iptnCX^e)BQXhxdR z8TW>yHe%$+it_Rd3jgV|W-0C704lQGJw!MC>p?Zc)i1B^!b(4T?p)1>?~WrH@|&So z_fSL#h<^0wZZHSS%@5R<@wYsF{5Z4qPtn8ituG$jYK@=7L?V6|fX3fx4aFe!Iv1#m zs+Hr2l?QSo@|W8`4SyQY5eIpEQ_=Nl%O8yugsg?}H%0qxzenmX%Tp{|HauK7K+c@; z$8;$m2mN;U?%$^tIlJhHFNH01P!{)54Qiph+<_%p(p|dTDJoiUY1ATmy&!C^ohkaY z(jBMU=d{LI5Se1dF<TA~xXm+5S>-GW^8$ zu-lxt=R8TA5%(TE&=@!{FfDB?Lcn0|eR8r=;){@ZTGZ%0U}oUKd7y=bh5CO!Z``y= zcJvHn3GYpts_N==i&scWNJzEbDvZCYGmxKSGO(DgN?pUa(_Gg@9sEbCp1N?M6Kr+P z?)zHf5QkVLtra3hrtH{}@M6MSWJYR9QJ#jU`MB8_G5Y(o#aV`dvRsSuRl4{Ni;7 zv?rRG1zV~lDlLdFvN6t%-~Pl{x25)M<;`#2n=ew<_8QhhR zudW~BEPx!tj6AhOLMKR8kL=Yt=kbScLMCY81rH>4ch|NOfKanHNJbUBEHuJKyOvXU?39LG{*_mIcmDi6eJJ zUAXZ7`$o&4W>#yw56^2I(bHTxzlA)_NlN)J|F3a|8(vUcJZQ*?*gJiT(k5xx~@EeH1TCxA$h&pIoO3x9`sdML@vQjKX%NIYz_OvJ*qYct`isC_)z ziz8h+wD4AZ%4M03g(X0SL?#f6>ICLOcCnc`1k?{rs*KonEa{`KRBvP7VEkG@-UunXbTGD+SsvOM+L zH5JZnT%0zRW{#Rvq&;~6OuTaCO8*u`NC~2N=xYbWfDNVcb@Yryt^&0YLMdYzM*4+Wt1nuWm8vbz``<0QX@2%$sRJXv9Te&Mtwft zcP>jPLj)_rMgN1K-bf|zW5(?FCZIJK9O<06r?Q~jQ;Q5&%$f6KwCo6=dJC@`i{5q` zL>YxRoh=U+&QT;MG`T*V+tm2}x!akuH+SsF?n>6OPW8Z=F>`d4QJ&YI7^^tR8;A1r zpN=Vs14KS8E)D`ioH=7U=%K-g5tjD$x=k<4qUU`4^yzY9VmFuWz4lB2bEHbI=S$hT zXi_3}Q&jZdw@(hbiCjs~_^c^YI>7S_iI{EfR8*qtv3-Y58TtA9C>sw@+1Y*husMn5 zr8HoUNOaT~WIo?1r|}t1RIyTs0gVJtb4VXMHwbu!mn5yka*(32-Rqy*LVvBlFekPN zt?@sn$)QUYv{F`BY-^sI@X#nF?^1qVp3?3ZK{Cb8Yp3)f9x=et-m$yt@0ON}&B=B$ z$k)9`uQQeJ4Q+1*dS={^07$2V9^#WEYkvB%B^SKE^~>fm-^o(6`l;#YT+H2CLWqr? zGkD1+1PIT>cIPi%RJu73a3j&71BlrK9RV`N_D;?_C0n7Esu=r>AQp#&gxKl6!l*Dy zS>wX38wDd}D`%RRLY8;`-Fbf8b5T&z`B9HQq?>}m+MK>-re{XUOLjQWOX={89M^>O zJ3>bNVH$BeswMG<`$alaCbBoE?P4T zh=zkH(JZ<7`YW9IK#YMQqAO$l`WqhoVNScMs#1nTdJ842Fb+{BiHHUt zi7=LjKQ52z5=B%D*yK+((zmA1g3bs-Fjb8NcFs6@+tuS_%e{Fuuv&{<`l9SQ5XVZm780DrMtFI zx}8+}@kKuUyCOhMA2e%vzplq3BPDZt6R2rekB{#R2o9NY+VX1h?y2b$Nx8~vPu{$F z93pDsAVXWjOFAdE&Zwh4jfq(nx;9n5;E;nm8zkFc7^vr~2m>0UoTNG#yN&MuKQBNh zWRqHMoF1c#%gV-TX=^iztnceBKO*Jt9H-q!N{%E>*>G_GeziA8g&n3bE3P{QELGF} zd-uvIllp6F?%?t*8QufhOf0+*6#^8gjFNZy^kwSzd^VCrh^=iTGK;m0L<>ALw2tk0 z4k*}FXSBr9rAwjaIQJ85Y{K1-Rp4o$zeUZ^bn;{dhfU@EC8!SceS2NZ6@)V3=4^UY zLQC~RI*(F5cl_`dE3crIM=n83vchH{>vh5Chx?>4y!PDcPEWeih>!*7Hvbq zy(X*UQ~@&5C(`sWAxRxN*{$=PGTncn3^NLUy&zeU}nK9$RWXZ9R z)Hul|+1mEO*bGtmt!aa^b5)NWtH<2>Q+Q!_-nLB}H=^QfL@jSK&CIL{>w9XsTY8z0 z&avrLy3@B$xO<=t|&p(`A&$VIQ4yvn~%OPBka+&DlJ^5 zOO`E@je3q0CTtJ;_lu_Bzv%9kH0Tb<_^%M6>>udo*KUTH83VKFT1Vv3lv3g2i-;=_ zc+y1^g6ftZrFQ|V(=99p4ja~Re(dMNx3&I|j%UxAW3pmJ?Ebd17cQK^|8Va;`0xzo z-zg8d%Jd3KM9r~dk0Ao1apr#*Wgl;)zqZnp<1Kg#+9uPUSj;tjb6!yA+ob3PX3&Gu z%lDx}Y&8DInj7GJ3*(|-!V=xQL+sMR%FD|eQ`exKxBl4HdY1rye`w09EQ*UYL5Gs_ zYQFhQ>{nBJC8jkpHmJJ1yue)IQrXy#SpqtH=sS!)+0wI{rA#OJ^dAejheLPw2w4IziyO-A#?0_|cVq$BzT3rmuE-F&Si5TVksj`wMN_Xw(H*en5(*-zU zy?a1tXwm4D-@@gF!~nw{NDK`2`J+5z)2170 zJ6pa!wGhb^QyBOOD281>Y0-~E)K-rlD=?6ac4sO#HQpulRbNT}r<3R46IHh?{I3ON z%NC@Y&$CSpU#}PGz$Ne4eQus;Z5~{B=-c=_t6`_oKZ8f4hW={_%nV}bswdiKAx@Fa}*^MC+X&b!aW4O8ega%IS!BE_8BCYzl{?JB)}#PnlV#kM1ZI`4OxVCvINqPyut zpVHD_zp`KF$@+DWw=VcOHh--4l`)$-7MF%^y7{9wk5X_r3=~6+_DxSupEfk;DC5cqZOn>#tyuD0I3 z{cZZGShpu|EtlDLy!wU|<%Of;#vj;xGdOLcSFonGwt{|s*T(btyatYd19Vrx^XEDI zeritH8#noj!<7tLTg`gQmnFMQe-dM%ijFDI6?D7VT}Co}%es?eSVS!3c}q+ASuFjc zSDRX15wm0Yy6ccy9~ESEkbv~I{n?CNz!AHg^)+|Ln4)h@4bD?0EY}*qc|CdNj6{an z>-Cg5HSgbNWn}oS@b0Cea@A(UDs9+YsZO1iT+zWtTk-K@CwOtZ#9o`$F0!%7ymwD( zpvCdcpSBRKgeCIAKiw}LdGz3c)0Zy3p$2_~eIc2Vc@wx9oP1$7C$C>ZpFD0G#1abmg{@>bZcK)|4;v2hCuWVQof9jN< zf*uD|K~;4hN$^==p$Q&Vh!|gVM8tUHNLf$MZz)DQF%b3<;~7|fp5LWo)~&cSosN~y z)m9=A@b!m%H-lI=-1cXz_t?I$PmZpxC9W6ptgRRB=&nNJ71hF}RWF9ahl_Q~ck#?e z;ktQ$g&CUG);ZFJpcW{VTo6_RNIzE8_#L|^V@OdN*T~cSXh{ziQn0? zE-`kkwyZor3%&#GFYxru-(4b5WCEGGbn4P2d3a8YmL@Rm&|^K?PHg&pcC=g@z2yaJ z;L}NyCrgrban$VOjOnl73i>nmRCB}#MQ9fQ%M?7NvJDgY(EKsnRs9&)A|ofaZ*@0o zi(`h{CkHDzLWI+w|7_FfpY!eQ_mQcQ(Dtp6NWFf2d+u8&U_2PbKIQow!V)d7gegUa zf@CnkspM725FMQ<9v&k!4S^!`ekk$nA9@f$9}A#fSZxs`a<#CmAb-5oteDD(wpDj^l6#mzPpoXd=v4SY1ZO| zQBBE9N$`yBqNG>6c_XoGS+&=TFYq^+7|MH%T78>OH|A~e>w%1Xd~D(^FVj`f5b-DV z+E;q2KjZZoH`j#+1c;Nn=;+G<4L>(CCS=x|zPE;mU&bepkto*`XfL@FHq6SCqjb3_=`7h_NCtjPg@youN=sG7(PQ> z6_?BsyRzAWj9?)oL^ZXOQ*Z9`P=5RN?KSTP4g5#-gzE{MVa!_U=!U676L$s)v)hG* zNitA2gxRKTFJqFXKz#7`1OwcrczZKH9GPD9_fY3&;fb)avP!Rf8Fsfyeb}%A;qKSA z{x%|JMv=8Bc^L(@d-UD&9Q7FsRdD@^inDQXC9XpXtjlcwX8agv>v7}872n!69-ZbAiNDLH zqAQp9l~yAD8r(D(eTs2J9nrCU`7ZeRy?fJ`J*!Hz7=$~@ot!3Sr*fp(82gs~$4A(2iTj`k^ZLtgiWJl}o*R29N=z-~R z9m`XHuX5Bac(!hWiidQI{f=+XpKr-BCyFg;`#i%e_#n?4Vl4CZYgOiF?!>x2z~cBT z$3^GCBAm@(eLuj5puUPFcZ4>>4PC-U%Br=acJ>#hoIR}zVh$TsHP;ci zFC`}Kz}$=nfgSD5zWLRs&z+N^YdXZYp24*)_R8J6S1=Xy(f9rjL&z5y(0O#T?4@*P z$oCEfdFr3n%gsHi?sOK4AAd4(Wz-~7h3gis$=C6YRUBIS?QUa_-T5c)Iu5LUK78XQ=swCHPyQlIO zK;ng;O-)Q(pYSDp&8k(VE-o(m73%x|ikmie$6KWb_VKUW5gWTAxbX%d4!)|A+E3h0 z5tupa%rFrAn;7&+WL3v81`edrsVkJ=HTMd?Y5GUYJV}GX0;STcR~5C{!)kMG9VI7X zeD0EQQft<)Uyqyg_Qy$NEF$gD0V9Aa#LdUrw?`f+>#VJJ=~Bx!;yk-~j^KXjd1CVy z>8-!NEjZx4>hJmfIuq}TU+d2kt=q3(AI&N3U~HUjRky&-ZZ9)2hn>nGRSFe0C`fAg ziWQj;A9liK@MwUXUFQarg*8eAFFag(zWMq7`?#M=ZY4lLsgdQ0uR}NgikTVyM03F< zX^D0`PIXW_qFNKg3unGPzvLD88W>pfUV-eSC++N%NeDfn_KC-Ehw`@zP%04;809Ka1!m>;)xCSwUm{W1qWpm7l&P5 z8GG^KPS_pp?QWRkhNOI~F23Nvv(x);zR0n4H|&iyM5JtFh}-l{?uPWb*^qWEHlvML zTph+lRB8oxS{PlN7EHa^itSC*4BQngo=z;Q5(^?&)3k$055nh3>1uQC3Kk8{M}%~T z1Q{tUEv-nWU7l|rbQd0R(($Lfyc#K^>`mOl z;muMqGA2CJfByLgM~1hUB@Liu>xxy%%kAk2#3@JSny^wzkxW(6uZHlH3>h}o+m|aq zaijNr3yTOG{R0{JH?o^*>dT%7-~QeXg0McScGaBC8r`AmE@M9^G}y&;dux0aBPzuw zJKLtvdW5Tn-shLA&X+&`G=GdNWsG>o1VkSnA9AMC*-i^f_-JKj39d&9D;j^2RWcx* z#SCL!stL3hWy2TRVD8Df*k*{C-=@> zxNw`{?jo(@rayW1YzOYJxY$I%lB+LMFiEbc$KA~(??Q#s#_nY=8;aLguZ}4w!i@e| z-@OutR}ina61(euE&!iFz_X9z`7f}SmpA?tqv#Ur2(jhN6D7f9(0aKYw?OQpZt@8- zoicK}hx4f&FDxZ*wmtdw+ldKk6F?1^Iv~yiA;&5ZD(~gz-z63Hkkzc{A5-7Nj(ahw zl5(p(!Cv5C)ISd5$@Ax5#wP^hbMW@@IfbIKA$mId}IzS&+ukGWQ3yNJL ztXGd76qe^6wY`LNmxb3`65j9F*o{|gP9J>RI^0Tte0%|V8mDQ^@$mE<^ZRFz)cDpG z{hO_SHf?6ek7%w7_4ge$VuTuD3OmIl-Xj#p1XGT(usbqRr#;^7??)$hF)`~O<%Z`V1#8e_?H<<9qNadM8)PDOiCI_RhLoW&NB@_`**-yL{&Eh z2euxh6|T5GRNc0HhqvDB)}zNRo{%#b0wHXCna}%^Ni7{Kju2@#U(_O@qm?rEKyTPE z#{nkazJ7fco3 z6f;x+FcSmI>##al;2`)>_$__)V@UdH8jLq`yd9))DLL6?H65@oZS6T6t6$#~P3D$~I6uy4@ z7L|}7XKZX-^Wj5^)bBkZArhgv0q9Bm2!|z0o_)Go_!L?Ooe0HPRs0OtUF$`QvO#}% zQDz6)m8{X|*G~e_Au@{2;%fzOwHtCDJaBJ(XFkQ9x9JBeKlGCYs;}a#OpBg9D~G)g ziJpT*)wFpWFSmzTG{XhI-;>V#UcWMV691m|O?7!GHCPqE0Gx>i@PQK}h7BLUs801# zg^iQ5n}c081hAFjsIm0Q!kkGl`9AUI#<#EBSD>>3kE}9~eA4j1tTs_CfZuH~ES+&;9*FFXDNVyvj zt|ffPjh?7>v=PdM9X%=x$vo0kkC$(>HKx7mHr2&tpKmLLa{MiR=}!yP4R?;KpoQZq zXz;7RpC%6D#%>A3MPeDy&e1Aadg>=twpj(a;m%sBqZN<>dIF>J9xoA;v+x8tY*vbdP zG&8%^vu)%Wzx--ua4ca$8FFV@I=H3IJ>lo%WwY6ozxiejS>A5)*?Wv}zuQ>PYa`f50 zw7wG{?QY046RY_a#mwKwuv8djbYnO7Pt=I0P>_nKN-1m`w(yWhbKGoKta zU@(P?XjULZo2bc8;H!a=9B+3J2Sr8YB%VA$fY1*iTu9hTgPLl5bT*GuWi5_Bpn^k9 z&ry47Eqc(Dg>Ev!4E|~eU5nk(il7Jm_v|r``Is^kbKqYL0oznrRRvJn$3YT@9#c#!6J-^ckib`v7AYso-GRF-omN+U8s0n}_V#XzYL^d4JRXpZ5O-)yX63y~lzlM<(7EDG+p84=2jB?@km$s};P)a$Gv~9jgN7 z;_GLhoVbHzd`CiPfy4bwT$Lvi0Ljp|$*rOhcGc^f>5tk?qyiuu;wlrf$UU#w-2Jk3 ze?&wuE%Kb=zc&!!2W=nmV=tW{Ugv6C?4=gy$>=HuXcrxwrJlAT>FALoRuOsIb?k43 z5U;7N#4IQfz{ju7wKG`T7DO(kY!et9WV0PtBV`Qq(982nCvdr7=)gaFf!RRV?b#I> zw{J_}82y(;H}2HA^O&oZ2^@5!LIGvOL9eP}WQimq7Bu*9rvU8bu)R?+F@d7*A=6Lt z(RWRGDfi0TyIiW1;TeAAPib=^e=4(3AT|W=`^shMQgz)r^`@54@9t>0e@QkmGlw}= z1TK+~=FJ=H=-fCk??mXvs>YH1)z#ZVN8G`L<_}kK_1ChZ=Qy^c81w@M4mfAFq8lem z>^cy`$;tMMFKI(0AEeS=UY?Fnc?;A6mL)q1IAXKZ9v-BIkgn@A7hl zKsEhvN*~7oISiG?{3r=SE+BCe@(h-OORE!N^x;@D_w*ViY*J8ge=!#?9|8d%Zuz@+ z;*!k{{aFZ4)rIb2MAz};+oMarLIw;!V#Mqoq0JJV#cdHnB+^D?Po4aBV%P=iLUpmo z=&gQbI6E{uqq=dnrKK-G(rQ$NrwxkI$+$RK>YpjclvbzrzZDR@Qg5#b zkN%{-#th62jy(uE6vqsM)C=m$0XSkd{_t=D5)etN<-WHIVv=gytiSWU6-m{bW)ae6I6Ks>WUpR5MTiQ0qf9Ch`o zA{pe;)vLF;GPJ!ssr;jBm*!v^NP$42!uQjKu=()JZavF+gA7NMLR@8CT$z)5!WroY zuFajQP~<}%5ov-}KBvIeyq}xLaT0b?RS5t^dRj4XL7A5zvM_2?&@br?YetC}z!Y=` zDC2aW=bN6k`AD%0m*R+x?%|RWS}luR$Nlifrz9b=H0`&SSm9(dnW<*};EQQ@id=<)5|j}K*jFrRS8A~L}`LCoz+J!3GNRwPi9i@Klt za2@V2fUu3-yS6=4R5A(*_K)s361;Ws;_8I0YrJ1ON_J2>;&t%&@x2K*n`K6=ewD%8 zAwPrURG8=Q?tE z4<9`WxN&0)bn|vX^nm?Whtl!w3}O@ZY?9ZD2_uv`^xYSTV$N>}_JA6(;PGQo(XkAN z)z0U-j4JV;xYxvDX@wiwVvrP^5!}@BVacmqTncOZmba0|l7`UQ&eUI==LN-QvCoKZ z7Z!$KRuxE<;Jq6jPcZs3*PE)z(~d34C=L^tcZ6P^QYQ*hh)x--1({G#0$)V^IFB^} zVmd-WQLr-bLY;b!kfK-&Ia$y*lOEjmlo*Daz7N4I*Fej4IgP%;Xh~HQMZYTdM}!~^ zKljvt{OU=I7azN9EZ^KHYus%AO=FvFhe@t8kA>|ycW&_h!)|^5yz0rj5yJ!!(iQsj z=`1N3V9;mNhD7JPU9iQg0+LVZyp5+5H3!~n?T5mltHobJ;dN~R-`M+hvq_#}i#cjd~Jd+*HXriXUiA~RS==MGbJ0x9=* zpoP*^SNGUTI$^hr;M%y=dbp7h>j4{Zwwl9+De$1hUR+V@f!%P6Imr8PedZY=J0H1T6&jE9|Zp-SZDGM#4A#^KOuyUg@*FX_EHk< zzJ4lECamh|>G?wNQ<;Y)l%yWKWZbTOsO$&>E8n}nRHzW|5(yeGe571cRj5G2ok%Yp zQP$_{`$r`0N&+B|Q{HoMq;PN0qaxb)(Kb!ctqu(^&w^RD*Pb=b=c^RG>5~v(1snlh zkNWk8z#^be@k;5|$jHb&NSbYQ-9l-A6Tm>}sT|^BT}~3?G<#C42D9f?sFM6kF~Ab$ zw`2SEJG?&S;vb>p94-8&e6=4zjfY?Z*;n2MtUd*nNwm2#385V?@sv*dT$U@taa69S z{O&G5!jFEBMnOPIf$RlR<3<@TyzqWd*2BOBIpTo)6B^pSX?$+HRe@rS!yEB)Z0#NPb@D;y=*?{~voR ziVJVbH_C#{x9b{k&tw)9Tr&R!?aVt-ii~C)IJi`H&oy znlI8PiYltB16gci!lCCW?_`k4wD(QA{)O|PsVDpR7>RC^+S(VZ0^E6dz%TdT&7PDW zC)3h;qrwO)E#!Nkz!|SzrInheqACf}!_R~UVu}Nhl`q6^7DgS>Ea{b1LeTREvJ&=AORZ5q};z$LY4J)ArCLI4R+;jK4Os6*P?>edS7BjgIVj??_H`?Z@8}6@SdM~M3 zpPZj>VIinuA+UXZeM|TK93!#$(3y!F1Sr3-FckvZ9`b$4`_cCB9_00MPPrJD#G;|+ zXQ#X;FfQ!et^4W;x%UIlYA-4|+WBb-#eOEoT9i@D#D1s$mN5l8L>cm3&_xtz?K%J1 zyl|g~{?pvth6<;Nu!;{JEG@1HLm|qpyVerJ=zG&ZXeK>Rpzah(AyO3WObRrsL@IqP zwG+gwcsdUr2n8wfdkTg%Kdzz^5<9H?9g1ZEcaa;<*jyCYjlofE(-tR{c|4ie^wMSH zeXhx{mCpu=QWP^wH_y?fGoU7&6aQiO!YXm%Za;+mSBbNT`gAZV$}wVUI60S24mgB|t?9A`69&#YmO<$) zqDU299=Ds2T=SWS+yYbYIL%HPhYC#!+awv+w|ZN%&~Lmkrg?v?74_2CxY9nmc+h-blxQC)#i z9jT3ki{~aIKy+fS>kB^_c-b9!A27QVD}W;td4v`*LCqHye=GCPtn_RBZ#{+CsY03B ze_+L?lRx65^i_}UG?%@lB$L29DJUvhb3|5SmBBXy-IhWO0{`)5f*vNU{%62}NBxuk zArIlqiMi_-@$OKQ`8<@ewiJ-*n=~%#ft)w_NQ}ZA3S&n)V6ECy`Rr!HfcfF zV9gPWPo>0jE1e@Y&sEgaNP(_cDHvyF<;#4DzZn%NTqHG2opCw-?i{c~wQ8^YPn`l^ zBI}BIBU8MEW96&SCRqweA+`&}i}u*rp_=Q+rBrGK4_DUCcU(xBj8+h$HZ*PNrz5Ey z{vJhBLZ7hR%(Jq(l02QVOd|@BUhocHe%}yqC>tutJ&(rfaK>dvj!aS-C!CEq!`vz^ z|Gp>&8j5l4*4Ni94L+Q>hG`!%bdpVAL>GyFQSk)CW=NxQM$|EbXcE0VgzNAr`K0Qy zWixgA~PbstQU@cM3|C2QwzPQBf$1u?=dBkz+}AA^Jj#qB>92ZHN3Dp zl@_lD*y3cQrZd4B`kNGa47bb0|vpHT$^-v9<~$|7_1QNDHrr^kh|)B&>*@X?y~ zX*9nU-;~c-yBh)?b4@LNdkdd z{`_^}(OKh0xamd5#GFn|?b(KyUEowXF--eOuY{*G--si_d9M(ZTZ1>Pp6yW!asJzt z4C=z^reeT|PaYX~B{pT$T1eYfFRw}qxFO7b_}g$3>`J|$a~g|+s8m>hDT)9>tB4H@ z01}KV{c8pNgJobO#Eb*#LC&vdQ(|oVVr)f(^r`TuqEaM+r>(6-77F>9*6q0NQWqCN z;!U0${o?wQUjvK;I$(@XCiEiJ?2z~Ce1_m3!2axd#Nr4u{+G145Iz&n7$OZ|-I|2+bOOw_n($&?~ z<%_Ur_c>aFvv(?|Q~&WgOfD2er!HSsAl+tj`Z?`wh5n1WhFA@Cz=SH6%G%43WyJf& zvH!^QDFAa4S3Fe5cI5_hw+c7O4sEb+-Jt@edTx(_n--ZP= zMNCj9#!2?w*AeX5{|{no(NXhfm1%2)TtpQZ&A*jNdwTfca5> zc*$?YMGH79e3!qrF{~}LfBA`d+PUxNAo_5vR4xmCkuOa_DNZXAE>ijL!h8%2U@rw; z8pzqJ+Q;J`G4hq74A|z2Mux9LLSH}8VEj#j5}bo;@-$(_#E(bUl`jQ_Y;g3317sfV zNCgS6iE3igt2fInVgPL6HELG(HjYQQ#%1)m}pGN>gJ zZ_%rj?frykJ0B@sR5gHL7xf^*IrFI|gXn!jdq|noRV{1O zKP?91KXZC0;o8Ax^3WoF@3Zk4$b%4K8BKihDk?$9m|{38x;$m#@&mea7B1W^sul?8 z;lsN!vYhbb%QTUygz=;W5c#*Dvzs@GbpS$DZQH&>IYB|gett7Zn1$ON*o~S6h{0LW zRwp!=-nWxjSS}mSFgF)sC}A~NNQWo|pX|O3R8(ADni@dFoz+c|tRig7LDKw8QH%=h z9GQIP6>&n5)5tPId-~y+`2XyTs2?dScX<3~7{J<8dvJ>FGAUubfDm@reAr(3&ybZ& zb`vWug>`{94v9mw@kfaOzo}!vB>D66=xF*`mlj}0RYJMa2Jln=b2I0=k^x{3Z<}DH zqO1voAQG_}^;~I1I*mL6m-~0DxWx(2tZG0#JxSZrzdp*0hYv%fySlm7TpxtpDF+{G zXT0=8LB2v;;TRLVETrKScdEPF44Km-7qrl)U~F`wk^+Hg^Q!XQx-r|>LipwD9-aS0 zbyFp5HCP5%vjD5pmS#lWUM4Ow2Ifx;%xk>G8YcQW6w!sd-PgEBnS+~8YC~OFj*!jC z`(D;HKK7G^%AE;Fr5_I^^y<0XjRTi!jb$mUDvQpi0}(8zR(v2Gf% ztQb+`UkV@eMf+QOImIHLQ2#T5!M<9SUXv_L-z zp8Zw&CS^_()$7B$!bgwdZ4K5D2q1l7iY5bzL1)4Z1;;~mIegsHEH}p8t-0!EW?^v` zf^rW(MFe$G5u)L}w%&pHnM1jjju3;QQmZm62fmeHH^f)Pw~YF)n$UTh(nvf$VC|(J zJG?esAZ=uP030b?cAP9V4cf+fU|aV`I|z~zIgIi})S>X3%&nYYG=sn);FcH`_UcMgE^H3#_a(XbFl`?jzouNPeu2 zZDNAQWZS$kW~3@jLvf7xF|fsLiF**|4o*((xS<5EVc{!`2UnfF@fRbk7WNbIg!mzj zOP2T(wh{$gt!s-l>@UHZIoCW<-v3XA`6#dj^=uSkqQIE`MVR7(Lbvtcc7lY<`Uo>3z1ZQBLC9d_DEh#IsiZ{i5<@-Kt@DGZeN|feIxL_; z%XU~)ePxa;q!N<_mHxBxpkyF+k?SANoJlTSzJA9Q&c1L;!*e^VUcDC@MPLOtpH<*! zn$dPbd5=uIT-%A$N0_?!TQnwy&mfpza5m|Acn z>BHH@H=6`4Lm4i*FNui4BwJ2-^FJ%V*|X=)G2Ch- zfIB!Vg@OvK-JR;uCZTn6ud&{GV#{0$?gsABj&r#!7G!e@lbs;YQ@l%zi8(lGo}Z4H zk-8gCf>8gZm`8z|6#rZo-l4c0oM;Fg`{2R3Urz_b}KkrBJZICM1)uzy&%($&kCx1$Ottc_&YZ6=739S$!Bf43RpcAC$@7;;9) zEiq-Jn*=owblX9N%SU&2F*diX(=v*_Ww8cYQFoNmkssR`%Fqmk;g5$9-}qTI<5dqu zMwWIyeEHHPkAJw>j980Cy?ufcgt{dd9%>qWqiy8dbX8Vnvgputo}SSNsZV(hHQ;{_ z6#MhBu?pYR)0BnC)=yo1BJ;LB`7GvKG4NtPx!jns*1_kU6(o5SS6z#AAd)rOoQaK{ z4lZZro1uo!&!4~O9(znp0C%#h&3=LjZmh?Ah8oJ4dCcRkJYCaMv}!(oei%E+a)xY_ zZav1mQB+Zx1~7X@H;VXxB)Em>qw$P8?bNB0R2y*a6TI@Z0PM3A|Nn=nH-W~oZNGYHN-iO5G8&v-2>V`pG;lm4}Rz!7%`usQ?i{kNd&VqFjJy+BB zhacoa4!6S@d=JO0|o2NAAp6Vj5aa>pWE8jcI-pY9aIv-80mpyNu+;HxTU?* z3*+tR+T&0dH6o+PYF9=}d4#8C>G{4eSw+Wnp4JQ3??-PrU;;5f?6@R}Xcjfn|Bf%< zZ%-aM;=K@a%Q-YSI1V+ve~J1dL^);jte-swVU_~p5gd+77cYX!rwW2@pyUJw+s?<+ zxZ)vL24i~|-}zTxpE4}B5)%?CU;o|0%K8CIh~QSEfjF6fWA|vsX`~FH^W`z<5b@Qx zWFAxM5t&pB^*m6pB#PU74@STyUm0_NqsAd8e*U@6x^ZK}*qp$D0~$cE5-{UIPm%zo z0j?G64Zsue2MXz+6#F$kehRqo3|36IbSxahN$7m-7J74K;c}F`hXfLq$YeLb+p7Mn zR`@hdqu;Y!V$VD6^;CFeF0kdDmZHn&(>@vjwWsQJrcTEA< zyF(OYld#AOS^;&H`PurvPBIB^>PWpX&IflGKV~jfl*n<2H)Ve>9fBh-+V|stb0!AX zK@=24{L=A3SXo#U5kgWBG-AjML;Wbe3Lm&gQ84ekG25({hi-ZuGjlRNMml7RIOZ*6 z&jFB+SSiPN;~>Dpdodixk29_Aa=in5UIv`c;*ydObYVq)VcmSijgdO$=X^K@jVaSfWX0nlfTP>v8!!ozKcJTNh(C#b5T4r#o${o8gB(W1($U?L*$ip=G~z*m%f^RHHPTUd5Q5KO;{33)t>oH{f(D5^FQTPA203Few^|x9L2E_Xj?(9+GI=nDHuL&se1GuMXat(i6 zMy&>*=olJSj1KmC3mE8k9Ry@PgiGp#!OG%9>Ewsb&RA4XQCVl2>g##%SPjtykHazt z;Pw#|0=(zL-hY#UsSo+qG8lc8a_eD>1_qxy0WzRT8jl~*FCoIbsoB}24GQyKctIz0 zb;C)NLwU!_$*G28wj17jfmww=fvf!*8&gLV#ij4GtKmkR zB4HhWzL_E_DVahHTfquBsiwC1ZsksZU+r*APfAS8b9;ji_+PZVTKs@Q=5oDPi=E&P zC$MjyRpU*Ral7~KZA2kJPQ@i#+s|U*=k27N3L;`6BTpI~ctQy-E%iuYh(*)@h4161 zPZ^s9mJiGD3WF(3r1Ng>?kkroQ}OZ?mVYagR~`%6Yx7c!tm{J}Q|S68`yev1&8FHH z2i4^qR~ePUv(wWr0fPH&q7T#HAriGnvfUJ%87_@+8W1fRXBk>M;ZL~07k z!5|S&*fsL^pYy1xy#N{QlaSEmtE>Cwf`EiqR1Y-93WOy*e078aN^o}efiIDV?t;a7 z8d${Uw(iD`|2i~YtRD*9qY=~kPGT6u>d$nU4(3j%8t!G7Ul{&}&ZZvYjUhxYG?s@O z(6)bg|K88Qc&|}Dyg5z*&`KueF_;FP0*oo|ax^^28Nde?8C=Xmed{8h4eI*Ft#}S4 zsWRc&80pvJdk+!wX9N#Cjd=9^^(g-=(dZ$mM798TXBINdyN7DBCF@k|Q*Q@rC7fz7 z!&k2PUcXG3I*5B)nRY0|-C}Nlza=Iu$Gh7OuMWiE)v`Z47|^yGZEgsTEPnr=U5gN0J#vscyVjcm|FSf=5Ke#1e5GTt`*_ zM{D4uJjRi;TC#mnA?$2T+Mq|izADjr4%64=-m7BcVKkonbQw~IMYX-_sV>rqlhiwzRksegac@T7nN^2#*M|LrJ)FsOmJl&2}@Y`Zb`KF}DIOH0=4&aK{??jZon7PI`BNcwF zq)sC>gIQE0$^w#Ls1=F2Hn;UBn&Umpca`yu6M@#A`7;Wf#%bb*v|+iYG!ld8yN59` zM(fYzO(^1Zqa#KU_OeD@_hnuzuxU8=#Nh~p06Hc)mJ*CSiLcOz(1_`JcANC+(?r&& z@6G@@vn10t(L0!!Dx%fc4G`tn7uIY)4&ZmCs!_g4Oh6B6;lGaNxE%yBAvoZIYi0@e z`_I17DDs9!M!tdTF^tcf48}2Kx~WG4OAo<1Q42`_WM05ovHNXk~o4XDUZ;kYHHrhZsv0$}FyX>z}` zbg_=3l9pD^aY-`|Y8)2z&DFr9px{zM+x8%=K7;x{8zz-&Nrym7RLQjnbtq9YGJ5S> zcINWHb*$_N#;wJdJPRmp7cG|AZlYk!ZWh%bKkNGF*|WOLtIuRz56ItIiCHiKriC~g zii-k&bW++d>>u}xvRKV4KpGXEv$M2}1MA8Vu8g6T#K|1}VKV#+>~o_$HlqyVgGW3@ zhIz0$WIKCtT>j0ZD&`c!2p4&f36PpUDoYiaGKmBhbRhfq_!2+ec?XIR>W;lI**ws8 zSZxlH!C_EgX3+K#juy$Aj#?4;jHJSsFF5~}RHO3ukX;u6u6?MkPHOIv!kI^}vB^0S ze?_dCRn^rK(b1F0asN|)NO7@S?s{#+Xj1cm!Po$P&j(nyps4TOKN>n02)-Ab@rQ$T z-h*Lq60KggNm)BxSdJ4NvJ1IDd-RmhL&4+y$Xqy}V!84oYqx$iKIQ4T%(?0Z z8XGA$NkKd?Fu=NFNB3@LhHG1hFOGT$=1IX=hqQkG!-DynZ?eWWq6P;}(+&ydjhTky z4~Cl1%yJyEV8s1q> zEwE?LUqhSBx!ZbnhB&_w$3`>aD?1pfk%e|4{x1IQxDx&E7MvtVw#FPT(g982tCtd5WMrSxu^$8Z zV5#jI8Q(hu%eHa{Vd~`gASvTz-36pj2wBHpZ5X$Pveh@~E@T94=|%NUvQ9(6sh=)g z7}kY5)G%P%-GFTk;Z5##{d(}zr`(6u3F5ip28lV3Xrrc2#lAzN?`IR zL5R6B=i7(L6Y1=UP&s?w!=y&Qd6<13yEgbW310V)@J0}eM3pK~yOTx)nSk}AS2DjF zgmPBa)*Bsf}>@o}+naL}9lw?Mjw_ zpswI5kl$qT7;M`B5Lp`^hlYibnsMsSpXa!Sj|>To5EF&1D9j%LTIzgr>&>~Rg>X{> z!^aAo``A}+3f3_qI_*|`U~AW1ZV>bIsRj(Cvz|(R`t+$06++jd^ve3@{GBt!9@dTd zDIxHgQjaZ5lZLvdV(#1fY;hz`^GlcNVT@!6S4wmdA6ko1dj|udy@C4(I#|oZo-rhu zlXyZTdXCItQyuoiM-x4uc(Hr?QB!mxq-sE~{{bqh>XDoHy6vysa#KHzu@aKJVQE3~ zyZsa-%x=!PFnFD+XM^-DB4L0vL8E`C(*RVVNjjYox(#uB1{<54ZRD@0K>E3=recKBO=R<4je3`!bbU8wvGLBq4=}3zwL?k4V(TO{? zc|TvR>58mT(J8yNe68?8H>=T+qY#W7s{YX+_Uh`tn}@{qH%YWxQ%!`bR_wls$rhhEo>me)rX*U8Vtc+^eF z4a%K1&e_Ip+iH37@tUYiD=(gtoA6!j$1`yyTu?3)0lhf@Q$LKyd*tVSRH8~_UlR^@ z*fRIoUWCB;?$wnihvDmv3~AlmEG`knj3ygoetB?%>|eceK&#(mDHc``++pdCnnLgD z?WR}eY6+7aVBy2%N^IZxcVHu#_CSrB%D>LsU;t)f7nU_Lnnht?jexOT*wm{{PYxN5 z2tSXxazJ%8gHy)ukI?dqxQAiX@m!Zq#oAh6>j9$=Fkyd!(8Q|p2(@!YXh#A{Fx708 z+CJMn>*m^_8W%)`Qx|(-8~+)Aw~VZ8E-niQQFb$O7-ZbTZ?tH$KEIWQV2t7%Of=NI zUqn}<|Vh~ja&Na z9a8i>b0679O2{IXnwFL)Ad>yWzXbE#+k72blhOkcO4ZWN$}VTb=>VcxH*qm|D=M)JO-|MUr-|TOLWzCMOxf+cN%?5~ zH^?`{t$ zySv{N7dEig4?C%!IMEYuu>1qwGYiFIX6P;K|LX}#_SmG=nGhMAZGC9oh0?F&^auR#ApU~u2CU;TH)sY@h47(Jg9wu^7qhSf!h=c zQN1%o>%1#~F8l!{k}NyIp2a%6&D>&NOv228a^dZzHdx|+Lja}%kKtP`$!yzF>$(kO zNl}1B-aPDK>?jekwHA!^^*`YEVZtveB^819-%`B8(*O1!(&WK8Z|~l{_$$M#EBmqf z5zd&;Zv1Vd|CIiv0u?Cutfz@j?CaH=%07d)pa>CPy7{W_(~ll8ek1Y zZ~v_T^#RZAq8Y^j&YlT5&*S1M)Lj!0&Xv$`8g4Zf@P8K<$CGQ)(Qd@~yKp&Hht(I6 z{XONI_&EC_?A(+At`e{iO$GeUAmUm>v>tec5mnPA&0; zg|7MgbJ9mNOPxn8{xWy^F$5|UYRx#JSN_f!H87EyN<%rYg3$`v zdAqB%Je;REeco1}0(%L67Ih5`iQyk$GDidR8-xbMmR@lED;Nqs5!duJReVbt}>L;ahE#a*0Ld5wK8%p6#NS?tPp*?)q%s=of(d0$;E?p{^~?^W?^uY=Fdo{p8t*P1pzz)0`o*gTa# z2dKLS*D_#e9pVT3=FMl5a^619F+e%JS3Sa^QyPe#f;h*i*bXw|h+1NcX5G@=2Gc3c zga+;Qe$9!A9JwJ6P-%df)`4ShAlWC8c?=CPi3E%D^Yu8E$V&MWMu*l6)K9MGyYIef z6C{g&Y8F*rUg&$z1GfQUOar2Hj_afe5h(%B2HqhC4={nbG@|hl(`pg z8SV+$1fj9$WgDTUT?=4Q3l={h{ve3;O`hNdSXnZCG9Ld190gl$r0~}|Ka-V`A_7DF zfhH>*lydmt$PpIBJ2(TCQ6Lh%GwPteZh)mc7`sqZrb!KMEJ(CwTL}mQ*9UTf7&ZSdXy6aW6c>H-$F+dU$gzmgI{G9!5ECErOLW|&I zQsz!bll7ysVdbIb#4_|KGS^Y9J8w->TOu&%U5|q0t^bz&4iI!eLXIs6L*e$j?0zt8v$3qIeCVi-O|WgPyo&p&QLJA&%mxuzK?t&3)E8%Bq5mc3ZDw z@6(8D&N@6J$c{+ujyEJyK8=F18c2B{l+Zm%PfSD~+LgV2U7vi46C?)l`F2SGz&14? zWLkZb4&nQWJv2(-q4;E<+5}ve_?+Opzzc(_LTZl63!^cx>ZrVOPOYK9Ob7KdHO>`C zEMCVFtTatBVKUDQz|RLr7ulpkINZQ$pjq>C8E@YSYVY*GmrB52Oh_T{u7v&xFPQd(Y+i<2FFWhF>l}SU*4SE+kd$ONx6LH#t!x z{Gb9MD@5ULcNgZ~f}dDusj!oV@*A7GdywRggK&)yNiH`E174`zfOlZT0e0HcKdaIU z(jPw7DVf|PyE-+4^(bW;LHm96K8Lt!?RuwaVfk{q5^K+|0a}CbpTBw&nR`3s>c3^} z{?Ym4CpzLzt*)Ubt`v#>d^c=rBg+{GYXc&1qN7ATdWd5aD18kXdIw2RLjF36YMKSi zKU@)g=|Ks5?VHPgj+4msqL?QUWnWgX3QX(apg61o}rk8M2KW&^=k=T43Ae4R7{1#1`ZMjPZ|w z^90tU*2%REkFf)59-t7}a$Nyyee?(_;HiajMiXsRox+kJV((}to9<=P>jROO2^Sf2 zlpdfGYfPUmbc1CmL+7&*61u%UQ= zzj3d_$cwW@PJcG#CF#65&!TDGaqi*8lsNOz@ZXbTL6lXB)9^PsC>N9wQ4I_2jca7f zMLvH1Tt&o7*kZh0!IK@C)mi3rLIaVifw-LUR}#G#p}PG~MMH?Bvql2nzNYM4x+t;k z+IpL^hdgWJ%3XBs`sC95Ff1Yqyka|Ck74}Q)7M7>Tmqw7COjQo@tJ6EL>1(Um*@z` zI!m_#d{jbRz^bBzG8OdPOJWmIqJA)>sICp$pM&^?QPw-?b1-A#;RbhX2Cd51t2ohj zP{~7nPlSc!-3$fG-Q3_{YGs(Np5I7lIizPAyVj%{7@ZJx(gt$6j{Tl>Z#GH|2 zR$4l`W~(vRU4-F83MhQ98ie0Ro-*5NPIDb!T$tf-KHuDYIIdvpgvo^EWCyqWKaY2C zB}4T&)LAN7;xcYs;QMCa7d|~ZGy$|P< zu(A;B6gP3KVXDo3tRr(enD&Fc=uy{=4r>_g>4!RJgp0OOBvbE>HY-#0Fe=hito4$o ztf4%ljAh?UF$xvYqa@EH=uwPhukh1r(#NrQF)J!iXuMvpyERK$NBL#)Phm&!)b0}t zo9=j0ecsEsKtHrjV1vZblXs$1IOWRZ8j^K5^K3eq5%MjY)3-ofM$RNgk$4sQwmMeV zk|1rv-I16$K|~b*V6d)cT?mN}fKwjGZWNf%czGcqhY0kbjuEkI7b88#p4cVqHSfu9 zF{#8BCU5u`e>x(aDT`p=`r7T#&82Zk+m3vulu!*H`Xko@==~<>hf0RMvMKG3Gg^9O=Ro1wZtUrI;QwD zY`;U8Iqf}O_wcZt6fa4ybJ;7-ciYX|^@1;WwVQ`g=1bo>a#V;Iym!>9@_i+GBK}@^ znfnEO2Vvrc1$tzp*vVKd_UVEHY2ShHbkxULhWXwY(ISS4fY?vWp_^A$uonaZ=Y8cX zi#AZAysfOHK~V(mekG3KZyfsbDS{O3exk&|Hjw~KMwm#Ij@T;LN;GY7ZnY-1;7JE%`6>@I7e27AcD&VMpR`1e4Z5&rnX0l~P zcl$0HMOH5cN|I(xsUGE$lAT9xT>0`Xs#+_$6ZCo8tXJ9>3#xlod_=DIn8J!8LGOjh zsjrmg2y$5f)ckjrK=*2H%?`w?Cwy?-46@AVzY8VnGVZ?N`TubN81Dw{cz-`}^D!Fl zUwle`!=BGID7R>=nO7WFme1xE%I5C>`_+bX`YMC72{q*j)i1@^=*O#H=pDFO8jpS$ zy!2b{`4{a`gPgPVY3KI-Xdl=8(LSn+H2@n>+g@Rl-3#$fLz#ywEj@ia_-e$38LM#_ z2x?%XXLioc|IZu*ZSyD<{(vb9sdRPG`U8*`kQwryA7HAQqBms++)p;N8`k`{8UllZ zKj2T9VrYa$Lx+QJi;5EdtsMOP(Z!z6pVg842u-rp)p7^(4w(nN%NG?XVqF~dLG_DP zREJZ2sOxN)sdVb1KMfYqr`Da8Xv*nmzPvWg>*}%F!Mt%}lcHW;xuu8PyT5Z%8B>#` zqHj%wD-gkm+fPy_<9GDGYtUE`QY3!q0YrcvT;eLQ{vP5snE|L~mvzbfGv^;qc(yn> zS>Jn{h|~ctJ4AC2Bt&4`ny6!}t4IAkDErGn?tXw# zrC?vF-@M+dYSWh&lxL})!b$~Z0RF2Bb+_Pzt4$xsc=2vFSE^&Z_TRmuI~%i8xWYEB z6QQd*#Pd#3je?;!BdNI&cujLh27RwvGbiASb zYUX;$(~>T4vSe!>a8_P^>gGo_7Xbux1MI^o^VJud!9kVp>+NOVvZWg10(x3n_J3gl z{#T7(_M<8eSUOa2AwdGl#WtK{W)87b4JwBHukdxO#W>2b0gA2GxDz6g0l+cue!4QJ zB%Wa9yIpJQdwollA&UWCP$<_uJhLU}>iG_Ii7jQ42#%Nm38GQo$3Pt$ z6JrU^p+WcpRuu)HbV?JIAg+8{1@$Wc!KsEE1wsd;;;CA=;7@$i^yPnO>bGGP4NP>Y zP0>N&pWgu(I3yyHb76~>xkilCTLN`cU^v)HUn5~D2wz226|H$pkef%BZOnw1v3>cm zc_beFg!7yHrsXA8gWCU&ysu93A|>;8z{JFT=#?`&fFMVt2G;d|^X8{?!j5|e$R&MUFB=GYwf z(_rey7qww*x3)L>IE)=Aa6Epma5~)FWu)mo`j*V;8=wbGAs_rQ3zD~Zu$s_d zDNwB#gM_H2s#*j*Q2_~Q>|4TmI;A+CwM{b(EI~f=j8)t$)q(SZTYOrXF7CWnqm&kS z$@Af|$NV(P)j`aMPjPRSq$lg&5f(qg{allU7KaLi?YAw}`oZRr$o)TZFP{#a!bZAV z3;kQkyA9#n*0De~mxJ>XBXNVn_+0v*QZae4s%f5^cg)*qXtX;kk7z~+YW_LXO}F}V z#j`I^GIPbG+ifrw)xA`{p%Anabr=Wx-MPcwp$%}B9?o7ElYrkZ+%bI(qu|^RX@pn& zGvh^h?L=AWSr%G<7v3-)-|O3|=6KF<{`@EC)BgP+tq50>)7cKUKp*UFyRjD=064{4 zuR4?EP2M~X=rPzHU0FY6TX}33kuUGz<8#2o?!mo#J#Y4|M0dKoCX|Ji<(v)MzPo)k zFG0-kOd$O=MNcMP?xUMHTv@IiN(|s(_PR&&XYIX69&Y-u3+u*Z+O>jLwA%A5JH2WA zn0vq&T0pBbjSxHt!ff;}o@^Q5xy5MP%BR1|diLC2(~4%;ESTRQoP+>;UkA{rjZm*+ zf|u4foEdA!DUtpQkVWE?Cr>`ow1Rk1aHabxv=lE@g&hGRqgf2wti0z;&RPD_53G9w zsw8<1805%*rvJmlufeuYT1|V5)lZ%IC)6&d1PJBS1=HtayIqT?7VqzUYO1R0Pp4Mu zLS7y?tX($-V_E5Lclp0_@amu%5j53I9hYMIE$>B>EnrjPGWG#fO<_sNxsun<4&Qo; z>mSCtODD`(M`@Fa)-PO?lPjBFwt={Z1K?xrI{G~ji0S7KABra0F&=$@ZAgHC_!+3> z<>cTU`VJQ9qYtLQa)3$yPJkESzn`WyMU5d1EjTco6m?bASL*!|WbnecVS^++8^P#- zK8Ip{1B7Ega*WA~>HQq+D2azACcZ*wD{!lWefkY(H}9*eg!%bDqy|G8znjZwySC2= zm#E0r^dpK_stXF`hLx7r_Ht=*A2=IKD}z-zBY9~*fDxW5ds&I_fs`Ku`-K}a^DIYv z|9+;a;$_(zC$Jc$R_i6R8o^ZiR&@7X9i@?u>L;W_MtpxjbuOBiu3P{^pYUAt_)qcQ%BNoN!F8@W99wIDcbS zCqX2^bEOy4UShauGUo&rP^g-Nkjf7Y7_iVf-#p+IrO5PW-Mv|!sjQVIZH@IxF>7*| zs~9yK^^_UnLZdgQ$VvI4m`J~>Ua%96GMBORSZqm)J%Z1_BQ z_;3JCcp$w3D4Jc)Eymy=9+(^N(7R&n1xq;KU~U21YEM6v`v{li#+th0I=_}|?rl}H z^|EfYTQ@9t?_hIr*w}%y*d7+h&CTL5vu!_v(h3C^7HqA;)@LS(kr^%{hF=+X&5+s0{J7aA zsbWN^b9Pwtp1$T+q3#Rg4D=f|oDQU5=3!Z#H zr*A=*aKyQ0t=C5H3O4^ETaO>d%vczMl|-47JH#wCcdMwmah_j^JeF_)Js-b+uk$gy zL^7&5cSYyfaWE1R9En;65wa-zHB#kU%t98ImNrw)I&xC*{z{z}2im%(T{dO=$Iih`ogI~gx=8ia&?kcMnL!$CGJhAkI%(Ud(l zFAkY{BcNQu!+@Bcs@DyoZxtR(Nr97&-r>TH_ceH!4gRGG%g6e*+dt6Z7vPQUjNQh@ z_8w4Qq|t%!Uuh{%MHMzTj~Af4AT!TesBTTM{?%B{h`+S9s*}g0&|PRbbcUx_=ihCf zG+Cky;JERC5Pp#c%fEL6r-HjqwI>vaZ3TAcs7*m4!upY;2QYv~@XBtSMR{`}vj#%B zi1CHS(b)$t!Oc5Mm#{@X!R zMoDU5mDC1wlEhfD=H9B&uYcko2G7MXqv`v~hGq4nyh2R@^`bVbFDA~Imcx4rZ{W>^ zz*ZvR_Lv<}QPG0?t$p(rs{x>PIq0{VC*)GsHdkoA$K(Zu6otojWhV{Z!kxT`U5Z>W zT*$&zx$~EOJwlq#=`^0*#4oo?^J@4|Pj3Y{lG_3UB{?t>Ln^$uq>-+r)Ob?)Gqq#= zNPd0MKCY^ik!))vZP(m8@>Vxgh{jT5>((cRuDguXP`vl`^`V!t8ryqR>k zaV{vW0(HpU%g*m-Mjn4d&u}IGs=!5I_9DQte|LO4KYmzt|H#ASH~X8EBAcIi`z5XC z8Sqx!n?FX+#90MoCQAECI1i@40G#u`r|>XKPW=(6F{G#)c)OrJE_p4>nF#24S4)Aw;u3J3ADEjtWKc>wDq{B-&R}Ki0aXagLP~B-s1LNU^TblotV(*k}st&g=*JikQ z@ZN5or?g=T{*Hw{(N8!hw_V#X_&Kr?{I*8}&)gPGp} zw)uq8UX+*D8})aA)LIF9{jTeMO!!uZzV=Un^!@-6Gp z+r46sq|9d7(pQEV`ThLwP?)(DB0vd}=o*9zrFIhM)Al_N1G%~hkNo+D!|F;bQikDf z@oU*Ps7p^#eWg#;{(TrKGE;CbuA*x>*5{>>(s!s%?re$-3{x{NQR+T^{E4Y12^%uf z(pq57aERTTESuv-g&6oILuy#Cd#B!nhpdFeUq79j;nx;ttWZX>P|%NEVV6A3w*W-w zObB1-$q7pgy?ZTn!SgfzHb4b{Y4zWv#*{sNd=th zeCc2(!>l@&>by}#C{K%RbsHl+5+6wkS%nX5wuU~QR7{ilyMISZ5W7fkNo;OB|0^WC zJ*CG20|LwnO*;8cP*)Gfr(Z7B3gJE)Q<7oKLgy#Pa%NIWfA#_#WM-zP4`p!fC#Nuw zBbB`({kZ7{=iPCFnrk(iV%G*dr=PXT{(knHb&NLm%w7)GBXsR+Qg6!dHn=!h(G^Dj zO(ym$yOXr2Xb5P-j0_CI*^18BuJsY;AtV~a)QQ#{A2<_yzo`Rm8Y}oLC-92g=`NE> zaTw0@Q|YCPSgE#v<)m6?_-cL3n|&(-LslsLN}{_}deM`A!Q7!Dk*9J?ke|AfdOx;= z^$D4n%xJN$G|@hwo0V6k`by2tfAX=)BX}XC7gf0St<|fU5GvTH3G8ir;G$)BedUz3Rr}42dfNpyBtuNoU z8;HuHB?VVbw2ghKUU_mO3+fEL(JMkCt4qK-hx-N-Niw-#epN38M@FKI0P%OCWK?5EW$d5;?OBb73JYJkF# zs)1qZwCBS-{9P}y<9A3o@gNjjDUiurkG+am-iwd}T2x+cZbohn@o|8iKqCMB$HzaW z2jmUJ=-yV9^))HH4%fmgwu4JVwFdRLt*p@cb?ewsR3Xg(-(jJQkB>{kK+k$qTZ!maADqzc22m(7651 z-$A#=FcU?CTuh4n#&6#;|M`Q}q4N|3y#kw-ufMiL!}=fvv?lO6ZJx*cQ^v$>iFruv zqY|$|RiKsEcOQL9-$bU3UUkc_@Z(t7iEa*0279#At4Glq{SK7uisNTse8e{(LAC3) zG&4;_5LNqq-br?u$KdU}b{gKahIzZ?x7vy+o_gdI0E2RRnfh-rw1r#yRXjSwW+7siZ_fY3yi9*kXbIGsM1ECT zh1AB$FVd@@>gom`-%U<6OIh0O?CG4FxIWJ58OQed=V=?n7qegbk%1$9=f*^VJ9j@- zv1L55m{v`T`<WXB?+SfTZ4qG6D`9|Gjnr;yMp8{=Gb5a=SP@~#QdS8q~v?? z>5L-761f9}ShK@zY~#9kMf2471B)eXjnCrbjv9;qYuy|q9_2w=&1}Pbf0V%kP^Kf)y=R$VOtVYUcOd;XG@rju$z)#QgH^J=)we-7USEKO~DrQ4LeMo7k$# z_UL@MzBzzRXZPd(b!ql3Xf7Wxe`U7r8OYLok@Q~8oF`uKqteBer^cMsySqRc!PL{L zfG$IV#wRfPDInQtC?N)Bjwd&Eo}CrCyw&vhXRnct@na@b=4z+*CVA_xTh~Xcnmux< z;mwo701ljC4A*Vlp>Nk}DS(w$k8t?$e>ooqiJb(v=HjDl_36Z0Sia->nc<`#t^4g5 z#P!?G#`W-M=A4y+yBdL%2ztZL#q|Y-KG!fAft7GuF_9n(AUBrMF)+LC{Z)~~@+ z75t|6`&cR-`X4#GV+SZzO;VBjH#~M5pYX#C7KN=bz77sS+V^oS5GoSBpFjH(3{+tb zdze|kGQetF&>&{Ym~pPi-~>HOcbeVt(udrFFw1wB7N!xrcCVuduoO_og?Y zctz!Q_2P%4?b7XO`#I?MSILR3j=K~zEr+tDAFg-M?8|Vew`(uFfSMHV!fL#w#*ZoE zH;S)sVEQGt?oPChfUQdpNK-7c(lfk5&29$_lcJ zG~}4Wf+v^r*RoR!y4lk5>qX?6Jp1`LOY9mwrf*G|^%dh;|59YM9|gKpq5 z>`UMLE6CGgVuWFKa%=)u|Anjl6`7JYG8<}@&D&+$&JS`Vrx8wod)}00SeeMneI8#T znbRlMs~G&k7IF*6IS#D$Cag+;m$nU~*d|uXC;1?r|66snFB#YSczZW-g~ifceAH}{ zI-DF3C#DQU!QFC5c<0U?aw2M;K<;c zg6ac0<6_vjcNr*mDXr7<-XxajOcT!Ur)5|UDKYefo<3~VpkfH~6kc>}rs4Ck|Gh(h z&^fMwRAt+lExyyMR@ir*TJq*ybG0wBT(o~=QuFi*18_8-0S5{b`s*DSO^`mB;}$&BkBtBh}UlmH5tw8Mx7sD!tXX9?3ytOZco#1d?mG_bK+Dq zUP(cWUYDtuL(B{8+u-PRp8)65SoDNpLwiTZHBeqid43%_RWpZytA(5UOIg7U*2nUi z@sV7aCkM}4p!bD`Xm9OFOI^I}UxxI&;(!XmH%bKV0klCE>JE z2*QXz1oqpMj2~Z6v;Jn{9K9>RdCIXxzYNO~?LS|l{P9gs9FvVZ z2)?#igF99iyAA`^Lx>G9?n5)4{@qx^*?#rG1c%D)dj;-UVnO&%MEGlYQ#78n4>`)G z_kw3(+t=tf#S+P%=e|~4qkX;VflWKE4^ahNKM1bD%+!=S6A7R>apzX44&Nka0zo80!Q0y}o zGo1yrgrq|OcNrf9rlE|?%od<~tj@hzHOSA7;sE`2to}I-hA^;ev~n!8J{1em4|NZe zRsuKdvAVimc>^I54~3-UFfx+El^z^nH>>+%IGI6{h3)_{)lFa9WAIvREj@oleEzR$ z#*@!q9%*>hX00RG$c`OXa!RnbH6E_$*!7IO31cA+*KVDp7^kaOFXHPVTU>dFO?w;U zepAYByx!M-A44@X4H8j$?Wy!ZJEW}>b+&Ft%uLT{^VoOvVY6D2<5@X=>!WDq8+px_ zsy3hg4aB_g-dK>rV(KwvZ-lMjf_(-gaWs0janNY94X9|Gc0yL@CE2f93%+FY*mQ@IYxC4QIblpB#8^7~`ULnhr-73^7i73R8MwU6&y_YoGE zX5%xQ&m=zA*1kFs+47!<=oqM$u98#Vypy|SyaM2JYGaof>#h# zRa=$(9&RxYCd6PP9QpLA{kWj`Hn=PiDrea@>ssKjnjw6opq@7{V`m2hs(SL#y;c3P ze49lpHh!B+7*Rx+)c zG54{|tI2paXa{2o-L3TZ-pCU8C6u#&9wkOHzdzgkz4;&u0WS(cY4!`0VW9aRz#hwq zi;Ju69_;VWxi`!o5|u`o{B#IvMiggIkX4L7AHSjW~N|{VK-j zPf+5II6LEZX=}c)hmt=>(xblZ)*O!eo$WFC>O^r1S=Dx~(DJROR$fVbcT^3B7X^zK zZ;`UAz<8ZFu{%Zet{PH>_Yhm^I$7Wn9sF!?s0TW@Fi=*wMV>ET=rUEnMFt6lKqg zUNE7a12m{En0R4Sd}emCv}WYWtwyy{ow@CS4uc^&n?_Wayx z?NoTDi^6ie@ynOMuC6YWZ#lD(;$+VivQ-#ylffl;2EOy?O*1Q+%GiX7#7%K5PqMn+ zi9ge36zJU2CBJCjxUTdz)=T6ZpX5$=e9Ly_?c(rm%^bZVP_%MeW>Ht75&jINM5J-S zKK8J08CfRnk{X6|)IAWMab$7h;~tr0?qc1sG3&>M~dU8-&1aDR(ffs3?NGbfU#Xme`EFwOV&IvTFZV&aN3U4__U&yzj?MO+g?~1H&KDogKlA%{ zkFjf~N|vri=M_OKQ~h$!V(a=&yYcX>ZOL5eZ|4ZT%Hy_V@U8CED*`6#9$C+p7VdsG zRQ?k2DYWK{^96WoK#e3)`lAFp5Hws*yZWDQeSc{{qt}eLv+Re^)DP`y?C0Z`K3PR) z)9tqTKw3D`${Hv9_Kqy=msJ_|Imf~GV)HlhCcrTbdRH%{BMW%kE7bkpXxd_vPP z+8kFyo-?vAm`n~^pj-EoL=t6Tz ztbfYZHiqgb%@5_VFRcL`_HUQ~0q3}6+qR}kqGV9U^K2+_wh8@;f8d0C`yO;z5%Q<8 zOq%J{t6b9v8{tx0isaE~i|Z|3=(T$B7;GMo-kAEh_xBbRxpscNrMt<7I^z_%td?Di z|K=_T>kmoWS&-!%cpgQg*`+-&^M*Qtc>khnZ#S@+f?pFeMwq~{-vM9a`E)hG_}q&Y zv%j}4(*)75U$Xdl>L;B1d1-m~?^>%abO)f;vwYzNnu$I7M6`DbkLWL)cWcE1fA^PVk#Uo+AEHm^LOHE1Kg zk+FfEwPTAJI(4=;;UJtY2Ms8%W^xx*_dYqqWz*EQ*{esW2c&xOj8>rfz2L0jgNkPS zD0xM;YRiOCUoq^T`og(JaVdw*=9XaqjAEj6oKP}jqCmFY;OmheT1$MyPO z4D(KZQhNBPliTF%542PKmYD9Du-pAn!^+H`r4j6M>CH#1;{>mbY{>i)O8J_UVuk_k z_pkmsAHRI5#%XZ`MU@x6o_Hksq^EcgB+1M7XDA^k9;C)sf@b}-VY4AXrXt;A3sK3( ztaiKo)*0nLc!gFf^n}_;vTs7=#aS@4pO|>8{ieK0_+9)HYi_Y5=4z(;@)y;G`^&5G zd_D`fV-o?kWKj078(#-gjVBli8ke)8V6)f^_Rp3Bb&Who1=S z1c?PEJ7%Z(x!*JAp>p$qdmHh8zYh7t@2|3x$kY{=qzRSyf7+GDk1sVXyskbk|0QH%E5{hra{aoP=~08G#~!mVatBSQrk z@8HD{Ke)C_-`D(i(52v|WfJvglhoY`R-3{1IOYC~LwZA6--{VTxuY)SkAIS|ZF&MA z>iYGF0`V*`QsIm8du~qB<0dE-%x$OW=_8D10&92_T|yrP2b(s0!kQJDPH~Rw=Vk=H zgv#a{j*0ap<`t90-U#h$fK5mxt4Df+M@4wi!HIqoj>W|=tgHqQ^q+4dI$N^E0ptp7 zlJs%^C<|X2i_a0anK)lR3U*inB9md?uOi$7uwU=o^geZ=Q*)+o7Wci>K<}-|C;zbh zULq7vL6^0hOh>mSS0Z*xCp?$7AcRhCs+-zvG7bcK72YW%v; z_ssKV4WDc~bGDS2#;Uw%5VTrjxh&pVd@ZHz=sIr-#uyL{M4qxRZp(AqeCLAqm(df- z+t#zs(4%qb{O>hhfZDN0I`ZFpTZT?LQ{7!gw&GsdTUJ(gq^_L#BJigr zcBQ8k7WgO?;2)zwsPLv+PlVs@ADc&Kd6+(Y?Ya-_9iia@q%x=i7Mxe&<{-if>D|=x zmA*^exlbl;prAm(&PuuFZ8*n%dYYssYF{R}Q(~}PfzS4o*UgZ~KqaQ}^_-&T(?7)| zCNsZlV(zE*YM38vo2MNJsuSV%VgxJs>w_b=LC%EvQgx=N4G~@)XWmXVA)ZhlB{O4_ zW@n;LnOzuW(1~2+^Xe7&WkfGbmF}3myp;TR>;XOVgsi1*rM3zTmmOC=yG>WMrKSC_ zu{mU&k?S{ffuHoz_+?6_slUea!N@UU<)Z zf4F$B3V>B9(B94W2m}QLG&ev_9NIR0O=ebXrjsL8F-^@w^Q^4V6NTP(msiOJ&EDgo zWCqt#apXO=gC$ou$T0K{zKdbQ+3nvOmQ^`Jjfo1AC5I#*qM+%(+TA}1BMNw3X)sS zY$!9?0Pa4D+rCG~xs{N<9U+S{13M0g2}~<*kMU-NF8FD77BQ#(qmxV$qT`TYF8HON zvx`UiPKe=HdJ-im%rROomBGqq_xLQ_2OqAHMeFa8I?(@(LQ#jN_@Hr ztO$GE92ik3-n?0k!|)#2nvR2EMkGP=>_BM#m-WieIT$1k(^NR5(s)ay z`c;p-9LT-KsYoMaaa8o7)@PB3jQ{^RJ93$4);4_`?LQyr)^V6G>qh2dMfshW0BOb3 zht_7Mm2<=wrrCe44_0`d?078;fhv^7Ng0hS0ACUd^|xh;bG;LMG_0s`KN z@+Esu6rC;qEHKR=D-ems^1-9CE7zM-T4&vxEzhBx19jjcei~#K%9sJ|ELt}*e>QcJ ztNDoC!J>Wt1vNJA{k2)Y+$ZJI0s$5)2h+aHiZphV$UB%h>1ic4qTAy9@x1ZG;JT*f zDFaPT`-7Cp_@AY&>5791m2KAs#AQlLN_Y=7zPj-*AD%L)<40@`t;-tqd{yA~oNXlc zI>%}iYmx4;ONwT!w&w0I&LY1UMZu_SE9ErFN~VH$vsm0z<)|s zXWrHLQ}&H5-IBjv3zekDhGby7QYuK2c7%}SVY+f*{~ z3t0ZR{r{MH@3@}dHf;RU)YjIdv=bFYDrsobE(&d_M1wShwxXh`j5M`1h@@Sbq$#U3 zM1xdF_V2j9&vQSoUw?gXH+??u>wR74b)Lt0oW~K#D#-fy^=m;eKMM>$FoYM!ZXK?+ zI4u3pf?8#}nSuV$7}-G-|9LUl`^nYSWm9ukZvC8OIJBj~i(YHk(!$0~Zlkf8r8Q+Z zV7LFL?U~_rH)*m@q$^2HU!Eg&+`8sZR^1amtmNap~-Om+$5R&`y-`#*QCu<>x4gVGvMvc8K@(%z2anaRnV>-Q8j!(H# z;-UoO(owm7anGD~fye3T`&~GVhZrga1y5IorSqN9(v>?!n>Xe+w%ew1Ptlpr_Kv$h zywtzdv+(3)#^}q8o!dTy{0;iCyuXBQgc#PSU?iN+h5iM@c>QwzFTIOrnvDn3(jII$ zl;o`wq!7_7nSycIrfU^_(tA!PT8()-*>)I92q$xY|6SL8z4tt&`Nh9U>gfIcT#RM; zytA>BCN=_sf?_)!6bi1pg${lN6R%x<%-Q;+1gT5Enm%Zyx2-f?|G}eu_Pmw$XkN(a z6iSJs|MPR)8fw$=`M&FPubweKuID>KJ$+qFX04m1y@~x!t|0z=i=x4F_428g)D?c0 zb3=3HOX|LCFW1@sHgefEEI(CyJ>U zLMz((_%)?zb9EvLJ`6{W-4hF^T3ll#a zzdUC?zlkx-bnWKIX1_BG!kmg4RT2}t)YR6d1v7u%c79%$Ztdnx+lRfb zB*}(bzOK5zM&gfN-3ybnyyL^xzf!1QyqfhpPvz+16n5{FuavP->vfIY5Dk6ff;54@`^P_8rPgvSMvz9$&bp-O@FPMX<25cJh6LL`fWmrUEs-w>qgwT{g3<3 z)YcnNm3lpnm$2qtcW?S}@4_sNte)2u{FSq@ir!y5Z)wG;^1iM>Y zj*sjT7%rQfFllnz<@SnAyC7&+ruUJR3*#Gx|3!WA)SQWl3w0EJM#awBy!-Vfy~%$O z75-g-kuR(+VzwJWPA{%yD)N86P{%XW2vSIYizrW@V zZ+z6jPQ6rD%UZ1(dVWdW;QRc!lNS^^e=)RZ%CFaCh-`8mHdp6hr|ueU`C{_n?()DI z&(OCmVigCoGPkBAa$HdLpA!)i%e8u4b=)h`{Mr^4mV}jr7Lk1Ql!9H-vpXhrFCIJS z|58JO+GNF9_0JFa)A#R7uqoy-kA3|i({L`_KQB;5pe5Y}oPa@!9cX zng@0+Qqhid^Ha`6v(t?8Gckmv3uyWLI%HEW{xk4&X0Vg5-@v}}z0X%>5k1uz?lJv7LW<_l?r&5JqHi_g0@I^PbnM#KL3Olnt&~}7ROJOVD)DPZ5 z3WMI7fBSn6uMwRwUdym4MI)?_kH6l>L?KjuQN4T0fjva>dHDFV;|h^Hnp{ij4KzkR zXAS?^+gz-DkTlc4-y+MrmSIDbQ@%l?^u^k@bnJ4|TTH)%SQp5!PkN+}KP-Pe^5;H( zi|2(0BDAxWY`mk|~X2@YQj`EV{MmdY{5s--ozaM!=+XJ~iyVX_Q<#)6r}6;CM=#>->34c5)8Y$-54%qt5d#)FDgVKCJPb_{{#ErB*9_F|PUilztVvq^_DyI{W65$~_~`dYzhD+Nm=$ zGdD`CZuOrVqVj&iOm(KG=X!TN??vxzMixiCwJ&_4Ti2RBeQ@&rC@34j=a2F*(bZiG zq$=2BR8ja-_E{b4;!h2op!ox(=NKsLO}8fdtDycJ*lTWvdd7^GPo#&=_snhyycoAv_dRvi%x%pzjcmH~$5Ij%UCD?t zI?AbY*U);L7?4oB`ILcNnN0Sgt3IhR*L*^EOd7vCk*`jK7(8TojJ`)&owK5xUQ+*k z=Ia%^REy+m*Z#9uN5hBsCxHqGhK?DWTPNkyWE9cazN-Z( zirR>Ym(S>7l|@I5<2rkbkML z>vmqAdceMXeQFvSbDw-oA9-=h)6XdhcM{yk>K+z$X#_3r`Mh+>UU$1fr-2^1Ggh0N z(si$E_1lZyS=-*-d6=Pj&ORXS%HB=R}!OyS2>oyCm(T;ab;dnpZE@vc3Osz zG2K`Go)I_qKW_Y|8glx@L%BEewYd(BNvl(GYT!;^P}O4nIOwsRhs{kng7>%`ERN`N zZl8hu)Xj%=vP`>o?^ZfC%<{$}$Uf(ZEA>SO?)0y-;^y&>L&q0-$Lv`e=Z+LyeDHp& z#bAyubK8x0txq>znJL*YoMY)(f9#I);@Z&fJ&WJ%0&BJYD0c{$E2ktToeKSPg>H;W zk7a!r%^5cM5m|Ybxw>}mMN2%}qR0mz8>hq6=g*g+IWYzNHfR3JlKuvrZ1l0563YHk+ig%WX2k(} zj2aiJQgT1X4fPzsu7QR$JJ9YGbxm*n3{`*Gz5B|jLc|jM-tMDU(qi)xJs7(n@-hxx$^Deb$751T0#8=;elt2$KJ=ZU5B|Oo55=>g zJBI~9S89hVBXs;kt36ZGi2plu{lw7s-hU61Wp8FP($gKso64z5i7jYP`S>QegH?waj>77|+DWF7)Pq9K7L!Q>`D#rz{&<(x0It6Te5aqM4y0QDHhLXN=)B1YXql*;|6~tcs z*XK*e80*28#h``2b}wnqT8SfIQ@M{c2(KnCs}v6%qJ8mLj`u0o+XE~VNR_6AI3=kk zB`Y%Q-Me@3TWL9mza$f@pFrsG_Hh0VN5d~8`V@U54%yY{Tmx`ekO;|FWa%NrjbJXE?t_rlvYMD5o>2o}w6 zehnR8C!|e|yPd*>gL`b=`?t}A1gvNERBHNJJ>RS_xgZC5@yDQM^_LyoVLrH-m8Erj zo7 zrjhQ7IeU9L>nR%JrMmG)pERF+%LhJJb#A=luJwZ6;+_>dW%=`hDcbo- zKffg>_7fMrHU*YXWA%^PMxcU}MCrrCrGL&KrpZlNde~Qt#{~EiglH9obfCD{XPB`L zvH|%T^}&gP&n#s%t#mK1J&@)lCkO8~lh6KUoJs<$WrrW7!M&*S`SUdJhz!eYjLU3N z$MFtaU0jH_Mc%Nd?!Gf$+%}FYP-S8Cojd4+ZTor8>T9(tGe#l)ne6gG#z$8<*G%3F zoEs~7B>wrTUT(IcO9y+2Bjdcde0;IYh*k(|=G=}urs!r58SVnZA_>GznN6FFrDm^2 zqu0#o-NyBWQOv(lxyvy=I=IEY(He4M3 zU_z5a(m%L)Gs-GS1re{5x;9n^C6NW;gwjuCvq;TUi!Ot5Z*jTWK{xKlS(F_v6}aS} z0VNzX^j#$SNX-0Wj{Bik9C&)9Ew=3>~d$)rZdDzMey==5PB=uBIU_9l$ISFylG zZ)~{iK;_K$UoL4Y%>5YYU?J$NZC})*A|w0YYnN|R)Qwx!2z7rhG@i^(pT0jc%M1w; z`}$yWcwAq+F|=iVRUQ=9IptFQ-v`x2&6jzf`Al=fcuVhpOD(@ZX z;q9991xk-i%!s9oEc<;XKh4??1)0<=O7XTI4rDg*V3xN4a#yZ?OUT54C9QI%y_ zD=weiy;+w1b{Jn;ww4b4?AJ3Pa3sVY0C~UYu6lP1JP@$KV+ETy{KU%>FN(bsxxc}< zj>8ng3Q4sBvq-+A(vC8o5trxx6U*Bc(sU)Uh~uWlSv#repWu@vS`-b%F6GD-4tol0 z58?CGGhIjBvs_iE^~5KdTaO7g3MD4<&QKZzN^N!L@a3v7t=rwcpT~9)yPt;-A8}AD zwp(+$g)KgK_w<5XRh`^Jk&o1hxqOqtk)uq)wWqS6{AG6H#GRq?B)kl?%7|IcHANS_ z*m8)3Ltb!`U4>&<@7LhptBT6UU#0}^$n?=#PSg3fyf!9ax+tjRJsi=q@A_?F1$}cP zU5^Dr>y>tjEpyTWCk-|Nkckd)jh?OG(@F~ zu=|Psnc>&MIVdEhkzk>!YIih9eVYP1$38fWz`hyEm9y0!(gJ>ehe=8C+nR>H_nE16 zbV@=yH{W|~zpoC)WR)N3N@>8#+u-;8l+;*)RB3cw?V)v?tdsRYTem9bfWRe3&V3{5xR#5VK7K5DW89J7S3kM{lkf-mulDl5Mv@M8!h)L(= z`5AqtlXOl6?>5K&bybVm_M!0Xhn1Af%sY3NH#0-o+O_Qqcbjj@QHmbruyDz(g+r^5 z!?|iBe7N>hEPMkEp$1G#tWMlPs)5T<$(O1T&uSu;uk1M_f}-Nu?(-Vc)6=u+4jKQd z;Nk6TYxCj6U3(=3h+z>4d&oM?Re!js_}6&fzWmSysy12M7Qe28+Orbe_)l_SG*>@< z1|QBGh-yx93oRWF)Q)?XZ?jXJt}V_f#);qab@pb^!F50QXQZX+!H3})F1-s7a3Jht@i-TOVLsQQh6{DNFB zGLfFtXfM>nLEU%50&{ue87RJPLcV{6oHQ7uLz;o(# zG_F(s_uZO$w{u`MrZ3cC4t`*4dC=;jD5~0ij7#_zW+<==sGTbv_f}n<{dL$@V!!(X z1dgmQt^BR4Gs(mrqWa;^pfBp9TPZG~>H1qVH*8~3WYIy3KQLEK93yt%@?>Gxu&+nSa-^*#FfmY~1I9WBW zQtsEQu*w5dyK(QMF(#Gf5zu=h2<}ntHa|HW%R!O-$&KBR*eTriXnR`) zOJ%+7%RV!kE?OrI1E*Y(gHi`!Cs;Q2X7Vg(?p8pSBVJaoN?OVCJWbyjaUelL_ZZzo z+`DQw6~Fa)i(Ib~km_5YYdbXj%?=qWInqs`>Fm*0q=LF)H|@|0Va}BEk~`IK#uf8s zR^|4)BL14dYcvjkRbq>+x$qeqT#JiGdK*R}uN5-X^O zIgq-DrKe>T5j-PEtr?=6S<@giafUrdWX;92e6J)Xr|TcCii};A(rad?_<7Hm+zMG{ zgfGVMxZ3>ItrlD`Oaz-rc32tAb{^Y<2j?Gun1L!l*HBB!s-C*2-Lj2-NG!dKfNbZ` zKnluytn}Piz1pW2mAQw`srf&KCUBAMRJ&`DSzj=X0!xhVA^O51ZLPH1x4)wKnNlM+ zq*EyeUp4K@2WRSjFQH&-(8UTnvR{5&4xbD#iZbQkXU}y&ZzqS5#?fsXG=W zxa+eu4Go7mGQ&bt)&DY{u%G!IFxkdf{K5J%w;NN7wp9aT;fUdS24+n}E5Ks80DUg* z&kBY}oJC-uN>Kf@E)vF(TU_n?tGMMaYp!y(+4{MfKMimA@m{b#K^Qd7&Vhj>3{@69 zQ13Cuv_{acK(1EBHu}5PYP_9i*|*ufSehJtejPn>DgSSEi4f}UC&8z?`ywKCS6fTu zs+;=6#drDA38geLay&ydK`ynvQ_&_p%P8sd%%t6+KBD?mp9SMm9(`A|T5{fs+?i`T zc#*R7EpTh4LN-vY*j`^w+?)Uhg<4a2ZYT@!eGuiwH@A$m#3DH; za$e<&mKml6Ctnh7N+h{sQ$Ev+DW9$f5#<%yC&i5erGqY6oeQEk>sMgo|2VyvkHC8c z=?#(!MBI%DQ^c+UMTw_Ev+k|Lt5@|!Z-r>Hw3>x#YmKlr8JML_F=|>;SyahYdp?gt zwP^i*E21?lh!o}^Gr6R03Mmo-BI4J|4JV{Pln1VH5|Ew%LYRxhE6rAl-xt&gQHWZ> zq-^;5vEmVaKBzqGQGYgw49EWG;dN7u_-8*cf@A2BBi=x7x=NRN@_Qvy5Ot*%$;h6cey()1SICf8f}Bbe z29Sa<{v3354FW{tzrSibAMWHh*2c;8g#Cn}{oS9**TbE{l%2b}p2lwXdXe=&SU!Im zh=&pcs3wClZ`{1;F;*9pf)tk=NVl?UjCYo9XHPD0H_%(0GG_;Ry6h2S-!Mp|&Xm1g z^koIe*L6dix9jO>yoyVL0#)Rmu45)U`~>o5N<}C`zdnsYf_GQ_)o;joI|m2vzL`a~ z$)917GweBw!+8%{NIzjCP~=f^JI{=XHN3@6D@4j(LA5ke;o+g-KONRQ57#&yZJ}n5 z4v)LW&-iyERn@)fJlso4E*O`oKl8xkkVR*wl?1jJ>_p;#s~;+!2ebdEg)}!e%b}enDWhFV_u*PEzS!*%HY4xRT3ztAB-GT@kW7-- zi{1{sa_BDqId0|SFRsKLNRy;|?W4reOJH*U=kCxqftjewW*`W|?*G8R(^Iw#WfD|W zW1aYlZOR1b)~p$XXUoOXMvPn#Kd%f}Re=%fFYsZ{ZCCt$GZ3GP;I$U)Z~9FYk)a=6 zV1;(oo+(L57OU5{bezX@asesJI!?BYOh>JalYrU@ul$p_ zL5Lv&zsDRW;{z=Y$i(~z75%6)t;C&bwIzI!$G~>KA*J(C*$$W*nN;0h!8#C+OBl4& zi~qQ!1+Pl-tvv&WM552so^g|xJv#2o%5X;WkV67rLiRO(&jIXLmaUSA{Ti54PlS*W zRTdgyeUN+l_ocLC*pt|rWgNWD-2U#CXiaJn!!jk3UDVzr*DZbqSx&IbYozlWtqO3Y zvZ;S3B?(_C6d;L^FHq zM%e4<<6_SSPBRDz{X*S&URUQ67BzOGg=rkV^|ws6{GrztXJAa)ajYuE#!BQ(WFO;U zww43U0r@R<<_AVrwyX?2Ja+V&k_RVj!<)y$k92if@oqoy#z3ee)zi2VnH&P5C5pGN z0^6V&e*pnh|9-;#HvW@saYq>b8I9%e$ghiRN-R}0zHf5>9thaoU0pIO=ir3x@${PV z5LkZHnn;^+h%C3`o5mt6N~JU1LwFW4cJvppxKu3hZ>9Q4l_j8Vs>ehZzhQ^ThvatP z0!pxjD0XPn!2hG{*$0j{IT2AG$fbe0RSyvfgl^E)XRV|%lD1*qwyL5c3ktsb%YQU< zq0UIuLPlHw3~Jrq+n1LdAiF|$nNiYZn~TK(jhiVd@i5VR6{A$sd zIW2qLlAI3iC~?^=%m~;nqB7UE#e}^|yqsh7qJZ{|&p(_354BK|QGSwLs$Z^6i3i}`cX(y$N0n0}ZAA{H{g#n#JQVzsWq2HCVAvzgO@87S+e}e}PLl52(*Looe%-}B5{rI1Q@U!ZyzP|~Te~4*jg)q-EiAgbbZMyvi zSg|$#*vS23*t1<(IW;g-KDB3fho~T*tLv#qylD6sy@H3!)0=8n=^NCp%xy15CFh{R zUshpu#eAEXb2y*V^|$gOLUf|{skf)4>aN$BN%=(Y#LuuHqGmyee>kW?Y~tmeNSlT- zcQ81=LYH#@_mhmWvh`etiQet*ESr)dTo~L!LWn|W6GGNQj~G%3d#t#@Wr!F!S=}|+ z*UYoWICGJPV&6GGFR2wqw5&UcuSM=4j|7CTHh&itCUnRzo1pI2kPoTqH!%tjL<omPTYd+oVDwL_18ZGdfo2gD0Vd}fLY2aM-2 zH&k?F?!%i$0hiko1dWZjBxK~cQHijKWg2f`a1x1X3~vf89w{_|lSjl@z-3rbB%&Ja z{&euIS)aSoy|ceg&-LZgU^6jYFL*S{*5uQ;CRU`BHfg(QmYal$%4lhbNdVhv)1 z-EqjewG{wPiRB&z7KhW>4}8KMa}4BL1{b_ld-o$via$f+d;i+d6cZzh`&OL4*fy2c z+0nM>v72bl#N9R=J7gnduC*9;jwx~P^X-X=S2^(25&PT;}|xEe-12v_RVz|=;=kr*xWf}h_%c=&7~NyaEPd)c`0M-<)i!<=yTHPdhrBx z%Tz1Z`>@5ekvwrfIh7gCM<}dq`?ZLKC?oxP-y%orEK1j$hdYc+O$&H7*_h#|GEm^| zJb>$P2Ejci&tX0CU1GT#e0p9_uJy{!j(*Lw{HK)snXarWYx@*KC8@29W%jZK4wo5Y z*AeG0jt<|i7*aK|(ZhZv>j4jA(X=BZ8o-4YgYfmVCRb%L0r_+ER3RIbHTm zh#I0VX>3Tjs~+E>;A3u zwiJKE)Y1UP2!Vd<4Pp2cFh}J%=H5`K!RMeaKY$1A8he~cX&#QL8Xim!6cj1d*x?!= z^Ih`=P0L;x`$n$P)$eO}V8K)0u z;Uy$-8@umJqQtj@`ZN$t_E+ESj9T`vCq!H+F9$8XcDMM!XCcw9@G(uQR)B z8cQ#D@T-0w@B)cftanVwbppBpkHluhp8+f!9Nh+HR~Eek18psVRvm(>v51DodgL4W zAtCAzRJ*YHYpLesKQ{88Df%*fh00MM?y56K)lm*htIWf zZBES1F+oHCh9%kPL&M&)?@K%otCVQu#pw4tq8W0aF3>l&e9*HR9a?6HJo-TS6LY3B zW<5Dwy}e|Vw&LW7$;Z`WYX*`BvMa188lkmi0`4qL%%N*2x;wX7(!|jD@Hgpd`WjK) zpc=~Xe4+9p%iGc6E91uq^oc;3OWSsL2UIKky?(37JN9Gc2g2$xK)fJ55?1e z8y)TU?i2a?`RxXD1=~aZMw7mtB`siJCr<|@D~(8&kjK$PPm9r zDI?}H01RnqX+@-^88BmXA;VU8!O?0j!N$ONbHW|EI(^kaykAs~CGh*zP-ffDgK>#a*-F;w%)b+8l!ob*g$?L3RzDE1^WNM?(Ht$fkZ8dFfvV=m z*BYjZemU-bCT?{(O2K#^rcb{vJQsx4qb{)K<|?m=de&F4BcwSIBd;hpi^jGKu`UMjwqhbym`3o z3HTS?2h>4gpLq8!5(SVWlzFF3O#e^+L@ZYyR}_l%MA%9|2>|nu>(*lu&tR{~9&ID) zq@?64nb#6N#(7;?X)Kq{bGy7-c}Gdv*XQP*-D}pkJt)7D)6K@M z(Cr{AsCquWK4CDd{P^)B+@029Szf?8r?;049vBssl`>%i=vhSf!Y=6o%o!#TccA9C zX~`d}m}05M4w|DW6mw=@!d1uR6|qqXS@5BQMnKcGFG zLoFmC#1gvy`rT6upN=K@EUpc#V3f0ZVBN>--dw@*=FMo|Si!DWKkr3Bq7<3;*8$hG zhK28d4AB>D#iag~8#m&}QNk%BJAUqYS;_vhn5XEk3pz<$odmagHK7;ei)(>Q>q)T* zx9q;UMbsgmxWj=t04JMTtQvsNT=ioM)S#HLIyL60Wd zX?)^6{o4fL{%jY0B&?uutoI)BhQ?(&gsb7=9*5d-u0ovl#8_P{{*yQ_5swReJNkft z?^k;fDw{Aa$G(1j0s?#UlP4^2($hk{5R56jsGK?*#f(XKvS>m8)(j98?4Jy_8`|Co zqoNSg88RE_KKNcWaID+0{XD=;m4F4IoZMVr$vKvsUi}I4H)8A@d}&mlyJ@zBzOrX6 z%jNY6uQ2;Ce04qh&$|K)^5>|VB&*ECH-)YVooisq;~6Nm&sDX1;2yud>{Sy;<>(~I zop$O0*P|bk_T&U($LgXj=Wi|)zwXWB|8W6$(lC*Cs6LnnM2uE=)cH)m;yF~~N40iA zLsQFMYa+-X8 zsrAQzwakc_;<%G{rFX@B{3Rt`P)QGM&F(A(WnjhoPZV^BD902 zzj#Cp96UFZ(NHo3%kd{b>2Lj4`J@fv>oRjo@6cM_3~Se-slNI1NBC|!+ScbK^f5vV zF0MS0x_(8W8+EC+B+~5K$StmZ{)F%$;l4a`u6ypUs1euo2XF5K;wP-Yk~^g)zl#J* zxQ|r^eQ_fn<>Tk4jW-6L5?a)}^>adkf|szbre-R0Rf3nLCtaqr_KZJKk$%Ht_NXY^ zcZi`~-;yF37{t?ccl$0z&5cbRUmQ17NY@;s46vuP8!36dVmSP}HVgZ~edLaCX<6B~ z)91^@;4lS7McBiKJ28L5CMI^+&YE>?wOu@NHc?qwCQ!*#_|I}axHB3q>u|uQ`}MNp z=z+qLlI+S6hMTKLPg@!@yj?k}KL2DL#UNVYj?s9tWTn}txz=^5d*6A7<@)X!TCN8E z%0f?^xR+qe?W=#!5jWgItM8IcucW6l829W~Q_9x|Z>rOZia1XtCWgUQPW{~Pn#F(5 z5};kKnQtMwZ5tP^EAR>X+?5TU8bsNZ>FL?fBim0*{!$ecdN1-x+!M~(CSRc^oBtil zuDE}nzQebovWlvF+{wj>Cf|Y)p3T<5WcCa z^&(28OqrhT*uFJ9wo(yz?Sw@x{f*3pq!PF&js?$eR&wvl8Y;;+2MaBdVWe+8!UUIR zhlO9~gb8f}Y#0s!0j7X}0JwB=qw%|Gr51c=V%>)<5xxlA#rw+>;EO?04y?{#>>cZy zIGm^Eh8WQ#S3wi7D6Z7ml9NUUTs~BmP98fcPp_3J%q%%TC5^->NP&oK-+tf6{Mnzj zUx6vB43LCFi4~ai<6Zvzlg&??@%ElP8UHxLvQB>;E`VGZ6~Sjt6JN$0EdxHmtH(E3 z0ciR!LSc%TJVFCRKkEfAY}yFLqNqo$5Zflv8A9fmVHMrEi(h6|#=zJ(0#0W(CAv0x z&(9AiC@O~y7$}U}+S#={Z|7avzEV-<#w;i(2$wqy|I^`?j0CF(NN4kxx(07+E7-&I z-}A5}f&kZdc&FJ3M~H(O4#i(G%!`b05&cT1B?r%~oEDr{ZX~f(+p$`QG3|UQe>s2O z)4k1`f)>@+svT5QdAYN>xi{O#_XfZ|b#?Xeg@qG7f9|h?^fnex4x-Fq_+^uTcq*!^ zb-_4QfOE#FnLa9^4xU?A)(0-XV}zbcIFUC19#wPxpT>gJn~wT5-><;_ueDH)RGr^UI# z?a_*I$mh%ZeQz4iZ@^j_7?@~kS1o2zHzhxj>T{>{7R{5WkYhF$G{)1cIkQIPwOZ@L z+HD^{eKIex*$hv#93sfQ(%4PrwVa%t!%@V=CS^*0`DO8o__mXuqFOoox^xhfjD#NgelTJr+{M>;18Lc)J^g*k5ihzVVQ-kL0}799y4{^eE@ZYbRItYk|<4$eZF+(A`Q%#MF0w|Q1z`A%ny0Il9ma6C`5M0Xj`0;(9 z7hkoz$@B~(jk*-+ZQDQyJf)3lN`{;16^ypsJ-W3rVdG7HWR+kzgb&d}td}4Bh8HfG zFy%hem;Dvojl}BYOjOe5kc!T;$$f$uyD-w;@$Ao`BTx@7FF`&K9tt3!CKAYVrRKmCkz_{B!Me_~D67nH(!1?S8;3zq$2!bMGP98;7m6Jk#UsQB7T1H9k zK~}n?aSS+RG~C(vv3JH3F9`zF0($NmRK)_wqw5E)~!-3Ul&Q6gs9h4M@h zk9RRHF2#GW&`=6rv?xrhuEBtU^nNT#_UD70kc9wqB`S*U=B_g~ zp8m3QxP53tv9lzqWmSor!$$Zto3A_3g&x6wKN(DfHq1BfAnsrtQ( zsp&R+f;Rzh0pbtYL&YiAQ5^rooMI7D4ZPFXDHSr{Nj3z^rdt*T0WiwJsB$g{J+qnz zM>)|GM?VIxNrs?)%f#bfqwy+@RfeA!G1W<|4oSdHMc0V@dB*kYTphmeK7TgFuP;l9 z-gTIB{dyCY);_3*#Vx-K%I`r4~&z4BPNKcM%)2mgtrba^Y z72O2_{1#a!CZ-d#4uQGr?b};;ad=_^u#@)^5>hub*TrrQj>Wf+FO!ky&*F<(lvsMi zT)HGiK~Rgms8@r{3fGNX?d8WBN*5-A#5 zzVOK_>kK_YZcsd$iA{tC|ITemLba5w=zNLO^B$FB9b66SD3mgEhv8#WgS~z3yB^=fyO*2s{ zvk(_oIMB+R)HKn_#?C?Pe~eR^XQL~{&H=&r3e2#PPeyfZCYy>NKvtR_jb$azp+cX5 z_!tGBam^blzSQ^&;Eg7(vUT?Ya^~RUi-A|EC~j{cU*76hV-~^7{Ld>BEXkv{&PJoF z#S;{NCrDA{D;QT3lat{fvh*}(JG7Fd9AY~V7nlGIW~;Q$UJq85J$B-fr<>4mW)~Jd zZuZ^6+!ih*GeA7gH5=(^K1-nhiCV@_aR?tp;V?iB}VOCB7PP`Boqelm+;TS zW8hvF0qfTs>^Y2T#CqLR(!{DQLDo$SNgfV`K2ohbo1y`yBS)gpMr6ZIO|s)LU;6(2 zLS>~Q_QqzXa$hukJ#DbPx5UZ zyn$zN4mh8S-@ZLYndRv0ynO2<-q0c>z$Vek3WVx*1+e^x>*}?^-(eHi&vA5ut>bzMr9A^ zs+{|+5*{8tjtU-^s`ZcWdbdvzOU(mlB9W9GQM70{v7duvVIbVX5?L|H!g%-uGSSwldhA(UjPIw<$Ytr0IZEbCi$Pwv}9-@SzSaJlGRul9^ z62X5B4oc~PN@@fXUGy^ux|WxhhgBF8-AG19K%8#JS!e03F|)zd^*`kew6>G%ZW?Jp zpv)H#k94XL*yV6x()LVsm1Q7JbBMEC1ZiA%`xdLM2$5vc6paH8rWH7%)?%g{RB2 znXc|sLtE;!xs z;)3gdn-y^y#zkc4>2Ggrds-p#0`thO4*!RQ=lUMFQD6kPD?Ct_IqEPfb#u-Ft<%Y5`xEE{5*4S`vHG5{ZXG_xmU29n$ z&uRf^TI0!pw#F4UpF!oggif9_Vh6mj!OU+YmrOR&gq-Q@P3>@3MPm%IE+(GV;#x3s zMqsNs`GE~^3G@E2g1kI#wiZC=mm#AInPOPW7W9qxK?{Lt+fopqWl~lk4mjHK5)*73 zB8U0yMLEcp!_WpJPSn_h5h%`a3n^j;5j$WDda=V$@W8V~!@~kzk_SBf#|&&)Stve$ zS)sYZv96J02t#&0N*0UuL)Bma;G436hXm{ znzI!*h%ZtISi8gZH@`277#&|xTX)2Wfa(g)Z45XPr4EhjVTp_TP=eSbqIG=O<1~#) zx&qa~`(9dJUZp0y7G3|pWo3$@#{Kpf-=Pvw(tPm#y?bqFCi#5m6@GGk$66xu1~g=1 ze*O~Tw=j4BIq#(;VGi4b3}6W*780UJjQml9AlC%+&B0I6<>=81fZ|IJJ>*1|t&7?i zCYjWzmJuo@pXaymqbbUXtj zs1@PB=ljCpC)bpj5go`}ujlj9SeP|%|Chq=>nEkK-sSc2GL|4N`DWK)UPJ)HP{byg zeZvO%YSmO?UQX_8^5(F_q}-@B+DhMspxc+LzZUO!4NBpZcxIl+@Nn|goFQ+DV-$)( zuiw9aFGAO?xvPs2DaC(98F~;S@#Q)ZH))+14asU>f$%Eqfr0yxv~Lc#Lx{5ol+r%H<~cW zNp$f+UpY^imf1`}O6@Ve5mn{~MX0;Ng15NO+6S;1qZGLF>dX_g9nSON|wqV_U)Wrz-9Xy@%dhZq;Y{9+uxbA)XjATPSPe#^uZ}aFrTu6E zhKLaWRfyag458=cHjw`Ne?OKU4*`@w2$ZDE_4|sCDG8us%1j9UWZ&T#Sp<|Aup&_p z9z3u=703nS$z}{n;+1(VZpwKqA}_xdmjO^Je9wC(hv*)6bWFj~jHt;GDMjoDos!`e z5Z8Pz5P2a4R;jt}7W_gdjP$`}M-_~!3rPAKPj6J+wM%&PQ2^V=+ZKYT%bDEwjU>wv9oky@UBxo$X>BWf+g)g**h zG{f>IrdQ)RLxhxURZhOj9HHVtXDLmkrp!dE+R!zHApWALvL ze;L84#4_&MwF{2-u%*t&U5tEr4VErR?eY?_*P->>~FZdHL*7VPOpBk2Ea0 zH60vofs#4?@nh*5)l)NzZ?@&&ihGLiNfadkOA@uCXEz?FU%lD^+8N63DFpUvyRD@f z-A|t$L9P1{+z7OhSy))o!7al}AP@enIIj&no^J2PKke8S*shmrTZ0;27F$B?b6Dp^D1?!IUvV55(UGW%!2-36H&nFbcvapDQ)G=c!XIb4d> z{B{_{FlGcqF`fy_3I7XUw9#cFBp|qxZGbJeec5_raXwltc3Q2#>CM3La5Vj3i+SV5 zjUi4Q40)qbO61uvCeROkOeBuYINkjtBjtBhUfuI(O_8x&MU6NAF@0_kbZG_P#W;bT zaKaek)z{Uf1IUb5zy(f(kB~1HlvD8kafl9c{p9D2Y0!{ZJJb@7q3u+blw6LaNZj!$XFY z4>(B(U7^Im1Mz)0*l>ULdvqRx!};lKmSn(ZscJ%HRLkw*woSvC~BuS~itq zgP24(=3bAmQXrY5YaQTQcPtTy0#2;k#hQ`LNU`}ICZv(dnb3gM+ya>DK`4A`& zp|X6?r6gRIi-iLD^a*4+5+Wkw)%&7{qu@mhu%-)X=MU(&Zw_{-1EDF02#LYj4^xrL zv9VqgKT=atfId7$-z+vJ2C4B4Fs{LxgRf^3RPb?=k|sAQcmO%zZWOC|X~kn>ysYuf z1^FEJ5ne2wFt%2Q>+glVk~;hMUqv|H2KgWC_BW{HNyi+b1$#5qA3nb<#mPc~i%1Jw4l0Lck5?@L_k{Vy!PL6vQ2Vj_u+Xfk&2B5lNfySh9cAS(C} zJ*WqWMg5Sli8AsI0+^8z7wqlal9C>Pa~T?EYmJf#tL~oX@I~Y-Tfy>9{dl*5JSeP% zkrc7>@;-Mw$_TlJMKEBhPJS>!C$|@r4ZzdrXI{i7p}^MwAfOelk;k~(x0sY@fnN7`WMmz{7To(LgCDcg@6{!8?-TEBwHqC9mmzsI!sJOHpx86*sMga}d^e(iKR^32AH!t0 znyY|*@aP`ejdD61J$gSBp_m6LSn$a_XlTfYvktugW?%zI|C`&2cl4|^G&S9y=7PL? z5|=*kTc|P8W(oa<=L~61qaseg)VPy}N6`(X?@#*w#|3B>Pwpb%9Uv)JVEuUC4JOa3 zMGHNVb^JOFgax<}K{!cZ$M0Ck|1O{0#iw>!4paWL^z;M3G^ut*#8Fkn`)#yhN7Z@inHrs^v+7dujw?b-JZ_qdSisTjoFZIEht zrCLv4UhL3{MIi5SN8PTzyht|gsmL5sr{pOzIX?~2Lae!NlGFh8cr~f zGA;xTUc|M~s%Gfck>3-_L6WMw@9 z{tj6S)LhFzl#1(i=wVC=FoTVxQ1KSRl{PetT|W2x`E!yV1IX|?ejI1MxxJkplbMQB z3yqo2%bie(D#2h#@0TsQofz>uio-yt1Jy$QpGuz6>L4RW6-y+0Amyyc^@z>t+mThg z=hfG5|F%O0Akjd4j?FkQ8t;?XAUYjAN>qm(3QbMVN@9N-8;i-v7-sB&T#h6*bo2sdZ_Sj|oH*Ve>79Kc>cRm3$ z5L)ZpxZ!Y}&ps~`1h`D_3qa@-MVGx%g9196z%X@LZp<-#ApJ=1B`{)-;*fsOOc8W- zM5QWV0r;IDQ96Jq6>zfytcez+cVrRQtX-dn{M_Bc1IpeIpVgoU2ne8DcR6;fWH0iJ z(29Ha_8dI;sMlrxgLR)qd|;wUY*~os&Rj|PoXXrQ^XrWCp-A=tKewR<6m-pf96bj} zmMjDYoNgkl6{-J_DQpKa|KEE6YVrefO+PSYAz;-Q1^?=SfdOI+s7=4tQ{Xq~=;alck-?7~5F{eU6DJY?&@NX$e)USg(sFSB z?Y7)L1&&m^ob%R zn*Y7}zXbmnq~}wR2t%=o^geIx{Le9)Kom9AY$>*lh}ub+b!Ch7K) zdIvm;TfuMfyvaBK+S=5JyWJK%)+2YTs#3lW4-U5CNkNm6+q@aaKjhu~{(Rr}$v>4z z4+S{-wH@BQ$Qb5A+-#2*U!sjTw50b{%E&0%D_}Khld4kqsyJB4 z$^&%I=;&ye8@sr>$0R2He>`1xJlAa-RZ2rBDWjq&vSpMlJ1d(~A*)D{l1)WPB{H)~ zWM;2IT9gqA6(VIt8QJ?ichB>@|Gb~4-qP>){oeOA&NQ1$Q!mEo^zH z@7%iw=P#lwxq+#9ku&dm0m~V>h-+`#y7d)70DwY{14RH=4Pq`$DvJxDnUMgOSTeZ^ zMUz|4@oB7^fcSp@4tq{6F5?ABC@4^0f0JkCL^TE0kc8se+Kr&Z?9^`EZ2LCjvmgfD zMOnjA80CwP*^xB@jhNg17=G=7*4mO=@P>}Ok?Ef^@v>p zhJXjDiv4(ikB4Xn0x(;mNft%EkZ=057ixx$D9L55IZJyp~zgKH{& zHnDjapPJf-Rn=h6QIIe|VZ~B!pY{E_1yp1=;^SGN+L$`n59XDCP52i<=TPGtruwWb z57B0-;5*kLJVk-DgnUL-U%$ZUUMTzrv0)_t{T0IvsTnx{CxYwxCG1t?IFY!vKS^p8V7##29FFKb4v(D(V`e`WK2BYdF+R>Q%Irb8oJ&m*;|R9>eem zq-rl=NgIGGjd;tCNB_OA?+uvov)z?4gu+H?VPIqg?Nm}{MhGRgQIPu(9-dMj9~Gsh ztgKwLBpb`;DsF3TWi|P^1EfoOYQojsX%VR9uuvGy%|)D5fs>_&ahrggTU1?Lh0{sq z1aWj)cV#51faiSK)fJDy8;A;0M;uvsk?imZ@*zUEX^hV<7FW9dH%F}Lc@C*1Gj^w= zntajN7z79|Q|gfkN4Wa&TysMBphmfgL}OA23H9k$q;n@gFnY(Yr)Araz{$(myZ4dl zlQqHWWak}OxRj`~|5(1&2C{<5H)g7Tc(@M8YPfY;OY_^ZtgO4ZZK~=*hF)=DVM@o3 zGmrHeZYKM8Z9h^0`zfk_v;?T2;i2*!anxjZR$?Qcnu1%budiaA3}u)bwG^KiW|8c$$5l?3mTJ{w~*E0h$v95&>%~ZER5g}uMv|UKak{4o10&~ zc5M}sGPn$x>2nzBL=b$#!_ZTdq_ZC?I-@5#6=V36-Rqc zp_s-`sX}ebBaLHC+fQebGX zM^cgnfE*T#--RzIV4HpfF=XawL;@fNqzlD5)J;r6iKbZ$*rBrv7j6J4HzU$vvJn>p z6)qHan^01b3MmCjnIYQY8$eL+0V@*5VL;_}TyR}7;HR*6H~s5`4EM3)zpt*_a4Tcm zW+;PoO^r_F1k!5~-tE;ZU(g(X0ENl@S>l=^rN4TG)|kxEQ(R2w6^Q~J>v1uc(o#3j zmnp!@dk3BgQ&(pPa*Rwtz(%Oeidw0F_&|+o zX=8H}3SE={@YpaveOfnrL;j!^`+B-Zsi{EN9(IC4P)EjgcXubX@}WbA;3)aCH8awc zW=nhq)Ivb0(@m#6PCz7KYHI4|@Bb0lbWt_?zp&2wm1JO{C}=LCT_DK#vuDqqDrSh` z3!jEe2!_xn-A?H0Zoy4l zPY-bk*&p-x@tKMvBQjceC*S0qP*&X_?4_V!PGm>am;zvCa2%(>3PWyi3;LQTFS1)Q zv<$7gGw3%Mon*51(g1~NBNBLef({F-EN3HlP?)9(O5 z17f`Y^wt0GK+S#i6a)-^bauocw5Y8xOAEnlpO8>6m|CtbE)aomfCR&crT1$vbPnBa zPk;YSfB$vp(~4vVW1)uy^NYXVhj=p8|LQb)aN_QVW*JfTCUFtL0ZEtQ3#Z10Ol%bDEIA zhEp$gFC9yRPz<2?l(_g^$#?Km;yo0p2r)$52It5#C?N!&EB4$VRr&L!-wvC0iU*@w ze}2%nM>y&(P&x>q%Frrsyz@hR`nF=sW-xU(ub|*nTibTnM_^JXyy8A0R9NN%$jA8R zPpp5r0$ggJq+~P-97r$&Zr^6-<3r@!`|ZV}s0=FwNJ&5xFYr!yE9hJs9>k&`7xc6mm;qT?(qE>eHtZ`AF}K4P_^fq7(&?j?x-huH^FgxHy`tm6ftU zOlrev4KrCG6j9XEqetTPNY_(EuShUi^q-qy9tP@ypbUU{s%mT14Ij^cXbCr`Aio8v z0f(rlf#?r|WTd_>*B>;OFJA_6odm7o5UrXuwlM?*2JXYyES_rL6kr}*Q&ZZjMDbT# z9JF@}_?WX_pNfHK0g?b$7YQhspzr5EcZHw~wN(Qo%FHl2#1S-{__Fc(yx~52;MrjT zen^N2d-v=5&{H%aAQ8+L_OilByQ71ti%yf3P*G8NFmZGCe>jOSTY#F^qh zqlbKMaF@&tW8j$*MG@|4c}u0i9^5aejNnLG5AYN4k)6)eA2SuC4n#0i*iPX1;XaWv z65PU$Dht7|uS&Ib3Nkq~S7?`so(%`AufMlesJ#N7ezrKxBeTxj(d4c-yam{)4KMzEUI)ln6%+XrB}2Gw^D-vA(afGZtQyBEZye z82OEO*5{;T{JCMs>z(lgi0v~I_9VMLbDW9rNCGCMa9v(MMHU&75zAD z1~d_nNyr+1;XoyX-kr$1FyNu0p+Sun?r*tAuRf$HRORcv2_Yrr@ldU4~SaD#R#Tp_7Ja1Dp~U%1&}wjvo(DVt;|{mEfQeJQ(}B zGqSUPb6D@kNkQL$P{D01Zg@%%UiSL>q0po?fw4oC{swS{VP&oM<{^%B19f-zc@CK) zNJ^ybScr~^;Wb_+&@le|Ev4%^4iF9p!%uKC6VrO>BdM@XWDk8ew0McYH&8?X5ZJ)R zmLMrJU2yAPmO+7L?OH-JUQ0>YM_Oj=*893A{WX%K9|i+RWrYVxnnlpoxWrnA4_8r- zmXwx0K;GEDl@==_pt&Vd6%aC5Op}bSs=d=w{pitD&;*dq+{Hgz;kZ*U6Ae6Ijcu6d z!5GeQ6d+qOyIxnOf{!GKVS9T!8PPp`Itf>41Rw>3gZH6|5&JsEV<0pRD151!vthGbAhB10}G^O|ju+e}!cl0CF@{5a&BGfY5 z@nM^Aed@}n70$yMln4YMOd`oE5@(=x7+Dt4^P4aUt(pj08?w=FqJTV%6?GsxoVtNz z+jWPkr=V1B%k0{g^AsJa2#i{Qkb~ku6GU6&U5_&hk$74sh{3mwjj9?NcMx$u!aEl) z4&!sxa4^GWbqFQ3G0p|;F6M#~@OLhv+`~%*a;87>451pO`bQ8e{{Taev|^bc$ST@4XAffnKfL4x=T$nzMNuigqT#0I3E1?UUJp&Fby*!%1W@u6ox(L_9F zF}&#n8I#AatT|NmP|pA?aAr%qO~WkghY)@M3_0=bg18<1W-{8r&+Y9_0G3gTn7Xd$ zrH3K25=$@$!jREW0VV6~7s7Ok*>i7f%K855mnLdE)|g*F&0}Rewu6@>UCc>=GfToVf}(W*1w}1$8fIt@Auq3ieh`=D zz@bAm_yx)}tSSK^_Ye?H&iO{>q|?NE6qgXeQ&oViGCnj^5kCg89q6krV$FFuxNQ<7 z&&tXVupUA3qN2D%Hvp`y?(8h@YIwNaFH#IFK7{p}*4BMnN0Zaj)r^eVM7Vs)ZvnIj zLD+!u5YdsM^Qkj6Y7xRYSFS93gtO^y`+s;?3&A*4jcAMpQr$lH9^AP8U3~4I%U;_?;UH*NTe| zg112xkwBW}@^Wd&vGsV_L?4~IvjY2FNRM*1Sl98MI5_fP*Yo17lkeb z0m>`AauYBq;?9T%LgEwx0K~hePMretj8Lx6Nh>NQMkN0jrbS!Q_wB6V_e4AMmd?(_ z@S*g*qSD|F!XhK}j~zP#3J*vX4wL@LlbUG5kbxmH-v9i4W8>r8++d({>gwvKPxr~m znMFy%#L!4tTbmBbFm&2U<@T5uhQfuMioam*{XY)XsGy?~xA}c)0KlDBQZitx_!ZrD zKT;cy+!b`M2#NBFij@5P{5UA}=uCe814@9hd)}fH(Z2UT06?$@0!Bh3Vb?+k?stZD z@zNc#6bkHX)7CTah8+3>dTbmqq}5~-%9|RL6t2NdO|7kO>gw*~RLiX4Cj=v? zcXy+JMznx(2BAN^b?Ql077?>~qKFke-yXJ&*GLF>e35AV`CF)bnZZjV*T!OU2TCon zA=BBp57iz8n2r`(GYZ3rKYuJB!mEw`Kp(IsKz6CDr`u*Xk4X}g~~-@!428b}LMV)=d_kS9%_>biKTqZUB+0P{2fNmo8b15u9& zM}d{4X-<|8B+UaBm5}xgr+mP2-Lwz%RfK^oE+)?H#C8ng36jBmJSb4b5D5m!82~Bz z>h0i*2eA{zmkdwX$|QN?oqF}3-+1GpNm)V-;Cl+!*>UhpK&L6_jEdA#^zd)vFtlE% zL-OGa`p^@NDiw;ZFp=&2#xyi}NrYC_8O#f*CK7LFF`xxZ; z6^c+*`t@{XMpF!1)+E^gUO`3PVkyV#52g0fNF1%3-uSn0x?%)TQHcq!EW0EyfRy6!r|9hJ3)5Cj2YJu9o~%&#l?% z=>aDN9wVBA+Bb}mF*Y!GjY2L{>~332%WIsLe^4oA%py=XC{3Zd2mgy=P6Xq9P^z=r z**?D-5<*WJP!I^DSUFzmxCbgSz`pGFj}X-$v)KOGe*aWTt z0wfSj8Qf3T1-?bIRfbgoi~=WjqX&hi91}X|IVfQ6Zbj_WFrw|Mv%?2H4k-rF4Fd*< zLL-ba&?D(u+I)ohenG)A_>(8$`P%*)@3tJ=EDlS_G_8QNAyN?Wp{c5(02>J1peD+F z$VF#oXE$%#X83y##sjf1lIgKdRKWv9HWKfk%dh!$6tn>M~xzpP>@gbc6^#Nw0W9cW@Z_6f{X|$e5^)SL;NSo{~9HmJbcp%X) zf!QOgg~Y`L0zav6pVH&(!_f0f1Ow>fIDm4#sH(cUVJjzDTmdoK3=3P1>^>%x_)L&L zBKYMT{84cmwF8(k_JA}hM0iA?OEA$UEF#`iIOQ9F0Ig5xklD!k9uJQNMp;wnIswoj z{9`gx8)zziQQJWnUTfRGe`n6nw--?WjQ~_~AO-+`x1DWs(=w!ymCLfrojYw<@cEz9 zu_WB+z|Wt}D6nH{Z1=)M8jF2SKuz4tj|+G%%qAu#f|pMivae!Yk=nARr*+`huX@OS z+0;tyKtB{a~m@2|Gtz$#5h83KF`XKj+aNEiyDQsResdie8w*_Zjj$I6}NN zRx#z7?=}t5Z-4?Mw2x^kD*C!~x%m^5PSduUK(t*?C?s7*Vx59307IZUv~X}B5*Z}( zKKvDQ{X`}Q(lzeP`v;kV8>j%EavqI6f(y9S#~81TL_V(Vg0d_!9|CBOh}e$rXk8n|%_Fy5 z_a7*;W*cC2ON^>OWl4rK5N;RUPt-k!ZWRNBn|JJ3czd-I8?@-`dK>PwQ5|5<*kCGN` z+$_EcnWg|5N>t=Hdpf8Pp!lz?y$w~uha59GsHI=v=gfhA1P0kk{}nGE@=-th-X(OS zs`L@SlWHJIMS?Tz0AsEOZa2(%2;vD7{-{Kh*X|-jhTI4#9(TmmHR zMkzJuN5I&i$y=^pz|;DU`+!@oZs~gbUxmYU9cpk8;AGI10k^M4`+oouBbQ@A+ji{= z3=RFrA!0*zVL3Zzhg*W_F#57Ma}kv%kVCR{8WN$YfSJ1Y@1N-MkDxgq9`%?qMQfat zm9+_(5QB(`S-Rc8ovhW?^vofb{;A&KK!#6hB2v)n&$MQVBwHb$(#!S8z@8q(WxRNa6u*r+!arw5#=Q$sgfx3^ks`> z_cBpnu;T$3WMDJ9V>P$PhpK;5UB>Rn->M%G)=hK(hof*AB7KjQNx+yE0+d2~p<9^g1#3l&?dal2` z0BsQ_mw2TCF(DIT(0BpF0x}+(zXt%a08(=zTG!e~pk@k~US}jh;6$YNR>EKOw{99U zZxWK0UJPiwHlK<=g%)M%zOV%f-?EeMfkEEF%xmqr@r+PN3i$XmkL&#eV2q@J78A`a z85_qxM?7x2Fpd1=RKXL*4L37Bugw0SBRVr4US76m(ZD(H{HI{t@O_)HiOFrmX^4sX z!Lk_`80@}(1m)*pRaJi+NQnEe3kfqsigQolaLh|avI+{40dItbhmWIBlXHF(fLlx0 z@Xw!1pB&XDF^gh9AKz=B&A?5*z3?Cg-r+OWb3p2`)VRa4j>Fc@4t;w);Cs8iOHmpB z$0hj@DbIj!!cd1lD(`%!zS_s{r3o>JTE|&3#xzMs2#+74hvc2X8t4~64)xWz>$&X> zP*OlS16qj^5Qxu^EE)^aM<5O%wZWpO$j&+qzc&Zhi#gQ%z;*gjQn=fdJ(nxy%OjY%hPnxqG|$~#|uTXf%lPD;goJqWOQ^bB()O2O^T>qj(u|>5?F|q4WG%khzLjhx}othJR$;^HyKrYfl@1T zUnd45((%Rwi0w1SKST=nJX#0@RH6)AOXo(>7m_JSMB~Pj=Y>JZp>3X0xJXUrDC&-( z)Fxj`FP#C|2$K$mPghVGqZ#GeX9VqN1Yjz*B-Mf;2hxNewstjw_+%;^mFXCMMA@F?o-0kVL@%&(k8OSR4f& zioR4Rdng$2(u@Ir$V`l*QafN%&vXMXe6?c9TaWR^n~poI#LD#^57kDivqHG z-tB(~??4$p>#3qwDue>&I9xG2H$EM;GN~sMpZ== z0m*18u6_rghL5%Uxu&gm!c1BDMy-Vm>{edl9<-0<4Y@=?u#*3y<&0js!2ze;QDTr+8$T2$ z2MsH-=uuQZPW?_~6tlS*H~s;B%BM8eK?IacvDt7?r#p5OK;nSD>KwxltRI08BhHB` z`{qq5;1@)w?SobU-Blow{^s~BX;@o}>FMjEYYTA-NBCj*r~2Q9qu9qoCgZ|)jv9jM zBI;wHw_M`lOy|#^x1QUJ{{^93jq)Yl<2jUBtp~4?hG1*If6%HXbU1yrTPZ1h?K%p+ zm*nSvM}7wEhpy=zJh5@&la9Un6O2D!UM}$GtBb#o*p%+U{VhnW=>3S!y>(tpdU&E6 zh2QLe+zRy2FmDEvKJ}t-Ij5vs!!tbOG;*bMU3Fq@6s z@0ETjw5|_gX=dP&xD3iblF*X{g|YjtlRE)07~}P3^A6fP;b0!fsv+3YV2J6V&VE4C zlxfooYmgb&lJe$4=dmwJPoc+r=owE2sCbaRk!1nT0{32Lj)Mef2--s@Kphz0Sepn` z8{Iz7!bQXLjV29qx%hR@j~^(2_o2@K2wDK-gp8f>4j7+M3fTLPKuU~QZ$M;|grGP2 zd?g;Y68P6G;D`8NxW_=uB;c9@hB>=P9K8?GCL+HQX4_pPENzFbL70pQCBtDweaah) z;|@zKKgC|YY`^~G-l?Cxp92Vy1}z1ydDsk5&7#BN$9IDy1JS7l4ns{JKW6Hdqblk3 zrIU5-y#n|P01J@*J`f&HB3`G_0K&)j+zKiaVrWv<>+5fYnUZxrsWdUf(Pp<3b2WDu ziLZ;#(o|%=(KEa%)RM2@iRLOa#)vC{3472s#7Y}U<9o=DBWhZE7Q7ECyD2xy9y3hI zV)0b4wQCA9QprAhzKcalLyFJ>K=V<6LU(8VvHyT&buN}?Lw{yA#x-W=QTpx@bbs*6 zG)Fms_`mLk0vW9V^D=lL0)h_QV6t-1fDE@uXe)I@5 z0vI}}`tpStfOU9W#}A^y`~F?w^y!`z|IDNp(A#8$C-L(0TjNt@!4wGf0*}UaJWDd; zNc<%r8*)0V+={?ON^gQ4A@bsVGi+2Y`k;mbgGJ$fc;d3oW{Cf=+1!l5Jv0&!)a>Q# z+9x3auS33#8{<0-SQ0ZnbQP$G1EaVe5U|I{sQB3NFT^YZt^fcvlTbgl*2-@{44hI# zUk&^fP+@Rb*kt#oTdwr<7eeE`6JldmTjg^_{-#84c9_#+{*Ka*YDwUmJE7gp%I>hR zwhk;R5<`+fPsr1)y?xs@qTh6LlOP`yGo29SrIptxp4$8`zr98b$?#jk$|4suT-JaF zQQGGs&h>4w2lRjhT;@3^4A7cK!UmuS!h5Ww^KFskGq(b6$qR%gTR!pa)V)`j%#gLp z!Ca<^`W0ZxNqHy8O}8GydBBD_UdZD?^R5E#Y8WE`jUsfh{l1a3>xhPlT2o<@lHES# zHWRA;s~gNI3TH>HTT@pZaUGNPie*ov51#lY5wp;pJ>*X1NLM&wn-upba4|l%_SZV! zcesfUPQ-kyNuj&9Yv)f?9OzfI&&w`Lx{JRU%LT$`lw;a}ydU{n#Srx_ zkzEYGw;2>?`dzuoY(Cj!ZOOWnuwI8MY}uu5&4*==sEwVg-ksm@TETkWcOWvVh}p|y zI>lkM5)Y;s1*Tnvm1#ARBSIU)q4f#>GLfYHJC1{yF!{M>*VgfRqsV&$Sl#wZeu}z< z8!H6aWCoVZg5i0iAq!t}2b6*!2CGI&M{IFHTS55REn9k^=!X1z69tRdhu76A*Tcg% zojb>EWMpo)G22AGE`qMuC_C|@WmAhE7k~BJ#&u;o)iw4=?Qn8hUJ>S}2?^QFtrqiI ziJyKeFE_8p*gQ%k^_qL9;PSnLfZabosxEe;-cD0Qeg-b!1O?v{Gdidb?tcC(&ckbs z{A6y!`J$RCE1NgBnCjBRicjF#)}a?hQ|*a4bSuk;_)JeOF{PyF7*XljPJQyv7!C*s z4o+0l3-Nocgm6t~+8BN4Q?mZ!dr;{R10aAa^?*6-ysjIZ|3Atg_6)L5=s^TOWqXx7Y2bTz&0M z;;zKN@7Gr!kJ=a@}*YsJrxnRGDWdimx}Uy(r6pGRw6 zy+W}9@=%ZI40+XQo(L>8shXS{Bz557ObF}`z{ zDD}-scQ!p=S#rR9!t7_xVMEpno~I1+?Sa)y**QX?dmk(ZK~_*$tUU~bV(`ny8yb=C zL&L)EMMO}=NvdI!{w1pagx`bI+X%XEyzBQ~aE8dT%wC1x@bvwBahl zj*8Nm_fyg_+e8zrs zvK=qA+H+{DgN66YyU8h((UbvKoBgR7b9Wr0j1b!%yCcqZU@G-e&HG8$%5^C9wGFv^ zQ*9A{{6U?k*cE_}+q6qE43WXT_bL0)$DtT=BO0uS$`cZ9fA~1J`uRN={O|@#f;Y2l zv=!%P`9AObxtQjl!%hAZ_4c1BKIKSlpcT*_Zrep924E^`jdrOitnb-?a<7`qHsx7x zqok|;d0DR@Refpx;83gY{M4S^RfA!4j5{*T_Feo&Vc)*yMDcz<|IAnk%OB0E6B8}^ z=OIoc6~h5ft;b6DYj){W|_w5+w2!#=Y}qY95LVZ;8WCrr3)`v&plRfTq{{Ltc3Dv z^u#yu$Li;ERa_Zx^nQW$wj!v6XTF+3XU_c%pkNP-MpVI@3VAi0*8w?`jzZYnQRd3GhZ_D-^l ziPhf4=^cD0Qt4SolyvLKOab^IlC?$o+2ag5KRnN|K0NS#UW>d{_Cxs{zfGXV6D#tX+8C6Z z>un0Q@7$S1ekVraQtB0G=0%GD_np+zWuR#yLeV%`ulDRHfCfeQakkgwudyViugXyI z5p7HE5%O%TotL8(T|WGSU$n@t(jg-Km)a+1y4S2uQTX znI2qTzp65` zmD_jh@aS&z#2idE+!E8hmnj;ogl#b`sy3_Uc?@|TuQJgIHrydW|NHHI zsdKUepF5Hi&vK|Fh6_5hQe->z{b>hwi_O|s8oab~H!E0K3Pft0sBkZ8OKs4P{$l^( z&p^r93U}`I_M)@2{^K>{_2qA>A8N(jZhI7|?fZ zlLC2*KZ${ZR9s*BPX;{(FecYsi zMhETrB9IxK#wYWR@wqIY!X}h#l#%TKK?)J;?VuVH8{Aee4KleMk)((`E*cimrYxh1 ziF7;)6L5lskT9rslwEq5tpc`nt*B>(JmzsMxk>yty$!t6@#JLBr_AgKY8s<;3}!}cxO9* zLEIei;DPJoK&ac#gTFATTsLC1$XjGK!c4pl1F zq;<4qpY@vGA6-(S#;dbC=OCtWN*Hh6*v$S61M)Yg;Vxkp&KvoOBHLEq@I)@f?`oPK zL7!AQ-^VHLklLPo+13zm>vz$ny%|!2uuA z20UqsT$60^xTCR02cEN93P&A70wNRv2H&2@Jaw9#JsrytE3`S+W}L3)!f@5%b>;zO zF61M$?0WG1ho!prK>yE)V4ItGJ{ZD#1*(Y%b4e!;jVHYP=vi3Y�%MAn1zHu22u> zK@Zva>E1i5hk7aMMCb+k69b3tJ}2U;rxM8gX8G$vp7iM#%{8myRynvVKayyoF<+IY zZ}@A+FKMHR11jZm*O6b`Ck;%~!@IacLWn^KF|&yX3b!eUf^{8I*io1Pc_GydsWaSr zLF>9>tUSu6lY@1Zp3ltW?Pz$yXWl$p_pW7Ig!Y@7Kfv2Gz*4r>rF$ueUHMzXq2H4u zG;~p`cs{|dGF`tX#=$_q)bEq2hcB$;tX-2X?eTj{`|FAn+7I)|!7UJ$M6t@81Z|^R zl+pZ7+V|rIjfkq=ciWd2KLQO1#G-(_mQ3TuT+MtcU-BCK))BP>#E8}ya3Y{NfL#J^kKNC04-oXC*$~D`&8_wscL?sH}-63-i{OOK39z|h2bH}oi41%Vyp!!nJ zb>QdYYHz)CM&!NP(f#pHZ1NNGsvIZRKGc`jWvI6i!RI$L)HMvp90jq2fubiqN^O+L zL1mXF^*N6&?v#^bWb-s1Xf>8MEZ|cpwkUW}Xgl_fYy0wYM}4BaqU*}iOrPg|zqfht zWvfRJZvYa7j>+<~P~i8nzRq~s9S5t%dbS_5cZ6vIFTSN_nbYx=B%ObQ5vu@bYj88& z+|u^lm2vp5VdF!S>nhiTn9WEmn9xKF@EcHPRNpo;#@O5G(j|9zST6d^O-r= zMi*XRr9W;g)b}7rikMT>**rklZACKbtr}2;|VCHd{aMb zqs8`OURa`}lwyoQ{Gill7dN(|q1Nx1Fi_$8a~7o%8N>0!YlF;}I#XXeWUI_f%l6Ks8rF@AEMm@Hd z^Z5+RoU9@2en&b$+!Qd0m?9<%OmIV@Q{mEEhbcZXJq7*04IE$6OnLe`(a!y?39&12dACb^tYjYf?3-EH!xL)i5Fn}_H2SSQRCPfoUO5#kS zM{ZNw_WY(9EvH;ZC%J)ERu$Z$+wUUTvJqEY_$V@~ zMFO$R1ykS%qeo(09e6LCQ_uYGJ%778I<k>}BeB%_`0K;#81HG(rp0}+y_Bcp zwQ|L4^!xBnGyRGy&Ts*7xXcrTucQiP7B_a%09Aq^T=%Q-+mr(rxF*-svcxr+@2kq| zdXdd|p*j5$7ruq%<%d$JuGD;~oB^qCf4=xI&oN0q_32w^d5-13ez!Qs0@+aF=~t3K z!)gbQDXhOQa4;s24CP0fx(67WRRCAK()&GYQs0p2;HK%{mmX%QuBXX<0l59{y>Pq# ze|hwcXR3cOi~C$uxZp8yYW=TszhXbWZ~pbuW-livOWfP!vXcUExQqTZDSZ2(d67w; zN%sER*FXN;iz^JI)p7B|#hp8Lj?pJtofb`F-6Z!SI zr|N>7QnpDe#7}pc@1qpeBI?voPHh;wxzs1*jQ2&d4PJYTVcN=dQ;S z26rA0wq?gO2T1F|XbXCRWTgQ5FuvmtW5=c?>vDz+VQoI7S23V*QtPB`Ca_H6l~ zLAu`Yr*pWsO;4xv3oo4iQNwmB%`W1CtTCKh&AcyusCX8L<{Bg5Y}j}9i5%Z?9SFc4 zyG>Lhh(5>_lIp8vj@y66W662!&xgUU3nIu{Y(Brr93C<7mz~Se|8~zX^#*yrPWi?j z&uf1b738UY-jma8EA9KiIH~Ejf)Z=MUI$Y*Jz)!Y1C`4Ro-Zt8IZ{zwu(+m{dgIEW zpDRR#d-v#s&cuLX$%Wu(?HfPm7C$Yf_xmMK*HnI_6{eSUrkBr7`B12-Z^UmFZXHvB zi7KdhQfwNIZRdBgxZiW@_{*NFw7WDHr;PW2JyPv?c_Z-NUcb$BEpV}gYyE)}CGFh$ z)q|pCH7)5)B{?rKM-KNM-;NF!)s@Pu7rV(DyRY`IDL`J({qHX;3bjQoa%zMzNRgau zb&l64%e?8E{8`IKrQhy9^_@QC^A>CT(-po~jrUDmjj8o^k{-}16jN8N} zvD2M$>h94{8nHF*FLQ%#TC4d_pu&PiP~`cd1((mVW_RrDIyt!qa^3F}d@h(nwV+b7 zMd8*0Q8R&!{nO*m(h$uY$LSI+s+MfPy#p|!sATQ`Kk`;cJHl_=*>2(U>WNF&87}8* z=~3l@vW`pb&ghCCyxUP5MJ7h=E%@3a%REm7*;h@4-{JlALzp+vCzBxYtQ!ZAFKD>2h@n&-82WVgPuj>r$nXz$E6upQSL(uk~QTK&sGl zs924J)1N3A`Y63O-H_U*{%wm^*MNM-!WqtFuf@D-Fm(m?c6@vMj=+#?6LHLD^RlX` zsTmYK?lUsBS6gPSR*VT8zAmb$&M|Tekv>zw>bl&kmDdKJ)&w!dy}l%ILi|gqEyvNv z9|!k;sRd{47${C9y3E>$S&F5m_93 zb?M8+CIi}*%t&9jhq`qpZu|cy%hfvldBDE&fuQH=pb=W&m&~dct z<8amCL{S}zv(&Mb1IuY0D+39WCNFs z((S9y+NLhhme4!o!MW~`nCo-UYvT)}K27PN9=GLJW_)x~H}y79YfGaXASL3<%;_T%m&d|y@ZP``7;eoX=M(Kz)}vM#RE$GL{vmg0xo&Tmn0O*Qj5 zrBoL&b}NQT%P@!b)y&?v4bSV#hov0Kk`|<15y}s7WSN?1Y@V1HB#``kbKl6Q@-M|0NYUy>iSa`JyuWjuK2z^An)6slLfs*Zj;G$Ke}zGf%o%c~-X_a$<;NS%GQ%Cu^{ zBPj0v%jw7@m#+3}%2k?Gy9y3WDdIhdW}VmCd0yz1EG(r`-0%(LXpC#dS(8h)BmbL@lajq>(hK5ll&eExDp=$T=or4=)GV8Fh)LgJUGcns05k6sx9BfoE3Zmia#&@)HSPKQY-VJo;lV0x*$vmOrPmE$Y}Ii% zLgu3>n(iZa6#b{SvJ7?c(m&R`)|}kaDKXeaV^VUnuB6+A(wk5ulX7|K@ccyu<3r9!5&nT!g*-YG*RLBu zg#KZ%M>Kq+=}JI3KIW@RY6bFU#vRZ(Bb2=p<=htmI})jHm|U;3yIY3>&7j< zNxQG(sdBBN6JI||vE%BU!Q_k7$u76Ww3TT^#>AW0DlDhxHZ2(huj30kRvJ4QpzvrA zl7~gFK8O83`)``5vi+tLVyJlKePG^uoXauf*}}(_Rff$uer5MxE~)81QKI0u`sqT+ zini^Sn$hr1*}3gHD{S2>xjT8xmD#*TZkYC_EnJOd*4_ABpqglflWj)^-L3@1NloQo zv&pvwtPh)Rs6fX|*Y;lqBS(c`FbLa6`V0vPPdC^d^YDM`ZZS+&y zSs6)}qod#O|6hn7|1rh8g_hMX!*J9)=S!B^`KIS`e5W=x%H_C>@tw+WnGJhhF|FEN znciKQz*gvx<8o3f`jLxDL+pkG@91eyX5EKMAEw{yww?;yxJOCyRH@_7_ZQ!tGW9tn z*tL4ot_-$wjDl^{G(TnD)9!p5XW{nT8-joEm^0QsO=TSKuC8()Up@K##a(8hix0im zUVknpdM=eQ_t|B&InQ80v+DQ$+#A+AI)M_M5gVlXH$6HQ0IeGI8NZ_MJ0s9Le8Y6_ z+l8Q&XBBEkyO!q@=~h2(l4|+$ka2rRn8xV^>Z=C^lf6T2?9T@44YnMZdvHWk^Rl*O z*lJRN!9Me)hZ7V^Mx~f^WKr2OKNdBa*2$cU7l~JKjsH14o$z) zqx<~+l~b5J+lyrZ$F;7TDqfYgEB;AUT~(pz4W#kpbMLQ#G-vKMr22S`R;=rGC^FG+ zy*E6)`9e%XHK;KizKwS&yA((3wS#(1Bg5`F{|<4pH!&Rz^IjJ+J?;^du2!?`G4ti_ zTaDD;f0sts8;y;>b8XJlWcKpwe>VCuoOkTArMtg&k-;)+T=`P8Y#PUK3wMR3?Tgh+ zA}VaVqD6gme5qWX*Vx~5;*R?m(wxayK6YKU{qifSQul3=&gx#WE^lKP>uqje;(JDP zKak*FNAV+?<$c9J?}vo(BOfG4Mdtmm??IgHDrtPB#`Z2m%4IM2!e-|s1A$|(zly#ddXqZw?vUt(gYaD*DuG43A zh2k{5i`46om>WIpO}l2-dNH`kn$xeuf0UIGb$l)9I;rb&YUuvNHXeiZVnMf;%6GKQ zlzw{WvnWOHO0}fEVcq&%x~Ru3KIKu0pp6^{*&lf{XotvA%6Gto?#mxZc=ZWCjcBdivMfF z0hNKsr7xQH9QMp~v$=n7m{ZV{T2G}%%A{2A+LMtd87fN#UIzk4z4FxJOW2eQZ;gmvjoXs7yUem?oMaM>qPK>o$L@>E7ag_)7DI>GrPA3WzKd1<^W zm!7dPtv|{Into>E&EDdf-TWtp;*Qis{7lwQ@EEzEYN$Tf+4o)9QBq93)Z;Cn|3~-V zSS0BrtyWSlbCK@}U2*MZX5P>!9s2Z#z1_XO8TFr?_gT~5MMX@UHaS(AsF!^6OdN+5 z4b@+O=#akQHa0W1iXXh0;R>Tn-ppQ?UD$Iey-fd{7&PV;#r#yiu)FG?g?EK6logZ$ za`XFpvj_D*l`8U;{u1C8dUWmKeg*+u@wtaO?waxmRQ)Vt67#LpyP9*X&icuIm)q#| zdYU3}+x*+#VI$fWtGw4JT;;U-<-)mz^D}24p%eMjqL3lAor!jZyfe z{XxLiI)>pGni7Ho0UT(e;IRu+j#u7ap2$Tq-|rj_`H&}2R+HK{b@aDv{PADkZe6r8 zxwa>LYsW5)o~%=uf}L)QrLv7hAJc=TJwMN{d2{>cr4!wzAAI#vCTUY6&DvC>I5{z1 zJs;Z!k@0z6A8)Urfb0`fKY2sKcv1wt=W2Q9O*Z5-GG2v&JA*=<9F{)EbU+{NDyATytwtrDc?r9Pq5PZe89QpOUur>(eMvt z95Q;fQEhnqak9VN2G;+-#0<{ZlUtV<*r;Ikt8m-A;l`zAsh*I2g@kn{RRs?gDkn@V zpI+TOAU1kWmcMa#VrYz0SNwv^-o3B2X!>cj4|%Z+=lqPj)W2tb^{eKA2P<2Sz5i-^ zr$5PT-x$-pB7F z@Ba7-TjQn^hcDT+K$ET?EeODBpT_pneYJN>T1)dPXRR`g=A~P(7~1%4ugBX7Nvri) zC)3UL1dAS;$~r!;5S4B6^W&+>(Hxg=z3-CEl7zg=W$9Z#F;dYymGaUJk+?L;EgJ8x zp5SEpN#N{<-kuJRVAG1pdpW|^v!A|yde?U;GMsnM?!@)i)OaOObG%3~N@)4=2bCjMl~d zy2^N@&DQ9wMaOZrvox>Sb|h3(`NJ#OZJ6wj0TJ+U|HkEIXYNz;``WU8D!gFmzs1dZ zEH=$lcTAVl@4c4nb@~DgM*-o9?UyiVEr$`;T?^Ci=4!#!r-`1MrV8cM5|+HZSphpy zjsp9V@MPjKs(1B3-77UZIQ;ci;lixt?DE3PSc$DSxU(meW&EV(XZkk&z23Jpn=l`5 z?+<8waBsZEsk9HN$~%%Rt)w8KPSw<5u4ju1yvMHhPWq*0nR=h=_W-WD_d;wy!dk$^ zomjeYY8})s{x!_KoslB`{0!faye9%+o({8AD7eXj~zuV#`neHt7Hj|$I)Z1o^k!Drc}-vr{rRsQnD{;t^k z%WYW6peZI9;JNe$oaVAqevKECW*{be zBFMy9$i9!o567|p#xeGC)d$Uu5j*(S3@~$1Qf+$M(g4uOALBF-ZVwgDB`LQ{#Eo@% z@HEPHT!S0Qj$Nwj_fU8>q%~=mm}FU&8*YWnSD1h!exXWj)bui7evcy*fjaMG2(uFTA6xbJ( zbya#b6=mK4_chUW!hxB*b5_jJ+!}qJ@ZM*II+P1&~8n_VYuS2#iPk3Il#8tbdE_0R(xQ;jUI^e2s7-Sv0@0{7z^Xw~QQPjo*DqQp@ zsWkMdE1!8CFR|N&Vns;ueiHFsEZ}U=>Bw|^KPdX8idjc0tOy7)M~14!hY~K0%FFy`KZ^C&KTyP&MYFBb zUGRy;7dqAN-%-{XPS5=~s8sg(3jT{Bi2MDtR)=+x(d3&wjEm)0g_o^$I?^290r%!( zX=&r>+Zb-StUUoH>p1Hkhpuwi5=Ps#vNUBy-4HvMFRkz-&u*LOIh!P->}q_h+Zcvt z*`>CAkDe&56mg`XqBCMTsA-mHTG~A~0hP%O%5|(gL2@tM7RPG>?}hRGmmBkOX~sJq zcIVzaabQaHTHT-$)$E3_5(Xjx6={^Vyd1rg3-57Pj7wAQWkt;?Euo0cvIOQg8$78} zZ*sCkI@I55klJrnS>Bv3eG@#~IpeI9*ManDfd=B|F0<2JW@%C3*|%%o@n;tNLDGM2 zo!0gA^u(fva99Y0w`FgWom(T?kSi{6uWoI!ihRt$jlbJvYC`taVRg&FzfgNSw7kUb zY%7N_Iqs90amp1>_xl2K@<(8U~yn)N^o}LqFSe4a$UvKZ)f1)y< z4w&|crKg)FEDB7ma)Dh_H&E$oZ}shBeZ3A`D!yDMh6NTY`(3Jon1dws-h60cHx{wF z@!Qo!~A=Ow~ELj>mSqBqkOG>hY zkjN8Rvdfz6Yh;*8*%?`iqR5stOCtKdPv!XozSrZr%n#>s&YW|c^V#0_{kmOQzyl!* zH4|ZCE{6%VLc7hFwagFQe@|=VRJs3q?F|3(sPcd-f&w7VQbC5Vc5M+rb_(fCKT_)G zAS6i}zwmBwez>DJ18|IG;@7|V#L2tKLOodR^=?A2^jE0Dz%*)fWgc^(Aivl>r!%CO z!gI``Pu#wf`jY*8DI_v}fakw++%N~Td0{l@5g&?~h4<=;iJmtSXd73F)1X&kxIrDN z*p2{y(%HXwhNdAvQjg1nXPwlYqVVWU15Gw3_hMcwTI0C}c8P;LmeZQgSG@u+^X)XO z+TjI5XdrC$`h=45z8%awtTA^HioCvOEy#{(Mr9;NbpMFUs~jM|u4|e|%N_Q*eJx#+E)xy^rt0XZ` z5&mWUvvQs`A0N2iYf3`)&Xv*LLloVq2&-5+%{gvKnR^N<^s|0dHF1QmXbJ1p9kPK= zODet}`DUAoeXMSk|tOp+YgU4%YiTXPqe#%;};D;sx2FFs44L!tL3PWnN^ z`XcH08o&agBFYCZ4|S>K^5CYdz^C6&AMS1b_xphnVq=YUla5-YqseHY%l{F?b7LTkK;`or-{ z=-{;~(?U-PctoL26!Pq9wd>rFB@#c{O_sqYu@NfGV9@lgWK7_I+RcWyIX{FA+NgHP z_1#b4!P3~ile*CUDBGAQC|Qh#`pHPepuRR#@Y2&W?%GlA!a6ZLE2*Iz!qg^P+>goT zf;Uo1JIO>&{e6idx3&DM9_%wdm8F&#yn^$Gh6y(IE&yT>tV;>CyYNU7&tEVE+_ee0tf9$a(Hg%xLwM+ToUYDd6OuE7oh`j7m z72g{Z zN&w}TEIx5Q-#k#P))&or0e?*&8bKLw<=Kt4$b<2%VcZkSNI5_R-3LJ*uwV$ZY0EI4 zG3ArKaex>J4i<;qO^>cD8Q6auAav)>^AT+Im;^Pyp z!kap6?Uc$HYZ7N!(%DEGrxRyvsVC9xL>1pyB9E?1w_9hey?L6aj{}N>(6=)OL9&@{ zZE^bTEs=+xxuRk?4Cw~M@fq7Iw~8`+QAMe{Fi$=bNo;br0-*#H=0*Ts9=+?$Wt%c% zz|3!pe2uxDv4o4gcr2aa$?EEk-Y~5(hWR=hZCsAw$I?0SBZCk{u107@??3&XE<((O zMDN{z=z_GH0x8$W$F^?e0@Q?Iwd^&`cEbb z#iv1iA_t^33!oZxn=zHPZqOL{KB&&Vn@%&{Fjn@+ce8HiakiT)f>F3E5Mldw|3>P# z4%O{K&<6+d1BlX^U9`2Kqh^Z*%v_bY@ZS~YnI$A^%<-joxzqcgj1bgo1y)bAI8Wk~ zAm(ITUW$eR*04~3f5*BnLWm|3?`a9?3JVDZL5*W>LF`0{(}JwVN1@Ul?tDAbjvZK% zJ5|(m>k41gAcqD{qw;bkqZ3=xLSk|j;FUN;4LimI;z%1e$9puBaY~1b=6{F*5Yc7$ zwZx@1QC`ya@EE>1$vMwaCn>!t29odf%zbyesLf)vEggc&Zd2H0SOr2LnF;bz;P^cD zD%5DAr&SG_%apAnrCt853_Qms59o}wmN?I+-Ns)f&wajI0KZ}&vA^W50#(DkP+0^O zK7<%cgT*)~Q{LeN_cM>HwBkc6Ydnb^>#ThKw#`FX$rqNViuBS{1VLPM78L4$LX*UQ z^d6Ys(Av}h2?0Y^C;1-6(QNO-EzHXXQ*#*YwsD)f!8(j~R&L+1eqp2XgR_(crGlDo zXsAm|;1l2YLYW<)Hq@HHg}zctcGgGqmkK#eq#l_&W;1h0;4>aUfwFKz!O*9|O2OuZ zRar-&j`FkP{rBK$(Jr;uN!KGWoyUnE1c;zD@bxv4B;%wGw^=;3d9|Ftl7u2i`m9Y9 z^BXeuB}lJY z9?IY?R}(hIg?e+CvCVHk-lYBO=H^qou`F;O9VZ@AZ465Ahc5!iq zgX%?#kNK(bJBN3>_xmV%ab*mDUZgHGMHjkeMC)Zaf}4(3WNiojcRvurcun0<-z*o_ zBl>NS?!@BVL?k*T44)Vml~tTFNfEMWOcRK#BNvJm4WZpE^;-Zm3axya!h3XY z2c4YHYj#Uss8iGK!Dc@pg1nwX#5{PvnHM5FgWv`h^r$?*We|}*PX8x@_zVfD!0NYv z5S^7<+F2)yH6Xw@i)AGu;tu_Gi?8~9rHwB~TS;l@(<>_@NIEhEC261i8lGsQ1)bt%Wk!4q=A}`)X zxhqBOUT!IQX$R0AkR-p7cY0!~6!pIkYnAVdPe>LVSl0@NdQmFLAq@$=VY&wO^8xhx zmH9hO9)_LI;$Y$3#_C(Fdg?=pRkg(nT*02FCS{p=ceIf3-V-M%VH<`R9>kIfMr1pH zvN-k^-8<4>;e2Qky@l%pb7rWJW4&xPV-(%FkF}iil3pC~eBPnyCEo|aePyVjUkjOE z6TM#zoxXeG-1GNK**wNE&`axqxzJQ5_ot=e^Ezj-tgc3w7J*%nrCDFhy0_d+j!!G^ zP@WuF!MWSxlx+%i`cd`K+-FR@)!qu*GWjZ)iF+JlkC4dSPgVP~-qXNY1jB zXCeegwgPb#AkO{3mf-xOSZUWai)VnRTG9244~ma$}#qkG>-ojC9eW!F|W(X~1~ zt^-xkmipTyt>p5p+LeX;OOrB>EnlcX7nclAPE+>{MDT#H3DB&d&$-2qm`S!vDm zlUtbu1<`_n9wG)olD0ERhrf-rCy2%~=;%04M%@aRyS{sQ)o0^16EAhjm{SHce*h`0Mi(pe8?Qjr+_O=V~!(6(lJ4e%>l+*uZ#vl z(qolp2bPp6v`>*<+?A+yLO58jKG%Js=f%4QH}5$*>^_dG5fMU_WrymXssA!Y{WNwGmol-I!GG=U z&f1^Va-%921@hzF~*@$d#l+deGu@pfOF^_c_K{uBP z_*?L*kHrf|&_onC_ihLS&K?$?imhL>mR}xhTK>=?_n{M&cVAneR*p

0XhWJ>yJuYS*xB&ILx7%d|7znri)Mi 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%0DF_AXv|t zxT9-%rXA^NLY>8)MYi{srVh_6FJ8e1@V*@cqIX(W2GXSE)~lb42H+f^Q(>B+Y7ued zHlibLVJZ#2FN!fu@ED7WiVT5{LEnWupI6?b<&_u=dX*ffhwE)?%XdCMcW7i;Y4^bm${F-N((1bB!;PzSD?2MjIhuBImVv2*~z6S2|~q z0z&Vvzr6532)BBP7GC{R)34hkLj0TP1CkHZQN^;=_l{SY-?DpqQznh{Az66t2`L*vO{>zfyfrz2hihrMo32Z0;t z)QZL4<}@|X5{T}FjQ0qN9aELf>Yy!Qtk|@dmGJ<`#uUAMP;&yOP3Pn!JGKe+A3`~zxYly8=S{RV0=TC|Dn=p86QwmL*QMi7wE;` zYx{U3ZKR~1VPLlaw~@#14d;UgQH+t1Z(Xmg{ajy!m)^Xd0b4kXnVyvmwY#S$9<*$+ zYzAMvb1&jTIHWYRquux>jnvHUUvYOvH9j|Kr&@@b&bzz?m(3C^ypv;+TfYkz-n&*I!w!((UR zDl*G~Q~-P=m1<`T&~(Vbhy|gP!r0IAvWXx#x=S$QaOLXw|6(jri6t8@|oQ~-vtDTGg?QwRP}SaPy5+%zH- z1++5*z{sb%x?-+M^H|p^!Ikt$Ir&iEFS1aKz3{G|mbS_Z*=p{BqtYpeo)8FmAe`g* z^FRfb@^_w{5y4nN6ChX^m)Mj-yR)%R__@P0@xua`sAY+BmnD;gB%5rkqHcg!Ii=hMA9&m zmIh;wWM%;9a4@}XCIhwoaLT}mB)#xf3_&m&U+3akxrqY&{*KduYQAPEaP8E--h~&o zpyp<~#3c+EjtRisET=AH1e+oc|71NJdW4=VZqw9C@{V!%9S-MJ?9`-`)Xa<@hDr?R`@U#+ll04V5PI*o?_h%X705`y z+WAg1zx)u$a)8h-0sS6aJC>vSYTWmkK=+A=P1ixo0Ota$!HE}$=oxuu;3+E~&16R< zcIOUiMc;$8h4a((SAAw2E{z=V!E}w)Viz-A>Ubhkq3GNSS#_l_;0QQPt$pIFrcZ8AnjZUH%Tce{DvNui3i=I4U*>`{V!KX z^R2=-bn;^){cwum>^~$jg^>!T4*fw+Z3iYRkfw}#GOc*Xf$i`UAX3+u$BeWy$-o>Ne-5o8*$}I28_N!{s)1lJN51%Xm1K zNHUs9;|P>fyUsUQ;7zVfV{7SMu!BSeNNE5T;`-{M1J=TY@oil~3R?w;1Y%!C`o!X>_S>pjT0ffZet#L43iEC4+{Jviy_7AVLNC=K8l z03dz<5mpf>z7{`A=&q6TaEz;N!0ivzD^YxDYSIRy+H#36ajj&ZKgqYS;^Mw}^VXvO zvv0OqXE?~&?9WeJK+?@O-(%JHU{9oq{IP7^}pFrFB;AYxEy{Co!jJR){L4$jmbin>fnLNq}T8k&Fq z7O^sgHse4&UuVSp7?hbvuJk(jbHBR7xO?mmN6&YWlT=g^)SE;&mLu6s)D-;Wd+4~Y ze*wG?EBg*;DH3?a(p|P8a#Hg>(W`F-U<<+iu?eVX7mTl5y>%0XqtIBn^()!RgAo&w zPrR?Z&5Yh9)?htEdHz`-)rX`1!QdB`&*{}xF65&&vOw6k7%#f>D3FNL<(stY>46QF zH-B6M+NI=Ay#UjXSUI1Ba`j$eC}O+$B*LyL-dT?3u^#VdNc{?KdZ0!C9Z1QOIZ>y@ zPU8QJmpl+sIDmiJ`ue~yhIKp(dzRjYuN<(#`ai#77iwJNQ%81KKXYjFZPH_q=BYX; zM{LD&_)>em-kqF!Bo~pTQ_ciy+hlvLB~uxp#BmV5CW<{??~`7Z+R>>v|@3Ltlpfk zq?m9AVRWAe6ZygZ{5!T{)lX_(+JJH<^1g5lxo);<#(0?nFwGJTx3<1N9R2WcRL6e< zTYqV1_iT=>=!!b7Mx4Tu=jHq%a8=Q`xw+Fau2WDT5~lC-BCk)PAV`@~-9)qp5NNaE zKvhUPncxNP30}V9OPvHD1kF^8{{adNyyRcGBA!QK_sPh{)$`i3njbF75WA`0T}Kcsj29uj)rxt%W^q(>*Ctr2iy#2ZnEad76!-E$R9QrQGW%SV6bmNCLKsS6FF;ox<0lZD0;@ws_-wz4tiHI`84o zGjyts8tQgR?4L|zJLQgfINF?+D-8a4WIKbLWUb)1AP*EGIDvHRbo^3SxC;1Rx5c~? zd4+!hu#muSchPCm0Ox2LFSLila8oT!`dZ!cfe`S;UVumg_^0fkYV!eNtNq$2Yo>B? zHw^Hz@>Dn;=4bL7o~4ZETKFb4zVLgaufs~*87*aEi^wAw)abnr8|qv)Z$suoNKe|- zgNS;4lfRf{6a~C%1c1B-AW!0h*9p6~`kdG{D7EGa!Y*j3P##HOnjV-MkDGnY&%@OH zjHYsNX_ujNg!TY~tkH!lwuJuda_nJPTgQ`T#(rAMu(EjX{Cu0dZ0l!aX4qyqn)&ij zzhxWL2@x}E@@SuIMgq`xy@H`ca|UK+ms%O9si6h77|9`qfiFTPl%A}xL=H)(0UIJ1e*BmB zNqrgELe_zl2*gX1Nw!w~g|p~gy@r=brxhD!qK^&4KjtLj=(|y^;#e}^M%^uqSCQii z>WdJ++E`R4wG&G;LlX9IX{SZ_@?6_XOVSz+zesH(Hu+N}kfRZ4^gOc+PmIot6 z6&2na^f69kZ9uF*l9hJ3E%9aY$t{!Tbk!t6&PvWI)b<#7`nkU`KBB&Fw5}l|)8b+< zs1}$Mc3sXbtpD=TW{5h_1C;&byp|6^vo7pP;&pb!3DY-v0f9KMCin#ZItL0ym?4=% zKMBuq(^Ih>1Pa;uHGCjj0(0P%q}KLqh;VZ-?E{I=A29X;^E_@)`g$+!!gkjNs#gP> zuJlp1+EeD}SC-{Gk+kF})MOlE#$1Q0w=urO#XH=&_tue*Z*S#SEIdLc&AfJ?bA@*p zi@e(M0g9f}Qa2g!umfvqYEZek^T1Gh2HYPYmS?GFM`RBn!#6xdqF6UsU=9G|XdeDD zRBoo{uAVPMuJRLBMmoR8cD?;sSxd|{spJFUBMVH`t5DS zOBYp^vdDk;SYkfi*V1^337xO@+_c)mxK}d;{e^^=@<%Q`xz=dB1suTO+9lo=ULlLTC+N5r9XcW<5!VttDan+I8&2;)bina=Y}0$LNazDD>9nL=PCRv1SnK1xBrCk5GJ%GjMbZJpc4B9 z68*^eKn(djHO__8I&eZIUG_#G39CHhHU{kyS`akB6y9GoL;lH^hgSz=@29x)o${LX zQo<+^1fz)Y1&Bhwyhy9G-$1hn9pXx1L5~i>sS2UYE_!Et$K-r6DtD1VmFP3(@jbVt z_t#x{R|dJo-l=2}sTbw?BB8)xineH#0Lc%h5c!&&ih#W9B>vLkzUca~m6oSA*kg zzIC8t3OdYTz`*z})7>}RPoM&Nd2RCY@{_h~c6zO(Z#gX}oK*fe6AfB+gmuYjFtmqt zykdw9reh$;(#zzYR(q280n1y)+|l@$uvPf`Vk=(+GrU@V6Cl z-@8(-qXZsu2))5=2czAS`w*I#*jA)@hM%!d+L@T_tN!w=(!0=0qp-5Ff;sc(=qN+9 zd|qB22RC=q;2=`)v#_ufm2|Su1`#pd4QwW8zufqRd-bYBYWoFEK(1C{L|j}uJVe+S zSWs_?c%8+Sm6hc+G=Nz@)Z8FgK}s^vLzqIs1!&M8Mw~C~>@It|#FW4@6SQ{F)SImI zr?QI{4E+Hag#ef^A`E#bDh#cxg5VW_BnwdxV2QomjrYDdeh*WVB9kr>@KGp?FKqtL5;6%O(UPSAPW7I`HOuf5U=85*g8tFDF zao$sspgeJZMvbpYVeb9h7wDY;(+dyCo zRK!FlirQzx`t@bt*Tye-P*YKzmzOt$-gI2_BchLaTLufEg@9d)va7GRH@1>XZybyP zBy`4v(16fTM$jas{MiV{LT#xl|2}LJrchI4VVdbU_uE@5-L?L_gC|-ekl*kT{)Y!p z$G+aNMv|vwc~%=wit)5-QDU9Z6C#N3`?!hN z1wrF5IUSlxe00#9B0MY=hQ4k?uLoSp6Y>2ETrHqESGdi54o!TkuAJdZJPuSASVSKg z6B9GEcWPpSSkjPn^SDYA!%YX{2A=N$6i0p&URC)2-)F^H-A>5&cfm$MLqKq zJc~9SFDZ#nO4<&+4(=bvl{W%VLk+^bY5Mn%J?_BCAs>-O+*gP&|5RmkoXF`dExAz0 zOznwgrKgtyeA5nHJaQC4a`3CG)`yz#960cvE$1CEIRm#a5hx5;sUwAzXp%m_fRt>w z#^;3KlToa+Ks82!5(Pc?Q+Yhv9`Cc(oa?1BkSrfUc>o_0tHzUp7R^-w6$z+l!LZbn zHbme?%Xl1(5&57nWZ6MSM~7Q(>+1h(B+qW@akhzrP1IT~9(KaW?+(#!mCiElz0Hjq$^2MD9;r zXUGXvybW}g2yl^N+xLoH$}*6~kA5okA_n9=okE+6HJXDF(Dp#2f)f++-`n4^dQ!(N z5uGl-RC$P~*xH>1Q3C-LM#3k+oD3!`J~ZJb$E?6&v7hC8{J{WC5<>;pJt7&hpTw>C+!?3}9Xy~u`*8;yYQacSpo z#OPtd9NLbPVJ!92w24s37o3y?h&p%jKp(Ev2e%qzd&V7!xNAaHsV<_pB6 z2Coe%s1b83%XKw)6z*JAbjtQ?`YVV=dci(|SMTF%pi_<*-WlqQ`U2OT#MlgXNdgrJ}xG{k+seks664o1g(H~g)-`}<)w^3d!j z5tSGDb8xSfv_A^?CLYPg3ku)itSh)KxV$8AF@c$y4WktzOTsqqP+{9c-b{jEE8RoE zOLWq}n{0QUN&1q7Ef0>1fonfau{uXp}S1e zDfEZwR?(ED?hX74YFYnI2bm#^65xubl%XSxG8vzLOLkB(Hxhp35{E6hjpzo6)kLwk zxdMR3ILsiiQ{o{cd#_-RkLrfLf8bbSbgb&t3_MJvHv3Z^VLZ1;|*IAbkU8_Tn3c$=#_}F%LUq}CS;+~0ckr3 zZYRo^slm(e2^2pF)S9)rsF#!Hbl_=7BH>H5^svrKp?D~;;9q3c7(gkwu4n`4{9z9fo6439dBw5_-!k0Cz7JAs#x4_XSQ zTcu_o45QM8@UcywZ(|R7jplUiU__5>n8Eympas`1V9a*3B^7B!3`<;?;npPcX?kW- z1*elZvO)X;RntVxK-NUp-a2BkfvR)J!KeXsJs2}3L~{H_JOeb#C!TJim zzdfj^QQr>@cfiA*A0;;E+jVH$H=;J_Z!r<)If8*TF#^EV1i^VJui+Tt5g?jajVuEJ z^Un{^NicHO20!P%5_UlPDS6{aIzg*f{+O&kL;&HA0j${uM zIZAfQJ`&?mus+J5|EnMdJkVz^?4Ci7{IR~?8w8qSK~wZ)IGXp7kWh)G1oL%CyP6M9#e(Vd z2q+Z4Q5E{dKQJ9`fIAd)JiYjdXXBa}_Sdci;s~N#_ycl05(j`+cwptZNb^voqKmkxUB}U7Tw} zZ6N1C6J*1!4=g=MY_wcULj!C3ffIY5$5_pcccD?=f-(=|Vo3~vNkM+CHSGoFiV`N3 zUx9f+thgy|aP|~>{llaHK?$08k=;`(9g5B^sEbi9VP;N78#JCLkfUM00Gk~F4X?Ip zMSQ@^7^;*k4DLZ$QvqDW=2ks1w;_H)fbxktW>Z9u8<4~c|LL-2JUPi+c?)^d`?YZq z5>Y;D4s|eg;2%#+O~nDN;?gZ*z+%u0z0!*ad;r2-eitIU!733=+x5WjHU?NgdO@%;G&c_&6T}OI5$a%QuMHqvSRq5cc>Yq-JvP}jYt|^?8KEioU-2#Dc^bql zScp~Njauf0H1rpcn5dS<08`|v7-vMl-=(r`1|od|a$+?V&dA1)tBIzyC6_K;+O(JW zW>x9^_X+X&2~jG~qUE@T7aTa@=I8@rDD)pB9Ky{N8z!O!`6o{ygb4r4FyBZXIqX%? zV||Htz@L+p10~*lbm^qzhG$2zFun*BM_a*iuxJiV|JzYFB#j;sW$&N#;6hv>;`G~u zLIKn2O@UVuO<5QJi_!Let1#Uqcy#}!SEitEN0TYwaEbV~OtqUvlYTOwyc9$oq?=fT0rcA8C?EqGV$jJ4 zViI*6_W=fmUiAE@PfR%|15z>j`l?6UtqcZI8lV~CtPuR<@fKDlw$n%#6o|_P&;F24 z_g9`|45LDL5hL>%An`h~%pp_?San7qCHKN%v^~d^G_Hs%jzfH?ZegAbEw7AkXh|gG zT%>9Vh@^gli5qeUIa@#($YDdD9?(A-yX~NiKHyli3tsd*rTBPFXrzU)lL&o?g-F z)1!C>`T(E>Mp64$x}5?v=o!FVBF5B$*LESV$K#wjRtW^Gdcq5T>;0@$OSz&BHYHdj zLnwFckz}yNTNM>6RMg;r*E3A!4jH7f%HzH8Oi66$S1# zK}~^yFdA)$gc2B5WW-7nT#`OK2f(Go(QJC}s5FX4Bnx?~oFc1OwbVaTQy-AoP>pS8 zVYz_B;7z}D1?VTAb?;ep1{GxLWmhT_cNJL^b?#7lrGlbj5=s{G9;i8h|I*UZ zT$Dv4Ksg;<1wZcIv*##W)HqL`oR6#=Zp)0mi~?l@;#S9MPHygtRPk_VD)u6b`2J1* zhuM<1DG3}yFQbzSc}3NtBll&z5=T6ai!4UEj-QnLQ9c~j)Yg`_DHKgjc5WF%7HpEQ z!>xIVw&pV)C{IFsywQ*Go}T@MZ{Loxe;gG(`W0OiM@zc4`kR|Q_ud&YN$Kmyumx1d z1C5Y{CltO5{XSK^uE>u|U~}s(Q=bY)K@zPi;PKJ-OqD$2_T5RbI# z_V$Is(#r88TwDrN@yM?Oj$EX?8gD#j%^6fdd#?;tVzPQ>r^vCR-!b1pYS1ZljRXb) zqd8v)W;<=U{>w&`|FnbVj-Wehk*`Ba`2%ng2?x6;4FN9y`d%0S;n1)P>o-pj;FfT62H(>eZb$o!`Glpb57IHvrxV(WA~$V-9)w`JZNpL+JY@X++S8yJ!RV z!bKj{d2x#!x>e#3`#(nulq&PnUlcb58YdzWpf;W8kU20oIEeYCF3%sp0ZK=R=Px2S z5WjT*QHh2PXLW>K<~FjBwVmAnx>q2#R6wqsTSN!iqvTLZmHeHQ@9pdJV;f13I*u6! zqDkq@JZizrWmjOYaHNvQ?d@{>Rg?_08lfc{um8^8IH1nNJ`vxD56MkuV5<8aHM(@n z@2Xo)u70C)tKUew)Kv`q0w$9K^I_-(8(&>LLuz6qI3l1#=%lGT9ss`x1n11i!rYvk zFWPgh$;ruSE3RtH35kg|)5FRD@h_;T`0MtHPEGWjA$(0FJhB)NbSx50GWooE(2)}( zwg(R$44E9s0k7wI!QQUU&VSE`PQU>T5Wxk&&|Qw-i!1>wSfV*luY5!HqoCs81KkkB>Yqa4by<<~@>)(qI-jdVFWJ2@?>b0@V}j^h{tY9rWeySOQuhvb%@>ON#M z2TBVhs!e1Bj*}RVG*b9UER)z{Z`iac0a$hWt`L8=;!D=%*ROj&f8HWLr>&vEi=TT( zR#1FwL|cGylGwUi_EqO7Yc8pEj~+YE;* z9`x*Hn4-as<61_g4NM@xc_VNj8lmErJmBx7+&{H$_23vT-gyG`YB_Q@${||vHO8i( z%Ol26q$Pn1h)m7z`n2?PINUATKFmNx(%GrY(|1lr#zgxpHg)5VfME5Y^Q@cg07PbT zOfU*W36v(9zRLh*30y_I-%%67hmISGEh#u+Dg_-7*%yiuQ8(J|C>9CumI6U#-?=up?BYDJ!U#X3k4WstSpizT zUuS^|8@{VW`IMi?CKrAa(mM=-eJp5jTNnoPs}odJqrfAoM=HHNI@tsSrW4rH0em_+ zIU%;9OuU%ihTVP$sM45=ukM~C%LS3Y3Fe1G5TnHL1axf7V8*ZXg{pI6s`Vf2|GSV1 zaB+C%*rBB(FgnoWe*y9=vgtxz{r%3}Fo#KUUYG%EfU75J*KgwtE2=VsM zTGcj?B5}@h^vSn;6}u# z%8m{#o~+g9UHf*F@-Lo3dDf4r zAyc&EtUnuoY2wogZpN1{cMgriZ~&t&9Ft1K6w-!nXrq4}c+*3>&FatmyS}ucPuLOR zKq*`kD`zBathDu(+MBd4B`vyRr>5%K^%o3Z`64F8O!z^O+6x)SKQ+ z51D$WKh;!D)L}fLo~$7K?I{^(0&Y^yvrrXZ9FB7?98x_L(3E9(4sGru6y~}gxs+lk zaM0pV@sO=8nChA?6#+lRxH%&@~Uc2d5TYzrjomkp4pjrpwEVeHh~JgdjD}@FbP~ooB|`!Wst2O1M_+5047qye=SL* ztJ%VOm0)3XbbV)=H*iP2J---mi=s|0e81{*C3U6y$CP~PGV|TpZ!!$eZNAGxd7J0^ z+!}j|?`t#ut&BMis;kD*{#!dUR;SrWwU(}1spamQyr1y4j-J5(DItScHuTqB!|6GP zFkA?r0+!6J-(JH)ge-E#D6F{o*C?LU4j>Vj1rTG@;tF&qTPJBkH)5TA8&|nwfW&GD zF@d2hh>lNy>lWSGx=bcq;L*Y30#hLdu>wRFlo!=0cB!vj2Tp-i-5g~xLBT{}yeR^l zSh`5Q7?o6|!_eatiY`0OkZDEx-cn2$)}l7Z2{Jc1_d*G?QPl8Ah{UoJ9l+JsZCCYy zyc23GQEj+w{(DB@@jlwLr(StzihFP3*xEdL44c(ln7Y(`< zBl{Lv|Mj%A@2$dElj1JMnZ1x0O?a5!U;LxnVjn}`>7z}*nv~)$Zu(m?*9Q$D*%nh} zDKKSOnt=RAY6pTKVu_a?S5Dn0H2z<6&A0Cnvf6j(0FALSdq-MUQf1m@5LO#yn$DC!IHA&tw4C)+D8?z1|0 z?u2r%@YHkG2&xL^wQua+q&zQ!e(*Dm>m6E$S&g@J+&}Tv;Xwg>Y6mx>3LVg&;HaLEJG+e+ z1M>XN^Ec7BdxsGWFBvQk5OzKA4m^UVpThH;r=55=4;(njaOP&LQb@Te2vU%*#^+AP%_sxuhlC&}G!~Z_Nc$;#t;_yRu zN%>?;z0eZ9xdC*oGV(+XMZ?KWc|WJP>VEmVs|eu*(o0hc|HmF| zShPi@fSS?}oh(hHwKjM=Gv9w&r}qjrCp9@`(yROB#HB6SaeJIofIDPxX)E5!zr(9E8Q?H zyZILNjHaM@S5lA2kKmtzsoQt%G=6py)m{?rFY3{+`})q9P;)<*t3a$hiS>x@ddVYO zh_;vCzn=98u6Io^k0Q1+P>|6Xj;Avmy=Xj67?iJXO}lcR`}{hwjr0esenuAV9xrGq z<+GUPxMWIg^l9G;(4gkDD*^Hq+%J~Z>0I3laS(kqDf%RAwaz$K+lw#%y@ViS`fLj` zlYp6iW2_b48=3y2h9vHtT3TW649Iedh49tZ0^WB}1YK&4CgX5Gu{lrO`@}r{j|*_Y zMGLz{>2@8HC{SCMJ}vIt*|zIesvU7rM)evl@Elx;H@C-YzWy<6@@k9eOnpRq=)%Z{ z$!%tvEgI{Zc{@x6SW1Vhz+swUB5vsHqN3mT$!D>O+LwVOLV_qLLHn?k4As2kxHSop zbN5$2*Pqe~W2AU|q7SvT^5fQEC^CrM5cuq?GT8ovHRbod1vxJU!F!k@1jG|YVpzUq zO{-h}fw6$&rbngc)cXP`KS&hFSNbfAm^CG?B>`Yh392)!lHI<0cTxdgbUT<)2oz{t z2yKNBpRje%s?qp09*)#Mc5-?s&ij|6;k#n@{N8JLj9J#qzs)H_VDx4dGznU7h_UF8pS?SClhuWqVrV5y8NeB2on z{O0xR7?qbBZFXD)u6PW)n^B2Szzo3``SuTrG$;yV=j>NM1>u0rQ-HpRYxor0LG0Kg zP(7~Z{(zB!4`hSo`SS`AIZ_Az*-}KEL{>81eW=KV|5S z6?xDlZ%Og+@O+`(rR&&!-yHL1D1khlJZU_0Z>12*X(Ao~6Q2D_zy z$v1VR8lxwN0v^z-2Wjnb=Pq1TST(AmsH`#$?~X8PAR%Sq3_2_KOd{HfrowKKG6y>;e+upx^Mm15WZK&flP=Yz9a8K4N@cA%&r;rm{ulzL|Ltf+ zzp4T$Lh3A8?DgBI^Ddv-_10M?iYd$Ql_y_6H(}(<&ja*+$c>M2Y6rhSzQdhf2f?*d zM*IQ)MDVbmFrQEd7Kf$qH(FZEFsvgxQ0`&_E_LwC$d|_ug!0-?=%dd`YfaiJ_2ln` zr}F!0-O)&(Z1iZiG(jbe*17$sOI?@*ILEq-#WHz%(iCz9dk=PMDR|Kx5&M1 z460X@%? zi(Vm3QuA4{7I4@@Dey#E>Eq~P-Z?(opI=|5an|JD zoc*OKWcAg{I%V6m(5Q@t=U%T%-j+J0ez-Brf-~>wf~c>dn!fIBR2L}{3``NbPN%Cz z138rMflM~>Vaw@Ppg5;aAAPX(fLlPX$`dLAwgXa+!0<^4>K4F)hAp!Q@7}G-*Fp`# zwo8^RNoo!S_#^jBd%mKmupwvNeEdA>+BUi)Yqe^sNow|(M+;!a#E799; zf4#6VxNBUfahut??{Azsr;7GQP5)g>$x6jTE$u#_=-2n{?e)U%^#=8k#vShW3#iG! zPnjQs9D*w%cO0tp15Qu_tcwvVgSKaWLvx|)G$sh~q5rkY9d!F2RK1OVy(5-_s3Aa9 zCg3`PlxFcVFuE6+FCR;(nOSa{*c9~e4iiPXdrsMgZr)c>zt$S)?PLDB;Vk9zyPy7M zb`RfWZ(Dd^sNQ4tTK5CbA6Ve1HYq8UBpD|r{=a#2tQjt z?JVVETUPptYu=VRWcJytjT9Z@6@HDp+p0d{DO!0csxsVQxe%o{3|AK~>8+sggH;1} zr3?9%U8~>n{DlkbShETA1Ypp$nc2*bx)mB9<(5wRP*@l;zWnKFY-Dq)oANS+)0O3%ys=JTTe$0qJfme*tWx;|3} zvG3#74P6s&T{^qk;%pcw9>1L{-5Nx7r{m0Gt;g9iiRn z_{Pc;W(DuSeXAv|s=xtknoIwG7Zzy|+z%f-jFuG5w~OvyN3%F8(r*s1*S*gVQq-OwV2IhwOEJH+O*1-}=ljJH3|3Tp!a#p!gIed@b?{X}0Hwerc2S|g z3El@pLx@q>AwfaGbBqtRO7-ih=+G)tV8JV)J`qEbi>CF$0lTml@l++d_|el`ZWS4Z zBP;(dIdN4E{CIEkt4nP6-Y>e$6Q_77Ylp)aYdJI%pHCi%X);S|*0`-XrnTfSKjhxA zmdp1VBbTpyvrBMf>5^4w((AubJg>a+^Qq`9!EaT4xbLY~Gk@w#_)%UYA({ch{26L>8pLt51Pj3Tqf_1XKiIkuy(3s^2ZcEEn{^Tif^p!p1Q6!3QjLX*d#xF#i%gAYTtvc?|+{sxk+Du zsnBk87dGDbU+9=SGVpN!NBw~OXtQlW(#{>PTg(}$H-89`!nh(gVGt|72ClJ(ojd~?KMq9Do8vqzDLz>4L_qRli+y*x@0c1#Kh`hnP z7~=Q<$_*hn!V-b3UaMEuMh>*`m7zYWCNcNB;Yaxq#zGRJ!J|n0lR2>VKuj0r=Ay)` zXC7oPvj6)eC{{k-wxiZ?TYaB5mu9ci?#>?+E%}8hwZn@+I$*@{I46Dsb>iiEAVeR9*DtP}_I;ZoSR#(mr9AnSC~fu)p52ls&QvC` zy2*hvXOlpJ_%k1tQ?cW*D_x!b2gXmXTg-5LbL;nH9o@JnnOhQGJ_HDgMZW>alaV~* zaib?Ki39(>fHAy&{dyw95i-{!U-ZE07X`+L!7F?p>VR!pcC_Ky--prc;$6ql-_#*` zp%SMh6!D&LChGHUSN%W(g@@ii#6FSdfdTmk}#3GQ^yw&BB*sq$F-xVMJZdeSS z7NE5(_ceo2ab_i*`p}AvR`|%ja2p#c9As<0a4w9;GaVMc{L!pMr zuTb?LMa=9fEQP+^3cQTZu=szU0U|AVkOOjjN^|ot=-{^~=g4)*1s&i`op$Tp#Argf zo#bouz5rsW0`e&X>EF6zckT)L-z6antnev8C>EUfxt2#D!gE?@WGRGKdC( zRb;IzdI;hKK~M}xg2RmqqalwX^gc{n|IP$kKEausl|wE6O9xyqCzK0-9mcf1cru6y!j97%pmbC}FA-$gH02smSt|37Zjma0f?fTM+GED~^}|~X zyI5zJJ;)qkBYa89&g`%&*mSt`4g!JI;GqsQYgrf3)I!#HGrM z(BXRPcuu_TwZQ~ybr1SnP)(>CC$D`cvYM$?1zAR?z7Ey~8qEk9o9mpy~pdEdG z+oy^;f7uCGnekrcD^rws)G;!dwXyp!{#VRcYQmk`&a)BT`gmDFku*!Z05aUntQ`Or z{+o(knLr14i4X$oZz(>c-8ny3x>AopD(DX??Dw}yt^c+fSZ>3$r!2eb9D+M1geG83 z*32*y>d;Eb^1RHFLGlgvim#O%iBw!`TsDchs{cJX(MCzLi7EbeN>VS<`TMnW8|XI0 z&3P6#m8Ms|D57?z6m>nuU|p)wO~)H}BF0Tyar|R3{)*wdziUy~fdB5xR0v$@B$@=` z&vGPwF&ZGPGK|aseZ^U9MxoPsn7r0so!Ki0b`)eEC`8Ap{t0L(B2L=elN6(QF_u}; z_?6<^We)?E#}ZxVeQ(DE?Js_Gv$twPi`v6_4;-NE?xeM6ADrX;m3Q^^MLX%yROvS9 zb$k3;j9EXfv81?edQ402*u$h!ce*o2C! zpW|u;3om4!K1>0W`F28(pLM5A*Hv#ygr~fOVn(t{W=rbbqSsH1XkO7yADdCyo}!oX z=}q3~*Bo2L4DM$CJy3a%U_LEU@S6=g_f~wCc?92E#Ec|M>dE;gCeaL1?QXspM#oKI zEBWn=XGzH33zs%YF5RCuYCa6*<;`Cce2{`g43%iW5b2)HM z2`C`yu>c_c_6{5nwbjh@E4m^9o>ow^m|$fd$J00K#4H4u$gbW$XDSIOR&Q6|bn8pE z(nrdFYyUoclNu6sx43L6X09pD<%&FA<*vW5m}VBc8HfgNs9oAAEdi2Hbb3CB2gKDa z(M8mIm&dW2%meEO%Cgc9hDkEj8b}VG3yiBh@7iw6N>urN+=t#{0mixW=GBU4 zBYod1)wpLBZwsTmK*6fLj^g%xlgBj6j$$8A9())<%XhO(LVUiP+S%EXWuF^B?QZn7 zz2Lj|`<`Cuo^R@l@49$yDE5rDyk}O%wv>s|fX6j=S4L>I(mbFtExY;EeIc3g%dzbb zb!fL;KKi7!Uh7M&G#wz>XQQdbgUz69fh%=7m`5)WUETb>z>FF^tI{;zF zA?WcFI;t;M=l3A{fEa|+YUcv6;Q!3nrpd!WwAGZgy_Y>Ke%2^AX1x<%zSsV7wO zNTlV4o4}Gp3W2~OYV0qV5@Z=P==`dB?UUx;-`IJQg;5~P`YgM6#U1vgx7|;ZQ+?b@ zZ7BZCc>20Kyl=HX@$bspvGvg!YKo4t$JitWpDQTb;hH*O=g1;%?2^17b-`k7OYDF1 zTb^%xw@%#n4o6HHVCjTs-8(!S5`IUlOJ&DHfcZ#g@)$E=9@M8Y&CY#RuUoEer+>y_ zOh7lIS1w1a(=fqRbP4yfU{jM#|gjRSlstI+l_6iqk2zm}Aeq5|2e zEC~t^X z8zZa!kqX(#rwH|pa8V(A!jHbJnYWqW8VZGDJU>V-8QBxuVLh1+$e)jp6 z+*MPtmqpb683^LUl;n1x^K}G2OntYdEgo1Y~tUDn+Z1FkpU~8{1TC@i&{7l}y zf8AfUjgoW+UWW<5#=;0LH^h{!=m%6z@3P;gj+Doqwrx5rrcwnBM!XmwXf4S}Ij~>Kb z$>XSrBQq}Y#~ZdE>Q_nmdjaBQFky-5C&sqG2318=N_Mlb)T5V&?T(s=T#1nY6WPE5 zcWm-+HFI`O8d{Hxk1K)#HxDj(KOGNB$H%LsqwuLy;(w^M&{6>o8UhQ^S^u=cpPOJ~ zU4^z6De56+8v4gWn|%T^A3k^h9b*KKnozwbS>b_AukX;9;>=4Xzty~-gn=yqFdzU2DHcz5PvJAJl_|__p;aKVUo3>}vZ$rh&^DLDMRy*J2GLbC`vma(fMOl#t|sv75ZRwi7M(+ZbYX6()w^N5g1rnZ zx$~e+fL@>?@)S6W>Auwx(fk}YC4n!IV~P9`HBXdxK)WxPXH)pWlfU1NlMt7}a<~h_ zkfT6piWYySTAZs^M=T%&Y{YIuG=S~gZ`E}M+sw1{7o4U)iHws~<-ir2eGcN#at_#U zPt$YDvwY3@pvqInz1ei$Etlq%`*`X2ySc6<%9U)*<4cnpwn}>L`r%&c{`AODwW5^! zDSL`fBcqG@_>2z56!)2T29K9+ z`SC{c=+mw50VyA?;VEU~b^Dj|J!Mb0&=upJ_sX|^+28;D#;H(& zmy88gce=6Bjc#{vti|J+sU6a&EH30)3O{Jmy(DtsUknE=sDVA1rL)JadoLotE|l5P z(+g~5p^bK?dVb{P*3TBA8u^wSB6nOr%ys#`fA>yyOoBAtkny*V2|kVGX!SVopz0c7 zCBc`(r^)PWs!P7+1dN;du?_1G2gego)`*wjo`hUhw6TOE9=Q2AP@@GJD*gSQOBO5ue}m_VyAg0lI>X zdqp+IPU7tDwR+BMiwFV>D-M$!#PojCk}7Wb2FM5A`>hoh94!T-eOkhV}MeztPfJwiH?9c2X^2D4Al|cq2kWR_s z&!crFIV1x~iQZkkHnGyjF7a=tr;i$)y?ggAyd9$P^ROLp8{D(1!Dg?z1J`W;Kk1Au zH%Ji;S>rBloho1`_~J=Kiwu5Tj34zJ>rpr$1nW8ysrgoz!l2&S>$HsMTqgch-W^T6 z?Z3Yctr=HRR|{Un)#J{U1aMO(?gb!XPd=Xu)oTW(0LKzt_m=v z?-bK>!lEZ4E?!w|D@AD%i3|`Ar0XU~BklM4`7rxj00OiD>?1P)qWVJ#H&g!Y$DYDl zw{GRymFp;j+k?AR2~tAyY6Rb4^nCOFUmD=qQ-a&2aqk+t-cPR&6EYyvkD%!W z-_I_u50H!f8qLOY>qXRIL9SLhwCWmtP*89_gr@g1n=0`#lGY)=9Z)PSHK?2k-2f4pFd~JFE}u8y1DW? zSn~Mml(mmF&P1`xldHXI~dh)*OW@H3(H9Ow*SyyX;=W za_SaE75~AvV5t8E^g~W1;xRod>lO`}6(Z9He?D8R;Dl9YKcw#Mx_SuaFcLXE+CMb( z7-Cb%1R<_w+OoxWoo?5m01t2xPzTn+>Ihv5HOA=`?d_q2Y<%PUNl{VJsF9MtXlTf5 zhgC)zPspT*wDS6m8~YQ2bqxTH{FeZ3rmjL(s%aX2xRb|S|JtiA0_-|0E*^ywxOMmL zN@N9DdHI8Ue114DI6Xmv*Wo>fg@%h?XVFdq%KLO%7e^vn$ftB=a*6J&J4zNqUWUCL zH}GG1Llt0ivZqQn1j3JikdX7h5kW)MTw%cyM2vS@ujA|y9t(gQB9uXf>%$=dLIf?5 zG1%K%jCh{>{$6+n#|DMSo0OyOA3uI19uy$Dd;~LKVsIV|gAfKjZV3;rG5&8V( zi-))O0QkdOA~54F$1h-=KVII_vJ;}cvRiiWW&uI}iR}DHh$xv}8W>Qzj@egHiSs<7U>QMfr26yb;+&cTNMFIm(eEIiR3HAT>nJCfrFh3_Ir6S|UxORiuV93f@V-<4Rkmo+&D5RHfT-5Q+H; zXic!VuI9IDpJIC&3j^I+u=ieLSlzmN2ZAXQa%_tQ6pcjotrqTIeB;L{^wQ_Sv-!b% zX9MtGFW|P(F0+gWWxSL`$gpFbtn~sLAKxph=nl>Y_O4wnZQ;4O+Fp!PZ#$G}1MBKG za_gL|8~GvvhY(?9<-^c>gL)t7cQ81WMNxHXu=v8+^8JSt#UoOe6B81^!xs>;4Dq>t zA2vTLSl<0upZBXGCCw|hl_QCYPav$Q^oHKtZ$-BsuqGqSHzXB{x5!ufqk?w? zD`wlUPY=JiO}pR5fa}%vlgTzd_kQ#8?l?(RM3J^8B{}Ro3vD;u#x;iq4NA4|zLTKm zrD33a-EXi`XwKQlT4n!v=hOq!g&o;=)M3EEa0HCpF5~SusbLL;z|?wazkrCzp^Jpe!MF?*ri$XGXTzPhkm@OY>Kf$>OGB6cB&j8h%gGTYNi zi#|qq%DY2iLyW;OR!&?^WGkzQjClE0&)W#5 zS$J+KjsqGH8Nl6SuRBt#(8%G;oH;*vcTkzLuxDi5?AD!9>tArMa!pWuA3hkor71>| zT9pn!xHdm(NyMH?^a3O`j+d^86MPj3=k^^1O%x>mBTlJVIl*s$IMd*7+rrKWdi<+1 z;*)evtc7ccRtNJ4xJ{f{E#iM4MESc`0$&1ttZ5y5C-3}bMrim5fjiE`XZSte9`8)o zih}t%KNKQqU8As(1LPBt%1GJ-QurerkS-8JNK-s&a;WfCK%xszb+BYdf<%hac9Bbq z<$(XAA0;&nFU(_zH(B_O%mrCVhQjH&xg_ws(sYZp{@;%TCK!e~Y9cgP({cpu(;(!W z(3<}N8a;(}FquW(4&f{wP5-Uo#=CgX#7zvf!Wo1+^tOiu1TK#~5zZ&XEEN@dlrQP6 zgZO5{7~>O5hH8IyGMh+O>ujZcU&T($gh6-?=-@+%_WfMvL$H0I7WMG->_etYF@ECd zc@T9L%BjA-zB9-gW>9=%)koEvi|8gWCxzV%G1h?L3V8i0tplLfdBJ@N6)ZF-HSkz@ zjj1#RC{yifzFr<4l5tI#*sqs>fCWUq{QxYElfDcpz4pWke2W15Na6(ocmX~KWZBDQ zAQ|75VbXanv(2>j`6ZhB`>$F1x9K{0qt?^4?^(N<`J_9fX_&2%T^MSkikl!l2mDD5 zv>`PY#X?lA(0g`^quE5;lwh|1pwS|vvVIfD}HkZaL3Tb8Hdv8_rhX%=}o%Ssr#9h2j&Ghqck|5E+fe6D>;B}lf zqd>7hwj`6T8V!Z~gA*z*f=!-$!#J6=uheE0ZD58_zxI!*W>||gRP03Zc=^wnC zie_518~#yUKB2zgOj5&)akc}`j!48~g5dI^xfodI*8B-Vb|(Q5 zJCV>6pF^XW{;aVCq|Mz={N$m;216Z@9f9|3=531o55`db;nfM-{R~VI1{OuuSX0)n z>&8sy3%sWYHmEw`;N*1r=3CF*JiUX1k3en*766iCX68757ZL7ZWQ|^E;SnI>7j2{I zLR53SFcctyN1`l7HAze~Fl>bCj2QnC8A@H9LiogwVOVk4BBX8@A$GHh(Hw~DSO3o4+28^(LgUs@s(9aN%3OPh8;>@+C+FQ7mZ*0MYd zy%ECMRbGbpSI%CbX;FZ7_|nGzJMp|gU^(e98Q-Cdm_gFfS{Z0M;J^FY!s)OsphCPa ztSh|@h~PYoqk%khquhg9gB4H|@k+wSA@R1rs%sEj3|ym7;C`6i5U>f@6`0)qxV7L6 zAR$w7U6R`kZ&ehh_}B)>?+p=6NYZFDo&k*>`%B7dSkT~i245eg*G7$mJLZm~OKckP zNn4G{ATU5t{3_V;P-J}@)U-K*8kztuW^%ul9}b}BB46^JnhtK^PBahy7DstjZ;b@G zG+xMu{y{;B9nBiB%Ol&fF)iXy&tNVoDIpX_oZQB2V|faabAim7f6G6H4vLIo!Q|Zn zPb>=J8H1rVF>Qyr!~h({$oX(bS4C1g4lBMmu?}j8fOT+|CHCQ>;v@qCJ6GVyu!_N7 z_W}l}-P2@$9DjtaR$fJg9#e=@hXOc9v!R@t!YpGFz{@KH5S{9&BI0eQo0$adLxbHC zL{VD#mL8aiBHH`EpWFbGAv`BgE~Ume3Z+t8$XP-1-Fm>ck>hD>GRpxT?LvCTX$ptH zv#zE>;nsIn9qMb;D@O;`!j*s+NrC7u{;DP|9jp#L^6|*j95yq?Z-3q2BHj(q%?Qt; zK~-Vs5z#9_)&weg^g=!?T8JqOrp?6J3tqsMxYYmC$=SlZDKAdcFRxP%_8C=B{NR*C z*xlQJR#G?Bs2@~N@>wAlLLnayJX2bE2hl~t2r#pFRx4w!3*G{*fB&2#7HvSKbFK(E zOd26oSAkjk4x}R+v2OursR6Al>RdA5KYkpyfCxf~2vS8uJOKh>Dt`9aC~$$cgKmTb zzKXi8jY`{f^em+cFc^f9jN4w$Xy+J_^axWtoTq<^17r08)Fmd3F_N%jh{8>!4l?8i z5Lkg0ZRBg#L6Eh`bSK5gIRv>Fr~5441PDlI8-VGN^)5to1H8pDu<_rH^4@Ip`yurv zM5qr1^natD01_mgL1~PI880nUQ=V471rG@{kObfuDT4&aCwT&c6X3B%k+3p>r``q_ z1!9y#d}(%GGC|e(o{pzT0vq}Ge*k&6CM?suYi;y9b{NIonuT3RMj1=67N{a9t1R4jyhkGwlSw##q_Rkh9)y$vZwPdY7_f!g6DdxeI+YEZ>4=C3Ahv@DFGmh7 zMj9AR3s;f`d)E;=QY%;$dJC2XO&Rq|DA zlNkhMWPC=LEky5$@|FxtP>(hH9F8Kis?xucbTA(ygoJkPqd?wDmuL5&uTsuG7gEK5_`j&+If|nJ|xW?g$<& zypLnh5@`lsK`@8a5g$qsU5A04sRK}9^HQJ~AcoLDH!%8og3=2t-=o(%a^L;fSUBD7jzPp68e#j_}6Q)WvU1s;pNqjCpw;|O?zVu3UTsNV_W7DvY#z@8SjQycn|I+H2tp>T!7H1ll7;waQY z-|Vh#2+Lku57R$e=z!A6$jIayPXBv}SX~&Rpz#5a z=Q(6h0zVKl(xEOKe8{Qsh~VPhjgK6Q`(lnca}m!FI)T{ zZjIgNPv$-+To!MUH5nI^oci%My>|pJJbS0#jh`b81J4Bc-DDe$!z3F*3PH#Svl)zb z9JGzkX2>vXcbcPDx~FID_RKioAQ(_GnPXCgiY*7L-T??4S=uhX4qYp*6|1oKSAAX# z?6xBN*$Qj^etTl<6ep+b0Grf$~R%ef&RcWt8lUtdc@y3)!oTY=x}MB3ov*3P~AdWv?VMv)2dNO32<@_DD#$pD)+< zd(M5%@AubzJLfvr>AL#(yx*_!oR7!j*>P7Ls#&zp>Ni?DT7XUZ%IfFL($Z<&Hxnoa zWje`0QR@&Qlj0AoN6>R^a=IB&@ByqqHzX!-jDb0&S8BRtqLq5?7DOLswU>__n=)ag zKpo%%ShKKECWLK=A|UYCI{X=?hUP9P-P&{u19bBAI-r7 zl&pXW;a*D4T4NNJm6a8e{dF5;{}D760zipUOHU-bBxpZwQzCY3P;xha0O1iJ&%Eh0 zO9&l!_r=xUPsQP(Ae#sRX*EOY=%*y$Z@vpU8T`1-xy~E^&9Y>x@HXMapRB%+)*9FD zO`ic{S|kw)@)tuhe9R!|Oor|c#D$h6!!2A(IAR59mbY)?L*cPlFX=!h^ad?4BK*TK z!i6;q44Uu#=Crp*tzjj>?8+4yL z!J`#XtHASU8q8|}APco%QBMc*EqR}UeoKMHoxcR9tAS#R#BHOl?{Y5zTw1rn=`x5) zVf{lyq}w_>PsKqt1R^~o(f}nT`zYd5_drUni0MJ`P$$ILADviSP_2e+>1|zu43!il ziRSREi#t!DN^Wu0R6+*@P7J~r$le@WT)b0)0gVmm3sh}lR~yS9!3dK)Do_ga%yEG| z{U342lO9DW=WSSNDF1-IZ9G(A+Np)L)uEM;o4p3zACBU=6YxMWvU! zmv>NA7lQh&dIDzi&)2I!s0a9t$5Ni)a3GU`wir0nujYIZmC8JPh{lEiE)6sapM!`8 zyd}(<#{K~c1fY-{-uE3y`RY`sUf+I}#*XqmaGOj1W&%y=Xfhu(P!JOz;zY>C?&qY9 zkE9D;xZnq>itwoqPI@k2`_kE!`hDO$T>N>l$wC6I55y%4V25Cm1>h^b|9X=3vYJ*= z#tWzU_oD}kvgv)3Mh%IYMw#xZ(`WAHsz*TEhK!b00aAMhs2A3YlXn5S!x6$c1cJXu z47dkMAmu|0SMIgS=eX&Z!J6eDx+9qVGMn@ZFL0uB=DO*eh0nP*eEx{E(e~bLrQUt1 ziRe@S*qsKAR%mTNp&sd@!cWc)=k<|xRLd$GfBFhM8pOf=ZRV)C1wI=ldZ_`x5!KQ_ zcneKhfne4N=7}JGx!K!tli4xpxiwL&idr2oZL@A=4MaGJz95y@^8!g2qAn%ub^kZu3m-LWd z(cK(_*WgCUVL`x&th$b*LLz}v^eCT9=A%k_t6g7M394XYd(3Gl!2}VQ=DGr-8S6+6 zo8VOx6&0jmc_)|sva4Tqo{m$e-oR7BGV&9hbS)!)gdtb=`&zXyh9BwYeu26i|Er&% z!K=}PN-_3NaX+|R&z|XWRrB_@4*epCV1vT|;XktOtV)kF=wn1p6 zf{n9HDQR-xH2#;%U)V2Ggrip99wsH3(jzItDf1^k*$(&D z?qL%4C{C!<)o_R1U48fy;a7h_qgO|jOe(p7oqNj4Wk)ds*};?&J`#5~@}>M9U;+F2 zE_8+xSj2TL6O)`Ac)Bn`y1u^~W!Gdh=*?8_p-#f0@N2-^tD>|Xj@ z$>gbb_)0iTx+H1kyYI_)^%QXJaCH3Iq)z?Fc+8U^7*6;8<;_OWE=vVNkIH$#tN`3} z{BoGA5f#8P09G?t^GK-b&nk-u%XusUdxFlWZ|2(V&$o1$j(c>El4wqy#uk|z$1>zI z#)-!D@uQ4hm^tsj^xNd=7ZW|cJl#J6JDlrxdIMFghBG)IeStuQZD4I%^8WVW4%9nQ zAqMa?Hv@q#@UvJcq=T*XOp^s@U7|>n{&=tz@Ck}_iEm_25rpo%X5XRucm~g8|A)!7 zhZh)x&2Q3?oabTWO*OxYhkuG#`JZg3cq1)_}%J*3EOSA^awf zf?tQ6l3Gq_Qty}g;CtnYB;}szzSJ+@-Mf*GlEcDXcLghMhD`~Qoi%9paVlTLqPcjf zc}rS%J%ugB6szx=PL|T#iP$*gW=Ns-mB}_56Ziv=HK;cE_7$a@-B^8U0xli*Bi&kK z_S0SojjCKG9-QNEiLT@HKl`35TYTpk$B^94aNn^&X(t`T5aADo%R2#Tl>$0>B{w63+b#l2mWCcFvcGzq558WX4YXAGA?9l@x#0Q#=!$jKxw=_U;O@M%eVG`;YE27n5 z{A}Nim4(u{)8y$tUQSoSzuW9|8V`q^_U(|Ce?e82`j0>>-UQxo@+5y#O$W|-r7;ng z><3j6paq`_z7;{6=YDvoK~)(7jOnVI6XdRZ#EHq@`Pyr+J7_d_Y5iN)%_E=CVUkns zr%TuAh288{h66}@^v3}*Ym1rheW-o_rIv>37u&)vD^w)dB<6UJq(mnzt`{r(498!= z5%g<(O2EhUa6{%BjeE|7e)VQEeT8NUI&^^AO|_q>1wu-j4Z+3d>S53giyUdP08yFZ zhh3&?|0-y|-R|Vv(^_D>~f^VX%G%}$>>XXG!Q{zN>oj0KARRmp-=`h3j)%fn%1t@z{&t3bo&=ga%6a{UyqSAU9Qxf>o2MTEJAYh`20$Y z_qzQYt0FLu{goLcBcRMN{H-$x(iT1l=Y0~6)936x3Wl~AzF=)l8;aq)XTGuM)1BJ( z<43Wl8lc?Npao*vpLt{A0nFEVf}&f16Mv@%BGP8Hc4}~oUZIRe>kD}+u%$}9^D5`0 zc=65)yy3(DUn~IC!_@GANN(Rw_J96qXZktLf4pj!PraBHeYWG~P z$wH0tkZ#Mn2btm5l&`!+g0D@VW8>4@`mTk_PX#V@{h0B6ld>qXNF~62W4Z4x2%LTV z(-?aRvU{aup#yfkL~Y(ZdaBxszK5J@(k3Dy^<62JJ9=~9j_j{O&r8rFH+TO?1Tt1M zq_W>i8K7$0dK^u2l!KM!Fp;dhXTDD`I&H?Hra|y}Q(Voz1o>{_UUof#&(k{NYWFLh zvrPr#ZFl|Vu>n-k4jqMeG!LF?bT54g>6gw~)L-Iknsua7{v>(r&*9sU25PG2G}=$J zR8o$PZW@)lD|x7crlh14GR#dL4-Bwi&0;&1JC29kTRs~5UCHUub^frPbbQXik>TMf ze`NnEL++aiTEo(g&aQVE+C|u}->U!kH~sHF$=g)a>9jb+A?d~Gz;wf#gUmtOyA$4R z7@BYvFgojh-VKJrE85&M_>hsoj_UnhRfYq``#d&Xk`e5~K6>|%pyM_9$C1@U!`yMg#M+ba(CyfrsP?cN$FzLD$fSdLVQp8qLJ*{o}=(0OCU+CoFq0R^7^D8c&+5q_jb+{ zRAO(!gmfARP;Qex3?&GSzV&n^PBNAzR)d6{L0Md(B<1lxpl&poKmB_+vXurAOHYZX zj@TU!KI26!SDJ~}MMf9-xhO3%alAc_`j}t1;9)(hFCP!y4~Yxq=HCjwFaUraI$ zv)2YToT|rJUR+R@{^FH+`Izb0UO73gbu^CXUY}|d?)k~HJV^o+yD|(aMvu|7+@GpD z3Q(j*MWib#@nl-Oft|f^8{9wjGg_z_{CUGYMBXljK$m0q`LX?a?M(W|KgVHpr7wP1 zW1aH9rV^phf=5msPQr4vDS$o1@6?777ft@t&83~JG+n7$Q)wbX1sZkM-wI)bnwheT zscx;&+XrR=I5__1Zfr#B3u0S@=5Ag4D{*m&`zxTwlk9!`vTLDOv`8{R%p(%u6j!yY zfBPu0uu!hmIXIk$N{A3iR-^EU=-C6?W7XlLrXZ6G&F6mc?a=oLL1l?l z6*s628cv-sO-$K&$I@E(iD8)uZJ=3cS#I?5eL-XQvojS#W(G_#RuhHZ(Us%e92{+T z%hLlkN2htO7uVc)R)@#q<>y$=@Iimqu6bd5Xl#}Sq`bqkCqC9X&bi({IEG{S!g0&{dRwqy@|vPyk@-Ic+-hs z11b9r?%%}@%Q9&>^2N{$uS!>XJFtxIz^KzQr`Z1Qx4ECosVVAri%FBFyW-#9=~u_z z<909e*d*QNcWjhHTCs_q%LNeeR;5>c0w1ZBqsm!&vuw(6rDV+|eoWXeran~2Yx5h8 zSkF|1a<6_VbUQvx+)I2xPcwZyWWRbW6p~ecT%3GrnMVE62YhI=6^OEcn!PGCP|N3{ z^;bx4$;}34&GHdL9HM-9dq;7P(;pLnI#hfXI_n%>#yGnuw1-YzZT3@1lSjt0)8v#4WmMcO2cs#Gd|AW05Q)>nt%L<8M*b?CtKmF)lo?J&t?i=reu$YxnW%qtX|UXDN>zEJYez zpj%hwrYh#7Iygr#ah>^Kdo63t+Xb+zezvLq0M7supvOx8!t$yqamltWYX$MM z1?)cJepd#odzE0X36MKBx0)r<3djF09PeH_8oZ zMDD&j6nkQrN0%gL-aK|Ifc|z>`t)2~U1xK~Yj@u*8S<)hqT+cnTB^x!LKEhICO63+ zU)bJM2$COMAGN<6{i2acW?l=gy106U|G>Sxv9Xj`9|{%^0WUo2y*p--uP-Neq||0X zxZ_hHMD&VcLv{00)-_Hp!mp=9)<8IjBXAx*dD}J52Uvo15Tpr*TjH zWIGjXn1Iom)L%7Qm~hq1vSS?oJE33tf*+CqXi|l&pP6`la2d)4mdh!Pl#I}#w$#n> zSuGjREqA^+P9$V(>U%?DGI7yjYWfALF`4B1K)1czfD4LN^nWU01@qq-1h#^7#h&v< z)?VG#MC`z9hP>*A_qy3aYT|Ft%w*1sa6rhPs1d&^z0Oj=ij|LJr!N!HnTEHQbwK1r zJGpa|zrFILEAWsSYI_{jKMqbMgo#Y07HB8_!jm9%SRB1L4w9h-eHAbpdff9^{2%jv zs?y-6Zz7)pd{dHl$9=;<^5c2Q5*RNubz*C-H}vuU971Se6RSz?3Vat-wX}B=xZkNV zNxx_Yip3z6%$|EMANm@4E{_W@nG%fOGWu~@%qa=i9lMjYao|$je0>n}*X5nS&wnq< z1{QdB+2I^>la-3_e-4=R{MI7>OyYEha%MAaWzCPXIw~~IL>?~pb#xr=xxtlMGx_Wa zAO!$n@#MOM1h+?Fd&cJBrfsc)&X;U`b$WZ=Z#??D^6TFrvoGnLD1Rxx zT?sEzUpL==S|jF8+doQ4xFHQNe(d~oh%w-8uOE5vj)&F!k~9rWS6P|ITbDPY?$pOX zF_t0vDu`pZga5aJ8maCQ7|Sp4m_+}t~G7gZ|De)iA9fbD`Pd|OM<6K)#MsM)Y-&1n~5 z!5qAc$)B!0?LoT5_Dr(=Ng2W8pfB%#oN4i)IFnQ*=C$>U?P6Xlibp`?S^-Mj4VuZp z!5J!T7UAE3_Q|O4YW#HAle<)a6FaF;G&si+FUgYhf%ne6)|~UeaMY?z4si1#^SqwV zT3qH?@Ds0=NXrlg9pg?e{z^GGGX^5nBv$v*TSA*Dm;Fa%^i=*ne1i9M@NlzhFCKu@stp@pI$)?smJcQN5U%6#r0%3(qmX`?iM%Am(NCx)PEX zCTk?U2HYOfWnN4(zylq8!u#hSOxW}Gu{>XNwJ7=FN#{PFkFefx&9I^|7gL9(3mS4MKs6_b2+%5V&@*-(8AyRuDA-e&&J0Dq`oMgO7* z;i(b=7XNRUyGJ5opC}86VhLDH&c=C?5n_d5FZ)N)h#k|XNT|=B-VyhAVcEjfX3@hH zmK|%>|$2AL$3Vkl~bb!dfL%gxXwpZHtDs8FF z1jWAqE!&~W7w?p$_ln5!Mz6$Jx8#(pKElN7zVz|T#oNS+dn~!By;bC*zgSC!heo=6 z)++%WW4?@?;NaFB4JSG|m=`?N*~YIf@a&W=whw-wanwEP<&4>C5NFJ_PdyIY`L^wu zov;6@Z+j1`|0R(w8(X7)R=)ZJ3hjoi8~s9qr~LACYtCEs&0(`>9y7h%S>5ydUAOaU zmf%swTR=b&WMk^|Kvj#w4gc3HZ_QIv73#<{i`cBVo?Px;jOqmLw0n}dOpE_>lnlD8 z4Rvc~xlL_l2d1Ascp^SB_%JsqL0XE+;o8P=9&g_7a>fL5RnWyJi<|~U!PVPW86u~T z-zDw1->|ant=FV|!yrNt5Wwk4vQk)@ZcL~h@7(w|jfeRM4ZHu&{qUE6C@C!l-!g=p zvl{}{JXA3NC=2m@Mi!Px2_>#)i@*c#mvnkmkYbo^VGx@UT{Af`qUjrhIo~{s5xFV$ zJ-N{+8K?G?rr%B7#=&8u)Y{eTd~VOUmYz?`_PP^qcI)5!OQD&mcE8$x|(WA$0Wh<-mgfpKp=msmd+T$^Ctp{#5etDcV zm=G)#E%|pQhb*;ef6^&a(h0LUTi9Q%a=d@ zck+EwE^UbPm&9RD%1$o6G)Y7#iJ|R(dYq zzP>j$(Q$mrm&HHy@$S=VHg zoHbO@%NMWn*)}`ds2>pZ&S3G1@j2fsR|mG4b`# zFV1AW2@)p@XvnunyxVl1%a_W!=woe+n9r}LBxShjA01M|&-p&-j(1!mZ8X_(T6NDX zJtU4LO~4v&St{`gS1w5w-WBCAVijncgTxX62qBXtQQU_E&kF}W_x8?tVH$$e`*n?f zA68t~o*wuW*)mgb#lb4@#^}n@f_}R1@d~1bFX{_vVPfmQv zKy-a&ZSkf49YgNzfr|sjcpuDmyqXMVtn+4{mKClSM5e;dEK5ZG-6b16-NoBb&vs z_#V4#l?k1DTD5mAlP#8QlRf9OE|uP1)VBMC|C*jwEw_cN;E>UpsA&r~FyJD)+ok4T zj_(odHe=+`x54*;Yo%qT^ZGcnY8S(hh?H#q9{_2U;K%2e9ggYUIY)d+=B{hOpSLBn z7zm+04Al;JdKuO{EpZfPm?YoAH%b+0KDm1|8htw+yxPN$> zYw~6*3vYwzPY=+K!|$OfD|i)P-W|qL)DnG?+4MORHkK-<`q_|1I5$s61y7>Pq^{C>jsM-kwWn)4P*d? zAt(gbp8K1K5y$(un`YgByR%3%^7@jnJHGqk*4>!!Zw(&VG)C_Je;9{n?A8M-OtO0< zEcTX(ix+%r+weE3nk$J8O^n$#cjWB=O;19Kuiz1OaSJdYHud zlht#FOh^ivt(Lu|XOkX@_h+y>88RF)%!<5ybzFUvT+lE2Z+YsA?Kt%#t*jg5fvqq8 zO)f5BZvJS~dEj#ky2*{&J0r*5^be{@ryI2`KFqs+lioCKl9gbkOM(7!_3!CBDltGxx4_LH#H8$krL|lv^4WcP#? zCeO}jvIJGOWUqfj$Gg9d$@eu_lW0kE3olc(T@Um>P!%d;Dv!D)$(;riiPGnrLs`k> z6>JnOlJ=9_xvBwKZ-ek(p9j&&mV$fn+z%vf6VvR2iu#+Bv+a9lpFrx0WaZD+3~XuFhCdk zifQuL40%S@EE_sD18^6@RIj{FlmjS>&C4mooCBlQc7@`6*2T(6WdYv5X*AI0kI(!(II9X@^kEYVZuqErD@9-C!!^HA@-f6c89#MZl z$qzAh-!kB$f#YO)Fuz(oI%mQ1_ts?gVqu_2a)GD_(WkSMi))yB-M3yorwIM)N_8#z za|%?lUFBUPP!jXQp4 zt_)L$95(B}v^WSF+1}B45R}2T549IofIe0BYs#@+<8`_>;r&RtK<^je4f)6;$eYJ7 zwu3Eu%K=p zYp``NR*K=aMGe&_Yoj--gi3Oh6cu?_MZWNVXHadl9MR`-?zkDct&!y@U;YgUves_J z$Mp-_ackn0^bE9r%?Jm_HK)LR7`04de!JHOZSH&hvTMmhT9W>+- z1@t+yd}r&GxnA==gm%ma=Zc z;RKSI$`K3Nkg4+3&pC5?(X7Pl#w=ImXfdNMyM_-T+n^KCAQ7sYuzy-NI-=z8*Hodf z=H9a^o0jtBa+N%1fve&V@FRE_ifyy_>-s0Wn3 znb3E3m5<^AVn;e499IUbpKZ=G_f{)B8Rf2YoLFfdYO@;CoJ$zfXutIbH~Cpr61|da zJ?WXAbPrNQm5w}h$9*$pSPxuD+E!#uXD1cJcEk#r);(m|$m?#xyXl2Ab$Lx);;q665N8d8MhCsT*E!0b)ncySRj; z0bnv63D zfo$(bK@s(8MWuZ#x(t)EMPg%)AlplqD6X`tnpxj@3rs zx*%sN9Hhd$G2rmj$Rlu%)(4FP;*XAcNE$3^68P6u4?JHtzbO@c{2ztqGan^&=pt|7KmNE@L0IQz> z@S{rTbvPh>c#&=Zx<#AswrOu08;&HLi#8|r=FLms(yG<;;CEXysEX$|MDu}qQyg)Z zJ2IoWWCK(NZECB5^Bx@m^5B*3P)iw(~nM8x6 z7|3u+d&#H9ga@~7~wcoQPc{P-ea#3pVHf-DoFyB0zl$Pg_S6* zBI36JL8&YAYqYqr!LfvmvC7pXTn68bY0Y+i<6ik-7aGTFcDr@>SI>+!jI?Wu7s~el zl9sG?R&en1pSnT3S4532QV5u}$Q=A3%hTp-=7F)S5={SidwpX`ZeqR&;)&p;kcVFr zb2Ny-+PKC;EjHn?am6G1ZYG7e=kHl)yRzxzb<%$E2GE{72&(|}`qBKqI2)rnI!Ye* z5D&tigp>JGLFc6e)bYo72q%d*L<=bPPO(JGPab@epS1B~sBluxapgQeJ`xU)wkHFI zZV~*CRO4|=C!kW|vF&Tm2Qa)=+*(x$cl`3kc}z8i*ui^^Wy8!*M&rfeZkUhr`ndRr zw>A`FgWd3}8%ec%F>zfl^J_?xuuLIlcfr!dc|%TOFi}CsK>DM|<<3#x!h^5P&4FK* z?u6xot41Onz;wE*HL9a6Czm%Od^yI7(9Ovs6$slrK%l-IN>|_W;tm{Z$Db~f)+^5f zF^PVn{~WOkaAOJHxD%|!*;Nx%zpE}`O%!oX12`dM5hGN({ZBv^0|qzMLpww9-{pv= z4w_=KUJ_-@Wc#lM!)}#!TaH*Id^_B$#+MWKS6_=R5*N@621Y3yk>t5>87v#RySejX z%gTKxOv|}VsedUN430XeHrUl2x{lgaxjyf-hmp0!^n#%m9}t@ilp4y7QcJhXa{R#m zi2vNI_8le0z(Lu0GHI#V?W=qZ{*L=m#e&DAKLHT+31!LtKpT`4&1iiZ@*=>%`4;g#=yds!Au^9ko%Aw`&R z(#HgB!OWvv$fwRcN~5$dqERCuby@09z4ewFalawQ!YiDn9|8O!w3oyoq@4jCz@yc_ zB`?lqg#RxVAXl$0WNgHha)SWNVZm+Y>Rf|<^PLoDEG66~|1>Gy3s-kq%tl7`dO0r8 zSvU9NW*?6etzfA|5-gCgag1p3_*l!o>SR=`7-`p-E4>QiFJ6w=RUy2WMxMdV%aOmR z2=QRP*+l?f&Q>W-6uPw-jqZ=dR^s~_O5P>7ic9zH8le0=>M4TvZsM$;=Eh6Ww&5Hu zvsDA=JanR!@vpVN@6Wy82#}Trcm_P(i0Q-x%7vb zW#e{HkaEy#Ifx|w4EfyjjFTDh??8d!rouU+s_m8mC@gDbYhFe)XMm2-{SgM^Yx&OL z!{uVu7#e`RfQ^3x%5We*d_T54d?#mMMttEEMyvH%dMK{1qvR2LU6dsi&X(zp^E~Ff z(Q@OG29|K3OHR1C!`hQ+iOImk@FMvpLzKTF zi!)$yz|%j2K3+IbrkYpjhkyqd^piob=mujy;> zufi~ahR8s;@;7ZiS>^T{(;dO2dL^bX{VvBurzx?yuO6c>Z(43JZ_G%p*0Fy`@Nm+s zHg~k+^uAUWT^R)wUp}C+!oDEyy zKS{83z zn!d~}ddvryih-A&b@atUlj1gvG){9Jx1hY6t&_zBhz}SX9Rv_q(=6CUh(Yv zA)hMq!sfN2oE)DV_!>SlCy$%Zf`KME^aj2H$7Be&qd;w4kt|OhJ8*jfdL^ofVlTRu zFU{GU=6Iy(P+D?vG}38GVF2!cQw3kM#Z4Kgdix;qur z@b8PjLjaS8aC%^?TY!)+4CF_+$O};PW)SrVonZ@mvho#C^h0<9`Lnvhow(-0oW3WC zcxt4*=T}oTNRn((pa1@rzN|$B<_ERLvvHr=qDfJ&m6>fz41(E#;gBxDAZz8jcYiWV z!uqjYy}DF1AZIsJ^a5TPy#xZu8@i318xD+o1)cU_&}2pY6hK`g|2bIdNq_KXedg;X zWk$lCeY1GsI?ma)_@L_jEzM7I97@#OiU2#WSS=kXhbZLZ-RwvS{vH!hh5#hGKR~h* zfkPjOMpe~_4%OHTfkMml*Fs9;$=U9=ShF1A1PtLqzD7<9-&I~tUoM~fpwAAyJ3!%N z0=InBb;K66E@li{@`2api?P(;V1;nYhs5M)#&8EAUYtR*zfklXh7vPti$YEZ;-*fUoyq`}vSndZjPNhJ!hz5r8 znl&TlMdaJJt0Z^i^6EiR@@w7E4mW_MF^9X$B6r9mR+QS{%Q%3Q50ipVAnlf^c_Qo;oKk&|zE{>}ha9!&rTmM4-I5)_Pvux*4fGT5LQh})Lq)i>S7 zJ=oxLB_}J!i&pINIWB`(pf-xQtto?vN3@q_+Nws1h`VryvcO!IkJ(*Oj+K&oeq{qn zOltzEVZrA2?aJa&GZR3pK!n2pY41BA`&*-~#f+uC9Q^_C68F8SAT<3JXv{#nAA)BH ze(wL2>lSOrGT@%kcrIv@qY0*99N?f;nCyE=puL8s9^y}drwJXq_%c`_mK`?9CKZsg z$a(=dkergT5r`JBtFwWSMIc>${)e5$u-Q-pYFZ12eF{YjQL0gDb01Mgp~X`U6fIy$ zl*4ZvH}eF0c{#P!-*=(2aSg#SCR zoC#7$UdM;Kh7~GA-cE;f}PNEFk5N8!;?SvQQ~w<>Gn+l@p}d zTHvy*4dSSwEi;9p0uk5eAaX$i>(SVI%Wjsj7EM55q`;l6FcD@TLGv$xRfi_Tf&c;V z*M`;#o$a@G6fG4A3V{;vb-ogKjQ04$S1S)lcTiOID3!DyGpc7fZF0w=t zq4lHJhEw@6EG!GQ7-{0b1bDO1Lec9H$`Fq*BB33mXbsb>ji86lKoT@&0tfL*CXqLw zjpkje=s+J35Ny>O4QCLm1cFs%aek*pz?z;{lh|j4(t{aj`9PF2bh4OlwYoBc34fGW z>!7Yb*s_oMWn8emV8=|)BzMU}yo(}OG$Rmjf=br`GV&e{J-On&d?Rtlq&p!-2?jL* z&`gJqP-sJZng(pbYS=h5*Bq!AVEb)P-tHFqT!j?q0o(`9Dgc+K$353Aki-XkkQ#PA z9q3m`hYTH_M@b&dClB~a1CGAa%m14($H1=1Oaqi$?C^K*m&bh}kX<5)LDVcb`NmUL zGR))=9Z+DX209sH`9OcEz^eBOQq2Q^#VUykt0f}%BIO?#w?=tIIR#ME@H{Lm_hZ2x z$mONMq9gJV2nZo~3N$m()uM9+S)C-$wVOzd2;?(?BdTG_0WFCSa9mi=LIi?9pR>S* z1h_a#?%;YTmO;V~TGJM_$48!EvoKKT;n2(oKG{FP6!_rmc{CvB|F{XWm1rU*TatSK zBxhQ{Fay7yHLe6s<*FfAZl~A4rGz>_IvgV;Fk>@T83jy;nN9Z<5|!DIY9nqaYEQow z8o%Is^bcKgV9pG~%E__PYr@{Qx;O|k{03q@Tx1?Nj9@&ZK>i(`%AgGd zhrDnL$NfsKw( z8&bFeLW~-CbwtF6#&rwrcFe-+SXB(f4~|gBqfdLcf_O&&{z22e{+AvO3>C}aFWKM) zf?LnZfd^B-uNbofq3*AblD(TjaY_Yl7=YD&GlwO^Bside@Ih4rK5c215jlp3gAGAq z3!~epG?ZE7_fT;%=lY)asjlr}B<0(RLgvN*>^mn;7p#K1T@E`x9iv(H*w4$!Lc{x<%Lnv zn1SwAFq~&7CtmORUJy8d;^MBv_ z@W1_ppao5(gIrx`!VBaieMxm?O}H6ZmUo`U!FoaFn*lax;O-G54EKQ_2#3rZ)--qI z%NtJpGKX0Vx#sr|25!}=F>i4+PL+c`RrcLligVZQWaQXA9lq&>5VgU_G zK%_P_SPM!S;K9+{zrHnaHVu3>3Q8@X?&ioO>bW4l167R-h$k;v z=g>F7QAIs5G-JZ2E*Tn3q2O(kz_brC>goR4y9#kbsFqV4KI1<*R$U~P0UWalukEvt z!1=PiCkc86f;Sr=ZR!N67qYgbl82atiYLO}{{+Z0FKskGFQ zylCmKJ%rVD9*&bKdY>PEvFV8nVtN`3S_5SG5j7}p0`VI}wnGqKPykyTuMvg7_&0N7 zl)ZpRZAh@WD3oH-o+St4>0cl-hGUInhk@;nW~D)Go7b(SzoZAC+|bcMwC&!@OloM%BG6a8<7IvA@9LAY~VLGdPJYw6ZWq2l4V?nX0Gq zUHUff$+3=TIK@$;HMk4vVa?Do-dlOqCH!QG_)P#wrxY$JwnvXwMNKrW<0Rd3eay;C zE&guza;6ce18fDVy$6Tc1Y3?Iw}Egx10HQEJ1c1#RAG-gek{<(y~$@`8Tu|f76RU) zvp@eqm+UH2noUI!F_UC0|FHyao3S>ndw6HEF3wLZ3H)_c?uVgM3r{3_LHu~_<5L2N zd1_Y<#fytUv+BgG-}@v7vSMJIu6IcsT!)y%6udBK!`w%H#oY5fr?wocGP=U6lKH$& zUlm59Mq}5B#|6i84;5GNnXuO{8R=rvA5Gvh*&JNxdwkCfGlFY5SdcnK9@q(F&{z=h z1ep&r2%wP4Kdi_WFiW05Ksm7?Ue3beG@}6?Paznhc`)hC0 zvJ!L+pe14FW%egY(5LrhLFk(64r_7uyBiIfnOYe{4W{W zv@Taq>IdhTk0$=9cdrFE&3+9U}npD{+%4y>=U4!5?Aam5IgLB|_4@7&L5N&M21f?klVWs3_%8^6m)`SP+QoZ_Kgm>; z-j)&K@0J&XyF>CL*M&ctOIHa59rE{n17H{K->i#hC z@(B1lAgqVR_PE5uDn#&TLf{`MEpD_}Um>$FX?nRg@`0c?O9jfBUWKm!Jo(_ixbcDSVN@F>TVt3M7i`JXPSHTE z8MRIDGDYs2ra&rl?|Z(b3HYKkc)*LH>JZoEMXlj*vP5F9lX@|$eIa;1%&16Ra<)3c z2o=?!dX~4G37}$-vSE?)hs|%@IeBPR@UUi3vUPv(C!lf7GB54QhRPMrZPiIn2X_YN zrJpZ>+S&^;B*2jOZ#22_sc{Na<+ix_tDe>vfqP+kegVFkl~&+7n8U>R?}>LX%vi76 zl_d$(&l>EO^UzA{&%Tvp67l?V9fE`EMKnkn5w+nW7>6PY2l*h%Tj8^vanG_UgWj=l z&~dK_Z=B~jC4Bk|Ek8Alo}tPDG0*fG>j8;h&}H zyM_~u#pdse`_|t~%5YLEMWBG-Bfb|_Lfva~8e{9n#9@Z1ox~eAws^fae!n`RrlV_v zDg*jwKW2eh*uf9nQ~~TTjz5-a7XCEc`#}|XGe{hU3p{W+x}_Da*H^x1%g2yn1XJ*N zgmwyDb%`dGa%Uacd~4Q*8P<#U&4*pANQ`&08~mlK4tj#eozoF9DEcZcW)<;TRo>r9v&UGebCTv`)c zFedsSfNui#G>)}ahaFxuv6x>}fhvAT)-mUY?2kLwpvVhCHqQ%K;4BcG^B%hf6*?${ zp8mcnUuw2P7+uq8CR$jFfBi}QM7!a}pvNulJ-6>aCm!XgPn7`oHB?As;h%W3d` z_3T9G4u}ZWE3wDm?q*8-VGJi&{`>vBZsYx#yz~`coZiB~j^>ObP7-U15!dY)@^P}9(Bn*d*}`^Ee~c*omJV{>l}HTYjgGjx*i}$t_aK+ljma* z=8knz?ZZ^SGLHK51ne7Y?|(NLN{L2YyA6lFYmz~)+FhR1u4iaQDM1ycYYo{4R$OH5 z&82{i;gD56B@0F>O&f=DvadFOm=O&CHV;S6nwVWPgV6quFXe*1>hkcN3Ri3gH#e=C zhc2LB2h0{&uSn?=d-@UdyrDKjx2t6*Yz+prRew@<>VlmvgK8FuJp8r$iErki%rNUz zL3^;O>txsYviKFHz=6eZGxp)s45{QiC|j3_o=4{p=fue(fZ&za@z2c?aQ_Z7s$3Bw zFi@*>2VIt5<26-d-SC78;U|e%BxDABfN(39aGvrSC&I3})c*WKK=F&WLCjvUqy&$t zp|BOPa*{NYiT@ci3uP8!8qncNSWR?j0Dl@$Kk3!l#;+#P_>nyQ1knLC6c*`|oUL{E zig8o6qh;OO^>FKzSxY_KhkMNTZCmy}WK9zNgzzjumfdAirzr zTuwImJzO1InrdA4)i>?<{PkLWvi?J-VmEt<|F`s|0ZXhvc=G%apz0Wxyl~VRpI@W+ z)%ViI&)*oCs`S%uy(brE{hEJNKYr4GR2mI#XoxWiUi zT;+OIlR{OO&O|g~>M-}d-zxNI+JiD$oR|-v(3tbvu?X~y!6#A0Gbp(5y3HGWP)q*K z=(&c`81rAgNYhy+T6AFu`}e8c&vvJYuVFloy~94!m-awNTy+VKYy=Ow$`rSu3~OOA zt#lNwkd4~}9oI2Eg*pad?jca0Do zPE8^c?bUX8;XjwME#M8RZvx+Kz? z_u)@kSKE3WCZjuL2yr!uUp7vlS8+ zetJ>r;WC1f$l&K45FUeIH?`!qy_d|>zLS_WT;WRzYDx$C`<6{-tEcTI-uS~Pvc|0E@4W8~m)n^5lyau=BEEsh29 ztj0rp)`Y7KUti=NKIL3cO~%C-VqP!Xb9o8vZ^-X|HZSH0r*Xi&>1P0@M=e9!f$Cbs zDCu`^)lq`ca6FEx+%*kAMQ1x@mRI$U{X9~$g~H4&kSA#a1shs@X}Ix4=h3~2Gk}yh z8{EE{*d`uUGc73lwIRU_;356DUn7H+>1BiX9CX2luSib!K?joubysb0# zfdh1FGp(s2bB|Ll>SdZ-JOxq~gt%H0;#s&pD_$MQG@L@mt<98yga9yFX^sP+u>x-hC^j*>s#uxDEKbl1u zC!6y6Wanj0e!E=J7f0lD|NE_|e{u42QXxJ03;+Kf^Z&yyJZ8q_aq{_e`N2LsKbGPx LRk=JF^%+FW?(6Y-|+Nay}_<(=BJr;e1aYEJ0rya(l%j%H;j-sj(4T z1^NS(_XGS*2RsK3Er{gQ2&Avk1^n+{vE`2nCa(YAU+{Vk$0su8 z|Nn1U)@Y;T|K|%?vZ40>@7HgpOrXN2gLiImaz_0AZBklR#!H6t`}gm+F)=do@)!vT z3CJHQDGzmZ6E`aN_8dz~OL-_FDvw!0rFC^Do_&Z(NC@dN`P$!)XKrqe@ST3HFs%w&+1loS>fRnJn4lfG~%t9E97lBe0;(t;Y(C2MBJghEbE9^YrSv%A~X z-;Z%iLV`N1-H81hl?(?%?;ekYM9S3Elo;2-Kwzz?)1OC0`VxPBDFr`0Z+-J4_pw5j0_)|> zWNU7+wF|?n7Ii&6#mxs&7rzE#SF(zVCXS71PyYG{JKNdQ)1xWAv$OMccsS-{e{B-W zy5i+e&Ex1;>YAFGPoF;7Ep`*DKYsi`QL%KNrrzz@)2CEgg-?H(@n`5(SPEE;y_Juk z7{_virIvHf?1-B(#V;51oi-@SV$?6z|oW<0+>URK$Y)KCpJAvgT_A@;+E zi2@((7drSXx%O>Xey1jEf1A z;-`p!V;I*=4vUOjIy>H#m6N+cOl(RyT^9?1N+koo8Lc~!2_$*!sq1@fEs z7n={zd~IzNaa3PAGj%?NzTCKeI}* z;XtYcoJ>%I$Kk7ui95+DDXUX8Wd%p0A7wCCx0yEC+1bN}vsDSn$-x9~GpnZF=Ht8R z--7b`!w1p=y{gX-lLX6cXHz?AJi;+>DRPo^FT+x>^ko3baBXjEBOoD>*VZNzbJ=V& zlTWbm{>(-C>A{(U5jRXSa|sFqwNLQL7K33zq&dxSZ)>Z z@m8#iuHiM$G6P>8fU`up6-$Oz>neyv`Z1C0Mc=IMXKzPOB%!I-3kgsn?` zN#pfy{BrG=KR-gap4AR!DUl+3;_vT2 zVgKLckC`v`#N}|(w&?~1g`$N83&bD+o2mGZGC_Q}TOKDoIZ=2;RF( zeb#|BG!pKQvQ?-nGB2GpxKsfN0%|%s93+*tv;FTFmBxynqd7Y}hm-O8T_~#0|px(q{xm4N}XauRF8x8 zk8Zn5$_add5L6#<3)5-bBqi+x=NPNBriAgD4S5FB@1f~EFH}vFe04wX(v{jTT`4CR zvf=S&-PY03LR3g-sL|iKmioQ#N_(5rdL4d*892O2eQ*Y2n#p1ilSsk>o15=KzUWN9 z=a0lB*lbG$;>(G(%UqsDG^DFyiy?Xv4((=0DXu50*$E;JOnpg0T4IR=8P~oK50BS4 zFvALsAs{}jbqs+B%WpS#7XzP0xyk#VoxQypI07=Ht1A+(fZ>j>J;^uFiRyM~XCnf~%;;n^a$&vRIaz{^qP#emD%&7(d* z;%s+WdAY#SK-vIg#GzG3fIJ}QHiTD9JSxMU_ncPa zrGYWbs_G5yP8c|3&3}KjBEEjd^2ek98!ZJ%Ga2IGv`0oAt*C1NP(Qrx!2bu9DAXZN)Xk`dP-M)Q$ zZec+NK0rrDrydX43ZMk_f0J3-S?uXeyc4$A^I^Eb!$tCBg#jXAkuwLKEP4hD7DN+9 z0fATmH-rGhz)G%NzfLDC9RKFKvB7A}FR#_j(Gx&)4<1cywo(`pec1~ z>Z$v|dKYY-+fEm={i|2%Vi}jQMTZGVNi3YXxw%L%L6-3LErH~}y~lrk79l4V;A)|x zqhmEz>3N0}|3rYK3aV-8a}O-;7w=sXc;E5_|@%v}BHluGL~ zCLTNS&CP-zk(UHX&FT$aMI|Qf_e|miKmT9ZY3a@zL3pS8VAT0trg7IYo09V9FcWhh1?K}k<F1Al6`eyV#OAAV7SNL)s~dA|oe44Vao0SccnX&GO&BcF(uxH}?LF zC~e%A4mKj7Ix{@H81SLVEzwlDgRz9-And-!V&Jt;JnM78q*d6P4rxm{Q6L0hf0t{* zrHi--Br2o@9SoVn^X4@nAMdUGjLJ@R4~=F}xJgdV8YoOBn?+1U_ANs$?Eb@tivVD< z0gZ=~^S`NeTH|xuF#-F_c9un^8?1hr8CaM?GyaZf8T{JXQdL*KiJ*p|3^|QF&4&3R3vX#+Z&%B5BR)$`!@Z5J7I+Egls~w z{enCmt)#M%5j`LrbupFb+sw@T7K69+z4o7gv&n&5Z}07CAU+bS1PEL?SvdON>7m2P z-iuVvod=Q^XAboZ4dlXhw_y2A~4EY^!Q2oDyNsG{ha#1iHi=hnkG|!#u zAt538x)oTj!A->_B-}PCepb6~XLMf=%o(Hk^zb%VRSU$cV7^a)AfDE{Mpsu0PdWjx z|76JrCwHz@W~Qm zOlmRbwyv&_{Co~DGI_`}kW&$e5E$x)V&0$p5za+eOl-LDnHU7huw>R-w_aDxxQ9U~ z{_S7^rAQVgI+$nX|Fa&CYCqMRz8u)e-dZ(1Ff z!6JTfwyPY^;~OP)PG(?WKt)acV&n@k1F1 zWM=YQMOj%kbLj2+_hue6X1($E06s%Z29GB}Qjx0UaRBf%gm*AKOw_O-*!5_jG2D1C zo}k(2?CzJH&Ae5=i-#bO>Do9ju`&0ahVzrPwvLW3)M~-6igK(o ze*Dnr2q*VXN}>c>YI=6GeRh7jRe5|?Q*hXdFD3qHQu!Jkn<&5~wGIewJ({j!5XV3( zz@Zcj&&grI!9X+Q?AYI&rhE;s)gJO7ka0O6(!lp|XeH|(p)U7uH~mIj7pya!;!fy2 ze++xT-}L5i&g5H77m@&*!YPF!ON=`K07#wvMf3Ib<vI=-s!>Pq8zYQ#;AXyO|o8)bBvT|o6 z_3C65H^e+F=EcC85KV+A`u?jq|J~`c#CQ4&edXH>-Xa-Anz1waqslMwyH6l539>dqA&KtUn zoSY9!%E}%i2>{?1%j;LiJEoHtNquJR3#S)s)*51zg`W2wx$xW?ToGJ(sAFi-~eo{64J~s9fBr;WGdMJ#d zq7%-OT`|nWcR`g>he?S#uB3D5*N-`S0IiNIE-s#YMUI0px%+oDJ8i<|V*jTBF(@r2 zrl#YC9za9l0J%&b95(1j#mAFnfsEzi87>_>zk6$g_EGGUJVn8%N3myTo~B@7iV!7{ z?*hzX12&1F6L!bxw6wLl2AT+pJM-WV=CA-n;sGvgH{TW#)XxN=ArKS;K*JDm z95$y!{QUioS2Cmi?(La;4Y*Dv=Bx~8G8WtACE+w19UW?lN>Ei*)kdut?3?wPgvI|8 z5?tNg=hxOCbLs)zf4wpIEh(sI6QJkjbY14pwHIT>bh-uaAuNAnQT+Jg+grLyw;3yx zX(B>G8Gj7iP{txny(8;SISHFCOG6<0$w$%jffx4yoGjMn=uMNFbzX@E>~2zVUt^uo^mFMcLeiqR(#e^IkxlUflDJYsvaRqs0#fM;leMDk>RfCQY>a4q1-ca| z7C#HASy@>F-n^OU2;1G+F@gknwqNAK$i^0$oJ<8sq!*ZES5Hq_-xfqjlf%tv6Em|N zFsT^8?C@3?V;-p1(b3VB^g3$%)2fhXAvHq~H-xO(;*Xgi<@7@N_9Vj0pKwz()p+5c@u>q$t7z;46|v4F?qaYd@El(|kHQJA*(q;Wh0h zDtuZ4TF{lp*(#=U&AzU#u2b8*AdeP<=YRkHJvc0Eq2i~$N3;213&0v)j{~cW%uLu6 z(BUU{fg#2{1nDbY+>H+eMiX!w7~t>Tu3d?E*6$=&R>HdFz!OcgU2K68PJxN zSSo>O_iI$NF#tjc!~uNuqwrZ0OioHY=~`&E7wkT9V29|@RO@xTO8qx)NVKScw0QyS z2Ykcpu%wJ=7NA;&<>loeq}KF@f4PqUg?0s&w6vmNj4Kb6U;s3Rs!IKf1p%4>=mnG^ z$R*qb5S`TZl9;rHe)J+`lK_z;P8Y;jVD16a*1@PtP;!pyD?{ zL3z}wh#W%vcHIe!jxFor-C{Is1)!aWv%_i&Z10igF!&f>@x#S$XxiuC|N z`;$SF_ou8Z;#z$*B82~?y8mHKbz33_X%@1PlZGM`r!q1?Ni&BHN)~krji3~|!sEE| z2oip0scFw|6MV#Cs+kdet-Au~QyEMQf(5yt71{CeF$xmne#fZp^owm3yKWniaO#41 zttC$6Y6STT*g`4LK&WZ{r?~|4-M?J9k{Xe|=e8WAOGp*# zvrTFLgP&0JlLZz7QNt9zeW`1zwM?%QyPTi7y}=>>3QEZK!NC%E88a*EgZ~-03}T-w zRbYV~U<1}cXbH+pKAzc9UahfM5`@oI!^>7{uc-y zAvJZu|27o$azm9s9qCOL*{xjTB*6x{Z@TllOTc3AZlDS5(N*xWAjEh<nfHLyKCVHQ42>nm!Lcg4h7$i2&v+d49alMob7946(4R=~Zmm@6K<&=4Y^9y*I z)l_wKo>mb;=RsTg-NOLJk?{_xs$@*LEyf`^`LI5!-H48vISA6O9RN0UML-kMQxr-K9862h~;&1i9tLh!%?f+pMS>p{C_89s^*NgPCaq`!Flh`JVw? zN~Ipdo2&oV3lK}G^nq&;JhZZ89<*9ehlPcOc`SdhfOP@`pNDjq30}>Xjp*hy%6IRg zz|Jkf=OJtIJpX#t)644^sKKU)%9qOtlR}NYn;nWE5Ia%%ULlv*tW z-o?eq0XhIybBmv!Fs3V@#jto0#dyMQKv`h$s=Q18?)>a-B}{`ny#qG$pad15gm9g8kBdy0#J2GcV!H;;h_ zdV5R4Ix0`Iva@FeF^nLi!%8ZfU>71)w2m0+6yw+`2SSo2wE!7FyyzSmA@=a_0FG)_ zr*cir8%eaFIv`MD#$!tYc@$XrK)z1d(VD@93vZN8jH`>O%_f?ouvJ zPKX`@zK03bcW4AK@mYtW!X_RRxNU|`3xyX& zLoWuOTrA{{2wMzljHJgC$A(LFTog|g8}>Jxe#CTk7qhG#`2;*cz|Qur#GyN&pt;RW z6;KQS(euvC%$R<@$Mhra{d@UWulQh10BamTb=E5p=H$eM!o`!;CxzKMMFaPHZn1M> zm*uVmHCg0YmN-=ZBT#$jgiDc9;rcnAD7JU9vxav$zU24x=_l-}(&0(9=`7KHu71b^ zZ@oEF5VSqKYB61V=UJ^IQc?m*gz&};fv>DA$+}F*@K#A|STOZ@i$jAt8wDVmlGp})7z4<~%r)s*X zRwYO!vjxv?)UxXdkquF}&j%a6=f}g^t_PyjlBuZzFJ_XN8XF;PUxmW?M5Q&mm@{CH zUSLVWo<}?ofPsA`4wI@7deKqHeEC&*Iw3OtapdJa>`l2Hg=vA zXcBKR&6HbBy!-qx5g3jVhzLkCLfk;!j(n#0*OlUymeHQU!THd~?ofM!IF19*_xJCv znB*qAR0q<58b|mTS&|Q;1a-nhy24re+;jX!Rl)t>|d*^4?va6)!lzC zsHrvt`XN+tUM3+TjG`je2QCA8#yf$rJ*Q>R5DB9n;eRbo(bpDk=igH7gT_^s} zy;6Ao!xjS7)isYg3-EB)gg)s{yF;2q0n9WBq4f!?$F#)#Q-w_5CwaGSe=^|@=|;3- zL`eft4cd5GAn3&NJeMxn{0(8b1d4MIRoZ|3I~AcJf1sjI^Q2ri@z1^hFU1S1lEJGl zW2yy5m+YVA+j<un! zbVP)0*kb`0GZ#z}dG-6+WR)%RnW1nH9_{>L?Cj9ki{it|&Z)NW+>q;uC^L7d^KJiZ zY9HcnEo1o9CuCpIdTlW%|8huSjaM##XE`xlIWxSI?aRksc;#ttp zumH&BX}x1Kb_wbI;D@({-@d3zYb>ORsKST|x~}BaLu=6Z16>@8Nr=rkZHFpZW=aqTKQES%8TFw{c6n}o?`2)IcoM}WlAfQVG+B|~N(rA&g!p6tg+W;#n z+S}WCZD+(AkC!MB75(4-&jexnd1_TV4IG^KTsa+dfTa8asy+v@X z{L|jd`Mhst^NqP+6@}`Ix7LEggRTCO{usPgV?4kNwVux!1GIUb1t#{q6+_Tw;#;JF z%i9;<+8P@rItt}uJBcjt%QG!zQ^nc%?J(Aoj-MAx8AkDb57x|MES9+?gNf8HK}?=i zzxKHP6PXLCh=|DgOhXc2u2ObSQU!ckMkyg$FKdbSot*Li`sVPi`!QJy(b zPnhY3M?|pT60cP*;tE`)c)mf*7P>@1;L$^bIibyY!Xk0Zd(6UwUXb$MeP-Wcy8cc< zV%1j=1fV<&=<&&>$1v14Vu=Bp*F$RY1mPIy!_LIZqHRzkNOM_SmU_vNCYY5_V%g5l z1#8=Z^fOO)REZMjJx=!U=6i;i#ZQWs-wp*kR9NCrOD1Q_N0~v<#-f6FRqsB4z0-Z|NNt{3o`vPD z&bQ|>E3-{fz-f1Ijd`J^lS;}v8QOSMl7(A-5eA9)oQQXbGw6D7y3_N! zz?nNS{D{FyM$5>L5mXF2uct8%zoFEK?nNx&U2x`_-)9UN1RD4#K@N84B-9Lk7x(U+ zw5;q^(7G4yx83j#JBsM}z=f9XGAx75b3$Ga5w)aU#m#+(P>cS!8GVk!4o|>bU@Wby z({W}(?1_0%Yf&66^`z4$=*lU7`4bOv@8s*|ML_(rI*7OkPSy!9V|#aZA;o3p`R{Mh zRVg^E+}u%+%eEJn)5^>*yeaQy$+5JDrHTkW`d)4=ql?5BiC*#Hh}c4p%Yd5&C-7 zM2rs?EhaPO8(iv+6}8M&kjROaLcduFBFl-Sk?3yx>$N^s<*#JU{gDMrl$2Ug3Ed%m z+}%?FJO7!#X?5vN`_<&miM|tom8d^MR6}pmtf&o2D;2EWukPQ!eZmH zstzGEs{t#rn$+%1AVb-saqsmt$TjYlS}t}Uv2>&n z4UdWVE7a{mDU7d;cEY_!c1ZbR=rj86Id2qDv-e#YPqR2Wpi{8eaaH|&k#2uhj?$P= zDYK7;Bu-~7q2`Ppk!1*)ps!6F-mW))Bq-#rMpqX)BeM}o{0i++4`>KuRkpN9vzY1; z4N{}E(d4S75EY=lLncQ4%RU`#LEs-r`KnyC|jSPiDvs*=jRPgOx94pT5)#EHl#k>yEd9S>9HTL zl6V)@R?7CodE>Iv4di2Bpedw!$YzS!&tFAqXHw@!3@|^YVZ&SO5-H0Mne;nEsm$aY z(6mu|hga`EB0^-DWS{fL9lpfU8e~vvt3N(S%70pNGbJtZtZL`^RbpH51>^LTy!O%= zKOZq4$;87OK%5_oJ)w*HOa_1e+Ay%wE)E?kZ6|FC&fkzdCmQ@{^5GdP6 z?B{o5JU-)9Gv8bJ?Nyx1ue+XF!2yy{}PE0%9oO07H=(<9>R!;u#NSOQ4 zeZ$jvA%dF7eP^toxV7J^^QdGYLE@z#sE`_BIw9RXJ;tEx1r%O4-Q`Z={X{YNbIACQ zwe)JtcPJ2A1Pq&|&x&B>H$6v-k&Myt$zSiY3M zY{=!iF_mRG$?TP!qglz|cc!S3sL#_Ub6Oq01!R^nvB{qqm!@+>mu?k~^^ z({UBkxW+l6U7i8$2c8B-+m#q6QD@Yx#zUH-`kl}{6;h}!8F+4^b2shqDKeuE|75cG zm2+F1cf$b3hxXdw;3D(}bbmVg0-Gi!< zSQj!wLf_d%JyM`au80M6jP|;lv87O}Wg)x}RI|_7Ot&bfkR$!{SUXtS@6SNxnZ{n4 zE74NsO5F-^gl49&s2JOY(CS5OaPYMXp)eyCC=xFolcs7>rBD+`q{t8LkFa|BODFy* z@;i%NPIF+X_cz*lS%jjPX%-P1h)v1{MHj|eNvZp%m_(){Uv5S)1Z1#;?riy7=ncK7 z=q3;oTcps|l1v~%C&Ff-eVy^sGVY_#aoD?*l!AjE5b<2%($b2=B@SN58E31xVxq_V z;VdlOC47@nl&3{;ET|66&Ke#Opuktv_U`RMcV~uqTBG8>0(REjj*H9bYo%Y@OmXZ|qF5PhArC;vr z@I!XRMCQMIWQXKx^Te;t6I$PSDIt}s4be*Du6K-ZZ6qgU=Oc8UAy#mLvmz5l!g=IA z`SW*g*S!ZCJl6azWwBAig<++6>`V$;GXB@&xmxk01Do zd@JUx`h(VCEPpfQrdxf_0$@k=4O#pGWugTVuBZ3eFEj%T@D;9WJ!;hWbWLk?)pxnY zv0v6QN+XqO`?e~E)B}0>Hxpf(tZ+F7>L5wA`)hp1?On-M&NmOF&vQLrqN?boE!E&L-!yMn064UcRud%JDhE_G))o*usATLEF_$EKJz8w8-#Xlx-rGEMA z!IX}>6GP@go*`Ub!^l7m1vBzjY!M$T0U!iFJPw&mWnu(s% zH#&<)IeCTy{*&8~6$Fj8eYi75gtm{)L6@n6jG-4pEFI3+rKaVv_f0( zBbxK6C(^OxFGur#^$E@X=9haOKk>Xf!M#~kp23`fKAy+Be!@P0zz=9sso6Az^2>+c zy}7=y8S0wP*A6>j;8EZA_HLXAp$TSduSSIR0v92!rDtu9KTISZXR%!T@m1MEvS=;^R3t)t{W1BT&tLtXrqW4d?C0{9_lxZD!j-dD-B=~cl#YN9LNZ~KTX2g< zO^h4`bcF0cA8bMDiK|k+FY2ye8Bt-BMHQRV;gKirN=fKp_wfmoL_3L1*iZ-#icU`M zb?`Z*96;sHq5hm~iFanmSHdO`3uUZ(8^TbJT8CD&vju~T=ACGC_b(}*lkL$LqU2T5 z#QHq88nT@eG1dRHSBHn=xbLmrv(o42NRj``wsAE>cJPND-<0I z@?<%>RCJqtsIHV8ryT1M<4R$IoEjJ3?*|9%PhI?@L8Ral{e!x`h5*5{=@1~hJs0M?(4&z<#P#n&=;Gqgx^nO$hm2aVpIBP;>OBh zb$4PF)t_Lcc^&BFa(Q=$J-#+g5NaBRp2|5Q7Zz&CU`KZUs!H77(&T*R2fR|YX1)Bz zG`T^b!z@G9fxW{Hsy?S%jXewQ4dFZL%E_-kM94$um`_h72V5qh^*lkHxS?zD`Rmu7 z$@75*i|4@yW;#zIIkXw)~SuTQ_{SE@`zH^Y6~y2e^Y^&dNd1c)BUpc=Ct6 zm%VqePJ@J%&41x8<~iBVvQJfXxGcNGv4(+jLoN6MZ=R~CTv1b_MS9#3RRS{WbqwNp ze30VLs@?dDkS34ZN2!<`$Hzbt6*pMGDUj<-vQ(kX;?wymujgkjYGS@mFkd0NUV9?i z2pyQ}x^tPZm?`;s%(ve0#> zCZtn;G+hrU0c|pFB?E5C#PeBW)n64?%Luy}_fYgvR_upd)E+I8S5IHLnl7;))~|sM zcD&QW4J9pXseeD-KF&7#kZ1ouw!PSCP1BJg0%riqjJ~O%Uq{ot)x|;yGH#9o>N}}* zU;7X}KQw;t++b(C-nwk!LFlI+q4s${^W`U%uyMoOI#8SS?sDg+ed>E{T{V@8uH0Jt zl+=)iK+A4Y7t00H3wzCwoEP1P_Uj35L+;$xz-#%tchcDj?0YWsS>vntM<3rP`uDiM z1$}pvq}Q0sZY{pp2F4ilRD>emApRX9B2&Hq4mbiLf42y5= zPZ1L?l*xNf?J+>nisd|kRJ+!ZRjbILov$e%tO38ae`?DKUD$u$$q8cu^;gxDbJIQ( zO1xLpMbqrY;XAdr4L3$hnwikX(W|Cyr%%c-nh*5ORXALq3PoYK#qXc0jn1OX;ihAb zZs&T>9oS5K@V$3d^6(;Q5_4F@=fk2DI#s*-(dW;GGmO3U&B}_FiXlFPH*e(0WpftH3AhQ;@irNKIff^3;WXTOzgejckx7{EAkXW|BfJQR8Q z;f~QaXv#rF4{Hym_g@ZEuQWb&_AA#-4t=iw-H|iDX}mXbW3oj1)52@G{bMy*gZr2^ zX20)1O`ILl|eOeNiNoF?1$$!uH{RtIRV#A(eDi)AcZOut4Hz*%AEwpN5 z)JHk}9=C7SKG#O=KqY&hFjYcApGuswzK8 z7as@+>)Uxqw>UWDc}TdlX9@jY{A~{fb)(d6+D80;G>g~K#TBh?XyTXl-yPEb$?fa& zeA=ESa3A-tWsCKpp6%x0gRkyTv4I zskN;enZ@1~&)QBzr&h0`xaghZYo`@4g3)mpeO6Gzk7Xv(d{f9V)E;1StzG=9)xS9o z*3uN6CjlGlns7LRXpf6Y7~=eL1*$&YNG~Wfg@_1lRRT?#9g);ZP%$Bc5PvNv?vs0%dste>)du!<%xD|X6H_-vM#@Y#Uhn*YwQ zrKM?LE~{XcU|fx9u#z8E=r#H)rT*)ai(Jcxo!d0`)YQ12zTK59+O6%WITWAu*b-Tm z99TZ)3YI$h8H`nQc)W2TyC?Y#MgEpM&pOHyYC?09@79ec3)D})*=D2W6Ff1ZZ1bP| zw4RFb?loUquDDB^zO)r)<(JniZ3IP}!NWd*DaC|s;ub?7I?^2^p8K!lF8jsTt@7~D z4*8ql&(HOj54a3$aIcV16q68}5gA%ZDr*j0p&B?Z7_@QGfN>@TZEq}_t zXS8xeBq*s0^{>6WynUENMQv7opNf@Tgs}?G_OsqvIdk~@)8$~SR>sY+bt)HJT<4SK&o2aeMOF=)xTJ3)<*%|R$O&nyJo@;9myCydrzQDmtgkh z-?wK!mA1uw^mKJYlaeNJHy_H&%P;-Wc>g4n)X>3R;-5HS3iZWPn<(asf&c3Tz;Vj* zcGRn_Rdqc#(%02hbag$#-OPWvO2Vs>Ek@h@d_)enT;jF$z^ov{xr0pSMZa6Hlq1J{ zvkeLl%}~-W{NTcvQ{Tm911U1KU;ofDlFWo*Ay>9vm)3oYYz~`Hk`<3Ht0C|sayTFT zaj)rJ%B@raCMyE=z=>yjPj`<`&2RWTyAYi8pRnTJx8ORQP9S7t5eVh#GtIId)h}+! zTV3ZJ9-qB4mtl<>+)4EGxcbHENl!x)|D+f_{ioP1zyEOhH8&WsoamW4O|_g5(tob!H4BGry;uIeQ zui+#K**4CvxoifYP5+`}cNiWX{1FgAe!$@Jj9YF(tBmpDo2iM($xYD$yt1c19zIo- z8jv;blp>A#C^{Tvqoj3seZVKJ;g{|Vr%`f20jHp|V0oWp&r zUbUsgAGoY=4I6vSE=d|B5NvFc_-V@o$#3z&*Sd#or_gjaYxNaZkM&el2iO}`z#2QA z3fGA|)}N6PwE|NtrR!J~gq?Pm2xox4wxB#P~bbB#93x zwp~^&MLl{Q4_u!4l6_FauMZJ^<|U*hWm9-?-fy#YO{z^c5ufhOwb3iIbW2yOQ;peg z@@n11HG0**T=cy$>$>z_hkIz`z-s?oV0_xgFm+RXKh*rjQlnAovfAS61S;IVeoRZ zZ}O8V*Uz>!YwoOpuhl;`x3*?d>cTaRXjEvz8)7J6wv$*$>)*@d-W+ghr@gP&ukiVs z(NoH$DG|&*65MiUt+3?>ca^URquKx2Vr`?HIXQEF*>*1tm-H#UEhzAn)PJW#lmv1ScjvU8ek&Lpw>w=Xa7Z5i&N-rS zd==*ygT`aMgv**qQj+E$Z$mtG27B~CS<;qx-RMP)jd)P3kJe2pir#{%88!(a!)BEE zg#{6~s}1EubYv-(usydAUY;d=*eD zUyAwnu?N~4tM|M@Us7KjIqXY?MV>f3+r~7SXC|8yL6K@=U%dT??wU|@z1#c*ITjYy z)rvUXIfkolt1?PA{JP~Ck(;tYuX3D1&Aku9)14n-Czl^(Z#FVs@x3Ed{7hf8=?ov$ zJWOwB`&~%-W)aEx-ykW+V>hO2es;5Hhu0}=BktC;OSv6#?6^5Qa2wE}e1+CVF{d;5 z@r~;;LFa14CEJ1{Uc?};I*y&*7N(5#f4^eC zKMz5I7XftI-yl*9yqnPOAw$hA;dbVbAm^2&t4&mu)8iw?zqcjmoMfI1Md~OnFQR?g z5mGGnZ&Q0Y@4x)r-u@-jbo}r`)&4|Y(TzLeSbfwKys}F2OY&o{wNL73?#tjD>shFU zi7w$-e11VDVs!iBs8gyos|$bT6h)O%^+(wV>CKAnZ+r51erzgoXPMj3J6QJE_BuX3 zGspTJvwjYwvs!$+jc{zjSqq&mp-}~HqWgM#=L^W>eCb86M9bFGOAxY6&3Xt1zbXUW ziRc~*9!F!}-zR5Rh5K-IKHxdCGMt&3vFF?xC0ZzIIuJ#BhLPbdJH3DW#)M;l`IaYl z@#e16*jRj-vT~=kp5AV2l@w2#+qJ}PiuX-Tsby}iB_-9cLSUM$V|;wPl%i7XM&t1j#?gbKz{@^V)2Ew8t5VG_&KU!6nU?1lTz(Xu5KdOHQW&%Xr& zwS#vToip8izUB)rQZj0{bf9$8vl(W^I>S4<*}{oG1l` zDC~R26co&V+K_lPGx|bzB3{2=#4tp+Z=<9HE_+RV zU;6g#+ul8-Yhr`8=%c6H^-d1!hum`bi9vT{qe7XuxHkV3ZP97V^3^Y=dT8$+QxI*j zJ>t?l!15UQR6C~M2P$x?xUzj z{MD~`g7Bz}pxVaryIzm4A=cpEAFVU@A$pn-3t{UQ#_p`{b3fULBe2jXUDliX`XW%# zFp$cXzS|(Alg%Cv?shOB}@rrTXKr}vegNq59q_=r5W$4ND5}kW_}p&IIQE8)3S+O@dZ#R)(xtb%HT- z?!W(Wn+Op~N+MfA$u7G>Ws?;ul8{kCvQkz_%7}y_lB{g9vMRGeLfIpm_VBwuuJ`Br z*Y9?_uG{UZt9W@nACGhH=YHd!557l*HJXXK?;p}BiQM_-@cJCt+*JIbq0?Q9X`zF8d-gWqM%BCO-t2n$<5g2SGQq!?H7hECvKz`bTQOm zWFQn0lf=2rHF5t~8S1YwJ2+ctXKurfQ~x=LIy7d>4SmKDO5r>+D`r0BTz!VK8HV_A zohuiLGBULK$~_+wQ8yC=V!`TZ8=gLWN`pbpx{n_%^+hqydw zh>YCjMT7G{paSuA(i|18!&(+-J{^iZHYrbI`3>u5Hzh*ws*=orKrUzGQue$B$_ZL8@}2wJ#eAdI<91<(ERxEC5&j@_7;og zT*&2{)!eK{lXG6&{N^mX#7UpCLEjto6@}`;X4#(pvgP!7yi5p{EjOCFxh_V)_u-=3 zr#5)nBsv^mZd9fT3V^y*|7CZV#o}cP@~Y zsp2KF6$SdzKi@xhN^Wi8Q_Gt?s>}0^T9jhmEJwlNbYrh&sm$qDcbt6#jEpuC*BEq} zh)NdDBr4(-W@p`@3Um3@?%=>hAbqYw7q;A6n)1C!d8W$UU?A%;I zyiew&effU9uKGbEEVRFV`j%}xU-CRuMvl{@c1^YX@VW!R^{KYY?^*}s*7n1k!_O$$ zXq&-_6CD_HIbjd>e9N9%9J0CAwzlyU+V8jA#i;*^sSG$fMfy^FNPS^;<46kggMej)?*pFE zje6yxjq)4u4f9_7ia1dHL-?rUeQjBj&>ce*-qdGTN`*aXj|STpQ+;hd`%Y1|#($(# z8GldCrRCU#3$jGA;y>bh@lP3bNL`?!;SEVs`hwb>xBN9H;|ZwK*3EE#qdJ;xiSggyJq;w_?%j@ zA9!vt)HR)8=X7${A+|-~yAiT<)UK|sS;k^qyKUZJLL8$Hfgk#%|MFt~L|92F3FF-b znAgE=P(OcOisHhB3y=ZpQdvXt4#t!MCs*2iL=)6|*v*>`5QD9L5w5)Xx@Gl(m*Td7 zpI=V==smC&x@@Mieu2mKRz_|ig`%xO)>^v5rIzzA`WHE&o#K*h-D;oQ$RuwC(LCR| zp{nCy_j$!d?l7v2=CJ)ZKy&oCvi0Y->UVsL+`)?4yC{Nna^Z2Y^(v&&cJN(L*VWbS z{kN!c6-sqG@P+l5;HCXk_rhNN*T1uBD!RKC_fgTaohkm2C%9Y1#Yszf-;lO`oAEj^ zzq=F+fA9Zh!YJY<(`Qzq@7}#L|Ft+TjdR0*8LemMf3JR|b+&Y-qzyK?bGMd>;ZK-q zbz^{mPr*yWz*-BMMh$$z3^oe8z+MWwC5^~Xyt%ZJk{e^ZT)*^v6MUkC zIJmeNF^^R78P;W>YKj{K{+8*}j!_tM5}stAprB--8j);^BH><9M@& z;XSF9X7o%`NsI;MP821Q9XKV4p7#@Myed|60is)`GR#v_Qj&;7 z2rws}UjP37wp`S>z#7bVetGOLET?KAliUSq?h%CmTQ6l? ziD{-0L#@;2{IVxT??qU|J58qZi%U-r{BR%Gx3rHOTG%Q1oyv-nXlnI>H^Z)TpI+RD z|5Lutio+cpLFkhKv7{Z_w*po^a|*z7Bx2ZCy1Qeb;q<(t!z;TvYcNxu zQ+v0h_)c(>K};)a>%1Q?Mn>$>WN(Pz6mNO`S^!fmh;3w)GB-E(!>seUb7Qc*vxCbe zzU?-Q-(30oN+<0|yT9`i!v=1oil_g$wbn7tE{NBZrTZ(&3T&?tZY z=Q)+Y{(cMMMTP`^@a@gp9(zNpl9g#52KKAn@VI)rXVH{F>nX?9sHyiKyo=*f!r7Lr zTKCsD1S?wKxFuF9FkL;840GKNOkf%;i5E zjHj)@cY@G*x13?XMo6lN1vhL3@%|?<6aDYO_;pzw|li=;VucXNw7H zpX%IUXlN)8V?azW!Q%7t^mJ>2^hshZh6i#I7AYP<4BUxHw{G8NC-C0%O5yGPdlnqt z;!+YawR=DJPn?rDwk4nC-Ge7=XK5w|WUqfZ@YfIb&DQC)WTZsX1v2eVY+XLN{J#09 z`taU&ds7R|(l+O+Zhv@PI&8%11cP%fWp|LV{=8B8(BsTv^Yy>Oqi&wko?TBY^l*_f z>W<+{5OW5i9!2~jMtx8?TT64)pV_*|h9bv@j=|6&4h^s^N8-6WQK_e`+t)U_!o7U>A8LEBo^#f25=Uo!ljUI#Ltt#uMmWix9t(@XRPYA4s+yad$NPPm@=}Cq zO(}U@X<;G1h)C9b)lHn7?{nA9`mv9XkHdR00frK>9`d2@R*fUtIqW)lP!Og+p3zsi zW=FS~k%sDDm=?e9i}|-JPBhCKIvyI;9_~zjSG%s$WQGEfMex!YsgwN8htfWv9Ci4r zJbjd4H!DQ#d~~`n049Q%1?&bxCnT4}Wtj&_4ft`7S6z~Zr{(1TmG)%F_N#Nx`DZ0@ zXKq~cQQTHTRXzPrz@3Z*bi0!nL57q0oz0G7>>pMx<_AKKkJgyHPJp%V|Rrh5f z?q289wZ8~fcoi{lHcEgu118^_M;arEbzELfnWlzD$lgTn&$W~+yvi*fiX08Z?vgQh z%=gK_8~{Dp*KoFITefa(X))(TzJYq$Ct&>d)_!k>yRnQ7)^u0PsZb5P91dcWR<~y| zcX^&Jo5Q)FHl)0qbP#k9yc<4tbJ=hnkE&z@*2XaCw}nr~fGrQqt%X-TRi=1%^eo3P zqnCh}J;U&Zmz4KdRZ8hS6wYqYxZ)A$rN7N6O~%`kH? zp;tx9B$8KHI>6#Z4d7KbPGT6$1SUYln}cQL4MsiUH>d>wPAXI^4QBi zUMjmIUKj4&@vZN5pvTUxBL=CeMyWxU&+KyIY#68ba;1l6{W{xAi|5s^UERRWUJw5g zLNm6vw{!j8yy@Zlv&0GZI_q{JNE_jf1S6sByu5?i#(=vL>#l(U!Wo4V<4LEYUFy!x z;;=pA-?PVPRZ%&nt{}D<#eP~w0j=sAEjj&=&%0Asdc(>2=jnR?iMq_=>f5$xmZhy? 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

74RYSqv&u& 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

!%wc%2ME)~eRQ^ROP%i*1 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%0Dsqd{YA=+7&UYYELW*^lOo}Dq$X; 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 aY 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�bV`=HY%5q*Wqf|b}^wd!NbFY^E>CI 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%0DF_AXv|t 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 LRk=JF Date: Mon, 28 Jun 2021 15:43:18 +0100 Subject: [PATCH 1291/1416] Architecture documentation --- README_architecture.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 README_architecture.md diff --git a/README_architecture.md b/README_architecture.md new file mode 100644 index 000000000..f23524316 --- /dev/null +++ b/README_architecture.md @@ -0,0 +1,22 @@ +# Epicyon Software Architecture + +## High level architecture + +The main modules are *epicyon.py* and *daemon.py*. *epicyon.py* is the commandline interface and *daemon.py* is the http server. + + + +The daemon runs the inbox queue in a separate thread (see *inbox.py*) and the inbox que processes incoming ActivityPub posts one at a time in a strictly serial fashion. Doing it this way means minimum potential for any parallelism/locking issues. It also means that the inbox queue is not highly scalable, but that's ok for a system which is only intended to have a few users per instance. + +All ActivityPub posts are stored as text files, and there is no database as such other than the filesystem itself. Think of it as being like an email server. Each post is a json file stored in *accounts/nick@domain/inbox* or *accounts/nick@domain/outbox*. To avoid parsing problems slashes are replaced by hashes within the ActivityPub post filename. The filename for each post is the same as its ActivityPub id. + + + +## Themes security + +It is possible to include arbitrary CSS within a custom theme. To avoid security problems the CSS is sanitized before being used. Scripts or import references to other CSS files are not permitted. + +The way that the theming system was designed is in order to avoid problems similar to Wordpress, in which an adversary will create an attactive looking theme which contains an expolit. The discovery of exploits then leads to a centralizing dynamic where there is a single "official" themes website or app store. With Epicyon, *themes should always be safe to use no matter where they were downloaded from*. + + + From 8bc6e1a2e7aa906fd7dd32874a7fd171c70975f3 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 28 Jun 2021 15:45:11 +0100 Subject: [PATCH 1292/1416] Image path --- README_architecture.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README_architecture.md b/README_architecture.md index f23524316..45214287e 100644 --- a/README_architecture.md +++ b/README_architecture.md @@ -4,13 +4,13 @@ The main modules are *epicyon.py* and *daemon.py*. *epicyon.py* is the commandline interface and *daemon.py* is the http server. - + The daemon runs the inbox queue in a separate thread (see *inbox.py*) and the inbox que processes incoming ActivityPub posts one at a time in a strictly serial fashion. Doing it this way means minimum potential for any parallelism/locking issues. It also means that the inbox queue is not highly scalable, but that's ok for a system which is only intended to have a few users per instance. All ActivityPub posts are stored as text files, and there is no database as such other than the filesystem itself. Think of it as being like an email server. Each post is a json file stored in *accounts/nick@domain/inbox* or *accounts/nick@domain/outbox*. To avoid parsing problems slashes are replaced by hashes within the ActivityPub post filename. The filename for each post is the same as its ActivityPub id. - + ## Themes security From ba87771bf6a1b8fa91901a6a020565def6f703dd Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 28 Jun 2021 16:48:31 +0100 Subject: [PATCH 1293/1416] Image links --- README_architecture.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README_architecture.md b/README_architecture.md index 45214287e..77fdf052b 100644 --- a/README_architecture.md +++ b/README_architecture.md @@ -4,13 +4,13 @@ The main modules are *epicyon.py* and *daemon.py*. *epicyon.py* is the commandline interface and *daemon.py* is the http server. - +![commandline and core modules](./raw/main/architecture/epicyon_groups_Commandline-Interface_Core.png) The daemon runs the inbox queue in a separate thread (see *inbox.py*) and the inbox que processes incoming ActivityPub posts one at a time in a strictly serial fashion. Doing it this way means minimum potential for any parallelism/locking issues. It also means that the inbox queue is not highly scalable, but that's ok for a system which is only intended to have a few users per instance. All ActivityPub posts are stored as text files, and there is no database as such other than the filesystem itself. Think of it as being like an email server. Each post is a json file stored in *accounts/nick@domain/inbox* or *accounts/nick@domain/outbox*. To avoid parsing problems slashes are replaced by hashes within the ActivityPub post filename. The filename for each post is the same as its ActivityPub id. - +![timeline and core modules](./raw/main/architecture/epicyon_groups_Timeline_Core.png) ## Themes security From ea7458a804dda0dd896c70babde0eb1bca94c831 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 28 Jun 2021 16:54:10 +0100 Subject: [PATCH 1294/1416] Image links --- README_architecture.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README_architecture.md b/README_architecture.md index 77fdf052b..ed4fa3a4d 100644 --- a/README_architecture.md +++ b/README_architecture.md @@ -4,13 +4,13 @@ The main modules are *epicyon.py* and *daemon.py*. *epicyon.py* is the commandline interface and *daemon.py* is the http server. -![commandline and core modules](./raw/main/architecture/epicyon_groups_Commandline-Interface_Core.png) +![commandline and core modules](https://gitlab.com/bashrc2/epicyon/-/raw/main/architecture/epicyon_groups_Commandline-Interface_Core.png) The daemon runs the inbox queue in a separate thread (see *inbox.py*) and the inbox que processes incoming ActivityPub posts one at a time in a strictly serial fashion. Doing it this way means minimum potential for any parallelism/locking issues. It also means that the inbox queue is not highly scalable, but that's ok for a system which is only intended to have a few users per instance. All ActivityPub posts are stored as text files, and there is no database as such other than the filesystem itself. Think of it as being like an email server. Each post is a json file stored in *accounts/nick@domain/inbox* or *accounts/nick@domain/outbox*. To avoid parsing problems slashes are replaced by hashes within the ActivityPub post filename. The filename for each post is the same as its ActivityPub id. -![timeline and core modules](./raw/main/architecture/epicyon_groups_Timeline_Core.png) +![timeline and core modules](https://gitlab.com/bashrc2/epicyon/-/raw/main/architecture/epicyon_groups_Timeline_Core.png) ## Themes security From 0e6d441a63802fb591d14fd2221230b1b9a18f11 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 28 Jun 2021 17:34:51 +0100 Subject: [PATCH 1295/1416] Anti-scale --- README_architecture.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README_architecture.md b/README_architecture.md index ed4fa3a4d..8f0649be5 100644 --- a/README_architecture.md +++ b/README_architecture.md @@ -1,5 +1,13 @@ # Epicyon Software Architecture +## Anti-scale principle + +In general, methods have been preferred which do not vertically scale. This includes the decision not to use a database, and the way that the inbox is processed. Lack of scalability also simplifies the design. + +Being hostile towards the common notion of scaling means that this system will be of no interest to "big tech" and can't easily be used within extractive economic models without needing a substantial rewrite. + +This system should however be able to scale rhizomatically with the deployment of many small instances federated together. + ## High level architecture The main modules are *epicyon.py* and *daemon.py*. *epicyon.py* is the commandline interface and *daemon.py* is the http server. @@ -18,5 +26,8 @@ It is possible to include arbitrary CSS within a custom theme. To avoid security The way that the theming system was designed is in order to avoid problems similar to Wordpress, in which an adversary will create an attactive looking theme which contains an expolit. The discovery of exploits then leads to a centralizing dynamic where there is a single "official" themes website or app store. With Epicyon, *themes should always be safe to use no matter where they were downloaded from*. +## Notifications +There are no notifications in the conventional sense. That is, there is no streaming API or linkage to browser notifications. Instead when significant events occur these create text files which can then be detected by other systems via polling. +See *scripts/epicyon-notifications* for an example of a script which could be run in a cron job to then send notifications via XMPP or Matrix. From 50650205328fa6c1aa21fea0bf5c4efb05465569 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 28 Jun 2021 17:45:17 +0100 Subject: [PATCH 1296/1416] Architecture linked from main README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7beb9a1bc..15d46b90d 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Epicyon is a modern [ActivityPub](https://www.w3.org/TR/activitypub) compliant server implementing both S2S and C2S protocols and suitable for installation on single board computers. It includes features such as moderation tools, post expiry, content warnings, image descriptions, news feed and perimeter defense against adversaries. It contains *no JavaScript* and uses HTML+CSS with a Python backend. -[Project Goals](README_goals.md) - [Commandline interface](README_commandline.md) - [Customizations](README_customizations.md) - [Code of Conduct](code-of-conduct.md) +[Project Goals](README_goals.md) - [Commandline interface](README_commandline.md) - [Customizations](README_customizations.md) - [Software Architecture](README_architecture.md) - [Code of Conduct](code-of-conduct.md) Matrix room: **#epicyon:matrix.freedombone.net** From add5f8d6cfa07cd688d0bcccc72c5265b2c9727c Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 28 Jun 2021 17:55:09 +0100 Subject: [PATCH 1297/1416] No javascript --- README_architecture.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README_architecture.md b/README_architecture.md index 8f0649be5..b471b891e 100644 --- a/README_architecture.md +++ b/README_architecture.md @@ -8,13 +8,17 @@ Being hostile towards the common notion of scaling means that this system will b This system should however be able to scale rhizomatically with the deployment of many small instances federated together. +## No Javascript + +This is so that the system can be accessed and used normally with javascript in the web browser turned off. If you want to have good security then this is useful, since lack of javascript greatly reduces the attack surface and constrains adversaries to a limited number of vectors. + ## High level architecture The main modules are *epicyon.py* and *daemon.py*. *epicyon.py* is the commandline interface and *daemon.py* is the http server. ![commandline and core modules](https://gitlab.com/bashrc2/epicyon/-/raw/main/architecture/epicyon_groups_Commandline-Interface_Core.png) -The daemon runs the inbox queue in a separate thread (see *inbox.py*) and the inbox que processes incoming ActivityPub posts one at a time in a strictly serial fashion. Doing it this way means minimum potential for any parallelism/locking issues. It also means that the inbox queue is not highly scalable, but that's ok for a system which is only intended to have a few users per instance. +The daemon runs the inbox queue in a separate thread (see *inbox.py*) and the inbox queue processes incoming ActivityPub posts one at a time in a strictly serial fashion. Doing it this way means minimum potential for any parallelism/locking issues. It also means that the inbox queue is not highly scalable, but that's ok for a system which is only intended to have a few users per instance. All ActivityPub posts are stored as text files, and there is no database as such other than the filesystem itself. Think of it as being like an email server. Each post is a json file stored in *accounts/nick@domain/inbox* or *accounts/nick@domain/outbox*. To avoid parsing problems slashes are replaced by hashes within the ActivityPub post filename. The filename for each post is the same as its ActivityPub id. From b425f1625c645d34b67dd5d583abd1ce19f18d1d Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 28 Jun 2021 18:00:19 +0100 Subject: [PATCH 1298/1416] No tc --- README_architecture.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README_architecture.md b/README_architecture.md index b471b891e..c18c73cbf 100644 --- a/README_architecture.md +++ b/README_architecture.md @@ -28,7 +28,7 @@ All ActivityPub posts are stored as text files, and there is no database as such It is possible to include arbitrary CSS within a custom theme. To avoid security problems the CSS is sanitized before being used. Scripts or import references to other CSS files are not permitted. -The way that the theming system was designed is in order to avoid problems similar to Wordpress, in which an adversary will create an attactive looking theme which contains an expolit. The discovery of exploits then leads to a centralizing dynamic where there is a single "official" themes website or app store. With Epicyon, *themes should always be safe to use no matter where they were downloaded from*. +The way that the theming system was designed is in order to avoid problems similar to Wordpress, in which an adversary will create an attactive looking theme which contains an expolit. The discovery of exploits then leads to a centralizing dynamic where there is a single "official" themes website or app store. With Epicyon, *themes should always be safe to use no matter where they were downloaded from*. There should be nothing *Turing complete* within a theme. ## Notifications From 3a8dd25fcdb966accb3f95c4cbd1cfd9a9f2efae Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 28 Jun 2021 18:07:06 +0100 Subject: [PATCH 1299/1416] c2s security --- README_architecture.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/README_architecture.md b/README_architecture.md index c18c73cbf..3dd6636b2 100644 --- a/README_architecture.md +++ b/README_architecture.md @@ -1,6 +1,6 @@ # Epicyon Software Architecture -## Anti-scale principle +## Anti-scale Principle In general, methods have been preferred which do not vertically scale. This includes the decision not to use a database, and the way that the inbox is processed. Lack of scalability also simplifies the design. @@ -12,7 +12,7 @@ This system should however be able to scale rhizomatically with the deployment o This is so that the system can be accessed and used normally with javascript in the web browser turned off. If you want to have good security then this is useful, since lack of javascript greatly reduces the attack surface and constrains adversaries to a limited number of vectors. -## High level architecture +## High Level Architecture The main modules are *epicyon.py* and *daemon.py*. *epicyon.py* is the commandline interface and *daemon.py* is the http server. @@ -24,12 +24,16 @@ All ActivityPub posts are stored as text files, and there is no database as such ![timeline and core modules](https://gitlab.com/bashrc2/epicyon/-/raw/main/architecture/epicyon_groups_Timeline_Core.png) -## Themes security +## Themes Security It is possible to include arbitrary CSS within a custom theme. To avoid security problems the CSS is sanitized before being used. Scripts or import references to other CSS files are not permitted. The way that the theming system was designed is in order to avoid problems similar to Wordpress, in which an adversary will create an attactive looking theme which contains an expolit. The discovery of exploits then leads to a centralizing dynamic where there is a single "official" themes website or app store. With Epicyon, *themes should always be safe to use no matter where they were downloaded from*. There should be nothing *Turing complete* within a theme. +## C2S Security + +This currently uses basic auth, which is simple to implement. Oauth2 is conventional, but seems overly complex and the user interface for it within other comparable apps is clunky. + ## Notifications There are no notifications in the conventional sense. That is, there is no streaming API or linkage to browser notifications. Instead when significant events occur these create text files which can then be detected by other systems via polling. From 97ec53143c84ad1c363642627a292591339109b6 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 28 Jun 2021 18:18:57 +0100 Subject: [PATCH 1300/1416] Document crawlers --- README_architecture.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README_architecture.md b/README_architecture.md index 3dd6636b2..c4d889613 100644 --- a/README_architecture.md +++ b/README_architecture.md @@ -34,6 +34,16 @@ The way that the theming system was designed is in order to avoid problems simil This currently uses basic auth, which is simple to implement. Oauth2 is conventional, but seems overly complex and the user interface for it within other comparable apps is clunky. +## Support Accessibility + +In terms of trying to keep up with web accessibility standards, having configurable keyboard shortcuts, high contrast themes, text-to-speech client and also the ability to run in a shell browser such as Lynx. + +Avoid adding any features which would be hard to make accessible. + +## Block Crawlers + +Ordinarily web crawlers would not be a problem, but in the context of a social network even having crawlers index public posts can create ethical dilemmas in some circumstances. News instances may allow crawlers, but other types of instances should block them. + ## Notifications There are no notifications in the conventional sense. That is, there is no streaming API or linkage to browser notifications. Instead when significant events occur these create text files which can then be detected by other systems via polling. From 784aca35f311f39d20857bbe1d4633b5106171aa Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 28 Jun 2021 18:28:14 +0100 Subject: [PATCH 1301/1416] Don't block crawlers on news instances --- daemon.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/daemon.py b/daemon.py index b3904bf63..6df796b8f 100644 --- a/daemon.py +++ b/daemon.py @@ -466,6 +466,8 @@ class PubServer(BaseHTTPRequestHandler): # is this a web crawler? If so the block it agentStrLower = agentStr.lower() if 'bot/' in agentStrLower or 'bot-' in agentStrLower: + if if self.server.newsInstance: + return False print('Blocked Crawler: ' + agentStr) return True # get domain name from User-Agent From df3de68e52ef2b51d208d98f862ee982f0964d83 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 28 Jun 2021 18:28:57 +0100 Subject: [PATCH 1302/1416] Don't block crawlers on news instances --- daemon.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daemon.py b/daemon.py index 6df796b8f..e02a57147 100644 --- a/daemon.py +++ b/daemon.py @@ -466,7 +466,7 @@ class PubServer(BaseHTTPRequestHandler): # is this a web crawler? If so the block it agentStrLower = agentStr.lower() if 'bot/' in agentStrLower or 'bot-' in agentStrLower: - if if self.server.newsInstance: + if self.server.newsInstance: return False print('Blocked Crawler: ' + agentStr) return True From aaa0be4d54a02346fbcc5f9072d54a11a7e1adf2 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 28 Jun 2021 21:06:51 +0100 Subject: [PATCH 1303/1416] Architecture sections --- README_architecture.md | 43 +++++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/README_architecture.md b/README_architecture.md index c4d889613..28e8db6bd 100644 --- a/README_architecture.md +++ b/README_architecture.md @@ -1,6 +1,8 @@ # Epicyon Software Architecture -## Anti-scale Principle +## Design Constrains + +### Anti-scale Principle In general, methods have been preferred which do not vertically scale. This includes the decision not to use a database, and the way that the inbox is processed. Lack of scalability also simplifies the design. @@ -8,10 +10,27 @@ Being hostile towards the common notion of scaling means that this system will b This system should however be able to scale rhizomatically with the deployment of many small instances federated together. -## No Javascript +### No Javascript This is so that the system can be accessed and used normally with javascript in the web browser turned off. If you want to have good security then this is useful, since lack of javascript greatly reduces the attack surface and constrains adversaries to a limited number of vectors. +### Block Crawlers + +Ordinarily web crawlers would not be a problem, but in the context of a social network even having crawlers index public posts can create ethical dilemmas in some circumstances. News instances may allow crawlers, but other types of instances should block them. + +### No Local or Federated Timelines + +The local and federated timelines of other ActivityPub servers don't add much value (especially the federated one), and tend to pollute the default timeline with irrelevant posts from people that you don't follow. + +Especially on a small instance with a few users, the local timeline would not be significantly useful. + +### Notification handling is out of scope + +There are no notifications in the conventional sense. That is, there is no streaming API or linkage to browser notifications. Instead when significant events occur these create text files which can then be detected by other systems via polling. + +See *scripts/epicyon-notifications* for an example of a script which could be run in a cron job to then send notifications via XMPP or Matrix. + + ## High Level Architecture The main modules are *epicyon.py* and *daemon.py*. *epicyon.py* is the commandline interface and *daemon.py* is the http server. @@ -24,28 +43,22 @@ All ActivityPub posts are stored as text files, and there is no database as such ![timeline and core modules](https://gitlab.com/bashrc2/epicyon/-/raw/main/architecture/epicyon_groups_Timeline_Core.png) -## Themes Security + +## Security + +### Themes It is possible to include arbitrary CSS within a custom theme. To avoid security problems the CSS is sanitized before being used. Scripts or import references to other CSS files are not permitted. The way that the theming system was designed is in order to avoid problems similar to Wordpress, in which an adversary will create an attactive looking theme which contains an expolit. The discovery of exploits then leads to a centralizing dynamic where there is a single "official" themes website or app store. With Epicyon, *themes should always be safe to use no matter where they were downloaded from*. There should be nothing *Turing complete* within a theme. -## C2S Security +### C2S This currently uses basic auth, which is simple to implement. Oauth2 is conventional, but seems overly complex and the user interface for it within other comparable apps is clunky. -## Support Accessibility +## Accessibility -In terms of trying to keep up with web accessibility standards, having configurable keyboard shortcuts, high contrast themes, text-to-speech client and also the ability to run in a shell browser such as Lynx. +Trying to keep up with web accessibility standards. There should be configurable keyboard shortcuts for all of the main navigation actions. High contrast themes should be available. The desktop client should support text-to-speech. There should be the ability to run in a shell browser such as Lynx, without any significant loss of functionality. Avoid adding any features which would be hard to make accessible. -## Block Crawlers - -Ordinarily web crawlers would not be a problem, but in the context of a social network even having crawlers index public posts can create ethical dilemmas in some circumstances. News instances may allow crawlers, but other types of instances should block them. - -## Notifications - -There are no notifications in the conventional sense. That is, there is no streaming API or linkage to browser notifications. Instead when significant events occur these create text files which can then be detected by other systems via polling. - -See *scripts/epicyon-notifications* for an example of a script which could be run in a cron job to then send notifications via XMPP or Matrix. From 31fa93c655057a57a93c882a480eef0ed91f6775 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 28 Jun 2021 21:14:01 +0100 Subject: [PATCH 1304/1416] Multi user --- README_architecture.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README_architecture.md b/README_architecture.md index 28e8db6bd..64d1e88ad 100644 --- a/README_architecture.md +++ b/README_architecture.md @@ -2,6 +2,16 @@ ## Design Constrains +### Open Standards Compliance + +Follow the standards for HTML, CSS and ActivityPub. Especially with ActivityPub there is always some room for interpreatation, so if in doubt about a protocol implementation detail then do whatever Mastodon does to maintain maximum compatibility. + +### Multi-User + +It is assumed that an instance may have multiple users, although the maximum number of users is not expected to be very high. This system is for a "family and friends" or small club type of scenario. + +Although it can be single user, this is not strictly a single user system. + ### Anti-scale Principle In general, methods have been preferred which do not vertically scale. This includes the decision not to use a database, and the way that the inbox is processed. Lack of scalability also simplifies the design. From 30b88edbef52a87516a97f028205ea8708c3767d Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 28 Jun 2021 21:15:10 +0100 Subject: [PATCH 1305/1416] Spelling --- README_architecture.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README_architecture.md b/README_architecture.md index 64d1e88ad..0a9cb732f 100644 --- a/README_architecture.md +++ b/README_architecture.md @@ -4,7 +4,7 @@ ### Open Standards Compliance -Follow the standards for HTML, CSS and ActivityPub. Especially with ActivityPub there is always some room for interpreatation, so if in doubt about a protocol implementation detail then do whatever Mastodon does to maintain maximum compatibility. +Follow the standards for HTML, CSS and ActivityPub. Especially with ActivityPub there is always some room for interpretation, so if in doubt about a protocol implementation detail then do whatever Mastodon does to maintain maximum compatibility. ### Multi-User From 38cb7bd4a8be6423367da527fbf3aafb9cd0acec Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 28 Jun 2021 21:16:58 +0100 Subject: [PATCH 1306/1416] Typo --- README_architecture.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README_architecture.md b/README_architecture.md index 0a9cb732f..e268a1469 100644 --- a/README_architecture.md +++ b/README_architecture.md @@ -1,6 +1,6 @@ # Epicyon Software Architecture -## Design Constrains +## Design Constraints ### Open Standards Compliance From 4d63e8a1238f3161fe0d56e661eb10a43c8ce3a4 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 28 Jun 2021 21:26:40 +0100 Subject: [PATCH 1307/1416] Linked data --- README_architecture.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README_architecture.md b/README_architecture.md index e268a1469..3afd1197b 100644 --- a/README_architecture.md +++ b/README_architecture.md @@ -40,6 +40,10 @@ There are no notifications in the conventional sense. That is, there is no strea See *scripts/epicyon-notifications* for an example of a script which could be run in a cron job to then send notifications via XMPP or Matrix. +### Limited Linked Data Support + +Where Json linked data signatures are supported there should not be arbitrary schema lookups via the web. Instead, recognized contexts should be added to *context.py*. This is in order to follow the principle of *no processing without full recognition*, in which the recognition step is not endlessly extendable by untrusted parties. + ## High Level Architecture From 41b7c59966d04c7c12ff8398d8e3e0879d4346e7 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 28 Jun 2021 21:49:10 +0100 Subject: [PATCH 1308/1416] Opinionated --- README_architecture.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README_architecture.md b/README_architecture.md index 3afd1197b..283649f16 100644 --- a/README_architecture.md +++ b/README_architecture.md @@ -12,6 +12,10 @@ It is assumed that an instance may have multiple users, although the maximum num Although it can be single user, this is not strictly a single user system. +### Opinionated + +The design of this system is opinionated, and to a large extent informed by years of past experience in the fediverse. There is no claim to neutrality of any sort. Automatic removal of hellthreads and other common griefing tactics is an example of this. + ### Anti-scale Principle In general, methods have been preferred which do not vertically scale. This includes the decision not to use a database, and the way that the inbox is processed. Lack of scalability also simplifies the design. From f1f3efc009240e74d96e53d8723888a0d5a33cf2 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 29 Jun 2021 09:46:56 +0100 Subject: [PATCH 1309/1416] Better title --- README_architecture.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README_architecture.md b/README_architecture.md index 283649f16..884f262e5 100644 --- a/README_architecture.md +++ b/README_architecture.md @@ -16,9 +16,9 @@ Although it can be single user, this is not strictly a single user system. The design of this system is opinionated, and to a large extent informed by years of past experience in the fediverse. There is no claim to neutrality of any sort. Automatic removal of hellthreads and other common griefing tactics is an example of this. -### Anti-scale Principle +### Resisting Centralization -In general, methods have been preferred which do not vertically scale. This includes the decision not to use a database, and the way that the inbox is processed. Lack of scalability also simplifies the design. +Centralization is characterized by the typical fixation upon "scale" within the software industry. In general, methods have been preferred which do not vertically scale. This includes the decision not to use a database, and the way that the inbox is processed. Lack of scalability also simplifies the design. Being hostile towards the common notion of scaling means that this system will be of no interest to "big tech" and can't easily be used within extractive economic models without needing a substantial rewrite. From 30c2c02be1b882dbb2d74e859cae638b8ac2c9d6 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 29 Jun 2021 10:04:07 +0100 Subject: [PATCH 1310/1416] More description --- README_architecture.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README_architecture.md b/README_architecture.md index 884f262e5..c9ecc32ad 100644 --- a/README_architecture.md +++ b/README_architecture.md @@ -18,11 +18,13 @@ The design of this system is opinionated, and to a large extent informed by year ### Resisting Centralization -Centralization is characterized by the typical fixation upon "scale" within the software industry. In general, methods have been preferred which do not vertically scale. This includes the decision not to use a database, and the way that the inbox is processed. Lack of scalability also simplifies the design. +Centralization is characterized by the typical fixation upon "scale" within the software industry. Systems which scale, in the way which is commonly understood, mean that a few individuals can control the social lives of many, and extract value from them in often cynical and manipulative ways. -Being hostile towards the common notion of scaling means that this system will be of no interest to "big tech" and can't easily be used within extractive economic models without needing a substantial rewrite. +In general, methods have been preferred which do not vertically scale. This includes the decision not to use a database, and the way that the inbox is processed. Lack of scalability also simplifies the design. -This system should however be able to scale rhizomatically with the deployment of many small instances federated together. +Being hostile towards the common notion of scaling means that this system will be of no interest to "big tech" and can't easily be used within extractive economic models without needing a substantial rewrite. This avoids the typical cooption strategies in which large companies eventually take over what was originally software developed by grassroots activists to address real community needs. + +This system should however be able to scale rhizomatically with the deployment of many small instances federated together. Instead of scaling up, scale out. In a network of many small instances nobody has overall control and corporate capture is much more unlikely. Small instances also minimize the bureaucratic requirements for governance processes, which at medium to large scale eventually becomes tyrannical. ### No Javascript From cb993d947048bf558629941ba83a016e8e034a47 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 29 Jun 2021 10:17:43 +0100 Subject: [PATCH 1311/1416] Roles --- README_architecture.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README_architecture.md b/README_architecture.md index c9ecc32ad..fac28ead0 100644 --- a/README_architecture.md +++ b/README_architecture.md @@ -26,6 +26,10 @@ Being hostile towards the common notion of scaling means that this system will b This system should however be able to scale rhizomatically with the deployment of many small instances federated together. Instead of scaling up, scale out. In a network of many small instances nobody has overall control and corporate capture is much more unlikely. Small instances also minimize the bureaucratic requirements for governance processes, which at medium to large scale eventually becomes tyrannical. +### Roles + +The roles within an instance are comparable to the crew roles onboard a ship, with the admin being its captain. Delegation is minimal, with the admin assigning roles to particular user accounts. Avoiding delegation prevents a hierarchy of roles from forming. Social organization should be as horizontal as possible. Roles could be rotated - even including that of admin - although there is no technical mechanism requiring that. + ### No Javascript This is so that the system can be accessed and used normally with javascript in the web browser turned off. If you want to have good security then this is useful, since lack of javascript greatly reduces the attack surface and constrains adversaries to a limited number of vectors. From c48774ddc7477a6a4bbe4b9ac55ce1efe482e64a Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 29 Jun 2021 10:31:16 +0100 Subject: [PATCH 1312/1416] Assumption of hostility --- README_architecture.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README_architecture.md b/README_architecture.md index fac28ead0..a19050fc3 100644 --- a/README_architecture.md +++ b/README_architecture.md @@ -50,6 +50,12 @@ There are no notifications in the conventional sense. That is, there is no strea See *scripts/epicyon-notifications* for an example of a script which could be run in a cron job to then send notifications via XMPP or Matrix. +### Assume Network Hostility + +Many of the early web systems existed in a twee world in which it was assumed that everyone is nice, but in social networks this is rarely true. + +It is usually safe to assume that the federated network beyond your instance is to a lesser or greater degree hostile. So there should be effective controls for blocking adversaries or spam floods. + ### Limited Linked Data Support Where Json linked data signatures are supported there should not be arbitrary schema lookups via the web. Instead, recognized contexts should be added to *context.py*. This is in order to follow the principle of *no processing without full recognition*, in which the recognition step is not endlessly extendable by untrusted parties. From 2d567fb143b898b681a50f1be18737099e350f46 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 29 Jun 2021 11:11:47 +0100 Subject: [PATCH 1313/1416] Typo --- README_architecture.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README_architecture.md b/README_architecture.md index a19050fc3..3163a1679 100644 --- a/README_architecture.md +++ b/README_architecture.md @@ -80,7 +80,7 @@ All ActivityPub posts are stored as text files, and there is no database as such It is possible to include arbitrary CSS within a custom theme. To avoid security problems the CSS is sanitized before being used. Scripts or import references to other CSS files are not permitted. -The way that the theming system was designed is in order to avoid problems similar to Wordpress, in which an adversary will create an attactive looking theme which contains an expolit. The discovery of exploits then leads to a centralizing dynamic where there is a single "official" themes website or app store. With Epicyon, *themes should always be safe to use no matter where they were downloaded from*. There should be nothing *Turing complete* within a theme. +The way that the theming system was designed is in order to avoid problems similar to Wordpress, in which an adversary will create an attactive looking theme which contains an exploit. The discovery of exploits then leads to a centralizing dynamic where there is a single "official" themes website or app store. With Epicyon, *themes should always be safe to use no matter where they were downloaded from*. There should be nothing *Turing complete* within a theme. ### C2S From dfeddf5abcc24510b520532c7678e9594be461e1 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 29 Jun 2021 18:44:17 +0100 Subject: [PATCH 1314/1416] Security interaction with timeline --- README_architecture.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README_architecture.md b/README_architecture.md index 3163a1679..2fe75b581 100644 --- a/README_architecture.md +++ b/README_architecture.md @@ -86,6 +86,12 @@ The way that the theming system was designed is in order to avoid problems simil This currently uses basic auth, which is simple to implement. Oauth2 is conventional, but seems overly complex and the user interface for it within other comparable apps is clunky. +### Interaction with Timeline + +![timeline and security modules](https://gitlab.com/bashrc2/epicyon/-/raw/main/architecture/epicyon_groups_Timeline_Security.png) + +The *inbox* queue makes calls to check http and linked data signatures. Various modules call *auth* typically because they're implementing the basic auth of the C2S interface. + ## Accessibility Trying to keep up with web accessibility standards. There should be configurable keyboard shortcuts for all of the main navigation actions. High contrast themes should be available. The desktop client should support text-to-speech. There should be the ability to run in a shell browser such as Lynx, without any significant loss of functionality. From 7bff40eb52bb1e3b5ec8983e54689796d2147817 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 29 Jun 2021 19:06:15 +0100 Subject: [PATCH 1315/1416] Accessibility architecture --- README_architecture.md | 7 +++++++ .../epicyon_groups_Core_Accessibility.png | Bin 0 -> 59663 bytes ...icyon_groups_Web-Interface_Accessibility.png | Bin 0 -> 69544 bytes tests.py | 5 +++++ 4 files changed, 12 insertions(+) create mode 100644 architecture/epicyon_groups_Core_Accessibility.png create mode 100644 architecture/epicyon_groups_Web-Interface_Accessibility.png diff --git a/README_architecture.md b/README_architecture.md index 2fe75b581..a7dff92aa 100644 --- a/README_architecture.md +++ b/README_architecture.md @@ -98,3 +98,10 @@ Trying to keep up with web accessibility standards. There should be configurable Avoid adding any features which would be hard to make accessible. +![web interface and accessibility modules](https://gitlab.com/bashrc2/epicyon/-/raw/main/architecture/epicyon_groups_Web-Interface_Accessibility.png) + +The *webapp_post* module generates html for each post from its ActivityPub json representation. This also calls the speaker module in order to create a text-to-speech friendly version of the post content, which can then be spoken by the desktop client. Doing this allows common acronyms and other special language to be properly pronounced. + +The *daemon* module (http server) also calls *webapp_accesskeys* to display the key shortcuts screen. + +![core and accessibility modules](https://gitlab.com/bashrc2/epicyon/-/raw/main/architecture/epicyon_groups_Core_Accessibility.png) diff --git a/architecture/epicyon_groups_Core_Accessibility.png b/architecture/epicyon_groups_Core_Accessibility.png new file mode 100644 index 0000000000000000000000000000000000000000..8a860e0f42e492134b7c4bf4c14d546c5cf4a770 GIT binary patch literal 59663 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 z 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 aUlN4LyDFx&HCm#;pJ$S?5(SU--u^$Hw89kt literal 0 HcmV?d00001 diff --git a/architecture/epicyon_groups_Web-Interface_Accessibility.png b/architecture/epicyon_groups_Web-Interface_Accessibility.png new file mode 100644 index 0000000000000000000000000000000000000000..738fd1f739ca85eb7ac56929f68412e75862bb70 GIT binary patch literal 69544 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 HLPP%-*+P&6 literal 0 HcmV?d00001 diff --git a/tests.py b/tests.py index cefa769d7..c9de2eeab 100644 --- a/tests.py +++ b/tests.py @@ -3290,6 +3290,11 @@ def _testFunctions(): modules, modGroups, maxModuleCalls) _diagramGroups(['Timeline', 'Security'], ['utils'], modules, modGroups, maxModuleCalls) + _diagramGroups(['Web Interface', 'Accessibility'], + ['utils', 'webapp_utils'], + modules, modGroups, maxModuleCalls) + _diagramGroups(['Core', 'Accessibility'], ['utils'], + modules, modGroups, maxModuleCalls) callGraphStr = 'digraph Epicyon {\n\n' callGraphStr += ' size="8,6"; ratio=fill;\n' From 4f575e8316b01673bf858122171f0d90b78d7b9d Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 30 Jun 2021 14:01:51 +0100 Subject: [PATCH 1316/1416] Getting petname --- petnames.py | 6 ++++++ webapp_person_options.py | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/petnames.py b/petnames.py index 2378c9047..fb11d2087 100644 --- a/petnames.py +++ b/petnames.py @@ -75,6 +75,12 @@ def getPetName(baseDir: str, nickname: str, domain: str, for pet in petnamesList: if pet.endswith(' ' + handle): return pet.replace(' ' + handle, '').strip() + elif ' ' + handle.lower() + '\n' in petnamesStr.lower(): + petnamesList = petnamesStr.split('\n') + handle = handle.lower() + for pet in petnamesList: + if pet.endswith(' ' + handle): + return pet.replace(' ' + handle, '').strip() return '' diff --git a/webapp_person_options.py b/webapp_person_options.py index 35ac8708e..6b55aafd8 100644 --- a/webapp_person_options.py +++ b/webapp_person_options.py @@ -235,7 +235,7 @@ def htmlPersonOptions(defaultTimeline: str, if authorized: if originPathStr == '/users/' + nickname: if optionsNickname: - handle = optionsNickname + '@' + optionsDomainFull + # handle = optionsNickname + '@' + optionsDomainFull petname = getPetName(baseDir, nickname, domain, handle) optionsStr += \ ' ' + translate['Petname'] + ': \n' + \ From 36303ab5784c2966e32f8ee9fe919c29afffdffb Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 30 Jun 2021 14:06:48 +0100 Subject: [PATCH 1317/1416] Getting petname --- petnames.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/petnames.py b/petnames.py index fb11d2087..9f61c0885 100644 --- a/petnames.py +++ b/petnames.py @@ -79,8 +79,9 @@ def getPetName(baseDir: str, nickname: str, domain: str, petnamesList = petnamesStr.split('\n') handle = handle.lower() for pet in petnamesList: - if pet.endswith(' ' + handle): - return pet.replace(' ' + handle, '').strip() + if pet.lower().endswith(' ' + handle): + handle2 = pet.split(' ')[-1] + return pet.replace(' ' + handle2, '').strip() return '' From 0627c10996719ef448cc614041b2b317f332f43c Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 1 Jul 2021 10:51:16 +0100 Subject: [PATCH 1318/1416] Tidying of image formats --- daemon.py | 8 ++------ utils.py | 9 +++++++++ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/daemon.py b/daemon.py index e02a57147..bf8bf311c 100644 --- a/daemon.py +++ b/daemon.py @@ -256,6 +256,7 @@ from utils import saveJson from utils import isSuspended from utils import dangerousMarkup from utils import refreshNewswire +from utils import isImageFile from manualapprove import manualDenyFollowRequest from manualapprove import manualApproveFollowRequest from announce import createAnnounce @@ -13235,12 +13236,7 @@ class PubServer(BaseHTTPRequestHandler): print('DEBUG: no media filename in POST') if filename: - if filename.endswith('.png') or \ - filename.endswith('.jpg') or \ - filename.endswith('.webp') or \ - filename.endswith('.avif') or \ - filename.endswith('.svg') or \ - filename.endswith('.gif'): + if isImageFile(filename): postImageFilename = filename.replace('.temp', '') print('Removing metadata from ' + postImageFilename) city = getSpoofedCity(self.server.city, diff --git a/utils.py b/utils.py index c2a79642f..0ac6b14d0 100644 --- a/utils.py +++ b/utils.py @@ -270,6 +270,15 @@ def getImageFormats() -> str: return imageFormats +def isImageFile(filename: str) -> bool: + """Is the given filename an image? + """ + for ext in getImageExtensions(): + if filename.endswith('.' + ext): + return True + return False + + def getMediaFormats() -> str: """Returns a string of permissable media formats used when selecting an attachment for a new post From 96a58c4428ea79af41f4e0ba976b05ef4c088ffa Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 1 Jul 2021 11:04:14 +0100 Subject: [PATCH 1319/1416] Duplicate function --- daemon.py | 13 ++++++------- media.py | 11 ----------- 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/daemon.py b/daemon.py index bf8bf311c..c335b74b1 100644 --- a/daemon.py +++ b/daemon.py @@ -114,7 +114,6 @@ from threads import threadWithTrace from threads import removeDormantThreads from media import replaceYouTube from media import attachMedia -from media import pathIsImage from media import pathIsVideo from media import pathIsAudio from blocking import updateBlockedCache @@ -5927,7 +5926,7 @@ class PubServer(BaseHTTPRequestHandler): GETstartTime, GETtimings: {}) -> None: """Returns a media file """ - if pathIsImage(path) or \ + if isImageFile(path) or \ pathIsVideo(path) or \ pathIsAudio(path): mediaStr = path.split('/media/')[1] @@ -5957,7 +5956,7 @@ class PubServer(BaseHTTPRequestHandler): GETstartTime, GETtimings: {}) -> None: """Returns an emoji image """ - if pathIsImage(path): + if isImageFile(path): emojiStr = path.split('/emoji/')[1] emojiFilename = baseDir + '/emoji/' + emojiStr if os.path.isfile(emojiFilename): @@ -10203,7 +10202,7 @@ class PubServer(BaseHTTPRequestHandler): GETstartTime, GETtimings: {}) -> bool: """Show a shared item image """ - if not pathIsImage(path): + if not isImageFile(path): self._404() return True @@ -10253,7 +10252,7 @@ class PubServer(BaseHTTPRequestHandler): if '/accounts/avatars/' not in path: if '/accounts/headers/' not in path: return False - if not pathIsImage(path): + if not isImageFile(path): return False if '/accounts/avatars/' in path: avatarStr = path.split('/accounts/avatars/')[1] @@ -11475,7 +11474,7 @@ class PubServer(BaseHTTPRequestHandler): # if not authorized then show the login screen if htmlGET and self.path != '/login' and \ - not pathIsImage(self.path) and \ + not isImageFile(self.path) and \ self.path != '/' and \ self.path != '/users/news/linksmobile' and \ self.path != '/users/news/newswiremobile': @@ -13136,7 +13135,7 @@ class PubServer(BaseHTTPRequestHandler): fileLength = -1 if '/media/' in self.path: - if pathIsImage(self.path) or \ + if isImageFile(self.path) or \ pathIsVideo(self.path) or \ pathIsAudio(self.path): mediaStr = self.path.split('/media/')[1] diff --git a/media.py b/media.py index 8b83d4f0d..3d374ae22 100644 --- a/media.py +++ b/media.py @@ -286,17 +286,6 @@ def archiveMedia(baseDir: str, archiveDirectory: str, maxWeeks=4) -> None: break -def pathIsImage(path: str) -> bool: - if path.endswith('.png') or \ - path.endswith('.jpg') or \ - path.endswith('.gif') or \ - path.endswith('.svg') or \ - path.endswith('.avif') or \ - path.endswith('.webp'): - return True - return False - - def pathIsVideo(path: str) -> bool: if path.endswith('.ogv') or \ path.endswith('.mp4'): From d801482f97e1c2465f5c6a9795b53d5b6e201f5d Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 1 Jul 2021 12:02:11 +0100 Subject: [PATCH 1320/1416] Include width and height metadata for attached images --- media.py | 30 ++++++++++++++++++++++++++++++ tests.py | 19 +++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/media.py b/media.py index 3d374ae22..2f788117e 100644 --- a/media.py +++ b/media.py @@ -9,6 +9,7 @@ __module_group__ = "Timeline" import os import datetime +import subprocess from random import randint from hashlib import sha1 from auth import createPassword @@ -245,6 +246,13 @@ def attachMedia(baseDir: str, httpPrefix: str, } if mediaType.startswith('image/'): attachmentJson['focialPoint'] = [0.0, 0.0] + # find the dimensions of the image and add them as metadata + attachImageWidth, attachImageHeight = \ + getImageDimensions(imageFilename) + if attachImageWidth and attachImageHeight: + attachmentJson['width'] = attachImageWidth + attachmentJson['height'] = attachImageHeight + postJson['attachment'] = [attachmentJson] if baseDir: @@ -298,3 +306,25 @@ def pathIsAudio(path: str) -> bool: path.endswith('.mp3'): return True return False + + +def getImageDimensions(imageFilename: str) -> (int, int): + """Returns the dimensions of an image file + """ + try: + result = subprocess.run(['identify', '-format', '"%wx%h"', + imageFilename], stdout=subprocess.PIPE) + except BaseException: + return None, None + if not result: + return None, None + dimensionsStr = result.stdout.decode('utf-8').replace('"', '') + if 'x' not in dimensionsStr: + return None, None + widthStr = dimensionsStr.split('x')[0] + if not widthStr.isdigit(): + return None, None + heightStr = dimensionsStr.split('x')[1] + if not heightStr.isdigit(): + return None, None + return int(widthStr), int(heightStr) diff --git a/tests.py b/tests.py index c9de2eeab..972541101 100644 --- a/tests.py +++ b/tests.py @@ -86,6 +86,7 @@ from announce import sendAnnounceViaServer from city import parseNogoString from city import spoofGeolocation from city import pointInNogo +from media import getImageDimensions from media import getMediaPath from media import getAttachmentMediaType from delete import sendDeleteViaServer @@ -792,6 +793,10 @@ def testPostMessageBetweenServers(): alicePersonCache = {} aliceCachedWebfingers = {} attachedImageFilename = baseDir + '/img/logo.png' + testImageWidth, testImageHeight = \ + getImageDimensions(attachedImageFilename) + assert testImageWidth + assert testImageHeight mediaType = getAttachmentMediaType(attachedImageFilename) attachedImageDescription = 'Logo' isArticle = False @@ -875,6 +880,20 @@ def testPostMessageBetweenServers(): assert 'Why is a mouse when it spins?' in \ receivedJson['object']['content'] assert 'यह एक परीक्षण है' in receivedJson['object']['content'] + print('Check that message received from Alice contains an attachment') + assert receivedJson['object']['attachment'] + assert len(receivedJson['object']['attachment']) == 1 + attached = receivedJson['object']['attachment'][0] + pprint(attached) + assert attached.get('type') + assert attached.get('url') + assert attached['mediaType'] == 'image/png' + assert '/media/' in attached['url'] + assert attached['url'].endswith('.png') + assert attached.get('width') + assert attached.get('height') + assert attached['width'] > 0 + assert attached['height'] > 0 print('\n\n*******************************************************') print("Bob likes Alice's post") From ccddb3c765b6e705e3bfda064b713e738023a36f Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 1 Jul 2021 18:59:24 +0100 Subject: [PATCH 1321/1416] dat becomes hyper --- daemon.py | 6 +++--- epicyon.py | 6 ++---- follow.py | 4 ++-- person.py | 2 +- posts.py | 2 +- pyjsonld.py | 2 +- 6 files changed, 10 insertions(+), 12 deletions(-) diff --git a/daemon.py b/daemon.py index c335b74b1..bc03ad37f 100644 --- a/daemon.py +++ b/daemon.py @@ -1724,7 +1724,7 @@ class PubServer(BaseHTTPRequestHandler): print('moderationText: ' + moderationText) nickname = moderationText if nickname.startswith('http') or \ - nickname.startswith('dat'): + nickname.startswith('hyper'): nickname = getNicknameFromActor(nickname) if '@' in nickname: nickname = nickname.split('@')[0] @@ -1739,7 +1739,7 @@ class PubServer(BaseHTTPRequestHandler): if moderationButton == 'block': fullBlockDomain = None if moderationText.startswith('http') or \ - moderationText.startswith('dat'): + moderationText.startswith('hyper'): # https://domain blockDomain, blockPort = \ getDomainFromActor(moderationText) @@ -1757,7 +1757,7 @@ class PubServer(BaseHTTPRequestHandler): if moderationButton == 'unblock': fullBlockDomain = None if moderationText.startswith('http') or \ - moderationText.startswith('dat'): + moderationText.startswith('hyper'): # https://domain blockDomain, blockPort = \ getDomainFromActor(moderationText) diff --git a/epicyon.py b/epicyon.py index aa3966cea..226dee02a 100644 --- a/epicyon.py +++ b/epicyon.py @@ -1602,9 +1602,7 @@ if args.proxyPort: setConfigParam(baseDir, 'proxyPort', proxyPort) if args.gnunet: httpPrefix = 'gnunet' -if args.dat: - httpPrefix = 'dat' -if args.hyper: +if args.dat or args.hyper: httpPrefix = 'hyper' if args.i2p: httpPrefix = 'http' @@ -1645,7 +1643,7 @@ if args.followers: if '/@' in args.followers or \ '/users/' in args.followers or \ args.followers.startswith('http') or \ - args.followers.startswith('dat'): + args.followers.startswith('hyper'): # format: https://domain/@nick prefixes = getProtocolPrefixes() for prefix in prefixes: diff --git a/follow.py b/follow.py index 096394dd4..5567dd9bf 100644 --- a/follow.py +++ b/follow.py @@ -338,7 +338,7 @@ def _getNoOfFollows(baseDir: str, nickname: str, domain: str, not line.startswith('http'): ctr += 1 elif ((line.startswith('http') or - line.startswith('dat')) and + line.startswith('hyper')) and hasUsersPath(line)): ctr += 1 return ctr @@ -456,7 +456,7 @@ def getFollowingFeed(baseDir: str, domain: str, port: int, path: str, line2.split('@')[0] following['orderedItems'].append(url) elif ((line.startswith('http') or - line.startswith('dat')) and + line.startswith('hyper')) and hasUsersPath(line)): # https://domain/users/nickname pageCtr += 1 diff --git a/person.py b/person.py index 2f5b357c2..8fa100572 100644 --- a/person.py +++ b/person.py @@ -1208,7 +1208,7 @@ def getActorJson(hostDomain: str, handle: str, http: bool, gnunet: bool, if '/@' in handle or \ '/users/' in handle or \ handle.startswith('http') or \ - handle.startswith('dat'): + handle.startswith('hyper'): # format: https://domain/@nick originalHandle = handle if not hasUsersPath(originalHandle): diff --git a/posts.py b/posts.py index 8280ccc8c..0f7789111 100644 --- a/posts.py +++ b/posts.py @@ -1825,7 +1825,7 @@ def createReportPost(baseDir: str, if moderatorActor not in moderatorsList: moderatorsList.append(moderatorActor) continue - if line.startswith('http') or line.startswith('dat'): + if line.startswith('http') or line.startswith('hyper'): # must be a local address - no remote moderators if '://' + domainFull + '/' in line: if line not in moderatorsList: diff --git a/pyjsonld.py b/pyjsonld.py index 18bfbcd79..36d0df1fa 100644 --- a/pyjsonld.py +++ b/pyjsonld.py @@ -371,7 +371,7 @@ def load_document(url): # validate URL pieces = urllib_parse.urlparse(url) if (not all([pieces.scheme, pieces.netloc]) or - pieces.scheme not in ['http', 'https', 'dat'] or + pieces.scheme not in ['http', 'https', 'hyper'] or set(pieces.netloc) > set( string.ascii_letters + string.digits + '-.:')): raise JsonLdError( From 09c3703ba4c2fa4aca62a1f7b9a2d87aefc745fd Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 1 Jul 2021 21:11:01 +0100 Subject: [PATCH 1322/1416] Don't need default argument values --- posts.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/posts.py b/posts.py index 0f7789111..0ebcc2529 100644 --- a/posts.py +++ b/posts.py @@ -1066,18 +1066,18 @@ def _createPostBase(baseDir: str, nickname: str, domain: str, port: int, mediaType: str, imageDescription: str, city: str, isModerationReport: bool, isArticle: bool, - inReplyTo: str = None, - inReplyToAtomUri: str = None, - subject: str = None, schedulePost: bool = False, - eventDate: str = None, eventTime: str = None, - location: str = None, - eventUUID: str = None, category: str = None, - joinMode: str = None, - endDate: str = None, endTime: str = None, - maximumAttendeeCapacity: int = None, - repliesModerationOption: str = None, - anonymousParticipationEnabled: bool = None, - eventStatus: str = None, ticketUrl: str = None) -> {}: + inReplyTo: str, + inReplyToAtomUri: str, + subject: str, schedulePost: bool, + eventDate: str, eventTime: str, + location: str, + eventUUID: str, category: str, + joinMode: str, + endDate: str, endTime: str, + maximumAttendeeCapacity: int, + repliesModerationOption: str, + anonymousParticipationEnabled: bool, + eventStatus: str, ticketUrl: str) -> {}: """Creates a message """ content = removeInvalidChars(content) From 9003ae187d54d5a65c35731c97df5c69ed3b0045 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 1 Jul 2021 21:41:17 +0100 Subject: [PATCH 1323/1416] Fix public post tests --- epicyon.py | 56 ++++++++++++++++++++----- posts.py | 12 +++--- tests.py | 117 ++++++++++++++++++++++++++++++++++++++++++++++------- 3 files changed, 156 insertions(+), 29 deletions(-) diff --git a/epicyon.py b/epicyon.py index 226dee02a..3d6fe6d1b 100644 --- a/epicyon.py +++ b/epicyon.py @@ -2310,6 +2310,14 @@ if args.testdata: testMediaType = None testImageDescription = None testCity = 'London, England' + testInReplyTo = None + testInReplyToAtomUri = None + testSubject = None + testSchedulePost = False + testEventDate = None + testEventTime = None + testLocation = None + testIsArticle = False createPublicPost(baseDir, nickname, domain, port, httpPrefix, "like this is totally just a #test man", @@ -2318,7 +2326,11 @@ if args.testdata: testC2S, testCommentsEnabled, testAttachImageFilename, - testMediaType, testImageDescription, testCity) + testMediaType, testImageDescription, testCity, + testInReplyTo, testInReplyToAtomUri, + testSubject, testSchedulePost, + testEventDate, testEventTime, testLocation, + testIsArticle) createPublicPost(baseDir, nickname, domain, port, httpPrefix, "Zoiks!!!", testFollowersOnly, @@ -2326,7 +2338,11 @@ if args.testdata: testC2S, testCommentsEnabled, testAttachImageFilename, - testMediaType, testImageDescription, testCity) + testMediaType, testImageDescription, testCity, + testInReplyTo, testInReplyToAtomUri, + testSubject, testSchedulePost, + testEventDate, testEventTime, testLocation, + testIsArticle) createPublicPost(baseDir, nickname, domain, port, httpPrefix, "Hey scoob we need like a hundred more #milkshakes", testFollowersOnly, @@ -2334,7 +2350,11 @@ if args.testdata: testC2S, testCommentsEnabled, testAttachImageFilename, - testMediaType, testImageDescription, testCity) + testMediaType, testImageDescription, testCity, + testInReplyTo, testInReplyToAtomUri, + testSubject, testSchedulePost, + testEventDate, testEventTime, testLocation, + testIsArticle) createPublicPost(baseDir, nickname, domain, port, httpPrefix, "Getting kinda spooky around here", testFollowersOnly, @@ -2343,7 +2363,10 @@ if args.testdata: testCommentsEnabled, testAttachImageFilename, testMediaType, testImageDescription, testCity, - 'someone') + 'someone', testInReplyToAtomUri, + testSubject, testSchedulePost, + testEventDate, testEventTime, testLocation, + testIsArticle) createPublicPost(baseDir, nickname, domain, port, httpPrefix, "And they would have gotten away with it too" + "if it wasn't for those pesky hackers", @@ -2352,7 +2375,11 @@ if args.testdata: testC2S, testCommentsEnabled, 'img/logo.png', 'image/png', - 'Description of image', testCity) + 'Description of image', testCity, + testInReplyTo, testInReplyToAtomUri, + testSubject, testSchedulePost, + testEventDate, testEventTime, testLocation, + testIsArticle) createPublicPost(baseDir, nickname, domain, port, httpPrefix, "man these centralized sites are like the worst!", testFollowersOnly, @@ -2360,7 +2387,11 @@ if args.testdata: testC2S, testCommentsEnabled, testAttachImageFilename, - testMediaType, testImageDescription, testCity) + testMediaType, testImageDescription, testCity, + testInReplyTo, testInReplyToAtomUri, + testSubject, testSchedulePost, + testEventDate, testEventTime, testLocation, + testIsArticle) createPublicPost(baseDir, nickname, domain, port, httpPrefix, "another mystery solved #test", testFollowersOnly, @@ -2368,7 +2399,11 @@ if args.testdata: testC2S, testCommentsEnabled, testAttachImageFilename, - testMediaType, testImageDescription, testCity) + testMediaType, testImageDescription, testCity, + testInReplyTo, testInReplyToAtomUri, + testSubject, testSchedulePost, + testEventDate, testEventTime, testLocation, + testIsArticle) createPublicPost(baseDir, nickname, domain, port, httpPrefix, "let's go bowling", testFollowersOnly, @@ -2376,8 +2411,11 @@ if args.testdata: testC2S, testCommentsEnabled, testAttachImageFilename, - testMediaType, testImageDescription, testCity) - + testMediaType, testImageDescription, testCity, + testInReplyTo, testInReplyToAtomUri, + testSubject, testSchedulePost, + testEventDate, testEventTime, testLocation, + testIsArticle) domainFull = domain + ':' + str(port) clearFollows(baseDir, nickname, domain) followPerson(baseDir, nickname, domain, 'maxboardroom', domainFull, diff --git a/posts.py b/posts.py index 0ebcc2529..b95374f1e 100644 --- a/posts.py +++ b/posts.py @@ -1426,12 +1426,12 @@ def createPublicPost(baseDir: str, clientToServer: bool, commentsEnabled: bool, attachImageFilename: str, mediaType: str, imageDescription: str, city: str, - inReplyTo: str = None, - inReplyToAtomUri: str = None, subject: str = None, - schedulePost: bool = False, - eventDate: str = None, eventTime: str = None, - location: str = None, - isArticle: bool = False) -> {}: + inReplyTo: str, + inReplyToAtomUri: str, subject: str, + schedulePost: bool, + eventDate: str, eventTime: str, + location: str, + isArticle: bool) -> {}: """Public post """ domainFull = getFullDomain(domain, port) diff --git a/tests.py b/tests.py index 972541101..9496820ac 100644 --- a/tests.py +++ b/tests.py @@ -477,6 +477,14 @@ def createServerAlice(path: str, domain: str, port: int, testMediaType = None testImageDescription = None testCity = 'London, England' + testInReplyTo = None + testInReplyToAtomUri = None + testSubject = None + testSchedulePost = False + testEventDate = None + testEventTime = None + testLocation = None + testIsArticle = False createPublicPost(path, nickname, domain, port, httpPrefix, "No wise fish would go anywhere without a porpoise", testFollowersOnly, @@ -485,7 +493,11 @@ def createServerAlice(path: str, domain: str, port: int, testCommentsEnabled, testAttachImageFilename, testMediaType, - testImageDescription, testCity) + testImageDescription, testCity, + testInReplyTo, testInReplyToAtomUri, + testSubject, testSchedulePost, + testEventDate, testEventTime, testLocation, + testIsArticle) createPublicPost(path, nickname, domain, port, httpPrefix, "Curiouser and curiouser!", testFollowersOnly, @@ -494,7 +506,11 @@ def createServerAlice(path: str, domain: str, port: int, testCommentsEnabled, testAttachImageFilename, testMediaType, - testImageDescription, testCity) + testImageDescription, testCity, + testInReplyTo, testInReplyToAtomUri, + testSubject, testSchedulePost, + testEventDate, testEventTime, testLocation, + testIsArticle) createPublicPost(path, nickname, domain, port, httpPrefix, "In the gardens of memory, in the palace " + "of dreams, that is where you and I shall meet", @@ -504,7 +520,11 @@ def createServerAlice(path: str, domain: str, port: int, testCommentsEnabled, testAttachImageFilename, testMediaType, - testImageDescription, testCity) + testImageDescription, testCity, + testInReplyTo, testInReplyToAtomUri, + testSubject, testSchedulePost, + testEventDate, testEventTime, testLocation, + testIsArticle) global testServerAliceRunning testServerAliceRunning = True maxMentions = 10 @@ -582,6 +602,14 @@ def createServerBob(path: str, domain: str, port: int, testImageDescription = None testMediaType = None testCity = 'London, England' + testInReplyTo = None + testInReplyToAtomUri = None + testSubject = None + testSchedulePost = False + testEventDate = None + testEventTime = None + testLocation = None + testIsArticle = False createPublicPost(path, nickname, domain, port, httpPrefix, "It's your life, live it your way.", testFollowersOnly, @@ -590,7 +618,11 @@ def createServerBob(path: str, domain: str, port: int, testCommentsEnabled, testAttachImageFilename, testMediaType, - testImageDescription, testCity) + testImageDescription, testCity, + testInReplyTo, testInReplyToAtomUri, + testSubject, testSchedulePost, + testEventDate, testEventTime, testLocation, + testIsArticle) createPublicPost(path, nickname, domain, port, httpPrefix, "One of the things I've realised is that " + "I am very simple", @@ -600,7 +632,11 @@ def createServerBob(path: str, domain: str, port: int, testCommentsEnabled, testAttachImageFilename, testMediaType, - testImageDescription, testCity) + testImageDescription, testCity, + testInReplyTo, testInReplyToAtomUri, + testSubject, testSchedulePost, + testEventDate, testEventTime, testLocation, + testIsArticle) createPublicPost(path, nickname, domain, port, httpPrefix, "Quantum physics is a bit of a passion of mine", testFollowersOnly, @@ -609,7 +645,11 @@ def createServerBob(path: str, domain: str, port: int, testCommentsEnabled, testAttachImageFilename, testMediaType, - testImageDescription, testCity) + testImageDescription, testCity, + testInReplyTo, testInReplyToAtomUri, + testSubject, testSchedulePost, + testEventDate, testEventTime, testLocation, + testIsArticle) global testServerBobRunning testServerBobRunning = True maxMentions = 10 @@ -1435,10 +1475,28 @@ def _testCreatePerson(): setBio(baseDir, nickname, domain, 'Randomly roaming in your backyard') archivePostsForPerson(nickname, domain, baseDir, 'inbox', None, {}, 4) archivePostsForPerson(nickname, domain, baseDir, 'outbox', None, {}, 4) + testInReplyTo = None + testInReplyToAtomUri = None + testSubject = None + testSchedulePost = False + testEventDate = None + testEventTime = None + testLocation = None + testIsArticle = False + content = "G'day world!" + followersOnly = False + saveToFile = True + commentsEnabled = True + attachImageFilename = None + mediaType = None createPublicPost(baseDir, nickname, domain, port, httpPrefix, - "G'day world!", False, True, clientToServer, - True, None, None, None, None, - 'Not suitable for Vogons', 'London, England') + content, followersOnly, saveToFile, clientToServer, + commentsEnabled, attachImageFilename, mediaType, + 'Not suitable for Vogons', 'London, England', + testInReplyTo, testInReplyToAtomUri, + testSubject, testSchedulePost, + testEventDate, testEventTime, testLocation, + testIsArticle) os.chdir(currDir) shutil.rmtree(baseDir) @@ -2821,12 +2879,23 @@ def _testReplyToPublicPost() -> None: mediaType = None imageDescription = 'Some description' city = 'London, England' + testInReplyToAtomUri = None + testSubject = None + testSchedulePost = False + testEventDate = None + testEventTime = None + testLocation = None + testIsArticle = False reply = \ createPublicPost(baseDir, nickname, domain, port, httpPrefix, content, followersOnly, saveToFile, clientToServer, commentsEnabled, attachImageFilename, mediaType, - imageDescription, city, postId) + imageDescription, city, postId, + testInReplyToAtomUri, + testSubject, testSchedulePost, + testEventDate, testEventTime, testLocation, + testIsArticle) # print(str(reply)) assert reply['object']['content'] == \ '

' + \ @@ -3384,16 +3453,30 @@ def _testLinksWithinPost() -> None: saveToFile = False clientToServer = False commentsEnabled = True + attachImageFilename = None mediaType = None imageDescription = None city = 'London, England' + testInReplyTo = None + testInReplyToAtomUri = None + testSubject = None + testSchedulePost = False + testEventDate = None + testEventTime = None + testLocation = None + testIsArticle = False postJsonObject = \ createPublicPost(baseDir, nickname, domain, port, httpPrefix, content, followersOnly, saveToFile, clientToServer, commentsEnabled, - mediaType, imageDescription, city, - False, None) + attachImageFilename, mediaType, + imageDescription, city, + testInReplyTo, testInReplyToAtomUri, + testSubject, testSchedulePost, + testEventDate, testEventTime, testLocation, + testIsArticle) + assert postJsonObject['object']['content'] == \ '

This is a test post with links.

' + \ '
None: postJsonObject = \ createPublicPost(baseDir, nickname, domain, port, httpPrefix, content, - False, False, False, True, - None, None, False, None) + False, False, + False, True, + None, None, + False, None, + testInReplyTo, testInReplyToAtomUri, + testSubject, testSchedulePost, + testEventDate, testEventTime, testLocation, + testIsArticle) assert postJsonObject['object']['content'] == content From 2919417e59f8db555368a363c5603c8466258fbe Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 1 Jul 2021 21:50:18 +0100 Subject: [PATCH 1324/1416] Fix blog post arguments --- daemon.py | 8 +++++++- posts.py | 8 ++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/daemon.py b/daemon.py index bc03ad37f..6db87892d 100644 --- a/daemon.py +++ b/daemon.py @@ -13420,14 +13420,20 @@ class PubServer(BaseHTTPRequestHandler): print('WARN: blog posts must have content') return -1 # submit button on newblog screen + followersOnly = False + saveToFile = False + clientToServer = False + city = None messageJson = \ createBlogPost(self.server.baseDir, nickname, self.server.domain, self.server.port, self.server.httpPrefix, fields['message'], - False, False, False, commentsEnabled, + followersOnly, saveToFile, + clientToServer, commentsEnabled, filename, attachmentMediaType, fields['imageDescription'], + city, fields['replyTo'], fields['replyTo'], fields['subject'], fields['schedulePost'], diff --git a/posts.py b/posts.py index b95374f1e..9eac447bf 100644 --- a/posts.py +++ b/posts.py @@ -1501,10 +1501,10 @@ def createBlogPost(baseDir: str, clientToServer: bool, commentsEnabled: bool, attachImageFilename: str, mediaType: str, imageDescription: str, city: str, - inReplyTo: str = None, inReplyToAtomUri: str = None, - subject: str = None, schedulePost: bool = False, - eventDate: str = None, eventTime: str = None, - location: str = None) -> {}: + inReplyTo: str, inReplyToAtomUri: str, + subject: str, schedulePost: bool, + eventDate: str, eventTime: str, + location: str) -> {}: blogJson = \ createPublicPost(baseDir, nickname, domain, port, httpPrefix, From e1e545506d6422ac41d9d7520a98c78c1cac7e30 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 1 Jul 2021 21:54:33 +0100 Subject: [PATCH 1325/1416] Unlisted post arguments --- daemon.py | 6 +++++- posts.py | 8 ++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/daemon.py b/daemon.py index 6db87892d..6c202113f 100644 --- a/daemon.py +++ b/daemon.py @@ -13546,13 +13546,17 @@ class PubServer(BaseHTTPRequestHandler): self.server.baseDir, nickname, self.server.domain) + followersOnly = False + saveToFile = False + clientToServer = False messageJson = \ createUnlistedPost(self.server.baseDir, nickname, self.server.domain, self.server.port, self.server.httpPrefix, mentionsStr + fields['message'], - False, False, False, commentsEnabled, + followersOnly, saveToFile, + clientToServer, commentsEnabled, filename, attachmentMediaType, fields['imageDescription'], city, diff --git a/posts.py b/posts.py index 9eac447bf..29309a7cd 100644 --- a/posts.py +++ b/posts.py @@ -1600,10 +1600,10 @@ def createUnlistedPost(baseDir: str, clientToServer: bool, commentsEnabled: bool, attachImageFilename: str, mediaType: str, imageDescription: str, city: str, - inReplyTo: str = None, inReplyToAtomUri: str = None, - subject: str = None, schedulePost: bool = False, - eventDate: str = None, eventTime: str = None, - location: str = None) -> {}: + inReplyTo: str, inReplyToAtomUri: str, + subject: str, schedulePost: bool, + eventDate: str, eventTime: str, + location: str) -> {}: """Unlisted post. This has the #Public and followers links inverted. """ domainFull = getFullDomain(domain, port) From d24a5179428ed8f051ef16b2526c04143169c0a6 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 1 Jul 2021 21:58:16 +0100 Subject: [PATCH 1326/1416] Followers only post arguments --- daemon.py | 6 +++++- posts.py | 10 +++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/daemon.py b/daemon.py index 6c202113f..e3b4d75fd 100644 --- a/daemon.py +++ b/daemon.py @@ -13585,6 +13585,9 @@ class PubServer(BaseHTTPRequestHandler): self.server.baseDir, nickname, self.server.domain) + followersOnly = True + saveToFile = False + clientToServer = False messageJson = \ createFollowersOnlyPost(self.server.baseDir, nickname, @@ -13592,7 +13595,8 @@ class PubServer(BaseHTTPRequestHandler): self.server.port, self.server.httpPrefix, mentionsStr + fields['message'], - True, False, False, + followersOnly, saveToFile, + clientToServer, commentsEnabled, filename, attachmentMediaType, fields['imageDescription'], diff --git a/posts.py b/posts.py index 29309a7cd..832253c47 100644 --- a/posts.py +++ b/posts.py @@ -1630,11 +1630,11 @@ def createFollowersOnlyPost(baseDir: str, clientToServer: bool, commentsEnabled: bool, attachImageFilename: str, mediaType: str, imageDescription: str, city: str, - inReplyTo: str = None, - inReplyToAtomUri: str = None, - subject: str = None, schedulePost: bool = False, - eventDate: str = None, eventTime: str = None, - location: str = None) -> {}: + inReplyTo: str, + inReplyToAtomUri: str, + subject: str, schedulePost: bool, + eventDate: str, eventTime: str, + location: str) -> {}: """Followers only post """ domainFull = getFullDomain(domain, port) From 1515ef0bc92493635212cd4b3b917a4d92d01cc9 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 1 Jul 2021 22:05:22 +0100 Subject: [PATCH 1327/1416] DM post arguments --- daemon.py | 13 +++++++++++-- posts.py | 12 ++++++------ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/daemon.py b/daemon.py index e3b4d75fd..26b7caf0d 100644 --- a/daemon.py +++ b/daemon.py @@ -13687,6 +13687,9 @@ class PubServer(BaseHTTPRequestHandler): self.server.baseDir, nickname, self.server.domain) + followersOnly = True + saveToFile = False + clientToServer = False messageJson = \ createDirectMessagePost(self.server.baseDir, nickname, @@ -13695,7 +13698,8 @@ class PubServer(BaseHTTPRequestHandler): self.server.httpPrefix, mentionsStr + fields['message'], - True, False, False, + followersOnly, saveToFile, + clientToServer, commentsEnabled, filename, attachmentMediaType, fields['imageDescription'], @@ -13732,6 +13736,10 @@ class PubServer(BaseHTTPRequestHandler): self.server.baseDir, nickname, self.server.domain) + followersOnly = True + saveToFile = False + clientToServer = False + commentsEnabled = False messageJson = \ createDirectMessagePost(self.server.baseDir, nickname, @@ -13739,7 +13747,8 @@ class PubServer(BaseHTTPRequestHandler): self.server.port, self.server.httpPrefix, mentionsStr + fields['message'], - True, False, False, False, + followersOnly, saveToFile, + clientToServer, commentsEnabled, filename, attachmentMediaType, fields['imageDescription'], city, diff --git a/posts.py b/posts.py index 832253c47..aa9f26216 100644 --- a/posts.py +++ b/posts.py @@ -1747,12 +1747,12 @@ def createDirectMessagePost(baseDir: str, commentsEnabled: bool, attachImageFilename: str, mediaType: str, imageDescription: str, city: str, - inReplyTo: str = None, - inReplyToAtomUri: str = None, - subject: str = None, debug: bool = False, - schedulePost: bool = False, - eventDate: str = None, eventTime: str = None, - location: str = None) -> {}: + inReplyTo: str, + inReplyToAtomUri: str, + subject: str, debug: bool, + schedulePost: bool, + eventDate: str, eventTime: str, + location: str) -> {}: """Direct Message post """ content = resolvePetnames(baseDir, nickname, domain, content) From 5d38503baa9f726599dc07a7abea262a5a9142e0 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Thu, 1 Jul 2021 22:30:36 +0100 Subject: [PATCH 1328/1416] Deprecate events Mobilizon does it in a different way --- daemon.py | 280 +-------------------------------------------- inbox.py | 5 +- outbox.py | 2 - person.py | 10 +- posts.py | 72 +----------- utils.py | 4 +- webapp_timeline.py | 66 ----------- 7 files changed, 8 insertions(+), 431 deletions(-) diff --git a/daemon.py b/daemon.py index 26b7caf0d..b9ea77887 100644 --- a/daemon.py +++ b/daemon.py @@ -81,7 +81,6 @@ from posts import createBlogPost from posts import createReportPost from posts import createUnlistedPost from posts import createFollowersOnlyPost -from posts import createEventPost from posts import createDirectMessagePost from posts import populateRepliesJson from posts import addToField @@ -160,7 +159,6 @@ from webapp_person_options import htmlPersonOptions from webapp_timeline import htmlShares from webapp_timeline import htmlInbox from webapp_timeline import htmlBookmarks -from webapp_timeline import htmlEvents from webapp_timeline import htmlInboxDMs from webapp_timeline import htmlInboxReplies from webapp_timeline import htmlInboxMedia @@ -9043,138 +9041,6 @@ class PubServer(BaseHTTPRequestHandler): self.server.GETbusy = False return True - def _showEventsTimeline(self, authorized: bool, - callingDomain: str, path: str, - baseDir: str, httpPrefix: str, - domain: str, domainFull: str, port: int, - onionDomain: str, i2pDomain: str, - GETstartTime, GETtimings: {}, - proxyType: str, cookie: str, - debug: str) -> bool: - """Shows the events timeline - """ - if '/users/' in path: - if authorized: - # convert /events to /tlevents - if path.endswith('/events') or \ - '/events?page=' in path: - path = path.replace('/events', '/tlevents') - eventsFeed = \ - personBoxJson(self.server.recentPostsCache, - self.server.session, - baseDir, - domain, - port, - path, - httpPrefix, - maxPostsInFeed, 'tlevents', - authorized, - 0, self.server.positiveVoting, - self.server.votingTimeMins) - print('eventsFeed: ' + str(eventsFeed)) - if eventsFeed: - if self._requestHTTP(): - nickname = path.replace('/users/', '') - nickname = nickname.replace('/tlevents', '') - pageNumber = 1 - if '?page=' in nickname: - pageNumber = nickname.split('?page=')[1] - nickname = nickname.split('?page=')[0] - if pageNumber.isdigit(): - pageNumber = int(pageNumber) - else: - pageNumber = 1 - if 'page=' not in path: - # if no page was specified then show the first - eventsFeed = \ - personBoxJson(self.server.recentPostsCache, - self.server.session, - baseDir, - domain, - port, - path + '?page=1', - httpPrefix, - maxPostsInFeed, - 'tlevents', - authorized, - 0, self.server.positiveVoting, - self.server.votingTimeMins) - fullWidthTimelineButtonHeader = \ - self.server.fullWidthTimelineButtonHeader - minimalNick = isMinimal(baseDir, domain, nickname) - - accessKeys = self.server.accessKeys - if self.server.keyShortcuts.get(nickname): - accessKeys = \ - self.server.keyShortcuts[nickname] - - msg = \ - htmlEvents(self.server.cssCache, - self.server.defaultTimeline, - self.server.recentPostsCache, - self.server.maxRecentPosts, - self.server.translate, - pageNumber, maxPostsInFeed, - self.server.session, - baseDir, - self.server.cachedWebfingers, - self.server.personCache, - nickname, - domain, - port, - eventsFeed, - self.server.allowDeletion, - httpPrefix, - self.server.projectVersion, - minimalNick, - self.server.YTReplacementDomain, - self.server.showPublishedDateOnly, - self.server.newswire, - self.server.positiveVoting, - self.server.showPublishAsIcon, - fullWidthTimelineButtonHeader, - self.server.iconsAsButtons, - self.server.rssIconAtTop, - self.server.publishButtonAtTop, - authorized, - self.server.themeName, - self.server.peertubeInstances, - self.server.allowLocalNetworkAccess, - self.server.textModeBanner, - accessKeys) - msg = msg.encode('utf-8') - msglen = len(msg) - self._set_headers('text/html', msglen, - cookie, callingDomain) - self._write(msg) - self._benchmarkGETtimings(GETstartTime, GETtimings, - 'show bookmarks 2 done', - 'show events') - else: - # don't need authenticated fetch here because - # there is already the authorization check - msg = json.dumps(eventsFeed, - ensure_ascii=False) - msg = msg.encode('utf-8') - msglen = len(msg) - self._set_headers('application/json', msglen, - None, callingDomain) - self._write(msg) - self.server.GETbusy = False - return True - else: - if debug: - nickname = path.replace('/users/', '') - nickname = nickname.replace('/tlevents', '') - print('DEBUG: ' + nickname + - ' was not authorized to access ' + path) - if debug: - print('DEBUG: GET access to events is unauthorized') - self.send_response(405) - self.end_headers() - self.server.GETbusy = False - return True - def _showOutboxTimeline(self, authorized: bool, callingDomain: str, path: str, baseDir: str, httpPrefix: str, @@ -10385,7 +10251,7 @@ class PubServer(BaseHTTPRequestHandler): # Various types of new post in the web interface newPostEnd = ('newpost', 'newblog', 'newunlisted', 'newfollowers', 'newdm', 'newreminder', - 'newevent', 'newreport', 'newquestion', + 'newreport', 'newquestion', 'newshare') for postType in newPostEnd: if path.endswith('/' + postType): @@ -10578,44 +10444,6 @@ class PubServer(BaseHTTPRequestHandler): return True return False - def _editEvent(self, callingDomain: str, path: str, - httpPrefix: str, domain: str, domainFull: str, - baseDir: str, translate: {}, - mediaInstance: bool, - cookie: str) -> bool: - """Show edit event screen - """ - messageId = path.split('?editeventpost=')[1] - if '?' in messageId: - messageId = messageId.split('?')[0] - actor = path.split('?actor=')[1] - if '?' in actor: - actor = actor.split('?')[0] - nickname = getNicknameFromActor(path) - if nickname == actor: - # postUrl = \ - # httpPrefix + '://' + \ - # domainFull + '/users/' + nickname + \ - # '/statuses/' + messageId - msg = None - # TODO - # htmlEditEvent(mediaInstance, - # translate, - # baseDir, - # httpPrefix, - # path, - # nickname, domain, - # postUrl) - if msg: - msg = msg.encode('utf-8') - msglen = len(msg) - self._set_headers('text/html', msglen, - cookie, callingDomain) - self._write(msg) - self.server.GETbusy = False - return True - return False - def _getFollowingJson(self, baseDir: str, path: str, callingDomain: str, httpPrefix: str, @@ -12498,21 +12326,6 @@ class PubServer(BaseHTTPRequestHandler): self.server.GETbusy = False return - # Edit an event - if authorized and \ - '/tlevents' in self.path and \ - '?editeventpost=' in self.path and \ - '?actor=' in self.path: - if self._editEvent(callingDomain, self.path, - self.server.httpPrefix, - self.server.domain, - self.server.domainFull, - self.server.baseDir, - self.server.translate, - self.server.mediaInstance, - cookie): - return - # edit profile in web interface if self._editProfile(callingDomain, self.path, self.server.translate, @@ -12931,29 +12744,6 @@ class PubServer(BaseHTTPRequestHandler): 'show shares 2 done', 'show bookmarks 2 done') - # get the events for a given person - if self.path.endswith('/tlevents') or \ - '/tlevents?page=' in self.path or \ - self.path.endswith('/events') or \ - '/events?page=' in self.path: - if self._showEventsTimeline(authorized, - callingDomain, self.path, - self.server.baseDir, - self.server.httpPrefix, - self.server.domain, - self.server.domainFull, - self.server.port, - self.server.onionDomain, - self.server.i2pDomain, - GETstartTime, GETtimings, - self.server.proxyType, - cookie, self.server.debug): - return - - self._benchmarkGETtimings(GETstartTime, GETtimings, - 'show bookmarks 2 done', - 'show events done') - # outbox timeline if self._showOutboxTimeline(authorized, callingDomain, self.path, @@ -13333,11 +13123,6 @@ class PubServer(BaseHTTPRequestHandler): else: commentsEnabled = True - if not fields.get('privateEvent'): - privateEvent = False - else: - privateEvent = True - if postType == 'newpost': if not fields.get('pinToProfile'): pinToProfile = False @@ -13621,64 +13406,6 @@ class PubServer(BaseHTTPRequestHandler): return 1 else: return -1 - elif postType == 'newevent': - # A Mobilizon-type event is posted - - # if there is no image dscription then make it the same - # as the event title - if not fields.get('imageDescription'): - fields['imageDescription'] = fields['subject'] - # Events are public by default, with opt-in - # followers only status - if not fields.get('followersOnlyEvent'): - fields['followersOnlyEvent'] = False - - if not fields.get('anonymousParticipationEnabled'): - anonymousParticipationEnabled = False - else: - anonymousParticipationEnabled = True - maximumAttendeeCapacity = 999999 - if fields.get('maximumAttendeeCapacity'): - maximumAttendeeCapacity = \ - int(fields['maximumAttendeeCapacity']) - - city = getSpoofedCity(self.server.city, - self.server.baseDir, - nickname, - self.server.domain) - messageJson = \ - createEventPost(self.server.baseDir, - nickname, - self.server.domain, - self.server.port, - self.server.httpPrefix, - mentionsStr + fields['message'], - privateEvent, - False, False, commentsEnabled, - filename, attachmentMediaType, - fields['imageDescription'], - city, - fields['subject'], - fields['schedulePost'], - fields['eventDate'], - fields['eventTime'], - fields['location'], - fields['category'], - fields['joinMode'], - fields['endDate'], - fields['endTime'], - maximumAttendeeCapacity, - fields['repliesModerationOption'], - anonymousParticipationEnabled, - fields['eventStatus'], - fields['ticketUrl']) - if messageJson: - if fields['schedulePost']: - return 1 - if self._postToOutbox(messageJson, __version__, nickname): - return 1 - else: - return -1 elif postType == 'newdm': messageJson = None print('A DM was posted') @@ -14190,7 +13917,6 @@ class PubServer(BaseHTTPRequestHandler): if not self.path.endswith('confirm'): self.path = self.path.replace('/outbox/', '/outbox') self.path = self.path.replace('/tlblogs/', '/tlblogs') - self.path = self.path.replace('/tlevents/', '/tlevents') self.path = self.path.replace('/inbox/', '/inbox') self.path = self.path.replace('/shares/', '/shares') self.path = self.path.replace('/sharedInbox/', '/sharedInbox') @@ -14528,7 +14254,7 @@ class PubServer(BaseHTTPRequestHandler): # receive different types of post created by htmlNewPost postTypes = ("newpost", "newblog", "newunlisted", "newfollowers", "newdm", "newreport", "newshare", "newquestion", - "editblogpost", "newreminder", "newevent") + "editblogpost", "newreminder") for currPostType in postTypes: if not authorized: if self.server.debug: @@ -14538,8 +14264,6 @@ class PubServer(BaseHTTPRequestHandler): postRedirect = self.server.defaultTimeline if currPostType == 'newshare': postRedirect = 'shares' - elif currPostType == 'newevent': - postRedirect = 'tlevents' pageNumber = \ self._receiveNewPost(currPostType, self.path, diff --git a/inbox.py b/inbox.py index cbc5f2da6..d1f6d2450 100644 --- a/inbox.py +++ b/inbox.py @@ -168,7 +168,7 @@ def _inboxStorePostToHtmlCache(recentPostsCache: {}, maxRecentPosts: int, """ pageNumber = -999 avatarUrl = None - if boxname != 'tlevents' and boxname != 'outbox': + if boxname != 'outbox': boxname = 'inbox' individualPostAsHtml(True, recentPostsCache, maxRecentPosts, @@ -2504,9 +2504,6 @@ def _inboxAfterInitial(recentPostsCache: {}, maxRecentPosts: int, if isBlogPost(postJsonObject): # blogs index will be updated updateIndexList.append('tlblogs') - elif isEventPost(postJsonObject): - # events index will be updated - updateIndexList.append('tlevents') # get the avatar for a reply/announce _obtainAvatarForReplyPost(session, baseDir, diff --git a/outbox.py b/outbox.py index 9a23041b5..156de5ace 100644 --- a/outbox.py +++ b/outbox.py @@ -337,8 +337,6 @@ def postMessageToOutbox(session, translate: {}, if messageJson['object'].get('type'): if messageJson['object']['type'] == 'Article': outboxName = 'tlblogs' - elif messageJson['object']['type'] == 'Event': - outboxName = 'tlevents' savedFilename = \ savePostToBox(baseDir, diff --git a/person.py b/person.py index 8fa100572..ce426680f 100644 --- a/person.py +++ b/person.py @@ -28,7 +28,6 @@ from posts import createNewsTimeline from posts import createBlogsTimeline from posts import createFeaturesTimeline from posts import createBookmarksTimeline -from posts import createEventsTimeline from posts import createInbox from posts import createOutbox from posts import createModeration @@ -746,8 +745,7 @@ def personBoxJson(recentPostsCache: {}, boxname != 'tlblogs' and boxname != 'tlnews' and \ boxname != 'tlfeatures' and \ boxname != 'outbox' and boxname != 'moderation' and \ - boxname != 'tlbookmarks' and boxname != 'bookmarks' and \ - boxname != 'tlevents': + boxname != 'tlbookmarks' and boxname != 'bookmarks': return None if not '/' + boxname in path: @@ -796,12 +794,6 @@ def personBoxJson(recentPostsCache: {}, port, httpPrefix, noOfItems, headerOnly, pageNumber) - elif boxname == 'tlevents': - return createEventsTimeline(recentPostsCache, - session, baseDir, nickname, domain, - port, httpPrefix, - noOfItems, headerOnly, - pageNumber) elif boxname == 'tlreplies': return createRepliesTimeline(recentPostsCache, session, baseDir, nickname, domain, diff --git a/posts.py b/posts.py index aa9f26216..0751b9048 100644 --- a/posts.py +++ b/posts.py @@ -14,7 +14,6 @@ import os import shutil import sys import time -import uuid import random from socket import error as SocketError from time import gmtime, strftime @@ -657,8 +656,7 @@ def deleteAllPosts(baseDir: str, """Deletes all posts for a person from inbox or outbox """ if boxname != 'inbox' and boxname != 'outbox' and \ - boxname != 'tlblogs' and boxname != 'tlnews' and \ - boxname != 'tlevents': + boxname != 'tlblogs' and boxname != 'tlnews': return boxDir = createPersonDir(nickname, domain, baseDir, boxname) for deleteFilename in os.scandir(boxDir): @@ -681,7 +679,6 @@ def savePostToBox(baseDir: str, httpPrefix: str, postId: str, """ if boxname != 'inbox' and boxname != 'outbox' and \ boxname != 'tlblogs' and boxname != 'tlnews' and \ - boxname != 'tlevents' and \ boxname != 'scheduled': return None originalDomain = domain @@ -1244,9 +1241,6 @@ def _createPostBase(baseDir: str, nickname: str, domain: str, port: int, if isArticle: savePostToBox(baseDir, httpPrefix, newPostId, nickname, domain, newPost, 'tlblogs') - elif eventUUID: - savePostToBox(baseDir, httpPrefix, newPostId, - nickname, domain, newPost, 'tlevents') else: savePostToBox(baseDir, httpPrefix, newPostId, nickname, domain, newPost, 'outbox') @@ -1653,57 +1647,6 @@ def createFollowersOnlyPost(baseDir: str, None, None, None, None, None) -def createEventPost(baseDir: str, - nickname: str, domain: str, port: int, - httpPrefix: str, - content: str, followersOnly: bool, - saveToFile: bool, - clientToServer: bool, commentsEnabled: bool, - attachImageFilename: str, mediaType: str, - imageDescription: str, city: str, - subject: str = None, schedulePost: str = False, - eventDate: str = None, eventTime: str = None, - location: str = None, category: str = None, - joinMode: str = None, - endDate: str = None, endTime: str = None, - maximumAttendeeCapacity: int = None, - repliesModerationOption: str = None, - anonymousParticipationEnabled: bool = None, - eventStatus: str = None, ticketUrl: str = None) -> {}: - """Mobilizon-type Event post - """ - if not attachImageFilename: - print('Event has no attached image') - return None - if not category: - print('Event has no category') - return None - domainFull = getFullDomain(domain, port) - - # create event uuid - eventUUID = str(uuid.uuid1()) - - toStr1 = 'https://www.w3.org/ns/activitystreams#Public' - toStr2 = httpPrefix + '://' + domainFull + '/users/' + \ - nickname + '/followers', - if followersOnly: - toStr1 = toStr2 - toStr2 = None - return _createPostBase(baseDir, nickname, domain, port, - toStr1, toStr2, - httpPrefix, content, followersOnly, saveToFile, - clientToServer, commentsEnabled, - attachImageFilename, mediaType, - imageDescription, city, - False, False, None, None, subject, - schedulePost, eventDate, eventTime, location, - eventUUID, category, joinMode, - endDate, endTime, maximumAttendeeCapacity, - repliesModerationOption, - anonymousParticipationEnabled, - eventStatus, ticketUrl) - - def getMentionedPeople(baseDir: str, httpPrefix: str, content: str, domain: str, debug: bool) -> []: """Extracts a list of mentioned actors from the given message content @@ -2835,16 +2778,6 @@ def createBookmarksTimeline(session, baseDir: str, nickname: str, domain: str, True, 0, False, 0, pageNumber) -def createEventsTimeline(recentPostsCache: {}, - session, baseDir: str, nickname: str, domain: str, - port: int, httpPrefix: str, itemsPerPage: int, - headerOnly: bool, pageNumber: int = None) -> {}: - return _createBoxIndexed(recentPostsCache, session, baseDir, 'tlevents', - nickname, domain, - port, httpPrefix, itemsPerPage, headerOnly, - True, 0, False, 0, pageNumber) - - def createDMTimeline(recentPostsCache: {}, session, baseDir: str, nickname: str, domain: str, port: int, httpPrefix: str, itemsPerPage: int, @@ -3179,8 +3112,7 @@ def _createBoxIndexed(recentPostsCache: {}, boxname != 'tlblogs' and boxname != 'tlnews' and \ boxname != 'tlfeatures' and \ boxname != 'outbox' and boxname != 'tlbookmarks' and \ - boxname != 'bookmarks' and \ - boxname != 'tlevents': + boxname != 'bookmarks': return None # bookmarks and events timelines are like the inbox diff --git a/utils.py b/utils.py index 0ac6b14d0..70b036cac 100644 --- a/utils.py +++ b/utils.py @@ -1139,7 +1139,7 @@ def locatePost(baseDir: str, nickname: str, domain: str, postUrl = postUrl + '.' + extension # search boxes - boxes = ('inbox', 'outbox', 'tlblogs', 'tlevents') + boxes = ('inbox', 'outbox', 'tlblogs') accountDir = baseDir + '/accounts/' + nickname + '@' + domain + '/' for boxName in boxes: postFilename = accountDir + boxName + '/' + postUrl @@ -1401,7 +1401,7 @@ def _isReservedName(nickname: str) -> bool: 'public', 'followers', 'category', 'channel', 'calendar', 'tlreplies', 'tlmedia', 'tlblogs', - 'tlevents', 'tlblogs', 'tlfeatures', + 'tlblogs', 'tlfeatures', 'moderation', 'moderationaction', 'activity', 'undo', 'pinned', 'reply', 'replies', 'question', 'like', diff --git a/webapp_timeline.py b/webapp_timeline.py index b7cda0e3d..2ba8e6881 100644 --- a/webapp_timeline.py +++ b/webapp_timeline.py @@ -129,20 +129,6 @@ def _htmlTimelineNewPost(manuallyApproveFollowers: bool, '' + \ '' - elif boxName == 'tlevents': - if not iconsAsButtons: - newPostButtonStr += \ - '| ' + \
-                translate['Create a new event'] + \
-                '\n' - else: - newPostButtonStr += \ - '' + \ - '' elif boxName == 'tlshares': if not iconsAsButtons: newPostButtonStr += \ @@ -500,8 +486,6 @@ def htmlTimeline(cssCache: {}, defaultTimeline: str, sharesButton = 'buttonselectedhighlighted' elif boxName == 'tlbookmarks' or boxName == 'bookmarks': bookmarksButton = 'buttonselected' -# elif boxName == 'tlevents': -# eventsButton = 'buttonselected' # get the full domain, including any port number fullDomain = getFullDomain(domain, port) @@ -559,11 +543,6 @@ def htmlTimeline(cssCache: {}, defaultTimeline: str, '' -# -# eventsButtonStr = \ -# '' instanceTitle = \ getConfigParam(baseDir, 'instanceTitle') @@ -1054,51 +1033,6 @@ def htmlBookmarks(cssCache: {}, defaultTimeline: str, accessKeys) -def htmlEvents(cssCache: {}, defaultTimeline: str, - recentPostsCache: {}, maxRecentPosts: int, - translate: {}, pageNumber: int, itemsPerPage: int, - session, baseDir: str, - cachedWebfingers: {}, personCache: {}, - nickname: str, domain: str, port: int, bookmarksJson: {}, - allowDeletion: bool, - httpPrefix: str, projectVersion: str, - minimal: bool, YTReplacementDomain: str, - showPublishedDateOnly: bool, - newswire: {}, positiveVoting: bool, - showPublishAsIcon: bool, - fullWidthTimelineButtonHeader: bool, - iconsAsButtons: bool, - rssIconAtTop: bool, - publishButtonAtTop: bool, - authorized: bool, theme: str, - peertubeInstances: [], - allowLocalNetworkAccess: bool, - textModeBanner: str, - accessKeys: {}) -> str: - """Show the events as html - """ - manuallyApproveFollowers = \ - followerApprovalActive(baseDir, nickname, domain) - - return htmlTimeline(cssCache, defaultTimeline, - recentPostsCache, maxRecentPosts, - translate, pageNumber, - itemsPerPage, session, baseDir, - cachedWebfingers, personCache, - nickname, domain, port, bookmarksJson, - 'tlevents', allowDeletion, - httpPrefix, projectVersion, manuallyApproveFollowers, - minimal, YTReplacementDomain, - showPublishedDateOnly, - newswire, False, False, - positiveVoting, showPublishAsIcon, - fullWidthTimelineButtonHeader, - iconsAsButtons, rssIconAtTop, publishButtonAtTop, - authorized, None, theme, peertubeInstances, - allowLocalNetworkAccess, textModeBanner, - accessKeys) - - def htmlInboxDMs(cssCache: {}, defaultTimeline: str, recentPostsCache: {}, maxRecentPosts: int, translate: {}, pageNumber: int, itemsPerPage: int, From ba126be369c79ef002ae70bc21e11820e5930d43 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 2 Jul 2021 21:57:21 +0100 Subject: [PATCH 1329/1416] Block user agents from edit profile screen --- daemon.py | 48 +++++++++++++++++++++++++++++--------------- translations/ar.json | 3 ++- translations/ca.json | 3 ++- translations/cy.json | 3 ++- translations/de.json | 3 ++- translations/en.json | 3 ++- translations/es.json | 3 ++- translations/fr.json | 3 ++- translations/ga.json | 3 ++- translations/hi.json | 3 ++- translations/it.json | 3 ++- translations/ja.json | 3 ++- translations/ku.json | 3 ++- translations/oc.json | 3 ++- translations/pt.json | 3 ++- translations/ru.json | 3 ++- translations/sw.json | 3 ++- translations/zh.json | 3 ++- webapp_profile.py | 17 ++++++++++++++-- 19 files changed, 81 insertions(+), 35 deletions(-) diff --git a/daemon.py b/daemon.py index b9ea77887..4e7af109d 100644 --- a/daemon.py +++ b/daemon.py @@ -5084,8 +5084,7 @@ class PubServer(BaseHTTPRequestHandler): actorChanged = True # grayscale theme - if path.startswith('/users/' + - adminNickname + '/') or \ + if path.startswith('/users/' + adminNickname + '/') or \ isArtist(baseDir, nickname): grayscale = False if fields.get('grayscale'): @@ -5181,15 +5180,30 @@ class PubServer(BaseHTTPRequestHandler): if os.path.isfile(allowedInstancesFilename): os.remove(allowedInstancesFilename) - # save peertube instances list - peertubeInstancesFile = \ - baseDir + '/accounts/peertube.txt' - if fields.get('ptInstances'): - adminNickname = \ - getConfigParam(baseDir, 'admin') - if adminNickname and \ - path.startswith('/users/' + - adminNickname + '/'): + # save blocked user agents + # This is admin lebel and global to the instance + if path.startswith('/users/' + adminNickname + '/'): + userAgentsBlocked = '' + if fields.get('userAgentsBlockedStr'): + userAgentsBlockedStr = \ + fields['userAgentsBlockedStr'] + userAgentsBlockedList = \ + userAgentsBlockedStr.split('\n') + for ua in userAgentsBlockedList: + if userAgentsBlocked: + userAgentsBlocked += ',' + userAgentsBlocked += ua.strip() + else: + userAgentsBlocked = '' + if self.server.userAgentsBlocked != userAgentsBlocked: + self.server.userAgentsBlocked = userAgentsBlocked + setConfigParam(baseDir, 'userAgentsBlocked', + userAgentsBlocked) + + # save peertube instances list + peertubeInstancesFile = \ + baseDir + '/accounts/peertube.txt' + if fields.get('ptInstances'): self.server.peertubeInstances.clear() with open(peertubeInstancesFile, 'w+') as aFile: aFile.write(fields['ptInstances']) @@ -5203,10 +5217,10 @@ class PubServer(BaseHTTPRequestHandler): if url in self.server.peertubeInstances: continue self.server.peertubeInstances.append(url) - else: - if os.path.isfile(peertubeInstancesFile): - os.remove(peertubeInstancesFile) - self.server.peertubeInstances.clear() + else: + if os.path.isfile(peertubeInstancesFile): + os.remove(peertubeInstancesFile) + self.server.peertubeInstances.clear() # save git project names list gitProjectsFilename = \ @@ -10328,7 +10342,9 @@ class PubServer(BaseHTTPRequestHandler): self.server.themeName, peertubeInstances, self.server.textModeBanner, - city, accessKeys).encode('utf-8') + city, + self.server.userAgentsBlocked, + accessKeys).encode('utf-8') if msg: msglen = len(msg) self._set_headers('text/html', msglen, diff --git a/translations/ar.json b/translations/ar.json index 9cae33396..270d3b503 100644 --- a/translations/ar.json +++ b/translations/ar.json @@ -448,5 +448,6 @@ "Graphic Design": "التصميم الجرافيكي", "Import Theme": "استيراد الموضوع", "Export Theme": "موضوع التصدير", - "Custom post submit button text": "عرف نشر إرسال نص زر" + "Custom post submit button text": "عرف نشر إرسال نص زر", + "Blocked User Agents": "عوامل المستخدم المحظورة" } diff --git a/translations/ca.json b/translations/ca.json index 9b7ec31d3..b445702f3 100644 --- a/translations/ca.json +++ b/translations/ca.json @@ -448,5 +448,6 @@ "Graphic Design": "Disseny gràfic", "Import Theme": "Importació temàtica", "Export Theme": "Tema d'exportació", - "Custom post submit button text": "Text de botó d'enviament de publicacions personalitzades" + "Custom post submit button text": "Text de botó d'enviament de publicacions personalitzades", + "Blocked User Agents": "Agents d'usuari bloquejats" } diff --git a/translations/cy.json b/translations/cy.json index dd289760d..680fa4c72 100644 --- a/translations/cy.json +++ b/translations/cy.json @@ -448,5 +448,6 @@ "Graphic Design": "Dylunio Graffig", "Import Theme": "Thema Mewnforio", "Export Theme": "Thema Allforio", - "Custom post submit button text": "Testun Post Post Post" + "Custom post submit button text": "Testun Post Post Post", + "Blocked User Agents": "Asiantau defnyddwyr wedi'u blocio" } diff --git a/translations/de.json b/translations/de.json index fd4ad86bb..2ec7c24b6 100644 --- a/translations/de.json +++ b/translations/de.json @@ -448,5 +448,6 @@ "Graphic Design": "Grafikdesign", "Import Theme": "Theme importieren", "Export Theme": "Theme exportieren", - "Custom post submit button text": "Benutzerdefinierte Post-Senden Schaltfläche Text" + "Custom post submit button text": "Benutzerdefinierte Post-Senden Schaltfläche Text", + "Blocked User Agents": "Blockierte Benutzeragenten" } diff --git a/translations/en.json b/translations/en.json index a076ae7b5..25dd4a83a 100644 --- a/translations/en.json +++ b/translations/en.json @@ -448,5 +448,6 @@ "Graphic Design": "Graphic Design", "Import Theme": "Import Theme", "Export Theme": "Export Theme", - "Custom post submit button text": "Custom post submit button text" + "Custom post submit button text": "Custom post submit button text", + "Blocked User Agents": "Blocked User Agents" } diff --git a/translations/es.json b/translations/es.json index fa727def8..1502da0e3 100644 --- a/translations/es.json +++ b/translations/es.json @@ -448,5 +448,6 @@ "Graphic Design": "Diseño gráfico", "Import Theme": "Tema de importación", "Export Theme": "Tema de exportación", - "Custom post submit button text": "POST POST PERSONALIZADO Botón Texto" + "Custom post submit button text": "POST POST PERSONALIZADO Botón Texto", + "Blocked User Agents": "Agentes de usuario bloqueados" } diff --git a/translations/fr.json b/translations/fr.json index 898a108db..57d4d369a 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -448,5 +448,6 @@ "Graphic Design": "Conception graphique", "Import Theme": "Import thème", "Export Theme": "Thème d'exportation", - "Custom post submit button text": "Texte de bouton d'envoi postal personnalisé" + "Custom post submit button text": "Texte de bouton d'envoi postal personnalisé", + "Blocked User Agents": "Agents d'utilisateur bloqués" } diff --git a/translations/ga.json b/translations/ga.json index 4b5cabc0b..ea04687fe 100644 --- a/translations/ga.json +++ b/translations/ga.json @@ -448,5 +448,6 @@ "Graphic Design": "Dearadh grafach", "Import Theme": "Téama Iompórtáil", "Export Theme": "Téama Easpórtála", - "Custom post submit button text": "Post saincheaptha Cuir isteach an cnaipe Téacs" + "Custom post submit button text": "Post saincheaptha Cuir isteach an cnaipe Téacs", + "Blocked User Agents": "Gníomhairí úsáideora blocáilte" } diff --git a/translations/hi.json b/translations/hi.json index b02de9fec..00ea6df4d 100644 --- a/translations/hi.json +++ b/translations/hi.json @@ -448,5 +448,6 @@ "Graphic Design": "ग्राफ़िक डिज़ाइन", "Import Theme": "आयात विषय", "Export Theme": "निर्यात विषय", - "Custom post submit button text": "कस्टम पोस्ट सबमिट बटन टेक्स्ट" + "Custom post submit button text": "कस्टम पोस्ट सबमिट बटन टेक्स्ट", + "Blocked User Agents": "अवरुद्ध उपयोगकर्ता एजेंट" } diff --git a/translations/it.json b/translations/it.json index 00271b324..12994e2ea 100644 --- a/translations/it.json +++ b/translations/it.json @@ -448,5 +448,6 @@ "Graphic Design": "Graphic design", "Import Theme": "Tema dell'importazione", "Export Theme": "Esportare tema", - "Custom post submit button text": "Pulsante di invio del post personalizzato" + "Custom post submit button text": "Pulsante di invio del post personalizzato", + "Blocked User Agents": "Agenti utente bloccati" } diff --git a/translations/ja.json b/translations/ja.json index 211b11d31..fdb96a967 100644 --- a/translations/ja.json +++ b/translations/ja.json @@ -448,5 +448,6 @@ "Graphic Design": "グラフィックデザイン", "Import Theme": "輸入テーマ", "Export Theme": "テーマをエクスポートします", - "Custom post submit button text": "カスタムポスト送信ボタンテキスト" + "Custom post submit button text": "カスタムポスト送信ボタンテキスト", + "Blocked User Agents": "ブロックされたユーザーエージェント" } diff --git a/translations/ku.json b/translations/ku.json index fe44eabcc..cf71e2f19 100644 --- a/translations/ku.json +++ b/translations/ku.json @@ -448,5 +448,6 @@ "Graphic Design": "Sêwirana grafîkî", "Import Theme": "Mijara Import", "Export Theme": "Mijara Export", - "Custom post submit button text": "Nivîsa bişkojka paşîn a paşîn" + "Custom post submit button text": "Nivîsa bişkojka paşîn a paşîn", + "Blocked User Agents": "Karmendên bikarhêner asteng kirin" } diff --git a/translations/oc.json b/translations/oc.json index 771d1d201..7c2df85d6 100644 --- a/translations/oc.json +++ b/translations/oc.json @@ -444,5 +444,6 @@ "Graphic Design": "Graphic Design", "Import Theme": "Import Theme", "Export Theme": "Export Theme", - "Custom post submit button text": "Custom post submit button text" + "Custom post submit button text": "Custom post submit button text", + "Blocked User Agents": "Blocked User Agents" } diff --git a/translations/pt.json b/translations/pt.json index 3014a750d..d7d303d1f 100644 --- a/translations/pt.json +++ b/translations/pt.json @@ -448,5 +448,6 @@ "Graphic Design": "Design gráfico", "Import Theme": "Importar tema", "Export Theme": "Exportar tema", - "Custom post submit button text": "Texto de botão de envio de post personalizado" + "Custom post submit button text": "Texto de botão de envio de post personalizado", + "Blocked User Agents": "Agentes de usuário bloqueados" } diff --git a/translations/ru.json b/translations/ru.json index 08d7e65ed..cfee8a392 100644 --- a/translations/ru.json +++ b/translations/ru.json @@ -448,5 +448,6 @@ "Graphic Design": "Графический дизайн", "Import Theme": "Импортировать тему", "Export Theme": "Экспортная тема", - "Custom post submit button text": "Пользовательский пост Отправить кнопку текста" + "Custom post submit button text": "Пользовательский пост Отправить кнопку текста", + "Blocked User Agents": "Заблокированные пользовательские агенты" } diff --git a/translations/sw.json b/translations/sw.json index dc97f9b15..0ac58b643 100644 --- a/translations/sw.json +++ b/translations/sw.json @@ -448,5 +448,6 @@ "Graphic Design": "Graphic design", "Import Theme": "Ingiza mandhari", "Export Theme": "Tuma mandhari", - "Custom post submit button text": "Ujumbe wa Desturi Wasilisha Nakala ya kifungo" + "Custom post submit button text": "Ujumbe wa Desturi Wasilisha Nakala ya kifungo", + "Blocked User Agents": "Wakala wa watumiaji waliozuiwa" } diff --git a/translations/zh.json b/translations/zh.json index 4098fe972..07b9e10c1 100644 --- a/translations/zh.json +++ b/translations/zh.json @@ -448,5 +448,6 @@ "Graphic Design": "平面设计", "Import Theme": "进口主题", "Export Theme": "出口主题", - "Custom post submit button text": "自定义发布提交按钮文本" + "Custom post submit button text": "自定义发布提交按钮文本", + "Blocked User Agents": "阻止用户代理商" } diff --git a/webapp_profile.py b/webapp_profile.py index 3ffcfdca9..acf5a0a86 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -1414,7 +1414,7 @@ def _htmlEditProfileGitProjects(baseDir: str, nickname: str, domain: str, def _htmlEditProfileFiltering(baseDir: str, nickname: str, domain: str, - translate: {}) -> str: + userAgentsBlocked: str, translate: {}) -> str: """Filtering and blocking section of edit profile screen """ filterStr = '' @@ -1581,6 +1581,17 @@ def _htmlEditProfileFiltering(baseDir: str, nickname: str, domain: str, 'style="height:200px" spellcheck="false">' + \ allowedInstancesStr + '\n' + userAgentsBlockedStr = '' + if userAgentsBlocked: + userAgentsBlockedStr = userAgentsBlocked.replace(',', '\n') + editProfileForm += \ + '
\n' + editProfileForm += \ + ' \n' + editProfileForm += '

\n' return editProfileForm @@ -1880,6 +1891,7 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, defaultTimeline: str, theme: str, peertubeInstances: [], textModeBanner: str, city: str, + userAgentsBlocked: str, accessKeys: {}) -> str: """Shows the edit profile screen """ @@ -2056,7 +2068,8 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, # Filtering and blocking section editProfileForm += \ - _htmlEditProfileFiltering(baseDir, nickname, domain, translate) + _htmlEditProfileFiltering(baseDir, nickname, domain, + userAgentsBlocked, translate) # git projects section editProfileForm += \ From cc6ce5ee2b86397ca523ac787181546782654228 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 2 Jul 2021 22:14:20 +0100 Subject: [PATCH 1330/1416] Blocked user agents list --- daemon.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/daemon.py b/daemon.py index 4e7af109d..aa4b55576 100644 --- a/daemon.py +++ b/daemon.py @@ -5183,22 +5183,26 @@ class PubServer(BaseHTTPRequestHandler): # save blocked user agents # This is admin lebel and global to the instance if path.startswith('/users/' + adminNickname + '/'): - userAgentsBlocked = '' + userAgentsBlocked = [] if fields.get('userAgentsBlockedStr'): userAgentsBlockedStr = \ fields['userAgentsBlockedStr'] userAgentsBlockedList = \ userAgentsBlockedStr.split('\n') for ua in userAgentsBlockedList: - if userAgentsBlocked: - userAgentsBlocked += ',' - userAgentsBlocked += ua.strip() - else: - userAgentsBlocked = '' - if self.server.userAgentsBlocked != userAgentsBlocked: + if ua in userAgentsBlocked: + continue + userAgentsBlocked.append(ua.strip()) + if str(self.server.userAgentsBlocked) != \ + str(userAgentsBlocked): self.server.userAgentsBlocked = userAgentsBlocked + userAgentsBlockedStr = '' + for ua in userAgentsBlocked: + if userAgentsBlockedStr: + userAgentsBlockedStr += ',' + userAgentsBlockedStr += ua setConfigParam(baseDir, 'userAgentsBlocked', - userAgentsBlocked) + userAgentsBlockedStr) # save peertube instances list peertubeInstancesFile = \ From ffeaf52cc137ddaa8e1e490d9fa26c21cef1f3d0 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 2 Jul 2021 22:18:54 +0100 Subject: [PATCH 1331/1416] Showing blocked user agents --- webapp_profile.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/webapp_profile.py b/webapp_profile.py index acf5a0a86..eced71548 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -1582,8 +1582,10 @@ def _htmlEditProfileFiltering(baseDir: str, nickname: str, domain: str, allowedInstancesStr + '\n' userAgentsBlockedStr = '' - if userAgentsBlocked: - userAgentsBlockedStr = userAgentsBlocked.replace(',', '\n') + for ua in userAgentsBlocked: + if userAgentsBlockedStr: + userAgentsBlockedStr += '\n' + userAgentsBlockedStr += ua editProfileForm += \ '
\n' From dd6cc93afee0c75877a50ed193baf5a1445c00f3 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 2 Jul 2021 23:09:59 +0100 Subject: [PATCH 1332/1416] Icon tweaks --- theme/debian/icons/calendar.png | Bin 2404 -> 6526 bytes theme/debian/icons/calendar_notify.png | Bin 5286 -> 6984 bytes theme/debian/icons/newswire.png | Bin 6594 -> 7918 bytes theme/debian/icons/scope_event.png | Bin 2404 -> 6524 bytes theme/default/icons/calendar.png | Bin 2404 -> 6524 bytes theme/default/icons/calendar_notify.png | Bin 2733 -> 6760 bytes theme/default/icons/newswire.png | Bin 6593 -> 7918 bytes theme/default/icons/scope_event.png | Bin 2404 -> 6524 bytes theme/henge/icons/calendar.png | Bin 1364 -> 6365 bytes theme/henge/icons/calendar_notify.png | Bin 2733 -> 6759 bytes theme/henge/icons/scope_event.png | Bin 1364 -> 6364 bytes theme/light/icons/calendar.png | Bin 1355 -> 6194 bytes theme/light/icons/calendar_notify.png | Bin 1364 -> 6464 bytes theme/light/icons/newswire.png | Bin 1497 -> 5848 bytes theme/purple/icons/calendar.png | Bin 2446 -> 6558 bytes theme/purple/icons/calendar_notify.png | Bin 2584 -> 6754 bytes theme/purple/icons/newswire.png | Bin 6061 -> 5858 bytes theme/purple/icons/scope_event.png | Bin 2446 -> 6552 bytes theme/rc3/icons/calendar.png | Bin 1353 -> 6669 bytes theme/rc3/icons/calendar_notify.png | Bin 1347 -> 6469 bytes theme/rc3/icons/scope_event.png | Bin 1351 -> 6645 bytes theme/starlight/icons/calendar.png | Bin 1362 -> 6638 bytes theme/starlight/icons/calendar_notify.png | Bin 1341 -> 6294 bytes theme/starlight/icons/scope_event.png | Bin 1362 -> 6639 bytes theme/zen/icons/calendar.png | Bin 1361 -> 6338 bytes theme/zen/icons/calendar_notify.png | Bin 1365 -> 6881 bytes theme/zen/icons/scope_event.png | Bin 1362 -> 6338 bytes 27 files changed, 0 insertions(+), 0 deletions(-) diff --git a/theme/debian/icons/calendar.png b/theme/debian/icons/calendar.png index 6d5789c3a5141a9e10c43bf1ce8058bbd6dddcbc..609425aa8f5f6f7da3b75e53095dd4ddf12e0ed8 100644 GIT binary patch literal 6526 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 eGtm^*i=ya49z(Uf~@?6ya`*+Yk z_%TZ)Cn5Ue{f3`QF4>HmxUFBBXS2C^o5J z`*DiQBrJyed@zj3G))Ydag><~c46c>QJk3CqehZrn`5XbX1 zk0anua3AK8aKtTd6_B^BV#9*_WGqk_WSnUxn_>FAR#Ty(v)u+MX-){6C3hf$jV zgs|rTY=07GfaRPZeu9gLp)4#;M7#tPHc65_d*{V_AG{X195}cj!G{oHNFhg#E=u$< z#28b|$tFe(l;l%LF{PBVrHqX-WM!<+7%8@JaYc$Rp~R9(t_Yv%s#IS?jWyNWY~zM9 z(R>Rnw$ySr)KMwA>(YG>J@(Y|K&%ZOZpiQ>jDI-N$QRUhRG*G-pk{W|>_ke}g$rsJ zr4SAgM$3sPWW!-w zY=6YeK*SUu#wd)4FH%9!5Jufw9>do`y1@I~n=d)1feu!)lqklDX5*Hp(Cy1BJq)l3 z)uCCUGq;A_$H)?rLF9McGWk#nr;5xOE)U-F@Cmt5DnZ$ywF>KsPtyR~JQ8}#tybjr za2(6rrli_ldVyZKMMMBs{$UDATd~7 zh?`d$BR4>_E@qA~ZPb`jY$N79oKqP}EKFW#thmrLbef5zP&?0H`5?aOsek^MnULlt zA8*s~%i<3{1UXQ#LeJjR1GOEQy8M!2)Nh{^ENLRyk*;II_iggjLoD(xU#Ez}9u;wG z5w@5HL8EEYCmDP6ox9gBZ+kil@>yxivm%4h_8v?)uZ+jr^sANeK!QGLHqS_C7~Wx# zD8`kttda2uMOS0?P@JzL7=IZn?E=B`ED>RuCR<&>xE96+(=C#O!J#$BWF_b-s&jE& zJx-Tix1i@eibL7hy7(2~dxGM7V&H>9?P?$z=xJqUr)wov&yC{94a_{*Qt$~8*rR){ z^jxBIM3w3;EWh}vcU-yFvw_&OV4-3(H$hy$+IJ;B^vbMHvv7jm z@Tkg}v=}$`oedP=UQlW90n!PjMry+ci3ZOLwV^dHTQPIB6_%oEW~Zzx(IYgEDvuqU zw2+#1LZ>D41{<1wksmMsH*+%{sYyR&G>^@czSB+Lu$oG*xY*Sui2NXT>73O(zntF` zI^{J~KjSrD)=7G(bbmi)HuUvZ2OKQwPiTy<0P)NTE`My7bl)%EwadKPr9E$#bl)#O zYL|N^YAM_)3qz55?OGPRUEh6HOp$dWpQ4vS2LJ=y2TA@`3lS{v#Nkfw2;wZQl z9Q;_UI=DFN>fkB}f*&AGj!ud$QsV!TLW@`rj{EWM-sA2aAk@oDv%1CsO}EWdA}(gK zt77mK0rVpb5u-A*j5$e4qT~3whmWs!F`m`=+@GUY%~=faiNv#i%rI@@4dUrd+u*!U z9AQOSB|aw}GwFiFk6c$ge&bwlS>TxwGo6|zju4B5Hdfl06-|wJia4rjI^_!)k5$fF zoV9Y5HSft^7|Q7@%Uq{9gaj6`1c^FQP(=x4*oe`plVTx7`|%F`LDw&lOCeVYj2sK7 zK!fc1!T;cQw^n|Ca>7dr#eu+!<9rMQ!CjzHbDZyE$7!4Z{%7DyZ}}^AVCIwbT1$%_ z0e#!R#dS+l_JGSBVBpD+P1%+FG=+Q~ct4|W$^zkApl8kNt+|iW2Ov#dC2xR(Ltvyp z+3OwN-QC{Xzh|2L{Q#44a v2ZpF8K!(GHu(hN+j2}I2nbBi^6d(WqEkw!vY}CgV00000NkvXXu0mjf+el{^ diff --git a/theme/debian/icons/calendar_notify.png b/theme/debian/icons/calendar_notify.png index 635f715b0e9a19d4f0620c21264e4304bc10c7e9..477fd0d2b3e788c51ae6f8d8ac7ccceb96a020d6 100644 GIT binary patch delta 2953 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 diff --git a/theme/debian/icons/newswire.png b/theme/debian/icons/newswire.png index f3521130d6ffdd6d29d9ea95d0b8c2952ac99f89..8837c95ac13a4915a8f4f983b4af387b549bf474 100644 GIT binary patch delta 3906 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 Q1^@s607*qoM6N<$f>kX;OaK4? delta 2419 zcmV-(35@pcJ;F1P7=H)@0001;w}I>c00fA7R9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3 z004N}?N?c{EGY>6cNM(^0dZK4LmKgR(97?GIn;2g?hyU@qa$8gnVN_Q9KbBM{rzjY zzi=^$cR^E*B}R`clu)>0ko|tu^&}tGb6w$>!utc=T@wtFpnsSBHOGVhq|+r}?3?hIyXE4$ouywpKhXX3>Dip~o^xb3=eAo{LxfA?Vbp2L8iBFF<+7GV zw1itRPOBBP>=3;j=nUU|L+ez?B7Rb!L6s(LtMAmIV&IJvdgjiuXju{$?uHrxBQ%6c7OhcYh#F%|(TZP9l0woHQ%X6NRI}ueHOHKCcDdwQxCn})mRM5B zrIcE+X@%s9)fEi2Hg3{F(-vE5xs_Hs!l#F>J@(YI>!sJhLk8-^h$D?W%BUM{2&FA- zy2UMRc`I9;2(>9QOr3G2nP-{xLXF%G>xcGz)PLwijTchJm@d??G^JAnSvgU|42W?c zAf5~XD`1A1&lCbXgU&GXg^?A?&{7SYL53I*3>&ddy0E(;_kf!V;a}m#Cvwi9`yI$R zgYFG-A8~tu+OX56dvOaPOG9(27o=a$mGNsW^uTLur`uP(`!3@jLI0&7pSwy+si_^O zxqqt1aWF$}2*=W+jG8?Qf-O##Ib5BCE8%cKjwvdjl&T$T885XrMBZSv?+Ltr*1NA5 zUiH;)>$8cvu6I+xode@q(|ru2Lx_A>W8YkuZf0>P8Ge5q@F(yAuLONNN2CGLkEK!J%KZ-Ewd=V)M=Tr5!Ez~SoMrdXvL=+r z&1=|V`2nEr98j-`N{wT=FzgZZY?Wo7eJnD3uZhCN&V_eI%eD8)9;^&b=}F=I*t`Q25+YU!{l|qGbio^4*?)<)i=H+i)?xZ(?>B zmzz^~mA>u=>3Zn6wVUj?=R+F99nx0@zbik+kHAG5BXf9;@j@l%f2`666*VF?-SWqV zzi24V4D*+Iq@|flSNNy1ZkK?P$R^u1BXo?b2&~E?=0|7$KFy7P4#@wXAbfe@AGP}j z&+yxAT^zr=llTiDe_N%tR2=Le;*g;_Srip<)G8FALZ}s5buhW~3z{?}DK3tJYr(;f z#j1mgv#t)Vf*|+-;^gS0=prTlFDbN$@!+^0@9sVB-U0qbg{fxOIG}2lkxnLrY;IKu zz9NhWLKs6xVx~SPiYa)GuY36TdKc$e-sk=ty-MC>fKMQve`UI15pNJrZ(2I%ec~u9 zNeb~f@u)!;B!1+&?D8AuqQick88tHLdEzLsQ0!p2gIUQ?iKmETimFk*KkKr>d5g1J zsj=2Q`3oa?ZDpD3G>4GHB9S6bU&Z2&W$q}SV8>G?f?T%x@1U>6rkxZ6oB_L`lcMve+z`y+}>LIIDG&z)K%&RI5-4Gij=+X z@$R0^-u^w)>hA|bv~rYEz+2S-01+!`R9JLaO-wptvy~090wgzOVliPkF*Ge?HDWg{ zG-P69EnzfaF)c7NH!)^3W-v7}WH*y*5FaBpGiGKoHZ(RZG&N>sEi__fH!V0gHD)bi zWi>HoFlA;pF*uX05GW*OW-&H5Ib<;{F=b{qEi^S{FfBMUG-E9@W;bDBHDhHqFg7@o z`4B=5FfuebHZU_eHaIpmF*LJD5eNb#Fg9XjVqr5eEjT$fFfBA>IW#RfFk)pbWH2-^ zGG${jGh#9`lXVlUBxN`-WH&NnG%aN|GBhnTI50LXIAUTsEi*STFf?R1VKF&jG?R4` ztRyioVlp^nHf1d}H#IgbG&wM0EjTkYFfC*?He_aGG&VG4G&ZwE6s8G(cvKIF00012 zP)t-s0001BX@p^EgkWlfVQPe7YK3BIgkoxiVrztAYlUNLgkx)kV{CM2MG3@S#tfmx4_~a&iG7Dk>_T0)XSXw*dmw5%rVP)cxb}tLy^RSD8B6 zV=?*SjA5ZZ-D+@N$O7U3E@a<1bDj*oK9L@m#?pXH3r@ia2XXIw=P77^;93yB4ZBG` zVE8Yu-$p-MpgwsRMi2lyMJV&xBt)%ckx>prVkzs2tI5T1b%dE%%*{MGiqP?Y3Vi}w zztJzmpRmjs=v@Na*nw(tqE9*9H*k&a```E20h2Er55^N=%-fRE{ZjaWMLi^GiJTdA z2U0Vh029W8T+wxgS9e25{zTdufSk)A&GRjeb>6^E zw`e#YxYrVT?)|6$`_0enw}OV03&M>SeCWliLL*>_z7TKLVf7I%Vz;cww)lziDIo%H l2cJoUg}K+KW<|v_@CUc<2Hj*jYbF2y002ovPDHLkV1k65O7Z{z diff --git a/theme/debian/icons/scope_event.png b/theme/debian/icons/scope_event.png index 6d5789c3a5141a9e10c43bf1ce8058bbd6dddcbc..2759541d576235e05c7e0de3ef6b48d011f46acc 100644 GIT binary patch literal 6524 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 XEkw!vY}CgV00000NkvXXu0mjfFivo| diff --git a/theme/default/icons/calendar.png b/theme/default/icons/calendar.png index 3afe1353a1a80da53565e6baef268f470f0f815b..0562fbbf08cb6dfc9be968cf33642d7610537263 100644 GIT binary patch literal 6524 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 aPB7SMKm^q3zFq?n!I+-@^aA&#YyJnR#{5zM delta 2329 zcmV+!3Fh|vGUO7F7=Ho-0002j2boO(00#DYR9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3 z004N}?O0iotm^*i=yIeNz(RUYn~VB?{|@>G zf6NleNr*mqzv0g%mu$vO+}2;3XS2C^o_}ti!t>oYT_!As7=Kq@k0I~tGsflm!m)=b z_u~}z85?&&`@|uTb!Us4cB>@D?HV_`CY1WR@hOH|Rf}EMdZ-+)zj3G))$cqjbO-WrM~~=V?jFFmc^~Ho zEd7oVZcZnRoPUEqA->s|FB;kVi5|D|WX=KdXmO0btjo>=QNMfC1p7cp7ea{R`I^TO z@DtpJc_bWh%UcEIZL8R@;651(Rt6bon#pFEKCjhOsOW6B0at6QG9U+s z88&d@#u3a_+ld*&_M(fK`=+^HH4!^EgQeC$m{H1K9e?z0@;e8OQ57Py#S2!@%c@^P z4P{QxSOr4N*m;u)@Nw+)Z#Vt}R|SJIVU92`Z)J%nVy?c$lV`>{!F7d@q0n{#fCzgF zlranjHg8yrH(Rha7y}$52+GjhvavHR)>+BK!mX8 z0B#azkbmWzz<+{^@S!X$PDH!}BsNKsJ$vWHdmp?exg0pSAi;+aVn`uJjxI{{F~k^C z%*iH34wU3mNHL|9v!#rUGGt|}&loATaB)S7FQLSeO0IC9>Z(*E+?y{sr-2Gqvy>>tiALj=r_k-oD?JRb3Du!k zqB6IJ-N(ohl7Z)U-7@)53a5(587>dr^6&|%p}7j{icix3+dKk#%dJ+#_HZ1_ z+@_@3UZOy+V9}<}sPHg_p8x|$s-DM0hJSt$n#+}r8@2P)%tMno*S%>|m!@2aW}UGi zVTM3g09p-=|ror?iMay$>DHk?2cz*`JBRVxZ+c5J{!ow&ixT70w+YvDl40Jc|d(BD` zrkmyu@Rv^Dpr7DjB$jTsu`U1aa0t-f;0_UOJiMe9ZrByJ*O0|GO$5#QT&qhh!f#$_ zjMzYc)ShA zFOxs|A;^J>6?*oj2-J2&>cS<(sNX)zS<+;(BV5OZ@7v_5hgjrYyiO5^Ju2eXB5W}Y zf=1J(Pa^iHJ9n>N-u84PqGev}DnrwAB<60OSOt%OUMh~qqCM!T!Qk{$Is&TsX zx&=M&Q5@37*2OOe-vboi69XRuBog@ucsddC%OJsXHkixw(IV-t-Fy7pa(4^g=Xg-%d$Gj}3&I)8&%nTZqa4Ueil zlP2TFzO#V>+zT=dK0rDl)ktmlAW`Rep*FPUWh-W`w!%_m&Fr-6O7uw0qsn6^CoQI? zozQ6sz2Sx?F7ks8z|GiDwp=WT+)5L{HR>+ zk*KL~Z(-2D(9yxb%rASG7y8a7hG5t12wfkB}f*&AGj!ud$QsV!TLW@`rj{EWM-sA2aAk@oDv%1CsO}EWd zA}(gKt77mK0rVq`QTSwL8FP}9M91-U42ZpF8K!(GHu(hN+j2}I2nbBi^6d(WqEkw!vY}CgV00000NkvXXu0mjf+}?Gj diff --git a/theme/default/icons/calendar_notify.png b/theme/default/icons/calendar_notify.png index f118a83d99e8250483cae520449be0678bb1648e..24f1ccc7343cf3d73e7b506092ef482d5add714b 100644 GIT binary patch literal 6760 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 diff --git a/theme/default/icons/scope_event.png b/theme/default/icons/scope_event.png index 3afe1353a1a80da53565e6baef268f470f0f815b..2759541d576235e05c7e0de3ef6b48d011f46acc 100644 GIT binary patch literal 6524 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 XEkw!vY}CgV00000NkvXXu0mjfFPwhB diff --git a/theme/henge/icons/calendar.png b/theme/henge/icons/calendar.png index eb21b795fa6ab0cd6741e45aa754ce78bf470754..653cf84f426ee595733f0fa82da1ba878b09be4c 100644 GIT binary patch literal 6365 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 delta 1278 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 Hu0mjfwMqVm diff --git a/theme/henge/icons/scope_event.png b/theme/henge/icons/scope_event.png index eb21b795fa6ab0cd6741e45aa754ce78bf470754..d1b40bebad487f349d1d50849f51fedc02396c23 100644 GIT binary patch literal 6364 zcmeHMdpML^+aG7IW6GgKO_Rdbn1eAV2F1w8VR8x)b9ju0IhlhQQi!WW6xB`<)$Sne zilQwU5)!g2n`kGUk=`BqqIO^Hy?xINmA-d>`~AAE@BOdmx@P8CYyIxueXrlT@3o%i znw|83wT60@dN3HwkmlnR1pRs_Kk6FLcfZa-e;7>racW4oB#0q{3q^uBkPE;iDMA1a z$iX-mO#bsP;Sr)|c!NJi>_wXM;dNF!5<~fWo{nUObSXMm?UQ>e!OK)y#(mO%wBrnoQU3eK`J^>G*DXJOBMJHeh=G z(6Hg&x{{HHZt4oh+bv#M)*A;fk0%3V5v1}# z>huD8tK_ED?aPZFb05BONilAWnD-DIPEOc5x|{oQGKv3?v>7Wd*i!#Q18&%Ul)pA2 zuvm9lS^tF$hbIp5f|s3jMVYVh^dVl>_1uwv>el#;M9bRz31Ro6TFfbix$!$Kb9x$E z3$f0ZwArbO!Q(d$y4Y6rd7!>K@S~#c1OX-OUSapj$f;v>aq!msp{?yw`}hFolo2ku z`dXt8QvW`Ec&Z=*-r8Ma-J$+AnUcP5gLc-1*Z^W|wKT8diP8NamnT#l>)4S8jl)cL zO&DU-oO>O!u&TMb?h)4}_eZsM&8>QxE0}?1rbLsmffXskFwy+e{O@=2yH^~2kYB8Y z$kvE*$ULHc4p-H@^;lrlQN*fEUfaBAMJF_k+x}-&eL<&1uR{|ms!twD1kvTgB{jF1>rOroBTHZ9 zETBvc1m98^5Mq5>j2AIl3%!>B*Lqh5x&zx6aSo+?yVse6Ka1+`j}Q~?#$!$_c-mq4 z?REKr$GFlQk@oc)F6bru)fVFHIe5}|hn=+ZV7KK@*;VV-i|T`~Up=z4fL*`$it+Fg zxzo^e4xt{y*;oItxpe)QWAWzazZfP)U-ZAoHTN9bu2%`vEnT@Q#Lmn=A%@>Av-sU) zs>!Uky~bKA^6mLCF^J*8hkG@sww~X-a?up{ABJ1V#|L*l}aI&KI z034~U|EqS)f!35e*G5auE_O4L13dRq?nwY#1fTU@mEWvw^C``MC8!`j_J z8`mtXY-uJG?Uv%K9NQQ5;0%5^cvf`Fd3&=WU$<%b>OxaIB0^T+{vOn?LiW3v)t%nI z>{dj}8qI60?`^&G;j!P%I}F=jW~A;H-fo6m(sa+!tg#{&wky@F&!duYq}PUi&vMdA zv8u*$Y$I$tvB3roHaY7}Uia1Z^LWhdMyC} zp~F;*WTJ*`y9C{%wV(6mh{T%geNamjNxqIIJ_J_A=z(6_Mp&~NK z?O6Dw;9p-I-(%d=+ik@>tUKRu(G_aUyO7$5{fEZm74}GEb7kh9_#fZEVv7pfe5uV7 zMB$q(cCk*a*QpMWcNaHkCGKtQW})la)Emw>Odbe~yl6eP_9!p%-ZnR>-9S}+Z*s-U zmg>vG(~G)Fh&$|(CJ%B#y`@^GtzGw(d)Z7LefbUIkIDzI#a5!nXVf%1%O(^z&bg#; zH?DcCw|AKa-2Qu5=z|Li z9QKs9WvAP%^d;u*JlUoh746x(xNq2@{7uPe&t>9~0ArIE7ss9*MjafP`qS~9V#Dj=``zO?RLk6(#uHmA z%5P>0ju{c|$n~2d%}@MSMejZ9@w6IWgNB$_X}B|eY1!C~CpmdnF9quu+!}AF?rDz> zO0g#W)amJqH9kF}Zx8O+7X8DcTH=r|Ps1|j!1{!0%HuG#w&X_$Mgo?LIz6F?oIJK+ z;#FhXg$jT3G5y87RCC##rj{IO^LTg_vc7QSvQtUphKZX-^;2h=$zJLWp;a$KoKu@0 z8J`$-i43*3?&}kq#5Ha>dap|!JJI9$P@i85^7f?I$T*$pn+m3NQx_E{bXE*cYgId+ zI{M<6yAuqimJND((rKQa9}YX{h%4PvNbza$uxg9>$(Q<#k-15dZqVUXIl06Hvt0VJ zUcIyA;;47aaG+06l$BQhwydRjp*j|vXzM7g)e{=6-QBc1RNvoYg5ph{HYd3cJ=i>` z(8x|b2!_QQ+?L$;vt7W%|A5#YW3oNNEgNm))K$FyxM^B@KSe!FkvF+&TAW_McNSpa z@cFmUEj2s)cb>xYvL@Y<_U&iye_JZ=J+43BT@?N6+kEjIAd}kgRGVAiODNsK|ZEYrI?sd2aUsU&sH z@=OQC^Ygu#F9LfKk;r7tDXxY^Khpo6hNCRwPg_qsutBfKR8Q;CAG;dub*6^Yqt9#- zbZ;qjgDo2SMyg?DrM{fnxoI**#@Q^GE(72Erm^t7C@XyzJs$=$&I6%`k8poKGE2a7 zWUvKHz){Wg$q)e#kTBqK9+xjB%P9yIFB!U5cB2q*6-1IqL4^C$;hq8!0LMAv z9MMRs98AU{-1OkCB6b`($jf_{0%}nZ@e+xUj6%s|GDn${qd>$#VMrtr3XMf!u}BDk z6sPbd3^|f7Uaq8=;qU^)EDgiqc)ZUn#1d-qCx3rw zAr66_0Z~DKSRfU#0BSP8mn@&_RLGTz=lYb20cDpeZZ10x1qG$@JlAF|&7c0!Mkyl) zs3Mx~@;LsaNEXFP$yCL!b4I4C3x20${{gg7J`&y2$|na)HO2B)G@t^;{B zokl@m9nqh9=v;;*P9Wk@5Pl$ED*rSP0`h=h2}3Cw29I^d;+>qaSUeVkCXzmZ!T^yN zN^&J92JMK&sz%r>vNy!YfRYX5F*pE9$mggAl*>YfCIbn}P}T;-tm=p6LiQ8^42eJ# zA`oyX2xY8rC8esQ;I6a9LiQ7|RE8=rz*g4VY{ji%a8RnIE9&pS|H2d;FOc#7Z#_11# z;sGc}9MBjt8jYA)UbrhtxuJfTo~v@p@%Jas6~I-wC6Q^$%nOzZg2E9L92?o2Nckh4D{X(d!w{Tcy^5zFCUtNS6YLcLUV3^170QAQIOpUp2 ztrsju%i2c?7y3kqp}!dVl^?Y=b|rGCQ%6Gcr|LY{Q8(8z*GQ`zgt~|{uhk*ME>`S9 ztc3qw4y%wZiDZ8JP?%gY|*28H1SchQQm5sL`aZ>?QBNgQ>xC2e#kI T(@9B&IAAntfY-S-vD^L|;6RoW delta 1278 zcmV7=Hl+0001xr{kRf00Q!QR9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3 z004N}?U!A$Lm4l0>LQuADLjyO_Dg)2H9&!g;`V%qgS(lvzZ7khXNFn>&fR?bVS*Zc~*e%x@c zLC32-_%*_QIl2aJhq6{?boz6Uu=8oBE0R#g*~!K2In;yCw%sB7$2sq?>}=L`cs3-1 zN?oy#Fb^S#yY@2zInRnSqb5O6s8?U5gl)1b5(x70cy}A)vp_E*-@Wiz{YUSU_*^f$ ze9|&s8lm&$0DtM%;%|wc7M4du{5oKAyZS=p*?rD&K3z>2ismb$w%ByL!NdcS%f2n6 z7*0jsb}1+xYivN?V~Yn$qe2WSGf<*Vl_rhdHfjhl@nA#C+*r2F#kg>j#VM^qlTC_r zajo1J-z)E)J!S+>*^%Fi+8*uMh?6mjg(IwH3jTfI!S7 zN|~ZD8xeGL0IGp?I4NY>HICN=cDF zmK-@$Rev<8YF1MZTC`@#DQnKz^4jF8i6v9ZX69C`x_EN+?B?#pYvCf;1GVI0#Y-u* za;R9S!dJ!o3d_NV9O=*_A9narj@pnuEj4YqS@Tv}?cAkfo9MY)_g;D(6b5#Rk%o>u zZ1^anPUPB@nWoM>ZTc*;KB!$(zbn5$jV@}uNq?<*_Mir9FuPsQ+D>#a12Ikn;(c976(c976(c97g?#L#7 zJPqJaZ1@WWAUo5*7mi?)4hJBAQ?(*39qb_DkfAzR5G&%SRVYG*P%E_RU~=gfG-*gu zTpR`0f`cE6RRrd-(Wz7vovp=l&caHE%J%Clb$pGQ+fqH;AV< zZG-bZafFp*mH3=^+@uQNqOOPN!K@DY8U?WDWPKt#z?I%3^!>(Tm4n61cbMNi|dZ2>;acMz|fN+o3bnUX$pk`@P0<$lmiBDfq}JFZ|!}YJ^&f&Ds=-K z90FrS%3k+)cYk+p|DI|0_XEABa>Z71XFC7@00vM@R7C&)0D*P|d;223ypu{8I9ucf z4G%jJVRcr%0000vNklYH7;J#~KM;Tz>>x%1jBxz2LI3~& diff --git a/theme/light/icons/calendar.png b/theme/light/icons/calendar.png index 3d4eadcc29ce358818ea98a2ac54323a7a5135f3..8dfb24295656986e5c08bf049e6ff741652ed969 100644 GIT binary patch literal 6194 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 E-#^H7+5i9m delta 1295 zcmV+q1@QW^Fv|*%7=Hl+0001xr{kRf00QZHR9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3 z004N}?Ur4#+$ao%-&sYLfFy*(axgzt*}*J72W4zQ#DkF_I8_yW+wXB?ZnXxwkgi00zn<5pkQc~29 zB}WZa6@N{tn$^^U7Oh!w%9?Ywyf(RNV#(C9nYk6KE}mRHySaPuTDS=IKrOjg@lr~y z94Z1;_^Mc6VLAAaBOQ9=!wx^nQ5(vqrKT-6Yu-w$ox5~w6Fqn9-b=58!oW^3($JBI z4IgFHiCUX7)6|)#O`m1f2epgpPwfw=(M63nseiT39@JnBX15Dk+lek_AjXM6+!g^8 zG%se+DJ5Ry7PD9wAB8fK)Ws%rTEu`b4Pu@2VD~}px3~rM-{QuKX$y-8M6+q?pUEh<~A11Q10(!idPsGG-+y4d42@r*5jd1kdvC z`?Gr0g2jM<_Qpd2CnqBf1?3Rf0ABrYw;tXZyUI{ZfnXOaJd5vJQ=bnyHb#rP%HxPXY@^Z zAbJagSG~El&T;wxWNB9E8{ps&7%3@H_L|STdphU#Z%=D}KLW^ddaft<;Q#;t22e~? zMF0Q*ySuwL?zKsipcgq>0TU7pDugC6)c^nhIY~r8R4C75U>IzG`9BbV80;WM1B`J1 z#&|%0asU7S-(UvA13m_#8F&n&gLd2oGQ<4N2n&tD1pv4UY<=evalrrp002ovPDHLk FV1kx;TvY%7 diff --git a/theme/light/icons/calendar_notify.png b/theme/light/icons/calendar_notify.png index 8887b3caa0a52fe53319fd10cf3cd0c826f4cf2c..16bf5e79c07748ff5610052d0e27f79650b3e36f 100644 GIT binary patch literal 6464 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 GI^|yg($Yl$ delta 1304 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 Y2cmb8IoV_Ti-1#*P8%CpAHJga--(Y%3IG5A delta 1291 zcmV+m1@!vZE!hi@BmwP_B}4?^VEj3eZ9#wM3hYlp=Rz_)VszRmlusey;{}}p<=EDi zvfKR@_I|YOwi7?@Fe|a8eTh6jM?>_Q!YIsLNVZk`;egDWf)sQJHA&{#^VRod=hG7e zt%v=F#+FXn?SJ?sx#aU>uNtOm)EERYKR=#|pwQgR^RdOuc2qT#wMwr22R^L%R z6&hovJkjP?tl$^V%z_(}+^jJQKxlv5@<>;JZ{_)#Tm=Mmh1s#evh9b&u5{+s%p+N# z1p^iB@mY|yQve~t+6re#KwwKGN{NsUY($8ogHM5wvqav3fK<7`OO7H5aGdAbm}9iY zvhrcZnFSCkNepPR6tIdo*pNRK9XV7~G^%P+Q`f8|Ns38RN|xr~S4=FLS~7n#w`|45 zqpK%3_u$z}<}5fIHK%OZbIzq;(E{ay*#!ei*?E^e?z*SlcHi?}D$=LMsx?)s9%`Dox6oVYE%X-pZ-nsIA&1{!QK8AiyLle~00D$)LqkwWLqi~Na&MC>0}X#r6opSy zrBW(_?I7Zip*mR*6>-!m6rn<>6n1Q10(!idPsGG-+y z4d42@r*5jd1kdvC`?Gr0g2jJ;fJi*U4AUlFC!X504bJ<-F;z@3Dk%GRw#C2Lj zNMQkskRU=q4HZ;jBSE`PiiHfFCw=^bu3sXTLaquJIp(ne4YKP8|AT+uv$cv7<6crE z33R_W&c`qi+69_*$N4^XoaPA-d3_KaK zDZ5gTmQXAL?`QN)c_4ZVgjc<}wa#(+0Ay)a=^NnS5Ev;@_L|STdphU#Z%=D}KLW^d zdaft<;Q#;t22e~?MF0r^0K2=pH}17bll2uje*qH`5(5j)rzZda0K-W{K~yNu#nCYe z!Y~vD;6DV~t-U}o9-(7Fp;xJsi$lSs#i5bzo+%(WdWIapp<@SWP5#8m1Nf$oid1r)@Fc9HYeS2QwgL(D4fZdl^#Qv0uO`~dv*JHVhl3N!!!002ovPDHLkV1g@% BY=i&+ diff --git a/theme/purple/icons/calendar.png b/theme/purple/icons/calendar.png index 3b3009d4fea947fac9f6c958990d5eca8a203634..5e73cb386c317dafb6c7090f2b37dfbc5c751c3c 100644 GIT binary patch literal 6558 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 delta 2496 zcmV;x2|xDYG?)~SBYy|2dQ@0+Qek%>aB^>EX>4U6ba`-PAZ2)IW&i+q+U;3?jx#9^ z{hw3p5egeHJ`O*nxxpTPpQ);(lP^gp-6O3unv@c%DFXI;_QRyz`0roS{Rc13o?M8M zlcu!c6*MRn+~jS4>H73rSfA?^jz{?Wrr%v25V{yG?|(`;#(x*|$Lkl)HGIA8clmfi z`IzW==-EYpDz zZXQ1H@iF)d;(sp-^Ti^%eNg(z&jXNW&vTC5yAl!*O-Dp6u>Cm=23A1M>uU*@;2m)< z>rz~KD_aBQeQR6A)x3HFE7SSlyDxtFvD)SvObj$g&=NJ`)t6aFsevPJSivr`xP}?VoPA;x z2=VjaEiQo1>!5%85z+VF?l?iAWZek~xPQbIOu))?Ad7p@C78 zie^oc_YymASWgb1}cg8-2%|GwS{h z<{YT|leY(~b=&9KVrkP~(FZR-v`ekZ zgHtNW)osiekX3|fW~|zJ&dA^1hA1>CM1LP=fGyj)hm1XL-KE2iS})K&K+de%0CsDF zF&#r}Oo>uvl$P8`=$^_`WrREf1ZQH$-%T0fOMY$1pB7zP(QU#PTT%0>b($dqyrM~r zpV>g-ZH=gsO=F;tkf0dNs3k0+wNh=s)^$KsZFcGEhy0&0!q!FyV-R|6Yc16I(tkx( zKzs8xK_S8Sa?#Z=E(=TXl)F+&pe`Z&)nM*=Z+?@Eo2z1i|jEd z=+dCn7I}C&I`(eCZah%-w9Gw6c95rtIl*h&me-pqjvN?7iLu_SB&y3kZ2zs#TGJvw zu+I>l(!oCq6F3vZV#wCwU7%mz#~OBLi*+a<`vA6c}J4=@|c z);-e43W6MWq$0rwoP3re5Cap=YPqEoCFQgqSrU#xRe`qgb7<~P{ePB|?3xRkQv(pw zG?zLG)UH*axYd4W0TShq+Q_AIMAkx&A+;v9wer%S_O8Y5*5uJ4cg3~{l7YN!5W8MG zkFjge72JDl-Os?yr`}rJ<-j~#TX=YYSpi9zZE2IHi6dp}wjn@-wT&_RF1DmSY01GP z(!>^W8@qPo+AD*f+J9?M<1}r11Cj+{?{Kh2Hs};yqPf)e7419nfO}yN+YNnS@A5sm zdFCuY~8)6FW_YC78SM^c3;oht_hJW0bp!K$zb3dw$9#nJg zRXO)bHRoQHbDvam?o~PWNj2wQm2)quIa(@fvDgRlYvtT1Ng3-A#6I>A9dR0n3UVOKJFtZJGe_KmMDk3c+;t-@dSr8R*)G8FA zLZ}s5buhW~Luk^Fq_{W=t_24_7OM^}&bm6d3WDGVh?Ap}qKlOHzogJ2#)IR2yu0_f zdk6UIWu}@PV}PnzMmm`gvbhx@^ok(*5J4}7BxdTfqL_l`__~LWuXk~t<$dnY(XHf7 z2KWTxe;KA57V$dq)TX6#-Y1T-lB5uy6OS5nLE=ZQ%PzlhE;{VznNcH?o+FMD3&l2; z+nALMm3Wdkrl=a_`?D@9oVPfu+WO$sM~;EQd43<}!!!|10irJIT88~3%1r`$$EU4dg9smFUK1oDDR5;6HU>F7HfNK>Lzy!2l0uAT_ z3(y5tP#~}f!ta6$FfgouA?gW`;jkfWE$I&9LXTS}^w=K-2mk;dn1-nr^3rwy0000< KMNUMnLSTZs7t2!s diff --git a/theme/purple/icons/newswire.png b/theme/purple/icons/newswire.png index 542a4f4c8dffcadecd7a8a257499072c646fdcd7..b71236642438fe9eae387343612905c7ef19f3ed 100644 GIT binary patch delta 1657 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 diff --git a/theme/purple/icons/scope_event.png b/theme/purple/icons/scope_event.png index 3b3009d4fea947fac9f6c958990d5eca8a203634..77903ff15175357cffac33aa69c9428466e28cdd 100644 GIT binary patch literal 6552 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 Bh{ON@ diff --git a/theme/rc3/icons/calendar.png b/theme/rc3/icons/calendar.png index 9513e2aaa3d11d5ef5420d278884e8c23ebd271a..d39f7c09e30334170fe4be0f6ea1ad506602b9d6 100644 GIT binary patch literal 6669 zcmeHMdpwiv|DUrIib6eTjfylo*v!@@XO_d93d!N#c8_JY*@mGcq==GqaHyy}oe)YT zr;ZfqNJ{CTa;PLdQabRxH!A(U&+qyEdcA(%|Jv(y-`jOv@6Y@5x!%|3bKTedTB^I7 zqpHdr6&MVrN_DdHgubmLm#iFgZ&%83g~60HV!eGuo5EId1JLRmg-@(AXEMrd$i~A zvat(|yPg=?T|IK}v%ts_#=jcCAlm9lPh1 z{O6)B)4dCtzV?O&EomB5+%>R(6!^Rau`w^g#d}L?&4VQ$cNe_jh96-Pt8aG4>uJ;8 zjm}@vr=WQs^`SlqRy$)*f8gQJYeN2>=xUiqbuM*X4tMY0w;E_)+dwQWtdV;+?NC2+ zR_6&p?KAEE=z||mp4OaGmzY!9eyCq}UlMI<*PXnz^>ri8)l(nTMEAT~u9xH8^Cm!b zO6H#zk8C!1r6%_W{KKpAWZSnHXLd!-)XkY*tCzjCgs1A*b3yH-k&^x@znIdn9yQIR zJU4!1X_8S`bKt6oPM$nANw3&#&7j;G;$!RMj>oDyF1)G*YfFUW4D$GOm z5jFWvZ8m#jnth6ccb&MBIJ+T#4@M=qEU?SSGy&E4wNd;&7;U=SOt;wo!J*J?Tklm^ zyxSbQb^VNXO1p0ZMh1SN+8`ZJS3GseQqbj^ugQ9{`#kNk-Tjd#bBvzobSCUD74Nfh ziyG#V4Qd+B_71Z`wKi?CoL7leKKf*l)xGIUHL&!<4s&hOG4`p%oxa;?^Dbv+8EV!q z3QV-4BC?8{S}Zr}3Y)UbUSx$uD6ICQQ|*_T7PY4BT5)aFpy+bK%Dk|;4O;%IZwpLH zqLOLql;PH*ke5a6PgCaJOx>1}PHsB9eW49IWp+p|_OHb!7TLJgDrV$*-H^Bd{J6=WJ zenGVTn)mv-*FEfR&28MI{BWj&lW$g8TI(uLp>2qcfdR8nt_ophqe7qNa}|hg)nNAB_%Fi zL!BOB3N~P?eKZdK#q3AgGZ$Mb98pvQNx{^;&k0 zVf~Liz8E+~tuMbqU>UjLg2Upwv+E8&PUo~M#(9+u7$gR&g%Vd^pXy!zR2F~YbN7Cy z^iJz9+wa%%bu;$oyji(VFUe8qwhs0T;TlF}$S!+_+LVpYGT*?7ujc_fhWeI$P(9O? zvAH^@;8X6W3d4EkAptBzLE8!c;rZ#I@tfR}`KL7O{QLB2+PJOP6X%@!qd(yEDO-HN z-Tt&4%Y5H1*&5mxsNCz57dKq-w()l3!^M9B%0qE}NgQ@Ls)qaM1`$I|VcWA14u|M)8GxXuVm|y_ceziT2-@ztb_-`)a(W*1LGx*(9*=tP^FK)r! zI3w=Lca(A0-P!0PXZ{c^N2E`G%baV;v!_CU( z{mRP5P3j!WG@n3~Be#}&&8`WvZApON$y*^evf2F(*|>6Xk-i)-P0K)J1jre|f#4;* z?j`U0mLwCGCR#7GkxL_Z)D%34R(8URUsxrT@?V>xHqJQMT|O8i_pGqTM60Z~k?)e% ztFQiP2E4kld!Q-NL@V?VN-x?9c0ggnk)c`X+J)ASFE`L^lJ**1@M6o>EO5(Qz>A4% zS!rpQGwON$LZv!>WRKyUL%CnvviiJS;}>2XI4RPnYYY_ z)DYPcxsjT;&%6YF|;RhwC29tuHACx!F#3o`{~D{dTE%E**E99 zz%IVrv}4<)6Nm?11!Up+w*?M=6`sF5q^gDj67EjdA@rS}zPt0p)$5u%E^#ZKhcDbp zvnUv<9=NwY!Q|*xtB23Z+|k$V`{XYz(W$dv9~Es~Li_@|Skfskc03Jr6~dANAJzX*P#c z>QZJ3BXGeN-TP*{t01W|CI+n>3_4)lO7X3=FW&o#OJcvQ*s{*J!K1s}D(CD%=gx|& zWxEnj7c0*qGt0U7{ToSb%4@FO_BG3&Lavz=RTSKwZ>!O8_wlIj>5`g`qaGfv$!Y#t z85$#?`jw>jYmB>Ik8RmPQu7;`nL>+RICO>*Q?;Z@rs8;b(DcHk$pjHa22oIeyKyB$#yK%*Rh!DN!zwzlq6Tib7^ z1L#bUzjhnN>7teHUzHE|uy$fhsKy_+9FLR#7^~gmH`+6*+qwD?-O9>vFOb64Jg!L#?@;Vn z+ht^ObeyI(^NY1pz%zVbDw9g^-}AtRyez&_EGL++Y1 z78ddjY1y^if4$+y@y7PDhd;=D%o9XqPGbeYVCtLM&}q%r)rG|1g_{CQ9vw6lhx4J+ z91KQYD&_->Fi-@igCT4#1u;-vkASn86oe1n746Em1w+|Ru>#O5*3Fv{8^$0q5lbyq z$YK&i5Dtm}xHz1{6_Ughgp`*A{g!m25O66(6h=Y#y1K({c>)lQGsT&rk@jMC6c%Br z0w)WYERv_4!vqD?q98&=B0dR)ijIypjW#po2|`d9B9VwfV^LTv5<(z_FsK25qdY+& zFH*n&?V~`h$Y8QlJ||K**=M8>lyphs<}g_(C@87t$u^EuSNHEW5*b6-;e4ru1U(ta zWPHc*BLy5OhRHyI955UTLGIZ zm4u23Q4#1M9x%sPAc+&s5l!S1SM^fQU3(~Hzu!8UNrar#`6REoyA%pislKz zXaX92HOLVCGtb|FzcYD4d!0}uh@t+6N&OETc|2X6AX}awW|Ds|Fk-wlz9DhgQmNo@ z=_Wt|7~}E_fhdqET>?nQ@gYVizzqSR-FBkXzV);JCXMOl1iA$PS|FJi1`CN}5(!8; zK)@hzAb`i3K}A9*j90>Ub|H@?iUtIrbqJIL&^kk{^e~u+O6ohib1dSn~ z(TMTog_BW|4fWgf$dWC`)s-|^0J3CDB2guo=M~B4bJ(EZXJNi2%Kw6!WIvIV|H*tZ zY~0$G$B%)EHdI85=KiDmzX6UjxUd-@SIGOP&?iI2WtsHcfnpx-gPv#5;}P}!`8bgl zlFIonekRiGzvuy?{_W(K^!+W@Z@GR+fnNgu&aU5b{gMK|1pb{}|8H`s{CL9#xzIr` z8hU?z-&Ir#y?ak_ck#BDzJ(>!Rw2@f&8HME<+s@{m^Wc|+vU^1|@dnvazE5$@X95AZA Ln_a0*aN@rJ`z%7> delta 1323 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 IS>*cv0UtHibpQYW delta 1314 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 MvvIaAvht7r7yr~Xo&W#< delta 1318 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 N002ovPDHLkV1kX4VjKVf diff --git a/theme/starlight/icons/calendar_notify.png b/theme/starlight/icons/calendar_notify.png index c704054d000b88d5d8c57d5714cdff06a827145d..66191625e9f8644cc9d3f89e93e835c9a011dd43 100644 GIT binary patch literal 6294 zcmeHMdpMNa8Xvbvib|17rYXr~?!#QRaT^m;#yu(3_L=#HX|8658A^yQE+uVBC7nui z3P+`jjY4}T6iTU7x+satQQCyI^UYA{oPG8=J|)}*mQ=cyFc{pqI|1sK%aNC_c39xDFy@i^cT#4I)>(JyJXJ^4Ju$%&b2@$0v)K2*iiX=C-y!nmwAETN;5CapJLAU= z4p@xl>YK*ww0>sbFuL)#dvh!E1s_v8u6MmJalW+j$w*0VlWrPfTVco{>sPNcBvSPv zj~de-6a4Sn_QcUUJW5}xMOa*|Pq$k)JR?gE4_~?Eo>~KrH;w%3$*ECA;m&r9ULVPU zZ9Y$99XE~W^hI4EHMKuUzb`)DR5F$H!BnD!_Uj8Wp%nJ@&i`#+^@8Tnvb7v~Mp3S) zi~d2w+Ssdcs@7nW-ivqK@+U8vtfKls_MN88zJ{uY?MKOV@lAOVO{a=%ovM!k#2yU& zQA??M1NVG_?bBvOMl84{#h_|>mOOoBr2S7jw2-ZeRwlMpFV3MALl-Me1=s4$i(R(w^DsL_8M-h(zV@U>QjyRbQ_7EW4RqMRXPA*K+Yc}3EN|PN z5~rPzhH+rwt|TTRjq4WYAXl62NVJ$eWDQ%^78Bx{2%IxNQ`S)qlkCnub;HU;z`Iux z7BP2ws8MOzEFGK24Ya!k&Nr-n@dfJg_Gx%{=ay?4ZG3Ftria*M`E&QeIs=v$wr=;D zw^jfCx;O6qbRZ@ZCMq#UiN5d{VT4YaG>1a!6epo;z^L3ri zaM|TcE@Q!ed6^lZnHO?WYHXJ^@3^~Nr_)U5+t+Vg3pKoDA}z+xus)>Ymt#3;+BCGvHN}LzLT2pxwl+H=>od zy~MlcEL@r%^ILNfwlV(p%WEM=-?ZI&T-|VNXBk!ACBK-jf6(N>4F9-oAH;2ej7((3 zu-Kb+yop}5Yu?P8^5NP3cXK*2+#ZFD;X7Z}#4_yWCmJ0?dr|C;G&5socx7C@q*c&Y zFd7g#9H-OqlZ&&SEB^fkhr)R$`f@g`JCR6#+L^y1sdZ;teZQ{$Ei7T1zUID~wCL&< zo8iry;PBLUxkN_7eXkXMz6@A?ESeucS4%smcHDc#mi@czU7Kz6^NmmE957jgDgLW& zY1&QwgLL|?wi4Zf5c1Zn*Rem$)C?2-*3z(XOM%9S3+9N=@rzRfrY+AA8_eX^-r68R zcp;X<5;bXibm}+bZ@*s^YiChD*ikXy+44i`Bdiy3UuI~97HMdg!KEn|vKR@EYC|j) zTZsKHbWeutH47qKurH(EMa^2+8~*Dx%gXqC3~YF|w4_v)F|r|enW$i7s$JEAH&#uB z9(`jEK2$%&zjXxOJT%%EzOEuJd^$Bg2)6V@zIyb?(Mwl;FP^h@|HHvcu)dEUnZZF$ zVvgzM&1V9XjPyqugvVsE|d3rby6E@ zt!>fm^I~^8qm5SrtJ)QfG487$&wA!qW<@2{Kk(1%B0Rr`&wE>2HP~_N{F|zl5%Y?H z1WK6bq6geDlm7s^K($`CY;R~ zelP#5+24=Mc{phFYWA>8=~;8_+{F%7-sU6J(W2exYqM7(;m78m?YXN#Gasom_bp4k_}D_{aa}R3 z?RjTMS3j$6>PrI|C^7`cAUQX{LB z=Nm0Alo<}1)?^3t5TCloN1yxMsQZw9ve}XFVdr1%e&1~#-h+d|)RMV0nlFP!`*ch} zhf{7`Ce`z@ui+M-fMbX`+G*QK?Bm{Z^HWLd=cM{BxTRZ6$*COB-%nU%joP`HS5tH7 z*Aq!;XG&(2Y=#eMJnibr??za5>@{5d%h2PuPE8wLh#$ozv>eA=@7WI{JalNSPtLhs zoO*a=GCXvb4GQ0w^HaXz#yfYY>KiYm_1leYh%a%n7h&P>Se9~zV{c%>gp(MNJ>Zt@9 z!qpOsQT`Jk-n^`jq(KYWD!a9xu5=5**i7)(En3*9yZGrcG*kpKm-MPVRHArM2i6)>2i zvqB88c%Td(28MHmR779JB?O$yrXp6_Gcimt4UFJ=#!A3|SnohqERRKIBb=Rd9TgOa zKmf`BxI(}eN+}8|Ld8pgu9e+r1Y8A?@u-MkrZ1c(l7Mgmih#l(=?ZQ%4&kH=ca*R> z6o2=n6BJO3iinWO#1u4IE|;U^c$7#Ij>eM7WHbhc#^I0<0x69V$^ZpYC|#(e80T;Y zr7Q_oEaQrVa3v=YCW?|#5eR4;K0ywRvgit^bHahLt)iF8*k}gSAVBkh0B9TrLqcM3 zNE{hG*&Z5YGCx}jr4uSbdZHD87>z|?&;r3%7E&2K`is9mw2%fucW-EaP%4U&ut0h= zD3mRn>{QH;l1}y+B?XmTs<`=V4jKwd<$1D=2ZQPR*+wa2I9DK6St!wyk!;pyoH$Ct zS7F#JG{^@9P#{u>8T%Dp#^rojps(hm9Ql_(Aa|enze0b~OBIVsSBkrc6{U2_aHk@a z@lx0#7MD#?U6MI$fQW%so{cAPkOX!Z1{sFIIv@!gg1tQ%i|07taFeJQLa7W8vOpyj zM2_M@Ja{r>W{-D3hJ}H6B!NI?BLRQ_U13QWHkQO;;-P>P0iz}e#*@OY8~l>7F?@!6^PfWuZWmfrJH=wE;1!`k}c{Xc7>Ri6ns{5ub`sa>JFBs*-{`P818p zOTiGqE0V-a@*e<3j#a!aBxl$jS0B^L9!pyX>|J|)V(!A-KCNXq|YJ{dM{O%sV@prVbC z`N)NT>i!Ra;|yM07ATa8{w(y#ka1ZiojXv><9*P11|5&+&*$SrS|}^$|M;3nxBsID zi2A#eZ_@X>T;JvTCI!9;{5`wA%k@nPd=vP4cKy%f(*5#;4GN(fJvsFJ+!USk2zvIO z>gyFqS3QNp#>U2y9yZ^E8fr3s?*N!f*Ino*eVAIISNyQrQY3oBTYLd8sdO4=-%!nZlRn10l>SB AQUCw| delta 1285 zcmV+g1^W7yF}(_q7=Hl+0001xr{kRf00QWGR9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3 z004N}?U!4U4_ifOm|O4k(bU+m#A!GACbdO2^cUh6CD`tiWM z2OY2W;MWZM<>;EY9m?97G3d`h!p^6iu1G=|=O7oi=THwm`*w%yA9dbg+1ai8@N7s1 zmAYahVID#fck5>aa@LBPcWZoGL^PbHD-sCu@_Kh4sa`o)y?!{~2A~*xJu+#rg`%!G|2_&?6sq_)(79kUlLnZMj+VR$A@crQ?|Bxm)*MdL0x7PKuF+jy!Dm zD5Fl~+LW25&OB}UEVDkST~vQ6e?W~cYP?CUb$|At25T_8UC=sCbTI=lP6Xn%2q2+( zF^f(q@gldF#lq`6V+5&-P3W|U0bv@%I_bgggWPX%3+lhcjekWhEOh?`xd3!ObNhl? zU%zv06Fa}crD+s=eOOc318R(D{%!wu^mg=i^mg=i^mg=i^#6Ax6MsD5pV;sNia(vV z?gO$wpp(c39DhI@#a~mkA{B>L5OK&*oh*ooIBFG&P$AR`tvZ-o`XMxFNK#xJ1=oUu zAB$B77iV1^Tm?b!1H{SENzp}0{9jUN5#zyeKi=JY+`R*YdYNff#~7gLwwX>Q#B6Rw z485WYAw#t9I72Cnp$zfuRLKS{5(wAc~Q zw+&oew=`uBxZD8-o($QPT`5RYC=`JAGy0|+5V-|aRA16K!9=o|Nq}$ v2EzkB2BH~w45Wj0+y*kk{LTmqjll%~xC?B3=Mr(j00000NkvXXu0mjfx1C%E diff --git a/theme/starlight/icons/scope_event.png b/theme/starlight/icons/scope_event.png index cf907158581c26679bcbfa8eb93342f50647c83d..6860f310fa6d43c87a3347996dfa12086e3685b4 100644 GIT binary patch literal 6639 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 N002ovPDHLkV1kngVjchh diff --git a/theme/zen/icons/calendar.png b/theme/zen/icons/calendar.png index 5a5e687d9fdc98cf55115944947e2ee8378c7889..b9020884c805314d4c149877b3f69e9d90a1c4f2 100644 GIT binary patch literal 6338 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 delta 1302 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 delta 1303 zcmV+y1?c+1G13Z<7=Hl+0001xr{kRf00QrNR9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3 z004N}?Ur4Z&fUd~&q*ZK;(emro; zpySmZ{F-6E990;U;WHL&a=Y8xUwkLk;t}qKqnHfOd!b1>)m~f&jP)Oe2>Cs^&g{8;&Z+1 z@=42lX@tR-6Mv*%i@zm)3M`L|_;te4?dl7WXZJbB`F1sBD4MT|+G5k~1`7{JF8i^J zW;hjN+pVB^tg!)kk1ZZ(jS4ZS%s`1cRhl$*->4zQ#Dfhzb7R>y7vsWB7N@itO*Sdg z#lf%f2w;|kAGy$uTXwugj>w&`lnKrj_8+$Jcay);!hf7?Nkq{fS|Kl9b&WI@xpl=V z0HJwt(=G7bF8uMSeo(3)s9R>o3)Xm?E)J!S+LFy#uujpRpAZG>mjg(I*otIGKpSxr4?(V8WvtT|`PYm=)cmP{?1nOm{y;>p#so4XgUg^OSh)RK!8FQwGV zp(0R)uZr~*mV*yD(xFE_?C_%;wV`}kYT9zM=B>2axl6}3(Q~)%z4SUL4D1vm4IO#d z@KHvcsI@6GO`Un#^jT(oP`jvp*M5N-UDSA!T7T>8K@HYmcDtapo#zaI&4}o@dxF0004nX+uL$Nkc;*aB^>EX>4Tx0C=2zkv&MmKpe$iTcs*34t7v+ z$WR@`f~bh2R-p(LLaorMgUO{|(4-+rad8w}3l4rPRvlcNb#-tR1i=pwCr2km7b)?7 zNufoI2gm(*ckglc4)E8@Of@^k0ade%RDU8aWU{M5@D(8pAdGH|O3c*fL@^1^@pTU$ zU+-c(%lq7)Bdp|12KWTxS*9Bn@dokqrloVYciDr?@8zc7^3R+hO=a|j76Vt)xD z1jwkOgfc9|Xw^tDk)r*$hkwxVi{z5YRRSZ&0xD1;Iezdz_}#6UpPX=$LUEw;#kN0& zf#5FCsM+@Sv28a_fWR|wrM3K(IxzD|dab2JkAU87;NrTa$$P-%4$%LkONQh~0h<1N z9(X^aZ^{CFw?NOD+go!Vrw>4yx-d%K00)P_NP)7~J>K2b-rK)tn*IF%W~_3epi7wJ z00006P)t-s0002Cp@=Zcz1Nd47&u$x3>gg)9wWop!vFvPIY~r8R4C75U>IzG`9BbV z80;WM1B`J1#&|%0asU7S-(UvA13m_#8F&n&gLd2oGQ<4N2n&tD1pv4UY<=evalrrp N002ovPDHLkV1ktMbKd{} From 1b5626e3a1e89b1bff156151b8ed0e73c2bdd15f Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 3 Jul 2021 14:47:02 +0100 Subject: [PATCH 1333/1416] Chroot option --- epicyon.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/epicyon.py b/epicyon.py index 3d6fe6d1b..65091fb3b 100644 --- a/epicyon.py +++ b/epicyon.py @@ -195,6 +195,12 @@ parser.add_argument('--proxy', dest='proxyPort', type=int, default=None, parser.add_argument('--path', dest='baseDir', type=str, default=os.getcwd(), help='Directory in which to store posts') +parser.add_argument('--chroot', dest='chrootDir', + type=str, default=None, + help='Chroot directory in which to run the system') +parser.add_argument('--setuid', dest='setuid', + type=str, default=None, + help='Set directory permissions uid:gid') parser.add_argument('--ytdomain', dest='YTReplacementDomain', type=str, default=None, help='Domain used to replace youtube.com') @@ -582,6 +588,29 @@ else: if os.path.isfile('debug'): debug = True +if args.chrootDir: + # chroot to a directory + os.chdir(args.chrootDir) + os.chroot(args.chrootDir) + args.baseDir = '' + print('Changed root directory to ' + args.chrootDir) + +if args.setuid: + # set permissions for the directory within which this system will run + import pwd + import grp + if ':' in args.setuid: + setuid = args.setuid.split(':')[0] + setgid = args.setuid.split(':')[1] + else: + setuid = args.setuid + setgid = args.setuid + uid = pwd.getpwnam(setuid) + gid = grp.getgrnam(setgid) + os.setgid(gid) + os.setuid(uid) + print('Setting uid:gid to ' + setuid + ':' + setgid) + if args.tests: runAllTests() sys.exit() From feb61efd6a215a6fb76ac702375b5b1c6b2ccd5d Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 3 Jul 2021 16:59:00 +0100 Subject: [PATCH 1334/1416] Tidying --- tests.py | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/tests.py b/tests.py index 9496820ac..c6ac118db 100644 --- a/tests.py +++ b/tests.py @@ -3951,9 +3951,8 @@ def _testSpoofGeolocation() -> None: hourStr = str(hour) if hour < 10: hourStr = '0' + hourStr - currTime = datetime.datetime.strptime("2021-05-" + str(dayNumber) + - " " + hourStr + ":14", - "%Y-%m-%d %H:%M") + dateTimeStr = "2021-05-" + str(dayNumber) + " " + hourStr + ":14" + currTime = datetime.datetime.strptime(dateTimeStr, "%Y-%m-%d %H:%M") coords = spoofGeolocation('', 'new york, usa', currTime, decoySeed, citiesList, nogoList) longitude = coords[1] @@ -3989,9 +3988,8 @@ def _testSpoofGeolocation() -> None: hourStr = str(hour) if hour < 10: hourStr = '0' + hourStr - currTime = datetime.datetime.strptime("2021-05-" + str(dayNumber) + - " " + hourStr + ":14", - "%Y-%m-%d %H:%M") + dateTimeStr = "2021-05-" + str(dayNumber) + " " + hourStr + ":14" + currTime = datetime.datetime.strptime(dateTimeStr, "%Y-%m-%d %H:%M") coords = spoofGeolocation('', 'london, england', currTime, decoySeed, citiesList, nogoList) longitude = coords[1] @@ -4040,9 +4038,8 @@ def _testSpoofGeolocation() -> None: hourStr = str(hour) if hour < 10: hourStr = '0' + hourStr - currTime = datetime.datetime.strptime("2021-05-" + str(dayNumber) + - " " + hourStr + ":14", - "%Y-%m-%d %H:%M") + dateTimeStr = "2021-05-" + str(dayNumber) + " " + hourStr + ":14" + currTime = datetime.datetime.strptime(dateTimeStr, "%Y-%m-%d %H:%M") coords = spoofGeolocation('', 'SAN FRANCISCO, USA', currTime, decoySeed, citiesList, nogoList) longitude = coords[1] @@ -4095,9 +4092,8 @@ def _testSpoofGeolocation() -> None: hourStr = str(hour) if hour < 10: hourStr = '0' + hourStr - currTime = datetime.datetime.strptime("2021-05-" + str(dayNumber) + - " " + hourStr + ":14", - "%Y-%m-%d %H:%M") + dateTimeStr = "2021-05-" + str(dayNumber) + " " + hourStr + ":14" + currTime = datetime.datetime.strptime(dateTimeStr, "%Y-%m-%d %H:%M") coords = spoofGeolocation('', 'SEATTLE, USA', currTime, decoySeed, citiesList, nogoList) longitude = coords[1] From 7b55dfcec151943e8a646ddcc0d921c90eb72ad4 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 3 Jul 2021 17:03:19 +0100 Subject: [PATCH 1335/1416] Chroot isn't a great idea because there are various dependencies which would also need to be installed --- epicyon.py | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/epicyon.py b/epicyon.py index 65091fb3b..3d6fe6d1b 100644 --- a/epicyon.py +++ b/epicyon.py @@ -195,12 +195,6 @@ parser.add_argument('--proxy', dest='proxyPort', type=int, default=None, parser.add_argument('--path', dest='baseDir', type=str, default=os.getcwd(), help='Directory in which to store posts') -parser.add_argument('--chroot', dest='chrootDir', - type=str, default=None, - help='Chroot directory in which to run the system') -parser.add_argument('--setuid', dest='setuid', - type=str, default=None, - help='Set directory permissions uid:gid') parser.add_argument('--ytdomain', dest='YTReplacementDomain', type=str, default=None, help='Domain used to replace youtube.com') @@ -588,29 +582,6 @@ else: if os.path.isfile('debug'): debug = True -if args.chrootDir: - # chroot to a directory - os.chdir(args.chrootDir) - os.chroot(args.chrootDir) - args.baseDir = '' - print('Changed root directory to ' + args.chrootDir) - -if args.setuid: - # set permissions for the directory within which this system will run - import pwd - import grp - if ':' in args.setuid: - setuid = args.setuid.split(':')[0] - setgid = args.setuid.split(':')[1] - else: - setuid = args.setuid - setgid = args.setuid - uid = pwd.getpwnam(setuid) - gid = grp.getgrnam(setgid) - os.setgid(gid) - os.setuid(uid) - print('Setting uid:gid to ' + setuid + ':' + setgid) - if args.tests: runAllTests() sys.exit() From eb3374765651cd1cce325654705797a0c2017480 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 3 Jul 2021 17:44:07 +0100 Subject: [PATCH 1336/1416] Tidying --- feeds.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/feeds.py b/feeds.py index 5a5eba61a..310243981 100644 --- a/feeds.py +++ b/feeds.py @@ -9,16 +9,14 @@ __module_group__ = "RSS Feeds" def rss2TagHeader(hashtag: str, httpPrefix: str, domainFull: str) -> str: - rssStr = "" - rssStr += "" - rssStr += '' - rssStr += ' #' + hashtag + '' - rssStr += ' ' + httpPrefix + '://' + domainFull + \ + return \ + "" + \ + "" + \ + '' + \ + ' #' + hashtag + '' + \ + ' ' + httpPrefix + '://' + domainFull + \ '/tags/rss2/' + hashtag + '' - return rssStr def rss2TagFooter() -> str: - rssStr = '' - rssStr += '' - return rssStr + return '' From f7ab9733e9b8f7c0762a7e36735e0b3f38210ea7 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 3 Jul 2021 18:51:58 +0100 Subject: [PATCH 1337/1416] Tidying --- follow.py | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/follow.py b/follow.py index 5567dd9bf..0ef1c5ce6 100644 --- a/follow.py +++ b/follow.py @@ -220,18 +220,13 @@ def isFollowerOfPerson(baseDir: str, nickname: str, domain: str, if handle in followersStr: alreadyFollowing = True - elif '://' + followerDomain + \ - '/profile/' + followerNickname in followersStr: - alreadyFollowing = True - elif '://' + followerDomain + \ - '/channel/' + followerNickname in followersStr: - alreadyFollowing = True - elif '://' + followerDomain + \ - '/accounts/' + followerNickname in followersStr: - alreadyFollowing = True - elif '://' + followerDomain + \ - '/u/' + followerNickname in followersStr: - alreadyFollowing = True + else: + paths = ('/profile/', '/channel/', '/accounts/', '/u/') + for userPath in paths: + url = '://' + followerDomain + userPath + followerNickname + if url in followersStr: + alreadyFollowing = True + break return alreadyFollowing From 500e72f0645c59d9a95f37f92f62780160bbcb26 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 3 Jul 2021 19:00:31 +0100 Subject: [PATCH 1338/1416] Tidying --- happening.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/happening.py b/happening.py index b5606e0e7..2a6b2e842 100644 --- a/happening.py +++ b/happening.py @@ -132,12 +132,10 @@ def saveEventPost(baseDir: str, handle: str, postId: str, calendarNotificationFilename = \ baseDir + '/accounts/' + handle + '/.newCalendar' with open(calendarNotificationFilename, 'w+') as calendarNotificationFile: - calendarNotificationFile.write('/calendar?year=' + - str(eventYear) + - '?month=' + - str(eventMonthNumber) + - '?day=' + - str(eventDayOfMonth)) + notifyStr = \ + '/calendar?year=' + str(eventYear) + '?month=' + \ + str(eventMonthNumber) + '?day=' + str(eventDayOfMonth) + calendarNotificationFile.write(notifyStr) return True From 9194d95b1782978109c1c4b07179e4632dd6af63 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 3 Jul 2021 21:15:34 +0100 Subject: [PATCH 1339/1416] Tidying --- manualapprove.py | 18 ++++++------------ markdown.py | 33 +++++++++++++-------------------- 2 files changed, 19 insertions(+), 32 deletions(-) diff --git a/manualapprove.py b/manualapprove.py index 91948a344..c915683ef 100644 --- a/manualapprove.py +++ b/manualapprove.py @@ -111,18 +111,12 @@ def manualApproveFollowRequest(session, baseDir: str, reqNick = approveHandle.split('@')[0] reqDomain = approveHandle.split('@')[1].strip() reqPrefix = httpPrefix + '://' + reqDomain - if reqPrefix + '/profile/' + reqNick in approveFollowsStr: - exists = True - approveHandleFull = reqPrefix + '/profile/' + reqNick - elif reqPrefix + '/channel/' + reqNick in approveFollowsStr: - exists = True - approveHandleFull = reqPrefix + '/channel/' + reqNick - elif reqPrefix + '/accounts/' + reqNick in approveFollowsStr: - exists = True - approveHandleFull = reqPrefix + '/accounts/' + reqNick - elif reqPrefix + '/u/' + reqNick in approveFollowsStr: - exists = True - approveHandleFull = reqPrefix + '/u/' + reqNick + paths = ('/profile/', '/channel/', '/accounts/', '/u/') + for userPath in paths: + if reqPrefix + userPath + reqNick in approveFollowsStr: + exists = True + approveHandleFull = reqPrefix + userPath + reqNick + break if not exists: print('Manual follow accept: ' + approveHandleFull + ' not in requests file "' + diff --git a/markdown.py b/markdown.py index 67d99b426..eb0cbf2d7 100644 --- a/markdown.py +++ b/markdown.py @@ -140,29 +140,22 @@ def markdownToHtml(markdown: str) -> str: linesList = markdown.split('\n') htmlStr = '' ctr = 0 + titles = { + "h5": '#####', + "h4": '####', + "h3": '###', + "h2": '##', + "h1": '#' + } for line in linesList: if ctr > 0: htmlStr += '
' - if line.startswith('#####'): - line = line.replace('#####', '').strip() - line = '
' + line + '
' - ctr = -1 - elif line.startswith('####'): - line = line.replace('####', '').strip() - line = '

' + line + '

' - ctr = -1 - elif line.startswith('###'): - line = line.replace('###', '').strip() - line = '

' + line + '

' - ctr = -1 - elif line.startswith('##'): - line = line.replace('##', '').strip() - line = '

' + line + '

' - ctr = -1 - elif line.startswith('#'): - line = line.replace('#', '').strip() - line = '

' + line + '

' - ctr = -1 + for h, hashes in titles.items(): + if line.startswith(hashes): + line = line.replace(hashes, '').strip() + line = '<' + h + '>' + line + '' + ctr = -1 + break htmlStr += line ctr += 1 return htmlStr From 6f10986407f17183a6a5f18a193b0219788ca38b Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 3 Jul 2021 22:42:26 +0100 Subject: [PATCH 1340/1416] Lookup actor during migrations --- migrate.py | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/migrate.py b/migrate.py index b36002a41..bae02eb61 100644 --- a/migrate.py +++ b/migrate.py @@ -13,9 +13,9 @@ from utils import getNicknameFromActor from utils import getDomainFromActor from webfinger import webfingerHandle from blocking import isBlocked -from session import getJson from posts import getUserUrl from follow import unfollowAccount +from person import getActorJson def _moveFollowingHandlesForAccount(baseDir: str, nickname: str, domain: str, @@ -73,22 +73,16 @@ def _updateMovedHandle(baseDir: str, nickname: str, domain: str, print('wfRequest error: ' + str(wfRequest['errors'])) return ctr - profileStr = 'https://www.w3.org/ns/activitystreams' - asHeader = { - 'Accept': 'application/activity+json; profile="' + profileStr + '"' - } if not personUrl: personUrl = getUserUrl(wfRequest, 0, debug) if not personUrl: return ctr - profileStr = 'https://www.w3.org/ns/activitystreams' - asHeader = { - 'Accept': 'application/ld+json; profile="' + profileStr + '"' - } + gnunet = False + if httpPrefix == 'gnunet': + gnunet = True personJson = \ - getJson(session, personUrl, asHeader, None, - debug, __version__, httpPrefix, None) + getActorJson(domain, personUrl, httpPrefix, gnunet, debug) if not personJson: return ctr if not personJson.get('movedTo'): From a9e31baac5ea1605b256eafb3c0fad92196e6b08 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 4 Jul 2021 10:24:35 +0100 Subject: [PATCH 1341/1416] Tidying of newswire logic --- newsdaemon.py | 188 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 120 insertions(+), 68 deletions(-) diff --git a/newsdaemon.py b/newsdaemon.py index fda1debc6..b9b0633aa 100644 --- a/newsdaemon.py +++ b/newsdaemon.py @@ -74,6 +74,120 @@ def _removeControlCharacters(content: str) -> str: return content +def _hashtagLogicalNot(tree: [], hashtags: [], moderated: bool, + content: str, url: str) -> bool: + """ NOT + """ + if len(tree) != 2: + return False + if isinstance(tree[1], str): + return tree[1] not in hashtags + elif isinstance(tree[1], list): + return not hashtagRuleResolve(tree[1], hashtags, + moderated, content, url) + return False + + +def _hashtagLogicalContains(tree: [], hashtags: [], moderated: bool, + content: str, url: str) -> bool: + """ Contains + """ + if len(tree) != 2: + return False + matchStr = None + if isinstance(tree[1], str): + matchStr = tree[1] + elif isinstance(tree[1], list): + matchStr = tree[1][0] + if matchStr: + if matchStr.startswith('"') and matchStr.endswith('"'): + matchStr = matchStr[1:] + matchStr = matchStr[:len(matchStr) - 1] + matchStrLower = matchStr.lower() + contentWithoutTags = content.replace('#' + matchStrLower, '') + return matchStrLower in contentWithoutTags + return False + + +def _hashtagLogicalFrom(tree: [], hashtags: [], moderated: bool, + content: str, url: str) -> bool: + """ FROM + """ + if len(tree) != 2: + return False + matchStr = None + if isinstance(tree[1], str): + matchStr = tree[1] + elif isinstance(tree[1], list): + matchStr = tree[1][0] + if matchStr: + if matchStr.startswith('"') and matchStr.endswith('"'): + matchStr = matchStr[1:] + matchStr = matchStr[:len(matchStr) - 1] + return matchStr.lower() in url + return False + + +def _hashtagLogicalAnd(tree: [], hashtags: [], moderated: bool, + content: str, url: str) -> bool: + """ AND + """ + if len(tree) < 3: + return False + for argIndex in range(1, len(tree)): + argValue = False + if isinstance(tree[argIndex], str): + argValue = (tree[argIndex] in hashtags) + elif isinstance(tree[argIndex], list): + argValue = hashtagRuleResolve(tree[argIndex], + hashtags, moderated, + content, url) + if not argValue: + return False + return True + + +def _hashtagLogicalOr(tree: [], hashtags: [], moderated: bool, + content: str, url: str) -> bool: + """ OR + """ + if len(tree) < 3: + return False + for argIndex in range(1, len(tree)): + argValue = False + if isinstance(tree[argIndex], str): + argValue = (tree[argIndex] in hashtags) + elif isinstance(tree[argIndex], list): + argValue = hashtagRuleResolve(tree[argIndex], + hashtags, moderated, + content, url) + if argValue: + return True + return False + + +def _hashtagLogicalXor(tree: [], hashtags: [], moderated: bool, + content: str, url: str) -> bool: + """ XOR + """ + if len(tree) < 3: + return False + trueCtr = 0 + for argIndex in range(1, len(tree)): + argValue = False + if isinstance(tree[argIndex], str): + argValue = (tree[argIndex] in hashtags) + elif isinstance(tree[argIndex], list): + argValue = hashtagRuleResolve(tree[argIndex], + hashtags, moderated, + content, url) + if argValue: + trueCtr += 1 + if trueCtr == 1: + return True + return False + + def hashtagRuleResolve(tree: [], hashtags: [], moderated: bool, content: str, url: str) -> bool: """Returns whether the tree for a hashtag rule evaluates to true or false @@ -82,79 +196,17 @@ def hashtagRuleResolve(tree: [], hashtags: [], moderated: bool, return False if tree[0] == 'not': - if len(tree) == 2: - if isinstance(tree[1], str): - return tree[1] not in hashtags - elif isinstance(tree[1], list): - return not hashtagRuleResolve(tree[1], hashtags, moderated, - content, url) + return _hashtagLogicalNot(tree, hashtags, moderated, content, url) elif tree[0] == 'contains': - if len(tree) == 2: - matchStr = None - if isinstance(tree[1], str): - matchStr = tree[1] - elif isinstance(tree[1], list): - matchStr = tree[1][0] - if matchStr: - if matchStr.startswith('"') and matchStr.endswith('"'): - matchStr = matchStr[1:] - matchStr = matchStr[:len(matchStr) - 1] - matchStrLower = matchStr.lower() - contentWithoutTags = content.replace('#' + matchStrLower, '') - return matchStrLower in contentWithoutTags + return _hashtagLogicalContains(tree, hashtags, moderated, content, url) elif tree[0] == 'from': - if len(tree) == 2: - matchStr = None - if isinstance(tree[1], str): - matchStr = tree[1] - elif isinstance(tree[1], list): - matchStr = tree[1][0] - if matchStr: - if matchStr.startswith('"') and matchStr.endswith('"'): - matchStr = matchStr[1:] - matchStr = matchStr[:len(matchStr) - 1] - return matchStr.lower() in url + return _hashtagLogicalFrom(tree, hashtags, moderated, content, url) elif tree[0] == 'and': - if len(tree) >= 3: - for argIndex in range(1, len(tree)): - argValue = False - if isinstance(tree[argIndex], str): - argValue = (tree[argIndex] in hashtags) - elif isinstance(tree[argIndex], list): - argValue = hashtagRuleResolve(tree[argIndex], - hashtags, moderated, - content, url) - if not argValue: - return False - return True + return _hashtagLogicalAnd(tree, hashtags, moderated, content, url) elif tree[0] == 'or': - if len(tree) >= 3: - for argIndex in range(1, len(tree)): - argValue = False - if isinstance(tree[argIndex], str): - argValue = (tree[argIndex] in hashtags) - elif isinstance(tree[argIndex], list): - argValue = hashtagRuleResolve(tree[argIndex], - hashtags, moderated, - content, url) - if argValue: - return True - return False + return _hashtagLogicalOr(tree, hashtags, moderated, content, url) elif tree[0] == 'xor': - if len(tree) >= 3: - trueCtr = 0 - for argIndex in range(1, len(tree)): - argValue = False - if isinstance(tree[argIndex], str): - argValue = (tree[argIndex] in hashtags) - elif isinstance(tree[argIndex], list): - argValue = hashtagRuleResolve(tree[argIndex], - hashtags, moderated, - content, url) - if argValue: - trueCtr += 1 - if trueCtr == 1: - return True + return _hashtagLogicalXor(tree, hashtags, moderated, content, url) elif tree[0].startswith('#') and len(tree) == 1: return tree[0] in hashtags elif tree[0].startswith('moderated'): From 8514d6f60b63b81a36dd0faa1c65e035e6b4d699 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 4 Jul 2021 10:46:48 +0100 Subject: [PATCH 1342/1416] Tidying of hashtag rule actions --- newsdaemon.py | 166 +++++++++++++++++++++++++++----------------------- 1 file changed, 90 insertions(+), 76 deletions(-) diff --git a/newsdaemon.py b/newsdaemon.py index b9b0633aa..ffb5a5abf 100644 --- a/newsdaemon.py +++ b/newsdaemon.py @@ -277,6 +277,87 @@ def hashtagRuleTree(operators: [], return tree +def _hashtagAdd(baseDir: str, httpPrefix: str, domainFull: str, + postJsonObject: {}, + actionStr: str, hashtags: []) -> None: + """Adds a hashtag via a hashtag rule + """ + addHashtag = actionStr.split('add ', 1)[1].strip() + if not addHashtag.startswith('#'): + return + + if addHashtag not in hashtags: + hashtags.append(addHashtag) + htId = addHashtag.replace('#', '') + if not validHashTag(htId): + return + + hashtagUrl = httpPrefix + "://" + domainFull + "/tags/" + htId + newTag = { + 'href': hashtagUrl, + 'name': addHashtag, + 'type': 'Hashtag' + } + # does the tag already exist? + addTagObject = None + for t in postJsonObject['object']['tag']: + if t.get('type') and t.get('name'): + if t['type'] == 'Hashtag' and \ + t['name'] == addHashtag: + addTagObject = t + break + # append the tag if it wasn't found + if not addTagObject: + postJsonObject['object']['tag'].append(newTag) + # add corresponding html to the post content + hashtagHtml = \ + " #" + htId + "" + content = postJsonObject['object']['content'] + if hashtagHtml in content: + return + + if content.endswith('

'): + content = \ + content[:len(content) - len('

')] + \ + hashtagHtml + '

' + else: + content += hashtagHtml + postJsonObject['object']['content'] = content + storeHashTags(baseDir, 'news', postJsonObject) + + +def _hashtagRemove(httpPrefix: str, domainFull: str, postJsonObject: {}, + actionStr: str, hashtags: []) -> None: + """Removes a hashtag via a hashtag rule + """ + rmHashtag = actionStr.split('remove ', 1)[1].strip() + if not rmHashtag.startswith('#'): + return + + if rmHashtag in hashtags: + hashtags.remove(rmHashtag) + htId = rmHashtag.replace('#', '') + hashtagUrl = httpPrefix + "://" + domainFull + "/tags/" + htId + # remove tag html from the post content + hashtagHtml = \ + "#" + htId + "" + content = postJsonObject['object']['content'] + if hashtagHtml in content: + content = content.replace(hashtagHtml, '').replace(' ', ' ') + postJsonObject['object']['content'] = content + rmTagObject = None + for t in postJsonObject['object']['tag']: + if t.get('type') and t.get('name'): + if t['type'] == 'Hashtag' and \ + t['name'] == rmHashtag: + rmTagObject = t + break + if rmTagObject: + postJsonObject['object']['tag'].remove(rmTagObject) + + def _newswireHashtagProcessing(session, baseDir: str, postJsonObject: {}, hashtags: [], httpPrefix: str, domain: str, port: int, @@ -325,83 +406,16 @@ def _newswireHashtagProcessing(session, baseDir: str, postJsonObject: {}, # the condition matches, so do something actionStr = ruleStr.split(' then ')[1].strip() - # add a hashtag if actionStr.startswith('add '): - addHashtag = actionStr.split('add ', 1)[1].strip() - if addHashtag.startswith('#'): - if addHashtag not in hashtags: - hashtags.append(addHashtag) - htId = addHashtag.replace('#', '') - if validHashTag(htId): - hashtagUrl = \ - httpPrefix + "://" + domainFull + "/tags/" + htId - newTag = { - 'href': hashtagUrl, - 'name': addHashtag, - 'type': 'Hashtag' - } - # does the tag already exist? - addTagObject = None - for t in postJsonObject['object']['tag']: - if t.get('type') and t.get('name'): - if t['type'] == 'Hashtag' and \ - t['name'] == addHashtag: - addTagObject = t - break - # append the tag if it wasn't found - if not addTagObject: - postJsonObject['object']['tag'].append(newTag) - # add corresponding html to the post content - hashtagHtml = \ - " #" + \ - htId + "" - content = postJsonObject['object']['content'] - if hashtagHtml not in content: - if content.endswith('

'): - content = \ - content[:len(content) - len('

')] + \ - hashtagHtml + '

' - else: - content += hashtagHtml - postJsonObject['object']['content'] = content - storeHashTags(baseDir, 'news', postJsonObject) - # actionOccurred = True - - # remove a hashtag - if actionStr.startswith('remove '): - rmHashtag = actionStr.split('remove ', 1)[1].strip() - if rmHashtag.startswith('#'): - if rmHashtag in hashtags: - hashtags.remove(rmHashtag) - htId = rmHashtag.replace('#', '') - hashtagUrl = \ - httpPrefix + "://" + domainFull + "/tags/" + htId - # remove tag html from the post content - hashtagHtml = \ - "#" + \ - htId + "" - content = postJsonObject['object']['content'] - if hashtagHtml in content: - content = \ - content.replace(hashtagHtml, '').replace(' ', ' ') - postJsonObject['object']['content'] = content - rmTagObject = None - for t in postJsonObject['object']['tag']: - if t.get('type') and t.get('name'): - if t['type'] == 'Hashtag' and \ - t['name'] == rmHashtag: - rmTagObject = t - break - if rmTagObject: - postJsonObject['object']['tag'].remove(rmTagObject) - # actionOccurred = True - - # Block this item - if actionStr.startswith('block') or actionStr.startswith('drop'): + # add a hashtag + _hashtagAdd(baseDir, httpPrefix, domainFull, + postJsonObject, actionStr, hashtags) + elif actionStr.startswith('remove '): + # remove a hashtag + _hashtagRemove(httpPrefix, domainFull, postJsonObject, + actionStr, hashtags) + elif actionStr.startswith('block') or actionStr.startswith('drop'): + # Block this item return False return True From bc679d8b0acac0452465f6d0d7b4261b839c0e27 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 4 Jul 2021 10:50:09 +0100 Subject: [PATCH 1343/1416] Tidy rss strings --- newswire.py | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/newswire.py b/newswire.py index 57b37eb69..427f7a151 100644 --- a/newswire.py +++ b/newswire.py @@ -47,21 +47,25 @@ def rss2Header(httpPrefix: str, title: str, translate: {}) -> str: """Header for an RSS 2.0 feed """ - rssStr = "" - rssStr += "" - rssStr += '' + rssStr = \ + "" + \ + "" + \ + '' if title.startswith('News'): - rssStr += ' Newswire' - rssStr += ' ' + httpPrefix + '://' + domainFull + \ + rssStr += \ + ' Newswire' + \ + ' ' + httpPrefix + '://' + domainFull + \ '/newswire.xml' + '' elif title.startswith('Site'): - rssStr += ' ' + domainFull + '' - rssStr += ' ' + httpPrefix + '://' + domainFull + \ + rssStr += \ + ' ' + domainFull + '' + \ + ' ' + httpPrefix + '://' + domainFull + \ '/blog/rss.xml' + '' else: - rssStr += ' ' + translate[title] + '' - rssStr += ' ' + httpPrefix + '://' + domainFull + \ + rssStr += \ + ' ' + translate[title] + '' + \ + ' ' + httpPrefix + '://' + domainFull + \ '/users/' + nickname + '/rss.xml' + '' return rssStr @@ -69,8 +73,7 @@ def rss2Header(httpPrefix: str, def rss2Footer() -> str: """Footer for an RSS 2.0 feed """ - rssStr = '' - rssStr += '' + rssStr = '' return rssStr From 751a0f1f0246e04adaf9ca2571621b44c0f8af6e Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 4 Jul 2021 12:02:08 +0100 Subject: [PATCH 1344/1416] Duplicate permitted outbox types --- newswire.py | 10 ++++++---- outbox.py | 3 +-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/newswire.py b/newswire.py index 427f7a151..544d17577 100644 --- a/newswire.py +++ b/newswire.py @@ -818,8 +818,9 @@ def getRSSfromDict(baseDir: str, newswire: {}, except Exception as e: print('WARN: Unable to convert date ' + published + ' ' + str(e)) continue - rssStr += '\n' - rssStr += ' ' + fields[0] + '\n' + rssStr += \ + '\n' + \ + ' ' + fields[0] + '\n' description = removeHtml(firstParagraphFromString(fields[4])) rssStr += ' ' + description + '\n' url = fields[1] @@ -829,8 +830,9 @@ def getRSSfromDict(baseDir: str, newswire: {}, rssStr += ' ' + url + '\n' rssDateStr = pubDate.strftime("%a, %d %b %Y %H:%M:%S UT") - rssStr += ' ' + rssDateStr + '\n' - rssStr += '\n' + rssStr += \ + ' ' + rssDateStr + '\n' + \ + '\n' rssStr += rss2Footer() return rssStr diff --git a/outbox.py b/outbox.py index 156de5ace..69d5acaab 100644 --- a/outbox.py +++ b/outbox.py @@ -311,8 +311,7 @@ def postMessageToOutbox(session, translate: {}, permittedOutboxTypes = ('Create', 'Announce', 'Like', 'Follow', 'Undo', 'Update', 'Add', 'Remove', 'Block', 'Delete', - 'Skill', 'Add', 'Remove', 'Event', - 'Ignore') + 'Skill', 'Ignore') if messageJson['type'] not in permittedOutboxTypes: if debug: print('DEBUG: POST to outbox - ' + messageJson['type'] + From 3914cccfb07cb0ed61a392aeae1d04927c75d91e Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 4 Jul 2021 12:11:15 +0100 Subject: [PATCH 1345/1416] Indexed activities --- outbox.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/outbox.py b/outbox.py index 69d5acaab..779c92da0 100644 --- a/outbox.py +++ b/outbox.py @@ -368,14 +368,12 @@ def postMessageToOutbox(session, translate: {}, if os.path.isfile(citationsFilename): os.remove(citationsFilename) - if messageJson['type'] == 'Create' or \ - messageJson['type'] == 'Question' or \ - messageJson['type'] == 'Note' or \ - messageJson['type'] == 'EncryptedMessage' or \ - messageJson['type'] == 'Article' or \ - messageJson['type'] == 'Event' or \ - messageJson['type'] == 'Patch' or \ - messageJson['type'] == 'Announce': + # The following activity types get added to the index files + indexedActivities = ( + 'Create', 'Question', 'Note', 'EncryptedMessage', 'Article', + 'Patch', 'Announce' + ) + if messageJson['type'] in indexedActivities: indexes = [outboxName, "inbox"] selfActor = \ httpPrefix + '://' + domainFull + '/users/' + postToNickname From e1a90cd3194c7fa8acb298e2618b2e6f267c28d9 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 4 Jul 2021 12:15:26 +0100 Subject: [PATCH 1346/1416] Checking for image extensions --- person.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/person.py b/person.py index ce426680f..4e76f6f00 100644 --- a/person.py +++ b/person.py @@ -49,6 +49,7 @@ from utils import refreshNewswire from utils import getProtocolPrefixes from utils import hasUsersPath from utils import getImageExtensions +from utils import isImageFile from session import createSession from session import getJson from webfinger import webfingerHandle @@ -84,11 +85,7 @@ def setProfileImage(baseDir: str, httpPrefix: str, nickname: str, domain: str, image for the given person """ imageFilename = imageFilename.replace('\n', '').replace('\r', '') - if not (imageFilename.endswith('.png') or - imageFilename.endswith('.jpg') or - imageFilename.endswith('.jpeg') or - imageFilename.endswith('.svg') or - imageFilename.endswith('.gif')): + if not isImageFile(imageFilename): print('Profile image must be png, jpg, gif or svg format') return False From a6cda457b58dc7b0ba86802a332eb49233aef460 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 4 Jul 2021 12:39:13 +0100 Subject: [PATCH 1347/1416] Tidying --- person.py | 82 +++++++++++++++++++++++++------------------------------ 1 file changed, 37 insertions(+), 45 deletions(-) diff --git a/person.py b/person.py index 4e76f6f00..f0db12612 100644 --- a/person.py +++ b/person.py @@ -116,10 +116,16 @@ def setProfileImage(baseDir: str, httpPrefix: str, nickname: str, domain: str, imageFilename.endswith('.jpeg'): mediaType = 'image/jpeg' iconFilename = iconFilenameBase + '.jpg' - if imageFilename.endswith('.gif'): + elif imageFilename.endswith('.gif'): mediaType = 'image/gif' iconFilename = iconFilenameBase + '.gif' - if imageFilename.endswith('.svg'): + elif imageFilename.endswith('.webp'): + mediaType = 'image/webp' + iconFilename = iconFilenameBase + '.webp' + elif imageFilename.endswith('.avif'): + mediaType = 'image/avif' + iconFilename = iconFilenameBase + '.avif' + elif imageFilename.endswith('.svg'): mediaType = 'image/svg+xml' iconFilename = iconFilenameBase + '.svg' profileFilename = baseDir + '/accounts/' + handle + '/' + iconFilename @@ -590,17 +596,15 @@ def personUpgradeActor(baseDir: str, personJson: {}, # if the older skills format is being used then switch # to the new one if not personJson.get('hasOccupation'): - personJson['hasOccupation'] = [ - { - '@type': 'Occupation', - 'name': occupationName, - "occupationLocation": { - "@type": "City", - "name": "Fediverse" - }, - 'skills': [] - } - ] + personJson['hasOccupation'] = [{ + '@type': 'Occupation', + 'name': occupationName, + "occupationLocation": { + "@type": "City", + "name": "Fediverse" + }, + 'skills': [] + }] updateActor = True # remove the old skills format @@ -615,17 +619,15 @@ def personUpgradeActor(baseDir: str, personJson: {}, updateActor = True if not isinstance(personJson['hasOccupation'], list): - personJson['hasOccupation'] = [ - { - '@type': 'Occupation', - 'name': occupationName, - 'occupationLocation': { - '@type': 'City', - 'name': 'Fediverse' - }, - 'skills': [] - } - ] + personJson['hasOccupation'] = [{ + '@type': 'Occupation', + 'name': occupationName, + 'occupationLocation': { + '@type': 'City', + 'name': 'Fediverse' + }, + 'skills': [] + }] updateActor = True else: # add location if it is missing @@ -1209,27 +1211,17 @@ def getActorJson(hostDomain: str, handle: str, http: bool, gnunet: bool, for prefix in prefixes: handle = handle.replace(prefix, '') handle = handle.replace('/@', '/users/') - if '/users/' in handle: - nickname = handle.split('/users/')[1] - nickname = nickname.replace('\n', '').replace('\r', '') - domain = handle.split('/users/')[0] - elif '/profile/' in handle: - nickname = handle.split('/profile/')[1] - nickname = nickname.replace('\n', '').replace('\r', '') - domain = handle.split('/profile/')[0] - elif '/channel/' in handle: - nickname = handle.split('/channel/')[1] - nickname = nickname.replace('\n', '').replace('\r', '') - domain = handle.split('/channel/')[0] - elif '/accounts/' in handle: - nickname = handle.split('/accounts/')[1] - nickname = nickname.replace('\n', '').replace('\r', '') - domain = handle.split('/accounts/')[0] - elif '/u/' in handle: - nickname = handle.split('/u/')[1] - nickname = nickname.replace('\n', '').replace('\r', '') - domain = handle.split('/u/')[0] - elif '://' in originalHandle: + paths = ( + '/users/', '/profile/', '/channel/', '/accounts/', '/u/' + ) + userPathFound = False + for userPath in paths: + if userPath in handle: + nickname = handle.split(userPath)[1] + nickname = nickname.replace('\n', '').replace('\r', '') + domain = handle.split(userPath)[0] + break + if not userPathFound and '://' in originalHandle: domain = originalHandle.split('://')[1] if '/' in domain: domain = domain.split('/')[0] From a06186b26e991753945fa5ff96c64de0757674fd Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 4 Jul 2021 13:50:42 +0100 Subject: [PATCH 1348/1416] Tidying --- posts.py | 100 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 55 insertions(+), 45 deletions(-) diff --git a/posts.py b/posts.py index 0751b9048..fa0f2c682 100644 --- a/posts.py +++ b/posts.py @@ -492,9 +492,9 @@ def _updateWordFrequency(content: str, wordFrequency: {}) -> None: that they appear """ plainText = removeHtml(content) - plainText = plainText.replace('.', ' ') - plainText = plainText.replace(';', ' ') - plainText = plainText.replace('?', ' ') + removeChars = ('.', ';', '?') + for ch in removeChars: + plainText = plainText.replace(ch, ' ') wordsList = plainText.split(' ') commonWords = ( 'that', 'some', 'about', 'then', 'they', 'were', @@ -1656,29 +1656,30 @@ def getMentionedPeople(baseDir: str, httpPrefix: str, mentions = [] words = content.split(' ') for wrd in words: - if wrd.startswith('@'): - handle = wrd[1:] - if debug: - print('DEBUG: mentioned handle ' + handle) - if '@' not in handle: - handle = handle + '@' + domain - if not os.path.isdir(baseDir + '/accounts/' + handle): - continue - else: - externalDomain = handle.split('@')[1] - if not ('.' in externalDomain or - externalDomain == 'localhost'): - continue - mentionedNickname = handle.split('@')[0] - mentionedDomain = handle.split('@')[1].strip('\n').strip('\r') - if ':' in mentionedDomain: - mentionedDomain = removeDomainPort(mentionedDomain) - if not validNickname(mentionedDomain, mentionedNickname): + if not wrd.startswith('@'): + continue + handle = wrd[1:] + if debug: + print('DEBUG: mentioned handle ' + handle) + if '@' not in handle: + handle = handle + '@' + domain + if not os.path.isdir(baseDir + '/accounts/' + handle): continue - actor = \ - httpPrefix + '://' + handle.split('@')[1] + \ - '/users/' + mentionedNickname - mentions.append(actor) + else: + externalDomain = handle.split('@')[1] + if not ('.' in externalDomain or + externalDomain == 'localhost'): + continue + mentionedNickname = handle.split('@')[0] + mentionedDomain = handle.split('@')[1].strip('\n').strip('\r') + if ':' in mentionedDomain: + mentionedDomain = removeDomainPort(mentionedDomain) + if not validNickname(mentionedDomain, mentionedNickname): + continue + actor = \ + httpPrefix + '://' + handle.split('@')[1] + \ + '/users/' + mentionedNickname + mentions.append(actor) return mentions @@ -2140,14 +2141,15 @@ def groupFollowersByDomain(baseDir: str, nickname: str, domain: str) -> {}: grouped = {} with open(followersFilename, "r") as f: for followerHandle in f: - if '@' in followerHandle: - fHandle = \ - followerHandle.strip().replace('\n', '').replace('\r', '') - followerDomain = fHandle.split('@')[1] - if not grouped.get(followerDomain): - grouped[followerDomain] = [fHandle] - else: - grouped[followerDomain].append(fHandle) + if '@' not in followerHandle: + continue + fHandle = \ + followerHandle.strip().replace('\n', '').replace('\r', '') + followerDomain = fHandle.split('@')[1] + if not grouped.get(followerDomain): + grouped[followerDomain] = [fHandle] + else: + grouped[followerDomain].append(fHandle) return grouped @@ -2174,9 +2176,9 @@ def _addFollowersToPublicPost(postJsonObject: {}) -> None: return if len(postJsonObject['object']['to']) > 1: return - if len(postJsonObject['object']['to']) == 0: + elif len(postJsonObject['object']['to']) == 0: return - if not postJsonObject['object']['to'][0].endswith('#Public'): + elif not postJsonObject['object']['to'][0].endswith('#Public'): return if postJsonObject['object'].get('cc'): return @@ -2403,6 +2405,20 @@ def addToField(activityType: str, postJsonObject: {}, return postJsonObject, False +def _isProfileUpdate(postJsonObject: {}) -> bool: + """Is the given post a profile update? + for actor updates there is no 'to' within the object + """ + if postJsonObject['object'].get('type') and postJsonObject.get('type'): + if (postJsonObject['type'] == 'Update' and + (postJsonObject['object']['type'] == 'Person' or + postJsonObject['object']['type'] == 'Application' or + postJsonObject['object']['type'] == 'Group' or + postJsonObject['object']['type'] == 'Service')): + return True + return False + + def sendToNamedAddresses(session, baseDir: str, nickname: str, domain: str, onionDomain: str, i2pDomain: str, port: int, @@ -2420,16 +2436,10 @@ def sendToNamedAddresses(session, baseDir: str, return isProfileUpdate = False if isinstance(postJsonObject['object'], dict): - # for actor updates there is no 'to' within the object - if postJsonObject['object'].get('type') and postJsonObject.get('type'): - if (postJsonObject['type'] == 'Update' and - (postJsonObject['object']['type'] == 'Person' or - postJsonObject['object']['type'] == 'Application' or - postJsonObject['object']['type'] == 'Group' or - postJsonObject['object']['type'] == 'Service')): - # use the original object, which has a 'to' - recipientsObject = postJsonObject - isProfileUpdate = True + if _isProfileUpdate(postJsonObject): + # use the original object, which has a 'to' + recipientsObject = postJsonObject + isProfileUpdate = True if not isProfileUpdate: if not postJsonObject['object'].get('to'): From e30829416d284ab77a8ed70630113fe3785c7c28 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 4 Jul 2021 18:14:18 +0100 Subject: [PATCH 1349/1416] Comment --- roles.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/roles.py b/roles.py index 7fb00e38a..7a9a2a569 100644 --- a/roles.py +++ b/roles.py @@ -91,10 +91,11 @@ def _addRole(baseDir: str, nickname: str, domain: str, with open(roleFile, 'w+') as f: for roleNickname in lines: roleNickname = roleNickname.strip('\n').strip('\r') - if len(roleNickname) > 1: - if os.path.isdir(baseDir + '/accounts/' + - roleNickname + '@' + domain): - f.write(roleNickname + '\n') + if len(roleNickname) < 2: + continue + if os.path.isdir(baseDir + '/accounts/' + + roleNickname + '@' + domain): + f.write(roleNickname + '\n') else: with open(roleFile, "w+") as f: if os.path.isdir(baseDir + '/accounts/' + @@ -126,6 +127,7 @@ def _setActorRole(actorJson: {}, roleName: str) -> bool: if not isinstance(actorJson['hasOccupation'], list): return False + # occupation category from www.onetonline.org category = None if 'admin' in roleName: category = '15-1299.01' @@ -228,8 +230,7 @@ def setRole(baseDir: str, nickname: str, domain: str, # avoid giant strings if len(role) > 128: return False - actorFilename = baseDir + '/accounts/' + \ - nickname + '@' + domain + '.json' + actorFilename = baseDir + '/accounts/' + nickname + '@' + domain + '.json' if not os.path.isfile(actorFilename): return False From 83b1bfb29339327c3ee6d3143cc0c7260beb92e1 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 4 Jul 2021 18:55:29 +0100 Subject: [PATCH 1350/1416] Tidying --- newswire.py | 5 ++--- schedule.py | 9 ++++----- session.py | 15 ++++++++------- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/newswire.py b/newswire.py index 544d17577..dca813fb2 100644 --- a/newswire.py +++ b/newswire.py @@ -27,6 +27,7 @@ from utils import saveJson from utils import isSuspended from utils import containsInvalidChars from utils import removeHtml +from utils import isAccountDir from blocking import isBlockedDomain from blocking import isBlockedHashtag from filters import isFiltered @@ -964,9 +965,7 @@ def _addBlogsToNewswire(baseDir: str, domain: str, newswire: {}, # go through each account for subdir, dirs, files in os.walk(baseDir + '/accounts'): for handle in dirs: - if '@' not in handle: - continue - if 'inbox@' in handle or 'news@' in handle: + if not isAccountDir(handle): continue nickname = handle.split('@')[0] diff --git a/schedule.py b/schedule.py index 4aaaa026d..3e3543384 100644 --- a/schedule.py +++ b/schedule.py @@ -13,6 +13,7 @@ import datetime from utils import hasObjectDict from utils import getStatusNumber from utils import loadJson +from utils import isAccountDir from outbox import postMessageToOutbox @@ -116,8 +117,8 @@ def _updatePostSchedule(baseDir: str, handle: str, httpd, continue # move to the outbox - outboxPostFilename = \ - postFilename.replace('/scheduled/', '/outbox/') + outboxPostFilename = postFilename.replace('/scheduled/', + '/outbox/') os.rename(postFilename, outboxPostFilename) print('Scheduled post sent ' + postId) @@ -144,9 +145,7 @@ def runPostSchedule(baseDir: str, httpd, maxScheduledPosts: int): for account in dirs: if '@' not in account: continue - if account.startswith('inbox@'): - continue - if account.startswith('news@'): + if not isAccountDir(account): continue # scheduled posts index for this account scheduleIndexFilename = \ diff --git a/session.py b/session.py index f6ccfbb3a..0790b898f 100644 --- a/session.py +++ b/session.py @@ -10,6 +10,7 @@ __module_group__ = "Core" import os import requests from utils import urlPermitted +from utils import isImageFile import json from socket import error as SocketError import errno @@ -257,11 +258,7 @@ def postImage(session, attachImageFilename: str, federationList: [], print('postJson: ' + inboxUrl + ' not permitted') return None - if not (attachImageFilename.endswith('.jpg') or - attachImageFilename.endswith('.jpeg') or - attachImageFilename.endswith('.png') or - attachImageFilename.endswith('.svg') or - attachImageFilename.endswith('.gif')): + if not isImageFile(attachImageFilename): print('Image must be png, jpg, gif or svg') return None if not os.path.isfile(attachImageFilename): @@ -270,9 +267,13 @@ def postImage(session, attachImageFilename: str, federationList: [], contentType = 'image/jpeg' if attachImageFilename.endswith('.png'): contentType = 'image/png' - if attachImageFilename.endswith('.gif'): + elif attachImageFilename.endswith('.gif'): contentType = 'image/gif' - if attachImageFilename.endswith('.svg'): + elif attachImageFilename.endswith('.webp'): + contentType = 'image/webp' + elif attachImageFilename.endswith('.avif'): + contentType = 'image/avif' + elif attachImageFilename.endswith('.svg'): contentType = 'image/svg+xml' headers['Content-type'] = contentType From 4697de88c0025bf4f853e9f7bb0c919d208c8333 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 4 Jul 2021 19:01:31 +0100 Subject: [PATCH 1351/1416] Detect account directories --- session.py | 2 +- shares.py | 24 +++++++++++++----------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/session.py b/session.py index 0790b898f..7e48cde5a 100644 --- a/session.py +++ b/session.py @@ -259,7 +259,7 @@ def postImage(session, attachImageFilename: str, federationList: [], return None if not isImageFile(attachImageFilename): - print('Image must be png, jpg, gif or svg') + print('Image must be png, jpg, webp, avif, gif or svg') return None if not os.path.isfile(attachImageFilename): print('Image not found: ' + attachImageFilename) diff --git a/shares.py b/shares.py index b9fac2e41..4407a3234 100644 --- a/shares.py +++ b/shares.py @@ -21,6 +21,7 @@ from utils import saveJson from utils import getImageExtensions from utils import hasObjectDict from utils import removeDomainPort +from utils import isAccountDir from media import processMetaData @@ -136,15 +137,16 @@ def addShare(baseDir: str, itemIDfile = baseDir + '/sharefiles/' + nickname + '/' + itemID formats = getImageExtensions() for ext in formats: - if imageFilename.endswith('.' + ext): - processMetaData(baseDir, nickname, domain, - imageFilename, itemIDfile + '.' + ext, - city) - if moveImage: - os.remove(imageFilename) - imageUrl = \ - httpPrefix + '://' + domainFull + \ - '/sharefiles/' + nickname + '/' + itemID + '.' + ext + if not imageFilename.endswith('.' + ext): + continue + processMetaData(baseDir, nickname, domain, + imageFilename, itemIDfile + '.' + ext, + city) + if moveImage: + os.remove(imageFilename) + imageUrl = \ + httpPrefix + '://' + domainFull + \ + '/sharefiles/' + nickname + '/' + itemID + '.' + ext sharesJson[itemID] = { "displayName": displayName, @@ -162,7 +164,7 @@ def addShare(baseDir: str, # indicate that a new share is available for subdir, dirs, files in os.walk(baseDir + '/accounts'): for handle in dirs: - if '@' not in handle: + if not isAccountDir(handle): continue accountDir = baseDir + '/accounts/' + handle newShareFile = accountDir + '/.newShare' @@ -182,7 +184,7 @@ def expireShares(baseDir: str) -> None: """ for subdir, dirs, files in os.walk(baseDir + '/accounts'): for account in dirs: - if '@' not in account: + if not isAccountDir(account): continue nickname = account.split('@')[0] domain = account.split('@')[1] From 907f3d836651058c87d1bb8a9943c5b8ce44113c Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 4 Jul 2021 20:59:08 +0100 Subject: [PATCH 1352/1416] Set flag if users path is found --- person.py | 2 ++ skills.py | 20 +++++++++----------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/person.py b/person.py index f0db12612..3e670e381 100644 --- a/person.py +++ b/person.py @@ -1220,6 +1220,7 @@ def getActorJson(hostDomain: str, handle: str, http: bool, gnunet: bool, nickname = handle.split(userPath)[1] nickname = nickname.replace('\n', '').replace('\r', '') domain = handle.split(userPath)[0] + userPathFound = True break if not userPathFound and '://' in originalHandle: domain = originalHandle.split('://')[1] @@ -1245,6 +1246,7 @@ def getActorJson(hostDomain: str, handle: str, http: bool, gnunet: bool, nickname = handle.split('@')[0] domain = handle.split('@')[1] domain = domain.replace('\n', '').replace('\r', '') + cachedWebfingers = {} proxyType = None if http or domain.endswith('.onion'): diff --git a/skills.py b/skills.py index 3d5d3f92b..db4a01a50 100644 --- a/skills.py +++ b/skills.py @@ -83,17 +83,15 @@ def setActorSkillLevel(actorJson: {}, if not actorJson: return True if not actorJson.get('hasOccupation'): - actorJson['hasOccupation'] = [ - { - '@type': 'Occupation', - 'name': '', - "occupationLocation": { - "@type": "City", - "name": "Fediverse" - }, - 'skills': [] - } - ] + actorJson['hasOccupation'] = [{ + '@type': 'Occupation', + 'name': '', + "occupationLocation": { + "@type": "City", + "name": "Fediverse" + }, + 'skills': [] + }] ocSkillsList = getOccupationSkills(actorJson) skillsDict = getSkillsFromList(ocSkillsList) if not skillsDict.get(skill): From b870a6954528ef18ea93259349cce5fb534f7b63 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 4 Jul 2021 23:46:53 +0100 Subject: [PATCH 1353/1416] Tidying --- person.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/person.py b/person.py index 3e670e381..c6fd12e49 100644 --- a/person.py +++ b/person.py @@ -1302,11 +1302,11 @@ def getActorJson(hostDomain: str, handle: str, http: bool, gnunet: bool, if not personUrl: personUrl = getUserUrl(wfRequest, 0, debug) if nickname == domain: - personUrl = personUrl.replace('/users/', '/actor/') - personUrl = personUrl.replace('/accounts/', '/actor/') - personUrl = personUrl.replace('/channel/', '/actor/') - personUrl = personUrl.replace('/profile/', '/actor/') - personUrl = personUrl.replace('/u/', '/actor/') + paths = ( + '/users/', '/accounts/', '/channel/', '/profile/', '/u/' + ) + for userPath in paths: + personUrl = personUrl.replace(userPath, '/actor/') if not personUrl: # try single user instance personUrl = httpPrefix + '://' + domain + '/' + nickname From 0335e524581a43efd63dee73c348d307e03d3140 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 4 Jul 2021 23:58:01 +0100 Subject: [PATCH 1354/1416] Function to return user paths --- follow.py | 3 ++- manualapprove.py | 3 ++- person.py | 9 +++------ utils.py | 10 ++++++++-- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/follow.py b/follow.py index 0ef1c5ce6..76129fe55 100644 --- a/follow.py +++ b/follow.py @@ -26,6 +26,7 @@ from posts import getPersonBox from utils import loadJson from utils import saveJson from utils import isAccountDir +from utils import getUserPaths from acceptreject import createAccept from acceptreject import createReject from webfinger import webfingerHandle @@ -221,7 +222,7 @@ def isFollowerOfPerson(baseDir: str, nickname: str, domain: str, if handle in followersStr: alreadyFollowing = True else: - paths = ('/profile/', '/channel/', '/accounts/', '/u/') + paths = getUserPaths() for userPath in paths: url = '://' + followerDomain + userPath + followerNickname if url in followersStr: diff --git a/manualapprove.py b/manualapprove.py index c915683ef..968b016e3 100644 --- a/manualapprove.py +++ b/manualapprove.py @@ -14,6 +14,7 @@ from follow import removeFromFollowRequests from utils import loadJson from utils import removeDomainPort from utils import getPortFromDomain +from utils import getUserPaths def manualDenyFollowRequest(session, baseDir: str, @@ -111,7 +112,7 @@ def manualApproveFollowRequest(session, baseDir: str, reqNick = approveHandle.split('@')[0] reqDomain = approveHandle.split('@')[1].strip() reqPrefix = httpPrefix + '://' + reqDomain - paths = ('/profile/', '/channel/', '/accounts/', '/u/') + paths = getUserPaths() for userPath in paths: if reqPrefix + userPath + reqNick in approveFollowsStr: exists = True diff --git a/person.py b/person.py index c6fd12e49..1f9d3cd12 100644 --- a/person.py +++ b/person.py @@ -50,6 +50,7 @@ from utils import getProtocolPrefixes from utils import hasUsersPath from utils import getImageExtensions from utils import isImageFile +from utils import getUserPaths from session import createSession from session import getJson from webfinger import webfingerHandle @@ -1211,9 +1212,7 @@ def getActorJson(hostDomain: str, handle: str, http: bool, gnunet: bool, for prefix in prefixes: handle = handle.replace(prefix, '') handle = handle.replace('/@', '/users/') - paths = ( - '/users/', '/profile/', '/channel/', '/accounts/', '/u/' - ) + paths = getUserPaths() userPathFound = False for userPath in paths: if userPath in handle: @@ -1302,9 +1301,7 @@ def getActorJson(hostDomain: str, handle: str, http: bool, gnunet: bool, if not personUrl: personUrl = getUserUrl(wfRequest, 0, debug) if nickname == domain: - paths = ( - '/users/', '/accounts/', '/channel/', '/profile/', '/u/' - ) + paths = getUserPaths() for userPath in paths: personUrl = personUrl.replace(userPath, '/actor/') if not personUrl: diff --git a/utils.py b/utils.py index 70b036cac..5aafb559c 100644 --- a/utils.py +++ b/utils.py @@ -842,7 +842,7 @@ def getNicknameFromActor(actor: str) -> str: """ if actor.startswith('@'): actor = actor[1:] - usersPaths = ('/users/', '/profile/', '/channel/', '/accounts/', '/u/') + usersPaths = getUserPaths() for possiblePath in usersPaths: if possiblePath in actor: nickStr = actor.split(possiblePath)[1].replace('@', '') @@ -872,6 +872,12 @@ def getNicknameFromActor(actor: str) -> str: return None +def getUserPaths() -> []: + """Returns possible user paths + """ + return ('/users/', '/profile/', '/accounts/', '/channel/', '/u/') + + def getDomainFromActor(actor: str) -> (str, int): """Returns the domain name from an actor url """ @@ -879,7 +885,7 @@ def getDomainFromActor(actor: str) -> (str, int): actor = actor[1:] port = None prefixes = getProtocolPrefixes() - usersPaths = ('/users/', '/profile/', '/accounts/', '/channel/', '/u/') + usersPaths = getUserPaths() for possiblePath in usersPaths: if possiblePath in actor: domain = actor.split(possiblePath)[0] From 021556ccee43f224ab4fb27207b5ac26c1b11c60 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 5 Jul 2021 10:24:29 +0100 Subject: [PATCH 1355/1416] Tidying of post deletion --- utils.py | 235 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 132 insertions(+), 103 deletions(-) diff --git a/utils.py b/utils.py index 5aafb559c..4c7adda9c 100644 --- a/utils.py +++ b/utils.py @@ -1228,125 +1228,154 @@ def _isReplyToBlogPost(baseDir: str, nickname: str, domain: str, return False +def _deletePostRemoveReplies(baseDir: str, nickname: str, domain: str, + httpPrefix: str, postFilename: str, + recentPostsCache: {}, debug: bool) -> None: + """Removes replies when deleting a post + """ + repliesFilename = postFilename.replace('.json', '.replies') + if not os.path.isfile(repliesFilename): + return + if debug: + print('DEBUG: removing replies to ' + postFilename) + with open(repliesFilename, 'r') as f: + for replyId in f: + replyFile = locatePost(baseDir, nickname, domain, replyId) + if not replyFile: + continue + if os.path.isfile(replyFile): + deletePost(baseDir, httpPrefix, + nickname, domain, replyFile, debug, + recentPostsCache) + # remove the replies file + os.remove(repliesFilename) + + +def _isBookmarked(baseDir: str, nickname: str, domain: str, + postFilename: str) -> bool: + """Returns True if the given post is bookmarked + """ + bookmarksIndexFilename = \ + baseDir + '/accounts/' + nickname + '@' + domain + \ + '/bookmarks.index' + if os.path.isfile(bookmarksIndexFilename): + bookmarkIndex = postFilename.split('/')[-1] + '\n' + if bookmarkIndex in open(bookmarksIndexFilename).read(): + return True + return False + + def deletePost(baseDir: str, httpPrefix: str, nickname: str, domain: str, postFilename: str, debug: bool, recentPostsCache: {}) -> None: """Recursively deletes a post and its replies and attachments """ postJsonObject = loadJson(postFilename, 1) - if postJsonObject: - # don't allow deletion of bookmarked posts - bookmarksIndexFilename = \ - baseDir + '/accounts/' + nickname + '@' + domain + \ - '/bookmarks.index' - if os.path.isfile(bookmarksIndexFilename): - bookmarkIndex = postFilename.split('/')[-1] + '\n' - if bookmarkIndex in open(bookmarksIndexFilename).read(): - return + if not postJsonObject: + # remove any replies + _deletePostRemoveReplies(baseDir, nickname, domain, + httpPrefix, postFilename, + recentPostsCache, debug) + # finally, remove the post itself + os.remove(postFilename) + return - # don't remove replies to blog posts - if _isReplyToBlogPost(baseDir, nickname, domain, - postJsonObject): - return + # don't allow deletion of bookmarked posts + if _isBookmarked(baseDir, nickname, domain, postFilename): + return - # remove from recent posts cache in memory - if recentPostsCache: - postId = \ - removeIdEnding(postJsonObject['id']).replace('/', '#') - if recentPostsCache.get('index'): - if postId in recentPostsCache['index']: - recentPostsCache['index'].remove(postId) - if recentPostsCache.get('json'): - if recentPostsCache['json'].get(postId): - del recentPostsCache['json'][postId] - if recentPostsCache.get('html'): - if recentPostsCache['html'].get(postId): - del recentPostsCache['html'][postId] + # don't remove replies to blog posts + if _isReplyToBlogPost(baseDir, nickname, domain, + postJsonObject): + return - # remove any attachment - _removeAttachment(baseDir, httpPrefix, domain, postJsonObject) + # remove from recent posts cache in memory + if recentPostsCache: + postId = \ + removeIdEnding(postJsonObject['id']).replace('/', '#') + if recentPostsCache.get('index'): + if postId in recentPostsCache['index']: + recentPostsCache['index'].remove(postId) + if recentPostsCache.get('json'): + if recentPostsCache['json'].get(postId): + del recentPostsCache['json'][postId] + if recentPostsCache.get('html'): + if recentPostsCache['html'].get(postId): + del recentPostsCache['html'][postId] - extensions = ('votes', 'arrived', 'muted', 'tts', 'reject') - for ext in extensions: - extFilename = postFilename + '.' + ext - if os.path.isfile(extFilename): - os.remove(extFilename) + # remove any attachment + _removeAttachment(baseDir, httpPrefix, domain, postJsonObject) - # remove cached html version of the post - cachedPostFilename = \ - getCachedPostFilename(baseDir, nickname, domain, postJsonObject) - if cachedPostFilename: - if os.path.isfile(cachedPostFilename): - os.remove(cachedPostFilename) - # removePostFromCache(postJsonObject,recentPostsCache) + extensions = ('votes', 'arrived', 'muted', 'tts', 'reject') + for ext in extensions: + extFilename = postFilename + '.' + ext + if os.path.isfile(extFilename): + os.remove(extFilename) - hasObject = False - if postJsonObject.get('object'): - hasObject = True + # remove cached html version of the post + cachedPostFilename = \ + getCachedPostFilename(baseDir, nickname, domain, postJsonObject) + if cachedPostFilename: + if os.path.isfile(cachedPostFilename): + os.remove(cachedPostFilename) + # removePostFromCache(postJsonObject,recentPostsCache) - # remove from moderation index file - if hasObject: - if isinstance(postJsonObject['object'], dict): - if postJsonObject['object'].get('moderationStatus'): - if postJsonObject.get('id'): - postId = removeIdEnding(postJsonObject['id']) - removeModerationPostFromIndex(baseDir, postId, debug) + hasObject = False + if postJsonObject.get('object'): + hasObject = True - # remove any hashtags index entries - removeHashtagIndex = False - if hasObject: - if hasObject and isinstance(postJsonObject['object'], dict): - if postJsonObject['object'].get('content'): - if '#' in postJsonObject['object']['content']: - removeHashtagIndex = True - if removeHashtagIndex: - if postJsonObject['object'].get('id') and \ - postJsonObject['object'].get('tag'): - # get the id of the post - postId = removeIdEnding(postJsonObject['object']['id']) - for tag in postJsonObject['object']['tag']: - if tag['type'] != 'Hashtag': - continue - if not tag.get('name'): - continue - # find the index file for this tag - tagIndexFilename = \ - baseDir + '/tags/' + tag['name'][1:] + '.txt' - if not os.path.isfile(tagIndexFilename): - continue - # remove postId from the tag index file - lines = None - with open(tagIndexFilename, "r") as f: - lines = f.readlines() - if lines: - newlines = '' - for fileLine in lines: - if postId in fileLine: - continue - newlines += fileLine - if not newlines.strip(): - # if there are no lines then remove the - # hashtag file - os.remove(tagIndexFilename) - else: - with open(tagIndexFilename, "w+") as f: - f.write(newlines) + # remove from moderation index file + if hasObject: + if isinstance(postJsonObject['object'], dict): + if postJsonObject['object'].get('moderationStatus'): + if postJsonObject.get('id'): + postId = removeIdEnding(postJsonObject['id']) + removeModerationPostFromIndex(baseDir, postId, debug) + + # remove any hashtags index entries + removeHashtagIndex = False + if hasObject: + if hasObject and isinstance(postJsonObject['object'], dict): + if postJsonObject['object'].get('content'): + if '#' in postJsonObject['object']['content']: + removeHashtagIndex = True + if removeHashtagIndex: + if postJsonObject['object'].get('id') and \ + postJsonObject['object'].get('tag'): + # get the id of the post + postId = removeIdEnding(postJsonObject['object']['id']) + for tag in postJsonObject['object']['tag']: + if tag['type'] != 'Hashtag': + continue + if not tag.get('name'): + continue + # find the index file for this tag + tagIndexFilename = \ + baseDir + '/tags/' + tag['name'][1:] + '.txt' + if not os.path.isfile(tagIndexFilename): + continue + # remove postId from the tag index file + lines = None + with open(tagIndexFilename, "r") as f: + lines = f.readlines() + if lines: + newlines = '' + for fileLine in lines: + if postId in fileLine: + continue + newlines += fileLine + if not newlines.strip(): + # if there are no lines then remove the + # hashtag file + os.remove(tagIndexFilename) + else: + with open(tagIndexFilename, "w+") as f: + f.write(newlines) # remove any replies - repliesFilename = postFilename.replace('.json', '.replies') - if os.path.isfile(repliesFilename): - if debug: - print('DEBUG: removing replies to ' + postFilename) - with open(repliesFilename, 'r') as f: - for replyId in f: - replyFile = locatePost(baseDir, nickname, domain, replyId) - if replyFile: - if os.path.isfile(replyFile): - deletePost(baseDir, httpPrefix, - nickname, domain, replyFile, debug, - recentPostsCache) - # remove the replies file - os.remove(repliesFilename) + _deletePostRemoveReplies(baseDir, nickname, domain, + httpPrefix, postFilename, + recentPostsCache, debug) # finally, remove the post itself os.remove(postFilename) From 4ba64797ef5111af4f3b1a98ac65e1b3820b9de1 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 5 Jul 2021 10:45:55 +0100 Subject: [PATCH 1356/1416] Tidying of post deletion --- utils.py | 137 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 82 insertions(+), 55 deletions(-) diff --git a/utils.py b/utils.py index 4c7adda9c..cc276af35 100644 --- a/utils.py +++ b/utils.py @@ -1265,6 +1265,85 @@ def _isBookmarked(baseDir: str, nickname: str, domain: str, return False +def _deleteFromRecentPosts(postJsonObject: {}, recentPostsCache: {}) -> None: + """Remove the given post from the recent posts cache + """ + if not recentPostsCache: + return + + postId = \ + removeIdEnding(postJsonObject['id']).replace('/', '#') + + if recentPostsCache.get('index'): + if postId in recentPostsCache['index']: + recentPostsCache['index'].remove(postId) + + if recentPostsCache.get('json'): + if recentPostsCache['json'].get(postId): + del recentPostsCache['json'][postId] + + if recentPostsCache.get('html'): + if recentPostsCache['html'].get(postId): + del recentPostsCache['html'][postId] + + +def _deleteCachedHtml(baseDir: str, nickname: str, domain: str, + postJsonObject: {}): + """Removes cached html file for the given post + """ + cachedPostFilename = \ + getCachedPostFilename(baseDir, nickname, domain, postJsonObject) + if cachedPostFilename: + if os.path.isfile(cachedPostFilename): + os.remove(cachedPostFilename) + + +def _deleteHashtagsOnPost(baseDir: str, postJsonObject: {}) -> None: + """Removes hashtags when a post is deleted + """ + removeHashtagIndex = False + if isinstance(postJsonObject['object'], dict): + if postJsonObject['object'].get('content'): + if '#' in postJsonObject['object']['content']: + removeHashtagIndex = True + + if not removeHashtagIndex: + return + + if not postJsonObject['object'].get('id') or \ + not postJsonObject['object'].get('tag'): + return + + # get the id of the post + postId = removeIdEnding(postJsonObject['object']['id']) + for tag in postJsonObject['object']['tag']: + if tag['type'] != 'Hashtag': + continue + if not tag.get('name'): + continue + # find the index file for this tag + tagIndexFilename = baseDir + '/tags/' + tag['name'][1:] + '.txt' + if not os.path.isfile(tagIndexFilename): + continue + # remove postId from the tag index file + lines = None + with open(tagIndexFilename, "r") as f: + lines = f.readlines() + if not lines: + continue + newlines = '' + for fileLine in lines: + if postId in fileLine: + continue + newlines += fileLine + if not newlines.strip(): + # if there are no lines then remove the hashtag file + os.remove(tagIndexFilename) + else: + with open(tagIndexFilename, "w+") as f: + f.write(newlines) + + def deletePost(baseDir: str, httpPrefix: str, nickname: str, domain: str, postFilename: str, debug: bool, recentPostsCache: {}) -> None: @@ -1290,18 +1369,7 @@ def deletePost(baseDir: str, httpPrefix: str, return # remove from recent posts cache in memory - if recentPostsCache: - postId = \ - removeIdEnding(postJsonObject['id']).replace('/', '#') - if recentPostsCache.get('index'): - if postId in recentPostsCache['index']: - recentPostsCache['index'].remove(postId) - if recentPostsCache.get('json'): - if recentPostsCache['json'].get(postId): - del recentPostsCache['json'][postId] - if recentPostsCache.get('html'): - if recentPostsCache['html'].get(postId): - del recentPostsCache['html'][postId] + _deleteFromRecentPosts(postJsonObject, recentPostsCache) # remove any attachment _removeAttachment(baseDir, httpPrefix, domain, postJsonObject) @@ -1313,12 +1381,7 @@ def deletePost(baseDir: str, httpPrefix: str, os.remove(extFilename) # remove cached html version of the post - cachedPostFilename = \ - getCachedPostFilename(baseDir, nickname, domain, postJsonObject) - if cachedPostFilename: - if os.path.isfile(cachedPostFilename): - os.remove(cachedPostFilename) - # removePostFromCache(postJsonObject,recentPostsCache) + _deleteCachedHtml(baseDir, nickname, domain, postJsonObject) hasObject = False if postJsonObject.get('object'): @@ -1333,44 +1396,8 @@ def deletePost(baseDir: str, httpPrefix: str, removeModerationPostFromIndex(baseDir, postId, debug) # remove any hashtags index entries - removeHashtagIndex = False if hasObject: - if hasObject and isinstance(postJsonObject['object'], dict): - if postJsonObject['object'].get('content'): - if '#' in postJsonObject['object']['content']: - removeHashtagIndex = True - if removeHashtagIndex: - if postJsonObject['object'].get('id') and \ - postJsonObject['object'].get('tag'): - # get the id of the post - postId = removeIdEnding(postJsonObject['object']['id']) - for tag in postJsonObject['object']['tag']: - if tag['type'] != 'Hashtag': - continue - if not tag.get('name'): - continue - # find the index file for this tag - tagIndexFilename = \ - baseDir + '/tags/' + tag['name'][1:] + '.txt' - if not os.path.isfile(tagIndexFilename): - continue - # remove postId from the tag index file - lines = None - with open(tagIndexFilename, "r") as f: - lines = f.readlines() - if lines: - newlines = '' - for fileLine in lines: - if postId in fileLine: - continue - newlines += fileLine - if not newlines.strip(): - # if there are no lines then remove the - # hashtag file - os.remove(tagIndexFilename) - else: - with open(tagIndexFilename, "w+") as f: - f.write(newlines) + _deleteHashtagsOnPost(baseDir, postJsonObject) # remove any replies _deletePostRemoveReplies(baseDir, nickname, domain, From 8ae7262e9a5952698575ec646338820f0a05fdd9 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 5 Jul 2021 10:51:07 +0100 Subject: [PATCH 1357/1416] Use function to check for dict --- utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils.py b/utils.py index cc276af35..eb4bc2c65 100644 --- a/utils.py +++ b/utils.py @@ -1302,7 +1302,7 @@ def _deleteHashtagsOnPost(baseDir: str, postJsonObject: {}) -> None: """Removes hashtags when a post is deleted """ removeHashtagIndex = False - if isinstance(postJsonObject['object'], dict): + if hasObjectDict(postJsonObject): if postJsonObject['object'].get('content'): if '#' in postJsonObject['object']['content']: removeHashtagIndex = True From 3a509400a74a7597460ea50e7a1906b1e5d0218f Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 5 Jul 2021 10:55:01 +0100 Subject: [PATCH 1358/1416] Comments --- utils.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/utils.py b/utils.py index eb4bc2c65..d2f731618 100644 --- a/utils.py +++ b/utils.py @@ -1334,12 +1334,14 @@ def _deleteHashtagsOnPost(baseDir: str, postJsonObject: {}) -> None: newlines = '' for fileLine in lines: if postId in fileLine: + # skip over the deleted post continue newlines += fileLine if not newlines.strip(): # if there are no lines then remove the hashtag file os.remove(tagIndexFilename) else: + # write the new hashtag index without the given post in it with open(tagIndexFilename, "w+") as f: f.write(newlines) From 607f54eb5bcc751fa1c41a17ff73f4f36db5590e Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 5 Jul 2021 11:09:11 +0100 Subject: [PATCH 1359/1416] Remove redundant function --- utils.py | 43 +++++++++++++++---------------------------- 1 file changed, 15 insertions(+), 28 deletions(-) diff --git a/utils.py b/utils.py index d2f731618..b8d6ae965 100644 --- a/utils.py +++ b/utils.py @@ -1265,14 +1265,24 @@ def _isBookmarked(baseDir: str, nickname: str, domain: str, return False -def _deleteFromRecentPosts(postJsonObject: {}, recentPostsCache: {}) -> None: - """Remove the given post from the recent posts cache +def removePostFromCache(postJsonObject: {}, recentPostsCache: {}) -> None: + """ if the post exists in the recent posts cache then remove it """ if not recentPostsCache: return - postId = \ - removeIdEnding(postJsonObject['id']).replace('/', '#') + if not postJsonObject.get('id'): + return + + if not recentPostsCache.get('index'): + return + + postId = postJsonObject['id'] + if '#' in postId: + postId = postId.split('#', 1)[0] + postId = removeIdEnding(postId).replace('/', '#') + if postId not in recentPostsCache['index']: + return if recentPostsCache.get('index'): if postId in recentPostsCache['index']: @@ -1371,7 +1381,7 @@ def deletePost(baseDir: str, httpPrefix: str, return # remove from recent posts cache in memory - _deleteFromRecentPosts(postJsonObject, recentPostsCache) + removePostFromCache(postJsonObject, recentPostsCache) # remove any attachment _removeAttachment(baseDir, httpPrefix, domain, postJsonObject) @@ -1607,29 +1617,6 @@ def getCachedPostFilename(baseDir: str, nickname: str, domain: str, return cachedPostFilename + '.html' -def removePostFromCache(postJsonObject: {}, recentPostsCache: {}): - """ if the post exists in the recent posts cache then remove it - """ - if not postJsonObject.get('id'): - return - - if not recentPostsCache.get('index'): - return - - postId = postJsonObject['id'] - if '#' in postId: - postId = postId.split('#', 1)[0] - postId = removeIdEnding(postId).replace('/', '#') - if postId not in recentPostsCache['index']: - return - - if recentPostsCache['json'].get(postId): - del recentPostsCache['json'][postId] - if recentPostsCache['html'].get(postId): - del recentPostsCache['html'][postId] - recentPostsCache['index'].remove(postId) - - def updateRecentPostsCache(recentPostsCache: {}, maxRecentPosts: int, postJsonObject: {}, htmlStr: str) -> None: """Store recent posts in memory so that they can be quickly recalled From 2099788bcd9059a37893c6475d64a7dbd55f7f60 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 5 Jul 2021 11:15:35 +0100 Subject: [PATCH 1360/1416] Tidying --- utils.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/utils.py b/utils.py index b8d6ae965..7a3281132 100644 --- a/utils.py +++ b/utils.py @@ -1517,11 +1517,7 @@ def noOfAccounts(baseDir: str) -> bool: accountCtr = 0 for subdir, dirs, files in os.walk(baseDir + '/accounts'): for account in dirs: - if '@' in account: - if account.startswith('inbox@'): - continue - elif account.startswith('news@'): - continue + if isAccountDir(account): accountCtr += 1 break return accountCtr From cd14cc277579f0d3faace1c71b99d1ad46a18663 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 5 Jul 2021 11:22:23 +0100 Subject: [PATCH 1361/1416] Less indentation --- utils.py | 93 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 48 insertions(+), 45 deletions(-) diff --git a/utils.py b/utils.py index 7a3281132..8e0a76df4 100644 --- a/utils.py +++ b/utils.py @@ -1800,6 +1800,7 @@ def searchBoxPosts(baseDir: str, nickname: str, domain: str, containing matching strings """ path = baseDir + '/accounts/' + nickname + '@' + domain + '/' + boxName + # is this a virtual box, such as direct messages? if not os.path.isdir(path): if os.path.isfile(path + '.index'): return _searchVirtualBoxPosts(baseDir, nickname, domain, @@ -1854,54 +1855,56 @@ def undoLikesCollectionEntry(recentPostsCache: {}, """Undoes a like for a particular actor """ postJsonObject = loadJson(postFilename) - if postJsonObject: - # remove any cached version of this post so that the - # like icon is changed - nickname = getNicknameFromActor(actor) - cachedPostFilename = getCachedPostFilename(baseDir, nickname, - domain, postJsonObject) - if cachedPostFilename: - if os.path.isfile(cachedPostFilename): - os.remove(cachedPostFilename) - removePostFromCache(postJsonObject, recentPostsCache) + if not postJsonObject: + return + # remove any cached version of this post so that the + # like icon is changed + nickname = getNicknameFromActor(actor) + cachedPostFilename = getCachedPostFilename(baseDir, nickname, + domain, postJsonObject) + if cachedPostFilename: + if os.path.isfile(cachedPostFilename): + os.remove(cachedPostFilename) + removePostFromCache(postJsonObject, recentPostsCache) - if not postJsonObject.get('type'): - return - if postJsonObject['type'] != 'Create': - return - if not hasObjectDict(postJsonObject): - if debug: - pprint(postJsonObject) - print('DEBUG: post ' + objectUrl + ' has no object') - return - if not postJsonObject['object'].get('likes'): - return - if not isinstance(postJsonObject['object']['likes'], dict): - return - if not postJsonObject['object']['likes'].get('items'): - return - totalItems = 0 - if postJsonObject['object']['likes'].get('totalItems'): - totalItems = postJsonObject['object']['likes']['totalItems'] - itemFound = False - for likeItem in postJsonObject['object']['likes']['items']: - if likeItem.get('actor'): - if likeItem['actor'] == actor: - if debug: - print('DEBUG: like was removed for ' + actor) - postJsonObject['object']['likes']['items'].remove(likeItem) - itemFound = True - break - if itemFound: - if totalItems == 1: + if not postJsonObject.get('type'): + return + if postJsonObject['type'] != 'Create': + return + if not hasObjectDict(postJsonObject): + if debug: + pprint(postJsonObject) + print('DEBUG: post ' + objectUrl + ' has no object') + return + if not postJsonObject['object'].get('likes'): + return + if not isinstance(postJsonObject['object']['likes'], dict): + return + if not postJsonObject['object']['likes'].get('items'): + return + totalItems = 0 + if postJsonObject['object']['likes'].get('totalItems'): + totalItems = postJsonObject['object']['likes']['totalItems'] + itemFound = False + for likeItem in postJsonObject['object']['likes']['items']: + if likeItem.get('actor'): + if likeItem['actor'] == actor: if debug: - print('DEBUG: likes was removed from post') - del postJsonObject['object']['likes'] - else: - itlen = len(postJsonObject['object']['likes']['items']) - postJsonObject['object']['likes']['totalItems'] = itlen + print('DEBUG: like was removed for ' + actor) + postJsonObject['object']['likes']['items'].remove(likeItem) + itemFound = True + break + if not itemFound: + return + if totalItems == 1: + if debug: + print('DEBUG: likes was removed from post') + del postJsonObject['object']['likes'] + else: + itlen = len(postJsonObject['object']['likes']['items']) + postJsonObject['object']['likes']['totalItems'] = itlen - saveJson(postJsonObject, postFilename) + saveJson(postJsonObject, postFilename) def updateLikesCollection(recentPostsCache: {}, From e8d45565b4f105b4ed8d55d18485c8d7a8245e54 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 5 Jul 2021 11:25:21 +0100 Subject: [PATCH 1362/1416] Less indentation --- utils.py | 92 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 47 insertions(+), 45 deletions(-) diff --git a/utils.py b/utils.py index 8e0a76df4..6e291f1ae 100644 --- a/utils.py +++ b/utils.py @@ -1977,54 +1977,56 @@ def undoAnnounceCollectionEntry(recentPostsCache: {}, shares of posts, not shares of physical objects. """ postJsonObject = loadJson(postFilename) - if postJsonObject: - # remove any cached version of this announce so that the announce - # icon is changed - nickname = getNicknameFromActor(actor) - cachedPostFilename = getCachedPostFilename(baseDir, nickname, domain, - postJsonObject) - if cachedPostFilename: - if os.path.isfile(cachedPostFilename): - os.remove(cachedPostFilename) - removePostFromCache(postJsonObject, recentPostsCache) + if not postJsonObject: + return + # remove any cached version of this announce so that the announce + # icon is changed + nickname = getNicknameFromActor(actor) + cachedPostFilename = getCachedPostFilename(baseDir, nickname, domain, + postJsonObject) + if cachedPostFilename: + if os.path.isfile(cachedPostFilename): + os.remove(cachedPostFilename) + removePostFromCache(postJsonObject, recentPostsCache) - if not postJsonObject.get('type'): - return - if postJsonObject['type'] != 'Create': - return - if not hasObjectDict(postJsonObject): - if debug: - pprint(postJsonObject) - print('DEBUG: post has no object') - return - if not postJsonObject['object'].get('shares'): - return - if not postJsonObject['object']['shares'].get('items'): - return - totalItems = 0 - if postJsonObject['object']['shares'].get('totalItems'): - totalItems = postJsonObject['object']['shares']['totalItems'] - itemFound = False - for announceItem in postJsonObject['object']['shares']['items']: - if announceItem.get('actor'): - if announceItem['actor'] == actor: - if debug: - print('DEBUG: Announce was removed for ' + actor) - anIt = announceItem - postJsonObject['object']['shares']['items'].remove(anIt) - itemFound = True - break - if itemFound: - if totalItems == 1: + if not postJsonObject.get('type'): + return + if postJsonObject['type'] != 'Create': + return + if not hasObjectDict(postJsonObject): + if debug: + pprint(postJsonObject) + print('DEBUG: post has no object') + return + if not postJsonObject['object'].get('shares'): + return + if not postJsonObject['object']['shares'].get('items'): + return + totalItems = 0 + if postJsonObject['object']['shares'].get('totalItems'): + totalItems = postJsonObject['object']['shares']['totalItems'] + itemFound = False + for announceItem in postJsonObject['object']['shares']['items']: + if announceItem.get('actor'): + if announceItem['actor'] == actor: if debug: - print('DEBUG: shares (announcements) ' + - 'was removed from post') - del postJsonObject['object']['shares'] - else: - itlen = len(postJsonObject['object']['shares']['items']) - postJsonObject['object']['shares']['totalItems'] = itlen + print('DEBUG: Announce was removed for ' + actor) + anIt = announceItem + postJsonObject['object']['shares']['items'].remove(anIt) + itemFound = True + break + if not itemFound: + return + if totalItems == 1: + if debug: + print('DEBUG: shares (announcements) ' + + 'was removed from post') + del postJsonObject['object']['shares'] + else: + itlen = len(postJsonObject['object']['shares']['items']) + postJsonObject['object']['shares']['totalItems'] = itlen - saveJson(postJsonObject, postFilename) + saveJson(postJsonObject, postFilename) def updateAnnounceCollection(recentPostsCache: {}, From 112f4be3825676f5240511a1f0344a1513a2b8ac Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 5 Jul 2021 12:48:20 +0100 Subject: [PATCH 1363/1416] Use with when opening files --- content.py | 7 ++----- posts.py | 4 +--- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/content.py b/content.py index 85f233767..6bf97dc80 100644 --- a/content.py +++ b/content.py @@ -995,11 +995,8 @@ def saveMediaInFormPOST(mediaBytes, debug: bool, if os.path.isfile(possibleOtherFormat): os.remove(possibleOtherFormat) - fd = open(filename, 'wb') - if not fd: - return None, None - fd.write(mediaBytes[startPos:]) - fd.close() + with open(filename, 'wb') as fp: + fp.write(mediaBytes[startPos:]) if not os.path.isfile(filename): print('WARN: Media file could not be written to file: ' + filename) diff --git a/posts.py b/posts.py index fa0f2c682..a213f7444 100644 --- a/posts.py +++ b/posts.py @@ -1348,11 +1348,9 @@ def getPinnedPostAsJson(baseDir: str, httpPrefix: str, pinnedPostJson = {} actor = httpPrefix + '://' + domainFull + '/users/' + nickname if os.path.isfile(pinnedFilename): - pinFile = open(pinnedFilename, "r") pinnedContent = None - if pinFile: + with open(pinnedFilename, "r") as pinFile: pinnedContent = pinFile.read() - pinFile.close() if pinnedContent: pinnedPostJson = { 'atomUri': actor + '/pinned', From f5ac32000a017f8dbebe8e784f023f34d708d4ad Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 5 Jul 2021 17:46:32 +0100 Subject: [PATCH 1364/1416] Tidying --- theme.py | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/theme.py b/theme.py index a700d9706..46062ca8a 100644 --- a/theme.py +++ b/theme.py @@ -366,16 +366,12 @@ def _setThemeFromDict(baseDir: str, name: str, with open(filename, 'w+') as cssfile: cssfile.write(css) - if bgParams.get('login'): - _setBackgroundFormat(baseDir, name, 'login', bgParams['login']) - if bgParams.get('follow'): - _setBackgroundFormat(baseDir, name, 'follow', bgParams['follow']) - if bgParams.get('options'): - _setBackgroundFormat(baseDir, name, 'options', bgParams['options']) - if bgParams.get('search'): - _setBackgroundFormat(baseDir, name, 'search', bgParams['search']) - if bgParams.get('welcome'): - _setBackgroundFormat(baseDir, name, 'welcome', bgParams['welcome']) + screenName = ( + 'login', 'follow', 'options', 'search', 'welcome' + ) + for s in screenName: + if bgParams.get(s): + _setBackgroundFormat(baseDir, name, s, bgParams[s]) def _setBackgroundFormat(baseDir: str, name: str, From 4facd77906b5740296c6482cf458051abe502717 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 5 Jul 2021 20:35:57 +0100 Subject: [PATCH 1365/1416] Tidying --- webapp_calendar.py | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/webapp_calendar.py b/webapp_calendar.py index 65cdb7de0..a01ffeb55 100644 --- a/webapp_calendar.py +++ b/webapp_calendar.py @@ -117,8 +117,7 @@ def _htmlCalendarDay(personCache: {}, cssCache: {}, translate: {}, if '/users/' in actor: calActor = '/users/' + actor.split('/users/')[1] - instanceTitle = \ - getConfigParam(baseDir, 'instanceTitle') + instanceTitle = getConfigParam(baseDir, 'instanceTitle') calendarStr = htmlHeaderWithExternalStyle(cssFilename, instanceTitle) calendarStr += '
\n' calendarStr += '\n' calendarStr += '\n' calendarStr += '\n' - calendarStr += ' \n' - calendarStr += ' \n' - calendarStr += ' \n' - calendarStr += ' \n' - calendarStr += ' \n' - calendarStr += ' \n' - calendarStr += ' \n' + days = ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat') + for d in days: + calendarStr += ' \n' calendarStr += '\n' calendarStr += '\n' calendarStr += '\n' From f6cbb6c3409b406b61d6acb846e602d9a2d9eb2a Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 5 Jul 2021 20:46:55 +0100 Subject: [PATCH 1366/1416] Tidying --- webapp_column_left.py | 36 +++++++++++++----------------------- 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/webapp_column_left.py b/webapp_column_left.py index eea4ace02..09b73f782 100644 --- a/webapp_column_left.py +++ b/webapp_column_left.py @@ -51,10 +51,8 @@ def _getLeftColumnShares(baseDir: str, if '<' in sharedesc or '?' in sharedesc: continue contactActor = item['actor'] - shareLink = actor + \ - '?replydm=sharedesc:' + \ - sharedesc.replace(' ', '_') + \ - '?mention=' + contactActor + shareLink = actor + '?replydm=sharedesc:' + \ + sharedesc.replace(' ', '_') + '?mention=' + contactActor linksList.append(sharedesc + ' ' + shareLink) ctr += 1 if ctr >= maxSharesInLeftColumn: @@ -89,16 +87,14 @@ def getLeftColumnContent(baseDir: str, nickname: str, domainFull: str, if os.path.isfile(leftColumnImageFilename): editImageClass = 'leftColEditImage' htmlStr += \ - '\n
\n' + \ - ' \n \n' + \ '
\n' if showBackButton: htmlStr += \ - '
' + \ - ' ' + \ + '
' + \ '\n' @@ -112,14 +108,11 @@ def getLeftColumnContent(baseDir: str, nickname: str, domainFull: str, if editor: # show the edit icon htmlStr += \ - ' ' + \ - '' + \
+            '<img class=\n' + translate['Edit Links'] + '" src="/icons/edit.png" />\n' # RSS icon if nickname != 'news': @@ -134,10 +127,8 @@ def getLeftColumnContent(baseDir: str, nickname: str, domainFull: str, else: rssTitle = translate['RSS feed for this site'] rssIconStr = \ - ' ' + \ - '' + rssTitle + \
-        '' + rssTitle + '\n' if rssIconAtTop: htmlStr += rssIconStr @@ -326,8 +317,7 @@ def htmlLinksMobile(cssCache: {}, baseDir: str, theme, accessKeys) else: if editor: - htmlStr += '


\n' - htmlStr += '
\n ' + htmlStr += '


\n
\n ' htmlStr += translate['Select the edit icon to add web links'] htmlStr += '\n
\n' @@ -376,7 +366,8 @@ def htmlEditLinks(cssCache: {}, translate: {}, baseDir: str, path: str, translate['Switch to timeline view'] + '" alt="' + \ translate['Switch to timeline view'] + '" ' + \ 'accesskey="' + accessKeys['menuTimeline'] + '">\n' - editLinksForm += '\n' + \ '\n' @@ -411,8 +402,7 @@ def htmlEditLinks(cssCache: {}, translate: {}, baseDir: str, path: str, '
' editLinksForm += \ ' ' + 'style="height:80vh" spellcheck="false">' + linksStr + '' editLinksForm += \ '
' From 5de4310b8c439cba7835ca84caab4d724ac61d37 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 5 Jul 2021 21:24:43 +0100 Subject: [PATCH 1367/1416] Tidying --- webapp_column_right.py | 9 ++-- webapp_confirm.py | 12 ++--- webapp_create_post.py | 81 +++++++++++++------------------- webapp_frontscreen.py | 33 +++++++------ webapp_hashtagswarm.py | 102 ++++++++++------------------------------- 5 files changed, 81 insertions(+), 156 deletions(-) diff --git a/webapp_column_right.py b/webapp_column_right.py index 3ea61e1c9..731ac86bf 100644 --- a/webapp_column_right.py +++ b/webapp_column_right.py @@ -253,8 +253,7 @@ def _htmlNewswire(baseDir: str, newswire: {}, nickname: str, moderator: bool, if faviconUrl: faviconLink = \ '' + 'alt="" ' + _getBrokenFavSubstitute() + '/>' moderatedItem = item[5] htmlStr += separatorStr if moderatedItem and 'vote:' + nickname in item[2]: @@ -270,8 +269,7 @@ def _htmlNewswire(baseDir: str, newswire: {}, nickname: str, moderator: bool, '' + \ '' + \ - faviconLink + title + \ - '' + totalVotesStr + faviconLink + title + '' + totalVotesStr if moderator: htmlStr += \ ' ' + dateShown + '' + \ '' + \ - faviconLink + title + '' + \ - totalVotesStr + faviconLink + title + '' + totalVotesStr htmlStr += ' ' htmlStr += dateShown + '

\n' diff --git a/webapp_confirm.py b/webapp_confirm.py index 69f0cc576..fdbdc0ff5 100644 --- a/webapp_confirm.py +++ b/webapp_confirm.py @@ -137,8 +137,7 @@ def htmlConfirmRemoveSharedItem(cssCache: {}, translate: {}, baseDir: str, if os.path.isfile(baseDir + '/follow.css'): cssFilename = baseDir + '/follow.css' - instanceTitle = \ - getConfigParam(baseDir, 'instanceTitle') + instanceTitle = getConfigParam(baseDir, 'instanceTitle') sharesStr = htmlHeaderWithExternalStyle(cssFilename, instanceTitle) sharesStr += '
\n' @@ -369,20 +368,10 @@ def htmlCalendar(personCache: {}, cssCache: {}, translate: {}, calendarStr += '
' + \ - translate['Sun'] + '' + \ - translate['Mon'] + '' + \ - translate['Tue'] + '' + \ - translate['Wed'] + '' + \ - translate['Thu'] + '' + \ - translate['Fri'] + '' + \ - translate['Sat'] + '' + \ + translate[d] + '
\n' + newPostForm += ' \n\n' newPostForm += '
\n' newPostForm += ' \n' newPostForm += replyStr @@ -777,14 +761,13 @@ def htmlNewPost(cssCache: {}, mediaInstance: bool, translate: {}, if not mediaInstance or replyStr: newPostForm += newPostImageSection - newPostForm += '
\n' newPostForm += \ + '
\n' + \ ' \n' - newPostForm += '
\n' - - newPostForm += '
\n' - newPostForm += '\n' + submitText + '">\n' + \ + '
\n' + \ + '
\n' + \ + '\n' if not reportUrl: newPostForm = \ diff --git a/webapp_frontscreen.py b/webapp_frontscreen.py index 585489077..a1c575029 100644 --- a/webapp_frontscreen.py +++ b/webapp_frontscreen.py @@ -128,22 +128,24 @@ def htmlFrontScreen(rssIconAtTop: bool, if loginButton: profileHeaderStr += '
' + loginButton + '
\n' - profileHeaderStr += '\n' - profileHeaderStr += ' \n' - profileHeaderStr += ' \n' - profileHeaderStr += ' \n' - profileHeaderStr += ' \n' - profileHeaderStr += ' \n' - profileHeaderStr += ' \n' - profileHeaderStr += ' \n' - profileHeaderStr += ' \n' + \ + ' \n' + \ + ' \n' + \ + '
\n' + profileHeaderStr += \ + '\n' + \ + ' \n' + \ + ' \n' + \ + ' \n' + \ + ' \n' + \ + ' \n' + \ + ' \n' + \ + ' \n' + \ + ' \n' - profileHeaderStr += ' \n' + \ + ' \n' - profileFooterStr += ' \n' - profileFooterStr += ' \n' - profileFooterStr += '
\n' profileHeaderStr += \ getLeftColumnContent(baseDir, 'news', domainFull, httpPrefix, translate, False, False, None, rssIconAtTop, True, True, theme, accessKeys) - profileHeaderStr += ' \n' + profileHeaderStr += \ + ' \n' profileStr = profileHeaderStr @@ -177,10 +179,11 @@ def htmlFrontScreen(rssIconAtTop: bool, False, None, False, False, False, True, authorized, True, theme, defaultTimeline, accessKeys) - profileFooterStr += '
\n' + profileFooterStr += \ + '
\n' instanceTitle = \ getConfigParam(baseDir, 'instanceTitle') diff --git a/webapp_hashtagswarm.py b/webapp_hashtagswarm.py index cab2af8b8..8cb784d8b 100644 --- a/webapp_hashtagswarm.py +++ b/webapp_hashtagswarm.py @@ -29,17 +29,19 @@ def getHashtagCategoriesFeed(baseDir: str, if not hashtagCategories: return None - rssStr = "\n" - rssStr += "\n" - rssStr += '\n' - rssStr += ' #categories\n' + rssStr = \ + "\n" + \ + "\n" + \ + '\n' + \ + ' #categories\n' rssDateStr = \ datetime.utcnow().strftime("%a, %d %b %Y %H:%M:%S UT") for categoryStr, hashtagList in hashtagCategories.items(): - rssStr += '\n' - rssStr += ' ' + categoryStr + '\n' + rssStr += \ + '\n' + \ + ' ' + categoryStr + '\n' listStr = '' for hashtag in hashtagList: if ':' in hashtag: @@ -47,75 +49,18 @@ def getHashtagCategoriesFeed(baseDir: str, if '&' in hashtag: continue listStr += hashtag + ' ' - rssStr += ' ' + listStr.strip() + '\n' - rssStr += ' \n' - rssStr += ' ' + rssDateStr + '\n' - rssStr += '\n' + rssStr += \ + ' ' + listStr.strip() + '\n' + \ + ' \n' + \ + ' ' + rssDateStr + '\n' + \ + '\n' - rssStr += '\n' - rssStr += '\n' + rssStr += \ + '\n' + \ + '\n' return rssStr -def _getHashtagDomainMax(domainHistogram: {}) -> str: - """Returns the domain with the maximum number of hashtags - """ - maxCount = 1 - maxDomain = None - for domain, count in domainHistogram.items(): - if count > maxCount: - maxDomain = domain - maxCount = count - return maxDomain - - -def _getHashtagDomainHistogram(domainHistogram: {}, translate: {}) -> str: - """Returns the html for a histogram of domains - from which hashtags are coming - """ - totalCount = 0 - for domain, count in domainHistogram.items(): - totalCount += count - if totalCount == 0: - return '' - - htmlStr = '' - histogramHeaderStr = '

\n' - histogramHeaderStr += '

' + translate['Hashtag origins'] + '

\n' - histogramHeaderStr += ' \n' - histogramHeaderStr += ' \n' - histogramHeaderStr += ' \n' - histogramHeaderStr += ' \n' - histogramHeaderStr += ' \n' - histogramHeaderStr += ' \n' - histogramHeaderStr += ' \n' - - leftColStr = '' - rightColStr = '' - - for i in range(len(domainHistogram)): - domain = _getHashtagDomainMax(domainHistogram) - if not domain: - break - percent = int(domainHistogram[domain] * 100 / totalCount) - if histogramHeaderStr: - htmlStr += histogramHeaderStr - histogramHeaderStr = None - leftColStr += str(percent) + '%
' - rightColStr += domain + '
' - del domainHistogram[domain] - - if htmlStr: - htmlStr += ' \n' - htmlStr += ' \n' - htmlStr += ' \n' - htmlStr += ' \n' - htmlStr += '
' + leftColStr + '' + rightColStr + '
\n' - htmlStr += '
\n' - - return htmlStr - - def htmlHashTagSwarm(baseDir: str, actor: str, translate: {}) -> str: """Returns a tag swarm of today's hashtags """ @@ -244,7 +189,6 @@ def htmlHashTagSwarm(baseDir: str, actor: str, translate: {}) -> str: getContentWarningButton('alltags', translate, tagSwarmStr) tagSwarmHtml = categorySwarmStr + tagSwarmStr.strip() + '\n' - # tagSwarmHtml += _getHashtagDomainHistogram(domainHistogram, translate) return tagSwarmHtml @@ -279,10 +223,11 @@ def htmlSearchHashtagCategory(cssCache: {}, translate: {}, htmlStr += '\n' - htmlStr += '' htmlStr += htmlFooter() return htmlStr From 457004794ca7b29b677695fcaae9fefd32f05869 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 6 Jul 2021 10:44:45 +0100 Subject: [PATCH 1368/1416] Function for checking url prefixes --- utils.py | 12 +++++++ webapp_headerbuttons.py | 12 +++---- webapp_login.py | 73 ++++++++++++++++++++--------------------- webapp_media.py | 66 +++++++++++++++++-------------------- 4 files changed, 81 insertions(+), 82 deletions(-) diff --git a/utils.py b/utils.py index 6e291f1ae..0d85039cb 100644 --- a/utils.py +++ b/utils.py @@ -2536,3 +2536,15 @@ def getPortFromDomain(domain: str) -> int: if portStr.isdigit(): return int(portStr) return None + + +def validUrlPrefix(url: str) -> bool: + """Does the given url have a valid prefix? + """ + if '/' not in url: + return False + prefixes = ('https:', 'http:', 'hyper:', 'i2p:', 'gnunet:') + for pre in prefixes: + if url.startswith(pre): + return True + return False diff --git a/webapp_headerbuttons.py b/webapp_headerbuttons.py index 99ab01290..a50e01da6 100644 --- a/webapp_headerbuttons.py +++ b/webapp_headerbuttons.py @@ -54,8 +54,7 @@ def headerButtonsTimeline(defaultTimeline: str, # first button if defaultTimeline == 'tlmedia': tlStr += \ - '' # add other buttons diff --git a/webapp_login.py b/webapp_login.py index 72a0f3846..45de12739 100644 --- a/webapp_login.py +++ b/webapp_login.py @@ -36,18 +36,19 @@ def htmlGetLoginCredentials(loginParams: str, password = None register = False for arg in loginArgs: - if '=' in arg: - if arg.split('=', 1)[0] == 'username': - nickname = arg.split('=', 1)[1] - if nickname.startswith('@'): - nickname = nickname[1:] - if '@' in nickname: - # the full nickname@domain has been entered - nickname = nickname.split('@')[0] - elif arg.split('=', 1)[0] == 'password': - password = arg.split('=', 1)[1] - elif arg.split('=', 1)[0] == 'register': - register = True + if '=' not in arg: + continue + if arg.split('=', 1)[0] == 'username': + nickname = arg.split('=', 1)[1] + if nickname.startswith('@'): + nickname = nickname[1:] + if '@' in nickname: + # the full nickname@domain has been entered + nickname = nickname.split('@')[0] + elif arg.split('=', 1)[0] == 'password': + password = arg.split('=', 1)[1] + elif arg.split('=', 1)[0] == 'register': + register = True return nickname, password, register @@ -103,8 +104,7 @@ def htmlLogin(cssCache: {}, translate: {}, else: loginText = \ '' - loginText += \ + translate['Please enter some credentials'] + '

' + \ '' @@ -132,8 +132,7 @@ def htmlLogin(cssCache: {}, translate: {}, TOSstr = \ '' - TOSstr += \ + translate['About this Instance'] + '

' + \ '' @@ -153,34 +152,32 @@ def htmlLogin(cssCache: {}, translate: {}, htmlHeaderWithWebsiteMarkup(cssFilename, instanceTitle, httpPrefix, domain, systemLanguage) - loginForm += '
\n' - loginForm += '
\n' - loginForm += '
\n' instanceTitle = getConfigParam(baseDir, 'instanceTitle') - loginForm += textModeLogoHtml + '\n' loginForm += \ + '
\n' + \ + '\n' + \ + '
\n' + \ + textModeLogoHtml + '\n' + \ ' ' + instanceTitle + '\n' - loginForm += loginText + TOSstr + '\n' - loginForm += '
\n' - loginForm += '\n' - loginForm += '
\n' - loginForm += ' \n' - loginForm += \ + '" alt="' + instanceTitle + '" class="loginimage">\n' + \ + loginText + TOSstr + '\n' + \ + '
\n' + \ + '\n' + \ + '
\n' + \ + ' \n' + \ ' \n' - loginForm += '\n' - loginForm += ' \n' - loginForm += \ + translate['Enter Nickname'] + \ + '" name="username" required autofocus>\n' + \ + '\n' + \ + ' \n' + \ ' \n' - loginForm += loginButtonStr + registerButtonStr + '\n' - loginForm += '
\n' - loginForm += '\n' - loginForm += \ + '" name="password" required>\n' + \ + loginButtonStr + registerButtonStr + '\n' + \ + '
\n' + \ + '\n' + \ '' + \ '' + \
diff --git a/webapp_media.py b/webapp_media.py
index 4d5ff6366..5ef899fe0 100644
--- a/webapp_media.py
+++ b/webapp_media.py
@@ -8,6 +8,7 @@ __status__ = None: @@ -110,6 +111,8 @@ def _addEmbeddedVideoFromSites(translate: {}, content: str, if '"https://' in content: if peertubeInstances: + # only create an embedded video for a limited set of + # peertube sites. peerTubeSites = peertubeInstances else: # A default selection of the current larger peertube sites, @@ -160,19 +163,21 @@ def _addEmbeddedVideoFromSites(translate: {}, content: str, else: siteStr = 'https://' + site siteStr = '"' + siteStr - if siteStr in content: - url = content.split(siteStr)[1] - if '"' in url: - url = url.split('"')[0].replace('/watch/', '/embed/') - content = \ - content + "
\n\n
\n" - return content + if siteStr not in content: + continue + url = content.split(siteStr)[1] + if '"' not in url: + continue + url = url.split('"')[0].replace('/watch/', '/embed/') + content = \ + content + "
\n\n
\n" + return content return content @@ -205,19 +210,14 @@ def _addEmbeddedAudio(translate: {}, content: str) -> str: if not w.endswith(extension): continue - if not (w.startswith('http') or w.startswith('dat:') or - w.startswith('hyper:') or w.startswith('i2p:') or - w.startswith('gnunet:') or - '/' in w): + if not validUrlPrefix(w): continue - url = w - content += '
\n\n
\n' + '
\n\n
\n' return content @@ -251,23 +251,17 @@ def _addEmbeddedVideo(translate: {}, content: str) -> str: w = w[:-1] if not w.endswith(extension): continue - if not (w.startswith('http') or w.startswith('dat:') or - w.startswith('hyper:') or w.startswith('i2p:') or - w.startswith('gnunet:') or - '/' in w): + if not validUrlPrefix(w): continue - url = w content += \ '
\n' + \ ' \n
\n
\n' + 'preload="metadata">\n' + \ + '\n' + \ + translate['Your browser does not support the video element.'] + \ + '\n\n\n' return content From 06eb2b96a30b8b71f682c5cc1bdb7cf655c32ee4 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 6 Jul 2021 11:00:19 +0100 Subject: [PATCH 1369/1416] Check for dictionary objects --- announce.py | 2 +- inbox.py | 2 +- media.py | 3 ++- posts.py | 6 +++--- question.py | 2 +- utils.py | 2 +- webapp_person_options.py | 9 +++++---- webapp_post.py | 8 ++++---- 8 files changed, 18 insertions(+), 16 deletions(-) diff --git a/announce.py b/announce.py index 814728c15..92c412c5c 100644 --- a/announce.py +++ b/announce.py @@ -77,7 +77,7 @@ def outboxAnnounce(recentPostsCache: {}, nickname, domain, debug) return True elif messageJson['type'] == 'Undo': - if not isinstance(messageJson['object'], dict): + if not hasObjectDict(messageJson): return False if not messageJson['object'].get('type'): return False diff --git a/inbox.py b/inbox.py index d1f6d2450..8fbaccf50 100644 --- a/inbox.py +++ b/inbox.py @@ -298,7 +298,7 @@ def inboxMessageHasParams(messageJson: {}) -> bool: return False # object should be a dict or a string - if not isinstance(messageJson['object'], dict): + if not hasObjectDict(messageJson): if not isinstance(messageJson['object'], str): print('WARN: object from ' + str(messageJson['actor']) + ' should be a dict or string, but is actually: ' + diff --git a/media.py b/media.py index 2f788117e..0206a10ba 100644 --- a/media.py +++ b/media.py @@ -18,6 +18,7 @@ from utils import getImageExtensions from utils import getVideoExtensions from utils import getAudioExtensions from utils import getMediaExtensions +from utils import hasObjectDict from shutil import copyfile from shutil import rmtree from shutil import move @@ -30,7 +31,7 @@ def replaceYouTube(postJsonObject: {}, replacementDomain: str) -> None: """ if not replacementDomain: return - if not isinstance(postJsonObject['object'], dict): + if not hasObjectDict(postJsonObject): return if not postJsonObject['object'].get('content'): return diff --git a/posts.py b/posts.py index a213f7444..0dc9e7179 100644 --- a/posts.py +++ b/posts.py @@ -1296,7 +1296,7 @@ def _postIsAddressedToFollowers(baseDir: str, toList = [] ccList = [] if postJsonObject['type'] != 'Update' and \ - isinstance(postJsonObject['object'], dict): + hasObjectDict(postJsonObject): if postJsonObject['object'].get('to'): toList = postJsonObject['object']['to'] if postJsonObject['object'].get('cc'): @@ -2169,7 +2169,7 @@ def _addFollowersToPublicPost(postJsonObject: {}) -> None: if postJsonObject.get('cc'): return postJsonObject['cc'] = postJsonObject['actor'] + '/followers' - elif isinstance(postJsonObject['object'], dict): + elif hasObjectDict(postJsonObject): if not postJsonObject['object'].get('to'): return if len(postJsonObject['object']['to']) > 1: @@ -2433,7 +2433,7 @@ def sendToNamedAddresses(session, baseDir: str, if not postJsonObject.get('object'): return isProfileUpdate = False - if isinstance(postJsonObject['object'], dict): + if hasObjectDict(postJsonObject): if _isProfileUpdate(postJsonObject): # use the original object, which has a 'to' recipientsObject = postJsonObject diff --git a/question.py b/question.py index 9008cbd56..60deecdc4 100644 --- a/question.py +++ b/question.py @@ -126,7 +126,7 @@ def isQuestion(postObjectJson: {}) -> bool: if postObjectJson['type'] != 'Create' and \ postObjectJson['type'] != 'Update': return False - if not isinstance(postObjectJson['object'], dict): + if not hasObjectDict(postObjectJson): return False if not postObjectJson['object'].get('type'): return False diff --git a/utils.py b/utils.py index 0d85039cb..9d21085f2 100644 --- a/utils.py +++ b/utils.py @@ -1401,7 +1401,7 @@ def deletePost(baseDir: str, httpPrefix: str, # remove from moderation index file if hasObject: - if isinstance(postJsonObject['object'], dict): + if hasObjectDict(postJsonObject): if postJsonObject['object'].get('moderationStatus'): if postJsonObject.get('id'): postId = removeIdEnding(postJsonObject['id']) diff --git a/webapp_person_options.py b/webapp_person_options.py index 6b55aafd8..3c3309196 100644 --- a/webapp_person_options.py +++ b/webapp_person_options.py @@ -398,9 +398,10 @@ def htmlPersonOptions(defaultTimeline: str, 'accesskey="' + accessKeys['enterNotes'] + '">' + \ personNotes + '\n' - optionsStr += ' \n' - optionsStr += '\n' - optionsStr += '\n' - optionsStr += '\n' + optionsStr += \ + ' \n' + \ + '\n' + \ + '\n' + \ + '\n' optionsStr += htmlFooter() return optionsStr diff --git a/webapp_post.py b/webapp_post.py index fa1317344..3d3ff9941 100644 --- a/webapp_post.py +++ b/webapp_post.py @@ -22,6 +22,7 @@ from posts import postIsMuted from posts import getPersonBox from posts import downloadAnnounce from posts import populateRepliesJson +from utils import hasObjectDict from utils import updateAnnounceCollection from utils import isPGPEncrypted from utils import isDM @@ -840,8 +841,7 @@ def _getPostTitleAnnounceHtml(baseDir: str, postJsonObject) else: titleStr += \ - _announceUnattributedHtml(translate, - postJsonObject) + _announceUnattributedHtml(translate, postJsonObject) else: titleStr += \ _announceUnattributedHtml(translate, postJsonObject) @@ -1339,7 +1339,7 @@ def individualPostAsHtml(allowDownloads: bool, _logPostTiming(enableTimingLog, postStartTime, '8') - if not isinstance(postJsonObject['object'], dict): + if not hasObjectDict(postJsonObject): return '' # if this post should be public then check its recipients @@ -1762,7 +1762,7 @@ def htmlIndividualPost(cssCache: {}, messageId = removeIdEnding(postJsonObject['id']) # show the previous posts - if isinstance(postJsonObject['object'], dict): + if hasObjectDict(postJsonObject): while postJsonObject['object'].get('inReplyTo'): postFilename = \ locatePost(baseDir, nickname, domain, From 5af5f5cd270568cf6611bfe285d76ba6d643f5f2 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 6 Jul 2021 11:18:56 +0100 Subject: [PATCH 1370/1416] Tidying --- webapp_profile.py | 153 +++++++++++++++++++++++----------------------- 1 file changed, 78 insertions(+), 75 deletions(-) diff --git a/webapp_profile.py b/webapp_profile.py index eced71548..3439b834b 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -1601,64 +1601,66 @@ def _htmlEditProfileFiltering(baseDir: str, nickname: str, domain: str, def _htmlEditProfileChangePassword(translate: {}) -> str: """Change password section of edit profile screen """ - editProfileForm = '
' + \ - translate['Change Password'] + '\n' - editProfileForm += '
\n' - editProfileForm += \ + editProfileForm = \ + '
' + \ + translate['Change Password'] + '\n' + \ + '
\n' + \ '
\n' - editProfileForm += '
\n' - editProfileForm += \ + '
\n' + \ + '
\n' + \ '
\n' - editProfileForm += \ - ' \n' - editProfileForm += '
\n' + '
\n' + \ + ' \n' + \ + '
\n' return editProfileForm def _htmlEditProfileBackground(newsInstance: bool, translate: {}) -> str: """Background images section of edit profile screen """ - editProfileForm = '
' + \ - translate['Background Images'] + '\n' - editProfileForm += '
\n' idx = 'The files attached below should be no larger than ' + \ '10MB in total uploaded at once.' - editProfileForm += \ + editProfileForm = \ + '
' + \ + translate['Background Images'] + '\n' + \ + '
\n' + \ '

\n' if not newsInstance: imageFormats = getImageFormats() editProfileForm += \ ' \n' - editProfileForm += ' \n' + translate['Background image'] + '\n' + \ + ' \n' - editProfileForm += '
\n' - editProfileForm += ' \n' + editProfileForm += \ + '
\n' + \ + ' \n' - editProfileForm += '
\n' - editProfileForm += ' \n' + editProfileForm += \ + '
\n' + \ + ' \n' - editProfileForm += '
\n' - editProfileForm += ' \n' + editProfileForm += \ + '
\n' + \ + ' \n' - editProfileForm += '
\n' - editProfileForm += ' \n' + editProfileForm += \ + '
\n' + \ + ' \n' editProfileForm += '
\n' return editProfileForm @@ -1696,48 +1698,45 @@ def _htmlEditProfileContactInfo(nickname: str, ' \n' - editProfileForm += '
\n' editProfileForm += \ + '
\n' + \ ' \n' - editProfileForm += '
\n' editProfileForm += \ + '
\n' + \ ' \n' - editProfileForm += '
\n' editProfileForm += \ + '
\n' + \ ' \n' - editProfileForm += '
\n' editProfileForm += \ + '
\n' + \ ' \n' - editProfileForm += '
\n' editProfileForm += \ + '
\n' + \ ' \n' editProfileForm += \ '
\n' - editProfileForm += \ + translate['PGP Fingerprint'] + '
\n' + \ ' \n' - editProfileForm += \ - '
\n' - editProfileForm += \ + PGPfingerprint + '">\n' + \ + '
\n' + \ ' \n' - editProfileForm += '

\n' - editProfileForm += '
\n' + translate['Following'] + '
\n' + \ + ' \n' return editProfileForm @@ -1790,30 +1789,32 @@ def _htmlEditProfileMain(displayNickname: str, bioStr: str, imageFormats = getImageFormats() editProfileForm = '
\n' - editProfileForm += ' \n' + editProfileForm += \ + ' \n' + \ '
\n' + editProfileForm += \ - ' \n' - editProfileForm += \ + ' \n' + \ ' \n' + editProfileForm += \ ' \n' - editProfileForm += \ - ' \n' + '\n' + \ + ' \n' occupationName = '' if actorJson.get('hasOccupation'): occupationName = getOccupationName(actorJson) - editProfileForm += '
\n' editProfileForm += \ + '
\n' + \ ' \n' @@ -1827,27 +1828,29 @@ def _htmlEditProfileMain(displayNickname: str, bioStr: str, ctr += 1 alsoKnownAsStr += altActor - editProfileForm += '
\n' editProfileForm += \ + '
\n' + \ ' \n' - editProfileForm += '
\n' editProfileForm += \ + '
\n' + \ ' \n' - editProfileForm += '
\n' + editProfileForm += \ + '
\n' + \ ' \n' - editProfileForm += '
\n' + editProfileForm += \ + '
\n' + \ ' \n' - editProfileForm += '
\n' + blogAddress + '">\n' + \ + ' \n' return editProfileForm @@ -1858,8 +1861,8 @@ def _htmlEditProfileTopBanner(baseDir: str, """top banner on edit profile screen """ editProfileForm = \ - '' - editProfileForm += '' + \ + '\n' editProfileForm += \ @@ -2157,7 +2160,7 @@ def _individualFollowAsHtml(translate: {}, '?options=' + followUrl + \ ';1;' + avatarUrl + '">\n' - if b == 'unfollow': + elif b == 'unfollow': buttonsStr += \ 'Account Suspended

\n' - suspendedForm += '

See Terms of Service

\n' - suspendedForm += '\n' + suspendedForm += \ + '
\n' + \ + '

Account Suspended

\n' + \ + '

See Terms of Service

\n' + \ + '
\n' suspendedForm += htmlFooter() return suspendedForm diff --git a/webapp_timeline.py b/webapp_timeline.py index 2ba8e6881..3ab1800fd 100644 --- a/webapp_timeline.py +++ b/webapp_timeline.py @@ -600,14 +600,15 @@ def htmlTimeline(cssCache: {}, defaultTimeline: str, iconsAsButtons, accessKeys) # start the timeline - tlStr += '\n' - tlStr += ' \n' - tlStr += ' \n' - tlStr += ' \n' - tlStr += ' \n' - tlStr += ' \n' - tlStr += ' \n' - tlStr += ' \n' + tlStr += \ + '
\n' + \ + ' \n' + \ + ' \n' + \ + ' \n' + \ + ' \n' + \ + ' \n' + \ + ' \n' + \ + ' \n' domainFull = getFullDomain(domain, port) diff --git a/webapp_utils.py b/webapp_utils.py index 5bf49b8ce..336eea016 100644 --- a/webapp_utils.py +++ b/webapp_utils.py @@ -452,17 +452,18 @@ def getRightImageFile(baseDir: str, def htmlHeaderWithExternalStyle(cssFilename: str, instanceTitle: str, lang='en') -> str: - htmlStr = '\n' - htmlStr += '\n' - htmlStr += ' \n' - htmlStr += ' \n' cssFile = '/' + cssFilename.split('/')[-1] - htmlStr += ' \n' - htmlStr += ' \n' - htmlStr += ' \n' - htmlStr += ' ' + instanceTitle + '\n' - htmlStr += ' \n' - htmlStr += ' \n' + htmlStr = \ + '\n' + \ + '\n' + \ + ' \n' + \ + ' \n' + \ + ' \n' + \ + ' \n' + \ + ' \n' + \ + ' ' + instanceTitle + '\n' + \ + ' \n' + \ + ' \n' return htmlStr @@ -511,37 +512,32 @@ def htmlHeaderWithPersonMarkup(cssFilename: str, instanceTitle: str, sk['occupationalCategory']['codeValue'] categoryUrl = \ 'https://www.onetonline.org/link/summary/' + category - skillsMarkup += ' {\n' - skillsMarkup += ' "@type": "Role",\n' - skillsMarkup += ' "hasOccupation": {\n' - skillsMarkup += ' "@type": "Occupation",\n' - skillsMarkup += ' "name": "' + roleName + '",\n' - skillsMarkup += ' "description": ' + \ - '"Fediverse instance role",\n' - skillsMarkup += ' "occupationLocation": {\n' - skillsMarkup += \ - ' "@type": "City",\n' - skillsMarkup += \ - ' "name": "' + city + '"\n' - skillsMarkup += ' },\n' - skillsMarkup += ' "occupationalCategory": {\n' - skillsMarkup += ' "@type": "CategoryCode",\n' - skillsMarkup += ' "inCodeSet": {\n' - skillsMarkup += \ - ' "@type": "CategoryCodeSet",\n' - skillsMarkup += ' "name": "O*Net-SOC",\n' - skillsMarkup += ' "dateModified": "2019",\n' skillsMarkup += \ + ' {\n' + \ + ' "@type": "Role",\n' + \ + ' "hasOccupation": {\n' + \ + ' "@type": "Occupation",\n' + \ + ' "name": "' + roleName + '",\n' + \ + ' "description": ' + \ + '"Fediverse instance role",\n' + \ + ' "occupationLocation": {\n' + \ + ' "@type": "City",\n' + \ + ' "name": "' + city + '"\n' + \ + ' },\n' + \ + ' "occupationalCategory": {\n' + \ + ' "@type": "CategoryCode",\n' + \ + ' "inCodeSet": {\n' + \ + ' "@type": "CategoryCodeSet",\n' + \ + ' "name": "O*Net-SOC",\n' + \ + ' "dateModified": "2019",\n' + \ ' ' + \ - '"url": "https://www.onetonline.org/"\n' - skillsMarkup += ' },\n' - skillsMarkup += \ - ' "codeValue": "' + category + '",\n' - skillsMarkup += \ - ' "url": "' + categoryUrl + '"\n' - skillsMarkup += ' }\n' - skillsMarkup += ' }\n' - skillsMarkup += ' }' + '"url": "https://www.onetonline.org/"\n' + \ + ' },\n' + \ + ' "codeValue": "' + category + '",\n' + \ + ' "url": "' + categoryUrl + '"\n' + \ + ' }\n' + \ + ' }\n' + \ + ' }' elif skillDict['@type'] == 'Occupation': if not firstEntry: skillsMarkup += ',\n' @@ -555,19 +551,18 @@ def htmlHeaderWithPersonMarkup(cssFilename: str, instanceTitle: str, skillsListStr += ', ' skillsListStr += '"' + skillStr + '"' skillsListStr += ']' - skillsMarkup += ' {\n' - skillsMarkup += ' "@type": "Occupation",\n' - skillsMarkup += ' "name": "' + ocName + '",\n' - skillsMarkup += ' "description": ' + \ - '"Fediverse instance occupation",\n' - skillsMarkup += ' "occupationLocation": {\n' - skillsMarkup += ' "@type": "City",\n' skillsMarkup += \ - ' "name": "' + city + '"\n' - skillsMarkup += ' },\n' - skillsMarkup += \ - ' "skills": ' + skillsListStr + '\n' - skillsMarkup += ' }' + ' {\n' + \ + ' "@type": "Occupation",\n' + \ + ' "name": "' + ocName + '",\n' + \ + ' "description": ' + \ + '"Fediverse instance occupation",\n' + \ + ' "occupationLocation": {\n' + \ + ' "@type": "City",\n' + \ + ' "name": "' + city + '"\n' + \ + ' },\n' + \ + ' "skills": ' + skillsListStr + '\n' + \ + ' }' firstEntry = False skillsMarkup += '\n ],\n' diff --git a/webapp_welcome_final.py b/webapp_welcome_final.py index 0b6491c47..de5940199 100644 --- a/webapp_welcome_final.py +++ b/webapp_welcome_final.py @@ -63,19 +63,17 @@ def htmlWelcomeFinal(baseDir: str, nickname: str, domain: str, finalForm = htmlHeaderWithExternalStyle(cssFilename, instanceTitle) - finalForm += '
' + finalText + '
\n' finalForm += \ + '
' + finalText + '
\n' + \ '\n' - finalForm += '\n' finalForm += '\n' finalForm += htmlFooter() diff --git a/webfinger.py b/webfinger.py index c82a5199c..776070665 100644 --- a/webfinger.py +++ b/webfinger.py @@ -174,18 +174,19 @@ def webfingerNodeInfo(httpPrefix: str, domainFull: str) -> {}: def webfingerMeta(httpPrefix: str, domainFull: str) -> str: """Return /.well-known/host-meta """ - metaStr = "" - metaStr += "" - metaStr += "" - metaStr += "" - metaStr += " Resource Descriptor" - metaStr += " " - metaStr += "" + metaStr = \ + "" + \ + "" + \ + "" + \ + "" + domainFull + "" + \ + "" + \ + "" + \ + " Resource Descriptor" + \ + " " + \ + "" return metaStr @@ -271,11 +272,12 @@ def _webfingerUpdateFromProfile(wfJson: {}, actorJson: {}) -> bool: if not propertyValue.get('name'): continue propertyName = propertyValue['name'].lower() - if not (propertyName.startswith('ssb') or - propertyName.startswith('xmpp') or - propertyName.startswith('matrix') or - propertyName.startswith('email') or - propertyName.startswith('tox')): + found = False + for name, alias in webfingerPropertyName: + if name == propertyName: + found = True + break + if not found: continue if not propertyValue.get('type'): continue From 3b9e57b534614fcac471aee47cd19b0a9c514089 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 6 Jul 2021 13:53:10 +0100 Subject: [PATCH 1372/1416] Extra webfinger aliases --- webfinger.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/webfinger.py b/webfinger.py index 776070665..c19424186 100644 --- a/webfinger.py +++ b/webfinger.py @@ -265,6 +265,9 @@ def _webfingerUpdateFromProfile(wfJson: {}, actorJson: {}) -> bool: "matrix": "matrix", "email": "mailto", "ssb": "ssb", + "briar": "briar", + "cwtch": "cwtch", + "jami": "jami", "tox": "toxId" } From fc3112b87818e5b93df2ccd1d7c78bfb242ea632 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 6 Jul 2021 13:58:21 +0100 Subject: [PATCH 1373/1416] Items --- webfinger.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webfinger.py b/webfinger.py index c19424186..2710acb7f 100644 --- a/webfinger.py +++ b/webfinger.py @@ -276,7 +276,7 @@ def _webfingerUpdateFromProfile(wfJson: {}, actorJson: {}) -> bool: continue propertyName = propertyValue['name'].lower() found = False - for name, alias in webfingerPropertyName: + for name, alias in webfingerPropertyName.items(): if name == propertyName: found = True break From 3bf910a9d43736493f61fb96a084d340ac27e75b Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 6 Jul 2021 14:02:00 +0100 Subject: [PATCH 1374/1416] Remove prefix from webfinger aliases --- webfinger.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/webfinger.py b/webfinger.py index 2710acb7f..d51869dbb 100644 --- a/webfinger.py +++ b/webfinger.py @@ -290,6 +290,9 @@ def _webfingerUpdateFromProfile(wfJson: {}, actorJson: {}) -> bool: continue newValue = propertyValue['value'].strip() + if '://' in newValue: + newValue = newValue.split('://')[1] + aliasIndex = 0 found = False for alias in wfJson['aliases']: From 0c8b0964d71cfff8e69765931b471d04ac6f734e Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 6 Jul 2021 14:11:00 +0100 Subject: [PATCH 1375/1416] Remove unused webfinger aliases --- webfinger.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/webfinger.py b/webfinger.py index d51869dbb..fb890c40a 100644 --- a/webfinger.py +++ b/webfinger.py @@ -271,6 +271,10 @@ def _webfingerUpdateFromProfile(wfJson: {}, actorJson: {}) -> bool: "tox": "toxId" } + aliasesNotFound = [] + for name, _ in webfingerPropertyName.items(): + aliasesNotFound.append(name) + for propertyValue in actorJson['attachment']: if not propertyValue.get('name'): continue @@ -278,6 +282,8 @@ def _webfingerUpdateFromProfile(wfJson: {}, actorJson: {}) -> bool: found = False for name, alias in webfingerPropertyName.items(): if name == propertyName: + if name in aliasesNotFound: + aliasesNotFound.remove(name) found = True break if not found: @@ -308,6 +314,17 @@ def _webfingerUpdateFromProfile(wfJson: {}, actorJson: {}) -> bool: else: wfJson['aliases'].append(newAlias) changed = True + + # remove any aliases which are no longer in the actor profile + removeAlias = [] + for name in aliasesNotFound: + for alias in wfJson['aliases']: + if alias.startswith(name + ':'): + removeAlias.append(alias) + for alias in removeAlias: + wfJson['aliases'].remove(alias) + changed = True + return changed From 7863e0f99cf28b0e26c95503f759be8c1d180af1 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 6 Jul 2021 14:17:38 +0100 Subject: [PATCH 1376/1416] Webfinger removal based upon alias --- webfinger.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/webfinger.py b/webfinger.py index fb890c40a..6a31c5833 100644 --- a/webfinger.py +++ b/webfinger.py @@ -272,8 +272,8 @@ def _webfingerUpdateFromProfile(wfJson: {}, actorJson: {}) -> bool: } aliasesNotFound = [] - for name, _ in webfingerPropertyName.items(): - aliasesNotFound.append(name) + for name, alias in webfingerPropertyName.items(): + aliasesNotFound.append(alias) for propertyValue in actorJson['attachment']: if not propertyValue.get('name'): @@ -282,8 +282,8 @@ def _webfingerUpdateFromProfile(wfJson: {}, actorJson: {}) -> bool: found = False for name, alias in webfingerPropertyName.items(): if name == propertyName: - if name in aliasesNotFound: - aliasesNotFound.remove(name) + if alias in aliasesNotFound: + aliasesNotFound.remove(alias) found = True break if not found: @@ -317,12 +317,12 @@ def _webfingerUpdateFromProfile(wfJson: {}, actorJson: {}) -> bool: # remove any aliases which are no longer in the actor profile removeAlias = [] - for name in aliasesNotFound: - for alias in wfJson['aliases']: - if alias.startswith(name + ':'): - removeAlias.append(alias) - for alias in removeAlias: - wfJson['aliases'].remove(alias) + for alias in aliasesNotFound: + for fullAlias in wfJson['aliases']: + if fullAlias.startswith(alias + ':'): + removeAlias.append(fullAlias) + for fullAlias in removeAlias: + wfJson['aliases'].remove(fullAlias) changed = True return changed From f51b7194f4154ab50f76c177d5b1ca1a4c07c79b Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 6 Jul 2021 17:05:50 +0100 Subject: [PATCH 1377/1416] Remove big dot diagram from tests --- tests.py | 56 -------------------------------------------------------- 1 file changed, 56 deletions(-) diff --git a/tests.py b/tests.py index c6ac118db..4e5621014 100644 --- a/tests.py +++ b/tests.py @@ -3384,62 +3384,6 @@ def _testFunctions(): _diagramGroups(['Core', 'Accessibility'], ['utils'], modules, modGroups, maxModuleCalls) - callGraphStr = 'digraph Epicyon {\n\n' - callGraphStr += ' size="8,6"; ratio=fill;\n' - callGraphStr += ' graph [fontsize=10 fontname="Verdana" compound=true];\n' - callGraphStr += ' node [shape=record fontsize=10 fontname="Verdana"];\n\n' - - for modName, modProperties in modules.items(): - callGraphStr += ' subgraph cluster_' + modName + ' {\n' - callGraphStr += ' label = "' + modName + '";\n' - callGraphStr += ' node [style=filled];\n' - moduleFunctionsStr = '' - for name in modProperties['functions']: - if name.startswith('test'): - continue - if name not in excludeFuncs: - if not functionProperties[name]['calls']: - moduleFunctionsStr += \ - ' "' + name + '" [fillcolor=yellow style=filled];\n' - continue - noOfCalls = len(functionProperties[name]['calls']) - if noOfCalls < int(maxFunctionCalls / 4): - moduleFunctionsStr += ' "' + name + \ - '" [fillcolor=orange style=filled];\n' - else: - moduleFunctionsStr += ' "' + name + \ - '" [fillcolor=red style=filled];\n' - - if moduleFunctionsStr: - callGraphStr += moduleFunctionsStr + '\n' - callGraphStr += ' color=blue;\n' - callGraphStr += ' }\n\n' - - for name, properties in functionProperties.items(): - if not properties['calls']: - continue - noOfCalls = len(properties['calls']) - if noOfCalls <= int(maxFunctionCalls / 8): - modColor = 'blue' - elif noOfCalls < int(maxFunctionCalls / 4): - modColor = 'green' - else: - modColor = 'red' - for calledFunc in properties['calls']: - if calledFunc.startswith('test'): - continue - if calledFunc not in excludeFuncs: - callGraphStr += ' "' + name + '" -> "' + calledFunc + \ - '" [color=' + modColor + '];\n' - - callGraphStr += '\n}\n' - with open('epicyon.dot', 'w+') as fp: - fp.write(callGraphStr) - print('Call graph saved to epicyon.dot') - print('Plot using: ' + - 'sfdp -x -Goverlap=prism -Goverlap_scaling=8 ' + - '-Gsep=+120 -Tx11 epicyon.dot') - def _testLinksWithinPost() -> None: baseDir = os.getcwd() From 0eb405ef5b864c4c0f8a0171d546facd2c4888c9 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 6 Jul 2021 17:29:03 +0100 Subject: [PATCH 1378/1416] Unit test for word switching --- content.py | 50 +++++++++++++++++++++++++------------------------- tests.py | 25 +++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 25 deletions(-) diff --git a/content.py b/content.py index 6bf97dc80..960d3f033 100644 --- a/content.py +++ b/content.py @@ -202,35 +202,35 @@ def dangerousCSS(filename: str, allowLocalNetworkAccess: bool) -> bool: return False -def switchWords(baseDir: str, nickname: str, domain: str, content: str) -> str: +def switchWords(baseDir: str, nickname: str, domain: str, content: str, + rules: [] = []) -> str: """Performs word replacements. eg. Trump -> The Orange Menace """ if isPGPEncrypted(content) or containsPGPPublicKey(content): return content - switchWordsFilename = baseDir + '/accounts/' + \ - nickname + '@' + domain + '/replacewords.txt' - if not os.path.isfile(switchWordsFilename): - return content - with open(switchWordsFilename, 'r') as fp: - for line in fp: - replaceStr = line.replace('\n', '').replace('\r', '') - wordTransform = None - if '->' in replaceStr: - wordTransform = replaceStr.split('->') - elif ':' in replaceStr: - wordTransform = replaceStr.split(':') - elif ',' in replaceStr: - wordTransform = replaceStr.split(',') - elif ';' in replaceStr: - wordTransform = replaceStr.split(';') - elif '-' in replaceStr: - wordTransform = replaceStr.split('-') - if not wordTransform: - continue - if len(wordTransform) == 2: - replaceStr1 = wordTransform[0].strip().replace('"', '') - replaceStr2 = wordTransform[1].strip().replace('"', '') - content = content.replace(replaceStr1, replaceStr2) + + if not rules: + switchWordsFilename = baseDir + '/accounts/' + \ + nickname + '@' + domain + '/replacewords.txt' + if not os.path.isfile(switchWordsFilename): + return content + with open(switchWordsFilename, 'r') as fp: + rules = fp.readlines() + + for line in rules: + replaceStr = line.replace('\n', '').replace('\r', '') + splitters = ('->', ':', ',', ';', '-') + wordTransform = None + for splitStr in splitters: + if splitStr in replaceStr: + wordTransform = replaceStr.split(splitStr) + break + if not wordTransform: + continue + if len(wordTransform) == 2: + replaceStr1 = wordTransform[0].strip().replace('"', '') + replaceStr2 = wordTransform[1].strip().replace('"', '') + content = content.replace(replaceStr1, replaceStr2) return content diff --git a/tests.py b/tests.py index 4e5621014..9fe956d83 100644 --- a/tests.py +++ b/tests.py @@ -94,6 +94,7 @@ from inbox import jsonPostAllowsComments from inbox import validInbox from inbox import validInboxFilenames from categories import guessHashtagCategory +from content import switchWords from content import extractTextFieldsInPOST from content import validHashTag from content import htmlReplaceEmailQuote @@ -4117,9 +4118,33 @@ def _testUserAgentDomain() -> None: assert userAgentDomain(userAgent, False) is None +def _testSwitchWords() -> None: + print('testSwitchWords') + rules = [ + "rock -> hamster", + "orange -> lemon" + ] + baseDir = os.getcwd() + nickname = 'testuser' + domain = 'testdomain.com' + + content = 'This is a test' + result = switchWords(baseDir, nickname, domain, content, rules) + assert result == content + + content = 'This is orange test' + result = switchWords(baseDir, nickname, domain, content, rules) + assert result == 'This is lemon test' + + content = 'This is a test rock' + result = switchWords(baseDir, nickname, domain, content, rules) + assert result == 'This is a test hamster' + + def runAllTests(): print('Running tests...') updateDefaultThemesList(os.getcwd()) + _testSwitchWords() _testFunctions() _testUserAgentDomain() _testRoles() From 71c2794a19ea3d75bcfe9928611d21cfc064de36 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 6 Jul 2021 21:38:08 +0100 Subject: [PATCH 1379/1416] Optional notifications for the arrival of posts from low frequency follows --- daemon.py | 30 ++++++++++ inbox.py | 23 ++++++++ notifyOnPost.py | 104 +++++++++++++++++++++++++++++++++++ scripts/epicyon-notification | 15 +++++ translations/ar.json | 3 +- translations/ca.json | 3 +- translations/cy.json | 3 +- translations/de.json | 3 +- translations/en.json | 3 +- translations/es.json | 3 +- translations/fr.json | 3 +- translations/ga.json | 3 +- translations/hi.json | 3 +- translations/it.json | 3 +- translations/ja.json | 3 +- translations/ku.json | 3 +- translations/oc.json | 3 +- translations/pt.json | 3 +- translations/ru.json | 3 +- translations/sw.json | 3 +- translations/zh.json | 3 +- webapp_person_options.py | 16 +++++- 22 files changed, 221 insertions(+), 18 deletions(-) create mode 100644 notifyOnPost.py diff --git a/daemon.py b/daemon.py index aa4b55576..94d16939b 100644 --- a/daemon.py +++ b/daemon.py @@ -286,6 +286,8 @@ from bookmarks import undoBookmark from petnames import setPetName from followingCalendar import addPersonToCalendar from followingCalendar import removePersonFromCalendar +from notifyOnPost import addNotifyOnPost +from notifyOnPost import removeNotifyOnPost from devices import E2EEdevicesCollection from devices import E2EEvalidDevice from devices import E2EEaddDevice @@ -2087,6 +2089,34 @@ class PubServer(BaseHTTPRequestHandler): self.server.POSTbusy = False return + # person options screen, on notify checkbox + # See htmlPersonOptions + if '&submitNotifyOnPost=' in optionsConfirmParams: + notify = None + if 'notifyOnPost=' in optionsConfirmParams: + notify = optionsConfirmParams.split('notifyOnPost=')[1] + if '&' in notify: + notify = notify.split('&')[0] + if notify == 'on': + addNotifyOnPost(baseDir, + chooserNickname, + domain, + optionsNickname, + optionsDomainFull) + else: + removeNotifyOnPost(baseDir, + chooserNickname, + domain, + optionsNickname, + optionsDomainFull) + usersPathStr = \ + usersPath + '/' + self.server.defaultTimeline + \ + '?page=' + str(pageNumber) + self._redirect_headers(usersPathStr, cookie, + callingDomain) + self.server.POSTbusy = False + return + # person options screen, permission to post to newswire # See htmlPersonOptions if '&submitPostToNews=' in optionsConfirmParams: diff --git a/inbox.py b/inbox.py index 8fbaccf50..c972a9288 100644 --- a/inbox.py +++ b/inbox.py @@ -86,6 +86,7 @@ from categories import guessHashtagCategory from context import hasValidContext from speaker import updateSpeaker from announce import isSelfAnnounce +from notifyOnPost import notifyWhenPersonPosts def storeHashTags(baseDir: str, nickname: str, postJsonObject: {}) -> None: @@ -1850,6 +1851,18 @@ def _likeNotify(baseDir: str, domain: str, onionDomain: str, pass +def _notifyPostArrival(baseDir: str, handle: str, url: str) -> None: + """Creates a notification that a new post has arrived + """ + accountDir = baseDir + '/accounts/' + handle + if not os.path.isdir(accountDir): + return + notifyFile = accountDir + '/.newNotifiedPost' + if not os.path.isfile(notifyFile): + with open(notifyFile, 'w+') as fp: + fp.write(url) + + def _replyNotify(baseDir: str, handle: str, url: str) -> None: """Creates a notification that a new reply has arrived """ @@ -2275,6 +2288,7 @@ def _inboxAfterInitial(recentPostsCache: {}, maxRecentPosts: int, _updateLastSeen(baseDir, handle, actor) + postIsDM = False isGroup = _groupHandle(baseDir, handle) if _receiveLike(recentPostsCache, @@ -2512,6 +2526,15 @@ def _inboxAfterInitial(recentPostsCache: {}, maxRecentPosts: int, # save the post to file if saveJson(postJsonObject, destinationFilename): + if not postIsDM: + # should we notify that a post from this person has arrived? + handleNickname = handle.split('@')[0] + handleDomain = handle.split('@')[1] + if notifyWhenPersonPosts(baseDir, nickname, domain, + handleNickname, handleDomain): + postId = removeIdEnding(postJsonObject['id']) + _notifyPostArrival(baseDir, handle, postId) + # If this is a reply to a muted post then also mute it. # This enables you to ignore a threat that's getting boring if isReplyToMutedPost: diff --git a/notifyOnPost.py b/notifyOnPost.py new file mode 100644 index 000000000..20bf927c2 --- /dev/null +++ b/notifyOnPost.py @@ -0,0 +1,104 @@ +__filename__ = "notifyOnPost.py" +__author__ = "Bob Mottram" +__license__ = "AGPL3+" +__version__ = "1.2.0" +__maintainer__ = "Bob Mottram" +__email__ = "bob@freedombone.net" +__status__ = "Production" +__module_group__ = "Calendar" + +import os +from utils import removeDomainPort + + +def _notifyOnPostArrival(baseDir: str, nickname: str, domain: str, + followingNickname: str, + followingDomain: str, + add: bool) -> None: + """Adds or removes a handle from the following.txt list into a list + indicating whether to notify when a new post arrives from that account + """ + # check that a following file exists + domain = removeDomainPort(domain) + followingFilename = baseDir + '/accounts/' + \ + nickname + '@' + domain + '/following.txt' + if not os.path.isfile(followingFilename): + print("WARN: following.txt doesn't exist for " + + nickname + '@' + domain) + return + handle = followingNickname + '@' + followingDomain + + # check that you are following this handle + if handle + '\n' not in open(followingFilename).read(): + print('WARN: ' + handle + ' is not in ' + followingFilename) + return + + notifyOnPostFilename = baseDir + '/accounts/' + \ + nickname + '@' + domain + '/notifyOnPost.txt' + + # get the contents of the notifyOnPost file, which is + # a set of handles + followingHandles = '' + if os.path.isfile(notifyOnPostFilename): + print('notify file exists') + with open(notifyOnPostFilename, 'r') as calendarFile: + followingHandles = calendarFile.read() + else: + # create a new notifyOnPost file from the following file + print('Creating notifyOnPost file ' + notifyOnPostFilename) + followingHandles = '' + with open(followingFilename, 'r') as followingFile: + followingHandles = followingFile.read() + if add: + with open(notifyOnPostFilename, 'w+') as fp: + fp.write(followingHandles + handle + '\n') + + # already in the notifyOnPost file? + if handle + '\n' in followingHandles: + print(handle + ' exists in notifyOnPost.txt') + if add: + # already added + return + # remove from calendar file + followingHandles = followingHandles.replace(handle + '\n', '') + with open(notifyOnPostFilename, 'w+') as fp: + fp.write(followingHandles) + else: + print(handle + ' not in notifyOnPost.txt') + # not already in the notifyOnPost file + if add: + # append to the list of handles + followingHandles += handle + '\n' + with open(notifyOnPostFilename, 'w+') as fp: + fp.write(followingHandles) + + +def addNotifyOnPost(baseDir: str, nickname: str, domain: str, + followingNickname: str, + followingDomain: str) -> None: + _notifyOnPostArrival(baseDir, nickname, domain, + followingNickname, followingDomain, True) + + +def removeNotifyOnPost(baseDir: str, nickname: str, domain: str, + followingNickname: str, + followingDomain: str) -> None: + _notifyOnPostArrival(baseDir, nickname, domain, + followingNickname, followingDomain, False) + + +def notifyWhenPersonPosts(baseDir: str, nickname: str, domain: str, + followingNickname: str, + followingDomain: str) -> bool: + """Returns true if receiving notifications when the given publishes a post + """ + if followingNickname == nickname and followingDomain == domain: + return False + notifyOnPostFilename = baseDir + '/accounts/' + \ + nickname + '@' + domain + '/notifyOnPost.txt' + handle = followingNickname + '@' + followingDomain + if not os.path.isfile(notifyOnPostFilename): + # create a new notifyOnPost file + with open(notifyOnPostFilename, 'w+') as fp: + fp.write('') + return handle + '\n' in open(notifyOnPostFilename).read() diff --git a/scripts/epicyon-notification b/scripts/epicyon-notification index 5b4f4ec89..d8e0e54c6 100755 --- a/scripts/epicyon-notification +++ b/scripts/epicyon-notification @@ -215,6 +215,21 @@ function notifications { fi fi + # send notifications for posts arriving from a particular person + epicyonNotifyFile="$epicyonDir/.newNotifiedPost" + if [ -f "$epicyonNotifyFile" ]; then + if ! grep -q "##sent##" "$epicyonNotifyFile"; then + epicyonReplyMessage=$(notification_translate_text 'New post') + epicyonNotifyFileContent=$(echo "$epicyonReplyMessage")" "$(cat "$epicyonNotifyFile") + if [[ "$epicyonNotifyFileContent" == *':'* ]]; then + epicyonReplyMessage="Epicyon: $epicyonNotifyFileContent" + fi + sendNotification "$USERNAME" "Epicyon" "$epicyonReplyMessage" + echo "##sent##" > "$epicyonNotifyFile" + chown ${PROJECT_NAME}:${PROJECT_NAME} "$epicyonNotifyFile" + fi + fi + # send notifications for replies to XMPP/email users epicyonReplyFile="$epicyonDir/.newReply" if [ -f "$epicyonReplyFile" ]; then diff --git a/translations/ar.json b/translations/ar.json index 270d3b503..50cca5a13 100644 --- a/translations/ar.json +++ b/translations/ar.json @@ -449,5 +449,6 @@ "Import Theme": "استيراد الموضوع", "Export Theme": "موضوع التصدير", "Custom post submit button text": "عرف نشر إرسال نص زر", - "Blocked User Agents": "عوامل المستخدم المحظورة" + "Blocked User Agents": "عوامل المستخدم المحظورة", + "Notify me when this account posts": "أعلمني عندما ينشر الحساب هذا" } diff --git a/translations/ca.json b/translations/ca.json index b445702f3..c9a15be88 100644 --- a/translations/ca.json +++ b/translations/ca.json @@ -449,5 +449,6 @@ "Import Theme": "Importació temàtica", "Export Theme": "Tema d'exportació", "Custom post submit button text": "Text de botó d'enviament de publicacions personalitzades", - "Blocked User Agents": "Agents d'usuari bloquejats" + "Blocked User Agents": "Agents d'usuari bloquejats", + "Notify me when this account posts": "Aviseu-me quan publiqui aquest compte" } diff --git a/translations/cy.json b/translations/cy.json index 680fa4c72..0cf0e9980 100644 --- a/translations/cy.json +++ b/translations/cy.json @@ -449,5 +449,6 @@ "Import Theme": "Thema Mewnforio", "Export Theme": "Thema Allforio", "Custom post submit button text": "Testun Post Post Post", - "Blocked User Agents": "Asiantau defnyddwyr wedi'u blocio" + "Blocked User Agents": "Asiantau defnyddwyr wedi'u blocio", + "Notify me when this account posts": "Rhoi gwybod i mi pan fydd y cyfrifon cyfrif hwn" } diff --git a/translations/de.json b/translations/de.json index 2ec7c24b6..df10a2e6e 100644 --- a/translations/de.json +++ b/translations/de.json @@ -449,5 +449,6 @@ "Import Theme": "Theme importieren", "Export Theme": "Theme exportieren", "Custom post submit button text": "Benutzerdefinierte Post-Senden Schaltfläche Text", - "Blocked User Agents": "Blockierte Benutzeragenten" + "Blocked User Agents": "Blockierte Benutzeragenten", + "Notify me when this account posts": "Benachrichtigen Sie mich, wenn dieses Konto postet" } diff --git a/translations/en.json b/translations/en.json index 25dd4a83a..31d1bbf40 100644 --- a/translations/en.json +++ b/translations/en.json @@ -449,5 +449,6 @@ "Import Theme": "Import Theme", "Export Theme": "Export Theme", "Custom post submit button text": "Custom post submit button text", - "Blocked User Agents": "Blocked User Agents" + "Blocked User Agents": "Blocked User Agents", + "Notify me when this account posts": "Notify me when this account posts" } diff --git a/translations/es.json b/translations/es.json index 1502da0e3..ac096a01d 100644 --- a/translations/es.json +++ b/translations/es.json @@ -449,5 +449,6 @@ "Import Theme": "Tema de importación", "Export Theme": "Tema de exportación", "Custom post submit button text": "POST POST PERSONALIZADO Botón Texto", - "Blocked User Agents": "Agentes de usuario bloqueados" + "Blocked User Agents": "Agentes de usuario bloqueados", + "Notify me when this account posts": "Notifíqueme cuando se publique esta cuenta" } diff --git a/translations/fr.json b/translations/fr.json index 57d4d369a..6defd9956 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -449,5 +449,6 @@ "Import Theme": "Import thème", "Export Theme": "Thème d'exportation", "Custom post submit button text": "Texte de bouton d'envoi postal personnalisé", - "Blocked User Agents": "Agents d'utilisateur bloqués" + "Blocked User Agents": "Agents d'utilisateur bloqués", + "Notify me when this account posts": "Avertissez-moi quand ce compte publie" } diff --git a/translations/ga.json b/translations/ga.json index ea04687fe..632b57ab0 100644 --- a/translations/ga.json +++ b/translations/ga.json @@ -449,5 +449,6 @@ "Import Theme": "Téama Iompórtáil", "Export Theme": "Téama Easpórtála", "Custom post submit button text": "Post saincheaptha Cuir isteach an cnaipe Téacs", - "Blocked User Agents": "Gníomhairí úsáideora blocáilte" + "Blocked User Agents": "Gníomhairí úsáideora blocáilte", + "Notify me when this account posts": "Cuir in iúl dom nuair a phostófar an cuntas seo" } diff --git a/translations/hi.json b/translations/hi.json index 00ea6df4d..2f3e13f0e 100644 --- a/translations/hi.json +++ b/translations/hi.json @@ -449,5 +449,6 @@ "Import Theme": "आयात विषय", "Export Theme": "निर्यात विषय", "Custom post submit button text": "कस्टम पोस्ट सबमिट बटन टेक्स्ट", - "Blocked User Agents": "अवरुद्ध उपयोगकर्ता एजेंट" + "Blocked User Agents": "अवरुद्ध उपयोगकर्ता एजेंट", + "Notify me when this account posts": "यह खाता पोस्ट होने पर मुझे सूचित करें" } diff --git a/translations/it.json b/translations/it.json index 12994e2ea..8406ccbda 100644 --- a/translations/it.json +++ b/translations/it.json @@ -449,5 +449,6 @@ "Import Theme": "Tema dell'importazione", "Export Theme": "Esportare tema", "Custom post submit button text": "Pulsante di invio del post personalizzato", - "Blocked User Agents": "Agenti utente bloccati" + "Blocked User Agents": "Agenti utente bloccati", + "Notify me when this account posts": "Avvisami quando questo account messaggi" } diff --git a/translations/ja.json b/translations/ja.json index fdb96a967..494661a86 100644 --- a/translations/ja.json +++ b/translations/ja.json @@ -449,5 +449,6 @@ "Import Theme": "輸入テーマ", "Export Theme": "テーマをエクスポートします", "Custom post submit button text": "カスタムポスト送信ボタンテキスト", - "Blocked User Agents": "ブロックされたユーザーエージェント" + "Blocked User Agents": "ブロックされたユーザーエージェント", + "Notify me when this account posts": "この口座投稿を通知する" } diff --git a/translations/ku.json b/translations/ku.json index cf71e2f19..8d99ddd72 100644 --- a/translations/ku.json +++ b/translations/ku.json @@ -449,5 +449,6 @@ "Import Theme": "Mijara Import", "Export Theme": "Mijara Export", "Custom post submit button text": "Nivîsa bişkojka paşîn a paşîn", - "Blocked User Agents": "Karmendên bikarhêner asteng kirin" + "Blocked User Agents": "Karmendên bikarhêner asteng kirin", + "Notify me when this account posts": "Dema ku ev postên hesabê min agahdar bikin" } diff --git a/translations/oc.json b/translations/oc.json index 7c2df85d6..411216f8a 100644 --- a/translations/oc.json +++ b/translations/oc.json @@ -445,5 +445,6 @@ "Import Theme": "Import Theme", "Export Theme": "Export Theme", "Custom post submit button text": "Custom post submit button text", - "Blocked User Agents": "Blocked User Agents" + "Blocked User Agents": "Blocked User Agents", + "Notify me when this account posts": "Notify me when this account posts" } diff --git a/translations/pt.json b/translations/pt.json index d7d303d1f..8d05812de 100644 --- a/translations/pt.json +++ b/translations/pt.json @@ -449,5 +449,6 @@ "Import Theme": "Importar tema", "Export Theme": "Exportar tema", "Custom post submit button text": "Texto de botão de envio de post personalizado", - "Blocked User Agents": "Agentes de usuário bloqueados" + "Blocked User Agents": "Agentes de usuário bloqueados", + "Notify me when this account posts": "Notifique-me quando esta conta posts" } diff --git a/translations/ru.json b/translations/ru.json index cfee8a392..4663cef78 100644 --- a/translations/ru.json +++ b/translations/ru.json @@ -449,5 +449,6 @@ "Import Theme": "Импортировать тему", "Export Theme": "Экспортная тема", "Custom post submit button text": "Пользовательский пост Отправить кнопку текста", - "Blocked User Agents": "Заблокированные пользовательские агенты" + "Blocked User Agents": "Заблокированные пользовательские агенты", + "Notify me when this account posts": "Сообщите мне, когда эта учетная запись" } diff --git a/translations/sw.json b/translations/sw.json index 0ac58b643..4f2fa1bb7 100644 --- a/translations/sw.json +++ b/translations/sw.json @@ -449,5 +449,6 @@ "Import Theme": "Ingiza mandhari", "Export Theme": "Tuma mandhari", "Custom post submit button text": "Ujumbe wa Desturi Wasilisha Nakala ya kifungo", - "Blocked User Agents": "Wakala wa watumiaji waliozuiwa" + "Blocked User Agents": "Wakala wa watumiaji waliozuiwa", + "Notify me when this account posts": "Nijulishe wakati akaunti hii ya akaunti." } diff --git a/translations/zh.json b/translations/zh.json index 07b9e10c1..eb143dc04 100644 --- a/translations/zh.json +++ b/translations/zh.json @@ -449,5 +449,6 @@ "Import Theme": "进口主题", "Export Theme": "出口主题", "Custom post submit button text": "自定义发布提交按钮文本", - "Blocked User Agents": "阻止用户代理商" + "Blocked User Agents": "阻止用户代理商", + "Notify me when this account posts": "此帐户帖子时通知我" } diff --git a/webapp_person_options.py b/webapp_person_options.py index 3c3309196..cebdba87d 100644 --- a/webapp_person_options.py +++ b/webapp_person_options.py @@ -23,6 +23,7 @@ from blocking import isBlocked from follow import isFollowerOfPerson from follow import isFollowingActor from followingCalendar import receivingCalendarEvents +from notifyOnPost import notifyWhenPersonPosts from webapp_utils import htmlHeaderWithExternalStyle from webapp_utils import htmlFooter from webapp_utils import getBrokenLinkSubstitute @@ -246,8 +247,21 @@ def htmlPersonOptions(defaultTimeline: str, 'name="submitPetname">' + \ translate['Submit'] + '
\n' - # checkbox for receiving calendar events + # Notify when a post arrives from this person if isFollowingActor(baseDir, nickname, domain, optionsActor): + checkboxStr = \ + ' 🔔' + \ + translate['Notify me when this account posts'] + \ + '\n
\n' + if not notifyWhenPersonPosts(baseDir, nickname, domain, + optionsNickname, + optionsDomainFull): + checkboxStr = checkboxStr.replace(' checked>', '>') + optionsStr += checkboxStr + checkboxStr = \ ' ' + \ From 6a73192c2490237f16e66cbad30d118fc567914b Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 6 Jul 2021 22:53:55 +0100 Subject: [PATCH 1380/1416] Tidying --- inbox.py | 2 +- notifyOnPost.py | 4 ++-- scripts/epicyon-notification | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/inbox.py b/inbox.py index c972a9288..0bf108c52 100644 --- a/inbox.py +++ b/inbox.py @@ -2526,8 +2526,8 @@ def _inboxAfterInitial(recentPostsCache: {}, maxRecentPosts: int, # save the post to file if saveJson(postJsonObject, destinationFilename): + # should we notify that a post from this person has arrived? if not postIsDM: - # should we notify that a post from this person has arrived? handleNickname = handle.split('@')[0] handleDomain = handle.split('@')[1] if notifyWhenPersonPosts(baseDir, nickname, domain, diff --git a/notifyOnPost.py b/notifyOnPost.py index 20bf927c2..2c40e7d2e 100644 --- a/notifyOnPost.py +++ b/notifyOnPost.py @@ -94,8 +94,8 @@ def notifyWhenPersonPosts(baseDir: str, nickname: str, domain: str, """ if followingNickname == nickname and followingDomain == domain: return False - notifyOnPostFilename = baseDir + '/accounts/' + \ - nickname + '@' + domain + '/notifyOnPost.txt' + notifyOnPostFilename = \ + baseDir + '/accounts/' + nickname + '@' + domain + '/notifyOnPost.txt' handle = followingNickname + '@' + followingDomain if not os.path.isfile(notifyOnPostFilename): # create a new notifyOnPost file diff --git a/scripts/epicyon-notification b/scripts/epicyon-notification index d8e0e54c6..d2f2c6301 100755 --- a/scripts/epicyon-notification +++ b/scripts/epicyon-notification @@ -219,12 +219,12 @@ function notifications { epicyonNotifyFile="$epicyonDir/.newNotifiedPost" if [ -f "$epicyonNotifyFile" ]; then if ! grep -q "##sent##" "$epicyonNotifyFile"; then - epicyonReplyMessage=$(notification_translate_text 'New post') - epicyonNotifyFileContent=$(echo "$epicyonReplyMessage")" "$(cat "$epicyonNotifyFile") + epicyonNotifyMessage=$(notification_translate_text 'New post') + epicyonNotifyFileContent=$(echo "$epicyonNotifyMessage")" "$(cat "$epicyonNotifyFile") if [[ "$epicyonNotifyFileContent" == *':'* ]]; then - epicyonReplyMessage="Epicyon: $epicyonNotifyFileContent" + epicyonNotifyMessage="Epicyon: $epicyonNotifyFileContent" fi - sendNotification "$USERNAME" "Epicyon" "$epicyonReplyMessage" + sendNotification "$USERNAME" "Epicyon" "$epicyonNotifyMessage" echo "##sent##" > "$epicyonNotifyFile" chown ${PROJECT_NAME}:${PROJECT_NAME} "$epicyonNotifyFile" fi From a68ea9b2a4b8f1a246b776655a0ccec7280c17d1 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 6 Jul 2021 23:10:26 +0100 Subject: [PATCH 1381/1416] Notifications handles --- inbox.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/inbox.py b/inbox.py index 0bf108c52..5f5d0efe9 100644 --- a/inbox.py +++ b/inbox.py @@ -2487,8 +2487,7 @@ def _inboxAfterInitial(recentPostsCache: {}, maxRecentPosts: int, # get the actor being replied to domainFull = getFullDomain(domain, port) - actor = httpPrefix + '://' + domainFull + \ - '/users/' + handle.split('@')[0] + actor = httpPrefix + '://' + domainFull + '/users/' + nickname # create a reply notification file if needed if not postIsDM and isReply(postJsonObject, actor): @@ -2528,12 +2527,14 @@ def _inboxAfterInitial(recentPostsCache: {}, maxRecentPosts: int, if saveJson(postJsonObject, destinationFilename): # should we notify that a post from this person has arrived? if not postIsDM: - handleNickname = handle.split('@')[0] - handleDomain = handle.split('@')[1] + fromNickname = getNicknameFromActor(actor) + fromDomain, fromPort = getDomainFromActor(actor) + fromDomainFull = getFullDomain(fromDomain, fromPort) + fromHandle = fromNickname + '@' + fromDomainFull if notifyWhenPersonPosts(baseDir, nickname, domain, - handleNickname, handleDomain): + fromNickname, fromDomainFull): postId = removeIdEnding(postJsonObject['id']) - _notifyPostArrival(baseDir, handle, postId) + _notifyPostArrival(baseDir, fromHandle, postId) # If this is a reply to a muted post then also mute it. # This enables you to ignore a threat that's getting boring From 523399881c07993846d87ae8674be9945a6648d6 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 6 Jul 2021 23:43:39 +0100 Subject: [PATCH 1382/1416] Actor for notifications --- inbox.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/inbox.py b/inbox.py index 5f5d0efe9..cc61a70f3 100644 --- a/inbox.py +++ b/inbox.py @@ -2527,8 +2527,9 @@ def _inboxAfterInitial(recentPostsCache: {}, maxRecentPosts: int, if saveJson(postJsonObject, destinationFilename): # should we notify that a post from this person has arrived? if not postIsDM: - fromNickname = getNicknameFromActor(actor) - fromDomain, fromPort = getDomainFromActor(actor) + fromNickname = getNicknameFromActor(postJsonObject['actor']) + fromDomain, fromPort = \ + getDomainFromActor(postJsonObject['actor']) fromDomainFull = getFullDomain(fromDomain, fromPort) fromHandle = fromNickname + '@' + fromDomainFull if notifyWhenPersonPosts(baseDir, nickname, domain, From 5bc7f28685d5d3d2d4a7bef08b5b0508c6ac3da3 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 7 Jul 2021 10:06:59 +0100 Subject: [PATCH 1383/1416] Notifications about posts from particular accounts --- inbox.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/inbox.py b/inbox.py index cc61a70f3..8d9a03edd 100644 --- a/inbox.py +++ b/inbox.py @@ -2531,11 +2531,10 @@ def _inboxAfterInitial(recentPostsCache: {}, maxRecentPosts: int, fromDomain, fromPort = \ getDomainFromActor(postJsonObject['actor']) fromDomainFull = getFullDomain(fromDomain, fromPort) - fromHandle = fromNickname + '@' + fromDomainFull if notifyWhenPersonPosts(baseDir, nickname, domain, fromNickname, fromDomainFull): postId = removeIdEnding(postJsonObject['id']) - _notifyPostArrival(baseDir, fromHandle, postId) + _notifyPostArrival(baseDir, handle, postId) # If this is a reply to a muted post then also mute it. # This enables you to ignore a threat that's getting boring From c4175666755a4481160c6347293cbdc7ded4be56 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 7 Jul 2021 10:30:15 +0100 Subject: [PATCH 1384/1416] Check that the same notification is not repeatedly sent --- inbox.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/inbox.py b/inbox.py index 8d9a03edd..6d4de0261 100644 --- a/inbox.py +++ b/inbox.py @@ -1858,9 +1858,14 @@ def _notifyPostArrival(baseDir: str, handle: str, url: str) -> None: if not os.path.isdir(accountDir): return notifyFile = accountDir + '/.newNotifiedPost' - if not os.path.isfile(notifyFile): - with open(notifyFile, 'w+') as fp: - fp.write(url) + if os.path.isfile(notifyFile): + # check that the same notification is not repeatedly sent + with open(notifyFile, 'r') as fp: + existingNotificationMessage = fp.read() + if url in existingNotificationMessage: + return + with open(notifyFile, 'w+') as fp: + fp.write(url) def _replyNotify(baseDir: str, handle: str, url: str) -> None: From 804c045a7527f202ace320ef71e431d64af0dfac Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 7 Jul 2021 10:32:48 +0100 Subject: [PATCH 1385/1416] Comments --- inbox.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/inbox.py b/inbox.py index 6d4de0261..cd64f391c 100644 --- a/inbox.py +++ b/inbox.py @@ -1852,7 +1852,9 @@ def _likeNotify(baseDir: str, domain: str, onionDomain: str, def _notifyPostArrival(baseDir: str, handle: str, url: str) -> None: - """Creates a notification that a new post has arrived + """Creates a notification that a new post has arrived. + This is for followed accounts with the notify checkbox enabled + on the person options screen """ accountDir = baseDir + '/accounts/' + handle if not os.path.isdir(accountDir): From 21a9e06c267d0dfb8120c7b3ba033dde00adb59b Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 7 Jul 2021 10:36:53 +0100 Subject: [PATCH 1386/1416] Notifications should only be for posts written by the selected account --- inbox.py | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/inbox.py b/inbox.py index cd64f391c..8db1ee4bf 100644 --- a/inbox.py +++ b/inbox.py @@ -2533,15 +2533,18 @@ def _inboxAfterInitial(recentPostsCache: {}, maxRecentPosts: int, # save the post to file if saveJson(postJsonObject, destinationFilename): # should we notify that a post from this person has arrived? - if not postIsDM: - fromNickname = getNicknameFromActor(postJsonObject['actor']) - fromDomain, fromPort = \ - getDomainFromActor(postJsonObject['actor']) - fromDomainFull = getFullDomain(fromDomain, fromPort) - if notifyWhenPersonPosts(baseDir, nickname, domain, - fromNickname, fromDomainFull): - postId = removeIdEnding(postJsonObject['id']) - _notifyPostArrival(baseDir, handle, postId) + # This is for cases where the notify checkbox is enabled + # on the person options screen + if not postIsDM and postJsonObject.get('attributedTo'): + attributedTo = postJsonObject['attributedTo'] + if isinstance(attributedTo, str): + fromNickname = getNicknameFromActor(attributedTo) + fromDomain, fromPort = getDomainFromActor(attributedTo) + fromDomainFull = getFullDomain(fromDomain, fromPort) + if notifyWhenPersonPosts(baseDir, nickname, domain, + fromNickname, fromDomainFull): + postId = removeIdEnding(postJsonObject['id']) + _notifyPostArrival(baseDir, handle, postId) # If this is a reply to a muted post then also mute it. # This enables you to ignore a threat that's getting boring From 7b6c939b92e5ea2f45aafb40b744c114fff5eaf0 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 7 Jul 2021 10:49:46 +0100 Subject: [PATCH 1387/1416] Attributed within object --- inbox.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/inbox.py b/inbox.py index 8db1ee4bf..2a4600cc1 100644 --- a/inbox.py +++ b/inbox.py @@ -2535,16 +2535,17 @@ def _inboxAfterInitial(recentPostsCache: {}, maxRecentPosts: int, # should we notify that a post from this person has arrived? # This is for cases where the notify checkbox is enabled # on the person options screen - if not postIsDM and postJsonObject.get('attributedTo'): - attributedTo = postJsonObject['attributedTo'] - if isinstance(attributedTo, str): - fromNickname = getNicknameFromActor(attributedTo) - fromDomain, fromPort = getDomainFromActor(attributedTo) - fromDomainFull = getFullDomain(fromDomain, fromPort) - if notifyWhenPersonPosts(baseDir, nickname, domain, - fromNickname, fromDomainFull): - postId = removeIdEnding(postJsonObject['id']) - _notifyPostArrival(baseDir, handle, postId) + if not postIsDM and hasObjectDict(postJsonObject): + if postJsonObject['object'].get('attributedTo'): + attributedTo = postJsonObject['object']['attributedTo'] + if isinstance(attributedTo, str): + fromNickname = getNicknameFromActor(attributedTo) + fromDomain, fromPort = getDomainFromActor(attributedTo) + fromDomainFull = getFullDomain(fromDomain, fromPort) + if notifyWhenPersonPosts(baseDir, nickname, domain, + fromNickname, fromDomainFull): + postId = removeIdEnding(postJsonObject['id']) + _notifyPostArrival(baseDir, handle, postId) # If this is a reply to a muted post then also mute it. # This enables you to ignore a threat that's getting boring From f294fbd356e9943c4dde7f8130ea9bb9bac9d41f Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 7 Jul 2021 10:52:05 +0100 Subject: [PATCH 1388/1416] Tidying --- inbox.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/inbox.py b/inbox.py index 2a4600cc1..8203f1f1e 100644 --- a/inbox.py +++ b/inbox.py @@ -2413,6 +2413,7 @@ def _inboxAfterInitial(recentPostsCache: {}, maxRecentPosts: int, postJsonObject = messageJson nickname = handle.split('@')[0] + jsonObj = None if _validPostContent(baseDir, nickname, domain, postJsonObject, maxMentions, maxEmoji, allowLocalNetworkAccess, debug): @@ -2535,16 +2536,16 @@ def _inboxAfterInitial(recentPostsCache: {}, maxRecentPosts: int, # should we notify that a post from this person has arrived? # This is for cases where the notify checkbox is enabled # on the person options screen - if not postIsDM and hasObjectDict(postJsonObject): - if postJsonObject['object'].get('attributedTo'): - attributedTo = postJsonObject['object']['attributedTo'] + if not postIsDM and jsonObj: + if jsonObj.get('attributedTo') and jsonObj.get('id'): + attributedTo = jsonObj['attributedTo'] if isinstance(attributedTo, str): fromNickname = getNicknameFromActor(attributedTo) fromDomain, fromPort = getDomainFromActor(attributedTo) fromDomainFull = getFullDomain(fromDomain, fromPort) if notifyWhenPersonPosts(baseDir, nickname, domain, fromNickname, fromDomainFull): - postId = removeIdEnding(postJsonObject['id']) + postId = removeIdEnding(jsonObj['id']) _notifyPostArrival(baseDir, handle, postId) # If this is a reply to a muted post then also mute it. From e65ad3bcc203c72ea35901b17c183e527504c9d6 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 7 Jul 2021 12:03:16 +0100 Subject: [PATCH 1389/1416] Tidying --- daemon.py | 167 ++++++++++++++++++++++-------------------------------- 1 file changed, 69 insertions(+), 98 deletions(-) diff --git a/daemon.py b/daemon.py index 94d16939b..18600857b 100644 --- a/daemon.py +++ b/daemon.py @@ -7832,108 +7832,79 @@ class PubServer(BaseHTTPRequestHandler): statusNumber = postSections[2] if len(statusNumber) <= 10 or (not statusNumber.isdigit()): return False - postFilename = \ - baseDir + '/accounts/' + \ - nickname + '@' + \ - domain + '/outbox/' + \ - httpPrefix + ':##' + \ - domainFull + '#users#' + \ - nickname + '#statuses#' + \ - statusNumber + '.json' - if os.path.isfile(postFilename): - postJsonObject = loadJson(postFilename) - if not postJsonObject: - self.send_response(429) - self.end_headers() - self.server.GETbusy = False - return True - else: - # Only authorized viewers get to see likes - # on posts - # Otherwize marketers could gain more social - # graph info - if not authorized: - pjo = postJsonObject - if not isPublicPost(pjo): - self._404() - self.server.GETbusy = False - return True - removePostInteractions(pjo, True) - if self._requestHTTP(): - recentPostsCache = \ - self.server.recentPostsCache - maxRecentPosts = \ - self.server.maxRecentPosts - translate = \ - self.server.translate - cachedWebfingers = \ - self.server.cachedWebfingers - personCache = \ - self.server.personCache - projectVersion = \ - self.server.projectVersion - ytDomain = \ - self.server.YTReplacementDomain - showPublishedDateOnly = \ - self.server.showPublishedDateOnly - peertubeInstances = \ - self.server.peertubeInstances - allowLocalNetworkAccess = \ - self.server.allowLocalNetworkAccess - themeName = \ - self.server.themeName - msg = \ - htmlIndividualPost(self.server.cssCache, - recentPostsCache, - maxRecentPosts, - translate, - baseDir, - self.server.session, - cachedWebfingers, - personCache, - nickname, - domain, - port, - authorized, - postJsonObject, - httpPrefix, - projectVersion, - likedBy, - ytDomain, - showPublishedDateOnly, - peertubeInstances, - allowLocalNetworkAccess, - themeName) - msg = msg.encode('utf-8') - msglen = len(msg) - self._set_headers('text/html', msglen, - cookie, callingDomain) - self._write(msg) - self._benchmarkGETtimings(GETstartTime, - GETtimings, - 'show skills ' + - 'done', - 'show status') - else: - if self._fetchAuthenticated(): - msg = json.dumps(postJsonObject, - ensure_ascii=False) - msg = msg.encode('utf-8') - msglen = len(msg) - self._set_headers('application/json', - msglen, - None, callingDomain) - self._write(msg) - else: - self._404() - self.server.GETbusy = False - return True - else: + postFilename = \ + baseDir + '/accounts/' + nickname + '@' + domain + '/outbox/' + \ + httpPrefix + ':##' + domainFull + '#users#' + nickname + \ + '#statuses#' + statusNumber + '.json' + if not os.path.isfile(postFilename): self._404() self.server.GETbusy = False return True - return False + + postJsonObject = loadJson(postFilename) + if not postJsonObject: + self.send_response(429) + self.end_headers() + self.server.GETbusy = False + return True + + # Only authorized viewers get to see likes + # on posts + # Otherwize marketers could gain more social + # graph info + if not authorized: + pjo = postJsonObject + if not isPublicPost(pjo): + self._404() + self.server.GETbusy = False + return True + removePostInteractions(pjo, True) + if self._requestHTTP(): + msg = \ + htmlIndividualPost(self.server.cssCache, + self.server.recentPostsCache, + self.server.maxRecentPosts, + self.server.translate, + baseDir, + self.server.session, + self.server.cachedWebfingers, + self.server.personCache, + nickname, domain, port, + authorized, + postJsonObject, + httpPrefix, + self.server.projectVersion, + likedBy, + self.server.YTReplacementDomain, + self.server.showPublishedDateOnly, + self.server.peertubeInstances, + self.server.allowLocalNetworkAccess, + self.server.themeName) + msg = msg.encode('utf-8') + msglen = len(msg) + self._set_headers('text/html', msglen, + cookie, callingDomain) + self._write(msg) + self._benchmarkGETtimings(GETstartTime, + GETtimings, + 'show skills ' + + 'done', + 'show status') + else: + if self._fetchAuthenticated(): + msg = json.dumps(postJsonObject, + ensure_ascii=False) + msg = msg.encode('utf-8') + msglen = len(msg) + self._set_headers('application/json', + msglen, + None, callingDomain) + self._write(msg) + else: + self._404() + self.server.GETbusy = False + return True def _showInbox(self, authorized: bool, callingDomain: str, path: str, From f6355632ec5752a8b7151eb7d4628983029ff2c2 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 7 Jul 2021 12:31:43 +0100 Subject: [PATCH 1390/1416] Less indentation --- daemon.py | 182 +++++++++++++++++++++++------------------------------- 1 file changed, 78 insertions(+), 104 deletions(-) diff --git a/daemon.py b/daemon.py index 18600857b..4f21b00f4 100644 --- a/daemon.py +++ b/daemon.py @@ -7700,111 +7700,85 @@ class PubServer(BaseHTTPRequestHandler): if '/' not in namedStatus: # show actor nickname = namedStatus + return False + + postSections = namedStatus.split('/') + if len(postSections) != 2: + return False + nickname = postSections[0] + statusNumber = postSections[1] + if len(statusNumber) <= 10 or not statusNumber.isdigit(): + return False + + postFilename = \ + baseDir + '/accounts/' + nickname + '@' + domain + '/outbox/' + \ + httpPrefix + ':##' + domainFull + '#users#' + nickname + \ + '#statuses#' + statusNumber + '.json' + if not os.path.isfile(postFilename): + self._404() + self.server.GETbusy = False + return True + + postJsonObject = loadJson(postFilename) + loadedPost = False + if postJsonObject: + loadedPost = True else: - postSections = namedStatus.split('/') - if len(postSections) == 2: - nickname = postSections[0] - statusNumber = postSections[1] - if len(statusNumber) > 10 and statusNumber.isdigit(): - postFilename = \ - baseDir + '/accounts/' + \ - nickname + '@' + \ - domain + '/outbox/' + \ - httpPrefix + ':##' + \ - domainFull + '#users#' + \ - nickname + '#statuses#' + \ - statusNumber + '.json' - if os.path.isfile(postFilename): - postJsonObject = loadJson(postFilename) - loadedPost = False - if postJsonObject: - loadedPost = True - else: - postJsonObject = {} - if loadedPost: - # Only authorized viewers get to see likes - # on posts. Otherwize marketers could gain - # more social graph info - if not authorized: - pjo = postJsonObject - if not isPublicPost(pjo): - self._404() - self.server.GETbusy = False - return True - removePostInteractions(pjo, True) - if self._requestHTTP(): - recentPostsCache = \ - self.server.recentPostsCache - maxRecentPosts = \ - self.server.maxRecentPosts - translate = \ - self.server.translate - cachedWebfingers = \ - self.server.cachedWebfingers - personCache = \ - self.server.personCache - projectVersion = \ - self.server.projectVersion - ytDomain = \ - self.server.YTReplacementDomain - showPublishedDateOnly = \ - self.server.showPublishedDateOnly - peertubeInstances = \ - self.server.peertubeInstances - cssCache = self.server.cssCache - allowLocalNetworkAccess = \ - self.server.allowLocalNetworkAccess - themeName = \ - self.server.themeName - msg = \ - htmlIndividualPost(cssCache, - recentPostsCache, - maxRecentPosts, - translate, - self.server.baseDir, - self.server.session, - cachedWebfingers, - personCache, - nickname, - domain, - port, - authorized, - postJsonObject, - httpPrefix, - projectVersion, - likedBy, - ytDomain, - showPublishedDateOnly, - peertubeInstances, - allowLocalNetworkAccess, - themeName) - msg = msg.encode('utf-8') - msglen = len(msg) - self._set_headers('text/html', msglen, - cookie, callingDomain) - self._write(msg) - else: - if self._fetchAuthenticated(): - msg = json.dumps(postJsonObject, - ensure_ascii=False) - msg = msg.encode('utf-8') - msglen = len(msg) - self._set_headers('application/json', - msglen, - None, callingDomain) - self._write(msg) - else: - self._404() - self.server.GETbusy = False - self._benchmarkGETtimings(GETstartTime, GETtimings, - 'new post done', - 'individual post shown') - return True - else: - self._404() - self.server.GETbusy = False - return True - return False + postJsonObject = {} + if loadedPost: + # Only authorized viewers get to see likes + # on posts. Otherwize marketers could gain + # more social graph info + if not authorized: + pjo = postJsonObject + if not isPublicPost(pjo): + self._404() + self.server.GETbusy = False + return True + removePostInteractions(pjo, True) + if self._requestHTTP(): + msg = \ + htmlIndividualPost(self.server.cssCache, + self.server.recentPostsCache, + self.server.maxRecentPosts, + self.server.translate, + self.server.baseDir, + self.server.session, + self.server.cachedWebfingers, + self.server.personCache, + nickname, domain, port, + authorized, + postJsonObject, + httpPrefix, + self.server.projectVersion, + likedBy, + self.server.YTReplacementDomain, + self.server.showPublishedDateOnly, + self.server.peertubeInstances, + self.server.allowLocalNetworkAccess, + self.server.themeName) + msg = msg.encode('utf-8') + msglen = len(msg) + self._set_headers('text/html', msglen, + cookie, callingDomain) + self._write(msg) + else: + if self._fetchAuthenticated(): + msg = json.dumps(postJsonObject, + ensure_ascii=False) + msg = msg.encode('utf-8') + msglen = len(msg) + self._set_headers('application/json', + msglen, + None, callingDomain) + self._write(msg) + else: + self._404() + self.server.GETbusy = False + self._benchmarkGETtimings(GETstartTime, GETtimings, + 'new post done', + 'individual post shown') + return True def _showIndividualPost(self, authorized: bool, callingDomain: str, path: str, From 5f09f52c9f6d92cd8d9678b95e8514a667f37e5c Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 7 Jul 2021 12:52:25 +0100 Subject: [PATCH 1391/1416] Tidying of individual post functions --- daemon.py | 151 +++++++++++++++++++++--------------------------------- 1 file changed, 57 insertions(+), 94 deletions(-) diff --git a/daemon.py b/daemon.py index 4f21b00f4..8e92e37e5 100644 --- a/daemon.py +++ b/daemon.py @@ -7714,103 +7714,26 @@ class PubServer(BaseHTTPRequestHandler): baseDir + '/accounts/' + nickname + '@' + domain + '/outbox/' + \ httpPrefix + ':##' + domainFull + '#users#' + nickname + \ '#statuses#' + statusNumber + '.json' - if not os.path.isfile(postFilename): - self._404() - self.server.GETbusy = False - return True - postJsonObject = loadJson(postFilename) - loadedPost = False - if postJsonObject: - loadedPost = True - else: - postJsonObject = {} - if loadedPost: - # Only authorized viewers get to see likes - # on posts. Otherwize marketers could gain - # more social graph info - if not authorized: - pjo = postJsonObject - if not isPublicPost(pjo): - self._404() - self.server.GETbusy = False - return True - removePostInteractions(pjo, True) - if self._requestHTTP(): - msg = \ - htmlIndividualPost(self.server.cssCache, - self.server.recentPostsCache, - self.server.maxRecentPosts, - self.server.translate, - self.server.baseDir, - self.server.session, - self.server.cachedWebfingers, - self.server.personCache, - nickname, domain, port, - authorized, - postJsonObject, - httpPrefix, - self.server.projectVersion, - likedBy, - self.server.YTReplacementDomain, - self.server.showPublishedDateOnly, - self.server.peertubeInstances, - self.server.allowLocalNetworkAccess, - self.server.themeName) - msg = msg.encode('utf-8') - msglen = len(msg) - self._set_headers('text/html', msglen, - cookie, callingDomain) - self._write(msg) - else: - if self._fetchAuthenticated(): - msg = json.dumps(postJsonObject, - ensure_ascii=False) - msg = msg.encode('utf-8') - msglen = len(msg) - self._set_headers('application/json', - msglen, - None, callingDomain) - self._write(msg) - else: - self._404() - self.server.GETbusy = False - self._benchmarkGETtimings(GETstartTime, GETtimings, - 'new post done', - 'individual post shown') - return True + return self._showPostFromFile(postFilename, likedBy, + authorized, callingDomain, path, + baseDir, httpPrefix, nickname, + domain, domainFull, port, + onionDomain, i2pDomain, + GETstartTime, GETtimings, + proxyType, cookie, debug) - def _showIndividualPost(self, authorized: bool, - callingDomain: str, path: str, - baseDir: str, httpPrefix: str, - domain: str, domainFull: str, port: int, - onionDomain: str, i2pDomain: str, - GETstartTime, GETtimings: {}, - proxyType: str, cookie: str, - debug: str) -> bool: - """Shows an individual post + def _showPostFromFile(self, postFilename: str, likedBy: str, + authorized: bool, + callingDomain: str, path: str, + baseDir: str, httpPrefix: str, nickname: str, + domain: str, domainFull: str, port: int, + onionDomain: str, i2pDomain: str, + GETstartTime, GETtimings: {}, + proxyType: str, cookie: str, + debug: str) -> bool: + """Shows an individual post from its filename """ - likedBy = None - if '?likedBy=' in path: - likedBy = path.split('?likedBy=')[1].strip() - if '?' in likedBy: - likedBy = likedBy.split('?')[0] - path = path.split('?likedBy=')[0] - namedStatus = path.split('/users/')[1] - if '/' not in namedStatus: - return False - postSections = namedStatus.split('/') - if len(postSections) < 3: - return False - nickname = postSections[0] - statusNumber = postSections[2] - if len(statusNumber) <= 10 or (not statusNumber.isdigit()): - return False - - postFilename = \ - baseDir + '/accounts/' + nickname + '@' + domain + '/outbox/' + \ - httpPrefix + ':##' + domainFull + '#users#' + nickname + \ - '#statuses#' + statusNumber + '.json' if not os.path.isfile(postFilename): self._404() self.server.GETbusy = False @@ -7880,6 +7803,46 @@ class PubServer(BaseHTTPRequestHandler): self.server.GETbusy = False return True + def _showIndividualPost(self, authorized: bool, + callingDomain: str, path: str, + baseDir: str, httpPrefix: str, + domain: str, domainFull: str, port: int, + onionDomain: str, i2pDomain: str, + GETstartTime, GETtimings: {}, + proxyType: str, cookie: str, + debug: str) -> bool: + """Shows an individual post + """ + likedBy = None + if '?likedBy=' in path: + likedBy = path.split('?likedBy=')[1].strip() + if '?' in likedBy: + likedBy = likedBy.split('?')[0] + path = path.split('?likedBy=')[0] + namedStatus = path.split('/users/')[1] + if '/' not in namedStatus: + return False + postSections = namedStatus.split('/') + if len(postSections) < 3: + return False + nickname = postSections[0] + statusNumber = postSections[2] + if len(statusNumber) <= 10 or (not statusNumber.isdigit()): + return False + + postFilename = \ + baseDir + '/accounts/' + nickname + '@' + domain + '/outbox/' + \ + httpPrefix + ':##' + domainFull + '#users#' + nickname + \ + '#statuses#' + statusNumber + '.json' + + return self._showPostFromFile(postFilename, likedBy, + authorized, callingDomain, path, + baseDir, httpPrefix, nickname, + domain, domainFull, port, + onionDomain, i2pDomain, + GETstartTime, GETtimings, + proxyType, cookie, debug) + def _showInbox(self, authorized: bool, callingDomain: str, path: str, baseDir: str, httpPrefix: str, From d512b23216bd97db2209cca781be616e0f60353c Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 7 Jul 2021 13:00:35 +0100 Subject: [PATCH 1392/1416] Comments --- daemon.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/daemon.py b/daemon.py index 8e92e37e5..ecc699efb 100644 --- a/daemon.py +++ b/daemon.py @@ -7746,10 +7746,8 @@ class PubServer(BaseHTTPRequestHandler): self.server.GETbusy = False return True - # Only authorized viewers get to see likes - # on posts - # Otherwize marketers could gain more social - # graph info + # Only authorized viewers get to see likes on posts + # Otherwize marketers could gain more social graph info if not authorized: pjo = postJsonObject if not isPublicPost(pjo): From 19bd991fee9ecd9b63c876848ad2c8eecfdf12ad Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 7 Jul 2021 13:26:38 +0100 Subject: [PATCH 1393/1416] Show local post on notification --- daemon.py | 47 +++++++++++++++++++++++++++++++++++++++++++++++ inbox.py | 7 ++++++- 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/daemon.py b/daemon.py index ecc699efb..4b8f7354f 100644 --- a/daemon.py +++ b/daemon.py @@ -7841,6 +7841,38 @@ class PubServer(BaseHTTPRequestHandler): GETstartTime, GETtimings, proxyType, cookie, debug) + def _showNotifyPost(self, authorized: bool, + callingDomain: str, path: str, + baseDir: str, httpPrefix: str, + domain: str, domainFull: str, port: int, + onionDomain: str, i2pDomain: str, + GETstartTime, GETtimings: {}, + proxyType: str, cookie: str, + debug: str) -> bool: + """Shows an individual post from an account which you are following + and where you have the notify checkbox set on person options + """ + likedBy = None + postId = path.split('?notifypost=')[1].strip() + postId = postId.replace('-', '/') + path = path.split('?notifypost=')[0] + nickname = path.split('/users/')[1] + if '/' in nickname: + return False + replies = False + + postFilename = locatePost(baseDir, nickname, domain, postId, replies) + if not postFilename: + return False + + return self._showPostFromFile(postFilename, likedBy, + authorized, callingDomain, path, + baseDir, httpPrefix, nickname, + domain, domainFull, port, + onionDomain, i2pDomain, + GETstartTime, GETtimings, + proxyType, cookie, debug) + def _showInbox(self, authorized: bool, callingDomain: str, path: str, baseDir: str, httpPrefix: str, @@ -12419,6 +12451,21 @@ class PubServer(BaseHTTPRequestHandler): 'post roles done', 'show skills done') + if '?notifypost=' in self.path and usersInPath and authorized: + if self._showNotifyPost(authorized, + callingDomain, self.path, + self.server.baseDir, + self.server.httpPrefix, + self.server.domain, + self.server.domainFull, + self.server.port, + self.server.onionDomain, + self.server.i2pDomain, + GETstartTime, GETtimings, + self.server.proxyType, + cookie, self.server.debug): + return + # get an individual post from the path # /users/nickname/statuses/number if '/statuses/' in self.path and usersInPath: diff --git a/inbox.py b/inbox.py index 8203f1f1e..24ed00f90 100644 --- a/inbox.py +++ b/inbox.py @@ -2546,7 +2546,12 @@ def _inboxAfterInitial(recentPostsCache: {}, maxRecentPosts: int, if notifyWhenPersonPosts(baseDir, nickname, domain, fromNickname, fromDomainFull): postId = removeIdEnding(jsonObj['id']) - _notifyPostArrival(baseDir, handle, postId) + postLink = \ + httpPrefix + '://' + \ + getFullDomain(domain, port) + \ + '/users/' + nickname + \ + '?notifypost=' + postId.replace('/', '-') + _notifyPostArrival(baseDir, handle, postLink) # If this is a reply to a muted post then also mute it. # This enables you to ignore a threat that's getting boring From 011816817335ed65ee7a622483a180740efa5609 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Wed, 7 Jul 2021 15:00:53 +0100 Subject: [PATCH 1394/1416] Limit word lengths within newswire titles --- newswire.py | 44 ++++++++++++++++++++++++++++++++++---------- tests.py | 14 ++++++++++++++ 2 files changed, 48 insertions(+), 10 deletions(-) diff --git a/newswire.py b/newswire.py index dca813fb2..63379a605 100644 --- a/newswire.py +++ b/newswire.py @@ -93,22 +93,43 @@ def getNewswireTags(text: str, maxTags: int) -> []: words = textSimplified.split(' ') tags = [] for wrd in words: - if wrd.startswith('#'): - if len(wrd) > 1: - if wrd not in tags: - tags.append(wrd) - if len(tags) >= maxTags: - break + if not wrd.startswith('#'): + continue + if len(wrd) <= 1: + continue + if wrd in tags: + continue + tags.append(wrd) + if len(tags) >= maxTags: + break return tags +def limitWordLengths(text: str, maxWordLength: int) -> str: + """Limits the maximum length of words so that the newswire + column cannot become too wide + """ + if ' ' not in text: + return text + words = text.split(' ') + result = '' + for wrd in words: + if len(wrd) > maxWordLength: + wrd = wrd[:maxWordLength] + if result: + result += ' ' + result += wrd + return result + + def _addNewswireDictEntry(baseDir: str, domain: str, newswire: {}, dateStr: str, title: str, link: str, votesStatus: str, postFilename: str, description: str, moderated: bool, mirrored: bool, - tags=[], maxTags=32) -> None: + tags: [] = [], + maxTags: int = 32) -> None: """Update the newswire dictionary """ # remove any markup @@ -121,6 +142,8 @@ def _addNewswireDictEntry(baseDir: str, domain: str, if isFiltered(baseDir, None, None, allText): return + title = limitWordLengths(title, 13) + if tags is None: tags = [] @@ -129,9 +152,10 @@ def _addNewswireDictEntry(baseDir: str, domain: str, # combine the tags into a single list for tag in tags: - if tag not in postTags: - if len(postTags) < maxTags: - postTags.append(tag) + if tag in postTags: + continue + if len(postTags) < maxTags: + postTags.append(tag) # check that no tags are blocked for tag in postTags: diff --git a/tests.py b/tests.py index 9fe956d83..cbcec1c6c 100644 --- a/tests.py +++ b/tests.py @@ -115,6 +115,7 @@ from newsdaemon import hashtagRuleTree from newsdaemon import hashtagRuleResolve from newswire import getNewswireTags from newswire import parseFeedDate +from newswire import limitWordLengths from mastoapiv1 import getMastoApiV1IdFromNickname from mastoapiv1 import getNicknameFromMastoApiV1Id from webapp_post import prepareHtmlPostNickname @@ -4141,9 +4142,22 @@ def _testSwitchWords() -> None: assert result == 'This is a test hamster' +def _testLimitWordLengths() -> None: + print('testLimitWordLengths') + maxWordLength = 13 + text = "This is a test" + result = limitWordLengths(text, maxWordLength) + assert result == text + + text = "This is an exceptionallylongword test" + result = limitWordLengths(text, maxWordLength) + assert result == "This is an exceptionally test" + + def runAllTests(): print('Running tests...') updateDefaultThemesList(os.getcwd()) + _testLimitWordLengths() _testSwitchWords() _testFunctions() _testUserAgentDomain() From c8b39b044931caf79d4b61ac5a9f1310fe647aa8 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 9 Jul 2021 21:00:02 +0100 Subject: [PATCH 1395/1416] Check string types --- daemon.py | 8 -------- desktop_client.py | 51 ++++++++++++++++++++++++++++------------------- 2 files changed, 31 insertions(+), 28 deletions(-) diff --git a/daemon.py b/daemon.py index 4b8f7354f..c6c8ef2f1 100644 --- a/daemon.py +++ b/daemon.py @@ -733,10 +733,6 @@ class PubServer(BaseHTTPRequestHandler): self.send_header('Host', callingDomain) self.send_header('InstanceID', self.server.instanceId) self.send_header('Content-Length', '0') - # self.send_header('X-Robots-Tag', - # 'noindex, nofollow, noarchive, nosnippet') - # self.send_header('Cache-Control', 'public') - # self.send_header('Referrer-Policy', 'origin') self.end_headers() def _httpReturnCode(self, httpCode: int, httpDescription: str, @@ -756,10 +752,6 @@ class PubServer(BaseHTTPRequestHandler): self.send_header('Content-Type', 'text/html; charset=utf-8') msgLenStr = str(len(msg)) self.send_header('Content-Length', msgLenStr) - # self.send_header('X-Robots-Tag', - # 'noindex, nofollow, noarchive, nosnippet') - # self.send_header('Cache-Control', 'public') - # self.send_header('Referrer-Policy', 'origin') self.end_headers() if not self._write(msg): print('Error when showing ' + str(httpCode)) diff --git a/desktop_client.py b/desktop_client.py index 6382c4d1b..9cf3d799f 100644 --- a/desktop_client.py +++ b/desktop_client.py @@ -692,29 +692,40 @@ def _readLocalBoxPost(session, nickname: str, domain: str, if hasObjectDict(postJsonObject2): if postJsonObject2['object'].get('attributedTo') and \ postJsonObject2['object'].get('content'): - actor = postJsonObject2['object']['attributedTo'] - nameStr += ' ' + translate['announces'] + ' ' + \ - getNicknameFromActor(actor) - sayStr = nameStr - _sayCommand(sayStr, sayStr, screenreader, - systemLanguage, espeak) - print('') - if screenreader: - time.sleep(2) - content = \ - _textOnlyContent(postJsonObject2['object']['content']) - content += _getImageDescription(postJsonObject2) - messageStr, detectedLinks = \ - speakableText(baseDir, content, translate) - sayStr = content - _sayCommand(sayStr, messageStr, screenreader, - systemLanguage, espeak) - return postJsonObject2 + attributedTo = postJsonObject2['object']['attributedTo'] + content = postJsonObject2['object']['content'] + if isinstance(attributedTo, str) and \ + isinstance(content, str): + actor = attributedTo + nameStr += ' ' + translate['announces'] + ' ' + \ + getNicknameFromActor(actor) + sayStr = nameStr + _sayCommand(sayStr, sayStr, screenreader, + systemLanguage, espeak) + print('') + if screenreader: + time.sleep(2) + content = \ + _textOnlyContent(content) + content += _getImageDescription(postJsonObject2) + messageStr, detectedLinks = \ + speakableText(baseDir, content, translate) + sayStr = content + _sayCommand(sayStr, messageStr, screenreader, + systemLanguage, espeak) + return postJsonObject2 return {} - actor = postJsonObject['object']['attributedTo'] + attributedTo = postJsonObject['object']['attributedTo'] + if not attributedTo: + return {} + content = postJsonObject['object']['content'] + if not isinstance(attributedTo, str) or \ + not isinstance(content, str): + return {} + actor = attributedTo nameStr = getNicknameFromActor(actor) - content = _textOnlyContent(postJsonObject['object']['content']) + content = _textOnlyContent(content) content += _getImageDescription(postJsonObject) if isPGPEncrypted(content): From dddf2bb57f3c11161955c362a21169b9a2ca2a32 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 9 Jul 2021 21:12:46 +0100 Subject: [PATCH 1396/1416] Checking for images --- daemon.py | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/daemon.py b/daemon.py index c6c8ef2f1..1a9b6c125 100644 --- a/daemon.py +++ b/daemon.py @@ -6082,11 +6082,7 @@ class PubServer(BaseHTTPRequestHandler): GETstartTime, GETtimings: {}) -> None: """Shows a help screen image """ - if not path.endswith('.jpg') and \ - not path.endswith('.png') and \ - not path.endswith('.webp') and \ - not path.endswith('.avif') and \ - not path.endswith('.gif'): + if not isImageFile(path): return mediaStr = path.split('/helpimages/')[1] if '/' not in mediaStr: @@ -11389,14 +11385,9 @@ class PubServer(BaseHTTPRequestHandler): 'show screenshot done') # image on login screen or qrcode - if self.path == '/login.png' or \ - self.path == '/login.gif' or \ - self.path == '/login.svg' or \ - self.path == '/login.webp' or \ - self.path == '/login.avif' or \ - self.path == '/login.jpeg' or \ - self.path == '/login.jpg' or \ - self.path == '/qrcode.png': + if (isImageFile(self.path) and + (self.path.startswith('/login.') or + self.path.startswith('/qrcode.png'))): iconFilename = \ self.server.baseDir + '/accounts' + self.path if os.path.isfile(iconFilename): From 8a1e196b150d23beec4eb6c70c8b77759cbd6499 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 9 Jul 2021 21:19:18 +0100 Subject: [PATCH 1397/1416] Tidying --- daemon.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/daemon.py b/daemon.py index 1a9b6c125..a3ac57ee1 100644 --- a/daemon.py +++ b/daemon.py @@ -3235,16 +3235,16 @@ class PubServer(BaseHTTPRequestHandler): mediaFilenameBase = accountsDir + '/upload' mediaFilename = mediaFilenameBase + '.png' - if self.headers['Content-type'].endswith('jpeg'): - mediaFilename = mediaFilenameBase + '.jpg' - if self.headers['Content-type'].endswith('gif'): - mediaFilename = mediaFilenameBase + '.gif' - if self.headers['Content-type'].endswith('svg+xml'): - mediaFilename = mediaFilenameBase + '.svg' - if self.headers['Content-type'].endswith('webp'): - mediaFilename = mediaFilenameBase + '.webp' - if self.headers['Content-type'].endswith('avif'): - mediaFilename = mediaFilenameBase + '.avif' + imageMedia = { + 'jpeg': 'jpg', + 'gif': 'gif', + 'svg+xml': 'svg', + 'webp': 'webp', + 'avif': 'avif' + } + for mimeExt, ext in imageMedia: + if self.headers['Content-type'].endswith(mimeExt): + mediaFilename = mediaFilenameBase + '.' + ext with open(mediaFilename, 'wb') as avFile: avFile.write(mediaBytes) if debug: From 266eb1af474b3d3747c90dbca2fbbc2f77c9a339 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 9 Jul 2021 21:24:56 +0100 Subject: [PATCH 1398/1416] Tidying --- daemon.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/daemon.py b/daemon.py index a3ac57ee1..d41322630 100644 --- a/daemon.py +++ b/daemon.py @@ -3242,9 +3242,10 @@ class PubServer(BaseHTTPRequestHandler): 'webp': 'webp', 'avif': 'avif' } - for mimeExt, ext in imageMedia: + for mimeExt, ext in imageMedia.items(): if self.headers['Content-type'].endswith(mimeExt): mediaFilename = mediaFilenameBase + '.' + ext + break with open(mediaFilename, 'wb') as avFile: avFile.write(mediaBytes) if debug: @@ -10128,18 +10129,17 @@ class PubServer(BaseHTTPRequestHandler): self._304() return True mediaImageType = 'png' - if avatarFile.endswith('.png'): - mediaImageType = 'png' - elif avatarFile.endswith('.jpg'): - mediaImageType = 'jpeg' - elif avatarFile.endswith('.gif'): - mediaImageType = 'gif' - elif avatarFile.endswith('.avif'): - mediaImageType = 'avif' - elif avatarFile.endswith('.svg'): - mediaImageType = 'svg+xml' - else: - mediaImageType = 'webp' + extensionsToMime = { + 'jpg': 'jpeg', + 'gif': 'gif', + 'avif': 'avif', + 'svg': 'svg+xml', + 'webp': 'webp' + } + for ext, mimeExt in extensionsToMime.items(): + if avatarFile.endswith('.' + ext): + mediaImageType = mimeExt + break with open(avatarFilename, 'rb') as avFile: mediaBinary = avFile.read() self._set_headers_etag(avatarFilename, From d1b1e18af409bc7ccc2bbde8e43ae3b25235a163 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 9 Jul 2021 21:26:33 +0100 Subject: [PATCH 1399/1416] Prepend image --- daemon.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/daemon.py b/daemon.py index d41322630..9209bc4e0 100644 --- a/daemon.py +++ b/daemon.py @@ -10128,7 +10128,7 @@ class PubServer(BaseHTTPRequestHandler): # The file has not changed self._304() return True - mediaImageType = 'png' + mediaImageType = 'image/png' extensionsToMime = { 'jpg': 'jpeg', 'gif': 'gif', @@ -10138,12 +10138,12 @@ class PubServer(BaseHTTPRequestHandler): } for ext, mimeExt in extensionsToMime.items(): if avatarFile.endswith('.' + ext): - mediaImageType = mimeExt + mediaImageType = 'image/' + mimeExt break with open(avatarFilename, 'rb') as avFile: mediaBinary = avFile.read() self._set_headers_etag(avatarFilename, - 'image/' + mediaImageType, + mediaImageType, mediaBinary, None, self.server.domainFull) self._write(mediaBinary) From e8553eb192738e46052b281385e299535165fd4b Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Fri, 9 Jul 2021 21:53:49 +0100 Subject: [PATCH 1400/1416] Tidying --- daemon.py | 62 +++++++++---------------------------------------------- utils.py | 34 ++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 52 deletions(-) diff --git a/daemon.py b/daemon.py index 9209bc4e0..d0713e567 100644 --- a/daemon.py +++ b/daemon.py @@ -208,6 +208,8 @@ from shares import addShare from shares import removeShare from shares import expireShares from categories import setHashtagCategory +from utils import getImageExtensionFromMimeType +from utils import getImageMimeType from utils import hasObjectDict from utils import userAgentDomain from utils import isLocalNetworkAddress @@ -3234,18 +3236,9 @@ class PubServer(BaseHTTPRequestHandler): return mediaFilenameBase = accountsDir + '/upload' - mediaFilename = mediaFilenameBase + '.png' - imageMedia = { - 'jpeg': 'jpg', - 'gif': 'gif', - 'svg+xml': 'svg', - 'webp': 'webp', - 'avif': 'avif' - } - for mimeExt, ext in imageMedia.items(): - if self.headers['Content-type'].endswith(mimeExt): - mediaFilename = mediaFilenameBase + '.' + ext - break + mediaFilename = \ + mediaFilenameBase + '.' + \ + getImageExtensionFromMimeType(self.headers['Content-type']) with open(mediaFilename, 'wb') as avFile: avFile.write(mediaBytes) if debug: @@ -6004,23 +5997,11 @@ class PubServer(BaseHTTPRequestHandler): self._304() return - mediaImageType = 'png' - if emojiFilename.endswith('.png'): - mediaImageType = 'png' - elif emojiFilename.endswith('.jpg'): - mediaImageType = 'jpeg' - elif emojiFilename.endswith('.webp'): - mediaImageType = 'webp' - elif emojiFilename.endswith('.avif'): - mediaImageType = 'avif' - elif emojiFilename.endswith('.svg'): - mediaImageType = 'svg+xml' - else: - mediaImageType = 'gif' + mediaImageType = getImageMimeType(emojiFilename) with open(emojiFilename, 'rb') as avFile: mediaBinary = avFile.read() self._set_headers_etag(emojiFilename, - 'image/' + mediaImageType, + mediaImageType, mediaBinary, None, self.server.domainFull) self._write(mediaBinary) @@ -10059,23 +10040,11 @@ class PubServer(BaseHTTPRequestHandler): self._304() return True - mediaFileType = 'png' - if mediaFilename.endswith('.png'): - mediaFileType = 'png' - elif mediaFilename.endswith('.jpg'): - mediaFileType = 'jpeg' - elif mediaFilename.endswith('.webp'): - mediaFileType = 'webp' - elif mediaFilename.endswith('.avif'): - mediaFileType = 'avif' - elif mediaFilename.endswith('.svg'): - mediaFileType = 'svg+xml' - else: - mediaFileType = 'gif' + mediaFileType = getImageMimeType(mediaFilename) with open(mediaFilename, 'rb') as avFile: mediaBinary = avFile.read() self._set_headers_etag(mediaFilename, - 'image/' + mediaFileType, + mediaFileType, mediaBinary, None, self.server.domainFull) self._write(mediaBinary) @@ -10128,18 +10097,7 @@ class PubServer(BaseHTTPRequestHandler): # The file has not changed self._304() return True - mediaImageType = 'image/png' - extensionsToMime = { - 'jpg': 'jpeg', - 'gif': 'gif', - 'avif': 'avif', - 'svg': 'svg+xml', - 'webp': 'webp' - } - for ext, mimeExt in extensionsToMime.items(): - if avatarFile.endswith('.' + ext): - mediaImageType = 'image/' + mimeExt - break + mediaImageType = getImageMimeType(avatarFile) with open(avatarFilename, 'rb') as avFile: mediaBinary = avFile.read() self._set_headers_etag(avatarFilename, diff --git a/utils.py b/utils.py index 9d21085f2..a20fcd180 100644 --- a/utils.py +++ b/utils.py @@ -238,6 +238,40 @@ def getImageExtensions() -> []: return ('png', 'jpg', 'jpeg', 'gif', 'webp', 'avif', 'svg') +def getImageMimeType(imageFilename: str) -> str: + """Returns the mime type for the given image + """ + extensionsToMime = { + 'png': 'png', + 'jpg': 'jpeg', + 'gif': 'gif', + 'avif': 'avif', + 'svg': 'svg+xml', + 'webp': 'webp' + } + for ext, mimeExt in extensionsToMime.items(): + if imageFilename.endswith('.' + ext): + return 'image/' + mimeExt + return 'image/png' + + +def getImageExtensionFromMimeType(contentType: str) -> str: + """Returns the image extension from a mime type, such as image/jpeg + """ + imageMedia = { + 'png': 'png', + 'jpeg': 'jpg', + 'gif': 'gif', + 'svg+xml': 'svg', + 'webp': 'webp', + 'avif': 'avif' + } + for mimeExt, ext in imageMedia.items(): + if contentType.endswith(mimeExt): + return ext + return 'png' + + def getVideoExtensions() -> []: """Returns a list of the possible video file extensions """ From 7511af13d0d123cd0cda66ce956485ecd35b7095 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sat, 10 Jul 2021 10:38:59 +0100 Subject: [PATCH 1401/1416] Limit the number of times that the same word can be repeated --- content.py | 33 +++++++++++++++++++++++++++++++++ posts.py | 4 ++++ tests.py | 39 +++++++++++++++++++++++++++++++++++++++ webapp_column_right.py | 4 ++++ webapp_post.py | 2 ++ 5 files changed, 82 insertions(+) diff --git a/content.py b/content.py index 960d3f033..253740358 100644 --- a/content.py +++ b/content.py @@ -866,6 +866,7 @@ def addHtmlTags(baseDir: str, httpPrefix: str, content = addWebLinks(content) if longWordsList: content = removeLongWords(content, maxWordLength, longWordsList) + content = limitRepeatedWords(content, 6) content = content.replace(' --linebreak-- ', '

') content = htmlReplaceEmailQuote(content) return '

' + htmlReplaceQuoteMarks(content) + '

' @@ -1053,3 +1054,35 @@ def extractTextFieldsInPOST(postBytes, boundary: str, debug: bool, postValue += postLines[line] fields[postKey] = urllib.parse.unquote(postValue) return fields + + +def limitRepeatedWords(text: str, maxRepeats: int) -> str: + """Removes words which are repeated many times + """ + words = text.replace('\n', ' ').split(' ') + repeatCtr = 0 + repeatedText = '' + replacements = {} + prevWord = '' + for word in words: + if word == prevWord: + repeatCtr += 1 + if repeatedText: + repeatedText += ' ' + word + else: + repeatedText = word + ' ' + word + else: + if repeatCtr > maxRepeats: + newText = ((prevWord + ' ') * maxRepeats).strip() + replacements[prevWord] = [repeatedText, newText] + repeatCtr = 0 + repeatedText = '' + prevWord = word + + if repeatCtr > maxRepeats: + newText = ((prevWord + ' ') * maxRepeats).strip() + replacements[prevWord] = [repeatedText, newText] + + for word, item in replacements.items(): + text = text.replace(item[0], item[1]) + return text diff --git a/posts.py b/posts.py index 0dc9e7179..07cef6cab 100644 --- a/posts.py +++ b/posts.py @@ -61,6 +61,7 @@ from utils import removeHtml from utils import dangerousMarkup from media import attachMedia from media import replaceYouTube +from content import limitRepeatedWords from content import tagExists from content import removeLongWords from content import addHtmlTags @@ -4031,6 +4032,9 @@ def downloadAnnounce(session, baseDir: str, httpPrefix: str, # remove any long words contentStr = removeLongWords(contentStr, 40, []) + # Prevent the same word from being repeated many times + contentStr = limitRepeatedWords(contentStr, 6) + # remove text formatting, such as bold/italics contentStr = removeTextFormatting(contentStr) diff --git a/tests.py b/tests.py index cbcec1c6c..eacaa47bd 100644 --- a/tests.py +++ b/tests.py @@ -94,6 +94,7 @@ from inbox import jsonPostAllowsComments from inbox import validInbox from inbox import validInboxFilenames from categories import guessHashtagCategory +from content import limitRepeatedWords from content import switchWords from content import extractTextFieldsInPOST from content import validHashTag @@ -4154,9 +4155,47 @@ def _testLimitWordLengths() -> None: assert result == "This is an exceptionally test" +def _testLimitRepetedWords() -> None: + print('limitRepeatedWords') + text = \ + "This is a preamble.\n\n" + \ + "Same Same Same Same Same Same Same Same Same Same " + \ + "Same Same Same Same Same Same Same Same Same Same " + \ + "Same Same Same Same Same Same Same Same Same Same " + \ + "Same Same Same Same Same Same Same Same Same Same " + \ + "Same Same Same Same Same Same Same Same Same Same " + \ + "Same Same Same Same Same Same Same Same Same Same " + \ + "Same Same Same Same Same Same Same Same Same Same\n\n" + \ + "Some other text." + expected = \ + "This is a preamble.\n\n" + \ + "Same Same Same Same Same Same\n\n" + \ + "Some other text." + result = limitRepeatedWords(text, 6) + assert result == expected + + text = \ + "This is other preamble.\n\n" + \ + "Same Same Same Same Same Same Same Same Same Same " + \ + "Same Same Same Same Same Same Same Same Same Same " + \ + "Same Same Same Same Same Same Same Same Same Same " + \ + "Same Same Same Same Same Same Same Same Same Same " + \ + "Same Same Same Same Same Same Same Same Same Same " + \ + "Same Same Same Same Same Same Same Same Same Same " + \ + "Same Same Same Same Same Same Same Same Same Same " + \ + "Same Same Same Same Same Same Same Same Same Same " + \ + "Same Same Same Same Same Same Same Same Same Same" + expected = \ + "This is other preamble.\n\n" + \ + "Same Same Same Same Same Same" + result = limitRepeatedWords(text, 6) + assert result == expected + + def runAllTests(): print('Running tests...') updateDefaultThemesList(os.getcwd()) + _testLimitRepetedWords() _testLimitWordLengths() _testSwitchWords() _testFunctions() diff --git a/webapp_column_right.py b/webapp_column_right.py index 731ac86bf..ab3cff465 100644 --- a/webapp_column_right.py +++ b/webapp_column_right.py @@ -10,6 +10,7 @@ __module_group__ = "Web Interface Columns" import os from datetime import datetime from content import removeLongWords +from content import limitRepeatedWords from utils import removeHtml from utils import locatePost from utils import loadJson @@ -265,6 +266,7 @@ def _htmlNewswire(baseDir: str, newswire: {}, nickname: str, moderator: bool, _votesIndicator(totalVotes, positiveVoting) title = removeLongWords(item[0], 16, []).replace('\n', '
') + title = limitRepeatedWords(title, 6) htmlStr += '

' + \ '' + \ @@ -293,6 +295,7 @@ def _htmlNewswire(baseDir: str, newswire: {}, nickname: str, moderator: bool, _votesIndicator(totalVotes, positiveVoting) title = removeLongWords(item[0], 16, []).replace('\n', '
') + title = limitRepeatedWords(title, 6) if moderator and moderatedItem: htmlStr += '

' + \ '') + title = limitRepeatedWords(title, 6) link = item[1] citationValue = \ diff --git a/webapp_post.py b/webapp_post.py index 3d3ff9941..a787535be 100644 --- a/webapp_post.py +++ b/webapp_post.py @@ -45,6 +45,7 @@ from utils import removeIdEnding from utils import getNicknameFromActor from utils import getDomainFromActor from utils import isEventPost +from content import limitRepeatedWords from content import replaceEmojiFromTags from content import htmlReplaceQuoteMarks from content import htmlReplaceEmailQuote @@ -1601,6 +1602,7 @@ def individualPostAsHtml(allowDownloads: bool, objectContent = \ removeLongWords(postJsonObject['object']['content'], 40, []) objectContent = removeTextFormatting(objectContent) + objectContent = limitRepeatedWords(objectContent, 6) objectContent = \ switchWords(baseDir, nickname, domain, objectContent) objectContent = htmlReplaceEmailQuote(objectContent) From 3713e9943fa6eb249b0e4d0e3f6943e2bb2f782c Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 12 Jul 2021 09:45:36 +0100 Subject: [PATCH 1402/1416] Encode redirects --- daemon.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daemon.py b/daemon.py index d0713e567..9cd6dd183 100644 --- a/daemon.py +++ b/daemon.py @@ -731,7 +731,7 @@ class PubServer(BaseHTTPRequestHandler): self.send_header('Cookie', cookieStr) else: self.send_header('Set-Cookie', cookieStr) - self.send_header('Location', redirect) + self.send_header('Location', redirect.encode('utf-8')) self.send_header('Host', callingDomain) self.send_header('InstanceID', self.server.instanceId) self.send_header('Content-Length', '0') From 4a0dd19475690defa585dc9453a963f45cd9552a Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 12 Jul 2021 09:48:14 +0100 Subject: [PATCH 1403/1416] Don't encode --- daemon.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daemon.py b/daemon.py index 9cd6dd183..d0713e567 100644 --- a/daemon.py +++ b/daemon.py @@ -731,7 +731,7 @@ class PubServer(BaseHTTPRequestHandler): self.send_header('Cookie', cookieStr) else: self.send_header('Set-Cookie', cookieStr) - self.send_header('Location', redirect.encode('utf-8')) + self.send_header('Location', redirect) self.send_header('Host', callingDomain) self.send_header('InstanceID', self.server.instanceId) self.send_header('Content-Length', '0') From 3231f3356bf8cc91d991e9da0e262276f2e470bd Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 12 Jul 2021 09:59:58 +0100 Subject: [PATCH 1404/1416] Error handling for redirect location --- daemon.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/daemon.py b/daemon.py index d0713e567..c0041c4be 100644 --- a/daemon.py +++ b/daemon.py @@ -731,7 +731,23 @@ class PubServer(BaseHTTPRequestHandler): self.send_header('Cookie', cookieStr) else: self.send_header('Set-Cookie', cookieStr) - self.send_header('Location', redirect) + + if '://' in redirect: + fallbackLocation = redirect.split('://')[1] + if '/' in fallbackLocation: + fallbackLocation = fallbackLocation.split('/')[0] + fallbackLocation = \ + redirect.split('://')[0] + '://' + fallbackLocation + else: + fallbackLocation = \ + self.server.httpPrefix + '://' + self.server.domainFull + try: + self.send_header('Location', redirect) + except BaseException: + print('WARN: fallback redirect for ' + str(redirect)) + self.send_header('Location', fallbackLocation) + pass + self.send_header('Host', callingDomain) self.send_header('InstanceID', self.server.instanceId) self.send_header('Content-Length', '0') From 4b7ce92ae7a595b32c41e1d7b1fb469e89891efc Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 12 Jul 2021 10:18:15 +0100 Subject: [PATCH 1405/1416] Quoted redirects --- daemon.py | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/daemon.py b/daemon.py index c0041c4be..ef5c3b4b5 100644 --- a/daemon.py +++ b/daemon.py @@ -629,7 +629,7 @@ class PubServer(BaseHTTPRequestHandler): self.send_response(303) self.send_header('Set-Cookie', 'epicyon=; SameSite=Strict') - self.send_header('Location', redirect) + self.send_header('Location', self._quotedRedirect(redirect)) self.send_header('Host', callingDomain) self.send_header('InstanceID', self.server.instanceId) self.send_header('Content-Length', '0') @@ -713,6 +713,15 @@ class PubServer(BaseHTTPRequestHandler): return True return False + def _quotedRedirect(redirect: str) -> str: + """URL encodes any non-ascii characters for url redirects + """ + if '/' not in redirect: + return urllib.parse.quote_plus(redirect) + lastStr = redirect.split('/')[-1] + return redirect.replace('/' + lastStr, '/' + + urllib.parse.quote_plus(lastStr)) + def _redirect_headers(self, redirect: str, cookie: str, callingDomain: str) -> None: if '://' not in redirect: @@ -731,23 +740,7 @@ class PubServer(BaseHTTPRequestHandler): self.send_header('Cookie', cookieStr) else: self.send_header('Set-Cookie', cookieStr) - - if '://' in redirect: - fallbackLocation = redirect.split('://')[1] - if '/' in fallbackLocation: - fallbackLocation = fallbackLocation.split('/')[0] - fallbackLocation = \ - redirect.split('://')[0] + '://' + fallbackLocation - else: - fallbackLocation = \ - self.server.httpPrefix + '://' + self.server.domainFull - try: - self.send_header('Location', redirect) - except BaseException: - print('WARN: fallback redirect for ' + str(redirect)) - self.send_header('Location', fallbackLocation) - pass - + self.send_header('Location', self._quotedRedirect(redirect)) self.send_header('Host', callingDomain) self.send_header('InstanceID', self.server.instanceId) self.send_header('Content-Length', '0') From bdda8c9bf476044a6d35e84b58844c0b0d245bc2 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 12 Jul 2021 10:19:53 +0100 Subject: [PATCH 1406/1416] Quoted redirects --- daemon.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daemon.py b/daemon.py index ef5c3b4b5..21d54b407 100644 --- a/daemon.py +++ b/daemon.py @@ -713,7 +713,7 @@ class PubServer(BaseHTTPRequestHandler): return True return False - def _quotedRedirect(redirect: str) -> str: + def _quotedRedirect(self, redirect: str) -> str: """URL encodes any non-ascii characters for url redirects """ if '/' not in redirect: From 7c270019b00357c8833ca6f4c4b1d251fce9f7b8 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 12 Jul 2021 10:27:57 +0100 Subject: [PATCH 1407/1416] Only quote tags --- daemon.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/daemon.py b/daemon.py index 21d54b407..212fe2481 100644 --- a/daemon.py +++ b/daemon.py @@ -716,8 +716,8 @@ class PubServer(BaseHTTPRequestHandler): def _quotedRedirect(self, redirect: str) -> str: """URL encodes any non-ascii characters for url redirects """ - if '/' not in redirect: - return urllib.parse.quote_plus(redirect) + if '/tags/' not in redirect: + return redirect lastStr = redirect.split('/')[-1] return redirect.replace('/' + lastStr, '/' + urllib.parse.quote_plus(lastStr)) From 94fb8e5c816812c37c134a567c0a36b81974fab8 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 12 Jul 2021 10:39:15 +0100 Subject: [PATCH 1408/1416] Method name --- daemon.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/daemon.py b/daemon.py index 212fe2481..4b1b0ad7a 100644 --- a/daemon.py +++ b/daemon.py @@ -629,7 +629,7 @@ class PubServer(BaseHTTPRequestHandler): self.send_response(303) self.send_header('Set-Cookie', 'epicyon=; SameSite=Strict') - self.send_header('Location', self._quotedRedirect(redirect)) + self.send_header('Location', self._quoted_redirect(redirect)) self.send_header('Host', callingDomain) self.send_header('InstanceID', self.server.instanceId) self.send_header('Content-Length', '0') @@ -713,7 +713,7 @@ class PubServer(BaseHTTPRequestHandler): return True return False - def _quotedRedirect(self, redirect: str) -> str: + def _quoted_redirect(self, redirect: str) -> str: """URL encodes any non-ascii characters for url redirects """ if '/tags/' not in redirect: @@ -740,7 +740,7 @@ class PubServer(BaseHTTPRequestHandler): self.send_header('Cookie', cookieStr) else: self.send_header('Set-Cookie', cookieStr) - self.send_header('Location', self._quotedRedirect(redirect)) + self.send_header('Location', self._quoted_redirect(redirect)) self.send_header('Host', callingDomain) self.send_header('InstanceID', self.server.instanceId) self.send_header('Content-Length', '0') From 13ba1565fa65d89d98325e70faea55214760d088 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 12 Jul 2021 10:41:04 +0100 Subject: [PATCH 1409/1416] Comment --- daemon.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/daemon.py b/daemon.py index 4b1b0ad7a..41a91790b 100644 --- a/daemon.py +++ b/daemon.py @@ -621,6 +621,16 @@ class PubServer(BaseHTTPRequestHandler): 'title="Login to Epicyon", Basic realm="epicyon"') self.end_headers() + def _quoted_redirect(self, redirect: str) -> str: + """hashtags sometimes contain non-ascii characters which + need to be url encoded + """ + if '/tags/' not in redirect: + return redirect + lastStr = redirect.split('/')[-1] + return redirect.replace('/' + lastStr, '/' + + urllib.parse.quote_plus(lastStr)) + def _logout_redirect(self, redirect: str, cookie: str, callingDomain: str) -> None: if '://' not in redirect: @@ -713,15 +723,6 @@ class PubServer(BaseHTTPRequestHandler): return True return False - def _quoted_redirect(self, redirect: str) -> str: - """URL encodes any non-ascii characters for url redirects - """ - if '/tags/' not in redirect: - return redirect - lastStr = redirect.split('/')[-1] - return redirect.replace('/' + lastStr, '/' + - urllib.parse.quote_plus(lastStr)) - def _redirect_headers(self, redirect: str, cookie: str, callingDomain: str) -> None: if '://' not in redirect: From ba77de00b209788a000bc7d57e3a8f22d63a8b8f Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 12 Jul 2021 10:42:08 +0100 Subject: [PATCH 1410/1416] Comment --- daemon.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daemon.py b/daemon.py index 41a91790b..d7cc9ed55 100644 --- a/daemon.py +++ b/daemon.py @@ -622,7 +622,7 @@ class PubServer(BaseHTTPRequestHandler): self.end_headers() def _quoted_redirect(self, redirect: str) -> str: - """hashtags sometimes contain non-ascii characters which + """hashtag screen urls sometimes contain non-ascii characters which need to be url encoded """ if '/tags/' not in redirect: From 33ecd05abbae055c9135e7cf8091792d3dbbf28b Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 13 Jul 2021 09:35:29 +0100 Subject: [PATCH 1411/1416] Increase the hashtag match length --- categories.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/categories.py b/categories.py index 70d079a78..9f7e0fe0b 100644 --- a/categories.py +++ b/categories.py @@ -170,7 +170,7 @@ def guessHashtagCategory(tagName: str, hashtagCategories: {}) -> str: for categoryStr, hashtagList in hashtagCategories.items(): for hashtag in hashtagList: - if len(hashtag) < 3: + if len(hashtag) < 4: # avoid matching very small strings which often # lead to spurious categories continue From 8485371197f0a9436668f87e103ac2c4b6397f48 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 13 Jul 2021 09:43:07 +0100 Subject: [PATCH 1412/1416] Fix test --- categories.py | 5 ++++- tests.py | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/categories.py b/categories.py index 9f7e0fe0b..06f0d4056 100644 --- a/categories.py +++ b/categories.py @@ -165,6 +165,9 @@ def guessHashtagCategory(tagName: str, hashtagCategories: {}) -> str: """Tries to guess a category for the given hashtag. This works by trying to find the longest similar hashtag """ + if len(tagName) < 4: + return '' + categoryMatched = '' tagMatchedLen = 0 @@ -185,5 +188,5 @@ def guessHashtagCategory(tagName: str, hashtagCategories: {}) -> str: if len(hashtag) > tagMatchedLen: categoryMatched = categoryStr if not categoryMatched: - return + return '' return categoryMatched diff --git a/tests.py b/tests.py index eacaa47bd..ba6e5bfb1 100644 --- a/tests.py +++ b/tests.py @@ -2843,12 +2843,12 @@ def _testGuessHashtagCategory() -> None: print('testGuessHashtagCategory') hashtagCategories = { "foo": ["swan", "goose"], - "bar": ["cat", "mouse"] + "bar": ["cats", "mouse"] } guess = guessHashtagCategory("unspecifiedgoose", hashtagCategories) assert guess == "foo" - guess = guessHashtagCategory("catpic", hashtagCategories) + guess = guessHashtagCategory("mastocats", hashtagCategories) assert guess == "bar" From d502cd89f9ffe38e05e59a75da78a23d99c15209 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 13 Jul 2021 09:44:02 +0100 Subject: [PATCH 1413/1416] Update default categories --- defaultcategories/en.xml | 626 ++++++++++++++++++++------------------- 1 file changed, 322 insertions(+), 304 deletions(-) diff --git a/defaultcategories/en.xml b/defaultcategories/en.xml index e4a31249f..297b984f5 100644 --- a/defaultcategories/en.xml +++ b/defaultcategories/en.xml @@ -4,645 +4,663 @@ #categories retro - retrocomputer kommunalwahl 90sretro A500 CreativeCommons atarist SistersWithTransistors vax retroarch commodore teletext Retromeme matariki floppy recommendation 8bit cassette arcade atari communicators atari800 oldschool trs80 communication atari8bit floppydisk retrocomputing C64 nostalgia bbs ansi plan9 80s microcomputing kommunikation vaxvms retroarcade zdfretro cassette_tapes bonhomme omm retrogaming z80 8bitdo retro atari800xl telekommunikation VollaCommunityDays retropie commodore64 cassettetapes retrogame amiga bbcmicro retrofriday microcomputer bbsing commercial + retrocomputer kommunalwahl 90sretro A500 CreativeCommons ecommerce atarist SistersWithTransistors vax retroarch commodore retroffiting teletext Retromeme matariki floppy recommendation 8bit cassette arcade atari communicators atari800 oldschool trs80 communication atari8bit floppydisk retrocomputing recommended C64 nostalgia bbs ansi communicationtheory plan9 80s microcomputing kommunikation vaxvms retroarcade zdfretro woocommerce cassette_tapes bonhomme omm retrogaming z80 8bitdo retro atari800xl telekommunikation VollaCommunityDays retropie commodore64 cassettetapes retrogame Trans amiga bbcmicro retrofriday microcomputer bbsing commercial - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT economics - Europe workercoop InformationFriction cooperatives accounting bank bitcoin noplanetb feministeconomics WealthConcentration valueflows coops holochain valuesovereignty cooperativism funding platformcoop pico transcrowdfund usebitcoin shitcoin consommation workercoops economics cooperation radical value business platformcooperatives exoplanets shopping displacement economic poplar shop companyculture plaintextaccounting MarketForLemons sovereignty crowdfund oops fairtrade RIPpla bankingCartel rope Datenbank Bitcoin startups radicalcooperation HenryGeorge scar plausible economíasolidaria disablitycrowdfund crowdfunding limitstogrowth ponzi companies theygrowupfast hermannplatz sharingiscaring techcoops plastikfrei plantprotein meetcoop disability micropatronage merz lgbtcrowdfund mehrplatzfürsrad monetize sineadoconnor ua cryptocurrencies degrowth a2pico smallbusiness deliveroo intellectualproperty pla kommerzialisierung GitPay Fedigrowth gdp deplatforming coop smallbusinesses europeancentralbank whyBitcoin cryptocurrency infoshop sine grow telecoop growth limits fuckfoodbanks btc values banks planetary plannedObsolence planet worldbank + Europe workercoop InformationFriction cooperatives accounting bank bitcoin noplanetb theWorkshop feministeconomics WealthConcentration valueflows coops holochain valuesovereignty cooperativism greatplains funding platformcoop pico transcrowdfund usebitcoin shitcoin gigeconomy consommation workercoops economics cooperationjackson cooperation radical value business platformcooperatives exoplanets shopping displacement economic poplar shop companyculture plaintextaccounting MarketForLemons sovereignty crowdfund oops fairtrade RIPpla bankingCartel rope Datenbank Bitcoin startups radicalcooperation HenryGeorge scar plausible economíasolidaria disablitycrowdfund crowdfunding limitstogrowth ponzi companies theygrowupfast hermannplatz sharingiscaring techcoops plastikfrei plantprotein meetcoop disability micropatronage boarsplaining merz lgbtcrowdfund mehrplatzfürsrad monetize sineadoconnor cooperativas ua cryptocurrencies degrowth a2pico smallbusiness deliveroo intellectualproperty pla kommerzialisierung GitPay Fedigrowth gdp coopsday deplatforming timebank coop cooperativismo smallbusinesses europeancentralbank banknotes whyBitcoin cryptocurrency infoshop sine grow telecoop growth limits fuckfoodbanks btc values banks planetary plannedObsolence planet worldbank - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT climate - YouStormOutlook energy energyuse SoilCarbon vampire renewables fuel clouds apollo racisme antira greenhousegas mitm openscience renewableenergy ClimateMeme amp climateemergency climatechos gordoncampbell ClimateAction climate climateracism renewable windenergy ClimateProtection sciences ClimateStrike CycloneTauktae emissions coal climatecase antiracism globalsouth weatherforecast crisis foodcrisis vampiro energyvisions klimaatcrisis environment skypack fossilfuel earthscience tramp globalwarming climatechange mitigation limitededition weather ragingqueerenergy fossilcriminals camps climatecamp ClimateRefigees windpower sealevelrise ClimateCase globally globalization climatechoas CarbonOffsets basecamp exitpoll Tyskysour pollution global parisclimateagreement science fossil OABarcamp21 fossilfuels Climate sky climatescience energytransition climateaction ClimateCrisis warm globalviews headlamp whisky climatemitigation environmentalism Ruttecrisis climatecrisis + YouStormOutlook heatwave energyconsumption energy energyuse SoilCarbon vampire renewables fuel clouds apollo racisme antira greenhousegas ClimateEmergency openscience renewableenergy ClimateMeme amp Nyurbinsky climateemergency climatechos gordoncampbell extremeweather ClimateAction climate climateracism renewable windenergy ClimateDenial ClimateProtection sciences ClimateStrike CycloneTauktae emissions coal climatecase climatestrike globalsouth ClimatePodcast weatherforecast kaspersky crisis foodcrisis vampiro energyvisions klimaatcrisis environment skypack climatecrises fossilfuel history_of_science earthscience tramp globalwarming mitigation limitededition weather ragingqueerenergy fossilcriminals camps climatecamp ClimateRefigees Podcast windpower sealevelrise ClimateCase globally globalization climatechoas endfossilfuels emergency CarbonOffsets heatwaves basecamp exitpoll Tyskysour pollution global parisclimateagreement science fossil energyefficiency OABarcamp21 mitmachen fossilfuels Climate sky climatescience energytransition climateaction ClimateCrisis storms warm biofuel globalviews headlamp whisky climatemitigation environmentalism Ruttecrisis climatecrisis - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT art - proudhon cherrytree oilpaint arttips mastoartist paperart activism cali TraditionalArt theWorkshop Linke subresourceintegrity glitchart Art ocart robincolors resource urban article penandink webcomics CommissionsOpen glassart afrique martialarts watercolours artalley artvsartist2020 circulareconomy abstract artreference commission horrorart Earthquakes poe nomadbsd MartyMacMarty tgif coloringpage dccomics colored inkscape blink artificalintelligence draw gigeconomy circuitsculpture ttip watercolor proceduralart existentialcomics resources poetesss memes pinksterlanddagen ghibligif subpoena autisticartist barrigòtic art sona animalart krita FreeColouringPage anthroart urbanart sigh queerart deviantart communityresources desigualdad pastel fantasyart drawings 20thcenturyillustration grafana daria artdeco adultcolouring source collective openstreeetmap cryptoart fantasy collage jordanlynngribbleart ToryParty educpop linksunten risograph pro links CodeZwart thinkabout fanfic articles protein PartyPooperPost harmreductionart adhdmeme MastoArtHeader openra demoscene witch FreeArtLicense wallpaper generative political agriculture streetart coverart streetcomplete fountainpen stickers partners watercolour economy combyne freeculture fiberart PalestinianPoliticalPrisoners jet labyrinth educators mermay dpa artsale edu MastoArt particl PrisonNews urbansketchers ParticlV3 creativetoots culture ganart evenepoel opencl fiberarts polArt ink painting Leitartikel marten opencoop digitalart comic flyingonthewater kenmurestreet sartre artwork mandala artificialintelligence b3d politicalcartoon blackart makingcomics glitch politicalprisoner junkart wallpapers railway riso xkcd supportartists drawtober startinblox comics intelligence linkinbio mastoart urbanterror illustration artopencall Hinkley gnuimagemanipulationprogram os studioghibli 2MinuteSketch wireart cartoon artistontwittter oc csa AccidentalGraffiti eink OriginalCharacter farts hattip poezio webcomic DigitalArt partnership potentieldememe oilpainting kickstarter furryart twinkle DisabledArtist unixstickers pink fursona afriquedusud comicsans inkjet generativeart VaccineApartheid sticker enbyart originalart heartmind artbreeder 17maart fart videoart ivalice adultcoloring djmartinpowers arttherapy Cartudy fractal enby TattoosOfTheFediverse artikel WorldLocalizationDay colouringpage worldwaterday NFTart netart signalstickers artschool digitalpainting intel artvsartist dorktower maart abstractart drawing sig circular adhd sculpture artist pcbart meme cultureshipnames supertuxkart concretepoetry artwithopensource pinkwug Streeck VTMtober commissions pronouns opencallforartists VizierOpLinks commissionsopen fanon alroeart fountainpenink MartinVanBeynen peppertop speedpainting animalpainting visionaryart blackartist figureart zine artists heart error supportthearts genart urbanfantasy stickerei CurzioMalaparte tree lineart smartcard pixelart alisajart openframeworks professor networknomicon openrailwaymap politicalpolicing Earthstar JuliaHartleyBrewer fan digitalArt artistsOfMastodon mermay2021 + proudhon productivity cherrytree Fediverse oilpaint economiasolidaria arttips mastoartist paperart activism cali TraditionalArt Linke subresourceintegrity glitchart Art ocart robincolors resource urban article penandink webcomics startpage CommissionsOpen glassart afrique martialarts watercolours artsurbains artalley artvsartist2020 circulareconomy abstract artreference commission horrorart Earthquakes poe nomadbsd proxmoxve MartyMacMarty tgif coloringpage dccomics colored inkscape blink artificalintelligence draw circuitsculpture ttip watercolor proceduralart existentialcomics resources poetesss memes pinksterlanddagen ghibligif speedpaint SankeyCharts bengarrison subpoena autisticartist barrigòtic art sona animalart krita foraBolsonaroGenocida insights FreeColouringPage anthroart urbanart sigh queerart deviantart communityresources desigualdad pastel fantasyart drawings 20thcenturyillustration grafana daria artdeco adultcolouring source J19forabolsonaro collective openstreeetmap cryptoart politicalprisoners fantasy collage jordanlynngribbleart ToryParty educpop TheArtsHole linksunten risograph pro links CodeZwart thinkabout dndmemes fanfic articles protein forabolsonaro PartyPooperPost harmreductionart adhdmeme MastoArtHeader openra demoscene witch FreeArtLicense wallpaper generative political agriculture streetart coverart streetcomplete fountainpen stickers partners watercolour economy combyne freeculture fiberart PalestinianPoliticalPrisoners jet labyrinth educators mermay dpa artsale edu MastoArt particl PrisonNews FediverseApp urbansketchers ParticlV3 creativetoots culture ganart evenepoel opencl fiberarts polArt ink painting Leitartikel marten opencoop digitalart comic flyingonthewater kenmurestreet libreculture sartre artwork mandala b3d politicalcartoon blackart artsderue makingcomics glitch politicalprisoner junkart wallpapers railway linker riso xkcd supportartists proctorio drawtober startinblox comics intelligence linkinbio conceptart mastoart urbanterror illustration artopencall Hinkley gnuimagemanipulationprogram os studioghibli 2MinuteSketch wireart cartoon artistontwittter oc csa AccidentalGraffiti eink OriginalCharacter farts hattip poezio webcomic fleischproduktion DigitalArt pinkwashing partnership potentieldememe oilpainting kickstarter furryart twinkle DisabledArtist unixstickers pink fursona afriquedusud comicsans inkjet generativeart VaccineApartheid sticker enbyart originalart arts heartmind artbreeder 17maart fart TsunderdogArt videoart ivalice adultcoloring djmartinpowers arttherapy Cartudy extreemrechts fractal enby TattoosOfTheFediverse doodle artikel WorldLocalizationDay colouringpage worldwaterday NFTart netart signalstickers artschool digitalpainting intel politicaltheatre artvsartist dorktower maart abstractart drawing sig circular adhd sculpture artist pcbart meme cultureshipnames concretepoetry artwithopensource pinkwug Streeck VTMtober commissions pronouns opencallforartists DesolateEarthForThePoor VizierOpLinks commissionsopen fanon KartaView alroeart article17 fountainpenink MartinVanBeynen peppertop speedpainting animalpainting visionaryart blackartist worldpay figureart zine artists heart quickdraw error supportthearts genart urbanfantasy stickerei CurzioMalaparte tree lineart smartcard pixelart alisajart openframeworks professor networknomicon openrailwaymap politicalpolicing Earthstar JuliaHartleyBrewer fan digitalArt artistsOfMastodon glitchsoc paintings mermay2021 - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT sport - billiard darts swim motorsport snooker locksport swimming trailrunning marathon hockey bouldering diving baseball Millwall mma mammal sailing athletics nook dumpsterdiving sportsball skating skiing sport climbing football combatsports + billiard darts olympics2020 swim motorsport snooker locksport swimming trailrunning marathon hockey bouldering diving baseball Millwall mma mammal sailing athletics nook dumpsterdiving sportsball skating skiing sport footballers climbing football combatsports golf - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT + + + bots + posthumanism mrrobot human dehumanification Militanzverbot nobot botanists humanity militanzverbot Sabot44 humanrobotinteraction therobots humanetechnow verbote humankind + + Tue, 13 Jul 2021 08:43:43 UT events - neverforget TuesdayVibe award daffodilday carbonemissions OONIbday waybackwednesday thursdayvibes fridayfilm thursdaythought sun IndigenousPeoplesDay5 notifications solo throwbackthursday valentinesday adventskalender live dos Day deepthoughts thingaday idahobit screenshotsaturday warmingup thursdaythoughts fridays ipv hackathons thursdaymorning Gesundheitskrise throwback RomaDay assweek animalsweatersunday justwatched TooMuchScreenTime beethoven250thbirthday valentine humanrightsday followfriday wednesdaythought afediversechristmas whydopeopledoshitlikethis festivals wednesdaymotivation early MayDay2021 SwissOvershootDay IllustrationDay cccamp19 lovewhereyoulive screenshot PostLikeYouThinkACrabWouldSunday showerthoughts BIJ1 worldpenguinday animal ScreenshotSaturday beethoven anarchymonday Verkiezingsfestival primeday paperoftheday bundesnetzagentur thimblefulthursday FreeAssangeYesterday 100DaysToOffload hackathon ff kids holiday LURKbirthday wenbiesday punday ipv4flagday christmas shots livecoding verfassungsschutz weeknotes LINMOBlive week FlashFictionFriday mothersday koningsdag concert festival FridayFolklore pride poll screenshottuesday animals VerkiezingsfestivalBIJ1 towertuesday fujifilmxt2 Nakbaday kdenlive dontstarve onthisday GlobalMayDay2021 insideoutsockday screenshots livestream whiskerswednesday BowieDay morningcrew theskytoday InternationalAsexualityDay tzag TinyTuesday FridaysForFuture sunday Koning weekendvibes screenshotsunday worldenvironmentday2021 showerthought library koningshuis cree VerseThursday liverpool waitangiday esc2021 caturday adayinthelife goodmorning Caturday day InternationalCheetahDay flatfuckfriday songfestival ItchCreatorDay iss RabbitRoadTrip2021 interestingtimes sideprojectsunday birthday sixonsaturday supdate StPatricksDay2021 koningsdag2021 wordoftheday christmaslights AfricaDay livefree worldenvironmentday nationallibraryweek meetup FathersDay sex kidsthesedays rechtsextreme + neverforget TuesdayVibe award daffodilday carbonemissions OONIbday waybackwednesday thursdayvibes fridayfilm todayilearned ShowYourStripesDay thursdaythought sun futuroparanissan IndigenousPeoplesDay5 notifications hissyfit ddosecrets solo throwbackthursday nissan valentinesday adventskalender live dos Day deepthoughts solorpg thingaday idahobit screenshotsaturday warmingup thursdaythoughts fridays ipv hackathons thursdaymorning Gesundheitskrise throwback RomaDay assweek animalsweatersunday justwatched TooMuchScreenTime beethoven250thbirthday valentine humanrightsday time followfriday wednesdaythought afediversechristmas whydopeopledoshitlikethis birthdaypresent festivals wednesdaymotivation early MayDay2021 SwissOvershootDay IllustrationDay bigbrotherawards cccamp19 lovewhereyoulive screenshot thelibrary PostLikeYouThinkACrabWouldSunday showerthoughts BIJ1 worldpenguinday animal ScreenshotSaturday beethoven anarchymonday treibhausgasemissionen solokey tipoftheday Verkiezingsfestival primeday paperoftheday bundesnetzagentur thimblefulthursday FreeAssangeYesterday 100DaysToOffload hackathon ff kids holiday folklorethursday LURKbirthday tomorrowspaperstoday wenbiesday punday ipv4flagday ipv6 christmas livecoding verfassungsschutz weeknotes LINMOBlive week FlashFictionFriday mothersday gsd koningsdag scree concert folklore festival FridayFolklore pride poll screenshottuesday animals VerkiezingsfestivalBIJ1 towertuesday fujifilmxt2 Nakbaday kdenlive dontstarve onthisday GlobalMayDay2021 simplescreenrecorder insideoutsockday screenshots livestream blissos whiskerswednesday BowieDay morningcrew theskytoday InternationalAsexualityDay tzag TinyTuesday FridaysForFuture sunday notification Koning weekendvibes screenshotsunday worldenvironmentday2021 showerthought library koningshuis cree VerseThursday liverpool waitangiday esc2021 bigbrotheraward caturday adayinthelife goodmorning Caturday day InternationalCheetahDay flatfuckfriday songfestival ItchCreatorDay iss RabbitRoadTrip2021 interestingtimes sideprojectsunday birthday sixonsaturday supdate StPatricksDay2021 koningsdag2021 wordoftheday theweeknd christmaslights AfricaDay livefree CancelCanadaDay worldenvironmentday fridaysforfuture nationallibraryweek meetup FathersDay transpride sex kidsthesedays rechtsextreme - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT politics - hate conspiracytheory TakeOurPowerBack redessociais solidarität trump Anarchy association cia socialjustice neoliberalisme eee workerowned alwaysantifascist sabotage qtibpoc VivotecniaCrueldadAnimal solidarityeconomy pressfreedom community systemicracism wageslavery immigration liberal telemetry dissent liberation unions laws fascism farmersrprotest techtuesday skyofmywindow techthursday nooneisillegal freedomofspeech anarchist prochoice freeexpression EthnicCleansing anticapitalist RacialHealing fascisme humanrights Anarchisme crime leftists Socialism ukpol FreeKeithLamar Antifascisme copwatch capitalismkills homeless menschenrecht left petition BorisJohnson meteorología independant antifaschismus freedom greens techtalk bikesforrefugees housingcrisis techdirt ontologicalanarchy labourabolition techsit union tories abolitionnow anarchism wegmetdemonarchie DefundThePolice nazis earthship SocialCritique repression legaltech technews Jurastil meto devimage legal meeting polizeigewalt dannenröderwald smalltech FediAntifa police nzpolitics multicast antifascists oilwars kommunismus censored postttruth technik rightorepair control nuclear bjp ThirdRunway multi seaslug UnitedInDiversity maidsafe testing nazisme hierarchy chehalisrivermutualaidnetwork vat ImmigrationEnforcement election republicans opinie diversity solidarity techwear communitycontrol hypocrits slavery sociaalDarwinisme metoo anticiv refugeeswelcome Coronariots seashepherd mybodymychoice generalstrike fuckBiden call2power neoliberal antipolitics charity abolition digitalfreedom transrightsarehumanrights ScottishElections2021 mayday unionyes again hatespeech fascists antropoceno policerepression LateStageOfCapitalism earth stopchasseacourre solawi ciencia smashturkishfascism afropessimism antivax Electricians burntheprisons qt trumpism cyberlaw bossnapping peerproduction atlantik corporations iww pushbacksareillegal indianpirates DisabilityPolicy til labor intersectional commons choice depressionen feelthefreedom Riot corporatewatch postcapitalism intersectionalfeminism smalltechnology wageslave uspol frontex communism mutualaidpdx RemoveThePolice makecapitalismhistory abolishpolice nationalisme oist methaan anarchisten Immigration competition biometric neoliberalism NeverTrustSimone socialecology wald whistleblower wroclawskierewolucjonistki MutualAid capitalism technology prisons feministhackmeetings wealth supremecourt conspiracytheories corporatecrime DirectAction ChildLabour communist daretocare KeirStarmer NoMoreEmptyPromises digitalslavery censor decrecimiento helmet refugeesgr taoteching technopolice anarchismus policeviolence politiikka kapitalisme retrotechnology ZwartFront bipoc housing decriminalization decolonisation politics WarCommentary inclusivity parametric gravimetry Megaprisons decreased publicknowledge government neocities greendatacenter SocialDarwinism repressions brightgreen poc anarchisme wayfire feminist DominicCummings nzpol peoplepower Bookchin informationtechnology ClemencyNow Inauguration2021 arran Revolutionary techthoughts brexit anarchistaction tw privileged totalitarianism localelections privatisation stillwithher TyskySour Labour democraciasindical nonprofitindustrialcomplex death LabourLeaks riots freethemall bolsonarogenocida green SocialJustice neoliberaal corporateStateTotalitarianism labour BAME decolonizeyourmind alternative privilege antikapitalisme firejail hamas legalcounsel AbolishPrisonsAbolishPolice despotism damangecontrol earthovershootday palantir DecentraliseThePlanet anti surfaceworldblows ecofascism opentechnologyfund depression nuclearpower popularitycontest usestandardpowerjacksforfucksake pdxmutualaid PoliceTenSeven LhubTV SocietalChange facialrecognition ModiFailsIndia cotech corruption florespondece hypocrisy BernieSandersMeme staterepression anarchy fire colonization Feminism propaganda dcc greenit endsars celebratingfreedom Antillia corporateState decolonization pc digitalrights feminism freepress Lhub HightechProblems osstotd farm problem collaboration pentesting polizei neo democracy anarchistki Govts BelarusProtests xp powerpolitics 18Source hungerstrike censorshipBook radicaltech saytheirnames witchesagainstwhitesupremacy gulag digitalmarketsact yes socialist conspiracy anarchistbookclub redandanarchistskinheads peace hostileenvironment technically corporate osint radicaldemocracy endmodernslaveryatsea PritiPatel stonewallwasariot oiseau surveillance latestagecapitalism bos racist cancelculture postcolonial dec AmbLastillaAlCor Selfsuffciency nonazis MexicanRevolution elections greatgreenwall RussellMaroonShoatz LhubSocial OctoberRevolution logitech methods Flatseal commonspub warcrimes sea policing white governance waldstattasphalt prisoners earthday2021 warrants policebrutality techshit earthday antirepression capitalismo borisjohnson ACABSpring2021 Anarchist deepspeech body press routerfreedom Anarchism mutuality whitehouse metropolitanpolice LabourParty haltandcatchfire freedomofexpression censorship deathbycapitalism communities CancelCulture decolonize deconstruct HanauWarKeinEinzelfall musictechnology druglawreform keinmenschistillegal emmet racism fascisten decenterwhiteness Biden FossilFreePolitics ChineseAppBan multiplesklerose cooperative trespass modi antifa alternativen law prison chip deathtoamerica manipulation ParticipatoryCultureFoundation firetotheprisons consumer solidaritaet PlanetarySocial britpol financial gravimetrie BiodiversityDay Capitalism surveillancecapitalism leftist greenland general Revolution ukpolitics greenparty mdcommunity glenngreenwald JeremyCorbyn blacklivesmatter freedomofthepress academicfreedom HeinsbergStudie apartheid FreeAlabamaMovement Anarchismus bundespolizei strike mononeon rentstrike evergreen equality otd dsa informationstechnik piracy liberty lawandorder migration power oiseaux techmess neoist capitalismenumérique mutualaid capital cymru multipleexposure socialsolidarityeconomy humanetechnology AbolishPrison solidaritynotcharity anarchists fascist righttochoice InformationAsymmetry socialcoop vim apocalypseworld DefundSurveillanceCapitalism feministserver prisonersupport platformcapitalism decolonizeconservation anarchistprisoners whistleblowers polizeiproblem notallmen hf prisonabolition UniversalBasicServices fuckcapitalism speech uselection IDPol Antifa deathtofascism mediafreedom lesanarchistes libertarianism Slavetrade met democracia antitrespass drugtesting populism consumerism greenwashing ourstreets reform MeToo extremist bright freespeech anticonsumerism kapital neorodiversiteit refugees BlackProtestLegalSupport riot BernieSanders acab ecology yesminister realcompetition antifascist SurveillanceCapitalism antifascism GlobalCapitalism Politics homeoffice bodyshaming whitepaper pdx freewestpapua eris hambacherwald justice powstaniewgetciewarszawskim sunnytech expression feudalism espressif violence legalmatters academic tech capitalismodisorveglianza + hate biometrics conspiracytheory TakeOurPowerBack redessociais solidarität trump Anarchy association cia socialjustice neoliberalisme eee workerowned alwaysantifascist sabotage qtibpoc VivotecniaCrueldadAnimal solidarityeconomy pressfreedom community systemicracism wageslavery immigration antifascismo liberal telemetry dissent liberation unions endprisonslavery laws fascism farmersrprotest techtuesday warc skyofmywindow techthursday nooneisillegal capitale freedomofspeech anarchist prochoice freeexpression EthnicCleansing anticapitalist RacialHealing fascisme liberalisme humanrights Anarchisme crime leftists turkish Socialism ukpol FreeKeithLamar Antifascisme copwatch capitalismkills fireworks homeless menschenrecht left petition BorisJohnson meteorología independant antifaschismus freedom EURvalues greens techtalk bikesforrefugees housingcrisis techdirt ontologicalanarchy labourabolition techsit union tories abolitionnow anarchism wegmetdemonarchie abuse DefundThePolice nazis earthship SocialCritique repression legaltech technews pelmets Jurastil meto devimage legal meeting polizeigewalt dannenröderwald smalltech FediAntifa police nzpolitics multicast antifascists oilwars multiverse antropocene kommunismus censored postttruth technik rightorepair control nuclear bjp ThirdRunway conservatives multi seaslug UnitedInDiversity maidsafe testing nazisme hierarchy avatars chehalisrivermutualaidnetwork vat ImmigrationEnforcement election republicans opinie diversity solidarity techwear communitycontrol metantispecismo hypocrits slavery sociaalDarwinisme metoo Avanti anticiv refugeeswelcome Coronariots seashepherd ecotech mybodymychoice generalstrike fuckBiden call2power DefendDemocracy wildfire neoliberal antipolitics charity AntiLiberalisme abolition digitalfreedom transrightsarehumanrights ScottishElections2021 mayday unionyes again hatespeech fascists antropoceno policerepression LateStageOfCapitalism earth stopchasseacourre solawi ciencia smashturkishfascism afropessimism antivax fedibikes Electricians burntheprisons seamonkey qt trumpism cyberlaw bossnapping peerproduction policiaasesina atlantik dansenmetjanssen corporations iww pushbacksareillegal indianpirates DisabilityPolicy vice SomethingIsGoingWrongHere til labor intersectional commons choice depressionen feelthefreedom Riot corporatewatch postcapitalism intersectionalfeminism smalltechnology wageslave uspol frontex communism mutualaidpdx RemoveThePolice makecapitalismhistory deathvalley chipocalypse criminalization abolishpolice nationalisme oist methaan anarchisten Immigration competition biometric mh brexitreality neoliberalism NeverTrustSimone socialecology wald whistleblower wroclawskierewolucjonistki icons MutualAid MutualAidRequest capitalism technology ACAB prisons feministhackmeetings wealth supremecourt conspiracytheories corporatecrime DirectAction ChildLabour parliament communist daretocare KeirStarmer NoMoreEmptyPromises greenpeace digitalslavery bushfire censor decrecimiento helmet refugeesgr taoteching technopolice anarchismus policeviolence politiikka kapitalisme retrotechnology ZwartFront bipoc housing decriminalization decolonisation politics WarCommentary inclusivity parametric gravimetry bosch Megaprisons decreased publicknowledge antiracism government neocities greendatacenter SocialDarwinism repressions brightgreen poc privatisierung anarchisme wayfire feminist colonialism DominicCummings nzpol peoplepower homelessness Bookchin informationtechnology ClemencyNow Inauguration2021 arran Revolutionary techthoughts brexit anarchistaction antimonopoly tw privileged totalitarianism localelections raid privatisation stillwithher TyskySour Labour democraciasindical nonprofitindustrialcomplex death LabourLeaks riots freethemall bolsonarogenocida green SocialJustice neoliberaal corporateStateTotalitarianism labour BAME decolonizeyourmind alternative privilege antikapitalisme masssurveillance firejail hamas legalcounsel AbolishPrisonsAbolishPolice despotism mntreform damangecontrol earthovershootday palantir DecentraliseThePlanet anti surfaceworldblows ecofascism opentechnologyfund depression nuclearpower popularitycontest usestandardpowerjacksforfucksake pdxmutualaid PoliceTenSeven LhubTV SocietalChange facialrecognition ModiFailsIndia cotech politicaeattualità corruption florespondece hypocrisy BernieSandersMeme staterepression anarchy fire colonization Feminism propaganda dcc greenit endsars celebratingfreedom userfreedom Antillia corporateState SocialCentres decolonization pc digitalrights feminism freepress Lhub HightechProblems datacenter osstotd farm problem hochschwarzwald collaboration pentesting polizei neo democracy anarchistki Govts BelarusProtests powerpolitics bikes 18Source hungerstrike censorshipBook radicaltech 56aInfoshop saytheirnames witchesagainstwhitesupremacy gulag digitalmarketsact yes socialist conspiracy anarchistbookclub redandanarchistskinheads peace housingproject hostileenvironment technically lawyer corporate osint radicaldemocracy endmodernslaveryatsea PritiPatel nationaalparkdebiesbosch stonewallwasariot oiseau surveillance latestagecapitalism bos racist economiafeminista cancelculture postcolonial callfortesting dec AmbLastillaAlCor Selfsuffciency nonazis MexicanRevolution elections ACABPoland greatgreenwall RussellMaroonShoatz LhubSocial OctoberRevolution logitech methods Flatseal repressionen commonspub warcrimes sea policing white governance waldstattasphalt prisoners earthday2021 warrants policebrutality techshit earthday antirepression capitalismo borisjohnson wildfires ACABSpring2021 technopopulism Anarchist deepspeech notacopshop body johnson rhetoric press routerfreedom Anarchism mutuality StillTwitterpated whitehouse metropolitanpolice espresso LabourParty haltandcatchfire freedomofexpression censorship deathbycapitalism communities CancelCulture decolonize deconstruct HanauWarKeinEinzelfall musictechnology druglawreform keinmenschistillegal immigrationraids emmet racism fascisten decenterwhiteness Biden FossilFreePolitics ChineseAppBan multiplesklerose cooperative trespass modi antifa alternativen law prison chip LabourMovement deathtoamerica manipulation ParticipatoryCultureFoundation firetotheprisons consumer solidaritaet PlanetarySocial britpol financial gravimetrie BiodiversityDay Capitalism surveillancecapitalism leftist greenland general Revolution ukpolitics greenparty mdcommunity glenngreenwald support JeremyCorbyn blacklivesmatter freedomofthepress academicfreedom HeinsbergStudie apartheid FreeAlabamaMovement Anarchismus bundespolizei strike mononeon rentstrike evergreen equality otd dsa informationstechnik piracy liberty lawandorder feminismus migration power oiseaux techmess neoist edtech capitalismenumérique mutualaid capital waldspaziergang cymru multipleexposure socialsolidarityeconomy humanetechnology AbolishPrison solidaritynotcharity anarchists fascist righttochoice InformationAsymmetry socialcoop inequality vim apocalypseworld DefundSurveillanceCapitalism feministserver prisonersupport platformcapitalism decolonizeconservation anarchistprisoners whistleblowers polizeiproblem notallmen hf prisonabolition fightthepower UniversalBasicServices fuckcapitalism speech uselection IDPol Antifa deathtofascism mediafreedom lesanarchistes libertarianism Slavetrade met democracia antitrespass drugtesting populism selfcensorship consumerism greenwashing ourstreets reform MeToo extremist bright freespeech anticonsumerism kapital neorodiversiteit refugees BlackProtestLegalSupport riot BernieSanders acab ecology yesminister realcompetition antifascist SurveillanceCapitalism vimeo antifascism GlobalCapitalism Politics homeoffice bodyshaming empowerment whitepaper pdx seascape freewestpapua eris hambacherwald dui nyt justice powstaniewgetciewarszawskim sunnytech FolksWhoFailAtCapitalism expression feudalism espressif violence legalmatters academic tech capitalismodisorveglianza - Tue, 08 Jun 2021 17:56:37 UT - - - employment - justworked futureofwork InterviewQuestions bullshit jechercheunjob mywork remote employees hiring workingfromhome ProgrammingJob reproductivework frame workinprogress bullshitjobs car workplace DigitalNetwork antiwork kreaturworks worklog sexworkers mainframe remotework remotejobs job culturalworkers DjangoJob teamwork framework hire KDEGear careers hirefedi workshop illustratorforhire tidyworkshops carework nowhiring KDE rds KDEGear21 obs workersrights obsolescence KDEFrameworks work hertfordshire flossjobs jobs workflow precariousworkers sexworker - - Tue, 08 Jun 2021 17:56:37 UT - - - gafam - zuckerberg caringissharing ads apple antitrust SpringerEnteignen deletewhatsapp advertisingandmarketing GoogleDown aws AppleSearch Floc bankruptBezos googlesearch googleio mycologists bringBunysBack youtube Goggle twitterkurds banadvertising chromebook fuckfacebook headset arcgis ffs AmazonMeansCops facebook 100heads amazon googlevoracle dystopia microsoftgithub farcebook myco boycottinstagram FlocOff genoegisgenoeg amazonprime deletewhatsappday amazonring Gafam googleplus soldering GoogleForms HaringeyAnti lobbyregister degooglisation florespondance linkedin siri Facebook LeiharbeitAbschaffen advertising monopolies googleanalytics ausländerzentralregister adtech fuckgoogle storing plottertwitter failbook kadse microsoft deletechrome dtm HeadscarfBan twitter skype azure chrome googledoodles hildebrandt corporateGiant Tracking uitkeringen FlocOffGoogle sidewalk nogafam youtubedl degoogled Google youtubers google stemverklaring gis walledgarden GAFCAM dt GooglevsOracle dotcoms deleteyoutube datafarms Instagram walledgardens agistri appleevent offseting appleii facebookoversightboard fascistbook FuckGoogle degoogle boringdystopia fuschia ohneamazon appleiie deleteinstagram ungoogled ring stopgoogle affordances googledown decentring gafam inspiring oracle killedbygoogle fuckoffgoogle dance deletefacebook gradschool fakebook GoogleIsBad fuckoffgoogleandco office365 lordoftherings turingpi instagram FlocBloc playstore synergistic bigtech boycottamazon whatsapp mytwitteranniversary deleteamazon bluesky - - Tue, 08 Jun 2021 17:56:37 UT - - - people - Melissa harold paul Zachary JusticiaParaVictoria danielle dylan scott Barbara Kenneth theresa Denise FrankLeech Jesse Adam justin JonathanCulbreath elinorostrom katherine judith Karen Patricia russell Metalang99 juan diane Rebecca donna LouisRossmann olivia peter troy William denise Betty evelyn Christina brittany Jennifer Gregory Wayne Andrychów ethan Ralph Peter ecc americalatina jacobites jean laura betty nathan brownmark margaret alexanderlukashenko Bryan Virginia Jose Rose eric james BomberBradbury david Joshua christine haaland Billy CapitolRiot ostrom natalie daniel Jonathan Michael susan George johnny bookmark MichaelWood Lauren christina Amy kevin Natalie kenneth noahkathryn Lawrence aaron gregory LindaLindas Amber alexa Robert Edward Patrick Rachel willemalexander bruce Forms dennis LegalCannabis Kayla frank Diane Donna Jack Paul Janice Brenda alexis sylvanasimons timothy vincent Alice sarah amy Daniel RobertKMerton jeff charlotte carolyn Emma Kyle Sean emily linda Olivia Eugene johnpilger Donald janet ryan Bookmarker stdavids RichardDWolff bryan Hannah anna doctorow MalcolmJohnson Catherine Alexander Christopher bob doris Anthony Jean diana Beverly frances Sarah margaretthatcher Jordan JensStuhldreier Anna Ethan Amanda jeremy donald mark matthew julie ryanair BenSchrader DrJessicaHutchings stephanie Jerry Diana David Linda adam richard henry RoyalFamily Isabella elizabeth nachrichten steven jessica Walter jeffrey Kevin Justin grace martinluther PeterGelderloos brandon mary anwarshaikh jamesbaldwin sharon nicholas Benjamin GeorgeFloyd amanda Emily Ruth heather stephenlawrence albert julianassange Julie nancy stephen Cannabis James Megan bettydog Raymond eugenetica michelle Nancy Fedimarket Frances Henry andrew kevinRuddCoup Jessica julia marketing Dorothy LoganGrendel Jason Charles JonathanMorris Danielle Brandon jose noamchomsky virginia beverly obituary ronald Bob madison ceph Helen MarkoBogoievski Jeff helen Sophia larry dorothy Dennis monbiot Nicholas Frank jack Stephen Janet ScottRosenberg Alexis Pamela Jacqueline Dylan roy brenda jesse Roger Jeffrey Brittany Shirley putkevinback Nathan christopher Carol Susan jason Philip Logan sandra jacob rose isabella Cynthia Joan jackieweaver aldoushuxley Maria martha Randy SarahEverard carl kyle karen raymond alice jerry carol RussellBrown Victoria Steven Douglas Lisa Julia joshua jacqueline Ashley assange eugene Bruce Albert Austin thomas Evelyn Gary Scott kimberly lawrence jennifer Russell austin betterlatethannever ShhDontTellJack logan Laura Chris walters Teresa GeorgeGalloway Aaron Keith brian marktwain maryanning LamySafari maria Joseph Andrew Vincent Katherine Joyce lauren Ryan amber davidgraeber alan ralph princephilip megan Kathleen sophia Cheryl abigail cynthia john richardstallman Alan AnnihilationOfCaste Debra arthurgloria mariadb Christine marilyn anthony chris Berichte Elizabeth sean Louis Larry christian deborah billy Abigail joesara AndreaBeste keith Jeremy CapitolRiots markkennedy zachary ruth Grace teresa Doris benjamin Willie george methane barbara scottish Charlotte philip DaveCunliffe randy Margaret Heather Bradley Jacob shirley pamela Matthew Nicole joan judy Kelly savannah Brian melissa Sandra stallman markstone joseph andrea shamelessselfplug Joe Sara robert aaronswartz Bobby emma willie william angela rich SachaChua samuel Postmarketos tyler Thomas John kroger patricia ashley bobby roses kelly fuckamerica ThomasCahill hannah Carolyn Ann CrimsonRosella Jeangu gary wayne Marilyn Deborah rms Sharon gare Mary frankfurt Samuel BreonnaTaylor Mark walter rebecca helendixon Madison Juan lisa cheryl janice postmarketos jeffreyepstein Christian gerald Timothy roger edward bradley Gerald PiersMorgan patrickrachel framalang Kimberly Gabriel Marie EmmaFerris PeterHoffmann PaulBaran louis kathleen Arthur Gloria terry royals freejeremy bernardhickey Richard jonathan Harold cigarettes JuliaKitten Roy samantha DavidSeymour Carl chalice Eric AndreiKazimirov relationships visuallyimpaired nicole Andrea Judith Terry Stephanie Johnny Angela Noah Kathryn RichardBoeth Ronald AskVanta Michelle Theresa gabrielmarie Samantha Judy michael charles Tyler amaryllis DouglasPFry kayla catherinealexander Martha debra JohnMichaelGreer joyce - - Tue, 08 Jun 2021 17:56:37 UT - - - activitypub - followerpower FederatedSocialMedia Fediverse mastodevs kazarma activitypub activertypub tootfic askthefedi fedivision pleroma losttoot Rss2Fedi PeerTube CreativeToots devices gofed getfedihired collaborate pixelfedlabs hometown homelab RedactionWeb fediblock fediverso lazyfedi happyfedi2u federation Invite2Fedi instances fedilab bandsofmastodon Wallabag blocks pixiv mastotips sammelabschiebung toot fedilabfeature mastodev fediversetv pixel Ktistec mastodontips catsofthefediverse mastotip wallaby MastoDev friendica mastodontip ap_c2s hiveway bands mastodonart mast Moneylab Mosstodon Adblocker fedionly DeveloperExperience askthefediverse misskey collaboraoffice activitypub_conf plsboost BlackFedi joinmastodon AskPixelfed siskin socialhub followers fediart blocking Metatext SocialMediaReimagined fediverse13 Pixelfed contentwarnings pixelfed labournettv fediverseplaysjackbox mapeocolaborativo fedihive greeninstances fedidb block FediMemories mastectomy Feditip devs fablab fediverseparty collabathon Dev Fediseminar onlyfedi admin socialcg teamtoot sponsorblock SocialNetworkingReimagined tusky retoot contentwarning peertubers imagedescription joinpeertube anastasia feditips tootcat fedizens Mastodon following epicyon afediversechat andstatus peertubeadmin leylableibt fediversefleamarket mastomagic YearOfTheFediverse mastodob fediadmin pleaseboost mastodonhost mond pixeldev pixelfont timeline socialmedia tips wedistribute fedivisionCollab fosstodon instanceblock softwaredevelopment freetoot mastodonmonday fedihelp fediWhen fedicat asta collaborative isolategab greenmastodon fedireads pixeldroid networkTimeline PeertubeMastodonHost boost AskFediverse Bookwyrm federated socialhome greenfediverse microblocks collabora fedivers MastodonMondays fediverse imagedescriptions mastobikes gbadev lemmy Fedilab bunsenlabs mastoadmin smithereen hackerstown uadblock c2s blabber FediverseFutures latenighttoots mastodon pcmasterrace developingcountries PixelfedDev fedi fediversefriday fediplay activity widevine peertube fieldlabs mastomind lab BlackMastadon fedeproxy boosten tootorial lazyfediverse mobilizon Fediverse13 lazy devuan gemifedi - - Tue, 08 Jun 2021 17:56:37 UT - - - internet - datasette onlinesafetybill linkeddata markdown selfsufficiency decentralised immersiveweb pep decentraliseren i2p sceptic earlyinternet Clubhouse spam firefox redecentralize NYCMesh decentral Burocratic staticsitegenerator wikipedia maps rtmp dataprotection decentralization inclusiónsocial decentralize w3c datacollection dotConism offlineimap DutchPolitics internetaccess agnostic geminispace archivists gaza selfhosted piratenpartij mapuche videohosting DarkPatternsFTC metafilter maille meta torrent mailab geocaching freenode MollyBrown mailfence bot tox k9mail nylasmail data socialism basemap sitejs anticolonial VerkehrsswendeJetzt worldbusterssocialclub publicserviceinternet networks online openddata centralisation internetarchaeology WordPress darkages hiddenServices chainmail datarecovery self elinks saferinternetday selfhost text contentmoderation distributed OperationPanopticon mydata webhosting decentralizedweb mailman natto p2pleft socialdistancing router protection rne dataretention speedtest ublockorigin bigdata routeros internetofthings greenhosting selfhosting forkawesome communityhosting TikTok tilde CriminalJusticeBill brave panopticon icann selfsustaining hosting mailart DAOs discourse weblate libera PeerToPeer wikis dns decentralizetheweb stripe service openstandards nojs ejabberd freifunk oauth Anticon tic foxes hypercore CDNsAreEvil meshtastic protonmail TubEdu standards StuffCircuit yourdataisyourdata internetfreedom mirroring onlineWhiteboard gemini antarctic zeit webui InternetCrimeFamily wlan boilemMashEmStickEmInAStew internetBanking SmallWeb fedwiki ircd coopcloud cw internetshutdown democratic datadetox clearnet cdn liberapay pinterest brahmaputra distributedcoop xmpp semanticweb identicurse socialnetwork Disarchive selfie colonialism anticolonialism website SaferInternetDay content splinternet participation highavailability webstandards mapa groenlinks domains ntp centralized cloudfront socialnetworks metadata wikileaks disconnect Meme aioxmpp database socialanxiety proton disco web3 cloudfirewall TLSmastery descentralizare icmp videocast governement jabber cleanuptheweb webbrowsers webhook communications decentralized userdata selflove wiki cloudron bsi browserextensions Fragattacks RedditDown ssb darknet cookies Qute MattHancock darkweb netcat webInstaller liberachat uberspace map Reddit archiv recaptcha server browser cloudy IPFS p2p social chainmaille antisocial tiddlywiki www missioncritical corne fortinet Pluralistic databreach opendata ilovewikipedia web WebsiteStatus ownyourdata battiato netshutdowns alttext xep callforparticipation twitch im darkmode 9front GaiaX decentralise att jabberspam theserverroom Watomatic datafree greenhost domain mesh selfemployed hackint OpenStreetMap gnusocial RudolfBerner slixmpp geminiprotocol statistics BurnermailIO irc pirate plaintext Graphika datacracy filesharing squatting rss openstreetmap ipns mozilla twitchbannedrevision voicemail gazaunderattack mapbox Nyxt legacyInternet yacy webrtc databases symbiotic debloattheweb crosspost jmap mail tinycircuits bureaucratic i2pd aesthetic ipfs internetradio bravenewworld browsers wikidata selfpub decentralizeit ballpointpen puredata netscape mixcloud DecolonizeTheInternet gmail openculture letthenetwork cyberspace SwitchToXmpp messaging selfies offthegrid enxeñeríasocial cloud ddg snailmail cleanup internet moderation decentralisation webinar metaverse qutebrowser socialcooling intox Seattle fox ssbroom pihole serverMeddling missingmaps bravesearch sneakernet NatureNeedsJustice Nextcloud internetarchive dataintegration mydataismydata dweb kmail js metatext adblock dark captcha BlackHatSEO beakerbrowser LiberaChat openweb soulseek NetShutdown enigmail libervia onlineharms webp gooddata mailinglist kernelupgrade dot Internet descentralizarea thepiratebay internetshutdowns fixtheweb mapporn contentid lazyweb atom kernel socialweb colonial AtomPub firewall shutdown socialists ebay mozillahubs instantmessaging publicservice interoperabilitate SolidProject webmention Justice4MohamudHassan cloudflare - - Tue, 08 Jun 2021 17:56:37 UT - - - programming - Easer DigitalInfrastructure cpp digitalpreservation programming css rubyonrails objects Python system digitaldivide digitalisierung FrancisBacon2020 dracut gitea orgmode mixers webdev proofing developerexperience seguridaddigital gui digital release ada schutzstreifen pypi crust codeforge workaround proofofwork node websocket proofofstake ecosystem rustlang systemwandel DigitalTech ocaml NapierBarracks program ngiforum21 DigitalSouveräneSchule request_reaction sqlite guile nim uptronics algorithmicharm hypocritcal profiles DeutschlandDigitalSicherBSI typescript forums vscode aapihm gitsyncmurder musicforhackers publiccode computerscience hackers guidelines vieprivée Digitalzwangmelder laravel vala adventofcode cgit solidarność CommonJS scripting coding warn digitalesouveränität DevelopmentBlog anime ohShitGit digitalzwang git org QR_code proof sourcehut ui nocode solid nodejs systemchange trevornoah zinccoop tailwindcss terminalporn guix libertàdigitali js_of_ocaml raku fedidev c script freenode-services sourcecode publiekecode framaforms WendyLPatrick DigitalAutonomy grep django gmic zim sackthelot amada gitportal gitlab crusty decoder readability parrot relevance_P1Y mnt Verkada react kingparrot Leiharbeit programmer trunk java haskell OpenSourceHardware CodedBias codelyoko workstation guixhome Tarifvertrag capitolhill desperatehousehackers esm penguin unicode development gittutors ursulakleguin gerrit db frgmntscnr Fagradalsfjall dev github freecodecamp openrc tuskydev threema recoverourdigitalspace html5 algorithms PythonJob lisp digitaldefenders codeberg souveränität forge ursulaleguin pleaseshare rustprogramming HirsuteHippo resnetting frontenddevelopment animatedgif fourtwenty rails rakudev adaptation programme developers bug fortran libraries drivers animation printingsystems freecode forgefed javascript fragment cpm code elisp JardínOpenSource commands patterns eq ECMAScriptModules html codeofconduct vintagecomputers ConstructiveAmbiguity rakulang portal terminal c99 SemillasOpenSource rust programminghumor lowcode request spiritbomb r FOSSlight dramasystem go forges digitalaudioworkstation esbuild commonlisp golang clojurescript vintage ruby releaseday rustc contractpatch deceptionpatterns debugging obsolescence_programmée computers developer darkpatterns racket sourceforge forum digitalprivacy bugreport mercurial aapi adafruit openappecosystem python fontforge indiedev api assembler kabelfernsehen OpenSource Scheibenwischer - - Tue, 08 Jun 2021 17:56:37 UT - - - legal - NoALaReformaTributaria eek scanlines rma formatie2021 hfgkarlsruhe amro karlsruhe dmc remotelearning tamron SpreekJeUitBekenKleur newnormal line disinformation OnlineHarms GameSphere squeekboard mermaid stopline3 DNSmugOfTheWeek permagold OnlineHarmsBill laipower gdpr intros Anticritique energyflow misinformation peekier MovieGeek informationsfreiheit mojeek digitalservicesact line3 mainline darmanin airline OfflineHarms permafrost geekproblem dmca - - Tue, 08 Jun 2021 17:56:37 UT - - - nature - hiking camping RedNeckedWallaby reforestation hillwalking wat hambach nsu20 marsupial StormBella zensurheberrecht insect morning lavawervelwind seashell delightful plankton trees sky_of_my_window lichen MicroOrganisms badger nsu2 ProForestation nonsupremacy light gecko birds nature volcano teamcapy butterflies Nature frogs rainforest snow sunrise fossils hambacherforest forestfinance leopardgecko moutains coldwater rocks inaturalist sunset forest LandRestoration australianwildlife forests capybara rgblighting enlightened waterfall sundaymorning forestation enlightenment natur lightening walking watches deforestation desert lava natural WoodWideWeb birdsarentreal lichensubscribe morningwalk lighttheme nsu SpringRockShed insects wildlife GreatInsults afforestation northernlights RainforestAlliance amphibians desertification - - Tue, 08 Jun 2021 17:56:37 UT - - - writing - blog framablog interactive amwriting authors writingprompt poem lime cutupmethod story pdf blogPages swap shortstory prompts magazine smallstories prompt blogging smallpoems sciencefiction writing proverbs quotes blogs noblogo otf logo playwright hedgedoc microfiction interactivestorytelling westernjournal Videopoetry quote olimex QuickSummary letterwriting icanhazpdf WriteFreely microblog bulletjournal storytelling goodread goodreads creativewriting horror wordplay writers limerick journals artjournaling zineswap zines shortstories journalists journal writingcommunity poetry 20thcenturypoetry amwritingfiction - - Tue, 08 Jun 2021 17:56:37 UT - - - music - LibreMusicChallenge musicprodution KobiRock iea LaurieAnderson ics punk punkname ourbeats gas vollgasindiekrise indieweb musician cypherpunk rutasenemigas synthesizer daftpunk bootstrappable kenloach indiemusic meatpunks LibreGraphicsMeetup cipherpunk 20thcenturyjazz acousticguitar synthpop psychedelicrock steamlinux theCartographer streetpunk hydrapaper bikepunks bandcamp mymusic pop countryrock musicians jamendo ipod skinheadmusic jam rap shoegaze mp3 steam indie steganography steampunk ldjam48 indieauthor composing folkrock perlligraphy nazipunksfuckoff Music strap EnvoieStopHashtagAu81212 eurovisionsongcontest musicmaking psychedelic thecure posthardcore vaporwave IndustrialMusicForIndustrialPeople Mixtip dubstep synthwave bootstrap princeday oi graphisme rave freemusic nowplaying hiphop hardcore Musicsoft experimentalmusic nazi cp spotify fedimusic ml bootstrapping elisamusicplayer funkloch musicbrainz eurovision catsWithMusicalTalent eos90D soundcloud psicodelia frankiegoestohollywood gastropod bassguitar 20thcenturymusic powerpop vinyl rock ccmusic typographie dj newwave dorkwave producing experimental celticmetal prince musicproduction chiptune scraping loa Schleprock thrash bluestacks lastfm uploadfilters tekno ripprince Eurvision 1 funkwhale 20thcenturyrock eos wp playlist retrosynth NowPlaying libremusicproduction psychrock MusicAdvent coinkydink toledo indiepop rockalternativo MusicTouring indierock pmbootstrap midi arianagrande indiecember synth guitar blues musiciens listeningtonow music np bass techno musicmonday jazz production graphics dieanstalt perl darkwave mastomusic band TheGrunge metal graphviz tigase polychromatic funk mindjammer magnatune fediversemusic pegasus grunge postpunk punkrock cyberpunkmusic raveculture cleantechnologies ldjam ftp BandcampFriday mixtape garagerock MusicsoftDownloader - - Tue, 08 Jun 2021 17:56:37 UT - - - gardening - seedstarting BlagueDeCodeur sporespondence blockade inde mastogarden kinder communitygardening som deno composting soil sehenswert cabbage bundeswehr opensourceseeds onions lettuce blossoms gardenersofmastodon datenschleuder florespondence garten mulberry cherryblossoms garden thyme flower horticulture DailyFlowers Schlachthofblockade cherryblossom acu plant kinderbijslag permaculture awesome teracube hens papuamerdeka Auflagen lag CompanionPlanting gardens independence flowers kale plants thegardenpath devilslettuce thegarden fahrräder gardenersworld golden beekeeping toeslagenaffaire seeds Opensourcegarden toeslagenschandaal vegetablegarden - - Tue, 08 Jun 2021 17:56:37 UT - - - countries - thai romania burma lithuania solomon chile europeanparliament Instanz boycottisrael maui fiji tajikistan benin paraguay eeuu icelandtrip senegal ukraine italy brunei nicaragua guyana Pflanzenbestimmung grönland euphoria zambia PalestineStrike iceland europeancouncil morocco rojava netherlands swaziland EuropeanUnion bosnian suriname winningatlife elsalvador russia freeburma samoa romanian asl european czech belarus hayabusa2 bw kyrgyzstan english uk abuse translation sanmarino catalonia panama africa west indians unitedkingdom japan Netherlands buyused venezuela gambia freeNukem kuwait barbados papua greece switzerland uae mau FuckIsrael nigeria usa angola honduras djibouti laos sierraleone nonprofit britain cambodia translators ych vietnam esperanto neofeud zealios seychelles marshall kazakhstan estonia tonga stlucia burundi bangladesh egypt nachhaltigkeit japanese mali congo us jordan MusiciansForPalestine americangods speedrun grenada israel psychic algeria ghana bosnia translations russian eritrea bhutan armenian hama hungary Störungsverbot saudi slovenia tig mauikit czechosvlovakia bahamas libadwaita australia kiribati togo koreanorth poland Überbevölkerung malawi capeverde armenia american hautrauswasgeht bahrain mozambique WichtigerHinweis abcbelarus japaneseglare americanpinemarten beleuchtung southsudan adminlife citylife europehoax Martesamericana syria german micronesia maldives iran indigenous sweden bijîberxwedanarojava ethiopia cuba liberia canada burkina indian Südwestgrönland somalia Chile whatshappeningintigray scotland russiaToday vaticancity easttimor austria EuropeanUnionNews turkey yemen Bolivia denmark USBased domesticabuse madagascar finland Wales philippines ivorycoast haiti ecuador Portugal azerbaijan gasuk spain albania massachusetts afghanistan rising europe mauritania dominica ökonomisierung thailand belize westpapuauprising nerdlife macedonia montenegro thenetherlands qatar mongolia costarica boatingeurope birdsofkenya boat latvia uzbekistan fatigue kabelaufklärung ireland iraq malaysia mexico investigations mauritius dezentralisierung oman chad nz de georgia zimbabwe france serbia lesotho romani oddmuse tunisia argentina czechia cameroon namibia sudan indonesia lifeboat colombia worldwildlifeday kryptowährung tuvalu britainology beckychambers turkmenistan tanzania germany neuhier norway comoros auteursrecht guatemala Thailand kosovo andorra wales indiastrikes vanlife Palestine servus pakistan belgium china antigua life europeanvalues koreasouth newzealand visiticeland einzelfall rwanda luxembourg libya indywales italyisntreal nauru moldova bad spanish eastindiacompany northernireland stigmergic palau taiwan kenya trinidad eu botswana Lebensmittelzusatzstoff CuriosidadesVariadas jamaica vanuatu cyprus aminus3 israele malta Icelandic niger s3 westpapua busse unitedstates myanmar saintvincent guinea nepal peru uganda uruguay india lebanon neurodiversity southafrica arte croatia europeanunion writerslife bolivia chinese dominican europeancommission srilanka bulgaria slovakia speedrunning gabon psychedelicart ether stkitts liechtenstein saveabkindonesia neofeudalism brazil shutdowncanada - - Tue, 08 Jun 2021 17:56:37 UT - - - privacy - privacyplease state whatip auditableprivacy PrivacyBook SearchHistory privacyaware dataprivacyday profiling what3words surveillancestate Privacy privacypolicy WhatsApp privacytoolsio makeprivacystick privacyweek surveillancetech onlineprivacy developertools privacyredirect Liberanet LiberanetChat drugpolicy privacymatters policy privacyMatters whatsappprivacypolicy dataprivacy privacywashing privacy privacyinternational hat NoToWhatsApp DataPrivacyDay2020 PrivacyFlaw nl WhatsappPrivacy handtools tool - - Tue, 08 Jun 2021 17:56:37 UT - - - hardware - plugandplay bluetooth peoplefarming purism schematics opennic zomertijd restauration riscv solarpower carbonFootprintSham mietendeckel PersonalComputer cyberdeck PineCUBE tex keyboards debuerreotype electron ChromebookDuet hibernation PneumaticLoudspeakers Nottingham schwarmwissen elitesoldat handheld screenless megapixels KeepTheDiskSpinning homebrewcomputing FarmersTractorRally pinebook farming modem lowtech biblatex allwinner datenschutz daten pimeroni lebensmittelsicherheit industrial hambibleibt analogcomputing homer TrueDelta keyboard screenprinting robotics Pinecil raspberrypi3 pocketchip oshw misterfpga T440p ArmWorkstation datensicherheit hardwarehacking mer picodisplay laptops electronics scuttlebutt ham teamdatenschutz charm SectorDisk wolnabiblioteka uart panasonic pcb armbian performance printmaker deck making hambi powerpc solar ssd acoustics ibmcompatible webcams modular larp tweedekamer cybredeck latex 3dprinted emmc ipadproart computing laptop solarpunk isa recycling modularsynth apparmor repairability theatrelighting lenovo fairelectronics industrialmusic librem carbonsequestration electronica TokyoCameraClub MacBookProService pocket box86 JingPad righttorepair trackball fuse date solarpunkactionweek ibm 3dprinting electro carbon MechcanicalKeyboards netbook hardware m68k pisa retrohardware pinetab sicherheit openhardware raspberrypi irobot datenautobahn webtoprint 3dprinter barcode Quartz64 PlanetComputer jtag ebu itsicherheit CompressedAirAmplification pinetime screens pinebookpro 3d batteries PinebookPro 3dprint Handprint modemmanager securescuttlebutt keyboardio mechanicalkeyboard electronicmusic robot arm lowerdecks ipad FireAlarms PinePower paperComputer amd openpower poweredSpeaker devopa a64 eeepc bahn F9600 rpi4 thinkpad RaspberryPiPico iot dat BeagleV repairable sbc circuitbending raspberrypi4 print displayport akihabara analog electronic FrameworkLaptop - - Tue, 08 Jun 2021 17:56:37 UT - - - security - zuluCrypt signalboost encrypt letsencrypt messengers BrowserHistory FlexibilizaciónResponsable autoritäreretatismus BlacksInCyber omemo autotomy saveanonymity alg onionrouting Installationsanleitung dataleak messenger foodinsecurity password keepassxc partyline cryptography party cybersecuritynews pipewire Installation cryptolalaland solarwinds communityalgorithmictrust infosec gchq wireless castor repairing IHaveSomethingToHide fotografie passwords gif IronySec cryptowars anonym encryptioncan supplychainattacks UseAMaskUseTor anonymous cyberattack editors security tor comb e2e bruceschneier gigafactory vpn BlacksInCybersecurity ransomware toreador itsec openssh factorio Reactorweg openssl spyware dorfleaks torx encryptionsts e2ee sequoia backdoor cryptotokens NSAmeansNationalScammingAgency stork conscientiousobjectors ed25519 torproject cryptomeanscryptography encryption 0day informationsecurity ssh misshaialert cybersec ox restore FormFactors crypto theObservatory autokorrektur giftofencryption foodsecurity kansascity auto signalapp anonymity automattic fotografía onionshare onion encryptionist autofahrer malware switchtosignal corydoctorow RestoreOurEarth radiorepair algérie hexeditor cryptographyisoverparty opsec keepass encryptionists TastySecurity securitybyobscurity torsocks toronto nsa autorenleben schneier protonvpn trustissues InsecurityByObscurity yubikey nitrokey encrypted openpgp pgpainless tatort ghibli afraleaks castor9 deletesignal prismbreak gpgtools gpg fotopiastory equatorial sequoiapgp cybersecurity Tor CryptoWars signal noscript redaktor vector trust Torge Torfverbrennung sasl cryptoparty wire historia AllmendeKontor itsecurity foto pgp RobinHoodStore cryptomator signalmessenger openvpn datasecurity autorotate regulators anleitung leak drugstore encryptiost libresignal doctors securitynow storage tracking - - Tue, 08 Jun 2021 17:56:37 UT - - - science - engineering math politicalgeography epidemiology stemfie TranslateScience electrochemistry ethnology womeninstem archeology botany STEM biodiversity ocean stemgeenFVD linguistic anthro supercollider nextgeneration zoology climatology SolarSystems dna geography physics archaeologist generalstreik geology ClinicalPsychology generationidentitaire economicanthropology Science SystemicRacism OpenScience corrosion research stemwijzer systemsmap bioengineering GotScience stemgeenPVV knowledge stemgeenVVD botanical dream dawkins ineigenersache stemgeenVVS holo graphTheory deepdreamgenerator meterology botanicalart JA21 regenerative biotech stemgeenJA21 psychology particles biology hunt pacificocean generation gene fossilhunting arthunt badscience chemistry muon processengineering paleontology oceanography stem anthropocene particlephysics nextgenerationinternet biomedical mechanicalengineering anthropology - - Tue, 08 Jun 2021 17:56:37 UT - - - photos - smartphonephotography nikon 90mm photography fujifilm rewild wildlifephotography wild photocló photo photographe photogrpahy photographer tokyocameraclub nikond90 photos macrophotography photoshop photographie photovoltaik seancephoto camera crops macropod uwphoto wildbiene macronie photographers cameras fossphotography phototherapie phonephotography myphoto rewilding naturephotography fediphoto picture wildfood macro streetphotography FujinonXF90mm wildcat photoreference crop phototherapy pictures - - Tue, 08 Jun 2021 17:56:37 UT - - - history - musichistory heirloom monarchs holocaust history arthistory makeinghistory anarchisthistory gaminghistory womenshistorymonth NetworkingHistory blackhistory monarch computerhistory - - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT places - lapaz luanda asunción salisbury nouakchott conakry kyiv enviromentalism moscow winchester cardiff saipan gibraltar dublin KlimaGerechtigkeit stuff catalunya dannibleibt avarua lilo wolverhampton hargeisa delhi niamey chișinău freestuff font colombo dundee brasília phnompenh mbabane danni belgrade rotterdam stasaph belmopan pyongyang hannover strawinsky calls ulaanbaatar oranjestad kali Reykjavik gaborone seattle ndjamena lancaster chelmsford raw singapore tuberlin preston lincoln kingedwardpoint abidjan nuuk york asshole pretoria papeete DreamtimeVillage bradford malé rhetorical robberfly sunderland zagreb gitega abudhabi flyingfishcove castries georgetown suffolk hagåtña podman videoFreex oric lichtenberg videofeedback borikua basseterre hamburg fonts afrika kinshasa Schadensersatzforderung suva klimaatverandering valparaíso athens roseau sheffield baku aberdeen charlotteamalie antananarivo domi pristina RadentscheidJena bordeaux MakoYass videocalls santiago fsb sukhumi berlin urk bristol uptronicsberlin funafuti libreville newry radentscheid puertorico ClimateChange hanoi philipsburg tehran banjul prague Stockente rawhide andorralavella daw yerevan portauprince videoprojects mewcastle dakar asu paramaribo tifariti durham capetown rigaer94 dma tirana klima ankara ipswich managua lisbon bishkek amsterdam climatchoas kent klimaat EastVirginia portonovo santodomingo wakefield bangkok texas coventry bucharest kathmandu aden madrid sanjuan vienna kingston stuttgart Utrecht inverness kabul damascus stockholm douglas ClassOf2015 willemstad brighton klimaschutz hibernoenglish thehague panamacity RassismusTötet beirut belfast amman newdelhi tórshavn nottingham nouméa oslo alofi gustavia paris cockburntown manchester ottawa classical stepanakert portofspain klimakrise class fsberlin honiara berniememe asmara florida nicosia helsinki taipei salford tegucigalpa bridge tokyo tashkent larochelle vr gabocom MadeInEU sarajevo algiers southampton KlimaKrise nairobi muscat monaco riyadh flying lusaka perth wellington bissau juba mariehamn majuro parisagreement norwich buenosaires ngerulmud dhaka berlinhateigenbedarf guatemalacity washington bedarf vatican kuwaitcity martlesham Erdmannhausen londonboaters SystemChangeNotClimateChange bern mexicocity amap bratislava myasstodontownhall bridgetown delhipolice stokeonTrent crowsnestpass leeds tunis manila warwickshire arctic stanley matautu copenhagen hereford barcelona lomé videocall budapest ouagadougou mogadishu PrawnOS freetown victoria bangor lora brazzaville portmoresby ashgabat kampala Klimaatalarm gigabitvoucher kirigami webassembly elaaiún kalimantan vilnius ContourDrawing bloemfontein gnuassembly swansea sucre london passalong marseille berniesanders pagopago bradesestate oakland vaduz birmingham addis lisburn nürnberg naypyidaw derry CassetteNavigation khartoum baghdad bandar truro moroni cuirass lehavre portvila kingstown armagh Klima ulm ChrisCrawford reykjavík lofi manama accra mewport windhoek fortworth nukualofa classic ciutatvella tbilisi canberra quito maputo cetinje adams putrajaya lichfield ramallah solimaske oslotown bogotá portsmouth dodoma berkeley harare stirling havana warsaw klimapolitik münster valletta snes localberlin ljubljana bamako leicester kualalumpur peterborough podgorica rabat cotonou oranje plymouth seoul westminster neumünster Portland dushanbe bangui aotearoa canterbury westisland tskhinvali palikir caracas brussel jamestown rome gloucester munich cambridge ripon carlisle freestuffberlin wells chichester sãotomé jakarta daressalaam sansalvador seo apia essex yaren cairo jerusalem brussels kigali southtarawa beijing minsk montevideo vientiane philips maseru klimaatopwarming hamilton lorawan lurk doha klimaatwake worcester tripoli celtic portlouis stalbans lima adamstown deventer weimar abuja fuckalabamapower saw lilongwe nassau lobamba heathrow nyc oxford fly montreal klimaatzaakshell rawtherapee dili thesprawl riga assembly lesbos monrovia nursultan Neuzulassung caste gab sanjosé klimaatrechtvaardigheid marigot islamabad fb malabo tallinn sahara thimphu klimaatzaak exeter oranjeklanten klimanotstand chester yaoundé praia bujumbura strawberries washingtondc derby sofia skopje + communedeparis lapaz luanda asunción salisbury nouakchott conakry kyiv enviromentalism moscow winchester cardiff saipan gibraltar dublin KlimaGerechtigkeit stuff catalunya dannibleibt avarua lilo wolverhampton hargeisa delhi niamey chișinău freestuff font colombo dundee brasília phnompenh mbabane danni belgrade rotterdam stasaph belmopan pyongyang hannover strawinsky calls ulaanbaatar oranjestad kali Reykjavik Barliman gaborone seattle ndjamena lancaster chelmsford raw singapore tuberlin preston lincoln kingedwardpoint abidjan nuuk york asshole pretoria papeete DreamtimeVillage washingtonstate bradford malé rhetorical robberfly sunderland zagreb gitega abudhabi flyingfishcove castries revil georgetown suffolk wickr hagåtña podman videoFreex oric ella lichtenberg videofeedback borikua basseterre hamburg southeastasia fonts afrika kinshasa Schadensersatzforderung streetartparis suva klimaatverandering valparaíso athens roseau sheffield baku aberdeen charlotteamalie antananarivo domi pristina RadentscheidJena bordeaux diff MakoYass videocalls santiago fsb sukhumi berlin urk bristol uptronicsberlin funafuti libreville newry radentscheid puertorico ClimateChange hanoi philipsburg tehran banjul prague Stockente rawhide andorralavella daw yerevan portauprince videoprojects sensorica mewcastle dakar asu paramaribo tifariti durham CrisiClimatica capetown rigaer94 dma tirana klima ankara ipswich managua lisbon bishkek amsterdam climatchoas kent klimaat EastVirginia portonovo santodomingo wakefield bangkok texas coventry bucharest kathmandu aden madrid paris14 sanjuan vienna kingston stuttgart Utrecht inverness kabul damascus stockholm douglas ClassOf2015 willemstad brighton klimaschutz klimaatnoodtoestand hibernoenglish thehague panamacity RassismusTötet beirut belfast amman newdelhi tórshavn nottingham nouméa oslo alofi gustavia paris cockburntown berlinale manchester dominio ottawa classical buch stepanakert portofspain klimakrise class fsberlin honiara berniememe asmara florida nicosia helsinki taipei salford tegucigalpa bridge tokyo tashkent larochelle vr gabocom MadeInEU sarajevo algiers southampton KlimaKrise nairobi muscat monaco riyadh flying lusaka perth wellington wick bissau juba mariehamn majuro parisagreement mumiaabujamal norwich buenosaires douglasrushkoff ngerulmud dhaka berlinhateigenbedarf guatemalacity washington bedarf vatican kuwaitcity martlesham Erdmannhausen londonboaters SystemChangeNotClimateChange bern mexicocity amap bratislava myasstodontownhall bridgetown delhipolice stokeonTrent crowsnestpass leeds tunis manila warwickshire rigaer94verteidigen arctic stanley matautu copenhagen hereford barcelona lomé videocall budapest ouagadougou mogadishu PrawnOS freetown victoria bangor lora brazzaville portmoresby ashgabat kampala Klimaatalarm gigabitvoucher kirigami webassembly yorkshire elaaiún kalimantan vilnius ContourDrawing bloemfontein gnuassembly swansea sucre london passalong marseille berniesanders pagopago bradesestate oakland vaduz birmingham addis lisburn nürnberg naypyidaw derry CassetteNavigation khartoum baghdad bandar truro moroni cuirass rigaer lehavre klimaliste portvila kingstown armagh Klima ulm ChrisCrawford reykjavík lofi manama accra mewport windhoek fortworth nukualofa classic ciutatvella tbilisi canberra quito maputo cetinje adams putrajaya lichfield ramallah solimaske oslotown bogotá warming portsmouth dodoma berkeley harare stirling havana warsaw klimapolitik rigaer94bleibt münster valletta snes localberlin ljubljana bamako leicester kualalumpur peterborough podgorica rabat cotonou oranje plymouth seoul westminster neumünster Portland dushanbe bangui aotearoa canterbury westisland tskhinvali palikir caracas brussel jamestown rome gloucester munich cambridge ripon carlisle freestuffberlin wells chichester sãotomé jakarta daressalaam sansalvador seo apia essex klimawandel yaren cairo jerusalem brussels kigali southtarawa beijing minsk montevideo vientiane philips maseru klimaatopwarming hamilton lorawan lurk doha klimaatwake worcester tripoli celtic portlouis stalbans lima adamstown deventer weimar abuja fuckalabamapower saw lilongwe nassau lobamba heathrow nyc oxford fly montreal klimaatzaakshell rawtherapee dili feedback thesprawl riga r94 assembly lesbos monrovia nursultan Neuzulassung caste gab sanjosé klimaatrechtvaardigheid marigot islamabad fb malabo tallinn sahara thimphu klimaatzaak exeter oranjeklanten klimanotstand chester yaoundé praia bujumbura strawberries washingtondc derby sofia skopje - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT + + + employment + justworked futureofwork InterviewQuestions jechercheunjob mywork remote employees hiring workingfromhome ProgrammingJob reproductivework frame workinprogress bullshitjobs car workplace DigitalNetwork antiwork workshops kreaturworks workers worklog sexworkers remotejob mainframe remotework remotejobs migrantworkers job culturalworkers DjangoJob teamwork framework hire KDEGear careers hirefedi career SocialNotworks workshop bedfordshire illustratorforhire tidyworkshops carework nowhiring KDE rds KDEGear21 obs workersrights obsolescence records KDEFrameworks plannedobsolescence work hertfordshire flossjobs jobs workflow precariousworkers carddav sexworker theworkshop nerdsnipe + + Tue, 13 Jul 2021 08:43:43 UT + + + gafam + zuckerberg caringissharing ads apple antitrust SpringerEnteignen peoplefarming deletewhatsapp advertisingandmarketing chromevox GoogleDown aws AppleSearch Floc bankruptBezos googlesearch googleio mycologists bringBunysBack youtube Goggle twitterkurds banadvertising chromebook fuckfacebook headset arcgis ffs AmazonMeansCops facebook wandering 100heads 20thcenturyadvertising amazon googlevoracle amazonprimeday dystopia microsoftgithub farcebook myco boycottinstagram FlocOff stopgafam genoegisgenoeg legislation amazonprime deletewhatsappday amazonring Gafam googleplus soldering GoogleForms HaringeyAnti delete FoodSharing lobbyregister degooglisation florespondance linkedin siri Facebook LeiharbeitAbschaffen advertising monopolies googleanalytics ausländerzentralregister adtech fuckgoogle storing plottertwitter failbook kadse microsoft deletechrome alanturing dtm poledance HeadscarfBan twitter skype azure chrome logistics googledoodles hildebrandt corporateGiant Tracking uitkeringen FlocOffGoogle sidewalk plot zuck nogafam youtubedl degoogled Google youtubers google stemverklaring gis walledgarden GAFCAM dt GooglevsOracle dotcoms deleteyoutube datafarms Instagram walledgardens agistri appleevent offseting Hypnagogist appleii facebookoversightboard fascistbook FuckGoogle degoogle boringdystopia fuschia ohneamazon appleiie deleteinstagram ungoogled ring stopgoogle affordances googledown decentring gafam inspiring oracle killedbygoogle fuckoffgoogle dance deletefacebook gradschool fakebook GoogleIsBad fuckoffgoogleandco office365 lordoftherings turingpi amazonas instagram TrackingFreeAds FlocBloc playstore synergistic bigtech boycottamazon whatsapp mytwitteranniversary deleteamazon bluesky Amazon + + Tue, 13 Jul 2021 08:43:43 UT + + + people + Melissa harold paul Zachary JusticiaParaVictoria danielle dylan scott Barbara Kenneth theresa Denise FrankLeech louisrossmann Jesse Adam justin JonathanCulbreath elinorostrom katherine judith Karen Patricia russell Metalang99 juan diane Rebecca donna LouisRossmann olivia peter troy William denise NathanDufour Betty evelyn Christina brittany Jennifer Gregory Wayne Andrychów ethan Ralph Peter ecc americalatina jacobites jean laura betty nathan brownmark margaret alexanderlukashenko Bryan Virginia Jose Rose eric james BomberBradbury david Joshua christine haaland Billy CapitolRiot ostrom natalie daniel Jonathan Michael susan George johnny bookmark MichaelWood Lauren christina Amy kevin Natalie kenneth noahkathryn Lawrence aaron donaldtrump gregory LindaLindas Amber alexa Robert Edward Patrick Rachel Verwaltunsgericht willemalexander bruce Forms dennis LegalCannabis Kayla frank Diane AliceHasters Donna Jack Paul Janice Brenda alexis sylvanasimons timothy vincent Alice sarah amy Daniel RobertKMerton jeff charlotte carolyn Emma Kyle Sean emily linda Olivia Eugene johnpilger Donald janet ryan Bookmarker stdavids RichardDWolff bryan DonnaStrickland Hannah anna doctorow MalcolmJohnson Catherine Alexander Christopher bob doris Anthony singlemarket Jean diana Beverly frances Sarah margaretthatcher Jordan peterrdevries JensStuhldreier Anna Ethan Amanda jeremy donald NatashaAKelly mark matthew julie ryanair BenSchrader DrJessicaHutchings stephanie Jerry SEKFrankfurt Diana David Linda adam richard henry RoyalFamily Isabella elizabeth nachrichten steven jessica Walter dry jeffrey Kevin Justin mountanMaryland grace martinluther PeterGelderloos brandon mary anwarshaikh jamesbaldwin sharon nicholas Benjamin GeorgeFloyd amanda Emily Ruth heather stephenlawrence albert julianassange Julie marktwirtschaft nancy stephen Cannabis James CarlSpender Megan bettydog Raymond eugenetica michelle frankgehtran Nancy Fedimarket Frances Henry andrew kevinRuddCoup Jessica zurich julia marketing Dorothy LoganGrendel Jason Charles JonathanMorris Danielle Brandon jose noamchomsky virginia beverly obituary ronald Bob madison alberta ceph Helen MarkoBogoievski Jeff helen Sophia larry bookmarks dorothy Dennis monbiot Nicholas Frank jack Stephen Janet ScottRosenberg Alexis Pamela Jacqueline Dylan roy brenda jackal jesse Roger Jeffrey Brittany Shirley putkevinback Nathan christopher Carol Susan jason Philip Logan sandra jacob rose isabella Cynthia Joan jackieweaver aldoushuxley Maria martha Randy SarahEverard carl kyle karen raymond alice jerry carol RussellBrown Victoria Steven Douglas Lisa JonathanZittrain Julia joshua jacqueline Ashley assange eugene Bruce Albert Austin thomas Evelyn Gary Scott kimberly lawrence virgin jennifer Russell austin erdogan betterlatethannever ShhDontTellJack logan Laura Chris walters Teresa GeorgeGalloway Aaron Keith brian marktwain maryanning LamySafari maria Joseph Andrew Vincent Katherine Joyce NathanJRobinson lauren Ryan amber davidgraeber alan ralph princephilip DennisTheMenace megan Kathleen sophia Cheryl abigail cynthia john richardstallman Alan AnnihilationOfCaste Debra GeorgeHoare arthurgloria mariadb LouisFurther Christine marilyn anthony chris Berichte Elizabeth sean Louis Larry AnnSophieBarwich christian deborah billy Abigail joesara AndreaBeste keith Jeremy CapitolRiots markkennedy zachary ruth Grace teresa Doris benjamin Willie george methane barbara scottish Charlotte philip DaveCunliffe ethanzuckerman randy Margaret Heather Bradley Jacob shirley pamela Matthew Nicole joan judy Kelly savannah Brian melissa Sandra stallman markstone joseph oberverwaltungsgericht andrea shamelessselfplug Joe Sara robert alicevision aaronswartz better Bobby emma willie william angela rich SachaChua samuel Postmarketos tyler Thomas John kroger patricia ashley bobby roses kelly fuckamerica ThomasCahill hannah Carolyn Ann CrimsonRosella Jeangu gary wayne Marilyn Deborah christenunie rms Sharon gare Mary frankfurt Samuel BreonnaTaylor Mark walter rebecca helendixon Madison Juan lisa cheryl janice jeffreyepstein Christian gerald Timothy roger edward bradley Gerald PiersMorgan patrickrachel framalang Kimberly steve Gabriel Marie EmmaFerris PeterHoffmann PaulBaran louis kathleen Arthur Gloria terry royals freejeremy bernardhickey Richard jonathan Harold shame Roy samantha DavidSeymour Carl chalice Eric AndreiKazimirov RebeccaHarvey relationships visuallyimpaired nicole Andrea Judith Terry Stephanie Johnny Angela Noah Kathryn RichardBoeth Ronald AskVanta Michelle Theresa gabrielmarie Samantha Judy michael charles GeorgeGerbner Tyler amaryllis DouglasPFry kayla catherinealexander Martha debra JohnMichaelGreer stevewozniak joyce + + Tue, 13 Jul 2021 08:43:43 UT + + + activitypub + followerpower FederatedSocialMedia mastodevs kazarma activitypub activertypub tootfic askthefedi fedivision pleroma losttoot Rss2Fedi PeerTube CreativeToots devices gofed getfedihired collaborate pixelfedlabs hometown homelab RedactionWeb fediblock fediverso lazyfedi happyfedi2u federation Invite2Fedi instances fedilab bandsofmastodon Wallabag blocks pixiv mastotips sammelabschiebung toot fedilabfeature mastodev fediversetv pixel Ktistec mastodontips catsofthefediverse mastotip pixel3a wallaby MastoDev friendica mastodontip talesfromthefediverse mastofficina fleamarket ap_c2s hiveway bands mastodonart mast Moneylab Mosstodon Adblocker fedionly DeveloperExperience askthefediverse misskey collaboraoffice activitypub_conf plsboost BlackFedi joinmastodon AskPixelfed siskin socialhub followers fediart blocking fedifreebies Metatext SocialMediaReimagined fediverse13 mondkapjesplicht Pixelfed contentwarnings pixelfed labournettv fediverseplaysjackbox mapeocolaborativo fedihive greeninstances fedidb block FediMemories mastectomy Feditip devs fablab fediverseparty collabathon Dev Fediseminar onlyfedi admin socialcg teamtoot fedbox FediMeta sponsorblock SocialNetworkingReimagined tusky retoot contentwarning peertubers imagedescription joinpeertube anastasia feditips tootcat dnsssecmastery2e fedizens Mastodon following epicyon afediversechat andstatus peertubeadmin leylableibt fediversefleamarket mastomagic YearOfTheFediverse mastodob fediadmin pleaseboost mastodonhost mond pixeldev pixelfont timeline socialmedia tips wedistribute fedivisionCollab fosstodon instanceblock softwaredevelopment freetoot mastodonmonday fedihelp fediWhen fedicat asta collaborative isolategab greenmastodon FediverseFixesThis fedireads pixeldroid networkTimeline PeertubeMastodonHost boost AskFediverse Bookwyrm federated socialhome greenfediverse WriteFreely microblocks collabora fedivers MastodonMondays fediverse imagedescriptions mastobikes gbadev lemmy Fedilab bunsenlabs mastoadmin smithereen hackerstown uadblock c2s FediverseFutures latenighttoots mastodon pcmasterrace developingcountries boostswelcome PixelfedDev fedi fediversefriday mondkapje fediplay activity widevine peertube fieldlabs mastomind lab BlackMastadon fedeproxy boosten tootorial boostwelcome lazyfediverse mastoaiuto mobilizon Fediverse13 lazy gemifedi activityPubRocks + + Tue, 13 Jul 2021 08:43:43 UT + + + internet + datasette onlinesafetybill linkeddata markdown selfsufficiency webgl LoveWattsBLM decentralised immersiveweb pep decentraliseren i2p sceptic earlyinternet Clubhouse CooperativeClouds spam firefox redecentralize NYCMesh decentral socializing Burocratic toxicmasculinity staticsitegenerator wikipedia maps rtmp PlasticFreeJuly dataprotection decentralization inclusiónsocial decentralize w3c datacollection files dotConism offlineimap DutchPolitics internetaccess agnostic gotosocial geminispace archivists gaza selfhosted piratenpartij mapuche videohosting DarkPatternsFTC metafilter maille meta wikibase CooperativeTechnology torrent mailab geocaching freenode MollyBrown mailfence bot tox k9mail nylasmail data socialism basemap webarchive sitejs meshroom anticolonial VerkehrsswendeJetzt Jabbber worldbusterssocialclub publicserviceinternet networks criticism bioinformatics online openddata centralisation internetarchaeology WordPress darkages hiddenServices chainmail datarecovery self elinks saferinternetday selfhost text SeattleHellDay contentmoderation distributed OperationPanopticon mappe mydata webhosting decentralizedweb mailman SOASJusticeforCleaners natto p2pleft socialdistancing router protection rne dataretention speedtest ublockorigin bigdata routeros internetofthings greenhosting selfhosting forkawesome communityhosting TikTok tilde CriminalJusticeBill brave panopticon aldi icann selfsustaining hosting mailart DAOs discourse digitalcolonialism weblate libera PeerToPeer wikis dns decentralizetheweb stripe service openstandards nojs ejabberd freifunk oauth Anticon tic foxes hypercore CDNsAreEvil meshtastic protonmail TubEdu standards StuffCircuit yourdataisyourdata internetfreedom mirroring onlineWhiteboard gemini antarctic zeit webui InternetCrimeFamily wlan boilemMashEmStickEmInAStew internetBanking SmallWeb fedwiki redessociales fleenode ircd coopcloud cw internetshutdown democratic criticalmass datadetox clearnet cdn cloudflared liberapay pinterest brahmaputra distributedcoop xmpp semanticweb identicurse socialnetwork Disarchive selfie anticolonialism website datasets SaferInternetDay content splinternet participation highavailability webstandards mapa groenlinks domains ntp centralized cloudfront socialnetworks metadata wikileaks disconnect Meme aioxmpp database socialanxiety proton disco web3 cloudfirewall TLSmastery descentralizare icmp organicMaps oop videocast governement jabber cleanuptheweb webbrowsers webhook communications decentralized userdata selflove wiki cloudron bsi browserextensions Fragattacks RedditDown ssb darknet cookies Qute MattHancock darkweb netcat webInstaller liberachat uberspace map Konfekoop Reddit archiv recaptcha server browser cloudy IPFS p2p social chainmaille antisocial tiddlywiki www missioncritical FreenodeTakeover corne fortinet Pluralistic databreach opendata ilovewikipedia web WebsiteStatus ownyourdata battiato netshutdowns alttext xep callforparticipation twitch im darkmode 9front bbb quadraticvoting GaiaX decentralise att jabberspam theserverroom antarctica shutdowns Watomatic datafree greenhost domain mesh selfemployed hackint OpenStreetMap gnusocial darkambient RudolfBerner slixmpp geminiprotocol statistics BurnermailIO irc eveonline pirate plaintext Graphika datacracy filesharing squatting misinformation rss openstreetmap ipns mozilla twitchbannedrevision voicemail gazaunderattack mapbox Nyxt legacyInternet yacy webrtc databases symbiotic debloattheweb crosspost jmap mail tinycircuits bureaucratic i2pd aesthetic ipfs internetradio bravenewworld routers practice browsers wikidata selfpub decentralizeit ballpointpen puredata netscape mixcloud DecolonizeTheInternet gmail openculture letthenetwork cyberspace SwitchToXmpp messaging selfies offthegrid enxeñeríasocial cloud ddg blabber snailmail cleanup selfdefense internet moderation decentralisation webinar metaverse qutebrowser _w3c_ socialcooling intox scholarsocial Seattle fox umap ssbroom pihole serverMeddling missingmaps qtox puremaps archiving bravesearch sneakernet NatureNeedsJustice Nextcloud internetarchive dataintegration mydataismydata dweb kmail js metatext adblock dark captcha socialNetworks BlackHatSEO beakerbrowser LiberaChat openweb soulseek NetShutdown enigmail libervia onlineharms webp gooddata mailinglist kernelupgrade dot Internet descentralizarea thepiratebay internetshutdowns fixtheweb mapporn contentid lazyweb atom kernel socialweb colonial AtomPub firewall shutdown ambient socialists kernenergie ebay mozillahubs instantmessaging publicservice interoperabilitate SolidProject webmention Justice4MohamudHassan cloudflare + + Tue, 13 Jul 2021 08:43:43 UT + + + linux + pubnix linuxboot compiz osdev musescore commandline opensuse share linuxisnotanos elementaryos cli buster viernesdeescritorio voidlinux shell nu cliff olinuxino deb composite beschbleibt kde FragAttacks Debian11 reprobuilds pureos nospoilers kdepim thisweekinlinux slackware search bsd tap openwrt falling runbsd distros stapler tmux nixos alpine nix DebianBullseye rm xfce ubuntubuzz gnutools vaguejoke ack shareyourdesktop shellagm personal wireguard posix lightweight whonix hardenedbsd linuxaudio mate haikuos usb nushell LinuxTablets nixpkgs wordsearch landback osi alpines computertruhe nonmateria torvalds gtk linuxmint DebianAcademy debian chroot trisquel studio gnome distrowatch linuxposting fedoraonpinephone trackers console showyourdesktop FuckDeMonarchie researchassistants anarchie windowmanager desktop GuixSystem arch personalities platform ubuntu personalwiki jodee snowfall gnulinux patriarchat aur tuxjam justlinuxthings xubuntu kdeframeworks5 stackoverflow unix fedora openbsd centos nos fittrackee tuxedocomputers tracker openmandriva backwaren gentoo buildroot aurora architecture researcher BlackLives liveusb dee SearchFu personalarchive usergroup StockOS systemd linuxgaming Debian distro 1492LandBackLane Racklet theartofcomputerprogramming icecat tape puppylinux destinationlinux LinuxSpotted lovelinux thestudio suicide show Squarch monstrosities computer gtk3 blackout deepBlah escritoriognulinux acepride qubesos i3wm clipstudiopaint dadjokes kubuntu epr JuiceFS reproducible kdecommunity haiku alpinelinux linuxisnotaplatform clip fall linux EMMS planetdebian minicomputer altap raspbian netbsd DanctNIX termux btrfs reproduciblebuilds showTheRainbow gravitationalwaves joke artix gtk4 esc linuxexpress archlinuxarm bash exposingtheinvisible archlinux hare ubuntucore linuxconfau researchers AuratAzadiMarch gnomebuilder GNUlinux rhel debianinstaller debianindia linuxisajoke tux devuan debían suse zsh linuxconsole scoobySnacks + + Tue, 13 Jul 2021 08:43:43 UT + + + programming + Easer psychotherapie DigitalInfrastructure cpp digitalpreservation programming css maui rubyonrails objects Python system digitaldivide digitalisierung FrancisBacon2020 dracut gitea orgmode mixers webdev proofing developerexperience seguridaddigital gui digital release ada schutzstreifen pypi crust codeforge workaround proofofwork zorg node websocket proofofstake ecosystem rustlang systemwandel DigitalTech python2 ocaml NapierBarracks system76 program ngiforum21 DigitalSouveräneSchule request_reaction sqlite guile capitolhillautonomouszone transcript TransZorgNu nim uptronics algorithmicharm hypocritcal profiles digitalsketch DeutschlandDigitalSicherBSI typescript forums vscode aapihm gitsyncmurder musicforhackers publiccode ocr computerscience hackers guidelines vieprivée Digitalzwangmelder laravel vala adventofcode cgit solidarność DigitalPayments beginnersguide CommonJS webdev101 scripting coding warn mauikit digitalesouveränität DevelopmentBlog anime ohShitGit digitalzwang meld git org QR_code proof sourcehut ui nocode solid nodejs systemchange trevornoah zinccoop tailwindcss terminalporn Wassersouveränität guix libertàdigitali js_of_ocaml raku fedidev c script freenode-services sourcecode publiekecode framaforms WendyLPatrick DigitalAutonomy grep django gmic zim sackthelot amada gitportal Acode gitlab crusty decoder bulldada readability parrot relevance_P1Y mnt digitalartwork Verkada react kingparrot Leiharbeit programmer trunk java haskell OpenSourceHardware CodedBias codelyoko workstation guixhome Tarifvertrag capitolhill desperatehousehackers esm penguin unicode development gittutors ursulakleguin gerrit db frgmntscnr Fagradalsfjall dev github freecodecamp openrc tuskydev threema recoverourdigitalspace html5 algorithms PythonJob lisp digitaldefenders codeberg souveränität forge ursulaleguin pleaseshare rustprogramming EspacioDigital HirsuteHippo resnetting frontenddevelopment animatedgif fourtwenty rails rakudev adaptation programme developers bug fortran libraries drivers animation printingsystems freecode forgefed javascript fragment cpm code elisp JardínOpenSource commands patterns eq ECMAScriptModules html codeofconduct vintagecomputers ConstructiveAmbiguity rakulang portal terminal c99 SemillasOpenSource rust programminghumor lowcode request AreWeTheBorg spiritbomb r FOSSlight bugbounty dramasystem go forges digitalaudioworkstation esbuild federadas commonlisp golang clojurescript vintage ruby releaseday rustc contractpatch rubylang dd deceptionpatterns mugorg debugging makejavascriptoptional nodefwd obsolescence_programmée computers developer darkpatterns racket sourceforge forum ksh digitalprivacy minimumwage bugreport mercurial aapi adafruit openappecosystem python fontforge webdeveloper indiedev ocrodjvu sh digitalGardens api assembler kabelfernsehen OpenSource Scheibenwischer + + Tue, 13 Jul 2021 08:43:43 UT + + + legal + NoALaReformaTributaria eek scanlines kurmancî rma informatik formatie2021 hfgkarlsruhe doj amro karlsruhe dmc remotelearning tamron formatie SpreekJeUitBekenKleur newnormal line disinformation kurmanji OnlineHarms GameSphere squeekboard mermaid stopline3 DNSmugOfTheWeek permagold OnlineHarmsBill laipower gdpr intros Anticritique energyflow peekier MovieGeek OnlineMeetings informationsfreiheit mojeek digitalservicesact line3 disinfo mainline darmanin airline OfflineHarms permafrost geekproblem dmca + + Tue, 13 Jul 2021 08:43:43 UT + + + nature + hiking camping RedNeckedWallaby reforestation hillwalking wat hambach nsu20 marsupial lightning StormBella zensurheberrecht insect morning lavawervelwind seashell delightful plankton trees sky_of_my_window lichen MicroOrganisms badger nsu2 ProForestation nonsupremacy light gecko birds nature embargo_watch volcano teamcapy butterflies Nature frogs rainforest snow sunrise fossils hambacherforest forestfinance lighthouse hitchhiking leopardgecko moutains coldwater rocks inaturalist clamfacts sunset naturereserve forest LandRestoration australianwildlife forests capybara rgblighting enlightened waterfall sundaymorning forestation enlightenment natur lightening finance walking watches deforestation desert lava natural WoodWideWeb birdsarentreal lichensubscribe morningwalk lighttheme nsu retraction_watch SpringRockShed insects wildlife GreatInsults afforestation northernlights RainforestAlliance ProtégeonsLaNature amphibians walk desertification otter + + Tue, 13 Jul 2021 08:43:43 UT + + + writing + blog framablog interactive amwriting authors writingprompt poem lime cutupmethod story pdf blogPages swap shortstory prompts magazine smallstories prompt blogging smallpoems sciencefiction responsetootherblogs writing proverbs quotes blogs teleprompters noblogo otf logo playwright hedgedoc interactivestorytelling westernjournal Videopoetry quote olimex QuickSummary letterwriting icanhazpdf microblog bulletjournal storytelling goodread goodreads journalist creativewriting horror wordplay writers limerick journals artjournaling zineswap zines shortstories journalists journal writingcommunity poetry 20thcenturypoetry amwritingfiction + + Tue, 13 Jul 2021 08:43:43 UT + + + music + LibreMusicChallenge musicprodution KobiRock iea travessiapelavida LaurieAnderson ics punk punkname cooperativetechnology ourbeats gas vollgasindiekrise indieweb musician cypherpunk rutasenemigas synthesizer daftpunk bootstrappable kenloach indiemusic collapseos meatpunks LibreGraphicsMeetup cipherpunk 20thcenturyjazz acousticguitar synthpop psychedelicrock steamlinux playingnow streetpunk loader hydrapaper bikepunks bandcamp mymusic pop countryrock musicians jamendo ipod skinheadmusic jam rap shoegaze mp3 steam indie steganography steampunk ldjam48 indieauthor composing folkrock perlligraphy nazipunksfuckoff Music strap EnvoieStopHashtagAu81212 anarchopunk eurovisionsongcontest biography musicmaking psychedelic thecure posthardcore vaporwave IndustrialMusicForIndustrialPeople Mixtip dubstep synthwave bootstrap princeday oi graphisme rave freemusic nowplaying hiphop hardcore frappuccino Musicsoft experimentalmusic nazi folk cp TravesíaPorLaVida spotify fedimusic ml bootstrapping webscraping elisamusicplayer funkloch musicbrainz eurovision lasvegas catsWithMusicalTalent eos90D soundcloud psicodelia frankiegoestohollywood gastropod PigTrap bassguitar collapse 20thcenturymusic powerpop vinyl rock ccmusic denachtvanjanssen typographie dj newwave dorkwave producing experimental celticmetal prince musicproduction chiptune scraping loa Schleprock thrash bluestacks lastfm uploadfilters tekno ripprince Eurvision maunaloa technocracy asus 1 funkwhale 20thcenturyrock eos wp playlist retrosynth NowPlaying contest libremusicproduction psychrock MusicAdvent poppy coinkydink appropriatetechnology toledo samensterk indiepop rockalternativo MusicTouring indierock pmbootstrap midi arianagrande indiecember synth guitar blues musiciens listeningtonow abandonedplaces music folkpunk np bass techno gmtkjam musicmonday jazz production graphics dieanstalt perl darkwave mastomusic band TheGrunge metal chipmusic graphviz tigase polychromatic funk mindjammer popos magnatune fediversemusic pegasus grunge postpunk punkrock indieauth cyberpunkmusic raveculture cleantechnologies ldjam ftp BandcampFriday elisa mixtape garagerock MusicsoftDownloader camanachd + + Tue, 13 Jul 2021 08:43:43 UT + + + gardening + seedstarting BlagueDeCodeur sporespondence blockade inde mastogarden kinder communitygardening som deno composting soil sehenswert cabbage bundeswehr opensourceseeds onions lettuce blossoms gardenersofmastodon datenschleuder florespondence garten rinder succulent mulberry cherryblossoms garden thyme flower horticulture DailyFlowers Schlachthofblockade cherryblossom acu vegetable plant bricolage financialindependence kinderbijslag permaculture awesome teracube hens papuamerdeka Auflagen lag independenceday CompanionPlanting vlag gardens independence flowers seed kale seedvault plants thegardenpath devilslettuce vegetables thegarden fahrräder gardenersworld recyclage golden beekeeping toeslagenaffaire seeds Opensourcegarden toeslagenschandaal vegetablegarden + + Tue, 13 Jul 2021 08:43:43 UT + + + countries + thai romania korean burma lithuania solomon chile europeanparliament Instanz boycottisrael fiji tajikistan benin paraguay eeuu icelandtrip senegal ukraine italy brunei nicaragua guyana Pflanzenbestimmung grönland euphoria zambia PalestineStrike iceland europeancouncil morocco netherlands swaziland EuropeanUnion bosnian suriname winningatlife elsalvador russia freeburma samoa StaatstrojanerParteiDeutschlands romanian asl european czech belarus hayabusa2 bw kyrgyzstan english uk translation sanmarino catalonia panama africa west indians unitedkingdom japan Netherlands buyused venezuela gambia freeNukem kuwait barbados papua greece switzerland brasilien uae mau england FuckIsrael nigeria usa angola honduras djibouti laos sierraleone nonprofit britain cambodia translators ych vietnam esperanto neofeud zealios seychelles marshall kazakhstan estonia investigate tonga stlucia burundi bangladesh egypt nachhaltigkeit japanese mali congo us IcelandicVerminControl jordan MusiciansForPalestine americangods digitaleurope speedrun grenada israel psychic algeria ghana bosnia translations russian eritrea bhutan armenian hama hungary Störungsverbot saudi slovenia tig czechosvlovakia bahamas libadwaita australia kiribati togo koreanorth poland Überbevölkerung ethereum malawi AlwaysBetterTogether capeverde armenia american hautrauswasgeht bahrain mozambique moa WichtigerHinweis abcbelarus japaneseglare americanpinemarten beleuchtung southsudan adminlife citylife europehoax Martesamericana syria german micronesia maldives iran indigenous sweden bijîberxwedanarojava ethiopia sid cuba liberia canada burkina indian Südwestgrönland somalia Chile whatshappeningintigray scotland Enlgand russiaToday vaticancity easttimor austria EuropeanUnionNews turkey yemen Bolivia denmark USBased domesticabuse austrianworldsummit madagascar finland Wales philippines ivorycoast haiti ecuador Portugal azerbaijan gasuk spain albania massachusetts afghanistan europe mauritania dominica ökonomisierung thailand belize westpapuauprising nerdlife macedonia montenegro ChileDesperto thenetherlands qatar mongolia costarica boatingeurope birdsofkenya boat latvia uzbekistan fatigue kabelaufklärung ireland iraq malaysia mexico investigations mauritius dezentralisierung oman chad nz de georgia zimbabwe france serbia lesotho romani halflife oddmuse tunisia argentina czechia cameroon namibia sudan indonesia lifeboat colombia worldwildlifeday kryptowährung tuvalu britainology merica beckychambers turkmenistan tanzania germany neuhier norway comoros auteursrecht guatemala Thailand kosovo eastgermany andorra wales indiastrikes vanlife Palestine servus pakistan belgium china 3615malife antigua life europeanvalues koreasouth newzealand visiticeland einzelfall rwanda luxembourg libya indywales italyisntreal nauru moldova bad spanish eastindiacompany northernireland stigmergic palau taiwan kenya trinidad eu botswana Lebensmittelzusatzstoff CuriosidadesVariadas jamaica vanuatu cyprus aminus3 israele malta Icelandic psychedelia niger s3 westpapua busse unitedstates myanmar saintvincent guinea nepal peru uganda uruguay india pacificnorthwest lebanon neurodiversity southafrica writer arte croatia europeanunion writerslife bolivia chinese dominican europeancommission srilanka bulgaria slovakia speedrunning gabon psychedelicart ether stkitts liechtenstein saveabkindonesia neofeudalism surinam brazil shutdowncanada + + Tue, 13 Jul 2021 08:43:43 UT + + + privacy + privacyplease state whatip auditableprivacy PrivacyBook SearchHistory privacyaware dataprivacyday profiling what3words surveillancestate Privacy privacypolicy WhatsApp privacyrights privacytoolsio makeprivacystick privacyweek surveillancetech onlineprivacy developertools WhatMakesMeReallyAngry privacyredirect Liberanet LiberanetChat drugpolicy privacymatters policy privacyMatters whatsappprivacypolicy dataprivacy privacywashing privacy privacyinternational whowhatwere hat NoToWhatsApp DataPrivacyDay2020 PrivacyFlaw nl WhatsappPrivacy tool + + Tue, 13 Jul 2021 08:43:43 UT + + + hardware + plugandplay bluetooth printnightmare singleboardcomputer purism dating schematics opennic zomertijd librehardware BoBurnham restauration rmw riscv solarpower carbonFootprintSham mietendeckel PersonalComputer cyberdeck PineCUBE firmware tex keyboards debuerreotype electron ChromebookDuet AbolishFrontex bond hibernation PneumaticLoudspeakers schreibmaschine imac Nottingham schwarmwissen elitesoldat handheld screenless megapixels BibliothekDerFreien KeepTheDiskSpinning homebrewcomputing FarmersTractorRally pinebook farming modem lowtech biblatex allwinner datenschutz daten home pimeroni 68 lebensmittelsicherheit industrial hambibleibt analogcomputing homer TrueDelta keyboard screenprinting robotics Pinecil mutantC raspberrypi3 pocketchip oshw misterfpga noisebridge disapora T440p ArmWorkstation datensicherheit latexrun hardwarehacking mer picodisplay laptops electronics scuttlebutt ham teamdatenschutz charm SectorDisk wolnabiblioteka permacomputing uart panasonic pcb almere armbian performance kopimi printmaker deck making hambi powerpc solar ssd acoustics ibmcompatible webcams modular larp tweedekamer cybredeck latex 3dprinted emmc ipadproart computing laptop solarpunk isa recycling modularsynth apparmor repairability theatrelighting lenovo updates fairelectronics industrialmusic librem carbonsequestration electronica sed TokyoCameraClub MacBookProService pocket box86 JingPad righttorepair mac trackball fuse date solarpunkactionweek ibm 3dprinting electro carbon MechcanicalKeyboards netbook hardware m68k pisa retrohardware pinetab sicherheit openhardware raspberrypi irobot datenautobahn webtoprint 3dprinter barcode lüneburg Quartz64 PlanetComputer jtag ebu merseyside itsicherheit CompressedAirAmplification pinetime screens pinebookpro lebensmittel 3d batteries PinebookPro 3dprint pim Handprint modemmanager securescuttlebutt keyboardio mechanicalkeyboard electronicmusic solarpunks carbondioxide robot arm lowerdecks ipad FireAlarms PinePower paperComputer amd openpower poweredSpeaker devopa a64 eeepc bahn F9600 rpi4 thinkpad RaspberryPiPico iot dat BeagleV arm64 merveilles repairable sbc circuitbending raspberrypi4 print displayport akihabara analog electronic FrameworkLaptop + + Tue, 13 Jul 2021 08:43:43 UT + + + security + zuluCrypt signalboost encrypt letsencrypt messengers BrowserHistory FlexibilizaciónResponsable autoritäreretatismus BlacksInCyber omemo autotomy saveanonymity alg onionrouting Installationsanleitung dataleak messenger foodinsecurity password keepassxc partyline cryptography party cybersecuritynews pipewire Installation cryptolalaland solarwinds bitwarden communityalgorithmictrust infosec gchq GemeinsamGegenDieTierindustrie mitm wireless castor repairing IHaveSomethingToHide fotografie passwords gif IronySec cryptowars anonym encryptioncan supplychainattacks UseAMaskUseTor anonymous cyberattack editors security tor comb e2e supplychain bruceschneier gigafactory vpn BlacksInCybersecurity ransomware toreador itsec dnssecmastery2e openssh factorio Reactorweg openssl backdoored spyware dorfleaks torx encryptionsts e2ee sequoia backdoor cryptotokens NSAmeansNationalScammingAgency stork conscientiousobjectors ed25519 torproject cryptomeanscryptography encryption 0day informationsecurity ssh misshaialert cybersec ox restore FormFactors crypto theObservatory autokorrektur giftofencryption foodsecurity kansascity auto signalapp anonymity automattic fotografía onionshare onion encryptionist kontor autofahrer infosecbikini autocrypt malware switchtosignal cloudsecurity corydoctorow RestoreOurEarth radiorepair algérie hexeditor distortions cryptographyisoverparty opsec keepass encryptionists TastySecurity cryptobros securitybyobscurity torsocks toronto nsa autorenleben schneier protonvpn trustissues InsecurityByObscurity yubikey nitrokey encrypted 1password openpgp pgpainless tatort ghibli afraleaks castor9 deletesignal prismbreak gpgtools autodidactic gpg automation fotopiastory equatorial sequoiapgp cybersecurity Tor CryptoWars signal noscript redaktor vector trust Torge Torfverbrennung sasl cryptoparty wire historia AllmendeKontor itsecurity websecurity foto pgp RobinHoodStore cryptomator signalmessenger openvpn datasecurity autorotate regulators anleitung leak drugstore encryptiost libresignal doctors securitynow storage tracking + + Tue, 13 Jul 2021 08:43:43 UT + + + science + engineering math politicalgeography epidemiology stemfie TranslateScience electrochemistry ethnology womeninstem archeology botany STEM biodiversity ocean stemgeenFVD linguistic anthro supercollider nextgeneration zoology linguistics climatology uprootthesystem oceans SolarSystems reasoning awk dna geography physics intergenerational archaeologist generalstreik geology ClinicalPsychology generationidentitaire economicanthropology Science SystemicRacism OpenScience corrosion research stemwijzer systemsmap bioengineering GotScience sistemainoperativo stemgeenPVV knowledge stemgeenVVD botanical dream dawkins ineigenersache psychogeography stemgeenVVS holo graphTheory deepdreamgenerator AnnualStatisticalReview trilateralresearch meterology botanicalart JA21 regenerative ScienceDenial biotech stemgeenJA21 psychology dreamtime pataphysics particles biology bughunting researching_research hunt pacificocean generation gene fossilhunting arthunt badscience mathematics chemistry muon processengineering paleontology oceanography stem anthropocene particlephysics nextgenerationinternet biomedical mechanicalengineering anthropology + + Tue, 13 Jul 2021 08:43:43 UT + + + photos + smartphonephotography nikon 90mm photography fujifilm rewild photogrammetry wildlifephotography wild affinityphoto photocló photo photographe photogrpahy photographer tokyocameraclub nikond90 photos macrophotography photoshop photographie photovoltaik seancephoto camera crops photomanager macropod uwphoto wildbiene macronie photographers cameras fossphotography phototherapie phonephotography myphoto rewilding naturephotography fediphoto picture wildfood macro intothewild streetphotography FujinonXF90mm wildcat photoreference crop phototherapy pictures + + Tue, 13 Jul 2021 08:43:43 UT + + + history + musichistory heirloom monarchs holocaust history arthistory makeinghistory History anarchisthistory indigenoushistorymonth gaminghistory womenshistorymonth NetworkingHistory blackhistory monarch computerhistory HistoryOfArt + + Tue, 13 Jul 2021 08:43:43 UT software - beta borgbackup forms app freedombox windows edit nginx transclusion krebsrisiken freepalestin calibre misophonia fosshost postscript AAPIHeritageMonth freenet freebsd kc Framasoft tts E40 Flisol2021 invidious drm publicdomain ilovefreesoftware hydra readers StoryMapJS kubernetes openvms luca nodrm copyleft fossmendations freedoom jami betatesting NottsTV libregraphics genossenschaft FuckOffZoom quicksy whiteboard free docker softwarelibre opensourcehardware interoperability impression3d freesoftware gimp krebs backups matrix dinosaur mossad unfa weechat designjustice thefreethoughtproject filesystems nextcloud translate wechat notmatrix gnupg lucaApp duplicati HappyLight opensourcesoftware permissionless compression openscad freeganizm uidesign softwaredeveloper TabOrder searx ikiwiki prosody Linux FreeSoftware userresearch FlisolLibre2021 DisCOElements Audio rocketchat thanksfreesw immers outreachy synapse API freelibre lyft freekirtaner nitter monitoring misogyny virtualbox ngi4eu discord whisperfish ee vaporware opensource diaspora yunohost oss librelounge chickadee appstore dégooglisons littlebigdetails cabal conferencing cadmium libreboot musiquelibre mycroft devops kdeapplications owncast phabricator emacs freiesoftware FLOSSvol moss fluffychat dinoim impress writefreely videoconferencing bigbluebutton email ngi esri chatapps HappyNewYear Eiskappe fossilfriday floss plugins softwaresuite frecklesallovertheshow graphic libresoftware softwareengineering mosstodon expandocat deltachat application uifail FOSS peatfree lucaapp GNOMECircle rockpro64 bittorrent palestinewillbefree penpot vlc zoom tiling FriendofGNOME Senfstoffknappheit usability winamp opendesign obnam snap ProprietarySoftwareProblems pandoc blackcappedchickadee cryptpad software libretranslate OwnStream upstream maplibre slack Hummingbard Element DismantleFossilCompanies safenetwork asia SoftwareLibre zrythm gnu CTZN silicongraphics mumble grsync freecad drmfree telegram containers tails blockchain irssi HabKeinWhatsapp mcclim jitsimeet dedrm iso mutt librelingo freetibet WeAreAlmaLinux tilingwm sri design gameoftrees GnuLinuxAudio freegan freeriding freetool backup trueLinuxPhone rotonde freetube jumpdrive GNU speechrecognition eurovison skydroid thunderbird sysadmin it sound alternativeto screenreader parler apps chat licensing fossasia inclusivedesign ethicalsoftware defectivebydesign metager digitalsustainability screenreaders sysadmins ZeroCool LINMOBapps freedombone uber obsproject librecast softwareheritage pittsburgh profanity Tankklappe doomemacs ffmpeg fossandcrafts GNOME40 telesoftware love reboot opensourcegardens musique switchingsoftware OSM freesw agpl distribute magnifyingglass GNOME freeganizmniewybacza drive freesoftare AlmaLinux GreenandBlackCross strafmaatschappij freetillie distributedledger mattermost principiadiscordia blue LinuxPhones rocket ghostscript win10 Zoom tibet ComputerFolklore fossaudio elemental flisoltenerife libreops element platforms inclusive librelabucm engineer softwareNotAsAService ptp chatty lucafail informationwantstobefree softwareGripe nativeApp MatrixEffect culturalibre jitsi flisol engineers dinosaurier wordpress SwitchToJami mongodb ux rsync libreoffice crossstitch dino plugin xwiki openoffice container discordia softwaredesign redeslibres ledger sounddesign palestine chatcontrol alternatives glimpse libregraphicsmeeting + beta borgbackup forms app freeUP1 freedombox windows edit nginx transclusion krebsrisiken proprietarysoftware freepalestin calibre misophonia fosshost postscript nota AAPIHeritageMonth freenet freebsd kc Framasoft tts E40 Flisol2021 invidious drm softwarelibero publicdomain ilovefreesoftware hydra readers StoryMapJS kubernetes openvms luca nodrm copyleft fossmendations happyauthor freedoom librespeed jami betatesting NottsTV libregraphics genossenschaft FuckOffZoom quicksy thunder whiteboard free docker softwarelibre opensourcehardware interoperability impression3d freesoftware gimp krebs backups foss matrix dinosaur mossad unfa weechat clapper designjustice thefreethoughtproject filesystems nextcloud translate wechat notmatrix gnupg lucaApp chats duplicati HappyLight opensourcesoftware permissionless compression openscad freeganizm uidesign softwaredeveloper neochat TabOrder searx ikiwiki prosody Linux FreeSoftware userresearch FlisolLibre2021 DisCOElements Audio rocketchat thanksfreesw libres webapps immers outreachy synapse API freelibre lyft freekirtaner nitter monitoring misogyny virtualbox ngi4eu discord reverseengineering whisperfish ee opensourcedesign vaporware opensource diaspora yunohost oss librelounge chickadee appstore dégooglisons littlebigdetails cabal conferencing cadmium libreboot musiquelibre mycroft devops kdeapplications owncast phabricator emacs freiesoftware FLOSSvol moss fluffychat dinoim impress writefreely videoconferencing bigbluebutton tile_map_editor email ngi esri chatapps HappyNewYear Eiskappe fossilfriday floss plugins softwaresuite frecklesallovertheshow graphic libresoftware softwareengineering mosstodon expandocat deltachat application uifail FOSS peatfree lucaapp GNOMECircle rockpro64 bittorrent palestinewillbefree penpot vlc zoom southasia tiling session diaspora0800 FriendofGNOME Senfstoffknappheit usability winamp opendesign obnam snap appim ProprietarySoftwareProblems pandoc Happy4thJuly freemumia write artificialintelligence blackcappedchickadee cryptpad software libretranslate OwnStream upstream maplibre slack Hummingbard hydrated emacslisp Element freeware DismantleFossilCompanies safenetwork asia jit SoftwareLibre zrythm gnu CTZN silicongraphics mumble grsync freecad drmfree telegram containers tails freeschool chatons blockchain windows11 irssi HabKeinWhatsapp information mcclim jitsimeet dedrm iso mutt librelingo freetibet WeAreAlmaLinux tilingwm sri design gameoftrees GnuLinuxAudio freegan freeriding freetool backup trueLinuxPhone ngio rotonde freetube jumpdrive GNU speechrecognition eurovison skydroid thunderbird sysadmin it sound alternativeto screenreader parler bison apps chat licensing fossasia inclusivedesign ethicalsoftware defectivebydesign metager digitalsustainability screenreaders sysadmins ZeroCool LINMOBapps freedombone uber obsproject librecast softwareheritage pittsburgh profanity delta Tankklappe doomemacs imageeditor ffmpeg fossandcrafts GNOME40 telesoftware love reboot opensourcegardens musique switchingsoftware OSM freesw agpl distribute magnifyingglass GNOME freeganizmniewybacza drive freesoftare AlmaLinux GreenandBlackCross strafmaatschappij freetillie distributedledger mattermost principiadiscordia blue LinuxPhones filesystem rocket ghostscript win10 Zoom tibet ComputerFolklore fossaudio elemental SocialCreditScores flisoltenerife libreops element platforms inclusive librelabucm engineer softwareNotAsAService ptp chatty lucafail informationwantstobefree softwareGripe nativeApp MatrixEffect culturalibre jitsi taintedlove flisol engineers dinosaurier wordpress SwitchToJami mongodb ux rsync libreoffice crossstitch Encrochat dino RainbOSM plugin xwiki tecc openoffice container discordia softwaredesign redeslibres ledger sounddesign palestine chatcontrol alternatives glimpse libregraphicsmeeting - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT conferences - FOSDEM2021 stackconf fossnorth debconf FOSDEM talk fossdem FreedomBoxSummit apconf2020 schmoocon realtalk penguicon2021 summit confidenceTricks agm libreplanet confluence minidebconf edw2021 maintainerssummit rc3worldleaks rightscon StopStalkerAds SeaGL penguicon emacsconf MCH2021 flossconference LGM2021 conferences LibrePlanet defcon emfcamp flossevent askpinetalk conf talks defcon201 rC3 rC3World FOSDEM21 conference mozfest flossconf apconf ccc persconferentie GeekBeaconFest rC3one smalltalk g7 C3 config penguicon2022 confy + FOSDEM2021 stackconf fossnorth debconf debconf21 FOSDEM talk fossdem FreedomBoxSummit apconf2020 schmoocon Aktionscamp realtalk persco penguicon2021 letstalkaboutyes summit confidenceTricks agm libreplanet SeaGL2021 confindustria confluence minidebconf edw2021 maintainerssummit rc3worldleaks rightscon StopStalkerAds SeaGL penguicon emacsconf MCH2021 flossconference LGM2021 conferences LibrePlanet defcon emfcamp flossevent askpinetalk bc conf talks defcon201 rC3 rC3World FOSDEM21 conference mozfest flossconf bootcamp apconf ccc persconferentie GeekBeaconFest rC3one smalltalk camp g7 C3 config penguicon2022 confy - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT food - vitamind cake veganism teamviewer FoodHardship pankow margarine zwartepiet panthera dessert foils salsa caviar utopie brot theexpanse BellaSpielt cookery pietons Ôtepoti panther food cakecutting skillet teamgodzilla spiel Vegan liquor SoilSovereignty milk bolognese recipe foodporn yeast drinking VendrediPeanutsNouka plate waffle pansexual biscuit glaze omelette veganismo filet pastry wine woke Caribbeans hamburger juice unauthorizedbread Amazfish Avocados sourdough gedankenspiel cagefree words nuts gras toast broth batter foodie breadposting spiele haggis ketchup carrots go-nuts damnfinecoffee divoc seasoning mayo MastoEats soup arpanet pan voc imateapot Anglefish potatoes mayonnaise vegan dish avocado spice keto bakery butterfly cooking teamhuman SailfishOS Trypanophobia AgentProvocatuer yogurt thecandycrystalrainbowcodex crumble PropaneSalute cider caffeine Kinipan butter mastokitchen triceratops cook pottery creepypasta wastemanagement kitchencounter mastocook cobbler steak pizza vocaloid crystal soda fedikitchen aroma oil Miroil flour foodsovereignty cream nutella pie cuisine potse meatismurder freerange tartar kropotkin tea marinade cakes mushroom thekitchen govegan entree lfi dominospizza bread salad beans fresh syrup fermentation teamsky mushrooms cookie cookiebanners wordstoliveby curd soysauce lowcarb pudding plantbased beer organicfood peterkropotkin fish panoptykon spanisch foodnotbombs foodwaste organic wholeGrain wheat pot TeamFerment timewaster Wypierdalaj sauerkraut stew weltspiegel chocolate paste soynuevo wok rainbow recipes kitchengarden expanse olive burger mrpotatohead candy lifesnacks Steam kitchen coffee foodshortage bagel batterylife OpTinfoil teams taste SpieleWinter2020 meat johannisbeeren noodle raclette caramel rice eggs grill davewiner poutine demoteam lard croissant pasta vegane strawberry foods WaterDrinkers cheese oregano drink muffin bikekitchen krop LowRefresh kyotocandy foie onepiece sauce foodanddrink soy foodpics growyourfood vore wholewheat pandemie cocoa sandwich mousse waste chili redfish + vitamind cake veganism teamviewer FoodHardship vanilla pankow margarine zwartepiet panthera dessert foils salsa caviar utopie brot theexpanse BellaSpielt cookery pietons Ôtepoti panther food cakecutting skillet teamgodzilla spiel Vegan liquor SoilSovereignty milk bolognese recipe foodporn yeast drinking VendrediPeanutsNouka plate waffle pansexual biscuit glaze omelette veganismo morel filet pastry wine woke Caribbeans hamburger juice unauthorizedbread Amazfish Avocados management sourdough gedankenspiel cagefree words MauriceSchuhmann nuts gras toast broth batter foodie breadposting spiele zerowaste haggis ketchup carrots go-nuts damnfinecoffee divoc seasoning mayo nowords MastoEats soup arpanet pan voc imateapot Anglefish potatoes mayonnaise vegan dish avocado spice keto bakery butterfly cooking teamhuman SailfishOS Trypanophobia AgentProvocatuer yogurt rok thecandycrystalrainbowcodex crumble PropaneSalute cider caffeine Kinipan butter mastokitchen triceratops cook pottery kurdish creepypasta wastemanagement kitchencounter mastocook cobbler steak pizza vocaloid crystal soda fedikitchen aroma oil Miroil flour foodsovereignty cream nutella pie cut cuisine potse meatismurder freerange tartar kropotkin tea marinade cakes mushroom thekitchen govegan entree lfi dominospizza bread salad beans mush fresh syrup fermentation teamsky mushrooms cookie cookiebanners wordstoliveby curd soysauce lowcarb pudding plantbased beer organicfood peterkropotkin fish grasslands panoptykon spanisch honeypot foodnotbombs foodwaste organic wholeGrain wheat pot TeamFerment timewaster Wypierdalaj sauerkraut stew weltspiegel chocolate paste soynuevo wok rainbow recipes kitchengarden expanse olive burger mrpotatohead candy lifesnacks Steam kitchen coffee foodshortage bagel batterylife OpTinfoil teams taste SpieleWinter2020 meat johannisbeeren noodle raclette caramel rice eggs grill davewiner poutine demoteam lard croissant pasta vegane strawberry toomuchcaffeine morelmushroom foods coffeeaddict WaterDrinkers cheese oregano drink muffin bikekitchen krop LowRefresh kyotocandy foie onepiece sauce foodanddrink soy foodpics growyourfood vore mushtodon wholewheat pandemie cocoa sandwich bigoil mousse waste chili redfish - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT farming johndeere deer - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT + + + facts + lifehacking funfact lifehack + + Tue, 13 Jul 2021 08:43:43 UT indymedia - fpga hs2 dotcons visionontv geek tredtionalmedia degeek globleIMC indymediaback openfoodnetwork pga mainstreaming indymedia networking closed stupid foo encryptionsist hs2IMC indymediaIMC network networkmonitoring roadsIMC stupidindivialisam roadstonowhere networkeffect lifecult closedweb avgeek monitor dotconsall omn tv roadstonowhereIMC kiss UKIMC fluffy 4opens openmedianetwork + fpga hs2 dotcons visionontv geek tredtionalmedia degeek globleIMC indymediaback openfoodnetwork pga mainstreaming indymedia networking closed stupid foo encryptionsist hs2IMC indymediaIMC network networkmonitoring Blackfoot roadsIMC stupidindivialisam roadstonowhere networkeffect lifecult closedweb avgeek monitor dotconsall omn tv roadstonowhereIMC kiss UKIMC fluffy 4opens openmedianetwork - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT cycling - bicycle cycle bic cycling DataRecycling bike motorbike bikeing cyclingtour thingsonbikes openbikesensor bikeways Snowbike cyclist + bicycle bicyles cycle bic cycling bicycleday DataRecycling arabic bike motorbike bikeing cyclingtour thingsonbikes openbikesensor bikeways Snowbike cyclist - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT + + + gender + black transparantie transistors transparenz broketrans internationalwomensday2021 transwomen transformativejustice womenwhocode transfobie WomenInHistory sf transmission transgender cashless RaquelvanHaver caféLatte transdayofresistance mens vieillesse womensart blacktranslivesmatter female nonbinary womensday vantascape van blacktransmagic less nb trans nonbinarycommunity transpositivity transdayofvisibility lgbtqia transphobia transmitter women lgbt bodypositive transzorg womenrock estradiol lgbtq transaid queerartist KCHomelessUnion transgenders girlboss pointlesslygendered queer transdayofvisbility genderQuiz gender genderqueerpositivity NonBinaryPositivity dagvandearbeid woman transrights transdayofrevenge + + Tue, 13 Jul 2021 08:43:43 UT phones - mobileapp fairphone3 téléphone libre nemomobile fairtec linuxfr manjaro Jingos plasmaDev rand 5g mobian LinuxPhoneApps lg pine Brandkopf alarmphone androidemulator fdroid plasmamobile shotonpinephone fairuse android smartphonepic nophone ubportsqanda linuxmobile sailfish phones fennecfdroid Mobian osmf AlpineConf smartphone plasma5 ios selinux mobileGNU PinePhoneOrderDay sms4you mob bp microphone linuxconnexion smartphones iOS14 pinemarten linuxphones openmoko mobilecoin mobilelinux freeyourandroid fair QWERTYphones sailfishos siskinim epic monal android10 osmocom Smartphones WakeMobile lineageos molly angelfish androiddev manjarolinux quasseldroid plasma phosh BriarProject Fairphone librem5 ubportsinstaller osm shotonlibrem5 pinephone Teracube PinePhone pinedio mobile pinephones sms pine64 fairphone ubuntutouch linphone Android alpinelinux osmirl ubports gnomeonmobile immobilienwirtschaft osmand vodafone gnomemobile linuxonmobile iphones iOS microg brandenburg grapheneos sail recycletechjunkuselinux phone cm mobileKüfA josm iphone linuxappsummit Xperia10mark2 newprofilepic + mobileapp cellular fairphone3 téléphone libre nemomobile fairtec linuxfr conocimientolibre manjaro Jingos plasmaDev TourBrandenburg21 rand 5g mobian LinuxPhoneApps lg pine Brandkopf alarmphone androidemulator fdroid plasmamobile shotonpinephone fairuse android smartphonepic nophone ubportsqanda linuxmobile sailfish phones fennecfdroid Mobian osmf AlpineConf smartphone plasma5 ios selinux mobileGNU PinePhoneOrderDay exxon sms4you mob bp microphone linuxconnexion smart smartphones iOS14 pinemarten linuxphones openmoko mobilecoin mobilelinux freeyourandroid fair QWERTYphones exxonmobil sailfishos siskinim epic monal android10 osmocom Smartphones WakeMobile lineageos molly angelfish androiddev Briar manjarolinux quasseldroid wirtschaft plasma mobilephones phosh BriarProject Fairphone librem5 ubportsinstaller osm shotonlibrem5 pinephone Teracube PinePhone pinedio mobile pinephones manjaroarm sms pine64 fairphone ubuntutouch linphone Android osmirl ubports gnomeonmobile immobilienwirtschaft Bramble osmand vodafone gnomemobile linuxonmobile iphones postmarketos iOS microg brandenburg librecellular grapheneos sail recycletechjunkuselinux phone cm mobileKüfA josm iphone linuxappsummit Xperia10mark2 newprofilepic - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT - linux - linuxboot compiz osdev musescore commandline opensuse share linuxisnotanos elementaryos cli buster viernesdeescritorio shell nu olinuxino aves kde FragAttacks Debian11 reprobuilds pureos kdepim thisweekinlinux slackware search bsd tap openwrt falling runbsd distros stapler tmux nixos alpine nix DebianBullseye xfce ubuntubuzz gnutools vaguejoke ack shareyourdesktop shellagm personal wireguard lightweight whonix hardenedbsd linuxaudio mate usb nushell nixpkgs wordsearch landback osi alpines computertruhe torvalds gtk linuxmint DebianAcademy debian chroot trisquel gnome distrowatch linuxposting fedoraonpinephone trackers console showyourdesktop FuckDeMonarchie researchassistants anarchie windowmanager desktop GuixSystem arch platform ubuntu personalwiki jodee snowfall gnulinux aur justlinuxthings xubuntu kdeframeworks5 stackoverflow unix fedora openbsd centos nos tuxedocomputers tracker openmandriva backwaren gentoo aurora researcher BlackLives liveusb dee personalarchive usergroup StockOS systemd linuxgaming Debian distro Racklet theartofcomputerprogramming icecat tape puppylinux destinationlinux LinuxSpotted suicide show Squarch computer gtk3 blackout deepBlah escritoriognulinux acepride qubesos i3wm clipstudiopaint dadjokes kubuntu epr JuiceFS reproducible kdecommunity haiku linuxisnotaplatform clip fall linux EMMS planetdebian minicomputer altap raspbian netbsd DanctNIX termux btrfs reproduciblebuilds gravitationalwaves joke artix gtk4 esc linuxexpress archlinuxarm bash archlinux hare ubuntucore linuxconfau researchers AuratAzadiMarch gnomebuilder GNUlinux rhel debianinstaller debianindia linuxisajoke tux suse zsh linuxconsole + activism + UniteInResistance rightwing rights protestor dutysolicitor roots WeDemandTransparency CallToAction annonce rojava PrisonLivesMatter clearchannel nog20 Lobauautobahn farright eni tyrannyofconvenience grassroot nonviolentcommunication FreeLibreOpen g20 JusticeForRapheal rig bekannt farmersprotest animalrights protests resistance cyborgrights riseup resistg7 DontShootTheMessenger demo PrisonSolidarity linnemann sflc DanniVive apt freeassange dangote reuse stopspyingonus keepiton Dannenroederforst FSFE20 fsfe killthebill edri softwarefreedom indigenousrights unautremondeestpossible AntiCopyright Rojava ilovefs stopnacjonalizmowi ann activist wec HeroesResist edrigram xr SustainableUserFreedom bannerlord undercurrents riseup4rojava righttoexist seachange directaction mannheim Doulingo politicalactivism diskriminierung wechange seattleprotests eff Gardening gamechanger change openrightsgroup protest icantbreathe channelname JeffreySDukes planning FSF userrights LaptevSea actiondirecte kroymann climatechange protestsupport channel climatchange HS2 ngo MarcWittmann StandWithTillie Danni FrightfulFive fsf fsfi StopHS2 grassroots HS2Rebellion protestcamp resist FreeJournalistAssange announcements antireport ClimateJustice duolingo RodrigoNunes FreedomCamping BLM ExtinctionRebellion shellmustfall namechange changeisinyourhands wlroots weareallassange conservancy ngos UserFreedom sp bin JefferySaunders freepalestine CopsOffCampus GreatGreenWall LiliannePloumen freeassangenow savetheplanet directactiongetsthegoods hauptmann activismandlaw climatechangeadaptation Kolektiva XR freeolabini tellthetruth announcement isolateByoblu annieleonard - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT + + + accessibility + you a11y accessibility captionyourimages hardofhearing + + Tue, 13 Jul 2021 08:43:43 UT pandemic - covid19 coronaPolicies gevaccineerd corona getvaccinated psmeandmywholefamilycaughtcovidfromwork Coronavirus CoronaWarnApp facemasks vaccines culturalrevolution pandemics vaccine vaccinesupply JournalistsSpeakUpForAssange Covid coranavirus pandemic sayhername internationalproletarianrevolution Zbalermorna covidville ZeroCovid volkstheater COVID19india contacttracing coronavaccinatie SùghAnEòrna tier4 coronapandemie covid pand volla volodine COVID19NL Moderna coronavirus masks Moderna2 COVIDrelief coronapas virus contacttracingapps moderna coronadebat vaccin COVIDー19 Lockdown rna codid19 CripCOVID19 LongCovid COVID19 vaccination YesWeWork ContactTracing vol CoronaCrisis COVID coronamaatregelen debat international internationalsolidarity coronabeleid + covid19 coronaPolicies gevaccineerd corona getvaccinated CovidImpacts psmeandmywholefamilycaughtcovidfromwork Coronavirus CoronaWarnApp facemasks vaccines wijvaccineren culturalrevolution pandemics vaccine vaccinesupply JournalistsSpeakUpForAssange Covid vaccinated coranavirus pandemic sayhername internationalproletarianrevolution Zbalermorna covidville ZeroCovid pandemia coronapps volkstheater COVID19india contacttracing coronavaccinatie SùghAnEòrna tier4 coronapandemie covid pand volla volodine COVID19NL Moderna coronavirus masks Moderna2 COVIDrelief coronapas virus contacttracingapps moderna coronadebat vaccin COVIDー19 Lockdown rna unvaccinated codid19 CripCOVID19 LongCovid COVID19 vaccination YesWeWork ContactTracing vol CoronaCrisis COVID coronamaatregelen debat international internationalsolidarity coronabeleid - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT books - readinggroup bookstore bookbinding justhollythings secondhandbooks bookclub fake earthsea review ebooks docbook book notebook public amreading publishing republicday publichealth bookworm bookwyrm 5minsketch republique bookreview reading theLibrary cda audiobooks Gempub selfpublishing sketchbook wayfarers books peerreview bookreviews failbooks sketch ebook wikibooks booktodon epub cookbook AnarchoBookClub + readinggroup bookstore publicvoit bookbinding preview justhollythings secondhandbooks bookclub fake earthsea review ebooks docbook book notebook public amreading publishing republicday publichealth bookworm bookwyrm 5minsketch republique bookreview reading sketching theLibrary audiobooks Gempub selfpublishing sketchbook wayfarers books peerreview bookreviews failbooks sketch ebook wikibooks booktodon epub cookbook bibliothèque AnarchoBookClub - Tue, 08 Jun 2021 17:56:37 UT - - - bots - mrrobot human Militanzverbot nobot botanists humanity militanzverbot Sabot44 humanrobotinteraction therobots humanetechnow verbote humankind - - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT crafts repair topic_imadethis hackerexchange exchange quilts textile upholstery hackgregator gatos gato hackspacers nrw shack 3dmodeling dust3d hackerspaces hacklab hackerexchange -]] tryhackme sanding solvespace theglassroom sundiy craft wirtschafthacken papercrafts maker knitting hack hacked Sipcraft calligraphy biohacking wip spacecrafts hacktheplanet jewelry diy textiles projects hackerweekend handicrafts Handicraft upcycling woodworking 3dcad glass origami hackerexchange +]] tryhackme sanding solvespace theglassroom sundiy craft wirtschafthacken papercrafts maker knitting hack workspace hacked Sipcraft calligraphy biohacking wip spacecrafts hacktheplanet jewelry diy textiles projects hackerweekend handicrafts Handicraft lovecraftcountry upcycling Minecraft woodworking 3dcad glass origami hackerexchange -]] makers nrwe quilting crafting hacker quilt crafts rwe weaving 3dmodel tinkering hacking woodwork ceramics embroidery shacks teardown +]] makers nrwe quilting crafting hacker quilt crafts rwe weaving 3dmodel handtools tinkering project hacking woodwork ceramics embroidery shacks teardown - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT war ru DonavynCoffey Myanmarmilitarycoup civilwar antiwar bomber coup tank handforth landmine tankies military autonomousweapons army Etankstelle weaponsofmathdestruction conflict navy warplane fort guns Myanmarcoup weapons siege hbomberguy battle WMD wmd airforce forth - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT techbros - bubbles bubble redbubble securedrop einfachredeneben coloredpencil redhat redwood hackernews weareredhat red pencil reddit redis infrared VendrediNouka redshift optreden + bubbles bubble color redbubble securedrop einfachredeneben redditodicittadinanza coloredpencil redhat redwood hackernews weareredhat redmi red pencil reddit redon redis infrared VendrediNouka redshift optreden sec - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT astronomy - telescope mercury pluto planets galaxy venus mars bloodmoon amateurastronomy uranus spacex nebula astronomy neptune space jupiter rpc blackhole asteroid BackYardAstronomy moon thehitchhikersguidetothegalaxy observatory euspace asteroidos saturn milkyway spacelarpcafe + telescope immersspace mercury pluto planets galaxy spaceport venus mars bloodmoon amateurastronomy uranus spacex nebula astronomy neptune space jupiter rpc blackhole asteroid BackYardAstronomy moon thehitchhikersguidetothegalaxy observatory euspace asteroidos saturn milkyway spacelarpcafe - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT other - ageassurance justasleepypanda extinctionrebellion fail masseffect lastpass yolo nothingnew Lastpass extinction weareclosed MasseyUniversity PassSanitaire solution messageToSelf quecksilber itscomplicated Erzvorkommen test isntreal massextinction misc frantzfanon biomassacentrale mining pinside impfpass rant Terrassen righttodisassemble rassismus koerden nahrungskette SomeUsefulAndRelvantHashtag nsfw biomass rassismustötet ass Chiacoin geo m assassinfly migrantstruggles PointlessGriping close decluttering OCUPACAOCARLOSMARIGHELLA + ageassurance bullshit klimaatbeleid justasleepypanda extinctionrebellion fail masseffect lastpass yolo nothingnew Lastpass extinction weareclosed bripe MasseyUniversity PassSanitaire solution messageToSelf TagGegenAntimuslimischenRassismus quecksilber itscomplicated Erzvorkommen test isntreal rzeźwołyńska massextinction misc manutentore frantzfanon shots assaultcube shitpost biomassacentrale mining rising devilsadvocate ACA pinside xp impfpass cda rant Terrassen righttodisassemble rassismus MassoudBarzani koerden CovPass nahrungskette SomeUsefulAndRelvantHashtag LanguageHelpForMigrants nsfw dungeonsAndDragons biomass rassismustötet oversleep ass id Chiacoin futtermittel geo oerde m assassinfly migrantstruggles sleep PointlessGriping close decluttering OCUPACAOCARLOSMARIGHELLA - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT photography - peppercarrotmini pea landscapephotography landscapeart XSystem darktable peppercarrot speakers hippeastrum landscape blackandwhite twinpeaks + peppercarrotmini NoShothgunParsers pea landscapephotography landscapeart XSystem darktable photograph peppercarrot speakers hippeastrum landscape blackandwhite hot twinpeaks - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT month - maythe4thbewithyou yt ots april PrideMonth2021 1may july VeganMay march pridemonth chapril marchofrobots2021 october november august june blackherstorymonth december september augustusinc may feburary jejune january marchofrobots blackhistorymonth march4justice month robots maythe4th blacktheirstorymonth + maythe4thbewithyou yt ots april juneteenth PrideMonth2021 1may july VeganMay march pridemonth chapril marchofrobots2021 october november august june blackherstorymonth december september augustusinc may feburary jejune PrideMonth january marchofrobots blackhistorymonth march4justice month robots maythe4th blacktheirstorymonth - Tue, 08 Jun 2021 17:56:37 UT - - - health - merchandise water medical CoronaApp autism burnout Underunderstood cannabis hand medicine anxiety freshwater run NHSDataGrab treatment EmotionalFirstAid diskriminierung safeabortion4all maryjane organisierung autistic BlockBrunsbüttel running neurodivergent health motion crunchbang actuallyautistic meds PatientSafety marijuana suicideprevention mentalhealth postmortem H5N8 healthy DarrenChandler autismmeme drugs neurodiverse asperger autismus - - Tue, 08 Jun 2021 17:56:37 UT - - - activism - rightwing rights protestor dutysolicitor roots annonce clearchannel nog20 Lobauautobahn farright eni tyrannyofconvenience grassroot nonviolentcommunication FreeLibreOpen g20 JusticeForRapheal rig bekannt farmersprotest animalrights protests resistance riseup resistg7 DontShootTheMessenger PrisonSolidarity linnemann sflc DanniVive apt freeassange reuse stopspyingonus keepiton Dannenroederforst FSFE20 fsfe killthebill softwarefreedom indigenousrights AntiCopyright ilovefs ann activist HeroesResist edrigram xr SustainableUserFreedom bannerlord undercurrents righttoexist seachange directaction mannheim Doulingo politicalactivism wechange eff gamechanger change openrightsgroup protest icantbreathe channelname JeffreySDukes FSF LaptevSea actiondirecte kroymann protestsupport channel climatchange HS2 ngo MarcWittmann StandWithTillie Danni fsf fsfi StopHS2 grassroots HS2Rebellion resist FreeJournalistAssange announcements antireport ClimateJustice duolingo BLM ExtinctionRebellion shellmustfall namechange changeisinyourhands weareallassange conservancy ngos sp JefferySaunders freepalestine CopsOffCampus GreatGreenWall LiliannePloumen freeassangenow savetheplanet directactiongetsthegoods hauptmann activismandlaw climatechangeadaptation Kolektiva XR freeolabini tellthetruth announcement isolateByoblu annieleonard - - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT news - report news krautreporter flash basic Wikileaks newsletter aljazeera nothingnews newsflash newsroom EUNews Worldnews rt bbc foxnews journalismisnotacrime News bbcbasic goodnews doubledownnews bbcnews reuters newschool theguardian badReporting newsboat journalism SkyNews lobsters + basicincome report news krautreporter flash basic Wikileaks newsletter aljazeera nothingnews newsflash contemporaneous_reports newsroom EUNews Worldnews rt bbc foxnews journalismisnotacrime News bbcbasic goodnews flashcrash doubledownnews bbcnews reuters newschool theguardian badReporting newsboat journalism SkyNews lobsters - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT + + + health + merchandise FreedomIsTheOnlyTreatment gnuhealth water 4 medical CoronaApp bundesregierung runningdownthewalls autism burnout Underunderstood cannabis hand event healthinsurance medicine anxiety freshwater inflammation run eternalpuberty NHSDataGrab treatment EmotionalFirstAid safeabortion4all maryjane organisierung autistic BlockBrunsbüttel running neurodivergent health motion crunchbang actuallyautistic meds PatientSafety marijuana suicideprevention mentalhealth postmortem H5N8 healthy DarrenChandler autismmeme einzelhandel drugs atm neurodiverse asperger cigarettes hearingimpairment selfcare autismus + + Tue, 13 Jul 2021 08:43:43 UT cats - Cat dailycatpic dxp DailyCatVid Cats katze kotorico kot qualitätskatze CatsOfMastodon Catshuis Leopard SpaceCatsFightFascism CatBellies catbellies LapCats qualitätskatzen + Cat dailycatpic dxp DailyCatVid Cats katze kotorico kot ketikoti qualitätskatze CatsOfMastodon Catshuis Leopard SpaceCatsFightFascism CatBellies catbellies LapCats qualitätskatzen katzen - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT + + + media + InfiniTime livestreaming ip digitalmedia mustwatch sustainable videobearbeitung transparency polarbears mediathek mianstreaming stream videoconferencias trad maistreaming ime sustainabilty mixxx shortfilm selfsustainable amstrad kawaiipunkstreams mainstream films streaming weAreAllCrazy video streamdeck puns maiabeyrouti videoconference mix mixed sustainability diymedia Fairtrade film streams massmedia stummfilm submedia theatlantic traditionalmedia videos Internetradio mediawatch mainstreamining newsmedia audiovideo videosynthesis filmnoir wikimedia mixedmedia railroads heat documentary streamers artstream vi folktraditions gstreamer tootstream taina ai mediawiki bear realmedia media independentmedia SiberianTimes theintercept + + Tue, 13 Jul 2021 08:43:43 UT podcasts - beautiful podcasting IntergalacticWasabiHour JenaFahrradies podcast rad radiopodcast postmarketOSpodcast tilderadio tildes podcasts tildeverse radverkehr smallisbeautiful fertilizers PineTalk radweg tilvids fahrrad tildetown qtile trillbilliespodcast + beautiful podcasting IntergalacticWasabiHour JenaFahrradies podcast rad radiopodcast postmarketOSpodcast TraditionCruelle podcasting20 tilderadio tildes podcasts tildeverse radverkehr smallisbeautiful fertilizers PineTalk radweg tilvids fahrrad tildetown qtile trillbilliespodcast - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT radio - cbradio worldradioday radiokookpunt hamr freieradios varia why shoshanazuboff winlink tootlabradio pouetradio dx macintosh amateurradio radiohost radiokapital talkradio localization nwr vantaradio ca radio healthcare listening hamradio FreeAllPoliticalPrisoners variabroadcasts card10 fastapi webradio freeradio radiobroadcasting radiosurvivor Poecileatricapillus apis radioshow local radio3 noshame osh audycja hackerpublicradio kosher radioalhara Phosh audycjaradiowa california road nowlistening radiobroadcast radiostation mastoradio broadcasting radiodread amateurr radiolibre spazradio anonradio Capitaloceno kolektywneradio io + cbradio worldradioday radiokookpunt hamr freieradios varia why radioamateur shoshanazuboff winlink tootlabradio pouetradio schenklradio dx macintosh radioactive amateurradio radiohost radiokapital talkradio localization nwr vantaradio ca radio healthcare listening hamradio FreeAllPoliticalPrisoners variabroadcasts card10 fastapi webradio freeradio radiobroadcasting radiosurvivor Poecileatricapillus apis radioshow local radio3 noshame osh audycja hackerpublicradio kosher radioalhara Phosh audycjaradiowa california road nowlistening radiobroadcast radiostation mastoradio broadcasting radiodread amateurr radiolibre spazradio anonradio Capitaloceno kolektywneradio io - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT pets - spinning catpics shepherd leiningen uninstallman ExposureNotifications ats germanshepherd catofmastodon nin TheRabbitHole deskcat verification eurocrats QuestioningTechnology cataloging cathedrals Stelleninserat acidification reEducationCamp mastodogs rats puppets catbehaviour digidog dogecoin Stallman Coolcats petrats governing dogsofmastodon gentrification evening broadcats gattini bunyPosting kitten fostercats jürgenconings cats uninStallman kittens Uninstallman pet dog scotties ageverification Pruning woningnood acat catsofmastodon leninismo meow cute mastocat lenin catstodon dogs reimagining catsofparkdale mastocats W3CSpecification mastodog notpixiethecat londoninnercitykitties cat blackcat furry petitie dogsofmaston JurgenConings training catcontent UserDomestication + buny spinning catpics shepherd leiningen uninstallman ExposureNotifications ats germanshepherd catofmastodon nin TheRabbitHole staatstrojaner deskcat verification eurocrats QuestioningTechnology toocute cataloging cathedrals petpeeve Stelleninserat acidification reEducationCamp mastodogs rats puppets catbehaviour digidog dogecoin Stallman Coolcats petrats governing dogsofmastodon gentrification evening broadcats gattini bunyPosting benjennings kitten fostercats gamification woningnet WegenErdogan jürgenconings cats uninStallman kittens Uninstallman pet dog scotties ageverification Pruning woningnood acat catontour catsofmastodon leninismo podcatcher meow cute mastocat lenin catstodon dogs reimagining catsofparkdale mastocats W3CSpecification mastodog notpixiethecat londoninnercitykitties cat blackcat furry petitie JuliaKitten dogsofmaston JurgenConings training scottie catcontent UserDomestication - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT games - appdesign gameofshrooms minecraft soloRPG nbsdgames tetris99 gamestop libregaming ageofempires BiophilicDesign videogame ksp TerraNil productdesign dungeonmaster gogodotjam AudioGame runequest miniatures dragonfall boardgames computergames creature fucknintendo fudgedice gameassets gamestonk videogames FediDesign puzzle indiegames gamedesign shadowrun spot godotengine adventuregames chess gamejam nintendoswitch mudrunner mud indiegame game 0ad dragon playlog gameart orca sdg opengameart sign asset ttrpg gamedev freegames guildwars2 creaturedesign bideogames TetrisGore gaming gamemaker gameing nintendo roleplayinggames Gamesphere devilutionx rpg gamespot tetris dosgaming DnD socialdesign cyber2077 godot tarot cyberpunk2077 gamesforcats FreeNukum spelunkspoil boardgaming supermariomaker2 neopets minetest omake guildwars dice dnd games + appdesign gameofshrooms minecraft soloRPG nbsdgames tetris99 gamestop libregaming ageofempires mondragon BiophilicDesign videogame ksp TerraNil productdesign dungeonmaster gogodotjam AudioGame runequest miniatures dragonfall boardgames computergames creature fucknintendo fudgedice angrydesigner gameassets gamestonk videogames FediDesign gameboy puzzle indiegames gamedesign shadowrun spot godotengine adventuregames chess gamejam nintendoswitch mudrunner mud indiegame game 0ad dragon playlog gameart orca sdg lovewood designfail opengameart sign asset gilgamesh ttrpg gamedev freegames guildwars2 creaturedesign bideogames adventuregame TetrisGore gaming gamemaker gameing nintendo roleplayinggames itch unvanquished gamesdonequick Gamesphere devilutionx rpg gamespot tetris dosgaming supertuxkart freegaming DnD socialdesign cyber2077 godot gamestudies tarot cyberpunk2077 gamesforcats FreeNukum spelunkspoil boardgaming supermariomaker2 neopets minetest omake guildwars dice dnd games - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT years newyearsresolutions resolutions Year2020 year 1yrago newyear happynewyear 5yrsago yearoftheox newyearseve - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT + + + philosophy + postmeritocracy post minimalism maximalist Allposts maximalism digitalminimalism postprocess philosophy erp stoic spiderposting postfordismo postmodernism minimalist + + Tue, 13 Jul 2021 08:43:43 UT transport - deutschland luggage publictransport busses transportation train transport deutsch deutscheumwelthilfe airway journey motorway deutschebahn travel ev prorail airport rail + deutschland luggage Gütertransporte publictransport busses transportation train transport deutsch deutscheumwelthilfe airway journey motorway hilfe deutschebahn travel ev prorail airport rail - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT + + + ethics + licenses digitalethics ethicaltech ethics ethicallicense ethicswashing license ethical ethicsintech + + Tue, 13 Jul 2021 08:43:43 UT commons - ed opennmsgroup OpenAccessButton niemandistvergessen open linkedopenactors openaccess openocd openengiadina opennms ess opensocial commonscloud activisim openlibrary opensourcing innovation openpublishing InstantMessenger session LessIsMore openworlds extraction openwashing publicinterest besserorganisieren openinnovation opennmt openbadges act ManufacturaIndependente keinvergessen openrepos2021 Bessa + ed mentalillness opennmsgroup OpenAccessButton niemandistvergessen distraction open linkedopenactors openaccess reopening openocd openengiadina opennms ess badges opensocial commonscloud activisim openlibrary characters opensourcing innovation openpublishing InstantMessenger LessIsMore openrefine openworlds extraction openwashing publicinterest besserorganisieren exittocommunity openinnovation opennmt openbadges act accessable ManufacturaIndependente openspades Accessibility keinvergessen GetSession openrepos2021 openftw Bessa - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT seasons - mailspring spring lupin thespinoff Dadvice autumn abolishice namedropping office hooping sipping es winter ice luejenspringer hpintegrity pingpong santa summer iced summerschool onlyoffice pinball icedipping solstice unicef FreedomCamping wintersolstice FederalOffice summerRolls pin mice + mailspring spring lupin thespinoff Dadvice autumn abolishice desummersummit licenziamenti namedropping office hooping sipping es fuckice winter EthicalLicenses ice luejenspringer hpintegrity pingpong santa summer iced LibreOffice summerschool onlyoffice pinball icedipping solstice unicef wintersolstice FederalOffice summerRolls pin mice - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT questions - checking askmastodon flockingbird foss biking questions king lockpicking askfedi askafriend flask GlobalBanOnFracking TraditionalWoodworking question ska askmasto breaking maskengate askfediverse fucking totallyaskingforafriend ask askfosstodon + checking kayaking askmastodon flockingbird biking questions king euskadi asking lockpicking factchecking askfedi basketball askafriend flask GlobalBanOnFracking TraditionalWoodworking question ska askmasto breaking scrap_booking maskengate criticalthinking askfediverse fucking totallyaskingforafriend ask daretoask askfosstodon - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT fiction - ABoringDystopia interactivefiction cyberpunk thehobbit fiction nonfiction DystopianCyberpunkFuture flashfiction cyberpunk2020 genrefiction + ABoringDystopia interactivefiction cyberpunk VersGNRWstoppen thehobbit fiction microfiction stopCGL nonfiction DystopianCyberpunkFuture stoptmx top flashfiction cyberpunk2020 genrefiction - Tue, 08 Jun 2021 17:56:37 UT - - - gender - transparantie transistors transparenz broketrans internationalwomensday2021 transwomen transformativejustice womenwhocode WomenInHistory transmission transgender RaquelvanHaver caféLatte transdayofresistance mens vieillesse womensart blacktranslivesmatter female nonbinary womensday vantascape van blacktransmagic less nb trans nonbinarycommunity transpositivity transdayofvisibility lgbtqia transphobia transmitter women lgbt bodypositive womenrock estradiol lgbtq queerartist KCHomelessUnion transgenders girlboss pointlesslygendered queer transdayofvisbility genderQuiz gender genderqueerpositivity NonBinaryPositivity dagvandearbeid woman transrights transdayofrevenge - - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT audio - feed audiophile liveaudio audioproduction feeds pulseaudio audi feedbackd audioprogramming audioengineering audiogames audiofeedback audio auditoriasocial + feed audiophile liveaudio audioproduction feeds pulseaudio audi webaudio feedbackd audioprogramming audioengineering audience audiogames audiofeedback audio auditoriasocial - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT garbage Anonymous cumbria documentation no QAnonAnonymous docu cardano cum u ChanCulture - Tue, 08 Jun 2021 17:56:37 UT - - - media - livestreaming ip digitalmedia mustwatch sustainable videobearbeitung transparency mediathek mianstreaming stream videoconferencias trad maistreaming mixxx shortfilm selfsustainable amstrad kawaiipunkstreams mainstream films streaming weAreAllCrazy video streamdeck puns maiabeyrouti mix mixed sustainability diymedia Fairtrade film stummfilm submedia theatlantic traditionalmedia videos Internetradio mediawatch mainstreamining newsmedia audiovideo videosynthesis filmnoir wikimedia mixedmedia railroads documentary streamers artstream gstreamer tootstream taina ai mediawiki realmedia media independentmedia theintercept - - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT birds - RainbowBeeEater birb pigeon cawbird pigeonlover bird birdwatch birding birbposting birdwatching + RainbowBeeEater aves birb pigeon cawbird pigeonlover bird birdwatch birdsite birding birbposting birdwatching - Tue, 08 Jun 2021 17:56:37 UT - - - ethics - digitalethics ethicaltech ethics ethicallicense ethicswashing license ethical - - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT disability ableism disabled ableismus - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT travel tax travellers taxi airtravel - Tue, 08 Jun 2021 17:56:37 UT - - - philosophy - post minimalism maximalist Allposts maximalism digitalminimalism postprocess philosophy stoic postmodernism minimalist - - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT religion - atheist ama neopagan pagan catholic paganism genesis jesuit SiddarthaGautama oorlogspropaganda + atheist buddhist ama neopagan pagan catholic paganism genesis jesuit SiddarthaGautama oorlogspropaganda - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT culture etiquette - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT funding - donate disabilitycrowdfund disabledcrowdfund erschöpfung now oled alledoerferbleiben LeylaKhaled ethicalfunding mastercard netzfundstück fundraiser BreakWalledGardens ki membership nzSuperFund ngizero fun oer zeroknowledge edge led zerohedge DefundLine3 vkickstarter fungiverse alledörferbleiben fungus SmallPiecesLooselyCoupled fungi EntangledLife opencollective patreon + donate disabilitycrowdfund disabledcrowdfund erschöpfung now oled alledoerferbleiben LeylaKhaled ethicalfunding mastercard netzfundstück didyouknow fundraiser BreakWalledGardens ki membership fundamentals nzSuperFund ngizero fun oer zeroknowledge edge led zerohedge DefundLine3 vkickstarter fungiverse alledörferbleiben fungus SmallPiecesLooselyCoupled fungi EntangledLife desperate opencollective patreon FundOSS - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT identity genx boomer genz zoomer - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT + + + ai + macos machinelearning openai EthicsInAI + + Tue, 13 Jul 2021 08:43:43 UT licenses - commongoods creativecommonsrocks agplv3 tootle CommunitySource copyright commonspoly creative netcommons common gpl plugplugplug copyrightlaw commonplacebook EthicalSource questioncopyright tragedyofthecommons cc0 creativecommons commongood cc creativetoot + commongoods creativecommonsrocks voice agplv3 tootle commonvoice CommunitySource place copyright commonspoly creative netcommons common gpl plugplugplug copyrightlaw commonplacebook EthicalSource questioncopyright tragedyofthecommons cc0 creativecommons commongood cc creativetoot - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT political - copservation housekeeping ram progress slaughterhouse rog cops houseless brogue joerogan theteahouse bibliogram house straming theGreenhouse teahouse progressivehouse techhouse clubhouse yayagram PDXdefendthehouseless pdxhouseless progress_note deephouse roguelike linguisticProgramming + copservation housekeeping gan ram progress slaughterhouse rog cops houseless brogue joerogan theteahouse bibliogram house hydrogen straming theGreenhouse teahouse progressivehouse techhouse clubhouse yayagram PDXdefendthehouseless pdxhouseless EnergyFlowDiagrams pr progress_note deephouse roguelike linguisticProgramming gancio - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT organisations foundation scpfoundation scp - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT fashion brasil fashionistas fashionesta bras fashionista fashion punkwear earrings socks patches feditats zebras - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT welfare CreditReporting universalcredit welfare socialwelfare credit - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT + + + scotland + lan atlanta northumberland glasgow highlands edinburgh loch + + Tue, 13 Jul 2021 08:43:43 UT antisocial - stalking + stalking cyberstalking - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT comedy - laugh farce humour swisshumor satire irony standup funny humor pun + laugh farce humour swisshumor satire irony standup funny humor punishment pun - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT + + + obituaries + ueberwachung siberia tripadvisor rip gretathunberg JavaScriptSucks ratgeber obit ecmascript keyenberg raspberripi CyberSecurity döppersberg cybergrooming Gudensberg überblick obituaries ber civilliberties rubber + + Tue, 13 Jul 2021 08:43:43 UT introductions reintroductions newhere firsttoot recommends stt Introduction Introductions reintroduction introductons introduction intro introductions - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT - facts - funfact didyouknow lifehack + geography + theCartographer - Tue, 08 Jun 2021 17:56:37 UT - - - ai - machinelearning openai EthicsInAI - - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT education - SchoolForAfrica PhDstudent mitbewohnerin techlearningcollective oh languages teaching tutorials education academics mit academia teach Lebensmittelfarbstoff learning languagelearning tutorial ec language cad + SchoolForAfrica PhDstudent mitbewohnerin techlearningcollective oh languages student teaching tutorials education academics mit academia teach Lebensmittelfarbstoff elearning learning languagelearning tutorial mitkatzundkegel ec language deeplearning collect cad mitteleuropa - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT scifi - startrekdiscovery startrek bitwarden discover SoftwareJob LegDichNieMitSchwarzenKatzenAn starwars ds9 discovery babylon NGIForward war babylon5 + startrekdiscovery startrek discover SoftwareJob LegDichNieMitSchwarzenKatzenAn starwars ds9 discovery SchwarzeFrauen babylon NGIForward war babylon5 - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT microcontroller - e microcontroller trolls Chatkontrolle troll arduinoide arduino + e kontrollieren microcontroller trolls Chatkontrolle troll arduinoide arduino - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT design userfriendly friendly rf - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT help - mastohelp helpwanted helpful helpMeOutHere help + mastohelp helpwanted lpf helpful helpMeOutHere help - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT - obituaries - tripadvisor rip bripe JavaScriptSucks obit ecmascript keyenberg raspberripi Gudensberg überblick obituaries ber rubber + automotive + volkswagen - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT fantasy discworld godzilla - Tue, 08 Jun 2021 17:56:37 UT - - - accessibility - a11y accessibility - - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT entertainment CircusInPlace legallyblonde watching Thundercat makingof entertainment me un nowwatching mandalorian themandalorian nt - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT election Rainbowvote voted vote - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT moderation fedblock - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT languages lojban gaelic - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT environment s crisisclimatica clim climatechaos climateadaptation - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT organization conceptmap mindmapping mapping mindmap notetoself pi - Tue, 08 Jun 2021 17:56:37 UT - - - microcontrollers - esp32c3 esp8266 esp32 - - Tue, 08 Jun 2021 17:56:37 UT - - - scotland - glasgow highlands edinburgh loch - - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT technology - tools LowtechSolutions literatools + AvatarResearch tools LowtechSolutions literatools - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT + + + microcontrollers + esp32c3 microcontrollers esp8266 esp32 + + Tue, 13 Jul 2021 08:43:43 UT agriculture farmers - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT + + + organisation + InstitutionalMemory + + Tue, 13 Jul 2021 08:43:43 UT skills gardening baking - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT france Macronavirus - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT memes tired - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT sailing theBoatyard - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT parenting dadposting - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT jewelry bracelet - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT architecture concrete - Tue, 08 Jun 2021 17:56:37 UT + Tue, 13 Jul 2021 08:43:43 UT From 5e2b02ad8166e57c9004abe16a986d64f8242876 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Tue, 13 Jul 2021 15:40:49 +0100 Subject: [PATCH 1414/1416] File open attribute style --- auth.py | 6 +++--- blocking.py | 2 +- blog.py | 8 ++++---- city.py | 4 ++-- content.py | 4 ++-- follow.py | 14 +++++++------- happening.py | 4 ++-- migrate.py | 6 +++--- newsdaemon.py | 4 ++-- person.py | 12 ++++++------ posts.py | 20 ++++++++++---------- question.py | 4 ++-- roles.py | 6 +++--- tests.py | 8 ++++---- threads.py | 2 +- utils.py | 18 +++++++++--------- webapp_column_left.py | 2 +- webapp_column_right.py | 2 +- webapp_create_post.py | 2 +- webapp_moderation.py | 6 +++--- webapp_profile.py | 10 +++++----- webapp_search.py | 4 ++-- 22 files changed, 74 insertions(+), 74 deletions(-) diff --git a/auth.py b/auth.py index 42cf25fa2..02db756c6 100644 --- a/auth.py +++ b/auth.py @@ -132,7 +132,7 @@ def authorizeBasic(baseDir: str, path: str, authHeader: str, print('DEBUG: passwords file missing') return False providedPassword = plain.split(':')[1] - passfile = open(passwordFile, "r") + passfile = open(passwordFile, 'r') for line in passfile: if line.startswith(nickname + ':'): storedPassword = \ @@ -162,7 +162,7 @@ def storeBasicCredentials(baseDir: str, nickname: str, password: str) -> bool: storeStr = nickname + ':' + _hashPassword(password) if os.path.isfile(passwordFile): if nickname + ':' in open(passwordFile).read(): - with open(passwordFile, "r") as fin: + with open(passwordFile, 'r') as fin: with open(passwordFile + '.new', 'w+') as fout: for line in fin: if not line.startswith(nickname + ':'): @@ -186,7 +186,7 @@ def removePassword(baseDir: str, nickname: str) -> None: """ passwordFile = baseDir + '/accounts/passwords' if os.path.isfile(passwordFile): - with open(passwordFile, "r") as fin: + with open(passwordFile, 'r') as fin: with open(passwordFile + '.new', 'w+') as fout: for line in fin: if not line.startswith(nickname + ':'): diff --git a/blocking.py b/blocking.py index 128209aaa..c26b07728 100644 --- a/blocking.py +++ b/blocking.py @@ -720,7 +720,7 @@ def setBrochMode(baseDir: str, domainFull: str, enabled: bool) -> None: followingFilename = accountDir + '/' + followFileType if not os.path.isfile(followingFilename): continue - with open(followingFilename, "r") as f: + with open(followingFilename, 'r') as f: followList = f.readlines() for handle in followList: if '@' not in handle: diff --git a/blog.py b/blog.py index ef8aed4c5..45c71dd79 100644 --- a/blog.py +++ b/blog.py @@ -65,7 +65,7 @@ def _noOfBlogReplies(baseDir: str, httpPrefix: str, translate: {}, removals = [] replies = 0 lines = [] - with open(postFilename, "r") as f: + with open(postFilename, 'r') as f: lines = f.readlines() for replyPostId in lines: replyPostId = replyPostId.replace('\n', '').replace('\r', '') @@ -124,11 +124,11 @@ def _getBlogReplies(baseDir: str, httpPrefix: str, translate: {}, '/postcache/' + \ postId.replace('/', '#') + '.html' if os.path.isfile(postFilename): - with open(postFilename, "r") as postFile: + with open(postFilename, 'r') as postFile: return postFile.read() + '\n' return '' - with open(postFilename, "r") as f: + with open(postFilename, 'r') as f: lines = f.readlines() repliesStr = '' for replyPostId in lines: @@ -141,7 +141,7 @@ def _getBlogReplies(baseDir: str, httpPrefix: str, translate: {}, replyPostId.replace('/', '#') + '.html' if not os.path.isfile(postFilename): continue - with open(postFilename, "r") as postFile: + with open(postFilename, 'r') as postFile: repliesStr += postFile.read() + '\n' rply = _getBlogReplies(baseDir, httpPrefix, translate, nickname, domain, domainFull, diff --git a/city.py b/city.py index 8a31a7801..4fa0049e4 100644 --- a/city.py +++ b/city.py @@ -195,7 +195,7 @@ def spoofGeolocation(baseDir: str, default_latdirection, default_longdirection, "", "", 0) cities = [] - with open(locationsFilename, "r") as f: + with open(locationsFilename, 'r') as f: cities = f.readlines() nogo = [] @@ -203,7 +203,7 @@ def spoofGeolocation(baseDir: str, nogo = nogoList else: if os.path.isfile(nogoFilename): - with open(nogoFilename, "r") as f: + with open(nogoFilename, 'r') as f: nogoList = f.readlines() for line in nogoList: if line.startswith(city + ':'): diff --git a/content.py b/content.py index 253740358..ff384c7f8 100644 --- a/content.py +++ b/content.py @@ -709,7 +709,7 @@ def _loadAutoTags(baseDir: str, nickname: str, domain: str) -> []: nickname + '@' + domain + '/autotags.txt' if not os.path.isfile(filename): return [] - with open(filename, "r") as f: + with open(filename, 'r') as f: return f.readlines() return [] @@ -784,7 +784,7 @@ def addHtmlTags(baseDir: str, httpPrefix: str, petnames = None if '@' in words: if os.path.isfile(followingFilename): - with open(followingFilename, "r") as f: + with open(followingFilename, 'r') as f: following = f.readlines() for handle in following: pet = getPetName(baseDir, nickname, domain, handle) diff --git a/follow.py b/follow.py index 76129fe55..9389a55e1 100644 --- a/follow.py +++ b/follow.py @@ -257,7 +257,7 @@ def unfollowAccount(baseDir: str, nickname: str, domain: str, print('DEBUG: handle to unfollow ' + handleToUnfollow + ' is not in ' + filename) return - with open(filename, "r") as f: + with open(filename, 'r') as f: lines = f.readlines() with open(filename, 'w+') as f: for line in lines: @@ -271,10 +271,10 @@ def unfollowAccount(baseDir: str, nickname: str, domain: str, if os.path.isfile(unfollowedFilename): if handleToUnfollowLower not in \ open(unfollowedFilename).read().lower(): - with open(unfollowedFilename, "a+") as f: + with open(unfollowedFilename, 'a+') as f: f.write(handleToUnfollow + '\n') else: - with open(unfollowedFilename, "w+") as f: + with open(unfollowedFilename, 'w+') as f: f.write(handleToUnfollow + '\n') return True @@ -324,7 +324,7 @@ def _getNoOfFollows(baseDir: str, nickname: str, domain: str, if not os.path.isfile(filename): return 0 ctr = 0 - with open(filename, "r") as f: + with open(filename, 'r') as f: lines = f.readlines() for line in lines: if '#' in line: @@ -435,7 +435,7 @@ def getFollowingFeed(baseDir: str, domain: str, port: int, path: str, currPage = 1 pageCtr = 0 totalCtr = 0 - with open(filename, "r") as f: + with open(filename, 'r') as f: lines = f.readlines() for line in lines: if '#' not in line: @@ -516,7 +516,7 @@ def _noOfFollowRequests(baseDir: str, if not os.path.isfile(approveFollowsFilename): return 0 ctr = 0 - with open(approveFollowsFilename, "r") as f: + with open(approveFollowsFilename, 'r') as f: lines = f.readlines() if followType == "onion": for fileLine in lines: @@ -600,7 +600,7 @@ def _storeFollowRequest(baseDir: str, print('DEBUG: ' + approveHandleStored + ' is already awaiting approval') else: - with open(approveFollowsFilename, "w+") as fp: + with open(approveFollowsFilename, 'w+') as fp: fp.write(approveHandleStored + '\n') # store the follow request in its own directory diff --git a/happening.py b/happening.py index 2a6b2e842..25ff7ff67 100644 --- a/happening.py +++ b/happening.py @@ -441,11 +441,11 @@ def removeCalendarEvent(baseDir: str, nickname: str, domain: str, if messageId not in open(calendarFilename).read(): return lines = None - with open(calendarFilename, "r") as f: + with open(calendarFilename, 'r') as f: lines = f.readlines() if not lines: return - with open(calendarFilename, "w+") as f: + with open(calendarFilename, 'w+') as f: for line in lines: if messageId not in line: f.write(line) diff --git a/migrate.py b/migrate.py index bae02eb61..94fafe932 100644 --- a/migrate.py +++ b/migrate.py @@ -29,7 +29,7 @@ def _moveFollowingHandlesForAccount(baseDir: str, nickname: str, domain: str, baseDir + '/accounts/' + nickname + '@' + domain + '/following.txt' if not os.path.isfile(followingFilename): return ctr - with open(followingFilename, "r") as f: + with open(followingFilename, 'r') as f: followingHandles = f.readlines() for followHandle in followingHandles: followHandle = followHandle.strip("\n").strip("\r") @@ -114,7 +114,7 @@ def _updateMovedHandle(baseDir: str, nickname: str, domain: str, followingFilename = \ baseDir + '/accounts/' + nickname + '@' + domain + '/following.txt' if os.path.isfile(followingFilename): - with open(followingFilename, "r") as f: + with open(followingFilename, 'r') as f: followingHandles = f.readlines() movedToHandle = movedToNickname + '@' + movedToDomainFull @@ -152,7 +152,7 @@ def _updateMovedHandle(baseDir: str, nickname: str, domain: str, followersFilename = \ baseDir + '/accounts/' + nickname + '@' + domain + '/followers.txt' if os.path.isfile(followersFilename): - with open(followersFilename, "r") as f: + with open(followersFilename, 'r') as f: followerHandles = f.readlines() handleLower = handle.lower() diff --git a/newsdaemon.py b/newsdaemon.py index ffb5a5abf..71913bb9a 100644 --- a/newsdaemon.py +++ b/newsdaemon.py @@ -374,7 +374,7 @@ def _newswireHashtagProcessing(session, baseDir: str, postJsonObject: {}, if not os.path.isfile(rulesFilename): return True rules = [] - with open(rulesFilename, "r") as f: + with open(rulesFilename, 'r') as f: rules = f.readlines() domainFull = getFullDomain(domain, port) @@ -471,7 +471,7 @@ def _createNewsMirror(baseDir: str, domain: str, for removePostId in removals: indexContent = \ indexContent.replace(removePostId + '\n', '') - with open(mirrorIndexFilename, "w+") as indexFile: + with open(mirrorIndexFilename, 'w+') as indexFile: indexFile.write(indexContent) mirrorArticleDir = mirrorDir + '/' + postIdNumber diff --git a/person.py b/person.py index 1f9d3cd12..98f16d737 100644 --- a/person.py +++ b/person.py @@ -872,7 +872,7 @@ def reenableAccount(baseDir: str, nickname: str) -> None: suspendedFilename = baseDir + '/accounts/suspended.txt' if os.path.isfile(suspendedFilename): lines = [] - with open(suspendedFilename, "r") as f: + with open(suspendedFilename, 'r') as f: lines = f.readlines() with open(suspendedFilename, 'w+') as suspendedFile: for suspended in lines: @@ -893,7 +893,7 @@ def suspendAccount(baseDir: str, nickname: str, domain: str) -> None: # Don't suspend moderators moderatorsFile = baseDir + '/accounts/moderators.txt' if os.path.isfile(moderatorsFile): - with open(moderatorsFile, "r") as f: + with open(moderatorsFile, 'r') as f: lines = f.readlines() for moderator in lines: if moderator.strip('\n').strip('\r') == nickname: @@ -910,7 +910,7 @@ def suspendAccount(baseDir: str, nickname: str, domain: str) -> None: suspendedFilename = baseDir + '/accounts/suspended.txt' if os.path.isfile(suspendedFilename): - with open(suspendedFilename, "r") as f: + with open(suspendedFilename, 'r') as f: lines = f.readlines() for suspended in lines: if suspended.strip('\n').strip('\r') == nickname: @@ -941,7 +941,7 @@ def canRemovePost(baseDir: str, nickname: str, # is the post by a moderator? moderatorsFile = baseDir + '/accounts/moderators.txt' if os.path.isfile(moderatorsFile): - with open(moderatorsFile, "r") as f: + with open(moderatorsFile, 'r') as f: lines = f.readlines() for moderator in lines: if domainFull + '/users/' + moderator.strip('\n') + '/' in postId: @@ -972,7 +972,7 @@ def _removeTagsForNickname(baseDir: str, nickname: str, if matchStr not in open(tagFilename).read(): continue lines = [] - with open(tagFilename, "r") as f: + with open(tagFilename, 'r') as f: lines = f.readlines() with open(tagFilename, 'w+') as tagFile: for tagline in lines: @@ -994,7 +994,7 @@ def removeAccount(baseDir: str, nickname: str, # Don't remove moderators moderatorsFile = baseDir + '/accounts/moderators.txt' if os.path.isfile(moderatorsFile): - with open(moderatorsFile, "r") as f: + with open(moderatorsFile, 'r') as f: lines = f.readlines() for moderator in lines: if moderator.strip('\n') == nickname: diff --git a/posts.py b/posts.py index 07cef6cab..44cc5a662 100644 --- a/posts.py +++ b/posts.py @@ -89,7 +89,7 @@ def isModerator(baseDir: str, nickname: str) -> bool: return True return False - with open(moderatorsFile, "r") as f: + with open(moderatorsFile, 'r') as f: lines = f.readlines() if len(lines) == 0: adminName = getConfigParam(baseDir, 'admin') @@ -113,7 +113,7 @@ def noOfFollowersOnDomain(baseDir: str, handle: str, return 0 ctr = 0 - with open(filename, "r") as followersFilename: + with open(filename, 'r') as followersFilename: for followerHandle in followersFilename: if '@' in followerHandle: followerDomain = followerHandle.split('@')[1] @@ -135,7 +135,7 @@ def _getPersonKey(nickname: str, domain: str, baseDir: str, print('DEBUG: private key file not found: ' + keyFilename) return '' keyPem = '' - with open(keyFilename, "r") as pemFile: + with open(keyFilename, 'r') as pemFile: keyPem = pemFile.read() if len(keyPem) < 20: if debug: @@ -779,7 +779,7 @@ def _loadAutoCW(baseDir: str, nickname: str, domain: str) -> []: nickname + '@' + domain + '/autocw.txt' if not os.path.isfile(filename): return [] - with open(filename, "r") as f: + with open(filename, 'r') as f: return f.readlines() return [] @@ -1350,7 +1350,7 @@ def getPinnedPostAsJson(baseDir: str, httpPrefix: str, actor = httpPrefix + '://' + domainFull + '/users/' + nickname if os.path.isfile(pinnedFilename): pinnedContent = None - with open(pinnedFilename, "r") as pinFile: + with open(pinnedFilename, 'r') as pinFile: pinnedContent = pinFile.read() if pinnedContent: pinnedPostJson = { @@ -1469,7 +1469,7 @@ def _appendCitationsToBlogPost(baseDir: str, if not os.path.isfile(citationsFilename): return citationsSeparator = '#####' - with open(citationsFilename, "r") as f: + with open(citationsFilename, 'r') as f: citations = f.readlines() for line in citations: if citationsSeparator not in line: @@ -1753,7 +1753,7 @@ def createReportPost(baseDir: str, moderatorsList = [] moderatorsFile = baseDir + '/accounts/moderators.txt' if os.path.isfile(moderatorsFile): - with open(moderatorsFile, "r") as fileHandler: + with open(moderatorsFile, 'r') as fileHandler: for line in fileHandler: line = line.strip('\n').strip('\r') if line.startswith('#'): @@ -1865,7 +1865,7 @@ def threadSendPost(session, postJsonStr: str, federationList: [], if debug: # save the log file postLogFilename = baseDir + '/post.log' - with open(postLogFilename, "a+") as logFile: + with open(postLogFilename, 'a+') as logFile: logFile.write(logStr + '\n') if postResult: @@ -2138,7 +2138,7 @@ def groupFollowersByDomain(baseDir: str, nickname: str, domain: str) -> {}: if not os.path.isfile(followersFilename): return None grouped = {} - with open(followersFilename, "r") as f: + with open(followersFilename, 'r') as f: for followerHandle in f: if '@' not in followerHandle: continue @@ -2889,7 +2889,7 @@ def createModeration(baseDir: str, nickname: str, domain: str, port: int, if isModerator(baseDir, nickname): moderationIndexFile = baseDir + '/accounts/moderation.txt' if os.path.isfile(moderationIndexFile): - with open(moderationIndexFile, "r") as f: + with open(moderationIndexFile, 'r') as f: lines = f.readlines() boxHeader['totalItems'] = len(lines) if headerOnly: diff --git a/question.py b/question.py index 60deecdc4..9157aeea6 100644 --- a/question.py +++ b/question.py @@ -77,7 +77,7 @@ def questionUpdateVotes(baseDir: str, nickname: str, domain: str, foundAnswer + '\n') else: # change an entry in the voters file - with open(votersFilename, "r") as votersFile: + with open(votersFilename, 'r') as votersFile: lines = votersFile.readlines() newlines = [] saveVotersFile = False @@ -104,7 +104,7 @@ def questionUpdateVotes(baseDir: str, nickname: str, domain: str, if not possibleAnswer.get('name'): continue totalItems = 0 - with open(votersFilename, "r") as votersFile: + with open(votersFilename, 'r') as votersFile: lines = votersFile.readlines() for voteLine in lines: if voteLine.endswith(votersFileSeparator + diff --git a/roles.py b/roles.py index 7a9a2a569..ec0286f1d 100644 --- a/roles.py +++ b/roles.py @@ -81,7 +81,7 @@ def _addRole(baseDir: str, nickname: str, domain: str, roleFile = baseDir + '/accounts/' + roleFilename if os.path.isfile(roleFile): # is this nickname already in the file? - with open(roleFile, "r") as f: + with open(roleFile, 'r') as f: lines = f.readlines() for roleNickname in lines: roleNickname = roleNickname.strip('\n').strip('\r') @@ -97,7 +97,7 @@ def _addRole(baseDir: str, nickname: str, domain: str, roleNickname + '@' + domain): f.write(roleNickname + '\n') else: - with open(roleFile, "w+") as f: + with open(roleFile, 'w+') as f: if os.path.isdir(baseDir + '/accounts/' + nickname + '@' + domain): f.write(nickname + '\n') @@ -110,7 +110,7 @@ def _removeRole(baseDir: str, nickname: str, roleFilename: str) -> None: roleFile = baseDir + '/accounts/' + roleFilename if not os.path.isfile(roleFile): return - with open(roleFile, "r") as f: + with open(roleFile, 'r') as f: lines = f.readlines() with open(roleFile, 'w+') as f: for roleNickname in lines: diff --git a/tests.py b/tests.py index ba6e5bfb1..c496b4a81 100644 --- a/tests.py +++ b/tests.py @@ -1406,7 +1406,7 @@ def _testFollows(): federationList, False) f = open(baseDir + '/accounts/' + nickname + '@' + domain + - '/following.txt', "r") + '/following.txt', 'r') domainFound = False for followingDomain in f: testDomain = followingDomain.split('@')[1] @@ -1441,7 +1441,7 @@ def _testFollows(): federationList, False) f = open(baseDir + '/accounts/' + nickname + '@' + domain + - '/followers.txt', "r") + '/followers.txt', 'r') for followerDomain in f: testDomain = followerDomain.split('@')[1] testDomain = testDomain.replace('\n', '').replace('\r', '') @@ -3083,10 +3083,10 @@ def _testFunctions(): 'functions': [] } sourceStr = '' - with open(sourceFile, "r") as f: + with open(sourceFile, 'r') as f: sourceStr = f.read() modules[modName]['source'] = sourceStr - with open(sourceFile, "r") as f: + with open(sourceFile, 'r') as f: lines = f.readlines() modules[modName]['lines'] = lines lineCount = 0 diff --git a/threads.py b/threads.py index 0c734c485..fa9ab9acd 100644 --- a/threads.py +++ b/threads.py @@ -141,7 +141,7 @@ def removeDormantThreads(baseDir: str, threadsList: [], debug: bool, if debug: sendLogFilename = baseDir + '/send.csv' try: - with open(sendLogFilename, "a+") as logFile: + with open(sendLogFilename, 'a+') as logFile: logFile.write(currTime.strftime("%Y-%m-%dT%H:%M:%SZ") + ',' + str(noOfActiveThreads) + ',' + str(len(threadsList)) + '\n') diff --git a/utils.py b/utils.py index a20fcd180..434b07132 100644 --- a/utils.py +++ b/utils.py @@ -189,7 +189,7 @@ def isEditor(baseDir: str, nickname: str) -> bool: return True return False - with open(editorsFile, "r") as f: + with open(editorsFile, 'r') as f: lines = f.readlines() if len(lines) == 0: adminName = getConfigParam(baseDir, 'admin') @@ -217,7 +217,7 @@ def isArtist(baseDir: str, nickname: str) -> bool: return True return False - with open(artistsFile, "r") as f: + with open(artistsFile, 'r') as f: lines = f.readlines() if len(lines) == 0: adminName = getConfigParam(baseDir, 'admin') @@ -427,7 +427,7 @@ def isSuspended(baseDir: str, nickname: str) -> bool: suspendedFilename = baseDir + '/accounts/suspended.txt' if os.path.isfile(suspendedFilename): - with open(suspendedFilename, "r") as f: + with open(suspendedFilename, 'r') as f: lines = f.readlines() for suspended in lines: if suspended.strip('\n').strip('\r') == nickname: @@ -446,7 +446,7 @@ def getFollowersList(baseDir: str, if not os.path.isfile(filename): return [] - with open(filename, "r") as f: + with open(filename, 'r') as f: lines = f.readlines() for i in range(len(lines)): lines[i] = lines[i].strip() @@ -1012,7 +1012,7 @@ def followPerson(baseDir: str, nickname: str, domain: str, if handleToFollow in open(unfollowedFilename).read(): # remove them from the unfollowed file newLines = '' - with open(unfollowedFilename, "r") as f: + with open(unfollowedFilename, 'r') as f: lines = f.readlines() for line in lines: if handleToFollow not in line: @@ -1229,9 +1229,9 @@ def removeModerationPostFromIndex(baseDir: str, postUrl: str, return postId = removeIdEnding(postUrl) if postId in open(moderationIndexFile).read(): - with open(moderationIndexFile, "r") as f: + with open(moderationIndexFile, 'r') as f: lines = f.readlines() - with open(moderationIndexFile, "w+") as f: + with open(moderationIndexFile, 'w+') as f: for line in lines: if line.strip("\n").strip("\r") != postId: f.write(line) @@ -1371,7 +1371,7 @@ def _deleteHashtagsOnPost(baseDir: str, postJsonObject: {}) -> None: continue # remove postId from the tag index file lines = None - with open(tagIndexFilename, "r") as f: + with open(tagIndexFilename, 'r') as f: lines = f.readlines() if not lines: continue @@ -1386,7 +1386,7 @@ def _deleteHashtagsOnPost(baseDir: str, postJsonObject: {}) -> None: os.remove(tagIndexFilename) else: # write the new hashtag index without the given post in it - with open(tagIndexFilename, "w+") as f: + with open(tagIndexFilename, 'w+') as f: f.write(newlines) diff --git a/webapp_column_left.py b/webapp_column_left.py index 09b73f782..034153184 100644 --- a/webapp_column_left.py +++ b/webapp_column_left.py @@ -150,7 +150,7 @@ def getLeftColumnContent(baseDir: str, nickname: str, domainFull: str, linksFileContainsEntries = False linksList = None if os.path.isfile(linksFilename): - with open(linksFilename, "r") as f: + with open(linksFilename, 'r') as f: linksList = f.readlines() if not frontPage: diff --git a/webapp_column_right.py b/webapp_column_right.py index ab3cff465..2327c8149 100644 --- a/webapp_column_right.py +++ b/webapp_column_right.py @@ -342,7 +342,7 @@ def htmlCitations(baseDir: str, nickname: str, domain: str, citationsSelected = [] if os.path.isfile(citationsFilename): citationsSeparator = '#####' - with open(citationsFilename, "r") as f: + with open(citationsFilename, 'r') as f: citations = f.readlines() for line in citations: if citationsSeparator not in line: diff --git a/webapp_create_post.py b/webapp_create_post.py index 1a70401be..cb75eb018 100644 --- a/webapp_create_post.py +++ b/webapp_create_post.py @@ -411,7 +411,7 @@ def htmlNewPost(cssCache: {}, mediaInstance: bool, translate: {}, translate['Citations'] + ':

\n' citationsStr += '
    \n' citationsSeparator = '#####' - with open(citationsFilename, "r") as f: + with open(citationsFilename, 'r') as f: citations = f.readlines() for line in citations: if citationsSeparator not in line: diff --git a/webapp_moderation.py b/webapp_moderation.py index 7a2c696e7..a58b95f3e 100644 --- a/webapp_moderation.py +++ b/webapp_moderation.py @@ -329,7 +329,7 @@ def htmlModerationInfo(cssCache: {}, translate: {}, suspendedFilename = baseDir + '/accounts/suspended.txt' if os.path.isfile(suspendedFilename): - with open(suspendedFilename, "r") as f: + with open(suspendedFilename, 'r') as f: suspendedStr = f.read() infoForm += '
    \n' infoForm += '
    ' + \ @@ -345,7 +345,7 @@ def htmlModerationInfo(cssCache: {}, translate: {}, blockingFilename = baseDir + '/accounts/blocking.txt' if os.path.isfile(blockingFilename): - with open(blockingFilename, "r") as f: + with open(blockingFilename, 'r') as f: blockedStr = f.read() infoForm += '
    \n' infoForm += \ @@ -363,7 +363,7 @@ def htmlModerationInfo(cssCache: {}, translate: {}, filtersFilename = baseDir + '/accounts/filters.txt' if os.path.isfile(filtersFilename): - with open(filtersFilename, "r") as f: + with open(filtersFilename, 'r') as f: filteredStr = f.read() infoForm += '
    \n' infoForm += \ diff --git a/webapp_profile.py b/webapp_profile.py index 3439b834b..61a190e83 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -1231,7 +1231,7 @@ def _htmlEditProfileInstance(baseDir: str, translate: {}, moderators = '' moderatorsFile = baseDir + '/accounts/moderators.txt' if os.path.isfile(moderatorsFile): - with open(moderatorsFile, "r") as f: + with open(moderatorsFile, 'r') as f: moderators = f.read() # site moderators roleAssignStr = '
    ' + \ @@ -1251,7 +1251,7 @@ def _htmlEditProfileInstance(baseDir: str, translate: {}, editors = '' editorsFile = baseDir + '/accounts/editors.txt' if os.path.isfile(editorsFile): - with open(editorsFile, "r") as f: + with open(editorsFile, 'r') as f: editors = f.read() roleAssignStr += '
    \n' @@ -1266,7 +1266,7 @@ def _htmlEditProfileInstance(baseDir: str, translate: {}, counselors = '' counselorsFile = baseDir + '/accounts/counselors.txt' if os.path.isfile(counselorsFile): - with open(counselorsFile, "r") as f: + with open(counselorsFile, 'r') as f: counselors = f.read() roleAssignStr += '
    \n' @@ -1280,7 +1280,7 @@ def _htmlEditProfileInstance(baseDir: str, translate: {}, artists = '' artistsFile = baseDir + '/accounts/artists.txt' if os.path.isfile(artistsFile): - with open(artistsFile, "r") as f: + with open(artistsFile, 'r') as f: artists = f.read() roleAssignStr += '
    \n' @@ -1490,7 +1490,7 @@ def _htmlEditProfileFiltering(baseDir: str, nickname: str, domain: str, if not os.path.isfile(locationsFilename): locationsFilename = baseDir + '/locations.txt' cities = [] - with open(locationsFilename, "r") as f: + with open(locationsFilename, 'r') as f: cities = f.readlines() cities.sort() editProfileForm += '