viernes, 29 de marzo de 2019

16 Highest Paying URL Shortener to Earn Money Online 2019

  1. Clk.sh: Clk.sh is a newly launched trusted link shortener network, it is a sister site of shrinkearn.com. I like ClkSh because it accepts multiple views from same visitors. If any one searching for Top and best url shortener service then i recommend this url shortener to our users. Clk.sh accepts advertisers and publishers from all over the world. It offers an opportunity to all its publishers to earn money and advertisers will get their targeted audience for cheapest rate. While writing ClkSh was offering up to $8 per 1000 visits and its minimum cpm rate is $1.4. Like Shrinkearn, Shorte.st url shorteners Clk.sh also offers some best features to all its users, including Good customer support, multiple views counting, decent cpm rates, good referral rate, multiple tools, quick payments etc. ClkSh offers 30% referral commission to its publishers. It uses 6 payment methods to all its users.
    • Payout for 1000 Views: Upto $8
    • Minimum Withdrawal: $5
    • Referral Commission: 30%
    • Payment Methods: PayPal, Payza, Skrill etc.
    • Payment Time: Daily

  2. Shrinkearn.com: Shrinkearn.com is one of the best and most trusted sites from our 30 highest paying URL shortener list.It is also one of the old URL shortener sites.You just have to sign up in the shrinkearn.com website. Then you can shorten your URL and can put that URL to your website, blog or any other social networking sites.
    Whenever any visitor will click your shortener URL link you will get some amount for that click.The payout rates from Shrinkearn.com is very high.You can earn $20 for 1000 views.Visitor has to stay only for 5 seconds on the publisher site and then can click on skip button to go to the requesting site.
    • The payout for 1000 views- up to $20
    • Minimum payout-$1
    • Referral commission-25%
    • Payment methods-PayPal
    • Payment date-10th day of every month

  3. Linkrex.net: Linkrex.net is one of the new URL shortener sites.You can trust it.It is paying and is a legit site.It offers high CPM rate.You can earn money by sing up to linkrex and shorten your URL link and paste it anywhere.You can paste it in your website or blog.You can paste it into social media networking sites like facebook, twitter or google plus etc.
    You will be paid whenever anyone will click on that shorten a link.You can earn more than $15 for 1000 views.You can withdraw your amount when it reaches $5.Another way of earning from this site is to refer other people.You can earn 25% as a referral commission.
    • The payout for 1000 views-$14
    • Minimum payout-$5
    • Referral commission-25%
    • Payment Options-Paypal,Bitcoin,Skrill and Paytm,etc
    • Payment time-daily

  4. Linkbucks: Linkbucks is another best and one of the most popular sites for shortening URLs and earning money. It boasts of high Google Page Rank as well as very high Alexa rankings. Linkbucks is paying $0.5 to $7 per 1000 views, and it depends on country to country.
    The minimum payout is $10, and payment method is PayPal. It also provides the opportunity of referral earnings wherein you can earn 20% commission for a lifetime. Linkbucks runs advertising programs as well.
    • The payout for 1000 views-$3-9
    • Minimum payout-$10
    • Referral commission-20%
    • Payment options-PayPal,Payza,and Payoneer
    • Payment-on the daily basis

  5. Adf.ly: Adf.ly is the oldest and one of the most trusted URL Shortener Service for making money by shrinking your links. Adf.ly provides you an opportunity to earn up to $5 per 1000 views. However, the earnings depend upon the demographics of users who go on to click the shortened link by Adf.ly.
    It offers a very comprehensive reporting system for tracking the performance of your each shortened URL. The minimum payout is kept low, and it is $5. It pays on 10th of every month. You can receive your earnings via PayPal, Payza, or AlertPay. Adf.ly also runs a referral program wherein you can earn a flat 20% commission for each referral for a lifetime.
  6. Wi.cr: Wi.cr is also one of the 30 highest paying URL sites.You can earn through shortening links.When someone will click on your link.You will be paid.They offer $7 for 1000 views.Minimum payout is $5.
    You can earn through its referral program.When someone will open the account through your link you will get 10% commission.Payment option is PayPal.
    • Payout for 1000 views-$7
    • Minimum payout-$5
    • Referral commission-10%
    • Payout method-Paypal
    • Payout time-daily

  7. Cut-win: Cut-win is a new URL shortener website.It is paying at the time and you can trust it.You just have to sign up for an account and then you can shorten your URL and put that URL anywhere.You can paste it into your site, blog or even social media networking sites.It pays high CPM rate.
    You can earn $10 for 1000 views.You can earn 22% commission through the referral system.The most important thing is that you can withdraw your amount when it reaches $1.
    • The payout for 1000 views-$10
    • Minimum payout-$1
    • Referral commission-22%
    • Payment methods-PayPal, Payza, Bitcoin, Skrill, Western Union and Moneygram etc.
    • Payment time-daily

  8. Ouo.io: Ouo.io is one of the fastest growing URL Shortener Service. Its pretty domain name is helpful in generating more clicks than other URL Shortener Services, and so you get a good opportunity for earning more money out of your shortened link. Ouo.io comes with several advanced features as well as customization options.
    With Ouo.io you can earn up to $8 per 1000 views. It also counts multiple views from same IP or person. With Ouo.io is becomes easy to earn money using its URL Shortener Service. The minimum payout is $5. Your earnings are automatically credited to your PayPal or Payoneer account on 1st or 15th of the month.
    • Payout for every 1000 views-$5
    • Minimum payout-$5
    • Referral commission-20%
    • Payout time-1st and 15th date of the month
    • Payout options-PayPal and Payza

  9. LINK.TL: LINK.TL is one of the best and highest URL shortener website.It pays up to $16 for every 1000 views.You just have to sign up for free.You can earn by shortening your long URL into short and you can paste that URL into your website, blogs or social media networking sites, like facebook, twitter, and google plus etc.
    One of the best thing about this site is its referral system.They offer 10% referral commission.You can withdraw your amount when it reaches $5.
    • Payout for 1000 views-$16
    • Minimum payout-$5
    • Referral commission-10%
    • Payout methods-Paypal, Payza, and Skrill
    • Payment time-daily basis

  10. Bc.vc: Bc.vc is another great URL Shortener Site. It provides you an opportunity to earn $4 to $10 per 1000 visits on your Shortened URL. The minimum withdrawal is $10, and the payment method used PayPal or Payoneer.
    Payments are made automatically on every seven days for earnings higher than $10.00. It also runs a referral system wherein the rate of referral earning is 10%.
    • The payout for 1000 views-$10
    • Minimum payout -$10
    • Referral commission-10%
    • Payment method -Paypal
    • Payment time-daily

  11. Oke.io: Oke.io provides you an opportunity to earn money online by shortening URLs. Oke.io is a very friendly URL Shortener Service as it enables you to earn money by shortening and sharing URLs easily.
    Oke.io can pay you anywhere from $5 to $10 for your US, UK, and Canada visitors, whereas for the rest of the world the CPM will not be less than $2. You can sign up by using your email. The minimum payout is $5, and the payment is made via PayPal.
    • The payout for 1000 views-$7
    • Minimum payout-$5
    • Referral commission-20%
    • Payout options-PayPal, Payza, Bitcoin and Skrill
    • Payment time-daily

  12. Short.pe: Short.pe is one of the most trusted sites from our top 30 highest paying URL shorteners.It pays on time.intrusting thing is that same visitor can click on your shorten link multiple times.You can earn by sign up and shorten your long URL.You just have to paste that URL to somewhere.
    You can paste it into your website, blog, or social media networking sites.They offer $5 for every 1000 views.You can also earn 20% referral commission from this site.Their minimum payout amount is only $1.You can withdraw from Paypal, Payza, and Payoneer.
    • The payout for 1000 views-$5
    • Minimum payout-$1
    • Referral commission-20% for lifetime
    • Payment methods-Paypal, Payza, and Payoneer
    • Payment time-on daily basis

  13. Fas.li: Although Fas.li is relatively new URL Shortener Service, it has made its name and is regarded as one of the most trusted URL Shortener Company. It provides a wonderful opportunity for earning money online without spending even a single $. You can expect to earn up to $15 per 1000 views through Fas.li.
    You can start by registering a free account on Fas.li, shrink your important URLs, and share it with your fans and friends in blogs, forums, social media, etc. The minimum payout is $5, and the payment is made through PayPal or Payza on 1st or 15th of each month.
    Fas.li also run a referral program wherein you can earn a flat commission of 20% by referring for a lifetime. Moreover, Fas.li is not banned in anywhere so you can earn from those places where other URL Shortening Services are banned.
  14. BIT-URL: It is a new URL shortener website.Its CPM rate is good.You can sign up for free and shorten your URL and that shortener URL can be paste on your websites, blogs or social media networking sites.bit-url.com pays $8.10 for 1000 views.
    You can withdraw your amount when it reaches $3.bit-url.com offers 20% commission for your referral link.Payment methods are PayPal, Payza, Payeer, and Flexy etc.
    • The payout for 1000 views-$8.10
    • Minimum payout-$3
    • Referral commission-20%
    • Payment methods- Paypal, Payza, and Payeer
    • Payment time-daily

  15. CPMlink: CPMlink is one of the most legit URL shortener sites.You can sign up for free.It works like other shortener sites.You just have to shorten your link and paste that link into the internet.When someone will click on your link.
    You will get some amount of that click.It pays around $5 for every 1000 views.They offer 10% commission as the referral program.You can withdraw your amount when it reaches $5.The payment is then sent to your PayPal, Payza or Skrill account daily after requesting it.
    • The payout for 1000 views-$5
    • Minimum payout-$5
    • Referral commission-10%
    • Payment methods-Paypal, Payza, and Skrill
    • Payment time-daily

  16. Short.am: Short.am provides a big opportunity for earning money by shortening links. It is a rapidly growing URL Shortening Service. You simply need to sign up and start shrinking links. You can share the shortened links across the web, on your webpage, Twitter, Facebook, and more. Short.am provides detailed statistics and easy-to-use API.
    It even provides add-ons and plugins so that you can monetize your WordPress site. The minimum payout is $5 before you will be paid. It pays users via PayPal or Payoneer. It has the best market payout rates, offering unparalleled revenue. Short.am also run a referral program wherein you can earn 20% extra commission for life.

Return To Planet X Game For Android APK And OBB Link

Today Gaming Guruji has brought you, Return to Planet X, which is another premium action game for android and if you loved to play Slaughter 2 game than you are going to enjoy this action game too.
Return to planet x game Android

Game story is something like that you are all alone left in another planet at some secret military base, all your other teammates has been died and now you have to complete the mission all alone where you will face alien bugs who looks like spiders.

You will find weapons, medical kit and other stuff in safe. To open the Safe, just go near to it and when you see a wrench symbol on that just toch that.. That is how you interact with objects in the game.

Return to planet x game may be liked by those who love to play offline and less violent game, if you love to play offline first person shooting game and violence than you should try Modern combat 4 or Max payne on android device.

This game's sound create the game environment so scary and as there is not much light and you'll see Skeltons, dead alien bugs and some other stuff, you might not have seen in other games.

As far as armour you get in this game, Return to planet x, are Laser guns, grenades, explosives, machine gun and flamethrower.

I would say game is good and you can try it if you play offline games and you are kind of first person shooting game lovers as It is the first person shooting game.

Because of good graphics and different kind of Game story, you'll definitely enjoy it but what I found that game controls are bit different in the game which you can not customize except sensitivity but it's ok.

How to Install Return to planet x Game on Android :

  1. Go to settings ->Security.
  2. Go to Security menu and check Unknown Sources check box first.
  3. Get the RTPX data that are mostly in obb format. 
  4. Extract the Return to Planet X Game obb file by using any zip extractor.
  5. Now after extracting you have a folder with obb file(s). Put this folder or directly extract into the location internal memory/Android/obb/. 
    Note: Don't put the obb file without folder because you need to provide the correct path.
  6. Extract apk from zip file and Install APK. 
  7. Now run your game without any errors.

You can get Return to Planet X game from play store at $8 or ₹590 or check out the below links.

APK LINK




OBB LINK

The Dark Secret... / L'Oscuro Segreto...

ENGLISH
Halloween Knight 2 hides a dark secret: among its levels there are 3 that hide a secret passage. Each of them will let you discover a fragment of a mysterious password: type it at the title screen to reveal the arcane (be sure to enter it in uppecase).
Below you can find some clues that will help you in the search.

ITALIANO
Halloween Knight 2 nasconde un oscuro segreto: tra i suoi livelli ce ne sono 3 che celano un passaggio segreto, passaggio che vi porterà a scoprire ognuno un frammento di una parola chiave che, inserita alla schermata del titolo (scrivetela tutta in maiuscolo, mi raccomando) svelerà l'arcano...
Qui di seguito troverete qualche indizio che vi aiuterà nella ricerca.
1. Tu non puoi vedere ciò che il cavaliere vede.
1. You can't see what the Knight sees.













2. La pazienza è la virtù dei forti.
2. Patience is a great virtue.













3. Fare prima ciò che deve essere fatto dopo.
3. Do first what it must be done after.

Rise Of The Valiant


This is part of The Kingdoms storyline series. As it unfolds you will read how one marooned space captain's quest for revenge snowballs into a strong, proud Empire dedicated to upholding justice. Edge Valiant has suffered a mutiny aboard his previous ship the Indomitable and been stranded on an unknown planet. His only belongings are a broken matter manipulator attached to his wrist and the meager clothes on his back. Forced to survive on an alien world, Edge is determined to not only survive, but to rebuild and track down those who have wronged him.

Table of Contents

jueves, 28 de marzo de 2019

WWE 2K17 GAME ON ANDROID FOR FREE !

WWE 2K17 ON ANDROID FOR FREE !


ʜᴏᴡ ᴛᴏ ᴅᴏᴡɴʟᴏᴀᴅ ᴀɴᴅ ɪɴsᴛᴀʟʟ ɪɴ ʏᴏᴜ ᴀɴᴅʀᴏɪᴅ ᴅᴇᴠɪᴄᴇ

Download the wwe2k17 PSP by falcon arrow.

Download the save data file (Zipfile).

Then download the ppssp.in(Fix Data)

Download all three File Extract the second file ( save data ) copy that and go into your ppsspp emulator file paste in Savedata folder then copy the third file go to your ppsspp emulator folder paste it in the system folder.

Now open Emulator finds the folder where you download the first file you will wwe2k17 game open and Enjoy.

You'll Need ZArchiever App You Can Download It For Free From PlayStore.

PPSSPP GOLD DOWNLOAD PPSSPP GOLD

[DOWNLOAD ALL 3 FILES BELOW]


▪️ WWE 2K17 Iso: DOWNLOAD 2K17 ISO
▪️ WWE 2K17 SAVE DATA: DOWNLOAD 2K17 SAVE DATA
▪️ WWE 2K17 FIX DATA: DOWNLOAD 2K17 FIX DATA

➡️SUBSCRIBE OUR YOUTUBE CHANNEL

How To Download Prince Of Persia Shadow



Welcome to my channel. My name is Ashik.


Awesome screenshots in this game---








First you will download this apk
APK : https://oceanofapk.com/HereYouGo.php

Then you will install this apk. After installing you will click your apk and enjoy this game. So friends plzz
my channel 
               Tnx!!!! 

Explore Simple Game Algorithms With Color Walk: Part 8

We're continuing this ongoing saga of different game algorithms using the simple game Color Walk. In the last post we started exploring the fundamental graph search algorithms with breadth-first search (BFS), because after all, the full set of move choices and resulting board positions of any game can be arranged as a graph. After looking at BFS and finding that we can nominally improve the search for shortest number of moves, on average, it's time we look at the close sibling of BFS: depth-first search (DFS). We'll quickly run into performance issues just like we did for BFS, but let's see if we can come up with a reasonable way to limit DFS so that it can be a useful algorithm.

DFS in Theory


We saw in the last post that BFS searches a graph (or in the case of games like Color Walk, a tree of board positions generated from moves) one level at a time. All child nodes of the root are searched before any of the children's child nodes are searched, and so forth until the desired search criteria is met. In the case of DFS, the opposite is done. One branch of the tree is searched all the way down to its left-most leaf node, which in the case of game move trees is the end-of-game condition, and then the algorithm backs up and searches down the next branch. The process is repeated until the entire tree is searched, and then the optimal node or path to that node is returned as the result. The following picture illustrates how a tree of height 3 would be searched with DFS:

Tree searched with depth-first search

This move tree is drawn for Color Walk assuming there are three colors to pick from, and the numbers in each node show the order that each node is visited during the search. Comparing this to BFS, we'll notice that while BFS has the desirable property that the first node found satisfying the search criteria is also the node with the shortest sequence of moves to reach it, DFS does not have this property. If node 7 is an end-of-game position, but node 13 is also an end-of-game position (assuming nodes 14 and 15 are removed), then after finding node 7, we have to continue searching to be sure we find the best move sequence at node 13.

So why would we want to use DFS if it doesn't find the best node first, like BFS does? First of all, an application may not require the solution with the shortest path, only a solution with a reasonable path, and DFS may be able to find it faster than BFS. This doesn't apply in the case of Color Walk because we are interested in the shortest path, but even in this case we could be satisfied with a path shorter than any others that we've found by other methods.

Secondly, DFS uses less memory than BFS, especially as the tree grows to more and more levels. Searching the above binary tree with a height of 10 using BFS would require a queue with space for 1,024 nodes to hold all of the nodes at the 10th level. On the other hand, DFS keeps track of which path its on using a stack—normally the call stack if it's implemented recursively—and only requires space for 10 nodes to search the same tree. The divergence in memory requirements between the two methods is exponential.

Even though it uses significantly less memory, DFS runs into another problem with Color Walk that can be seen if you think about the extension of the above graph. What happens to that far left path of alternating blue and red moves in the actual game? After not too many moves, we will stop making forward progress in the game because no more blocks will be removed. All of the remaining blocks bordering the grey area would be yellow. We're avoiding choosing the same color multiple times in a row, but that is not enough to avoid searching down a path of infinite length. In fact, the very first path we'll take will be infinite! In addition to that, any path that never chooses one of the colors will go on forever. There are an infinite number of paths in this tree that are infinitely long. Yikes! We could be searching for a long time.

To avoid the problem of infinite paths, we'll have to be careful with implementing DFS for Color Walk. We'll need to either limit the number of moves that we'll search down the tree before giving up on that path, or cut off the search on a given path as soon as we try a move that doesn't remove any blocks, because such a move path can't possibly be optimal. It's likely beneficial to limit the search both ways.

While this problem may seem specific to Color Walk, it is in fact a common problem for DFS to get trapped in loops. Care must be taken to make sure loops are detected and the search of those paths terminated so that the algorithm doesn't run on forever.

DFS in Practice


With the general theory covered, we are ready to start implementing our DFS algorithm. We'll start with the tactic of limiting the search by the number of moves and terminating search paths when a move is encountered that doesn't remove any blocks. We also need to limit the total search time in some way because otherwise we'll be searching at least as long as the pure BFS algorithm, which was thousands of years. We'll limit the search time to a minute and see what a run on a single board can find. Then we can look at optimizations to search more of the tree in that time before doing a batch run of 100 boards.

The first thing we need to do is add a DFS algorithm to the list of algorithms:
  function Solver() {
// ...

this.init = function() {
// ...

$('#solver_type').change(function () {
switch (this.value) {
// ...
case 'dfs':
that.solverType = that.dfs;
that.metric = areaCount;
break;
default:
that.solverType = that.roundRobin;
break;
}

// ...
});

// ...
}
The normal heuristic that will be used is again areaCount() because we'll want to count blocks removed when checking if we should give up on a search path. We'll be able to call the endOfGame() check directly when we need to, but we'll get into that more in a bit. First, let's look at the high-level setup function of dfs():
    this.dfs = function() {
var state = {min_moves: 50, moves: null, stop_time: performance.now() + 60000};

_.each(controls, function(control) {
var matches = control.checkGameBoard(1, that.metric);
if (matches === 0) return;
state = dfsNext(2, control, matches, state);
});

markers = state.moves;
doMarkedMoves();
}
The first thing this algorithm does is initialize a state object that will hold some important information on the progress that's being made during the search. It contains the minimum number of moves found so far initialized to 50 moves, a copy of the match record of the board that led to that minimum number of moves, and a time that indicates when we should cut off the search. The match record is the same one used to keep track of sequences of moves in the BFS queue. The stop time doesn't necessarily need to be in this state object because it'll never change, but it's included for convenience.

Then the algorithm runs through each control, checking the board for matching blocks. If there are none, it skips to the next control. Otherwise, it calls the recursive function of DFS so that it can search deeper down that path. Each call to dfsNext() passes the state object and returns the state object so that it can be continually passed down to each searched node to be used to limit search depth and get updated as necessary. The current control and number of matches are also passed down to limit searches if the same control is used twice or no new matches are found in the child node.

The algorithm wraps up by copying the move markers from the minimum number of moves found during the search back into the markers array, and then calling doMarkedMoves() to run through those moves on the board. All of this stuff is fairly straightforward, so the real meat of the algorithm remains to be seen in dfsNext():
    function dfsNext(move, prev_control, prev_matches, state) {
if (performance.now() > state.stop_time) return state;

for (var i = 0; i < 5; i++) {
var control = controls[(i + move) % 5];
if (control === prev_control || move >= state.min_moves) continue;

var matches = control.checkGameBoard(move, that.metric);
if (matches === prev_matches) continue;

if (endOfGame()) {
state.min_moves = move;
state.moves = markers.slice();
continue;
}

state = dfsNext(move + 1, control, matches, state);
};

return state;
}
Half of this function is actually checks to limit the search so as to speed up the algorithm. The core of the algorithm is actually just eight lines of code (including closing braces). The function first checks if it should stop because it's over time. Once the stop time is reached, this line will quickly end all further searching on any leftover branches in the move tree.

If there's still time, we'll look at each of the five controls. I implemented this as a for loop instead of a _.each() because I wanted to rotate through the controls, starting with a different control each time, as the search went deeper into the tree. Otherwise, the same controls would always be searched first, giving a long search path and a huge tree to start with that would just waste time because the search wouldn't be making progress towards the end of the game fast enough. Selecting the next control with controls[(i + move} % 5] neatly produces this behavior of rotating through the controls with increasing search depth.

Then we start checking if we should terminate the current search path. If the control is the same as the last control or if this move has already reached the minimum number of moves found so far, we should bail right away. Similarly, if the current control doesn't remove any new blocks, the current path is a dud.

The last check is directly related to the DFS algorithm. If we've reached the end-of-game condition, then we can update the state object with a new minimum moves and the marker array containing the sequence of moves. How do we know for sure that the number of moves is a new minimum? Because if it wasn't, we would have already quit this search path. At this point we quit this search path anyway because we reached the end.

If all of those checks fail, then we drop down to the next level of the tree by calling dfsNext() again with the same parameters, except for incrementing the move number. This algorithm should look very familiar because we've used it extensively already. It has the exact same structure as the Greedy Look Ahead (GLA) algorithm with the only differences being that in GLA we parameterized the search depth so that the user could pick it, and we did a full DFS to that depth so that we could pick the path that maximized some heuristic. Here we're looking for a specific end condition instead of maximizing a metric.

The hope in using the DFS algorithm to its full depth is that the short-path solutions in the move tree are relatively evenly distributed and plentiful, so that even though we can't search the entire tree, we would expect to find a reasonably short solution without searching for too long. How does our algorithm perform in practice? Not too great. On the first board the GLA algorithm finds a solution in 34 moves when looking ahead 6 moves. Letting DFS run for a minute, which is longer than GLA-6 takes to find its solution, turns up a solution in 42 moves. Letting it run for a full 10 minutes doesn't find anything better than that.

DFS in Reality


As a sanity check for the performance of the algorithm, I decided to put in a counter to track how many nodes were visited during a run. It turns out that over a minute only about 550 nodes were checked, and after 10 minutes about 5,000 nodes were checked. That means it took over 100 milliseconds to check a node, which seems high, even for JavaScript. I put a stop watch in to see how long it was taking to check each node, and I found that when the move depth was shallow, checking a node for removed blocks was quite fast, but as the move depth increased, the time it took to check a node increased rapidly:
  • Move depth of 20: < 1 msec
  • Move depth of 30: 15 msec
  • Move depth of 40: 100 msec
  • Move depth of 47: 500+ msec
It appears as though function calls take a huge hit in performance as the call stack gets deeper. If I limited the move depth to 30 moves, DFS could search over 6,800 nodes in a minute. That's over an order of magnitude improvement! Of course, it didn't find any solutions, but it could not find a solution much faster.

Two important things that we've learned so far are that (1) short-path solutions are probably not as evenly distributed in the tree as we had hoped, and (2) those solutions are not as plentiful as we would like. We're going to have to set up DFS so that it will have a better chance of success. To get this algorithm to a point where it would actually be usable, we should try combining it with our good-old workhorse, GLA. We can even do the same thing as we did for BFS, and run with GLA for the first 18 moves before switching over to DFS. Then see if we can find a good solution in the next 30 moves so as to keep the call stack short and the searching fast.

This change is super easy to make, as almost everything we need is already available. All we have to do is add a few lines to dfs():
    this.dfs = function() {
if (moves < 18) {
this.greedyLookAhead();
return;
}

var state = {min_moves: 30, moves: null, stop_time: performance.now() + 60000};

_.each(controls, function(control) {
var matches = control.checkGameBoard(1, that.metric);
if (matches === 0) return;
state = dfsNext(2, control, matches, state);
});

markers = state.moves;
doMarkedMoves();
}
Now the algorithm will use GLA to whatever look-ahead depth the user specifies for the first 18 moves before switching to DFS for the last moves. It should be able to find a solution for every board by allowing a depth of 30 moves for the DFS phase because the maximum solution of moves found for GLA-5 was 41, and this setup allows for up to 48 moves. The batch run of 100 iterations is going to take over an hour and a half to finish, but I want to give DFS its best chance at success. How did it perform?

Color Walk with depth-first search for 100 iterations


We have an average shortest-path of 34.8 moves with a standard deviation of 3.85 moves. This run was decent—not quite as good as the BFS hybrid algorithm, but still pretty good. Here's how it stacks up against a selection of the rest of the algorithms:

AlgorithmMinMeanMaxStdev
RR with Skipping 37 46.9 59 4.1
Random with Skipping 43 53.1 64 4.5
Greedy 31 39.8 48 3.5
Greedy Look-Ahead-2 28 37.0 45 3.1
Greedy Look-Ahead-5 25 33.1 41 2.8
Max Perimeter 29 37.4 44 3.2
Max Perimeter Look-Ahead-2 27 35.0 44 2.8
Perimeter-Area Hybrid 31 39.0 49 3.8
Deep-Path 51 74.8 104 9.4
Path-Area Hybrid 35 44.2 54 3.5
Path-Area Hybrid Look-Ahead-4 32 38.7 45 2.7
BFS with Greedy Look-Ahead-5 26 32.7 40 2.8
DFS with Greedy Look-Ahead-5 25 34.8 43 3.9

We can see that DFS was able to find a minimum move sequence of 25 moves, just like GLA-5, but it didn't perform as well for the mean or maximum. It also had a wider distribution of results than either GLA-5 or BFS. The fact that DFS performs better when the shortest path is shorter and not as well when the shortest path is longer would be due to the DFS taking much longer to search for more optimal paths when the first path it finds is longer and the depth limit for searching the tree is correspondingly deeper. When the algorithm has to search to a depth of 30, it has to search a much larger tree to find a shorter path than if it can start searching to a depth of 15 or so. It may even be able to complete its search of the sub-tree if it finds a very short path early that can limit the depth of the search for the rest of the tree.

A couple ways to improve this hybrid DFS algorithm immediately come to mind. First, we could speed up the search implementation by creating our own stack instead of using JavaScript's call stack. This iterative approach would likely substantially outperform the recursive approach because it shouldn't slow down excessively for deeper search depths. That would allow for searching significantly more nodes in the same amount of time. Second, we could do a preliminary quick search to see how deep the paths are for a few seconds of searching, and then continue using GLA if the path found was too long so as to reduce the search tree height some more before running DFS for the full minute. This strategy would likely bring down the shortest paths for boards that have the longest shortest paths and tighten up the distribution more.

At some point an optimized DFS starts to perform a lot like BFS because it will fully search the section of the tree that it comes to after GLA, and it will end up finding the same shortest-path that BFS would. The advantage of DFS may come from being able to squeeze more performance out of it than BFS, and thus being able to search a larger section of the move tree in the same amount of time. Remember, a DFS algorithm only needs a stack with a size equal to the height of the tree, while BFS will need a queue with a size of at least 4height, making it much less efficient to search large sub-trees.

In either case the improvement of DFS would likely be only marginally better than GLA-5, so we'll move on from BFS and DFS to explore a new shortest-path algorithm next time: Dijkstra's Algorithm.


Article Index
Part 1: Introduction & Setup
Part 2: Tooling & Round-Robin
Part 3: Random & Skipping
Part 4: The Greedy Algorithm
Part 5: Greedy Look Ahead
Part 6: Heuristics & Hybrids
Part 7: Breadth-First Search
Part 8: Depth-First Search
Part 9: Dijkstra's Algorithm
Part 10: Dijkstra's Hybrids
Part 11: Priority Queues
Part 12: Summary

miércoles, 27 de marzo de 2019

PG 206, Bobby Is Going Home!

Today for the first time I delve into what I originally thought was a PAL exclusive game, Bobby Is Going Home by Bit Corporation. Music and fun, what more could you want? Special thanks to Flanders 72, a punk band from Brazil. They are a great band that has a song called Bobby Is Going Home, which they let me use for the show. You can buy the track at their Bandcamp site, as well as all of their other music, so please support them! Next up will be Crypts of Chaos by 20th Century Fox. Please send your feedback to 2600gamebygame@gmail.com by the end of the day, 30 September. Thank you all so much for listening, and for your patience.

Pertinent Links

Bobby Is Going Home on Atarimania
Ample Ace Co. web site
Supergame VG 2800
Supergame VG 3000
No Swear Gamer 413 - Bobby Is Going Home
No Swear Gamer Bobby Is Going Home gameplay
Kulihat ibu pertiwi
Flanders 72 - Bobby Is Going Home video
Flanders 72 on Bandcamp

martes, 26 de marzo de 2019

Secret Agents And Operations

Abstract: In quite a few video game set in Hong Kong, we can find secret agents from around the world executing various kinds of secret operations in the city. In this article, we will go through them one by one, and explain why they are not mere coincidence but the consequence of the actual city's uniqueness.

在多個以香港做背景的電子遊戲中﹐我們會見到來自世界各地的特勤人員,執行各式各樣的秘密行動。在這篇文章中, 我們將逐一檢視它們,並解釋它們並非巧合,而是現實香港獨特的地理位置和政治地位使然。

Secret agents and operations in video game Hong Kong

In video games set in Hong Kong, one can found secret agents from local and around the world. Hired by individuals, criminal organizations or governments, these agents carry out various secret missions in the virtual city.

In quite a few cases, these agents are acting as spies, infiltrating into their target organizations silently in order to collect and report information on the activities, movement, and plans of enemies or competitors.

Inspector Tequila Yuen (right) talking with Jerry Ying (left) who has infiltrated into the Dragon Claw triad group in Stranglehold (Midway Games/Success. Microsoft Windows/PlayStation 3/Xbox 360: 2007)
Undercover Wei Shen (middle) talking with inspector Teng (left) in Sleeping Dogs (Square Enix. Microsoft Windows/PlayStation 3/Xbox 360: 2012)
Undercover Kit (right) talking with police officer Victor(left) to exchange news of a triad in Jet Li: Rise to Honor (Sony Computer Entertainment America. PlayStation 2: 2004). At the end, Victor revealed that he was the mastermind of the triad.
Sometimes, these agents trespass on the hideouts of these organizations right away to collect information about the target or steal sensitive materials. The hideouts could be restaurants, bath houses, offices, factories and even embassies. While many of these hideouts are merely for their members to gather and discuss matters, some others are where we can find various secret operations. These operations could be typical illegal businesses such as drugs, smuggling and human trafficking, while others could involve surprisingly advanced technologies such as a high-precision diamond cutter, a virus that could kill all people in the world, the DNS sample of the world's leaders.

A secret agent infiltrating into a building of a private biotech company in Hong Kong in Deus Ex (Eidos Interactive. Microsoft Windows/Mac OS/PlayStation 2: 2000) 
The factory of Hong Kong-based Identicon, a botanical research firm thought to be a possible front for a weapon-smuggling ring, in 007: Agent Under Fire (EA Games. PlayStation 2: 2001, GameCube/Xbox: 2002). A CIA agent infiltrating into the corporation was discovered and captured. James Bond thus trespasses the factory in attempt to rescue her., while at the same time retrieves a courier case.
In Soldier of Fortune II: Double Helix (Activision. Microsoft Windows/OS X/Xbox: 2002), a mercenary is hired to deal with an international gang who is developing a virus with the aim of threatening the world.
In Scenario B of Wreckless: The Yakuza Missions (Activision. Xbox/GameCube/PlayStation 2: 2002), the player plays as a pair of spies hired to take down the head of the Hong Kong Yakuza.
The CIA agent Sydney Bristow secretly getting into the secret laboratory of an embassy in Hong Kong in Alias (Acclaim Entertainment. PlayStation 2/Microsoft Windows/Xbox: 2004)
If needed, these secret agents are ready to carry out armed missions such as street chases, kidnappings, assaults, assassinations, and even city destruction.

James Bond involving in a street chase to disable an armored van of a weapon-smuggling ring in 007: Agent Under Fire (EA Games. PlayStation 2: 2001, GameCube/Xbox: 2002)
In Wet (Bethsda Softworks. PlayStation 3/Xbox 360: 2009), the player acts as a mercenary who is hired to kidnap the head of a drug ring in Hong Kong according to the order of another gang.
Secret agents planning to kidnap an agent of the private conspiracy group Beholder Initiative in Phantom Doctrine (Good Shepherd Entertainment. PlayStation 4/Xbox One/Microsoft Windows: 2018). Appeared as a US lobbying firm that conducts business internationally, it is indeed steering politics to their will through underhanded means and toxic influence.
Secret agents shooting a guard of the Hong Kong restaurant which is the target's hideout in Phantom Doctrine (Good Shepherd Entertainment. PlayStation 4/Xbox One/Microsoft Windows: 2018)
A hitman is sent by the International Contract Agency to Hong Kong to assassinate the Triad leader Lee Hong in Hitman: Codename 47 (Eidos Interactive. Microsoft Windows: 2000)
former MI6 agent being employed by an international criminal organization to assassinate his rival Dr. No. in GoldenEye: Rogue Agent (EA Games. GameCube/PlayStation 2/Xbox: 2004, Nintendo DS: 2005)
Secret agents from governments in the world coming to Hong Kong to assassinate an international trader who is in a global corporation that is weakening the power of the governments in Rouge Agent (Jorge Aires. Microsoft Windows: 2018).
In Näkemiin, Hongkong (T&T-Soft. Commodore 64: 1989), a British secret agent gets into Hong Kong which has been handed over to China in 1997. The agent is trying to destroy the city with a nuclear bomb. 
To support these secret projects and armed missions, hi-tech equipment are smuggled into the city.

The spies in Wreckless: The Yakuza Missions (Activision. Xbox/GameCube/PlayStation 2: 2002) could use a tank to hit their rival Yakuza members in a dock of virtual Hong Kong. 
The modified BMW 8Z smuggled to Hong Kong for James Bond in 007: Agent Under Fire (EA Games. PlayStation 2: 2001, GameCube/Xbox: 2002) 
The special equipment of the modified BMW 8Z smuggled to Hong Kong for James Bond in 007: Agent Under Fire (EA Games. PlayStation 2: 2001, GameCube/Xbox: 2002) forward-mounted rockets, retractable machine guns, dual-side vent-deployed missiles, titanium armor, a rocket boost concealed behind the real license plate, and of course a refrigerated beverage holder 
The former MI6 agent will be provided weapon for the assassination of Dr. No. in Hong Kong in GoldenEye: Rogue Agent (EA Games. GameCube/PlayStation 2/Xbox: 2004, Nintendo DS: 2005)
One thing to note is that while most of these secret missions and operations are criminal in nature (among individual entities in society, or between individual entities and law enforcement organizations), there exists few that are political which means among governments.

The plot of Rouge Agent (Jorge Aires. Microsoft Windows: 2018). While it appears to be an cooperation of governments, the fact that the agents are also allowed to kill the agents from other governments, which is the hidden agendas of these governments to attempt to take control of the whole world.
Another thing is that video game Hong Kong is not only where secret agents work but also flee. The game Snowden Run 3D is based on the real case of Edward Snowden, a former CIA worker, who ran away all the way from US to Russia via Hong Kong.

Edward Snowden. Photo source: Wikipedia
Helping Edward Snowden to run through obstacles and collect items on Hong Kong streets in Snowden Run 3D (MTS Freestyle. Android/PC/Mac: 2013)

Secret agents and operations in actual Hong Kong

Game developers don't and can't come up with the above secret agents and operations from pure imagination. They are likely to be based on the stories they learn about secret agents and operations in actual Hong Kong.

For spying activities, 
  • In 1960s, John Tsang Siu-fo (曾昭科), the highest-ranking Chinese member of the Hong Kong police force in colonial Hong Kong at that time, was believed to be a spy working for communist China. He was then deported after he was suspected (蕭少滔, 2013, June 25; Wikipedia, 2018, October 28).
  • In 1997 when Hong Kong was handed over from Britain to China, quite a lot of spying devices were found in the various garrisons and Governor's House (now the Government House) when these facilities were taken over from the British colonial government (Chen, F., 2014, July 21).  
  • In 2003, Cai Xiao-hong (蔡小洪), a communist Chinese official stationed in Hong Kong, was accused of transferring confidential Chinese government information to Britain during the handover period from 1990s to 2000s (Wikipedia, 2018, July 11).
  • When Edward Snowden stopped by in Hong Kong in 2013, he claimed that his former employer, the US government, was secretly collecting info from communications around the world, including those in China and Hong Kong (Greenwald, G., MacAskill, E., & Poitras, L., 2013, June 11). 
  • In 2017, Jerry Lee Chun Shing (李振成), a former CIA who later resided in Hong Kong, was accused of passing classified US national defense information to China, leading to the breakdown of the US spy network in China in the 2010s (Mordock, J., 2018, January 16).
  • From time to time, there are news reports on police successfully taking down illegal businesses of the triads with the help of local undercover police officers (鄧栢良、楊婉婷, 2017, August 08). There are also conspiracy theories that CIA of the US and MI6 of Britain are operating branches in the US Consulate and British Consulate in Hong Kong (羅先亞, 2013, September 16). 
John Tsang Siu-fo. Photo source: 人过五十网 
Cai Xiao-hong. Photo source:  OPEN 開放網
Jerry Lee Chun Shing. Photo source: The New York Times
The Consulate General of the United State, Hong Kong and Macau on No. 26, Garden Road, Central, Hong Kong. Source: Wikipedia
The British Consulate-General, Hong Kong on 1 Supreme Court Road, Admiralty, Hong Kong. Source: Wikipedia
For secret operations, it is believed by some that certain illegal businesses are running in the background of actual Hong Kong.
  • The U.S. State Department's Office to Monitor and Combat Trafficking in Persons placed Hong Kong in "Tier 2 Watchlist" in 2017 (U.S. State Department's Office, 2017). 
  • The U.S. Treasury Department claimed that certain commercial Hong Kong-based companies were disguises of underground businesses such as money laundering (Berlinger, J., 2018, November 06).  
  • From time to time, we can hear news stories on smuggling sensitive technologies via Hong Kong (Griffiths, J., 2018, October 02).
Street chases, kidnappings, assault and assassinations are indeed quite rare in actual Hong Kong. Nonetheless, every time when a case exposes, the media headlines are occupied for several days.
  • Lee Hysan (利希慎) was shot on a street in the Central district in Hong Kong. Some believed the assassination was due to the conflict he had with the Macau government over the right to sell opium in Macau (Wikipedia, 2018, October 21).
  • In 1955, the Kashmir Princess aircraft departed from Hong Kong was bombed during its flight to Jakarta. Originally planned for carrying the Chinese premier Zhou Enlai (周恩來), it was widely believed that the bomb was placed on the plane in Hong Kong by some Taiwan special service organization. (Butt, R., 2010, January 2; Wikipedia, 2018, January 18)
  • In 2002, businessman Hot-lit Harry Lam was shot dead while eating breakfast in the Hong Kong famous tea house and dim sum restaurant Luk Yu (陸羽茶室). The murderer was rumored to be due to a business disputes (Hu, Y., 2007, July 10).
  • In December 2015, Lee Bo (李波) mysteriously disappeared from Hong Kong territory and later reappeared to be in mainland China. Many feared that he may have somehow be abducted by mainland China's public security bureau and brought to mainland China (Wikipedia, 2018, November 22).
Lee Hysan (right) with his son (left). Photo source: 立場新聞
A Lockheed Constellation similar to The Kashmir Princess. Photo source: Wikipedia
Zhou Enlai, the supposedly assassination target of  The Kashmir Princess bombing. He was the first Premier of the People's Republic of China serving from 1949 to 1976. Photo source: Wikipedia
Hot-lit Harry Lam. Photo source: 蘋果日報
Luk Yu. Photo source: Wikipedia
Lee Bo being interviewed by media in mainland China after his mysterious disappearance from Hong Kong and later reappearance in Mainland China. Photo source: 立場新聞
You may be surprised by the pieces of smuggled hi-tech equipment that Hong Kong Custom and Excise found in cargoes in the past years (杜宗熹, 2016, November 24):
  • Year 2000: an armored vehicle from Italy, intended to go to mainland China. 
  • Year 2004: 2800 real guns from Malaysia, intended to go to US. 
  • Year 2006: a former Soviet-made MiG 29 fighter jet, from Ukraine, intended to go to US. 
  • Year 2010: a tank from Saudi Arabia, intended to go to South Korea.
An armored vehicle found in Kwai Chung container port of Hong Kong in 2000. Source: Appledaily
The MiG 29 fighter jet found in Hong Kong container port in 2006. Source: 聯合影音網

What brings secret agents and secret operations in?

As for why real Hong Kong attracts secret agents and secret operations from all around the world, I believe it is due to the unique geographical location and political position of the city.

Unique geographical location

Excellently located at the heart of the Asia Pacific region, Hong Kong gradually becomes a logistic, trading and finance center after Britain took over the place and set up a free port in the 1840s. Attracted are not only legal businesses from all around the world, but also the underground ones, thereby the illegal operations that need to be kept secret. To collect information on these secret activities without catching targets' attention, sending spies out is the only way.

Always associated with businesses are disputes. Sometimes, people may decide that doing nasty or shady things to settle the disputes. Secret agent is the only way to do them without leaving obvious fingerprints.

As a popular transit hub with millions of visitors and goods transiting at Hong Kong every day, it is not surprising that some people try to smuggle through the city.

Unique political position

In 1949, mainland China was taken over by the communists. As a free port located right next to this key communist country and handling the in-and-out of thousands of mainland Chinese and foreigners every day, Hong Kong became a prime location that both the Communist block and the Western bloc shall station secret agents for information collection and possibly secret operations against each other.

After the 1997 handover of Hong Kong to mainland China, foreign political secret agents appear to remain intact. Quite a few people have expressed their discontent with it and would like to pass the national security law in the city as soon as possible so as to provide legal basis to handle these agents if needed. However, there are practical considerations such as the potential opposition from the citizens, and whether the legislation would provide an excuse for other countries to sanction mainland China for reducing the freedom enjoyed by the people in the city.

The website conveying the Hong Kong government's proposals to implement Article 23 of the Basic Law which expects Hong Kong to enact laws on its own to protect national security. The implementation is indefinitely postponed due to its a great controversy and a massive demonstration on 1 July 2003.
Nonetheless, it was the Chinese rule over Hong Kong that contributed to the dramatic flee of Edward Snowden. Hong Kong authorities said that Snowden had not been detained for the U.S. because the request had not fully complied with Hong Kong law, and there was no legal basis to prevent Snowden from leaving (Hong Kong Information Services Department, 2013, June 23; Hong Kong Information Services Department, 2013, June 24; Chen, F., 2014, July 21). The government would not have been that confident not to detain Edward and make such responses if the city had not been ruled by China who thought herself increasingly comparable with the Western bloc.

Final Remarks

There are good reasons for Hong Kong to be popular among secret agents and operations. The unique geographical location of Hong Kong contributes to the establishment of a free port and later a logistic, trading and financial center in the city, which has brought in local and international criminal organizations and hence illegal operations running secretly. Whether you wish to collect insider information about these secret operations, or do nasty things against your rivals, you need secret agents to get them done secretly. Meanwhile, the unique political status of Hong Kong in both British colonial era and Chinese rule era has also made the city a platform of dramatic political espionage activities between governments.

While many of us are complete outsiders of these ongoing espionage activities, we are all surprised and excited whenever any of them is exposed to public, and be reminded of potentially hundreds or even thousands of secret agents that are running in the background every day.

References

杜宗熹. (2016, November 24). 香港海關查獲軍品非首次 坦克戰機應有盡有 | 時事. Retrieved November 12, 2018, from https://video.udn.com/news/600982

鄧栢良、楊婉婷. (2017, August 08). 【無間道】臥底潛伏一年打殘元朗黑幫 區議員田雞東等299人落網|香港01|港聞|. Retrieved October 15, 2017, from https://www.hk01.com/%E6%B8%AF%E8%81%9E/110643/-%E7%84%A1%E9%96%93%E9%81%93-%E8%87%A5%E5%BA%95%E6%BD%9B%E4%BC%8F%E4%B8%80%E5%B9%B4%E6%89%93%E6%AE%98%E5%85%83%E6%9C%97%E9%BB%91%E5%B9%AB-%E5%8D%80%E8%AD%B0%E5%93%A1%E7%94%B0%E9%9B%9E%E6%9D%B1%E7%AD%89299%E4%BA%BA%E8%90%BD%E7%B6%B2

羅先亞. (2013, September 16). 英國在港的間諜活動 總領館大樓設MI6分局. Retrieved November 4, 2018, from http://news.takungpao.com.hk/hkol/politics/2013-09/1906525.html

蕭少滔. (2013, June 25). 香港從來都是間諜中心. Retrieved September 12, 2018, from https://www.vjmedia.com.hk/articles/2013/06/25/42023

Berlinger, J. (2018, November 06). Asia's meth boom. Retrieved November 11, 2018, from https://www.cnn.com/2018/11/02/asia/asia-methamphetamine-golden-triangle-intl/index.html

Butt, R. (2010, January 2). Hong Kong's First. Retrieved November 4, 2018, from http://hongkongsfirst.blogspot.com/2010/01/assassinations.html

Chen, F. (2014, July 21). Cold facts about an espionage capital. Retrieved November 4, 2018, from http://www.ejinsight.com/20140721-hong-kong-espionage-edward-snowden-spy-war/

Hong Kong Information Services Department. (2013, June 23). Snowden left HK lawfully: CE. Retrieved November 4, 2018, from http://www.news.gov.hk/en/categories/law_order/html/2013/06/20130624_163906.shtml

Hong Kong Information Services Department. (2013, June 24). No delay in Snowden case: SJ. Retrieved November 4, 2018, from http://www.news.gov.hk/en/categories/law_order/html/2013/06/20130625_175835.shtml

Greenwald, G., MacAskill, E., & Poitras, L. (2013, June 11). Edward Snowden: The whistleblower behind the NSA surveillance revelations. Retrieved November 4, 2018, from https://www.theguardian.com/world/2013/jun/09/edward-snowden-nsa-whistleblower-surveillance

Griffiths, J. (2018, October 02). Chinese national jailed in US over space tech smuggling scheme. Retrieved November 23, 2018, from https://www.cnn.com/2018/10/01/politics/china-california-space-smuggling-intl/index.html

Hu, Y. (2007, July 10). Ex-TV star gets life for tea-house murder. Retrieved November 4, 2018, from https://www.scmp.com/article/600116/ex-tv-star-gets-life-tea-house-murder

Lam, L. (2013, June 13). Edward Snowden: US government has been hacking Hong Kong and China for years. Retrieved November 4, 2018, from https://www.scmp.com/news/hong-kong/article/1259508/edward-snowden-us-government-has-been-hacking-hong-kong-and-china

Mordock, J. (2018, January 16). Former CIA officer arrested for keeping classified records. Retrieved November 4, 2018, from https://www.washingtontimes.com/news/2018/jan/16/ex-cia-officer-arrested-keeping-classified-records/

U.S. State Department's Office. (2017). Trafficking in Persons Report 2017: Tier Placements. Retrieved November 23, 2018, from https://www.state.gov/j/tip/rls/tiprpt/2017/271117.htm

Wikipedia. (2018, May 28). Chinese Assassination Corps. Retrieved November 4, 2018, from https://en.wikipedia.org/wiki/Chinese_Assassination_Corps

Wikipedia. (2018, October 21). 利希慎. Retrieved November 4, 2018, from https://zh.wikipedia.org/wiki/利希慎

Wikipedia. (2018, January 18). 谷正文. Retrieved November 4, 2018, from https://zh.wikipedia.org/wiki/谷正文

Wikipedia. (2018, July 11). 蔡小洪. Retrieved November 4, 2018, from https://zh.wikipedia.org/zh-hk/蔡小洪

Wikipedia. (2018, October 28). Tsang Siu-Fo. Retrieved November 4, 2018, from https://en.wikipedia.org/wiki/Tsang_Siu-Fo

Wikipedia. (2018, November 22). Causeway Bay Books disappearances. Retrieved November 22, 2018, from https://en.wikipedia.org/wiki/Causeway_Bay_Books_disappearances