text:
Christopher Sprigman
Apple vs. Samsung: Is copying theft or innovation?
Martes, 04/Sep/2012 Los Angeles Times ReflexionesNuevas TecnologíasPatentes
Does anyone own the rectangle? Should anyone own the rectangle?
These questions may sound absurd, but they're at the heart of U.S. patent law's Battle of the Titans: Apple vs. Samsung.
On Aug. 24, a San Jose jury awarded Apple Inc. a whopping $1.05 billion in damages. Apple had accused Samsung of copying its intellectual property, including its very broad design patents for rectangular "electronic devices." And Apple wants to use those patents to stop its competitor from selling items like the new (rectangular) Galaxy tablet and (rectangular) Android-based smartphones.
Now, you may be thinking that a lot of devices in your house are rectangular.… Seguir leyendo »
Why Imitation Is the Sincerest Form of Fashion
Viernes, 13/Ago/2010 The New York Times ReflexionesSocialPropiedad Intelectual
New York City is one of the world's great centers of fashion. So it's not surprising that New York's senior senator, Charles E. Schumer, would take an interest in fashion designers. Last week he introduced legislation that would rewrite copyright law to cover their designs. But his bill could hurt the fashion industry more than it would help, and raise consumer prices along the way.
It strikes many people as strange that fashion designs are not already protected against copying. Creative artists like musicians and filmmakers argue, quite persuasively, that their success requires copyright protection for their work. If others could steal it, they say, innovation would grind to a halt.… Seguir leyendo »


Alpine 9855 w/ Alpine 6.5 3-way and 6.5 componants.
I want tinted windows......How much tint did you do Little Red Wagen????
Tint to the front windows is illegal here in cali sandi haaha!
Sandiegan05fronty Wrote: I want tinted windows......How much tint did you do Little Red Wagen????
When I purchased it the salesman through the window tint in the sale.
He told me to drive the truck around the block to a window tint co. Apparently they were expecting me. I told them to make it leagle. I'm not sure the % of tint.
Kenwood DD HU, Infiniti 12 and tweeters, which give me infiniti hp!
hey ben you forgot a new rear axle!
I havent done too much, but the winter is kind of an off season for my cash flow hehe.
Barcin Wrote: Tint to the front windows is illegal here in cali sandi haaha!
Since Kevin (krh2) hasn't posted in this thread..I won't list mine either..
scottsbro23 Wrote: Since Kevin (krh2) hasn't posted in this thread..I won't list mine either..
Alot more to come, a charger coming soon!


text:
package com.qiniu.storage;

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonNull;
import com.google.gson.JsonObject;
import com.qiniu.common.Constants;
import com.qiniu.common.QiniuException;
import com.qiniu.http.Client;
import com.qiniu.http.Response;
import com.qiniu.storage.model.*;
import com.qiniu.util.*;

import java.util.*;

/**
 * 主要涉及了空间资源管理及批量操作接口的实现,具体的接口规格可以参考
 * 参考文档:资源管理
 */
public final class BucketManager {

    /**
     * Auth 对象
     * 该类需要使用QBox鉴权,所以需要指定Auth对象
     */
    private final Auth auth;
    /**
     * HTTP Client 对象
     * 该类需要通过该对象来发送HTTP请求
     */
    private final Client client;
    /**
     * ConfigHelper 对象
     * 该类相关的域名配置,解析配置,HTTP请求超时时间设置等
     */
    private ConfigHelper configHelper;

    /**
     * 构建一个新的 BucketManager 对象
     *
     * @param auth Auth对象
     * @param cfg  Configuration对象
     */
    public BucketManager(Auth auth, Configuration cfg) {
        this.auth = auth;
        Configuration c2 = cfg == null ? new Configuration() : cfg.clone();
        this.configHelper = new ConfigHelper(c2);
        client = new Client(c2);
    }

    public BucketManager(Auth auth, Client client) {
        this.auth = auth;
        this.client = client;
        this.configHelper = new ConfigHelper(new Configuration());
    }

    /**
     * EncodedEntryURI格式,其中 bucket+":"+key 称之为 entry
     *
     * @param bucket
     * @param key
     * @return UrlSafeBase64.encodeToString(entry)
     * @link http://developer.qiniu.com/kodo/api/data-format
     */
    public static String encodedEntry(String bucket, String key) {
        String encodedEntry;
        if (key != null) {
            encodedEntry = UrlSafeBase64.encodeToString(bucket + ":" + key);
        } else {
            encodedEntry = UrlSafeBase64.encodeToString(bucket);
        }
        return encodedEntry;
    }

    /**
     * EncodedEntryURI格式,用在不指定key值的情况下
     *
     * @param bucket 空间名称
     * @return UrlSafeBase64.encodeToString(bucket)
     * @link http://developer.qiniu.com/kodo/api/data-format
     */
    public static String encodedEntry(String bucket) {
        return encodedEntry(bucket, null);
    }

    /**
     * 获取账号下所有空间名称列表
     *
     * @return 空间名称列表
     */
    public String[] buckets() throws QiniuException {
        Response res = bucketsResponse();
        String[] buckets = res.jsonToObject(String[].class);
        res.close();
        return buckets;
    }

    public Response bucketsResponse() throws QiniuException {
        String url = String.format("%s/buckets", configHelper.rsHost());
        Response res = get(url);
        if (!res.isOK()) {
            throw new QiniuException(res);
        }
        return res;
    }

    /**
     * 创建空间
     *
     * @param bucketName
     * @param region
     * @return
     * @throws QiniuException
     */
    public Response createBucket(String bucketName, String region) throws QiniuException {
        String url = String.format("%s/mkbucketv3/%s/region/%s", configHelper.rsHost(),
                bucketName, region);
        Response res = post(url, null);
        if (!res.isOK()) {
            throw new QiniuException(res);
        }
        return res;
    }

    /**
     * 获取该空间下所有的domain
     *
     * @param bucket
     * @return 该空间名下的domain
     * @throws QiniuException
     */
    public String[] domainList(String bucket) throws QiniuException {
        Response res = domainListResponse(bucket);
        String[] domains = res.jsonToObject(String[].class);
        res.close();
        return domains;
    }

    public Response domainListResponse(String bucket) throws QiniuException {
        String url = String.format("%s/v6/domain/list?tbl=%s", configHelper.apiHost(), bucket);
        Response res = get(url);
        if (!res.isOK()) {
            throw new QiniuException(res);
        }
        return res;
    }

    /**
     * 根据前缀获取文件列表的迭代器
     *
     * @param bucket 空间名
     * @param prefix 文件名前缀
     * @return FileInfo迭代器
     */
    public FileListIterator createFileListIterator(String bucket, String prefix) {
        return new FileListIterator(bucket, prefix, 1000, null);
    }

    /**
     * 根据前缀获取文件列表的迭代器
     *
     * @param bucket    空间名
     * @param prefix    文件名前缀
     * @param limit     每次迭代的长度限制,最大1000,推荐值 100
     * @param delimiter 指定目录分隔符,列出所有公共前缀(模拟列出目录效果)。缺省值为空字符串
     * @return FileInfo迭代器
     */
    public FileListIterator createFileListIterator(String bucket, String prefix, int limit, String delimiter) {
        return new FileListIterator(bucket, prefix, limit, delimiter);
    }

    private String listQuery(String bucket, String prefix, String marker, int limit, String delimiter) {
        StringMap map = new StringMap().put("bucket", bucket).putNotEmpty("marker", marker)
                .putNotEmpty("prefix", prefix).putNotEmpty("delimiter", delimiter).putWhen("limit", limit, limit > 0);
        return map.formString();
    }

    /**
     * 列举空间文件 v1 接口,返回一个 response 对象。
     *
     * @param bucket    空间名
     * @param prefix    文件名前缀
     * @param marker    上一次获取文件列表时返回的 marker
     * @param limit     每次迭代的长度限制,最大1000,推荐值 100
     * @param delimiter 指定目录分隔符,列出所有公共前缀(模拟列出目录效果)。缺省值为空字符串
     * @return
     * @throws QiniuException
     */
    public Response listV1(String bucket, String prefix, String marker, int limit, String delimiter)
            throws QiniuException {
        String url = String.format("%s/list?%s", configHelper.rsfHost(auth.accessKey, bucket),
                listQuery(bucket, prefix, marker, limit, delimiter));
        return get(url);
    }

    public FileListing listFiles(String bucket, String prefix, String marker, int limit, String delimiter)
            throws QiniuException {
        Response response = listV1(bucket, prefix, marker, limit, delimiter);
        if (!response.isOK()) {
            throw new QiniuException(response);
        }
        FileListing fileListing = response.jsonToObject(FileListing.class);
        response.close();
        return fileListing;
    }

    /**
     * 列举空间文件 v2 接口,返回一个 response 对象。v2 接口可以避免由于大量删除导致的列举超时问题,返回的 response 对象中的 body 可以转换为
     * string stream 来处理。
     *
     * @param bucket    空间名
     * @param prefix    文件名前缀
     * @param marker    上一次获取文件列表时返回的 marker
     * @param limit     每次迭代的长度限制,推荐值 1000
     * @param delimiter 指定目录分隔符,列出所有公共前缀(模拟列出目录效果)。缺省值为空字符串
     * @return Response 返回一个 okhttp response 对象
     * @throws QiniuException
     */
    public Response listV2(String bucket, String prefix, String marker, int limit, String delimiter)
            throws QiniuException {
        String url = String.format("%s/v2/list?%s", configHelper.rsfHost(auth.accessKey, bucket),
                listQuery(bucket, prefix, marker, limit, delimiter));
        return get(url);
    }

    public FileListing listFilesV2(String bucket, String prefix, String marker, int limit, String delimiter)
            throws QiniuException {
        Response response = listV2(bucket, prefix, marker, limit, delimiter);
        final String result = response.bodyString();
        response.close();
        List<String> lineList = Arrays.asList(result.split("\n"));
        FileListing fileListing = new FileListing();
        List<FileInfo> fileInfoList = new ArrayList<>();
        Set<String> commonPrefixSet = new HashSet<>();
        for (int i = 0; i < lineList.size(); i++) {
            String line = lineList.get(i);
            JsonObject jsonObject = Json.decode(line, JsonObject.class);
            if (jsonObject == null) {
                continue;
            }
            if (!(jsonObject.get("item") instanceof JsonNull)) {
                fileInfoList.add(Json.decode(jsonObject.get("item"), FileInfo.class));
            }
            String dir = jsonObject.get("dir").getAsString();
            if (!"".equals(dir)) commonPrefixSet.add(dir);
            if (i == lineList.size() - 1)
                fileListing.marker = jsonObject.get("marker").getAsString();
        }
        fileListing.items = fileInfoList.toArray(new FileInfo[]{});
        fileListing.commonPrefixes = commonPrefixSet.toArray(new String[]{});
        return fileListing;
    }

    /**
     * 获取空间中文件的属性
     *
     * @param bucket  空间名称
     * @param fileKey 文件名称
     * @return 文件属性
     * @throws QiniuException
     * @link http://developer.qiniu.com/kodo/api/stat
     */
    public FileInfo stat(String bucket, String fileKey) throws QiniuException {
        Response res = statResponse(bucket, fileKey);
        FileInfo fileInfo = res.jsonToObject(FileInfo.class);
        res.close();
        return fileInfo;
    }

    public Response statResponse(String bucket, String fileKey) throws QiniuException {
        Response res = rsGet(bucket, String.format("/stat/%s", encodedEntry(bucket, fileKey)));
        if (!res.isOK()) {
            throw new QiniuException(res);
        }
        return res;
    }

    /**
     * 删除指定空间、文件名的文件
     *
     * @param bucket 空间名称
     * @param key    文件名称
     * @throws QiniuException
     * @link http://developer.qiniu.com/kodo/api/delete
     */
    public Response delete(String bucket, String key) throws QiniuException {
        return rsPost(bucket, String.format("/delete/%s", encodedEntry(bucket, key)), null);
    }

    /**
     * 修改文件的MimeType
     *
     * @param bucket 空间名称
     * @param key    文件名称
     * @param mime   文件的新MimeType
     * @throws QiniuException
     * @link http://developer.qiniu.com/kodo/api/chgm
     */
    public Response changeMime(String bucket, String key, String mime)
            throws QiniuException {
        String resource = encodedEntry(bucket, key);
        String encodedMime = UrlSafeBase64.encodeToString(mime);
        String path = String.format("/chgm/%s/mime/%s", resource, encodedMime);
        return rsPost(bucket, path, null);
    }

    /**
     * 修改文件的元数据
     *
     * @param bucket  空间名称
     * @param key     文件名称
     * @param headers 需要修改的文件元数据
     * @throws QiniuException
     * @link https://developer.qiniu.com/kodo/api/1252/chgm
     */
    public Response changeHeaders(String bucket, String key, Map<String, String> headers)
            throws QiniuException {
        String resource = encodedEntry(bucket, key);
        String path = String.format("/chgm/%s", resource);
        for (String k : headers.keySet()) {
            String encodedMetaValue = UrlSafeBase64.encodeToString(headers.get(k));
            path = String.format("%s/x-qn-meta-!%s/%s", path, k, encodedMetaValue);
        }
        return rsPost(bucket, path, null);
    }

    /**
     * 修改文件的类型(普通存储或低频存储)
     *
     * @param bucket 空间名称
     * @param key    文件名称
     * @param type   type=0 表示普通存储,type=1 表示低频存存储, type=2 表示归档存储
     * @throws QiniuException
     */
    public Response changeType(String bucket, String key, StorageType type)
            throws QiniuException {
        String resource = encodedEntry(bucket, key);
        String path = String.format("/chtype/%s/type/%d", resource, type.ordinal());
        return rsPost(bucket, path, null);
    }

    /**
     * 解冻归档存储
     * 文档:https://developer.qiniu.com/kodo/api/6380/restore-archive
     *
     * @param bucket          空间名称
     * @param key             文件名称
     * @param freezeAfterDays 解冻有效时长,取值范围 1~7
     * @return
     */
    public Response restoreArchive(String bucket, String key, int freezeAfterDays)
            throws QiniuException {
        String resource = encodedEntry(bucket, key);
        String path = String.format("/restoreAr/%s/freezeAfterDays/%s", resource, Integer.toString(freezeAfterDays));
        String requestUrl = configHelper.rsHost(auth.accessKey, bucket) + path;
        return client.post(requestUrl, null,
                auth.authorizationV2(requestUrl, "POST", null, "application/json"), Client.JsonMime);
    }

    /**
     * 修改文件的状态(禁用或者正常)
     *
     * @param bucket 空间名称
     * @param key    文件名称
     * @param status 0表示启用;1表示禁用。
     * @throws QiniuException
     */
    public Response changeStatus(String bucket, String key, int status)
            throws QiniuException {
        String resource = encodedEntry(bucket, key);
        String path = String.format("/chstatus/%s/status/%d", resource, status);
        return rsPost(bucket, path, null);
    }

    /**
     * 重命名空间中的文件,可以设置force参数为true强行覆盖空间已有同名文件
     *
     * @param bucket     空间名称
     * @param oldFileKey 文件名称
     * @param newFileKey 新文件名
     * @param force      强制覆盖空间中已有同名(和 newFileKey 相同)的文件
     * @throws QiniuException
     */
    public Response rename(String bucket, String oldFileKey, String newFileKey, boolean force)
            throws QiniuException {
        return move(bucket, oldFileKey, bucket, newFileKey, force);
    }

    /**
     * 重命名空间中的文件
     *
     * @param bucket     空间名称
     * @param oldFileKey 文件名称
     * @param newFileKey 新文件名
     * @throws QiniuException
     * @link http://developer.qiniu.com/kodo/api/move
     */
    public Response rename(String bucket, String oldFileKey, String newFileKey)
            throws QiniuException {
        return move(bucket, oldFileKey, bucket, newFileKey);
    }

    /**
     * 复制文件,要求空间在同一账号下,可以设置force参数为true强行覆盖空间已有同名文件
     *
     * @param fromBucket  源空间名称
     * @param fromFileKey 源文件名称
     * @param toBucket    目的空间名称
     * @param toFileKey   目的文件名称
     * @param force       强制覆盖空间中已有同名(和 toFileKey 相同)的文件
     * @throws QiniuException
     */
    public Response copy(String fromBucket, String fromFileKey, String toBucket, String toFileKey, boolean force)
            throws QiniuException {
        String from = encodedEntry(fromBucket, fromFileKey);
        String to = encodedEntry(toBucket, toFileKey);
        String path = String.format("/copy/%s/%s/force/%s", from, to, force);
        return rsPost(fromBucket, path, null);
    }

    /**
     * 复制文件,要求空间在同一账号下
     *
     * @param fromBucket  源空间名称
     * @param fromFileKey 源文件名称
     * @param toBucket    目的空间名称
     * @param toFileKey   目的文件名称
     * @throws QiniuException
     */
    public Response copy(String fromBucket, String fromFileKey, String toBucket, String toFileKey)
            throws QiniuException {
        Response res = copy(fromBucket, fromFileKey, toBucket, toFileKey, false);
        if (!res.isOK()) {
            throw new QiniuException(res);
        }
        return res;
    }

    /**
     * 移动文件,要求空间在同一账号下
     *
     * @param fromBucket  源空间名称
     * @param fromFileKey 源文件名称
     * @param toBucket    目的空间名称
     * @param toFileKey   目的文件名称
     * @param force       强制覆盖空间中已有同名(和 toFileKey 相同)的文件
     * @throws QiniuException
     */
    public Response move(String fromBucket, String fromFileKey, String toBucket,
                         String toFileKey, boolean force) throws QiniuException {
        String from = encodedEntry(fromBucket, fromFileKey);
        String to = encodedEntry(toBucket, toFileKey);
        String path = String.format("/move/%s/%s/force/%s", from, to, force);
        return rsPost(fromBucket, path, null);
    }

    /**
     * 移动文件。要求空间在同一账号下, 可以添加force参数为true强行移动文件。
     *
     * @param fromBucket  源空间名称
     * @param fromFileKey 源文件名称
     * @param toBucket    目的空间名称
     * @param toFileKey   目的文件名称
     * @throws QiniuException
     */
    public Response move(String fromBucket, String fromFileKey, String toBucket, String toFileKey)
            throws QiniuException {
        return move(fromBucket, fromFileKey, toBucket, toFileKey, false);
    }

    /**
     * 抓取指定地址的文件,以指定名称保存在指定空间
     * 要求指定url可访问,大文件不建议使用此接口抓取。可先下载再上传
     * 如果不指定保存的文件名,那么以文件内容的 etag 作为文件名
     *
     * @param url    待抓取的文件链接
     * @param bucket 文件抓取后保存的空间
     * @throws QiniuException
     */
    public FetchRet fetch(String url, String bucket) throws QiniuException {
        return fetch(url, bucket, null);
    }

    /**
     * 抓取指定地址的文件,以指定名称保存在指定空间
     * 要求指定url可访问,大文件不建议使用此接口抓取。可先下载再上传
     *
     * @param url    待抓取的文件链接
     * @param bucket 文件抓取后保存的空间
     * @param key    文件抓取后保存的文件名
     * @throws QiniuException
     */
    public FetchRet fetch(String url, String bucket, String key) throws QiniuException {
        Response res = fetchResponse(url, bucket, key);
        FetchRet fetchRet = res.jsonToObject(FetchRet.class);
        res.close();
        return fetchRet;
    }

    public Response fetchResponse(String url, String bucket, String key) throws QiniuException {
        String resource = UrlSafeBase64.encodeToString(url);
        String to = encodedEntry(bucket, key);
        String path = String.format("/fetch/%s/to/%s", resource, to);
        Response res = ioPost(bucket, path);
        if (!res.isOK()) {
            throw new QiniuException(res);
        }
        return res;
    }

    /**
     * 异步第三方资源抓取 从指定 URL 抓取资源,并将该资源存储到指定空间中。每次只抓取一个文件,抓取时可以指定保存空间名和最终资源名。
     * 主要对于大文件进行抓取
     * https://developer.qiniu.com/kodo/api/4097/asynch-fetch
     *
     * @param url    待抓取的文件链接,支持设置多个,以';'分隔
     * @param bucket 文件抓取后保存的空间
     * @param key    文件抓取后保存的文件名
     * @return Response
     * @throws QiniuException
     */
    public Response asynFetch(String url, String bucket, String key) throws QiniuException {
        StringMap params = new StringMap().putNotNull("key", key);
        return asyncFetch(url, bucket, params);
    }

    /**
     * 异步第三方资源抓取 从指定 URL 抓取资源,并将该资源存储到指定空间中。每次只抓取一个文件,抓取时可以指定保存空间名和最终资源名。
     * https://developer.qiniu.com/kodo/api/4097/asynch-fetch
     * 提供更多参数的抓取 可以对抓取文件进行校验 和自定义抓取回调地址等
     *
     * @param url              待抓取的文件链接,支持设置多个,以';'分隔
     * @param bucket           文件抓取后保存的空间
     * @param key              文件抓取后保存的文件名
     * @param md5              文件md5,传入以后会在存入存储时对文件做校验,校验失败则不存入指定空间
     * @param etag             文件etag,传入以后会在存入存储时对文件做校验,校验失败则不存入指定空间
     * @param callbackurl      回调URL,详细解释请参考上传策略中的callbackUrl
     * @param callbackbody     回调Body,如果callbackurl不为空则必须指定。与普通上传一致支持魔法变量,
     * @param callbackbodytype 回调Body内容类型,默认为"application/x-www-form-urlencoded",
     * @param callbackhost     回调时使用的Host
     * @param fileType         存储文件类型 0:正常存储(默认),1:低频存储
     * @return Response
     * @throws QiniuException
     */
    public Response asynFetch(String url, String bucket, String key, String md5, String etag,
                              String callbackurl, String callbackbody, String callbackbodytype,
                              String callbackhost, int fileType) throws QiniuException {
        StringMap params = new StringMap()
                .putNotNull("key", key)
                .putNotNull("md5", md5)
                .putNotNull("etag", etag)
                .putNotNull("callbackurl", callbackurl)
                .putNotNull("callbackbody", callbackbody)
                .putNotNull("callbackbodytype", callbackbodytype)
                .putNotNull("callbackhost", callbackhost)
                .putNotNull("file_type", fileType);
        return asyncFetch(url, bucket, params);
    }

    /**
     * 异步第三方资源抓取 从指定 URL 抓取资源,并将该资源存储到指定空间中。每次只抓取一个文件,抓取时可以指定保存空间名和最终资源名。
     * 主要对于大文件进行抓取
     * https://developer.qiniu.com/kodo/api/4097/asynch-fetch
     *
     * @param url    待抓取的文件链接,支持设置多个,以';'分隔
     * @param bucket 文件抓取后保存的空间
     * @param params 其他参数
     * @return Response
     * @throws QiniuException
     */
    public Response asyncFetch(String url, String bucket, StringMap params) throws QiniuException {
        if (params == null) params = new StringMap();
        params.put("url", url).put("bucket", bucket);
        String requestUrl = configHelper.apiHost(auth.accessKey, bucket) + "/sisyphus/fetch";
        byte[] bodyByte = Json.encode(params).getBytes(Constants.UTF_8);
        return client.post(requestUrl, bodyByte,
                auth.authorizationV2(requestUrl, "POST", bodyByte, "application/json"), Client.JsonMime);
    }

    /**
     * 查询异步抓取任务
     *
     * @param region      抓取任务所在bucket区域 华东 z0 华北 z1 华南 z2 北美 na0 东南亚 as0
     * @param fetchWorkId 抓取任务id
     * @return Response
     * @throws QiniuException
     */
    public Response checkAsynFetchid(String region, String fetchWorkId) throws QiniuException {
        String path = String.format("http://api-%s.qiniu.com/sisyphus/fetch?id=%s", region, fetchWorkId);
        return client.get(path, auth.authorization(path));
    }

    /**
     * 对于设置了镜像存储的空间,从镜像源站抓取指定名称的资源并存储到该空间中
     * 如果该空间中已存在该名称的资源,则会将镜像源站的资源覆盖空间中相同名称的资源
     *
     * @param bucket 空间名称
     * @param key    文件名称
     * @throws QiniuException
     */
    public Response prefetch(String bucket, String key) throws QiniuException {
        String resource = encodedEntry(bucket, key);
        String path = String.format("/prefetch/%s", resource);
        Response res = ioPost(bucket, path);
        if (!res.isOK()) {
            throw new QiniuException(res);
        }
        return res;
    }

    /**
     * 设置空间的镜像源站
     *
     * @param bucket     空间名称
     * @param srcSiteUrl 镜像回源地址
     */
    @Deprecated
    public Response setImage(String bucket, String srcSiteUrl) throws QiniuException {
        return setImage(bucket, srcSiteUrl, null);
    }

    /**
     * 设置空间的镜像源站
     *
     * @param bucket     空间名称
     * @param srcSiteUrl 镜像回源地址
     * @param host       镜像回源Host
     */
    @Deprecated
    public Response setImage(String bucket, String srcSiteUrl, String host) throws QiniuException {
        String encodedSiteUrl = UrlSafeBase64.encodeToString(srcSiteUrl);
        String encodedHost = null;
        if (host != null && host.length() > 0) {
            encodedHost = UrlSafeBase64.encodeToString(host);
        }
        String path = String.format("/image/%s/from/%s", bucket, encodedSiteUrl);
        if (encodedHost != null) {
            path += String.format("/host/%s", encodedHost);
        }
        return pubPost(path);
    }

    /**
     * 取消空间的镜像源站设置
     *
     * @param bucket 空间名称
     */
    @Deprecated
    public Response unsetImage(String bucket) throws QiniuException {
        String path = String.format("/unimage/%s", bucket);
        return pubPost(path);
    }

    /**
     * 设置文件的存活时间
     *
     * @param bucket 空间名称
     * @param key    文件名称
     * @param days   存活时间,单位:天
     */
    public Response deleteAfterDays(String bucket, String key, int days) throws QiniuException {
        return rsPost(bucket, String.format("/deleteAfterDays/%s/%d", encodedEntry(bucket, key), days), null);
    }

    /**
     * 设置Bucket noIndexPage属性

     * noIndexPage为0表示启用indexPage,为1表示不启用indexPage
     *
     * @param bucket
     * @param type
     * @throws QiniuException
     */
    public Response setIndexPage(String bucket, IndexPageType type) throws QiniuException {
        String url = String.format("%s/noIndexPage?bucket=%s&noIndexPage=%s",
                configHelper.ucHost(), bucket, type.getType());
        Response res = post(url, null);
        if (!res.isOK()) {
            throw new QiniuException(res);
        }
        return res;
    }

    /**
     * 查询空间信息
     *
     * @param bucket
     * @return
     * @throws QiniuException
     */
    public BucketInfo getBucketInfo(String bucket) throws QiniuException {
        Response res = getBucketInfoResponse(bucket);
        BucketInfo info = res.jsonToObject(BucketInfo.class);
        res.close();
        return info;
    }

    public Response getBucketInfoResponse(String bucket) throws QiniuException {
        String url = String.format("%s/v2/bucketInfo?bucket=%s", configHelper.ucHost(), bucket);
        Response res = post(url, null);
        if (!res.isOK()) {
            throw new QiniuException(res);
        }
        res.close();
        return res;
    }

    /**
     * 设置空间referer防盗链
     *
     * @param bucket
     * @param antiLeech
     * @throws QiniuException
     */
    public Response putReferAntiLeech(String bucket, BucketReferAntiLeech antiLeech) throws QiniuException {
        String url = String.format("%s/referAntiLeech?bucket=%s&%s",
                configHelper.ucHost(), bucket, antiLeech.asQueryString());
        Response res = post(url, null);
        if (!res.isOK()) {
            throw new QiniuException(res);
        }
        return res;
    }

    /**
     * 设置存储空间内文件的生命周期规则
     *
     * @param bucket
     * @param rule
     * @return
     * @throws QiniuException
     */
    public Response putBucketLifecycleRule(String bucket, BucketLifeCycleRule rule) throws QiniuException {
        String url = String.format("%s/rules/add?bucket=%s&%s", configHelper.ucHost(), bucket, rule.asQueryString());
        Response res = post(url, null);
        if (!res.isOK()) {
            throw new QiniuException(res);
        }
        return res;
    }

    /**
     * 删除特定存储空间上设定的规则
     *
     * @param bucket
     * @param ruleName
     * @return
     * @throws QiniuException
     */
    public Response deleteBucketLifecycleRule(String bucket, String ruleName) throws QiniuException {
        String url = String.format("%s/rules/delete?bucket=%s&name=%s", configHelper.ucHost(), bucket, ruleName);
        Response res = post(url, null);
        if (!res.isOK()) {
            throw new QiniuException(res);
        }
        return res;
    }

    /**
     * 更新特定存储空间上的生命周期规则
     *
     * @param bucket
     * @param rule
     * @return
     * @throws QiniuException
     */
    public Response updateBucketLifeCycleRule(String bucket, BucketLifeCycleRule rule) throws QiniuException {
        String url = String.format("%s/rules/update?bucket=%s&%s",
                configHelper.ucHost(), bucket, rule.asQueryString());
        Response res = post(url, null);
        if (!res.isOK()) {
            throw new QiniuException(res);
        }
        return res;
    }

    /**
     * 获取指定空间上设置的生命周期规则
     *
     * @param bucket
     * @return
     * @throws QiniuException
     */
    public BucketLifeCycleRule[] getBucketLifeCycleRule(String bucket) throws QiniuException {
        Response res = getBucketLifeCycleRuleResponse(bucket);
        BucketLifeCycleRule[] rules;
        JsonElement element = Json.decode(res.bodyString(), JsonElement.class);
        if (element instanceof JsonNull) {
            rules = new BucketLifeCycleRule[0];
        } else {
            JsonArray array = (JsonArray) element;
            rules = new BucketLifeCycleRule[array.size()];
            for (int i = 0; i < array.size(); i++) {
                rules[i] = Json.decode(array.get(i), BucketLifeCycleRule.class);
            }
        }
        res.close();
        return rules;
    }

    public Response getBucketLifeCycleRuleResponse(String bucket) throws QiniuException {
        String url = String.format("%s/rules/get?bucket=%s", configHelper.ucHost(), bucket);
        Response res = post(url, null);
        if (!res.isOK()) {
            throw new QiniuException(res);
        }
        return res;
    }

    /**
     * 增加事件通知规则
     *
     * @param bucket
     * @param rule
     * @return
     * @throws QiniuException
     */
    public Response putBucketEvent(String bucket, BucketEventRule rule) throws QiniuException {
        String url = String.format("%s/events/add?bucket=%s&%s", configHelper.ucHost(), bucket, rule.asQueryString());
        Response res = post(url, null);
        if (!res.isOK()) {
            throw new QiniuException(res);
        }
        return res;
    }

    /**
     * 删除事件通知规则
     *
     * @param bucket
     * @param ruleName
     * @return
     * @throws QiniuException
     */
    public Response deleteBucketEvent(String bucket, String ruleName) throws QiniuException {
        String url = String.format("%s/events/delete?bucket=%s&name=%s", configHelper.ucHost(), bucket, ruleName);
        Response res = post(url, null);
        if (!res.isOK()) {
            throw new QiniuException(res);
        }
        return res;
    }

    /**
     * 更新事件通知规则
     *
     * @param bucket
     * @param rule
     * @return
     * @throws QiniuException
     */
    public Response updateBucketEvent(String bucket, BucketEventRule rule) throws QiniuException {
        String url = String.format("%s/events/update?bucket=%s&%s",
                configHelper.ucHost(), bucket, rule.asQueryString());
        Response res = post(url, null);
        if (!res.isOK()) {
            throw new QiniuException(res);
        }
        return res;
    }

    /**
     * 获取事件通知规则
     *
     * @param bucket
     * @return
     * @throws QiniuException
     */
    public BucketEventRule[] getBucketEvents(String bucket) throws QiniuException {
        Response res = getBucketEventsResponse(bucket);
        BucketEventRule[] rules;
        JsonElement element = Json.decode(res.bodyString(), JsonElement.class);
        if (element instanceof JsonNull) {
            rules = new BucketEventRule[0];
        } else {
            JsonArray array = (JsonArray) element;
            rules = new BucketEventRule[array.size()];
            for (int i = 0; i < array.size(); i++) {
                rules[i] = Json.decode(array.get(i), BucketEventRule.class);
            }
        }
        res.close();
        return rules;
    }

    public Response getBucketEventsResponse(String bucket) throws QiniuException {
        String url = String.format("%s/events/get?bucket=%s", configHelper.ucHost(), bucket);
        Response res = post(url, null);
        if (!res.isOK()) {
            throw new QiniuException(res);
        }
        return res;
    }

    /**
     * 设置bucket的cors(跨域)规则
     *
     * @param bucket
     * @param rules
     * @return
     * @throws QiniuException
     */
    public Response putCorsRules(String bucket, CorsRule[] rules) throws QiniuException {
        String url = String.format("%s/corsRules/set/%s", configHelper.ucHost(), bucket);
        Response res = post(url, Json.encode(rules).getBytes());
        if (!res.isOK()) {
            throw new QiniuException(res);
        }
        return res;
    }

    /**
     * 获取bucket的cors(跨域)规则
     *
     * @param bucket
     * @return
     * @throws QiniuException
     */
    public CorsRule[] getCorsRules(String bucket) throws QiniuException {
        Response res = getCorsRulesResponse(bucket);
        CorsRule[] rules;
        JsonElement element = Json.decode(res.bodyString(), JsonElement.class);
        if (element instanceof JsonNull) {
            rules = new CorsRule[0];
        } else {
            JsonArray array = (JsonArray) element;
            rules = new CorsRule[array.size()];
            for (int i = 0; i < array.size(); i++) {
                rules[i] = Json.decode(array.get(i), CorsRule.class);
            }
        }
        res.close();
        return rules;
    }

    public Response getCorsRulesResponse(String bucket) throws QiniuException {
        String url = String.format("%s/corsRules/get/%s", configHelper.ucHost(), bucket);
        Response res = post(url, null);
        if (!res.isOK()) {
            throw new QiniuException(res);
        }
        return res;
    }

    /**
     * 设置原图保护模式,1表示开启原图保护,0表示关闭,默认为0
     *
     * @param bucket
     * @param mode
     * @return
     * @throws QiniuException
     */
    public Response putBucketAccessStyleMode(String bucket, AccessStyleMode mode) throws QiniuException {
        String url = String.format("%s/accessMode/%s/mode/%d", configHelper.ucHost(), bucket, mode.getType());
        Response res = post(url, null);
        if (!res.isOK()) {
            throw new QiniuException(res);
        }
        return res;
    }

    /**
     * 设置Bucket的cache-control: max-age属性

     * maxAge为0或者负数表示为默认值(31536000)
     *
     * @param bucket
     * @param maxAge
     * @return
     * @throws QiniuException
     */
    public Response putBucketMaxAge(String bucket, long maxAge) throws QiniuException {
        String url = String.format("%s/maxAge?bucket=%s&maxAge=%d", configHelper.ucHost(), bucket, maxAge);
        Response res = post(url, null);
        if (!res.isOK()) {
            throw new QiniuException(res);
        }
        return res;
    }

    /**
     * 设置bucket私有属性,0公有空间,1私有空间
     *
     * @param bucket
     * @param acl
     * @throws QiniuException
     */
    public Response putBucketAccessMode(String bucket, AclType acl) throws QiniuException {
        String url = String.format("%s/private?bucket=%s&private=%s", configHelper.ucHost(), bucket, acl.getType());
        Response res = post(url, null);
        if (!res.isOK()) {
            throw new QiniuException(res);
        }
        return res;
    }

    /**
     * 设置bucket私有属性,0公有空间,1私有空间

     * 推荐使用putBucketAccessMode
     *
     * @param bucket
     * @param acl
     * @throws QiniuException
     */
    @Deprecated
    public Response setBucketAcl(String bucket, AclType acl) throws QiniuException {
        return putBucketAccessMode(bucket, acl);
    }

    /**
     * 设置空间配额,配置解释请参考BucketQuota
     *
     * @param bucket
     * @param bucketQuota
     * @return
     * @throws QiniuException
     */
    public Response putBucketQuota(String bucket, BucketQuota bucketQuota) throws QiniuException {
        String url = String.format("%s/setbucketquota/%s/size/%d/count/%d",
                configHelper.apiHost(), bucket, bucketQuota.getSize(), bucketQuota.getCount());
        Response res = post(url, null);
        if (!res.isOK()) {
            throw new QiniuException(res);
        }
        return res;
    }

    /**
     * 获取空间配额
     *
     * @param bucket
     * @return
     */
    public BucketQuota getBucketQuota(String bucket) throws QiniuException {
        Response res = getBucketQuotaResponse(bucket);
        BucketQuota bucketQuota = res.jsonToObject(BucketQuota.class);
        res.close();
        return bucketQuota;
    }

    public Response getBucketQuotaResponse(String bucket) throws QiniuException {
        String url = String.format("%s/getbucketquota/%s", configHelper.apiHost(), bucket);
        Response res = post(url, null);
        if (!res.isOK()) {
            throw new QiniuException(res);
        }
        return res;
    }

    /*
     * 相关请求的方法列表
     * */
    private Response rsPost(String bucket, String path, byte[] body) throws QiniuException {
        check(bucket);
        String url = configHelper.rsHost(auth.accessKey, bucket) + path;
        return post(url, body);
    }

    private Response rsGet(String bucket, String path) throws QiniuException {
        check(bucket);
        String url = configHelper.rsHost(auth.accessKey, bucket) + path;
        return get(url);
    }

    private Response ioPost(String bucket, String path) throws QiniuException {
        check(bucket);
        String url = configHelper.ioHost(auth.accessKey, bucket) + path;
        return post(url, null);
    }

    private Response pubPost(String path) throws QiniuException {
        String url = "http://pu.qbox.me:10200" + path;
        return post(url, null);
    }

    private Response get(String url) throws QiniuException {
        StringMap headers = auth.authorization(url);
        return client.get(url, headers);
    }

    private Response post(String url, byte[] body) throws QiniuException {
        StringMap headers = auth.authorization(url, body, Client.FormMime);
        return client.post(url, body, headers, Client.FormMime);
    }

    private void check(String bucket) throws QiniuException {
        if (StringUtils.isNullOrEmpty(bucket)) {
            throw new QiniuException(Response.createError(null, null, 0, "未指定操作的空间或操作体为空"));
        }
    }

    /**
     * 批量文件管理请求
     */
    public Response batch(BatchOperations operations) throws QiniuException {
        return rsPost(operations.execBucket(), "/batch", operations.toBody());
    }

    /**
     * 文件管理批量操作指令构建对象
     */
    public static class BatchOperations {
        private ArrayList<String> ops;
        private String execBucket = null;

        public BatchOperations() {
            this.ops = new ArrayList<String>();
        }

        /**
         * 添加chgm指令
         */
        public BatchOperations addChgmOp(String bucket, String key, String newMimeType) {
            String resource = encodedEntry(bucket, key);
            String encodedMime = UrlSafeBase64.encodeToString(newMimeType);
            ops.add(String.format("/chgm/%s/mime/%s", resource, encodedMime));
            setExecBucket(bucket);
            return this;
        }

        /**
         * 添加copy指令
         */
        public BatchOperations addCopyOp(String fromBucket, String fromFileKey, String toBucket, String toFileKey) {
            String from = encodedEntry(fromBucket, fromFileKey);
            String to = encodedEntry(toBucket, toFileKey);
            ops.add(String.format("copy/%s/%s", from, to));
            setExecBucket(fromBucket);
            return this;
        }

        /**
         * 添加重命名指令
         */
        public BatchOperations addRenameOp(String fromBucket, String fromFileKey, String toFileKey) {
            return addMoveOp(fromBucket, fromFileKey, fromBucket, toFileKey);
        }

        /**
         * 添加move指令
         */
        public BatchOperations addMoveOp(String fromBucket, String fromKey, String toBucket, String toKey) {
            String from = encodedEntry(fromBucket, fromKey);
            String to = encodedEntry(toBucket, toKey);
            ops.add(String.format("move/%s/%s", from, to));
            setExecBucket(fromBucket);
            return this;
        }

        /**
         * 添加delete指令
         */
        public BatchOperations addDeleteOp(String bucket, String... keys) {
            for (String key : keys) {
                ops.add(String.format("delete/%s", encodedEntry(bucket, key)));
            }
            setExecBucket(bucket);
            return this;
        }

        /**
         * 添加stat指令
         */
        public BatchOperations addStatOps(String bucket, String... keys) {
            for (String key : keys) {
                ops.add(String.format("stat/%s", encodedEntry(bucket, key)));
            }
            setExecBucket(bucket);
            return this;
        }

        /**
         * 添加changeType指令
         */
        public BatchOperations addChangeTypeOps(String bucket, StorageType type, String... keys) {
            for (String key : keys) {
                ops.add(String.format("chtype/%s/type/%d", encodedEntry(bucket, key), type.ordinal()));
            }
            setExecBucket(bucket);
            return this;
        }

        /**
         * 添加changeStatus指令
         */
        public BatchOperations addChangeStatusOps(String bucket, int status, String... keys) {
            for (String key : keys) {
                ops.add(String.format("chstatus/%s/status/%d", encodedEntry(bucket, key), status));
            }
            setExecBucket(bucket);
            return this;
        }

        /**
         * 添加deleteAfterDays指令
         */
        public BatchOperations addDeleteAfterDaysOps(String bucket, int days, String... keys) {
            for (String key : keys) {
                ops.add(String.format("deleteAfterDays/%s/%d", encodedEntry(bucket, key), days));
            }
            setExecBucket(bucket);
            return this;
        }

        public byte[] toBody() {
            String body = StringUtils.join(ops, "&op=", "op=");
            return StringUtils.utf8Bytes(body);
        }

        public BatchOperations merge(BatchOperations batch) {
            this.ops.addAll(batch.ops);
            setExecBucket(batch.execBucket());
            return this;
        }

        public BatchOperations clearOps() {
            this.ops.clear();
            return this;
        }

        private void setExecBucket(String bucket) {
            if (execBucket == null) {
                execBucket = bucket;
            }
        }

        public String execBucket() {
            return execBucket;
        }
    }

    /**
     * 创建文件列表迭代器
     */
    public class FileListIterator implements Iterator<FileInfo[]> {
        private String marker = null;
        private String bucket;
        private String delimiter;
        private int limit;
        private String prefix;
        private QiniuException exception = null;

        public FileListIterator(String bucket, String prefix, int limit, String delimiter) {
            if (limit <= 0) {
                throw new IllegalArgumentException("limit must greater than 0");
            }
            if (limit > 1000) {
                throw new IllegalArgumentException("limit must not greater than 1000");
            }
            this.bucket = bucket;
            this.prefix = prefix;
            this.limit = limit;
            this.delimiter = delimiter;
        }

        public QiniuException error() {
            return exception;
        }

        @Override
        public boolean hasNext() {
            return exception == null && !"".equals(marker);
        }

        @Override
        public FileInfo[] next() {
            try {
                FileListing f = listFiles(bucket, prefix, marker, limit, delimiter);
                this.marker = f.marker == null ? "" : f.marker;
                return f.items;
            } catch (QiniuException e) {
                this.exception = e;
                return null;
            }
        }

        @Override
        public void remove() {
            throw new UnsupportedOperationException("remove");
        }
    }

}

redpajama_set_name: RedPajamaGithub


IMAGINE walking into the National Museum of Singapore and being confronted by outdoor environment such as a mound lush grass, or a beach inviting your for a tan? How about unexpectedly having artwork appear in front and around you, or actually being part of the final puzzle piece to an installation? These are among the experiences you will encounter at What Is Visible Is Not Invisible - Featuring selected artworks from the French Regional Collections of Contemporary Art (FRAC), the latest contemporary art exhibition at the National Museum of Singapore, and a parallel project of the Singapore Biennale 2016!
What Is not Visible Is not Invisible presents over 30 artworks by French and international artists from FRAC, one of the most important public collection of contemporary art founded in 1982, and anchored by 23 institutions across all the regions in France. The show is curated in collaboration with Platform, the network of FRACs, and marks the first time that this selection of the collected is being presented in Asia Pacific.
The exhibition broadly surveys the imaginary and the temporary, and takes you on an experiential and progressive journey of the mind and sense through the artworks specially selected from FRAC's collection of 26,000 works. Through the use of unconventional approaches in art making, the exhibition of multi-media installation invites new ways of perception and brings you into a new state of mind through personal interpretations of the presentations, its surrounding space, and context.
Its title and design of What is Not Visible is Not Invisible takes inspiration from the artwork of the same title by French artist Julien Discrit, which walks the line between physical and philosophical. At first glance, three infrared lightbulbs are strung from the ceiling in front of an unassuming blank wall. When triggered by the viewer's presence, the bulbs light up to reveal the ultraviolet text on the wall: "What is Not Visible is not Invisible". The work only appears when it is seen, highlighting that to express the invisible, you need to paradoxically have to make it visible.
The artworks in What is Not Visible is Not Invisible are curated to encourage interaction, and to leave room for personal interpretation. Many of the artworks call for you and the environment to play a key role in the artwork and its presentation.
Here are some of the amazing installations that we saw at the preview!
You will be presented the much-celebrated Work No. 262 by British multimedia artist Martin Creed, an installation that engages with the mind and senses as it invites visitors into a space of balloons, to contemplate and respond to the idea of the physical space. You will also will get to see other renowned artwork where FRAC is credited to be the starting platform of many established artists and presents many household artists in its collection such as Gilbert & George, Andy Warhol, and Subodh Gupta whose work will be presented at the National Museum of Singapore's rotunda as part of Singapore Biennale 2016.
Major Tom translates Edith Dekyndt's fascination with the ephemeral and the boundaries of physical reality. The artwork is a large orb that appears visually heavy, but seems to defy gravity and floats freely within the space according to the varying atmospheric conditions - the air circulation, temperature, and your movement. During the course of its movement, the orb draws an imaginary route of a planet or a spacecraft in flight.
In Photomatou by Alain Séchas, 14 posters are created for your to bring home. These posters are adorned with his usual iconic sidekicks - cat motifs that are ever present in his quirky paintings, drawings and sculptures. According to the artist, every visitor will identify with one expression and bring back the poster which most resembles him or her.
Feel the serenity of Blue Sail by Hans Haacke that presents a piece of chiffon seems floating in mid-air and sails from the winds of the oscillating fan placed below it.
You and I, Horizontal by Anthony McCall fascinates you with membranes of lights that shift the spaces within the haze-filled room with membranes of light.
By awed by After DM mural that forms a grid of cuts that evoke the shadow of the Dream Machine's perforations, circular swirls and pulses of the strobe effect.
Freak Star N° 2 by Ann Veronic Janssens, evokes a calming sense of wonder with five beams of light intersect to form an impalpable star.
What is Not Visible Is Not Invisible will be on display starting tomorrow 7 October 2016 to 19 February 2017. The exhibition is open daily from 10am to 7pm, except Thursdays when it opens from 1pm to 7pm. Details on admission and guided tours are available on www.nationalmuseum.sg.
Great exhibition for you to pak thor!


text:
Opinion > Columns
Column: Jerry Falwell Jr.'s day of reckoning
Jerry Falwell Jr. speaks during the last day of the Republican National Convention on Thursday, July 21, 2016, at Quicken Loans Arena in Cleveland, Ohio. (Brian van der Brug/Los Angeles Times/TNS)
Randall Balmer.
For the Valley News
Published: 9/5/2020 10:10:04 PM
Modified: 9/5/2020 10:10:02 PM
My only visit to Liberty University coincided with Jerry Falwell Jr.'s debut before the students as president of the school. I was doing research in the Liberty archives in the fall of 2007 when the archivist announced that the office would be closed for the next hour or so. She directed me to the massive Vines Center, where students gathered for the school year's opening convocation.
Jerry Falwell Jr. presided in his new role (his father, the founder of Moral Majority, had died the previous May), and the convocation's speaker that morning was Jerry Sr.'s younger son, Jonathan, who had taken over his father's other role as pastor of Thomas Road Baptist Church.
The gathering was raucous and celebratory, as I recall. Jerry Falwell Jr., who had been the university's general counsel, was off to a good start.
If you look at the metrics of his 13-year tenure as president, it was very successful. According to The Associated Press, Liberty University, which Jerry Falwell Sr. had founded as Lynchburg Baptist College in 1971, has assets in excess of $2.3 billion today, an increase from $220,000 in 2008. Its endowment totals over $1.7 billion, and its athletic teams compete at the Division I level. The school has 15,000 residential students and 94,000 online students.
By those standards, I suppose, Jerry Falwell Jr. has more than earned the $10.5 million severance allotted to him following his resignation. His unzipped Instagram photo together with disclosures about his wife's extramarital affair (apparently with his knowledge) proved to be his undoing on a campus where students are asked to comply with an honor code that reads in part: "Sexual relations outside of a biblically ordained marriage between a natural-born man and a natural-born woman are not permissible at Liberty University."
It's tempting to speculate that Falwell was merely trying to emulate his political hero, the man in the White House. If so, the former college president still has a ways to go. A sexual entanglement with a pool boy from Florida doesn't exactly rise to the level of a fling with porn star or a Playboy model, and so far there's no evidence of hush money or nondisclosure agreements. Falwell's posting of Ku Klux Klan images in an attempt to taunt the governor of Virginia for a long-ago blackface indiscretion may have been cheap and ill-advised, but it's not the same as heralding "some very fine people" among the white supremacists in Charlottesville or equivocating about accepting the support of a Klan leader.
Jerry Falwell Jr. frequently pointed out that, unlike his father and his brother, he's not an ordained minister and therefore shouldn't be regarded as a moral leader. Fair enough. I suppose his actions have proven his point.
The damage that Falwell has done, however, goes far beyond sexual indiscretions and far beyond Liberty University.
Falwell was one of the first evangelicals to throw his support behind Donald Trump in advance of the 2016 presidential primaries. "In my opinion, Donald Trump lives a life of loving and helping others as Jesus taught in the great commandment," Falwell declared.
Since then, Falwell has been one of Trump's biggest boosters, despite the president's multiple affairs and marriages, despite the self-dealing of Trump's family and members of his administration, despite his astounding number of false or misleading statements (well over 20,000 since his inauguration, according to independent sources). As the St. Louis Post-Dispatch noted, "Trump's shameless dishonesty is outside the bounds not only of presidential behavior but of civilized behavior."
For anyone who lived (as I did) in New York City in the 1980s and 1990s, nothing about Trump's behavior comes as a surprise. His affairs and marriages and bankruptcies provided endless fodder for the tabloids.
But what Falwell provided early in 2016 was religious cover for a garden-variety demagogue, someone who rose to national prominence in part by propagating the false "birther" nonsense that Barack Obama was born in Kenya, not the United States, and was therefore unqualified constitutionally to be president. Given the antipathy toward Hillary Clinton, Trump may very well have ascended to the presidency without it, but Falwell's endorsement provided Trump the veneer of religious legitimacy.
Falwell has been Trump's sycophant ever since. When Trump was caught on tape bragging about being a sexual predator, Falwell dismissed it as locker-room banter. In 2017, Falwell declared that in Trump, "evangelicals have found their dream president." He suggested that evangelicals who don't support Trump may be "immoral" (an odd pronouncement from somewhat who claims not to be a moral leader).
Following Falwell's endorsement, other leaders of the religious right followed his lead — Franklin Graham, Tony Perkins, Robert Jeffress, Ralph Reed, Paula White — and Trump was able to campaign for the presidency not merely as a businessman and a reality TV star but, improbably enough, as a supposed champion of evangelical virtues. He captured 81% of the white evangelical vote.
The rest, as they say, is history — a history that is still unfolding.
Evangelicals believe that when we die, we will be asked to account for how we conducted our lives. On that day of judgment, I suspect that a couple of wayward tweets and a tasteless Instagram post will be the least of Jerry Falwell Jr.'s concerns.
Randall Balmer teaches at Dartmouth College. He is the author of more than a dozen books and one of the contributors to The Spiritual Danger of Donald Trump.
randall balmer

redpajama_set_name: RedPajamaCommonCrawl


text:
Amazon courier sacked after calling customer 'd**khead' in delivery note
Jordan KingFriday 4 Dec 2020 11:31 pm
Amazon customer Mike Daniels, 54, said he was angry at how 'dismissive' Amazon was over the incident (Picture: Kennedy News and Media)
An Amazon courier has been sacked after he called a customer a 'd**k head' in a delivery note.
Mike Daniels, 54, would not give his date of birth to the delivery driver to prove he was over 18 as he was being careful with his data.
After he refused to hand the information over, the courier 'walked off' and left him with his parcel.
He later found the courier had written the package was 'received by D**k Head' on the delivery notice.
MOT business owner Mr Daniels said: 'In this day and age, he's got all the information for me off the boxes. With my date of birth, he could hack my account quite easily and start ordering stuff left, right and centre.
'We see it every day people being hacked or having money taken out of their account. I'm savvy in that respect.
'I'd ordered a caring knife which is an age-restricted item. I'm guessing that's why he needed my date of birth and he didn't say that.
'I'm not being funny but I'm 54 years of age – I don't look like a kid. He could have easily ascertained I'm over 18 years of age for sure.
Mr Daniels was trying to protect his data but got called a 'd**khead' (Picture: Kennedy News and Media)
'Every customer sees that message. He obviously knew I would see that – he wouldn't have done it otherwise.
'We all think it from time to time but you don't voice it let alone write it down somewhere.'
The father-of-three says he was not offended by the slur and sympathises with the 'immense pressure delivery guys are under at the moment'.
However, he adds that it was 'wrong' to put the offensive name on the delivery report.
He has complained to Amazon but claims they were 'dismissive' over the incident – despite him spending more than £800 with the company this year alone.
He said: 'It was like: "oh, I'll fill a form in and send it off to the relevant department".
'It's up to them what they need to do internally, but what are they going to do about it to make the drivers aware it isn't acceptable.
Mr Daniels said the courier should have been able to see he was over 18 (Picture: Kennedy News and Media)
'[Amazon is] a professional company. If he'd have said it to my face I would have gone: "fair enough I can deal with that" but for it to be put on their data so it's there forever.
'I'm sure the guy had had a tough day and didn't need me not giving my date of birth but to my mind, it was with good reasoning. What hacked me off with Amazon's approach to it.'
An Amazon spokesperson said: 'This is unacceptable and does not meet the high standards for our delivery service providers and how they serve our customers.
'We are taking this matter seriously, and will be ensuring this driver does not work for us again. We have reached out to the customer to make it right.'
Get in touch with our news team by emailing us at webnews@metro.co.uk.
For more stories like this, check our news page.
Amazon delivery driver 'caught doing a poo' outside customer's home
'Lazy' delivery driver caught hurling Amazon parcel over fence into garden


David Haslam went for the jugular in his criticism of Hinduism and its caste system ( Face to faith, November 18). He needs to be reminded that Hindus have never carried out crusades against other religions and have sheltered Jews, Parsees and Bahais. It is also a fact that even after converting to Christianity, the caste system persists among the newly baptised. Buddhists and Sikhs too have castes.
Rev Haslam laments the fact that six Indian states have passed anti-conversion bills despite India's constitution guaranteeing religious freedom. Christians practise their faith without any fear or persecution in India, but there is a problem of missionaries targeting the poor and vulnerable - Haslam alludes to this by saying 500 Dalits were baptised with "Lord's Prayers".
No one denies that the abuse of the caste system in Hinduism is a huge problem. But, right from the time India gained independence, discrimination on the grounds of caste has been outlawed: jobs and places in educational establishments are reserved for the marginalised castes, and Dalits have occupied some of the highest positions in Indian society. It takes longer, however, to change hearts and minds. Interfaith dialogue on this issue is welcome, and Hindu leaders would endorse any positive steps that can be taken.
Haslam reports that, according to some Dalit activists, the psychology behind the caste system "is rooted in the Hindu scriptures, the Rig Veda and the writings of Manu. These are derogatory about Dalits, teaching that the Brahmin came from God's head, the Kshatriya from his arms, the Vaisya his thighs and the Sudra his feet. Dalits do not figure and are therefore sub-human and polluted."
The fact is that, at the time of the scriptures, there were only four castes. All these were like parts of a human body, working together for the common good and all equally important. Over the following centuries the caste system came to be abused, and a fifth class of people - the Dalits - were identified.
In the Bhagvad Gita, the Bible of the Hindus, Lord Krishna says that a learned man will look upon all living beings as equal. Haslam concludes by saying: "Moderate Hindus ... need urgently to demonstrate that Hinduism can be transformed in a way which entirely eliminates the shameful effects of caste."
Most Hindus abhor the abuse of the caste system, and they are not afraid to tackle injustices. However, they do it by democratic, non-violent ways and that is why Dr Ambedkar - the Dalit hero, as Haslam puts it - is also the hero of Hindus. It would also help if Christian missionaries did not play a numbers game and target the Dalits for conversion.
Haslam then goes on to wonder whether Hinduism will survive without the caste system. I can assure him that Hinduism, the oldest religion, will not only survive but thrive as an increasingly troubled world searches for peace and happiness. Yoga, meditation, vegetarianism and the deep philosophical wisdom of Hinduism continue to attract a huge number of people in the west, and the temples are overflowing.


text:
Lipopolysaccharide-Induced Chorioamnionitis Is Confined to One Amniotic Compartment in Twin Pregnant Sheep
Markus Gantert, Reint K. Jellema, Heike Heineman, Julia Gantert, Jennifer J. P. Collins, Matthias Seehase, Verena A. C. Lambermont, Alexander Keck, Yves Garnier, Luc J. I. Zimmermann, Mahmed Kadyrov, A. W. Danilo Gavilanes, Boris W. Kramer*
MA Kindergeneeskunde
Kindergeneeskunde
MA Medische Staf Kindergeneeskunde
Psychiatrie & Neuropsychologie
MHeNs School for Mental Health and Neuroscience
GROW - School for Oncology and Reproduction
6 Citations (Web of Science)
Background: Chorioamnionitis is a major risk factor for pre-term birth in multifetal pregnancies. However, there is little clinical data whether chorioamnionitis is restricted to one amniotic compartment in multifetal pregnancies. Objective: To explore whether chorioamnionitis is confined to the exposed compartment and does not cross to the unaffected fetus in twin pregnancy. Methods: In twin pregnant sheep, one of the twins was exposed to either 2 or 14 days of intra-amniotic lipopolysaccharide (LPS) while the co-twin was exposed to either 2 or 14 days of intra-amniotic saline (n = 3 for each exposure). Singletons were included in this study to compare the grade of inflammation with twins. All fetuses were delivered at 125 days of gestation (term = 150 days). Chorioamnionitis was confirmed by histological examination. Lung inflammation was assessed by cell count in bronchoalveolar lavage. Lung compliance was assessed at 40 cm H2O. Results were compared using analysis of variance (ANOVA) with a post-hoc Tukey analysis. Results: Inflammation in placenta, membranes and lung of LPS-exposed twins was significantly higher after 2 and 14 days of exposure when compared to the saline-exposed co-twins. Lung compliance in LPS-exposed twins was significantly increased after 14 days when compared to saline-exposed co-twins. Intrauterine LPS exposure increased lung compliance and inflammation in the membranes, placenta and lung to the same extent in twins as in singletons. Conclusion: In twin pregnant sheep, inflammation of the membranes, placenta and fetal lung was strictly limited to the exposed fetus in the amniotic compartment in which the LPS was injected.
Delayed interval delivery
Gantert, M., Jellema, R. K., Heineman, H., Gantert, J., Collins, J. J. P., Seehase, M., Lambermont, V. A. C., Keck, A., Garnier, Y., Zimmermann, L. J. I., Kadyrov, M., Gavilanes, A. W. D., & Kramer, B. W. (2012). Lipopolysaccharide-Induced Chorioamnionitis Is Confined to One Amniotic Compartment in Twin Pregnant Sheep. Neonatology, 102(2), 81-88. https://doi.org/10.1159/000338015
Gantert, Markus ; Jellema, Reint K. ; Heineman, Heike et al. / Lipopolysaccharide-Induced Chorioamnionitis Is Confined to One Amniotic Compartment in Twin Pregnant Sheep. In: Neonatology. 2012 ; Vol. 102, No. 2. pp. 81-88.
@article{ded1fa4cfe1b49aeb4b97719ba1fd668,
title = "Lipopolysaccharide-Induced Chorioamnionitis Is Confined to One Amniotic Compartment in Twin Pregnant Sheep",
abstract = "Background: Chorioamnionitis is a major risk factor for pre-term birth in multifetal pregnancies. However, there is little clinical data whether chorioamnionitis is restricted to one amniotic compartment in multifetal pregnancies. Objective: To explore whether chorioamnionitis is confined to the exposed compartment and does not cross to the unaffected fetus in twin pregnancy. Methods: In twin pregnant sheep, one of the twins was exposed to either 2 or 14 days of intra-amniotic lipopolysaccharide (LPS) while the co-twin was exposed to either 2 or 14 days of intra-amniotic saline (n = 3 for each exposure). Singletons were included in this study to compare the grade of inflammation with twins. All fetuses were delivered at 125 days of gestation (term = 150 days). Chorioamnionitis was confirmed by histological examination. Lung inflammation was assessed by cell count in bronchoalveolar lavage. Lung compliance was assessed at 40 cm H2O. Results were compared using analysis of variance (ANOVA) with a post-hoc Tukey analysis. Results: Inflammation in placenta, membranes and lung of LPS-exposed twins was significantly higher after 2 and 14 days of exposure when compared to the saline-exposed co-twins. Lung compliance in LPS-exposed twins was significantly increased after 14 days when compared to saline-exposed co-twins. Intrauterine LPS exposure increased lung compliance and inflammation in the membranes, placenta and lung to the same extent in twins as in singletons. Conclusion: In twin pregnant sheep, inflammation of the membranes, placenta and fetal lung was strictly limited to the exposed fetus in the amniotic compartment in which the LPS was injected. ",
keywords = "Chorioamnionitis, Twin pregnancy, Delayed interval delivery, Preterm birth",
author = "Markus Gantert and Jellema, {Reint K.} and Heike Heineman and Julia Gantert and Collins, {Jennifer J. P.} and Matthias Seehase and Lambermont, {Verena A. C.} and Alexander Keck and Yves Garnier and Zimmermann, {Luc J. I.} and Mahmed Kadyrov and Gavilanes, {A. W. Danilo} and Kramer, {Boris W.}",
journal = "Neonatology",
publisher = "Karger",
Gantert, M, Jellema, RK, Heineman, H, Gantert, J, Collins, JJP, Seehase, M, Lambermont, VAC, Keck, A, Garnier, Y, Zimmermann, LJI, Kadyrov, M, Gavilanes, AWD & Kramer, BW 2012, 'Lipopolysaccharide-Induced Chorioamnionitis Is Confined to One Amniotic Compartment in Twin Pregnant Sheep', Neonatology, vol. 102, no. 2, pp. 81-88. https://doi.org/10.1159/000338015
Lipopolysaccharide-Induced Chorioamnionitis Is Confined to One Amniotic Compartment in Twin Pregnant Sheep. / Gantert, Markus; Jellema, Reint K.; Heineman, Heike et al.
In: Neonatology, Vol. 102, No. 2, 2012, p. 81-88.
T1 - Lipopolysaccharide-Induced Chorioamnionitis Is Confined to One Amniotic Compartment in Twin Pregnant Sheep
AU - Gantert, Markus
AU - Jellema, Reint K.
AU - Heineman, Heike
AU - Gantert, Julia
AU - Collins, Jennifer J. P.
AU - Seehase, Matthias
AU - Lambermont, Verena A. C.
AU - Keck, Alexander
AU - Garnier, Yves
AU - Zimmermann, Luc J. I.
AU - Kadyrov, Mahmed
AU - Gavilanes, A. W. Danilo
AU - Kramer, Boris W.
N2 - Background: Chorioamnionitis is a major risk factor for pre-term birth in multifetal pregnancies. However, there is little clinical data whether chorioamnionitis is restricted to one amniotic compartment in multifetal pregnancies. Objective: To explore whether chorioamnionitis is confined to the exposed compartment and does not cross to the unaffected fetus in twin pregnancy. Methods: In twin pregnant sheep, one of the twins was exposed to either 2 or 14 days of intra-amniotic lipopolysaccharide (LPS) while the co-twin was exposed to either 2 or 14 days of intra-amniotic saline (n = 3 for each exposure). Singletons were included in this study to compare the grade of inflammation with twins. All fetuses were delivered at 125 days of gestation (term = 150 days). Chorioamnionitis was confirmed by histological examination. Lung inflammation was assessed by cell count in bronchoalveolar lavage. Lung compliance was assessed at 40 cm H2O. Results were compared using analysis of variance (ANOVA) with a post-hoc Tukey analysis. Results: Inflammation in placenta, membranes and lung of LPS-exposed twins was significantly higher after 2 and 14 days of exposure when compared to the saline-exposed co-twins. Lung compliance in LPS-exposed twins was significantly increased after 14 days when compared to saline-exposed co-twins. Intrauterine LPS exposure increased lung compliance and inflammation in the membranes, placenta and lung to the same extent in twins as in singletons. Conclusion: In twin pregnant sheep, inflammation of the membranes, placenta and fetal lung was strictly limited to the exposed fetus in the amniotic compartment in which the LPS was injected.
AB - Background: Chorioamnionitis is a major risk factor for pre-term birth in multifetal pregnancies. However, there is little clinical data whether chorioamnionitis is restricted to one amniotic compartment in multifetal pregnancies. Objective: To explore whether chorioamnionitis is confined to the exposed compartment and does not cross to the unaffected fetus in twin pregnancy. Methods: In twin pregnant sheep, one of the twins was exposed to either 2 or 14 days of intra-amniotic lipopolysaccharide (LPS) while the co-twin was exposed to either 2 or 14 days of intra-amniotic saline (n = 3 for each exposure). Singletons were included in this study to compare the grade of inflammation with twins. All fetuses were delivered at 125 days of gestation (term = 150 days). Chorioamnionitis was confirmed by histological examination. Lung inflammation was assessed by cell count in bronchoalveolar lavage. Lung compliance was assessed at 40 cm H2O. Results were compared using analysis of variance (ANOVA) with a post-hoc Tukey analysis. Results: Inflammation in placenta, membranes and lung of LPS-exposed twins was significantly higher after 2 and 14 days of exposure when compared to the saline-exposed co-twins. Lung compliance in LPS-exposed twins was significantly increased after 14 days when compared to saline-exposed co-twins. Intrauterine LPS exposure increased lung compliance and inflammation in the membranes, placenta and lung to the same extent in twins as in singletons. Conclusion: In twin pregnant sheep, inflammation of the membranes, placenta and fetal lung was strictly limited to the exposed fetus in the amniotic compartment in which the LPS was injected.
KW - Chorioamnionitis
KW - Twin pregnancy
KW - Delayed interval delivery
KW - Preterm birth
JO - Neonatology
JF - Neonatology
Gantert M, Jellema RK, Heineman H, Gantert J, Collins JJP, Seehase M et al. Lipopolysaccharide-Induced Chorioamnionitis Is Confined to One Amniotic Compartment in Twin Pregnant Sheep. Neonatology. 2012;102(2):81-88. doi: 10.1159/000338015


Definition: A direct contrast in which two sets if figures are set in opposition to one another.(11) Perhaps the best example of this in the New Testament is found in Romans 5:12, where Adam and Christ are the two figure being contrasted.... Examples of Oxymoron in Sentences Ever wondered how your favorite plays, dramas, poems, novels, and movies would be like if figures of speech and other literary devices never existed? Everything we read and write would be nothing but plain and redundant in form.
Example: Crusted flower pots, rusted nails, broken sheds Metaphor - -a figure of speech containing a comparison of two things on the basis of a shared quality as if one thing were the other.... Onomatopoeia Examples Onomatopoeia is when a word's pronunciation imitates its sound. When you say an onomatopoeic word, the utterance itself is reminiscent of the sound to which the word refers.
Title: Figures of Speech 1 Figures of Speech. By Irene Ricks; 2 Metaphor. Definition something used, or regarded as being used, to represent something else lessence du bonheur pdf Literal and figurative language is a distinction within some fields of language analysis, in particular stylistics, rhetoric, and semantics. Literal language uses words exactly according to their conventionally accepted meanings or denotation .
Example: Crusted flower pots, rusted nails, broken sheds Metaphor - -a figure of speech containing a comparison of two things on the basis of a shared quality as if one thing were the other. roland barthes the structuralist activity pdf Literal and figurative language is a distinction within some fields of language analysis, in particular stylistics, rhetoric, and semantics. Literal language uses words exactly according to their conventionally accepted meanings or denotation .
A concise definition of Climax (Figure of Speech) along with usage tips, an expanded explanation, and lots of examples. A concise definition of Climax (Figure of Speech) along with usage tips, a deeper explanation, and lots of examples.
Literal and figurative language is a distinction within some fields of language analysis, in particular stylistics, rhetoric, and semantics. Literal language uses words exactly according to their conventionally accepted meanings or denotation .


text:
package org.apache.commons.functor.example.lines;

import org.apache.commons.functor.BinaryFunction;

/**
 * @version $Revision: 1345136 $ $Date: 2012-06-01 09:47:06 -0300 (Fri, 01 Jun 2012) $
 */
public class Sum implements BinaryFunction<Number, Number, Integer> {
    public Integer evaluate(Number left, Number right) {
        return left.intValue() + right.intValue();
    }

    public static final Sum instance() {
        return INSTANCE;
    }

    private static final Sum INSTANCE = new Sum();
}


text:
Cayman Turtle Centre Celebrates New Debt-Free Status
Cayman Turtle Conservation and Education Centre: Island Wildlife Encounter is pleased to announce that it is now free of all its long-term debt, having now fully paid down the final balance on what originally was the equivalent of just over 50 million CI dollars that was borrowed between 2004 and 2009 primarily to build the facility.
In 2001 after Hurricane Michelle destroyed most of the facilities of the seaside location it was decided the Cayman Turtle Farm, as it was called at the time, should be extensively rebuilt across Northwest Point Road on the far less vulnerable land side. The loan financed the creation of the new facility to turn the operation into a state-of-the-art world-class tourist attraction and an enhanced scientific and conservation organisation. As a result, the Turtle Centre is now the premier land-based attraction in the Cayman Islands, and producing for the country a very significant positive economic impact from over a quarter million tourists a year who visit the Centre. In addition, the Centre has collaborated in over 150 published scientific studies and projects and made numerous advances in marine sea turtle conservation through its extensive programmes.
Since that time, the government has supported the facility by making regular equity injection payments every quarter to repay the debt as well as help with operating costs. Loans extended by local banks First Caribbean International Bank Cayman Islands and Cayman National Bank have already been paid off, back in 2017 and 2016 respectively, with the large initial bond of 44.6 million US dollars being finally paid off on 1 March this year.
"It's a monumental day in an organisation's history when it not only has paid off one major financial debt instrument but multiple loans, and when that organisation can call themselves debt free where all long term debt has been fulfilled," Ministry of Tourism Chief Officer, Stran Bodden said. "Being debt free puts an organisation in a much stronger position to be able to negotiate with stakeholders, develop new partnerships and establish new opportunities to grow.
"Government understands the benefit of the Cayman Turtle Centre and has supported it financially wherever possible, because it sees Cayman Turtle Centre as being both innovative and creative to increase revenue streams. We applaud the continued determination of the Centre to serve the Cayman Islands both as a top-notch tourist attraction as well as the leader in the area of sea turtle conservation, education and scientific study." Mr. Bodden continued, "We have seen many improvements in operational costs through the continued drive to move forward and find new ways to advance. Turtle Centre is driven to uncover new options, and looking at new ways of diversification."
The new debt-free status of Cayman Turtle Centre means that in future, the Government's financial injections will not only be significantly reduced, but will also be used solely for making the day-to-day running of the facility more competitive, as it pursues its goals of reaching out to more visitors than ever before. Year by year the attraction provides additional benefits via enticing tourists onto the island and providing them with memorable and unique experiences, generating economic activity supporting not just the 100-plus Caymanians who are employed there, but through all the revenue consistently being generated from related tourist businesses: the second pillar of the country's economy. That involves a large number of tour operators, tour boats, taxis, restaurants and stores that benefit so much, and to a significant extent depend on the visitor traffic generated by Cayman's premier land-based attraction.
Cayman Turtle Centre's Chief Executive Officer, Timothy Adam, said, "This is indeed a significant milestone. It has been achieved by the ongoing support of the Cayman Islands Government through all these years, especially the Ministry of Tourism. They understood the importance of sustaining our mission both in attracting large numbers of tourists as well as in marine turtle conservation, scientific study, and education. This success is also a testament to the wise guidance of our Board of Directors, our management team and our staff who year after year have dedicated their time and energy in fulfilling our mission."
"Being finally free of that debt means that, in effect, that support from this point on can be directly focused on our mission. We can continue improving the island wildlife encounter experience as Cayman's number one land-based attraction for our 300,000 guests annually including residents, visitors to Cayman, schools and other groups and in so doing, keep the Cayman Turtle Centre shining as a real jewel in the Cayman Islands' Crown," Mr. Adam continued.
"We are grateful to the Cayman Islands Government, and by extension, the people of the Cayman Islands, who have never stopped believing in, and supporting us. With the news of our debt-free status, as well as the report from the genetic study conducted by the University of Barcelona, the University of Exeter and the Department of Environment which has shown beyond any shadow of doubt the efficacy of our conservation measures, is our way of repaying all the faith and trust they have put in us over the years," Mr. Adam said.
Brian Wight, Chairman of the Board for Cayman Turtle Centre, went on to say, "It is often quoted that the more you know about something, the more you want to protect it. From now on Cayman Turtle Centre will be freer to focus on providing an even better experience to more people, from the thousands of visitors who come every week, to schools and universities, including those involved in ground breaking scientific investigation. We want people to enjoy the fun and adventure when visiting while learning more about how to conserve these majestic creatures that have swum through the worlds' oceans since before the time of the dinosaurs."
News of the final debt payment follows the positive results from a report, which shows by clear scientific evidence that nine out of every ten green turtles that are coming home to breed in our waters and nest on Cayman's beaches are related to turtles released from the Turtle Centre. This report is based on a genetic study conducted by scientists from the University of Barcelona and University of Exeter, in collaboration with the Cayman Islands Department of Environment and Cayman Turtle Centre. It also points to comparison data from the 1980's when the release program was starting to gather momentum to now, that the number of nests on Cayman's beaches has gone from zero to nearly 200 per year. Last year, in celebration of the Centre's 50th Anniversary, more than 1,300 turtles were released, continuing the Centre's success story.
For more information, call the Cayman Turtle Centre: Island Wildlife Encounter on 345-949-3894, email us at info@turtle.ky, visit us online at www.turtle.ky or find us on Facebook at https://www.facebook.com/CaymanTurtleCentre/.


Coming full circle, these jugs is created by authentic recycled wine bottles the color, thickness, and bottom shape differ from jug to jug. Most of the bottles are collected from the community in Berlin and are as unique as each bottle they are cut from.
During our process the jug are fire polished to make a smooth, even, rounded rim and two indentations are manufactured on both sides of the jug, then is the spout drawn out of the top of the bottle to give it is unique feel and appearance. The final step of the production stress relieves the glass and makes them dishwasher safe so you can enjoy using the jug for years to come.
This jug makes an earth-friendly addition to your kitchen, also great for use in restaurants, bars, and cafes.